#
tokens: 44993/50000 2/808 files (page 82/168)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 82 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .DS_Store
├── .venv
│   ├── __pycache__
│   │   └── hello.cpython-312.pyc
│   ├── bin
│   │   ├── activate
│   │   ├── activate.csh
│   │   ├── activate.fish
│   │   ├── Activate.ps1
│   │   ├── flask
│   │   ├── normalizer
│   │   ├── pip
│   │   ├── pip3
│   │   ├── pip3.12
│   │   ├── python
│   │   ├── python3
│   │   └── python3.12
│   ├── hello.py
│   ├── lib
│   │   └── python3.12
│   │       └── site-packages
│   │           ├── beautifulsoup4-4.12.3.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── licenses
│   │           │   │   ├── AUTHORS
│   │           │   │   └── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   └── WHEEL
│   │           ├── blinker
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _utilities.cpython-312.pyc
│   │           │   │   └── base.cpython-312.pyc
│   │           │   ├── _utilities.py
│   │           │   ├── base.py
│   │           │   └── py.typed
│   │           ├── blinker-1.8.2.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── bs4
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── css.cpython-312.pyc
│   │           │   │   ├── dammit.cpython-312.pyc
│   │           │   │   ├── diagnose.cpython-312.pyc
│   │           │   │   ├── element.cpython-312.pyc
│   │           │   │   └── formatter.cpython-312.pyc
│   │           │   ├── builder
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── _html5lib.cpython-312.pyc
│   │           │   │   │   ├── _htmlparser.cpython-312.pyc
│   │           │   │   │   └── _lxml.cpython-312.pyc
│   │           │   │   ├── _html5lib.py
│   │           │   │   ├── _htmlparser.py
│   │           │   │   └── _lxml.py
│   │           │   ├── css.py
│   │           │   ├── dammit.py
│   │           │   ├── diagnose.py
│   │           │   ├── element.py
│   │           │   ├── formatter.py
│   │           │   └── tests
│   │           │       ├── __init__.py
│   │           │       ├── __pycache__
│   │           │       │   ├── __init__.cpython-312.pyc
│   │           │       │   ├── test_builder_registry.cpython-312.pyc
│   │           │       │   ├── test_builder.cpython-312.pyc
│   │           │       │   ├── test_css.cpython-312.pyc
│   │           │       │   ├── test_dammit.cpython-312.pyc
│   │           │       │   ├── test_docs.cpython-312.pyc
│   │           │       │   ├── test_element.cpython-312.pyc
│   │           │       │   ├── test_formatter.cpython-312.pyc
│   │           │       │   ├── test_fuzz.cpython-312.pyc
│   │           │       │   ├── test_html5lib.cpython-312.pyc
│   │           │       │   ├── test_htmlparser.cpython-312.pyc
│   │           │       │   ├── test_lxml.cpython-312.pyc
│   │           │       │   ├── test_navigablestring.cpython-312.pyc
│   │           │       │   ├── test_pageelement.cpython-312.pyc
│   │           │       │   ├── test_soup.cpython-312.pyc
│   │           │       │   ├── test_tag.cpython-312.pyc
│   │           │       │   └── test_tree.cpython-312.pyc
│   │           │       ├── fuzz
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│   │           │       │   ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│   │           │       │   └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│   │           │       ├── test_builder_registry.py
│   │           │       ├── test_builder.py
│   │           │       ├── test_css.py
│   │           │       ├── test_dammit.py
│   │           │       ├── test_docs.py
│   │           │       ├── test_element.py
│   │           │       ├── test_formatter.py
│   │           │       ├── test_fuzz.py
│   │           │       ├── test_html5lib.py
│   │           │       ├── test_htmlparser.py
│   │           │       ├── test_lxml.py
│   │           │       ├── test_navigablestring.py
│   │           │       ├── test_pageelement.py
│   │           │       ├── test_soup.py
│   │           │       ├── test_tag.py
│   │           │       └── test_tree.py
│   │           ├── certifi
│   │           │   ├── __init__.py
│   │           │   ├── __main__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __main__.cpython-312.pyc
│   │           │   │   └── core.cpython-312.pyc
│   │           │   ├── cacert.pem
│   │           │   ├── core.py
│   │           │   └── py.typed
│   │           ├── certifi-2024.8.30.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── charset_normalizer
│   │           │   ├── __init__.py
│   │           │   ├── __main__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __main__.cpython-312.pyc
│   │           │   │   ├── api.cpython-312.pyc
│   │           │   │   ├── cd.cpython-312.pyc
│   │           │   │   ├── constant.cpython-312.pyc
│   │           │   │   ├── legacy.cpython-312.pyc
│   │           │   │   ├── md.cpython-312.pyc
│   │           │   │   ├── models.cpython-312.pyc
│   │           │   │   ├── utils.cpython-312.pyc
│   │           │   │   └── version.cpython-312.pyc
│   │           │   ├── api.py
│   │           │   ├── cd.py
│   │           │   ├── cli
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __main__.py
│   │           │   │   └── __pycache__
│   │           │   │       ├── __init__.cpython-312.pyc
│   │           │   │       └── __main__.cpython-312.pyc
│   │           │   ├── constant.py
│   │           │   ├── legacy.py
│   │           │   ├── md__mypyc.cpython-312-darwin.so
│   │           │   ├── md.cpython-312-darwin.so
│   │           │   ├── md.py
│   │           │   ├── models.py
│   │           │   ├── py.typed
│   │           │   ├── utils.py
│   │           │   └── version.py
│   │           ├── charset_normalizer-3.4.0.dist-info
│   │           │   ├── entry_points.txt
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── click
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _compat.cpython-312.pyc
│   │           │   │   ├── _termui_impl.cpython-312.pyc
│   │           │   │   ├── _textwrap.cpython-312.pyc
│   │           │   │   ├── _winconsole.cpython-312.pyc
│   │           │   │   ├── core.cpython-312.pyc
│   │           │   │   ├── decorators.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── formatting.cpython-312.pyc
│   │           │   │   ├── globals.cpython-312.pyc
│   │           │   │   ├── parser.cpython-312.pyc
│   │           │   │   ├── shell_completion.cpython-312.pyc
│   │           │   │   ├── termui.cpython-312.pyc
│   │           │   │   ├── testing.cpython-312.pyc
│   │           │   │   ├── types.cpython-312.pyc
│   │           │   │   └── utils.cpython-312.pyc
│   │           │   ├── _compat.py
│   │           │   ├── _termui_impl.py
│   │           │   ├── _textwrap.py
│   │           │   ├── _winconsole.py
│   │           │   ├── core.py
│   │           │   ├── decorators.py
│   │           │   ├── exceptions.py
│   │           │   ├── formatting.py
│   │           │   ├── globals.py
│   │           │   ├── parser.py
│   │           │   ├── py.typed
│   │           │   ├── shell_completion.py
│   │           │   ├── termui.py
│   │           │   ├── testing.py
│   │           │   ├── types.py
│   │           │   └── utils.py
│   │           ├── click-8.1.7.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.rst
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── fake_useragent
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── errors.cpython-312.pyc
│   │           │   │   ├── fake.cpython-312.pyc
│   │           │   │   ├── log.cpython-312.pyc
│   │           │   │   ├── settings.cpython-312.pyc
│   │           │   │   └── utils.cpython-312.pyc
│   │           │   ├── data
│   │           │   │   └── browsers.json
│   │           │   ├── errors.py
│   │           │   ├── fake.py
│   │           │   ├── log.py
│   │           │   ├── settings.py
│   │           │   └── utils.py
│   │           ├── fake_useragent-1.5.1.dist-info
│   │           │   ├── AUTHORS
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── flask
│   │           │   ├── __init__.py
│   │           │   ├── __main__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __main__.cpython-312.pyc
│   │           │   │   ├── app.cpython-312.pyc
│   │           │   │   ├── blueprints.cpython-312.pyc
│   │           │   │   ├── cli.cpython-312.pyc
│   │           │   │   ├── config.cpython-312.pyc
│   │           │   │   ├── ctx.cpython-312.pyc
│   │           │   │   ├── debughelpers.cpython-312.pyc
│   │           │   │   ├── globals.cpython-312.pyc
│   │           │   │   ├── helpers.cpython-312.pyc
│   │           │   │   ├── logging.cpython-312.pyc
│   │           │   │   ├── sessions.cpython-312.pyc
│   │           │   │   ├── signals.cpython-312.pyc
│   │           │   │   ├── templating.cpython-312.pyc
│   │           │   │   ├── testing.cpython-312.pyc
│   │           │   │   ├── typing.cpython-312.pyc
│   │           │   │   ├── views.cpython-312.pyc
│   │           │   │   └── wrappers.cpython-312.pyc
│   │           │   ├── app.py
│   │           │   ├── blueprints.py
│   │           │   ├── cli.py
│   │           │   ├── config.py
│   │           │   ├── ctx.py
│   │           │   ├── debughelpers.py
│   │           │   ├── globals.py
│   │           │   ├── helpers.py
│   │           │   ├── json
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── provider.cpython-312.pyc
│   │           │   │   │   └── tag.cpython-312.pyc
│   │           │   │   ├── provider.py
│   │           │   │   └── tag.py
│   │           │   ├── logging.py
│   │           │   ├── py.typed
│   │           │   ├── sansio
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── app.cpython-312.pyc
│   │           │   │   │   ├── blueprints.cpython-312.pyc
│   │           │   │   │   └── scaffold.cpython-312.pyc
│   │           │   │   ├── app.py
│   │           │   │   ├── blueprints.py
│   │           │   │   ├── README.md
│   │           │   │   └── scaffold.py
│   │           │   ├── sessions.py
│   │           │   ├── signals.py
│   │           │   ├── templating.py
│   │           │   ├── testing.py
│   │           │   ├── typing.py
│   │           │   ├── views.py
│   │           │   └── wrappers.py
│   │           ├── flask-3.0.3.dist-info
│   │           │   ├── entry_points.txt
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   └── WHEEL
│   │           ├── idna
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── codec.cpython-312.pyc
│   │           │   │   ├── compat.cpython-312.pyc
│   │           │   │   ├── core.cpython-312.pyc
│   │           │   │   ├── idnadata.cpython-312.pyc
│   │           │   │   ├── intranges.cpython-312.pyc
│   │           │   │   ├── package_data.cpython-312.pyc
│   │           │   │   └── uts46data.cpython-312.pyc
│   │           │   ├── codec.py
│   │           │   ├── compat.py
│   │           │   ├── core.py
│   │           │   ├── idnadata.py
│   │           │   ├── intranges.py
│   │           │   ├── package_data.py
│   │           │   ├── py.typed
│   │           │   └── uts46data.py
│   │           ├── idna-3.10.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.md
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── itsdangerous
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _json.cpython-312.pyc
│   │           │   │   ├── encoding.cpython-312.pyc
│   │           │   │   ├── exc.cpython-312.pyc
│   │           │   │   ├── serializer.cpython-312.pyc
│   │           │   │   ├── signer.cpython-312.pyc
│   │           │   │   ├── timed.cpython-312.pyc
│   │           │   │   └── url_safe.cpython-312.pyc
│   │           │   ├── _json.py
│   │           │   ├── encoding.py
│   │           │   ├── exc.py
│   │           │   ├── py.typed
│   │           │   ├── serializer.py
│   │           │   ├── signer.py
│   │           │   ├── timed.py
│   │           │   └── url_safe.py
│   │           ├── itsdangerous-2.2.0.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── jinja2
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _identifier.cpython-312.pyc
│   │           │   │   ├── async_utils.cpython-312.pyc
│   │           │   │   ├── bccache.cpython-312.pyc
│   │           │   │   ├── compiler.cpython-312.pyc
│   │           │   │   ├── constants.cpython-312.pyc
│   │           │   │   ├── debug.cpython-312.pyc
│   │           │   │   ├── defaults.cpython-312.pyc
│   │           │   │   ├── environment.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── ext.cpython-312.pyc
│   │           │   │   ├── filters.cpython-312.pyc
│   │           │   │   ├── idtracking.cpython-312.pyc
│   │           │   │   ├── lexer.cpython-312.pyc
│   │           │   │   ├── loaders.cpython-312.pyc
│   │           │   │   ├── meta.cpython-312.pyc
│   │           │   │   ├── nativetypes.cpython-312.pyc
│   │           │   │   ├── nodes.cpython-312.pyc
│   │           │   │   ├── optimizer.cpython-312.pyc
│   │           │   │   ├── parser.cpython-312.pyc
│   │           │   │   ├── runtime.cpython-312.pyc
│   │           │   │   ├── sandbox.cpython-312.pyc
│   │           │   │   ├── tests.cpython-312.pyc
│   │           │   │   ├── utils.cpython-312.pyc
│   │           │   │   └── visitor.cpython-312.pyc
│   │           │   ├── _identifier.py
│   │           │   ├── async_utils.py
│   │           │   ├── bccache.py
│   │           │   ├── compiler.py
│   │           │   ├── constants.py
│   │           │   ├── debug.py
│   │           │   ├── defaults.py
│   │           │   ├── environment.py
│   │           │   ├── exceptions.py
│   │           │   ├── ext.py
│   │           │   ├── filters.py
│   │           │   ├── idtracking.py
│   │           │   ├── lexer.py
│   │           │   ├── loaders.py
│   │           │   ├── meta.py
│   │           │   ├── nativetypes.py
│   │           │   ├── nodes.py
│   │           │   ├── optimizer.py
│   │           │   ├── parser.py
│   │           │   ├── py.typed
│   │           │   ├── runtime.py
│   │           │   ├── sandbox.py
│   │           │   ├── tests.py
│   │           │   ├── utils.py
│   │           │   └── visitor.py
│   │           ├── jinja2-3.1.4.dist-info
│   │           │   ├── entry_points.txt
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── lxml
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _elementpath.cpython-312.pyc
│   │           │   │   ├── builder.cpython-312.pyc
│   │           │   │   ├── cssselect.cpython-312.pyc
│   │           │   │   ├── doctestcompare.cpython-312.pyc
│   │           │   │   ├── ElementInclude.cpython-312.pyc
│   │           │   │   ├── pyclasslookup.cpython-312.pyc
│   │           │   │   ├── sax.cpython-312.pyc
│   │           │   │   └── usedoctest.cpython-312.pyc
│   │           │   ├── _elementpath.cpython-312-darwin.so
│   │           │   ├── _elementpath.py
│   │           │   ├── apihelpers.pxi
│   │           │   ├── builder.cpython-312-darwin.so
│   │           │   ├── builder.py
│   │           │   ├── classlookup.pxi
│   │           │   ├── cleanup.pxi
│   │           │   ├── cssselect.py
│   │           │   ├── debug.pxi
│   │           │   ├── docloader.pxi
│   │           │   ├── doctestcompare.py
│   │           │   ├── dtd.pxi
│   │           │   ├── ElementInclude.py
│   │           │   ├── etree_api.h
│   │           │   ├── etree.cpython-312-darwin.so
│   │           │   ├── etree.h
│   │           │   ├── etree.pyx
│   │           │   ├── extensions.pxi
│   │           │   ├── html
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── _diffcommand.cpython-312.pyc
│   │           │   │   │   ├── _html5builder.cpython-312.pyc
│   │           │   │   │   ├── _setmixin.cpython-312.pyc
│   │           │   │   │   ├── builder.cpython-312.pyc
│   │           │   │   │   ├── clean.cpython-312.pyc
│   │           │   │   │   ├── defs.cpython-312.pyc
│   │           │   │   │   ├── diff.cpython-312.pyc
│   │           │   │   │   ├── ElementSoup.cpython-312.pyc
│   │           │   │   │   ├── formfill.cpython-312.pyc
│   │           │   │   │   ├── html5parser.cpython-312.pyc
│   │           │   │   │   ├── soupparser.cpython-312.pyc
│   │           │   │   │   └── usedoctest.cpython-312.pyc
│   │           │   │   ├── _diffcommand.py
│   │           │   │   ├── _html5builder.py
│   │           │   │   ├── _setmixin.py
│   │           │   │   ├── builder.py
│   │           │   │   ├── clean.py
│   │           │   │   ├── defs.py
│   │           │   │   ├── diff.cpython-312-darwin.so
│   │           │   │   ├── diff.py
│   │           │   │   ├── ElementSoup.py
│   │           │   │   ├── formfill.py
│   │           │   │   ├── html5parser.py
│   │           │   │   ├── soupparser.py
│   │           │   │   └── usedoctest.py
│   │           │   ├── includes
│   │           │   │   ├── __init__.pxd
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   ├── c14n.pxd
│   │           │   │   ├── config.pxd
│   │           │   │   ├── dtdvalid.pxd
│   │           │   │   ├── etree_defs.h
│   │           │   │   ├── etreepublic.pxd
│   │           │   │   ├── extlibs
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   │   ├── libcharset.h
│   │           │   │   │   ├── localcharset.h
│   │           │   │   │   ├── zconf.h
│   │           │   │   │   └── zlib.h
│   │           │   │   ├── htmlparser.pxd
│   │           │   │   ├── libexslt
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   │   ├── exslt.h
│   │           │   │   │   ├── exsltconfig.h
│   │           │   │   │   └── exsltexports.h
│   │           │   │   ├── libxml
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   │   ├── c14n.h
│   │           │   │   │   ├── catalog.h
│   │           │   │   │   ├── chvalid.h
│   │           │   │   │   ├── debugXML.h
│   │           │   │   │   ├── dict.h
│   │           │   │   │   ├── encoding.h
│   │           │   │   │   ├── entities.h
│   │           │   │   │   ├── globals.h
│   │           │   │   │   ├── hash.h
│   │           │   │   │   ├── HTMLparser.h
│   │           │   │   │   ├── HTMLtree.h
│   │           │   │   │   ├── list.h
│   │           │   │   │   ├── nanoftp.h
│   │           │   │   │   ├── nanohttp.h
│   │           │   │   │   ├── parser.h
│   │           │   │   │   ├── parserInternals.h
│   │           │   │   │   ├── relaxng.h
│   │           │   │   │   ├── SAX.h
│   │           │   │   │   ├── SAX2.h
│   │           │   │   │   ├── schemasInternals.h
│   │           │   │   │   ├── schematron.h
│   │           │   │   │   ├── threads.h
│   │           │   │   │   ├── tree.h
│   │           │   │   │   ├── uri.h
│   │           │   │   │   ├── valid.h
│   │           │   │   │   ├── xinclude.h
│   │           │   │   │   ├── xlink.h
│   │           │   │   │   ├── xmlautomata.h
│   │           │   │   │   ├── xmlerror.h
│   │           │   │   │   ├── xmlexports.h
│   │           │   │   │   ├── xmlIO.h
│   │           │   │   │   ├── xmlmemory.h
│   │           │   │   │   ├── xmlmodule.h
│   │           │   │   │   ├── xmlreader.h
│   │           │   │   │   ├── xmlregexp.h
│   │           │   │   │   ├── xmlsave.h
│   │           │   │   │   ├── xmlschemas.h
│   │           │   │   │   ├── xmlschemastypes.h
│   │           │   │   │   ├── xmlstring.h
│   │           │   │   │   ├── xmlunicode.h
│   │           │   │   │   ├── xmlversion.h
│   │           │   │   │   ├── xmlwriter.h
│   │           │   │   │   ├── xpath.h
│   │           │   │   │   ├── xpathInternals.h
│   │           │   │   │   └── xpointer.h
│   │           │   │   ├── libxslt
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   │   ├── attributes.h
│   │           │   │   │   ├── documents.h
│   │           │   │   │   ├── extensions.h
│   │           │   │   │   ├── extra.h
│   │           │   │   │   ├── functions.h
│   │           │   │   │   ├── imports.h
│   │           │   │   │   ├── keys.h
│   │           │   │   │   ├── namespaces.h
│   │           │   │   │   ├── numbersInternals.h
│   │           │   │   │   ├── pattern.h
│   │           │   │   │   ├── preproc.h
│   │           │   │   │   ├── security.h
│   │           │   │   │   ├── templates.h
│   │           │   │   │   ├── transform.h
│   │           │   │   │   ├── variables.h
│   │           │   │   │   ├── xslt.h
│   │           │   │   │   ├── xsltconfig.h
│   │           │   │   │   ├── xsltexports.h
│   │           │   │   │   ├── xsltInternals.h
│   │           │   │   │   ├── xsltlocale.h
│   │           │   │   │   └── xsltutils.h
│   │           │   │   ├── lxml-version.h
│   │           │   │   ├── relaxng.pxd
│   │           │   │   ├── schematron.pxd
│   │           │   │   ├── tree.pxd
│   │           │   │   ├── uri.pxd
│   │           │   │   ├── xinclude.pxd
│   │           │   │   ├── xmlerror.pxd
│   │           │   │   ├── xmlparser.pxd
│   │           │   │   ├── xmlschema.pxd
│   │           │   │   ├── xpath.pxd
│   │           │   │   └── xslt.pxd
│   │           │   ├── isoschematron
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   └── resources
│   │           │   │       ├── rng
│   │           │   │       │   └── iso-schematron.rng
│   │           │   │       └── xsl
│   │           │   │           ├── iso-schematron-xslt1
│   │           │   │           │   ├── iso_abstract_expand.xsl
│   │           │   │           │   ├── iso_dsdl_include.xsl
│   │           │   │           │   ├── iso_schematron_message.xsl
│   │           │   │           │   ├── iso_schematron_skeleton_for_xslt1.xsl
│   │           │   │           │   ├── iso_svrl_for_xslt1.xsl
│   │           │   │           │   └── readme.txt
│   │           │   │           ├── RNG2Schtrn.xsl
│   │           │   │           └── XSD2Schtrn.xsl
│   │           │   ├── iterparse.pxi
│   │           │   ├── lxml.etree_api.h
│   │           │   ├── lxml.etree.h
│   │           │   ├── nsclasses.pxi
│   │           │   ├── objectify.cpython-312-darwin.so
│   │           │   ├── objectify.pyx
│   │           │   ├── objectpath.pxi
│   │           │   ├── parser.pxi
│   │           │   ├── parsertarget.pxi
│   │           │   ├── proxy.pxi
│   │           │   ├── public-api.pxi
│   │           │   ├── pyclasslookup.py
│   │           │   ├── readonlytree.pxi
│   │           │   ├── relaxng.pxi
│   │           │   ├── sax.cpython-312-darwin.so
│   │           │   ├── sax.py
│   │           │   ├── saxparser.pxi
│   │           │   ├── schematron.pxi
│   │           │   ├── serializer.pxi
│   │           │   ├── usedoctest.py
│   │           │   ├── xinclude.pxi
│   │           │   ├── xmlerror.pxi
│   │           │   ├── xmlid.pxi
│   │           │   ├── xmlschema.pxi
│   │           │   ├── xpath.pxi
│   │           │   ├── xslt.pxi
│   │           │   └── xsltext.pxi
│   │           ├── lxml-5.3.0.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── LICENSES.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── markupsafe
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   └── _native.cpython-312.pyc
│   │           │   ├── _native.py
│   │           │   ├── _speedups.c
│   │           │   ├── _speedups.cpython-312-darwin.so
│   │           │   ├── _speedups.pyi
│   │           │   └── py.typed
│   │           ├── MarkupSafe-3.0.1.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── pip
│   │           │   ├── __init__.py
│   │           │   ├── __main__.py
│   │           │   ├── __pip-runner__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __main__.cpython-312.pyc
│   │           │   │   └── __pip-runner__.cpython-312.pyc
│   │           │   ├── _internal
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── build_env.cpython-312.pyc
│   │           │   │   │   ├── cache.cpython-312.pyc
│   │           │   │   │   ├── configuration.cpython-312.pyc
│   │           │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   ├── main.cpython-312.pyc
│   │           │   │   │   ├── pyproject.cpython-312.pyc
│   │           │   │   │   ├── self_outdated_check.cpython-312.pyc
│   │           │   │   │   └── wheel_builder.cpython-312.pyc
│   │           │   │   ├── build_env.py
│   │           │   │   ├── cache.py
│   │           │   │   ├── cli
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── autocompletion.cpython-312.pyc
│   │           │   │   │   │   ├── base_command.cpython-312.pyc
│   │           │   │   │   │   ├── cmdoptions.cpython-312.pyc
│   │           │   │   │   │   ├── command_context.cpython-312.pyc
│   │           │   │   │   │   ├── index_command.cpython-312.pyc
│   │           │   │   │   │   ├── main_parser.cpython-312.pyc
│   │           │   │   │   │   ├── main.cpython-312.pyc
│   │           │   │   │   │   ├── parser.cpython-312.pyc
│   │           │   │   │   │   ├── progress_bars.cpython-312.pyc
│   │           │   │   │   │   ├── req_command.cpython-312.pyc
│   │           │   │   │   │   ├── spinners.cpython-312.pyc
│   │           │   │   │   │   └── status_codes.cpython-312.pyc
│   │           │   │   │   ├── autocompletion.py
│   │           │   │   │   ├── base_command.py
│   │           │   │   │   ├── cmdoptions.py
│   │           │   │   │   ├── command_context.py
│   │           │   │   │   ├── index_command.py
│   │           │   │   │   ├── main_parser.py
│   │           │   │   │   ├── main.py
│   │           │   │   │   ├── parser.py
│   │           │   │   │   ├── progress_bars.py
│   │           │   │   │   ├── req_command.py
│   │           │   │   │   ├── spinners.py
│   │           │   │   │   └── status_codes.py
│   │           │   │   ├── commands
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── cache.cpython-312.pyc
│   │           │   │   │   │   ├── check.cpython-312.pyc
│   │           │   │   │   │   ├── completion.cpython-312.pyc
│   │           │   │   │   │   ├── configuration.cpython-312.pyc
│   │           │   │   │   │   ├── debug.cpython-312.pyc
│   │           │   │   │   │   ├── download.cpython-312.pyc
│   │           │   │   │   │   ├── freeze.cpython-312.pyc
│   │           │   │   │   │   ├── hash.cpython-312.pyc
│   │           │   │   │   │   ├── help.cpython-312.pyc
│   │           │   │   │   │   ├── index.cpython-312.pyc
│   │           │   │   │   │   ├── inspect.cpython-312.pyc
│   │           │   │   │   │   ├── install.cpython-312.pyc
│   │           │   │   │   │   ├── list.cpython-312.pyc
│   │           │   │   │   │   ├── search.cpython-312.pyc
│   │           │   │   │   │   ├── show.cpython-312.pyc
│   │           │   │   │   │   ├── uninstall.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── cache.py
│   │           │   │   │   ├── check.py
│   │           │   │   │   ├── completion.py
│   │           │   │   │   ├── configuration.py
│   │           │   │   │   ├── debug.py
│   │           │   │   │   ├── download.py
│   │           │   │   │   ├── freeze.py
│   │           │   │   │   ├── hash.py
│   │           │   │   │   ├── help.py
│   │           │   │   │   ├── index.py
│   │           │   │   │   ├── inspect.py
│   │           │   │   │   ├── install.py
│   │           │   │   │   ├── list.py
│   │           │   │   │   ├── search.py
│   │           │   │   │   ├── show.py
│   │           │   │   │   ├── uninstall.py
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── configuration.py
│   │           │   │   ├── distributions
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── base.cpython-312.pyc
│   │           │   │   │   │   ├── installed.cpython-312.pyc
│   │           │   │   │   │   ├── sdist.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── base.py
│   │           │   │   │   ├── installed.py
│   │           │   │   │   ├── sdist.py
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── exceptions.py
│   │           │   │   ├── index
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── collector.cpython-312.pyc
│   │           │   │   │   │   ├── package_finder.cpython-312.pyc
│   │           │   │   │   │   └── sources.cpython-312.pyc
│   │           │   │   │   ├── collector.py
│   │           │   │   │   ├── package_finder.py
│   │           │   │   │   └── sources.py
│   │           │   │   ├── locations
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _distutils.cpython-312.pyc
│   │           │   │   │   │   ├── _sysconfig.cpython-312.pyc
│   │           │   │   │   │   └── base.cpython-312.pyc
│   │           │   │   │   ├── _distutils.py
│   │           │   │   │   ├── _sysconfig.py
│   │           │   │   │   └── base.py
│   │           │   │   ├── main.py
│   │           │   │   ├── metadata
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _json.cpython-312.pyc
│   │           │   │   │   │   ├── base.cpython-312.pyc
│   │           │   │   │   │   └── pkg_resources.cpython-312.pyc
│   │           │   │   │   ├── _json.py
│   │           │   │   │   ├── base.py
│   │           │   │   │   ├── importlib
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── _compat.cpython-312.pyc
│   │           │   │   │   │   │   ├── _dists.cpython-312.pyc
│   │           │   │   │   │   │   └── _envs.cpython-312.pyc
│   │           │   │   │   │   ├── _compat.py
│   │           │   │   │   │   ├── _dists.py
│   │           │   │   │   │   └── _envs.py
│   │           │   │   │   └── pkg_resources.py
│   │           │   │   ├── models
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── candidate.cpython-312.pyc
│   │           │   │   │   │   ├── direct_url.cpython-312.pyc
│   │           │   │   │   │   ├── format_control.cpython-312.pyc
│   │           │   │   │   │   ├── index.cpython-312.pyc
│   │           │   │   │   │   ├── installation_report.cpython-312.pyc
│   │           │   │   │   │   ├── link.cpython-312.pyc
│   │           │   │   │   │   ├── scheme.cpython-312.pyc
│   │           │   │   │   │   ├── search_scope.cpython-312.pyc
│   │           │   │   │   │   ├── selection_prefs.cpython-312.pyc
│   │           │   │   │   │   ├── target_python.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── candidate.py
│   │           │   │   │   ├── direct_url.py
│   │           │   │   │   ├── format_control.py
│   │           │   │   │   ├── index.py
│   │           │   │   │   ├── installation_report.py
│   │           │   │   │   ├── link.py
│   │           │   │   │   ├── scheme.py
│   │           │   │   │   ├── search_scope.py
│   │           │   │   │   ├── selection_prefs.py
│   │           │   │   │   ├── target_python.py
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── network
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── auth.cpython-312.pyc
│   │           │   │   │   │   ├── cache.cpython-312.pyc
│   │           │   │   │   │   ├── download.cpython-312.pyc
│   │           │   │   │   │   ├── lazy_wheel.cpython-312.pyc
│   │           │   │   │   │   ├── session.cpython-312.pyc
│   │           │   │   │   │   ├── utils.cpython-312.pyc
│   │           │   │   │   │   └── xmlrpc.cpython-312.pyc
│   │           │   │   │   ├── auth.py
│   │           │   │   │   ├── cache.py
│   │           │   │   │   ├── download.py
│   │           │   │   │   ├── lazy_wheel.py
│   │           │   │   │   ├── session.py
│   │           │   │   │   ├── utils.py
│   │           │   │   │   └── xmlrpc.py
│   │           │   │   ├── operations
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── check.cpython-312.pyc
│   │           │   │   │   │   ├── freeze.cpython-312.pyc
│   │           │   │   │   │   └── prepare.cpython-312.pyc
│   │           │   │   │   ├── build
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── build_tracker.cpython-312.pyc
│   │           │   │   │   │   │   ├── metadata_editable.cpython-312.pyc
│   │           │   │   │   │   │   ├── metadata_legacy.cpython-312.pyc
│   │           │   │   │   │   │   ├── metadata.cpython-312.pyc
│   │           │   │   │   │   │   ├── wheel_editable.cpython-312.pyc
│   │           │   │   │   │   │   ├── wheel_legacy.cpython-312.pyc
│   │           │   │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   │   ├── build_tracker.py
│   │           │   │   │   │   ├── metadata_editable.py
│   │           │   │   │   │   ├── metadata_legacy.py
│   │           │   │   │   │   ├── metadata.py
│   │           │   │   │   │   ├── wheel_editable.py
│   │           │   │   │   │   ├── wheel_legacy.py
│   │           │   │   │   │   └── wheel.py
│   │           │   │   │   ├── check.py
│   │           │   │   │   ├── freeze.py
│   │           │   │   │   ├── install
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── editable_legacy.cpython-312.pyc
│   │           │   │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   │   ├── editable_legacy.py
│   │           │   │   │   │   └── wheel.py
│   │           │   │   │   └── prepare.py
│   │           │   │   ├── pyproject.py
│   │           │   │   ├── req
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── constructors.cpython-312.pyc
│   │           │   │   │   │   ├── req_file.cpython-312.pyc
│   │           │   │   │   │   ├── req_install.cpython-312.pyc
│   │           │   │   │   │   ├── req_set.cpython-312.pyc
│   │           │   │   │   │   └── req_uninstall.cpython-312.pyc
│   │           │   │   │   ├── constructors.py
│   │           │   │   │   ├── req_file.py
│   │           │   │   │   ├── req_install.py
│   │           │   │   │   ├── req_set.py
│   │           │   │   │   └── req_uninstall.py
│   │           │   │   ├── resolution
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   └── base.cpython-312.pyc
│   │           │   │   │   ├── base.py
│   │           │   │   │   ├── legacy
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   └── resolver.cpython-312.pyc
│   │           │   │   │   │   └── resolver.py
│   │           │   │   │   └── resolvelib
│   │           │   │   │       ├── __init__.py
│   │           │   │   │       ├── __pycache__
│   │           │   │   │       │   ├── __init__.cpython-312.pyc
│   │           │   │   │       │   ├── base.cpython-312.pyc
│   │           │   │   │       │   ├── candidates.cpython-312.pyc
│   │           │   │   │       │   ├── factory.cpython-312.pyc
│   │           │   │   │       │   ├── found_candidates.cpython-312.pyc
│   │           │   │   │       │   ├── provider.cpython-312.pyc
│   │           │   │   │       │   ├── reporter.cpython-312.pyc
│   │           │   │   │       │   ├── requirements.cpython-312.pyc
│   │           │   │   │       │   └── resolver.cpython-312.pyc
│   │           │   │   │       ├── base.py
│   │           │   │   │       ├── candidates.py
│   │           │   │   │       ├── factory.py
│   │           │   │   │       ├── found_candidates.py
│   │           │   │   │       ├── provider.py
│   │           │   │   │       ├── reporter.py
│   │           │   │   │       ├── requirements.py
│   │           │   │   │       └── resolver.py
│   │           │   │   ├── self_outdated_check.py
│   │           │   │   ├── utils
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _jaraco_text.cpython-312.pyc
│   │           │   │   │   │   ├── _log.cpython-312.pyc
│   │           │   │   │   │   ├── appdirs.cpython-312.pyc
│   │           │   │   │   │   ├── compat.cpython-312.pyc
│   │           │   │   │   │   ├── compatibility_tags.cpython-312.pyc
│   │           │   │   │   │   ├── datetime.cpython-312.pyc
│   │           │   │   │   │   ├── deprecation.cpython-312.pyc
│   │           │   │   │   │   ├── direct_url_helpers.cpython-312.pyc
│   │           │   │   │   │   ├── egg_link.cpython-312.pyc
│   │           │   │   │   │   ├── encoding.cpython-312.pyc
│   │           │   │   │   │   ├── entrypoints.cpython-312.pyc
│   │           │   │   │   │   ├── filesystem.cpython-312.pyc
│   │           │   │   │   │   ├── filetypes.cpython-312.pyc
│   │           │   │   │   │   ├── glibc.cpython-312.pyc
│   │           │   │   │   │   ├── hashes.cpython-312.pyc
│   │           │   │   │   │   ├── logging.cpython-312.pyc
│   │           │   │   │   │   ├── misc.cpython-312.pyc
│   │           │   │   │   │   ├── packaging.cpython-312.pyc
│   │           │   │   │   │   ├── retry.cpython-312.pyc
│   │           │   │   │   │   ├── setuptools_build.cpython-312.pyc
│   │           │   │   │   │   ├── subprocess.cpython-312.pyc
│   │           │   │   │   │   ├── temp_dir.cpython-312.pyc
│   │           │   │   │   │   ├── unpacking.cpython-312.pyc
│   │           │   │   │   │   ├── urls.cpython-312.pyc
│   │           │   │   │   │   ├── virtualenv.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── _jaraco_text.py
│   │           │   │   │   ├── _log.py
│   │           │   │   │   ├── appdirs.py
│   │           │   │   │   ├── compat.py
│   │           │   │   │   ├── compatibility_tags.py
│   │           │   │   │   ├── datetime.py
│   │           │   │   │   ├── deprecation.py
│   │           │   │   │   ├── direct_url_helpers.py
│   │           │   │   │   ├── egg_link.py
│   │           │   │   │   ├── encoding.py
│   │           │   │   │   ├── entrypoints.py
│   │           │   │   │   ├── filesystem.py
│   │           │   │   │   ├── filetypes.py
│   │           │   │   │   ├── glibc.py
│   │           │   │   │   ├── hashes.py
│   │           │   │   │   ├── logging.py
│   │           │   │   │   ├── misc.py
│   │           │   │   │   ├── packaging.py
│   │           │   │   │   ├── retry.py
│   │           │   │   │   ├── setuptools_build.py
│   │           │   │   │   ├── subprocess.py
│   │           │   │   │   ├── temp_dir.py
│   │           │   │   │   ├── unpacking.py
│   │           │   │   │   ├── urls.py
│   │           │   │   │   ├── virtualenv.py
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── vcs
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── bazaar.cpython-312.pyc
│   │           │   │   │   │   ├── git.cpython-312.pyc
│   │           │   │   │   │   ├── mercurial.cpython-312.pyc
│   │           │   │   │   │   ├── subversion.cpython-312.pyc
│   │           │   │   │   │   └── versioncontrol.cpython-312.pyc
│   │           │   │   │   ├── bazaar.py
│   │           │   │   │   ├── git.py
│   │           │   │   │   ├── mercurial.py
│   │           │   │   │   ├── subversion.py
│   │           │   │   │   └── versioncontrol.py
│   │           │   │   └── wheel_builder.py
│   │           │   ├── _vendor
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   └── typing_extensions.cpython-312.pyc
│   │           │   │   ├── cachecontrol
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _cmd.cpython-312.pyc
│   │           │   │   │   │   ├── adapter.cpython-312.pyc
│   │           │   │   │   │   ├── cache.cpython-312.pyc
│   │           │   │   │   │   ├── controller.cpython-312.pyc
│   │           │   │   │   │   ├── filewrapper.cpython-312.pyc
│   │           │   │   │   │   ├── heuristics.cpython-312.pyc
│   │           │   │   │   │   ├── serialize.cpython-312.pyc
│   │           │   │   │   │   └── wrapper.cpython-312.pyc
│   │           │   │   │   ├── _cmd.py
│   │           │   │   │   ├── adapter.py
│   │           │   │   │   ├── cache.py
│   │           │   │   │   ├── caches
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── file_cache.cpython-312.pyc
│   │           │   │   │   │   │   └── redis_cache.cpython-312.pyc
│   │           │   │   │   │   ├── file_cache.py
│   │           │   │   │   │   └── redis_cache.py
│   │           │   │   │   ├── controller.py
│   │           │   │   │   ├── filewrapper.py
│   │           │   │   │   ├── heuristics.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── serialize.py
│   │           │   │   │   └── wrapper.py
│   │           │   │   ├── certifi
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   └── core.cpython-312.pyc
│   │           │   │   │   ├── cacert.pem
│   │           │   │   │   ├── core.py
│   │           │   │   │   └── py.typed
│   │           │   │   ├── distlib
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── compat.cpython-312.pyc
│   │           │   │   │   │   ├── database.cpython-312.pyc
│   │           │   │   │   │   ├── index.cpython-312.pyc
│   │           │   │   │   │   ├── locators.cpython-312.pyc
│   │           │   │   │   │   ├── manifest.cpython-312.pyc
│   │           │   │   │   │   ├── markers.cpython-312.pyc
│   │           │   │   │   │   ├── metadata.cpython-312.pyc
│   │           │   │   │   │   ├── resources.cpython-312.pyc
│   │           │   │   │   │   ├── scripts.cpython-312.pyc
│   │           │   │   │   │   ├── util.cpython-312.pyc
│   │           │   │   │   │   ├── version.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── compat.py
│   │           │   │   │   ├── database.py
│   │           │   │   │   ├── index.py
│   │           │   │   │   ├── locators.py
│   │           │   │   │   ├── manifest.py
│   │           │   │   │   ├── markers.py
│   │           │   │   │   ├── metadata.py
│   │           │   │   │   ├── resources.py
│   │           │   │   │   ├── scripts.py
│   │           │   │   │   ├── t32.exe
│   │           │   │   │   ├── t64-arm.exe
│   │           │   │   │   ├── t64.exe
│   │           │   │   │   ├── util.py
│   │           │   │   │   ├── version.py
│   │           │   │   │   ├── w32.exe
│   │           │   │   │   ├── w64-arm.exe
│   │           │   │   │   ├── w64.exe
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── distro
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   └── distro.cpython-312.pyc
│   │           │   │   │   ├── distro.py
│   │           │   │   │   └── py.typed
│   │           │   │   ├── idna
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── codec.cpython-312.pyc
│   │           │   │   │   │   ├── compat.cpython-312.pyc
│   │           │   │   │   │   ├── core.cpython-312.pyc
│   │           │   │   │   │   ├── idnadata.cpython-312.pyc
│   │           │   │   │   │   ├── intranges.cpython-312.pyc
│   │           │   │   │   │   ├── package_data.cpython-312.pyc
│   │           │   │   │   │   └── uts46data.cpython-312.pyc
│   │           │   │   │   ├── codec.py
│   │           │   │   │   ├── compat.py
│   │           │   │   │   ├── core.py
│   │           │   │   │   ├── idnadata.py
│   │           │   │   │   ├── intranges.py
│   │           │   │   │   ├── package_data.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   └── uts46data.py
│   │           │   │   ├── msgpack
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   │   ├── ext.cpython-312.pyc
│   │           │   │   │   │   └── fallback.cpython-312.pyc
│   │           │   │   │   ├── exceptions.py
│   │           │   │   │   ├── ext.py
│   │           │   │   │   └── fallback.py
│   │           │   │   ├── packaging
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _elffile.cpython-312.pyc
│   │           │   │   │   │   ├── _manylinux.cpython-312.pyc
│   │           │   │   │   │   ├── _musllinux.cpython-312.pyc
│   │           │   │   │   │   ├── _parser.cpython-312.pyc
│   │           │   │   │   │   ├── _structures.cpython-312.pyc
│   │           │   │   │   │   ├── _tokenizer.cpython-312.pyc
│   │           │   │   │   │   ├── markers.cpython-312.pyc
│   │           │   │   │   │   ├── metadata.cpython-312.pyc
│   │           │   │   │   │   ├── requirements.cpython-312.pyc
│   │           │   │   │   │   ├── specifiers.cpython-312.pyc
│   │           │   │   │   │   ├── tags.cpython-312.pyc
│   │           │   │   │   │   ├── utils.cpython-312.pyc
│   │           │   │   │   │   └── version.cpython-312.pyc
│   │           │   │   │   ├── _elffile.py
│   │           │   │   │   ├── _manylinux.py
│   │           │   │   │   ├── _musllinux.py
│   │           │   │   │   ├── _parser.py
│   │           │   │   │   ├── _structures.py
│   │           │   │   │   ├── _tokenizer.py
│   │           │   │   │   ├── markers.py
│   │           │   │   │   ├── metadata.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── requirements.py
│   │           │   │   │   ├── specifiers.py
│   │           │   │   │   ├── tags.py
│   │           │   │   │   ├── utils.py
│   │           │   │   │   └── version.py
│   │           │   │   ├── pkg_resources
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   └── __pycache__
│   │           │   │   │       └── __init__.cpython-312.pyc
│   │           │   │   ├── platformdirs
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   ├── android.cpython-312.pyc
│   │           │   │   │   │   ├── api.cpython-312.pyc
│   │           │   │   │   │   ├── macos.cpython-312.pyc
│   │           │   │   │   │   ├── unix.cpython-312.pyc
│   │           │   │   │   │   ├── version.cpython-312.pyc
│   │           │   │   │   │   └── windows.cpython-312.pyc
│   │           │   │   │   ├── android.py
│   │           │   │   │   ├── api.py
│   │           │   │   │   ├── macos.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── unix.py
│   │           │   │   │   ├── version.py
│   │           │   │   │   └── windows.py
│   │           │   │   ├── pygments
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   ├── cmdline.cpython-312.pyc
│   │           │   │   │   │   ├── console.cpython-312.pyc
│   │           │   │   │   │   ├── filter.cpython-312.pyc
│   │           │   │   │   │   ├── formatter.cpython-312.pyc
│   │           │   │   │   │   ├── lexer.cpython-312.pyc
│   │           │   │   │   │   ├── modeline.cpython-312.pyc
│   │           │   │   │   │   ├── plugin.cpython-312.pyc
│   │           │   │   │   │   ├── regexopt.cpython-312.pyc
│   │           │   │   │   │   ├── scanner.cpython-312.pyc
│   │           │   │   │   │   ├── sphinxext.cpython-312.pyc
│   │           │   │   │   │   ├── style.cpython-312.pyc
│   │           │   │   │   │   ├── token.cpython-312.pyc
│   │           │   │   │   │   ├── unistring.cpython-312.pyc
│   │           │   │   │   │   └── util.cpython-312.pyc
│   │           │   │   │   ├── cmdline.py
│   │           │   │   │   ├── console.py
│   │           │   │   │   ├── filter.py
│   │           │   │   │   ├── filters
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   └── __pycache__
│   │           │   │   │   │       └── __init__.cpython-312.pyc
│   │           │   │   │   ├── formatter.py
│   │           │   │   │   ├── formatters
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── _mapping.cpython-312.pyc
│   │           │   │   │   │   │   ├── bbcode.cpython-312.pyc
│   │           │   │   │   │   │   ├── groff.cpython-312.pyc
│   │           │   │   │   │   │   ├── html.cpython-312.pyc
│   │           │   │   │   │   │   ├── img.cpython-312.pyc
│   │           │   │   │   │   │   ├── irc.cpython-312.pyc
│   │           │   │   │   │   │   ├── latex.cpython-312.pyc
│   │           │   │   │   │   │   ├── other.cpython-312.pyc
│   │           │   │   │   │   │   ├── pangomarkup.cpython-312.pyc
│   │           │   │   │   │   │   ├── rtf.cpython-312.pyc
│   │           │   │   │   │   │   ├── svg.cpython-312.pyc
│   │           │   │   │   │   │   ├── terminal.cpython-312.pyc
│   │           │   │   │   │   │   └── terminal256.cpython-312.pyc
│   │           │   │   │   │   ├── _mapping.py
│   │           │   │   │   │   ├── bbcode.py
│   │           │   │   │   │   ├── groff.py
│   │           │   │   │   │   ├── html.py
│   │           │   │   │   │   ├── img.py
│   │           │   │   │   │   ├── irc.py
│   │           │   │   │   │   ├── latex.py
│   │           │   │   │   │   ├── other.py
│   │           │   │   │   │   ├── pangomarkup.py
│   │           │   │   │   │   ├── rtf.py
│   │           │   │   │   │   ├── svg.py
│   │           │   │   │   │   ├── terminal.py
│   │           │   │   │   │   └── terminal256.py
│   │           │   │   │   ├── lexer.py
│   │           │   │   │   ├── lexers
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── _mapping.cpython-312.pyc
│   │           │   │   │   │   │   └── python.cpython-312.pyc
│   │           │   │   │   │   ├── _mapping.py
│   │           │   │   │   │   └── python.py
│   │           │   │   │   ├── modeline.py
│   │           │   │   │   ├── plugin.py
│   │           │   │   │   ├── regexopt.py
│   │           │   │   │   ├── scanner.py
│   │           │   │   │   ├── sphinxext.py
│   │           │   │   │   ├── style.py
│   │           │   │   │   ├── styles
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   └── _mapping.cpython-312.pyc
│   │           │   │   │   │   └── _mapping.py
│   │           │   │   │   ├── token.py
│   │           │   │   │   ├── unistring.py
│   │           │   │   │   └── util.py
│   │           │   │   ├── pyproject_hooks
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _compat.cpython-312.pyc
│   │           │   │   │   │   └── _impl.cpython-312.pyc
│   │           │   │   │   ├── _compat.py
│   │           │   │   │   ├── _impl.py
│   │           │   │   │   └── _in_process
│   │           │   │   │       ├── __init__.py
│   │           │   │   │       ├── __pycache__
│   │           │   │   │       │   ├── __init__.cpython-312.pyc
│   │           │   │   │       │   └── _in_process.cpython-312.pyc
│   │           │   │   │       └── _in_process.py
│   │           │   │   ├── requests
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __version__.cpython-312.pyc
│   │           │   │   │   │   ├── _internal_utils.cpython-312.pyc
│   │           │   │   │   │   ├── adapters.cpython-312.pyc
│   │           │   │   │   │   ├── api.cpython-312.pyc
│   │           │   │   │   │   ├── auth.cpython-312.pyc
│   │           │   │   │   │   ├── certs.cpython-312.pyc
│   │           │   │   │   │   ├── compat.cpython-312.pyc
│   │           │   │   │   │   ├── cookies.cpython-312.pyc
│   │           │   │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   │   ├── help.cpython-312.pyc
│   │           │   │   │   │   ├── hooks.cpython-312.pyc
│   │           │   │   │   │   ├── models.cpython-312.pyc
│   │           │   │   │   │   ├── packages.cpython-312.pyc
│   │           │   │   │   │   ├── sessions.cpython-312.pyc
│   │           │   │   │   │   ├── status_codes.cpython-312.pyc
│   │           │   │   │   │   ├── structures.cpython-312.pyc
│   │           │   │   │   │   └── utils.cpython-312.pyc
│   │           │   │   │   ├── __version__.py
│   │           │   │   │   ├── _internal_utils.py
│   │           │   │   │   ├── adapters.py
│   │           │   │   │   ├── api.py
│   │           │   │   │   ├── auth.py
│   │           │   │   │   ├── certs.py
│   │           │   │   │   ├── compat.py
│   │           │   │   │   ├── cookies.py
│   │           │   │   │   ├── exceptions.py
│   │           │   │   │   ├── help.py
│   │           │   │   │   ├── hooks.py
│   │           │   │   │   ├── models.py
│   │           │   │   │   ├── packages.py
│   │           │   │   │   ├── sessions.py
│   │           │   │   │   ├── status_codes.py
│   │           │   │   │   ├── structures.py
│   │           │   │   │   └── utils.py
│   │           │   │   ├── resolvelib
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── providers.cpython-312.pyc
│   │           │   │   │   │   ├── reporters.cpython-312.pyc
│   │           │   │   │   │   ├── resolvers.cpython-312.pyc
│   │           │   │   │   │   └── structs.cpython-312.pyc
│   │           │   │   │   ├── compat
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   └── collections_abc.cpython-312.pyc
│   │           │   │   │   │   └── collections_abc.py
│   │           │   │   │   ├── providers.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── reporters.py
│   │           │   │   │   ├── resolvers.py
│   │           │   │   │   └── structs.py
│   │           │   │   ├── rich
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   ├── _cell_widths.cpython-312.pyc
│   │           │   │   │   │   ├── _emoji_codes.cpython-312.pyc
│   │           │   │   │   │   ├── _emoji_replace.cpython-312.pyc
│   │           │   │   │   │   ├── _export_format.cpython-312.pyc
│   │           │   │   │   │   ├── _extension.cpython-312.pyc
│   │           │   │   │   │   ├── _fileno.cpython-312.pyc
│   │           │   │   │   │   ├── _inspect.cpython-312.pyc
│   │           │   │   │   │   ├── _log_render.cpython-312.pyc
│   │           │   │   │   │   ├── _loop.cpython-312.pyc
│   │           │   │   │   │   ├── _null_file.cpython-312.pyc
│   │           │   │   │   │   ├── _palettes.cpython-312.pyc
│   │           │   │   │   │   ├── _pick.cpython-312.pyc
│   │           │   │   │   │   ├── _ratio.cpython-312.pyc
│   │           │   │   │   │   ├── _spinners.cpython-312.pyc
│   │           │   │   │   │   ├── _stack.cpython-312.pyc
│   │           │   │   │   │   ├── _timer.cpython-312.pyc
│   │           │   │   │   │   ├── _win32_console.cpython-312.pyc
│   │           │   │   │   │   ├── _windows_renderer.cpython-312.pyc
│   │           │   │   │   │   ├── _windows.cpython-312.pyc
│   │           │   │   │   │   ├── _wrap.cpython-312.pyc
│   │           │   │   │   │   ├── abc.cpython-312.pyc
│   │           │   │   │   │   ├── align.cpython-312.pyc
│   │           │   │   │   │   ├── ansi.cpython-312.pyc
│   │           │   │   │   │   ├── bar.cpython-312.pyc
│   │           │   │   │   │   ├── box.cpython-312.pyc
│   │           │   │   │   │   ├── cells.cpython-312.pyc
│   │           │   │   │   │   ├── color_triplet.cpython-312.pyc
│   │           │   │   │   │   ├── color.cpython-312.pyc
│   │           │   │   │   │   ├── columns.cpython-312.pyc
│   │           │   │   │   │   ├── console.cpython-312.pyc
│   │           │   │   │   │   ├── constrain.cpython-312.pyc
│   │           │   │   │   │   ├── containers.cpython-312.pyc
│   │           │   │   │   │   ├── control.cpython-312.pyc
│   │           │   │   │   │   ├── default_styles.cpython-312.pyc
│   │           │   │   │   │   ├── diagnose.cpython-312.pyc
│   │           │   │   │   │   ├── emoji.cpython-312.pyc
│   │           │   │   │   │   ├── errors.cpython-312.pyc
│   │           │   │   │   │   ├── file_proxy.cpython-312.pyc
│   │           │   │   │   │   ├── filesize.cpython-312.pyc
│   │           │   │   │   │   ├── highlighter.cpython-312.pyc
│   │           │   │   │   │   ├── json.cpython-312.pyc
│   │           │   │   │   │   ├── jupyter.cpython-312.pyc
│   │           │   │   │   │   ├── layout.cpython-312.pyc
│   │           │   │   │   │   ├── live_render.cpython-312.pyc
│   │           │   │   │   │   ├── live.cpython-312.pyc
│   │           │   │   │   │   ├── logging.cpython-312.pyc
│   │           │   │   │   │   ├── markup.cpython-312.pyc
│   │           │   │   │   │   ├── measure.cpython-312.pyc
│   │           │   │   │   │   ├── padding.cpython-312.pyc
│   │           │   │   │   │   ├── pager.cpython-312.pyc
│   │           │   │   │   │   ├── palette.cpython-312.pyc
│   │           │   │   │   │   ├── panel.cpython-312.pyc
│   │           │   │   │   │   ├── pretty.cpython-312.pyc
│   │           │   │   │   │   ├── progress_bar.cpython-312.pyc
│   │           │   │   │   │   ├── progress.cpython-312.pyc
│   │           │   │   │   │   ├── prompt.cpython-312.pyc
│   │           │   │   │   │   ├── protocol.cpython-312.pyc
│   │           │   │   │   │   ├── region.cpython-312.pyc
│   │           │   │   │   │   ├── repr.cpython-312.pyc
│   │           │   │   │   │   ├── rule.cpython-312.pyc
│   │           │   │   │   │   ├── scope.cpython-312.pyc
│   │           │   │   │   │   ├── screen.cpython-312.pyc
│   │           │   │   │   │   ├── segment.cpython-312.pyc
│   │           │   │   │   │   ├── spinner.cpython-312.pyc
│   │           │   │   │   │   ├── status.cpython-312.pyc
│   │           │   │   │   │   ├── style.cpython-312.pyc
│   │           │   │   │   │   ├── styled.cpython-312.pyc
│   │           │   │   │   │   ├── syntax.cpython-312.pyc
│   │           │   │   │   │   ├── table.cpython-312.pyc
│   │           │   │   │   │   ├── terminal_theme.cpython-312.pyc
│   │           │   │   │   │   ├── text.cpython-312.pyc
│   │           │   │   │   │   ├── theme.cpython-312.pyc
│   │           │   │   │   │   ├── themes.cpython-312.pyc
│   │           │   │   │   │   ├── traceback.cpython-312.pyc
│   │           │   │   │   │   └── tree.cpython-312.pyc
│   │           │   │   │   ├── _cell_widths.py
│   │           │   │   │   ├── _emoji_codes.py
│   │           │   │   │   ├── _emoji_replace.py
│   │           │   │   │   ├── _export_format.py
│   │           │   │   │   ├── _extension.py
│   │           │   │   │   ├── _fileno.py
│   │           │   │   │   ├── _inspect.py
│   │           │   │   │   ├── _log_render.py
│   │           │   │   │   ├── _loop.py
│   │           │   │   │   ├── _null_file.py
│   │           │   │   │   ├── _palettes.py
│   │           │   │   │   ├── _pick.py
│   │           │   │   │   ├── _ratio.py
│   │           │   │   │   ├── _spinners.py
│   │           │   │   │   ├── _stack.py
│   │           │   │   │   ├── _timer.py
│   │           │   │   │   ├── _win32_console.py
│   │           │   │   │   ├── _windows_renderer.py
│   │           │   │   │   ├── _windows.py
│   │           │   │   │   ├── _wrap.py
│   │           │   │   │   ├── abc.py
│   │           │   │   │   ├── align.py
│   │           │   │   │   ├── ansi.py
│   │           │   │   │   ├── bar.py
│   │           │   │   │   ├── box.py
│   │           │   │   │   ├── cells.py
│   │           │   │   │   ├── color_triplet.py
│   │           │   │   │   ├── color.py
│   │           │   │   │   ├── columns.py
│   │           │   │   │   ├── console.py
│   │           │   │   │   ├── constrain.py
│   │           │   │   │   ├── containers.py
│   │           │   │   │   ├── control.py
│   │           │   │   │   ├── default_styles.py
│   │           │   │   │   ├── diagnose.py
│   │           │   │   │   ├── emoji.py
│   │           │   │   │   ├── errors.py
│   │           │   │   │   ├── file_proxy.py
│   │           │   │   │   ├── filesize.py
│   │           │   │   │   ├── highlighter.py
│   │           │   │   │   ├── json.py
│   │           │   │   │   ├── jupyter.py
│   │           │   │   │   ├── layout.py
│   │           │   │   │   ├── live_render.py
│   │           │   │   │   ├── live.py
│   │           │   │   │   ├── logging.py
│   │           │   │   │   ├── markup.py
│   │           │   │   │   ├── measure.py
│   │           │   │   │   ├── padding.py
│   │           │   │   │   ├── pager.py
│   │           │   │   │   ├── palette.py
│   │           │   │   │   ├── panel.py
│   │           │   │   │   ├── pretty.py
│   │           │   │   │   ├── progress_bar.py
│   │           │   │   │   ├── progress.py
│   │           │   │   │   ├── prompt.py
│   │           │   │   │   ├── protocol.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── region.py
│   │           │   │   │   ├── repr.py
│   │           │   │   │   ├── rule.py
│   │           │   │   │   ├── scope.py
│   │           │   │   │   ├── screen.py
│   │           │   │   │   ├── segment.py
│   │           │   │   │   ├── spinner.py
│   │           │   │   │   ├── status.py
│   │           │   │   │   ├── style.py
│   │           │   │   │   ├── styled.py
│   │           │   │   │   ├── syntax.py
│   │           │   │   │   ├── table.py
│   │           │   │   │   ├── terminal_theme.py
│   │           │   │   │   ├── text.py
│   │           │   │   │   ├── theme.py
│   │           │   │   │   ├── themes.py
│   │           │   │   │   ├── traceback.py
│   │           │   │   │   └── tree.py
│   │           │   │   ├── tomli
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _parser.cpython-312.pyc
│   │           │   │   │   │   ├── _re.cpython-312.pyc
│   │           │   │   │   │   └── _types.cpython-312.pyc
│   │           │   │   │   ├── _parser.py
│   │           │   │   │   ├── _re.py
│   │           │   │   │   ├── _types.py
│   │           │   │   │   └── py.typed
│   │           │   │   ├── truststore
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _api.cpython-312.pyc
│   │           │   │   │   │   ├── _macos.cpython-312.pyc
│   │           │   │   │   │   ├── _openssl.cpython-312.pyc
│   │           │   │   │   │   ├── _ssl_constants.cpython-312.pyc
│   │           │   │   │   │   └── _windows.cpython-312.pyc
│   │           │   │   │   ├── _api.py
│   │           │   │   │   ├── _macos.py
│   │           │   │   │   ├── _openssl.py
│   │           │   │   │   ├── _ssl_constants.py
│   │           │   │   │   ├── _windows.py
│   │           │   │   │   └── py.typed
│   │           │   │   ├── typing_extensions.py
│   │           │   │   ├── urllib3
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _collections.cpython-312.pyc
│   │           │   │   │   │   ├── _version.cpython-312.pyc
│   │           │   │   │   │   ├── connection.cpython-312.pyc
│   │           │   │   │   │   ├── connectionpool.cpython-312.pyc
│   │           │   │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   │   ├── fields.cpython-312.pyc
│   │           │   │   │   │   ├── filepost.cpython-312.pyc
│   │           │   │   │   │   ├── poolmanager.cpython-312.pyc
│   │           │   │   │   │   ├── request.cpython-312.pyc
│   │           │   │   │   │   └── response.cpython-312.pyc
│   │           │   │   │   ├── _collections.py
│   │           │   │   │   ├── _version.py
│   │           │   │   │   ├── connection.py
│   │           │   │   │   ├── connectionpool.py
│   │           │   │   │   ├── contrib
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── _appengine_environ.cpython-312.pyc
│   │           │   │   │   │   │   ├── appengine.cpython-312.pyc
│   │           │   │   │   │   │   ├── ntlmpool.cpython-312.pyc
│   │           │   │   │   │   │   ├── pyopenssl.cpython-312.pyc
│   │           │   │   │   │   │   ├── securetransport.cpython-312.pyc
│   │           │   │   │   │   │   └── socks.cpython-312.pyc
│   │           │   │   │   │   ├── _appengine_environ.py
│   │           │   │   │   │   ├── _securetransport
│   │           │   │   │   │   │   ├── __init__.py
│   │           │   │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   │   ├── bindings.cpython-312.pyc
│   │           │   │   │   │   │   │   └── low_level.cpython-312.pyc
│   │           │   │   │   │   │   ├── bindings.py
│   │           │   │   │   │   │   └── low_level.py
│   │           │   │   │   │   ├── appengine.py
│   │           │   │   │   │   ├── ntlmpool.py
│   │           │   │   │   │   ├── pyopenssl.py
│   │           │   │   │   │   ├── securetransport.py
│   │           │   │   │   │   └── socks.py
│   │           │   │   │   ├── exceptions.py
│   │           │   │   │   ├── fields.py
│   │           │   │   │   ├── filepost.py
│   │           │   │   │   ├── packages
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   └── six.cpython-312.pyc
│   │           │   │   │   │   ├── backports
│   │           │   │   │   │   │   ├── __init__.py
│   │           │   │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   │   ├── makefile.cpython-312.pyc
│   │           │   │   │   │   │   │   └── weakref_finalize.cpython-312.pyc
│   │           │   │   │   │   │   ├── makefile.py
│   │           │   │   │   │   │   └── weakref_finalize.py
│   │           │   │   │   │   └── six.py
│   │           │   │   │   ├── poolmanager.py
│   │           │   │   │   ├── request.py
│   │           │   │   │   ├── response.py
│   │           │   │   │   └── util
│   │           │   │   │       ├── __init__.py
│   │           │   │   │       ├── __pycache__
│   │           │   │   │       │   ├── __init__.cpython-312.pyc
│   │           │   │   │       │   ├── connection.cpython-312.pyc
│   │           │   │   │       │   ├── proxy.cpython-312.pyc
│   │           │   │   │       │   ├── queue.cpython-312.pyc
│   │           │   │   │       │   ├── request.cpython-312.pyc
│   │           │   │   │       │   ├── response.cpython-312.pyc
│   │           │   │   │       │   ├── retry.cpython-312.pyc
│   │           │   │   │       │   ├── ssl_.cpython-312.pyc
│   │           │   │   │       │   ├── ssl_match_hostname.cpython-312.pyc
│   │           │   │   │       │   ├── ssltransport.cpython-312.pyc
│   │           │   │   │       │   ├── timeout.cpython-312.pyc
│   │           │   │   │       │   ├── url.cpython-312.pyc
│   │           │   │   │       │   └── wait.cpython-312.pyc
│   │           │   │   │       ├── connection.py
│   │           │   │   │       ├── proxy.py
│   │           │   │   │       ├── queue.py
│   │           │   │   │       ├── request.py
│   │           │   │   │       ├── response.py
│   │           │   │   │       ├── retry.py
│   │           │   │   │       ├── ssl_.py
│   │           │   │   │       ├── ssl_match_hostname.py
│   │           │   │   │       ├── ssltransport.py
│   │           │   │   │       ├── timeout.py
│   │           │   │   │       ├── url.py
│   │           │   │   │       └── wait.py
│   │           │   │   └── vendor.txt
│   │           │   └── py.typed
│   │           ├── pip-24.2.dist-info
│   │           │   ├── AUTHORS.txt
│   │           │   ├── entry_points.txt
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── requests
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __version__.cpython-312.pyc
│   │           │   │   ├── _internal_utils.cpython-312.pyc
│   │           │   │   ├── adapters.cpython-312.pyc
│   │           │   │   ├── api.cpython-312.pyc
│   │           │   │   ├── auth.cpython-312.pyc
│   │           │   │   ├── certs.cpython-312.pyc
│   │           │   │   ├── compat.cpython-312.pyc
│   │           │   │   ├── cookies.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── help.cpython-312.pyc
│   │           │   │   ├── hooks.cpython-312.pyc
│   │           │   │   ├── models.cpython-312.pyc
│   │           │   │   ├── packages.cpython-312.pyc
│   │           │   │   ├── sessions.cpython-312.pyc
│   │           │   │   ├── status_codes.cpython-312.pyc
│   │           │   │   ├── structures.cpython-312.pyc
│   │           │   │   └── utils.cpython-312.pyc
│   │           │   ├── __version__.py
│   │           │   ├── _internal_utils.py
│   │           │   ├── adapters.py
│   │           │   ├── api.py
│   │           │   ├── auth.py
│   │           │   ├── certs.py
│   │           │   ├── compat.py
│   │           │   ├── cookies.py
│   │           │   ├── exceptions.py
│   │           │   ├── help.py
│   │           │   ├── hooks.py
│   │           │   ├── models.py
│   │           │   ├── packages.py
│   │           │   ├── sessions.py
│   │           │   ├── status_codes.py
│   │           │   ├── structures.py
│   │           │   └── utils.py
│   │           ├── requests-2.32.3.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── soupsieve
│   │           │   ├── __init__.py
│   │           │   ├── __meta__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __meta__.cpython-312.pyc
│   │           │   │   ├── css_match.cpython-312.pyc
│   │           │   │   ├── css_parser.cpython-312.pyc
│   │           │   │   ├── css_types.cpython-312.pyc
│   │           │   │   ├── pretty.cpython-312.pyc
│   │           │   │   └── util.cpython-312.pyc
│   │           │   ├── css_match.py
│   │           │   ├── css_parser.py
│   │           │   ├── css_types.py
│   │           │   ├── pretty.py
│   │           │   ├── py.typed
│   │           │   └── util.py
│   │           ├── soupsieve-2.6.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── licenses
│   │           │   │   └── LICENSE.md
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── urllib3
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _base_connection.cpython-312.pyc
│   │           │   │   ├── _collections.cpython-312.pyc
│   │           │   │   ├── _request_methods.cpython-312.pyc
│   │           │   │   ├── _version.cpython-312.pyc
│   │           │   │   ├── connection.cpython-312.pyc
│   │           │   │   ├── connectionpool.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── fields.cpython-312.pyc
│   │           │   │   ├── filepost.cpython-312.pyc
│   │           │   │   ├── poolmanager.cpython-312.pyc
│   │           │   │   └── response.cpython-312.pyc
│   │           │   ├── _base_connection.py
│   │           │   ├── _collections.py
│   │           │   ├── _request_methods.py
│   │           │   ├── _version.py
│   │           │   ├── connection.py
│   │           │   ├── connectionpool.py
│   │           │   ├── contrib
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── pyopenssl.cpython-312.pyc
│   │           │   │   │   └── socks.cpython-312.pyc
│   │           │   │   ├── emscripten
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── connection.cpython-312.pyc
│   │           │   │   │   │   ├── fetch.cpython-312.pyc
│   │           │   │   │   │   ├── request.cpython-312.pyc
│   │           │   │   │   │   └── response.cpython-312.pyc
│   │           │   │   │   ├── connection.py
│   │           │   │   │   ├── emscripten_fetch_worker.js
│   │           │   │   │   ├── fetch.py
│   │           │   │   │   ├── request.py
│   │           │   │   │   └── response.py
│   │           │   │   ├── pyopenssl.py
│   │           │   │   └── socks.py
│   │           │   ├── exceptions.py
│   │           │   ├── fields.py
│   │           │   ├── filepost.py
│   │           │   ├── http2
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── connection.cpython-312.pyc
│   │           │   │   │   └── probe.cpython-312.pyc
│   │           │   │   ├── connection.py
│   │           │   │   └── probe.py
│   │           │   ├── poolmanager.py
│   │           │   ├── py.typed
│   │           │   ├── response.py
│   │           │   └── util
│   │           │       ├── __init__.py
│   │           │       ├── __pycache__
│   │           │       │   ├── __init__.cpython-312.pyc
│   │           │       │   ├── connection.cpython-312.pyc
│   │           │       │   ├── proxy.cpython-312.pyc
│   │           │       │   ├── request.cpython-312.pyc
│   │           │       │   ├── response.cpython-312.pyc
│   │           │       │   ├── retry.cpython-312.pyc
│   │           │       │   ├── ssl_.cpython-312.pyc
│   │           │       │   ├── ssl_match_hostname.cpython-312.pyc
│   │           │       │   ├── ssltransport.cpython-312.pyc
│   │           │       │   ├── timeout.cpython-312.pyc
│   │           │       │   ├── url.cpython-312.pyc
│   │           │       │   ├── util.cpython-312.pyc
│   │           │       │   └── wait.cpython-312.pyc
│   │           │       ├── connection.py
│   │           │       ├── proxy.py
│   │           │       ├── request.py
│   │           │       ├── response.py
│   │           │       ├── retry.py
│   │           │       ├── ssl_.py
│   │           │       ├── ssl_match_hostname.py
│   │           │       ├── ssltransport.py
│   │           │       ├── timeout.py
│   │           │       ├── url.py
│   │           │       ├── util.py
│   │           │       └── wait.py
│   │           ├── urllib3-2.2.3.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── licenses
│   │           │   │   └── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── useragent
│   │           │   ├── __init__.py
│   │           │   ├── __init__.pyc
│   │           │   ├── __pycache__
│   │           │   │   └── __init__.cpython-312.pyc
│   │           │   ├── resources
│   │           │   │   └── user_agent_data.json
│   │           │   └── test
│   │           │       ├── __init__.py
│   │           │       ├── __pycache__
│   │           │       │   └── __init__.cpython-312.pyc
│   │           │       ├── test_additional_os.json
│   │           │       ├── test_browser.json
│   │           │       ├── test_device.json
│   │           │       ├── test_firefox.json
│   │           │       ├── test_os.json
│   │           │       └── test_pgts_browser.json
│   │           ├── useragent-0.1.1.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── werkzeug
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _internal.cpython-312.pyc
│   │           │   │   ├── _reloader.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── formparser.cpython-312.pyc
│   │           │   │   ├── http.cpython-312.pyc
│   │           │   │   ├── local.cpython-312.pyc
│   │           │   │   ├── security.cpython-312.pyc
│   │           │   │   ├── serving.cpython-312.pyc
│   │           │   │   ├── test.cpython-312.pyc
│   │           │   │   ├── testapp.cpython-312.pyc
│   │           │   │   ├── urls.cpython-312.pyc
│   │           │   │   ├── user_agent.cpython-312.pyc
│   │           │   │   ├── utils.cpython-312.pyc
│   │           │   │   └── wsgi.cpython-312.pyc
│   │           │   ├── _internal.py
│   │           │   ├── _reloader.py
│   │           │   ├── datastructures
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── accept.cpython-312.pyc
│   │           │   │   │   ├── auth.cpython-312.pyc
│   │           │   │   │   ├── cache_control.cpython-312.pyc
│   │           │   │   │   ├── csp.cpython-312.pyc
│   │           │   │   │   ├── etag.cpython-312.pyc
│   │           │   │   │   ├── file_storage.cpython-312.pyc
│   │           │   │   │   ├── headers.cpython-312.pyc
│   │           │   │   │   ├── mixins.cpython-312.pyc
│   │           │   │   │   ├── range.cpython-312.pyc
│   │           │   │   │   └── structures.cpython-312.pyc
│   │           │   │   ├── accept.py
│   │           │   │   ├── accept.pyi
│   │           │   │   ├── auth.py
│   │           │   │   ├── cache_control.py
│   │           │   │   ├── cache_control.pyi
│   │           │   │   ├── csp.py
│   │           │   │   ├── csp.pyi
│   │           │   │   ├── etag.py
│   │           │   │   ├── etag.pyi
│   │           │   │   ├── file_storage.py
│   │           │   │   ├── file_storage.pyi
│   │           │   │   ├── headers.py
│   │           │   │   ├── headers.pyi
│   │           │   │   ├── mixins.py
│   │           │   │   ├── mixins.pyi
│   │           │   │   ├── range.py
│   │           │   │   ├── range.pyi
│   │           │   │   ├── structures.py
│   │           │   │   └── structures.pyi
│   │           │   ├── debug
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── console.cpython-312.pyc
│   │           │   │   │   ├── repr.cpython-312.pyc
│   │           │   │   │   └── tbtools.cpython-312.pyc
│   │           │   │   ├── console.py
│   │           │   │   ├── repr.py
│   │           │   │   ├── shared
│   │           │   │   │   ├── console.png
│   │           │   │   │   ├── debugger.js
│   │           │   │   │   ├── ICON_LICENSE.md
│   │           │   │   │   ├── less.png
│   │           │   │   │   ├── more.png
│   │           │   │   │   └── style.css
│   │           │   │   └── tbtools.py
│   │           │   ├── exceptions.py
│   │           │   ├── formparser.py
│   │           │   ├── http.py
│   │           │   ├── local.py
│   │           │   ├── middleware
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── dispatcher.cpython-312.pyc
│   │           │   │   │   ├── http_proxy.cpython-312.pyc
│   │           │   │   │   ├── lint.cpython-312.pyc
│   │           │   │   │   ├── profiler.cpython-312.pyc
│   │           │   │   │   ├── proxy_fix.cpython-312.pyc
│   │           │   │   │   └── shared_data.cpython-312.pyc
│   │           │   │   ├── dispatcher.py
│   │           │   │   ├── http_proxy.py
│   │           │   │   ├── lint.py
│   │           │   │   ├── profiler.py
│   │           │   │   ├── proxy_fix.py
│   │           │   │   └── shared_data.py
│   │           │   ├── py.typed
│   │           │   ├── routing
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── converters.cpython-312.pyc
│   │           │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   ├── map.cpython-312.pyc
│   │           │   │   │   ├── matcher.cpython-312.pyc
│   │           │   │   │   └── rules.cpython-312.pyc
│   │           │   │   ├── converters.py
│   │           │   │   ├── exceptions.py
│   │           │   │   ├── map.py
│   │           │   │   ├── matcher.py
│   │           │   │   └── rules.py
│   │           │   ├── sansio
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── http.cpython-312.pyc
│   │           │   │   │   ├── multipart.cpython-312.pyc
│   │           │   │   │   ├── request.cpython-312.pyc
│   │           │   │   │   ├── response.cpython-312.pyc
│   │           │   │   │   └── utils.cpython-312.pyc
│   │           │   │   ├── http.py
│   │           │   │   ├── multipart.py
│   │           │   │   ├── request.py
│   │           │   │   ├── response.py
│   │           │   │   └── utils.py
│   │           │   ├── security.py
│   │           │   ├── serving.py
│   │           │   ├── test.py
│   │           │   ├── testapp.py
│   │           │   ├── urls.py
│   │           │   ├── user_agent.py
│   │           │   ├── utils.py
│   │           │   ├── wrappers
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── request.cpython-312.pyc
│   │           │   │   │   └── response.cpython-312.pyc
│   │           │   │   ├── request.py
│   │           │   │   └── response.py
│   │           │   └── wsgi.py
│   │           └── werkzeug-3.0.4.dist-info
│   │               ├── INSTALLER
│   │               ├── LICENSE.txt
│   │               ├── METADATA
│   │               ├── RECORD
│   │               └── WHEEL
│   ├── pyvenv.cfg
│   ├── static
│   │   └── styles.css
│   ├── templates
│   │   └── index.html
│   └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
    ├── text1.txt
    └── text2.txt
