This is page 14 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/entities.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: interface for the XML entities handling
3 | * Description: this module provides some of the entity API needed
4 | * for the parser and applications.
5 | *
6 | * Copy: See Copyright for the status of this software.
7 | *
8 | * Author: Daniel Veillard
9 | */
10 |
11 | #ifndef __XML_ENTITIES_H__
12 | #define __XML_ENTITIES_H__
13 |
14 | #include <libxml/xmlversion.h>
15 | #define XML_TREE_INTERNALS
16 | #include <libxml/tree.h>
17 | #undef XML_TREE_INTERNALS
18 |
19 | #ifdef __cplusplus
20 | extern "C" {
21 | #endif
22 |
23 | /*
24 | * The different valid entity types.
25 | */
26 | typedef enum {
27 | XML_INTERNAL_GENERAL_ENTITY = 1,
28 | XML_EXTERNAL_GENERAL_PARSED_ENTITY = 2,
29 | XML_EXTERNAL_GENERAL_UNPARSED_ENTITY = 3,
30 | XML_INTERNAL_PARAMETER_ENTITY = 4,
31 | XML_EXTERNAL_PARAMETER_ENTITY = 5,
32 | XML_INTERNAL_PREDEFINED_ENTITY = 6
33 | } xmlEntityType;
34 |
35 | /*
36 | * An unit of storage for an entity, contains the string, the value
37 | * and the linkind data needed for the linking in the hash table.
38 | */
39 |
40 | struct _xmlEntity {
41 | void *_private; /* application data */
42 | xmlElementType type; /* XML_ENTITY_DECL, must be second ! */
43 | const xmlChar *name; /* Entity name */
44 | struct _xmlNode *children; /* First child link */
45 | struct _xmlNode *last; /* Last child link */
46 | struct _xmlDtd *parent; /* -> DTD */
47 | struct _xmlNode *next; /* next sibling link */
48 | struct _xmlNode *prev; /* previous sibling link */
49 | struct _xmlDoc *doc; /* the containing document */
50 |
51 | xmlChar *orig; /* content without ref substitution */
52 | xmlChar *content; /* content or ndata if unparsed */
53 | int length; /* the content length */
54 | xmlEntityType etype; /* The entity type */
55 | const xmlChar *ExternalID; /* External identifier for PUBLIC */
56 | const xmlChar *SystemID; /* URI for a SYSTEM or PUBLIC Entity */
57 |
58 | struct _xmlEntity *nexte; /* unused */
59 | const xmlChar *URI; /* the full URI as computed */
60 | int owner; /* does the entity own the childrens */
61 | int flags; /* various flags */
62 | unsigned long expandedSize; /* expanded size */
63 | };
64 |
65 | /*
66 | * All entities are stored in an hash table.
67 | * There is 2 separate hash tables for global and parameter entities.
68 | */
69 |
70 | typedef struct _xmlHashTable xmlEntitiesTable;
71 | typedef xmlEntitiesTable *xmlEntitiesTablePtr;
72 |
73 | /*
74 | * External functions:
75 | */
76 |
77 | #ifdef LIBXML_LEGACY_ENABLED
78 | XML_DEPRECATED
79 | XMLPUBFUN void
80 | xmlInitializePredefinedEntities (void);
81 | #endif /* LIBXML_LEGACY_ENABLED */
82 |
83 | XMLPUBFUN xmlEntityPtr
84 | xmlNewEntity (xmlDocPtr doc,
85 | const xmlChar *name,
86 | int type,
87 | const xmlChar *ExternalID,
88 | const xmlChar *SystemID,
89 | const xmlChar *content);
90 | XMLPUBFUN void
91 | xmlFreeEntity (xmlEntityPtr entity);
92 | XMLPUBFUN xmlEntityPtr
93 | xmlAddDocEntity (xmlDocPtr doc,
94 | const xmlChar *name,
95 | int type,
96 | const xmlChar *ExternalID,
97 | const xmlChar *SystemID,
98 | const xmlChar *content);
99 | XMLPUBFUN xmlEntityPtr
100 | xmlAddDtdEntity (xmlDocPtr doc,
101 | const xmlChar *name,
102 | int type,
103 | const xmlChar *ExternalID,
104 | const xmlChar *SystemID,
105 | const xmlChar *content);
106 | XMLPUBFUN xmlEntityPtr
107 | xmlGetPredefinedEntity (const xmlChar *name);
108 | XMLPUBFUN xmlEntityPtr
109 | xmlGetDocEntity (const xmlDoc *doc,
110 | const xmlChar *name);
111 | XMLPUBFUN xmlEntityPtr
112 | xmlGetDtdEntity (xmlDocPtr doc,
113 | const xmlChar *name);
114 | XMLPUBFUN xmlEntityPtr
115 | xmlGetParameterEntity (xmlDocPtr doc,
116 | const xmlChar *name);
117 | #ifdef LIBXML_LEGACY_ENABLED
118 | XML_DEPRECATED
119 | XMLPUBFUN const xmlChar *
120 | xmlEncodeEntities (xmlDocPtr doc,
121 | const xmlChar *input);
122 | #endif /* LIBXML_LEGACY_ENABLED */
123 | XMLPUBFUN xmlChar *
124 | xmlEncodeEntitiesReentrant(xmlDocPtr doc,
125 | const xmlChar *input);
126 | XMLPUBFUN xmlChar *
127 | xmlEncodeSpecialChars (const xmlDoc *doc,
128 | const xmlChar *input);
129 | XMLPUBFUN xmlEntitiesTablePtr
130 | xmlCreateEntitiesTable (void);
131 | #ifdef LIBXML_TREE_ENABLED
132 | XMLPUBFUN xmlEntitiesTablePtr
133 | xmlCopyEntitiesTable (xmlEntitiesTablePtr table);
134 | #endif /* LIBXML_TREE_ENABLED */
135 | XMLPUBFUN void
136 | xmlFreeEntitiesTable (xmlEntitiesTablePtr table);
137 | #ifdef LIBXML_OUTPUT_ENABLED
138 | XMLPUBFUN void
139 | xmlDumpEntitiesTable (xmlBufferPtr buf,
140 | xmlEntitiesTablePtr table);
141 | XMLPUBFUN void
142 | xmlDumpEntityDecl (xmlBufferPtr buf,
143 | xmlEntityPtr ent);
144 | #endif /* LIBXML_OUTPUT_ENABLED */
145 | #ifdef LIBXML_LEGACY_ENABLED
146 | XMLPUBFUN void
147 | xmlCleanupPredefinedEntities(void);
148 | #endif /* LIBXML_LEGACY_ENABLED */
149 |
150 |
151 | #ifdef __cplusplus
152 | }
153 | #endif
154 |
155 | # endif /* __XML_ENTITIES_H__ */
156 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | pygments.formatters.terminal
3 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 |
5 | Formatter for terminal output with ANSI sequences.
6 |
7 | :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
8 | :license: BSD, see LICENSE for details.
9 | """
10 |
11 | from pip._vendor.pygments.formatter import Formatter
12 | from pip._vendor.pygments.token import Keyword, Name, Comment, String, Error, \
13 | Number, Operator, Generic, Token, Whitespace
14 | from pip._vendor.pygments.console import ansiformat
15 | from pip._vendor.pygments.util import get_choice_opt
16 |
17 |
18 | __all__ = ['TerminalFormatter']
19 |
20 |
21 | #: Map token types to a tuple of color values for light and dark
22 | #: backgrounds.
23 | TERMINAL_COLORS = {
24 | Token: ('', ''),
25 |
26 | Whitespace: ('gray', 'brightblack'),
27 | Comment: ('gray', 'brightblack'),
28 | Comment.Preproc: ('cyan', 'brightcyan'),
29 | Keyword: ('blue', 'brightblue'),
30 | Keyword.Type: ('cyan', 'brightcyan'),
31 | Operator.Word: ('magenta', 'brightmagenta'),
32 | Name.Builtin: ('cyan', 'brightcyan'),
33 | Name.Function: ('green', 'brightgreen'),
34 | Name.Namespace: ('_cyan_', '_brightcyan_'),
35 | Name.Class: ('_green_', '_brightgreen_'),
36 | Name.Exception: ('cyan', 'brightcyan'),
37 | Name.Decorator: ('brightblack', 'gray'),
38 | Name.Variable: ('red', 'brightred'),
39 | Name.Constant: ('red', 'brightred'),
40 | Name.Attribute: ('cyan', 'brightcyan'),
41 | Name.Tag: ('brightblue', 'brightblue'),
42 | String: ('yellow', 'yellow'),
43 | Number: ('blue', 'brightblue'),
44 |
45 | Generic.Deleted: ('brightred', 'brightred'),
46 | Generic.Inserted: ('green', 'brightgreen'),
47 | Generic.Heading: ('**', '**'),
48 | Generic.Subheading: ('*magenta*', '*brightmagenta*'),
49 | Generic.Prompt: ('**', '**'),
50 | Generic.Error: ('brightred', 'brightred'),
51 |
52 | Error: ('_brightred_', '_brightred_'),
53 | }
54 |
55 |
56 | class TerminalFormatter(Formatter):
57 | r"""
58 | Format tokens with ANSI color sequences, for output in a text console.
59 | Color sequences are terminated at newlines, so that paging the output
60 | works correctly.
61 |
62 | The `get_style_defs()` method doesn't do anything special since there is
63 | no support for common styles.
64 |
65 | Options accepted:
66 |
67 | `bg`
68 | Set to ``"light"`` or ``"dark"`` depending on the terminal's background
69 | (default: ``"light"``).
70 |
71 | `colorscheme`
72 | A dictionary mapping token types to (lightbg, darkbg) color names or
73 | ``None`` (default: ``None`` = use builtin colorscheme).
74 |
75 | `linenos`
76 | Set to ``True`` to have line numbers on the terminal output as well
77 | (default: ``False`` = no line numbers).
78 | """
79 | name = 'Terminal'
80 | aliases = ['terminal', 'console']
81 | filenames = []
82 |
83 | def __init__(self, **options):
84 | Formatter.__init__(self, **options)
85 | self.darkbg = get_choice_opt(options, 'bg',
86 | ['light', 'dark'], 'light') == 'dark'
87 | self.colorscheme = options.get('colorscheme', None) or TERMINAL_COLORS
88 | self.linenos = options.get('linenos', False)
89 | self._lineno = 0
90 |
91 | def format(self, tokensource, outfile):
92 | return Formatter.format(self, tokensource, outfile)
93 |
94 | def _write_lineno(self, outfile):
95 | self._lineno += 1
96 | outfile.write("%s%04d: " % (self._lineno != 1 and '\n' or '', self._lineno))
97 |
98 | def _get_color(self, ttype):
99 | # self.colorscheme is a dict containing usually generic types, so we
100 | # have to walk the tree of dots. The base Token type must be a key,
101 | # even if it's empty string, as in the default above.
102 | colors = self.colorscheme.get(ttype)
103 | while colors is None:
104 | ttype = ttype.parent
105 | colors = self.colorscheme.get(ttype)
106 | return colors[self.darkbg]
107 |
108 | def format_unencoded(self, tokensource, outfile):
109 | if self.linenos:
110 | self._write_lineno(outfile)
111 |
112 | for ttype, value in tokensource:
113 | color = self._get_color(ttype)
114 |
115 | for line in value.splitlines(True):
116 | if color:
117 | outfile.write(ansiformat(color, line.rstrip('\n')))
118 | else:
119 | outfile.write(line.rstrip('\n'))
120 | if line.endswith('\n'):
121 | if self.linenos:
122 | self._write_lineno(outfile)
123 | else:
124 | outfile.write('\n')
125 |
126 | if self.linenos:
127 | outfile.write("\n")
128 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/index.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | from optparse import Values
3 | from typing import Any, Iterable, List, Optional
4 |
5 | from pip._vendor.packaging.version import Version
6 |
7 | from pip._internal.cli import cmdoptions
8 | from pip._internal.cli.req_command import IndexGroupCommand
9 | from pip._internal.cli.status_codes import ERROR, SUCCESS
10 | from pip._internal.commands.search import print_dist_installation_info
11 | from pip._internal.exceptions import CommandError, DistributionNotFound, PipError
12 | from pip._internal.index.collector import LinkCollector
13 | from pip._internal.index.package_finder import PackageFinder
14 | from pip._internal.models.selection_prefs import SelectionPreferences
15 | from pip._internal.models.target_python import TargetPython
16 | from pip._internal.network.session import PipSession
17 | from pip._internal.utils.misc import write_output
18 |
19 | logger = logging.getLogger(__name__)
20 |
21 |
22 | class IndexCommand(IndexGroupCommand):
23 | """
24 | Inspect information available from package indexes.
25 | """
26 |
27 | ignore_require_venv = True
28 | usage = """
29 | %prog versions <package>
30 | """
31 |
32 | def add_options(self) -> None:
33 | cmdoptions.add_target_python_options(self.cmd_opts)
34 |
35 | self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
36 | self.cmd_opts.add_option(cmdoptions.pre())
37 | self.cmd_opts.add_option(cmdoptions.no_binary())
38 | self.cmd_opts.add_option(cmdoptions.only_binary())
39 |
40 | index_opts = cmdoptions.make_option_group(
41 | cmdoptions.index_group,
42 | self.parser,
43 | )
44 |
45 | self.parser.insert_option_group(0, index_opts)
46 | self.parser.insert_option_group(0, self.cmd_opts)
47 |
48 | def run(self, options: Values, args: List[str]) -> int:
49 | handlers = {
50 | "versions": self.get_available_package_versions,
51 | }
52 |
53 | logger.warning(
54 | "pip index is currently an experimental command. "
55 | "It may be removed/changed in a future release "
56 | "without prior warning."
57 | )
58 |
59 | # Determine action
60 | if not args or args[0] not in handlers:
61 | logger.error(
62 | "Need an action (%s) to perform.",
63 | ", ".join(sorted(handlers)),
64 | )
65 | return ERROR
66 |
67 | action = args[0]
68 |
69 | # Error handling happens here, not in the action-handlers.
70 | try:
71 | handlers[action](options, args[1:])
72 | except PipError as e:
73 | logger.error(e.args[0])
74 | return ERROR
75 |
76 | return SUCCESS
77 |
78 | def _build_package_finder(
79 | self,
80 | options: Values,
81 | session: PipSession,
82 | target_python: Optional[TargetPython] = None,
83 | ignore_requires_python: Optional[bool] = None,
84 | ) -> PackageFinder:
85 | """
86 | Create a package finder appropriate to the index command.
87 | """
88 | link_collector = LinkCollector.create(session, options=options)
89 |
90 | # Pass allow_yanked=False to ignore yanked versions.
91 | selection_prefs = SelectionPreferences(
92 | allow_yanked=False,
93 | allow_all_prereleases=options.pre,
94 | ignore_requires_python=ignore_requires_python,
95 | )
96 |
97 | return PackageFinder.create(
98 | link_collector=link_collector,
99 | selection_prefs=selection_prefs,
100 | target_python=target_python,
101 | )
102 |
103 | def get_available_package_versions(self, options: Values, args: List[Any]) -> None:
104 | if len(args) != 1:
105 | raise CommandError("You need to specify exactly one argument")
106 |
107 | target_python = cmdoptions.make_target_python(options)
108 | query = args[0]
109 |
110 | with self._build_session(options) as session:
111 | finder = self._build_package_finder(
112 | options=options,
113 | session=session,
114 | target_python=target_python,
115 | ignore_requires_python=options.ignore_requires_python,
116 | )
117 |
118 | versions: Iterable[Version] = (
119 | candidate.version for candidate in finder.find_all_candidates(query)
120 | )
121 |
122 | if not options.pre:
123 | # Remove prereleases
124 | versions = (
125 | version for version in versions if not version.is_prerelease
126 | )
127 | versions = set(versions)
128 |
129 | if not versions:
130 | raise DistributionNotFound(
131 | f"No matching distribution found for {query}"
132 | )
133 |
134 | formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)]
135 | latest = formatted_versions[0]
136 |
137 | write_output(f"{query} ({latest})")
138 | write_output("Available versions: {}".format(", ".join(formatted_versions)))
139 | print_dist_installation_info(query, latest)
140 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/routing/__init__.py:
--------------------------------------------------------------------------------
```python
1 | """When it comes to combining multiple controller or view functions
2 | (however you want to call them) you need a dispatcher. A simple way
3 | would be applying regular expression tests on the ``PATH_INFO`` and
4 | calling registered callback functions that return the value then.
5 |
6 | This module implements a much more powerful system than simple regular
7 | expression matching because it can also convert values in the URLs and
8 | build URLs.
9 |
10 | Here a simple example that creates a URL map for an application with
11 | two subdomains (www and kb) and some URL rules:
12 |
13 | .. code-block:: python
14 |
15 | m = Map([
16 | # Static URLs
17 | Rule('/', endpoint='static/index'),
18 | Rule('/about', endpoint='static/about'),
19 | Rule('/help', endpoint='static/help'),
20 | # Knowledge Base
21 | Subdomain('kb', [
22 | Rule('/', endpoint='kb/index'),
23 | Rule('/browse/', endpoint='kb/browse'),
24 | Rule('/browse/<int:id>/', endpoint='kb/browse'),
25 | Rule('/browse/<int:id>/<int:page>', endpoint='kb/browse')
26 | ])
27 | ], default_subdomain='www')
28 |
29 | If the application doesn't use subdomains it's perfectly fine to not set
30 | the default subdomain and not use the `Subdomain` rule factory. The
31 | endpoint in the rules can be anything, for example import paths or
32 | unique identifiers. The WSGI application can use those endpoints to get the
33 | handler for that URL. It doesn't have to be a string at all but it's
34 | recommended.
35 |
36 | Now it's possible to create a URL adapter for one of the subdomains and
37 | build URLs:
38 |
39 | .. code-block:: python
40 |
41 | c = m.bind('example.com')
42 |
43 | c.build("kb/browse", dict(id=42))
44 | 'http://kb.example.com/browse/42/'
45 |
46 | c.build("kb/browse", dict())
47 | 'http://kb.example.com/browse/'
48 |
49 | c.build("kb/browse", dict(id=42, page=3))
50 | 'http://kb.example.com/browse/42/3'
51 |
52 | c.build("static/about")
53 | '/about'
54 |
55 | c.build("static/index", force_external=True)
56 | 'http://www.example.com/'
57 |
58 | c = m.bind('example.com', subdomain='kb')
59 |
60 | c.build("static/about")
61 | 'http://www.example.com/about'
62 |
63 | The first argument to bind is the server name *without* the subdomain.
64 | Per default it will assume that the script is mounted on the root, but
65 | often that's not the case so you can provide the real mount point as
66 | second argument:
67 |
68 | .. code-block:: python
69 |
70 | c = m.bind('example.com', '/applications/example')
71 |
72 | The third argument can be the subdomain, if not given the default
73 | subdomain is used. For more details about binding have a look at the
74 | documentation of the `MapAdapter`.
75 |
76 | And here is how you can match URLs:
77 |
78 | .. code-block:: python
79 |
80 | c = m.bind('example.com')
81 |
82 | c.match("/")
83 | ('static/index', {})
84 |
85 | c.match("/about")
86 | ('static/about', {})
87 |
88 | c = m.bind('example.com', '/', 'kb')
89 |
90 | c.match("/")
91 | ('kb/index', {})
92 |
93 | c.match("/browse/42/23")
94 | ('kb/browse', {'id': 42, 'page': 23})
95 |
96 | If matching fails you get a ``NotFound`` exception, if the rule thinks
97 | it's a good idea to redirect (for example because the URL was defined
98 | to have a slash at the end but the request was missing that slash) it
99 | will raise a ``RequestRedirect`` exception. Both are subclasses of
100 | ``HTTPException`` so you can use those errors as responses in the
101 | application.
102 |
103 | If matching succeeded but the URL rule was incompatible to the given
104 | method (for example there were only rules for ``GET`` and ``HEAD`` but
105 | routing tried to match a ``POST`` request) a ``MethodNotAllowed``
106 | exception is raised.
107 | """
108 |
109 | from .converters import AnyConverter as AnyConverter
110 | from .converters import BaseConverter as BaseConverter
111 | from .converters import FloatConverter as FloatConverter
112 | from .converters import IntegerConverter as IntegerConverter
113 | from .converters import PathConverter as PathConverter
114 | from .converters import UnicodeConverter as UnicodeConverter
115 | from .converters import UUIDConverter as UUIDConverter
116 | from .converters import ValidationError as ValidationError
117 | from .exceptions import BuildError as BuildError
118 | from .exceptions import NoMatch as NoMatch
119 | from .exceptions import RequestAliasRedirect as RequestAliasRedirect
120 | from .exceptions import RequestPath as RequestPath
121 | from .exceptions import RequestRedirect as RequestRedirect
122 | from .exceptions import RoutingException as RoutingException
123 | from .exceptions import WebsocketMismatch as WebsocketMismatch
124 | from .map import Map as Map
125 | from .map import MapAdapter as MapAdapter
126 | from .matcher import StateMachineMatcher as StateMachineMatcher
127 | from .rules import EndpointPrefix as EndpointPrefix
128 | from .rules import parse_converter_args as parse_converter_args
129 | from .rules import Rule as Rule
130 | from .rules import RuleFactory as RuleFactory
131 | from .rules import RuleTemplate as RuleTemplate
132 | from .rules import RuleTemplateFactory as RuleTemplateFactory
133 | from .rules import Subdomain as Subdomain
134 | from .rules import Submount as Submount
135 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py:
--------------------------------------------------------------------------------
```python
1 | # SPDX-FileCopyrightText: 2015 Eric Larson
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 | from __future__ import annotations
5 |
6 | import calendar
7 | import time
8 | from datetime import datetime, timedelta, timezone
9 | from email.utils import formatdate, parsedate, parsedate_tz
10 | from typing import TYPE_CHECKING, Any, Mapping
11 |
12 | if TYPE_CHECKING:
13 | from pip._vendor.urllib3 import HTTPResponse
14 |
15 | TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT"
16 |
17 |
18 | def expire_after(delta: timedelta, date: datetime | None = None) -> datetime:
19 | date = date or datetime.now(timezone.utc)
20 | return date + delta
21 |
22 |
23 | def datetime_to_header(dt: datetime) -> str:
24 | return formatdate(calendar.timegm(dt.timetuple()))
25 |
26 |
27 | class BaseHeuristic:
28 | def warning(self, response: HTTPResponse) -> str | None:
29 | """
30 | Return a valid 1xx warning header value describing the cache
31 | adjustments.
32 |
33 | The response is provided too allow warnings like 113
34 | http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need
35 | to explicitly say response is over 24 hours old.
36 | """
37 | return '110 - "Response is Stale"'
38 |
39 | def update_headers(self, response: HTTPResponse) -> dict[str, str]:
40 | """Update the response headers with any new headers.
41 |
42 | NOTE: This SHOULD always include some Warning header to
43 | signify that the response was cached by the client, not
44 | by way of the provided headers.
45 | """
46 | return {}
47 |
48 | def apply(self, response: HTTPResponse) -> HTTPResponse:
49 | updated_headers = self.update_headers(response)
50 |
51 | if updated_headers:
52 | response.headers.update(updated_headers)
53 | warning_header_value = self.warning(response)
54 | if warning_header_value is not None:
55 | response.headers.update({"Warning": warning_header_value})
56 |
57 | return response
58 |
59 |
60 | class OneDayCache(BaseHeuristic):
61 | """
62 | Cache the response by providing an expires 1 day in the
63 | future.
64 | """
65 |
66 | def update_headers(self, response: HTTPResponse) -> dict[str, str]:
67 | headers = {}
68 |
69 | if "expires" not in response.headers:
70 | date = parsedate(response.headers["date"])
71 | expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[index,misc]
72 | headers["expires"] = datetime_to_header(expires)
73 | headers["cache-control"] = "public"
74 | return headers
75 |
76 |
77 | class ExpiresAfter(BaseHeuristic):
78 | """
79 | Cache **all** requests for a defined time period.
80 | """
81 |
82 | def __init__(self, **kw: Any) -> None:
83 | self.delta = timedelta(**kw)
84 |
85 | def update_headers(self, response: HTTPResponse) -> dict[str, str]:
86 | expires = expire_after(self.delta)
87 | return {"expires": datetime_to_header(expires), "cache-control": "public"}
88 |
89 | def warning(self, response: HTTPResponse) -> str | None:
90 | tmpl = "110 - Automatically cached for %s. Response might be stale"
91 | return tmpl % self.delta
92 |
93 |
94 | class LastModified(BaseHeuristic):
95 | """
96 | If there is no Expires header already, fall back on Last-Modified
97 | using the heuristic from
98 | http://tools.ietf.org/html/rfc7234#section-4.2.2
99 | to calculate a reasonable value.
100 |
101 | Firefox also does something like this per
102 | https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ
103 | http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397
104 | Unlike mozilla we limit this to 24-hr.
105 | """
106 |
107 | cacheable_by_default_statuses = {
108 | 200,
109 | 203,
110 | 204,
111 | 206,
112 | 300,
113 | 301,
114 | 404,
115 | 405,
116 | 410,
117 | 414,
118 | 501,
119 | }
120 |
121 | def update_headers(self, resp: HTTPResponse) -> dict[str, str]:
122 | headers: Mapping[str, str] = resp.headers
123 |
124 | if "expires" in headers:
125 | return {}
126 |
127 | if "cache-control" in headers and headers["cache-control"] != "public":
128 | return {}
129 |
130 | if resp.status not in self.cacheable_by_default_statuses:
131 | return {}
132 |
133 | if "date" not in headers or "last-modified" not in headers:
134 | return {}
135 |
136 | time_tuple = parsedate_tz(headers["date"])
137 | assert time_tuple is not None
138 | date = calendar.timegm(time_tuple[:6])
139 | last_modified = parsedate(headers["last-modified"])
140 | if last_modified is None:
141 | return {}
142 |
143 | now = time.time()
144 | current_age = max(0, now - date)
145 | delta = date - calendar.timegm(last_modified)
146 | freshness_lifetime = max(0, min(delta / 10, 24 * 3600))
147 | if freshness_lifetime <= current_age:
148 | return {}
149 |
150 | expires = date + freshness_lifetime
151 | return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))}
152 |
153 | def warning(self, resp: HTTPResponse) -> str | None:
154 | return None
155 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/routing/exceptions.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import difflib
4 | import typing as t
5 |
6 | from ..exceptions import BadRequest
7 | from ..exceptions import HTTPException
8 | from ..utils import cached_property
9 | from ..utils import redirect
10 |
11 | if t.TYPE_CHECKING:
12 | from _typeshed.wsgi import WSGIEnvironment
13 |
14 | from ..wrappers.request import Request
15 | from ..wrappers.response import Response
16 | from .map import MapAdapter
17 | from .rules import Rule
18 |
19 |
20 | class RoutingException(Exception):
21 | """Special exceptions that require the application to redirect, notifying
22 | about missing urls, etc.
23 |
24 | :internal:
25 | """
26 |
27 |
28 | class RequestRedirect(HTTPException, RoutingException):
29 | """Raise if the map requests a redirect. This is for example the case if
30 | `strict_slashes` are activated and an url that requires a trailing slash.
31 |
32 | The attribute `new_url` contains the absolute destination url.
33 | """
34 |
35 | code = 308
36 |
37 | def __init__(self, new_url: str) -> None:
38 | super().__init__(new_url)
39 | self.new_url = new_url
40 |
41 | def get_response(
42 | self,
43 | environ: WSGIEnvironment | Request | None = None,
44 | scope: dict[str, t.Any] | None = None,
45 | ) -> Response:
46 | return redirect(self.new_url, self.code)
47 |
48 |
49 | class RequestPath(RoutingException):
50 | """Internal exception."""
51 |
52 | __slots__ = ("path_info",)
53 |
54 | def __init__(self, path_info: str) -> None:
55 | super().__init__()
56 | self.path_info = path_info
57 |
58 |
59 | class RequestAliasRedirect(RoutingException): # noqa: B903
60 | """This rule is an alias and wants to redirect to the canonical URL."""
61 |
62 | def __init__(self, matched_values: t.Mapping[str, t.Any], endpoint: t.Any) -> None:
63 | super().__init__()
64 | self.matched_values = matched_values
65 | self.endpoint = endpoint
66 |
67 |
68 | class BuildError(RoutingException, LookupError):
69 | """Raised if the build system cannot find a URL for an endpoint with the
70 | values provided.
71 | """
72 |
73 | def __init__(
74 | self,
75 | endpoint: t.Any,
76 | values: t.Mapping[str, t.Any],
77 | method: str | None,
78 | adapter: MapAdapter | None = None,
79 | ) -> None:
80 | super().__init__(endpoint, values, method)
81 | self.endpoint = endpoint
82 | self.values = values
83 | self.method = method
84 | self.adapter = adapter
85 |
86 | @cached_property
87 | def suggested(self) -> Rule | None:
88 | return self.closest_rule(self.adapter)
89 |
90 | def closest_rule(self, adapter: MapAdapter | None) -> Rule | None:
91 | def _score_rule(rule: Rule) -> float:
92 | return sum(
93 | [
94 | 0.98
95 | * difflib.SequenceMatcher(
96 | # endpoints can be any type, compare as strings
97 | None,
98 | str(rule.endpoint),
99 | str(self.endpoint),
100 | ).ratio(),
101 | 0.01 * bool(set(self.values or ()).issubset(rule.arguments)),
102 | 0.01 * bool(rule.methods and self.method in rule.methods),
103 | ]
104 | )
105 |
106 | if adapter and adapter.map._rules:
107 | return max(adapter.map._rules, key=_score_rule)
108 |
109 | return None
110 |
111 | def __str__(self) -> str:
112 | message = [f"Could not build url for endpoint {self.endpoint!r}"]
113 | if self.method:
114 | message.append(f" ({self.method!r})")
115 | if self.values:
116 | message.append(f" with values {sorted(self.values)!r}")
117 | message.append(".")
118 | if self.suggested:
119 | if self.endpoint == self.suggested.endpoint:
120 | if (
121 | self.method
122 | and self.suggested.methods is not None
123 | and self.method not in self.suggested.methods
124 | ):
125 | message.append(
126 | " Did you mean to use methods"
127 | f" {sorted(self.suggested.methods)!r}?"
128 | )
129 | missing_values = self.suggested.arguments.union(
130 | set(self.suggested.defaults or ())
131 | ) - set(self.values.keys())
132 | if missing_values:
133 | message.append(
134 | f" Did you forget to specify values {sorted(missing_values)!r}?"
135 | )
136 | else:
137 | message.append(f" Did you mean {self.suggested.endpoint!r} instead?")
138 | return "".join(message)
139 |
140 |
141 | class WebsocketMismatch(BadRequest):
142 | """The only matched rule is either a WebSocket and the request is
143 | HTTP, or the rule is HTTP and the request is a WebSocket.
144 | """
145 |
146 |
147 | class NoMatch(Exception):
148 | __slots__ = ("have_match_for", "websocket_mismatch")
149 |
150 | def __init__(self, have_match_for: set[str], websocket_mismatch: bool) -> None:
151 | self.have_match_for = have_match_for
152 | self.websocket_mismatch = websocket_mismatch
153 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/__init__.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | pip._vendor is for vendoring dependencies of pip to prevent needing pip to
3 | depend on something external.
4 |
5 | Files inside of pip._vendor should be considered immutable and should only be
6 | updated to versions from upstream.
7 | """
8 | from __future__ import absolute_import
9 |
10 | import glob
11 | import os.path
12 | import sys
13 |
14 | # Downstream redistributors which have debundled our dependencies should also
15 | # patch this value to be true. This will trigger the additional patching
16 | # to cause things like "six" to be available as pip.
17 | DEBUNDLED = False
18 |
19 | # By default, look in this directory for a bunch of .whl files which we will
20 | # add to the beginning of sys.path before attempting to import anything. This
21 | # is done to support downstream re-distributors like Debian and Fedora who
22 | # wish to create their own Wheels for our dependencies to aid in debundling.
23 | WHEEL_DIR = os.path.abspath(os.path.dirname(__file__))
24 |
25 |
26 | # Define a small helper function to alias our vendored modules to the real ones
27 | # if the vendored ones do not exist. This idea of this was taken from
28 | # https://github.com/kennethreitz/requests/pull/2567.
29 | def vendored(modulename):
30 | vendored_name = "{0}.{1}".format(__name__, modulename)
31 |
32 | try:
33 | __import__(modulename, globals(), locals(), level=0)
34 | except ImportError:
35 | # We can just silently allow import failures to pass here. If we
36 | # got to this point it means that ``import pip._vendor.whatever``
37 | # failed and so did ``import whatever``. Since we're importing this
38 | # upfront in an attempt to alias imports, not erroring here will
39 | # just mean we get a regular import error whenever pip *actually*
40 | # tries to import one of these modules to use it, which actually
41 | # gives us a better error message than we would have otherwise
42 | # gotten.
43 | pass
44 | else:
45 | sys.modules[vendored_name] = sys.modules[modulename]
46 | base, head = vendored_name.rsplit(".", 1)
47 | setattr(sys.modules[base], head, sys.modules[modulename])
48 |
49 |
50 | # If we're operating in a debundled setup, then we want to go ahead and trigger
51 | # the aliasing of our vendored libraries as well as looking for wheels to add
52 | # to our sys.path. This will cause all of this code to be a no-op typically
53 | # however downstream redistributors can enable it in a consistent way across
54 | # all platforms.
55 | if DEBUNDLED:
56 | # Actually look inside of WHEEL_DIR to find .whl files and add them to the
57 | # front of our sys.path.
58 | sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path
59 |
60 | # Actually alias all of our vendored dependencies.
61 | vendored("cachecontrol")
62 | vendored("certifi")
63 | vendored("distlib")
64 | vendored("distro")
65 | vendored("packaging")
66 | vendored("packaging.version")
67 | vendored("packaging.specifiers")
68 | vendored("pkg_resources")
69 | vendored("platformdirs")
70 | vendored("progress")
71 | vendored("pyproject_hooks")
72 | vendored("requests")
73 | vendored("requests.exceptions")
74 | vendored("requests.packages")
75 | vendored("requests.packages.urllib3")
76 | vendored("requests.packages.urllib3._collections")
77 | vendored("requests.packages.urllib3.connection")
78 | vendored("requests.packages.urllib3.connectionpool")
79 | vendored("requests.packages.urllib3.contrib")
80 | vendored("requests.packages.urllib3.contrib.ntlmpool")
81 | vendored("requests.packages.urllib3.contrib.pyopenssl")
82 | vendored("requests.packages.urllib3.exceptions")
83 | vendored("requests.packages.urllib3.fields")
84 | vendored("requests.packages.urllib3.filepost")
85 | vendored("requests.packages.urllib3.packages")
86 | vendored("requests.packages.urllib3.packages.ordered_dict")
87 | vendored("requests.packages.urllib3.packages.six")
88 | vendored("requests.packages.urllib3.packages.ssl_match_hostname")
89 | vendored("requests.packages.urllib3.packages.ssl_match_hostname."
90 | "_implementation")
91 | vendored("requests.packages.urllib3.poolmanager")
92 | vendored("requests.packages.urllib3.request")
93 | vendored("requests.packages.urllib3.response")
94 | vendored("requests.packages.urllib3.util")
95 | vendored("requests.packages.urllib3.util.connection")
96 | vendored("requests.packages.urllib3.util.request")
97 | vendored("requests.packages.urllib3.util.response")
98 | vendored("requests.packages.urllib3.util.retry")
99 | vendored("requests.packages.urllib3.util.ssl_")
100 | vendored("requests.packages.urllib3.util.timeout")
101 | vendored("requests.packages.urllib3.util.url")
102 | vendored("resolvelib")
103 | vendored("rich")
104 | vendored("rich.console")
105 | vendored("rich.highlighter")
106 | vendored("rich.logging")
107 | vendored("rich.markup")
108 | vendored("rich.progress")
109 | vendored("rich.segment")
110 | vendored("rich.style")
111 | vendored("rich.text")
112 | vendored("rich.traceback")
113 | if sys.version_info < (3, 11):
114 | vendored("tomli")
115 | vendored("truststore")
116 | vendored("urllib3")
117 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import absolute_import
2 |
3 | import socket
4 |
5 | from ..contrib import _appengine_environ
6 | from ..exceptions import LocationParseError
7 | from ..packages import six
8 | from .wait import NoWayToWaitForSocketError, wait_for_read
9 |
10 |
11 | def is_connection_dropped(conn): # Platform-specific
12 | """
13 | Returns True if the connection is dropped and should be closed.
14 |
15 | :param conn:
16 | :class:`http.client.HTTPConnection` object.
17 |
18 | Note: For platforms like AppEngine, this will always return ``False`` to
19 | let the platform handle connection recycling transparently for us.
20 | """
21 | sock = getattr(conn, "sock", False)
22 | if sock is False: # Platform-specific: AppEngine
23 | return False
24 | if sock is None: # Connection already closed (such as by httplib).
25 | return True
26 | try:
27 | # Returns True if readable, which here means it's been dropped
28 | return wait_for_read(sock, timeout=0.0)
29 | except NoWayToWaitForSocketError: # Platform-specific: AppEngine
30 | return False
31 |
32 |
33 | # This function is copied from socket.py in the Python 2.7 standard
34 | # library test suite. Added to its signature is only `socket_options`.
35 | # One additional modification is that we avoid binding to IPv6 servers
36 | # discovered in DNS if the system doesn't have IPv6 functionality.
37 | def create_connection(
38 | address,
39 | timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
40 | source_address=None,
41 | socket_options=None,
42 | ):
43 | """Connect to *address* and return the socket object.
44 |
45 | Convenience function. Connect to *address* (a 2-tuple ``(host,
46 | port)``) and return the socket object. Passing the optional
47 | *timeout* parameter will set the timeout on the socket instance
48 | before attempting to connect. If no *timeout* is supplied, the
49 | global default timeout setting returned by :func:`socket.getdefaulttimeout`
50 | is used. If *source_address* is set it must be a tuple of (host, port)
51 | for the socket to bind as a source address before making the connection.
52 | An host of '' or port 0 tells the OS to use the default.
53 | """
54 |
55 | host, port = address
56 | if host.startswith("["):
57 | host = host.strip("[]")
58 | err = None
59 |
60 | # Using the value from allowed_gai_family() in the context of getaddrinfo lets
61 | # us select whether to work with IPv4 DNS records, IPv6 records, or both.
62 | # The original create_connection function always returns all records.
63 | family = allowed_gai_family()
64 |
65 | try:
66 | host.encode("idna")
67 | except UnicodeError:
68 | return six.raise_from(
69 | LocationParseError(u"'%s', label empty or too long" % host), None
70 | )
71 |
72 | for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
73 | af, socktype, proto, canonname, sa = res
74 | sock = None
75 | try:
76 | sock = socket.socket(af, socktype, proto)
77 |
78 | # If provided, set socket level options before connecting.
79 | _set_socket_options(sock, socket_options)
80 |
81 | if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
82 | sock.settimeout(timeout)
83 | if source_address:
84 | sock.bind(source_address)
85 | sock.connect(sa)
86 | return sock
87 |
88 | except socket.error as e:
89 | err = e
90 | if sock is not None:
91 | sock.close()
92 | sock = None
93 |
94 | if err is not None:
95 | raise err
96 |
97 | raise socket.error("getaddrinfo returns an empty list")
98 |
99 |
100 | def _set_socket_options(sock, options):
101 | if options is None:
102 | return
103 |
104 | for opt in options:
105 | sock.setsockopt(*opt)
106 |
107 |
108 | def allowed_gai_family():
109 | """This function is designed to work in the context of
110 | getaddrinfo, where family=socket.AF_UNSPEC is the default and
111 | will perform a DNS search for both IPv6 and IPv4 records."""
112 |
113 | family = socket.AF_INET
114 | if HAS_IPV6:
115 | family = socket.AF_UNSPEC
116 | return family
117 |
118 |
119 | def _has_ipv6(host):
120 | """Returns True if the system can bind an IPv6 address."""
121 | sock = None
122 | has_ipv6 = False
123 |
124 | # App Engine doesn't support IPV6 sockets and actually has a quota on the
125 | # number of sockets that can be used, so just early out here instead of
126 | # creating a socket needlessly.
127 | # See https://github.com/urllib3/urllib3/issues/1446
128 | if _appengine_environ.is_appengine_sandbox():
129 | return False
130 |
131 | if socket.has_ipv6:
132 | # has_ipv6 returns true if cPython was compiled with IPv6 support.
133 | # It does not tell us if the system has IPv6 support enabled. To
134 | # determine that we must bind to an IPv6 address.
135 | # https://github.com/urllib3/urllib3/pull/611
136 | # https://bugs.python.org/issue658327
137 | try:
138 | sock = socket.socket(socket.AF_INET6)
139 | sock.bind((host, 0))
140 | has_ipv6 = True
141 | except Exception:
142 | pass
143 |
144 | if sock:
145 | sock.close()
146 | return has_ipv6
147 |
148 |
149 | HAS_IPV6 = _has_ipv6("::1")
150 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/debugXML.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: Tree debugging APIs
3 | * Description: Interfaces to a set of routines used for debugging the tree
4 | * produced by the XML parser.
5 | *
6 | * Copy: See Copyright for the status of this software.
7 | *
8 | * Author: Daniel Veillard
9 | */
10 |
11 | #ifndef __DEBUG_XML__
12 | #define __DEBUG_XML__
13 | #include <stdio.h>
14 | #include <libxml/xmlversion.h>
15 | #include <libxml/tree.h>
16 |
17 | #ifdef LIBXML_DEBUG_ENABLED
18 |
19 | #include <libxml/xpath.h>
20 |
21 | #ifdef __cplusplus
22 | extern "C" {
23 | #endif
24 |
25 | /*
26 | * The standard Dump routines.
27 | */
28 | XMLPUBFUN void
29 | xmlDebugDumpString (FILE *output,
30 | const xmlChar *str);
31 | XMLPUBFUN void
32 | xmlDebugDumpAttr (FILE *output,
33 | xmlAttrPtr attr,
34 | int depth);
35 | XMLPUBFUN void
36 | xmlDebugDumpAttrList (FILE *output,
37 | xmlAttrPtr attr,
38 | int depth);
39 | XMLPUBFUN void
40 | xmlDebugDumpOneNode (FILE *output,
41 | xmlNodePtr node,
42 | int depth);
43 | XMLPUBFUN void
44 | xmlDebugDumpNode (FILE *output,
45 | xmlNodePtr node,
46 | int depth);
47 | XMLPUBFUN void
48 | xmlDebugDumpNodeList (FILE *output,
49 | xmlNodePtr node,
50 | int depth);
51 | XMLPUBFUN void
52 | xmlDebugDumpDocumentHead(FILE *output,
53 | xmlDocPtr doc);
54 | XMLPUBFUN void
55 | xmlDebugDumpDocument (FILE *output,
56 | xmlDocPtr doc);
57 | XMLPUBFUN void
58 | xmlDebugDumpDTD (FILE *output,
59 | xmlDtdPtr dtd);
60 | XMLPUBFUN void
61 | xmlDebugDumpEntities (FILE *output,
62 | xmlDocPtr doc);
63 |
64 | /****************************************************************
65 | * *
66 | * Checking routines *
67 | * *
68 | ****************************************************************/
69 |
70 | XMLPUBFUN int
71 | xmlDebugCheckDocument (FILE * output,
72 | xmlDocPtr doc);
73 |
74 | /****************************************************************
75 | * *
76 | * XML shell helpers *
77 | * *
78 | ****************************************************************/
79 |
80 | XMLPUBFUN void
81 | xmlLsOneNode (FILE *output, xmlNodePtr node);
82 | XMLPUBFUN int
83 | xmlLsCountNode (xmlNodePtr node);
84 |
85 | XMLPUBFUN const char *
86 | xmlBoolToText (int boolval);
87 |
88 | /****************************************************************
89 | * *
90 | * The XML shell related structures and functions *
91 | * *
92 | ****************************************************************/
93 |
94 | #ifdef LIBXML_XPATH_ENABLED
95 | /**
96 | * xmlShellReadlineFunc:
97 | * @prompt: a string prompt
98 | *
99 | * This is a generic signature for the XML shell input function.
100 | *
101 | * Returns a string which will be freed by the Shell.
102 | */
103 | typedef char * (* xmlShellReadlineFunc)(char *prompt);
104 |
105 | /**
106 | * xmlShellCtxt:
107 | *
108 | * A debugging shell context.
109 | * TODO: add the defined function tables.
110 | */
111 | typedef struct _xmlShellCtxt xmlShellCtxt;
112 | typedef xmlShellCtxt *xmlShellCtxtPtr;
113 | struct _xmlShellCtxt {
114 | char *filename;
115 | xmlDocPtr doc;
116 | xmlNodePtr node;
117 | xmlXPathContextPtr pctxt;
118 | int loaded;
119 | FILE *output;
120 | xmlShellReadlineFunc input;
121 | };
122 |
123 | /**
124 | * xmlShellCmd:
125 | * @ctxt: a shell context
126 | * @arg: a string argument
127 | * @node: a first node
128 | * @node2: a second node
129 | *
130 | * This is a generic signature for the XML shell functions.
131 | *
132 | * Returns an int, negative returns indicating errors.
133 | */
134 | typedef int (* xmlShellCmd) (xmlShellCtxtPtr ctxt,
135 | char *arg,
136 | xmlNodePtr node,
137 | xmlNodePtr node2);
138 |
139 | XMLPUBFUN void
140 | xmlShellPrintXPathError (int errorType,
141 | const char *arg);
142 | XMLPUBFUN void
143 | xmlShellPrintXPathResult(xmlXPathObjectPtr list);
144 | XMLPUBFUN int
145 | xmlShellList (xmlShellCtxtPtr ctxt,
146 | char *arg,
147 | xmlNodePtr node,
148 | xmlNodePtr node2);
149 | XMLPUBFUN int
150 | xmlShellBase (xmlShellCtxtPtr ctxt,
151 | char *arg,
152 | xmlNodePtr node,
153 | xmlNodePtr node2);
154 | XMLPUBFUN int
155 | xmlShellDir (xmlShellCtxtPtr ctxt,
156 | char *arg,
157 | xmlNodePtr node,
158 | xmlNodePtr node2);
159 | XMLPUBFUN int
160 | xmlShellLoad (xmlShellCtxtPtr ctxt,
161 | char *filename,
162 | xmlNodePtr node,
163 | xmlNodePtr node2);
164 | #ifdef LIBXML_OUTPUT_ENABLED
165 | XMLPUBFUN void
166 | xmlShellPrintNode (xmlNodePtr node);
167 | XMLPUBFUN int
168 | xmlShellCat (xmlShellCtxtPtr ctxt,
169 | char *arg,
170 | xmlNodePtr node,
171 | xmlNodePtr node2);
172 | XMLPUBFUN int
173 | xmlShellWrite (xmlShellCtxtPtr ctxt,
174 | char *filename,
175 | xmlNodePtr node,
176 | xmlNodePtr node2);
177 | XMLPUBFUN int
178 | xmlShellSave (xmlShellCtxtPtr ctxt,
179 | char *filename,
180 | xmlNodePtr node,
181 | xmlNodePtr node2);
182 | #endif /* LIBXML_OUTPUT_ENABLED */
183 | #ifdef LIBXML_VALID_ENABLED
184 | XMLPUBFUN int
185 | xmlShellValidate (xmlShellCtxtPtr ctxt,
186 | char *dtd,
187 | xmlNodePtr node,
188 | xmlNodePtr node2);
189 | #endif /* LIBXML_VALID_ENABLED */
190 | XMLPUBFUN int
191 | xmlShellDu (xmlShellCtxtPtr ctxt,
192 | char *arg,
193 | xmlNodePtr tree,
194 | xmlNodePtr node2);
195 | XMLPUBFUN int
196 | xmlShellPwd (xmlShellCtxtPtr ctxt,
197 | char *buffer,
198 | xmlNodePtr node,
199 | xmlNodePtr node2);
200 |
201 | /*
202 | * The Shell interface.
203 | */
204 | XMLPUBFUN void
205 | xmlShell (xmlDocPtr doc,
206 | char *filename,
207 | xmlShellReadlineFunc input,
208 | FILE *output);
209 |
210 | #endif /* LIBXML_XPATH_ENABLED */
211 |
212 | #ifdef __cplusplus
213 | }
214 | #endif
215 |
216 | #endif /* LIBXML_DEBUG_ENABLED */
217 | #endif /* __DEBUG_XML__ */
218 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py:
--------------------------------------------------------------------------------
```python
1 | import fnmatch
2 | import os
3 | import os.path
4 | import random
5 | import sys
6 | from contextlib import contextmanager
7 | from tempfile import NamedTemporaryFile
8 | from typing import Any, BinaryIO, Generator, List, Union, cast
9 |
10 | from pip._internal.utils.compat import get_path_uid
11 | from pip._internal.utils.misc import format_size
12 | from pip._internal.utils.retry import retry
13 |
14 |
15 | def check_path_owner(path: str) -> bool:
16 | # If we don't have a way to check the effective uid of this process, then
17 | # we'll just assume that we own the directory.
18 | if sys.platform == "win32" or not hasattr(os, "geteuid"):
19 | return True
20 |
21 | assert os.path.isabs(path)
22 |
23 | previous = None
24 | while path != previous:
25 | if os.path.lexists(path):
26 | # Check if path is writable by current user.
27 | if os.geteuid() == 0:
28 | # Special handling for root user in order to handle properly
29 | # cases where users use sudo without -H flag.
30 | try:
31 | path_uid = get_path_uid(path)
32 | except OSError:
33 | return False
34 | return path_uid == 0
35 | else:
36 | return os.access(path, os.W_OK)
37 | else:
38 | previous, path = path, os.path.dirname(path)
39 | return False # assume we don't own the path
40 |
41 |
42 | @contextmanager
43 | def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, None]:
44 | """Return a file-like object pointing to a tmp file next to path.
45 |
46 | The file is created securely and is ensured to be written to disk
47 | after the context reaches its end.
48 |
49 | kwargs will be passed to tempfile.NamedTemporaryFile to control
50 | the way the temporary file will be opened.
51 | """
52 | with NamedTemporaryFile(
53 | delete=False,
54 | dir=os.path.dirname(path),
55 | prefix=os.path.basename(path),
56 | suffix=".tmp",
57 | **kwargs,
58 | ) as f:
59 | result = cast(BinaryIO, f)
60 | try:
61 | yield result
62 | finally:
63 | result.flush()
64 | os.fsync(result.fileno())
65 |
66 |
67 | replace = retry(stop_after_delay=1, wait=0.25)(os.replace)
68 |
69 |
70 | # test_writable_dir and _test_writable_dir_win are copied from Flit,
71 | # with the author's agreement to also place them under pip's license.
72 | def test_writable_dir(path: str) -> bool:
73 | """Check if a directory is writable.
74 |
75 | Uses os.access() on POSIX, tries creating files on Windows.
76 | """
77 | # If the directory doesn't exist, find the closest parent that does.
78 | while not os.path.isdir(path):
79 | parent = os.path.dirname(path)
80 | if parent == path:
81 | break # Should never get here, but infinite loops are bad
82 | path = parent
83 |
84 | if os.name == "posix":
85 | return os.access(path, os.W_OK)
86 |
87 | return _test_writable_dir_win(path)
88 |
89 |
90 | def _test_writable_dir_win(path: str) -> bool:
91 | # os.access doesn't work on Windows: http://bugs.python.org/issue2528
92 | # and we can't use tempfile: http://bugs.python.org/issue22107
93 | basename = "accesstest_deleteme_fishfingers_custard_"
94 | alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
95 | for _ in range(10):
96 | name = basename + "".join(random.choice(alphabet) for _ in range(6))
97 | file = os.path.join(path, name)
98 | try:
99 | fd = os.open(file, os.O_RDWR | os.O_CREAT | os.O_EXCL)
100 | except FileExistsError:
101 | pass
102 | except PermissionError:
103 | # This could be because there's a directory with the same name.
104 | # But it's highly unlikely there's a directory called that,
105 | # so we'll assume it's because the parent dir is not writable.
106 | # This could as well be because the parent dir is not readable,
107 | # due to non-privileged user access.
108 | return False
109 | else:
110 | os.close(fd)
111 | os.unlink(file)
112 | return True
113 |
114 | # This should never be reached
115 | raise OSError("Unexpected condition testing for writable directory")
116 |
117 |
118 | def find_files(path: str, pattern: str) -> List[str]:
119 | """Returns a list of absolute paths of files beneath path, recursively,
120 | with filenames which match the UNIX-style shell glob pattern."""
121 | result: List[str] = []
122 | for root, _, files in os.walk(path):
123 | matches = fnmatch.filter(files, pattern)
124 | result.extend(os.path.join(root, f) for f in matches)
125 | return result
126 |
127 |
128 | def file_size(path: str) -> Union[int, float]:
129 | # If it's a symlink, return 0.
130 | if os.path.islink(path):
131 | return 0
132 | return os.path.getsize(path)
133 |
134 |
135 | def format_file_size(path: str) -> str:
136 | return format_size(file_size(path))
137 |
138 |
139 | def directory_size(path: str) -> Union[int, float]:
140 | size = 0.0
141 | for root, _dirs, files in os.walk(path):
142 | for filename in files:
143 | file_path = os.path.join(root, filename)
144 | size += file_size(file_path)
145 | return size
146 |
147 |
148 | def format_directory_size(path: str) -> str:
149 | return format_size(directory_size(path))
150 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/sansio/utils.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import typing as t
4 | from urllib.parse import quote
5 |
6 | from .._internal import _plain_int
7 | from ..exceptions import SecurityError
8 | from ..urls import uri_to_iri
9 |
10 |
11 | def host_is_trusted(hostname: str | None, trusted_list: t.Iterable[str]) -> bool:
12 | """Check if a host matches a list of trusted names.
13 |
14 | :param hostname: The name to check.
15 | :param trusted_list: A list of valid names to match. If a name
16 | starts with a dot it will match all subdomains.
17 |
18 | .. versionadded:: 0.9
19 | """
20 | if not hostname:
21 | return False
22 |
23 | try:
24 | hostname = hostname.partition(":")[0].encode("idna").decode("ascii")
25 | except UnicodeEncodeError:
26 | return False
27 |
28 | if isinstance(trusted_list, str):
29 | trusted_list = [trusted_list]
30 |
31 | for ref in trusted_list:
32 | if ref.startswith("."):
33 | ref = ref[1:]
34 | suffix_match = True
35 | else:
36 | suffix_match = False
37 |
38 | try:
39 | ref = ref.partition(":")[0].encode("idna").decode("ascii")
40 | except UnicodeEncodeError:
41 | return False
42 |
43 | if ref == hostname or (suffix_match and hostname.endswith(f".{ref}")):
44 | return True
45 |
46 | return False
47 |
48 |
49 | def get_host(
50 | scheme: str,
51 | host_header: str | None,
52 | server: tuple[str, int | None] | None = None,
53 | trusted_hosts: t.Iterable[str] | None = None,
54 | ) -> str:
55 | """Return the host for the given parameters.
56 |
57 | This first checks the ``host_header``. If it's not present, then
58 | ``server`` is used. The host will only contain the port if it is
59 | different than the standard port for the protocol.
60 |
61 | Optionally, verify that the host is trusted using
62 | :func:`host_is_trusted` and raise a
63 | :exc:`~werkzeug.exceptions.SecurityError` if it is not.
64 |
65 | :param scheme: The protocol the request used, like ``"https"``.
66 | :param host_header: The ``Host`` header value.
67 | :param server: Address of the server. ``(host, port)``, or
68 | ``(path, None)`` for unix sockets.
69 | :param trusted_hosts: A list of trusted host names.
70 |
71 | :return: Host, with port if necessary.
72 | :raise ~werkzeug.exceptions.SecurityError: If the host is not
73 | trusted.
74 | """
75 | host = ""
76 |
77 | if host_header is not None:
78 | host = host_header
79 | elif server is not None:
80 | host = server[0]
81 |
82 | if server[1] is not None:
83 | host = f"{host}:{server[1]}"
84 |
85 | if scheme in {"http", "ws"} and host.endswith(":80"):
86 | host = host[:-3]
87 | elif scheme in {"https", "wss"} and host.endswith(":443"):
88 | host = host[:-4]
89 |
90 | if trusted_hosts is not None:
91 | if not host_is_trusted(host, trusted_hosts):
92 | raise SecurityError(f"Host {host!r} is not trusted.")
93 |
94 | return host
95 |
96 |
97 | def get_current_url(
98 | scheme: str,
99 | host: str,
100 | root_path: str | None = None,
101 | path: str | None = None,
102 | query_string: bytes | None = None,
103 | ) -> str:
104 | """Recreate the URL for a request. If an optional part isn't
105 | provided, it and subsequent parts are not included in the URL.
106 |
107 | The URL is an IRI, not a URI, so it may contain Unicode characters.
108 | Use :func:`~werkzeug.urls.iri_to_uri` to convert it to ASCII.
109 |
110 | :param scheme: The protocol the request used, like ``"https"``.
111 | :param host: The host the request was made to. See :func:`get_host`.
112 | :param root_path: Prefix that the application is mounted under. This
113 | is prepended to ``path``.
114 | :param path: The path part of the URL after ``root_path``.
115 | :param query_string: The portion of the URL after the "?".
116 | """
117 | url = [scheme, "://", host]
118 |
119 | if root_path is None:
120 | url.append("/")
121 | return uri_to_iri("".join(url))
122 |
123 | # safe = https://url.spec.whatwg.org/#url-path-segment-string
124 | # as well as percent for things that are already quoted
125 | url.append(quote(root_path.rstrip("/"), safe="!$&'()*+,/:;=@%"))
126 | url.append("/")
127 |
128 | if path is None:
129 | return uri_to_iri("".join(url))
130 |
131 | url.append(quote(path.lstrip("/"), safe="!$&'()*+,/:;=@%"))
132 |
133 | if query_string:
134 | url.append("?")
135 | url.append(quote(query_string, safe="!$&'()*+,/:;=?@%"))
136 |
137 | return uri_to_iri("".join(url))
138 |
139 |
140 | def get_content_length(
141 | http_content_length: str | None = None,
142 | http_transfer_encoding: str | None = None,
143 | ) -> int | None:
144 | """Return the ``Content-Length`` header value as an int. If the header is not given
145 | or the ``Transfer-Encoding`` header is ``chunked``, ``None`` is returned to indicate
146 | a streaming request. If the value is not an integer, or negative, 0 is returned.
147 |
148 | :param http_content_length: The Content-Length HTTP header.
149 | :param http_transfer_encoding: The Transfer-Encoding HTTP header.
150 |
151 | .. versionadded:: 2.2
152 | """
153 | if http_transfer_encoding == "chunked" or http_content_length is None:
154 | return None
155 |
156 | try:
157 | return max(0, _plain_int(http_content_length))
158 | except ValueError:
159 | return 0
160 |
```