Krippa commited on
Commit
ecf179e
·
verified ·
1 Parent(s): b277d19

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +9 -0
  2. .gitignore +7 -0
  3. .venv/.gitignore +2 -0
  4. .venv/Lib/site-packages/pip-26.0.dist-info/INSTALLER +1 -0
  5. .venv/Lib/site-packages/pip-26.0.dist-info/METADATA +111 -0
  6. .venv/Lib/site-packages/pip-26.0.dist-info/RECORD +878 -0
  7. .venv/Lib/site-packages/pip-26.0.dist-info/REQUESTED +0 -0
  8. .venv/Lib/site-packages/pip-26.0.dist-info/WHEEL +4 -0
  9. .venv/Lib/site-packages/pip-26.0.dist-info/entry_points.txt +4 -0
  10. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/AUTHORS.txt +860 -0
  11. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/LICENSE.txt +20 -0
  12. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt +13 -0
  13. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/certifi/LICENSE +20 -0
  14. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt +9 -0
  15. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt +284 -0
  16. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/distro/LICENSE +202 -0
  17. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md +31 -0
  18. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/msgpack/COPYING +14 -0
  19. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE +3 -0
  20. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE +177 -0
  21. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD +23 -0
  22. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE +17 -0
  23. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE +21 -0
  24. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/pygments/LICENSE +25 -0
  25. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE +21 -0
  26. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/requests/LICENSE +175 -0
  27. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE +13 -0
  28. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/rich/LICENSE +19 -0
  29. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/tomli/LICENSE +21 -0
  30. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE +21 -0
  31. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/truststore/LICENSE +21 -0
  32. .venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt +21 -0
  33. .venv/Lib/site-packages/pip/__init__.py +13 -0
  34. .venv/Lib/site-packages/pip/__main__.py +24 -0
  35. .venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
  36. .venv/Lib/site-packages/pip/_internal/__init__.py +18 -0
  37. .venv/Lib/site-packages/pip/_internal/build_env.py +606 -0
  38. .venv/Lib/site-packages/pip/_internal/cache.py +291 -0
  39. .venv/Lib/site-packages/pip/_internal/cli/__init__.py +3 -0
  40. .venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +184 -0
  41. .venv/Lib/site-packages/pip/_internal/cli/base_command.py +255 -0
  42. .venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1267 -0
  43. .venv/Lib/site-packages/pip/_internal/cli/command_context.py +28 -0
  44. .venv/Lib/site-packages/pip/_internal/cli/index_command.py +195 -0
  45. .venv/Lib/site-packages/pip/_internal/cli/main.py +85 -0
  46. .venv/Lib/site-packages/pip/_internal/cli/main_parser.py +136 -0
  47. .venv/Lib/site-packages/pip/_internal/cli/parser.py +358 -0
  48. .venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +153 -0
  49. .venv/Lib/site-packages/pip/_internal/cli/req_command.py +447 -0
  50. .venv/Lib/site-packages/pip/_internal/cli/spinners.py +235 -0