```

# Files

--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py:
--------------------------------------------------------------------------------

```python
  1 | from enum import IntEnum
  2 | from functools import lru_cache
  3 | from itertools import filterfalse
  4 | from logging import getLogger
  5 | from operator import attrgetter
  6 | from typing import (
  7 |     TYPE_CHECKING,
  8 |     Dict,
  9 |     Iterable,
 10 |     List,
 11 |     NamedTuple,
 12 |     Optional,
 13 |     Sequence,
 14 |     Tuple,
 15 |     Type,
 16 |     Union,
 17 | )
 18 | 
 19 | from .cells import (
 20 |     _is_single_cell_widths,
 21 |     cached_cell_len,
 22 |     cell_len,
 23 |     get_character_cell_size,
 24 |     set_cell_size,
 25 | )
 26 | from .repr import Result, rich_repr
 27 | from .style import Style
 28 | 
 29 | if TYPE_CHECKING:
 30 |     from .console import Console, ConsoleOptions, RenderResult
 31 | 
 32 | log = getLogger("rich")
 33 | 
 34 | 
 35 | class ControlType(IntEnum):
 36 |     """Non-printable control codes which typically translate to ANSI codes."""
 37 | 
 38 |     BELL = 1
 39 |     CARRIAGE_RETURN = 2
 40 |     HOME = 3
 41 |     CLEAR = 4
 42 |     SHOW_CURSOR = 5
 43 |     HIDE_CURSOR = 6
 44 |     ENABLE_ALT_SCREEN = 7
 45 |     DISABLE_ALT_SCREEN = 8
 46 |     CURSOR_UP = 9
 47 |     CURSOR_DOWN = 10
 48 |     CURSOR_FORWARD = 11
 49 |     CURSOR_BACKWARD = 12
 50 |     CURSOR_MOVE_TO_COLUMN = 13
 51 |     CURSOR_MOVE_TO = 14
 52 |     ERASE_IN_LINE = 15
 53 |     SET_WINDOW_TITLE = 16
 54 | 
 55 | 
 56 | ControlCode = Union[
 57 |     Tuple[ControlType],
 58 |     Tuple[ControlType, Union[int, str]],
 59 |     Tuple[ControlType, int, int],
 60 | ]
 61 | 
 62 | 
 63 | @rich_repr()
 64 | class Segment(NamedTuple):
 65 |     """A piece of text with associated style. Segments are produced by the Console render process and
 66 |     are ultimately converted in to strings to be written to the terminal.
 67 | 
 68 |     Args:
 69 |         text (str): A piece of text.
 70 |         style (:class:`~rich.style.Style`, optional): An optional style to apply to the text.
 71 |         control (Tuple[ControlCode], optional): Optional sequence of control codes.
 72 | 
 73 |     Attributes:
 74 |         cell_length (int): The cell length of this Segment.
 75 |     """
 76 | 
 77 |     text: str
 78 |     style: Optional[Style] = None
 79 |     control: Optional[Sequence[ControlCode]] = None
 80 | 
 81 |     @property
 82 |     def cell_length(self) -> int:
 83 |         """The number of terminal cells required to display self.text.
 84 | 
 85 |         Returns:
 86 |             int: A number of cells.
 87 |         """
 88 |         text, _style, control = self
 89 |         return 0 if control else cell_len(text)
 90 | 
 91 |     def __rich_repr__(self) -> Result:
 92 |         yield self.text
 93 |         if self.control is None:
 94 |             if self.style is not None:
 95 |                 yield self.style
 96 |         else:
 97 |             yield self.style
 98 |             yield self.control
 99 | 
