This is page 16 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/requests/__init__.py:
--------------------------------------------------------------------------------
```python
1 | # __
2 | # /__) _ _ _ _ _/ _
3 | # / ( (- (/ (/ (- _) / _)
4 | # /
5 |
6 | """
7 | Requests HTTP Library
8 | ~~~~~~~~~~~~~~~~~~~~~
9 |
10 | Requests is an HTTP library, written in Python, for human beings.
11 | Basic GET usage:
12 |
13 | >>> import requests
14 | >>> r = requests.get('https://www.python.org')
15 | >>> r.status_code
16 | 200
17 | >>> b'Python is a programming language' in r.content
18 | True
19 |
20 | ... or POST:
21 |
22 | >>> payload = dict(key1='value1', key2='value2')
23 | >>> r = requests.post('https://httpbin.org/post', data=payload)
24 | >>> print(r.text)
25 | {
26 | ...
27 | "form": {
28 | "key1": "value1",
29 | "key2": "value2"
30 | },
31 | ...
32 | }
33 |
34 | The other HTTP methods are supported - see `requests.api`. Full documentation
35 | is at <https://requests.readthedocs.io>.
36 |
37 | :copyright: (c) 2017 by Kenneth Reitz.
38 | :license: Apache 2.0, see LICENSE for more details.
39 | """
40 |
41 | import warnings
42 |
43 | import urllib3
44 |
45 | from .exceptions import RequestsDependencyWarning
46 |
47 | try:
48 | from charset_normalizer import __version__ as charset_normalizer_version
49 | except ImportError:
50 | charset_normalizer_version = None
51 |
52 | try:
53 | from chardet import __version__ as chardet_version
54 | except ImportError:
55 | chardet_version = None
56 |
57 |
58 | def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version):
59 | urllib3_version = urllib3_version.split(".")
60 | assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git.
61 |
62 | # Sometimes, urllib3 only reports its version as 16.1.
63 | if len(urllib3_version) == 2:
64 | urllib3_version.append("0")
65 |
66 | # Check urllib3 for compatibility.
67 | major, minor, patch = urllib3_version # noqa: F811
68 | major, minor, patch = int(major), int(minor), int(patch)
69 | # urllib3 >= 1.21.1
70 | assert major >= 1
71 | if major == 1:
72 | assert minor >= 21
73 |
74 | # Check charset_normalizer for compatibility.
75 | if chardet_version:
76 | major, minor, patch = chardet_version.split(".")[:3]
77 | major, minor, patch = int(major), int(minor), int(patch)
78 | # chardet_version >= 3.0.2, < 6.0.0
79 | assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0)
80 | elif charset_normalizer_version:
81 | major, minor, patch = charset_normalizer_version.split(".")[:3]
82 | major, minor, patch = int(major), int(minor), int(patch)
83 | # charset_normalizer >= 2.0.0 < 4.0.0
84 | assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0)
85 | else:
86 | warnings.warn(
87 | "Unable to find acceptable character detection dependency "
88 | "(chardet or charset_normalizer).",
89 | RequestsDependencyWarning,
90 | )
91 |
92 |
93 | def _check_cryptography(cryptography_version):
94 | # cryptography < 1.3.4
95 | try:
96 | cryptography_version = list(map(int, cryptography_version.split(".")))
97 | except ValueError:
98 | return
99 |
100 | if cryptography_version < [1, 3, 4]:
101 | warning = "Old version of cryptography ({}) may cause slowdown.".format(
102 | cryptography_version
103 | )
104 | warnings.warn(warning, RequestsDependencyWarning)
105 |
106 |
107 | # Check imported dependencies for compatibility.
108 | try:
109 | check_compatibility(
110 | urllib3.__version__, chardet_version, charset_normalizer_version
111 | )
112 | except (AssertionError, ValueError):
113 | warnings.warn(
114 | "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
115 | "version!".format(
116 | urllib3.__version__, chardet_version, charset_normalizer_version
117 | ),
118 | RequestsDependencyWarning,
119 | )
120 |
121 | # Attempt to enable urllib3's fallback for SNI support
122 | # if the standard library doesn't support SNI or the
123 | # 'ssl' library isn't available.
124 | try:
125 | try:
126 | import ssl
127 | except ImportError:
128 | ssl = None
129 |
130 | if not getattr(ssl, "HAS_SNI", False):
131 | from urllib3.contrib import pyopenssl
132 |
133 | pyopenssl.inject_into_urllib3()
134 |
135 | # Check cryptography version
136 | from cryptography import __version__ as cryptography_version
137 |
138 | _check_cryptography(cryptography_version)
139 | except ImportError:
140 | pass
141 |
142 | # urllib3's DependencyWarnings should be silenced.
143 | from urllib3.exceptions import DependencyWarning
144 |
145 | warnings.simplefilter("ignore", DependencyWarning)
146 |
147 | # Set default logging handler to avoid "No handler found" warnings.
148 | import logging
149 | from logging import NullHandler
150 |
151 | from . import packages, utils
152 | from .__version__ import (
153 | __author__,
154 | __author_email__,
155 | __build__,
156 | __cake__,
157 | __copyright__,
158 | __description__,
159 | __license__,
160 | __title__,
161 | __url__,
162 | __version__,
163 | )
164 | from .api import delete, get, head, options, patch, post, put, request
165 | from .exceptions import (
166 | ConnectionError,
167 | ConnectTimeout,
168 | FileModeWarning,
169 | HTTPError,
170 | JSONDecodeError,
171 | ReadTimeout,
172 | RequestException,
173 | Timeout,
174 | TooManyRedirects,
175 | URLRequired,
176 | )
177 | from .models import PreparedRequest, Request, Response
178 | from .sessions import Session, session
179 | from .status_codes import codes
180 |
181 | logging.getLogger(__name__).addHandler(NullHandler())
182 |
183 | # FileModeWarnings go off per the default.
184 | warnings.simplefilter("default", FileModeWarning, append=True)
185 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/chvalid.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: Unicode character range checking
3 | * Description: this module exports interfaces for the character
4 | * range validation APIs
5 | *
6 | * This file is automatically generated from the cvs source
7 | * definition files using the genChRanges.py Python script
8 | *
9 | * Generation date: Mon Mar 27 11:09:48 2006
10 | * Sources: chvalid.def
11 | * Author: William Brack <[email protected]>
12 | */
13 |
14 | #ifndef __XML_CHVALID_H__
15 | #define __XML_CHVALID_H__
16 |
17 | #include <libxml/xmlversion.h>
18 | #include <libxml/xmlstring.h>
19 |
20 | #ifdef __cplusplus
21 | extern "C" {
22 | #endif
23 |
24 | /*
25 | * Define our typedefs and structures
26 | *
27 | */
28 | typedef struct _xmlChSRange xmlChSRange;
29 | typedef xmlChSRange *xmlChSRangePtr;
30 | struct _xmlChSRange {
31 | unsigned short low;
32 | unsigned short high;
33 | };
34 |
35 | typedef struct _xmlChLRange xmlChLRange;
36 | typedef xmlChLRange *xmlChLRangePtr;
37 | struct _xmlChLRange {
38 | unsigned int low;
39 | unsigned int high;
40 | };
41 |
42 | typedef struct _xmlChRangeGroup xmlChRangeGroup;
43 | typedef xmlChRangeGroup *xmlChRangeGroupPtr;
44 | struct _xmlChRangeGroup {
45 | int nbShortRange;
46 | int nbLongRange;
47 | const xmlChSRange *shortRange; /* points to an array of ranges */
48 | const xmlChLRange *longRange;
49 | };
50 |
51 | /**
52 | * Range checking routine
53 | */
54 | XMLPUBFUN int
55 | xmlCharInRange(unsigned int val, const xmlChRangeGroup *group);
56 |
57 |
58 | /**
59 | * xmlIsBaseChar_ch:
60 | * @c: char to validate
61 | *
62 | * Automatically generated by genChRanges.py
63 | */
64 | #define xmlIsBaseChar_ch(c) (((0x41 <= (c)) && ((c) <= 0x5a)) || \
65 | ((0x61 <= (c)) && ((c) <= 0x7a)) || \
66 | ((0xc0 <= (c)) && ((c) <= 0xd6)) || \
67 | ((0xd8 <= (c)) && ((c) <= 0xf6)) || \
68 | (0xf8 <= (c)))
69 |
70 | /**
71 | * xmlIsBaseCharQ:
72 | * @c: char to validate
73 | *
74 | * Automatically generated by genChRanges.py
75 | */
76 | #define xmlIsBaseCharQ(c) (((c) < 0x100) ? \
77 | xmlIsBaseChar_ch((c)) : \
78 | xmlCharInRange((c), &xmlIsBaseCharGroup))
79 |
80 | XMLPUBVAR const xmlChRangeGroup xmlIsBaseCharGroup;
81 |
82 | /**
83 | * xmlIsBlank_ch:
84 | * @c: char to validate
85 | *
86 | * Automatically generated by genChRanges.py
87 | */
88 | #define xmlIsBlank_ch(c) (((c) == 0x20) || \
89 | ((0x9 <= (c)) && ((c) <= 0xa)) || \
90 | ((c) == 0xd))
91 |
92 | /**
93 | * xmlIsBlankQ:
94 | * @c: char to validate
95 | *
96 | * Automatically generated by genChRanges.py
97 | */
98 | #define xmlIsBlankQ(c) (((c) < 0x100) ? \
99 | xmlIsBlank_ch((c)) : 0)
100 |
101 |
102 | /**
103 | * xmlIsChar_ch:
104 | * @c: char to validate
105 | *
106 | * Automatically generated by genChRanges.py
107 | */
108 | #define xmlIsChar_ch(c) (((0x9 <= (c)) && ((c) <= 0xa)) || \
109 | ((c) == 0xd) || \
110 | (0x20 <= (c)))
111 |
112 | /**
113 | * xmlIsCharQ:
114 | * @c: char to validate
115 | *
116 | * Automatically generated by genChRanges.py
117 | */
118 | #define xmlIsCharQ(c) (((c) < 0x100) ? \
119 | xmlIsChar_ch((c)) :\
120 | (((0x100 <= (c)) && ((c) <= 0xd7ff)) || \
121 | ((0xe000 <= (c)) && ((c) <= 0xfffd)) || \
122 | ((0x10000 <= (c)) && ((c) <= 0x10ffff))))
123 |
124 | XMLPUBVAR const xmlChRangeGroup xmlIsCharGroup;
125 |
126 | /**
127 | * xmlIsCombiningQ:
128 | * @c: char to validate
129 | *
130 | * Automatically generated by genChRanges.py
131 | */
132 | #define xmlIsCombiningQ(c) (((c) < 0x100) ? \
133 | 0 : \
134 | xmlCharInRange((c), &xmlIsCombiningGroup))
135 |
136 | XMLPUBVAR const xmlChRangeGroup xmlIsCombiningGroup;
137 |
138 | /**
139 | * xmlIsDigit_ch:
140 | * @c: char to validate
141 | *
142 | * Automatically generated by genChRanges.py
143 | */
144 | #define xmlIsDigit_ch(c) (((0x30 <= (c)) && ((c) <= 0x39)))
145 |
146 | /**
147 | * xmlIsDigitQ:
148 | * @c: char to validate
149 | *
150 | * Automatically generated by genChRanges.py
151 | */
152 | #define xmlIsDigitQ(c) (((c) < 0x100) ? \
153 | xmlIsDigit_ch((c)) : \
154 | xmlCharInRange((c), &xmlIsDigitGroup))
155 |
156 | XMLPUBVAR const xmlChRangeGroup xmlIsDigitGroup;
157 |
158 | /**
159 | * xmlIsExtender_ch:
160 | * @c: char to validate
161 | *
162 | * Automatically generated by genChRanges.py
163 | */
164 | #define xmlIsExtender_ch(c) (((c) == 0xb7))
165 |
166 | /**
167 | * xmlIsExtenderQ:
168 | * @c: char to validate
169 | *
170 | * Automatically generated by genChRanges.py
171 | */
172 | #define xmlIsExtenderQ(c) (((c) < 0x100) ? \
173 | xmlIsExtender_ch((c)) : \
174 | xmlCharInRange((c), &xmlIsExtenderGroup))
175 |
176 | XMLPUBVAR const xmlChRangeGroup xmlIsExtenderGroup;
177 |
178 | /**
179 | * xmlIsIdeographicQ:
180 | * @c: char to validate
181 | *
182 | * Automatically generated by genChRanges.py
183 | */
184 | #define xmlIsIdeographicQ(c) (((c) < 0x100) ? \
185 | 0 :\
186 | (((0x4e00 <= (c)) && ((c) <= 0x9fa5)) || \
187 | ((c) == 0x3007) || \
188 | ((0x3021 <= (c)) && ((c) <= 0x3029))))
189 |
190 | XMLPUBVAR const xmlChRangeGroup xmlIsIdeographicGroup;
191 | XMLPUBVAR const unsigned char xmlIsPubidChar_tab[256];
192 |
193 | /**
194 | * xmlIsPubidChar_ch:
195 | * @c: char to validate
196 | *
197 | * Automatically generated by genChRanges.py
198 | */
199 | #define xmlIsPubidChar_ch(c) (xmlIsPubidChar_tab[(c)])
200 |
201 | /**
202 | * xmlIsPubidCharQ:
203 | * @c: char to validate
204 | *
205 | * Automatically generated by genChRanges.py
206 | */
207 | #define xmlIsPubidCharQ(c) (((c) < 0x100) ? \
208 | xmlIsPubidChar_ch((c)) : 0)
209 |
210 | XMLPUBFUN int
211 | xmlIsBaseChar(unsigned int ch);
212 | XMLPUBFUN int
213 | xmlIsBlank(unsigned int ch);
214 | XMLPUBFUN int
215 | xmlIsChar(unsigned int ch);
216 | XMLPUBFUN int
217 | xmlIsCombining(unsigned int ch);
218 | XMLPUBFUN int
219 | xmlIsDigit(unsigned int ch);
220 | XMLPUBFUN int
221 | xmlIsExtender(unsigned int ch);
222 | XMLPUBFUN int
223 | xmlIsIdeographic(unsigned int ch);
224 | XMLPUBFUN int
225 | xmlIsPubidChar(unsigned int ch);
226 |
227 | #ifdef __cplusplus
228 | }
229 | #endif
230 | #endif /* __XML_CHVALID_H__ */
231 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | pygments.formatters.groff
3 | ~~~~~~~~~~~~~~~~~~~~~~~~~
4 |
5 | Formatter for groff output.
6 |
7 | :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
8 | :license: BSD, see LICENSE for details.
9 | """
10 |
11 | import math
12 | from pip._vendor.pygments.formatter import Formatter
13 | from pip._vendor.pygments.util import get_bool_opt, get_int_opt
14 |
15 | __all__ = ['GroffFormatter']
16 |
17 |
18 | class GroffFormatter(Formatter):
19 | """
20 | Format tokens with groff escapes to change their color and font style.
21 |
22 | .. versionadded:: 2.11
23 |
24 | Additional options accepted:
25 |
26 | `style`
27 | The style to use, can be a string or a Style subclass (default:
28 | ``'default'``).
29 |
30 | `monospaced`
31 | If set to true, monospace font will be used (default: ``true``).
32 |
33 | `linenos`
34 | If set to true, print the line numbers (default: ``false``).
35 |
36 | `wrap`
37 | Wrap lines to the specified number of characters. Disabled if set to 0
38 | (default: ``0``).
39 | """
40 |
41 | name = 'groff'
42 | aliases = ['groff','troff','roff']
43 | filenames = []
44 |
45 | def __init__(self, **options):
46 | Formatter.__init__(self, **options)
47 |
48 | self.monospaced = get_bool_opt(options, 'monospaced', True)
49 | self.linenos = get_bool_opt(options, 'linenos', False)
50 | self._lineno = 0
51 | self.wrap = get_int_opt(options, 'wrap', 0)
52 | self._linelen = 0
53 |
54 | self.styles = {}
55 | self._make_styles()
56 |
57 |
58 | def _make_styles(self):
59 | regular = '\\f[CR]' if self.monospaced else '\\f[R]'
60 | bold = '\\f[CB]' if self.monospaced else '\\f[B]'
61 | italic = '\\f[CI]' if self.monospaced else '\\f[I]'
62 |
63 | for ttype, ndef in self.style:
64 | start = end = ''
65 | if ndef['color']:
66 | start += '\\m[{}]'.format(ndef['color'])
67 | end = '\\m[]' + end
68 | if ndef['bold']:
69 | start += bold
70 | end = regular + end
71 | if ndef['italic']:
72 | start += italic
73 | end = regular + end
74 | if ndef['bgcolor']:
75 | start += '\\M[{}]'.format(ndef['bgcolor'])
76 | end = '\\M[]' + end
77 |
78 | self.styles[ttype] = start, end
79 |
80 |
81 | def _define_colors(self, outfile):
82 | colors = set()
83 | for _, ndef in self.style:
84 | if ndef['color'] is not None:
85 | colors.add(ndef['color'])
86 |
87 | for color in sorted(colors):
88 | outfile.write('.defcolor ' + color + ' rgb #' + color + '\n')
89 |
90 |
91 | def _write_lineno(self, outfile):
92 | self._lineno += 1
93 | outfile.write("%s% 4d " % (self._lineno != 1 and '\n' or '', self._lineno))
94 |
95 |
96 | def _wrap_line(self, line):
97 | length = len(line.rstrip('\n'))
98 | space = ' ' if self.linenos else ''
99 | newline = ''
100 |
101 | if length > self.wrap:
102 | for i in range(0, math.floor(length / self.wrap)):
103 | chunk = line[i*self.wrap:i*self.wrap+self.wrap]
104 | newline += (chunk + '\n' + space)
105 | remainder = length % self.wrap
106 | if remainder > 0:
107 | newline += line[-remainder-1:]
108 | self._linelen = remainder
109 | elif self._linelen + length > self.wrap:
110 | newline = ('\n' + space) + line
111 | self._linelen = length
112 | else:
113 | newline = line
114 | self._linelen += length
115 |
116 | return newline
117 |
118 |
119 | def _escape_chars(self, text):
120 | text = text.replace('\\', '\\[u005C]'). \
121 | replace('.', '\\[char46]'). \
122 | replace('\'', '\\[u0027]'). \
123 | replace('`', '\\[u0060]'). \
124 | replace('~', '\\[u007E]')
125 | copy = text
126 |
127 | for char in copy:
128 | if len(char) != len(char.encode()):
129 | uni = char.encode('unicode_escape') \
130 | .decode()[1:] \
131 | .replace('x', 'u00') \
132 | .upper()
133 | text = text.replace(char, '\\[u' + uni[1:] + ']')
134 |
135 | return text
136 |
137 |
138 | def format_unencoded(self, tokensource, outfile):
139 | self._define_colors(outfile)
140 |
141 | outfile.write('.nf\n\\f[CR]\n')
142 |
143 | if self.linenos:
144 | self._write_lineno(outfile)
145 |
146 | for ttype, value in tokensource:
147 | while ttype not in self.styles:
148 | ttype = ttype.parent
149 | start, end = self.styles[ttype]
150 |
151 | for line in value.splitlines(True):
152 | if self.wrap > 0:
153 | line = self._wrap_line(line)
154 |
155 | if start and end:
156 | text = self._escape_chars(line.rstrip('\n'))
157 | if text != '':
158 | outfile.write(''.join((start, text, end)))
159 | else:
160 | outfile.write(self._escape_chars(line.rstrip('\n')))
161 |
162 | if line.endswith('\n'):
163 | if self.linenos:
164 | self._write_lineno(outfile)
165 | self._linelen = 0
166 | else:
167 | outfile.write('\n')
168 | self._linelen = 0
169 |
170 | outfile.write('\n.fi')
171 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/bs4/tests/test_builder_registry.py:
--------------------------------------------------------------------------------
```python
1 | """Tests of the builder registry."""
2 |
3 | import pytest
4 | import warnings
5 |
6 | from bs4 import BeautifulSoup
7 | from bs4.builder import (
8 | builder_registry as registry,
9 | HTMLParserTreeBuilder,
10 | TreeBuilderRegistry,
11 | )
12 |
13 | from . import (
14 | HTML5LIB_PRESENT,
15 | LXML_PRESENT,
16 | )
17 |
18 | if HTML5LIB_PRESENT:
19 | from bs4.builder import HTML5TreeBuilder
20 |
21 | if LXML_PRESENT:
22 | from bs4.builder import (
23 | LXMLTreeBuilderForXML,
24 | LXMLTreeBuilder,
25 | )
26 |
27 |
28 | # TODO: Split out the lxml and html5lib tests into their own classes
29 | # and gate with pytest.mark.skipIf.
30 | class TestBuiltInRegistry(object):
31 | """Test the built-in registry with the default builders registered."""
32 |
33 | def test_combination(self):
34 | assert registry.lookup('strict', 'html') == HTMLParserTreeBuilder
35 | if LXML_PRESENT:
36 | assert registry.lookup('fast', 'html') == LXMLTreeBuilder
37 | assert registry.lookup('permissive', 'xml') == LXMLTreeBuilderForXML
38 | if HTML5LIB_PRESENT:
39 | assert registry.lookup('html5lib', 'html') == HTML5TreeBuilder
40 |
41 | def test_lookup_by_markup_type(self):
42 | if LXML_PRESENT:
43 | assert registry.lookup('html') == LXMLTreeBuilder
44 | assert registry.lookup('xml') == LXMLTreeBuilderForXML
45 | else:
46 | assert registry.lookup('xml') == None
47 | if HTML5LIB_PRESENT:
48 | assert registry.lookup('html') == HTML5TreeBuilder
49 | else:
50 | assert registry.lookup('html') == HTMLParserTreeBuilder
51 |
52 | def test_named_library(self):
53 | if LXML_PRESENT:
54 | assert registry.lookup('lxml', 'xml') == LXMLTreeBuilderForXML
55 | assert registry.lookup('lxml', 'html') == LXMLTreeBuilder
56 | if HTML5LIB_PRESENT:
57 | assert registry.lookup('html5lib') == HTML5TreeBuilder
58 |
59 | assert registry.lookup('html.parser') == HTMLParserTreeBuilder
60 |
61 | def test_beautifulsoup_constructor_does_lookup(self):
62 |
63 | with warnings.catch_warnings(record=True) as w:
64 | # This will create a warning about not explicitly
65 | # specifying a parser, but we'll ignore it.
66 |
67 | # You can pass in a string.
68 | BeautifulSoup("", features="html")
69 | # Or a list of strings.
70 | BeautifulSoup("", features=["html", "fast"])
71 | pass
72 |
73 | # You'll get an exception if BS can't find an appropriate
74 | # builder.
75 | with pytest.raises(ValueError):
76 | BeautifulSoup("", features="no-such-feature")
77 |
78 | class TestRegistry(object):
79 | """Test the TreeBuilderRegistry class in general."""
80 |
81 | def setup_method(self):
82 | self.registry = TreeBuilderRegistry()
83 |
84 | def builder_for_features(self, *feature_list):
85 | cls = type('Builder_' + '_'.join(feature_list),
86 | (object,), {'features' : feature_list})
87 |
88 | self.registry.register(cls)
89 | return cls
90 |
91 | def test_register_with_no_features(self):
92 | builder = self.builder_for_features()
93 |
94 | # Since the builder advertises no features, you can't find it
95 | # by looking up features.
96 | assert self.registry.lookup('foo') is None
97 |
98 | # But you can find it by doing a lookup with no features, if
99 | # this happens to be the only registered builder.
100 | assert self.registry.lookup() == builder
101 |
102 | def test_register_with_features_makes_lookup_succeed(self):
103 | builder = self.builder_for_features('foo', 'bar')
104 | assert self.registry.lookup('foo') is builder
105 | assert self.registry.lookup('bar') is builder
106 |
107 | def test_lookup_fails_when_no_builder_implements_feature(self):
108 | builder = self.builder_for_features('foo', 'bar')
109 | assert self.registry.lookup('baz') is None
110 |
111 | def test_lookup_gets_most_recent_registration_when_no_feature_specified(self):
112 | builder1 = self.builder_for_features('foo')
113 | builder2 = self.builder_for_features('bar')
114 | assert self.registry.lookup() == builder2
115 |
116 | def test_lookup_fails_when_no_tree_builders_registered(self):
117 | assert self.registry.lookup() is None
118 |
119 | def test_lookup_gets_most_recent_builder_supporting_all_features(self):
120 | has_one = self.builder_for_features('foo')
121 | has_the_other = self.builder_for_features('bar')
122 | has_both_early = self.builder_for_features('foo', 'bar', 'baz')
123 | has_both_late = self.builder_for_features('foo', 'bar', 'quux')
124 | lacks_one = self.builder_for_features('bar')
125 | has_the_other = self.builder_for_features('foo')
126 |
127 | # There are two builders featuring 'foo' and 'bar', but
128 | # the one that also features 'quux' was registered later.
129 | assert self.registry.lookup('foo', 'bar') == has_both_late
130 |
131 | # There is only one builder featuring 'foo', 'bar', and 'baz'.
132 | assert self.registry.lookup('foo', 'bar', 'baz') == has_both_early
133 |
134 | def test_lookup_fails_when_cannot_reconcile_requested_features(self):
135 | builder1 = self.builder_for_features('foo', 'bar')
136 | builder2 = self.builder_for_features('foo', 'baz')
137 | assert self.registry.lookup('bar', 'baz') is None
138 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py:
--------------------------------------------------------------------------------
```python
1 | import contextlib
2 | import itertools
3 | import logging
4 | import sys
5 | import time
6 | from typing import IO, Generator, Optional
7 |
8 | from pip._internal.utils.compat import WINDOWS
9 | from pip._internal.utils.logging import get_indentation
10 |
11 | logger = logging.getLogger(__name__)
12 |
13 |
14 | class SpinnerInterface:
15 | def spin(self) -> None:
16 | raise NotImplementedError()
17 |
18 | def finish(self, final_status: str) -> None:
19 | raise NotImplementedError()
20 |
21 |
22 | class InteractiveSpinner(SpinnerInterface):
23 | def __init__(
24 | self,
25 | message: str,
26 | file: Optional[IO[str]] = None,
27 | spin_chars: str = "-\\|/",
28 | # Empirically, 8 updates/second looks nice
29 | min_update_interval_seconds: float = 0.125,
30 | ):
31 | self._message = message
32 | if file is None:
33 | file = sys.stdout
34 | self._file = file
35 | self._rate_limiter = RateLimiter(min_update_interval_seconds)
36 | self._finished = False
37 |
38 | self._spin_cycle = itertools.cycle(spin_chars)
39 |
40 | self._file.write(" " * get_indentation() + self._message + " ... ")
41 | self._width = 0
42 |
43 | def _write(self, status: str) -> None:
44 | assert not self._finished
45 | # Erase what we wrote before by backspacing to the beginning, writing
46 | # spaces to overwrite the old text, and then backspacing again
47 | backup = "\b" * self._width
48 | self._file.write(backup + " " * self._width + backup)
49 | # Now we have a blank slate to add our status
50 | self._file.write(status)
51 | self._width = len(status)
52 | self._file.flush()
53 | self._rate_limiter.reset()
54 |
55 | def spin(self) -> None:
56 | if self._finished:
57 | return
58 | if not self._rate_limiter.ready():
59 | return
60 | self._write(next(self._spin_cycle))
61 |
62 | def finish(self, final_status: str) -> None:
63 | if self._finished:
64 | return
65 | self._write(final_status)
66 | self._file.write("\n")
67 | self._file.flush()
68 | self._finished = True
69 |
70 |
71 | # Used for dumb terminals, non-interactive installs (no tty), etc.
72 | # We still print updates occasionally (once every 60 seconds by default) to
73 | # act as a keep-alive for systems like Travis-CI that take lack-of-output as
74 | # an indication that a task has frozen.
75 | class NonInteractiveSpinner(SpinnerInterface):
76 | def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None:
77 | self._message = message
78 | self._finished = False
79 | self._rate_limiter = RateLimiter(min_update_interval_seconds)
80 | self._update("started")
81 |
82 | def _update(self, status: str) -> None:
83 | assert not self._finished
84 | self._rate_limiter.reset()
85 | logger.info("%s: %s", self._message, status)
86 |
87 | def spin(self) -> None:
88 | if self._finished:
89 | return
90 | if not self._rate_limiter.ready():
91 | return
92 | self._update("still running...")
93 |
94 | def finish(self, final_status: str) -> None:
95 | if self._finished:
96 | return
97 | self._update(f"finished with status '{final_status}'")
98 | self._finished = True
99 |
100 |
101 | class RateLimiter:
102 | def __init__(self, min_update_interval_seconds: float) -> None:
103 | self._min_update_interval_seconds = min_update_interval_seconds
104 | self._last_update: float = 0
105 |
106 | def ready(self) -> bool:
107 | now = time.time()
108 | delta = now - self._last_update
109 | return delta >= self._min_update_interval_seconds
110 |
111 | def reset(self) -> None:
112 | self._last_update = time.time()
113 |
114 |
115 | @contextlib.contextmanager
116 | def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]:
117 | # Interactive spinner goes directly to sys.stdout rather than being routed
118 | # through the logging system, but it acts like it has level INFO,
119 | # i.e. it's only displayed if we're at level INFO or better.
120 | # Non-interactive spinner goes through the logging system, so it is always
121 | # in sync with logging configuration.
122 | if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO:
123 | spinner: SpinnerInterface = InteractiveSpinner(message)
124 | else:
125 | spinner = NonInteractiveSpinner(message)
126 | try:
127 | with hidden_cursor(sys.stdout):
128 | yield spinner
129 | except KeyboardInterrupt:
130 | spinner.finish("canceled")
131 | raise
132 | except Exception:
133 | spinner.finish("error")
134 | raise
135 | else:
136 | spinner.finish("done")
137 |
138 |
139 | HIDE_CURSOR = "\x1b[?25l"
140 | SHOW_CURSOR = "\x1b[?25h"
141 |
142 |
143 | @contextlib.contextmanager
144 | def hidden_cursor(file: IO[str]) -> Generator[None, None, None]:
145 | # The Windows terminal does not support the hide/show cursor ANSI codes,
146 | # even via colorama. So don't even try.
147 | if WINDOWS:
148 | yield
149 | # We don't want to clutter the output with control characters if we're
150 | # writing to a file, or if the user is running with --quiet.
151 | # See https://github.com/pypa/pip/issues/3418
152 | elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
153 | yield
154 | else:
155 | file.write(HIDE_CURSOR)
156 | try:
157 | yield
158 | finally:
159 | file.write(SHOW_CURSOR)
160 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/xmlregexp.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: regular expressions handling
3 | * Description: basic API for libxml regular expressions handling used
4 | * for XML Schemas and validation.
5 | *
6 | * Copy: See Copyright for the status of this software.
7 | *
8 | * Author: Daniel Veillard
9 | */
10 |
11 | #ifndef __XML_REGEXP_H__
12 | #define __XML_REGEXP_H__
13 |
14 | #include <stdio.h>
15 | #include <libxml/xmlversion.h>
16 | #include <libxml/xmlstring.h>
17 |
18 | #ifdef LIBXML_REGEXP_ENABLED
19 |
20 | #ifdef __cplusplus
21 | extern "C" {
22 | #endif
23 |
24 | /**
25 | * xmlRegexpPtr:
26 | *
27 | * A libxml regular expression, they can actually be far more complex
28 | * thank the POSIX regex expressions.
29 | */
30 | typedef struct _xmlRegexp xmlRegexp;
31 | typedef xmlRegexp *xmlRegexpPtr;
32 |
33 | /**
34 | * xmlRegExecCtxtPtr:
35 | *
36 | * A libxml progressive regular expression evaluation context
37 | */
38 | typedef struct _xmlRegExecCtxt xmlRegExecCtxt;
39 | typedef xmlRegExecCtxt *xmlRegExecCtxtPtr;
40 |
41 | /*
42 | * The POSIX like API
43 | */
44 | XMLPUBFUN xmlRegexpPtr
45 | xmlRegexpCompile (const xmlChar *regexp);
46 | XMLPUBFUN void xmlRegFreeRegexp(xmlRegexpPtr regexp);
47 | XMLPUBFUN int
48 | xmlRegexpExec (xmlRegexpPtr comp,
49 | const xmlChar *value);
50 | XMLPUBFUN void
51 | xmlRegexpPrint (FILE *output,
52 | xmlRegexpPtr regexp);
53 | XMLPUBFUN int
54 | xmlRegexpIsDeterminist(xmlRegexpPtr comp);
55 |
56 | /**
57 | * xmlRegExecCallbacks:
58 | * @exec: the regular expression context
59 | * @token: the current token string
60 | * @transdata: transition data
61 | * @inputdata: input data
62 | *
63 | * Callback function when doing a transition in the automata
64 | */
65 | typedef void (*xmlRegExecCallbacks) (xmlRegExecCtxtPtr exec,
66 | const xmlChar *token,
67 | void *transdata,
68 | void *inputdata);
69 |
70 | /*
71 | * The progressive API
72 | */
73 | XMLPUBFUN xmlRegExecCtxtPtr
74 | xmlRegNewExecCtxt (xmlRegexpPtr comp,
75 | xmlRegExecCallbacks callback,
76 | void *data);
77 | XMLPUBFUN void
78 | xmlRegFreeExecCtxt (xmlRegExecCtxtPtr exec);
79 | XMLPUBFUN int
80 | xmlRegExecPushString(xmlRegExecCtxtPtr exec,
81 | const xmlChar *value,
82 | void *data);
83 | XMLPUBFUN int
84 | xmlRegExecPushString2(xmlRegExecCtxtPtr exec,
85 | const xmlChar *value,
86 | const xmlChar *value2,
87 | void *data);
88 |
89 | XMLPUBFUN int
90 | xmlRegExecNextValues(xmlRegExecCtxtPtr exec,
91 | int *nbval,
92 | int *nbneg,
93 | xmlChar **values,
94 | int *terminal);
95 | XMLPUBFUN int
96 | xmlRegExecErrInfo (xmlRegExecCtxtPtr exec,
97 | const xmlChar **string,
98 | int *nbval,
99 | int *nbneg,
100 | xmlChar **values,
101 | int *terminal);
102 | #ifdef LIBXML_EXPR_ENABLED
103 | /*
104 | * Formal regular expression handling
105 | * Its goal is to do some formal work on content models
106 | */
107 |
108 | /* expressions are used within a context */
109 | typedef struct _xmlExpCtxt xmlExpCtxt;
110 | typedef xmlExpCtxt *xmlExpCtxtPtr;
111 |
112 | XMLPUBFUN void
113 | xmlExpFreeCtxt (xmlExpCtxtPtr ctxt);
114 | XMLPUBFUN xmlExpCtxtPtr
115 | xmlExpNewCtxt (int maxNodes,
116 | xmlDictPtr dict);
117 |
118 | XMLPUBFUN int
119 | xmlExpCtxtNbNodes(xmlExpCtxtPtr ctxt);
120 | XMLPUBFUN int
121 | xmlExpCtxtNbCons(xmlExpCtxtPtr ctxt);
122 |
123 | /* Expressions are trees but the tree is opaque */
124 | typedef struct _xmlExpNode xmlExpNode;
125 | typedef xmlExpNode *xmlExpNodePtr;
126 |
127 | typedef enum {
128 | XML_EXP_EMPTY = 0,
129 | XML_EXP_FORBID = 1,
130 | XML_EXP_ATOM = 2,
131 | XML_EXP_SEQ = 3,
132 | XML_EXP_OR = 4,
133 | XML_EXP_COUNT = 5
134 | } xmlExpNodeType;
135 |
136 | /*
137 | * 2 core expressions shared by all for the empty language set
138 | * and for the set with just the empty token
139 | */
140 | XMLPUBVAR xmlExpNodePtr forbiddenExp;
141 | XMLPUBVAR xmlExpNodePtr emptyExp;
142 |
143 | /*
144 | * Expressions are reference counted internally
145 | */
146 | XMLPUBFUN void
147 | xmlExpFree (xmlExpCtxtPtr ctxt,
148 | xmlExpNodePtr expr);
149 | XMLPUBFUN void
150 | xmlExpRef (xmlExpNodePtr expr);
151 |
152 | /*
153 | * constructors can be either manual or from a string
154 | */
155 | XMLPUBFUN xmlExpNodePtr
156 | xmlExpParse (xmlExpCtxtPtr ctxt,
157 | const char *expr);
158 | XMLPUBFUN xmlExpNodePtr
159 | xmlExpNewAtom (xmlExpCtxtPtr ctxt,
160 | const xmlChar *name,
161 | int len);
162 | XMLPUBFUN xmlExpNodePtr
163 | xmlExpNewOr (xmlExpCtxtPtr ctxt,
164 | xmlExpNodePtr left,
165 | xmlExpNodePtr right);
166 | XMLPUBFUN xmlExpNodePtr
167 | xmlExpNewSeq (xmlExpCtxtPtr ctxt,
168 | xmlExpNodePtr left,
169 | xmlExpNodePtr right);
170 | XMLPUBFUN xmlExpNodePtr
171 | xmlExpNewRange (xmlExpCtxtPtr ctxt,
172 | xmlExpNodePtr subset,
173 | int min,
174 | int max);
175 | /*
176 | * The really interesting APIs
177 | */
178 | XMLPUBFUN int
179 | xmlExpIsNillable(xmlExpNodePtr expr);
180 | XMLPUBFUN int
181 | xmlExpMaxToken (xmlExpNodePtr expr);
182 | XMLPUBFUN int
183 | xmlExpGetLanguage(xmlExpCtxtPtr ctxt,
184 | xmlExpNodePtr expr,
185 | const xmlChar**langList,
186 | int len);
187 | XMLPUBFUN int
188 | xmlExpGetStart (xmlExpCtxtPtr ctxt,
189 | xmlExpNodePtr expr,
190 | const xmlChar**tokList,
191 | int len);
192 | XMLPUBFUN xmlExpNodePtr
193 | xmlExpStringDerive(xmlExpCtxtPtr ctxt,
194 | xmlExpNodePtr expr,
195 | const xmlChar *str,
196 | int len);
197 | XMLPUBFUN xmlExpNodePtr
198 | xmlExpExpDerive (xmlExpCtxtPtr ctxt,
199 | xmlExpNodePtr expr,
200 | xmlExpNodePtr sub);
201 | XMLPUBFUN int
202 | xmlExpSubsume (xmlExpCtxtPtr ctxt,
203 | xmlExpNodePtr expr,
204 | xmlExpNodePtr sub);
205 | XMLPUBFUN void
206 | xmlExpDump (xmlBufferPtr buf,
207 | xmlExpNodePtr expr);
208 | #endif /* LIBXML_EXPR_ENABLED */
209 | #ifdef __cplusplus
210 | }
211 | #endif
212 |
213 | #endif /* LIBXML_REGEXP_ENABLED */
214 |
215 | #endif /*__XML_REGEXP_H__ */
216 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py:
--------------------------------------------------------------------------------
```python
1 | # SPDX-FileCopyrightText: 2015 Eric Larson
2 | #
3 | # SPDX-License-Identifier: Apache-2.0
4 | from __future__ import annotations
5 |
6 | import io
7 | from typing import IO, TYPE_CHECKING, Any, Mapping, cast
8 |
9 | from pip._vendor import msgpack
10 | from pip._vendor.requests.structures import CaseInsensitiveDict
11 | from pip._vendor.urllib3 import HTTPResponse
12 |
13 | if TYPE_CHECKING:
14 | from pip._vendor.requests import PreparedRequest
15 |
16 |
17 | class Serializer:
18 | serde_version = "4"
19 |
20 | def dumps(
21 | self,
22 | request: PreparedRequest,
23 | response: HTTPResponse,
24 | body: bytes | None = None,
25 | ) -> bytes:
26 | response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(
27 | response.headers
28 | )
29 |
30 | if body is None:
31 | # When a body isn't passed in, we'll read the response. We
32 | # also update the response with a new file handler to be
33 | # sure it acts as though it was never read.
34 | body = response.read(decode_content=False)
35 | response._fp = io.BytesIO(body) # type: ignore[assignment]
36 | response.length_remaining = len(body)
37 |
38 | data = {
39 | "response": {
40 | "body": body, # Empty bytestring if body is stored separately
41 | "headers": {str(k): str(v) for k, v in response.headers.items()},
42 | "status": response.status,
43 | "version": response.version,
44 | "reason": str(response.reason),
45 | "decode_content": response.decode_content,
46 | }
47 | }
48 |
49 | # Construct our vary headers
50 | data["vary"] = {}
51 | if "vary" in response_headers:
52 | varied_headers = response_headers["vary"].split(",")
53 | for header in varied_headers:
54 | header = str(header).strip()
55 | header_value = request.headers.get(header, None)
56 | if header_value is not None:
57 | header_value = str(header_value)
58 | data["vary"][header] = header_value
59 |
60 | return b",".join([f"cc={self.serde_version}".encode(), self.serialize(data)])
61 |
62 | def serialize(self, data: dict[str, Any]) -> bytes:
63 | return cast(bytes, msgpack.dumps(data, use_bin_type=True))
64 |
65 | def loads(
66 | self,
67 | request: PreparedRequest,
68 | data: bytes,
69 | body_file: IO[bytes] | None = None,
70 | ) -> HTTPResponse | None:
71 | # Short circuit if we've been given an empty set of data
72 | if not data:
73 | return None
74 |
75 | # Previous versions of this library supported other serialization
76 | # formats, but these have all been removed.
77 | if not data.startswith(f"cc={self.serde_version},".encode()):
78 | return None
79 |
80 | data = data[5:]
81 | return self._loads_v4(request, data, body_file)
82 |
83 | def prepare_response(
84 | self,
85 | request: PreparedRequest,
86 | cached: Mapping[str, Any],
87 | body_file: IO[bytes] | None = None,
88 | ) -> HTTPResponse | None:
89 | """Verify our vary headers match and construct a real urllib3
90 | HTTPResponse object.
91 | """
92 | # Special case the '*' Vary value as it means we cannot actually
93 | # determine if the cached response is suitable for this request.
94 | # This case is also handled in the controller code when creating
95 | # a cache entry, but is left here for backwards compatibility.
96 | if "*" in cached.get("vary", {}):
97 | return None
98 |
99 | # Ensure that the Vary headers for the cached response match our
100 | # request
101 | for header, value in cached.get("vary", {}).items():
102 | if request.headers.get(header, None) != value:
103 | return None
104 |
105 | body_raw = cached["response"].pop("body")
106 |
107 | headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(
108 | data=cached["response"]["headers"]
109 | )
110 | if headers.get("transfer-encoding", "") == "chunked":
111 | headers.pop("transfer-encoding")
112 |
113 | cached["response"]["headers"] = headers
114 |
115 | try:
116 | body: IO[bytes]
117 | if body_file is None:
118 | body = io.BytesIO(body_raw)
119 | else:
120 | body = body_file
121 | except TypeError:
122 | # This can happen if cachecontrol serialized to v1 format (pickle)
123 | # using Python 2. A Python 2 str(byte string) will be unpickled as
124 | # a Python 3 str (unicode string), which will cause the above to
125 | # fail with:
126 | #
127 | # TypeError: 'str' does not support the buffer interface
128 | body = io.BytesIO(body_raw.encode("utf8"))
129 |
130 | # Discard any `strict` parameter serialized by older version of cachecontrol.
131 | cached["response"].pop("strict", None)
132 |
133 | return HTTPResponse(body=body, preload_content=False, **cached["response"])
134 |
135 | def _loads_v4(
136 | self,
137 | request: PreparedRequest,
138 | data: bytes,
139 | body_file: IO[bytes] | None = None,
140 | ) -> HTTPResponse | None:
141 | try:
142 | cached = msgpack.loads(data, raw=False)
143 | except ValueError:
144 | return None
145 |
146 | return self.prepare_response(request, cached, body_file)
147 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py:
--------------------------------------------------------------------------------
```python
1 | import configparser
2 | import logging
3 | import os
4 | from typing import List, Optional, Tuple
5 |
6 | from pip._internal.exceptions import BadCommand, InstallationError
7 | from pip._internal.utils.misc import HiddenText, display_path
8 | from pip._internal.utils.subprocess import make_command
9 | from pip._internal.utils.urls import path_to_url
10 | from pip._internal.vcs.versioncontrol import (
11 | RevOptions,
12 | VersionControl,
13 | find_path_to_project_root_from_repo_root,
14 | vcs,
15 | )
16 |
17 | logger = logging.getLogger(__name__)
18 |
19 |
20 | class Mercurial(VersionControl):
21 | name = "hg"
22 | dirname = ".hg"
23 | repo_name = "clone"
24 | schemes = (
25 | "hg+file",
26 | "hg+http",
27 | "hg+https",
28 | "hg+ssh",
29 | "hg+static-http",
30 | )
31 |
32 | @staticmethod
33 | def get_base_rev_args(rev: str) -> List[str]:
34 | return [f"--rev={rev}"]
35 |
36 | def fetch_new(
37 | self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int
38 | ) -> None:
39 | rev_display = rev_options.to_display()
40 | logger.info(
41 | "Cloning hg %s%s to %s",
42 | url,
43 | rev_display,
44 | display_path(dest),
45 | )
46 | if verbosity <= 0:
47 | flags: Tuple[str, ...] = ("--quiet",)
48 | elif verbosity == 1:
49 | flags = ()
50 | elif verbosity == 2:
51 | flags = ("--verbose",)
52 | else:
53 | flags = ("--verbose", "--debug")
54 | self.run_command(make_command("clone", "--noupdate", *flags, url, dest))
55 | self.run_command(
56 | make_command("update", *flags, rev_options.to_args()),
57 | cwd=dest,
58 | )
59 |
60 | def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
61 | repo_config = os.path.join(dest, self.dirname, "hgrc")
62 | config = configparser.RawConfigParser()
63 | try:
64 | config.read(repo_config)
65 | config.set("paths", "default", url.secret)
66 | with open(repo_config, "w") as config_file:
67 | config.write(config_file)
68 | except (OSError, configparser.NoSectionError) as exc:
69 | logger.warning("Could not switch Mercurial repository to %s: %s", url, exc)
70 | else:
71 | cmd_args = make_command("update", "-q", rev_options.to_args())
72 | self.run_command(cmd_args, cwd=dest)
73 |
74 | def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
75 | self.run_command(["pull", "-q"], cwd=dest)
76 | cmd_args = make_command("update", "-q", rev_options.to_args())
77 | self.run_command(cmd_args, cwd=dest)
78 |
79 | @classmethod
80 | def get_remote_url(cls, location: str) -> str:
81 | url = cls.run_command(
82 | ["showconfig", "paths.default"],
83 | show_stdout=False,
84 | stdout_only=True,
85 | cwd=location,
86 | ).strip()
87 | if cls._is_local_repository(url):
88 | url = path_to_url(url)
89 | return url.strip()
90 |
91 | @classmethod
92 | def get_revision(cls, location: str) -> str:
93 | """
94 | Return the repository-local changeset revision number, as an integer.
95 | """
96 | current_revision = cls.run_command(
97 | ["parents", "--template={rev}"],
98 | show_stdout=False,
99 | stdout_only=True,
100 | cwd=location,
101 | ).strip()
102 | return current_revision
103 |
104 | @classmethod
105 | def get_requirement_revision(cls, location: str) -> str:
106 | """
107 | Return the changeset identification hash, as a 40-character
108 | hexadecimal string
109 | """
110 | current_rev_hash = cls.run_command(
111 | ["parents", "--template={node}"],
112 | show_stdout=False,
113 | stdout_only=True,
114 | cwd=location,
115 | ).strip()
116 | return current_rev_hash
117 |
118 | @classmethod
119 | def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
120 | """Always assume the versions don't match"""
121 | return False
122 |
123 | @classmethod
124 | def get_subdirectory(cls, location: str) -> Optional[str]:
125 | """
126 | Return the path to Python project root, relative to the repo root.
127 | Return None if the project root is in the repo root.
128 | """
129 | # find the repo root
130 | repo_root = cls.run_command(
131 | ["root"], show_stdout=False, stdout_only=True, cwd=location
132 | ).strip()
133 | if not os.path.isabs(repo_root):
134 | repo_root = os.path.abspath(os.path.join(location, repo_root))
135 | return find_path_to_project_root_from_repo_root(location, repo_root)
136 |
137 | @classmethod
138 | def get_repository_root(cls, location: str) -> Optional[str]:
139 | loc = super().get_repository_root(location)
140 | if loc:
141 | return loc
142 | try:
143 | r = cls.run_command(
144 | ["root"],
145 | cwd=location,
146 | show_stdout=False,
147 | stdout_only=True,
148 | on_returncode="raise",
149 | log_failed_cmd=False,
150 | )
151 | except BadCommand:
152 | logger.debug(
153 | "could not determine if %s is under hg control "
154 | "because hg is not available",
155 | location,
156 | )
157 | return None
158 | except InstallationError:
159 | return None
160 | return os.path.normpath(r.rstrip("\r\n"))
161 |
162 |
163 | vcs.register(Mercurial)
164 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py:
--------------------------------------------------------------------------------
```python
1 | # -*- coding: utf-8 -*-
2 | #
3 | # Copyright (C) 2012-2023 Vinay Sajip.
4 | # Licensed to the Python Software Foundation under a contributor agreement.
5 | # See LICENSE.txt and CONTRIBUTORS.txt.
6 | #
7 | """
8 | Parser for the environment markers micro-language defined in PEP 508.
9 | """
10 |
11 | # Note: In PEP 345, the micro-language was Python compatible, so the ast
12 | # module could be used to parse it. However, PEP 508 introduced operators such
13 | # as ~= and === which aren't in Python, necessitating a different approach.
14 |
15 | import os
16 | import re
17 | import sys
18 | import platform
19 |
20 | from .compat import string_types
21 | from .util import in_venv, parse_marker
22 | from .version import LegacyVersion as LV
23 |
24 | __all__ = ['interpret']
25 |
26 | _VERSION_PATTERN = re.compile(
27 | r'((\d+(\.\d+)*\w*)|\'(\d+(\.\d+)*\w*)\'|\"(\d+(\.\d+)*\w*)\")')
28 | _VERSION_MARKERS = {'python_version', 'python_full_version'}
29 |
30 |
31 | def _is_version_marker(s):
32 | return isinstance(s, string_types) and s in _VERSION_MARKERS
33 |
34 |
35 | def _is_literal(o):
36 | if not isinstance(o, string_types) or not o:
37 | return False
38 | return o[0] in '\'"'
39 |
40 |
41 | def _get_versions(s):
42 | return {LV(m.groups()[0]) for m in _VERSION_PATTERN.finditer(s)}
43 |
44 |
45 | class Evaluator(object):
46 | """
47 | This class is used to evaluate marker expressions.
48 | """
49 |
50 | operations = {
51 | '==': lambda x, y: x == y,
52 | '===': lambda x, y: x == y,
53 | '~=': lambda x, y: x == y or x > y,
54 | '!=': lambda x, y: x != y,
55 | '<': lambda x, y: x < y,
56 | '<=': lambda x, y: x == y or x < y,
57 | '>': lambda x, y: x > y,
58 | '>=': lambda x, y: x == y or x > y,
59 | 'and': lambda x, y: x and y,
60 | 'or': lambda x, y: x or y,
61 | 'in': lambda x, y: x in y,
62 | 'not in': lambda x, y: x not in y,
63 | }
64 |
65 | def evaluate(self, expr, context):
66 | """
67 | Evaluate a marker expression returned by the :func:`parse_requirement`
68 | function in the specified context.
69 | """
70 | if isinstance(expr, string_types):
71 | if expr[0] in '\'"':
72 | result = expr[1:-1]
73 | else:
74 | if expr not in context:
75 | raise SyntaxError('unknown variable: %s' % expr)
76 | result = context[expr]
77 | else:
78 | assert isinstance(expr, dict)
79 | op = expr['op']
80 | if op not in self.operations:
81 | raise NotImplementedError('op not implemented: %s' % op)
82 | elhs = expr['lhs']
83 | erhs = expr['rhs']
84 | if _is_literal(expr['lhs']) and _is_literal(expr['rhs']):
85 | raise SyntaxError('invalid comparison: %s %s %s' %
86 | (elhs, op, erhs))
87 |
88 | lhs = self.evaluate(elhs, context)
89 | rhs = self.evaluate(erhs, context)
90 | if ((_is_version_marker(elhs) or _is_version_marker(erhs))
91 | and op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')):
92 | lhs = LV(lhs)
93 | rhs = LV(rhs)
94 | elif _is_version_marker(elhs) and op in ('in', 'not in'):
95 | lhs = LV(lhs)
96 | rhs = _get_versions(rhs)
97 | result = self.operations[op](lhs, rhs)
98 | return result
99 |
100 |
101 | _DIGITS = re.compile(r'\d+\.\d+')
102 |
103 |
104 | def default_context():
105 |
106 | def format_full_version(info):
107 | version = '%s.%s.%s' % (info.major, info.minor, info.micro)
108 | kind = info.releaselevel
109 | if kind != 'final':
110 | version += kind[0] + str(info.serial)
111 | return version
112 |
113 | if hasattr(sys, 'implementation'):
114 | implementation_version = format_full_version(
115 | sys.implementation.version)
116 | implementation_name = sys.implementation.name
117 | else:
118 | implementation_version = '0'
119 | implementation_name = ''
120 |
121 | ppv = platform.python_version()
122 | m = _DIGITS.match(ppv)
123 | pv = m.group(0)
124 | result = {
125 | 'implementation_name': implementation_name,
126 | 'implementation_version': implementation_version,
127 | 'os_name': os.name,
128 | 'platform_machine': platform.machine(),
129 | 'platform_python_implementation': platform.python_implementation(),
130 | 'platform_release': platform.release(),
131 | 'platform_system': platform.system(),
132 | 'platform_version': platform.version(),
133 | 'platform_in_venv': str(in_venv()),
134 | 'python_full_version': ppv,
135 | 'python_version': pv,
136 | 'sys_platform': sys.platform,
137 | }
138 | return result
139 |
140 |
141 | DEFAULT_CONTEXT = default_context()
142 | del default_context
143 |
144 | evaluator = Evaluator()
145 |
146 |
147 | def interpret(marker, execution_context=None):
148 | """
149 | Interpret a marker and return a result depending on environment.
150 |
151 | :param marker: The marker to interpret.
152 | :type marker: str
153 | :param execution_context: The context used for name lookup.
154 | :type execution_context: mapping
155 | """
156 | try:
157 | expr, rest = parse_marker(marker)
158 | except Exception as e:
159 | raise SyntaxError('Unable to interpret marker syntax: %s: %s' %
160 | (marker, e))
161 | if rest and rest[0] != '#':
162 | raise SyntaxError('unexpected trailing data in marker: %s: %s' %
163 | (marker, rest))
164 | context = dict(DEFAULT_CONTEXT)
165 | if execution_context:
166 | context.update(execution_context)
167 | return evaluator.evaluate(expr, context)
168 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/xmlstring.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: set of routines to process strings
3 | * Description: type and interfaces needed for the internal string handling
4 | * of the library, especially UTF8 processing.
5 | *
6 | * Copy: See Copyright for the status of this software.
7 | *
8 | * Author: Daniel Veillard
9 | */
10 |
11 | #ifndef __XML_STRING_H__
12 | #define __XML_STRING_H__
13 |
14 | #include <stdarg.h>
15 | #include <libxml/xmlversion.h>
16 |
17 | #ifdef __cplusplus
18 | extern "C" {
19 | #endif
20 |
21 | /**
22 | * xmlChar:
23 | *
24 | * This is a basic byte in an UTF-8 encoded string.
25 | * It's unsigned allowing to pinpoint case where char * are assigned
26 | * to xmlChar * (possibly making serialization back impossible).
27 | */
28 | typedef unsigned char xmlChar;
29 |
30 | /**
31 | * BAD_CAST:
32 | *
33 | * Macro to cast a string to an xmlChar * when one know its safe.
34 | */
35 | #define BAD_CAST (xmlChar *)
36 |
37 | /*
38 | * xmlChar handling
39 | */
40 | XMLPUBFUN xmlChar *
41 | xmlStrdup (const xmlChar *cur);
42 | XMLPUBFUN xmlChar *
43 | xmlStrndup (const xmlChar *cur,
44 | int len);
45 | XMLPUBFUN xmlChar *
46 | xmlCharStrndup (const char *cur,
47 | int len);
48 | XMLPUBFUN xmlChar *
49 | xmlCharStrdup (const char *cur);
50 | XMLPUBFUN xmlChar *
51 | xmlStrsub (const xmlChar *str,
52 | int start,
53 | int len);
54 | XMLPUBFUN const xmlChar *
55 | xmlStrchr (const xmlChar *str,
56 | xmlChar val);
57 | XMLPUBFUN const xmlChar *
58 | xmlStrstr (const xmlChar *str,
59 | const xmlChar *val);
60 | XMLPUBFUN const xmlChar *
61 | xmlStrcasestr (const xmlChar *str,
62 | const xmlChar *val);
63 | XMLPUBFUN int
64 | xmlStrcmp (const xmlChar *str1,
65 | const xmlChar *str2);
66 | XMLPUBFUN int
67 | xmlStrncmp (const xmlChar *str1,
68 | const xmlChar *str2,
69 | int len);
70 | XMLPUBFUN int
71 | xmlStrcasecmp (const xmlChar *str1,
72 | const xmlChar *str2);
73 | XMLPUBFUN int
74 | xmlStrncasecmp (const xmlChar *str1,
75 | const xmlChar *str2,
76 | int len);
77 | XMLPUBFUN int
78 | xmlStrEqual (const xmlChar *str1,
79 | const xmlChar *str2);
80 | XMLPUBFUN int
81 | xmlStrQEqual (const xmlChar *pref,
82 | const xmlChar *name,
83 | const xmlChar *str);
84 | XMLPUBFUN int
85 | xmlStrlen (const xmlChar *str);
86 | XMLPUBFUN xmlChar *
87 | xmlStrcat (xmlChar *cur,
88 | const xmlChar *add);
89 | XMLPUBFUN xmlChar *
90 | xmlStrncat (xmlChar *cur,
91 | const xmlChar *add,
92 | int len);
93 | XMLPUBFUN xmlChar *
94 | xmlStrncatNew (const xmlChar *str1,
95 | const xmlChar *str2,
96 | int len);
97 | XMLPUBFUN int
98 | xmlStrPrintf (xmlChar *buf,
99 | int len,
100 | const char *msg,
101 | ...) LIBXML_ATTR_FORMAT(3,4);
102 | XMLPUBFUN int
103 | xmlStrVPrintf (xmlChar *buf,
104 | int len,
105 | const char *msg,
106 | va_list ap) LIBXML_ATTR_FORMAT(3,0);
107 |
108 | XMLPUBFUN int
109 | xmlGetUTF8Char (const unsigned char *utf,
110 | int *len);
111 | XMLPUBFUN int
112 | xmlCheckUTF8 (const unsigned char *utf);
113 | XMLPUBFUN int
114 | xmlUTF8Strsize (const xmlChar *utf,
115 | int len);
116 | XMLPUBFUN xmlChar *
117 | xmlUTF8Strndup (const xmlChar *utf,
118 | int len);
119 | XMLPUBFUN const xmlChar *
120 | xmlUTF8Strpos (const xmlChar *utf,
121 | int pos);
122 | XMLPUBFUN int
123 | xmlUTF8Strloc (const xmlChar *utf,
124 | const xmlChar *utfchar);
125 | XMLPUBFUN xmlChar *
126 | xmlUTF8Strsub (const xmlChar *utf,
127 | int start,
128 | int len);
129 | XMLPUBFUN int
130 | xmlUTF8Strlen (const xmlChar *utf);
131 | XMLPUBFUN int
132 | xmlUTF8Size (const xmlChar *utf);
133 | XMLPUBFUN int
134 | xmlUTF8Charcmp (const xmlChar *utf1,
135 | const xmlChar *utf2);
136 |
137 | #ifdef __cplusplus
138 | }
139 | #endif
140 | #endif /* __XML_STRING_H__ */
141 |
```