.gitattributes CHANGED
@@ -33,3 +33,12 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ .venv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe filter=lfs diff=lfs merge=lfs -text
37
+ .venv/Lib/site-packages/pip/_vendor/distlib/t64.exe filter=lfs diff=lfs merge=lfs -text
38
+ .venv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe filter=lfs diff=lfs merge=lfs -text
39
+ .venv/Lib/site-packages/pip/_vendor/distlib/w64.exe filter=lfs diff=lfs merge=lfs -text
40
+ .venv/Scripts/pip.exe filter=lfs diff=lfs merge=lfs -text
41
+ .venv/Scripts/pip3.14.exe filter=lfs diff=lfs merge=lfs -text
42
+ .venv/Scripts/pip3.exe filter=lfs diff=lfs merge=lfs -text
43
+ .venv/Scripts/python.exe filter=lfs diff=lfs merge=lfs -text
44
+ .venv/Scripts/pythonw.exe filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ __pycache__/
2
+ *.pyc
3
+ data/
4
+ uploads/
5
+ venv/
6
+ .env
7
+ .DS_Store
.venv/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # Created by venv; see https://docs.python.org/3/library/venv.html
2
+ *
.venv/Lib/site-packages/pip-26.0.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.venv/Lib/site-packages/pip-26.0.dist-info/METADATA ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.4
2
+ Name: pip
3
+ Version: 26.0
4
+ Summary: The PyPA recommended tool for installing Python packages.
5
+ Author-email: The pip developers <distutils-sig@python.org>
6
+ Requires-Python: >=3.9
7
+ Description-Content-Type: text/x-rst
8
+ License-Expression: MIT
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Topic :: Software Development :: Build Tools
12
+ Classifier: Programming Language :: Python
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3 :: Only
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: Implementation :: CPython
22
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
23
+ License-File: AUTHORS.txt
24
+ License-File: LICENSE.txt
25
+ License-File: src/pip/_vendor/cachecontrol/LICENSE.txt
26
+ License-File: src/pip/_vendor/certifi/LICENSE
27
+ License-File: src/pip/_vendor/dependency_groups/LICENSE.txt
28
+ License-File: src/pip/_vendor/distlib/LICENSE.txt
29
+ License-File: src/pip/_vendor/distro/LICENSE
30
+ License-File: src/pip/_vendor/idna/LICENSE.md
31
+ License-File: src/pip/_vendor/msgpack/COPYING
32
+ License-File: src/pip/_vendor/packaging/LICENSE
33
+ License-File: src/pip/_vendor/packaging/LICENSE.APACHE
34
+ License-File: src/pip/_vendor/packaging/LICENSE.BSD
35
+ License-File: src/pip/_vendor/pkg_resources/LICENSE
36
+ License-File: src/pip/_vendor/platformdirs/LICENSE
37
+ License-File: src/pip/_vendor/pygments/LICENSE
38
+ License-File: src/pip/_vendor/pyproject_hooks/LICENSE
39
+ License-File: src/pip/_vendor/requests/LICENSE
40
+ License-File: src/pip/_vendor/resolvelib/LICENSE
41
+ License-File: src/pip/_vendor/rich/LICENSE
42
+ License-File: src/pip/_vendor/tomli/LICENSE
43
+ License-File: src/pip/_vendor/tomli_w/LICENSE
44
+ License-File: src/pip/_vendor/truststore/LICENSE
45
+ License-File: src/pip/_vendor/urllib3/LICENSE.txt
46
+ Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
47
+ Project-URL: Documentation, https://pip.pypa.io
48
+ Project-URL: Homepage, https://pip.pypa.io/
49
+ Project-URL: Source, https://github.com/pypa/pip
50
+
51
+ pip - The Python Package Installer
52
+ ==================================
53
+
54
+ .. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
55
+ :target: https://pypi.org/project/pip/
56
+ :alt: PyPI
57
+
58
+ .. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
59
+ :target: https://pypi.org/project/pip
60
+ :alt: PyPI - Python Version
61
+
62
+ .. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
63
+ :target: https://pip.pypa.io/en/latest
64
+ :alt: Documentation
65
+
66
+ |pypi-version| |python-versions| |docs-badge|
67
+
68
+ pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
69
+
70
+ Please take a look at our documentation for how to install and use pip:
71
+
72
+ * `Installation`_
73
+ * `Usage`_
74
+
75
+ We release updates regularly, with a new version every 3 months. Find more details in our documentation:
76
+
77
+ * `Release notes`_
78
+ * `Release process`_
79
+
80
+ If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
81
+
82
+ * `Issue tracking`_
83
+ * `Discourse channel`_
84
+ * `User IRC`_
85
+
86
+ If you want to get involved, head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
87
+
88
+ * `GitHub page`_
89
+ * `Development documentation`_
90
+ * `Development IRC`_
91
+
92
+ Code of Conduct
93
+ ---------------
94
+
95
+ Everyone interacting in the pip project's codebases, issue trackers, chat
96
+ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
97
+
98
+ .. _package installer: https://packaging.python.org/guides/tool-recommendations/
99
+ .. _Python Package Index: https://pypi.org
100
+ .. _Installation: https://pip.pypa.io/en/stable/installation/
101
+ .. _Usage: https://pip.pypa.io/en/stable/
102
+ .. _Release notes: https://pip.pypa.io/en/stable/news.html
103
+ .. _Release process: https://pip.pypa.io/en/latest/development/release-process/
104
+ .. _GitHub page: https://github.com/pypa/pip
105
+ .. _Development documentation: https://pip.pypa.io/en/latest/development
106
+ .. _Issue tracking: https://github.com/pypa/pip/issues
107
+ .. _Discourse channel: https://discuss.python.org/c/packaging
108
+ .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
109
+ .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
110
+ .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
111
+
.venv/Lib/site-packages/pip-26.0.dist-info/RECORD ADDED
@@ -0,0 +1,878 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ../../Scripts/pip.exe,sha256=7uYC7SYTjTfUpYBFOxFYlloME8DhWOnLAWN1SIS1ed0,108390
2
+ ../../Scripts/pip3.14.exe,sha256=7uYC7SYTjTfUpYBFOxFYlloME8DhWOnLAWN1SIS1ed0,108390
3
+ ../../Scripts/pip3.exe,sha256=7uYC7SYTjTfUpYBFOxFYlloME8DhWOnLAWN1SIS1ed0,108390
4
+ pip-26.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
5
+ pip-26.0.dist-info/METADATA,sha256=Ccq1LwudFqi4Sj1B5hU5HED7PHvwhwsqnSiZlBuf-sg,4673
6
+ pip-26.0.dist-info/RECORD,,
7
+ pip-26.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ pip-26.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
9
+ pip-26.0.dist-info/entry_points.txt,sha256=Vhf8s0IYgX37mtd4vGL73BPcxdKnqeCFPzB5-d30x8o,84
10
+ pip-26.0.dist-info/licenses/AUTHORS.txt,sha256=grSl9YDNOpOFFJTX8ZYKSdgfouXi_DzlRyYGE2-u5aI,11731
11
+ pip-26.0.dist-info/licenses/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
12
+ pip-26.0.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt,sha256=hu7uh74qQ_P_H1ZJb0UfaSQ5JvAl_tuwM2ZsMExMFhs,558
13
+ pip-26.0.dist-info/licenses/src/pip/_vendor/certifi/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989
14
+ pip-26.0.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt,sha256=GrNuPipLqGMWJThPh-ngkdsfrtA0xbIzJbMjmr8sxSU,1099
15
+ pip-26.0.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt,sha256=gI4QyKarjesUn_mz-xn0R6gICUYG1xKpylf-rTVSWZ0,14531
16
+ pip-26.0.dist-info/licenses/src/pip/_vendor/distro/LICENSE,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
17
+ pip-26.0.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md,sha256=t6M2q_OwThgOwGXN0W5wXQeeHMehT5EKpukYfza5zYc,1541
18
+ pip-26.0.dist-info/licenses/src/pip/_vendor/msgpack/COPYING,sha256=SS3tuoXaWHL3jmCRvNH-pHTWYNNay03ulkuKqz8AdCc,614
19
+ pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197
20
+ pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
21
+ pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344
22
+ pip-26.0.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023
23
+ pip-26.0.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE,sha256=KeD9YukphQ6G6yjD_czwzv30-pSHkBHP-z0NS-1tTbY,1089
24
+ pip-26.0.dist-info/licenses/src/pip/_vendor/pygments/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331
25
+ pip-26.0.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE,sha256=GyKwSbUmfW38I6Z79KhNjsBLn9-xpR02DkK0NCyLQVQ,1081
26
+ pip-26.0.dist-info/licenses/src/pip/_vendor/requests/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
27
+ pip-26.0.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE,sha256=84j9OMrRMRLB3A9mm76A5_hFQe26-3LzAw0sp2QsPJ0,751
28
+ pip-26.0.dist-info/licenses/src/pip/_vendor/rich/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056
29
+ pip-26.0.dist-info/licenses/src/pip/_vendor/tomli/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072
30
+ pip-26.0.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072
31
+ pip-26.0.dist-info/licenses/src/pip/_vendor/truststore/LICENSE,sha256=M757fo-k_Rmxdg4ajtimaL2rhSyRtpLdQUJLy3Jan8o,1086
32
+ pip-26.0.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt,sha256=w3vxhuJ8-dvpYZ5V7f486nswCRzrPaY8fay-Dm13kHs,1115
33
+ pip/__init__.py,sha256=LtxX36utVUnnr_SXEBokVhe7bGDR5ADLilTuDZ21g5g,353
34
+ pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
35
+ pip/__pip-runner__.py,sha256=JOoEZTwrtv7jRaXBkgSQKAE04yNyfFmGHxqpHiGHvL0,1450
36
+ pip/__pycache__/__init__.cpython-314.pyc,,
37
+ pip/__pycache__/__main__.cpython-314.pyc,,
38
+ pip/__pycache__/__pip-runner__.cpython-314.pyc,,
39
+ pip/_internal/__init__.py,sha256=S7i9Dn9aSZS0MG-2Wrve3dV9TImPzvQn5jjhp9t_uf0,511
40
+ pip/_internal/__pycache__/__init__.cpython-314.pyc,,
41
+ pip/_internal/__pycache__/build_env.cpython-314.pyc,,
42
+ pip/_internal/__pycache__/cache.cpython-314.pyc,,
43
+ pip/_internal/__pycache__/configuration.cpython-314.pyc,,
44
+ pip/_internal/__pycache__/exceptions.cpython-314.pyc,,
45
+ pip/_internal/__pycache__/main.cpython-314.pyc,,
46
+ pip/_internal/__pycache__/pyproject.cpython-314.pyc,,
47
+ pip/_internal/__pycache__/self_outdated_check.cpython-314.pyc,,
48
+ pip/_internal/__pycache__/wheel_builder.cpython-314.pyc,,
49
+ pip/_internal/build_env.py,sha256=XpgOIlTQLgz3PvDT2n7j2NzX_rVFZLCIG7t7b2ddhcM,21911
50
+ pip/_internal/cache.py,sha256=nMh48Yv3yu1HS1yCdscouu6B6B5zYBWdV6bhqs7gL-E,10345
51
+ pip/_internal/cli/__init__.py,sha256=Iqg_tKA771XuMO1P4t_sDHnSKPzkUb9D0DqunAmw_ko,131
52
+ pip/_internal/cli/__pycache__/__init__.cpython-314.pyc,,
53
+ pip/_internal/cli/__pycache__/autocompletion.cpython-314.pyc,,
54
+ pip/_internal/cli/__pycache__/base_command.cpython-314.pyc,,
55
+ pip/_internal/cli/__pycache__/cmdoptions.cpython-314.pyc,,
56
+ pip/_internal/cli/__pycache__/command_context.cpython-314.pyc,,
57
+ pip/_internal/cli/__pycache__/index_command.cpython-314.pyc,,
58
+ pip/_internal/cli/__pycache__/main.cpython-314.pyc,,
59
+ pip/_internal/cli/__pycache__/main_parser.cpython-314.pyc,,
60
+ pip/_internal/cli/__pycache__/parser.cpython-314.pyc,,
61
+ pip/_internal/cli/__pycache__/progress_bars.cpython-314.pyc,,
62
+ pip/_internal/cli/__pycache__/req_command.cpython-314.pyc,,
63
+ pip/_internal/cli/__pycache__/spinners.cpython-314.pyc,,
64
+ pip/_internal/cli/__pycache__/status_codes.cpython-314.pyc,,
65
+ pip/_internal/cli/autocompletion.py,sha256=ZG2cM03nlcNrs-WG_SFTW46isx9s2Go5lUD_8-iv70o,7193
66
+ pip/_internal/cli/base_command.py,sha256=6OW75PSGzkH8Fz761WZ3OSz1TsuO3-suc6iap-sQjTM,9168
67
+ pip/_internal/cli/cmdoptions.py,sha256=hfA9B29Nnq2vYMWhFVg7EcWjdlfdPBPU4WwWT2Lkq4A,36164
68
+ pip/_internal/cli/command_context.py,sha256=kmu3EWZbfBega1oDamnGJTA_UaejhIQNuMj2CVmMXu0,817
69
+ pip/_internal/cli/index_command.py,sha256=s3x75lpDXWJtCkBacTQ3qAAprldHMJCniEQ5qkQ0FiI,6484
70
+ pip/_internal/cli/main.py,sha256=ljDQBkvBtC8xTjOdb6rDJzJUNi1s-PnVR_W5C-Mq0Dk,3137
71
+ pip/_internal/cli/main_parser.py,sha256=YjzJAjqf78ARNsLlnJT9l6fNbpyDPJA-arOIXYsK5Ik,4403
72
+ pip/_internal/cli/parser.py,sha256=EIFExrWX_1nrl1Ib--GOor70WYqLtduHByenb1u9xH4,13827
73
+ pip/_internal/cli/progress_bars.py,sha256=IW1PH5n2FPqUBTP7ULQ5Yu-wyNNO9XGY3g1PT4RMu44,4706
74
+ pip/_internal/cli/req_command.py,sha256=QjDXId0hFdopwE8hNx2eustumxUNbnOCvG_ORmUC7vM,16482
75
+ pip/_internal/cli/spinners.py,sha256=EJzZIZNyUtJljp3-WjcsyIrqxW-HUsfWzhuW84n_Tqw,7362
76
+ pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
77
+ pip/_internal/commands/__init__.py,sha256=aNeCbQurGWihfhQq7BqaLXHqWDQ0i3I04OS7kxK6plQ,4026
78
+ pip/_internal/commands/__pycache__/__init__.cpython-314.pyc,,
79
+ pip/_internal/commands/__pycache__/cache.cpython-314.pyc,,
80
+ pip/_internal/commands/__pycache__/check.cpython-314.pyc,,
81
+ pip/_internal/commands/__pycache__/completion.cpython-314.pyc,,
82
+ pip/_internal/commands/__pycache__/configuration.cpython-314.pyc,,
83
+ pip/_internal/commands/__pycache__/debug.cpython-314.pyc,,
84
+ pip/_internal/commands/__pycache__/download.cpython-314.pyc,,
85
+ pip/_internal/commands/__pycache__/freeze.cpython-314.pyc,,
86
+ pip/_internal/commands/__pycache__/hash.cpython-314.pyc,,
87
+ pip/_internal/commands/__pycache__/help.cpython-314.pyc,,
88
+ pip/_internal/commands/__pycache__/index.cpython-314.pyc,,
89
+ pip/_internal/commands/__pycache__/inspect.cpython-314.pyc,,
90
+ pip/_internal/commands/__pycache__/install.cpython-314.pyc,,
91
+ pip/_internal/commands/__pycache__/list.cpython-314.pyc,,
92
+ pip/_internal/commands/__pycache__/lock.cpython-314.pyc,,
93
+ pip/_internal/commands/__pycache__/search.cpython-314.pyc,,
94
+ pip/_internal/commands/__pycache__/show.cpython-314.pyc,,
95
+ pip/_internal/commands/__pycache__/uninstall.cpython-314.pyc,,
96
+ pip/_internal/commands/__pycache__/wheel.cpython-314.pyc,,
97
+ pip/_internal/commands/cache.py,sha256=XjT7kjY8GSISMksFHsLvjS9Ogfi5extNlUUv-dUoWCM,9142
98
+ pip/_internal/commands/check.py,sha256=hVFBQezQ3zj4EydoWbFQj_afPUppMt7r9JPAlY22U6Y,2244
99
+ pip/_internal/commands/completion.py,sha256=LjvRIZ6QUiDXJL3IOMFeD-_J97HfjMGgEk0j2tWGu1U,4565
100
+ pip/_internal/commands/configuration.py,sha256=6gNOGrVWnOLU15zUnAiNuOMhf76RRIZvCdVD0degPRk,10105
101
+ pip/_internal/commands/debug.py,sha256=_8IqM8Fx1_lY2STu_qspr63tufF7zyFJCyYAXtxz0N4,6805
102
+ pip/_internal/commands/download.py,sha256=LUNVobuvCdagjLBuPBaxHeBiHEiIe03fTO2m6ahC8qw,5178
103
+ pip/_internal/commands/freeze.py,sha256=fxoW8AAc-bAqB_fXdNq2VnZ3JfWkFMg-bR6LcdDVO7A,3099
104
+ pip/_internal/commands/hash.py,sha256=GO9pRN3wXC2kQaovK57TaLYBMc3IltOH92O6QEw6YE0,1679
105
+ pip/_internal/commands/help.py,sha256=Bz3LcjNQXkz4Cu__pL4CZ86o4-HNLZj1NZWdlJhjuu0,1108
106
+ pip/_internal/commands/index.py,sha256=kDpx2MO6ZxTt5PpeY4jqcssVbYhzxpkpreDe_6PPhks,5520
107
+ pip/_internal/commands/inspect.py,sha256=ogm4UT7LRo8bIQcWUS1IiA25QdD4VHLa7JaPAodDttM,3177
108
+ pip/_internal/commands/install.py,sha256=L6X1qi49ROVTGABhwwxDgBBTijlOpVn6XSDVZ7QW1Kc,30588
109
+ pip/_internal/commands/list.py,sha256=L5nWuwawqSrBNsuxfyHLAagfz7XJP86tC9nK3L9YiI8,13497
110
+ pip/_internal/commands/lock.py,sha256=145ihjUK_-7gP8O65XPDi_xMhlh5hne1ptkHdfnbAnQ,6027
111
+ pip/_internal/commands/search.py,sha256=zbMsX_YASj6kXA6XIBgTDv0bGK51xG-CV3IynZJcE-c,5782
112
+ pip/_internal/commands/show.py,sha256=oLVJIfKWmDKm0SsQGEi3pozNiqrXjTras_fbBSYKpBA,8066
113
+ pip/_internal/commands/uninstall.py,sha256=CsOihqvb6ZA6O67L70oXeoLHeOfNzMM88H9g-9aocgw,3868
114
+ pip/_internal/commands/wheel.py,sha256=L9vEzJ_E42scF_Hgh5X4Hk39nqJDKxGg4u7glDYbNWc,5880
115
+ pip/_internal/configuration.py,sha256=WxwwSwY_Bm6QzDgf32BsujEyO8dgRedegCpgbUfDvM8,14568
116
+ pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
117
+ pip/_internal/distributions/__pycache__/__init__.cpython-314.pyc,,
118
+ pip/_internal/distributions/__pycache__/base.cpython-314.pyc,,
119
+ pip/_internal/distributions/__pycache__/installed.cpython-314.pyc,,
120
+ pip/_internal/distributions/__pycache__/sdist.cpython-314.pyc,,
121
+ pip/_internal/distributions/__pycache__/wheel.cpython-314.pyc,,
122
+ pip/_internal/distributions/base.py,sha256=l-OTCAIs25lsapejA6IYpPZxSM5-BET4sdZDkql8jiY,1830
123
+ pip/_internal/distributions/installed.py,sha256=kgIEE_1NzjZxLBSC-v5s64uOFZlVEt3aPrjTtL6x2XY,929
124
+ pip/_internal/distributions/sdist.py,sha256=RYwQIbuxpKy6OjlBZCAefxpMDaoocUQ4dFtheGsiTOQ,6627
125
+ pip/_internal/distributions/wheel.py,sha256=_HbG0OehF8dwj4UX-xV__tXLwgPus9OjMEf2NTRqBbE,1364
126
+ pip/_internal/exceptions.py,sha256=JdPCrQ9iTLvE-GBebzBEeGP3hoTffWEKqbYEsa6cEZc,32165
127
+ pip/_internal/index/__init__.py,sha256=tzwMH_fhQeubwMqHdSivasg1cRgTSbNg2CiMVnzMmyU,29
128
+ pip/_internal/index/__pycache__/__init__.cpython-314.pyc,,
129
+ pip/_internal/index/__pycache__/collector.cpython-314.pyc,,
130
+ pip/_internal/index/__pycache__/package_finder.cpython-314.pyc,,
131
+ pip/_internal/index/__pycache__/sources.cpython-314.pyc,,
132
+ pip/_internal/index/collector.py,sha256=R7Gcx_4GEoSEI-iazfAZVEPG3Lp6mbZT4lbAD6NjAc0,16144
133
+ pip/_internal/index/package_finder.py,sha256=a3_L4FDNsuDf3y8Af9J7sfsHR1ahs8o13Ths-WYwFh0,41776
134
+ pip/_internal/index/sources.py,sha256=nXJkOjhLy-O2FsrKU9RIqCOqgY2PsoKWybtZjjRgqU0,8639
135
+ pip/_internal/locations/__init__.py,sha256=Sd67ap1LIemvXArUDFqm8U-HuZvj9i3ApEuiIwUc9UE,14157
136
+ pip/_internal/locations/__pycache__/__init__.cpython-314.pyc,,
137
+ pip/_internal/locations/__pycache__/_distutils.cpython-314.pyc,,
138
+ pip/_internal/locations/__pycache__/_sysconfig.cpython-314.pyc,,
139
+ pip/_internal/locations/__pycache__/base.cpython-314.pyc,,
140
+ pip/_internal/locations/_distutils.py,sha256=jpFj4V00rD9IR3vA9TqrGkwcdNVFc58LsChZavge9JY,5975
141
+ pip/_internal/locations/_sysconfig.py,sha256=8CpTjtxaCzHSCrKpaxWnHE7aKcJrRJRmntR1ZLVysLk,7779
142
+ pip/_internal/locations/base.py,sha256=AImjYJWxOtDkc0KKc6Y4Gz677cg91caMA4L94B9FZEg,2550
143
+ pip/_internal/main.py,sha256=1cHqjsfFCrMFf3B5twzocxTJUdHMLoXUpy5lJoFqUi8,338
144
+ pip/_internal/metadata/__init__.py,sha256=vp-JAxiWg_-l5F8AT0Jcey72uUnh8CDwwol9-KktHZ8,5824
145
+ pip/_internal/metadata/__pycache__/__init__.cpython-314.pyc,,
146
+ pip/_internal/metadata/__pycache__/_json.cpython-314.pyc,,
147
+ pip/_internal/metadata/__pycache__/base.cpython-314.pyc,,
148
+ pip/_internal/metadata/__pycache__/pkg_resources.cpython-314.pyc,,
149
+ pip/_internal/metadata/_json.py,sha256=hNvnMHOXLAyNlzirWhPL9Nx2CvCqa1iRma6Osq1YfV8,2711
150
+ pip/_internal/metadata/base.py,sha256=BGuMenlcQT8i7j9iclrfdC3vSwgvhr8gjn955cCy16s,25420
151
+ pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
152
+ pip/_internal/metadata/importlib/__pycache__/__init__.cpython-314.pyc,,
153
+ pip/_internal/metadata/importlib/__pycache__/_compat.cpython-314.pyc,,
154
+ pip/_internal/metadata/importlib/__pycache__/_dists.cpython-314.pyc,,
155
+ pip/_internal/metadata/importlib/__pycache__/_envs.cpython-314.pyc,,
156
+ pip/_internal/metadata/importlib/_compat.py,sha256=sneVh4_6WxQZK4ljdl3ylVuP-q0ttSqbgl9mWt0HnOg,2804
157
+ pip/_internal/metadata/importlib/_dists.py,sha256=znZD7MN4RC73-87KXAn6tKZv9lAQRI0AxxK2bubDvPw,8420
158
+ pip/_internal/metadata/importlib/_envs.py,sha256=H3qVLXVh4LWvrPvu_ekXf3dfbtwnlhNJQP2pxXpccfU,5333
159
+ pip/_internal/metadata/pkg_resources.py,sha256=NO76ZrfR2-LKJTyaXrmQoGhmJMArALvacrlZHViSDT8,10544
160
+ pip/_internal/models/__init__.py,sha256=AjmCEBxX_MH9f_jVjIGNCFJKYCYeSEe18yyvNx4uRKQ,62
161
+ pip/_internal/models/__pycache__/__init__.cpython-314.pyc,,
162
+ pip/_internal/models/__pycache__/candidate.cpython-314.pyc,,
163
+ pip/_internal/models/__pycache__/direct_url.cpython-314.pyc,,
164
+ pip/_internal/models/__pycache__/format_control.cpython-314.pyc,,
165
+ pip/_internal/models/__pycache__/index.cpython-314.pyc,,
166
+ pip/_internal/models/__pycache__/installation_report.cpython-314.pyc,,
167
+ pip/_internal/models/__pycache__/link.cpython-314.pyc,,
168
+ pip/_internal/models/__pycache__/release_control.cpython-314.pyc,,
169
+ pip/_internal/models/__pycache__/scheme.cpython-314.pyc,,
170
+ pip/_internal/models/__pycache__/search_scope.cpython-314.pyc,,
171
+ pip/_internal/models/__pycache__/selection_prefs.cpython-314.pyc,,
172
+ pip/_internal/models/__pycache__/target_python.cpython-314.pyc,,
173
+ pip/_internal/models/__pycache__/wheel.cpython-314.pyc,,
174
+ pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
175
+ pip/_internal/models/direct_url.py,sha256=4NMWacu_QzPPWREC1te7v6Wfv-2HkI4tvSJF-CBgLh4,6555
176
+ pip/_internal/models/format_control.py,sha256=PwemYG1L27BM0f1KP61rm24wShENFyxqlD1TWu34alc,2471
177
+ pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
178
+ pip/_internal/models/installation_report.py,sha256=cqfWJ93ThCxjcacqSWryOCD2XtIn1CZrgzZxAv5FQZ0,2839
179
+ pip/_internal/models/link.py,sha256=zti5UCx1hT03etYqm6MCqFd714clmTgX8rTZT9CKZDQ,21992
180
+ pip/_internal/models/release_control.py,sha256=XD14Hy_XLh9xWR1p7JHqPZPEv3Nnb1BZGMpClk76sLs,3403
181
+ pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
182
+ pip/_internal/models/search_scope.py,sha256=1hxU2IVsAaLZVjp0CbzJbYaYzCxv72_Qbg3JL0qhXo0,4507
183
+ pip/_internal/models/selection_prefs.py,sha256=IDOA3euRtyqWUyIK7lX2bzIZasYiEvunKA6H3Mngk-M,2221
184
+ pip/_internal/models/target_python.py,sha256=I0eFS-eia3kwhrOvgsphFZtNAB2IwXZ9Sr9fp6IjBP4,4243
185
+ pip/_internal/models/wheel.py,sha256=1SdfDvN7ALTsbyZ9EOsNy1GPirP1n6EjHyzPrZyLSh8,2920
186
+ pip/_internal/network/__init__.py,sha256=FMy06P__y6jMjUc8z3ZcQdKF-pmZ2zM14_vBeHPGhUI,49
187
+ pip/_internal/network/__pycache__/__init__.cpython-314.pyc,,
188
+ pip/_internal/network/__pycache__/auth.cpython-314.pyc,,
189
+ pip/_internal/network/__pycache__/cache.cpython-314.pyc,,
190
+ pip/_internal/network/__pycache__/download.cpython-314.pyc,,
191
+ pip/_internal/network/__pycache__/lazy_wheel.cpython-314.pyc,,
192
+ pip/_internal/network/__pycache__/session.cpython-314.pyc,,
193
+ pip/_internal/network/__pycache__/utils.cpython-314.pyc,,
194
+ pip/_internal/network/__pycache__/xmlrpc.cpython-314.pyc,,
195
+ pip/_internal/network/auth.py,sha256=azFp14I9cyWAAzkxF2VM0Q_xtHnbNz3_NQXszy87KQo,20806
196
+ pip/_internal/network/cache.py,sha256=kmRXKQrG9E26xQRj211LHeEGpDg_SlYU9Dn1fJ-AMeI,4862
197
+ pip/_internal/network/download.py,sha256=8sVwIc9MWwpGlMPYCkO1S9U-FD8TA2utw42tj00skjM,12667
198
+ pip/_internal/network/lazy_wheel.py,sha256=y9gVksdJCSjnLfYzs_m3DYUAtl3hc_k-xFPDBd9DgOs,7646
199
+ pip/_internal/network/session.py,sha256=7zK7EeQCSRFipu4ZzcWl1V3AMKkiXdtGqFr7GvU2LrY,19555
200
+ pip/_internal/network/utils.py,sha256=ACsXd1msqNCidHVXsu7LHUSr8NgaypcOKQ4KG-Z_wJM,4091
201
+ pip/_internal/network/xmlrpc.py,sha256=_-Rnk3vOff8uF9hAGmT6SLALflY1gMBcbGwS12fb_Y4,1830
202
+ pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
203
+ pip/_internal/operations/__pycache__/__init__.cpython-314.pyc,,
204
+ pip/_internal/operations/__pycache__/check.cpython-314.pyc,,
205
+ pip/_internal/operations/__pycache__/freeze.cpython-314.pyc,,
206
+ pip/_internal/operations/__pycache__/prepare.cpython-314.pyc,,
207
+ pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
+ pip/_internal/operations/build/__pycache__/__init__.cpython-314.pyc,,
209
+ pip/_internal/operations/build/__pycache__/build_tracker.cpython-314.pyc,,
210
+ pip/_internal/operations/build/__pycache__/metadata.cpython-314.pyc,,
211
+ pip/_internal/operations/build/__pycache__/metadata_editable.cpython-314.pyc,,
212
+ pip/_internal/operations/build/__pycache__/wheel.cpython-314.pyc,,
213
+ pip/_internal/operations/build/__pycache__/wheel_editable.cpython-314.pyc,,
214
+ pip/_internal/operations/build/build_tracker.py,sha256=W3b5cmkMWPaE6QIwfzsTayJo7-OlxFHWDxfPuax1KcE,4771
215
+ pip/_internal/operations/build/metadata.py,sha256=INHaeiRfOiLYCXApfDNRo9Cw2xI4VwTc0KItvfdfOjk,1421
216
+ pip/_internal/operations/build/metadata_editable.py,sha256=oWudMsnjy4loO_Jy7g4N9nxsnaEX_iDlVRgCy7pu1rs,1509
217
+ pip/_internal/operations/build/wheel.py,sha256=3bP-nNiJ4S8JvMaBnyessXQUBhxTqt1GBx6DQ1iPJDY,1136
218
+ pip/_internal/operations/build/wheel_editable.py,sha256=q3kfElclM6FutVbFwE87JOTpVWt5ixDf3_UkHAIVfz4,1478
219
+ pip/_internal/operations/check.py,sha256=yC2XWth6iehGGE_fj7XRJLjVKBsTIG3ZoWRkFi3rOwc,5894
220
+ pip/_internal/operations/freeze.py,sha256=PDdY-y_ZtZZJLAKcaWPIGRKAGW7DXR48f0aMRU0j7BA,9854
221
+ pip/_internal/operations/install/__init__.py,sha256=ak-UETcQPKlFZaWoYKWu5QVXbpFBvg0sXc3i0O4vSYY,50
222
+ pip/_internal/operations/install/__pycache__/__init__.cpython-314.pyc,,
223
+ pip/_internal/operations/install/__pycache__/wheel.cpython-314.pyc,,
224
+ pip/_internal/operations/install/wheel.py,sha256=FQIl2AnNadHV5YGGOVEmOHtUUNO8lpzj3Icoo4S2xis,27923
225
+ pip/_internal/operations/prepare.py,sha256=ptVsmQf0Mo6jirk1Q5Djdse_wJw5Zdh1Fla2iL9HAJM,28830
226
+ pip/_internal/pyproject.py,sha256=J-sTWqC-XfsKQgz9m1bypMWZPHItsSHzIN_NWeIRmhM,4555
227
+ pip/_internal/req/__init__.py,sha256=WcY9z7D3rlIKX1QY8_tRnAsS_poebiGGdtQ7EJ5JQQo,3041
228
+ pip/_internal/req/__pycache__/__init__.cpython-314.pyc,,
229
+ pip/_internal/req/__pycache__/constructors.cpython-314.pyc,,
230
+ pip/_internal/req/__pycache__/pep723.cpython-314.pyc,,
231
+ pip/_internal/req/__pycache__/req_dependency_group.cpython-314.pyc,,
232
+ pip/_internal/req/__pycache__/req_file.cpython-314.pyc,,
233
+ pip/_internal/req/__pycache__/req_install.cpython-314.pyc,,
234
+ pip/_internal/req/__pycache__/req_set.cpython-314.pyc,,
235
+ pip/_internal/req/__pycache__/req_uninstall.cpython-314.pyc,,
236
+ pip/_internal/req/constructors.py,sha256=R-6n8irjnaa2DMMXlR4YMouXzykFBlzUFjhOZ1NcUUg,18688
237
+ pip/_internal/req/pep723.py,sha256=olZL3tLmHWJhyLNfbD6U9UuikuzTcLDB06qd9WavTjs,1225
238
+ pip/_internal/req/req_dependency_group.py,sha256=0yEQCUaO5Bza66Y3D5o9JRf0qII5QgCRugn1x5aRivA,2618
239
+ pip/_internal/req/req_file.py,sha256=qF_UPRvvNEpyhsamaT7VwpW1fov7icbNsb3Nmcmm8OU,20506
240
+ pip/_internal/req/req_install.py,sha256=vv5cbs3P5gf43e_1v72gwSQ2N_D_qpsfuXOyerMhDuI,31273
241
+ pip/_internal/req/req_set.py,sha256=awkqIXnYA4Prmsj0Qb3zhqdbYUmXd-1o0P-KZ3mvRQs,2828
242
+ pip/_internal/req/req_uninstall.py,sha256=dCmOHt-9RaJBq921L4tMH3PmIBDetGplnbjRKXmGt00,24099
243
+ pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
244
+ pip/_internal/resolution/__pycache__/__init__.cpython-314.pyc,,
245
+ pip/_internal/resolution/__pycache__/base.cpython-314.pyc,,
246
+ pip/_internal/resolution/base.py,sha256=RIsqSP79olPdOgtPKW-oOQ364ICVopehA6RfGkRfe2s,577
247
+ pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
248
+ pip/_internal/resolution/legacy/__pycache__/__init__.cpython-314.pyc,,
249
+ pip/_internal/resolution/legacy/__pycache__/resolver.cpython-314.pyc,,
250
+ pip/_internal/resolution/legacy/resolver.py,sha256=bwUqE66etz2bcPabqxed18-iyqqb-kx3Er2aT6GeUJY,24060
251
+ pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
252
+ pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-314.pyc,,
253
+ pip/_internal/resolution/resolvelib/__pycache__/base.cpython-314.pyc,,
254
+ pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-314.pyc,,
255
+ pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-314.pyc,,
256
+ pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-314.pyc,,
257
+ pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-314.pyc,,
258
+ pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-314.pyc,,
259
+ pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-314.pyc,,
260
+ pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-314.pyc,,
261
+ pip/_internal/resolution/resolvelib/base.py,sha256=_AoP0ZWlaSct8CRDn2ol3CbNn4zDtnh_0zQGjXASDKI,5047
262
+ pip/_internal/resolution/resolvelib/candidates.py,sha256=50AN7BfB-pCfEmbKNlFZSXtdC0C8ms1waJrF2arknQE,20454
263
+ pip/_internal/resolution/resolvelib/factory.py,sha256=82mLwnPlig37mMrDwcgKHJTE9mPczVuJIxeaUb7CQ0Y,34028
264
+ pip/_internal/resolution/resolvelib/found_candidates.py,sha256=8bZYDCZLXSdLHy_s1o5f4r15HmKvqFUhzBUQOF21Lr4,6018
265
+ pip/_internal/resolution/resolvelib/provider.py,sha256=tbVPfFv4Vg780yZ2_XGoGFP5LVo0U2bFnZov3jpSAIk,11441
266
+ pip/_internal/resolution/resolvelib/reporter.py,sha256=faSgjqme0k_uzv1fvM5T0ZatPQ2eEktNvKBqfvXeGjc,3909
267
+ pip/_internal/resolution/resolvelib/requirements.py,sha256=Izl9n8nc188lA1BSPS8QxfudfDQPHgngw-ij6hXt0nQ,8239
268
+ pip/_internal/resolution/resolvelib/resolver.py,sha256=wQ94Hkep-7kWEHAc-NbMJhmzeEzgEAtxeBxyKVzZoeo,13437
269
+ pip/_internal/self_outdated_check.py,sha256=zDKsyLMufFHuEZY16WRu129FBbBp-ADuxyWMIN4ihPE,8284
270
+ pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
271
+ pip/_internal/utils/__pycache__/__init__.cpython-314.pyc,,
272
+ pip/_internal/utils/__pycache__/_jaraco_text.cpython-314.pyc,,
273
+ pip/_internal/utils/__pycache__/_log.cpython-314.pyc,,
274
+ pip/_internal/utils/__pycache__/appdirs.cpython-314.pyc,,
275
+ pip/_internal/utils/__pycache__/compat.cpython-314.pyc,,
276
+ pip/_internal/utils/__pycache__/compatibility_tags.cpython-314.pyc,,
277
+ pip/_internal/utils/__pycache__/datetime.cpython-314.pyc,,
278
+ pip/_internal/utils/__pycache__/deprecation.cpython-314.pyc,,
279
+ pip/_internal/utils/__pycache__/direct_url_helpers.cpython-314.pyc,,
280
+ pip/_internal/utils/__pycache__/egg_link.cpython-314.pyc,,
281
+ pip/_internal/utils/__pycache__/entrypoints.cpython-314.pyc,,
282
+ pip/_internal/utils/__pycache__/filesystem.cpython-314.pyc,,
283
+ pip/_internal/utils/__pycache__/filetypes.cpython-314.pyc,,
284
+ pip/_internal/utils/__pycache__/glibc.cpython-314.pyc,,
285
+ pip/_internal/utils/__pycache__/hashes.cpython-314.pyc,,
286
+ pip/_internal/utils/__pycache__/logging.cpython-314.pyc,,
287
+ pip/_internal/utils/__pycache__/misc.cpython-314.pyc,,
288
+ pip/_internal/utils/__pycache__/packaging.cpython-314.pyc,,
289
+ pip/_internal/utils/__pycache__/pylock.cpython-314.pyc,,
290
+ pip/_internal/utils/__pycache__/retry.cpython-314.pyc,,
291
+ pip/_internal/utils/__pycache__/subprocess.cpython-314.pyc,,
292
+ pip/_internal/utils/__pycache__/temp_dir.cpython-314.pyc,,
293
+ pip/_internal/utils/__pycache__/unpacking.cpython-314.pyc,,
294
+ pip/_internal/utils/__pycache__/urls.cpython-314.pyc,,
295
+ pip/_internal/utils/__pycache__/virtualenv.cpython-314.pyc,,
296
+ pip/_internal/utils/__pycache__/wheel.cpython-314.pyc,,
297
+ pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
298
+ pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
299
+ pip/_internal/utils/appdirs.py,sha256=LrzDPZMKVh0rubtCx9vu3XlZbLCSug6VSj4Qsvt66BA,1681
300
+ pip/_internal/utils/compat.py,sha256=C9LHXJAKkwAH8Hn3nPkz9EYK3rqPBeO_IXkOG2zzsdQ,2514
301
+ pip/_internal/utils/compatibility_tags.py,sha256=DiNSLqpuruXUamGQwOJ2WZByDGLTGaXi9O-Xf8fOi34,6630
302
+ pip/_internal/utils/datetime.py,sha256=kuJOf1mW8G5tRFN6jWardddS-9qSaR53lK1jmx3NTZY,868
303
+ pip/_internal/utils/deprecation.py,sha256=HVhvyO5qiRFcG88PhZlp_87qdKQNwPTUIIHWtsTR2yI,3696
304
+ pip/_internal/utils/direct_url_helpers.py,sha256=ttKv4GMUqlRwPPog9_CUopy6SDgoxVILzeBJzgfn2tg,3200
305
+ pip/_internal/utils/egg_link.py,sha256=YWfsrbmfcrfWgqQYy6OuIjsyb9IfL1q_2v4zsms1WjI,2459
306
+ pip/_internal/utils/entrypoints.py,sha256=uPjAyShKObdotjQjJUzprQ6r3xQvDIZwUYfHHqZ7Dok,3324
307
+ pip/_internal/utils/filesystem.py,sha256=mJ_PP8z1V1x4HMhydWIWDyEmWikLX0f-NXPCXEcjiLo,6892
308
+ pip/_internal/utils/filetypes.py,sha256=sEMa38qaqjvx1Zid3OCAUja31BOBU-USuSMPBvU3yjo,689
309
+ pip/_internal/utils/glibc.py,sha256=sEh8RJJLYSdRvTqAO4THVPPA-YSDVLD4SI9So-bxX1U,3726
310
+ pip/_internal/utils/hashes.py,sha256=d32UI1en8nyqZzdZQvxUVdfeBoe4ADWx7HtrIM4-XQ4,4998
311
+ pip/_internal/utils/logging.py,sha256=6lJWMC6c7_aD_i4sdgaaeb-Tm3kWpYg0hba_V1-OLnE,13414
312
+ pip/_internal/utils/misc.py,sha256=phFIbHm2kmliHDXJ0eNPxgGP423ZpvZoMKKtJ1_Zvjs,23722
313
+ pip/_internal/utils/packaging.py,sha256=s5tpUmFumwV0H9JSTzryrIY4JwQM8paGt7Sm7eNwt2Y,1601
314
+ pip/_internal/utils/pylock.py,sha256=nKQknZgyswWgzi--hRQX_DLUYQ3g5wGTCwVNQNdoJ54,3817
315
+ pip/_internal/utils/retry.py,sha256=83wReEB2rcntMZ5VLd7ascaYSjn_kLdlQCqxILxWkPM,1461
316
+ pip/_internal/utils/subprocess.py,sha256=r4-Ba_Yc3uZXQpi0K4pZFsCT_QqdSvtF3XJ-204QWaA,8983
317
+ pip/_internal/utils/temp_dir.py,sha256=D9c8D7WOProOO8GGDqpBeVSj10NGFmunG0o2TodjjIU,9307
318
+ pip/_internal/utils/unpacking.py,sha256=4hNg6dqHOn_KzGCzSC76nChG97d_UjtF9AnLSof672o,12972
319
+ pip/_internal/utils/urls.py,sha256=aF_eg9ul5d8bMCxfSSSxQcfs-OpJdbStYqZHoy2K1RE,1601
320
+ pip/_internal/utils/virtualenv.py,sha256=mX-UPyw1MPxhwUxKhbqWWX70J6PHXAJjVVrRnG0h9mc,3455
321
+ pip/_internal/utils/wheel.py,sha256=YdRuj6MicG-Q9Mg03FbUv1WTLam6Lc7AgijY4voVyis,4468
322
+ pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
323
+ pip/_internal/vcs/__pycache__/__init__.cpython-314.pyc,,
324
+ pip/_internal/vcs/__pycache__/bazaar.cpython-314.pyc,,
325
+ pip/_internal/vcs/__pycache__/git.cpython-314.pyc,,
326
+ pip/_internal/vcs/__pycache__/mercurial.cpython-314.pyc,,
327
+ pip/_internal/vcs/__pycache__/subversion.cpython-314.pyc,,
328
+ pip/_internal/vcs/__pycache__/versioncontrol.cpython-314.pyc,,
329
+ pip/_internal/vcs/bazaar.py,sha256=3W1eHjkYx2vc6boeb2NBh4I_rlGAXM-vrzfNhLm1Rxg,3734
330
+ pip/_internal/vcs/git.py,sha256=TTeqDuzS-_BFSNuUStVWmE2nGDpKuvUhBBJk_CCQXV0,19144
331
+ pip/_internal/vcs/mercurial.py,sha256=w1ZJWLKqNP1onEjkfjlwBVnMqPZNSIER8ayjQcnTq4w,5575
332
+ pip/_internal/vcs/subversion.py,sha256=uUgdPvxmvEB8Qwtjr0Hc0XgFjbiNi5cbvI4vARLOJXo,11787
333
+ pip/_internal/vcs/versioncontrol.py,sha256=Ma_HMZBVveSkeYvxacvqeujnkSIaF1XjxTsS3BwcJ8E,22599
334
+ pip/_internal/wheel_builder.py,sha256=yvEULStZtty9Kplp89tDis3hGdyKQ-2BUbFLmJ_5ink,9010
335
+ pip/_vendor/README.rst,sha256=pKKBwCWhu3M3qQ9dDnsmxb3KdsRr-nWmMq2srbH_Bi0,9394
336
+ pip/_vendor/__init__.py,sha256=WzusPTGWIMeQQWSVJ0h2rafGkVTa9WKJ2HT-2-EoZrU,4907
337
+ pip/_vendor/__pycache__/__init__.cpython-314.pyc,,
338
+ pip/_vendor/cachecontrol/LICENSE.txt,sha256=hu7uh74qQ_P_H1ZJb0UfaSQ5JvAl_tuwM2ZsMExMFhs,558
339
+ pip/_vendor/cachecontrol/__init__.py,sha256=GxwRkm_TQBtPZpfpVK9r6S9dAy2DVnVgDVHJKTiPZ1k,820
340
+ pip/_vendor/cachecontrol/__pycache__/__init__.cpython-314.pyc,,
341
+ pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-314.pyc,,
342
+ pip/_vendor/cachecontrol/__pycache__/adapter.cpython-314.pyc,,
343
+ pip/_vendor/cachecontrol/__pycache__/cache.cpython-314.pyc,,
344
+ pip/_vendor/cachecontrol/__pycache__/controller.cpython-314.pyc,,
345
+ pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-314.pyc,,
346
+ pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-314.pyc,,
347
+ pip/_vendor/cachecontrol/__pycache__/serialize.cpython-314.pyc,,
348
+ pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-314.pyc,,
349
+ pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
350
+ pip/_vendor/cachecontrol/adapter.py,sha256=W-HW-l01gyCsnxkOyCbqx7sxrWYoBbKrDsKkVVQN6NE,6586
351
+ pip/_vendor/cachecontrol/cache.py,sha256=OXwv7Fn2AwnKNiahJHnjtvaKLndvVLv_-zO-ltlV9qI,1953
352
+ pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
353
+ pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-314.pyc,,
354
+ pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-314.pyc,,
355
+ pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-314.pyc,,
356
+ pip/_vendor/cachecontrol/caches/file_cache.py,sha256=d8upFmy_zwaCmlbWEVBlLXFddt8Zw8c5SFpxeOZsdfw,4117
357
+ pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
358
+ pip/_vendor/cachecontrol/controller.py,sha256=xBauC-vUSu5GsJsxD4-W-JaKqqbBz0MN6Zv8PA2N8hI,19102
359
+ pip/_vendor/cachecontrol/filewrapper.py,sha256=DhxC_rSk-beKdbsYhfvBUDovQHX9r3gHH_jP9-q_mKk,4354
360
+ pip/_vendor/cachecontrol/heuristics.py,sha256=gqMXU8w0gQuEQiSdu3Yg-0vd9kW7nrWKbLca75rheGE,4881
361
+ pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
362
+ pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
363
+ pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
364
+ pip/_vendor/certifi/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989
365
+ pip/_vendor/certifi/__init__.py,sha256=969deMMS7Uchipr0oO4dbRBUvRi0uNYCn07VmG1aTrg,94
366
+ pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
367
+ pip/_vendor/certifi/__pycache__/__init__.cpython-314.pyc,,
368
+ pip/_vendor/certifi/__pycache__/__main__.cpython-314.pyc,,
369
+ pip/_vendor/certifi/__pycache__/core.cpython-314.pyc,,
370
+ pip/_vendor/certifi/cacert.pem,sha256=Tzl1_zCrvzVEO0hgZK6Ly0Hf9wf_31dsdtKS-0WKoKk,270954
371
+ pip/_vendor/certifi/core.py,sha256=gu_ECVI1m3Rq0ytpsNE61hgQGcKaOAt9Rs9G8KsTCOI,3442
372
+ pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
373
+ pip/_vendor/dependency_groups/LICENSE.txt,sha256=GrNuPipLqGMWJThPh-ngkdsfrtA0xbIzJbMjmr8sxSU,1099
374
+ pip/_vendor/dependency_groups/__init__.py,sha256=C3OFu0NGwDzQ4LOmmSOFPsRSvkbBn-mdd4j_5YqJw-s,250
375
+ pip/_vendor/dependency_groups/__main__.py,sha256=UNTM7P5mfVtT7wDi9kOTXWgV3fu3e8bTrt1Qp1jvjKo,1709
376
+ pip/_vendor/dependency_groups/__pycache__/__init__.cpython-314.pyc,,
377
+ pip/_vendor/dependency_groups/__pycache__/__main__.cpython-314.pyc,,
378
+ pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-314.pyc,,
379
+ pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-314.pyc,,
380
+ pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-314.pyc,,
381
+ pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-314.pyc,,
382
+ pip/_vendor/dependency_groups/_implementation.py,sha256=Gqb2DlQELRakeHlKf6QtQSW0M-bcEomxHw4JsvID1ls,8041
383
+ pip/_vendor/dependency_groups/_lint_dependency_groups.py,sha256=yp-DDqKXtbkDTNa0ifa-FmOA8ra24lPZEXftW-R5AuI,1710
384
+ pip/_vendor/dependency_groups/_pip_wrapper.py,sha256=nuVW_w_ntVxpE26ELEvngMY0N04sFLsijXRyZZROFG8,1865
385
+ pip/_vendor/dependency_groups/_toml_compat.py,sha256=BHnXnFacm3DeolsA35GjI6qkDApvua-1F20kv3BfZWE,285
386
+ pip/_vendor/dependency_groups/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
387
+ pip/_vendor/distlib/LICENSE.txt,sha256=gI4QyKarjesUn_mz-xn0R6gICUYG1xKpylf-rTVSWZ0,14531
388
+ pip/_vendor/distlib/__init__.py,sha256=Deo3uo98aUyIfdKJNqofeSEFWwDzrV2QeGLXLsgq0Ag,625
389
+ pip/_vendor/distlib/__pycache__/__init__.cpython-314.pyc,,
390
+ pip/_vendor/distlib/__pycache__/compat.cpython-314.pyc,,
391
+ pip/_vendor/distlib/__pycache__/resources.cpython-314.pyc,,
392
+ pip/_vendor/distlib/__pycache__/scripts.cpython-314.pyc,,
393
+ pip/_vendor/distlib/__pycache__/util.cpython-314.pyc,,
394
+ pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
395
+ pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
396
+ pip/_vendor/distlib/scripts.py,sha256=Qvp76E9Jc3IgyYubnpqI9fS7eseGOe4FjpeVKqKt9Iw,18612
397
+ pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
398
+ pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
399
+ pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
400
+ pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
401
+ pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
402
+ pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
403
+ pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
404
+ pip/_vendor/distro/LICENSE,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
405
+ pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
406
+ pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
407
+ pip/_vendor/distro/__pycache__/__init__.cpython-314.pyc,,
408
+ pip/_vendor/distro/__pycache__/__main__.cpython-314.pyc,,
409
+ pip/_vendor/distro/__pycache__/distro.cpython-314.pyc,,
410
+ pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
411
+ pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
412
+ pip/_vendor/idna/LICENSE.md,sha256=t6M2q_OwThgOwGXN0W5wXQeeHMehT5EKpukYfza5zYc,1541
413
+ pip/_vendor/idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868
414
+ pip/_vendor/idna/__pycache__/__init__.cpython-314.pyc,,
415
+ pip/_vendor/idna/__pycache__/codec.cpython-314.pyc,,
416
+ pip/_vendor/idna/__pycache__/compat.cpython-314.pyc,,
417
+ pip/_vendor/idna/__pycache__/core.cpython-314.pyc,,
418
+ pip/_vendor/idna/__pycache__/idnadata.cpython-314.pyc,,
419
+ pip/_vendor/idna/__pycache__/intranges.cpython-314.pyc,,
420
+ pip/_vendor/idna/__pycache__/package_data.cpython-314.pyc,,
421
+ pip/_vendor/idna/__pycache__/uts46data.cpython-314.pyc,,
422
+ pip/_vendor/idna/codec.py,sha256=M2SGWN7cs_6B32QmKTyTN6xQGZeYQgQ2wiX3_DR6loE,3438
423
+ pip/_vendor/idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316
424
+ pip/_vendor/idna/core.py,sha256=P26_XVycuMTZ1R2mNK1ZREVzM5mvTzdabBXfyZVU1Lc,13246
425
+ pip/_vendor/idna/idnadata.py,sha256=SG8jhaGE53iiD6B49pt2pwTv_UvClciWE-N54oR2p4U,79623
426
+ pip/_vendor/idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898
427
+ pip/_vendor/idna/package_data.py,sha256=_CUavOxobnbyNG2FLyHoN8QHP3QM9W1tKuw7eq9QwBk,21
428
+ pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
429
+ pip/_vendor/idna/uts46data.py,sha256=H9J35VkD0F9L9mKOqjeNGd2A-Va6FlPoz6Jz4K7h-ps,243725
430
+ pip/_vendor/msgpack/COPYING,sha256=SS3tuoXaWHL3jmCRvNH-pHTWYNNay03ulkuKqz8AdCc,614
431
+ pip/_vendor/msgpack/__init__.py,sha256=RA8gcqK17YpkxBnNwXJVa1oa2LygWDgfF1nA1NPw3mo,1109
432
+ pip/_vendor/msgpack/__pycache__/__init__.cpython-314.pyc,,
433
+ pip/_vendor/msgpack/__pycache__/exceptions.cpython-314.pyc,,
434
+ pip/_vendor/msgpack/__pycache__/ext.cpython-314.pyc,,
435
+ pip/_vendor/msgpack/__pycache__/fallback.cpython-314.pyc,,
436
+ pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
437
+ pip/_vendor/msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726
438
+ pip/_vendor/msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390
439
+ pip/_vendor/packaging/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197
440
+ pip/_vendor/packaging/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
441
+ pip/_vendor/packaging/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344
442
+ pip/_vendor/packaging/__init__.py,sha256=y4lVbpeBzCGk-IPDw5BGBZ_b0P3ukEEJZAbGYc6Ey8c,494
443
+ pip/_vendor/packaging/__pycache__/__init__.cpython-314.pyc,,
444
+ pip/_vendor/packaging/__pycache__/_elffile.cpython-314.pyc,,
445
+ pip/_vendor/packaging/__pycache__/_manylinux.cpython-314.pyc,,
446
+ pip/_vendor/packaging/__pycache__/_musllinux.cpython-314.pyc,,
447
+ pip/_vendor/packaging/__pycache__/_parser.cpython-314.pyc,,
448
+ pip/_vendor/packaging/__pycache__/_structures.cpython-314.pyc,,
449
+ pip/_vendor/packaging/__pycache__/_tokenizer.cpython-314.pyc,,
450
+ pip/_vendor/packaging/__pycache__/markers.cpython-314.pyc,,
451
+ pip/_vendor/packaging/__pycache__/metadata.cpython-314.pyc,,
452
+ pip/_vendor/packaging/__pycache__/pylock.cpython-314.pyc,,
453
+ pip/_vendor/packaging/__pycache__/requirements.cpython-314.pyc,,
454
+ pip/_vendor/packaging/__pycache__/specifiers.cpython-314.pyc,,
455
+ pip/_vendor/packaging/__pycache__/tags.cpython-314.pyc,,
456
+ pip/_vendor/packaging/__pycache__/utils.cpython-314.pyc,,
457
+ pip/_vendor/packaging/__pycache__/version.cpython-314.pyc,,
458
+ pip/_vendor/packaging/_elffile.py,sha256=-sKkptYqzYw2-x3QByJa5mB4rfPWu1pxkZHRx1WAFCY,3211
459
+ pip/_vendor/packaging/_manylinux.py,sha256=Hf6nB0cOrayEs96-p3oIXAgGnFquv20DO5l-o2_Xnv0,9559
460
+ pip/_vendor/packaging/_musllinux.py,sha256=Z6swjH3MA7XS3qXnmMN7QPhqP3fnoYI0eQ18e9-HgAE,2707
461
+ pip/_vendor/packaging/_parser.py,sha256=U_DajsEx2VoC_F46fSVV3hDKNCWoQYkPkasO3dld0ig,10518
462
+ pip/_vendor/packaging/_structures.py,sha256=Hn49Ta8zV9Wo8GiCL8Nl2ARZY983Un3pruZGVNldPwE,1514
463
+ pip/_vendor/packaging/_tokenizer.py,sha256=M8EwNIdXeL9NMFuFrQtiOKwjka_xFx8KjRQnfE8O_z8,5421
464
+ pip/_vendor/packaging/licenses/__init__.py,sha256=TwXLHZCXwSgdFwRLPxW602T6mSieunSFHM6fp8pgW78,5819
465
+ pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-314.pyc,,
466
+ pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-314.pyc,,
467
+ pip/_vendor/packaging/licenses/_spdx.py,sha256=WW7DXiyg68up_YND_wpRYlr1SHhiV4FfJLQffghhMxQ,51122
468
+ pip/_vendor/packaging/markers.py,sha256=ZX-cLvW1S3cZcEc0fHI4z7zSx5U2T19yMpDP_mE-CYw,12771
469
+ pip/_vendor/packaging/metadata.py,sha256=CWVZpN_HfoYMSSDuCP7igOvGgqA9AOmpW8f3qTisfnc,39360
470
+ pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
471
+ pip/_vendor/packaging/pylock.py,sha256=-R1uNfJ4PaLto7Mg62YsGOHgvskuiIEqPwxOywl42Jk,22537
472
+ pip/_vendor/packaging/requirements.py,sha256=PMCAWD8aNMnVD-6uZMedhBuAVX2573eZ4yPBLXmz04I,2870
473
+ pip/_vendor/packaging/specifiers.py,sha256=tF2nC-jwW94FYe6So9dNGenQx1Hdif7ErmWlVp1QiXE,40821
474
+ pip/_vendor/packaging/tags.py,sha256=cXLV1pJD3UtJlDg7Wz3zrfdQhRZqr8jumSAKKAAd2xE,22856
475
+ pip/_vendor/packaging/utils.py,sha256=N4c6oZzFJy6klTZ3AnkNz7sSkJesuFWPp68LA3B5dAo,5040
476
+ pip/_vendor/packaging/version.py,sha256=RVRKq8_GD5Bcak6E1kGG8K7siNZYW9n_XK8M2ZLl0H8,23284
477
+ pip/_vendor/pkg_resources/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023
478
+ pip/_vendor/pkg_resources/__init__.py,sha256=vbTJ0_ruUgGxQjlEqsruFmiNPVyh2t9q-zyTDT053xI,124451
479
+ pip/_vendor/pkg_resources/__pycache__/__init__.cpython-314.pyc,,
480
+ pip/_vendor/platformdirs/LICENSE,sha256=KeD9YukphQ6G6yjD_czwzv30-pSHkBHP-z0NS-1tTbY,1089
481
+ pip/_vendor/platformdirs/__init__.py,sha256=UfeSHWl8AeTtbOBOoHAxK4dODOWkZtfy-m_i7cWdJ8c,22344
482
+ pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
483
+ pip/_vendor/platformdirs/__pycache__/__init__.cpython-314.pyc,,
484
+ pip/_vendor/platformdirs/__pycache__/__main__.cpython-314.pyc,,
485
+ pip/_vendor/platformdirs/__pycache__/android.cpython-314.pyc,,
486
+ pip/_vendor/platformdirs/__pycache__/api.cpython-314.pyc,,
487
+ pip/_vendor/platformdirs/__pycache__/macos.cpython-314.pyc,,
488
+ pip/_vendor/platformdirs/__pycache__/unix.cpython-314.pyc,,
489
+ pip/_vendor/platformdirs/__pycache__/version.cpython-314.pyc,,
490
+ pip/_vendor/platformdirs/__pycache__/windows.cpython-314.pyc,,
491
+ pip/_vendor/platformdirs/android.py,sha256=r0DshVBf-RO1jXJGX8C4Til7F1XWt-bkdWMgmvEiaYg,9013
492
+ pip/_vendor/platformdirs/api.py,sha256=wPHOlwOsfz2oqQZ6A2FcCu5kEAj-JondzoNOHYFQ0h8,9281
493
+ pip/_vendor/platformdirs/macos.py,sha256=0XoOgin1NK7Qki7iskD-oS8xKxw6bXgoKEgdqpCRAFQ,6322
494
+ pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
495
+ pip/_vendor/platformdirs/unix.py,sha256=WZmkUA--L3JNRGmz32s35YfoD3ica6xKIPdCV_HhLcs,10458
496
+ pip/_vendor/platformdirs/version.py,sha256=BI_dKLSMwlkl57vlxZnT8oVjPiUC2W_sdx_8_h99HeQ,704
497
+ pip/_vendor/platformdirs/windows.py,sha256=XvCfklGUMVxJbXit51jpYMN-lNeScPB82qS1CAeplL0,10362
498
+ pip/_vendor/pygments/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331
499
+ pip/_vendor/pygments/__init__.py,sha256=8uNqJCCwXqbEx5aSsBr0FykUQOBDKBihO5mPqiw1aqo,2983
500
+ pip/_vendor/pygments/__main__.py,sha256=WrndpSe6i1ckX_SQ1KaxD9CTKGzD0EuCOFxcbwFpoLU,353
501
+ pip/_vendor/pygments/__pycache__/__init__.cpython-314.pyc,,
502
+ pip/_vendor/pygments/__pycache__/__main__.cpython-314.pyc,,
503
+ pip/_vendor/pygments/__pycache__/console.cpython-314.pyc,,
504
+ pip/_vendor/pygments/__pycache__/filter.cpython-314.pyc,,
505
+ pip/_vendor/pygments/__pycache__/formatter.cpython-314.pyc,,
506
+ pip/_vendor/pygments/__pycache__/lexer.cpython-314.pyc,,
507
+ pip/_vendor/pygments/__pycache__/modeline.cpython-314.pyc,,
508
+ pip/_vendor/pygments/__pycache__/plugin.cpython-314.pyc,,
509
+ pip/_vendor/pygments/__pycache__/regexopt.cpython-314.pyc,,
510
+ pip/_vendor/pygments/__pycache__/scanner.cpython-314.pyc,,
511
+ pip/_vendor/pygments/__pycache__/sphinxext.cpython-314.pyc,,
512
+ pip/_vendor/pygments/__pycache__/style.cpython-314.pyc,,
513
+ pip/_vendor/pygments/__pycache__/token.cpython-314.pyc,,
514
+ pip/_vendor/pygments/__pycache__/unistring.cpython-314.pyc,,
515
+ pip/_vendor/pygments/__pycache__/util.cpython-314.pyc,,
516
+ pip/_vendor/pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718
517
+ pip/_vendor/pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910
518
+ pip/_vendor/pygments/filters/__init__.py,sha256=4U4jtA0X3iP83uQnB9-TI-HDSw8E8y8zMYHa0UjbbaI,40392
519
+ pip/_vendor/pygments/filters/__pycache__/__init__.cpython-314.pyc,,
520
+ pip/_vendor/pygments/formatter.py,sha256=KZQMmyo_xkOIkQG8g66LYEkBh1bx7a0HyGCBcvhI9Ew,4390
521
+ pip/_vendor/pygments/formatters/__init__.py,sha256=KTwBmnXlaopJhQDOemVHYHskiDghuq-08YtP6xPNJPg,5385
522
+ pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-314.pyc,,
523
+ pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-314.pyc,,
524
+ pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
525
+ pip/_vendor/pygments/lexer.py,sha256=_kBrOJ_NT5Tl0IVM0rA9c8eysP6_yrlGzEQI0eVYB-A,35349
526
+ pip/_vendor/pygments/lexers/__init__.py,sha256=wbIME35GH7bI1B9rNPJFqWT-ij_RApZDYPUlZycaLzA,12115
527
+ pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-314.pyc,,
528
+ pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-314.pyc,,
529
+ pip/_vendor/pygments/lexers/__pycache__/python.cpython-314.pyc,,
530
+ pip/_vendor/pygments/lexers/_mapping.py,sha256=l4tCXM8e9aPC2BD6sjIr0deT-J-z5tHgCwL-p1fS0PE,77602
531
+ pip/_vendor/pygments/lexers/python.py,sha256=vxjn1cOHclIKJKxoyiBsQTY65GHbkZtZRuKQ2AVCKaw,53853
532
+ pip/_vendor/pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005
533
+ pip/_vendor/pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891
534
+ pip/_vendor/pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072
535
+ pip/_vendor/pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092
536
+ pip/_vendor/pygments/sphinxext.py,sha256=5x7Zh9YlU6ISJ31dMwduiaanb5dWZnKg3MyEQsseNnQ,7981
537
+ pip/_vendor/pygments/style.py,sha256=PlOZqlsnTVd58RGy50vkA2cXQ_lP5bF5EGMEBTno6DA,6420
538
+ pip/_vendor/pygments/styles/__init__.py,sha256=x9ebctfyvCAFpMTlMJ5YxwcNYBzjgq6zJaKkNm78r4M,2042
539
+ pip/_vendor/pygments/styles/__pycache__/__init__.cpython-314.pyc,,
540
+ pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-314.pyc,,
541
+ pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
542
+ pip/_vendor/pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226
543
+ pip/_vendor/pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208
544
+ pip/_vendor/pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031
545
+ pip/_vendor/pyproject_hooks/LICENSE,sha256=GyKwSbUmfW38I6Z79KhNjsBLn9-xpR02DkK0NCyLQVQ,1081
546
+ pip/_vendor/pyproject_hooks/__init__.py,sha256=cPB_a9LXz5xvsRbX1o2qyAdjLatZJdQ_Lc5McNX-X7Y,691
547
+ pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-314.pyc,,
548
+ pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-314.pyc,,
549
+ pip/_vendor/pyproject_hooks/_impl.py,sha256=jY-raxnmyRyB57ruAitrJRUzEexuAhGTpgMygqx67Z4,14936
550
+ pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=MJNPpfIxcO-FghxpBbxkG1rFiQf6HOUbV4U5mq0HFns,557
551
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-314.pyc,,
552
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-314.pyc,,
553
+ pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=qcXMhmx__MIJq10gGHW3mA4Tl8dy8YzHMccwnNoKlw0,12216
554
+ pip/_vendor/pyproject_hooks/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
555
+ pip/_vendor/requests/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
556
+ pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
557
+ pip/_vendor/requests/__pycache__/__init__.cpython-314.pyc,,
558
+ pip/_vendor/requests/__pycache__/__version__.cpython-314.pyc,,
559
+ pip/_vendor/requests/__pycache__/_internal_utils.cpython-314.pyc,,
560
+ pip/_vendor/requests/__pycache__/adapters.cpython-314.pyc,,
561
+ pip/_vendor/requests/__pycache__/api.cpython-314.pyc,,
562
+ pip/_vendor/requests/__pycache__/auth.cpython-314.pyc,,
563
+ pip/_vendor/requests/__pycache__/certs.cpython-314.pyc,,
564
+ pip/_vendor/requests/__pycache__/compat.cpython-314.pyc,,
565
+ pip/_vendor/requests/__pycache__/cookies.cpython-314.pyc,,
566
+ pip/_vendor/requests/__pycache__/exceptions.cpython-314.pyc,,
567
+ pip/_vendor/requests/__pycache__/help.cpython-314.pyc,,
568
+ pip/_vendor/requests/__pycache__/hooks.cpython-314.pyc,,
569
+ pip/_vendor/requests/__pycache__/models.cpython-314.pyc,,
570
+ pip/_vendor/requests/__pycache__/packages.cpython-314.pyc,,
571
+ pip/_vendor/requests/__pycache__/sessions.cpython-314.pyc,,
572
+ pip/_vendor/requests/__pycache__/status_codes.cpython-314.pyc,,
573
+ pip/_vendor/requests/__pycache__/structures.cpython-314.pyc,,
574
+ pip/_vendor/requests/__pycache__/utils.cpython-314.pyc,,
575
+ pip/_vendor/requests/__version__.py,sha256=QKDceK8K_ujqwDDc3oYrR0odOBYgKVOQQ5vFap_G_cg,435
576
+ pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
577
+ pip/_vendor/requests/adapters.py,sha256=2MLFOK9GpYNhiTd6zLDUrAgSkIB-76i6pmSuUJjHC2w,26429
578
+ pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
579
+ pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
580
+ pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
581
+ pip/_vendor/requests/compat.py,sha256=QfbmdTFiZzjSHMXiMrd4joCRU6RabtQ9zIcPoVaHIus,1822
582
+ pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
583
+ pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
584
+ pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
585
+ pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
586
+ pip/_vendor/requests/models.py,sha256=taljlg6vJ4b-xMu2TaMNFFkaiwMex_VsEQ6qUTN3wzY,35575
587
+ pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
588
+ pip/_vendor/requests/sessions.py,sha256=Cl1dpEnOfwrzzPbku-emepNeN4Rt_0_58Iy2x-JGTm8,30503
589
+ pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
590
+ pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
591
+ pip/_vendor/requests/utils.py,sha256=WS3wHSQaaEfceu1syiFo5jf4e_CWKUTep_IabOVI_J0,33225
592
+ pip/_vendor/resolvelib/LICENSE,sha256=84j9OMrRMRLB3A9mm76A5_hFQe26-3LzAw0sp2QsPJ0,751
593
+ pip/_vendor/resolvelib/__init__.py,sha256=yoX-d4STvwGGCiQRE5cJC9Cter69SgVgqClxOCvSP7M,541
594
+ pip/_vendor/resolvelib/__pycache__/__init__.cpython-314.pyc,,
595
+ pip/_vendor/resolvelib/__pycache__/providers.cpython-314.pyc,,
596
+ pip/_vendor/resolvelib/__pycache__/reporters.cpython-314.pyc,,
597
+ pip/_vendor/resolvelib/__pycache__/structs.cpython-314.pyc,,
598
+ pip/_vendor/resolvelib/providers.py,sha256=pIWJbIdJJ9GFtNbtwTH0Ia43Vj6hYCEJj2DOLue15FM,8914
599
+ pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
600
+ pip/_vendor/resolvelib/reporters.py,sha256=pNJf4nFxLpAeKxlBUi2GEj0a2Ij1nikY0UabTKXesT4,2037
601
+ pip/_vendor/resolvelib/resolvers/__init__.py,sha256=728M3EvmnPbVXS7ExXlv2kMu6b7wEsoPutEfl-uVk_I,640
602
+ pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-314.pyc,,
603
+ pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-314.pyc,,
604
+ pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-314.pyc,,
605
+ pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-314.pyc,,
606
+ pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-314.pyc,,
607
+ pip/_vendor/resolvelib/resolvers/abstract.py,sha256=CNeQPnpAudY77nmzOkONSmAgRlzIf06X-X9mvRYODms,1543
608
+ pip/_vendor/resolvelib/resolvers/criterion.py,sha256=lcmZGv5sKHOnFD_RzZwvlGSj19MeA-5rCMpdf2Sgw7Y,1768
609
+ pip/_vendor/resolvelib/resolvers/exceptions.py,sha256=ln_jaQtgLlRUSFY627yiHG2gD7AgaXzRKaElFVh7fDQ,1768
610
+ pip/_vendor/resolvelib/resolvers/resolution.py,sha256=3J_zkW-sD3EY-BlNXjyln__njpyH5n0UZJT6uV7CheA,24212
611
+ pip/_vendor/resolvelib/structs.py,sha256=pu-EJiR2IBITr2SQeNPRa0rXhjlStfmO_GEgAhr3004,6420
612
+ pip/_vendor/rich/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056
613
+ pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
614
+ pip/_vendor/rich/__main__.py,sha256=e_aVC-tDzarWQW9SuZMuCgBr6ODV_iDNV2Wh2xkxOlw,7896
615
+ pip/_vendor/rich/__pycache__/__init__.cpython-314.pyc,,
616
+ pip/_vendor/rich/__pycache__/__main__.cpython-314.pyc,,
617
+ pip/_vendor/rich/__pycache__/_cell_widths.cpython-314.pyc,,
618
+ pip/_vendor/rich/__pycache__/_emoji_codes.cpython-314.pyc,,
619
+ pip/_vendor/rich/__pycache__/_emoji_replace.cpython-314.pyc,,
620
+ pip/_vendor/rich/__pycache__/_export_format.cpython-314.pyc,,
621
+ pip/_vendor/rich/__pycache__/_extension.cpython-314.pyc,,
622
+ pip/_vendor/rich/__pycache__/_fileno.cpython-314.pyc,,
623
+ pip/_vendor/rich/__pycache__/_inspect.cpython-314.pyc,,
624
+ pip/_vendor/rich/__pycache__/_log_render.cpython-314.pyc,,
625
+ pip/_vendor/rich/__pycache__/_loop.cpython-314.pyc,,
626
+ pip/_vendor/rich/__pycache__/_null_file.cpython-314.pyc,,
627
+ pip/_vendor/rich/__pycache__/_palettes.cpython-314.pyc,,
628
+ pip/_vendor/rich/__pycache__/_pick.cpython-314.pyc,,
629
+ pip/_vendor/rich/__pycache__/_ratio.cpython-314.pyc,,
630
+ pip/_vendor/rich/__pycache__/_spinners.cpython-314.pyc,,
631
+ pip/_vendor/rich/__pycache__/_stack.cpython-314.pyc,,
632
+ pip/_vendor/rich/__pycache__/_timer.cpython-314.pyc,,
633
+ pip/_vendor/rich/__pycache__/_win32_console.cpython-314.pyc,,
634
+ pip/_vendor/rich/__pycache__/_windows.cpython-314.pyc,,
635
+ pip/_vendor/rich/__pycache__/_windows_renderer.cpython-314.pyc,,
636
+ pip/_vendor/rich/__pycache__/_wrap.cpython-314.pyc,,
637
+ pip/_vendor/rich/__pycache__/abc.cpython-314.pyc,,
638
+ pip/_vendor/rich/__pycache__/align.cpython-314.pyc,,
639
+ pip/_vendor/rich/__pycache__/ansi.cpython-314.pyc,,
640
+ pip/_vendor/rich/__pycache__/bar.cpython-314.pyc,,
641
+ pip/_vendor/rich/__pycache__/box.cpython-314.pyc,,
642
+ pip/_vendor/rich/__pycache__/cells.cpython-314.pyc,,
643
+ pip/_vendor/rich/__pycache__/color.cpython-314.pyc,,
644
+ pip/_vendor/rich/__pycache__/color_triplet.cpython-314.pyc,,
645
+ pip/_vendor/rich/__pycache__/columns.cpython-314.pyc,,
646
+ pip/_vendor/rich/__pycache__/console.cpython-314.pyc,,
647
+ pip/_vendor/rich/__pycache__/constrain.cpython-314.pyc,,
648
+ pip/_vendor/rich/__pycache__/containers.cpython-314.pyc,,
649
+ pip/_vendor/rich/__pycache__/control.cpython-314.pyc,,
650
+ pip/_vendor/rich/__pycache__/default_styles.cpython-314.pyc,,
651
+ pip/_vendor/rich/__pycache__/diagnose.cpython-314.pyc,,
652
+ pip/_vendor/rich/__pycache__/emoji.cpython-314.pyc,,
653
+ pip/_vendor/rich/__pycache__/errors.cpython-314.pyc,,
654
+ pip/_vendor/rich/__pycache__/file_proxy.cpython-314.pyc,,
655
+ pip/_vendor/rich/__pycache__/filesize.cpython-314.pyc,,
656
+ pip/_vendor/rich/__pycache__/highlighter.cpython-314.pyc,,
657
+ pip/_vendor/rich/__pycache__/json.cpython-314.pyc,,
658
+ pip/_vendor/rich/__pycache__/jupyter.cpython-314.pyc,,
659
+ pip/_vendor/rich/__pycache__/layout.cpython-314.pyc,,
660
+ pip/_vendor/rich/__pycache__/live.cpython-314.pyc,,
661
+ pip/_vendor/rich/__pycache__/live_render.cpython-314.pyc,,
662
+ pip/_vendor/rich/__pycache__/logging.cpython-314.pyc,,
663
+ pip/_vendor/rich/__pycache__/markup.cpython-314.pyc,,
664
+ pip/_vendor/rich/__pycache__/measure.cpython-314.pyc,,
665
+ pip/_vendor/rich/__pycache__/padding.cpython-314.pyc,,
666
+ pip/_vendor/rich/__pycache__/pager.cpython-314.pyc,,
667
+ pip/_vendor/rich/__pycache__/palette.cpython-314.pyc,,
668
+ pip/_vendor/rich/__pycache__/panel.cpython-314.pyc,,
669
+ pip/_vendor/rich/__pycache__/pretty.cpython-314.pyc,,
670
+ pip/_vendor/rich/__pycache__/progress.cpython-314.pyc,,
671
+ pip/_vendor/rich/__pycache__/progress_bar.cpython-314.pyc,,
672
+ pip/_vendor/rich/__pycache__/prompt.cpython-314.pyc,,
673
+ pip/_vendor/rich/__pycache__/protocol.cpython-314.pyc,,
674
+ pip/_vendor/rich/__pycache__/region.cpython-314.pyc,,
675
+ pip/_vendor/rich/__pycache__/repr.cpython-314.pyc,,
676
+ pip/_vendor/rich/__pycache__/rule.cpython-314.pyc,,
677
+ pip/_vendor/rich/__pycache__/scope.cpython-314.pyc,,
678
+ pip/_vendor/rich/__pycache__/screen.cpython-314.pyc,,
679
+ pip/_vendor/rich/__pycache__/segment.cpython-314.pyc,,
680
+ pip/_vendor/rich/__pycache__/spinner.cpython-314.pyc,,
681
+ pip/_vendor/rich/__pycache__/status.cpython-314.pyc,,
682
+ pip/_vendor/rich/__pycache__/style.cpython-314.pyc,,
683
+ pip/_vendor/rich/__pycache__/styled.cpython-314.pyc,,
684
+ pip/_vendor/rich/__pycache__/syntax.cpython-314.pyc,,
685
+ pip/_vendor/rich/__pycache__/table.cpython-314.pyc,,
686
+ pip/_vendor/rich/__pycache__/terminal_theme.cpython-314.pyc,,
687
+ pip/_vendor/rich/__pycache__/text.cpython-314.pyc,,
688
+ pip/_vendor/rich/__pycache__/theme.cpython-314.pyc,,
689
+ pip/_vendor/rich/__pycache__/themes.cpython-314.pyc,,
690
+ pip/_vendor/rich/__pycache__/traceback.cpython-314.pyc,,
691
+ pip/_vendor/rich/__pycache__/tree.cpython-314.pyc,,
692
+ pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
693
+ pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
694
+ pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
695
+ pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
696
+ pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
697
+ pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
698
+ pip/_vendor/rich/_inspect.py,sha256=ROT0PLC2GMWialWZkqJIjmYq7INRijQQkoSokWTaAiI,9656
699
+ pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
700
+ pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
701
+ pip/_vendor/rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394
702
+ pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
703
+ pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
704
+ pip/_vendor/rich/_ratio.py,sha256=IOtl78sQCYZsmHyxhe45krkb68u9xVz7zFsXVJD-b2Y,5325
705
+ pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
706
+ pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
707
+ pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
708
+ pip/_vendor/rich/_win32_console.py,sha256=BSaDRIMwBLITn_m0mTRLPqME5q-quGdSMuYMpYeYJwc,22755
709
+ pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
710
+ pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
711
+ pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
712
+ pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
713
+ pip/_vendor/rich/align.py,sha256=dg-7uY0ukMLLlUEsBDRLva22_sQgIJD4BK0dmZHFHug,10324
714
+ pip/_vendor/rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921
715
+ pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
716
+ pip/_vendor/rich/box.py,sha256=kmavBc_dn73L_g_8vxWSwYJD2uzBXOUFTtJOfpbczcM,10686
717
+ pip/_vendor/rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130
718
+ pip/_vendor/rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211
719
+ pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
720
+ pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
721
+ pip/_vendor/rich/console.py,sha256=t9azZpmRMVU5cphVBZSShNsmBxd2-IAWcTTlhor-E1s,100849
722
+ pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
723
+ pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
724
+ pip/_vendor/rich/control.py,sha256=EUTSUFLQbxY6Zmo_sdM-5Ls323vIHTBfN8TPulqeHUY,6487
725
+ pip/_vendor/rich/default_styles.py,sha256=khQFqqaoDs3bprMqWpHw8nO5UpG2DN6QtuTd6LzZwYc,8257
726
+ pip/_vendor/rich/diagnose.py,sha256=fJl1TItRn19gGwouqTg-8zPUW3YqQBqGltrfPQs1H9w,1025
727
+ pip/_vendor/rich/emoji.py,sha256=Wd4bQubZdSy6-PyrRQNuMHtn2VkljK9uPZPVlu2cmx0,2367
728
+ pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
729
+ pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
730
+ pip/_vendor/rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484
731
+ pip/_vendor/rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586
732
+ pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
733
+ pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
734
+ pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
735
+ pip/_vendor/rich/live.py,sha256=tF3ukAAJZ_N2ZbGclqZ-iwLoIoZ8f0HHUz79jAyJqj8,15180
736
+ pip/_vendor/rich/live_render.py,sha256=It_39YdzrBm8o3LL0kaGorPFg-BfZWAcrBjLjFokbx4,3521
737
+ pip/_vendor/rich/logging.py,sha256=5KaPPSMP9FxcXPBcKM4cGd_zW78PMgf-YbMVnvfSw0o,12468
738
+ pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
739
+ pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
740
+ pip/_vendor/rich/padding.py,sha256=KVEI3tOwo9sgK1YNSuH__M1_jUWmLZwRVV_KmOtVzyM,4908
741
+ pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
742
+ pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
743
+ pip/_vendor/rich/panel.py,sha256=9sQl00hPIqH5G2gALQo4NepFwpP0k9wT-s_gOms5pIc,11157
744
+ pip/_vendor/rich/pretty.py,sha256=gy3S72u4FRg2ytoo7N1ZDWDIvB4unbzd5iUGdgm-8fc,36391
745
+ pip/_vendor/rich/progress.py,sha256=CUc2lkU-X59mVdGfjMCBkZeiGPL3uxdONjhNJF2T7wY,60408
746
+ pip/_vendor/rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162
747
+ pip/_vendor/rich/prompt.py,sha256=l0RhQU-0UVTV9e08xW1BbIj0Jq2IXyChX4lC0lFNzt4,12447
748
+ pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
749
+ pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
750
+ pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
751
+ pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
752
+ pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
753
+ pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
754
+ pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
755
+ pip/_vendor/rich/segment.py,sha256=otnKeKGEV-WRlQVosfJVeFDcDxAKHpvJ_hLzSu5lumM,24743
756
+ pip/_vendor/rich/spinner.py,sha256=onIhpKlljRHppTZasxO8kXgtYyCHUkpSgKglRJ3o51g,4214
757
+ pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
758
+ pip/_vendor/rich/style.py,sha256=W9Ccy8Py8lNICtlfcp-ryzMTuQaGxAU3av7-g5fHu0s,26990
759
+ pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
760
+ pip/_vendor/rich/syntax.py,sha256=eDKIRwl--eZ0Lwo2da2RRtfutXGavrJO61Cl5OkS59U,36371
761
+ pip/_vendor/rich/table.py,sha256=ZmT7V7MMCOYKw7TGY9SZLyYDf6JdM-WVf07FdVuVhTI,40049
762
+ pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
763
+ pip/_vendor/rich/text.py,sha256=AO7JPCz6-gaN1thVLXMBntEmDPVYFgFNG1oM61_sanU,47552
764
+ pip/_vendor/rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771
765
+ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
766
+ pip/_vendor/rich/traceback.py,sha256=c0WmB_L04_UfZbLaoH982_U_s7eosxKMUiAVmDPdRYU,35861
767
+ pip/_vendor/rich/tree.py,sha256=yWnQ6rAvRGJ3qZGqBrxS2SW2TKBTNrP0SdY8QxOFPuw,9451
768
+ pip/_vendor/tomli/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072
769
+ pip/_vendor/tomli/__init__.py,sha256=qzEGl8QHhqgQPCuLzfKyPIuH3KKPspf-UVPbZ0ppBD4,314
770
+ pip/_vendor/tomli/__pycache__/__init__.cpython-314.pyc,,
771
+ pip/_vendor/tomli/__pycache__/_parser.cpython-314.pyc,,
772
+ pip/_vendor/tomli/__pycache__/_re.cpython-314.pyc,,
773
+ pip/_vendor/tomli/__pycache__/_types.cpython-314.pyc,,
774
+ pip/_vendor/tomli/_parser.py,sha256=bO8tUYmnyA2K6m4TnbQbfUqmIFcDv7mG1KuC9gqRVmA,25778
775
+ pip/_vendor/tomli/_re.py,sha256=n8-Io8ZK1U-F6jzlg7Pabc40hLFJsawE2uNLKH9w7iU,3235
776
+ pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
777
+ pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
778
+ pip/_vendor/tomli_w/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072
779
+ pip/_vendor/tomli_w/__init__.py,sha256=0F8yDtXx3Uunhm874KrAcP76srsM98y7WyHQwCulZbo,169
780
+ pip/_vendor/tomli_w/__pycache__/__init__.cpython-314.pyc,,
781
+ pip/_vendor/tomli_w/__pycache__/_writer.cpython-314.pyc,,
782
+ pip/_vendor/tomli_w/_writer.py,sha256=dsifFS2xYf1i76mmRyfz9y125xC7Z_HQ845ZKhJsYXs,6961
783
+ pip/_vendor/tomli_w/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
784
+ pip/_vendor/truststore/LICENSE,sha256=M757fo-k_Rmxdg4ajtimaL2rhSyRtpLdQUJLy3Jan8o,1086
785
+ pip/_vendor/truststore/__init__.py,sha256=Bu7kqkmpunhLsj5xCu8gT_25ktoPXcSnwe8VHk1GmJo,1320
786
+ pip/_vendor/truststore/__pycache__/__init__.cpython-314.pyc,,
787
+ pip/_vendor/truststore/__pycache__/_api.cpython-314.pyc,,
788
+ pip/_vendor/truststore/__pycache__/_macos.cpython-314.pyc,,
789
+ pip/_vendor/truststore/__pycache__/_openssl.cpython-314.pyc,,
790
+ pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-314.pyc,,
791
+ pip/_vendor/truststore/__pycache__/_windows.cpython-314.pyc,,
792
+ pip/_vendor/truststore/_api.py,sha256=CYJCV5BTfttZYfqY3movdMBE-8az7uhET_LYbKT2Nn4,11413
793
+ pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
794
+ pip/_vendor/truststore/_openssl.py,sha256=zB-SQvJydks7tQ0yIwrP6GD3fQNSSaPiq7zw4yF5T40,2412
795
+ pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
796
+ pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
797
+ pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
798
+ pip/_vendor/urllib3/LICENSE.txt,sha256=w3vxhuJ8-dvpYZ5V7f486nswCRzrPaY8fay-Dm13kHs,1115
799
+ pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
800
+ pip/_vendor/urllib3/__pycache__/__init__.cpython-314.pyc,,
801
+ pip/_vendor/urllib3/__pycache__/_collections.cpython-314.pyc,,
802
+ pip/_vendor/urllib3/__pycache__/_version.cpython-314.pyc,,
803
+ pip/_vendor/urllib3/__pycache__/connection.cpython-314.pyc,,
804
+ pip/_vendor/urllib3/__pycache__/connectionpool.cpython-314.pyc,,
805
+ pip/_vendor/urllib3/__pycache__/exceptions.cpython-314.pyc,,
806
+ pip/_vendor/urllib3/__pycache__/fields.cpython-314.pyc,,
807
+ pip/_vendor/urllib3/__pycache__/filepost.cpython-314.pyc,,
808
+ pip/_vendor/urllib3/__pycache__/poolmanager.cpython-314.pyc,,
809
+ pip/_vendor/urllib3/__pycache__/request.cpython-314.pyc,,
810
+ pip/_vendor/urllib3/__pycache__/response.cpython-314.pyc,,
811
+ pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
812
+ pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
813
+ pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
814
+ pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
815
+ pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
816
+ pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-314.pyc,,
817
+ pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-314.pyc,,
818
+ pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-314.pyc,,
819
+ pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-314.pyc,,
820
+ pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-314.pyc,,
821
+ pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-314.pyc,,
822
+ pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-314.pyc,,
823
+ pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
824
+ pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
825
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-314.pyc,,
826
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-314.pyc,,
827
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-314.pyc,,
828
+ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
829
+ pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
830
+ pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
831
+ pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
832
+ pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
833
+ pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
834
+ pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
835
+ pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
836
+ pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
837
+ pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
838
+ pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
839
+ pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-314.pyc,,
840
+ pip/_vendor/urllib3/packages/__pycache__/six.cpython-314.pyc,,
841
+ pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
842
+ pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-314.pyc,,
843
+ pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-314.pyc,,
844
+ pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-314.pyc,,
845
+ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
846
+ pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
847
+ pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
848
+ pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
849
+ pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
850
+ pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
851
+ pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
852
+ pip/_vendor/urllib3/util/__pycache__/__init__.cpython-314.pyc,,
853
+ pip/_vendor/urllib3/util/__pycache__/connection.cpython-314.pyc,,
854
+ pip/_vendor/urllib3/util/__pycache__/proxy.cpython-314.pyc,,
855
+ pip/_vendor/urllib3/util/__pycache__/queue.cpython-314.pyc,,
856
+ pip/_vendor/urllib3/util/__pycache__/request.cpython-314.pyc,,
857
+ pip/_vendor/urllib3/util/__pycache__/response.cpython-314.pyc,,
858
+ pip/_vendor/urllib3/util/__pycache__/retry.cpython-314.pyc,,
859
+ pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-314.pyc,,
860
+ pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-314.pyc,,
861
+ pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-314.pyc,,
862
+ pip/_vendor/urllib3/util/__pycache__/timeout.cpython-314.pyc,,
863
+ pip/_vendor/urllib3/util/__pycache__/url.cpython-314.pyc,,
864
+ pip/_vendor/urllib3/util/__pycache__/wait.cpython-314.pyc,,
865
+ pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
866
+ pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
867
+ pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
868
+ pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
869
+ pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
870
+ pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
871
+ pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
872
+ pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
873
+ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
874
+ pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
875
+ pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
876
+ pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
877
+ pip/_vendor/vendor.txt,sha256=f2msFLZ-chXWIZSKW31NLGyMWmt_-Vfy7sY5dHYgmnw,342
878
+ pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
.venv/Lib/site-packages/pip-26.0.dist-info/REQUESTED ADDED
File without changes
.venv/Lib/site-packages/pip-26.0.dist-info/WHEEL ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: flit 3.12.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
.venv/Lib/site-packages/pip-26.0.dist-info/entry_points.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ [console_scripts]
2
+ pip=pip._internal.cli.main:main
3
+ pip3=pip._internal.cli.main:main
4
+
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/AUTHORS.txt ADDED
@@ -0,0 +1,860 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @Switch01
2
+ A_Rog
3
+ Aakanksha Agrawal
4
+ Aarni Koskela
5
+ Abhinav Sagar
6
+ ABHYUDAY PRATAP SINGH
7
+ abs51295
8
+ AceGentile
9
+ Adam Chainz
10
+ Adam Tse
11
+ Adam Turner
12
+ Adam Wentz
13
+ admin
14
+ Adolfo Ochagavía
15
+ Adrien Morison
16
+ Agus
17
+ ahayrapetyan
18
+ Ahilya
19
+ AinsworthK
20
+ Akash Srivastava
21
+ Alan Yee
22
+ Albert Tugushev
23
+ Albert-Guan
24
+ albertg
25
+ Alberto Sottile
26
+ Aleks Bunin
27
+ Ales Erjavec
28
+ Alessandro Molina
29
+ Alethea Flowers
30
+ Alex Gaynor
31
+ Alex Grönholm
32
+ Alex Hedges
33
+ Alex Loosley
34
+ Alex Morega
35
+ Alex Stachowiak
36
+ Alexander Regueiro
37
+ Alexander Shtyrov
38
+ Alexandre Conrad
39
+ Alexey Popravka
40
+ Aleš Erjavec
41
+ Alli
42
+ Aman
43
+ Ami Fischman
44
+ Ananya Maiti
45
+ Anatoly Techtonik
46
+ Anders Kaseorg
47
+ Andre Aguiar
48
+ Andreas Lutro
49
+ Andrei Geacar
50
+ Andrew Gaul
51
+ Andrew Shymanel
52
+ Andrey Bienkowski
53
+ Andrey Bulgakov
54
+ Andrés Delfino
55
+ Andy Freeland
56
+ Andy Kluger
57
+ Ani Hayrapetyan
58
+ Aniruddha Basak
59
+ Anish Tambe
60
+ Anrs Hu
61
+ Anthony Sottile
62
+ Antoine Lambert
63
+ Antoine Musso
64
+ Anton Ovchinnikov
65
+ Anton Patrushev
66
+ Anton Zelenov
67
+ Antonio Alvarado Hernandez
68
+ Antony Lee
69
+ Antti Kaihola
70
+ Anubhav Patel
71
+ Anudit Nagar
72
+ Anuj Godase
73
+ AQNOUCH Mohammed
74
+ AraHaan
75
+ arena
76
+ arenasys
77
+ Arindam Choudhury
78
+ Armin Ronacher
79
+ Arnon Yaari
80
+ Artem
81
+ Arun Babu Neelicattu
82
+ Ashley Manton
83
+ Ashwin Ramaswami
84
+ atse
85
+ Atsushi Odagiri
86
+ Avinash Karhana
87
+ Avner Cohen
88
+ Awit (Ah-Wit) Ghirmai
89
+ Baptiste Mispelon
90
+ Barney Gale
91
+ barneygale
92
+ Bartek Ogryczak
93
+ Bastian Venthur
94
+ Ben Bodenmiller
95
+ Ben Darnell
96
+ Ben Hoyt
97
+ Ben Mares
98
+ Ben Rosser
99
+ Bence Nagy
100
+ Benjamin Peterson
101
+ Benjamin VanEvery
102
+ Benoit Pierre
103
+ Berker Peksag
104
+ Bernard
105
+ Bernard Tyers
106
+ Bernardo B. Marques
107
+ Bernhard M. Wiedemann
108
+ Bertil Hatt
109
+ Bhavam Vidyarthi
110
+ Blazej Michalik
111
+ Bogdan Opanchuk
112
+ BorisZZZ
113
+ Brad Erickson
114
+ Bradley Ayers
115
+ Bradley Reynolds
116
+ Branch Vincent
117
+ Brandon L. Reiss
118
+ Brandt Bucher
119
+ Brannon Dorsey
120
+ Brett Randall
121
+ Brett Rosen
122
+ Brian Cristante
123
+ Brian Rosner
124
+ briantracy
125
+ BrownTruck
126
+ Bruno Oliveira
127
+ Bruno Renié
128
+ Bruno S
129
+ Bstrdsmkr
130
+ Buck Golemon
131
+ burrows
132
+ Bussonnier Matthias
133
+ bwoodsend
134
+ c22
135
+ Caleb Brown
136
+ Caleb Martinez
137
+ Calvin Smith
138
+ Carl Meyer
139
+ Carlos Liam
140
+ Carol Willing
141
+ Carter Thayer
142
+ Cass
143
+ Chandrasekhar Atina
144
+ Charlie Marsh
145
+ charwick
146
+ Chih-Hsuan Yen
147
+ Chris Brinker
148
+ Chris Hunt
149
+ Chris Jerdonek
150
+ Chris Kuehl
151
+ Chris Markiewicz
152
+ Chris McDonough
153
+ Chris Pawley
154
+ Chris Pryer
155
+ Chris Wolfe
156
+ Christian Clauss
157
+ Christian Heimes
158
+ Christian Oudard
159
+ Christoph Reiter
160
+ Christopher Hunt
161
+ Christopher Snyder
162
+ chrysle
163
+ cjc7373
164
+ Clark Boylan
165
+ Claudio Jolowicz
166
+ Clay McClure
167
+ Cody
168
+ Cody Soyland
169
+ Colin Watson
170
+ Collin Anderson
171
+ Connor Osborn
172
+ Cooper Lees
173
+ Cooper Ry Lees
174
+ Cory Benfield
175
+ Cory Wright
176
+ Craig Kerstiens
177
+ Cristian Sorinel
178
+ Cristina
179
+ Cristina Muñoz
180
+ ctg123
181
+ Curtis Doty
182
+ cytolentino
183
+ Daan De Meyer
184
+ Dale
185
+ Damian
186
+ Damian Quiroga
187
+ Damian Shaw
188
+ Dan Black
189
+ Dan Savilonis
190
+ Dan Sully
191
+ Dane Hillard
192
+ daniel
193
+ Daniel Collins
194
+ Daniel Hahler
195
+ Daniel Hollas
196
+ Daniel Holth
197
+ Daniel Jost
198
+ Daniel Katz
199
+ Daniel Shaulov
200
+ Daniele Esposti
201
+ Daniele Nicolodi
202
+ Daniele Procida
203
+ Daniil Konovalenko
204
+ Danny Hermes
205
+ Danny McClanahan
206
+ Darren Kavanagh
207
+ Dav Clark
208
+ Dave Abrahams
209
+ Dave Jones
210
+ David Aguilar
211
+ David Black
212
+ David Bordeynik
213
+ David Caro
214
+ David D Lowe
215
+ David Evans
216
+ David Hewitt
217
+ David Linke
218
+ David Poggi
219
+ David Poznik
220
+ David Pursehouse
221
+ David Runge
222
+ David Tucker
223
+ David Wales
224
+ Davidovich
225
+ ddelange
226
+ Deepak Sharma
227
+ Deepyaman Datta
228
+ Denis Roussel (ACSONE)
229
+ Denise Yu
230
+ dependabot[bot]
231
+ derwolfe
232
+ Desetude
233
+ developer
234
+ Devesh Kumar
235
+ Devesh Kumar Singh
236
+ devsagul
237
+ Diego Caraballo
238
+ Diego Ramirez
239
+ DiegoCaraballo
240
+ Dimitri Merejkowsky
241
+ Dimitri Papadopoulos
242
+ Dimitri Papadopoulos Orfanos
243
+ Dirk Stolle
244
+ dkjsone
245
+ Dmitry Gladkov
246
+ Dmitry Volodin
247
+ Domen Kožar
248
+ Dominic Davis-Foster
249
+ Donald Stufft
250
+ Dongweiming
251
+ doron zarhi
252
+ Dos Moonen
253
+ Douglas Thor
254
+ DrFeathers
255
+ Dustin Ingram
256
+ Dustin Rodrigues
257
+ Dwayne Bailey
258
+ Ed Morley
259
+ Edgar Ramírez
260
+ Edgar Ramírez Mondragón
261
+ Ee Durbin
262
+ Efflam Lemaillet
263
+ efflamlemaillet
264
+ Eitan Adler
265
+ ekristina
266
+ elainechan
267
+ Eli Schwartz
268
+ Elisha Hollander
269
+ Ellen Marie Dash
270
+ Emil Burzo
271
+ Emil Styrke
272
+ Emmanuel Arias
273
+ Endoh Takanao
274
+ enoch
275
+ Erdinc Mutlu
276
+ Eric Cousineau
277
+ Eric Gillingham
278
+ Eric Hanchrow
279
+ Eric Hopper
280
+ Erik M. Bray
281
+ Erik Rose
282
+ Erwin Janssen
283
+ Eugene Vereshchagin
284
+ everdimension
285
+ Federico
286
+ Felipe Peter
287
+ Felix Yan
288
+ fiber-space
289
+ Filip Kokosiński
290
+ Filipe Laíns
291
+ Finn Womack
292
+ finnagin
293
+ Flavio Amurrio
294
+ Florian Briand
295
+ Florian Rathgeber
296
+ Francesco
297
+ Francesco Montesano
298
+ Fredrik Orderud
299
+ Fredrik Roubert
300
+ Frost Ming
301
+ Gabriel Curio
302
+ Gabriel de Perthuis
303
+ Garry Polley
304
+ gavin
305
+ gdanielson
306
+ Gene Wood
307
+ Geoffrey Sneddon
308
+ George Margaritis
309
+ George Song
310
+ Georgi Valkov
311
+ Georgy Pchelkin
312
+ ghost
313
+ Giftlin Rajaiah
314
+ gizmoguy1
315
+ gkdoc
316
+ Godefroid Chapelle
317
+ Gopinath M
318
+ GOTO Hayato
319
+ gousaiyang
320
+ gpiks
321
+ Greg Roodt
322
+ Greg Ward
323
+ Guido Diepen
324
+ Guilherme Espada
325
+ Guillaume Seguin
326
+ gutsytechster
327
+ Guy Rozendorn
328
+ Guy Tuval
329
+ gzpan123
330
+ Hanjun Kim
331
+ Hari Charan
332
+ Harsh Vardhan
333
+ Harsha Sai
334
+ harupy
335
+ Harutaka Kawamura
336
+ Hasan-8326
337
+ hauntsaninja
338
+ Henrich Hartzer
339
+ Henry Schreiner
340
+ Herbert Pfennig
341
+ Holly Stotelmyer
342
+ Honnix
343
+ Hsiaoming Yang
344
+ Hugo Lopes Tavares
345
+ Hugo van Kemenade
346
+ Hugues Bruant
347
+ Hynek Schlawack
348
+ iamsrp-deshaw
349
+ Ian Bicking
350
+ Ian Cordasco
351
+ Ian Lee
352
+ Ian Stapleton Cordasco
353
+ Ian Wienand
354
+ Igor Kuzmitshov
355
+ Igor Sobreira
356
+ Ikko Ashimine
357
+ Ilan Schnell
358
+ Illia Volochii
359
+ Ilya Abdolmanafi
360
+ Ilya Baryshev
361
+ Inada Naoki
362
+ Ionel Cristian Mărieș
363
+ Ionel Maries Cristian
364
+ Itamar Turner-Trauring
365
+ iTrooz
366
+ Ivan Pozdeev
367
+ J. Nick Koston
368
+ Jacob Kim
369
+ Jacob Walls
370
+ Jaime Sanz
371
+ Jake Lishman
372
+ jakirkham
373
+ Jakub Kuczys
374
+ Jakub Stasiak
375
+ Jakub Vysoky
376
+ Jakub Wilk
377
+ James
378
+ James Cleveland
379
+ James Curtin
380
+ James Firth
381
+ James Gerity
382
+ James Polley
383
+ Jan Pokorný
384
+ Jannis Leidel
385
+ Jarek Potiuk
386
+ jarondl
387
+ Jason Curtis
388
+ Jason R. Coombs
389
+ JasonMo
390
+ JasonMo1
391
+ Jay Graves
392
+ Jean Abou Samra
393
+ Jean-Christophe Fillion-Robin
394
+ Jeff Barber
395
+ Jeff Dairiki
396
+ Jeff Widman
397
+ Jelmer Vernooij
398
+ jenix21
399
+ Jeremy Fleischman
400
+ Jeremy Stanley
401
+ Jeremy Zafran
402
+ Jesse Rittner
403
+ Jiashuo Li
404
+ Jim Fisher
405
+ Jim Garrison
406
+ Jinzhe Zeng
407
+ Jiun Bae
408
+ Jivan Amara
409
+ Joa
410
+ Joe Bylund
411
+ Joe Michelini
412
+ Johannes Altmanninger
413
+ John Paton
414
+ John Sirois
415
+ John T. Wodder II
416
+ John-Scott Atlakson
417
+ johnthagen
418
+ Jon Banafato
419
+ Jon Dufresne
420
+ Jon Parise
421
+ Jonas Nockert
422
+ Jonathan Herbert
423
+ Joonatan Partanen
424
+ Joost Molenaar
425
+ Jorge Niedbalski
426
+ Joseph Bylund
427
+ Joseph Long
428
+ Josh Bronson
429
+ Josh Cannon
430
+ Josh Hansen
431
+ Josh Schneier
432
+ Joshua
433
+ JoshuaPerdue
434
+ Jost Migenda
435
+ Juan Luis Cano Rodríguez
436
+ Juanjo Bazán
437
+ Judah Rand
438
+ Julian Berman
439
+ Julian Gethmann
440
+ Julien Demoor
441
+ Julien Stephan
442
+ July Tikhonov
443
+ Jussi Kukkonen
444
+ Justin van Heek
445
+ jwg4
446
+ Jyrki Pulliainen
447
+ Kai Chen
448
+ Kai Mueller
449
+ Kamal Bin Mustafa
450
+ Karolina Surma
451
+ kasium
452
+ kaustav haldar
453
+ Kaz Nishimura
454
+ keanemind
455
+ Keith Maxwell
456
+ Kelsey Hightower
457
+ Kenneth Belitzky
458
+ Kenneth Reitz
459
+ Kevin Burke
460
+ Kevin Carter
461
+ Kevin Frommelt
462
+ Kevin R Patterson
463
+ Kexuan Sun
464
+ Kit Randel
465
+ Klaas van Schelven
466
+ KOLANICH
467
+ konstin
468
+ kpinc
469
+ Krishan Bhasin
470
+ Krishna Oza
471
+ Kumar McMillan
472
+ Kuntal Majumder
473
+ Kurt McKee
474
+ Kyle Persohn
475
+ lakshmanaram
476
+ Laszlo Kiss-Kollar
477
+ Laurent Bristiel
478
+ Laurent LAPORTE
479
+ Laurie O
480
+ Laurie Opperman
481
+ layday
482
+ Leon Sasson
483
+ Lev Givon
484
+ Lincoln de Sousa
485
+ Lipis
486
+ lorddavidiii
487
+ Loren Carvalho
488
+ Lucas Cimon
489
+ Ludovic Gasc
490
+ Luis Medel
491
+ Lukas Geiger
492
+ Lukas Juhrich
493
+ Luke Macken
494
+ Luo Jiebin
495
+ luojiebin
496
+ luz.paz
497
+ László Kiss Kollár
498
+ M00nL1ght
499
+ MajorTanya
500
+ Malcolm Smith
501
+ Marc Abramowitz
502
+ Marc Tamlyn
503
+ Marcus Smith
504
+ Mariatta
505
+ Mark Kohler
506
+ Mark McLoughlin
507
+ Mark Williams
508
+ Markus Hametner
509
+ Martey Dodoo
510
+ Martin Fischer
511
+ Martin Häcker
512
+ Martin Pavlasek
513
+ Masaki
514
+ Masklinn
515
+ Matej Stuchlik
516
+ Mateusz Sokół
517
+ Mathew Jennings
518
+ Mathieu Bridon
519
+ Mathieu Kniewallner
520
+ Matt Bacchi
521
+ Matt Good
522
+ Matt Maker
523
+ Matt Robenolt
524
+ Matt Wozniski
525
+ matthew
526
+ Matthew Einhorn
527
+ Matthew Feickert
528
+ Matthew Gilliard
529
+ Matthew Hughes
530
+ Matthew Iversen
531
+ Matthew Treinish
532
+ Matthew Trumbell
533
+ Matthew Willson
534
+ Matthias Bussonnier
535
+ mattip
536
+ Maurits van Rees
537
+ Max W Chase
538
+ Maxim Kurnikov
539
+ Maxime Rouyrre
540
+ mayeut
541
+ mbaluna
542
+ Md Sujauddin Sekh
543
+ mdebi
544
+ Meet Vasita
545
+ memoselyk
546
+ meowmeowcat
547
+ Michael
548
+ Michael Aquilina
549
+ Michael E. Karpeles
550
+ Michael Klich
551
+ Michael Mintz
552
+ Michael Williamson
553
+ michaelpacer
554
+ Michał Górny
555
+ Mickaël Schoentgen
556
+ Miguel Araujo Perez
557
+ Mihir Singh
558
+ Mike
559
+ Mike Hendricks
560
+ Min RK
561
+ MinRK
562
+ Miro Hrončok
563
+ Monica Baluna
564
+ montefra
565
+ Monty Taylor
566
+ morotti
567
+ mrKazzila
568
+ Muha Ajjan
569
+ MUTHUSRIHEMADHARSHINI S A
570
+ Nadav Wexler
571
+ Nahuel Ambrosini
572
+ Nate Coraor
573
+ Nate Prewitt
574
+ Nathan Houghton
575
+ Nathaniel J. Smith
576
+ Nehal J Wani
577
+ Neil Botelho
578
+ Nguyễn Gia Phong
579
+ Nicholas Serra
580
+ Nick Coghlan
581
+ Nick Stenning
582
+ Nick Timkovich
583
+ Nicolas Bock
584
+ Nicole Harris
585
+ Nikhil Benesch
586
+ Nikhil Ladha
587
+ Nikita Chepanov
588
+ Nikolay Korolev
589
+ Nipunn Koorapati
590
+ Nitesh Sharma
591
+ Niyas Sait
592
+ Noah
593
+ Noah Gorny
594
+ Nothing-991
595
+ Nowell Strite
596
+ NtaleGrey
597
+ nucccc
598
+ nvdv
599
+ OBITORASU
600
+ Ofek Lev
601
+ ofrinevo
602
+ Oleg Burnaev
603
+ Oliver Freund
604
+ Oliver Jeeves
605
+ Oliver Mannion
606
+ Oliver Tonnhofer
607
+ Olivier Girardot
608
+ Olivier Grisel
609
+ Ollie Rutherfurd
610
+ OMOTO Kenji
611
+ Omry Yadan
612
+ onlinejudge95
613
+ Oren Held
614
+ Oscar Benjamin
615
+ oxygen dioxide
616
+ Oz N Tiram
617
+ Pachwenko
618
+ Paresh Joshi
619
+ Patrick Dubroy
620
+ Patrick Jenkins
621
+ Patrick Lawson
622
+ patricktokeeffe
623
+ Patrik Kopkan
624
+ Paul Ganssle
625
+ Paul Kehrer
626
+ Paul Moore
627
+ Paul Nasrat
628
+ Paul Oswald
629
+ Paul van der Linden
630
+ Paulus Schoutsen
631
+ Pavel Safronov
632
+ Pavithra Eswaramoorthy
633
+ Pawel Jasinski
634
+ Paweł Szramowski
635
+ Pekka Klärck
636
+ Peter Gessler
637
+ Peter Lisák
638
+ Peter Shen
639
+ Peter Waller
640
+ Petr Viktorin
641
+ petr-tik
642
+ Phaneendra Chiruvella
643
+ Phil Elson
644
+ Phil Freo
645
+ Phil Pennock
646
+ Phil Whelan
647
+ Philip Jägenstedt
648
+ Philip Molloy
649
+ Philippe Ombredanne
650
+ Pi Delport
651
+ Pierre-Yves Rofes
652
+ Pieter Degroote
653
+ pip
654
+ Prabakaran Kumaresshan
655
+ Prabhjyotsing Surjit Singh Sodhi
656
+ Prabhu Marappan
657
+ Pradyun Gedam
658
+ Prashant Sharma
659
+ Pratik Mallya
660
+ pre-commit-ci[bot]
661
+ Preet Thakkar
662
+ Preston Holmes
663
+ Przemek Wrzos
664
+ Pulkit Goyal
665
+ q0w
666
+ Qiangning Hong
667
+ Qiming Xu
668
+ qraqras
669
+ Quentin Lee
670
+ Quentin Pradet
671
+ R. David Murray
672
+ Rafael Caricio
673
+ Ralf Schmitt
674
+ Ran Benita
675
+ Randy Döring
676
+ Razzi Abuissa
677
+ rdb
678
+ Reece Dunham
679
+ Remi Rampin
680
+ Rene Dudfield
681
+ Riccardo Magliocchetti
682
+ Riccardo Schirone
683
+ Richard Jones
684
+ Richard Si
685
+ Ricky Ng-Adam
686
+ Rishi
687
+ rmorotti
688
+ RobberPhex
689
+ Robert Collins
690
+ Robert McGibbon
691
+ Robert Pollak
692
+ Robert T. McGibbon
693
+ robin elisha robinson
694
+ Rodney, Tiara
695
+ Roey Berman
696
+ Rohan Jain
697
+ Roman Bogorodskiy
698
+ Roman Donchenko
699
+ Romuald Brunet
700
+ ronaudinho
701
+ Ronny Pfannschmidt
702
+ Rory McCann
703
+ Ross Brattain
704
+ Roy Wellington Ⅳ
705
+ Ruairidh MacLeod
706
+ Russell Keith-Magee
707
+ Ryan Shepherd
708
+ Ryan Wooden
709
+ ryneeverett
710
+ Ryuma Asai
711
+ S. Guliaev
712
+ Sachi King
713
+ Salvatore Rinchiera
714
+ sandeepkiran-js
715
+ Sander Van Balen
716
+ Savio Jomton
717
+ schlamar
718
+ Scott Kitterman
719
+ Sean
720
+ seanj
721
+ Sebastian Jordan
722
+ Sebastian Schaetz
723
+ Segev Finer
724
+ SeongSoo Cho
725
+ Sepehr Rasouli
726
+ sepehrrasooli
727
+ Sergey Vasilyev
728
+ Seth Michael Larson
729
+ Seth Woodworth
730
+ Shahar Epstein
731
+ Shantanu
732
+ shenxianpeng
733
+ shireenrao
734
+ Shivansh-007
735
+ Shixian Sheng
736
+ Shlomi Fish
737
+ Shovan Maity
738
+ Shubham Nagure
739
+ Simeon Visser
740
+ Simon Cross
741
+ Simon Pichugin
742
+ sinoroc
743
+ sinscary
744
+ snook92
745
+ socketubs
746
+ Sorin Sbarnea
747
+ Srinivas Nyayapati
748
+ Srishti Hegde
749
+ Stavros Korokithakis
750
+ Stefan Scherfke
751
+ Stefano Rivera
752
+ Stephan Erb
753
+ Stephane Chazelas
754
+ Stephen Payne
755
+ Stephen Rosen
756
+ stepshal
757
+ Steve (Gadget) Barnes
758
+ Steve Barnes
759
+ Steve Dower
760
+ Steve Kowalik
761
+ Steven Myint
762
+ Steven Silvester
763
+ stonebig
764
+ studioj
765
+ Stéphane Bidoul
766
+ Stéphane Bidoul (ACSONE)
767
+ Stéphane Klein
768
+ Sumana Harihareswara
769
+ Surbhi Sharma
770
+ Sviatoslav Sydorenko
771
+ Sviatoslav Sydorenko (Святослав Сидоренко)
772
+ Swat009
773
+ Sylvain
774
+ Takayuki SHIMIZUKAWA
775
+ Taneli Hukkinen
776
+ tbeswick
777
+ Terrance
778
+ Thiago
779
+ Thijs Triemstra
780
+ Thomas Fenzl
781
+ Thomas Grainger
782
+ Thomas Guettler
783
+ Thomas Johansson
784
+ Thomas Kluyver
785
+ Thomas Smith
786
+ Thomas VINCENT
787
+ Tim D. Smith
788
+ Tim Gates
789
+ Tim Harder
790
+ Tim Heap
791
+ tim smith
792
+ tinruufu
793
+ Tobias Hermann
794
+ Tom Forbes
795
+ Tom Freudenheim
796
+ Tom V
797
+ Tomas Hrnciar
798
+ Tomas Orsava
799
+ Tomer Chachamu
800
+ Tommi Enenkel | AnB
801
+ Tomáš Hrnčiar
802
+ Tony Beswick
803
+ Tony Narlock
804
+ Tony Zhaocheng Tan
805
+ TonyBeswick
806
+ toonarmycaptain
807
+ Toshio Kuratomi
808
+ toxinu
809
+ Travis Swicegood
810
+ Tushar Sadhwani
811
+ Tzu-ping Chung
812
+ Valentin Haenel
813
+ Victor Stinner
814
+ victorvpaulo
815
+ Vikram - Google
816
+ Viktor Szépe
817
+ Ville Skyttä
818
+ Vinay Sajip
819
+ Vincent Philippon
820
+ Vinicyus Macedo
821
+ Vipul Kumar
822
+ Vitaly Babiy
823
+ Vladimir Fokow
824
+ Vladimir Rutsky
825
+ W. Trevor King
826
+ Weida Hong
827
+ Wil Tan
828
+ Wilfred Hughes
829
+ William Edwards
830
+ William ML Leslie
831
+ William T Olson
832
+ William Woodruff
833
+ Wilson Mo
834
+ wim glenn
835
+ Winson Luk
836
+ Wolfgang Maier
837
+ Wu Zhenyu
838
+ XAMES3
839
+ Xavier Fernandez
840
+ Xianpeng Shen
841
+ xoviat
842
+ xtreak
843
+ YAMAMOTO Takashi
844
+ Yash
845
+ Yashraj
846
+ Yen Chi Hsuan
847
+ Yeray Diaz Diaz
848
+ Yoval P
849
+ Yu Jian
850
+ Yuan Jing Vincent Yan
851
+ Yuki Kobayashi
852
+ Yusuke Hayashi
853
+ zackzack38
854
+ Zearin
855
+ Zhiping Deng
856
+ ziebam
857
+ Zvezdan Petkovic
858
+ Łukasz Langa
859
+ Роман Донченко
860
+ Семён Марьясин
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright 2012-2021 Eric Larson
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/certifi/LICENSE ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ This package contains a modified version of ca-bundle.crt:
2
+
3
+ ca-bundle.crt -- Bundle of CA Root Certificates
4
+
5
+ This is a bundle of X.509 certificates of public Certificate Authorities
6
+ (CA). These were automatically extracted from Mozilla's root certificates
7
+ file (certdata.txt). This file can be found in the mozilla source tree:
8
+ https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt
9
+ It contains the certificates in PEM format and therefore
10
+ can be directly used with curl / libcurl / php_curl, or with
11
+ an Apache+mod_ssl webserver for SSL client authentication.
12
+ Just configure this file as the SSLCACertificateFile.#
13
+
14
+ ***** BEGIN LICENSE BLOCK *****
15
+ This Source Code Form is subject to the terms of the Mozilla Public License,
16
+ v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
17
+ one at http://mozilla.org/MPL/2.0/.
18
+
19
+ ***** END LICENSE BLOCK *****
20
+ @(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2024-present Stephen Rosen <sirosen0@gmail.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt ADDED
@@ -0,0 +1,284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ A. HISTORY OF THE SOFTWARE
2
+ ==========================
3
+
4
+ Python was created in the early 1990s by Guido van Rossum at Stichting
5
+ Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
6
+ as a successor of a language called ABC. Guido remains Python's
7
+ principal author, although it includes many contributions from others.
8
+
9
+ In 1995, Guido continued his work on Python at the Corporation for
10
+ National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
11
+ in Reston, Virginia where he released several versions of the
12
+ software.
13
+
14
+ In May 2000, Guido and the Python core development team moved to
15
+ BeOpen.com to form the BeOpen PythonLabs team. In October of the same
16
+ year, the PythonLabs team moved to Digital Creations (now Zope
17
+ Corporation, see http://www.zope.com). In 2001, the Python Software
18
+ Foundation (PSF, see http://www.python.org/psf/) was formed, a
19
+ non-profit organization created specifically to own Python-related
20
+ Intellectual Property. Zope Corporation is a sponsoring member of
21
+ the PSF.
22
+
23
+ All Python releases are Open Source (see http://www.opensource.org for
24
+ the Open Source Definition). Historically, most, but not all, Python
25
+ releases have also been GPL-compatible; the table below summarizes
26
+ the various releases.
27
+
28
+ Release Derived Year Owner GPL-
29
+ from compatible? (1)
30
+
31
+ 0.9.0 thru 1.2 1991-1995 CWI yes
32
+ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
33
+ 1.6 1.5.2 2000 CNRI no
34
+ 2.0 1.6 2000 BeOpen.com no
35
+ 1.6.1 1.6 2001 CNRI yes (2)
36
+ 2.1 2.0+1.6.1 2001 PSF no
37
+ 2.0.1 2.0+1.6.1 2001 PSF yes
38
+ 2.1.1 2.1+2.0.1 2001 PSF yes
39
+ 2.2 2.1.1 2001 PSF yes
40
+ 2.1.2 2.1.1 2002 PSF yes
41
+ 2.1.3 2.1.2 2002 PSF yes
42
+ 2.2.1 2.2 2002 PSF yes
43
+ 2.2.2 2.2.1 2002 PSF yes
44
+ 2.2.3 2.2.2 2003 PSF yes
45
+ 2.3 2.2.2 2002-2003 PSF yes
46
+ 2.3.1 2.3 2002-2003 PSF yes
47
+ 2.3.2 2.3.1 2002-2003 PSF yes
48
+ 2.3.3 2.3.2 2002-2003 PSF yes
49
+ 2.3.4 2.3.3 2004 PSF yes
50
+ 2.3.5 2.3.4 2005 PSF yes
51
+ 2.4 2.3 2004 PSF yes
52
+ 2.4.1 2.4 2005 PSF yes
53
+ 2.4.2 2.4.1 2005 PSF yes
54
+ 2.4.3 2.4.2 2006 PSF yes
55
+ 2.4.4 2.4.3 2006 PSF yes
56
+ 2.5 2.4 2006 PSF yes
57
+ 2.5.1 2.5 2007 PSF yes
58
+ 2.5.2 2.5.1 2008 PSF yes
59
+ 2.5.3 2.5.2 2008 PSF yes
60
+ 2.6 2.5 2008 PSF yes
61
+ 2.6.1 2.6 2008 PSF yes
62
+ 2.6.2 2.6.1 2009 PSF yes
63
+ 2.6.3 2.6.2 2009 PSF yes
64
+ 2.6.4 2.6.3 2009 PSF yes
65
+ 2.6.5 2.6.4 2010 PSF yes
66
+ 3.0 2.6 2008 PSF yes
67
+ 3.0.1 3.0 2009 PSF yes
68
+ 3.1 3.0.1 2009 PSF yes
69
+ 3.1.1 3.1 2009 PSF yes
70
+ 3.1.2 3.1 2010 PSF yes
71
+ 3.2 3.1 2010 PSF yes
72
+
73
+ Footnotes:
74
+
75
+ (1) GPL-compatible doesn't mean that we're distributing Python under
76
+ the GPL. All Python licenses, unlike the GPL, let you distribute
77
+ a modified version without making your changes open source. The
78
+ GPL-compatible licenses make it possible to combine Python with
79
+ other software that is released under the GPL; the others don't.
80
+
81
+ (2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
82
+ because its license has a choice of law clause. According to
83
+ CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
84
+ is "not incompatible" with the GPL.
85
+
86
+ Thanks to the many outside volunteers who have worked under Guido's
87
+ direction to make these releases possible.
88
+
89
+
90
+ B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
91
+ ===============================================================
92
+
93
+ PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
94
+ --------------------------------------------
95
+
96
+ 1. This LICENSE AGREEMENT is between the Python Software Foundation
97
+ ("PSF"), and the Individual or Organization ("Licensee") accessing and
98
+ otherwise using this software ("Python") in source or binary form and
99
+ its associated documentation.
100
+
101
+ 2. Subject to the terms and conditions of this License Agreement, PSF hereby
102
+ grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
103
+ analyze, test, perform and/or display publicly, prepare derivative works,
104
+ distribute, and otherwise use Python alone or in any derivative version,
105
+ provided, however, that PSF's License Agreement and PSF's notice of copyright,
106
+ i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
107
+ Python Software Foundation; All Rights Reserved" are retained in Python alone or
108
+ in any derivative version prepared by Licensee.
109
+
110
+ 3. In the event Licensee prepares a derivative work that is based on
111
+ or incorporates Python or any part thereof, and wants to make
112
+ the derivative work available to others as provided herein, then
113
+ Licensee hereby agrees to include in any such work a brief summary of
114
+ the changes made to Python.
115
+
116
+ 4. PSF is making Python available to Licensee on an "AS IS"
117
+ basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
118
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
119
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
120
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
121
+ INFRINGE ANY THIRD PARTY RIGHTS.
122
+
123
+ 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
124
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
125
+ A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
126
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
127
+
128
+ 6. This License Agreement will automatically terminate upon a material
129
+ breach of its terms and conditions.
130
+
131
+ 7. Nothing in this License Agreement shall be deemed to create any
132
+ relationship of agency, partnership, or joint venture between PSF and
133
+ Licensee. This License Agreement does not grant permission to use PSF
134
+ trademarks or trade name in a trademark sense to endorse or promote
135
+ products or services of Licensee, or any third party.
136
+
137
+ 8. By copying, installing or otherwise using Python, Licensee
138
+ agrees to be bound by the terms and conditions of this License
139
+ Agreement.
140
+
141
+
142
+ BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
143
+ -------------------------------------------
144
+
145
+ BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
146
+
147
+ 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
148
+ office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
149
+ Individual or Organization ("Licensee") accessing and otherwise using
150
+ this software in source or binary form and its associated
151
+ documentation ("the Software").
152
+
153
+ 2. Subject to the terms and conditions of this BeOpen Python License
154
+ Agreement, BeOpen hereby grants Licensee a non-exclusive,
155
+ royalty-free, world-wide license to reproduce, analyze, test, perform
156
+ and/or display publicly, prepare derivative works, distribute, and
157
+ otherwise use the Software alone or in any derivative version,
158
+ provided, however, that the BeOpen Python License is retained in the
159
+ Software, alone or in any derivative version prepared by Licensee.
160
+
161
+ 3. BeOpen is making the Software available to Licensee on an "AS IS"
162
+ basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
163
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
164
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
165
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
166
+ INFRINGE ANY THIRD PARTY RIGHTS.
167
+
168
+ 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
169
+ SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
170
+ AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
171
+ DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
172
+
173
+ 5. This License Agreement will automatically terminate upon a material
174
+ breach of its terms and conditions.
175
+
176
+ 6. This License Agreement shall be governed by and interpreted in all
177
+ respects by the law of the State of California, excluding conflict of
178
+ law provisions. Nothing in this License Agreement shall be deemed to
179
+ create any relationship of agency, partnership, or joint venture
180
+ between BeOpen and Licensee. This License Agreement does not grant
181
+ permission to use BeOpen trademarks or trade names in a trademark
182
+ sense to endorse or promote products or services of Licensee, or any
183
+ third party. As an exception, the "BeOpen Python" logos available at
184
+ http://www.pythonlabs.com/logos.html may be used according to the
185
+ permissions granted on that web page.
186
+
187
+ 7. By copying, installing or otherwise using the software, Licensee
188
+ agrees to be bound by the terms and conditions of this License
189
+ Agreement.
190
+
191
+
192
+ CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
193
+ ---------------------------------------
194
+
195
+ 1. This LICENSE AGREEMENT is between the Corporation for National
196
+ Research Initiatives, having an office at 1895 Preston White Drive,
197
+ Reston, VA 20191 ("CNRI"), and the Individual or Organization
198
+ ("Licensee") accessing and otherwise using Python 1.6.1 software in
199
+ source or binary form and its associated documentation.
200
+
201
+ 2. Subject to the terms and conditions of this License Agreement, CNRI
202
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide
203
+ license to reproduce, analyze, test, perform and/or display publicly,
204
+ prepare derivative works, distribute, and otherwise use Python 1.6.1
205
+ alone or in any derivative version, provided, however, that CNRI's
206
+ License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
207
+ 1995-2001 Corporation for National Research Initiatives; All Rights
208
+ Reserved" are retained in Python 1.6.1 alone or in any derivative
209
+ version prepared by Licensee. Alternately, in lieu of CNRI's License
210
+ Agreement, Licensee may substitute the following text (omitting the
211
+ quotes): "Python 1.6.1 is made available subject to the terms and
212
+ conditions in CNRI's License Agreement. This Agreement together with
213
+ Python 1.6.1 may be located on the Internet using the following
214
+ unique, persistent identifier (known as a handle): 1895.22/1013. This
215
+ Agreement may also be obtained from a proxy server on the Internet
216
+ using the following URL: http://hdl.handle.net/1895.22/1013".
217
+
218
+ 3. In the event Licensee prepares a derivative work that is based on
219
+ or incorporates Python 1.6.1 or any part thereof, and wants to make
220
+ the derivative work available to others as provided herein, then
221
+ Licensee hereby agrees to include in any such work a brief summary of
222
+ the changes made to Python 1.6.1.
223
+
224
+ 4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
225
+ basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
226
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
227
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
228
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
229
+ INFRINGE ANY THIRD PARTY RIGHTS.
230
+
231
+ 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
232
+ 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
233
+ A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
234
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
235
+
236
+ 6. This License Agreement will automatically terminate upon a material
237
+ breach of its terms and conditions.
238
+
239
+ 7. This License Agreement shall be governed by the federal
240
+ intellectual property law of the United States, including without
241
+ limitation the federal copyright law, and, to the extent such
242
+ U.S. federal law does not apply, by the law of the Commonwealth of
243
+ Virginia, excluding Virginia's conflict of law provisions.
244
+ Notwithstanding the foregoing, with regard to derivative works based
245
+ on Python 1.6.1 that incorporate non-separable material that was
246
+ previously distributed under the GNU General Public License (GPL), the
247
+ law of the Commonwealth of Virginia shall govern this License
248
+ Agreement only as to issues arising under or with respect to
249
+ Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
250
+ License Agreement shall be deemed to create any relationship of
251
+ agency, partnership, or joint venture between CNRI and Licensee. This
252
+ License Agreement does not grant permission to use CNRI trademarks or
253
+ trade name in a trademark sense to endorse or promote products or
254
+ services of Licensee, or any third party.
255
+
256
+ 8. By clicking on the "ACCEPT" button where indicated, or by copying,
257
+ installing or otherwise using Python 1.6.1, Licensee agrees to be
258
+ bound by the terms and conditions of this License Agreement.
259
+
260
+ ACCEPT
261
+
262
+
263
+ CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
264
+ --------------------------------------------------
265
+
266
+ Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
267
+ The Netherlands. All rights reserved.
268
+
269
+ Permission to use, copy, modify, and distribute this software and its
270
+ documentation for any purpose and without fee is hereby granted,
271
+ provided that the above copyright notice appear in all copies and that
272
+ both that copyright notice and this permission notice appear in
273
+ supporting documentation, and that the name of Stichting Mathematisch
274
+ Centrum or CWI not be used in advertising or publicity pertaining to
275
+ distribution of the software without specific, written prior
276
+ permission.
277
+
278
+ STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
279
+ THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
280
+ FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
281
+ FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
282
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
283
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
284
+ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/distro/LICENSE ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "{}"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright {yyyy} {name of copyright owner}
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
202
+
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2013-2025, Kim Davies and contributors.
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are
8
+ met:
9
+
10
+ 1. Redistributions of source code must retain the above copyright
11
+ notice, this list of conditions and the following disclaimer.
12
+
13
+ 2. Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+
17
+ 3. Neither the name of the copyright holder nor the names of its
18
+ contributors may be used to endorse or promote products derived from
19
+ this software without specific prior written permission.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/msgpack/COPYING ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (C) 2008-2011 INADA Naoki <songofacandy@gmail.com>
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ This software is made available under the terms of *either* of the licenses
2
+ found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made
3
+ under the terms of *both* these licenses.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) Donald Stufft and individual contributors.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
18
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Permission is hereby granted, free of charge, to any person obtaining a copy
2
+ of this software and associated documentation files (the "Software"), to
3
+ deal in the Software without restriction, including without limitation the
4
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
5
+ sell copies of the Software, and to permit persons to whom the Software is
6
+ furnished to do so, subject to the following conditions:
7
+
8
+ The above copyright notice and this permission notice shall be included in
9
+ all copies or substantial portions of the Software.
10
+
11
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
16
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
17
+ IN THE SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2010-202x The platformdirs developers
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/pygments/LICENSE ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2006-2022 by the respective authors (see AUTHORS file).
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are
6
+ met:
7
+
8
+ * Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above copyright
12
+ notice, this list of conditions and the following disclaimer in the
13
+ documentation and/or other materials provided with the distribution.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Thomas Kluyver
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/requests/LICENSE ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2018, Tzu-ping Chung <uranusjr@gmail.com>
2
+
3
+ Permission to use, copy, modify, and distribute this software for any
4
+ purpose with or without fee is hereby granted, provided that the above
5
+ copyright notice and this permission notice appear in all copies.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/rich/LICENSE ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2020 Will McGugan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/tomli/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Taneli Hukkinen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2021 Taneli Hukkinen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/truststore/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2022 Seth Michael Larson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
.venv/Lib/site-packages/pip-26.0.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
.venv/Lib/site-packages/pip/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ __version__ = "26.0"
4
+
5
+
6
+ def main(args: list[str] | None = None) -> int:
7
+ """This is an internal API only meant for use by pip's own console scripts.
8
+
9
+ For additional details, see https://github.com/pypa/pip/issues/7498.
10
+ """
11
+ from pip._internal.utils.entrypoints import _wrapper
12
+
13
+ return _wrapper(args)
.venv/Lib/site-packages/pip/__main__.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+
4
+ # Remove '' and current working directory from the first entry
5
+ # of sys.path, if present to avoid using current directory
6
+ # in pip commands check, freeze, install, list and show,
7
+ # when invoked as python -m pip <command>
8
+ if sys.path[0] in ("", os.getcwd()):
9
+ sys.path.pop(0)
10
+
11
+ # If we are running from a wheel, add the wheel to sys.path
12
+ # This allows the usage python pip-*.whl/pip install pip-*.whl
13
+ if __package__ == "":
14
+ # __file__ is pip-*.whl/pip/__main__.py
15
+ # first dirname call strips of '/__main__.py', second strips off '/pip'
16
+ # Resulting path is the name of the wheel itself
17
+ # Add that to sys.path so we can import pip
18
+ path = os.path.dirname(os.path.dirname(__file__))
19
+ sys.path.insert(0, path)
20
+
21
+ if __name__ == "__main__":
22
+ from pip._internal.cli.main import main as _main
23
+
24
+ sys.exit(_main())
.venv/Lib/site-packages/pip/__pip-runner__.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Execute exactly this copy of pip, within a different environment.
2
+
3
+ This file is named as it is, to ensure that this module can't be imported via
4
+ an import statement.
5
+ """
6
+
7
+ # /!\ This version compatibility check section must be Python 2 compatible. /!\
8
+
9
+ import sys
10
+
11
+ # Copied from pyproject.toml
12
+ PYTHON_REQUIRES = (3, 9)
13
+
14
+
15
+ def version_str(version): # type: ignore
16
+ return ".".join(str(v) for v in version)
17
+
18
+
19
+ if sys.version_info[:2] < PYTHON_REQUIRES:
20
+ raise SystemExit(
21
+ "This version of pip does not support python {} (requires >={}).".format(
22
+ version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
23
+ )
24
+ )
25
+
26
+ # From here on, we can use Python 3 features, but the syntax must remain
27
+ # Python 2 compatible.
28
+
29
+ import runpy # noqa: E402
30
+ from importlib.machinery import PathFinder # noqa: E402
31
+ from os.path import dirname # noqa: E402
32
+
33
+ PIP_SOURCES_ROOT = dirname(dirname(__file__))
34
+
35
+
36
+ class PipImportRedirectingFinder:
37
+ @classmethod
38
+ def find_spec(self, fullname, path=None, target=None): # type: ignore
39
+ if fullname != "pip":
40
+ return None
41
+
42
+ spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
43
+ assert spec, (PIP_SOURCES_ROOT, fullname)
44
+ return spec
45
+
46
+
47
+ sys.meta_path.insert(0, PipImportRedirectingFinder())
48
+
49
+ assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
50
+ runpy.run_module("pip", run_name="__main__", alter_sys=True)
.venv/Lib/site-packages/pip/_internal/__init__.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ from pip._internal.utils import _log
4
+
5
+ # init_logging() must be called before any call to logging.getLogger()
6
+ # which happens at import of most modules.
7
+ _log.init_logging()
8
+
9
+
10
+ def main(args: list[str] | None = None) -> int:
11
+ """This is preserved for old console scripts that may still be referencing
12
+ it.
13
+
14
+ For additional details, see https://github.com/pypa/pip/issues/7498.
15
+ """
16
+ from pip._internal.utils.entrypoints import _wrapper
17
+
18
+ return _wrapper(args)
.venv/Lib/site-packages/pip/_internal/build_env.py ADDED
@@ -0,0 +1,606 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build Environment used for isolation during sdist building"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ import pathlib
8
+ import site
9
+ import sys
10
+ import textwrap
11
+ from collections import OrderedDict
12
+ from collections.abc import Iterable, Sequence
13
+ from contextlib import AbstractContextManager as ContextManager
14
+ from contextlib import nullcontext
15
+ from io import StringIO
16
+ from types import TracebackType
17
+ from typing import TYPE_CHECKING, Protocol, TypedDict
18
+
19
+ from pip._vendor.packaging.version import Version
20
+
21
+ from pip import __file__ as pip_location
22
+ from pip._internal.cli.spinners import open_rich_spinner, open_spinner
23
+ from pip._internal.exceptions import (
24
+ BuildDependencyInstallError,
25
+ DiagnosticPipError,
26
+ InstallWheelBuildError,
27
+ PipError,
28
+ )
29
+ from pip._internal.locations import get_platlib, get_purelib, get_scheme
30
+ from pip._internal.metadata import get_default_environment, get_environment
31
+ from pip._internal.utils.deprecation import deprecated
32
+ from pip._internal.utils.logging import VERBOSE, capture_logging
33
+ from pip._internal.utils.packaging import get_requirement
34
+ from pip._internal.utils.subprocess import call_subprocess
35
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
36
+
37
+ if TYPE_CHECKING:
38
+ from pip._internal.cache import WheelCache
39
+ from pip._internal.index.package_finder import PackageFinder
40
+ from pip._internal.operations.build.build_tracker import BuildTracker
41
+ from pip._internal.req.req_install import InstallRequirement
42
+ from pip._internal.resolution.base import BaseResolver
43
+
44
+ class ExtraEnviron(TypedDict, total=False):
45
+ extra_environ: dict[str, str]
46
+
47
+
48
+ logger = logging.getLogger(__name__)
49
+
50
+
51
+ def _dedup(a: str, b: str) -> tuple[str] | tuple[str, str]:
52
+ return (a, b) if a != b else (a,)
53
+
54
+
55
+ class _Prefix:
56
+ def __init__(self, path: str) -> None:
57
+ self.path = path
58
+ self.setup = False
59
+ scheme = get_scheme("", prefix=path)
60
+ self.bin_dir = scheme.scripts
61
+ self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
62
+
63
+
64
+ def get_runnable_pip() -> str:
65
+ """Get a file to pass to a Python executable, to run the currently-running pip.
66
+
67
+ This is used to run a pip subprocess, for installing requirements into the build
68
+ environment.
69
+ """
70
+ source = pathlib.Path(pip_location).resolve().parent
71
+
72
+ if not source.is_dir():
73
+ # This would happen if someone is using pip from inside a zip file. In that
74
+ # case, we can use that directly.
75
+ return str(source)
76
+
77
+ return os.fsdecode(source / "__pip-runner__.py")
78
+
79
+
80
+ def _get_system_sitepackages() -> set[str]:
81
+ """Get system site packages
82
+
83
+ Usually from site.getsitepackages,
84
+ but fallback on `get_purelib()/get_platlib()` if unavailable
85
+ (e.g. in a virtualenv created by virtualenv<20)
86
+
87
+ Returns normalized set of strings.
88
+ """
89
+ if hasattr(site, "getsitepackages"):
90
+ system_sites = site.getsitepackages()
91
+ else:
92
+ # virtualenv < 20 overwrites site.py without getsitepackages
93
+ # fallback on get_purelib/get_platlib.
94
+ # this is known to miss things, but shouldn't in the cases
95
+ # where getsitepackages() has been removed (inside a virtualenv)
96
+ system_sites = [get_purelib(), get_platlib()]
97
+ return {os.path.normcase(path) for path in system_sites}
98
+
99
+
100
+ class BuildEnvironmentInstaller(Protocol):
101
+ """
102
+ Interface for installing build dependencies into an isolated build
103
+ environment.
104
+ """
105
+
106
+ def install(
107
+ self,
108
+ requirements: Iterable[str],
109
+ prefix: _Prefix,
110
+ *,
111
+ kind: str,
112
+ for_req: InstallRequirement | None,
113
+ ) -> None: ...
114
+
115
+
116
+ class SubprocessBuildEnvironmentInstaller:
117
+ """
118
+ Install build dependencies by calling pip in a subprocess.
119
+ """
120
+
121
+ def __init__(
122
+ self,
123
+ finder: PackageFinder,
124
+ build_constraints: list[str] | None = None,
125
+ build_constraint_feature_enabled: bool = False,
126
+ ) -> None:
127
+ self.finder = finder
128
+ self._build_constraints = build_constraints or []
129
+ self._build_constraint_feature_enabled = build_constraint_feature_enabled
130
+
131
+ def _deprecation_constraint_check(self) -> None:
132
+ """
133
+ Check for deprecation warning: PIP_CONSTRAINT affecting build environments.
134
+
135
+ This warns when build-constraint feature is NOT enabled and PIP_CONSTRAINT
136
+ is not empty.
137
+ """
138
+ if self._build_constraint_feature_enabled or self._build_constraints:
139
+ return
140
+
141
+ pip_constraint = os.environ.get("PIP_CONSTRAINT")
142
+ if not pip_constraint or not pip_constraint.strip():
143
+ return
144
+
145
+ deprecated(
146
+ reason=(
147
+ "Setting PIP_CONSTRAINT will not affect "
148
+ "build constraints in the future,"
149
+ ),
150
+ replacement=(
151
+ "to specify build constraints using --build-constraint or "
152
+ "PIP_BUILD_CONSTRAINT. To disable this warning without "
153
+ "any build constraints set --use-feature=build-constraint or "
154
+ 'PIP_USE_FEATURE="build-constraint"'
155
+ ),
156
+ gone_in="26.2",
157
+ issue=None,
158
+ )
159
+
160
+ def install(
161
+ self,
162
+ requirements: Iterable[str],
163
+ prefix: _Prefix,
164
+ *,
165
+ kind: str,
166
+ for_req: InstallRequirement | None,
167
+ ) -> None:
168
+ self._deprecation_constraint_check()
169
+
170
+ finder = self.finder
171
+ args: list[str] = [
172
+ sys.executable,
173
+ get_runnable_pip(),
174
+ "install",
175
+ "--ignore-installed",
176
+ "--no-user",
177
+ "--prefix",
178
+ prefix.path,
179
+ "--no-warn-script-location",
180
+ "--disable-pip-version-check",
181
+ # As the build environment is ephemeral, it's wasteful to
182
+ # pre-compile everything, especially as not every Python
183
+ # module will be used/compiled in most cases.
184
+ "--no-compile",
185
+ # The prefix specified two lines above, thus
186
+ # target from config file or env var should be ignored
187
+ "--target",
188
+ "",
189
+ ]
190
+ if logger.getEffectiveLevel() <= logging.DEBUG:
191
+ args.append("-vv")
192
+ elif logger.getEffectiveLevel() <= VERBOSE:
193
+ args.append("-v")
194
+ for format_control in ("no_binary", "only_binary"):
195
+ formats = getattr(finder.format_control, format_control)
196
+ args.extend(
197
+ (
198
+ "--" + format_control.replace("_", "-"),
199
+ ",".join(sorted(formats or {":none:"})),
200
+ )
201
+ )
202
+
203
+ if finder.release_control is not None:
204
+ # Use ordered args to preserve the user's original command-line order
205
+ # This is important because later flags can override earlier ones
206
+ for attr_name, value in finder.release_control.get_ordered_args():
207
+ args.extend(("--" + attr_name.replace("_", "-"), value))
208
+
209
+ index_urls = finder.index_urls
210
+ if index_urls:
211
+ args.extend(["-i", index_urls[0]])
212
+ for extra_index in index_urls[1:]:
213
+ args.extend(["--extra-index-url", extra_index])
214
+ else:
215
+ args.append("--no-index")
216
+ for link in finder.find_links:
217
+ args.extend(["--find-links", link])
218
+
219
+ if finder.proxy:
220
+ args.extend(["--proxy", finder.proxy])
221
+ for host in finder.trusted_hosts:
222
+ args.extend(["--trusted-host", host])
223
+ if finder.custom_cert:
224
+ args.extend(["--cert", finder.custom_cert])
225
+ if finder.client_cert:
226
+ args.extend(["--client-cert", finder.client_cert])
227
+ if finder.prefer_binary:
228
+ args.append("--prefer-binary")
229
+
230
+ # Handle build constraints
231
+ if self._build_constraint_feature_enabled:
232
+ args.extend(["--use-feature", "build-constraint"])
233
+
234
+ if self._build_constraints:
235
+ # Build constraints must be passed as both constraints
236
+ # and build constraints, so that nested builds receive
237
+ # build constraints
238
+ for constraint_file in self._build_constraints:
239
+ args.extend(["--constraint", constraint_file])
240
+ args.extend(["--build-constraint", constraint_file])
241
+
242
+ extra_environ: ExtraEnviron = {}
243
+ if self._build_constraint_feature_enabled and not self._build_constraints:
244
+ # If there are no build constraints but the build constraints
245
+ # feature is enabled then we must ignore regular constraints
246
+ # in the isolated build environment
247
+ extra_environ = {"extra_environ": {"_PIP_IN_BUILD_IGNORE_CONSTRAINTS": "1"}}
248
+
249
+ if finder.uploaded_prior_to:
250
+ args.extend(["--uploaded-prior-to", finder.uploaded_prior_to.isoformat()])
251
+ args.append("--")
252
+ args.extend(requirements)
253
+
254
+ identify_requirement = (
255
+ f" for {for_req.name}" if for_req and for_req.name else ""
256
+ )
257
+ with open_spinner(f"Installing {kind}") as spinner:
258
+ call_subprocess(
259
+ args,
260
+ command_desc=f"installing {kind}{identify_requirement}",
261
+ spinner=spinner,
262
+ **extra_environ,
263
+ )
264
+
265
+
266
+ class InprocessBuildEnvironmentInstaller:
267
+ """
268
+ Build dependency installer that runs in the same pip process.
269
+
270
+ This contains a stripped down version of the install command with
271
+ only the logic necessary for installing build dependencies. The
272
+ finder, session, build tracker, and wheel cache are reused, but new
273
+ instances of everything else are created as needed.
274
+
275
+ Options are inherited from the parent install command unless
276
+ they don't make sense for build dependencies (in which case, they
277
+ are hard-coded, see comments below).
278
+ """
279
+
280
+ def __init__(
281
+ self,
282
+ *,
283
+ finder: PackageFinder,
284
+ build_tracker: BuildTracker,
285
+ wheel_cache: WheelCache,
286
+ build_constraints: Sequence[InstallRequirement] = (),
287
+ verbosity: int = 0,
288
+ ) -> None:
289
+ from pip._internal.operations.prepare import RequirementPreparer
290
+
291
+ self._finder = finder
292
+ self._build_constraints = build_constraints
293
+ self._wheel_cache = wheel_cache
294
+ self._level = 0
295
+
296
+ build_dir = TempDirectory(kind="build-env-install", globally_managed=True)
297
+ self._preparer = RequirementPreparer(
298
+ build_isolation_installer=self,
299
+ # Inherited options or state.
300
+ finder=finder,
301
+ session=finder._link_collector.session,
302
+ build_dir=build_dir.path,
303
+ build_tracker=build_tracker,
304
+ verbosity=verbosity,
305
+ # This is irrelevant as it only applies to editable requirements.
306
+ src_dir="",
307
+ # Hard-coded options (that should NOT be inherited).
308
+ download_dir=None,
309
+ build_isolation=True,
310
+ check_build_deps=False,
311
+ progress_bar="off",
312
+ # TODO: hash-checking should be extended to build deps, but that is
313
+ # deferred for later as it'd be a breaking change.
314
+ require_hashes=False,
315
+ use_user_site=False,
316
+ lazy_wheel=False,
317
+ legacy_resolver=False,
318
+ )
319
+
320
+ def install(
321
+ self,
322
+ requirements: Iterable[str],
323
+ prefix: _Prefix,
324
+ *,
325
+ kind: str,
326
+ for_req: InstallRequirement | None,
327
+ ) -> None:
328
+ """Install entrypoint. Manages output capturing and error handling."""
329
+ capture_logs = not logger.isEnabledFor(VERBOSE) and self._level == 0
330
+ if capture_logs:
331
+ # Hide the logs from the installation of build dependencies.
332
+ # They will be shown only if an error occurs.
333
+ capture_ctx: ContextManager[StringIO] = capture_logging()
334
+ spinner: ContextManager[None] = open_rich_spinner(f"Installing {kind}")
335
+ else:
336
+ # Otherwise, pass-through all logs (with a header).
337
+ capture_ctx, spinner = nullcontext(StringIO()), nullcontext()
338
+ logger.info("Installing %s ...", kind)
339
+
340
+ try:
341
+ self._level += 1
342
+ with spinner, capture_ctx as stream:
343
+ self._install_impl(requirements, prefix)
344
+
345
+ except DiagnosticPipError as exc:
346
+ # Format similar to a nested subprocess error, where the
347
+ # causing error is shown first, followed by the build error.
348
+ logger.info(textwrap.dedent(stream.getvalue()))
349
+ logger.error("%s", exc, extra={"rich": True})
350
+ logger.info("")
351
+ raise BuildDependencyInstallError(
352
+ for_req, requirements, cause=exc, log_lines=None
353
+ )
354
+
355
+ except Exception as exc:
356
+ logs: list[str] | None = textwrap.dedent(stream.getvalue()).splitlines()
357
+ if not capture_logs:
358
+ # If logs aren't being captured, then display the error inline
359
+ # with the rest of the logs.
360
+ logs = None
361
+ if isinstance(exc, PipError):
362
+ logger.error("%s", exc)
363
+ else:
364
+ logger.exception("pip crashed unexpectedly")
365
+ raise BuildDependencyInstallError(
366
+ for_req, requirements, cause=exc, log_lines=logs
367
+ )
368
+
369
+ finally:
370
+ self._level -= 1
371
+
372
+ def _install_impl(self, requirements: Iterable[str], prefix: _Prefix) -> None:
373
+ """Core build dependency install logic."""
374
+ from pip._internal.commands.install import installed_packages_summary
375
+ from pip._internal.req import install_given_reqs
376
+ from pip._internal.req.constructors import install_req_from_line
377
+ from pip._internal.wheel_builder import build
378
+
379
+ ireqs = [install_req_from_line(req, user_supplied=True) for req in requirements]
380
+ ireqs.extend(self._build_constraints)
381
+
382
+ resolver = self._make_resolver()
383
+ resolved_set = resolver.resolve(ireqs, check_supported_wheels=True)
384
+ self._preparer.prepare_linked_requirements_more(
385
+ resolved_set.requirements.values()
386
+ )
387
+
388
+ reqs_to_build = [
389
+ r for r in resolved_set.requirements_to_install if not r.is_wheel
390
+ ]
391
+ _, build_failures = build(reqs_to_build, self._wheel_cache, verify=True)
392
+ if build_failures:
393
+ raise InstallWheelBuildError(build_failures)
394
+
395
+ installed = install_given_reqs(
396
+ resolver.get_installation_order(resolved_set),
397
+ prefix=prefix.path,
398
+ # Hard-coded options (that should NOT be inherited).
399
+ root=None,
400
+ home=None,
401
+ warn_script_location=False,
402
+ use_user_site=False,
403
+ # As the build environment is ephemeral, it's wasteful to
404
+ # pre-compile everything since not all modules will be used.
405
+ pycompile=False,
406
+ progress_bar="off",
407
+ )
408
+
409
+ env = get_environment(list(prefix.lib_dirs))
410
+ if summary := installed_packages_summary(installed, env):
411
+ logger.info(summary)
412
+
413
+ def _make_resolver(self) -> BaseResolver:
414
+ """Create a new resolver for one time use."""
415
+ # Legacy installer never used the legacy resolver so create a
416
+ # resolvelib resolver directly. Yuck.
417
+ from pip._internal.req.constructors import install_req_from_req_string
418
+ from pip._internal.resolution.resolvelib.resolver import Resolver
419
+
420
+ return Resolver(
421
+ make_install_req=install_req_from_req_string,
422
+ # Inherited state.
423
+ preparer=self._preparer,
424
+ finder=self._finder,
425
+ wheel_cache=self._wheel_cache,
426
+ # Hard-coded options (that should NOT be inherited).
427
+ ignore_requires_python=False,
428
+ use_user_site=False,
429
+ ignore_dependencies=False,
430
+ ignore_installed=True,
431
+ force_reinstall=False,
432
+ upgrade_strategy="to-satisfy-only",
433
+ py_version_info=None,
434
+ )
435
+
436
+
437
+ class BuildEnvironment:
438
+ """Creates and manages an isolated environment to install build deps"""
439
+
440
+ def __init__(self, installer: BuildEnvironmentInstaller) -> None:
441
+ self.installer = installer
442
+ temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
443
+
444
+ self._prefixes = OrderedDict(
445
+ (name, _Prefix(os.path.join(temp_dir.path, name)))
446
+ for name in ("normal", "overlay")
447
+ )
448
+
449
+ self._bin_dirs: list[str] = []
450
+ self._lib_dirs: list[str] = []
451
+ for prefix in reversed(list(self._prefixes.values())):
452
+ self._bin_dirs.append(prefix.bin_dir)
453
+ self._lib_dirs.extend(prefix.lib_dirs)
454
+
455
+ # Customize site to:
456
+ # - ensure .pth files are honored
457
+ # - prevent access to system site packages
458
+ system_sites = _get_system_sitepackages()
459
+
460
+ self._site_dir = os.path.join(temp_dir.path, "site")
461
+ if not os.path.exists(self._site_dir):
462
+ os.mkdir(self._site_dir)
463
+ with open(
464
+ os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
465
+ ) as fp:
466
+ fp.write(
467
+ textwrap.dedent(
468
+ """
469
+ import os, site, sys
470
+
471
+ # First, drop system-sites related paths.
472
+ original_sys_path = sys.path[:]
473
+ known_paths = set()
474
+ for path in {system_sites!r}:
475
+ site.addsitedir(path, known_paths=known_paths)
476
+ system_paths = set(
477
+ os.path.normcase(path)
478
+ for path in sys.path[len(original_sys_path):]
479
+ )
480
+ original_sys_path = [
481
+ path for path in original_sys_path
482
+ if os.path.normcase(path) not in system_paths
483
+ ]
484
+ sys.path = original_sys_path
485
+
486
+ # Second, add lib directories.
487
+ # ensuring .pth file are processed.
488
+ for path in {lib_dirs!r}:
489
+ assert not path in sys.path
490
+ site.addsitedir(path)
491
+ """
492
+ ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
493
+ )
494
+
495
+ def __enter__(self) -> None:
496
+ self._save_env = {
497
+ name: os.environ.get(name, None)
498
+ for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
499
+ }
500
+
501
+ path = self._bin_dirs[:]
502
+ old_path = self._save_env["PATH"]
503
+ if old_path:
504
+ path.extend(old_path.split(os.pathsep))
505
+
506
+ pythonpath = [self._site_dir]
507
+
508
+ os.environ.update(
509
+ {
510
+ "PATH": os.pathsep.join(path),
511
+ "PYTHONNOUSERSITE": "1",
512
+ "PYTHONPATH": os.pathsep.join(pythonpath),
513
+ }
514
+ )
515
+
516
+ def __exit__(
517
+ self,
518
+ exc_type: type[BaseException] | None,
519
+ exc_val: BaseException | None,
520
+ exc_tb: TracebackType | None,
521
+ ) -> None:
522
+ for varname, old_value in self._save_env.items():
523
+ if old_value is None:
524
+ os.environ.pop(varname, None)
525
+ else:
526
+ os.environ[varname] = old_value
527
+
528
+ def check_requirements(
529
+ self, reqs: Iterable[str]
530
+ ) -> tuple[set[tuple[str, str]], set[str]]:
531
+ """Return 2 sets:
532
+ - conflicting requirements: set of (installed, wanted) reqs tuples
533
+ - missing requirements: set of reqs
534
+ """
535
+ missing = set()
536
+ conflicting = set()
537
+ if reqs:
538
+ env = (
539
+ get_environment(self._lib_dirs)
540
+ if hasattr(self, "_lib_dirs")
541
+ else get_default_environment()
542
+ )
543
+ for req_str in reqs:
544
+ req = get_requirement(req_str)
545
+ # We're explicitly evaluating with an empty extra value, since build
546
+ # environments are not provided any mechanism to select specific extras.
547
+ if req.marker is not None and not req.marker.evaluate({"extra": ""}):
548
+ continue
549
+ dist = env.get_distribution(req.name)
550
+ if not dist:
551
+ missing.add(req_str)
552
+ continue
553
+ if isinstance(dist.version, Version):
554
+ installed_req_str = f"{req.name}=={dist.version}"
555
+ else:
556
+ installed_req_str = f"{req.name}==={dist.version}"
557
+ if not req.specifier.contains(dist.version, prereleases=True):
558
+ conflicting.add((installed_req_str, req_str))
559
+ # FIXME: Consider direct URL?
560
+ return conflicting, missing
561
+
562
+ def install_requirements(
563
+ self,
564
+ requirements: Iterable[str],
565
+ prefix_as_string: str,
566
+ *,
567
+ kind: str,
568
+ for_req: InstallRequirement | None = None,
569
+ ) -> None:
570
+ prefix = self._prefixes[prefix_as_string]
571
+ assert not prefix.setup
572
+ prefix.setup = True
573
+ if not requirements:
574
+ return
575
+ self.installer.install(requirements, prefix, kind=kind, for_req=for_req)
576
+
577
+
578
+ class NoOpBuildEnvironment(BuildEnvironment):
579
+ """A no-op drop-in replacement for BuildEnvironment"""
580
+
581
+ def __init__(self) -> None:
582
+ pass
583
+
584
+ def __enter__(self) -> None:
585
+ pass
586
+
587
+ def __exit__(
588
+ self,
589
+ exc_type: type[BaseException] | None,
590
+ exc_val: BaseException | None,
591
+ exc_tb: TracebackType | None,
592
+ ) -> None:
593
+ pass
594
+
595
+ def cleanup(self) -> None:
596
+ pass
597
+
598
+ def install_requirements(
599
+ self,
600
+ requirements: Iterable[str],
601
+ prefix_as_string: str,
602
+ *,
603
+ kind: str,
604
+ for_req: InstallRequirement | None = None,
605
+ ) -> None:
606
+ raise NotImplementedError()
.venv/Lib/site-packages/pip/_internal/cache.py ADDED
@@ -0,0 +1,291 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Cache Management"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import logging
8
+ import os
9
+ from pathlib import Path
10
+ from typing import Any
11
+
12
+ from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
13
+ from pip._vendor.packaging.utils import canonicalize_name
14
+
15
+ from pip._internal.exceptions import InvalidWheelFilename
16
+ from pip._internal.models.direct_url import DirectUrl
17
+ from pip._internal.models.link import Link
18
+ from pip._internal.models.wheel import Wheel
19
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
20
+ from pip._internal.utils.urls import path_to_url
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+ ORIGIN_JSON_NAME = "origin.json"
25
+
26
+
27
+ def _hash_dict(d: dict[str, str]) -> str:
28
+ """Return a stable sha224 of a dictionary."""
29
+ s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
30
+ return hashlib.sha224(s.encode("ascii")).hexdigest()
31
+
32
+
33
+ class Cache:
34
+ """An abstract class - provides cache directories for data from links
35
+
36
+ :param cache_dir: The root of the cache.
37
+ """
38
+
39
+ def __init__(self, cache_dir: str) -> None:
40
+ super().__init__()
41
+ assert not cache_dir or os.path.isabs(cache_dir)
42
+ self.cache_dir = cache_dir or None
43
+
44
+ def _get_cache_path_parts(self, link: Link) -> list[str]:
45
+ """Get parts of part that must be os.path.joined with cache_dir"""
46
+
47
+ # We want to generate an url to use as our cache key, we don't want to
48
+ # just reuse the URL because it might have other items in the fragment
49
+ # and we don't care about those.
50
+ key_parts = {"url": link.url_without_fragment}
51
+ if link.hash_name is not None and link.hash is not None:
52
+ key_parts[link.hash_name] = link.hash
53
+ if link.subdirectory_fragment:
54
+ key_parts["subdirectory"] = link.subdirectory_fragment
55
+
56
+ # Include interpreter name, major and minor version in cache key
57
+ # to cope with ill-behaved sdists that build a different wheel
58
+ # depending on the python version their setup.py is being run on,
59
+ # and don't encode the difference in compatibility tags.
60
+ # https://github.com/pypa/pip/issues/7296
61
+ key_parts["interpreter_name"] = interpreter_name()
62
+ key_parts["interpreter_version"] = interpreter_version()
63
+
64
+ # Encode our key url with sha224, we'll use this because it has similar
65
+ # security properties to sha256, but with a shorter total output (and
66
+ # thus less secure). However the differences don't make a lot of
67
+ # difference for our use case here.
68
+ hashed = _hash_dict(key_parts)
69
+
70
+ # We want to nest the directories some to prevent having a ton of top
71
+ # level directories where we might run out of sub directories on some
72
+ # FS.
73
+ parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
74
+
75
+ return parts
76
+
77
+ def _get_candidates(self, link: Link, canonical_package_name: str) -> list[Any]:
78
+ can_not_cache = not self.cache_dir or not canonical_package_name or not link
79
+ if can_not_cache:
80
+ return []
81
+
82
+ path = self.get_path_for_link(link)
83
+ if os.path.isdir(path):
84
+ return [(candidate, path) for candidate in os.listdir(path)]
85
+ return []
86
+
87
+ def get_path_for_link(self, link: Link) -> str:
88
+ """Return a directory to store cached items in for link."""
89
+ raise NotImplementedError()
90
+
91
+ def get(
92
+ self,
93
+ link: Link,
94
+ package_name: str | None,
95
+ supported_tags: list[Tag],
96
+ ) -> Link:
97
+ """Returns a link to a cached item if it exists, otherwise returns the
98
+ passed link.
99
+ """
100
+ raise NotImplementedError()
101
+
102
+
103
+ class SimpleWheelCache(Cache):
104
+ """A cache of wheels for future installs."""
105
+
106
+ def __init__(self, cache_dir: str) -> None:
107
+ super().__init__(cache_dir)
108
+
109
+ def get_path_for_link(self, link: Link) -> str:
110
+ """Return a directory to store cached wheels for link
111
+
112
+ Because there are M wheels for any one sdist, we provide a directory
113
+ to cache them in, and then consult that directory when looking up
114
+ cache hits.
115
+
116
+ We only insert things into the cache if they have plausible version
117
+ numbers, so that we don't contaminate the cache with things that were
118
+ not unique. E.g. ./package might have dozens of installs done for it
119
+ and build a version of 0.0...and if we built and cached a wheel, we'd
120
+ end up using the same wheel even if the source has been edited.
121
+
122
+ :param link: The link of the sdist for which this will cache wheels.
123
+ """
124
+ parts = self._get_cache_path_parts(link)
125
+ assert self.cache_dir
126
+ # Store wheels within the root cache_dir
127
+ return os.path.join(self.cache_dir, "wheels", *parts)
128
+
129
+ def get(
130
+ self,
131
+ link: Link,
132
+ package_name: str | None,
133
+ supported_tags: list[Tag],
134
+ ) -> Link:
135
+ candidates = []
136
+
137
+ if not package_name:
138
+ return link
139
+
140
+ canonical_package_name = canonicalize_name(package_name)
141
+ for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
142
+ try:
143
+ wheel = Wheel(wheel_name)
144
+ except InvalidWheelFilename:
145
+ continue
146
+ if wheel.name != canonical_package_name:
147
+ logger.debug(
148
+ "Ignoring cached wheel %s for %s as it "
149
+ "does not match the expected distribution name %s.",
150
+ wheel_name,
151
+ link,
152
+ package_name,
153
+ )
154
+ continue
155
+ if not wheel.supported(supported_tags):
156
+ # Built for a different python/arch/etc
157
+ continue
158
+ candidates.append(
159
+ (
160
+ wheel.support_index_min(supported_tags),
161
+ wheel_name,
162
+ wheel_dir,
163
+ )
164
+ )
165
+
166
+ if not candidates:
167
+ return link
168
+
169
+ _, wheel_name, wheel_dir = min(candidates)
170
+ return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
171
+
172
+
173
+ class EphemWheelCache(SimpleWheelCache):
174
+ """A SimpleWheelCache that creates it's own temporary cache directory"""
175
+
176
+ def __init__(self) -> None:
177
+ self._temp_dir = TempDirectory(
178
+ kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
179
+ globally_managed=True,
180
+ )
181
+
182
+ super().__init__(self._temp_dir.path)
183
+
184
+
185
+ class CacheEntry:
186
+ def __init__(
187
+ self,
188
+ link: Link,
189
+ persistent: bool,
190
+ ):
191
+ self.link = link
192
+ self.persistent = persistent
193
+ self.origin: DirectUrl | None = None
194
+ origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
195
+ if origin_direct_url_path.exists():
196
+ try:
197
+ self.origin = DirectUrl.from_json(
198
+ origin_direct_url_path.read_text(encoding="utf-8")
199
+ )
200
+ except Exception as e:
201
+ logger.warning(
202
+ "Ignoring invalid cache entry origin file %s for %s (%s)",
203
+ origin_direct_url_path,
204
+ link.filename,
205
+ e,
206
+ )
207
+
208
+
209
+ class WheelCache(Cache):
210
+ """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
211
+
212
+ This Cache allows for gracefully degradation, using the ephem wheel cache
213
+ when a certain link is not found in the simple wheel cache first.
214
+ """
215
+
216
+ def __init__(self, cache_dir: str) -> None:
217
+ super().__init__(cache_dir)
218
+ self._wheel_cache = SimpleWheelCache(cache_dir)
219
+ self._ephem_cache = EphemWheelCache()
220
+
221
+ def get_path_for_link(self, link: Link) -> str:
222
+ return self._wheel_cache.get_path_for_link(link)
223
+
224
+ def get_ephem_path_for_link(self, link: Link) -> str:
225
+ return self._ephem_cache.get_path_for_link(link)
226
+
227
+ def get(
228
+ self,
229
+ link: Link,
230
+ package_name: str | None,
231
+ supported_tags: list[Tag],
232
+ ) -> Link:
233
+ cache_entry = self.get_cache_entry(link, package_name, supported_tags)
234
+ if cache_entry is None:
235
+ return link
236
+ return cache_entry.link
237
+
238
+ def get_cache_entry(
239
+ self,
240
+ link: Link,
241
+ package_name: str | None,
242
+ supported_tags: list[Tag],
243
+ ) -> CacheEntry | None:
244
+ """Returns a CacheEntry with a link to a cached item if it exists or
245
+ None. The cache entry indicates if the item was found in the persistent
246
+ or ephemeral cache.
247
+ """
248
+ retval = self._wheel_cache.get(
249
+ link=link,
250
+ package_name=package_name,
251
+ supported_tags=supported_tags,
252
+ )
253
+ if retval is not link:
254
+ return CacheEntry(retval, persistent=True)
255
+
256
+ retval = self._ephem_cache.get(
257
+ link=link,
258
+ package_name=package_name,
259
+ supported_tags=supported_tags,
260
+ )
261
+ if retval is not link:
262
+ return CacheEntry(retval, persistent=False)
263
+
264
+ return None
265
+
266
+ @staticmethod
267
+ def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
268
+ origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
269
+ if origin_path.exists():
270
+ try:
271
+ origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
272
+ except Exception as e:
273
+ logger.warning(
274
+ "Could not read origin file %s in cache entry (%s). "
275
+ "Will attempt to overwrite it.",
276
+ origin_path,
277
+ e,
278
+ )
279
+ else:
280
+ # TODO: use DirectUrl.equivalent when
281
+ # https://github.com/pypa/pip/pull/10564 is merged.
282
+ if origin.url != download_info.url:
283
+ logger.warning(
284
+ "Origin URL %s in cache entry %s does not match download URL "
285
+ "%s. This is likely a pip bug or a cache corruption issue. "
286
+ "Will overwrite it with the new value.",
287
+ origin.url,
288
+ cache_dir,
289
+ download_info.url,
290
+ )
291
+ origin_path.write_text(download_info.to_json(), encoding="utf-8")
.venv/Lib/site-packages/pip/_internal/cli/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ """Subpackage containing all of pip's command line interface related code"""
2
+
3
+ # This file intentionally does not import submodules
.venv/Lib/site-packages/pip/_internal/cli/autocompletion.py ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Logic that powers autocompletion installed by ``pip completion``."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import optparse
6
+ import os
7
+ import sys
8
+ from collections.abc import Iterable
9
+ from itertools import chain
10
+ from typing import Any
11
+
12
+ from pip._internal.cli.main_parser import create_main_parser
13
+ from pip._internal.commands import commands_dict, create_command
14
+ from pip._internal.metadata import get_default_environment
15
+
16
+
17
+ def autocomplete() -> None:
18
+ """Entry Point for completion of main and subcommand options."""
19
+ # Don't complete if user hasn't sourced bash_completion file.
20
+ if "PIP_AUTO_COMPLETE" not in os.environ:
21
+ return
22
+ # Don't complete if autocompletion environment variables
23
+ # are not present
24
+ if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"):
25
+ return
26
+ cwords = os.environ["COMP_WORDS"].split()[1:]
27
+ cword = int(os.environ["COMP_CWORD"])
28
+ try:
29
+ current = cwords[cword - 1]
30
+ except IndexError:
31
+ current = ""
32
+
33
+ parser = create_main_parser()
34
+ subcommands = list(commands_dict)
35
+ options = []
36
+
37
+ # subcommand
38
+ subcommand_name: str | None = None
39
+ for word in cwords:
40
+ if word in subcommands:
41
+ subcommand_name = word
42
+ break
43
+ # subcommand options
44
+ if subcommand_name is not None:
45
+ # special case: 'help' subcommand has no options
46
+ if subcommand_name == "help":
47
+ sys.exit(1)
48
+ # special case: list locally installed dists for show and uninstall
49
+ should_list_installed = not current.startswith("-") and subcommand_name in [
50
+ "show",
51
+ "uninstall",
52
+ ]
53
+ if should_list_installed:
54
+ env = get_default_environment()
55
+ lc = current.lower()
56
+ installed = [
57
+ dist.canonical_name
58
+ for dist in env.iter_installed_distributions(local_only=True)
59
+ if dist.canonical_name.startswith(lc)
60
+ and dist.canonical_name not in cwords[1:]
61
+ ]
62
+ # if there are no dists installed, fall back to option completion
63
+ if installed:
64
+ for dist in installed:
65
+ print(dist)
66
+ sys.exit(1)
67
+
68
+ should_list_installables = (
69
+ not current.startswith("-") and subcommand_name == "install"
70
+ )
71
+ if should_list_installables:
72
+ for path in auto_complete_paths(current, "path"):
73
+ print(path)
74
+ sys.exit(1)
75
+
76
+ subcommand = create_command(subcommand_name)
77
+
78
+ for opt in subcommand.parser.option_list_all:
79
+ if opt.help != optparse.SUPPRESS_HELP:
80
+ options += [
81
+ (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts
82
+ ]
83
+
84
+ # filter out previously specified options from available options
85
+ prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
86
+ options = [(x, v) for (x, v) in options if x not in prev_opts]
87
+ # filter options by current input
88
+ options = [(k, v) for k, v in options if k.startswith(current)]
89
+ # get completion type given cwords and available subcommand options
90
+ completion_type = get_path_completion_type(
91
+ cwords,
92
+ cword,
93
+ subcommand.parser.option_list_all,
94
+ )
95
+ # get completion files and directories if ``completion_type`` is
96
+ # ``<file>``, ``<dir>`` or ``<path>``
97
+ if completion_type:
98
+ paths = auto_complete_paths(current, completion_type)
99
+ options = [(path, 0) for path in paths]
100
+ for option in options:
101
+ opt_label = option[0]
102
+ # append '=' to options which require args
103
+ if option[1] and option[0][:2] == "--":
104
+ opt_label += "="
105
+ print(opt_label)
106
+
107
+ # Complete sub-commands (unless one is already given).
108
+ if not any(name in cwords for name in subcommand.handler_map()):
109
+ for handler_name in subcommand.handler_map():
110
+ if handler_name.startswith(current):
111
+ print(handler_name)
112
+ else:
113
+ # show main parser options only when necessary
114
+
115
+ opts = [i.option_list for i in parser.option_groups]
116
+ opts.append(parser.option_list)
117
+ flattened_opts = chain.from_iterable(opts)
118
+ if current.startswith("-"):
119
+ for opt in flattened_opts:
120
+ if opt.help != optparse.SUPPRESS_HELP:
121
+ subcommands += opt._long_opts + opt._short_opts
122
+ else:
123
+ # get completion type given cwords and all available options
124
+ completion_type = get_path_completion_type(cwords, cword, flattened_opts)
125
+ if completion_type:
126
+ subcommands = list(auto_complete_paths(current, completion_type))
127
+
128
+ print(" ".join([x for x in subcommands if x.startswith(current)]))
129
+ sys.exit(1)
130
+
131
+
132
+ def get_path_completion_type(
133
+ cwords: list[str], cword: int, opts: Iterable[Any]
134
+ ) -> str | None:
135
+ """Get the type of path completion (``file``, ``dir``, ``path`` or None)
136
+
137
+ :param cwords: same as the environmental variable ``COMP_WORDS``
138
+ :param cword: same as the environmental variable ``COMP_CWORD``
139
+ :param opts: The available options to check
140
+ :return: path completion type (``file``, ``dir``, ``path`` or None)
141
+ """
142
+ if cword < 2 or not cwords[cword - 2].startswith("-"):
143
+ return None
144
+ for opt in opts:
145
+ if opt.help == optparse.SUPPRESS_HELP:
146
+ continue
147
+ for o in str(opt).split("/"):
148
+ if cwords[cword - 2].split("=")[0] == o:
149
+ if not opt.metavar or any(
150
+ x in ("path", "file", "dir") for x in opt.metavar.split("/")
151
+ ):
152
+ return opt.metavar
153
+ return None
154
+
155
+
156
+ def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]:
157
+ """If ``completion_type`` is ``file`` or ``path``, list all regular files
158
+ and directories starting with ``current``; otherwise only list directories
159
+ starting with ``current``.
160
+
161
+ :param current: The word to be completed
162
+ :param completion_type: path completion type(``file``, ``path`` or ``dir``)
163
+ :return: A generator of regular files and/or directories
164
+ """
165
+ directory, filename = os.path.split(current)
166
+ current_path = os.path.abspath(directory)
167
+ # Don't complete paths if they can't be accessed
168
+ if not os.access(current_path, os.R_OK):
169
+ return
170
+ filename = os.path.normcase(filename)
171
+ # list all files that start with ``filename``
172
+ file_list = (
173
+ x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
174
+ )
175
+ for f in file_list:
176
+ opt = os.path.join(current_path, f)
177
+ comp_file = os.path.normcase(os.path.join(directory, f))
178
+ # complete regular files when there is not ``<dir>`` after option
179
+ # complete directories when there is ``<file>``, ``<path>`` or
180
+ # ``<dir>``after option
181
+ if completion_type != "dir" and os.path.isfile(opt):
182
+ yield comp_file
183
+ elif os.path.isdir(opt):
184
+ yield os.path.join(comp_file, "")
.venv/Lib/site-packages/pip/_internal/cli/base_command.py ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base Command class, and related routines"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import logging.config
7
+ import optparse
8
+ import os
9
+ import sys
10
+ import traceback
11
+ from optparse import Values
12
+ from typing import Callable
13
+
14
+ from pip._vendor.rich import reconfigure
15
+ from pip._vendor.rich import traceback as rich_traceback
16
+
17
+ from pip._internal.cli import cmdoptions
18
+ from pip._internal.cli.command_context import CommandContextMixIn
19
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
20
+ from pip._internal.cli.status_codes import (
21
+ ERROR,
22
+ PREVIOUS_BUILD_DIR_ERROR,
23
+ UNKNOWN_ERROR,
24
+ VIRTUALENV_NOT_FOUND,
25
+ )
26
+ from pip._internal.exceptions import (
27
+ BadCommand,
28
+ CommandError,
29
+ DiagnosticPipError,
30
+ InstallationError,
31
+ NetworkConnectionError,
32
+ PreviousBuildDirError,
33
+ )
34
+ from pip._internal.utils.filesystem import check_path_owner
35
+ from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
36
+ from pip._internal.utils.misc import get_prog, normalize_path
37
+ from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry
38
+ from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
39
+ from pip._internal.utils.virtualenv import running_under_virtualenv
40
+
41
+ __all__ = ["Command"]
42
+
43
+ logger = logging.getLogger(__name__)
44
+
45
+
46
+ class Command(CommandContextMixIn):
47
+ usage: str = ""
48
+ ignore_require_venv: bool = False
49
+
50
+ def __init__(self, name: str, summary: str, isolated: bool = False) -> None:
51
+ super().__init__()
52
+
53
+ self.name = name
54
+ self.summary = summary
55
+ self.parser = ConfigOptionParser(
56
+ usage=self.usage,
57
+ prog=f"{get_prog()} {name}",
58
+ formatter=UpdatingDefaultsHelpFormatter(),
59
+ add_help_option=False,
60
+ name=name,
61
+ description=self.__doc__,
62
+ isolated=isolated,
63
+ )
64
+
65
+ self.tempdir_registry: TempDirRegistry | None = None
66
+
67
+ # Commands should add options to this option group
68
+ optgroup_name = f"{self.name.capitalize()} Options"
69
+ self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
70
+
71
+ # Add the general options
72
+ gen_opts = cmdoptions.make_option_group(
73
+ cmdoptions.general_group,
74
+ self.parser,
75
+ )
76
+ self.parser.add_option_group(gen_opts)
77
+
78
+ self.add_options()
79
+
80
+ def add_options(self) -> None:
81
+ pass
82
+
83
+ def handle_pip_version_check(self, options: Values) -> None:
84
+ """
85
+ This is a no-op so that commands by default do not do the pip version
86
+ check.
87
+ """
88
+ # Make sure we do the pip version check if the index_group options
89
+ # are present.
90
+ assert not hasattr(options, "no_index")
91
+
92
+ def run(self, options: Values, args: list[str]) -> int:
93
+ raise NotImplementedError
94
+
95
+ def _run_wrapper(self, level_number: int, options: Values, args: list[str]) -> int:
96
+ def _inner_run() -> int:
97
+ try:
98
+ return self.run(options, args)
99
+ finally:
100
+ self.handle_pip_version_check(options)
101
+
102
+ if options.debug_mode:
103
+ rich_traceback.install(show_locals=True)
104
+ return _inner_run()
105
+
106
+ try:
107
+ status = _inner_run()
108
+ assert isinstance(status, int)
109
+ return status
110
+ except DiagnosticPipError as exc:
111
+ logger.error("%s", exc, extra={"rich": True})
112
+ logger.debug("Exception information:", exc_info=True)
113
+
114
+ return ERROR
115
+ except PreviousBuildDirError as exc:
116
+ logger.critical(str(exc))
117
+ logger.debug("Exception information:", exc_info=True)
118
+
119
+ return PREVIOUS_BUILD_DIR_ERROR
120
+ except (
121
+ InstallationError,
122
+ BadCommand,
123
+ NetworkConnectionError,
124
+ ) as exc:
125
+ logger.critical(str(exc))
126
+ logger.debug("Exception information:", exc_info=True)
127
+
128
+ return ERROR
129
+ except CommandError as exc:
130
+ logger.critical("%s", exc)
131
+ logger.debug("Exception information:", exc_info=True)
132
+
133
+ return ERROR
134
+ except BrokenStdoutLoggingError:
135
+ # Bypass our logger and write any remaining messages to
136
+ # stderr because stdout no longer works.
137
+ print("ERROR: Pipe to stdout was broken", file=sys.stderr)
138
+ if level_number <= logging.DEBUG:
139
+ traceback.print_exc(file=sys.stderr)
140
+
141
+ return ERROR
142
+ except KeyboardInterrupt:
143
+ logger.critical("Operation cancelled by user")
144
+ logger.debug("Exception information:", exc_info=True)
145
+
146
+ return ERROR
147
+ except BaseException:
148
+ logger.critical("Exception:", exc_info=True)
149
+
150
+ return UNKNOWN_ERROR
151
+
152
+ def parse_args(self, args: list[str]) -> tuple[Values, list[str]]:
153
+ # factored out for testability
154
+ return self.parser.parse_args(args)
155
+
156
+ def main(self, args: list[str]) -> int:
157
+ try:
158
+ with self.main_context():
159
+ return self._main(args)
160
+ finally:
161
+ logging.shutdown()
162
+
163
+ def _main(self, args: list[str]) -> int:
164
+ # We must initialize this before the tempdir manager, otherwise the
165
+ # configuration would not be accessible by the time we clean up the
166
+ # tempdir manager.
167
+ self.tempdir_registry = self.enter_context(tempdir_registry())
168
+ # Intentionally set as early as possible so globally-managed temporary
169
+ # directories are available to the rest of the code.
170
+ self.enter_context(global_tempdir_manager())
171
+
172
+ options, args = self.parse_args(args)
173
+
174
+ # Set verbosity so that it can be used elsewhere.
175
+ self.verbosity = options.verbose - options.quiet
176
+ if options.debug_mode:
177
+ self.verbosity = 2
178
+
179
+ if hasattr(options, "progress_bar") and options.progress_bar == "auto":
180
+ options.progress_bar = "on" if self.verbosity >= 0 else "off"
181
+
182
+ reconfigure(no_color=options.no_color)
183
+ level_number = setup_logging(
184
+ verbosity=self.verbosity,
185
+ no_color=options.no_color,
186
+ user_log_file=options.log,
187
+ )
188
+
189
+ always_enabled_features = set(options.features_enabled) & set(
190
+ cmdoptions.ALWAYS_ENABLED_FEATURES
191
+ )
192
+ if always_enabled_features:
193
+ logger.warning(
194
+ "The following features are always enabled: %s. ",
195
+ ", ".join(sorted(always_enabled_features)),
196
+ )
197
+
198
+ # Make sure that the --python argument isn't specified after the
199
+ # subcommand. We can tell, because if --python was specified,
200
+ # we should only reach this point if we're running in the created
201
+ # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment
202
+ # variable set.
203
+ if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
204
+ logger.critical(
205
+ "The --python option must be placed before the pip subcommand name"
206
+ )
207
+ sys.exit(ERROR)
208
+
209
+ # TODO: Try to get these passing down from the command?
210
+ # without resorting to os.environ to hold these.
211
+ # This also affects isolated builds and it should.
212
+
213
+ if options.no_input:
214
+ os.environ["PIP_NO_INPUT"] = "1"
215
+
216
+ if options.exists_action:
217
+ os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action)
218
+
219
+ if options.require_venv and not self.ignore_require_venv:
220
+ # If a venv is required check if it can really be found
221
+ if not running_under_virtualenv():
222
+ logger.critical("Could not find an activated virtualenv (required).")
223
+ sys.exit(VIRTUALENV_NOT_FOUND)
224
+
225
+ if options.cache_dir:
226
+ options.cache_dir = normalize_path(options.cache_dir)
227
+ if not check_path_owner(options.cache_dir):
228
+ logger.warning(
229
+ "The directory '%s' or its parent directory is not owned "
230
+ "or is not writable by the current user. The cache "
231
+ "has been disabled. Check the permissions and owner of "
232
+ "that directory. If executing pip with sudo, you should "
233
+ "use sudo's -H flag.",
234
+ options.cache_dir,
235
+ )
236
+ options.cache_dir = None
237
+
238
+ if (
239
+ "inprocess-build-deps" in options.features_enabled
240
+ and os.environ.get("PIP_CONSTRAINT", "")
241
+ and "build-constraint" not in options.features_enabled
242
+ ):
243
+ logger.warning(
244
+ "In-process build dependencies are enabled, "
245
+ "PIP_CONSTRAINT will have no effect for build dependencies"
246
+ )
247
+ options.features_enabled.append("build-constraint")
248
+
249
+ return self._run_wrapper(level_number, options, args)
250
+
251
+ def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:
252
+ """
253
+ map of names to handler actions for commands with sub-actions
254
+ """
255
+ return {}
.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py ADDED
@@ -0,0 +1,1267 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ shared options and groups
3
+
4
+ The principle here is to define options once, but *not* instantiate them
5
+ globally. One reason being that options with action='append' can carry state
6
+ between parses. pip parses general options twice internally, and shouldn't
7
+ pass on state. To be consistent, all options will follow this design.
8
+ """
9
+
10
+ # The following comment should be removed at some point in the future.
11
+ # mypy: strict-optional=False
12
+ from __future__ import annotations
13
+
14
+ import logging
15
+ import os
16
+ import pathlib
17
+ import textwrap
18
+ from functools import partial
19
+ from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values
20
+ from textwrap import dedent
21
+ from typing import Any, Callable
22
+
23
+ from pip._vendor.packaging.utils import canonicalize_name
24
+
25
+ from pip._internal.cli.parser import ConfigOptionParser
26
+ from pip._internal.exceptions import CommandError
27
+ from pip._internal.locations import USER_CACHE_DIR, get_src_prefix
28
+ from pip._internal.models.format_control import FormatControl
29
+ from pip._internal.models.index import PyPI
30
+ from pip._internal.models.release_control import ReleaseControl
31
+ from pip._internal.models.target_python import TargetPython
32
+ from pip._internal.utils.datetime import parse_iso_datetime
33
+ from pip._internal.utils.hashes import STRONG_HASHES
34
+ from pip._internal.utils.misc import strtobool
35
+
36
+ logger = logging.getLogger(__name__)
37
+
38
+
39
+ def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None:
40
+ """
41
+ Raise an option parsing error using parser.error().
42
+
43
+ Args:
44
+ parser: an OptionParser instance.
45
+ option: an Option instance.
46
+ msg: the error text.
47
+ """
48
+ msg = f"{option} error: {msg}"
49
+ msg = textwrap.fill(" ".join(msg.split()))
50
+ parser.error(msg)
51
+
52
+
53
+ def make_option_group(group: dict[str, Any], parser: ConfigOptionParser) -> OptionGroup:
54
+ """
55
+ Return an OptionGroup object
56
+ group -- assumed to be dict with 'name' and 'options' keys
57
+ parser -- an optparse Parser
58
+ """
59
+ option_group = OptionGroup(parser, group["name"])
60
+ for option in group["options"]:
61
+ option_group.add_option(option())
62
+ return option_group
63
+
64
+
65
+ def check_dist_restriction(options: Values, check_target: bool = False) -> None:
66
+ """Function for determining if custom platform options are allowed.
67
+
68
+ :param options: The OptionParser options.
69
+ :param check_target: Whether or not to check if --target is being used.
70
+ """
71
+ dist_restriction_set = any(
72
+ [
73
+ options.python_version,
74
+ options.platforms,
75
+ options.abis,
76
+ options.implementation,
77
+ ]
78
+ )
79
+
80
+ binary_only = FormatControl(set(), {":all:"})
81
+ sdist_dependencies_allowed = (
82
+ options.format_control != binary_only and not options.ignore_dependencies
83
+ )
84
+
85
+ # Installations or downloads using dist restrictions must not combine
86
+ # source distributions and dist-specific wheels, as they are not
87
+ # guaranteed to be locally compatible.
88
+ if dist_restriction_set and sdist_dependencies_allowed:
89
+ raise CommandError(
90
+ "When restricting platform and interpreter constraints using "
91
+ "--python-version, --platform, --abi, or --implementation, "
92
+ "either --no-deps must be set, or --only-binary=:all: must be "
93
+ "set and --no-binary must not be set (or must be set to "
94
+ ":none:)."
95
+ )
96
+
97
+ if check_target:
98
+ if not options.dry_run and dist_restriction_set and not options.target_dir:
99
+ raise CommandError(
100
+ "Can not use any platform or abi specific options unless "
101
+ "installing via '--target' or using '--dry-run'"
102
+ )
103
+
104
+
105
+ def check_build_constraints(options: Values) -> None:
106
+ """Function for validating build constraints options.
107
+
108
+ :param options: The OptionParser options.
109
+ """
110
+ if hasattr(options, "build_constraints") and options.build_constraints:
111
+ if not options.build_isolation:
112
+ raise CommandError(
113
+ "--build-constraint cannot be used with --no-build-isolation."
114
+ )
115
+
116
+ # Import here to avoid circular imports
117
+ from pip._internal.network.session import PipSession
118
+ from pip._internal.req.req_file import get_file_content
119
+
120
+ # Eagerly check build constraints file contents
121
+ # is valid so that we don't fail in when trying
122
+ # to check constraints in isolated build process
123
+ with PipSession() as session:
124
+ for constraint_file in options.build_constraints:
125
+ get_file_content(constraint_file, session)
126
+
127
+
128
+ def _path_option_check(option: Option, opt: str, value: str) -> str:
129
+ return os.path.expanduser(value)
130
+
131
+
132
+ def _package_name_option_check(option: Option, opt: str, value: str) -> str:
133
+ return canonicalize_name(value)
134
+
135
+
136
+ class PipOption(Option):
137
+ TYPES = Option.TYPES + ("path", "package_name")
138
+ TYPE_CHECKER = Option.TYPE_CHECKER.copy()
139
+ TYPE_CHECKER["package_name"] = _package_name_option_check
140
+ TYPE_CHECKER["path"] = _path_option_check
141
+
142
+
143
+ ###########
144
+ # options #
145
+ ###########
146
+
147
+ help_: Callable[..., Option] = partial(
148
+ Option,
149
+ "-h",
150
+ "--help",
151
+ dest="help",
152
+ action="help",
153
+ help="Show help.",
154
+ )
155
+
156
+ debug_mode: Callable[..., Option] = partial(
157
+ Option,
158
+ "--debug",
159
+ dest="debug_mode",
160
+ action="store_true",
161
+ default=False,
162
+ help=(
163
+ "Let unhandled exceptions propagate outside the main subroutine, "
164
+ "instead of logging them to stderr."
165
+ ),
166
+ )
167
+
168
+ isolated_mode: Callable[..., Option] = partial(
169
+ Option,
170
+ "--isolated",
171
+ dest="isolated_mode",
172
+ action="store_true",
173
+ default=False,
174
+ help=(
175
+ "Run pip in an isolated mode, ignoring environment variables and user "
176
+ "configuration."
177
+ ),
178
+ )
179
+
180
+ require_virtualenv: Callable[..., Option] = partial(
181
+ Option,
182
+ "--require-virtualenv",
183
+ "--require-venv",
184
+ dest="require_venv",
185
+ action="store_true",
186
+ default=False,
187
+ help=(
188
+ "Allow pip to only run in a virtual environment; exit with an error otherwise."
189
+ ),
190
+ )
191
+
192
+ override_externally_managed: Callable[..., Option] = partial(
193
+ Option,
194
+ "--break-system-packages",
195
+ dest="override_externally_managed",
196
+ action="store_true",
197
+ help="Allow pip to modify an EXTERNALLY-MANAGED Python installation",
198
+ )
199
+
200
+ python: Callable[..., Option] = partial(
201
+ Option,
202
+ "--python",
203
+ dest="python",
204
+ help="Run pip with the specified Python interpreter.",
205
+ )
206
+
207
+ verbose: Callable[..., Option] = partial(
208
+ Option,
209
+ "-v",
210
+ "--verbose",
211
+ dest="verbose",
212
+ action="count",
213
+ default=0,
214
+ help="Give more output. Option is additive, and can be used up to 3 times.",
215
+ )
216
+
217
+ no_color: Callable[..., Option] = partial(
218
+ Option,
219
+ "--no-color",
220
+ dest="no_color",
221
+ action="store_true",
222
+ default=False,
223
+ help="Suppress colored output.",
224
+ )
225
+
226
+ version: Callable[..., Option] = partial(
227
+ Option,
228
+ "-V",
229
+ "--version",
230
+ dest="version",
231
+ action="store_true",
232
+ help="Show version and exit.",
233
+ )
234
+
235
+ quiet: Callable[..., Option] = partial(
236
+ Option,
237
+ "-q",
238
+ "--quiet",
239
+ dest="quiet",
240
+ action="count",
241
+ default=0,
242
+ help=(
243
+ "Give less output. Option is additive, and can be used up to 3"
244
+ " times (corresponding to WARNING, ERROR, and CRITICAL logging"
245
+ " levels)."
246
+ ),
247
+ )
248
+
249
+ progress_bar: Callable[..., Option] = partial(
250
+ Option,
251
+ "--progress-bar",
252
+ dest="progress_bar",
253
+ type="choice",
254
+ choices=["auto", "on", "off", "raw"],
255
+ default="auto",
256
+ help=(
257
+ "Specify whether the progress bar should be used. In 'auto'"
258
+ " mode, --quiet will suppress all progress bars."
259
+ " [auto, on, off, raw] (default: auto)"
260
+ ),
261
+ )
262
+
263
+ log: Callable[..., Option] = partial(
264
+ PipOption,
265
+ "--log",
266
+ "--log-file",
267
+ "--local-log",
268
+ dest="log",
269
+ metavar="path",
270
+ type="path",
271
+ help="Path to a verbose appending log.",
272
+ )
273
+
274
+ no_input: Callable[..., Option] = partial(
275
+ Option,
276
+ # Don't ask for input
277
+ "--no-input",
278
+ dest="no_input",
279
+ action="store_true",
280
+ default=False,
281
+ help="Disable prompting for input.",
282
+ )
283
+
284
+ keyring_provider: Callable[..., Option] = partial(
285
+ Option,
286
+ "--keyring-provider",
287
+ dest="keyring_provider",
288
+ choices=["auto", "disabled", "import", "subprocess"],
289
+ default="auto",
290
+ help=(
291
+ "Enable the credential lookup via the keyring library if user input is allowed."
292
+ " Specify which mechanism to use [auto, disabled, import, subprocess]."
293
+ " (default: %default)"
294
+ ),
295
+ )
296
+
297
+ proxy: Callable[..., Option] = partial(
298
+ Option,
299
+ "--proxy",
300
+ dest="proxy",
301
+ type="str",
302
+ default="",
303
+ help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.",
304
+ )
305
+
306
+ retries: Callable[..., Option] = partial(
307
+ Option,
308
+ "--retries",
309
+ dest="retries",
310
+ type="int",
311
+ default=5,
312
+ help="Maximum attempts to establish a new HTTP connection. (default: %default)",
313
+ )
314
+
315
+ resume_retries: Callable[..., Option] = partial(
316
+ Option,
317
+ "--resume-retries",
318
+ dest="resume_retries",
319
+ type="int",
320
+ default=5,
321
+ help="Maximum attempts to resume or restart an incomplete download. "
322
+ "(default: %default)",
323
+ )
324
+
325
+ timeout: Callable[..., Option] = partial(
326
+ Option,
327
+ "--timeout",
328
+ "--default-timeout",
329
+ metavar="sec",
330
+ dest="timeout",
331
+ type="float",
332
+ default=15,
333
+ help="Set the socket timeout (default %default seconds).",
334
+ )
335
+
336
+
337
+ def exists_action() -> Option:
338
+ return Option(
339
+ # Option when path already exist
340
+ "--exists-action",
341
+ dest="exists_action",
342
+ type="choice",
343
+ choices=["s", "i", "w", "b", "a"],
344
+ default=[],
345
+ action="append",
346
+ metavar="action",
347
+ help="Default action when a path already exists: "
348
+ "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.",
349
+ )
350
+
351
+
352
+ cert: Callable[..., Option] = partial(
353
+ PipOption,
354
+ "--cert",
355
+ dest="cert",
356
+ type="path",
357
+ metavar="path",
358
+ help=(
359
+ "Path to PEM-encoded CA certificate bundle. "
360
+ "If provided, overrides the default. "
361
+ "See 'SSL Certificate Verification' in pip documentation "
362
+ "for more information."
363
+ ),
364
+ )
365
+
366
+ client_cert: Callable[..., Option] = partial(
367
+ PipOption,
368
+ "--client-cert",
369
+ dest="client_cert",
370
+ type="path",
371
+ default=None,
372
+ metavar="path",
373
+ help="Path to SSL client certificate, a single file containing the "
374
+ "private key and the certificate in PEM format.",
375
+ )
376
+
377
+ index_url: Callable[..., Option] = partial(
378
+ Option,
379
+ "-i",
380
+ "--index-url",
381
+ "--pypi-url",
382
+ dest="index_url",
383
+ metavar="URL",
384
+ default=PyPI.simple_url,
385
+ help="Base URL of the Python Package Index (default %default). "
386
+ "This should point to a repository compliant with PEP 503 "
387
+ "(the simple repository API) or a local directory laid out "
388
+ "in the same format.",
389
+ )
390
+
391
+
392
+ def extra_index_url() -> Option:
393
+ return Option(
394
+ "--extra-index-url",
395
+ dest="extra_index_urls",
396
+ metavar="URL",
397
+ action="append",
398
+ default=[],
399
+ help="Extra URLs of package indexes to use in addition to "
400
+ "--index-url. Should follow the same rules as "
401
+ "--index-url.",
402
+ )
403
+
404
+
405
+ no_index: Callable[..., Option] = partial(
406
+ Option,
407
+ "--no-index",
408
+ dest="no_index",
409
+ action="store_true",
410
+ default=False,
411
+ help="Ignore package index (only looking at --find-links URLs instead).",
412
+ )
413
+
414
+
415
+ def find_links() -> Option:
416
+ return Option(
417
+ "-f",
418
+ "--find-links",
419
+ dest="find_links",
420
+ action="append",
421
+ default=[],
422
+ metavar="url",
423
+ help="If a URL or path to an html file, then parse for links to "
424
+ "archives such as sdist (.tar.gz) or wheel (.whl) files. "
425
+ "If a local path or file:// URL that's a directory, "
426
+ "then look for archives in the directory listing. "
427
+ "Links to VCS project URLs are not supported.",
428
+ )
429
+
430
+
431
+ def _handle_uploaded_prior_to(
432
+ option: Option, opt: str, value: str, parser: OptionParser
433
+ ) -> None:
434
+ """
435
+ This is an optparse.Option callback for the --uploaded-prior-to option.
436
+
437
+ Parses an ISO 8601 datetime string. If no timezone is specified in the string,
438
+ local timezone is used.
439
+
440
+ Note: This option only works with indexes that provide upload-time metadata
441
+ as specified in the simple repository API:
442
+ https://packaging.python.org/en/latest/specifications/simple-repository-api/
443
+ """
444
+ if value is None:
445
+ return None
446
+
447
+ try:
448
+ uploaded_prior_to = parse_iso_datetime(value)
449
+ # Use local timezone if no offset is given in the ISO string.
450
+ if uploaded_prior_to.tzinfo is None:
451
+ uploaded_prior_to = uploaded_prior_to.astimezone()
452
+ parser.values.uploaded_prior_to = uploaded_prior_to
453
+ except ValueError as exc:
454
+ msg = (
455
+ f"invalid value: {value!r}: {exc}. "
456
+ f"Expected an ISO 8601 datetime string, "
457
+ f"e.g '2023-01-01' or '2023-01-01T00:00:00Z'"
458
+ )
459
+ raise_option_error(parser, option=option, msg=msg)
460
+
461
+
462
+ def uploaded_prior_to() -> Option:
463
+ return Option(
464
+ "--uploaded-prior-to",
465
+ dest="uploaded_prior_to",
466
+ metavar="datetime",
467
+ action="callback",
468
+ callback=_handle_uploaded_prior_to,
469
+ type="str",
470
+ help=(
471
+ "Only consider packages uploaded prior to the given date time. "
472
+ "Accepts ISO 8601 strings (e.g., '2023-01-01T00:00:00Z'). "
473
+ "Uses local timezone if none specified. Only effective when "
474
+ "installing from indexes that provide upload-time metadata."
475
+ ),
476
+ )
477
+
478
+
479
+ def trusted_host() -> Option:
480
+ return Option(
481
+ "--trusted-host",
482
+ dest="trusted_hosts",
483
+ action="append",
484
+ metavar="HOSTNAME",
485
+ default=[],
486
+ help="Mark this host or host:port pair as trusted, even though it "
487
+ "does not have valid or any HTTPS.",
488
+ )
489
+
490
+
491
+ def constraints() -> Option:
492
+ return Option(
493
+ "-c",
494
+ "--constraint",
495
+ dest="constraints",
496
+ action="append",
497
+ default=[],
498
+ metavar="file",
499
+ help="Constrain versions using the given constraints file. "
500
+ "This option can be used multiple times.",
501
+ )
502
+
503
+
504
+ def build_constraints() -> Option:
505
+ return Option(
506
+ "--build-constraint",
507
+ dest="build_constraints",
508
+ action="append",
509
+ type="str",
510
+ default=[],
511
+ metavar="file",
512
+ help=(
513
+ "Constrain build dependencies using the given constraints file. "
514
+ "This option can be used multiple times."
515
+ ),
516
+ )
517
+
518
+
519
+ def requirements() -> Option:
520
+ return Option(
521
+ "-r",
522
+ "--requirement",
523
+ dest="requirements",
524
+ action="append",
525
+ default=[],
526
+ metavar="file",
527
+ help="Install from the given requirements file. "
528
+ "This option can be used multiple times.",
529
+ )
530
+
531
+
532
+ def requirements_from_scripts() -> Option:
533
+ return Option(
534
+ "--requirements-from-script",
535
+ action="append",
536
+ default=[],
537
+ dest="requirements_from_scripts",
538
+ metavar="file",
539
+ help="Install dependencies of the given script file"
540
+ "as defined by PEP 723 inline metadata. ",
541
+ )
542
+
543
+
544
+ def editable() -> Option:
545
+ return Option(
546
+ "-e",
547
+ "--editable",
548
+ dest="editables",
549
+ action="append",
550
+ default=[],
551
+ metavar="path/url",
552
+ help=(
553
+ "Install a project in editable mode (i.e. setuptools "
554
+ '"develop mode") from a local project path or a VCS url.'
555
+ ),
556
+ )
557
+
558
+
559
+ def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None:
560
+ value = os.path.abspath(value)
561
+ setattr(parser.values, option.dest, value)
562
+
563
+
564
+ src: Callable[..., Option] = partial(
565
+ PipOption,
566
+ "--src",
567
+ "--source",
568
+ "--source-dir",
569
+ "--source-directory",
570
+ dest="src_dir",
571
+ type="path",
572
+ metavar="dir",
573
+ default=get_src_prefix(),
574
+ action="callback",
575
+ callback=_handle_src,
576
+ help="Directory to check out editable projects into. "
577
+ 'The default in a virtualenv is "<venv path>/src". '
578
+ 'The default for global installs is "<current dir>/src".',
579
+ )
580
+
581
+
582
+ def _get_format_control(values: Values, option: Option) -> Any:
583
+ """Get a format_control object."""
584
+ return getattr(values, option.dest)
585
+
586
+
587
+ def _handle_no_binary(
588
+ option: Option, opt_str: str, value: str, parser: OptionParser
589
+ ) -> None:
590
+ existing = _get_format_control(parser.values, option)
591
+ FormatControl.handle_mutual_excludes(
592
+ value,
593
+ existing.no_binary,
594
+ existing.only_binary,
595
+ )
596
+
597
+
598
+ def _handle_only_binary(
599
+ option: Option, opt_str: str, value: str, parser: OptionParser
600
+ ) -> None:
601
+ existing = _get_format_control(parser.values, option)
602
+ FormatControl.handle_mutual_excludes(
603
+ value,
604
+ existing.only_binary,
605
+ existing.no_binary,
606
+ )
607
+
608
+
609
+ def no_binary() -> Option:
610
+ format_control = FormatControl(set(), set())
611
+ return Option(
612
+ "--no-binary",
613
+ dest="format_control",
614
+ action="callback",
615
+ callback=_handle_no_binary,
616
+ type="str",
617
+ default=format_control,
618
+ help="Do not use binary packages. Can be supplied multiple times, and "
619
+ 'each time adds to the existing value. Accepts either ":all:" to '
620
+ 'disable all binary packages, ":none:" to empty the set (notice '
621
+ "the colons), or one or more package names with commas between "
622
+ "them (no colons). Note that some packages are tricky to compile "
623
+ "and may fail to install when this option is used on them.",
624
+ )
625
+
626
+
627
+ def only_binary() -> Option:
628
+ format_control = FormatControl(set(), set())
629
+ return Option(
630
+ "--only-binary",
631
+ dest="format_control",
632
+ action="callback",
633
+ callback=_handle_only_binary,
634
+ type="str",
635
+ default=format_control,
636
+ help="Do not use source packages. Can be supplied multiple times, and "
637
+ 'each time adds to the existing value. Accepts either ":all:" to '
638
+ 'disable all source packages, ":none:" to empty the set, or one '
639
+ "or more package names with commas between them. Packages "
640
+ "without binary distributions will fail to install when this "
641
+ "option is used on them.",
642
+ )
643
+
644
+
645
+ def _get_release_control(values: Values, option: Option) -> Any:
646
+ """Get a release_control object."""
647
+ return getattr(values, option.dest)
648
+
649
+
650
+ def _handle_all_releases(
651
+ option: Option, opt_str: str, value: str, parser: OptionParser
652
+ ) -> None:
653
+ existing = _get_release_control(parser.values, option)
654
+ existing.handle_mutual_excludes(
655
+ value,
656
+ existing.all_releases,
657
+ existing.only_final,
658
+ "all_releases",
659
+ )
660
+
661
+
662
+ def _handle_only_final(
663
+ option: Option, opt_str: str, value: str, parser: OptionParser
664
+ ) -> None:
665
+ existing = _get_release_control(parser.values, option)
666
+ existing.handle_mutual_excludes(
667
+ value,
668
+ existing.only_final,
669
+ existing.all_releases,
670
+ "only_final",
671
+ )
672
+
673
+
674
+ def all_releases() -> Option:
675
+ release_control = ReleaseControl(set(), set())
676
+ return Option(
677
+ "--all-releases",
678
+ dest="release_control",
679
+ action="callback",
680
+ callback=_handle_all_releases,
681
+ type="str",
682
+ default=release_control,
683
+ help="Allow all release types (including pre-releases) for a package. "
684
+ "Can be supplied multiple times, and each time adds to the existing "
685
+ 'value. Accepts either ":all:" to allow pre-releases for all '
686
+ 'packages, ":none:" to empty the set (notice the colons), or one or '
687
+ "more package names with commas between them (no colons). Cannot be "
688
+ "used with --pre.",
689
+ )
690
+
691
+
692
+ def only_final() -> Option:
693
+ release_control = ReleaseControl(set(), set())
694
+ return Option(
695
+ "--only-final",
696
+ dest="release_control",
697
+ action="callback",
698
+ callback=_handle_only_final,
699
+ type="str",
700
+ default=release_control,
701
+ help="Only allow final releases (no pre-releases) for a package. Can be "
702
+ "supplied multiple times, and each time adds to the existing value. "
703
+ 'Accepts either ":all:" to disable pre-releases for all packages, '
704
+ '":none:" to empty the set, or one or more package names with commas '
705
+ "between them. Cannot be used with --pre.",
706
+ )
707
+
708
+
709
+ def check_release_control_exclusive(options: Values) -> None:
710
+ """
711
+ Raise an error if --pre is used with --all-releases or --only-final,
712
+ and transform --pre into --all-releases :all: if used alone.
713
+ """
714
+ if not hasattr(options, "pre") or not options.pre:
715
+ return
716
+
717
+ release_control = options.release_control
718
+ if release_control.all_releases or release_control.only_final:
719
+ raise CommandError("--pre cannot be used with --all-releases or --only-final.")
720
+
721
+ # Transform --pre into --all-releases :all:
722
+ release_control.all_releases.add(":all:")
723
+
724
+
725
+ platforms: Callable[..., Option] = partial(
726
+ Option,
727
+ "--platform",
728
+ dest="platforms",
729
+ metavar="platform",
730
+ action="append",
731
+ default=None,
732
+ help=(
733
+ "Only use wheels compatible with <platform>. Defaults to the "
734
+ "platform of the running system. Use this option multiple times to "
735
+ "specify multiple platforms supported by the target interpreter."
736
+ ),
737
+ )
738
+
739
+
740
+ # This was made a separate function for unit-testing purposes.
741
+ def _convert_python_version(value: str) -> tuple[tuple[int, ...], str | None]:
742
+ """
743
+ Convert a version string like "3", "37", or "3.7.3" into a tuple of ints.
744
+
745
+ :return: A 2-tuple (version_info, error_msg), where `error_msg` is
746
+ non-None if and only if there was a parsing error.
747
+ """
748
+ if not value:
749
+ # The empty string is the same as not providing a value.
750
+ return (None, None)
751
+
752
+ parts = value.split(".")
753
+ if len(parts) > 3:
754
+ return ((), "at most three version parts are allowed")
755
+
756
+ if len(parts) == 1:
757
+ # Then we are in the case of "3" or "37".
758
+ value = parts[0]
759
+ if len(value) > 1:
760
+ parts = [value[0], value[1:]]
761
+
762
+ try:
763
+ version_info = tuple(int(part) for part in parts)
764
+ except ValueError:
765
+ return ((), "each version part must be an integer")
766
+
767
+ return (version_info, None)
768
+
769
+
770
+ def _handle_python_version(
771
+ option: Option, opt_str: str, value: str, parser: OptionParser
772
+ ) -> None:
773
+ """
774
+ Handle a provided --python-version value.
775
+ """
776
+ version_info, error_msg = _convert_python_version(value)
777
+ if error_msg is not None:
778
+ msg = f"invalid --python-version value: {value!r}: {error_msg}"
779
+ raise_option_error(parser, option=option, msg=msg)
780
+
781
+ parser.values.python_version = version_info
782
+
783
+
784
+ python_version: Callable[..., Option] = partial(
785
+ Option,
786
+ "--python-version",
787
+ dest="python_version",
788
+ metavar="python_version",
789
+ action="callback",
790
+ callback=_handle_python_version,
791
+ type="str",
792
+ default=None,
793
+ help=dedent(
794
+ """\
795
+ The Python interpreter version to use for wheel and "Requires-Python"
796
+ compatibility checks. Defaults to a version derived from the running
797
+ interpreter. The version can be specified using up to three dot-separated
798
+ integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor
799
+ version can also be given as a string without dots (e.g. "37" for 3.7.0).
800
+ """
801
+ ),
802
+ )
803
+
804
+
805
+ implementation: Callable[..., Option] = partial(
806
+ Option,
807
+ "--implementation",
808
+ dest="implementation",
809
+ metavar="implementation",
810
+ default=None,
811
+ help=(
812
+ "Only use wheels compatible with Python "
813
+ "implementation <implementation>, e.g. 'pp', 'jy', 'cp', "
814
+ " or 'ip'. If not specified, then the current "
815
+ "interpreter implementation is used. Use 'py' to force "
816
+ "implementation-agnostic wheels."
817
+ ),
818
+ )
819
+
820
+
821
+ abis: Callable[..., Option] = partial(
822
+ Option,
823
+ "--abi",
824
+ dest="abis",
825
+ metavar="abi",
826
+ action="append",
827
+ default=None,
828
+ help=(
829
+ "Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. "
830
+ "If not specified, then the current interpreter abi tag is used. "
831
+ "Use this option multiple times to specify multiple abis supported "
832
+ "by the target interpreter. Generally you will need to specify "
833
+ "--implementation, --platform, and --python-version when using this "
834
+ "option."
835
+ ),
836
+ )
837
+
838
+
839
+ def add_target_python_options(cmd_opts: OptionGroup) -> None:
840
+ cmd_opts.add_option(platforms())
841
+ cmd_opts.add_option(python_version())
842
+ cmd_opts.add_option(implementation())
843
+ cmd_opts.add_option(abis())
844
+
845
+
846
+ def make_target_python(options: Values) -> TargetPython:
847
+ target_python = TargetPython(
848
+ platforms=options.platforms,
849
+ py_version_info=options.python_version,
850
+ abis=options.abis,
851
+ implementation=options.implementation,
852
+ )
853
+
854
+ return target_python
855
+
856
+
857
+ def prefer_binary() -> Option:
858
+ return Option(
859
+ "--prefer-binary",
860
+ dest="prefer_binary",
861
+ action="store_true",
862
+ default=False,
863
+ help=(
864
+ "Prefer binary packages over source packages, even if the "
865
+ "source packages are newer."
866
+ ),
867
+ )
868
+
869
+
870
+ cache_dir: Callable[..., Option] = partial(
871
+ PipOption,
872
+ "--cache-dir",
873
+ dest="cache_dir",
874
+ default=USER_CACHE_DIR,
875
+ metavar="dir",
876
+ type="path",
877
+ help="Store the cache data in <dir>.",
878
+ )
879
+
880
+
881
+ def _handle_no_cache_dir(
882
+ option: Option, opt: str, value: str, parser: OptionParser
883
+ ) -> None:
884
+ """
885
+ Process a value provided for the --no-cache-dir option.
886
+
887
+ This is an optparse.Option callback for the --no-cache-dir option.
888
+ """
889
+ # The value argument will be None if --no-cache-dir is passed via the
890
+ # command-line, since the option doesn't accept arguments. However,
891
+ # the value can be non-None if the option is triggered e.g. by an
892
+ # environment variable, like PIP_NO_CACHE_DIR=true.
893
+ if value is not None:
894
+ # Then parse the string value to get argument error-checking.
895
+ try:
896
+ strtobool(value)
897
+ except ValueError as exc:
898
+ raise_option_error(parser, option=option, msg=str(exc))
899
+
900
+ # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool()
901
+ # converted to 0 (like "false" or "no") caused cache_dir to be disabled
902
+ # rather than enabled (logic would say the latter). Thus, we disable
903
+ # the cache directory not just on values that parse to True, but (for
904
+ # backwards compatibility reasons) also on values that parse to False.
905
+ # In other words, always set it to False if the option is provided in
906
+ # some (valid) form.
907
+ parser.values.cache_dir = False
908
+
909
+
910
+ no_cache: Callable[..., Option] = partial(
911
+ Option,
912
+ "--no-cache-dir",
913
+ dest="cache_dir",
914
+ action="callback",
915
+ callback=_handle_no_cache_dir,
916
+ help="Disable the cache.",
917
+ )
918
+
919
+ no_deps: Callable[..., Option] = partial(
920
+ Option,
921
+ "--no-deps",
922
+ "--no-dependencies",
923
+ dest="ignore_dependencies",
924
+ action="store_true",
925
+ default=False,
926
+ help="Don't install package dependencies.",
927
+ )
928
+
929
+
930
+ def _handle_dependency_group(
931
+ option: Option, opt: str, value: str, parser: OptionParser
932
+ ) -> None:
933
+ """
934
+ Process a value provided for the --group option.
935
+
936
+ Splits on the rightmost ":", and validates that the path (if present) ends
937
+ in `pyproject.toml`. Defaults the path to `pyproject.toml` when one is not given.
938
+
939
+ `:` cannot appear in dependency group names, so this is a safe and simple parse.
940
+
941
+ This is an optparse.Option callback for the dependency_groups option.
942
+ """
943
+ path, sep, groupname = value.rpartition(":")
944
+ if not sep:
945
+ path = "pyproject.toml"
946
+ else:
947
+ # check for 'pyproject.toml' filenames using pathlib
948
+ if pathlib.PurePath(path).name != "pyproject.toml":
949
+ msg = "group paths use 'pyproject.toml' filenames"
950
+ raise_option_error(parser, option=option, msg=msg)
951
+
952
+ parser.values.dependency_groups.append((path, groupname))
953
+
954
+
955
+ dependency_groups: Callable[..., Option] = partial(
956
+ Option,
957
+ "--group",
958
+ dest="dependency_groups",
959
+ default=[],
960
+ type=str,
961
+ action="callback",
962
+ callback=_handle_dependency_group,
963
+ metavar="[path:]group",
964
+ help='Install a named dependency-group from a "pyproject.toml" file. '
965
+ 'If a path is given, the name of the file must be "pyproject.toml". '
966
+ 'Defaults to using "pyproject.toml" in the current directory.',
967
+ )
968
+
969
+ ignore_requires_python: Callable[..., Option] = partial(
970
+ Option,
971
+ "--ignore-requires-python",
972
+ dest="ignore_requires_python",
973
+ action="store_true",
974
+ help="Ignore the Requires-Python information.",
975
+ )
976
+
977
+
978
+ no_build_isolation: Callable[..., Option] = partial(
979
+ Option,
980
+ "--no-build-isolation",
981
+ dest="build_isolation",
982
+ action="store_false",
983
+ default=True,
984
+ help="Disable isolation when building a modern source distribution. "
985
+ "Build dependencies specified by PEP 518 must be already installed "
986
+ "if this option is used.",
987
+ )
988
+
989
+ check_build_deps: Callable[..., Option] = partial(
990
+ Option,
991
+ "--check-build-dependencies",
992
+ dest="check_build_deps",
993
+ action="store_true",
994
+ default=False,
995
+ help="Check the build dependencies.",
996
+ )
997
+
998
+
999
+ use_pep517: Any = partial(
1000
+ Option,
1001
+ "--use-pep517",
1002
+ dest="use_pep517",
1003
+ action="store_true",
1004
+ default=True,
1005
+ help=SUPPRESS_HELP,
1006
+ )
1007
+
1008
+
1009
+ def _handle_config_settings(
1010
+ option: Option, opt_str: str, value: str, parser: OptionParser
1011
+ ) -> None:
1012
+ key, sep, val = value.partition("=")
1013
+ if sep != "=":
1014
+ parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL")
1015
+ dest = getattr(parser.values, option.dest)
1016
+ if dest is None:
1017
+ dest = {}
1018
+ setattr(parser.values, option.dest, dest)
1019
+ if key in dest:
1020
+ if isinstance(dest[key], list):
1021
+ dest[key].append(val)
1022
+ else:
1023
+ dest[key] = [dest[key], val]
1024
+ else:
1025
+ dest[key] = val
1026
+
1027
+
1028
+ config_settings: Callable[..., Option] = partial(
1029
+ Option,
1030
+ "-C",
1031
+ "--config-settings",
1032
+ dest="config_settings",
1033
+ type=str,
1034
+ action="callback",
1035
+ callback=_handle_config_settings,
1036
+ metavar="settings",
1037
+ help="Configuration settings to be passed to the build backend. "
1038
+ "Settings take the form KEY=VALUE. Use multiple --config-settings options "
1039
+ "to pass multiple keys to the backend.",
1040
+ )
1041
+
1042
+ no_clean: Callable[..., Option] = partial(
1043
+ Option,
1044
+ "--no-clean",
1045
+ action="store_true",
1046
+ default=False,
1047
+ help="Don't clean up build directories.",
1048
+ )
1049
+
1050
+ pre: Callable[..., Option] = partial(
1051
+ Option,
1052
+ "--pre",
1053
+ action="store_true",
1054
+ default=False,
1055
+ help="Include pre-release and development versions. By default, "
1056
+ "pip only finds stable versions.",
1057
+ )
1058
+
1059
+ json: Callable[..., Option] = partial(
1060
+ Option,
1061
+ "--json",
1062
+ action="store_true",
1063
+ default=False,
1064
+ help="Output data in a machine-readable JSON format.",
1065
+ )
1066
+
1067
+ disable_pip_version_check: Callable[..., Option] = partial(
1068
+ Option,
1069
+ "--disable-pip-version-check",
1070
+ dest="disable_pip_version_check",
1071
+ action="store_true",
1072
+ default=False,
1073
+ help="Don't periodically check PyPI to determine whether a new version "
1074
+ "of pip is available for download. Implied with --no-index.",
1075
+ )
1076
+
1077
+ root_user_action: Callable[..., Option] = partial(
1078
+ Option,
1079
+ "--root-user-action",
1080
+ dest="root_user_action",
1081
+ default="warn",
1082
+ choices=["warn", "ignore"],
1083
+ help="Action if pip is run as a root user [warn, ignore] (default: warn)",
1084
+ )
1085
+
1086
+
1087
+ def _handle_merge_hash(
1088
+ option: Option, opt_str: str, value: str, parser: OptionParser
1089
+ ) -> None:
1090
+ """Given a value spelled "algo:digest", append the digest to a list
1091
+ pointed to in a dict by the algo name."""
1092
+ if not parser.values.hashes:
1093
+ parser.values.hashes = {}
1094
+ try:
1095
+ algo, digest = value.split(":", 1)
1096
+ except ValueError:
1097
+ parser.error(
1098
+ f"Arguments to {opt_str} must be a hash name "
1099
+ "followed by a value, like --hash=sha256:"
1100
+ "abcde..."
1101
+ )
1102
+ if algo not in STRONG_HASHES:
1103
+ parser.error(
1104
+ "Allowed hash algorithms for {} are {}.".format(
1105
+ opt_str, ", ".join(STRONG_HASHES)
1106
+ )
1107
+ )
1108
+ parser.values.hashes.setdefault(algo, []).append(digest)
1109
+
1110
+
1111
+ hash: Callable[..., Option] = partial(
1112
+ Option,
1113
+ "--hash",
1114
+ # Hash values eventually end up in InstallRequirement.hashes due to
1115
+ # __dict__ copying in process_line().
1116
+ dest="hashes",
1117
+ action="callback",
1118
+ callback=_handle_merge_hash,
1119
+ type="string",
1120
+ help="Verify that the package's archive matches this "
1121
+ "hash before installing. Example: --hash=sha256:abcdef...",
1122
+ )
1123
+
1124
+
1125
+ require_hashes: Callable[..., Option] = partial(
1126
+ Option,
1127
+ "--require-hashes",
1128
+ dest="require_hashes",
1129
+ action="store_true",
1130
+ default=False,
1131
+ help="Require a hash to check each requirement against, for "
1132
+ "repeatable installs. This option is implied when any package in a "
1133
+ "requirements file has a --hash option.",
1134
+ )
1135
+
1136
+
1137
+ list_path: Callable[..., Option] = partial(
1138
+ PipOption,
1139
+ "--path",
1140
+ dest="path",
1141
+ type="path",
1142
+ action="append",
1143
+ help="Restrict to the specified installation path for listing "
1144
+ "packages (can be used multiple times).",
1145
+ )
1146
+
1147
+
1148
+ def check_list_path_option(options: Values) -> None:
1149
+ if options.path and (options.user or options.local):
1150
+ raise CommandError("Cannot combine '--path' with '--user' or '--local'")
1151
+
1152
+
1153
+ list_exclude: Callable[..., Option] = partial(
1154
+ PipOption,
1155
+ "--exclude",
1156
+ dest="excludes",
1157
+ action="append",
1158
+ metavar="package",
1159
+ type="package_name",
1160
+ help="Exclude specified package from the output",
1161
+ )
1162
+
1163
+
1164
+ no_python_version_warning: Callable[..., Option] = partial(
1165
+ Option,
1166
+ "--no-python-version-warning",
1167
+ dest="no_python_version_warning",
1168
+ action="store_true",
1169
+ default=False,
1170
+ help=SUPPRESS_HELP, # No-op, a hold-over from the Python 2->3 transition.
1171
+ )
1172
+
1173
+
1174
+ # Features that are now always on. A warning is printed if they are used.
1175
+ ALWAYS_ENABLED_FEATURES = [
1176
+ "truststore", # always on since 24.2
1177
+ "no-binary-enable-wheel-cache", # always on since 23.1
1178
+ ]
1179
+
1180
+ use_new_feature: Callable[..., Option] = partial(
1181
+ Option,
1182
+ "--use-feature",
1183
+ dest="features_enabled",
1184
+ metavar="feature",
1185
+ action="append",
1186
+ default=[],
1187
+ choices=[
1188
+ "fast-deps",
1189
+ "build-constraint",
1190
+ "inprocess-build-deps",
1191
+ ]
1192
+ + ALWAYS_ENABLED_FEATURES,
1193
+ help="Enable new functionality, that may be backward incompatible.",
1194
+ )
1195
+
1196
+ use_deprecated_feature: Callable[..., Option] = partial(
1197
+ Option,
1198
+ "--use-deprecated",
1199
+ dest="deprecated_features_enabled",
1200
+ metavar="feature",
1201
+ action="append",
1202
+ default=[],
1203
+ choices=[
1204
+ "legacy-resolver",
1205
+ "legacy-certs",
1206
+ ],
1207
+ help=("Enable deprecated functionality, that will be removed in the future."),
1208
+ )
1209
+
1210
+ ##########
1211
+ # groups #
1212
+ ##########
1213
+
1214
+ general_group: dict[str, Any] = {
1215
+ "name": "General Options",
1216
+ "options": [
1217
+ help_,
1218
+ debug_mode,
1219
+ isolated_mode,
1220
+ require_virtualenv,
1221
+ python,
1222
+ verbose,
1223
+ version,
1224
+ quiet,
1225
+ log,
1226
+ no_input,
1227
+ keyring_provider,
1228
+ proxy,
1229
+ retries,
1230
+ timeout,
1231
+ exists_action,
1232
+ trusted_host,
1233
+ cert,
1234
+ client_cert,
1235
+ cache_dir,
1236
+ no_cache,
1237
+ disable_pip_version_check,
1238
+ no_color,
1239
+ no_python_version_warning,
1240
+ use_new_feature,
1241
+ use_deprecated_feature,
1242
+ resume_retries,
1243
+ ],
1244
+ }
1245
+
1246
+ index_group: dict[str, Any] = {
1247
+ "name": "Package Index Options",
1248
+ "options": [
1249
+ index_url,
1250
+ extra_index_url,
1251
+ no_index,
1252
+ find_links,
1253
+ uploaded_prior_to,
1254
+ ],
1255
+ }
1256
+
1257
+ package_selection_group: dict[str, Any] = {
1258
+ "name": "Package Selection Options",
1259
+ "options": [
1260
+ pre,
1261
+ all_releases,
1262
+ only_final,
1263
+ no_binary,
1264
+ only_binary,
1265
+ prefer_binary,
1266
+ ],
1267
+ }
.venv/Lib/site-packages/pip/_internal/cli/command_context.py ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from collections.abc import Generator
2
+ from contextlib import AbstractContextManager, ExitStack, contextmanager
3
+ from typing import TypeVar
4
+
5
+ _T = TypeVar("_T", covariant=True)
6
+
7
+
8
+ class CommandContextMixIn:
9
+ def __init__(self) -> None:
10
+ super().__init__()
11
+ self._in_main_context = False
12
+ self._main_context = ExitStack()
13
+
14
+ @contextmanager
15
+ def main_context(self) -> Generator[None, None, None]:
16
+ assert not self._in_main_context
17
+
18
+ self._in_main_context = True
19
+ try:
20
+ with self._main_context:
21
+ yield
22
+ finally:
23
+ self._in_main_context = False
24
+
25
+ def enter_context(self, context_provider: AbstractContextManager[_T]) -> _T:
26
+ assert self._in_main_context
27
+
28
+ return self._main_context.enter_context(context_provider)
.venv/Lib/site-packages/pip/_internal/cli/index_command.py ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Contains command classes which may interact with an index / the network.
3
+
4
+ Unlike its sister module, req_command, this module still uses lazy imports
5
+ so commands which don't always hit the network (e.g. list w/o --outdated or
6
+ --uptodate) don't need waste time importing PipSession and friends.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import logging
12
+ import os
13
+ import sys
14
+ from functools import lru_cache
15
+ from optparse import Values
16
+ from typing import TYPE_CHECKING
17
+
18
+ from pip._vendor import certifi
19
+
20
+ from pip._internal.cli.base_command import Command
21
+ from pip._internal.cli.command_context import CommandContextMixIn
22
+
23
+ if TYPE_CHECKING:
24
+ from ssl import SSLContext
25
+
26
+ from pip._vendor.packaging.utils import NormalizedName
27
+
28
+ from pip._internal.network.session import PipSession
29
+
30
+ logger = logging.getLogger(__name__)
31
+
32
+
33
+ @lru_cache
34
+ def _create_truststore_ssl_context() -> SSLContext | None:
35
+ if sys.version_info < (3, 10):
36
+ logger.debug("Disabling truststore because Python version isn't 3.10+")
37
+ return None
38
+
39
+ try:
40
+ import ssl
41
+ except ImportError:
42
+ logger.warning("Disabling truststore since ssl support is missing")
43
+ return None
44
+
45
+ try:
46
+ from pip._vendor import truststore
47
+ except ImportError:
48
+ logger.warning("Disabling truststore because platform isn't supported")
49
+ return None
50
+
51
+ ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
52
+ ctx.load_verify_locations(certifi.where())
53
+ return ctx
54
+
55
+
56
+ class SessionCommandMixin(CommandContextMixIn):
57
+ """
58
+ A class mixin for command classes needing _build_session().
59
+ """
60
+
61
+ def __init__(self) -> None:
62
+ super().__init__()
63
+ self._session: PipSession | None = None
64
+
65
+ @classmethod
66
+ def _get_index_urls(cls, options: Values) -> list[str] | None:
67
+ """Return a list of index urls from user-provided options."""
68
+ index_urls = []
69
+ if not getattr(options, "no_index", False):
70
+ url = getattr(options, "index_url", None)
71
+ if url:
72
+ index_urls.append(url)
73
+ urls = getattr(options, "extra_index_urls", None)
74
+ if urls:
75
+ index_urls.extend(urls)
76
+ # Return None rather than an empty list
77
+ return index_urls or None
78
+
79
+ def get_default_session(self, options: Values) -> PipSession:
80
+ """Get a default-managed session."""
81
+ if self._session is None:
82
+ self._session = self.enter_context(self._build_session(options))
83
+ # there's no type annotation on requests.Session, so it's
84
+ # automatically ContextManager[Any] and self._session becomes Any,
85
+ # then https://github.com/python/mypy/issues/7696 kicks in
86
+ assert self._session is not None
87
+ return self._session
88
+
89
+ def _build_session(
90
+ self,
91
+ options: Values,
92
+ retries: int | None = None,
93
+ timeout: int | None = None,
94
+ ) -> PipSession:
95
+ from pip._internal.network.session import PipSession
96
+
97
+ cache_dir = options.cache_dir
98
+ assert not cache_dir or os.path.isabs(cache_dir)
99
+
100
+ if "legacy-certs" not in options.deprecated_features_enabled:
101
+ ssl_context = _create_truststore_ssl_context()
102
+ else:
103
+ ssl_context = None
104
+
105
+ session = PipSession(
106
+ cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
107
+ retries=retries if retries is not None else options.retries,
108
+ resume_retries=options.resume_retries,
109
+ trusted_hosts=options.trusted_hosts,
110
+ index_urls=self._get_index_urls(options),
111
+ ssl_context=ssl_context,
112
+ )
113
+
114
+ # Handle custom ca-bundles from the user
115
+ if options.cert:
116
+ session.verify = options.cert
117
+
118
+ # Handle SSL client certificate
119
+ if options.client_cert:
120
+ session.cert = options.client_cert
121
+
122
+ # Handle timeouts
123
+ if options.timeout or timeout:
124
+ session.timeout = timeout if timeout is not None else options.timeout
125
+
126
+ # Handle configured proxies
127
+ if options.proxy:
128
+ session.proxies = {
129
+ "http": options.proxy,
130
+ "https": options.proxy,
131
+ }
132
+ session.trust_env = False
133
+ session.pip_proxy = options.proxy
134
+
135
+ # Determine if we can prompt the user for authentication or not
136
+ session.auth.prompting = not options.no_input
137
+ session.auth.keyring_provider = options.keyring_provider
138
+
139
+ return session
140
+
141
+
142
+ def _pip_self_version_check(session: PipSession, options: Values) -> None:
143
+ from pip._internal.self_outdated_check import pip_self_version_check as check
144
+
145
+ check(session, options)
146
+
147
+
148
+ class IndexGroupCommand(Command, SessionCommandMixin):
149
+ """
150
+ Abstract base class for commands with the index_group options.
151
+
152
+ This also corresponds to the commands that permit the pip version check.
153
+ """
154
+
155
+ def should_exclude_prerelease(
156
+ self, options: Values, package_name: NormalizedName
157
+ ) -> bool:
158
+ """
159
+ Determine if pre-releases should be excluded for a package.
160
+ """
161
+ # Check per-package release control settings
162
+ if options.release_control:
163
+ allow_prereleases = options.release_control.allows_prereleases(package_name)
164
+ if allow_prereleases is True:
165
+ return False # Include pre-releases
166
+ elif allow_prereleases is False:
167
+ return True # Exclude pre-releases
168
+
169
+ # No specific setting: exclude prereleases by default
170
+ return True
171
+
172
+ def handle_pip_version_check(self, options: Values) -> None:
173
+ """
174
+ Do the pip version check if not disabled.
175
+
176
+ This overrides the default behavior of not doing the check.
177
+ """
178
+ # Make sure the index_group options are present.
179
+ assert hasattr(options, "no_index")
180
+
181
+ if options.disable_pip_version_check or options.no_index:
182
+ return
183
+
184
+ try:
185
+ # Otherwise, check if we're using the latest version of pip available.
186
+ session = self._build_session(
187
+ options,
188
+ retries=0,
189
+ timeout=min(5, options.timeout),
190
+ )
191
+ with session:
192
+ _pip_self_version_check(session, options)
193
+ except Exception:
194
+ logger.warning("There was an error checking the latest version of pip.")
195
+ logger.debug("See below for error", exc_info=True)
.venv/Lib/site-packages/pip/_internal/cli/main.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Primary application entrypoint."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import locale
6
+ import logging
7
+ import os
8
+ import sys
9
+ import warnings
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ # Do not import and use main() directly! Using it directly is actively
15
+ # discouraged by pip's maintainers. The name, location and behavior of
16
+ # this function is subject to change, so calling it directly is not
17
+ # portable across different pip versions.
18
+
19
+ # In addition, running pip in-process is unsupported and unsafe. This is
20
+ # elaborated in detail at
21
+ # https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program.
22
+ # That document also provides suggestions that should work for nearly
23
+ # all users that are considering importing and using main() directly.
24
+
25
+ # However, we know that certain users will still want to invoke pip
26
+ # in-process. If you understand and accept the implications of using pip
27
+ # in an unsupported manner, the best approach is to use runpy to avoid
28
+ # depending on the exact location of this entry point.
29
+
30
+ # The following example shows how to use runpy to invoke pip in that
31
+ # case:
32
+ #
33
+ # sys.argv = ["pip", your, args, here]
34
+ # runpy.run_module("pip", run_name="__main__")
35
+ #
36
+ # Note that this will exit the process after running, unlike a direct
37
+ # call to main. As it is not safe to do any processing after calling
38
+ # main, this should not be an issue in practice.
39
+
40
+
41
+ def main(args: list[str] | None = None) -> int:
42
+ # NOTE: Lazy imports to speed up import of this module,
43
+ # which is imported from the pip console script. This doesn't
44
+ # speed up normal pip execution, but might be important in the future
45
+ # if we use ``multiprocessing`` module,
46
+ # which imports __main__ for each spawned subprocess.
47
+ from pip._internal.cli.autocompletion import autocomplete
48
+ from pip._internal.cli.main_parser import parse_command
49
+ from pip._internal.commands import create_command
50
+ from pip._internal.exceptions import PipError
51
+ from pip._internal.utils import deprecation
52
+
53
+ if args is None:
54
+ args = sys.argv[1:]
55
+
56
+ # Suppress the pkg_resources deprecation warning
57
+ # Note - we use a module of .*pkg_resources to cover
58
+ # the normal case (pip._vendor.pkg_resources) and the
59
+ # devendored case (a bare pkg_resources)
60
+ warnings.filterwarnings(
61
+ action="ignore", category=DeprecationWarning, module=".*pkg_resources"
62
+ )
63
+
64
+ # Configure our deprecation warnings to be sent through loggers
65
+ deprecation.install_warning_logger()
66
+
67
+ autocomplete()
68
+
69
+ try:
70
+ cmd_name, cmd_args = parse_command(args)
71
+ except PipError as exc:
72
+ sys.stderr.write(f"ERROR: {exc}")
73
+ sys.stderr.write(os.linesep)
74
+ sys.exit(1)
75
+
76
+ # Needed for locale.getpreferredencoding(False) to work
77
+ # in pip._internal.utils.encoding.auto_decode
78
+ try:
79
+ locale.setlocale(locale.LC_ALL, "")
80
+ except locale.Error as e:
81
+ # setlocale can apparently crash if locale are uninitialized
82
+ logger.debug("Ignoring error %s when setting locale", e)
83
+ command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
84
+
85
+ return command.main(cmd_args)
.venv/Lib/site-packages/pip/_internal/cli/main_parser.py ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """A single place for constructing and exposing the main parser"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import subprocess
7
+ import sys
8
+
9
+ from pip._vendor.rich.markup import escape
10
+
11
+ from pip._internal.build_env import get_runnable_pip
12
+ from pip._internal.cli import cmdoptions
13
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
14
+ from pip._internal.commands import commands_dict, get_similar_commands
15
+ from pip._internal.exceptions import CommandError
16
+ from pip._internal.utils.misc import get_pip_version, get_prog
17
+
18
+ __all__ = ["create_main_parser", "parse_command"]
19
+
20
+
21
+ def create_main_parser() -> ConfigOptionParser:
22
+ """Creates and returns the main parser for pip's CLI"""
23
+
24
+ parser = ConfigOptionParser(
25
+ usage="\n%prog <command> [options]",
26
+ add_help_option=False,
27
+ formatter=UpdatingDefaultsHelpFormatter(),
28
+ name="global",
29
+ prog=get_prog(),
30
+ )
31
+ parser.disable_interspersed_args()
32
+
33
+ parser.version = get_pip_version()
34
+
35
+ # add the general options
36
+ gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
37
+ parser.add_option_group(gen_opts)
38
+
39
+ # so the help formatter knows
40
+ parser.main = True # type: ignore
41
+
42
+ # create command listing for description
43
+ description = [""] + [
44
+ f"[optparse.longargs]{name:27}[/] {escape(command_info.summary)}"
45
+ for name, command_info in commands_dict.items()
46
+ ]
47
+ parser.description = "\n".join(description)
48
+
49
+ return parser
50
+
51
+
52
+ def identify_python_interpreter(python: str) -> str | None:
53
+ # If the named file exists, use it.
54
+ # If it's a directory, assume it's a virtual environment and
55
+ # look for the environment's Python executable.
56
+ if os.path.exists(python):
57
+ if os.path.isdir(python):
58
+ # bin/python for Unix, Scripts/python.exe for Windows
59
+ # Try both in case of odd cases like cygwin.
60
+ for exe in ("bin/python", "Scripts/python.exe"):
61
+ py = os.path.join(python, exe)
62
+ if os.path.exists(py):
63
+ return py
64
+ else:
65
+ return python
66
+
67
+ # Could not find the interpreter specified
68
+ return None
69
+
70
+
71
+ def parse_command(args: list[str]) -> tuple[str, list[str]]:
72
+ parser = create_main_parser()
73
+
74
+ # Note: parser calls disable_interspersed_args(), so the result of this
75
+ # call is to split the initial args into the general options before the
76
+ # subcommand and everything else.
77
+ # For example:
78
+ # args: ['--timeout=5', 'install', '--user', 'INITools']
79
+ # general_options: ['--timeout==5']
80
+ # args_else: ['install', '--user', 'INITools']
81
+ general_options, args_else = parser.parse_args(args)
82
+
83
+ # --python
84
+ if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
85
+ # Re-invoke pip using the specified Python interpreter
86
+ interpreter = identify_python_interpreter(general_options.python)
87
+ if interpreter is None:
88
+ raise CommandError(
89
+ f"Could not locate Python interpreter {general_options.python}"
90
+ )
91
+
92
+ pip_cmd = [
93
+ interpreter,
94
+ get_runnable_pip(),
95
+ ]
96
+ pip_cmd.extend(args)
97
+
98
+ # Set a flag so the child doesn't re-invoke itself, causing
99
+ # an infinite loop.
100
+ os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1"
101
+ returncode = 0
102
+ try:
103
+ proc = subprocess.run(pip_cmd)
104
+ returncode = proc.returncode
105
+ except (subprocess.SubprocessError, OSError) as exc:
106
+ raise CommandError(f"Failed to run pip under {interpreter}: {exc}")
107
+ sys.exit(returncode)
108
+
109
+ # --version
110
+ if general_options.version:
111
+ sys.stdout.write(parser.version)
112
+ sys.stdout.write(os.linesep)
113
+ sys.exit()
114
+
115
+ # pip || pip help -> print_help()
116
+ if not args_else or (args_else[0] == "help" and len(args_else) == 1):
117
+ parser.print_help()
118
+ sys.exit()
119
+
120
+ # the subcommand name
121
+ cmd_name = args_else[0]
122
+
123
+ if cmd_name not in commands_dict:
124
+ guess = get_similar_commands(cmd_name)
125
+
126
+ msg = [f'unknown command "{cmd_name}"']
127
+ if guess:
128
+ msg.append(f'maybe you meant "{guess}"')
129
+
130
+ raise CommandError(" - ".join(msg))
131
+
132
+ # all the args without the subcommand
133
+ cmd_args = args[:]
134
+ cmd_args.remove(cmd_name)
135
+
136
+ return cmd_name, cmd_args
.venv/Lib/site-packages/pip/_internal/cli/parser.py ADDED
@@ -0,0 +1,358 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base option parser setup"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import optparse
7
+ import os
8
+ import re
9
+ import shutil
10
+ import sys
11
+ import textwrap
12
+ from collections.abc import Generator
13
+ from contextlib import suppress
14
+ from typing import Any, NoReturn
15
+
16
+ from pip._vendor.rich.markup import escape
17
+ from pip._vendor.rich.theme import Theme
18
+
19
+ from pip._internal.cli.status_codes import UNKNOWN_ERROR
20
+ from pip._internal.configuration import Configuration, ConfigurationError
21
+ from pip._internal.utils.logging import PipConsole
22
+ from pip._internal.utils.misc import redact_auth_from_url, strtobool
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
28
+ """A prettier/less verbose help formatter for optparse."""
29
+
30
+ styles = {
31
+ "optparse.shortargs": "green",
32
+ "optparse.longargs": "cyan",
33
+ "optparse.groups": "bold blue",
34
+ "optparse.metavar": "yellow",
35
+ }
36
+ highlights = {
37
+ r"\s(-{1}[\w]+[\w-]*)": "shortargs", # highlight -letter as short args
38
+ r"\s(-{2}[\w]+[\w-]*)": "longargs", # highlight --words as long args
39
+ }
40
+
41
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
42
+ # help position must be aligned with __init__.parseopts.description
43
+ kwargs["max_help_position"] = 30
44
+ kwargs["indent_increment"] = 1
45
+ kwargs["width"] = shutil.get_terminal_size()[0] - 2
46
+ super().__init__(*args, **kwargs)
47
+
48
+ def format_option_strings(self, option: optparse.Option) -> str:
49
+ """Return a comma-separated list of option strings and metavars."""
50
+ opts = []
51
+
52
+ if option._short_opts:
53
+ opts.append(f"[optparse.shortargs]{option._short_opts[0]}[/]")
54
+ if option._long_opts:
55
+ opts.append(f"[optparse.longargs]{option._long_opts[0]}[/]")
56
+ if len(opts) > 1:
57
+ opts.insert(1, ", ")
58
+
59
+ if option.takes_value():
60
+ assert option.dest is not None
61
+ metavar = option.metavar or option.dest.lower()
62
+ opts.append(f" [optparse.metavar]<{escape(metavar.lower())}>[/]")
63
+
64
+ return "".join(opts)
65
+
66
+ def format_option(self, option: optparse.Option) -> str:
67
+ """Overridden method with Rich support."""
68
+ # fmt: off
69
+ result = []
70
+ opts = self.option_strings[option]
71
+ opt_width = self.help_position - self.current_indent - 2
72
+ # Remove the rich style tags before calculating width during
73
+ # text wrap calculations. Also store the length removed to adjust
74
+ # the padding in the else branch.
75
+ stripped = re.sub(r"(\[[a-z.]+\])|(\[\/\])", "", opts)
76
+ style_tag_length = len(opts) - len(stripped)
77
+ if len(stripped) > opt_width:
78
+ opts = "%*s%s\n" % (self.current_indent, "", opts) # noqa: UP031
79
+ indent_first = self.help_position
80
+ else: # start help on same line as opts
81
+ opts = "%*s%-*s " % (self.current_indent, "", # noqa: UP031
82
+ opt_width + style_tag_length, opts)
83
+ indent_first = 0
84
+ result.append(opts)
85
+ if option.help:
86
+ help_text = self.expand_default(option)
87
+ help_lines = textwrap.wrap(help_text, self.help_width)
88
+ result.append("%*s%s\n" % (indent_first, "", help_lines[0])) # noqa: UP031
89
+ result.extend(["%*s%s\n" % (self.help_position, "", line) # noqa: UP031
90
+ for line in help_lines[1:]])
91
+ elif opts[-1] != "\n":
92
+ result.append("\n")
93
+ return "".join(result)
94
+ # fmt: on
95
+
96
+ def format_heading(self, heading: str) -> str:
97
+ if heading == "Options":
98
+ return ""
99
+ return "[optparse.groups]" + escape(heading) + ":[/]\n"
100
+
101
+ def format_usage(self, usage: str) -> str:
102
+ """
103
+ Ensure there is only one newline between usage and the first heading
104
+ if there is no description.
105
+ """
106
+ contents = self.indent_lines(textwrap.dedent(usage), " ")
107
+ msg = f"\n[optparse.groups]Usage:[/] {escape(contents)}\n"
108
+ return msg
109
+
110
+ def format_description(self, description: str | None) -> str:
111
+ # leave full control over description to us
112
+ if description:
113
+ if hasattr(self.parser, "main"):
114
+ label = "[optparse.groups]Commands:[/]"
115
+ else:
116
+ label = "[optparse.groups]Description:[/]"
117
+
118
+ # some doc strings have initial newlines, some don't
119
+ description = description.lstrip("\n")
120
+ # some doc strings have final newlines and spaces, some don't
121
+ description = description.rstrip()
122
+ # dedent, then reindent
123
+ description = self.indent_lines(textwrap.dedent(description), " ")
124
+ description = f"{label}\n{description}\n"
125
+ return description
126
+ else:
127
+ return ""
128
+
129
+ def format_epilog(self, epilog: str | None) -> str:
130
+ # leave full control over epilog to us
131
+ if epilog:
132
+ return escape(epilog)
133
+ else:
134
+ return ""
135
+
136
+ def expand_default(self, option: optparse.Option) -> str:
137
+ """Overridden HelpFormatter.expand_default() which colorizes flags."""
138
+ help = escape(super().expand_default(option))
139
+ for regex, style in self.highlights.items():
140
+ help = re.sub(regex, rf"[optparse.{style}] \1[/]", help)
141
+ return help
142
+
143
+ def indent_lines(self, text: str, indent: str) -> str:
144
+ new_lines = [indent + line for line in text.split("\n")]
145
+ return "\n".join(new_lines)
146
+
147
+
148
+ class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
149
+ """Custom help formatter for use in ConfigOptionParser.
150
+
151
+ This is updates the defaults before expanding them, allowing
152
+ them to show up correctly in the help listing.
153
+
154
+ Also redact auth from url type options
155
+ """
156
+
157
+ def expand_default(self, option: optparse.Option) -> str:
158
+ default_values = None
159
+ if self.parser is not None:
160
+ assert isinstance(self.parser, ConfigOptionParser)
161
+ self.parser._update_defaults(self.parser.defaults)
162
+ assert option.dest is not None
163
+ default_values = self.parser.defaults.get(option.dest)
164
+ help_text = super().expand_default(option)
165
+
166
+ if default_values and option.metavar == "URL":
167
+ if isinstance(default_values, str):
168
+ default_values = [default_values]
169
+
170
+ # If its not a list, we should abort and just return the help text
171
+ if not isinstance(default_values, list):
172
+ default_values = []
173
+
174
+ for val in default_values:
175
+ help_text = help_text.replace(val, redact_auth_from_url(val))
176
+
177
+ return help_text
178
+
179
+
180
+ class CustomOptionParser(optparse.OptionParser):
181
+ def insert_option_group(
182
+ self, idx: int, *args: Any, **kwargs: Any
183
+ ) -> optparse.OptionGroup:
184
+ """Insert an OptionGroup at a given position."""
185
+ group = self.add_option_group(*args, **kwargs)
186
+
187
+ self.option_groups.pop()
188
+ self.option_groups.insert(idx, group)
189
+
190
+ return group
191
+
192
+ @property
193
+ def option_list_all(self) -> list[optparse.Option]:
194
+ """Get a list of all options, including those in option groups."""
195
+ res = self.option_list[:]
196
+ for i in self.option_groups:
197
+ res.extend(i.option_list)
198
+
199
+ return res
200
+
201
+
202
+ class ConfigOptionParser(CustomOptionParser):
203
+ """Custom option parser which updates its defaults by checking the
204
+ configuration files and environmental variables"""
205
+
206
+ def __init__(
207
+ self,
208
+ *args: Any,
209
+ name: str,
210
+ isolated: bool = False,
211
+ **kwargs: Any,
212
+ ) -> None:
213
+ self.name = name
214
+ self.config = Configuration(isolated)
215
+
216
+ assert self.name
217
+ super().__init__(*args, **kwargs)
218
+
219
+ def check_default(self, option: optparse.Option, key: str, val: Any) -> Any:
220
+ try:
221
+ return option.check_value(key, val)
222
+ except optparse.OptionValueError as exc:
223
+ print(f"An error occurred during configuration: {exc}")
224
+ sys.exit(3)
225
+
226
+ def _get_ordered_configuration_items(
227
+ self,
228
+ ) -> Generator[tuple[str, Any], None, None]:
229
+ # Configuration gives keys in an unordered manner. Order them.
230
+ override_order = ["global", self.name, ":env:"]
231
+
232
+ # Pool the options into different groups
233
+ # Use a dict because we need to implement the fallthrough logic after PR 12201
234
+ # was merged which removed the fallthrough logic for options
235
+ section_items_dict: dict[str, dict[str, Any]] = {
236
+ name: {} for name in override_order
237
+ }
238
+
239
+ for _, value in self.config.items():
240
+ for section_key, val in value.items():
241
+
242
+ section, key = section_key.split(".", 1)
243
+ if section in override_order:
244
+ section_items_dict[section][key] = val
245
+
246
+ # Now that we a dict of items per section, convert to list of tuples
247
+ # Make sure we completely remove empty values again
248
+ section_items = {
249
+ name: [(k, v) for k, v in section_items_dict[name].items() if v]
250
+ for name in override_order
251
+ }
252
+
253
+ # Yield each group in their override order
254
+ for section in override_order:
255
+ yield from section_items[section]
256
+
257
+ def _update_defaults(self, defaults: dict[str, Any]) -> dict[str, Any]:
258
+ """Updates the given defaults with values from the config files and
259
+ the environ. Does a little special handling for certain types of
260
+ options (lists)."""
261
+
262
+ # Accumulate complex default state.
263
+ self.values = optparse.Values(self.defaults)
264
+ late_eval = set()
265
+ # Then set the options with those values
266
+ for key, val in self._get_ordered_configuration_items():
267
+ # '--' because configuration supports only long names
268
+ option = self.get_option("--" + key)
269
+
270
+ # Ignore options not present in this parser. E.g. non-globals put
271
+ # in [global] by users that want them to apply to all applicable
272
+ # commands.
273
+ if option is None:
274
+ continue
275
+
276
+ assert option.dest is not None
277
+
278
+ if option.action in ("store_true", "store_false"):
279
+ try:
280
+ val = strtobool(val)
281
+ except ValueError:
282
+ self.error(
283
+ f"{val} is not a valid value for {key} option, "
284
+ "please specify a boolean value like yes/no, "
285
+ "true/false or 1/0 instead."
286
+ )
287
+ elif option.action == "count":
288
+ with suppress(ValueError):
289
+ val = strtobool(val)
290
+ with suppress(ValueError):
291
+ val = int(val)
292
+ if not isinstance(val, int) or val < 0:
293
+ self.error(
294
+ f"{val} is not a valid value for {key} option, "
295
+ "please instead specify either a non-negative integer "
296
+ "or a boolean value like yes/no or false/true "
297
+ "which is equivalent to 1/0."
298
+ )
299
+ elif option.action == "append":
300
+ val = val.split()
301
+ val = [self.check_default(option, key, v) for v in val]
302
+ elif option.action == "callback":
303
+ assert option.callback is not None
304
+ late_eval.add(option.dest)
305
+ opt_str = option.get_opt_string()
306
+ val = option.convert_value(opt_str, val)
307
+ # From take_action
308
+ args = option.callback_args or ()
309
+ kwargs = option.callback_kwargs or {}
310
+ option.callback(option, opt_str, val, self, *args, **kwargs)
311
+ else:
312
+ val = self.check_default(option, key, val)
313
+
314
+ defaults[option.dest] = val
315
+
316
+ for key in late_eval:
317
+ defaults[key] = getattr(self.values, key)
318
+ self.values = None
319
+ return defaults
320
+
321
+ def get_default_values(self) -> optparse.Values:
322
+ """Overriding to make updating the defaults after instantiation of
323
+ the option parser possible, _update_defaults() does the dirty work."""
324
+ if not self.process_default_values:
325
+ # Old, pre-Optik 1.5 behaviour.
326
+ return optparse.Values(self.defaults)
327
+
328
+ # Load the configuration, or error out in case of an error
329
+ try:
330
+ self.config.load()
331
+ except ConfigurationError as err:
332
+ self.exit(UNKNOWN_ERROR, str(err))
333
+
334
+ defaults = self._update_defaults(self.defaults.copy()) # ours
335
+ for option in self._get_all_options():
336
+ assert option.dest is not None
337
+ default = defaults.get(option.dest)
338
+ if isinstance(default, str):
339
+ opt_str = option.get_opt_string()
340
+ defaults[option.dest] = option.check_value(opt_str, default)
341
+ return optparse.Values(defaults)
342
+
343
+ def error(self, msg: str) -> NoReturn:
344
+ self.print_usage(sys.stderr)
345
+ self.exit(UNKNOWN_ERROR, f"{msg}\n")
346
+
347
+ def print_help(self, file: Any = None) -> None:
348
+ # This is unfortunate but necessary since arguments may have not been
349
+ # parsed yet at this point, so detect --no-color manually.
350
+ no_color = (
351
+ "--no-color" in sys.argv
352
+ or bool(strtobool(os.environ.get("PIP_NO_COLOR", "no") or "no"))
353
+ or "NO_COLOR" in os.environ
354
+ )
355
+ console = PipConsole(
356
+ theme=Theme(PrettyHelpFormatter.styles), no_color=no_color, file=file
357
+ )
358
+ console.print(self.format_help().rstrip(), highlight=False)
.venv/Lib/site-packages/pip/_internal/cli/progress_bars.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import functools
4
+ import sys
5
+ from collections.abc import Generator, Iterable, Iterator
6
+ from typing import TYPE_CHECKING, Callable, Literal, TypeVar
7
+
8
+ from pip._vendor.rich.progress import (
9
+ BarColumn,
10
+ DownloadColumn,
11
+ FileSizeColumn,
12
+ MofNCompleteColumn,
13
+ Progress,
14
+ ProgressColumn,
15
+ SpinnerColumn,
16
+ TextColumn,
17
+ TimeElapsedColumn,
18
+ TimeRemainingColumn,
19
+ TransferSpeedColumn,
20
+ )
21
+
22
+ from pip._internal.cli.spinners import RateLimiter
23
+ from pip._internal.utils.logging import get_console, get_indentation
24
+
25
+ if TYPE_CHECKING:
26
+ from pip._internal.req.req_install import InstallRequirement
27
+
28
+ T = TypeVar("T")
29
+ ProgressRenderer = Callable[[Iterable[T]], Iterator[T]]
30
+ BarType = Literal["on", "off", "raw"]
31
+
32
+
33
+ def _rich_download_progress_bar(
34
+ iterable: Iterable[bytes],
35
+ *,
36
+ bar_type: BarType,
37
+ size: int | None,
38
+ initial_progress: int | None = None,
39
+ ) -> Generator[bytes, None, None]:
40
+ assert bar_type == "on", "This should only be used in the default mode."
41
+
42
+ if not size:
43
+ total = float("inf")
44
+ columns: tuple[ProgressColumn, ...] = (
45
+ TextColumn("[progress.description]{task.description}"),
46
+ SpinnerColumn("line", speed=1.5),
47
+ FileSizeColumn(),
48
+ TransferSpeedColumn(),
49
+ TimeElapsedColumn(),
50
+ )
51
+ else:
52
+ total = size
53
+ columns = (
54
+ TextColumn("[progress.description]{task.description}"),
55
+ BarColumn(),
56
+ DownloadColumn(),
57
+ TransferSpeedColumn(),
58
+ TextColumn("{task.fields[time_description]}"),
59
+ TimeRemainingColumn(elapsed_when_finished=True),
60
+ )
61
+
62
+ progress = Progress(*columns, refresh_per_second=5)
63
+ task_id = progress.add_task(
64
+ " " * (get_indentation() + 2), total=total, time_description="eta"
65
+ )
66
+ if initial_progress is not None:
67
+ progress.update(task_id, advance=initial_progress)
68
+ with progress:
69
+ for chunk in iterable:
70
+ yield chunk
71
+ progress.update(task_id, advance=len(chunk))
72
+ progress.update(task_id, time_description="")
73
+
74
+
75
+ def _rich_install_progress_bar(
76
+ iterable: Iterable[InstallRequirement], *, total: int
77
+ ) -> Iterator[InstallRequirement]:
78
+ columns = (
79
+ TextColumn("{task.fields[indent]}"),
80
+ BarColumn(),
81
+ MofNCompleteColumn(),
82
+ TextColumn("{task.description}"),
83
+ )
84
+ console = get_console()
85
+
86
+ bar = Progress(*columns, refresh_per_second=6, console=console, transient=True)
87
+ # Hiding the progress bar at initialization forces a refresh cycle to occur
88
+ # until the bar appears, avoiding very short flashes.
89
+ task = bar.add_task("", total=total, indent=" " * get_indentation(), visible=False)
90
+ with bar:
91
+ for req in iterable:
92
+ bar.update(task, description=rf"\[{req.name}]", visible=True)
93
+ yield req
94
+ bar.advance(task)
95
+
96
+
97
+ def _raw_progress_bar(
98
+ iterable: Iterable[bytes],
99
+ *,
100
+ size: int | None,
101
+ initial_progress: int | None = None,
102
+ ) -> Generator[bytes, None, None]:
103
+ def write_progress(current: int, total: int) -> None:
104
+ sys.stdout.write(f"Progress {current} of {total}\n")
105
+ sys.stdout.flush()
106
+
107
+ current = initial_progress or 0
108
+ total = size or 0
109
+ rate_limiter = RateLimiter(0.25)
110
+
111
+ write_progress(current, total)
112
+ for chunk in iterable:
113
+ current += len(chunk)
114
+ if rate_limiter.ready() or current == total:
115
+ write_progress(current, total)
116
+ rate_limiter.reset()
117
+ yield chunk
118
+
119
+
120
+ def get_download_progress_renderer(
121
+ *, bar_type: BarType, size: int | None = None, initial_progress: int | None = None
122
+ ) -> ProgressRenderer[bytes]:
123
+ """Get an object that can be used to render the download progress.
124
+
125
+ Returns a callable, that takes an iterable to "wrap".
126
+ """
127
+ if bar_type == "on":
128
+ return functools.partial(
129
+ _rich_download_progress_bar,
130
+ bar_type=bar_type,
131
+ size=size,
132
+ initial_progress=initial_progress,
133
+ )
134
+ elif bar_type == "raw":
135
+ return functools.partial(
136
+ _raw_progress_bar,
137
+ size=size,
138
+ initial_progress=initial_progress,
139
+ )
140
+ else:
141
+ return iter # no-op, when passed an iterator
142
+
143
+
144
+ def get_install_progress_renderer(
145
+ *, bar_type: BarType, total: int
146
+ ) -> ProgressRenderer[InstallRequirement]:
147
+ """Get an object that can be used to render the install progress.
148
+ Returns a callable, that takes an iterable to "wrap".
149
+ """
150
+ if bar_type == "on":
151
+ return functools.partial(_rich_install_progress_bar, total=total)
152
+ else:
153
+ return iter
.venv/Lib/site-packages/pip/_internal/cli/req_command.py ADDED
@@ -0,0 +1,447 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Contains the RequirementCommand base class.
2
+
3
+ This class is in a separate module so the commands that do not always
4
+ need PackageFinder capability don't unnecessarily import the
5
+ PackageFinder machinery and all its vendored dependencies, etc.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import logging
11
+ import os
12
+ from functools import partial
13
+ from optparse import Values
14
+ from typing import Any, Callable, TypeVar
15
+
16
+ from pip._internal.build_env import (
17
+ BuildEnvironmentInstaller,
18
+ InprocessBuildEnvironmentInstaller,
19
+ SubprocessBuildEnvironmentInstaller,
20
+ )
21
+ from pip._internal.cache import WheelCache
22
+ from pip._internal.cli import cmdoptions
23
+ from pip._internal.cli.cmdoptions import make_target_python
24
+ from pip._internal.cli.index_command import IndexGroupCommand
25
+ from pip._internal.cli.index_command import SessionCommandMixin as SessionCommandMixin
26
+ from pip._internal.exceptions import (
27
+ CommandError,
28
+ PreviousBuildDirError,
29
+ UnsupportedPythonVersion,
30
+ )
31
+ from pip._internal.index.collector import LinkCollector
32
+ from pip._internal.index.package_finder import PackageFinder
33
+ from pip._internal.models.selection_prefs import SelectionPreferences
34
+ from pip._internal.models.target_python import TargetPython
35
+ from pip._internal.network.session import PipSession
36
+ from pip._internal.operations.build.build_tracker import BuildTracker
37
+ from pip._internal.operations.prepare import RequirementPreparer
38
+ from pip._internal.req.constructors import (
39
+ install_req_from_editable,
40
+ install_req_from_line,
41
+ install_req_from_parsed_requirement,
42
+ install_req_from_req_string,
43
+ )
44
+ from pip._internal.req.pep723 import PEP723Exception, pep723_metadata
45
+ from pip._internal.req.req_dependency_group import parse_dependency_groups
46
+ from pip._internal.req.req_file import parse_requirements
47
+ from pip._internal.req.req_install import InstallRequirement
48
+ from pip._internal.resolution.base import BaseResolver
49
+ from pip._internal.utils.packaging import check_requires_python
50
+ from pip._internal.utils.temp_dir import (
51
+ TempDirectory,
52
+ TempDirectoryTypeRegistry,
53
+ tempdir_kinds,
54
+ )
55
+
56
+ logger = logging.getLogger(__name__)
57
+
58
+
59
+ def should_ignore_regular_constraints(options: Values) -> bool:
60
+ """
61
+ Check if regular constraints should be ignored because
62
+ we are in a isolated build process and build constraints
63
+ feature is enabled but no build constraints were passed.
64
+ """
65
+
66
+ return os.environ.get("_PIP_IN_BUILD_IGNORE_CONSTRAINTS") == "1"
67
+
68
+
69
+ KEEPABLE_TEMPDIR_TYPES = [
70
+ tempdir_kinds.BUILD_ENV,
71
+ tempdir_kinds.EPHEM_WHEEL_CACHE,
72
+ tempdir_kinds.REQ_BUILD,
73
+ ]
74
+
75
+
76
+ _CommandT = TypeVar("_CommandT", bound="RequirementCommand")
77
+
78
+
79
+ def with_cleanup(
80
+ func: Callable[[_CommandT, Values, list[str]], int],
81
+ ) -> Callable[[_CommandT, Values, list[str]], int]:
82
+ """Decorator for common logic related to managing temporary
83
+ directories.
84
+ """
85
+
86
+ def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None:
87
+ for t in KEEPABLE_TEMPDIR_TYPES:
88
+ registry.set_delete(t, False)
89
+
90
+ def wrapper(self: _CommandT, options: Values, args: list[str]) -> int:
91
+ assert self.tempdir_registry is not None
92
+ if options.no_clean:
93
+ configure_tempdir_registry(self.tempdir_registry)
94
+
95
+ try:
96
+ return func(self, options, args)
97
+ except PreviousBuildDirError:
98
+ # This kind of conflict can occur when the user passes an explicit
99
+ # build directory with a pre-existing folder. In that case we do
100
+ # not want to accidentally remove it.
101
+ configure_tempdir_registry(self.tempdir_registry)
102
+ raise
103
+
104
+ return wrapper
105
+
106
+
107
+ def parse_constraint_files(
108
+ constraint_files: list[str],
109
+ finder: PackageFinder,
110
+ options: Values,
111
+ session: PipSession,
112
+ ) -> list[InstallRequirement]:
113
+ requirements = []
114
+ for filename in constraint_files:
115
+ for parsed_req in parse_requirements(
116
+ filename,
117
+ constraint=True,
118
+ finder=finder,
119
+ options=options,
120
+ session=session,
121
+ ):
122
+ req_to_add = install_req_from_parsed_requirement(
123
+ parsed_req,
124
+ isolated=options.isolated_mode,
125
+ user_supplied=False,
126
+ )
127
+ requirements.append(req_to_add)
128
+
129
+ return requirements
130
+
131
+
132
+ class RequirementCommand(IndexGroupCommand):
133
+ def __init__(self, *args: Any, **kw: Any) -> None:
134
+ super().__init__(*args, **kw)
135
+
136
+ self.cmd_opts.add_option(cmdoptions.dependency_groups())
137
+ self.cmd_opts.add_option(cmdoptions.no_clean())
138
+
139
+ @staticmethod
140
+ def determine_resolver_variant(options: Values) -> str:
141
+ """Determines which resolver should be used, based on the given options."""
142
+ if "legacy-resolver" in options.deprecated_features_enabled:
143
+ return "legacy"
144
+
145
+ return "resolvelib"
146
+
147
+ @classmethod
148
+ def make_requirement_preparer(
149
+ cls,
150
+ temp_build_dir: TempDirectory,
151
+ options: Values,
152
+ build_tracker: BuildTracker,
153
+ session: PipSession,
154
+ finder: PackageFinder,
155
+ use_user_site: bool,
156
+ download_dir: str | None = None,
157
+ verbosity: int = 0,
158
+ ) -> RequirementPreparer:
159
+ """
160
+ Create a RequirementPreparer instance for the given parameters.
161
+ """
162
+ temp_build_dir_path = temp_build_dir.path
163
+ assert temp_build_dir_path is not None
164
+ legacy_resolver = False
165
+
166
+ resolver_variant = cls.determine_resolver_variant(options)
167
+ if resolver_variant == "resolvelib":
168
+ lazy_wheel = "fast-deps" in options.features_enabled
169
+ if lazy_wheel:
170
+ logger.warning(
171
+ "pip is using lazily downloaded wheels using HTTP "
172
+ "range requests to obtain dependency information. "
173
+ "This experimental feature is enabled through "
174
+ "--use-feature=fast-deps and it is not ready for "
175
+ "production."
176
+ )
177
+ else:
178
+ legacy_resolver = True
179
+ lazy_wheel = False
180
+ if "fast-deps" in options.features_enabled:
181
+ logger.warning(
182
+ "fast-deps has no effect when used with the legacy resolver."
183
+ )
184
+
185
+ # Handle build constraints
186
+ build_constraints = getattr(options, "build_constraints", [])
187
+ build_constraint_feature_enabled = (
188
+ "build-constraint" in options.features_enabled
189
+ )
190
+
191
+ env_installer: BuildEnvironmentInstaller
192
+ if "inprocess-build-deps" in options.features_enabled:
193
+ build_constraint_reqs = parse_constraint_files(
194
+ build_constraints, finder, options, session
195
+ )
196
+ env_installer = InprocessBuildEnvironmentInstaller(
197
+ finder=finder,
198
+ build_tracker=build_tracker,
199
+ build_constraints=build_constraint_reqs,
200
+ verbosity=verbosity,
201
+ wheel_cache=WheelCache(options.cache_dir),
202
+ )
203
+ else:
204
+ env_installer = SubprocessBuildEnvironmentInstaller(
205
+ finder,
206
+ build_constraints=build_constraints,
207
+ build_constraint_feature_enabled=build_constraint_feature_enabled,
208
+ )
209
+
210
+ return RequirementPreparer(
211
+ build_dir=temp_build_dir_path,
212
+ src_dir=options.src_dir,
213
+ download_dir=download_dir,
214
+ build_isolation=options.build_isolation,
215
+ build_isolation_installer=env_installer,
216
+ check_build_deps=options.check_build_deps,
217
+ build_tracker=build_tracker,
218
+ session=session,
219
+ progress_bar=options.progress_bar,
220
+ finder=finder,
221
+ require_hashes=options.require_hashes,
222
+ use_user_site=use_user_site,
223
+ lazy_wheel=lazy_wheel,
224
+ verbosity=verbosity,
225
+ legacy_resolver=legacy_resolver,
226
+ )
227
+
228
+ @classmethod
229
+ def make_resolver(
230
+ cls,
231
+ preparer: RequirementPreparer,
232
+ finder: PackageFinder,
233
+ options: Values,
234
+ wheel_cache: WheelCache | None = None,
235
+ use_user_site: bool = False,
236
+ ignore_installed: bool = True,
237
+ ignore_requires_python: bool = False,
238
+ force_reinstall: bool = False,
239
+ upgrade_strategy: str = "to-satisfy-only",
240
+ py_version_info: tuple[int, ...] | None = None,
241
+ ) -> BaseResolver:
242
+ """
243
+ Create a Resolver instance for the given parameters.
244
+ """
245
+ make_install_req = partial(
246
+ install_req_from_req_string,
247
+ isolated=options.isolated_mode,
248
+ )
249
+ resolver_variant = cls.determine_resolver_variant(options)
250
+ # The long import name and duplicated invocation is needed to convince
251
+ # Mypy into correctly typechecking. Otherwise it would complain the
252
+ # "Resolver" class being redefined.
253
+ if resolver_variant == "resolvelib":
254
+ import pip._internal.resolution.resolvelib.resolver
255
+
256
+ return pip._internal.resolution.resolvelib.resolver.Resolver(
257
+ preparer=preparer,
258
+ finder=finder,
259
+ wheel_cache=wheel_cache,
260
+ make_install_req=make_install_req,
261
+ use_user_site=use_user_site,
262
+ ignore_dependencies=options.ignore_dependencies,
263
+ ignore_installed=ignore_installed,
264
+ ignore_requires_python=ignore_requires_python,
265
+ force_reinstall=force_reinstall,
266
+ upgrade_strategy=upgrade_strategy,
267
+ py_version_info=py_version_info,
268
+ )
269
+ import pip._internal.resolution.legacy.resolver
270
+
271
+ return pip._internal.resolution.legacy.resolver.Resolver(
272
+ preparer=preparer,
273
+ finder=finder,
274
+ wheel_cache=wheel_cache,
275
+ make_install_req=make_install_req,
276
+ use_user_site=use_user_site,
277
+ ignore_dependencies=options.ignore_dependencies,
278
+ ignore_installed=ignore_installed,
279
+ ignore_requires_python=ignore_requires_python,
280
+ force_reinstall=force_reinstall,
281
+ upgrade_strategy=upgrade_strategy,
282
+ py_version_info=py_version_info,
283
+ )
284
+
285
+ def get_requirements(
286
+ self,
287
+ args: list[str],
288
+ options: Values,
289
+ finder: PackageFinder,
290
+ session: PipSession,
291
+ ) -> list[InstallRequirement]:
292
+ """
293
+ Parse command-line arguments into the corresponding requirements.
294
+ """
295
+ requirements: list[InstallRequirement] = []
296
+
297
+ if not should_ignore_regular_constraints(options):
298
+ constraints = parse_constraint_files(
299
+ options.constraints, finder, options, session
300
+ )
301
+ requirements.extend(constraints)
302
+
303
+ for req in args:
304
+ if not req.strip():
305
+ continue
306
+ req_to_add = install_req_from_line(
307
+ req,
308
+ comes_from=None,
309
+ isolated=options.isolated_mode,
310
+ user_supplied=True,
311
+ config_settings=getattr(options, "config_settings", None),
312
+ )
313
+ requirements.append(req_to_add)
314
+
315
+ if options.dependency_groups:
316
+ for req in parse_dependency_groups(options.dependency_groups):
317
+ req_to_add = install_req_from_req_string(
318
+ req,
319
+ isolated=options.isolated_mode,
320
+ user_supplied=True,
321
+ )
322
+ requirements.append(req_to_add)
323
+
324
+ for req in options.editables:
325
+ req_to_add = install_req_from_editable(
326
+ req,
327
+ user_supplied=True,
328
+ isolated=options.isolated_mode,
329
+ config_settings=getattr(options, "config_settings", None),
330
+ )
331
+ requirements.append(req_to_add)
332
+
333
+ # NOTE: options.require_hashes may be set if --require-hashes is True
334
+ for filename in options.requirements:
335
+ for parsed_req in parse_requirements(
336
+ filename, finder=finder, options=options, session=session
337
+ ):
338
+ req_to_add = install_req_from_parsed_requirement(
339
+ parsed_req,
340
+ isolated=options.isolated_mode,
341
+ user_supplied=True,
342
+ config_settings=(
343
+ parsed_req.options.get("config_settings")
344
+ if parsed_req.options
345
+ else None
346
+ ),
347
+ )
348
+ requirements.append(req_to_add)
349
+
350
+ if options.requirements_from_scripts:
351
+ if len(options.requirements_from_scripts) > 1:
352
+ raise CommandError("--requirements-from-script can only be given once")
353
+
354
+ script = options.requirements_from_scripts[0]
355
+ try:
356
+ script_metadata = pep723_metadata(script)
357
+ except PEP723Exception as exc:
358
+ raise CommandError(exc.msg)
359
+
360
+ script_requires_python = script_metadata.get("requires-python", "")
361
+
362
+ if script_requires_python and not options.ignore_requires_python:
363
+ target_python = make_target_python(options)
364
+
365
+ if not check_requires_python(
366
+ requires_python=script_requires_python,
367
+ version_info=target_python.py_version_info,
368
+ ):
369
+ raise UnsupportedPythonVersion(
370
+ f"Script {script!r} requires a different Python: "
371
+ f"{target_python.py_version} not in {script_requires_python!r}"
372
+ )
373
+
374
+ for req in script_metadata.get("dependencies", []):
375
+ req_to_add = install_req_from_req_string(
376
+ req,
377
+ isolated=options.isolated_mode,
378
+ user_supplied=True,
379
+ )
380
+ requirements.append(req_to_add)
381
+
382
+ # If any requirement has hash options, enable hash checking.
383
+ if any(req.has_hash_options for req in requirements):
384
+ options.require_hashes = True
385
+
386
+ if not (
387
+ args
388
+ or options.editables
389
+ or options.requirements
390
+ or options.dependency_groups
391
+ or options.requirements_from_scripts
392
+ ):
393
+ opts = {"name": self.name}
394
+ if options.find_links:
395
+ raise CommandError(
396
+ "You must give at least one requirement to {name} "
397
+ '(maybe you meant "pip {name} {links}"?)'.format(
398
+ **dict(opts, links=" ".join(options.find_links))
399
+ )
400
+ )
401
+ else:
402
+ raise CommandError(
403
+ "You must give at least one requirement to {name} "
404
+ '(see "pip help {name}")'.format(**opts)
405
+ )
406
+
407
+ return requirements
408
+
409
+ @staticmethod
410
+ def trace_basic_info(finder: PackageFinder) -> None:
411
+ """
412
+ Trace basic information about the provided objects.
413
+ """
414
+ # Display where finder is looking for packages
415
+ search_scope = finder.search_scope
416
+ locations = search_scope.get_formatted_locations()
417
+ if locations:
418
+ logger.info(locations)
419
+
420
+ def _build_package_finder(
421
+ self,
422
+ options: Values,
423
+ session: PipSession,
424
+ target_python: TargetPython | None = None,
425
+ ignore_requires_python: bool | None = None,
426
+ ) -> PackageFinder:
427
+ """
428
+ Create a package finder appropriate to this requirement command.
429
+
430
+ :param ignore_requires_python: Whether to ignore incompatible
431
+ "Requires-Python" values in links. Defaults to False.
432
+ """
433
+ link_collector = LinkCollector.create(session, options=options)
434
+ selection_prefs = SelectionPreferences(
435
+ allow_yanked=True,
436
+ format_control=options.format_control,
437
+ release_control=options.release_control,
438
+ prefer_binary=options.prefer_binary,
439
+ ignore_requires_python=ignore_requires_python,
440
+ )
441
+
442
+ return PackageFinder.create(
443
+ link_collector=link_collector,
444
+ selection_prefs=selection_prefs,
445
+ target_python=target_python,
446
+ uploaded_prior_to=options.uploaded_prior_to,
447
+ )
.venv/Lib/site-packages/pip/_internal/cli/spinners.py ADDED
@@ -0,0 +1,235 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import contextlib
4
+ import itertools
5
+ import logging
6
+ import sys
7
+ import time
8
+ from collections.abc import Generator
9
+ from typing import IO, Final
10
+
11
+ from pip._vendor.rich.console import (
12
+ Console,
13
+ ConsoleOptions,
14
+ RenderableType,
15
+ RenderResult,
16
+ )
17
+ from pip._vendor.rich.live import Live
18
+ from pip._vendor.rich.measure import Measurement
19
+ from pip._vendor.rich.text import Text
20
+
21
+ from pip._internal.utils.compat import WINDOWS
22
+ from pip._internal.utils.logging import get_console, get_indentation
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+ SPINNER_CHARS: Final = r"-\|/"
27
+ SPINS_PER_SECOND: Final = 8
28
+
29
+
30
+ class SpinnerInterface:
31
+ def spin(self) -> None:
32
+ raise NotImplementedError()
33
+
34
+ def finish(self, final_status: str) -> None:
35
+ raise NotImplementedError()
36
+
37
+
38
+ class InteractiveSpinner(SpinnerInterface):
39
+ def __init__(
40
+ self,
41
+ message: str,
42
+ file: IO[str] | None = None,
43
+ spin_chars: str = SPINNER_CHARS,
44
+ # Empirically, 8 updates/second looks nice
45
+ min_update_interval_seconds: float = 1 / SPINS_PER_SECOND,
46
+ ):
47
+ self._message = message
48
+ if file is None:
49
+ file = sys.stdout
50
+ self._file = file
51
+ self._rate_limiter = RateLimiter(min_update_interval_seconds)
52
+ self._finished = False
53
+
54
+ self._spin_cycle = itertools.cycle(spin_chars)
55
+
56
+ self._file.write(" " * get_indentation() + self._message + " ... ")
57
+ self._width = 0
58
+
59
+ def _write(self, status: str) -> None:
60
+ assert not self._finished
61
+ # Erase what we wrote before by backspacing to the beginning, writing
62
+ # spaces to overwrite the old text, and then backspacing again
63
+ backup = "\b" * self._width
64
+ self._file.write(backup + " " * self._width + backup)
65
+ # Now we have a blank slate to add our status
66
+ self._file.write(status)
67
+ self._width = len(status)
68
+ self._file.flush()
69
+ self._rate_limiter.reset()
70
+
71
+ def spin(self) -> None:
72
+ if self._finished:
73
+ return
74
+ if not self._rate_limiter.ready():
75
+ return
76
+ self._write(next(self._spin_cycle))
77
+
78
+ def finish(self, final_status: str) -> None:
79
+ if self._finished:
80
+ return
81
+ self._write(final_status)
82
+ self._file.write("\n")
83
+ self._file.flush()
84
+ self._finished = True
85
+
86
+
87
+ # Used for dumb terminals, non-interactive installs (no tty), etc.
88
+ # We still print updates occasionally (once every 60 seconds by default) to
89
+ # act as a keep-alive for systems like Travis-CI that take lack-of-output as
90
+ # an indication that a task has frozen.
91
+ class NonInteractiveSpinner(SpinnerInterface):
92
+ def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None:
93
+ self._message = message
94
+ self._finished = False
95
+ self._rate_limiter = RateLimiter(min_update_interval_seconds)
96
+ self._update("started")
97
+
98
+ def _update(self, status: str) -> None:
99
+ assert not self._finished
100
+ self._rate_limiter.reset()
101
+ logger.info("%s: %s", self._message, status)
102
+
103
+ def spin(self) -> None:
104
+ if self._finished:
105
+ return
106
+ if not self._rate_limiter.ready():
107
+ return
108
+ self._update("still running...")
109
+
110
+ def finish(self, final_status: str) -> None:
111
+ if self._finished:
112
+ return
113
+ self._update(f"finished with status '{final_status}'")
114
+ self._finished = True
115
+
116
+
117
+ class RateLimiter:
118
+ def __init__(self, min_update_interval_seconds: float) -> None:
119
+ self._min_update_interval_seconds = min_update_interval_seconds
120
+ self._last_update: float = 0
121
+
122
+ def ready(self) -> bool:
123
+ now = time.time()
124
+ delta = now - self._last_update
125
+ return delta >= self._min_update_interval_seconds
126
+
127
+ def reset(self) -> None:
128
+ self._last_update = time.time()
129
+
130
+
131
+ @contextlib.contextmanager
132
+ def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]:
133
+ # Interactive spinner goes directly to sys.stdout rather than being routed
134
+ # through the logging system, but it acts like it has level INFO,
135
+ # i.e. it's only displayed if we're at level INFO or better.
136
+ # Non-interactive spinner goes through the logging system, so it is always
137
+ # in sync with logging configuration.
138
+ if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO:
139
+ spinner: SpinnerInterface = InteractiveSpinner(message)
140
+ else:
141
+ spinner = NonInteractiveSpinner(message)
142
+ try:
143
+ with hidden_cursor(sys.stdout):
144
+ yield spinner
145
+ except KeyboardInterrupt:
146
+ spinner.finish("canceled")
147
+ raise
148
+ except Exception:
149
+ spinner.finish("error")
150
+ raise
151
+ else:
152
+ spinner.finish("done")
153
+
154
+
155
+ class _PipRichSpinner:
156
+ """
157
+ Custom rich spinner that matches the style of the legacy spinners.
158
+
159
+ (*) Updates will be handled in a background thread by a rich live panel
160
+ which will call render() automatically at the appropriate time.
161
+ """
162
+
163
+ def __init__(self, label: str) -> None:
164
+ self.label = label
165
+ self._spin_cycle = itertools.cycle(SPINNER_CHARS)
166
+ self._spinner_text = ""
167
+ self._finished = False
168
+ self._indent = get_indentation() * " "
169
+
170
+ def __rich_console__(
171
+ self, console: Console, options: ConsoleOptions
172
+ ) -> RenderResult:
173
+ yield self.render()
174
+
175
+ def __rich_measure__(
176
+ self, console: Console, options: ConsoleOptions
177
+ ) -> Measurement:
178
+ text = self.render()
179
+ return Measurement.get(console, options, text)
180
+
181
+ def render(self) -> RenderableType:
182
+ if not self._finished:
183
+ self._spinner_text = next(self._spin_cycle)
184
+
185
+ return Text.assemble(self._indent, self.label, " ... ", self._spinner_text)
186
+
187
+ def finish(self, status: str) -> None:
188
+ """Stop spinning and set a final status message."""
189
+ self._spinner_text = status
190
+ self._finished = True
191
+
192
+
193
+ @contextlib.contextmanager
194
+ def open_rich_spinner(label: str, console: Console | None = None) -> Generator[None]:
195
+ if not logger.isEnabledFor(logging.INFO):
196
+ # Don't show spinner if --quiet is given.
197
+ yield
198
+ return
199
+
200
+ console = console or get_console()
201
+ spinner = _PipRichSpinner(label)
202
+ with Live(spinner, refresh_per_second=SPINS_PER_SECOND, console=console):
203
+ try:
204
+ yield
205
+ except KeyboardInterrupt:
206
+ spinner.finish("canceled")
207
+ raise
208
+ except Exception:
209
+ spinner.finish("error")
210
+ raise
211
+ else:
212
+ spinner.finish("done")
213
+
214
+
215
+ HIDE_CURSOR = "\x1b[?25l"
216
+ SHOW_CURSOR = "\x1b[?25h"
217
+
218
+
219
+ @contextlib.contextmanager
220
+ def hidden_cursor(file: IO[str]) -> Generator[None, None, None]:
221
+ # The Windows terminal does not support the hide/show cursor ANSI codes,
222
+ # even via colorama. So don't even try.
223
+ if WINDOWS:
224
+ yield
225
+ # We don't want to clutter the output with control characters if we're
226
+ # writing to a file, or if the user is running with --quiet.
227
+ # See https://github.com/pypa/pip/issues/3418
228
+ elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
229
+ yield
230
+ else:
231
+ file.write(HIDE_CURSOR)
232
+ try:
233
+ yield
234
+ finally:
235
+ file.write(SHOW_CURSOR)