100 |     def __bool__(self) -> bool:
101 |         """Check if the segment contains text."""
102 |         return bool(self.text)
103 | 
104 |     @property
105 |     def is_control(self) -> bool:
106 |         """Check if the segment contains control codes."""
107 |         return self.control is not None
108 | 
109 |     @classmethod
110 |     @lru_cache(1024 * 16)
111 |     def _split_cells(cls, segment: "Segment", cut: int) -> Tuple["Segment", "Segment"]:
112 |         text, style, control = segment
113 |         _Segment = Segment
114 | 
115 |         cell_length = segment.cell_length
116 |         if cut >= cell_length:
117 |             return segment, _Segment("", style, control)
118 | 
119 |         cell_size = get_character_cell_size
120 | 
121 |         pos = int((cut / cell_length) * (len(text) - 1))
122 | 
123 |         before = text[:pos]
124 |         cell_pos = cell_len(before)
125 |         if cell_pos == cut:
126 |             return (
127 |                 _Segment(before, style, control),
128 |                 _Segment(text[pos:], style, control),
129 |             )
130 |         while pos < len(text):
131 |             char = text[pos]
132 |             pos += 1
133 |             cell_pos += cell_size(char)
134 |             before = text[:pos]
135 |             if cell_pos == cut:
136 |                 return (
137 |                     _Segment(before, style, control),
138 |                     _Segment(text[pos:], style, control),
139 |                 )
140 |             if cell_pos > cut:
141 |                 return (
142 |                     _Segment(before[: pos - 1] + " ", style, control),
143 |                     _Segment(" " + text[pos:], style, control),
144 |                 )
145 | 
146 |         raise AssertionError("Will never reach here")
147 | 
148 |     def split_cells(self, cut: int) -> Tuple["Segment", "Segment"]:
149 |         """Split segment in to two segments at the specified column.
150 | 
151 |         If the cut point falls in the middle of a 2-cell wide character then it is replaced
152 |         by two spaces, to preserve the display width of the parent segment.
153 | 
154 |         Returns:
155 |             Tuple[Segment, Segment]: Two segments.
156 |         """
157 |         text, style, control = self
158 | 
159 |         if _is_single_cell_widths(text):
160 |             # Fast path with all 1 cell characters
161 |             if cut >= len(text):
162 |                 return self, Segment("", style, control)
163 |             return (
164 |                 Segment(text[:cut], style, control),
165 |                 Segment(text[cut:], style, control),
166 |             )
167 | 
168 |         return self._split_cells(self, cut)
169 | 
170 |     @classmethod
171 |     def line(cls) -> "Segment":
172 |         """Make a new line segment."""
173 |         return cls("\n")
174 | 
175 |     @classmethod
176 |     def apply_style(
177 |         cls,
178 |         segments: Iterable["Segment"],
179 |         style: Optional[Style] = None,
180 |         post_style: Optional[Style] = None,
181 |     ) -> Iterable["Segment"]:
182 |         """Apply style(s) to an iterable of segments.
183 | 
184 |         Returns an iterable of segments where the style is replaced by ``style + segment.style + post_style``.
185 | 
186 |         Args:
187 |             segments (Iterable[Segment]): Segments to process.
188 |             style (Style, optional): Base style. Defaults to None.
189 |             post_style (Style, optional): Style to apply on top of segment style. Defaults to None.
190 | 
191 |         Returns:
192 |             Iterable[Segments]: A new iterable of segments (possibly the same iterable).
193 |         """
194 |         result_segments = segments
195 |         if style:
196 |             apply = style.__add__
197 |             result_segments = (
198 |                 cls(text, None if control else apply(_style), control)
199 |                 for text, _style, control in result_segments
200 |             )
201 |         if post_style:
202 |             result_segments = (
203 |                 cls(
204 |                     text,
205 |                     (
206 |                         None
207 |                         if control
208 |                         else (_style + post_style if _style else post_style)
209 |                     ),
210 |                     control,
211 |                 )
212 |                 for text, _style, control in result_segments
213 |             )
214 |         return result_segments
215 | 
216 |     @classmethod
217 |     def filter_control(
218 |         cls, segments: Iterable["Segment"], is_control: bool = False
219 |     ) -> Iterable["Segment"]:
220 |         """Filter segments by ``is_control`` attribute.
221 | 
222 |         Args:
223 |             segments (Iterable[Segment]): An iterable of Segment instances.
224 |             is_control (bool, optional): is_control flag to match in search.
225 | 
226 |         Returns:
227 |             Iterable[Segment]: And iterable of Segment instances.
228 | 
229 |         """
230 |         if is_control:
231 |             return filter(attrgetter("control"), segments)
232 |         else:
233 |             return filterfalse(attrgetter("control"), segments)
234 | 
235 |     @classmethod
236 |     def split_lines(cls, segments: Iterable["Segment"]) -> Iterable[List["Segment"]]:
237 |         """Split a sequence of segments in to a list of lines.
238 | 
239 |         Args:
240 |             segments (Iterable[Segment]): Segments potentially containing line feeds.
241 | 
242 |         Yields:
243 |             Iterable[List[Segment]]: Iterable of segment lists, one per line.
244 |         """
245 |         line: List[Segment] = []
246 |         append = line.append
247 | 
248 |         for segment in segments:
249 |             if "\n" in segment.text and not segment.control:
250 |                 text, style, _ = segment
251 |                 while text:
252 |                     _text, new_line, text = text.partition("\n")
253 |                     if _text:
254 |                         append(cls(_text, style))
255 |                     if new_line:
256 |                         yield line
257 |                         line = []
258 |                         append = line.append
259 |             else:
260 |                 append(segment)
261 |         if line:
262 |             yield line
263 | 
264 |     @classmethod
265 |     def split_and_crop_lines(
266 |         cls,
267 |         segments: Iterable["Segment"],
268 |         length: int,
269 |         style: Optional[Style] = None,
270 |         pad: bool = True,
271 |         include_new_lines: bool = True,
272 |     ) -> Iterable[List["Segment"]]:
273 |         """Split segments in to lines, and crop lines greater than a given length.
274 | 
275 |         Args:
276 |             segments (Iterable[Segment]): An iterable of segments, probably
277 |                 generated from console.render.
278 |             length (int): Desired line length.
279 |             style (Style, optional): Style to use for any padding.
280 |             pad (bool): Enable padding of lines that are less than `length`.
281 | 
282 |         Returns:
283 |             Iterable[List[Segment]]: An iterable of lines of segments.
284 |         """
285 |         line: List[Segment] = []
286 |         append = line.append
287 | 
288 |         adjust_line_length = cls.adjust_line_length
289 |         new_line_segment = cls("\n")
290 | 
291 |         for segment in segments:
292 |             if "\n" in segment.text and not segment.control:
293 |                 text, segment_style, _ = segment
294 |                 while text:
295 |                     _text, new_line, text = text.partition("\n")
296 |                     if _text:
297 |                         append(cls(_text, segment_style))
298 |                     if new_line:
299 |                         cropped_line = adjust_line_length(
300 |                             line, length, style=style, pad=pad
301 |                         )
302 |                         if include_new_lines:
303 |                             cropped_line.append(new_line_segment)
304 |                         yield cropped_line
305 |                         line.clear()
306 |             else:
307 |                 append(segment)
308 |         if line:
309 |             yield adjust_line_length(line, length, style=style, pad=pad)
310 | 
311 |     @classmethod
312 |     def adjust_line_length(
313 |         cls,
314 |         line: List["Segment"],
315 |         length: int,
316 |         style: Optional[Style] = None,
317 |         pad: bool = True,
318 |     ) -> List["Segment"]:
319 |         """Adjust a line to a given width (cropping or padding as required).
320 | 
321 |         Args:
322 |             segments (Iterable[Segment]): A list of segments in a single line.
323 |             length (int): The desired width of the line.
324 |             style (Style, optional): The style of padding if used (space on the end). Defaults to None.
325 |             pad (bool, optional): Pad lines with spaces if they are shorter than `length`. Defaults to True.
326 | 
327 |         Returns:
328 |             List[Segment]: A line of segments with the desired length.
329 |         """
330 |         line_length = sum(segment.cell_length for segment in line)
331 |         new_line: List[Segment]
332 | 
333 |         if line_length < length:
334 |             if pad:
335 |                 new_line = line + [cls(" " * (length - line_length), style)]
336 |             else:
337 |                 new_line = line[:]
338 |         elif line_length > length:
339 |             new_line = []
340 |             append = new_line.append
341 |             line_length = 0
342 |             for segment in line:
343 |                 segment_length = segment.cell_length
344 |                 if line_length + segment_length < length or segment.control:
345 |                     append(segment)
346 |                     line_length += segment_length
347 |                 else:
348 |                     text, segment_style, _ = segment
349 |                     text = set_cell_size(text, length - line_length)
350 |                     append(cls(text, segment_style))
351 |                     break
352 |         else:
353 |             new_line = line[:]
354 |         return new_line
355 | 
356 |     @classmethod
357 |     def get_line_length(cls, line: List["Segment"]) -> int:
358 |         """Get the length of list of segments.
359 | 
360 |         Args:
361 |             line (List[Segment]): A line encoded as a list of Segments (assumes no '\\\\n' characters),
362 | 
363 |         Returns:
364 |             int: The length of the line.
365 |         """
366 |         _cell_len = cell_len
367 |         return sum(_cell_len(text) for text, style, control in line if not control)
368 | 
369 |     @classmethod
370 |     def get_shape(cls, lines: List[List["Segment"]]) -> Tuple[int, int]:
371 |         """Get the shape (enclosing rectangle) of a list of lines.
372 | 
373 |         Args:
374 |             lines (List[List[Segment]]): A list of lines (no '\\\\n' characters).
375 | 
376 |         Returns:
377 |             Tuple[int, int]: Width and height in characters.
378 |         """
379 |         get_line_length = cls.get_line_length
380 |         max_width = max(get_line_length(line) for line in lines) if lines else 0
381 |         return (max_width, len(lines))
382 | 
383 |     @classmethod
384 |     def set_shape(
385 |         cls,
386 |         lines: List[List["Segment"]],
387 |         width: int,
388 |         height: Optional[int] = None,
389 |         style: Optional[Style] = None,
390 |         new_lines: bool = False,
391 |     ) -> List[List["Segment"]]:
392 |         """Set the shape of a list of lines (enclosing rectangle).
393 | 
394 |         Args:
395 |             lines (List[List[Segment]]): A list of lines.
396 |             width (int): Desired width.
397 |             height (int, optional): Desired height or None for no change.
398 |             style (Style, optional): Style of any padding added.
399 |             new_lines (bool, optional): Padded lines should include "\n". Defaults to False.
400 | 
401 |         Returns:
402 |             List[List[Segment]]: New list of lines.
403 |         """
404 |         _height = height or len(lines)
405 | 
406 |         blank = (
407 |             [cls(" " * width + "\n", style)] if new_lines else [cls(" " * width, style)]
408 |         )
409 | 
410 |         adjust_line_length = cls.adjust_line_length
411 |         shaped_lines = lines[:_height]
412 |         shaped_lines[:] = [
413 |             adjust_line_length(line, width, style=style) for line in lines
414 |         ]
415 |         if len(shaped_lines) < _height:
416 |             shaped_lines.extend([blank] * (_height - len(shaped_lines)))
417 |         return shaped_lines
418 | 
419 |     @classmethod
420 |     def align_top(
421 |         cls: Type["Segment"],
422 |         lines: List[List["Segment"]],
423 |         width: int,
424 |         height: int,
425 |         style: Style,
426 |         new_lines: bool = False,
427 |     ) -> List[List["Segment"]]:
428 |         """Aligns lines to top (adds extra lines to bottom as required).
429 | 
430 |         Args:
431 |             lines (List[List[Segment]]): A list of lines.
432 |             width (int): Desired width.
433 |             height (int, optional): Desired height or None for no change.
434 |             style (Style): Style of any padding added.
435 |             new_lines (bool, optional): Padded lines should include "\n". Defaults to False.
436 | 
437 |         Returns:
438 |             List[List[Segment]]: New list of lines.
439 |         """
440 |         extra_lines = height - len(lines)
441 |         if not extra_lines:
442 |             return lines[:]
443 |         lines = lines[:height]
444 |         blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style)
445 |         lines = lines + [[blank]] * extra_lines
446 |         return lines
447 | 
448 |     @classmethod
449 |     def align_bottom(
450 |         cls: Type["Segment"],
451 |         lines: List[List["Segment"]],
452 |         width: int,
453 |         height: int,
454 |         style: Style,
455 |         new_lines: bool = False,
456 |     ) -> List[List["Segment"]]:
457 |         """Aligns render to bottom (adds extra lines above as required).
458 | 
459 |         Args:
460 |             lines (List[List[Segment]]): A list of lines.
461 |             width (int): Desired width.
462 |             height (int, optional): Desired height or None for no change.
463 |             style (Style): Style of any padding added. Defaults to None.
464 |             new_lines (bool, optional): Padded lines should include "\n". Defaults to False.
465 | 
466 |         Returns:
467 |             List[List[Segment]]: New list of lines.
468 |         """
469 |         extra_lines = height - len(lines)
470 |         if not extra_lines:
471 |             return lines[:]
472 |         lines = lines[:height]
473 |         blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style)
474 |         lines = [[blank]] * extra_lines + lines
475 |         return lines
476 | 
477 |     @classmethod
478 |     def align_middle(
479 |         cls: Type["Segment"],
480 |         lines: List[List["Segment"]],
481 |         width: int,
482 |         height: int,
483 |         style: Style,
484 |         new_lines: bool = False,
485 |     ) -> List[List["Segment"]]:
486 |         """Aligns lines to middle (adds extra lines to above and below as required).
487 | 
488 |         Args:
489 |             lines (List[List[Segment]]): A list of lines.
490 |             width (int): Desired width.
491 |             height (int, optional): Desired height or None for no change.
492 |             style (Style): Style of any padding added.
493 |             new_lines (bool, optional): Padded lines should include "\n". Defaults to False.
494 | 
495 |         Returns:
496 |             List[List[Segment]]: New list of lines.
497 |         """
498 |         extra_lines = height - len(lines)
499 |         if not extra_lines:
500 |             return lines[:]
501 |         lines = lines[:height]
502 |         blank = cls(" " * width + "\n", style) if new_lines else cls(" " * width, style)
503 |         top_lines = extra_lines // 2
504 |         bottom_lines = extra_lines - top_lines
505 |         lines = [[blank]] * top_lines + lines + [[blank]] * bottom_lines
506 |         return lines
507 | 
508 |     @classmethod
509 |     def simplify(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]:
510 |         """Simplify an iterable of segments by combining contiguous segments with the same style.
511 | 
512 |         Args:
513 |             segments (Iterable[Segment]): An iterable of segments.
514 | 
515 |         Returns:
516 |             Iterable[Segment]: A possibly smaller iterable of segments that will render the same way.
517 |         """
518 |         iter_segments = iter(segments)
519 |         try:
520 |             last_segment = next(iter_segments)
521 |         except StopIteration:
522 |             return
523 | 
524 |         _Segment = Segment
525 |         for segment in iter_segments:
526 |             if last_segment.style == segment.style and not segment.control:
527 |                 last_segment = _Segment(
528 |                     last_segment.text + segment.text, last_segment.style
529 |                 )
530 |             else:
531 |                 yield last_segment
532 |                 last_segment = segment
533 |         yield last_segment
534 | 
535 |     @classmethod
536 |     def strip_links(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]:
537 |         """Remove all links from an iterable of styles.
538 | 
539 |         Args:
540 |             segments (Iterable[Segment]): An iterable segments.
541 | 
542 |         Yields:
543 |             Segment: Segments with link removed.
544 |         """
545 |         for segment in segments:
546 |             if segment.control or segment.style is None:
547 |                 yield segment
548 |             else:
549 |                 text, style, _control = segment
550 |                 yield cls(text, style.update_link(None) if style else None)
551 | 
552 |     @classmethod
553 |     def strip_styles(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]:
554 |         """Remove all styles from an iterable of segments.
555 | 
556 |         Args:
557 |             segments (Iterable[Segment]): An iterable segments.
558 | 
559 |         Yields:
560 |             Segment: Segments with styles replace with None
561 |         """
562 |         for text, _style, control in segments:
563 |             yield cls(text, None, control)
564 | 
565 |     @classmethod
566 |     def remove_color(cls, segments: Iterable["Segment"]) -> Iterable["Segment"]:
567 |         """Remove all color from an iterable of segments.
568 | 
569 |         Args:
570 |             segments (Iterable[Segment]): An iterable segments.
571 | 
572 |         Yields:
573 |             Segment: Segments with colorless style.
574 |         """
575 | 
576 |         cache: Dict[Style, Style] = {}
577 |         for text, style, control in segments:
578 |             if style:
579 |                 colorless_style = cache.get(style)
580 |                 if colorless_style is None:
581 |                     colorless_style = style.without_color
582 |                     cache[style] = colorless_style
583 |                 yield cls(text, colorless_style, control)
584 |             else:
585 |                 yield cls(text, None, control)
586 | 
587 |     @classmethod
588 |     def divide(
589 |         cls, segments: Iterable["Segment"], cuts: Iterable[int]
590 |     ) -> Iterable[List["Segment"]]:
591 |         """Divides an iterable of segments in to portions.
592 | 
593 |         Args:
594 |             cuts (Iterable[int]): Cell positions where to divide.
595 | 
596 |         Yields:
597 |             [Iterable[List[Segment]]]: An iterable of Segments in List.
598 |         """
599 |         split_segments: List["Segment"] = []
600 |         add_segment = split_segments.append
601 | 
602 |         iter_cuts = iter(cuts)
603 | 
604 |         while True:
605 |             cut = next(iter_cuts, -1)
606 |             if cut == -1:
607 |                 return []
608 |             if cut != 0:
609 |                 break
610 |             yield []
611 |         pos = 0
612 | 
613 |         segments_clear = split_segments.clear
614 |         segments_copy = split_segments.copy
615 | 
616 |         _cell_len = cached_cell_len
617 |         for segment in segments:
618 |             text, _style, control = segment
619 |             while text:
620 |                 end_pos = pos if control else pos + _cell_len(text)
621 |                 if end_pos < cut:
622 |                     add_segment(segment)
623 |                     pos = end_pos
624 |                     break
625 | 
626 |                 if end_pos == cut:
627 |                     add_segment(segment)
628 |                     yield segments_copy()
629 |                     segments_clear()
630 |                     pos = end_pos
631 | 
632 |                     cut = next(iter_cuts, -1)
633 |                     if cut == -1:
634 |                         if split_segments:
635 |                             yield segments_copy()
636 |                         return
637 | 
638 |                     break
639 | 
640 |                 else:
641 |                     before, segment = segment.split_cells(cut - pos)
642 |                     text, _style, control = segment
643 |                     add_segment(before)
644 |                     yield segments_copy()
645 |                     segments_clear()
646 |                     pos = cut
647 | 
648 |                 cut = next(iter_cuts, -1)
649 |                 if cut == -1:
650 |                     if split_segments:
651 |                         yield segments_copy()
652 |                     return
653 | 
654 |         yield segments_copy()
655 | 
656 | 
657 | class Segments:
658 |     """A simple renderable to render an iterable of segments. This class may be useful if
659 |     you want to print segments outside of a __rich_console__ method.
660 | 
661 |     Args:
662 |         segments (Iterable[Segment]): An iterable of segments.
663 |         new_lines (bool, optional): Add new lines between segments. Defaults to False.
664 |     """
665 | 
666 |     def __init__(self, segments: Iterable[Segment], new_lines: bool = False) -> None:
667 |         self.segments = list(segments)
668 |         self.new_lines = new_lines
669 | 
670 |     def __rich_console__(
671 |         self, console: "Console", options: "ConsoleOptions"
672 |     ) -> "RenderResult":
673 |         if self.new_lines:
674 |             line = Segment.line()
675 |             for segment in self.segments:
676 |                 yield segment
677 |                 yield line
678 |         else:
679 |             yield from self.segments
680 | 
681 | 
682 | class SegmentLines:
683 |     def __init__(self, lines: Iterable[List[Segment]], new_lines: bool = False) -> None:
684 |         """A simple renderable containing a number of lines of segments. May be used as an intermediate
685 |         in rendering process.
686 | 
687 |         Args:
688 |             lines (Iterable[List[Segment]]): Lists of segments forming lines.
689 |             new_lines (bool, optional): Insert new lines after each line. Defaults to False.
690 |         """
691 |         self.lines = list(lines)
692 |         self.new_lines = new_lines
693 | 
694 |     def __rich_console__(
695 |         self, console: "Console", options: "ConsoleOptions"
696 |     ) -> "RenderResult":
697 |         if self.new_lines:
698 |             new_line = Segment.line()
699 |             for line in self.lines:
700 |                 yield from line
701 |                 yield new_line
702 |         else:
703 |             for line in self.lines:
704 |                 yield from line
705 | 
706 | 
707 | if __name__ == "__main__":  # pragma: no cover
708 |     from pip._vendor.rich.console import Console
709 |     from pip._vendor.rich.syntax import Syntax
710 |     from pip._vendor.rich.text import Text
711 | 
712 |     code = """from rich.console import Console
713 | console = Console()
714 | text = Text.from_markup("Hello, [bold magenta]World[/]!")
715 | console.print(text)"""
716 | 
717 |     text = Text.from_markup("Hello, [bold magenta]World[/]!")
718 | 
719 |     console = Console()
720 | 
721 |     console.rule("rich.Segment")
722 |     console.print(
723 |         "A Segment is the last step in the Rich render process before generating text with ANSI codes."
724 |     )
725 |     console.print("\nConsider the following code:\n")
726 |     console.print(Syntax(code, "python", line_numbers=True))
727 |     console.print()
728 |     console.print(
729 |         "When you call [b]print()[/b], Rich [i]renders[/i] the object in to the following:\n"
730 |     )
731 |     fragments = list(console.render(text))
732 |     console.print(fragments)
733 |     console.print()
734 |     console.print("The Segments are then processed to produce the following output:\n")
735 |     console.print(text)
736 |     console.print(
737 |         "\nYou will only need to know this if you are implementing your own Rich renderables."
738 |     )
739 | 
```

--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/bs4/builder/__init__.py:
--------------------------------------------------------------------------------

```python
  1 | # Use of this source code is governed by the MIT license.
  2 | __license__ = "MIT"
  3 | 
  4 | from collections import defaultdict
  5 | import itertools
  6 | import re
  7 | import warnings
  8 | import sys
  9 | from bs4.element import (
 10 |     CharsetMetaAttributeValue,
 11 |     ContentMetaAttributeValue,
 12 |     RubyParenthesisString,
 13 |     RubyTextString,
 14 |     Stylesheet,
 15 |     Script,
 16 |     TemplateString,
 17 |     nonwhitespace_re
 18 | )
 19 | 
 20 | __all__ = [
 21 |     'HTMLTreeBuilder',
 22 |     'SAXTreeBuilder',
 23 |     'TreeBuilder',
 24 |     'TreeBuilderRegistry',
 25 |     ]
 26 | 
 27 | # Some useful features for a TreeBuilder to have.
 28 | FAST = 'fast'
 29 | PERMISSIVE = 'permissive'
 30 | STRICT = 'strict'
 31 | XML = 'xml'
 32 | HTML = 'html'
 33 | HTML_5 = 'html5'
 34 | 
 35 | class XMLParsedAsHTMLWarning(UserWarning):
 36 |     """The warning issued when an HTML parser is used to parse
 37 |     XML that is not XHTML.
 38 |     """
 39 |     MESSAGE = """It looks like you're parsing an XML document using an HTML parser. If this really is an HTML document (maybe it's XHTML?), you can ignore or filter this warning. If it's XML, you should know that using an XML parser will be more reliable. To parse this document as XML, make sure you have the lxml package installed, and pass the keyword argument `features="xml"` into the BeautifulSoup constructor."""
 40 | 
 41 | 
 42 | class TreeBuilderRegistry(object):
 43 |     """A way of looking up TreeBuilder subclasses by their name or by desired
 44 |     features.
 45 |     """
 46 |     
 47 |     def __init__(self):
 48 |         self.builders_for_feature = defaultdict(list)
 49 |         self.builders = []
 50 | 
 51 |     def register(self, treebuilder_class):
 52 |         """Register a treebuilder based on its advertised features.
 53 | 
 54 |         :param treebuilder_class: A subclass of Treebuilder. its .features
 55 |            attribute should list its features.
 56 |         """
 57 |         for feature in treebuilder_class.features:
 58 |             self.builders_for_feature[feature].insert(0, treebuilder_class)
 59 |         self.builders.insert(0, treebuilder_class)
 60 | 
 61 |     def lookup(self, *features):
 62 |         """Look up a TreeBuilder subclass with the desired features.
 63 | 
 64 |         :param features: A list of features to look for. If none are
 65 |             provided, the most recently registered TreeBuilder subclass
 66 |             will be used.
 67 |         :return: A TreeBuilder subclass, or None if there's no
 68 |             registered subclass with all the requested features.
 69 |         """
 70 |         if len(self.builders) == 0:
 71 |             # There are no builders at all.
 72 |             return None
 73 | 
 74 |         if len(features) == 0:
 75 |             # They didn't ask for any features. Give them the most
 76 |             # recently registered builder.
 77 |             return self.builders[0]
 78 | 
 79 |         # Go down the list of features in order, and eliminate any builders
 80 |         # that don't match every feature.
 81 |         features = list(features)
 82 |         features.reverse()
 83 |         candidates = None
 84 |         candidate_set = None
 85 |         while len(features) > 0:
 86 |             feature = features.pop()
 87 |             we_have_the_feature = self.builders_for_feature.get(feature, [])
 88 |             if len(we_have_the_feature) > 0:
 89 |                 if candidates is None:
 90 |                     candidates = we_have_the_feature
 91 |                     candidate_set = set(candidates)
 92 |                 else:
 93 |                     # Eliminate any candidates that don't have this feature.
 94 |                     candidate_set = candidate_set.intersection(
 95 |                         set(we_have_the_feature))
 96 | 
 97 |         # The only valid candidates are the ones in candidate_set.
 98 |         # Go through the original list of candidates and pick the first one
 99 |         # that's in candidate_set.
