This is page 37 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/urllib3/util/timeout.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import absolute_import
2 |
3 | import time
4 |
5 | # The default socket timeout, used by httplib to indicate that no timeout was; specified by the user
6 | from socket import _GLOBAL_DEFAULT_TIMEOUT, getdefaulttimeout
7 |
8 | from ..exceptions import TimeoutStateError
9 |
10 | # A sentinel value to indicate that no timeout was specified by the user in
11 | # urllib3
12 | _Default = object()
13 |
14 |
15 | # Use time.monotonic if available.
16 | current_time = getattr(time, "monotonic", time.time)
17 |
18 |
19 | class Timeout(object):
20 | """Timeout configuration.
21 |
22 | Timeouts can be defined as a default for a pool:
23 |
24 | .. code-block:: python
25 |
26 | timeout = Timeout(connect=2.0, read=7.0)
27 | http = PoolManager(timeout=timeout)
28 | response = http.request('GET', 'http://example.com/')
29 |
30 | Or per-request (which overrides the default for the pool):
31 |
32 | .. code-block:: python
33 |
34 | response = http.request('GET', 'http://example.com/', timeout=Timeout(10))
35 |
36 | Timeouts can be disabled by setting all the parameters to ``None``:
37 |
38 | .. code-block:: python
39 |
40 | no_timeout = Timeout(connect=None, read=None)
41 | response = http.request('GET', 'http://example.com/, timeout=no_timeout)
42 |
43 |
44 | :param total:
45 | This combines the connect and read timeouts into one; the read timeout
46 | will be set to the time leftover from the connect attempt. In the
47 | event that both a connect timeout and a total are specified, or a read
48 | timeout and a total are specified, the shorter timeout will be applied.
49 |
50 | Defaults to None.
51 |
52 | :type total: int, float, or None
53 |
54 | :param connect:
55 | The maximum amount of time (in seconds) to wait for a connection
56 | attempt to a server to succeed. Omitting the parameter will default the
57 | connect timeout to the system default, probably `the global default
58 | timeout in socket.py
59 | <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
60 | None will set an infinite timeout for connection attempts.
61 |
62 | :type connect: int, float, or None
63 |
64 | :param read:
65 | The maximum amount of time (in seconds) to wait between consecutive
66 | read operations for a response from the server. Omitting the parameter
67 | will default the read timeout to the system default, probably `the
68 | global default timeout in socket.py
69 | <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_.
70 | None will set an infinite timeout.
71 |
72 | :type read: int, float, or None
73 |
74 | .. note::
75 |
76 | Many factors can affect the total amount of time for urllib3 to return
77 | an HTTP response.
78 |
79 | For example, Python's DNS resolver does not obey the timeout specified
80 | on the socket. Other factors that can affect total request time include
81 | high CPU load, high swap, the program running at a low priority level,
82 | or other behaviors.
83 |
84 | In addition, the read and total timeouts only measure the time between
85 | read operations on the socket connecting the client and the server,
86 | not the total amount of time for the request to return a complete
87 | response. For most requests, the timeout is raised because the server
88 | has not sent the first byte in the specified time. This is not always
89 | the case; if a server streams one byte every fifteen seconds, a timeout
90 | of 20 seconds will not trigger, even though the request will take
91 | several minutes to complete.
92 |
93 | If your goal is to cut off any request after a set amount of wall clock
94 | time, consider having a second "watcher" thread to cut off a slow
95 | request.
96 | """
97 |
98 | #: A sentinel object representing the default timeout value
99 | DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT
100 |
101 | def __init__(self, total=None, connect=_Default, read=_Default):
102 | self._connect = self._validate_timeout(connect, "connect")
103 | self._read = self._validate_timeout(read, "read")
104 | self.total = self._validate_timeout(total, "total")
105 | self._start_connect = None
106 |
107 | def __repr__(self):
108 | return "%s(connect=%r, read=%r, total=%r)" % (
109 | type(self).__name__,
110 | self._connect,
111 | self._read,
112 | self.total,
113 | )
114 |
115 | # __str__ provided for backwards compatibility
116 | __str__ = __repr__
117 |
118 | @classmethod
119 | def resolve_default_timeout(cls, timeout):
120 | return getdefaulttimeout() if timeout is cls.DEFAULT_TIMEOUT else timeout
121 |
122 | @classmethod
123 | def _validate_timeout(cls, value, name):
124 | """Check that a timeout attribute is valid.
125 |
126 | :param value: The timeout value to validate
127 | :param name: The name of the timeout attribute to validate. This is
128 | used to specify in error messages.
129 | :return: The validated and casted version of the given value.
130 | :raises ValueError: If it is a numeric value less than or equal to
131 | zero, or the type is not an integer, float, or None.
132 | """
133 | if value is _Default:
134 | return cls.DEFAULT_TIMEOUT
135 |
136 | if value is None or value is cls.DEFAULT_TIMEOUT:
137 | return value
138 |
139 | if isinstance(value, bool):
140 | raise ValueError(
141 | "Timeout cannot be a boolean value. It must "
142 | "be an int, float or None."
143 | )
144 | try:
145 | float(value)
146 | except (TypeError, ValueError):
147 | raise ValueError(
148 | "Timeout value %s was %s, but it must be an "
149 | "int, float or None." % (name, value)
150 | )
151 |
152 | try:
153 | if value <= 0:
154 | raise ValueError(
155 | "Attempted to set %s timeout to %s, but the "
156 | "timeout cannot be set to a value less "
157 | "than or equal to 0." % (name, value)
158 | )
159 | except TypeError:
160 | # Python 3
161 | raise ValueError(
162 | "Timeout value %s was %s, but it must be an "
163 | "int, float or None." % (name, value)
164 | )
165 |
166 | return value
167 |
168 | @classmethod
169 | def from_float(cls, timeout):
170 | """Create a new Timeout from a legacy timeout value.
171 |
172 | The timeout value used by httplib.py sets the same timeout on the
173 | connect(), and recv() socket requests. This creates a :class:`Timeout`
174 | object that sets the individual timeouts to the ``timeout`` value
175 | passed to this function.
176 |
177 | :param timeout: The legacy timeout value.
178 | :type timeout: integer, float, sentinel default object, or None
179 | :return: Timeout object
180 | :rtype: :class:`Timeout`
181 | """
182 | return Timeout(read=timeout, connect=timeout)
183 |
184 | def clone(self):
185 | """Create a copy of the timeout object
186 |
187 | Timeout properties are stored per-pool but each request needs a fresh
188 | Timeout object to ensure each one has its own start/stop configured.
189 |
190 | :return: a copy of the timeout object
191 | :rtype: :class:`Timeout`
192 | """
193 | # We can't use copy.deepcopy because that will also create a new object
194 | # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to
195 | # detect the user default.
196 | return Timeout(connect=self._connect, read=self._read, total=self.total)
197 |
198 | def start_connect(self):
199 | """Start the timeout clock, used during a connect() attempt
200 |
201 | :raises urllib3.exceptions.TimeoutStateError: if you attempt
202 | to start a timer that has been started already.
203 | """
204 | if self._start_connect is not None:
205 | raise TimeoutStateError("Timeout timer has already been started.")
206 | self._start_connect = current_time()
207 | return self._start_connect
208 |
209 | def get_connect_duration(self):
210 | """Gets the time elapsed since the call to :meth:`start_connect`.
211 |
212 | :return: Elapsed time in seconds.
213 | :rtype: float
214 | :raises urllib3.exceptions.TimeoutStateError: if you attempt
215 | to get duration for a timer that hasn't been started.
216 | """
217 | if self._start_connect is None:
218 | raise TimeoutStateError(
219 | "Can't get connect duration for timer that has not started."
220 | )
221 | return current_time() - self._start_connect
222 |
223 | @property
224 | def connect_timeout(self):
225 | """Get the value to use when setting a connection timeout.
226 |
227 | This will be a positive float or integer, the value None
228 | (never timeout), or the default system timeout.
229 |
230 | :return: Connect timeout.
231 | :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
232 | """
233 | if self.total is None:
234 | return self._connect
235 |
236 | if self._connect is None or self._connect is self.DEFAULT_TIMEOUT:
237 | return self.total
238 |
239 | return min(self._connect, self.total)
240 |
241 | @property
242 | def read_timeout(self):
243 | """Get the value for the read timeout.
244 |
245 | This assumes some time has elapsed in the connection timeout and
246 | computes the read timeout appropriately.
247 |
248 | If self.total is set, the read timeout is dependent on the amount of
249 | time taken by the connect timeout. If the connection time has not been
250 | established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be
251 | raised.
252 |
253 | :return: Value to use for the read timeout.
254 | :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None
255 | :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect`
256 | has not yet been called on this object.
257 | """
258 | if (
259 | self.total is not None
260 | and self.total is not self.DEFAULT_TIMEOUT
261 | and self._read is not None
262 | and self._read is not self.DEFAULT_TIMEOUT
263 | ):
264 | # In case the connect timeout has not yet been established.
265 | if self._start_connect is None:
266 | return self._read
267 | return max(0, min(self.total - self.get_connect_duration(), self._read))
268 | elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT:
269 | return max(0, self.total - self.get_connect_duration())
270 | else:
271 | return self._read
272 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py:
--------------------------------------------------------------------------------
```python
1 | import sys
2 | from typing import TYPE_CHECKING, Iterable, List
3 |
4 | if sys.version_info >= (3, 8):
5 | from typing import Literal
6 | else:
7 | from pip._vendor.typing_extensions import Literal # pragma: no cover
8 |
9 |
10 | from ._loop import loop_last
11 |
12 | if TYPE_CHECKING:
13 | from pip._vendor.rich.console import ConsoleOptions
14 |
15 |
16 | class Box:
17 | """Defines characters to render boxes.
18 |
19 | ┌─┬┐ top
20 | │ ││ head
21 | ├─┼┤ head_row
22 | │ ││ mid
23 | ├─┼┤ row
24 | ├─┼┤ foot_row
25 | │ ││ foot
26 | └─┴┘ bottom
27 |
28 | Args:
29 | box (str): Characters making up box.
30 | ascii (bool, optional): True if this box uses ascii characters only. Default is False.
31 | """
32 |
33 | def __init__(self, box: str, *, ascii: bool = False) -> None:
34 | self._box = box
35 | self.ascii = ascii
36 | line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines()
37 | # top
38 | self.top_left, self.top, self.top_divider, self.top_right = iter(line1)
39 | # head
40 | self.head_left, _, self.head_vertical, self.head_right = iter(line2)
41 | # head_row
42 | (
43 | self.head_row_left,
44 | self.head_row_horizontal,
45 | self.head_row_cross,
46 | self.head_row_right,
47 | ) = iter(line3)
48 |
49 | # mid
50 | self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4)
51 | # row
52 | self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5)
53 | # foot_row
54 | (
55 | self.foot_row_left,
56 | self.foot_row_horizontal,
57 | self.foot_row_cross,
58 | self.foot_row_right,
59 | ) = iter(line6)
60 | # foot
61 | self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7)
62 | # bottom
63 | self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter(
64 | line8
65 | )
66 |
67 | def __repr__(self) -> str:
68 | return "Box(...)"
69 |
70 | def __str__(self) -> str:
71 | return self._box
72 |
73 | def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box":
74 | """Substitute this box for another if it won't render due to platform issues.
75 |
76 | Args:
77 | options (ConsoleOptions): Console options used in rendering.
78 | safe (bool, optional): Substitute this for another Box if there are known problems
79 | displaying on the platform (currently only relevant on Windows). Default is True.
80 |
81 | Returns:
82 | Box: A different Box or the same Box.
83 | """
84 | box = self
85 | if options.legacy_windows and safe:
86 | box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box)
87 | if options.ascii_only and not box.ascii:
88 | box = ASCII
89 | return box
90 |
91 | def get_plain_headed_box(self) -> "Box":
92 | """If this box uses special characters for the borders of the header, then
93 | return the equivalent box that does not.
94 |
95 | Returns:
96 | Box: The most similar Box that doesn't use header-specific box characters.
97 | If the current Box already satisfies this criterion, then it's returned.
98 | """
99 | return PLAIN_HEADED_SUBSTITUTIONS.get(self, self)
100 |
101 | def get_top(self, widths: Iterable[int]) -> str:
102 | """Get the top of a simple box.
103 |
104 | Args:
105 | widths (List[int]): Widths of columns.
106 |
107 | Returns:
108 | str: A string of box characters.
109 | """
110 |
111 | parts: List[str] = []
112 | append = parts.append
113 | append(self.top_left)
114 | for last, width in loop_last(widths):
115 | append(self.top * width)
116 | if not last:
117 | append(self.top_divider)
118 | append(self.top_right)
119 | return "".join(parts)
120 |
121 | def get_row(
122 | self,
123 | widths: Iterable[int],
124 | level: Literal["head", "row", "foot", "mid"] = "row",
125 | edge: bool = True,
126 | ) -> str:
127 | """Get the top of a simple box.
128 |
129 | Args:
130 | width (List[int]): Widths of columns.
131 |
132 | Returns:
133 | str: A string of box characters.
134 | """
135 | if level == "head":
136 | left = self.head_row_left
137 | horizontal = self.head_row_horizontal
138 | cross = self.head_row_cross
139 | right = self.head_row_right
140 | elif level == "row":
141 | left = self.row_left
142 | horizontal = self.row_horizontal
143 | cross = self.row_cross
144 | right = self.row_right
145 | elif level == "mid":
146 | left = self.mid_left
147 | horizontal = " "
148 | cross = self.mid_vertical
149 | right = self.mid_right
150 | elif level == "foot":
151 | left = self.foot_row_left
152 | horizontal = self.foot_row_horizontal
153 | cross = self.foot_row_cross
154 | right = self.foot_row_right
155 | else:
156 | raise ValueError("level must be 'head', 'row' or 'foot'")
157 |
158 | parts: List[str] = []
159 | append = parts.append
160 | if edge:
161 | append(left)
162 | for last, width in loop_last(widths):
163 | append(horizontal * width)
164 | if not last:
165 | append(cross)
166 | if edge:
167 | append(right)
168 | return "".join(parts)
169 |
170 | def get_bottom(self, widths: Iterable[int]) -> str:
171 | """Get the bottom of a simple box.
172 |
173 | Args:
174 | widths (List[int]): Widths of columns.
175 |
176 | Returns:
177 | str: A string of box characters.
178 | """
179 |
180 | parts: List[str] = []
181 | append = parts.append
182 | append(self.bottom_left)
183 | for last, width in loop_last(widths):
184 | append(self.bottom * width)
185 | if not last:
186 | append(self.bottom_divider)
187 | append(self.bottom_right)
188 | return "".join(parts)
189 |
190 |
191 | # fmt: off
192 | ASCII: Box = Box(
193 | "+--+\n"
194 | "| ||\n"
195 | "|-+|\n"
196 | "| ||\n"
197 | "|-+|\n"
198 | "|-+|\n"
199 | "| ||\n"
200 | "+--+\n",
201 | ascii=True,
202 | )
203 |
204 | ASCII2: Box = Box(
205 | "+-++\n"
206 | "| ||\n"
207 | "+-++\n"
208 | "| ||\n"
209 | "+-++\n"
210 | "+-++\n"
211 | "| ||\n"
212 | "+-++\n",
213 | ascii=True,
214 | )
215 |
216 | ASCII_DOUBLE_HEAD: Box = Box(
217 | "+-++\n"
218 | "| ||\n"
219 | "+=++\n"
220 | "| ||\n"
221 | "+-++\n"
222 | "+-++\n"
223 | "| ||\n"
224 | "+-++\n",
225 | ascii=True,
226 | )
227 |
228 | SQUARE: Box = Box(
229 | "┌─┬┐\n"
230 | "│ ││\n"
231 | "├─┼┤\n"
232 | "│ ││\n"
233 | "├─┼┤\n"
234 | "├─┼┤\n"
235 | "│ ││\n"
236 | "└─┴┘\n"
237 | )
238 |
239 | SQUARE_DOUBLE_HEAD: Box = Box(
240 | "┌─┬┐\n"
241 | "│ ││\n"
242 | "╞═╪╡\n"
243 | "│ ││\n"
244 | "├─┼┤\n"
245 | "├─┼┤\n"
246 | "│ ││\n"
247 | "└─┴┘\n"
248 | )
249 |
250 | MINIMAL: Box = Box(
251 | " ╷ \n"
252 | " │ \n"
253 | "╶─┼╴\n"
254 | " │ \n"
255 | "╶─┼╴\n"
256 | "╶─┼╴\n"
257 | " │ \n"
258 | " ╵ \n"
259 | )
260 |
261 |
262 | MINIMAL_HEAVY_HEAD: Box = Box(
263 | " ╷ \n"
264 | " │ \n"
265 | "╺━┿╸\n"
266 | " │ \n"
267 | "╶─┼╴\n"
268 | "╶─┼╴\n"
269 | " │ \n"
270 | " ╵ \n"
271 | )
272 |
273 | MINIMAL_DOUBLE_HEAD: Box = Box(
274 | " ╷ \n"
275 | " │ \n"
276 | " ═╪ \n"
277 | " │ \n"
278 | " ─┼ \n"
279 | " ─┼ \n"
280 | " │ \n"
281 | " ╵ \n"
282 | )
283 |
284 |
285 | SIMPLE: Box = Box(
286 | " \n"
287 | " \n"
288 | " ── \n"
289 | " \n"
290 | " \n"
291 | " ── \n"
292 | " \n"
293 | " \n"
294 | )
295 |
296 | SIMPLE_HEAD: Box = Box(
297 | " \n"
298 | " \n"
299 | " ── \n"
300 | " \n"
301 | " \n"
302 | " \n"
303 | " \n"
304 | " \n"
305 | )
306 |
307 |
308 | SIMPLE_HEAVY: Box = Box(
309 | " \n"
310 | " \n"
311 | " ━━ \n"
312 | " \n"
313 | " \n"
314 | " ━━ \n"
315 | " \n"
316 | " \n"
317 | )
318 |
319 |
320 | HORIZONTALS: Box = Box(
321 | " ── \n"
322 | " \n"
323 | " ── \n"
324 | " \n"
325 | " ── \n"
326 | " ── \n"
327 | " \n"
328 | " ── \n"
329 | )
330 |
331 | ROUNDED: Box = Box(
332 | "╭─┬╮\n"
333 | "│ ││\n"
334 | "├─┼┤\n"
335 | "│ ││\n"
336 | "├─┼┤\n"
337 | "├─┼┤\n"
338 | "│ ││\n"
339 | "╰─┴╯\n"
340 | )
341 |
342 | HEAVY: Box = Box(
343 | "┏━┳┓\n"
344 | "┃ ┃┃\n"
345 | "┣━╋┫\n"
346 | "┃ ┃┃\n"
347 | "┣━╋┫\n"
348 | "┣━╋┫\n"
349 | "┃ ┃┃\n"
350 | "┗━┻┛\n"
351 | )
352 |
353 | HEAVY_EDGE: Box = Box(
354 | "┏━┯┓\n"
355 | "┃ │┃\n"
356 | "┠─┼┨\n"
357 | "┃ │┃\n"
358 | "┠─┼┨\n"
359 | "┠─┼┨\n"
360 | "┃ │┃\n"
361 | "┗━┷┛\n"
362 | )
363 |
364 | HEAVY_HEAD: Box = Box(
365 | "┏━┳┓\n"
366 | "┃ ┃┃\n"
367 | "┡━╇┩\n"
368 | "│ ││\n"
369 | "├─┼┤\n"
370 | "├─┼┤\n"
371 | "│ ││\n"
372 | "└─┴┘\n"
373 | )
374 |
375 | DOUBLE: Box = Box(
376 | "╔═╦╗\n"
377 | "║ ║║\n"
378 | "╠═╬╣\n"
379 | "║ ║║\n"
380 | "╠═╬╣\n"
381 | "╠═╬╣\n"
382 | "║ ║║\n"
383 | "╚═╩╝\n"
384 | )
385 |
386 | DOUBLE_EDGE: Box = Box(
387 | "╔═╤╗\n"
388 | "║ │║\n"
389 | "╟─┼╢\n"
390 | "║ │║\n"
391 | "╟─┼╢\n"
392 | "╟─┼╢\n"
393 | "║ │║\n"
394 | "╚═╧╝\n"
395 | )
396 |
397 | MARKDOWN: Box = Box(
398 | " \n"
399 | "| ||\n"
400 | "|-||\n"
401 | "| ||\n"
402 | "|-||\n"
403 | "|-||\n"
404 | "| ||\n"
405 | " \n",
406 | ascii=True,
407 | )
408 | # fmt: on
409 |
410 | # Map Boxes that don't render with raster fonts on to equivalent that do
411 | LEGACY_WINDOWS_SUBSTITUTIONS = {
412 | ROUNDED: SQUARE,
413 | MINIMAL_HEAVY_HEAD: MINIMAL,
414 | SIMPLE_HEAVY: SIMPLE,
415 | HEAVY: SQUARE,
416 | HEAVY_EDGE: SQUARE,
417 | HEAVY_HEAD: SQUARE,
418 | }
419 |
420 | # Map headed boxes to their headerless equivalents
421 | PLAIN_HEADED_SUBSTITUTIONS = {
422 | HEAVY_HEAD: SQUARE,
423 | SQUARE_DOUBLE_HEAD: SQUARE,
424 | MINIMAL_DOUBLE_HEAD: MINIMAL,
425 | MINIMAL_HEAVY_HEAD: MINIMAL,
426 | ASCII_DOUBLE_HEAD: ASCII2,
427 | }
428 |
429 |
430 | if __name__ == "__main__": # pragma: no cover
431 | from pip._vendor.rich.columns import Columns
432 | from pip._vendor.rich.panel import Panel
433 |
434 | from . import box as box
435 | from .console import Console
436 | from .table import Table
437 | from .text import Text
438 |
439 | console = Console(record=True)
440 |
441 | BOXES = [
442 | "ASCII",
443 | "ASCII2",
444 | "ASCII_DOUBLE_HEAD",
445 | "SQUARE",
446 | "SQUARE_DOUBLE_HEAD",
447 | "MINIMAL",
448 | "MINIMAL_HEAVY_HEAD",
449 | "MINIMAL_DOUBLE_HEAD",
450 | "SIMPLE",
451 | "SIMPLE_HEAD",
452 | "SIMPLE_HEAVY",
453 | "HORIZONTALS",
454 | "ROUNDED",
455 | "HEAVY",
456 | "HEAVY_EDGE",
457 | "HEAVY_HEAD",
458 | "DOUBLE",
459 | "DOUBLE_EDGE",
460 | "MARKDOWN",
461 | ]
462 |
463 | console.print(Panel("[bold green]Box Constants", style="green"), justify="center")
464 | console.print()
465 |
466 | columns = Columns(expand=True, padding=2)
467 | for box_name in sorted(BOXES):
468 | table = Table(
469 | show_footer=True, style="dim", border_style="not dim", expand=True
470 | )
471 | table.add_column("Header 1", "Footer 1")
472 | table.add_column("Header 2", "Footer 2")
473 | table.add_row("Cell", "Cell")
474 | table.add_row("Cell", "Cell")
475 | table.box = getattr(box, box_name)
476 | table.title = Text(f"box.{box_name}", style="magenta")
477 | columns.add_renderable(table)
478 | console.print(columns)
479 |
480 | # console.save_svg("box.svg")
481 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | requests.auth
3 | ~~~~~~~~~~~~~
4 |
5 | This module contains the authentication handlers for Requests.
6 | """
7 |
8 | import hashlib
9 | import os
10 | import re
11 | import threading
12 | import time
13 | import warnings
14 | from base64 import b64encode
15 |
16 | from ._internal_utils import to_native_string
17 | from .compat import basestring, str, urlparse
18 | from .cookies import extract_cookies_to_jar
19 | from .utils import parse_dict_header
20 |
21 | CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded"
22 | CONTENT_TYPE_MULTI_PART = "multipart/form-data"
23 |
24 |
25 | def _basic_auth_str(username, password):
26 | """Returns a Basic Auth string."""
27 |
28 | # "I want us to put a big-ol' comment on top of it that
29 | # says that this behaviour is dumb but we need to preserve
30 | # it because people are relying on it."
31 | # - Lukasa
32 | #
33 | # These are here solely to maintain backwards compatibility
34 | # for things like ints. This will be removed in 3.0.0.
35 | if not isinstance(username, basestring):
36 | warnings.warn(
37 | "Non-string usernames will no longer be supported in Requests "
38 | "3.0.0. Please convert the object you've passed in ({!r}) to "
39 | "a string or bytes object in the near future to avoid "
40 | "problems.".format(username),
41 | category=DeprecationWarning,
42 | )
43 | username = str(username)
44 |
45 | if not isinstance(password, basestring):
46 | warnings.warn(
47 | "Non-string passwords will no longer be supported in Requests "
48 | "3.0.0. Please convert the object you've passed in ({!r}) to "
49 | "a string or bytes object in the near future to avoid "
50 | "problems.".format(type(password)),
51 | category=DeprecationWarning,
52 | )
53 | password = str(password)
54 | # -- End Removal --
55 |
56 | if isinstance(username, str):
57 | username = username.encode("latin1")
58 |
59 | if isinstance(password, str):
60 | password = password.encode("latin1")
61 |
62 | authstr = "Basic " + to_native_string(
63 | b64encode(b":".join((username, password))).strip()
64 | )
65 |
66 | return authstr
67 |
68 |
69 | class AuthBase:
70 | """Base class that all auth implementations derive from"""
71 |
72 | def __call__(self, r):
73 | raise NotImplementedError("Auth hooks must be callable.")
74 |
75 |
76 | class HTTPBasicAuth(AuthBase):
77 | """Attaches HTTP Basic Authentication to the given Request object."""
78 |
79 | def __init__(self, username, password):
80 | self.username = username
81 | self.password = password
82 |
83 | def __eq__(self, other):
84 | return all(
85 | [
86 | self.username == getattr(other, "username", None),
87 | self.password == getattr(other, "password", None),
88 | ]
89 | )
90 |
91 | def __ne__(self, other):
92 | return not self == other
93 |
94 | def __call__(self, r):
95 | r.headers["Authorization"] = _basic_auth_str(self.username, self.password)
96 | return r
97 |
98 |
99 | class HTTPProxyAuth(HTTPBasicAuth):
100 | """Attaches HTTP Proxy Authentication to a given Request object."""
101 |
102 | def __call__(self, r):
103 | r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password)
104 | return r
105 |
106 |
107 | class HTTPDigestAuth(AuthBase):
108 | """Attaches HTTP Digest Authentication to the given Request object."""
109 |
110 | def __init__(self, username, password):
111 | self.username = username
112 | self.password = password
113 | # Keep state in per-thread local storage
114 | self._thread_local = threading.local()
115 |
116 | def init_per_thread_state(self):
117 | # Ensure state is initialized just once per-thread
118 | if not hasattr(self._thread_local, "init"):
119 | self._thread_local.init = True
120 | self._thread_local.last_nonce = ""
121 | self._thread_local.nonce_count = 0
122 | self._thread_local.chal = {}
123 | self._thread_local.pos = None
124 | self._thread_local.num_401_calls = None
125 |
126 | def build_digest_header(self, method, url):
127 | """
128 | :rtype: str
129 | """
130 |
131 | realm = self._thread_local.chal["realm"]
132 | nonce = self._thread_local.chal["nonce"]
133 | qop = self._thread_local.chal.get("qop")
134 | algorithm = self._thread_local.chal.get("algorithm")
135 | opaque = self._thread_local.chal.get("opaque")
136 | hash_utf8 = None
137 |
138 | if algorithm is None:
139 | _algorithm = "MD5"
140 | else:
141 | _algorithm = algorithm.upper()
142 | # lambdas assume digest modules are imported at the top level
143 | if _algorithm == "MD5" or _algorithm == "MD5-SESS":
144 |
145 | def md5_utf8(x):
146 | if isinstance(x, str):
147 | x = x.encode("utf-8")
148 | return hashlib.md5(x).hexdigest()
149 |
150 | hash_utf8 = md5_utf8
151 | elif _algorithm == "SHA":
152 |
153 | def sha_utf8(x):
154 | if isinstance(x, str):
155 | x = x.encode("utf-8")
156 | return hashlib.sha1(x).hexdigest()
157 |
158 | hash_utf8 = sha_utf8
159 | elif _algorithm == "SHA-256":
160 |
161 | def sha256_utf8(x):
162 | if isinstance(x, str):
163 | x = x.encode("utf-8")
164 | return hashlib.sha256(x).hexdigest()
165 |
166 | hash_utf8 = sha256_utf8
167 | elif _algorithm == "SHA-512":
168 |
169 | def sha512_utf8(x):
170 | if isinstance(x, str):
171 | x = x.encode("utf-8")
172 | return hashlib.sha512(x).hexdigest()
173 |
174 | hash_utf8 = sha512_utf8
175 |
176 | KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731
177 |
178 | if hash_utf8 is None:
179 | return None
180 |
181 | # XXX not implemented yet
182 | entdig = None
183 | p_parsed = urlparse(url)
184 | #: path is request-uri defined in RFC 2616 which should not be empty
185 | path = p_parsed.path or "/"
186 | if p_parsed.query:
187 | path += f"?{p_parsed.query}"
188 |
189 | A1 = f"{self.username}:{realm}:{self.password}"
190 | A2 = f"{method}:{path}"
191 |
192 | HA1 = hash_utf8(A1)
193 | HA2 = hash_utf8(A2)
194 |
195 | if nonce == self._thread_local.last_nonce:
196 | self._thread_local.nonce_count += 1
197 | else:
198 | self._thread_local.nonce_count = 1
199 | ncvalue = f"{self._thread_local.nonce_count:08x}"
200 | s = str(self._thread_local.nonce_count).encode("utf-8")
201 | s += nonce.encode("utf-8")
202 | s += time.ctime().encode("utf-8")
203 | s += os.urandom(8)
204 |
205 | cnonce = hashlib.sha1(s).hexdigest()[:16]
206 | if _algorithm == "MD5-SESS":
207 | HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}")
208 |
209 | if not qop:
210 | respdig = KD(HA1, f"{nonce}:{HA2}")
211 | elif qop == "auth" or "auth" in qop.split(","):
212 | noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}"
213 | respdig = KD(HA1, noncebit)
214 | else:
215 | # XXX handle auth-int.
216 | return None
217 |
218 | self._thread_local.last_nonce = nonce
219 |
220 | # XXX should the partial digests be encoded too?
221 | base = (
222 | f'username="{self.username}", realm="{realm}", nonce="{nonce}", '
223 | f'uri="{path}", response="{respdig}"'
224 | )
225 | if opaque:
226 | base += f', opaque="{opaque}"'
227 | if algorithm:
228 | base += f', algorithm="{algorithm}"'
229 | if entdig:
230 | base += f', digest="{entdig}"'
231 | if qop:
232 | base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"'
233 |
234 | return f"Digest {base}"
235 |
236 | def handle_redirect(self, r, **kwargs):
237 | """Reset num_401_calls counter on redirects."""
238 | if r.is_redirect:
239 | self._thread_local.num_401_calls = 1
240 |
241 | def handle_401(self, r, **kwargs):
242 | """
243 | Takes the given response and tries digest-auth, if needed.
244 |
245 | :rtype: requests.Response
246 | """
247 |
248 | # If response is not 4xx, do not auth
249 | # See https://github.com/psf/requests/issues/3772
250 | if not 400 <= r.status_code < 500:
251 | self._thread_local.num_401_calls = 1
252 | return r
253 |
254 | if self._thread_local.pos is not None:
255 | # Rewind the file position indicator of the body to where
256 | # it was to resend the request.
257 | r.request.body.seek(self._thread_local.pos)
258 | s_auth = r.headers.get("www-authenticate", "")
259 |
260 | if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2:
261 | self._thread_local.num_401_calls += 1
262 | pat = re.compile(r"digest ", flags=re.IGNORECASE)
263 | self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1))
264 |
265 | # Consume content and release the original connection
266 | # to allow our new request to reuse the same one.
267 | r.content
268 | r.close()
269 | prep = r.request.copy()
270 | extract_cookies_to_jar(prep._cookies, r.request, r.raw)
271 | prep.prepare_cookies(prep._cookies)
272 |
273 | prep.headers["Authorization"] = self.build_digest_header(
274 | prep.method, prep.url
275 | )
276 | _r = r.connection.send(prep, **kwargs)
277 | _r.history.append(r)
278 | _r.request = prep
279 |
280 | return _r
281 |
282 | self._thread_local.num_401_calls = 1
283 | return r
284 |
285 | def __call__(self, r):
286 | # Initialize per-thread state, if needed
287 | self.init_per_thread_state()
288 | # If we have a saved nonce, skip the 401
289 | if self._thread_local.last_nonce:
290 | r.headers["Authorization"] = self.build_digest_header(r.method, r.url)
291 | try:
292 | self._thread_local.pos = r.body.tell()
293 | except AttributeError:
294 | # In the case of HTTPDigestAuth being reused and the body of
295 | # the previous request was a file-like object, pos has the
296 | # file position of the previous body. Ensure it's set to
297 | # None.
298 | self._thread_local.pos = None
299 | r.register_hook("response", self.handle_401)
300 | r.register_hook("response", self.handle_redirect)
301 | self._thread_local.num_401_calls = 1
302 |
303 | return r
304 |
305 | def __eq__(self, other):
306 | return all(
307 | [
308 | self.username == getattr(other, "username", None),
309 | self.password == getattr(other, "password", None),
310 | ]
311 | )
312 |
313 | def __ne__(self, other):
314 | return not self == other
315 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/requests/auth.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | requests.auth
3 | ~~~~~~~~~~~~~
4 |
5 | This module contains the authentication handlers for Requests.
6 | """
7 |
8 | import hashlib
9 | import os
10 | import re
11 | import threading
12 | import time
13 | import warnings
14 | from base64 import b64encode
15 |
16 | from ._internal_utils import to_native_string
17 | from .compat import basestring, str, urlparse
18 | from .cookies import extract_cookies_to_jar
19 | from .utils import parse_dict_header
20 |
21 | CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded"
22 | CONTENT_TYPE_MULTI_PART = "multipart/form-data"
23 |
24 |
25 | def _basic_auth_str(username, password):
26 | """Returns a Basic Auth string."""
27 |
28 | # "I want us to put a big-ol' comment on top of it that
29 | # says that this behaviour is dumb but we need to preserve
30 | # it because people are relying on it."
31 | # - Lukasa
32 | #
33 | # These are here solely to maintain backwards compatibility
34 | # for things like ints. This will be removed in 3.0.0.
35 | if not isinstance(username, basestring):
36 | warnings.warn(
37 | "Non-string usernames will no longer be supported in Requests "
38 | "3.0.0. Please convert the object you've passed in ({!r}) to "
39 | "a string or bytes object in the near future to avoid "
40 | "problems.".format(username),
41 | category=DeprecationWarning,
42 | )
43 | username = str(username)
44 |
45 | if not isinstance(password, basestring):
46 | warnings.warn(
47 | "Non-string passwords will no longer be supported in Requests "
48 | "3.0.0. Please convert the object you've passed in ({!r}) to "
49 | "a string or bytes object in the near future to avoid "
50 | "problems.".format(type(password)),
51 | category=DeprecationWarning,
52 | )
53 | password = str(password)
54 | # -- End Removal --
55 |
56 | if isinstance(username, str):
57 | username = username.encode("latin1")
58 |
59 | if isinstance(password, str):
60 | password = password.encode("latin1")
61 |
62 | authstr = "Basic " + to_native_string(
63 | b64encode(b":".join((username, password))).strip()
64 | )
65 |
66 | return authstr
67 |
68 |
69 | class AuthBase:
70 | """Base class that all auth implementations derive from"""
71 |
72 | def __call__(self, r):
73 | raise NotImplementedError("Auth hooks must be callable.")
74 |
75 |
76 | class HTTPBasicAuth(AuthBase):
77 | """Attaches HTTP Basic Authentication to the given Request object."""
78 |
79 | def __init__(self, username, password):
80 | self.username = username
81 | self.password = password
82 |
83 | def __eq__(self, other):
84 | return all(
85 | [
86 | self.username == getattr(other, "username", None),
87 | self.password == getattr(other, "password", None),
88 | ]
89 | )
90 |
91 | def __ne__(self, other):
92 | return not self == other
93 |
94 | def __call__(self, r):
95 | r.headers["Authorization"] = _basic_auth_str(self.username, self.password)
96 | return r
97 |
98 |
99 | class HTTPProxyAuth(HTTPBasicAuth):
100 | """Attaches HTTP Proxy Authentication to a given Request object."""
101 |
102 | def __call__(self, r):
103 | r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password)
104 | return r
105 |
106 |
107 | class HTTPDigestAuth(AuthBase):
108 | """Attaches HTTP Digest Authentication to the given Request object."""
109 |
110 | def __init__(self, username, password):
111 | self.username = username
112 | self.password = password
113 | # Keep state in per-thread local storage
114 | self._thread_local = threading.local()
115 |
116 | def init_per_thread_state(self):
117 | # Ensure state is initialized just once per-thread
118 | if not hasattr(self._thread_local, "init"):
119 | self._thread_local.init = True
120 | self._thread_local.last_nonce = ""
121 | self._thread_local.nonce_count = 0
122 | self._thread_local.chal = {}
123 | self._thread_local.pos = None
124 | self._thread_local.num_401_calls = None
125 |
126 | def build_digest_header(self, method, url):
127 | """
128 | :rtype: str
129 | """
130 |
131 | realm = self._thread_local.chal["realm"]
132 | nonce = self._thread_local.chal["nonce"]
133 | qop = self._thread_local.chal.get("qop")
134 | algorithm = self._thread_local.chal.get("algorithm")
135 | opaque = self._thread_local.chal.get("opaque")
136 | hash_utf8 = None
137 |
138 | if algorithm is None:
139 | _algorithm = "MD5"
140 | else:
141 | _algorithm = algorithm.upper()
142 | # lambdas assume digest modules are imported at the top level
143 | if _algorithm == "MD5" or _algorithm == "MD5-SESS":
144 |
145 | def md5_utf8(x):
146 | if isinstance(x, str):
147 | x = x.encode("utf-8")
148 | return hashlib.md5(x).hexdigest()
149 |
150 | hash_utf8 = md5_utf8
151 | elif _algorithm == "SHA":
152 |
153 | def sha_utf8(x):
154 | if isinstance(x, str):
155 | x = x.encode("utf-8")
156 | return hashlib.sha1(x).hexdigest()
157 |
158 | hash_utf8 = sha_utf8
159 | elif _algorithm == "SHA-256":
160 |
161 | def sha256_utf8(x):
162 | if isinstance(x, str):
163 | x = x.encode("utf-8")
164 | return hashlib.sha256(x).hexdigest()
165 |
166 | hash_utf8 = sha256_utf8
167 | elif _algorithm == "SHA-512":
168 |
169 | def sha512_utf8(x):
170 | if isinstance(x, str):
171 | x = x.encode("utf-8")
172 | return hashlib.sha512(x).hexdigest()
173 |
174 | hash_utf8 = sha512_utf8
175 |
176 | KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731
177 |
178 | if hash_utf8 is None:
179 | return None
180 |
181 | # XXX not implemented yet
182 | entdig = None
183 | p_parsed = urlparse(url)
184 | #: path is request-uri defined in RFC 2616 which should not be empty
185 | path = p_parsed.path or "/"
186 | if p_parsed.query:
187 | path += f"?{p_parsed.query}"
188 |
189 | A1 = f"{self.username}:{realm}:{self.password}"
190 | A2 = f"{method}:{path}"
191 |
192 | HA1 = hash_utf8(A1)
193 | HA2 = hash_utf8(A2)
194 |
195 | if nonce == self._thread_local.last_nonce:
196 | self._thread_local.nonce_count += 1
197 | else:
198 | self._thread_local.nonce_count = 1
199 | ncvalue = f"{self._thread_local.nonce_count:08x}"
200 | s = str(self._thread_local.nonce_count).encode("utf-8")
201 | s += nonce.encode("utf-8")
202 | s += time.ctime().encode("utf-8")
203 | s += os.urandom(8)
204 |
205 | cnonce = hashlib.sha1(s).hexdigest()[:16]
206 | if _algorithm == "MD5-SESS":
207 | HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}")
208 |
209 | if not qop:
210 | respdig = KD(HA1, f"{nonce}:{HA2}")
211 | elif qop == "auth" or "auth" in qop.split(","):
212 | noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}"
213 | respdig = KD(HA1, noncebit)
214 | else:
215 | # XXX handle auth-int.
216 | return None
217 |
218 | self._thread_local.last_nonce = nonce
219 |
220 | # XXX should the partial digests be encoded too?
221 | base = (
222 | f'username="{self.username}", realm="{realm}", nonce="{nonce}", '
223 | f'uri="{path}", response="{respdig}"'
224 | )
225 | if opaque:
226 | base += f', opaque="{opaque}"'
227 | if algorithm:
228 | base += f', algorithm="{algorithm}"'
229 | if entdig:
230 | base += f', digest="{entdig}"'
231 | if qop:
232 | base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"'
233 |
234 | return f"Digest {base}"
235 |
236 | def handle_redirect(self, r, **kwargs):
237 | """Reset num_401_calls counter on redirects."""
238 | if r.is_redirect:
239 | self._thread_local.num_401_calls = 1
240 |
241 | def handle_401(self, r, **kwargs):
242 | """
243 | Takes the given response and tries digest-auth, if needed.
244 |
245 | :rtype: requests.Response
246 | """
247 |
248 | # If response is not 4xx, do not auth
249 | # See https://github.com/psf/requests/issues/3772
250 | if not 400 <= r.status_code < 500:
251 | self._thread_local.num_401_calls = 1
252 | return r
253 |
254 | if self._thread_local.pos is not None:
255 | # Rewind the file position indicator of the body to where
256 | # it was to resend the request.
257 | r.request.body.seek(self._thread_local.pos)
258 | s_auth = r.headers.get("www-authenticate", "")
259 |
260 | if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2:
261 | self._thread_local.num_401_calls += 1
262 | pat = re.compile(r"digest ", flags=re.IGNORECASE)
263 | self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1))
264 |
265 | # Consume content and release the original connection
266 | # to allow our new request to reuse the same one.
267 | r.content
268 | r.close()
269 | prep = r.request.copy()
270 | extract_cookies_to_jar(prep._cookies, r.request, r.raw)
271 | prep.prepare_cookies(prep._cookies)
272 |
273 | prep.headers["Authorization"] = self.build_digest_header(
274 | prep.method, prep.url
275 | )
276 | _r = r.connection.send(prep, **kwargs)
277 | _r.history.append(r)
278 | _r.request = prep
279 |
280 | return _r
281 |
282 | self._thread_local.num_401_calls = 1
283 | return r
284 |
285 | def __call__(self, r):
286 | # Initialize per-thread state, if needed
287 | self.init_per_thread_state()
288 | # If we have a saved nonce, skip the 401
289 | if self._thread_local.last_nonce:
290 | r.headers["Authorization"] = self.build_digest_header(r.method, r.url)
291 | try:
292 | self._thread_local.pos = r.body.tell()
293 | except AttributeError:
294 | # In the case of HTTPDigestAuth being reused and the body of
295 | # the previous request was a file-like object, pos has the
296 | # file position of the previous body. Ensure it's set to
297 | # None.
298 | self._thread_local.pos = None
299 | r.register_hook("response", self.handle_401)
300 | r.register_hook("response", self.handle_redirect)
301 | self._thread_local.num_401_calls = 1
302 |
303 | return r
304 |
305 | def __eq__(self, other):
306 | return all(
307 | [
308 | self.username == getattr(other, "username", None),
309 | self.password == getattr(other, "password", None),
310 | ]
311 | )
312 |
313 | def __ne__(self, other):
314 | return not self == other
315 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/soupsieve/css_types.py:
--------------------------------------------------------------------------------
```python
1 | """CSS selector structure items."""
2 | from __future__ import annotations
3 | import copyreg
4 | from .pretty import pretty
5 | from typing import Any, Iterator, Hashable, Pattern, Iterable, Mapping
6 |
7 | __all__ = (
8 | 'Selector',
9 | 'SelectorNull',
10 | 'SelectorTag',
11 | 'SelectorAttribute',
12 | 'SelectorContains',
13 | 'SelectorNth',
14 | 'SelectorLang',
15 | 'SelectorList',
16 | 'Namespaces',
17 | 'CustomSelectors'
18 | )
19 |
20 |
21 | SEL_EMPTY = 0x1
22 | SEL_ROOT = 0x2
23 | SEL_DEFAULT = 0x4
24 | SEL_INDETERMINATE = 0x8
25 | SEL_SCOPE = 0x10
26 | SEL_DIR_LTR = 0x20
27 | SEL_DIR_RTL = 0x40
28 | SEL_IN_RANGE = 0x80
29 | SEL_OUT_OF_RANGE = 0x100
30 | SEL_DEFINED = 0x200
31 | SEL_PLACEHOLDER_SHOWN = 0x400
32 |
33 |
34 | class Immutable:
35 | """Immutable."""
36 |
37 | __slots__: tuple[str, ...] = ('_hash',)
38 |
39 | _hash: int
40 |
41 | def __init__(self, **kwargs: Any) -> None:
42 | """Initialize."""
43 |
44 | temp = []
45 | for k, v in kwargs.items():
46 | temp.append(type(v))
47 | temp.append(v)
48 | super().__setattr__(k, v)
49 | super().__setattr__('_hash', hash(tuple(temp)))
50 |
51 | @classmethod
52 | def __base__(cls) -> type[Immutable]:
53 | """Get base class."""
54 |
55 | return cls
56 |
57 | def __eq__(self, other: Any) -> bool:
58 | """Equal."""
59 |
60 | return (
61 | isinstance(other, self.__base__()) and
62 | all(getattr(other, key) == getattr(self, key) for key in self.__slots__ if key != '_hash')
63 | )
64 |
65 | def __ne__(self, other: Any) -> bool:
66 | """Equal."""
67 |
68 | return (
69 | not isinstance(other, self.__base__()) or
70 | any(getattr(other, key) != getattr(self, key) for key in self.__slots__ if key != '_hash')
71 | )
72 |
73 | def __hash__(self) -> int:
74 | """Hash."""
75 |
76 | return self._hash
77 |
78 | def __setattr__(self, name: str, value: Any) -> None:
79 | """Prevent mutability."""
80 |
81 | raise AttributeError(f"'{self.__class__.__name__}' is immutable")
82 |
83 | def __repr__(self) -> str: # pragma: no cover
84 | """Representation."""
85 |
86 | r = ', '.join([f"{k}={getattr(self, k)!r}" for k in self.__slots__[:-1]])
87 | return f"{self.__class__.__name__}({r})"
88 |
89 | __str__ = __repr__
90 |
91 | def pretty(self) -> None: # pragma: no cover
92 | """Pretty print."""
93 |
94 | print(pretty(self))
95 |
96 |
97 | class ImmutableDict(Mapping[Any, Any]):
98 | """Hashable, immutable dictionary."""
99 |
100 | def __init__(
101 | self,
102 | arg: dict[Any, Any] | Iterable[tuple[Any, Any]]
103 | ) -> None:
104 | """Initialize."""
105 |
106 | self._validate(arg)
107 | self._d = dict(arg)
108 | self._hash = hash(tuple([(type(x), x, type(y), y) for x, y in sorted(self._d.items())]))
109 |
110 | def _validate(self, arg: dict[Any, Any] | Iterable[tuple[Any, Any]]) -> None:
111 | """Validate arguments."""
112 |
113 | if isinstance(arg, dict):
114 | if not all(isinstance(v, Hashable) for v in arg.values()):
115 | raise TypeError(f'{self.__class__.__name__} values must be hashable')
116 | elif not all(isinstance(k, Hashable) and isinstance(v, Hashable) for k, v in arg):
117 | raise TypeError(f'{self.__class__.__name__} values must be hashable')
118 |
119 | def __iter__(self) -> Iterator[Any]:
120 | """Iterator."""
121 |
122 | return iter(self._d)
123 |
124 | def __len__(self) -> int:
125 | """Length."""
126 |
127 | return len(self._d)
128 |
129 | def __getitem__(self, key: Any) -> Any:
130 | """Get item: `namespace['key']`."""
131 |
132 | return self._d[key]
133 |
134 | def __hash__(self) -> int:
135 | """Hash."""
136 |
137 | return self._hash
138 |
139 | def __repr__(self) -> str: # pragma: no cover
140 | """Representation."""
141 |
142 | return f"{self._d!r}"
143 |
144 | __str__ = __repr__
145 |
146 |
147 | class Namespaces(ImmutableDict):
148 | """Namespaces."""
149 |
150 | def __init__(self, arg: dict[str, str] | Iterable[tuple[str, str]]) -> None:
151 | """Initialize."""
152 |
153 | super().__init__(arg)
154 |
155 | def _validate(self, arg: dict[str, str] | Iterable[tuple[str, str]]) -> None:
156 | """Validate arguments."""
157 |
158 | if isinstance(arg, dict):
159 | if not all(isinstance(v, str) for v in arg.values()):
160 | raise TypeError(f'{self.__class__.__name__} values must be hashable')
161 | elif not all(isinstance(k, str) and isinstance(v, str) for k, v in arg):
162 | raise TypeError(f'{self.__class__.__name__} keys and values must be Unicode strings')
163 |
164 |
165 | class CustomSelectors(ImmutableDict):
166 | """Custom selectors."""
167 |
168 | def __init__(self, arg: dict[str, str] | Iterable[tuple[str, str]]) -> None:
169 | """Initialize."""
170 |
171 | super().__init__(arg)
172 |
173 | def _validate(self, arg: dict[str, str] | Iterable[tuple[str, str]]) -> None:
174 | """Validate arguments."""
175 |
176 | if isinstance(arg, dict):
177 | if not all(isinstance(v, str) for v in arg.values()):
178 | raise TypeError(f'{self.__class__.__name__} values must be hashable')
179 | elif not all(isinstance(k, str) and isinstance(v, str) for k, v in arg):
180 | raise TypeError(f'{self.__class__.__name__} keys and values must be Unicode strings')
181 |
182 |
183 | class Selector(Immutable):
184 | """Selector."""
185 |
186 | __slots__ = (
187 | 'tag', 'ids', 'classes', 'attributes', 'nth', 'selectors',
188 | 'relation', 'rel_type', 'contains', 'lang', 'flags', '_hash'
189 | )
190 |
191 | tag: SelectorTag | None
192 | ids: tuple[str, ...]
193 | classes: tuple[str, ...]
194 | attributes: tuple[SelectorAttribute, ...]
195 | nth: tuple[SelectorNth, ...]
196 | selectors: tuple[SelectorList, ...]
197 | relation: SelectorList
198 | rel_type: str | None
199 | contains: tuple[SelectorContains, ...]
200 | lang: tuple[SelectorLang, ...]
201 | flags: int
202 |
203 | def __init__(
204 | self,
205 | tag: SelectorTag | None,
206 | ids: tuple[str, ...],
207 | classes: tuple[str, ...],
208 | attributes: tuple[SelectorAttribute, ...],
209 | nth: tuple[SelectorNth, ...],
210 | selectors: tuple[SelectorList, ...],
211 | relation: SelectorList,
212 | rel_type: str | None,
213 | contains: tuple[SelectorContains, ...],
214 | lang: tuple[SelectorLang, ...],
215 | flags: int
216 | ):
217 | """Initialize."""
218 |
219 | super().__init__(
220 | tag=tag,
221 | ids=ids,
222 | classes=classes,
223 | attributes=attributes,
224 | nth=nth,
225 | selectors=selectors,
226 | relation=relation,
227 | rel_type=rel_type,
228 | contains=contains,
229 | lang=lang,
230 | flags=flags
231 | )
232 |
233 |
234 | class SelectorNull(Immutable):
235 | """Null Selector."""
236 |
237 | def __init__(self) -> None:
238 | """Initialize."""
239 |
240 | super().__init__()
241 |
242 |
243 | class SelectorTag(Immutable):
244 | """Selector tag."""
245 |
246 | __slots__ = ("name", "prefix", "_hash")
247 |
248 | name: str
249 | prefix: str | None
250 |
251 | def __init__(self, name: str, prefix: str | None) -> None:
252 | """Initialize."""
253 |
254 | super().__init__(name=name, prefix=prefix)
255 |
256 |
257 | class SelectorAttribute(Immutable):
258 | """Selector attribute rule."""
259 |
260 | __slots__ = ("attribute", "prefix", "pattern", "xml_type_pattern", "_hash")
261 |
262 | attribute: str
263 | prefix: str
264 | pattern: Pattern[str] | None
265 | xml_type_pattern: Pattern[str] | None
266 |
267 | def __init__(
268 | self,
269 | attribute: str,
270 | prefix: str,
271 | pattern: Pattern[str] | None,
272 | xml_type_pattern: Pattern[str] | None
273 | ) -> None:
274 | """Initialize."""
275 |
276 | super().__init__(
277 | attribute=attribute,
278 | prefix=prefix,
279 | pattern=pattern,
280 | xml_type_pattern=xml_type_pattern
281 | )
282 |
283 |
284 | class SelectorContains(Immutable):
285 | """Selector contains rule."""
286 |
287 | __slots__ = ("text", "own", "_hash")
288 |
289 | text: tuple[str, ...]
290 | own: bool
291 |
292 | def __init__(self, text: Iterable[str], own: bool) -> None:
293 | """Initialize."""
294 |
295 | super().__init__(text=tuple(text), own=own)
296 |
297 |
298 | class SelectorNth(Immutable):
299 | """Selector nth type."""
300 |
301 | __slots__ = ("a", "n", "b", "of_type", "last", "selectors", "_hash")
302 |
303 | a: int
304 | n: bool
305 | b: int
306 | of_type: bool
307 | last: bool
308 | selectors: SelectorList
309 |
310 | def __init__(self, a: int, n: bool, b: int, of_type: bool, last: bool, selectors: SelectorList) -> None:
311 | """Initialize."""
312 |
313 | super().__init__(
314 | a=a,
315 | n=n,
316 | b=b,
317 | of_type=of_type,
318 | last=last,
319 | selectors=selectors
320 | )
321 |
322 |
323 | class SelectorLang(Immutable):
324 | """Selector language rules."""
325 |
326 | __slots__ = ("languages", "_hash",)
327 |
328 | languages: tuple[str, ...]
329 |
330 | def __init__(self, languages: Iterable[str]):
331 | """Initialize."""
332 |
333 | super().__init__(languages=tuple(languages))
334 |
335 | def __iter__(self) -> Iterator[str]:
336 | """Iterator."""
337 |
338 | return iter(self.languages)
339 |
340 | def __len__(self) -> int: # pragma: no cover
341 | """Length."""
342 |
343 | return len(self.languages)
344 |
345 | def __getitem__(self, index: int) -> str: # pragma: no cover
346 | """Get item."""
347 |
348 | return self.languages[index]
349 |
350 |
351 | class SelectorList(Immutable):
352 | """Selector list."""
353 |
354 | __slots__ = ("selectors", "is_not", "is_html", "_hash")
355 |
356 | selectors: tuple[Selector | SelectorNull, ...]
357 | is_not: bool
358 | is_html: bool
359 |
360 | def __init__(
361 | self,
362 | selectors: Iterable[Selector | SelectorNull] | None = None,
363 | is_not: bool = False,
364 | is_html: bool = False
365 | ) -> None:
366 | """Initialize."""
367 |
368 | super().__init__(
369 | selectors=tuple(selectors) if selectors is not None else (),
370 | is_not=is_not,
371 | is_html=is_html
372 | )
373 |
374 | def __iter__(self) -> Iterator[Selector | SelectorNull]:
375 | """Iterator."""
376 |
377 | return iter(self.selectors)
378 |
379 | def __len__(self) -> int:
380 | """Length."""
381 |
382 | return len(self.selectors)
383 |
384 | def __getitem__(self, index: int) -> Selector | SelectorNull:
385 | """Get item."""
386 |
387 | return self.selectors[index]
388 |
389 |
390 | def _pickle(p: Any) -> Any:
391 | return p.__base__(), tuple([getattr(p, s) for s in p.__slots__[:-1]])
392 |
393 |
394 | def pickle_register(obj: Any) -> None:
395 | """Allow object to be pickled."""
396 |
397 | copyreg.pickle(obj, _pickle)
398 |
399 |
400 | pickle_register(Selector)
401 | pickle_register(SelectorNull)
402 | pickle_register(SelectorTag)
403 | pickle_register(SelectorAttribute)
404 | pickle_register(SelectorContains)
405 | pickle_register(SelectorNth)
406 | pickle_register(SelectorLang)
407 | pickle_register(SelectorList)
408 |
```