100 |         if candidate_set is None:
101 |             return None
102 |         for candidate in candidates:
103 |             if candidate in candidate_set:
104 |                 return candidate
105 |         return None
106 | 
107 | # The BeautifulSoup class will take feature lists from developers and use them
108 | # to look up builders in this registry.
109 | builder_registry = TreeBuilderRegistry()
110 | 
111 | class TreeBuilder(object):
112 |     """Turn a textual document into a Beautiful Soup object tree."""
113 | 
114 |     NAME = "[Unknown tree builder]"
115 |     ALTERNATE_NAMES = []
116 |     features = []
117 | 
118 |     is_xml = False
119 |     picklable = False
120 |     empty_element_tags = None # A tag will be considered an empty-element
121 |                               # tag when and only when it has no contents.
122 |     
123 |     # A value for these tag/attribute combinations is a space- or
124 |     # comma-separated list of CDATA, rather than a single CDATA.
125 |     DEFAULT_CDATA_LIST_ATTRIBUTES = defaultdict(list)
126 | 
127 |     # Whitespace should be preserved inside these tags.
128 |     DEFAULT_PRESERVE_WHITESPACE_TAGS = set()
129 | 
130 |     # The textual contents of tags with these names should be
131 |     # instantiated with some class other than NavigableString.
132 |     DEFAULT_STRING_CONTAINERS = {}
133 |     
134 |     USE_DEFAULT = object()
135 | 
136 |     # Most parsers don't keep track of line numbers.
137 |     TRACKS_LINE_NUMBERS = False
138 |     
139 |     def __init__(self, multi_valued_attributes=USE_DEFAULT,
140 |                  preserve_whitespace_tags=USE_DEFAULT,
141 |                  store_line_numbers=USE_DEFAULT,
142 |                  string_containers=USE_DEFAULT,
143 |     ):
144 |         """Constructor.
145 | 
146 |         :param multi_valued_attributes: If this is set to None, the
147 |          TreeBuilder will not turn any values for attributes like
148 |          'class' into lists. Setting this to a dictionary will
149 |          customize this behavior; look at DEFAULT_CDATA_LIST_ATTRIBUTES
150 |          for an example.
151 | 
152 |          Internally, these are called "CDATA list attributes", but that
153 |          probably doesn't make sense to an end-user, so the argument name
154 |          is `multi_valued_attributes`.
155 | 
156 |         :param preserve_whitespace_tags: A list of tags to treat
157 |          the way <pre> tags are treated in HTML. Tags in this list
158 |          are immune from pretty-printing; their contents will always be
159 |          output as-is.
160 | 
161 |         :param string_containers: A dictionary mapping tag names to
162 |         the classes that should be instantiated to contain the textual
163 |         contents of those tags. The default is to use NavigableString
164 |         for every tag, no matter what the name. You can override the
165 |         default by changing DEFAULT_STRING_CONTAINERS.
166 | 
167 |         :param store_line_numbers: If the parser keeps track of the
168 |          line numbers and positions of the original markup, that
169 |          information will, by default, be stored in each corresponding
170 |          `Tag` object. You can turn this off by passing
171 |          store_line_numbers=False. If the parser you're using doesn't 
172 |          keep track of this information, then setting store_line_numbers=True
173 |          will do nothing.
174 |         """
175 |         self.soup = None
176 |         if multi_valued_attributes is self.USE_DEFAULT:
177 |             multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES
178 |         self.cdata_list_attributes = multi_valued_attributes
179 |         if preserve_whitespace_tags is self.USE_DEFAULT:
180 |             preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS
181 |         self.preserve_whitespace_tags = preserve_whitespace_tags
182 |         if store_line_numbers == self.USE_DEFAULT:
183 |             store_line_numbers = self.TRACKS_LINE_NUMBERS
184 |         self.store_line_numbers = store_line_numbers 
185 |         if string_containers == self.USE_DEFAULT:
186 |             string_containers = self.DEFAULT_STRING_CONTAINERS
187 |         self.string_containers = string_containers
188 |         
189 |     def initialize_soup(self, soup):
190 |         """The BeautifulSoup object has been initialized and is now
191 |         being associated with the TreeBuilder.
192 | 
193 |         :param soup: A BeautifulSoup object.
194 |         """
195 |         self.soup = soup
196 |         
197 |     def reset(self):
198 |         """Do any work necessary to reset the underlying parser
199 |         for a new document.
200 | 
201 |         By default, this does nothing.
202 |         """
203 |         pass
204 | 
205 |     def can_be_empty_element(self, tag_name):
206 |         """Might a tag with this name be an empty-element tag?
207 | 
208 |         The final markup may or may not actually present this tag as
209 |         self-closing.
210 | 
211 |         For instance: an HTMLBuilder does not consider a <p> tag to be
212 |         an empty-element tag (it's not in
213 |         HTMLBuilder.empty_element_tags). This means an empty <p> tag
214 |         will be presented as "<p></p>", not "<p/>" or "<p>".
215 | 
216 |         The default implementation has no opinion about which tags are
217 |         empty-element tags, so a tag will be presented as an
218 |         empty-element tag if and only if it has no children.
219 |         "<foo></foo>" will become "<foo/>", and "<foo>bar</foo>" will
220 |         be left alone.
221 | 
222 |         :param tag_name: The name of a markup tag.
223 |         """
224 |         if self.empty_element_tags is None:
225 |             return True
226 |         return tag_name in self.empty_element_tags
227 |     
228 |     def feed(self, markup):
229 |         """Run some incoming markup through some parsing process,
230 |         populating the `BeautifulSoup` object in self.soup.
231 | 
232 |         This method is not implemented in TreeBuilder; it must be
233 |         implemented in subclasses.
234 | 
235 |         :return: None.
236 |         """
237 |         raise NotImplementedError()
238 | 
239 |     def prepare_markup(self, markup, user_specified_encoding=None,
240 |                        document_declared_encoding=None, exclude_encodings=None):
241 |         """Run any preliminary steps necessary to make incoming markup
242 |         acceptable to the parser.
243 | 
244 |         :param markup: Some markup -- probably a bytestring.
245 |         :param user_specified_encoding: The user asked to try this encoding.
246 |         :param document_declared_encoding: The markup itself claims to be
247 |             in this encoding. NOTE: This argument is not used by the
248 |             calling code and can probably be removed.
249 |         :param exclude_encodings: The user asked _not_ to try any of
250 |             these encodings.
251 | 
252 |         :yield: A series of 4-tuples:
253 |          (markup, encoding, declared encoding,
254 |           has undergone character replacement)
255 | 
256 |          Each 4-tuple represents a strategy for converting the
257 |          document to Unicode and parsing it. Each strategy will be tried 
258 |          in turn.
259 | 
260 |          By default, the only strategy is to parse the markup
261 |          as-is. See `LXMLTreeBuilderForXML` and
262 |          `HTMLParserTreeBuilder` for implementations that take into
263 |          account the quirks of particular parsers.
264 |         """
265 |         yield markup, None, None, False
266 | 
267 |     def test_fragment_to_document(self, fragment):
268 |         """Wrap an HTML fragment to make it look like a document.
269 | 
270 |         Different parsers do this differently. For instance, lxml
271 |         introduces an empty <head> tag, and html5lib
272 |         doesn't. Abstracting this away lets us write simple tests
273 |         which run HTML fragments through the parser and compare the
274 |         results against other HTML fragments.
275 | 
276 |         This method should not be used outside of tests.
277 | 
278 |         :param fragment: A string -- fragment of HTML.
279 |         :return: A string -- a full HTML document.
280 |         """
281 |         return fragment
282 | 
283 |     def set_up_substitutions(self, tag):
284 |         """Set up any substitutions that will need to be performed on 
285 |         a `Tag` when it's output as a string.
286 | 
287 |         By default, this does nothing. See `HTMLTreeBuilder` for a
288 |         case where this is used.
289 | 
290 |         :param tag: A `Tag`
291 |         :return: Whether or not a substitution was performed.
292 |         """
293 |         return False
294 | 
295 |     def _replace_cdata_list_attribute_values(self, tag_name, attrs):
296 |         """When an attribute value is associated with a tag that can
297 |         have multiple values for that attribute, convert the string
298 |         value to a list of strings.
299 | 
300 |         Basically, replaces class="foo bar" with class=["foo", "bar"]
301 | 
302 |         NOTE: This method modifies its input in place.
303 | 
304 |         :param tag_name: The name of a tag.
305 |         :param attrs: A dictionary containing the tag's attributes.
306 |            Any appropriate attribute values will be modified in place.
307 |         """
308 |         if not attrs:
309 |             return attrs
310 |         if self.cdata_list_attributes:
311 |             universal = self.cdata_list_attributes.get('*', [])
312 |             tag_specific = self.cdata_list_attributes.get(
313 |                 tag_name.lower(), None)
314 |             for attr in list(attrs.keys()):
315 |                 if attr in universal or (tag_specific and attr in tag_specific):
316 |                     # We have a "class"-type attribute whose string
317 |                     # value is a whitespace-separated list of
318 |                     # values. Split it into a list.
319 |                     value = attrs[attr]
320 |                     if isinstance(value, str):
321 |                         values = nonwhitespace_re.findall(value)
322 |                     else:
323 |                         # html5lib sometimes calls setAttributes twice
324 |                         # for the same tag when rearranging the parse
325 |                         # tree. On the second call the attribute value
326 |                         # here is already a list.  If this happens,
327 |                         # leave the value alone rather than trying to
328 |                         # split it again.
329 |                         values = value
330 |                     attrs[attr] = values
331 |         return attrs
332 |     
333 | class SAXTreeBuilder(TreeBuilder):
334 |     """A Beautiful Soup treebuilder that listens for SAX events.
335 | 
336 |     This is not currently used for anything, but it demonstrates
337 |     how a simple TreeBuilder would work.
338 |     """
339 | 
340 |     def feed(self, markup):
341 |         raise NotImplementedError()
342 | 
343 |     def close(self):
344 |         pass
345 | 
346 |     def startElement(self, name, attrs):
347 |         attrs = dict((key[1], value) for key, value in list(attrs.items()))
348 |         #print("Start %s, %r" % (name, attrs))
349 |         self.soup.handle_starttag(name, attrs)
350 | 
351 |     def endElement(self, name):
352 |         #print("End %s" % name)
353 |         self.soup.handle_endtag(name)
354 | 
355 |     def startElementNS(self, nsTuple, nodeName, attrs):
356 |         # Throw away (ns, nodeName) for now.
357 |         self.startElement(nodeName, attrs)
358 | 
359 |     def endElementNS(self, nsTuple, nodeName):
360 |         # Throw away (ns, nodeName) for now.
361 |         self.endElement(nodeName)
362 |         #handler.endElementNS((ns, node.nodeName), node.nodeName)
363 | 
364 |     def startPrefixMapping(self, prefix, nodeValue):
365 |         # Ignore the prefix for now.
366 |         pass
367 | 
368 |     def endPrefixMapping(self, prefix):
369 |         # Ignore the prefix for now.
370 |         # handler.endPrefixMapping(prefix)
371 |         pass
372 | 
373 |     def characters(self, content):
374 |         self.soup.handle_data(content)
375 | 
376 |     def startDocument(self):
377 |         pass
378 | 
379 |     def endDocument(self):
380 |         pass
381 | 
382 | 
383 | class HTMLTreeBuilder(TreeBuilder):
384 |     """This TreeBuilder knows facts about HTML.
385 | 
386 |     Such as which tags are empty-element tags.
387 |     """
388 | 
389 |     empty_element_tags = set([
390 |         # These are from HTML5.
391 |         'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',
392 |         
393 |         # These are from earlier versions of HTML and are removed in HTML5.
394 |         'basefont', 'bgsound', 'command', 'frame', 'image', 'isindex', 'nextid', 'spacer'
395 |     ])
396 | 
397 |     # The HTML standard defines these as block-level elements. Beautiful
398 |     # Soup does not treat these elements differently from other elements,
399 |     # but it may do so eventually, and this information is available if
400 |     # you need to use it.
401 |     block_elements = set(["address", "article", "aside", "blockquote", "canvas", "dd", "div", "dl", "dt", "fieldset", "figcaption", "figure", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "header", "hr", "li", "main", "nav", "noscript", "ol", "output", "p", "pre", "section", "table", "tfoot", "ul", "video"])
402 | 
403 |     # These HTML tags need special treatment so they can be
404 |     # represented by a string class other than NavigableString.
405 |     #
406 |     # For some of these tags, it's because the HTML standard defines
407 |     # an unusual content model for them. I made this list by going
408 |     # through the HTML spec
409 |     # (https://html.spec.whatwg.org/#metadata-content) and looking for
410 |     # "metadata content" elements that can contain strings.
411 |     #
412 |     # The Ruby tags (<rt> and <rp>) are here despite being normal
413 |     # "phrasing content" tags, because the content they contain is
414 |     # qualitatively different from other text in the document, and it
415 |     # can be useful to be able to distinguish it.
416 |     #
417 |     # TODO: Arguably <noscript> could go here but it seems
418 |     # qualitatively different from the other tags.
419 |     DEFAULT_STRING_CONTAINERS = {
420 |         'rt' : RubyTextString,
421 |         'rp' : RubyParenthesisString,
422 |         'style': Stylesheet,
423 |         'script': Script,
424 |         'template': TemplateString,
425 |     }    
426 |     
427 |     # The HTML standard defines these attributes as containing a
428 |     # space-separated list of values, not a single value. That is,
429 |     # class="foo bar" means that the 'class' attribute has two values,
430 |     # 'foo' and 'bar', not the single value 'foo bar'.  When we
431 |     # encounter one of these attributes, we will parse its value into
432 |     # a list of values if possible. Upon output, the list will be
433 |     # converted back into a string.
434 |     DEFAULT_CDATA_LIST_ATTRIBUTES = {
435 |         "*" : ['class', 'accesskey', 'dropzone'],
436 |         "a" : ['rel', 'rev'],
437 |         "link" :  ['rel', 'rev'],
438 |         "td" : ["headers"],
439 |         "th" : ["headers"],
440 |         "td" : ["headers"],
441 |         "form" : ["accept-charset"],
442 |         "object" : ["archive"],
443 | 
444 |         # These are HTML5 specific, as are *.accesskey and *.dropzone above.
445 |         "area" : ["rel"],
446 |         "icon" : ["sizes"],
447 |         "iframe" : ["sandbox"],
448 |         "output" : ["for"],
449 |         }
450 | 
451 |     DEFAULT_PRESERVE_WHITESPACE_TAGS = set(['pre', 'textarea'])
452 | 
453 |     def set_up_substitutions(self, tag):
454 |         """Replace the declared encoding in a <meta> tag with a placeholder,
455 |         to be substituted when the tag is output to a string.
456 | 
457 |         An HTML document may come in to Beautiful Soup as one
458 |         encoding, but exit in a different encoding, and the <meta> tag
459 |         needs to be changed to reflect this.
460 | 
461 |         :param tag: A `Tag`
462 |         :return: Whether or not a substitution was performed.
463 |         """
464 |         # We are only interested in <meta> tags
465 |         if tag.name != 'meta':
466 |             return False
467 | 
468 |         http_equiv = tag.get('http-equiv')
469 |         content = tag.get('content')
470 |         charset = tag.get('charset')
471 | 
472 |         # We are interested in <meta> tags that say what encoding the
473 |         # document was originally in. This means HTML 5-style <meta>
474 |         # tags that provide the "charset" attribute. It also means
475 |         # HTML 4-style <meta> tags that provide the "content"
476 |         # attribute and have "http-equiv" set to "content-type".
477 |         #
478 |         # In both cases we will replace the value of the appropriate
479 |         # attribute with a standin object that can take on any
480 |         # encoding.
481 |         meta_encoding = None
482 |         if charset is not None:
483 |             # HTML 5 style:
484 |             # <meta charset="utf8">
485 |             meta_encoding = charset
486 |             tag['charset'] = CharsetMetaAttributeValue(charset)
487 | 
488 |         elif (content is not None and http_equiv is not None
489 |               and http_equiv.lower() == 'content-type'):
490 |             # HTML 4 style:
491 |             # <meta http-equiv="content-type" content="text/html; charset=utf8">
492 |             tag['content'] = ContentMetaAttributeValue(content)
493 | 
494 |         return (meta_encoding is not None)
495 | 
496 | class DetectsXMLParsedAsHTML(object):
497 |     """A mixin class for any class (a TreeBuilder, or some class used by a
498 |     TreeBuilder) that's in a position to detect whether an XML
499 |     document is being incorrectly parsed as HTML, and issue an
500 |     appropriate warning.
501 | 
502 |     This requires being able to observe an incoming processing
503 |     instruction that might be an XML declaration, and also able to
504 |     observe tags as they're opened. If you can't do that for a given
505 |     TreeBuilder, there's a less reliable implementation based on
506 |     examining the raw markup.
507 |     """
508 | 
509 |     # Regular expression for seeing if markup has an <html> tag.
510 |     LOOKS_LIKE_HTML = re.compile("<[^ +]html", re.I)
511 |     LOOKS_LIKE_HTML_B = re.compile(b"<[^ +]html", re.I)
512 | 
513 |     XML_PREFIX = '<?xml'
514 |     XML_PREFIX_B = b'<?xml'
515 |     
516 |     @classmethod
517 |     def warn_if_markup_looks_like_xml(cls, markup, stacklevel=3):
518 |         """Perform a check on some markup to see if it looks like XML
519 |         that's not XHTML. If so, issue a warning.
520 | 
521 |         This is much less reliable than doing the check while parsing,
522 |         but some of the tree builders can't do that.
523 | 
524 |         :param stacklevel: The stacklevel of the code calling this
525 |         function.
526 | 
527 |         :return: True if the markup looks like non-XHTML XML, False
528 |         otherwise.
529 | 
530 |         """
531 |         if isinstance(markup, bytes):
532 |             prefix = cls.XML_PREFIX_B
533 |             looks_like_html = cls.LOOKS_LIKE_HTML_B
534 |         else:
535 |             prefix = cls.XML_PREFIX
536 |             looks_like_html = cls.LOOKS_LIKE_HTML
537 |         
538 |         if (markup is not None
539 |             and markup.startswith(prefix)
540 |             and not looks_like_html.search(markup[:500])
541 |         ):
542 |             cls._warn(stacklevel=stacklevel+2)
543 |             return True
544 |         return False
545 | 
546 |     @classmethod
547 |     def _warn(cls, stacklevel=5):
548 |         """Issue a warning about XML being parsed as HTML."""
549 |         warnings.warn(
550 |             XMLParsedAsHTMLWarning.MESSAGE, XMLParsedAsHTMLWarning,
551 |             stacklevel=stacklevel
552 |         )
553 |         
554 |     def _initialize_xml_detector(self):
555 |         """Call this method before parsing a document."""
556 |         self._first_processing_instruction = None
557 |         self._root_tag = None
558 |        
559 |     def _document_might_be_xml(self, processing_instruction):
560 |         """Call this method when encountering an XML declaration, or a
561 |         "processing instruction" that might be an XML declaration.
562 |         """
563 |         if (self._first_processing_instruction is not None
564 |             or self._root_tag is not None):
565 |             # The document has already started. Don't bother checking
566 |             # anymore.
567 |             return
568 | 
569 |         self._first_processing_instruction = processing_instruction
570 | 
571 |         # We won't know until we encounter the first tag whether or
572 |         # not this is actually a problem.
573 |         
574 |     def _root_tag_encountered(self, name):
575 |         """Call this when you encounter the document's root tag.
576 | 
577 |         This is where we actually check whether an XML document is
578 |         being incorrectly parsed as HTML, and issue the warning.
579 |         """
580 |         if self._root_tag is not None:
581 |             # This method was incorrectly called multiple times. Do
582 |             # nothing.
583 |             return
584 | 
585 |         self._root_tag = name
586 |         if (name != 'html' and self._first_processing_instruction is not None
587 |             and self._first_processing_instruction.lower().startswith('xml ')):
588 |             # We encountered an XML declaration and then a tag other
589 |             # than 'html'. This is a reliable indicator that a
590 |             # non-XHTML document is being parsed as XML.
591 |             self._warn()
592 | 
593 |     
594 | def register_treebuilders_from(module):
595 |     """Copy TreeBuilders from the given module into this module."""
596 |     this_module = sys.modules[__name__]
597 |     for name in module.__all__:
598 |         obj = getattr(module, name)
599 | 
600 |         if issubclass(obj, TreeBuilder):
601 |             setattr(this_module, name, obj)
602 |             this_module.__all__.append(name)
603 |             # Register the builder while we're at it.
604 |             this_module.builder_registry.register(obj)
605 | 
606 | class ParserRejectedMarkup(Exception):
607 |     """An Exception to be raised when the underlying parser simply
608 |     refuses to parse the given markup.
609 |     """
610 |     def __init__(self, message_or_exception):
611 |         """Explain why the parser rejected the given markup, either
612 |         with a textual explanation or another exception.
613 |         """
614 |         if isinstance(message_or_exception, Exception):
615 |             e = message_or_exception
616 |             message_or_exception = "%s: %s" % (e.__class__.__name__, str(e))
617 |         super(ParserRejectedMarkup, self).__init__(message_or_exception)
618 |             
619 | # Builders are registered in reverse order of priority, so that custom
620 | # builder registrations will take precedence. In general, we want lxml
621 | # to take precedence over html5lib, because it's faster. And we only
622 | # want to use HTMLParser as a last resort.
623 | from . import _htmlparser
624 | register_treebuilders_from(_htmlparser)
625 | try:
626 |     from . import _html5lib
627 |     register_treebuilders_from(_html5lib)
628 | except ImportError:
629 |     # They don't have html5lib installed.
630 |     pass
631 | try:
632 |     from . import _lxml
633 |     register_treebuilders_from(_lxml)
634 | except ImportError:
635 |     # They don't have lxml installed.
636 |     pass
637 | 
```
Page 82/168FirstPrevNextLast