diff --git a/.venv/Lib/site-packages/__pycache__/decorator.cpython-311.pyc b/.venv/Lib/site-packages/__pycache__/decorator.cpython-311.pyc
index fb74fb10..49791b33 100644
Binary files a/.venv/Lib/site-packages/__pycache__/decorator.cpython-311.pyc and b/.venv/Lib/site-packages/__pycache__/decorator.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/anyio/__pycache__/__init__.cpython-311.pyc
index fbbfcc2b..af2c7c4d 100644
Binary files a/.venv/Lib/site-packages/anyio/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc b/.venv/Lib/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc
index df294b9d..23dca6ff 100644
Binary files a/.venv/Lib/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc b/.venv/Lib/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc
index 646940fa..72dc33fb 100644
Binary files a/.venv/Lib/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc b/.venv/Lib/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc
index e69ecf73..f28751de 100644
Binary files a/.venv/Lib/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc
index f2f94f59..2d18a89f 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc
index 46d00a4b..490996f8 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc
index 1ff90773..bcfbe687 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc
index 1c7af729..76d56a4f 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc
index 5682dfef..6c916fdc 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc
index bf442631..8f912cdb 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_sockets.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_sockets.cpython-311.pyc
index 89c36402..18ed5c1e 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_sockets.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_sockets.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc
index 4579cc82..c498ac43 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc
index 48d4bc56..8da08cb5 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc
index 2b0e0125..63fbd79f 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc
index 9fd9595c..170d6ea3 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc
index 31861e41..4ad8bb66 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc b/.venv/Lib/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc
index 4bb96ac9..cb02931a 100644
Binary files a/.venv/Lib/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc
index aaffc9b0..c9b78aa4 100644
Binary files a/.venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc b/.venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc
index 7fe09d73..0b91b71b 100644
Binary files a/.venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc b/.venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc
index 766cd0a7..d0d82f29 100644
Binary files a/.venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc b/.venv/Lib/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc
index 09554280..c718c0bd 100644
Binary files a/.venv/Lib/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/abc/__pycache__/_streams.cpython-311.pyc b/.venv/Lib/site-packages/anyio/abc/__pycache__/_streams.cpython-311.pyc
index 268256e0..e7b913a9 100644
Binary files a/.venv/Lib/site-packages/anyio/abc/__pycache__/_streams.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/abc/__pycache__/_streams.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc b/.venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc
index 242fb506..db0e32d4 100644
Binary files a/.venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc b/.venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc
index e1f0801d..3023392c 100644
Binary files a/.venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc b/.venv/Lib/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc
index c44b44a4..0f7bf8a9 100644
Binary files a/.venv/Lib/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc
index 5f8bf477..74bc8689 100644
Binary files a/.venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc b/.venv/Lib/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc
index 4189abe9..11599d7f 100644
Binary files a/.venv/Lib/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc b/.venv/Lib/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc
index ec7ddef0..79371166 100644
Binary files a/.venv/Lib/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc b/.venv/Lib/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc
index e003eeb5..7983b81f 100644
Binary files a/.venv/Lib/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc and b/.venv/Lib/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/distro/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/distro/__pycache__/__init__.cpython-311.pyc
index f1d86d1e..f26d654b 100644
Binary files a/.venv/Lib/site-packages/distro/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/distro/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/distro/__pycache__/distro.cpython-311.pyc b/.venv/Lib/site-packages/distro/__pycache__/distro.cpython-311.pyc
index 4565179e..7f98088e 100644
Binary files a/.venv/Lib/site-packages/distro/__pycache__/distro.cpython-311.pyc and b/.venv/Lib/site-packages/distro/__pycache__/distro.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/__init__.cpython-311.pyc
index 9388f5b9..b7d48021 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_abnf.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_abnf.cpython-311.pyc
index 01379bf8..5b5a4b92 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_abnf.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_abnf.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_connection.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_connection.cpython-311.pyc
index b55c2618..cf4d5f7e 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_connection.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_connection.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_events.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_events.cpython-311.pyc
index 9de58f5d..a71eb6d5 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_events.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_events.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_headers.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_headers.cpython-311.pyc
index 561385d4..85c399c3 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_headers.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_headers.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_readers.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_readers.cpython-311.pyc
index fc6e5931..a9db6bd1 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_readers.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_readers.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc
index d6733e4c..08cb8252 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_state.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_state.cpython-311.pyc
index f70c4d50..1972cd8d 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_state.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_state.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_util.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_util.cpython-311.pyc
index a995b866..690644a0 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_util.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_util.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_version.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_version.cpython-311.pyc
index 0eed353e..125b3856 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_version.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_version.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/h11/__pycache__/_writers.cpython-311.pyc b/.venv/Lib/site-packages/h11/__pycache__/_writers.cpython-311.pyc
index e228e44e..296e1fdd 100644
Binary files a/.venv/Lib/site-packages/h11/__pycache__/_writers.cpython-311.pyc and b/.venv/Lib/site-packages/h11/__pycache__/_writers.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc
index b6f729d4..f2e793ef 100644
Binary files a/.venv/Lib/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/__pycache__/_api.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/__pycache__/_api.cpython-311.pyc
index 99096f3c..7c46da31 100644
Binary files a/.venv/Lib/site-packages/httpcore/__pycache__/_api.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/__pycache__/_api.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc
index 3ad25250..fd41c631 100644
Binary files a/.venv/Lib/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/__pycache__/_models.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/__pycache__/_models.cpython-311.pyc
index fff20bee..828b4f66 100644
Binary files a/.venv/Lib/site-packages/httpcore/__pycache__/_models.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/__pycache__/_models.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/__pycache__/_ssl.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/__pycache__/_ssl.cpython-311.pyc
index ff4a467a..c7b6a011 100644
Binary files a/.venv/Lib/site-packages/httpcore/__pycache__/_ssl.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/__pycache__/_ssl.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/__pycache__/_synchronization.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/__pycache__/_synchronization.cpython-311.pyc
index 88ac3117..bfda9f48 100644
Binary files a/.venv/Lib/site-packages/httpcore/__pycache__/_synchronization.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/__pycache__/_synchronization.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/__pycache__/_trace.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/__pycache__/_trace.cpython-311.pyc
index 2208572d..e7045d3e 100644
Binary files a/.venv/Lib/site-packages/httpcore/__pycache__/_trace.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/__pycache__/_trace.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/__pycache__/_utils.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/__pycache__/_utils.cpython-311.pyc
index 6c831dc3..ecea5c19 100644
Binary files a/.venv/Lib/site-packages/httpcore/__pycache__/_utils.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/__pycache__/_utils.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_async/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_async/__pycache__/__init__.cpython-311.pyc
index 22243f83..9466ffb0 100644
Binary files a/.venv/Lib/site-packages/httpcore/_async/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_async/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_async/__pycache__/connection.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_async/__pycache__/connection.cpython-311.pyc
index 6c36a249..f71dc7bb 100644
Binary files a/.venv/Lib/site-packages/httpcore/_async/__pycache__/connection.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_async/__pycache__/connection.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-311.pyc
index 9abc2439..e916836a 100644
Binary files a/.venv/Lib/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_async/__pycache__/http11.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_async/__pycache__/http11.cpython-311.pyc
index 1abea181..a9b32429 100644
Binary files a/.venv/Lib/site-packages/httpcore/_async/__pycache__/http11.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_async/__pycache__/http11.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_async/__pycache__/http2.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_async/__pycache__/http2.cpython-311.pyc
index b90fd274..d9e1505d 100644
Binary files a/.venv/Lib/site-packages/httpcore/_async/__pycache__/http2.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_async/__pycache__/http2.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-311.pyc
index 2f2f1a9d..f2eac504 100644
Binary files a/.venv/Lib/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_async/__pycache__/interfaces.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_async/__pycache__/interfaces.cpython-311.pyc
index 3766a582..2491c6b1 100644
Binary files a/.venv/Lib/site-packages/httpcore/_async/__pycache__/interfaces.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_async/__pycache__/interfaces.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc
index f2130057..31ccbb1e 100644
Binary files a/.venv/Lib/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/__init__.cpython-311.pyc
index 8adb95bd..9d584723 100644
Binary files a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/anyio.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/anyio.cpython-311.pyc
index 48aeed41..1a307201 100644
Binary files a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/anyio.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/anyio.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/auto.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/auto.cpython-311.pyc
index 55c81429..d1e493b5 100644
Binary files a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/auto.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/auto.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/base.cpython-311.pyc
index 0e303a85..2d2ef021 100644
Binary files a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/base.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/mock.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/mock.cpython-311.pyc
index fb8479ed..cf6285bf 100644
Binary files a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/mock.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/mock.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/sync.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/sync.cpython-311.pyc
index 19596186..51f020e9 100644
Binary files a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/sync.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/sync.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/trio.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/trio.cpython-311.pyc
index 8cb2c369..bec327ff 100644
Binary files a/.venv/Lib/site-packages/httpcore/_backends/__pycache__/trio.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_backends/__pycache__/trio.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/__init__.cpython-311.pyc
index 03c2e4a6..b14fcb3a 100644
Binary files a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/connection.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/connection.cpython-311.pyc
index 8d8e13a7..ebd1f7f1 100644
Binary files a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/connection.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/connection.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc
index 2c53bbee..6d8dd955 100644
Binary files a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http11.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http11.cpython-311.pyc
index f5f2ddd1..13d337cd 100644
Binary files a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http11.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http11.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http2.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http2.cpython-311.pyc
index 4bbecad8..6941497a 100644
Binary files a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http2.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http2.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-311.pyc
index 03938b2c..52276ad9 100644
Binary files a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-311.pyc
index 0f94f00d..e1e5bf40 100644
Binary files a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc
index 3d275f9b..653cb4f9 100644
Binary files a/.venv/Lib/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/__init__.cpython-311.pyc
index 60e9c4d7..9cd651dd 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/__version__.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/__version__.cpython-311.pyc
index 5c978f9c..0e87c732 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/__version__.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/__version__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_api.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_api.cpython-311.pyc
index 02409b4c..b91ecc95 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_api.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_api.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_auth.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_auth.cpython-311.pyc
index 8f958586..764685c5 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_auth.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_auth.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_client.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_client.cpython-311.pyc
index 226b92a0..864e89a3 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_client.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_client.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_compat.cpython-311.pyc
index 4ec02c84..e0450acf 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_compat.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_config.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_config.cpython-311.pyc
index d0235b4e..593eae3b 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_config.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_config.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_content.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_content.cpython-311.pyc
index eb97b5d7..d5ba3004 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_content.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_content.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_decoders.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_decoders.cpython-311.pyc
index bee1333c..2acd542b 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_decoders.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_decoders.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_exceptions.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_exceptions.cpython-311.pyc
index c778b8fd..28d7b753 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_exceptions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_main.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_main.cpython-311.pyc
index aedf4bd6..f586a30a 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_main.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_main.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_models.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_models.cpython-311.pyc
index 85f245f5..7b25a6ab 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_models.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_models.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_multipart.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_multipart.cpython-311.pyc
index 8c2e07aa..e186eb7b 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_multipart.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_multipart.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_status_codes.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_status_codes.cpython-311.pyc
index 30c5c876..a6d8495f 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_status_codes.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_status_codes.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_types.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_types.cpython-311.pyc
index 919ea1c7..1fc7bf0b 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_types.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_types.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_urlparse.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_urlparse.cpython-311.pyc
index a6e550cb..a6c66be7 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_urlparse.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_urlparse.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_urls.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_urls.cpython-311.pyc
index 795c5ca4..0ac167dd 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_urls.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_urls.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/__pycache__/_utils.cpython-311.pyc b/.venv/Lib/site-packages/httpx/__pycache__/_utils.cpython-311.pyc
index e87e2d88..395da1c6 100644
Binary files a/.venv/Lib/site-packages/httpx/__pycache__/_utils.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/__pycache__/_utils.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/_transports/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/httpx/_transports/__pycache__/__init__.cpython-311.pyc
index b7aa8c8e..b5b06812 100644
Binary files a/.venv/Lib/site-packages/httpx/_transports/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/_transports/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/_transports/__pycache__/asgi.cpython-311.pyc b/.venv/Lib/site-packages/httpx/_transports/__pycache__/asgi.cpython-311.pyc
index 6ffbb6f7..542f8c9d 100644
Binary files a/.venv/Lib/site-packages/httpx/_transports/__pycache__/asgi.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/_transports/__pycache__/asgi.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/_transports/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/httpx/_transports/__pycache__/base.cpython-311.pyc
index 21fb5d91..4bce2d88 100644
Binary files a/.venv/Lib/site-packages/httpx/_transports/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/_transports/__pycache__/base.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/_transports/__pycache__/default.cpython-311.pyc b/.venv/Lib/site-packages/httpx/_transports/__pycache__/default.cpython-311.pyc
index a4ac2133..9898cec9 100644
Binary files a/.venv/Lib/site-packages/httpx/_transports/__pycache__/default.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/_transports/__pycache__/default.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/_transports/__pycache__/mock.cpython-311.pyc b/.venv/Lib/site-packages/httpx/_transports/__pycache__/mock.cpython-311.pyc
index 2b28e0cf..2fea9de2 100644
Binary files a/.venv/Lib/site-packages/httpx/_transports/__pycache__/mock.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/_transports/__pycache__/mock.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/httpx/_transports/__pycache__/wsgi.cpython-311.pyc b/.venv/Lib/site-packages/httpx/_transports/__pycache__/wsgi.cpython-311.pyc
index bdaa302a..337c820b 100644
Binary files a/.venv/Lib/site-packages/httpx/_transports/__pycache__/wsgi.cpython-311.pyc and b/.venv/Lib/site-packages/httpx/_transports/__pycache__/wsgi.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/imageio/__pycache__/__init__.cpython-311.pyc
index cbc4bad3..ca04726a 100644
Binary files a/.venv/Lib/site-packages/imageio/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/__pycache__/typing.cpython-311.pyc b/.venv/Lib/site-packages/imageio/__pycache__/typing.cpython-311.pyc
index 963d4314..673b8df3 100644
Binary files a/.venv/Lib/site-packages/imageio/__pycache__/typing.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/__pycache__/typing.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/__pycache__/v2.cpython-311.pyc b/.venv/Lib/site-packages/imageio/__pycache__/v2.cpython-311.pyc
index ebb004d3..2577a450 100644
Binary files a/.venv/Lib/site-packages/imageio/__pycache__/v2.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/__pycache__/v2.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/__pycache__/v3.cpython-311.pyc b/.venv/Lib/site-packages/imageio/__pycache__/v3.cpython-311.pyc
index a29c1a5e..e5f43643 100644
Binary files a/.venv/Lib/site-packages/imageio/__pycache__/v3.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/__pycache__/v3.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/config/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/imageio/config/__pycache__/__init__.cpython-311.pyc
index d9bf5803..50cc79f8 100644
Binary files a/.venv/Lib/site-packages/imageio/config/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/config/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/config/__pycache__/extensions.cpython-311.pyc b/.venv/Lib/site-packages/imageio/config/__pycache__/extensions.cpython-311.pyc
index 6ae7d583..d2e59bf4 100644
Binary files a/.venv/Lib/site-packages/imageio/config/__pycache__/extensions.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/config/__pycache__/extensions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/config/__pycache__/plugins.cpython-311.pyc b/.venv/Lib/site-packages/imageio/config/__pycache__/plugins.cpython-311.pyc
index 0bf4ceec..e61e65cd 100644
Binary files a/.venv/Lib/site-packages/imageio/config/__pycache__/plugins.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/config/__pycache__/plugins.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/__init__.cpython-311.pyc
index 046fe918..a1121630 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/fetching.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/fetching.cpython-311.pyc
index 8743c27b..723de5b5 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/fetching.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/fetching.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/findlib.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/findlib.cpython-311.pyc
index 7bf58d6d..28907dde 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/findlib.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/findlib.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/format.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/format.cpython-311.pyc
index bbf9fdcd..04fe22d4 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/format.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/format.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/imopen.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/imopen.cpython-311.pyc
index 90dc0116..64bd7de1 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/imopen.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/imopen.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/legacy_plugin_wrapper.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/legacy_plugin_wrapper.cpython-311.pyc
index 3bce24b0..90111cd4 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/legacy_plugin_wrapper.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/legacy_plugin_wrapper.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/request.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/request.cpython-311.pyc
index cdc43a14..00f47099 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/request.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/request.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/util.cpython-311.pyc
index 2364c512..cc50c47b 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/util.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/core/__pycache__/v3_plugin_api.cpython-311.pyc b/.venv/Lib/site-packages/imageio/core/__pycache__/v3_plugin_api.cpython-311.pyc
index 7865ff86..0a90d1ee 100644
Binary files a/.venv/Lib/site-packages/imageio/core/__pycache__/v3_plugin_api.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/core/__pycache__/v3_plugin_api.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/plugins/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/imageio/plugins/__pycache__/__init__.cpython-311.pyc
index 8bc2e26f..c42ecb72 100644
Binary files a/.venv/Lib/site-packages/imageio/plugins/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/plugins/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio/plugins/__pycache__/ffmpeg.cpython-311.pyc b/.venv/Lib/site-packages/imageio/plugins/__pycache__/ffmpeg.cpython-311.pyc
index 6b83e9a2..50594d5c 100644
Binary files a/.venv/Lib/site-packages/imageio/plugins/__pycache__/ffmpeg.cpython-311.pyc and b/.venv/Lib/site-packages/imageio/plugins/__pycache__/ffmpeg.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/__init__.cpython-311.pyc
index 929439de..2576568c 100644
Binary files a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_definitions.cpython-311.pyc b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_definitions.cpython-311.pyc
index 2744e748..aa54ec7b 100644
Binary files a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_definitions.cpython-311.pyc and b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_definitions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_io.cpython-311.pyc b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_io.cpython-311.pyc
index ddf8cfc1..77945c3e 100644
Binary files a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_io.cpython-311.pyc and b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_io.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_parsing.cpython-311.pyc b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_parsing.cpython-311.pyc
index f0d4a648..712f9bb1 100644
Binary files a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_parsing.cpython-311.pyc and b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_parsing.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_utils.cpython-311.pyc b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_utils.cpython-311.pyc
index 60e83f40..f90b4cb8 100644
Binary files a/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_utils.cpython-311.pyc and b/.venv/Lib/site-packages/imageio_ffmpeg/__pycache__/_utils.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/Clip.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/Clip.cpython-311.pyc
index 71d89623..3e9a50ca 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/Clip.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/Clip.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/__init__.cpython-311.pyc
index 7a7a8c47..8ca20927 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/compat.cpython-311.pyc
index 8f656fa3..d1eb8853 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/compat.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/config.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/config.cpython-311.pyc
index 020f9237..c8629cc8 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/config.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/config.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/config_defaults.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/config_defaults.cpython-311.pyc
index bd246a9f..9fc5e334 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/config_defaults.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/config_defaults.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/decorators.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/decorators.cpython-311.pyc
index e979021a..bf50f7a0 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/decorators.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/decorators.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/editor.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/editor.cpython-311.pyc
index d13282d8..aadc33e0 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/editor.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/editor.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/tools.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/tools.cpython-311.pyc
index 42c80fa7..e98fbdb8 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/tools.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/tools.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/__pycache__/version.cpython-311.pyc
index 62d9ac26..3abb5105 100644
Binary files a/.venv/Lib/site-packages/moviepy/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/__pycache__/version.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/__pycache__/AudioClip.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/__pycache__/AudioClip.cpython-311.pyc
index 391a86c8..80ebf123 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/__pycache__/AudioClip.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/__pycache__/AudioClip.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/__pycache__/__init__.cpython-311.pyc
index cb44cf24..0a14777e 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/__init__.cpython-311.pyc
index 8b15d89f..5e2a6f0a 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_fadein.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_fadein.cpython-311.pyc
index dfbc648f..5699ea5f 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_fadein.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_fadein.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_fadeout.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_fadeout.cpython-311.pyc
index 64c919d9..3fd2884a 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_fadeout.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_fadeout.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_left_right.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_left_right.cpython-311.pyc
index 28a0f3fc..5a34892c 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_left_right.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_left_right.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_loop.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_loop.cpython-311.pyc
index bd93d393..3d4e7fbf 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_loop.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_loop.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_normalize.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_normalize.cpython-311.pyc
index 7255d79f..054d367e 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_normalize.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/audio_normalize.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/volumex.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/volumex.cpython-311.pyc
index 6fa48449..5577f529 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/volumex.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/fx/__pycache__/volumex.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/fx/all/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/fx/all/__pycache__/__init__.cpython-311.pyc
index 956fdcbf..cb4c4798 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/fx/all/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/fx/all/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/AudioFileClip.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/AudioFileClip.cpython-311.pyc
index e8fc05cf..2841af0c 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/AudioFileClip.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/AudioFileClip.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/__init__.cpython-311.pyc
index a515541c..d0d1a59f 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/ffmpeg_audiowriter.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/ffmpeg_audiowriter.cpython-311.pyc
index 0ec1fa7d..ae2583c4 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/ffmpeg_audiowriter.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/ffmpeg_audiowriter.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/preview.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/preview.cpython-311.pyc
index 4bd86b6e..38c07161 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/preview.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/preview.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/readers.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/readers.cpython-311.pyc
index 116c5dc3..98678147 100644
Binary files a/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/readers.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/audio/io/__pycache__/readers.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/__pycache__/VideoClip.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/__pycache__/VideoClip.cpython-311.pyc
index edd0dade..e73f617d 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/__pycache__/VideoClip.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/__pycache__/VideoClip.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/__pycache__/__init__.cpython-311.pyc
index b09eb3eb..d45f4850 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/CompositeVideoClip.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/CompositeVideoClip.cpython-311.pyc
index 04eb2948..2a17ae9d 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/CompositeVideoClip.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/CompositeVideoClip.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/__init__.cpython-311.pyc
index 1bc26574..d9b4a618 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/concatenate.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/concatenate.cpython-311.pyc
index eeacbba4..c4ce36f8 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/concatenate.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/concatenate.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/on_color.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/on_color.cpython-311.pyc
index aeeec619..24669273 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/on_color.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/on_color.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/transitions.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/transitions.cpython-311.pyc
index e624ec89..b85d7600 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/transitions.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/compositing/__pycache__/transitions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/__init__.cpython-311.pyc
index 5d757b92..2dffab4e 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/accel_decel.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/accel_decel.cpython-311.pyc
index 3a159d52..45303701 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/accel_decel.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/accel_decel.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/blackwhite.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/blackwhite.cpython-311.pyc
index a93fc43c..b38d4a99 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/blackwhite.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/blackwhite.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/blink.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/blink.cpython-311.pyc
index 5a832b1c..5772d85c 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/blink.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/blink.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/colorx.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/colorx.cpython-311.pyc
index ca67819e..3ac96660 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/colorx.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/colorx.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/crop.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/crop.cpython-311.pyc
index f3a89cf0..0542f2d0 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/crop.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/crop.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/even_size.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/even_size.cpython-311.pyc
index 9f9432d4..5ff7de5d 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/even_size.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/even_size.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/fadein.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/fadein.cpython-311.pyc
index fa24871c..720658f1 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/fadein.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/fadein.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/fadeout.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/fadeout.cpython-311.pyc
index e83dff7f..7acead3d 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/fadeout.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/fadeout.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/freeze.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/freeze.cpython-311.pyc
index ef963f9d..d37dddce 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/freeze.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/freeze.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/freeze_region.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/freeze_region.cpython-311.pyc
index 30f28a9e..03a47b4e 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/freeze_region.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/freeze_region.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/gamma_corr.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/gamma_corr.cpython-311.pyc
index ef3781a3..958902c6 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/gamma_corr.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/gamma_corr.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/headblur.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/headblur.cpython-311.pyc
index 8a8b261e..afd97919 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/headblur.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/headblur.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/invert_colors.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/invert_colors.cpython-311.pyc
index c93f7059..22a4d5d7 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/invert_colors.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/invert_colors.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/loop.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/loop.cpython-311.pyc
index dd5beb93..a3403bce 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/loop.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/loop.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/lum_contrast.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/lum_contrast.cpython-311.pyc
index 77f76346..52a6f503 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/lum_contrast.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/lum_contrast.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/make_loopable.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/make_loopable.cpython-311.pyc
index 423a02a0..1f1b4a31 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/make_loopable.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/make_loopable.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/margin.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/margin.cpython-311.pyc
index 83fec236..ade19bad 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/margin.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/margin.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_and.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_and.cpython-311.pyc
index 83f35e9c..57baebef 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_and.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_and.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_color.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_color.cpython-311.pyc
index 894014dd..be651bef 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_color.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_color.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_or.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_or.cpython-311.pyc
index b3805a0c..2af6b359 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_or.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mask_or.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mirror_x.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mirror_x.cpython-311.pyc
index 0b0c96dd..756071b8 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mirror_x.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mirror_x.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mirror_y.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mirror_y.cpython-311.pyc
index c359901a..6e6efda2 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mirror_y.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/mirror_y.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/painting.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/painting.cpython-311.pyc
index fc8ba203..3a6fbbe9 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/painting.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/painting.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/resize.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/resize.cpython-311.pyc
index 89aa6c13..2df230e7 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/resize.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/resize.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/rotate.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/rotate.cpython-311.pyc
index 4a3d9c99..5cefcf5c 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/rotate.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/rotate.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/scroll.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/scroll.cpython-311.pyc
index 7db99db9..46671040 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/scroll.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/scroll.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/speedx.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/speedx.cpython-311.pyc
index 776db3a9..b8e320c6 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/speedx.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/speedx.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/supersample.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/supersample.cpython-311.pyc
index 3e9a06d9..41c75d1f 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/supersample.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/supersample.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/time_mirror.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/time_mirror.cpython-311.pyc
index 084a99c0..7ffc8ee6 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/time_mirror.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/time_mirror.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/time_symmetrize.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/time_symmetrize.cpython-311.pyc
index 75d4bc15..00c1c380 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/time_symmetrize.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/__pycache__/time_symmetrize.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/fx/all/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/fx/all/__pycache__/__init__.cpython-311.pyc
index 8f19a86f..de7f6e39 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/fx/all/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/fx/all/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ImageSequenceClip.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ImageSequenceClip.cpython-311.pyc
index 32b55b06..4fd8e0ef 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ImageSequenceClip.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ImageSequenceClip.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/VideoFileClip.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/VideoFileClip.cpython-311.pyc
index 0c27bfae..848523d9 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/VideoFileClip.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/VideoFileClip.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/__init__.cpython-311.pyc
index 530ba2f9..43790ef4 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/downloader.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/downloader.cpython-311.pyc
index 4ef1436f..e6e2d840 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/downloader.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/downloader.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_reader.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_reader.cpython-311.pyc
index 4a6e3846..bae41966 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_reader.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_reader.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_tools.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_tools.cpython-311.pyc
index 6a1b13c7..3b6f2c42 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_tools.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_tools.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_writer.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_writer.cpython-311.pyc
index 2f19f50f..db7aae99 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_writer.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/ffmpeg_writer.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/gif_writers.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/gif_writers.cpython-311.pyc
index f0f31d81..acdecf25 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/gif_writers.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/gif_writers.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/html_tools.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/html_tools.cpython-311.pyc
index fce904a5..d1ca5081 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/html_tools.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/html_tools.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/preview.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/preview.cpython-311.pyc
index af5b07c0..60c03301 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/preview.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/preview.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/sliders.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/sliders.cpython-311.pyc
index c9336c69..281ab887 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/io/__pycache__/sliders.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/io/__pycache__/sliders.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/tools/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/tools/__pycache__/__init__.cpython-311.pyc
index 90443c10..5c3cce11 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/tools/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/tools/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/moviepy/video/tools/__pycache__/drawing.cpython-311.pyc b/.venv/Lib/site-packages/moviepy/video/tools/__pycache__/drawing.cpython-311.pyc
index a7bd9450..b7e376ab 100644
Binary files a/.venv/Lib/site-packages/moviepy/video/tools/__pycache__/drawing.cpython-311.pyc and b/.venv/Lib/site-packages/moviepy/video/tools/__pycache__/drawing.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/__init__.cpython-311.pyc
index a836ffff..c4f46499 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_base_client.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_base_client.cpython-311.pyc
index 8d93c2da..8bd37a89 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_base_client.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_base_client.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_client.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_client.cpython-311.pyc
index d3a357af..6d8004ce 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_client.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_client.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_compat.cpython-311.pyc
index a7f9bbf3..e1d6a6a7 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_compat.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_constants.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_constants.cpython-311.pyc
index 939a7dbf..0d0a0e6f 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_constants.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_constants.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_exceptions.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_exceptions.cpython-311.pyc
index 4575746d..5b01edf2 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_exceptions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_files.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_files.cpython-311.pyc
index f02cb51a..39094fd1 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_files.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_files.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_legacy_response.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_legacy_response.cpython-311.pyc
index e8e32abf..cfade3fb 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_legacy_response.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_legacy_response.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_models.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_models.cpython-311.pyc
index 41a10f6b..6d9c55c8 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_models.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_models.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_module_client.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_module_client.cpython-311.pyc
index 4136443d..9d916cc9 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_module_client.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_module_client.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_qs.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_qs.cpython-311.pyc
index a5a99e8f..64157ecd 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_qs.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_qs.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_resource.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_resource.cpython-311.pyc
index 2aa056d0..605a0ea0 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_resource.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_resource.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_response.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_response.cpython-311.pyc
index 18479d8e..a25a39d3 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_response.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_response.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_streaming.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_streaming.cpython-311.pyc
index 428eed35..0ffa1c36 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_streaming.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_streaming.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_types.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_types.cpython-311.pyc
index 05627a5b..d80f8ca8 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_types.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_types.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/_version.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/_version.cpython-311.pyc
index 106808b0..94008167 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/_version.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/_version.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/pagination.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/pagination.cpython-311.pyc
index c6400ff5..2d6ecf0b 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/pagination.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/pagination.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/openai/__pycache__/version.cpython-311.pyc
index 39ac5883..9361a114 100644
Binary files a/.venv/Lib/site-packages/openai/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/openai/__pycache__/version.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_extras/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/_extras/__pycache__/__init__.cpython-311.pyc
index 63122aa3..a9ffa2ad 100644
Binary files a/.venv/Lib/site-packages/openai/_extras/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_extras/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_extras/__pycache__/_common.cpython-311.pyc b/.venv/Lib/site-packages/openai/_extras/__pycache__/_common.cpython-311.pyc
index f00e2d04..8becc447 100644
Binary files a/.venv/Lib/site-packages/openai/_extras/__pycache__/_common.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_extras/__pycache__/_common.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_extras/__pycache__/numpy_proxy.cpython-311.pyc b/.venv/Lib/site-packages/openai/_extras/__pycache__/numpy_proxy.cpython-311.pyc
index 98778cef..56f79674 100644
Binary files a/.venv/Lib/site-packages/openai/_extras/__pycache__/numpy_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_extras/__pycache__/numpy_proxy.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_extras/__pycache__/pandas_proxy.cpython-311.pyc b/.venv/Lib/site-packages/openai/_extras/__pycache__/pandas_proxy.cpython-311.pyc
index 256716d8..78764ed2 100644
Binary files a/.venv/Lib/site-packages/openai/_extras/__pycache__/pandas_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_extras/__pycache__/pandas_proxy.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_utils/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/_utils/__pycache__/__init__.cpython-311.pyc
index 42d9ddb9..a7b47687 100644
Binary files a/.venv/Lib/site-packages/openai/_utils/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_utils/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_utils/__pycache__/_logs.cpython-311.pyc b/.venv/Lib/site-packages/openai/_utils/__pycache__/_logs.cpython-311.pyc
index 395512e9..7f7dec8d 100644
Binary files a/.venv/Lib/site-packages/openai/_utils/__pycache__/_logs.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_utils/__pycache__/_logs.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_utils/__pycache__/_proxy.cpython-311.pyc b/.venv/Lib/site-packages/openai/_utils/__pycache__/_proxy.cpython-311.pyc
index 39e250f1..e0ce749e 100644
Binary files a/.venv/Lib/site-packages/openai/_utils/__pycache__/_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_utils/__pycache__/_proxy.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_utils/__pycache__/_streams.cpython-311.pyc b/.venv/Lib/site-packages/openai/_utils/__pycache__/_streams.cpython-311.pyc
index a980145d..c3c458cb 100644
Binary files a/.venv/Lib/site-packages/openai/_utils/__pycache__/_streams.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_utils/__pycache__/_streams.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_utils/__pycache__/_sync.cpython-311.pyc b/.venv/Lib/site-packages/openai/_utils/__pycache__/_sync.cpython-311.pyc
index ac56aed5..8436c6be 100644
Binary files a/.venv/Lib/site-packages/openai/_utils/__pycache__/_sync.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_utils/__pycache__/_sync.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_utils/__pycache__/_transform.cpython-311.pyc b/.venv/Lib/site-packages/openai/_utils/__pycache__/_transform.cpython-311.pyc
index 2586bf28..f08f759e 100644
Binary files a/.venv/Lib/site-packages/openai/_utils/__pycache__/_transform.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_utils/__pycache__/_transform.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_utils/__pycache__/_typing.cpython-311.pyc b/.venv/Lib/site-packages/openai/_utils/__pycache__/_typing.cpython-311.pyc
index 664a6b28..5aaf29ad 100644
Binary files a/.venv/Lib/site-packages/openai/_utils/__pycache__/_typing.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_utils/__pycache__/_typing.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/_utils/__pycache__/_utils.cpython-311.pyc b/.venv/Lib/site-packages/openai/_utils/__pycache__/_utils.cpython-311.pyc
index 34254ae9..1ba13f4e 100644
Binary files a/.venv/Lib/site-packages/openai/_utils/__pycache__/_utils.cpython-311.pyc and b/.venv/Lib/site-packages/openai/_utils/__pycache__/_utils.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/lib/__pycache__/_old_api.cpython-311.pyc b/.venv/Lib/site-packages/openai/lib/__pycache__/_old_api.cpython-311.pyc
index f216495b..152f3096 100644
Binary files a/.venv/Lib/site-packages/openai/lib/__pycache__/_old_api.cpython-311.pyc and b/.venv/Lib/site-packages/openai/lib/__pycache__/_old_api.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/lib/__pycache__/azure.cpython-311.pyc b/.venv/Lib/site-packages/openai/lib/__pycache__/azure.cpython-311.pyc
index b9e5a97b..9cf1af21 100644
Binary files a/.venv/Lib/site-packages/openai/lib/__pycache__/azure.cpython-311.pyc and b/.venv/Lib/site-packages/openai/lib/__pycache__/azure.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/lib/streaming/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/lib/streaming/__pycache__/__init__.cpython-311.pyc
index c0666de7..1db49fef 100644
Binary files a/.venv/Lib/site-packages/openai/lib/streaming/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/lib/streaming/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/lib/streaming/__pycache__/_assistants.cpython-311.pyc b/.venv/Lib/site-packages/openai/lib/streaming/__pycache__/_assistants.cpython-311.pyc
index 93b9d187..a017817f 100644
Binary files a/.venv/Lib/site-packages/openai/lib/streaming/__pycache__/_assistants.cpython-311.pyc and b/.venv/Lib/site-packages/openai/lib/streaming/__pycache__/_assistants.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/__pycache__/__init__.cpython-311.pyc
index a047378f..d2e562b8 100644
Binary files a/.venv/Lib/site-packages/openai/resources/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/__pycache__/batches.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/__pycache__/batches.cpython-311.pyc
index f9675efd..b389de41 100644
Binary files a/.venv/Lib/site-packages/openai/resources/__pycache__/batches.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/__pycache__/batches.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/__pycache__/completions.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/__pycache__/completions.cpython-311.pyc
index 482341be..6f3021dc 100644
Binary files a/.venv/Lib/site-packages/openai/resources/__pycache__/completions.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/__pycache__/completions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/__pycache__/embeddings.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/__pycache__/embeddings.cpython-311.pyc
index ef7ab8ba..b4976c99 100644
Binary files a/.venv/Lib/site-packages/openai/resources/__pycache__/embeddings.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/__pycache__/embeddings.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/__pycache__/files.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/__pycache__/files.cpython-311.pyc
index 0e9890f7..9a16eee4 100644
Binary files a/.venv/Lib/site-packages/openai/resources/__pycache__/files.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/__pycache__/files.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/__pycache__/images.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/__pycache__/images.cpython-311.pyc
index 383a98f8..06b02b23 100644
Binary files a/.venv/Lib/site-packages/openai/resources/__pycache__/images.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/__pycache__/images.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/__pycache__/models.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/__pycache__/models.cpython-311.pyc
index fb5426fe..0a44521a 100644
Binary files a/.venv/Lib/site-packages/openai/resources/__pycache__/models.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/__pycache__/models.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/__pycache__/moderations.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/__pycache__/moderations.cpython-311.pyc
index e6950d77..24979d95 100644
Binary files a/.venv/Lib/site-packages/openai/resources/__pycache__/moderations.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/__pycache__/moderations.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/__init__.cpython-311.pyc
index 880a2595..7b1d311e 100644
Binary files a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/audio.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/audio.cpython-311.pyc
index cf767c57..475ed66d 100644
Binary files a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/audio.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/audio.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/speech.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/speech.cpython-311.pyc
index b6a9011c..7319a243 100644
Binary files a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/speech.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/speech.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/transcriptions.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/transcriptions.cpython-311.pyc
index bf5dcfcd..91cdb3c6 100644
Binary files a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/transcriptions.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/transcriptions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/translations.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/translations.cpython-311.pyc
index e42ec5e9..69841fc2 100644
Binary files a/.venv/Lib/site-packages/openai/resources/audio/__pycache__/translations.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/audio/__pycache__/translations.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/__pycache__/__init__.cpython-311.pyc
index e0bbc4a9..c23a8929 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/__pycache__/assistants.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/__pycache__/assistants.cpython-311.pyc
index e63b8298..9893dba1 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/__pycache__/assistants.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/__pycache__/assistants.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/__pycache__/beta.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/__pycache__/beta.cpython-311.pyc
index 67f9c547..f6b7bb9f 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/__pycache__/beta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/__pycache__/beta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/__init__.cpython-311.pyc
index aeb13484..6b964f90 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/messages.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/messages.cpython-311.pyc
index e792128d..87b89cc4 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/messages.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/messages.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/threads.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/threads.cpython-311.pyc
index 36ea6bd5..3665a691 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/threads.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/threads/__pycache__/threads.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/__init__.cpython-311.pyc
index 1be45dbc..883fa97c 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/runs.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/runs.cpython-311.pyc
index 2c485a27..3085fcf7 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/runs.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/runs.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/steps.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/steps.cpython-311.pyc
index f9f635f8..6775a575 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/steps.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/threads/runs/__pycache__/steps.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/__init__.cpython-311.pyc
index de8f357c..53a96673 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/file_batches.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/file_batches.cpython-311.pyc
index e36e4b06..6d90a4b2 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/file_batches.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/file_batches.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/files.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/files.cpython-311.pyc
index 41f6f131..da9be763 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/files.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/files.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/vector_stores.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/vector_stores.cpython-311.pyc
index 63433c40..5adeef66 100644
Binary files a/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/vector_stores.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/beta/vector_stores/__pycache__/vector_stores.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/chat/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/chat/__pycache__/__init__.cpython-311.pyc
index 4a260928..fe0770ed 100644
Binary files a/.venv/Lib/site-packages/openai/resources/chat/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/chat/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/chat/__pycache__/chat.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/chat/__pycache__/chat.cpython-311.pyc
index 7cbe314c..a681b5c7 100644
Binary files a/.venv/Lib/site-packages/openai/resources/chat/__pycache__/chat.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/chat/__pycache__/chat.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/chat/__pycache__/completions.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/chat/__pycache__/completions.cpython-311.pyc
index f886aa6c..b2f734e9 100644
Binary files a/.venv/Lib/site-packages/openai/resources/chat/__pycache__/completions.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/chat/__pycache__/completions.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/fine_tuning/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/fine_tuning/__pycache__/__init__.cpython-311.pyc
index c1c93aee..ae1496d0 100644
Binary files a/.venv/Lib/site-packages/openai/resources/fine_tuning/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/fine_tuning/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/fine_tuning/__pycache__/fine_tuning.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/fine_tuning/__pycache__/fine_tuning.cpython-311.pyc
index 307c7d09..210e28c1 100644
Binary files a/.venv/Lib/site-packages/openai/resources/fine_tuning/__pycache__/fine_tuning.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/fine_tuning/__pycache__/fine_tuning.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/__init__.cpython-311.pyc
index 68c21a95..a19ecd6b 100644
Binary files a/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/checkpoints.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/checkpoints.cpython-311.pyc
index 2ba4e6bf..7291e2ab 100644
Binary files a/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/checkpoints.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/checkpoints.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/jobs.cpython-311.pyc b/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/jobs.cpython-311.pyc
index 35a241b5..d1c447eb 100644
Binary files a/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/jobs.cpython-311.pyc and b/.venv/Lib/site-packages/openai/resources/fine_tuning/jobs/__pycache__/jobs.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/__init__.cpython-311.pyc
index 6db69ec6..53c533ba 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/batch.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/batch.cpython-311.pyc
index 467e6b38..e13ef900 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/batch.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/batch.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/batch_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/batch_create_params.cpython-311.pyc
index 6c5033de..3c2f37f8 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/batch_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/batch_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/batch_error.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/batch_error.cpython-311.pyc
index 20d64f99..0e200e2e 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/batch_error.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/batch_error.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/batch_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/batch_list_params.cpython-311.pyc
index 517230d7..c388922f 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/batch_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/batch_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/batch_request_counts.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/batch_request_counts.cpython-311.pyc
index 120af815..8c62477b 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/batch_request_counts.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/batch_request_counts.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/chat_model.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/chat_model.cpython-311.pyc
index 79cbe7fa..4007ffdd 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/chat_model.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/chat_model.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/completion.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/completion.cpython-311.pyc
index 04555f98..83043025 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/completion.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/completion.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/completion_choice.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/completion_choice.cpython-311.pyc
index 0041ca6d..640fd874 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/completion_choice.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/completion_choice.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/completion_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/completion_create_params.cpython-311.pyc
index ceb82658..ede70278 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/completion_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/completion_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/completion_usage.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/completion_usage.cpython-311.pyc
index c11959da..7afcf0cf 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/completion_usage.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/completion_usage.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/create_embedding_response.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/create_embedding_response.cpython-311.pyc
index bda65892..d188fdfd 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/create_embedding_response.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/create_embedding_response.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/embedding.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/embedding.cpython-311.pyc
index 8a1e8b2d..50e1c0b3 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/embedding.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/embedding.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/embedding_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/embedding_create_params.cpython-311.pyc
index 9aa651bc..f758faf5 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/embedding_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/embedding_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/file_content.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/file_content.cpython-311.pyc
index 9903a43f..d53e00a5 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/file_content.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/file_content.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/file_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/file_create_params.cpython-311.pyc
index 9c212ca7..908f689e 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/file_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/file_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/file_deleted.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/file_deleted.cpython-311.pyc
index 7b8e166d..63fea59b 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/file_deleted.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/file_deleted.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/file_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/file_list_params.cpython-311.pyc
index 82c4ac5f..4e0002a8 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/file_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/file_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/file_object.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/file_object.cpython-311.pyc
index 497abbdd..737e8ac7 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/file_object.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/file_object.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/image.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/image.cpython-311.pyc
index 9a4e4acd..59ff4cc8 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/image.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/image.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/image_create_variation_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/image_create_variation_params.cpython-311.pyc
index 69a05153..4701e357 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/image_create_variation_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/image_create_variation_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/image_edit_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/image_edit_params.cpython-311.pyc
index 3b5ac623..d08f5fb7 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/image_edit_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/image_edit_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/image_generate_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/image_generate_params.cpython-311.pyc
index 9e0374cf..bce6b094 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/image_generate_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/image_generate_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/images_response.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/images_response.cpython-311.pyc
index 7bcc171e..67895139 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/images_response.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/images_response.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/model.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/model.cpython-311.pyc
index 2439d794..286b40e9 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/model.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/model.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/model_deleted.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/model_deleted.cpython-311.pyc
index 893738a3..bb2a0b95 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/model_deleted.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/model_deleted.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/moderation.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/moderation.cpython-311.pyc
index eb24bab8..5f7ce5d1 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/moderation.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/moderation.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/moderation_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/moderation_create_params.cpython-311.pyc
index 0ac567e6..cfb5bf34 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/moderation_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/moderation_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/__pycache__/moderation_create_response.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/__pycache__/moderation_create_response.cpython-311.pyc
index 32afab16..8202262f 100644
Binary files a/.venv/Lib/site-packages/openai/types/__pycache__/moderation_create_response.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/__pycache__/moderation_create_response.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/audio/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/audio/__pycache__/__init__.cpython-311.pyc
index 15a80a31..423c9194 100644
Binary files a/.venv/Lib/site-packages/openai/types/audio/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/audio/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/audio/__pycache__/speech_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/audio/__pycache__/speech_create_params.cpython-311.pyc
index 06059a5f..114895e1 100644
Binary files a/.venv/Lib/site-packages/openai/types/audio/__pycache__/speech_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/audio/__pycache__/speech_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/audio/__pycache__/transcription.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/audio/__pycache__/transcription.cpython-311.pyc
index a807b9d0..45ca3ac0 100644
Binary files a/.venv/Lib/site-packages/openai/types/audio/__pycache__/transcription.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/audio/__pycache__/transcription.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_create_params.cpython-311.pyc
index 300d6750..2d537131 100644
Binary files a/.venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/audio/__pycache__/transcription_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/audio/__pycache__/translation.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/audio/__pycache__/translation.cpython-311.pyc
index e1a51a6b..b9454238 100644
Binary files a/.venv/Lib/site-packages/openai/types/audio/__pycache__/translation.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/audio/__pycache__/translation.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/audio/__pycache__/translation_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/audio/__pycache__/translation_create_params.cpython-311.pyc
index a2ec5b35..86a50dfc 100644
Binary files a/.venv/Lib/site-packages/openai/types/audio/__pycache__/translation_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/audio/__pycache__/translation_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/__init__.cpython-311.pyc
index 3f90ab1b..1a5723f1 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant.cpython-311.pyc
index 7d75c870..83d76bdc 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_create_params.cpython-311.pyc
index d0ddaaba..7557dfdd 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_deleted.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_deleted.cpython-311.pyc
index dfb70fd4..1bd9078a 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_deleted.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_deleted.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_list_params.cpython-311.pyc
index 302f7291..9d22e5c4 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format.cpython-311.pyc
index d2987554..a41d43e5 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option.cpython-311.pyc
index 429f4a07..45375b65 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option_param.cpython-311.pyc
index d9bb4157..7797cddc 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_option_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_param.cpython-311.pyc
index 9d0d6d14..5e928b8c 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_response_format_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_stream_event.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_stream_event.cpython-311.pyc
index e16b5bde..94472002 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_stream_event.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_stream_event.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool.cpython-311.pyc
index 0cc129a5..b996331c 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice.cpython-311.pyc
index acc95d6c..43869c71 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function.cpython-311.pyc
index 125fce47..8018ce15 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function_param.cpython-311.pyc
index fa8799b4..22a9f373 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_function_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option.cpython-311.pyc
index 37ed9703..79ead258 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option_param.cpython-311.pyc
index c216c790..aa57ec47 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_option_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_param.cpython-311.pyc
index cc00d002..13fb9726 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_choice_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_param.cpython-311.pyc
index 97a85415..02ec2171 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_tool_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_update_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_update_params.cpython-311.pyc
index 4c78123b..82b63964 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_update_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/assistant_update_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool.cpython-311.pyc
index 50233041..95397f24 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool_param.cpython-311.pyc
index 605d958a..e793fbc0 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/code_interpreter_tool_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool.cpython-311.pyc
index 7028aebe..b24bf5c6 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool_param.cpython-311.pyc
index 83261462..6fdc0e5d 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/file_search_tool_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool.cpython-311.pyc
index 24524f2b..878e8b13 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool_param.cpython-311.pyc
index ab06e968..7c6fa569 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/function_tool_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread.cpython-311.pyc
index 4119b073..e19e1901 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_create_and_run_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_create_and_run_params.cpython-311.pyc
index bbba5c99..a6df2355 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_create_and_run_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_create_and_run_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_create_params.cpython-311.pyc
index 12d78f60..7b8c96f6 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_deleted.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_deleted.cpython-311.pyc
index 7c8399a3..a99420b6 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_deleted.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_deleted.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_update_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_update_params.cpython-311.pyc
index c314e832..b6eb4737 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_update_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/thread_update_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store.cpython-311.pyc
index 319a48a7..511d9b9c 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_create_params.cpython-311.pyc
index cde70818..16113537 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_deleted.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_deleted.cpython-311.pyc
index 3bfe24ac..82212f75 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_deleted.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_deleted.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_list_params.cpython-311.pyc
index eff50f4f..4bc72039 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_update_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_update_params.cpython-311.pyc
index fe5e02be..52b8b1b4 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_update_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/__pycache__/vector_store_update_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/__init__.cpython-311.pyc
index 206520e4..6cdac54d 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation.cpython-311.pyc
index fe3f7f21..4f333307 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation_delta.cpython-311.pyc
index 8ce3e5fb..ec0b80a6 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/annotation_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_annotation.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_annotation.cpython-311.pyc
index a0450825..f0e6be4b 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_annotation.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_annotation.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_delta_annotation.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_delta_annotation.cpython-311.pyc
index 5e901d5f..7884c6df 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_delta_annotation.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_citation_delta_annotation.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_annotation.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_annotation.cpython-311.pyc
index 1ce163d3..e40dc5d8 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_annotation.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_annotation.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_delta_annotation.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_delta_annotation.cpython-311.pyc
index 96d8154e..0a28adc2 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_delta_annotation.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/file_path_delta_annotation.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file.cpython-311.pyc
index ddcc9403..813cde20 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_content_block.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_content_block.cpython-311.pyc
index af0c713a..fb7ab3b4 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_content_block.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_content_block.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_delta.cpython-311.pyc
index c79d1e21..604f4d09 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_delta_block.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_delta_block.cpython-311.pyc
index 25f6e06a..2f336ffd 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_delta_block.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/image_file_delta_block.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message.cpython-311.pyc
index 24687726..0e992a04 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content.cpython-311.pyc
index df4f63f9..20a8c374 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content_delta.cpython-311.pyc
index 89496844..fe8f242f 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_content_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_create_params.cpython-311.pyc
index c87da808..1ce279e7 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_deleted.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_deleted.cpython-311.pyc
index 92e8023e..5c2b95ab 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_deleted.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_deleted.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_delta.cpython-311.pyc
index 5f11c8a8..bd2f5583 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_delta_event.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_delta_event.cpython-311.pyc
index 812d004b..d8416380 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_delta_event.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_delta_event.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_list_params.cpython-311.pyc
index 20e336ca..e0c38e47 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_update_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_update_params.cpython-311.pyc
index 2a9fce17..d6bbe1f4 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_update_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/message_update_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/required_action_function_tool_call.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/required_action_function_tool_call.cpython-311.pyc
index 5ea608c9..e9956213 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/required_action_function_tool_call.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/required_action_function_tool_call.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run.cpython-311.pyc
index f476dbb3..f7549626 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_create_params.cpython-311.pyc
index 0ce9f026..b7737c2f 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_list_params.cpython-311.pyc
index 0253b112..c7bf6f45 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_status.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_status.cpython-311.pyc
index 1bf51713..db67769f 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_status.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_status.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_submit_tool_outputs_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_submit_tool_outputs_params.cpython-311.pyc
index df8c2150..40c801a6 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_submit_tool_outputs_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_submit_tool_outputs_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_update_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_update_params.cpython-311.pyc
index 9ccebc90..9704803b 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_update_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/run_update_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text.cpython-311.pyc
index b6613eb2..ba2b53bf 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_content_block.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_content_block.cpython-311.pyc
index 7ffb7d18..be78fe28 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_content_block.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_content_block.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_delta.cpython-311.pyc
index 86de0b5d..4266813c 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_delta_block.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_delta_block.cpython-311.pyc
index aff4173c..4689bd6d 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_delta_block.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/__pycache__/text_delta_block.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/__init__.cpython-311.pyc
index 08a0dae7..94b945ed 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_logs.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_logs.cpython-311.pyc
index 1eba2df5..b5736402 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_logs.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_logs.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_output_image.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_output_image.cpython-311.pyc
index 4ea08e08..fb17f6e0 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_output_image.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_output_image.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call.cpython-311.pyc
index 474bf2d1..835e831f 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call_delta.cpython-311.pyc
index 707732b4..d83c2552 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/code_interpreter_tool_call_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call.cpython-311.pyc
index 78571317..a881ff30 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call_delta.cpython-311.pyc
index c6413e63..1783ce2e 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/file_search_tool_call_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call.cpython-311.pyc
index 654c12ac..caccf482 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call_delta.cpython-311.pyc
index a520f860..5a8e8efe 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/function_tool_call_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/message_creation_step_details.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/message_creation_step_details.cpython-311.pyc
index c97c0259..54bb3e0d 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/message_creation_step_details.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/message_creation_step_details.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step.cpython-311.pyc
index f419a45b..37bef27c 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta.cpython-311.pyc
index 2d4a75b8..b83c786f 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_event.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_event.cpython-311.pyc
index 260c6a69..1c302b3e 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_event.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_event.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_message_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_message_delta.cpython-311.pyc
index 9c038da1..bfa0ab96 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_message_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/run_step_delta_message_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/step_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/step_list_params.cpython-311.pyc
index d833bde3..d32bec56 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/step_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/step_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call.cpython-311.pyc
index 7f855a78..7f4240c7 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta.cpython-311.pyc
index 29ac53d9..ee27e87c 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta_object.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta_object.cpython-311.pyc
index 4a645991..d4bbe233 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta_object.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_call_delta_object.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_calls_step_details.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_calls_step_details.cpython-311.pyc
index 3a70aa54..b4602f53 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_calls_step_details.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/threads/runs/__pycache__/tool_calls_step_details.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/__init__.cpython-311.pyc
index a2ba586f..86aab937 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_batch_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_batch_create_params.cpython-311.pyc
index 43137224..d2b140cd 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_batch_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_batch_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_batch_list_files_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_batch_list_files_params.cpython-311.pyc
index acd61633..656dc3fe 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_batch_list_files_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_batch_list_files_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_create_params.cpython-311.pyc
index 20b696db..4f526553 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_list_params.cpython-311.pyc
index a6cbb02b..f1da7588 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/file_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file.cpython-311.pyc
index bf1594fb..84012d9f 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file_batch.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file_batch.cpython-311.pyc
index 0113e4a5..d5f7cdbe 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file_batch.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file_batch.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file_deleted.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file_deleted.cpython-311.pyc
index 912c0857..aa65f70f 100644
Binary files a/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file_deleted.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/beta/vector_stores/__pycache__/vector_store_file_deleted.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/__init__.cpython-311.pyc
index 47a4beb6..0f292634 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion.cpython-311.pyc
index c9b8ea51..758a581a 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_assistant_message_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_assistant_message_param.cpython-311.pyc
index bb446c39..b7f636c6 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_assistant_message_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_assistant_message_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_chunk.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_chunk.cpython-311.pyc
index 7ee87335..ce12716e 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_chunk.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_chunk.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_image_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_image_param.cpython-311.pyc
index fd76d0ba..bee44f34 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_image_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_image_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_param.cpython-311.pyc
index b88b59f7..5e1a2f9a 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_text_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_text_param.cpython-311.pyc
index a3fa0717..fd245b08 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_text_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_content_part_text_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_function_call_option_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_function_call_option_param.cpython-311.pyc
index 4ee8259f..6c0dc963 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_function_call_option_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_function_call_option_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_function_message_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_function_message_param.cpython-311.pyc
index b0e1a026..331ce28b 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_function_message_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_function_message_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message.cpython-311.pyc
index ad5c1f5a..68010a3c 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_param.cpython-311.pyc
index 38e2176c..bf8f68e8 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call.cpython-311.pyc
index 6561e1b1..fb5ded40 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call_param.cpython-311.pyc
index 26fc7dbc..474922f6 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_message_tool_call_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_named_tool_choice_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_named_tool_choice_param.cpython-311.pyc
index 6cf2b506..82a0958e 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_named_tool_choice_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_named_tool_choice_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_role.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_role.cpython-311.pyc
index 2c515254..ff591692 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_role.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_role.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_system_message_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_system_message_param.cpython-311.pyc
index 72af4725..38d3bc8e 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_system_message_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_system_message_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_token_logprob.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_token_logprob.cpython-311.pyc
index f2707485..4caceb40 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_token_logprob.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_token_logprob.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_choice_option_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_choice_option_param.cpython-311.pyc
index b9199b13..c0f6126f 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_choice_option_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_choice_option_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_message_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_message_param.cpython-311.pyc
index 59ad92fe..69b865d1 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_message_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_message_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_param.cpython-311.pyc
index 4ed39439..df1436f8 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_tool_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_user_message_param.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_user_message_param.cpython-311.pyc
index a34edc4e..5d2e2913 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_user_message_param.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/chat_completion_user_message_param.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/chat/__pycache__/completion_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/chat/__pycache__/completion_create_params.cpython-311.pyc
index 29ed5af9..5736beb1 100644
Binary files a/.venv/Lib/site-packages/openai/types/chat/__pycache__/completion_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/chat/__pycache__/completion_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/__init__.cpython-311.pyc
index b27a1dad..e0aa6eab 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job.cpython-311.pyc
index 1644c1b2..b19b41b7 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_event.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_event.cpython-311.pyc
index 9490a918..f13b0dce 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_event.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_event.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_integration.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_integration.cpython-311.pyc
index 47282376..982c60a0 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_integration.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_integration.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration.cpython-311.pyc
index e1c1027f..454281cd 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration_object.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration_object.cpython-311.pyc
index 5ab5ad90..98034658 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration_object.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/fine_tuning_job_wandb_integration_object.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_create_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_create_params.cpython-311.pyc
index 74d33dcc..1b7b2bab 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_create_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_create_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_events_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_events_params.cpython-311.pyc
index f267fbf5..611e2343 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_events_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_events_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_params.cpython-311.pyc
index 7918985d..ca258f3d 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/__pycache__/job_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/__init__.cpython-311.pyc
index 2e9726df..b84297e2 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/checkpoint_list_params.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/checkpoint_list_params.cpython-311.pyc
index 1ff44b5b..dc350b3b 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/checkpoint_list_params.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/checkpoint_list_params.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/fine_tuning_job_checkpoint.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/fine_tuning_job_checkpoint.cpython-311.pyc
index 1fc1cc7d..09b36d6b 100644
Binary files a/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/fine_tuning_job_checkpoint.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/fine_tuning/jobs/__pycache__/fine_tuning_job_checkpoint.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/shared/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/shared/__pycache__/__init__.cpython-311.pyc
index 3f979fe3..51d10f32 100644
Binary files a/.venv/Lib/site-packages/openai/types/shared/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/shared/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/shared/__pycache__/error_object.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/shared/__pycache__/error_object.cpython-311.pyc
index ca4ebe62..5b7e0428 100644
Binary files a/.venv/Lib/site-packages/openai/types/shared/__pycache__/error_object.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/shared/__pycache__/error_object.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/shared/__pycache__/function_definition.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/shared/__pycache__/function_definition.cpython-311.pyc
index 344e4555..6f896611 100644
Binary files a/.venv/Lib/site-packages/openai/types/shared/__pycache__/function_definition.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/shared/__pycache__/function_definition.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/shared/__pycache__/function_parameters.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/shared/__pycache__/function_parameters.cpython-311.pyc
index ca0c28f0..9829e985 100644
Binary files a/.venv/Lib/site-packages/openai/types/shared/__pycache__/function_parameters.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/shared/__pycache__/function_parameters.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/__init__.cpython-311.pyc
index 15ad2646..26cec41e 100644
Binary files a/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/function_definition.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/function_definition.cpython-311.pyc
index 4c8e7615..fe2eef23 100644
Binary files a/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/function_definition.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/function_definition.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/function_parameters.cpython-311.pyc b/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/function_parameters.cpython-311.pyc
index 8ea08b27..af2fcf4a 100644
Binary files a/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/function_parameters.cpython-311.pyc and b/.venv/Lib/site-packages/openai/types/shared_params/__pycache__/function_parameters.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/proglog/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/proglog/__pycache__/__init__.cpython-311.pyc
index f5f9d988..4d4a3fee 100644
Binary files a/.venv/Lib/site-packages/proglog/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/proglog/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/proglog/__pycache__/proglog.cpython-311.pyc b/.venv/Lib/site-packages/proglog/__pycache__/proglog.cpython-311.pyc
index 712b8bcf..cecd8f64 100644
Binary files a/.venv/Lib/site-packages/proglog/__pycache__/proglog.cpython-311.pyc and b/.venv/Lib/site-packages/proglog/__pycache__/proglog.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/proglog/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/proglog/__pycache__/version.cpython-311.pyc
index 02572967..696442c3 100644
Binary files a/.venv/Lib/site-packages/proglog/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/proglog/__pycache__/version.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame-2.5.2.dist-info/INSTALLER b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/INSTALLER
new file mode 100644
index 00000000..a1b589e3
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/INSTALLER
@@ -0,0 +1 @@
+pip
diff --git a/.venv/Lib/site-packages/pygame-2.5.2.dist-info/METADATA b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/METADATA
new file mode 100644
index 00000000..cb3c18d2
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/METADATA
@@ -0,0 +1,305 @@
+Metadata-Version: 2.1
+Name: pygame
+Version: 2.5.2
+Summary: Python Game Development
+Home-page: https://www.pygame.org
+Author: A community project.
+Author-email: pygame@pygame.org
+License: LGPL
+Project-URL: Documentation, https://pygame.org/docs
+Project-URL: Bug Tracker, https://github.com/pygame/pygame/issues
+Project-URL: Source, https://github.com/pygame/pygame
+Project-URL: Twitter, https://twitter.com/pygame_org
+Classifier: Development Status :: 6 - Mature
+Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
+Classifier: Programming Language :: Assembly
+Classifier: Programming Language :: C
+Classifier: Programming Language :: Cython
+Classifier: Programming Language :: Objective C
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
+Classifier: Programming Language :: Python :: 3.10
+Classifier: Programming Language :: Python :: 3.11
+Classifier: Programming Language :: Python :: Implementation :: CPython
+Classifier: Programming Language :: Python :: Implementation :: PyPy
+Classifier: Topic :: Games/Entertainment
+Classifier: Topic :: Multimedia :: Sound/Audio
+Classifier: Topic :: Multimedia :: Sound/Audio :: MIDI
+Classifier: Topic :: Multimedia :: Sound/Audio :: Players
+Classifier: Topic :: Multimedia :: Graphics
+Classifier: Topic :: Multimedia :: Graphics :: Capture :: Digital Camera
+Classifier: Topic :: Multimedia :: Graphics :: Capture :: Screen Capture
+Classifier: Topic :: Multimedia :: Graphics :: Graphics Conversion
+Classifier: Topic :: Multimedia :: Graphics :: Viewers
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: Unix
+Classifier: Operating System :: MacOS
+Requires-Python: >=3.6
+Description-Content-Type: text/x-rst
+
+.. image:: https://raw.githubusercontent.com/pygame/pygame/main/docs/reST/_static/pygame_logo.svg
+ :alt: pygame
+ :target: https://www.pygame.org/
+
+
+|AppVeyorBuild| |PyPiVersion| |PyPiLicense|
+|Python3| |GithubCommits| |BlackFormatBadge|
+
+Pygame_ is a free and open-source cross-platform library
+for the development of multimedia applications like video games using Python.
+It uses the `Simple DirectMedia Layer library`_ and several other
+popular libraries to abstract the most common functions, making writing
+these programs a more intuitive task.
+
+`We need your help`_ to make pygame the best it can be!
+New contributors are welcome.
+
+
+Installation
+------------
+
+Before installing pygame, you must check that Python is installed
+on your machine. To find out, open a command prompt (if you have
+Windows) or a terminal (if you have MacOS or Linux) and type this:
+::
+
+ python --version
+
+
+If a message such as "Python 3.8.10" appears, it means that Python
+is correctly installed. If an error message appears, it means that
+it is not installed yet. You must then go to the `official website
+`_ and follow the instructions.
+
+Once Python is installed, you have to perform a final check: you have
+to see if pip is installed. Generally, pip is pre-installed with
+Python but we are never sure. Same as for Python, type the following
+command:
+::
+
+ pip --version
+
+
+If a message such as "pip 20.0.2 from /usr/lib/python3/dist-packages/pip
+(python 3.8)" appears, you are ready to install pygame! To install
+it, enter this command:
+::
+
+ pip install pygame
+
+
+Help
+----
+
+If you are just getting started with pygame, you should be able to
+get started fairly quickly. Pygame comes with many tutorials and
+introductions. There is also full reference documentation for the
+entire library. Browse the documentation on the `docs page`_. You
+can also browse the documentation locally by running
+``python -m pygame.docs`` in your terminal. If the docs aren't found
+locally, it'll launch the online website instead.
+
+The online documentation stays up to date with the development version
+of pygame on github. This may be a bit newer than the version of pygame
+you are using. To upgrade to the latest full release, run
+``pip install pygame --upgrade`` in your terminal.
+
+Best of all, the examples directory has many playable small programs
+which can get you started playing with the code right away.
+
+Pygame is a powerful library for game development, offering a wide
+range of features to simplify your coding journey. Let's delve into
+what Pygame has to offer:
+
+Graphics: With Pygame, creating dynamic and engaging graphics has
+never been easier. The library provides simple yet effective tools for
+2D graphics and animation, including support for images, rectangles,
+and polygon shapes. Whether you're a seasoned game developer or just
+starting out, Pygame has you covered.
+
+Sound: Pygame also includes support for playing and manipulating sound
+and music, making it easy to add sound effects and background music to
+your games. With support for WAV, MP3, and OGG file formats, you have
+plenty of options to choose from.
+
+Input: Pygame provides intuitive functions for handling keyboard, mouse,
+and joystick input, allowing you to quickly and easily implement player
+controls in your games. No more struggling with complex input code, Pygame
+makes it simple.
+
+Game Development: Lastly, Pygame provides a comprehensive suite of tools
+and features specifically designed for game development. From collision
+detection to sprite management, Pygame has everything you need to create
+exciting and engaging games. Whether you're building a platformer, puzzle
+game, or anything in between, Pygame has you covered.
+
+Building From Source
+--------------------
+
+If you want to use features that are currently in development,
+or you want to contribute to pygame, you will need to build pygame
+locally from its source code, rather than pip installing it.
+
+Installing from source is fairly automated. The most work will
+involve compiling and installing all the pygame dependencies. Once
+that is done, run the ``setup.py`` script which will attempt to
+auto-configure, build, and install pygame.
+
+Much more information about installing and compiling is available
+on the `Compilation wiki page`_.
+
+Contribute
+----------
+| Thank you for thinking of contributing!
+|
+| To contribute to the main `project documentation `_, see ``docs/README.md`` or view more detailed instructions `here `_.
+|
+| New to contributing to Open Source Free Libre software?
+| There is a draft of `"Let's write a unit test!" `_ which is a step by step guide on how to write your first unit test in python for pygame, which is very similar to how you would do it for other projects.
+|
+| Want or need to compile pygame from source?
+| `See the compilation page `_ for more detailed instructions.
+|
+| For a detailed developer guide on "How to Hack Pygame":
+| Head to the `Hacking Page `_.
+|
+| Beginner developers looking for ways to contribute to the project can look at issues labeled `"good first issue" `_ or `"Difficulty: Easy" `_.
+|
+| To submit patches and report bugs:
+| Visit the `Bugs & Patches `_ page for detailed instructions.
+|
+| `See the info page `_ for more info and ways to get in touch with the Pygame team.
+
+
+Credits
+-------
+
+Thanks to everyone who has helped contribute to this library.
+Special thanks are also in order.
+
+* Marcus Von Appen: many changes, and fixes, 1.7.1+ freebsd maintainer
+* Lenard Lindstrom: the 1.8+ windows maintainer, many changes, and fixes
+* Brian Fisher for svn auto builder, bug tracker and many contributions
+* Rene Dudfield: many changes, and fixes, 1.7+ release manager/maintainer
+* Phil Hassey for his work on the pygame.org website
+* DR0ID for his work on the sprite module
+* Richard Goedeken for his smoothscale function
+* Ulf Ekström for his pixel perfect collision detection code
+* Pete Shinners: original author
+* David Clark for filling the right-hand-man position
+* Ed Boraas and Francis Irving: Debian packages
+* Maxim Sobolev: FreeBSD packaging
+* Bob Ippolito: MacOS and OS X porting (much work!)
+* Jan Ekhol, Ray Kelm, and Peter Nicolai: putting up with early design ideas
+* Nat Pryce for starting our unit tests
+* Dan Richter for documentation work
+* TheCorruptor for his incredible logos and graphics
+* Nicholas Dudfield: many test improvements
+* Alex Folkner for pygame-ctypes
+
+Thanks to those sending in patches and fixes: Niki Spahiev, Gordon
+Tyler, Nathaniel Pryce, Dave Wallace, John Popplewell, Michael Urman,
+Andrew Straw, Michael Hudson, Ole Martin Bjoerndalen, Herve Cauwelier,
+James Mazer, Lalo Martins, Timothy Stranex, Chad Lester, Matthias
+Spiller, Bo Jangeborg, Dmitry Borisov, Campbell Barton, Diego Essaya,
+Eyal Lotem, Regis Desgroppes, Emmanuel Hainry, Randy Kaelber
+Matthew L Daniel, Nirav Patel, Forrest Voight, Charlie Nolan,
+Frankie Robertson, John Krukoff, Lorenz Quack, Nick Irvine,
+Michael George, Saul Spatz, Thomas Ibbotson, Tom Rothamel, Evan Kroske,
+Cambell Barton.
+
+And our bug hunters above and beyond: Angus, Guillaume Proux, Frank
+Raiser, Austin Henry, Kaweh Kazemi, Arturo Aldama, Mike Mulcheck,
+Michael Benfield, David Lau
+
+There's many more folks out there who've submitted helpful ideas, kept
+this project going, and basically made our life easier. Thanks!
+
+Many thank you's for people making documentation comments, and adding to the
+pygame.org wiki.
+
+Also many thanks for people creating games and putting them on the
+pygame.org website for others to learn from and enjoy.
+
+Lots of thanks to James Paige for hosting the pygame bugzilla.
+
+Also a big thanks to Roger Dingledine and the crew at SEUL.ORG for our
+excellent hosting.
+
+Dependencies
+------------
+
+Pygame is obviously strongly dependent on SDL and Python. It also
+links to and embeds several other smaller libraries. The font
+module relies on SDL_ttf, which is dependent on freetype. The mixer
+(and mixer.music) modules depend on SDL_mixer. The image module
+depends on SDL_image, which also can use libjpeg and libpng. The
+transform module has an embedded version of SDL_rotozoom for its
+own rotozoom function. The surfarray module requires the Python
+NumPy package for its multidimensional numeric arrays.
+Dependency versions:
+
+
++----------+------------------------+
+| CPython | >= 3.6 (Or use PyPy3) |
++----------+------------------------+
+| SDL | >= 2.0.8 |
++----------+------------------------+
+| SDL_mixer| >= 2.0.0 |
++----------+------------------------+
+| SDL_image| >= 2.0.2 |
++----------+------------------------+
+| SDL_ttf | >= 2.0.11 |
++----------+------------------------+
+| SDL_gfx | (Optional, vendored in)|
++----------+------------------------+
+| NumPy | >= 1.6.2 (Optional) |
++----------+------------------------+
+
+
+
+License
+-------
+
+This library is distributed under `GNU LGPL version 2.1`_, which can
+be found in the file ``docs/LGPL.txt``. We reserve the right to place
+future versions of this library under a different license.
+
+This basically means you can use pygame in any project you want,
+but if you make any changes or additions to pygame itself, those
+must be released with a compatible license (preferably submitted
+back to the pygame project). Closed source and commercial games are fine.
+
+The programs in the ``examples`` subdirectory are in the public domain.
+
+See docs/licenses for licenses of dependencies.
+
+
+.. |AppVeyorBuild| image:: https://ci.appveyor.com/api/projects/status/x4074ybuobsh4myx?svg=true
+ :target: https://ci.appveyor.com/project/pygame/pygame
+
+.. |PyPiVersion| image:: https://img.shields.io/pypi/v/pygame.svg?v=1
+ :target: https://pypi.python.org/pypi/pygame
+
+.. |PyPiLicense| image:: https://img.shields.io/pypi/l/pygame.svg?v=1
+ :target: https://pypi.python.org/pypi/pygame
+
+.. |Python3| image:: https://img.shields.io/badge/python-3-blue.svg?v=1
+
+.. |GithubCommits| image:: https://img.shields.io/github/commits-since/pygame/pygame/2.1.2.svg
+ :target: https://github.com/pygame/pygame/compare/2.1.2...main
+
+.. |BlackFormatBadge| image:: https://img.shields.io/badge/code%20style-black-000000.svg
+ :target: https://github.com/psf/black
+
+.. _pygame: https://www.pygame.org
+.. _Simple DirectMedia Layer library: https://www.libsdl.org
+.. _We need your help: https://www.pygame.org/contribute.html
+.. _Compilation wiki page: https://www.pygame.org/wiki/Compilation
+.. _docs page: https://www.pygame.org/docs/
+.. _GNU LGPL version 2.1: https://www.gnu.org/copyleft/lesser.html
diff --git a/.venv/Lib/site-packages/pygame-2.5.2.dist-info/RECORD b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/RECORD
new file mode 100644
index 00000000..156e0a1b
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/RECORD
@@ -0,0 +1,771 @@
+../../include/site/python3.11/pygame/_blit_info.h,sha256=wRHRXxQ9k7NBMHHPymtStYuI8Prwqbdu0jE0gouqUYc,470
+../../include/site/python3.11/pygame/_camera.h,sha256=T0VYAfQxm0c4zww_BZaJGz4exa4z0FdEf3RSN_W2E-E,839
+../../include/site/python3.11/pygame/_pygame.h,sha256=UhRJF2E7W8CVfKAW5cySBOxf8tvzyAX0tDjEhUrJPeM,11726
+../../include/site/python3.11/pygame/_surface.h,sha256=Bbi9rW0SqwGs6THID0l6eB5d-5h-kxW7517TdqoxEZM,957
+../../include/site/python3.11/pygame/camera.h,sha256=TKCzoB86CTE0ER6OSCMXjfqaeMemP1ToK1x1gWM1Fb4,6556
+../../include/site/python3.11/pygame/font.h,sha256=VHcKhYtIHduegTXEf1hbmbxCwN5IrqsJch2HaxEtB6I,348
+../../include/site/python3.11/pygame/freetype.h,sha256=LbGY6saj9oakyoeGSlWlirSHySOpeoTKKOF-DO4zLRs,3245
+../../include/site/python3.11/pygame/include/_pygame.h,sha256=CAfNLuuTvJHpHNyeDcFCA3OcY5NVtg-fcKiOAyvYV58,30436
+../../include/site/python3.11/pygame/include/bitmask.h,sha256=tGzYwZ407sMIHDQG7xeXBQCRmhZZ4wp-yTerhUmIlCU,4952
+../../include/site/python3.11/pygame/include/pgcompat.h,sha256=l-At6iLGU8EeMqYdsDMATS2zfkviXWe1Rs7lnOwO7oc,1944
+../../include/site/python3.11/pygame/include/pgimport.h,sha256=3VrUyOZC6kbEdOcXn1QbOZ3nusBAuFSQxYgDadHNTPI,2636
+../../include/site/python3.11/pygame/include/pgplatform.h,sha256=JHCLb_nbc-WTNu2bDQWYBfVug1ypJpM9pnIWRhj4QW8,2378
+../../include/site/python3.11/pygame/include/pygame.h,sha256=OsEc_zNPFlXo4owOhGRqH4cbuYMtNJ_7K9d_Te--OEU,1245
+../../include/site/python3.11/pygame/include/pygame_bufferproxy.h,sha256=Poh7HsIjugo3NFeKjItZe40_BavF5V7re8bVFjkpmfU,1834
+../../include/site/python3.11/pygame/include/pygame_font.h,sha256=JKPbDFQdh_BAuz5F9S37iBSZbfjnL2scUlkS1geLd4s,1501
+../../include/site/python3.11/pygame/include/pygame_freetype.h,sha256=VNyvy7xukNOXymg3IMZne9-iVu3sI5LvKLagfkWpKAk,1346
+../../include/site/python3.11/pygame/include/pygame_mask.h,sha256=ONXIz3M3MPF4BlPSS2xRquysEYjZZf7AP2JRro8j4I0,1303
+../../include/site/python3.11/pygame/include/pygame_mixer.h,sha256=HthA7STa9TLomwQQswroyAmAd72pywDu_UCLfIV71is,2021
+../../include/site/python3.11/pygame/include/sse2neon.h,sha256=DcazZmLfny6MVJFIUlWbsdI39ZWQWGwmCJDuFEVZsw0,237885
+../../include/site/python3.11/pygame/mask.h,sha256=Y7OqzNUqQQHchUsSlvd-ja5d9IgAfSV2uFlaa8_5Lys,153
+../../include/site/python3.11/pygame/mixer.h,sha256=HJMd0Ho0DrdGBdPMDo_egSqkVxZnUZPMEQyPJMIw6_M,348
+../../include/site/python3.11/pygame/palette.h,sha256=dzARYIsQdHAaV8ypCrQbYRWFisXYXABD4ToMlzYKojg,7057
+../../include/site/python3.11/pygame/pgarrinter.h,sha256=alsw7p6X7ukOB1o3curyrjWOcGHgVCQgCvS1D9FtiRc,1060
+../../include/site/python3.11/pygame/pgbufferproxy.h,sha256=tqMDkdkH40QoYJ3NtTjiknAnSMh0i1sfNMaow3npvKI,179
+../../include/site/python3.11/pygame/pgcompat.h,sha256=Ro6kJ6ak2LQSHR4LmwnulolGuQO0KW6UZiu02iP-1_I,737
+../../include/site/python3.11/pygame/pgopengl.h,sha256=bbIysbLph5paPfeE2nnrQBIrq8iZz4T4pGfz2mYPuRw,606
+../../include/site/python3.11/pygame/pgplatform.h,sha256=LuZxNMbDYRCgjDk1_ruNTOiQsyO_FcI9qxNtJeAUpXQ,553
+../../include/site/python3.11/pygame/pygame.h,sha256=AQcZWIoAWGmN9fYBynCXxc81hd9lcwxBwWeq8WZjTKE,1083
+../../include/site/python3.11/pygame/scrap.h,sha256=d36ZWp5LM7o9RRcHCFiHwAT0aJZN_c17wTNu_LYHuEE,4704
+../../include/site/python3.11/pygame/simd_blitters.h,sha256=8Bv4j0uHf4ErZMeJeXjnrnVvKBQdSLmKcrEVgbYJlPc,2494
+../../include/site/python3.11/pygame/surface.h,sha256=6Goq2WvnwB_mYosiq4wZMIzPXn7uoCyA_fTK4uKtf6I,14584
+pygame-2.5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pygame-2.5.2.dist-info/METADATA,sha256=UnQNan6erv0dG6BJvA0R3AxWMqP0X2VvNBCWwZbYCGA,13332
+pygame-2.5.2.dist-info/RECORD,,
+pygame-2.5.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pygame-2.5.2.dist-info/WHEEL,sha256=badvNS-y9fEq0X-qzdZYvql_JFjI7Xfw-wR8FsjoK0I,102
+pygame-2.5.2.dist-info/entry_points.txt,sha256=dLqlr3Z1J3rgwMU_2X_oMIHnHCLXfrFyfzD2q6ewoOI,63
+pygame-2.5.2.dist-info/top_level.txt,sha256=ABXdFGIAE2g9m2VOzQPaLa917r6XEu6d96RqIzvAWCs,7
+pygame/SDL2.dll,sha256=Lk6CO0bpWimtTOTnE0QXsM1gFF_v5gaSDvbcDrz7ACE,2499072
+pygame/SDL2_image.dll,sha256=HjZK91_uDINQb739TVsOOGxOnGoz3b3axh3bEx42AZQ,125440
+pygame/SDL2_mixer.dll,sha256=Kg_F6fcsLq7DJAy4K3WUpYzNpglIWYHyVrlNCk3Y1vg,291840
+pygame/SDL2_ttf.dll,sha256=_N-r386GjrM_dRQCX_WcG7bEGPG81qziMAqc1AU-HWM,1552384
+pygame/__init__.py,sha256=cfk8mST6YzXpJH83W86aq5Sj6HzZYCZ8RYJUUR3KRt4,9483
+pygame/__init__.pyi,sha256=javlxYV7i0wDGZ69E_J2x1PLmXoEN-pfcF0MCcLqKbY,20400
+pygame/__pycache__/__init__.cpython-311.pyc,,
+pygame/__pycache__/_camera_opencv.cpython-311.pyc,,
+pygame/__pycache__/_camera_vidcapture.cpython-311.pyc,,
+pygame/__pycache__/camera.cpython-311.pyc,,
+pygame/__pycache__/colordict.cpython-311.pyc,,
+pygame/__pycache__/cursors.cpython-311.pyc,,
+pygame/__pycache__/draw_py.cpython-311.pyc,,
+pygame/__pycache__/fastevent.cpython-311.pyc,,
+pygame/__pycache__/freetype.cpython-311.pyc,,
+pygame/__pycache__/ftfont.cpython-311.pyc,,
+pygame/__pycache__/locals.cpython-311.pyc,,
+pygame/__pycache__/macosx.cpython-311.pyc,,
+pygame/__pycache__/midi.cpython-311.pyc,,
+pygame/__pycache__/pkgdata.cpython-311.pyc,,
+pygame/__pycache__/sndarray.cpython-311.pyc,,
+pygame/__pycache__/sprite.cpython-311.pyc,,
+pygame/__pycache__/surfarray.cpython-311.pyc,,
+pygame/__pycache__/sysfont.cpython-311.pyc,,
+pygame/__pycache__/version.cpython-311.pyc,,
+pygame/__pyinstaller/__init__.py,sha256=-c4Zo8nQGKAm8wc_LDscxMtK7zr_YhZwRnC9CMruUBE,72
+pygame/__pyinstaller/__pycache__/__init__.cpython-311.pyc,,
+pygame/__pyinstaller/__pycache__/hook-pygame.cpython-311.pyc,,
+pygame/__pyinstaller/hook-pygame.py,sha256=F54YZHmQpTIBH265sM0r5_8_YZYWo0IBhG_QVAQybgI,1368
+pygame/_camera.cp311-win_amd64.pyd,sha256=mjm_K-B_nrg-4zO-w6uLGVBWZn9eFA6gJe081XsFPVs,31232
+pygame/_camera_opencv.py,sha256=ulz0gAMwYQRyhA2AEd_EE7kq1Pacn2e0NqgOtrEC2Lk,5461
+pygame/_camera_vidcapture.py,sha256=MJih74Ya6djH-mZZj4OYfRKJOH-SD0VUHNaUcxwX7N8,3402
+pygame/_common.pyi,sha256=YPuDlQLtP8KzA-qA9LnYkOhS9zzSvA5ENwWHI2WSvoI,1349
+pygame/_freetype.cp311-win_amd64.pyd,sha256=iEU72lvhdhgcGJxRaE-YOPN6Z8Fe_O1H2BYp2bAMQsg,78336
+pygame/_sdl2/__init__.py,sha256=gmSh3cXyxHqEXwbck_mNOmoW--itmGMwonEHQnY49Zo,248
+pygame/_sdl2/__init__.pyi,sha256=fWR2P9epfYw8F_xyyMBoUxDZwJTIroizEnkN_eLf2rw,98
+pygame/_sdl2/__pycache__/__init__.cpython-311.pyc,,
+pygame/_sdl2/audio.cp311-win_amd64.pyd,sha256=7WbCho_m0bocgn4f54-CTxSy1FC-VmxVArkF_7Wwlu8,167936
+pygame/_sdl2/audio.pyi,sha256=DRRipL7rySE-0TddObb1A-l99rWQPK4YI36hvyHj4dw,1300
+pygame/_sdl2/controller.cp311-win_amd64.pyd,sha256=9BTrv6XkoaOEPWWZcAFV6pOTop1NrkaFImC1AEE8ZWE,104960
+pygame/_sdl2/controller.pyi,sha256=8WZ0Qf5iHIJTElgu29LeAhZO3Htbo00b8oL3aohK5P4,1165
+pygame/_sdl2/mixer.cp311-win_amd64.pyd,sha256=0i3uvRgrOS_kwrtujmqPZjySL5J7oykTKbZ6RxNl0As,146432
+pygame/_sdl2/sdl2.cp311-win_amd64.pyd,sha256=XA1jQHN0CwQo4Ycehwq1CIoA1W_K5jjQlGx_QAuuDpY,46080
+pygame/_sdl2/sdl2.pyi,sha256=n0Qa04-g3FdR7wiMEC_4ZhmAojvQTXGjTl1z13OWU70,338
+pygame/_sdl2/touch.cp311-win_amd64.pyd,sha256=6Kn5K18KdJMnnIof0NPFukC8DqXuYfFmnYSUaFfRt5s,13824
+pygame/_sdl2/touch.pyi,sha256=-vYGJsSC18E2gitH10HIv_V_DUc6DIeCb55zuQp3jPc,231
+pygame/_sdl2/video.cp311-win_amd64.pyd,sha256=HnlFhzAQBqzeRLXW6CIO5bXtFmG0jHZm71_H2KrzmSE,228352
+pygame/_sdl2/video.pyi,sha256=1ziRZwVFLhFTYubfNBwtyIF7hBWlCiscXul7V4dMcS8,4677
+pygame/_sprite.cp311-win_amd64.pyd,sha256=lJ7N_uj8z4RLwNs2sxjq0x7EmrbpqLh1p8Z6UB-sPmg,320512
+pygame/base.cp311-win_amd64.pyd,sha256=xBHS4r40VNlKWa8PeOC9dzcVbU8ku006q_h1u1HoCmk,30720
+pygame/base.pyi,sha256=MPRqq61kkfR-s7IXcoZyahrRP3VzERTED46GCuVacpg,586
+pygame/bufferproxy.cp311-win_amd64.pyd,sha256=v_zR7FXZJUliMcvVCxpGcOANUYpNpjgue8hZ898hGi4,18432
+pygame/bufferproxy.pyi,sha256=znPTlMWUbbJI2iCUz8F3pY0guxHOzVnQhpnUaPhfB2E,458
+pygame/camera.py,sha256=ydsKm1IR8OhHCcNEmYqzZz3IE_fw3xvbq_QDiteB9k0,5781
+pygame/camera.pyi,sha256=yeFKyldBEFDOUwMRXsqPcDdH2hOgeoth9fOuBJ8Dc8Y,1624
+pygame/color.cp311-win_amd64.pyd,sha256=zQmD_IAzCNZdC4rOPEIwqy3TuQm_7taUmNOohQu4dQ0,35328
+pygame/color.pyi,sha256=rBSvRlXAFlP4kzuVdI_z5n9TkCcZpz6_2XEAvYHG0gk,2050
+pygame/colordict.py,sha256=xS-mwTxatoVa3Howpp53otRNZ3p-b1MzZChlvy0cuic,25773
+pygame/constants.cp311-win_amd64.pyd,sha256=lPamD3tptOSZby7NUrdRJ8KuM3NYe-M1pjsg1MwXwL4,50688
+pygame/constants.pyi,sha256=PqbIVEVcVE9pKTaCFd9RExuYFf4i-1H_u_zjx6KP44U,9902
+pygame/cursors.py,sha256=2IhUpWjuLs4y_Rcs16tts4zBfLZtUSz9LzmWimN4piM,18208
+pygame/cursors.pyi,sha256=rvpf35D0IPYU2SBH30K46RRmigQfQH4SyQfb7TwnNiQ,2090
+pygame/display.cp311-win_amd64.pyd,sha256=T_0uEa62FoSCuIJzkWarP0r6TZTfWYRQgXQLsDCTlFc,44544
+pygame/display.pyi,sha256=5rC8JySsJTs0GWDaAG29lQan4HhtzIA0ilVvsi3Vvqs,2273
+pygame/docs/__main__.py,sha256=1dEMTojlXYV8qZ_T9h2f_AYdpPwwyCqmHBC8iuJ2KGI,995
+pygame/docs/__pycache__/__main__.cpython-311.pyc,,
+pygame/docs/generated/LGPL.txt,sha256=oZDcnIBDdV2Q-LCnX6ZrnkLUr0yYC_XdxjPwEk2zzuc,26430
+pygame/docs/generated/_images/AdvancedInputOutput1.gif,sha256=uSCxW5dFtO7PYQyoJglWJTe_aRYFfOav5DjnPkKBzKg,5649
+pygame/docs/generated/_images/AdvancedInputOutput11.gif,sha256=uSCxW5dFtO7PYQyoJglWJTe_aRYFfOav5DjnPkKBzKg,5649
+pygame/docs/generated/_images/AdvancedInputOutput2.gif,sha256=2UMDweIgRefzHFTJcJgbDsWgy-SlyOYaw2AKD6NKwmM,72233
+pygame/docs/generated/_images/AdvancedInputOutput21.gif,sha256=2UMDweIgRefzHFTJcJgbDsWgy-SlyOYaw2AKD6NKwmM,72233
+pygame/docs/generated/_images/AdvancedInputOutput3.gif,sha256=ez4Y7Yy0LsNH6UPYybfGckLmzutcLh7VIisajgFa4O8,6294
+pygame/docs/generated/_images/AdvancedInputOutput31.gif,sha256=ez4Y7Yy0LsNH6UPYybfGckLmzutcLh7VIisajgFa4O8,6294
+pygame/docs/generated/_images/AdvancedInputOutput4.gif,sha256=2-rK9cGngrgpJLW404oI3lG4NQnoT-UNwzA3Up48YIc,29185
+pygame/docs/generated/_images/AdvancedInputOutput41.gif,sha256=2-rK9cGngrgpJLW404oI3lG4NQnoT-UNwzA3Up48YIc,29185
+pygame/docs/generated/_images/AdvancedInputOutput5.gif,sha256=C6N4d_JD4QNMjLwPdINCOFWufyD4vM7b5LpR2GaHMcY,37349
+pygame/docs/generated/_images/AdvancedInputOutput51.gif,sha256=C6N4d_JD4QNMjLwPdINCOFWufyD4vM7b5LpR2GaHMcY,37349
+pygame/docs/generated/_images/AdvancedOutputAlpha1.gif,sha256=MH3CmK658WpN_u56GL9CV4YMFky9GLaKh0CAcixkMrA,14915
+pygame/docs/generated/_images/AdvancedOutputAlpha11.gif,sha256=MH3CmK658WpN_u56GL9CV4YMFky9GLaKh0CAcixkMrA,14915
+pygame/docs/generated/_images/AdvancedOutputAlpha2.gif,sha256=9E2YAIULWHZsAELfqLf5gdqL7-uE-Ebg4uqKgbSyVYk,71819
+pygame/docs/generated/_images/AdvancedOutputAlpha21.gif,sha256=9E2YAIULWHZsAELfqLf5gdqL7-uE-Ebg4uqKgbSyVYk,71819
+pygame/docs/generated/_images/AdvancedOutputAlpha3.gif,sha256=7gHdbhSKaUpyXgOC7GSusTdN7oJQvjGFY_o8DQNZ2Fc,30380
+pygame/docs/generated/_images/AdvancedOutputAlpha31.gif,sha256=7gHdbhSKaUpyXgOC7GSusTdN7oJQvjGFY_o8DQNZ2Fc,30380
+pygame/docs/generated/_images/AdvancedOutputProcess1.gif,sha256=QihTI3ThxtEnPjQ0qZaYF4rKj5GxSwDfFgfUmFjvcOw,15951
+pygame/docs/generated/_images/AdvancedOutputProcess11.gif,sha256=QihTI3ThxtEnPjQ0qZaYF4rKj5GxSwDfFgfUmFjvcOw,15951
+pygame/docs/generated/_images/AdvancedOutputProcess2.gif,sha256=qP09Je0xWwST1CoAs9BCy7_vq6OB69opna8kejTln50,1868
+pygame/docs/generated/_images/AdvancedOutputProcess21.gif,sha256=qP09Je0xWwST1CoAs9BCy7_vq6OB69opna8kejTln50,1868
+pygame/docs/generated/_images/AdvancedOutputProcess3.gif,sha256=4WhoBbEheizUdZfs_pFEBGGAm9aoetw3tJhgcNgVIyY,1912
+pygame/docs/generated/_images/AdvancedOutputProcess31.gif,sha256=4WhoBbEheizUdZfs_pFEBGGAm9aoetw3tJhgcNgVIyY,1912
+pygame/docs/generated/_images/AdvancedOutputProcess4.gif,sha256=m-gUJNOn6AuXT7FpKF6HRR8A6ytWorY9Y07N2uZaSIQ,14500
+pygame/docs/generated/_images/AdvancedOutputProcess41.gif,sha256=m-gUJNOn6AuXT7FpKF6HRR8A6ytWorY9Y07N2uZaSIQ,14500
+pygame/docs/generated/_images/AdvancedOutputProcess5.gif,sha256=GCi9KGUIhQTFg-HLEnp2GEgrnQl8_2KftS3N_UkuEH8,16896
+pygame/docs/generated/_images/AdvancedOutputProcess51.gif,sha256=GCi9KGUIhQTFg-HLEnp2GEgrnQl8_2KftS3N_UkuEH8,16896
+pygame/docs/generated/_images/AdvancedOutputProcess6.gif,sha256=nzV_M0JoA4aDyGwpe8lWoUFd5c1PK-WxUI-lF8WzfQQ,34058
+pygame/docs/generated/_images/AdvancedOutputProcess61.gif,sha256=nzV_M0JoA4aDyGwpe8lWoUFd5c1PK-WxUI-lF8WzfQQ,34058
+pygame/docs/generated/_images/Bagic-INPUT-resultscreen.png,sha256=RDZbxtVyFMJXdZA8wouSyJJjXf2MQ2WYTBzVotsDH88,5973
+pygame/docs/generated/_images/Bagic-INPUT-resultscreen1.png,sha256=RDZbxtVyFMJXdZA8wouSyJJjXf2MQ2WYTBzVotsDH88,5973
+pygame/docs/generated/_images/Bagic-INPUT-sourcecode.png,sha256=3F2c3AnravGgsRMxaNXlaekyqrhMl2cwYySJxhj7L0A,77061
+pygame/docs/generated/_images/Bagic-INPUT-sourcecode1.png,sha256=3F2c3AnravGgsRMxaNXlaekyqrhMl2cwYySJxhj7L0A,77061
+pygame/docs/generated/_images/Bagic-PROCESS-resultscreen.png,sha256=hQ1m6S1xhXpcaf0g50VRoOagmsiZZpUeOBx7QgG7Lqs,5348
+pygame/docs/generated/_images/Bagic-PROCESS-resultscreen1.png,sha256=hQ1m6S1xhXpcaf0g50VRoOagmsiZZpUeOBx7QgG7Lqs,5348
+pygame/docs/generated/_images/Bagic-PROCESS-sourcecode.png,sha256=vj0D6wrXFNjIHKmRFZrltZH4nH51zG6YSy94ID2fWos,66070
+pygame/docs/generated/_images/Bagic-PROCESS-sourcecode1.png,sha256=vj0D6wrXFNjIHKmRFZrltZH4nH51zG6YSy94ID2fWos,66070
+pygame/docs/generated/_images/Bagic-ouput-result-screen.png,sha256=Ig1vKczM-l0ebtdjYEHdwcJuqt8IoyUiK-RANEC065k,4819
+pygame/docs/generated/_images/Bagic-ouput-result-screen1.png,sha256=Ig1vKczM-l0ebtdjYEHdwcJuqt8IoyUiK-RANEC065k,4819
+pygame/docs/generated/_images/Basic-ouput-sourcecode.png,sha256=B6OVjvOtA2ZwiEwJyYkK1-tsGyN13y8O9kls1OYvzTo,57466
+pygame/docs/generated/_images/Basic-ouput-sourcecode1.png,sha256=B6OVjvOtA2ZwiEwJyYkK1-tsGyN13y8O9kls1OYvzTo,57466
+pygame/docs/generated/_images/angle_to.png,sha256=vP3M5zZVFf-ooagw-hRTlnhBLbGQvX9gxO7nX_gBgbc,25349
+pygame/docs/generated/_images/camera_average.jpg,sha256=dkXZ7NdHmM69rbcYCpu0vKtqmHF3qh9nPUgZX3wlWDc,20881
+pygame/docs/generated/_images/camera_background.jpg,sha256=exoGN5fT9IKQyMJK_3VrEjfKTvr5yMeoSLCQplD0hes,7493
+pygame/docs/generated/_images/camera_green.jpg,sha256=NpIuT5qRzN5I7TFLva8m_kCAo1cwOuR5R5-Du9kaEo0,10219
+pygame/docs/generated/_images/camera_hsv.jpg,sha256=tfL0KJyxSk5A_KjVZR7MdV-qegBhej5HlXXw2CnoZR8,36673
+pygame/docs/generated/_images/camera_mask.jpg,sha256=0u0yMCldZMvSW1vyO2KK32D-fVYuYpXlNzmWwbdZ__s,18779
+pygame/docs/generated/_images/camera_rgb.jpg,sha256=GN_1jI8mnDJm1bRbjNBmpJETDSAKcVAS9BxmycYMMv0,32488
+pygame/docs/generated/_images/camera_thresh.jpg,sha256=WBYm8M-TxnuKCYEBvmu68iO_r9EYucnENZ5Ew8i6tqk,4346
+pygame/docs/generated/_images/camera_thresholded.jpg,sha256=OMh-3zXV2a-aahnMQlE7ihvxwXy1UADb15c3LzIWgh0,23678
+pygame/docs/generated/_images/camera_yuv.jpg,sha256=Gp0omp1py-_j6Qpv95VIo6EmDO2u5VY83fPWA2Rd6Bk,20105
+pygame/docs/generated/_images/chimpshot.gif,sha256=Yc_ufSFTkZ5NA1IogV2juH5Cr4_ykoI7QcXQvfGYBfc,46010
+pygame/docs/generated/_images/draw_module_example.png,sha256=jAhc1HG8RXjjPnjn9AwncGwfi4dKbaO7rQgqcd5OCeQ,6476
+pygame/docs/generated/_images/intro_ball.gif,sha256=vEs0-OG_j55JZJML48IXhHsN4ZMIWrqlS7dfxd9-hxc,5015
+pygame/docs/generated/_images/intro_blade.jpg,sha256=Aj59Tt9z1mdJeDK89HbWaQ7DVTDKbzoUDT-vNcJnYQo,2631
+pygame/docs/generated/_images/intro_freedom.jpg,sha256=RL-jChKVMdqoS7BN5NGV7hjlxSgU4qaKrj4ZXH2zsI8,7050
+pygame/docs/generated/_images/introduction-Battleship.png,sha256=6iHEhqo_HnXRfmQv9yriYMc3dX8Q2TwGbSGDQREFkN4,165586
+pygame/docs/generated/_images/introduction-Battleship1.png,sha256=6iHEhqo_HnXRfmQv9yriYMc3dX8Q2TwGbSGDQREFkN4,165586
+pygame/docs/generated/_images/introduction-PuyoPuyo.png,sha256=OEMjFSzQc8vJLQryUdkp7lJ3DhIw_yEo5-5nm2vBfrs,31388
+pygame/docs/generated/_images/introduction-PuyoPuyo1.png,sha256=OEMjFSzQc8vJLQryUdkp7lJ3DhIw_yEo5-5nm2vBfrs,31388
+pygame/docs/generated/_images/introduction-TPS.png,sha256=M4ioZMyjR2n7pQIp8UhGRV4m2V_rcXJCuo5lU3V7yGw,136031
+pygame/docs/generated/_images/introduction-TPS1.png,sha256=M4ioZMyjR2n7pQIp8UhGRV4m2V_rcXJCuo5lU3V7yGw,136031
+pygame/docs/generated/_images/joystick_calls.png,sha256=oNAQgfZ8GM5_Z17hoNVrLf1tYeRnths60ZrlhJduWhs,30004
+pygame/docs/generated/_images/pygame_lofi.png,sha256=QBECBUalJHRExXhf7nt-QpsVcu9LQ3RSAYVVS04AX3M,134242
+pygame/docs/generated/_images/pygame_logo.png,sha256=Jc1Lz47pY3mHjEFNzQXV9gx-olUUYCGuFYrutncaTXE,132068
+pygame/docs/generated/_images/pygame_powered.png,sha256=LgbswFcg647alSC5SawDPH96xuTMcWmMqVA6Zvs2K3Q,179911
+pygame/docs/generated/_images/pygame_powered_lowres.png,sha256=9go5WMiAE4fTEmB9w-zatEfROGl1IUWJGBpKoLqy-wU,179911
+pygame/docs/generated/_images/pygame_tiny.png,sha256=BXPk3OkSWdSkqjMkCQ1Dt5WjxZfb4zj4c2ir9U9_Y7Q,15310
+pygame/docs/generated/_images/surfarray_allblack.png,sha256=XEUO2hKFfTfZMyaqbPvM0u3zmETfl___AANBkHn6y-w,125
+pygame/docs/generated/_images/surfarray_flipped.png,sha256=UZ1FpljGrdAnB1UCUTuAfeJJxyqI-_0duSCKqy9UN3w,50835
+pygame/docs/generated/_images/surfarray_redimg.png,sha256=6tlO_tZokQTsfgvD3yNW21nHA5uA9hDWoaL7POrr_qE,23443
+pygame/docs/generated/_images/surfarray_rgbarray.png,sha256=8US5r3GcG_jZBncK-47HG2JLB2ZwQjaSBWhb3ynNs9w,50897
+pygame/docs/generated/_images/surfarray_scaledown.png,sha256=Z68XSoPUvV5bYIhJdkmhZYr42JpQKnC8g9hmN18iaWI,15109
+pygame/docs/generated/_images/surfarray_scaleup.png,sha256=sdxQlmVoRhlF_ocD2ecre0q51Q2LLoCxNsJaI8O1NYI,67759
+pygame/docs/generated/_images/surfarray_soften.png,sha256=XNzAZzfLUqn-QIQ25TxB2ujoDZkPEIRI6QSDnjJMIk0,47540
+pygame/docs/generated/_images/surfarray_striped.png,sha256=iH7gLZhBu5aATV-vfrsQmW30KdsMQoYB_LD-efRzl_Y,392
+pygame/docs/generated/_images/surfarray_xfade.png,sha256=uD8g8Ueqc3IMZaOqiD4n4sZmg5I4j798oIzl1pWDM70,41834
+pygame/docs/generated/_images/tom_basic.png,sha256=RzKBFmep1ksfD5QrJVW7JzdHvDN1_4ayUfGyVN-8Wms,5139
+pygame/docs/generated/_images/tom_event-flowchart.png,sha256=sG8YOH8YX2yTtx4-agBUWIcT8-jj1m6uKCF98QxmbKQ,5528
+pygame/docs/generated/_images/tom_formulae.png,sha256=6k8VDsueGVOh01ZrAVLE5miliOWKhQJqIrlPW_JEmXk,6763
+pygame/docs/generated/_images/tom_radians.png,sha256=BkBTx4OoiSXO5d6sMG01MyYBtO7EmDvgJixbTRKMm9Q,17409
+pygame/docs/generated/_sources/c_api.rst.txt,sha256=vSJF6tvDzMDdGTnXyyAi-Zz-iApxeuO-n5jTvceAQNw,473
+pygame/docs/generated/_sources/filepaths.rst.txt,sha256=sou-1N5amW1JXHqwKUU0BqYQmm2c5qDjjFKVIKIppfo,899
+pygame/docs/generated/_sources/index.rst.txt,sha256=UMDM3eMRAtTSwIiQfMXkaCKNWW6dlsnqR6MpxfGAMyI,5965
+pygame/docs/generated/_sources/logos.rst.txt,sha256=oJNZMoKbfJ9EuXTeipAahQGSpPkTaAcyHEIGWJPdWW8,1337
+pygame/docs/generated/_sources/ref/bufferproxy.rst.txt,sha256=V5gSzq__85alqL5Is05MTmpDv5NUHbLuuW4PYH98MzI,4708
+pygame/docs/generated/_sources/ref/camera.rst.txt,sha256=VGSdYbW2ii37WG3kC8HGn2Ao-TPRPYXTLez9VnwI364,9628
+pygame/docs/generated/_sources/ref/cdrom.rst.txt,sha256=0FlYODuxoQOsTYpZ9EiDYmUD9PIQrAeAlsXE8I67RQk,9068
+pygame/docs/generated/_sources/ref/color.rst.txt,sha256=DbdHOccIvmf8D8ERvo-fHKKvqKmZYb3tcNbQkSh_dj8,10798
+pygame/docs/generated/_sources/ref/color_list.rst.txt,sha256=XLIKLmTx_liiWk0gdKlrElBlCNZD0_sIvAg_El6tgfE,96353
+pygame/docs/generated/_sources/ref/cursors.rst.txt,sha256=dRrEevF8Uaho0It82zk-f1ySA9Pa_y3kUhM4mEm-zTQ,9415
+pygame/docs/generated/_sources/ref/display.rst.txt,sha256=AXirEKIGsJlszFewn2XoB0Jb_KM272_985BdEhqgL9U,29188
+pygame/docs/generated/_sources/ref/draw.rst.txt,sha256=O-i4wVe9KULlpBvhdKrKbAYXiszO2_FUDhjzoEArmI0,24657
+pygame/docs/generated/_sources/ref/event.rst.txt,sha256=ls05WLm5Yc0yd7t0-roayj9aNyW4awdWD5kjVruciL4,22208
+pygame/docs/generated/_sources/ref/examples.rst.txt,sha256=044bT9v4pQYRZqmaAwrdAI_GV3HLiwRlWHKYturVbN4,14095
+pygame/docs/generated/_sources/ref/fastevent.rst.txt,sha256=6gyem0cRZ-syKMDcQ6qexC83dJMro1O9-XHY_k2_HNg,3545
+pygame/docs/generated/_sources/ref/font.rst.txt,sha256=AGiup5hzk_KnfOElwadQGmzkzG9XcRex2yq9EvsNB-o,18217
+pygame/docs/generated/_sources/ref/freetype.rst.txt,sha256=R5RnUREdR9b5NPNsPYYTthl_ExWUcmX7vclWFjeNpyM,31386
+pygame/docs/generated/_sources/ref/gfxdraw.rst.txt,sha256=bQYID2bOb6xETZoDKM0mRtaCU_QD48MjQmCV8lvEErE,21842
+pygame/docs/generated/_sources/ref/image.rst.txt,sha256=4NJf_cJ9VVHm7VD1MD4msBUvjytoaCTkB83W6vubfkE,13395
+pygame/docs/generated/_sources/ref/joystick.rst.txt,sha256=sXgDyfTcwBdasNxdzW9r0Xnesxo6iwz23OBYG6SB0ws,19389
+pygame/docs/generated/_sources/ref/key.rst.txt,sha256=ntU4tjZxkI-fF0m4zQBlo5KpZuxt3bpOc3BlNAdrpFI,16327
+pygame/docs/generated/_sources/ref/locals.rst.txt,sha256=VZi8cE2ZlPei4WdzSsok0fU_BOgPhlOmjfTCTSvl0N8,1022
+pygame/docs/generated/_sources/ref/mask.rst.txt,sha256=RAVpZZNK2i-ltHlCbNZgFa80x2RAXc_4lYkPgAVoyjs,24220
+pygame/docs/generated/_sources/ref/math.rst.txt,sha256=YbCqnfzaJeI1k8AYI45w8rokZ_x9f2NdnkoK2njrv3k,38384
+pygame/docs/generated/_sources/ref/midi.rst.txt,sha256=jIJ5qOZNvlMtBH0TA2icWTSB4_7CcUmU6_y9uVhGiak,14358
+pygame/docs/generated/_sources/ref/mixer.rst.txt,sha256=tCsbvTknDWeWJTeXfgUFs4UByImuBeeg6FNgevABeZ0,22461
+pygame/docs/generated/_sources/ref/mouse.rst.txt,sha256=pzAlscsACbo_6p1pbazcbUaJW2vEf1Zx--jwy3ktA3k,8129
+pygame/docs/generated/_sources/ref/music.rst.txt,sha256=lLimQ-C1JXLMGw-gIHIsZ7r0bbav7SPTovbCqiXuO5Q,9531
+pygame/docs/generated/_sources/ref/overlay.rst.txt,sha256=loD8HVw0KQnsaPPisw_Xe8yms59CEAbdsboXwhS7zqk,2659
+pygame/docs/generated/_sources/ref/pixelarray.rst.txt,sha256=p0HY0TLZFoZAayVW9FxW8t0G4-Cjblhfd07uTkXqJK0,10204
+pygame/docs/generated/_sources/ref/pixelcopy.rst.txt,sha256=SMb-VGMZSxBBWgAjsFg2ucaQp80KglnIo56AkS7O-vE,4531
+pygame/docs/generated/_sources/ref/pygame.rst.txt,sha256=mEu8Av5H35_dC0JNXu9q1W6xnwgwvRr8ywaxNUEOcu0,15129
+pygame/docs/generated/_sources/ref/rect.rst.txt,sha256=Qf24A1_9KRJgS1-L5xlHoRWKQbDI0bE4rViR8Zc1aBM,21147
+pygame/docs/generated/_sources/ref/scrap.rst.txt,sha256=eeN2xL1riH4ZKbpNJSAXVlG1Ew2JYn1B-JiSBmdtZ_Q,7988
+pygame/docs/generated/_sources/ref/sdl2_controller.rst.txt,sha256=RUs3ssClJMfMjncOXVpj0iTUkmSnLHa9pvH_D6DcylY,9401
+pygame/docs/generated/_sources/ref/sdl2_video.rst.txt,sha256=1WSISwTtmvOX6n_wEzAFk5Yj7XgmeG5GdrPIZB8K6RQ,9117
+pygame/docs/generated/_sources/ref/sndarray.rst.txt,sha256=9N1u6w7AxTr943nJiSUoDyNi-8qE_tWJeVU0rVEQYi0,3260
+pygame/docs/generated/_sources/ref/sprite.rst.txt,sha256=2RfcFwVV0xc3duWp_n_sVJSPFa9U_SOZKRb0AkTIGOM,30575
+pygame/docs/generated/_sources/ref/surface.rst.txt,sha256=eNBOZq2pkRHQcVtErIZs8jiG-nhAXSq3CR-Bup7_OQ8,36859
+pygame/docs/generated/_sources/ref/surfarray.rst.txt,sha256=rBeiZncxG9HIetGkZS0IcwxIlHqQgCxpiZxO6bSvY8s,12251
+pygame/docs/generated/_sources/ref/tests.rst.txt,sha256=vzkEPNYlI2274wXW3FKI1c9Qqmo293E7_eZhIIV9Xs0,4636
+pygame/docs/generated/_sources/ref/time.rst.txt,sha256=WJTVcpIu2GT39OD3k5MYQ3gXTqQJwJJaiNjA7GvWMlk,5624
+pygame/docs/generated/_sources/ref/touch.rst.txt,sha256=v7V0P85KlxiQIBLjaVyhTtH1fmDmqif-kDLhV0O6x4s,1957
+pygame/docs/generated/_sources/ref/transform.rst.txt,sha256=iZRvH-iMBYCszGMcoMQhut5OQDrGo07ElfF7jtX_mdM,13055
+pygame/docs/generated/_static/basic.css,sha256=sAj59T-GAN18hejRlkVoHGWW1U4oam_yVWMgFt5P4xc,15597
+pygame/docs/generated/_static/doctools.js,sha256=tcrUIItYleYYKj1roqKMOLpMPtfd_0Y1g5qkMO7llhQ,10766
+pygame/docs/generated/_static/documentation_options.js,sha256=7YP9mP_0AQlotXr2BHmLPANT3kMK4mLSdQOiHEewdoM,435
+pygame/docs/generated/_static/file.png,sha256=XEvJoWrr84xLlQ9ZuOUByjZJUyjLnrYiIYvOkGSjXj4,286
+pygame/docs/generated/_static/jquery-3.5.1.js,sha256=QWo7LDvxbWT2tbbQ97B53yJnYU3WhH_C8ycbRAkjPDc,287630
+pygame/docs/generated/_static/jquery.js,sha256=9_aliU8dGd2tb6OSsuzixeV4y_faTqgFtohetphbbj0,89476
+pygame/docs/generated/_static/language_data.js,sha256=JUzCtS3qbjtQkX7mhfWeiEGT3a8lHfhiLzC_G3YxgnU,11151
+pygame/docs/generated/_static/legacy_logos.zip,sha256=69C68jO62qau7eQx3z6U9pLnDhAMXK72RZ4PatlSMdY,51315
+pygame/docs/generated/_static/minus.png,sha256=R-f8UNs2mfHKQc6aL_ogLADF0dUYDFX2K6hZsb1swAg,90
+pygame/docs/generated/_static/plus.png,sha256=VBFRmblqEwy6AhR8R8DetD3Mm58ItRYruoZCs0mArGM,90
+pygame/docs/generated/_static/pygame.css,sha256=RTUqrXsr09Rdj6xtpM2Y_RZK90S1zXOpOAo2TV-0Gho,12699
+pygame/docs/generated/_static/pygame.ico,sha256=YeIWletq938Rg_G11m_1iGL_zw9T_U1QXZhjnbHjJSU,1078
+pygame/docs/generated/_static/pygame_lofi.png,sha256=QBECBUalJHRExXhf7nt-QpsVcu9LQ3RSAYVVS04AX3M,134242
+pygame/docs/generated/_static/pygame_lofi.svg,sha256=5eTaA6Alehzg0SuUSEFa7uONJe-0WHthEXNKPj75j5o,59281
+pygame/docs/generated/_static/pygame_logo.png,sha256=Jc1Lz47pY3mHjEFNzQXV9gx-olUUYCGuFYrutncaTXE,132068
+pygame/docs/generated/_static/pygame_logo.svg,sha256=3Oxb-IF0TZVcfuYPz-bHbd-OYLNLkTVuxiY1vWAmHUk,59262
+pygame/docs/generated/_static/pygame_powered.png,sha256=LgbswFcg647alSC5SawDPH96xuTMcWmMqVA6Zvs2K3Q,179911
+pygame/docs/generated/_static/pygame_powered.svg,sha256=1_0Cxa_PMRGgGvd2KktrKYSajaxGH_3FKaNWIpxeUbU,102819
+pygame/docs/generated/_static/pygame_powered_lowres.png,sha256=9go5WMiAE4fTEmB9w-zatEfROGl1IUWJGBpKoLqy-wU,179911
+pygame/docs/generated/_static/pygame_tiny.png,sha256=BXPk3OkSWdSkqjMkCQ1Dt5WjxZfb4zj4c2ir9U9_Y7Q,15310
+pygame/docs/generated/_static/pygments.css,sha256=DgUJ36vDxEt3r0T7AvUzwp5bippLlpnRon3w9Jh2zbk,5003
+pygame/docs/generated/_static/reset.css,sha256=wqvSs8L_cB2K6bR903cOJkEtfJi0LpNQFl3nC_kZQr4,1083
+pygame/docs/generated/_static/searchtools.js,sha256=1rXuIe3XtGwCnFERMmcZ3OxcX1I2hwSpOy1khcsiQUw,16634
+pygame/docs/generated/_static/tooltip.css,sha256=UkuHG9X2M7DaTSMJX3-mW-4LV8wBtFxfG5k_pr7xrc4,798
+pygame/docs/generated/_static/underscore-1.13.1.js,sha256=zBD3mc0Pa2X5XEASRFSX5bo8ufUZZKlGiUCye96YtIc,68420
+pygame/docs/generated/_static/underscore.js,sha256=IY-xwfxy6a9rhm9DC-Kmf6N2OStNsvTb8ydyZxtq5Vw,19530
+pygame/docs/generated/c_api.html,sha256=Lw1AQDc-3yIjvgQcKLJPAa8VOy-ybWqAaPK_TO4jWNk,7460
+pygame/docs/generated/c_api/base.html,sha256=ZQiHuN7o82l4qmRbSV6oOjjaUg3vWn9Dlbh7h09m2no,32404
+pygame/docs/generated/c_api/bufferproxy.html,sha256=2ArK8yfTJMplk-iyDJkKcNfYz_k4XKKllLaVdMkmRno,11959
+pygame/docs/generated/c_api/color.html,sha256=KlXoi-1JLhSq4sgFQmES-7IVxcwzWbyAJy42w_nI-nk,10410
+pygame/docs/generated/c_api/display.html,sha256=aPZgjsFdizAFxgJdxMVO-t5zU7jisTW_a3CQ4A1EXMY,10887
+pygame/docs/generated/c_api/event.html,sha256=xCXCaqgVBvVMhQJxpHdj2W31V65ixhsVTICxusFxoBQ,11867
+pygame/docs/generated/c_api/freetype.html,sha256=jhYyED9wC4urWPDHb_alRrGdvr3OVZEKvxkrXKFpPoU,11333
+pygame/docs/generated/c_api/mixer.html,sha256=ff1fpp9Kfqzd109XP3U_Kmo0k7qtukXPUdJCWiSS_Nc,15337
+pygame/docs/generated/c_api/rect.html,sha256=0mxwUjUHMU2JeAsjcBY0EN2KCQx1k0rUdOlQUlhMHYs,13827
+pygame/docs/generated/c_api/rwobject.html,sha256=76BaoydVPkxHnIkRvt704gQA7tjsF5yEuHyT6mkwR10,15250
+pygame/docs/generated/c_api/slots.html,sha256=3f_T9j4r-E5NfJraJmdLKN9UuMkjH7khhatJcezxnhA,6776
+pygame/docs/generated/c_api/surface.html,sha256=Xb0f2_9rIV1Zl6IXsq6aWSOCcN4z7oPWuWK1t42B8tk,14867
+pygame/docs/generated/c_api/surflock.html,sha256=YPAd1PmCkujnAtV-gIb-ssaII1oS5MUescXeddgulm4,16769
+pygame/docs/generated/c_api/version.html,sha256=xaKdtBHq7neRkkLGtPO0xLASVrazGDetRwnKjfumC7g,8182
+pygame/docs/generated/filepaths.html,sha256=tng2esapDYC9hUDhUN5lzVecNNFY9r4RA-IlPJmLRXs,6443
+pygame/docs/generated/genindex.html,sha256=DyShsSlYaU3GcJTTjNbnWHq554WNzXskdy4WapN51Xg,124089
+pygame/docs/generated/index.html,sha256=fUMts7EcGaYmDYOZRctSoRf-T5ObfOcKrmRNYj5UCjI,24814
+pygame/docs/generated/logos.html,sha256=xU61j6JXTfN_wujbO0XICNFsIvLdGC8-jOuWP4K21UM,7489
+pygame/docs/generated/py-modindex.html,sha256=KmQRs8Cy_iU01sKPBZz866xFA_oDeSrTBw2tDh30BLE,11506
+pygame/docs/generated/ref/bufferproxy.html,sha256=lRVOJaZFUIXk9aGoxBaF3AKTxBLnJ-0wj9tCFl--ZJM,17724
+pygame/docs/generated/ref/camera.html,sha256=_roq9rpJ7gBdrQW7BAt2fXeAbsScHJaU7fYP1EgYn-E,27345
+pygame/docs/generated/ref/cdrom.html,sha256=VU_VIR8tZGUdm1ecMvlnBSr2LmkCoamG5k58mJNdvY8,33363
+pygame/docs/generated/ref/color.html,sha256=Q4XEuSQwCGjFWYAaQtxDL432PRSEsn2A13o-tJULulk,36746
+pygame/docs/generated/ref/color_list.html,sha256=YfCMiLQSHwUbqvPbT-GSRp4S8FqmnMRwi14GKn0rUwk,177048
+pygame/docs/generated/ref/cursors.html,sha256=gvgKgSiyaK59oEjCPUWzUB1FV-3QmHJuYH6xtmsVSj0,35542
+pygame/docs/generated/ref/display.html,sha256=2Mr6PZvbQvq62HcD1WaDISymbH3NALLu1Bau_YB-25Q,77376
+pygame/docs/generated/ref/draw.html,sha256=5hGggOPVpdx5e6TrQ5mP18lglYBUMJ3o-Rut28DbUmg,83951
+pygame/docs/generated/ref/event.html,sha256=pMKDkbmZlBf2LncB7USBMg4HXJ5gGILildOY9bCnVa0,70290
+pygame/docs/generated/ref/examples.html,sha256=f6eV54NptZfxomYBVtUQ_JSX6aYqP1c5hmSPcKNmvP4,48526
+pygame/docs/generated/ref/fastevent.html,sha256=1cEZkxfAUpuIrN1K46GxvsPH-3UKxr1O4093BYFSjKc,15067
+pygame/docs/generated/ref/font.html,sha256=0hZdZ7d8e3WkKG-hgksBB_IbXPRi14j3kyVOKPWHg7E,49968
+pygame/docs/generated/ref/freetype.html,sha256=TOik0DKcHynRB6NcmFxbm-xw3V73MI8k0v1E4mUezF4,100700
+pygame/docs/generated/ref/gfxdraw.html,sha256=zJcjKFKVAvvQMJIoTBZLsyp327iCxjvd872M_R2MkOA,79775
+pygame/docs/generated/ref/image.html,sha256=NEkAhFkE_-mTkoAEYwklIouEeA6Qs_uQt6DTYxaRC70,40396
+pygame/docs/generated/ref/joystick.html,sha256=B4d53VargBmuFJd4U9WGp6eUlMk4c2S8_Qaxr_3zU2Y,96474
+pygame/docs/generated/ref/key.html,sha256=An3D5u04eBNZhk4QfeigZmre_t2cQS7LUgP4tcPP8vU,42670
+pygame/docs/generated/ref/locals.html,sha256=MI2KfqzXDcAZ7_kSdaNoU3zzCjtDhrqwIg2n_w_UxgM,8586
+pygame/docs/generated/ref/mask.html,sha256=24NSviDE4wevWJVx3DDiT1GAnZ1zSp8vbMoXMlQSbek,80452
+pygame/docs/generated/ref/math.html,sha256=7IFwnaa43qpMY46TUeV7jsEG_W8nHVuZXjUZxgNJmlQ,123821
+pygame/docs/generated/ref/midi.html,sha256=KvMp4wnP6r44dpjDmMpB3OyDpLnBxD5LfjCulwbAGBc,52564
+pygame/docs/generated/ref/mixer.html,sha256=3pQ_i7f6CPOR4Yufn1F99Nt8AcAwldlLv2ib6tGH6Cc,64104
+pygame/docs/generated/ref/mouse.html,sha256=hVw7tO13mcpnKn6HQEvhDuW5SgtrqiIvY-mG8CwrL2Q,27459
+pygame/docs/generated/ref/music.html,sha256=10qOoR4JhawCVvLbmUelkMRTgJR2idTa5H4DwTs8UNw,33604
+pygame/docs/generated/ref/overlay.html,sha256=_qUGykGQyJHPiaZ_siFz0A9W3lPhFGs2kcfMBbqfwD0,10980
+pygame/docs/generated/ref/pixelarray.html,sha256=99izSXe-5NKMAieADRmYOhFom-l9B8Jm33Pu414Pwm0,31443
+pygame/docs/generated/ref/pixelcopy.html,sha256=2PAOs685k9rzfZgmx8KVKCqps8CVfMG3XnJd6WkeeMc,15087
+pygame/docs/generated/ref/pygame.html,sha256=qF-OSBBD77GtKpbfTM9NkSq6ATGf7yTlESiAO32oVuQ,50074
+pygame/docs/generated/ref/rect.html,sha256=DGVfrhhDCKAB4JLs-gIneDnVFr9yeU3vBoUZpibqNzM,70016
+pygame/docs/generated/ref/scrap.html,sha256=E_1LBW1VlStnkiRr-_uC8cyPplvGGWScYSYubwm2gcc,30535
+pygame/docs/generated/ref/sdl2_controller.html,sha256=9QfcQ0CXxPqGM25RCZ74OlZ-gykwefTCOq1TSBV6aWI,36827
+pygame/docs/generated/ref/sdl2_video.html,sha256=j-avD6hIBb4GlBA5mpOvUxvEVdNEj2FUQ7fmf1kq8zY,61947
+pygame/docs/generated/ref/sndarray.html,sha256=Y8lPHYULXhpCFNCYBBallTO8kRf45DUCtOaS_QBKzZY,14688
+pygame/docs/generated/ref/sprite.html,sha256=XVOaLraWS8CB-EWzCV5WTx2X1dyg8sLn8vlSPnrcwe4,96169
+pygame/docs/generated/ref/surface.html,sha256=Sfft_roDCcP-JoDSUWi_2v8YGJPq4tw7LUVuCSnPyhA,89941
+pygame/docs/generated/ref/surfarray.html,sha256=OguY3VVXSvN7yVfmDSI5BkTTlnnyXCylyc6CEU7kS7M,38289
+pygame/docs/generated/ref/tests.html,sha256=bZZSF54FYxLJiBWx5INWruxkYnQrr-bQoNh3x0f8zjo,18545
+pygame/docs/generated/ref/time.html,sha256=dqF0oQnTGiPqHrazsN2jXPdBA-j_UxuIGnTdyluioEA,20013
+pygame/docs/generated/ref/touch.html,sha256=tpnqDNbbZxo42Cr6HousY7ia0oenXlDjiqwvvGxYewE,12966
+pygame/docs/generated/ref/transform.html,sha256=ZjppqbU1t1yH5SOAIlTfkWE7Ml1LglFg2NXeUumvuNA,42911
+pygame/docs/generated/search.html,sha256=8iHkNUKOcyvxUmqijrnSWPfbnXn2S47bFZyON4LEEYE,3238
+pygame/docs/generated/searchindex.js,sha256=7Su5v3D7gWib5W9fAJ2iqwmYws0fy3-iOA5Hlt-u7Hw,205268
+pygame/docs/generated/tut/CameraIntro.html,sha256=gjsPbd6i8r3CuB39NSS3ebKfc81q8zKx7EcFYai5_zI,38418
+pygame/docs/generated/tut/ChimpLineByLine.html,sha256=TXzXpdckuDrvUtQpt2vxHMQnAU8uWx7FiTxp_CyH2bY,58902
+pygame/docs/generated/tut/DisplayModes.html,sha256=NCz7oHKK5-D-8gxm_7lFHLh73WDykwwahfA2n1ZbRWs,22284
+pygame/docs/generated/tut/ImportInit.html,sha256=PV-Q6A40ebgIkgJnrQDC1rMYMw_Yi9JszEyY4FtK8T0,9719
+pygame/docs/generated/tut/MakeGames.html,sha256=ejBUx-g7g_2nrZ5adF3sDEwS2828JT_EhmJlCwJByh0,14897
+pygame/docs/generated/tut/MoveIt.html,sha256=dupaxzbHu-Mr-ZCm5LOzoJ-gT9mmynkyWaU-EGOYZHw,67410
+pygame/docs/generated/tut/PygameIntro.html,sha256=F3P59SRoi_zi0hMMm8DBLUtMTWQkI9pOMvXDwx0fA1o,29318
+pygame/docs/generated/tut/SpriteIntro.html,sha256=B05DgGzG691HnGf8xXQaBvZ0UZKHYIdtFKIn9Pb53rs,44403
+pygame/docs/generated/tut/SurfarrayIntro.html,sha256=U3W-sVjy9qgH9kTjzwXaGBlc-Q9x6avaZvN0Yr8Hn8A,51181
+pygame/docs/generated/tut/chimp.py.html,sha256=gDYuo9jwQHNo8PrdnsFYA3kAqwjh3x52D9mO-UvCNQE,36445
+pygame/docs/generated/tut/newbieguide.html,sha256=kon8-c8fmp9ds3s6M8DDJGEBwN2jMDroWfxWwOj1OFI,45961
+pygame/docs/generated/tut/tom_games2.html,sha256=XdeJpGj0BzUDozpS2S3mGIRfmm_yeivX-mxU9LWW-Qk,17751
+pygame/docs/generated/tut/tom_games3.html,sha256=9aNjVFxrhR79nTOaZCem5hWcolnooGmctUlOuuQqP2I,15361
+pygame/docs/generated/tut/tom_games4.html,sha256=KHIl__Sz-fhLwXeP5pvDXokaDgQSCWnDx40ThLHEbXY,19258
+pygame/docs/generated/tut/tom_games5.html,sha256=K1-_6ASM8ngUfHyFZJEvsqzUQeNltibs4hX_-c_LmX8,21519
+pygame/docs/generated/tut/tom_games6.html,sha256=yFDau-HVpkYB3jpbnP_zA5e8_3CnC_fBtWRDzHKo31I,53288
+pygame/draw.cp311-win_amd64.pyd,sha256=b2PRY0K5X-GncnWxpI3Q5XPkwEFAit0d1ptiF7eK1wI,49152
+pygame/draw.pyi,sha256=VtcYPysR7rBEPcB8XZrTmkvgvBZDoLPKI6mwhFIWubM,1694
+pygame/draw_py.py,sha256=ME-6PCJ7TRsIYoExnwgvEwj3iGTFPgjkNepQag8Nh1g,18662
+pygame/event.cp311-win_amd64.pyd,sha256=Sf0rb8JUN4p2YRt75VcoHtD_h5_9W82JV474Q6EBpaw,44032
+pygame/event.pyi,sha256=4v_0k2oj2RLibGr_hg5585mvi9CHaAB1tN7wN286Db0,1488
+pygame/examples/README.rst,sha256=K1xE9Fz9XWB05ZKpu4b96ycF19_DY5a3Y-Plv-oeqww,4174
+pygame/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pygame/examples/__pycache__/__init__.cpython-311.pyc,,
+pygame/examples/__pycache__/aacircle.cpython-311.pyc,,
+pygame/examples/__pycache__/aliens.cpython-311.pyc,,
+pygame/examples/__pycache__/arraydemo.cpython-311.pyc,,
+pygame/examples/__pycache__/audiocapture.cpython-311.pyc,,
+pygame/examples/__pycache__/blend_fill.cpython-311.pyc,,
+pygame/examples/__pycache__/blit_blends.cpython-311.pyc,,
+pygame/examples/__pycache__/camera.cpython-311.pyc,,
+pygame/examples/__pycache__/chimp.cpython-311.pyc,,
+pygame/examples/__pycache__/cursors.cpython-311.pyc,,
+pygame/examples/__pycache__/dropevent.cpython-311.pyc,,
+pygame/examples/__pycache__/eventlist.cpython-311.pyc,,
+pygame/examples/__pycache__/font_viewer.cpython-311.pyc,,
+pygame/examples/__pycache__/fonty.cpython-311.pyc,,
+pygame/examples/__pycache__/freetype_misc.cpython-311.pyc,,
+pygame/examples/__pycache__/glcube.cpython-311.pyc,,
+pygame/examples/__pycache__/go_over_there.cpython-311.pyc,,
+pygame/examples/__pycache__/grid.cpython-311.pyc,,
+pygame/examples/__pycache__/headless_no_windows_needed.cpython-311.pyc,,
+pygame/examples/__pycache__/joystick.cpython-311.pyc,,
+pygame/examples/__pycache__/liquid.cpython-311.pyc,,
+pygame/examples/__pycache__/mask.cpython-311.pyc,,
+pygame/examples/__pycache__/midi.cpython-311.pyc,,
+pygame/examples/__pycache__/moveit.cpython-311.pyc,,
+pygame/examples/__pycache__/music_drop_fade.cpython-311.pyc,,
+pygame/examples/__pycache__/pixelarray.cpython-311.pyc,,
+pygame/examples/__pycache__/playmus.cpython-311.pyc,,
+pygame/examples/__pycache__/resizing_new.cpython-311.pyc,,
+pygame/examples/__pycache__/scaletest.cpython-311.pyc,,
+pygame/examples/__pycache__/scrap_clipboard.cpython-311.pyc,,
+pygame/examples/__pycache__/scroll.cpython-311.pyc,,
+pygame/examples/__pycache__/setmodescale.cpython-311.pyc,,
+pygame/examples/__pycache__/sound.cpython-311.pyc,,
+pygame/examples/__pycache__/sound_array_demos.cpython-311.pyc,,
+pygame/examples/__pycache__/sprite_texture.cpython-311.pyc,,
+pygame/examples/__pycache__/stars.cpython-311.pyc,,
+pygame/examples/__pycache__/testsprite.cpython-311.pyc,,
+pygame/examples/__pycache__/textinput.cpython-311.pyc,,
+pygame/examples/__pycache__/vgrade.cpython-311.pyc,,
+pygame/examples/__pycache__/video.cpython-311.pyc,,
+pygame/examples/aacircle.py,sha256=cKBEPuz4nVNgiyxf9SFI4c4P8jFmvJMHh_rlKDahm9I,1037
+pygame/examples/aliens.py,sha256=CbZE5cSiR0GZaoUDXUOnao_0fLsMloxaFUJqaI9J6lU,12225
+pygame/examples/arraydemo.py,sha256=G4ZYl8JqPNnbEJl6Ed7UCBfJvrz9QtHauFoFus87WB0,3255
+pygame/examples/audiocapture.py,sha256=hkq7mMKSmSvfHHD5UiIER4928il2l0mqdahkJViHHr8,1561
+pygame/examples/blend_fill.py,sha256=CCQJraeaBLEea-2_lWaUxVlcjM5rxy5UykRIjWCUAu0,3399
+pygame/examples/blit_blends.py,sha256=han3N9jK8dy57EePLJNJ73MEjfl34ypahoY7oGwZwt0,6318
+pygame/examples/camera.py,sha256=5205gt_W9EoTartrtQtXrdD-AkCLx6r8DkBaAvdiFO4,3905
+pygame/examples/chimp.py,sha256=2uBvczKQW8XEG87yJlf4CB46RR4b1a5iPjMi_C--fAY,5912
+pygame/examples/cursors.py,sha256=I4CUYQQjZgtI-cs3Y3Wa-XeW-muolENya5ZlAm4EttM,7938
+pygame/examples/data/BGR.png,sha256=DvOrlW5BJdat94nNV8XEETBLRrSWRV7byQsMPsA69uw,244
+pygame/examples/data/alien1.gif,sha256=8Wveo1zpLVaFCtYITm_SoYqjy8L-TDuaZOcNa8Osqsw,3826
+pygame/examples/data/alien1.jpg,sha256=HOjXjmW4Ofsu_en9WNrkuIp_DCwupXcFB0Yt_cqV9rA,3103
+pygame/examples/data/alien1.png,sha256=femzLssV7oGvT3S2tyviyq7qO32QfhBDtMOR3ENBCLs,3522
+pygame/examples/data/alien2.gif,sha256=0MPpVYzvjAECy0pd7YRFKCEzzIYDKEJt70rbjlLbTZM,3834
+pygame/examples/data/alien2.png,sha256=FKGYDI2FBBR1Z56BLn357PNfh3-M38gAJpSQL8BpKYY,3526
+pygame/examples/data/alien3.gif,sha256=bFCRGZOQPaadCKIc-tlqoUjHdsi5IzR0E-2SjpPEvmA,3829
+pygame/examples/data/alien3.png,sha256=a51Tb9E4IvoICGzQChHq51RKVQJLf1GOCEeqA5yYfnk,3518
+pygame/examples/data/arraydemo.bmp,sha256=xM4-n_hRCQFZlfwwdTK6eaBweycUc863TgSFbWp3dbA,76854
+pygame/examples/data/asprite.bmp,sha256=97XMpKq9lLpMuv8UveCf8UJEAxheBhPUjHfMRQBkUx4,578
+pygame/examples/data/background.gif,sha256=-3kZwt99MFUBbBo-kHvPZXVlFrSB34XVNQWWxfHb970,9133
+pygame/examples/data/black.ppm,sha256=Yu8BwDOeFwOnVYjdWTMo7Tl1xcx2a7J38zZP-JllcMQ,6203
+pygame/examples/data/blue.gif,sha256=hqbgDzCeUz0NHjAQHYURIxSOpRbpHf6QeFch8ux_dAE,84
+pygame/examples/data/blue.mpg,sha256=XDj1CRPt1MWxspCfA3oqb822nlZgQ7CyyEuVJwlgmpg,6144
+pygame/examples/data/bomb.gif,sha256=TZ60QP1S2QBN6QPNSqBwS5VyebZA93iu8ZMUXzEg2QA,1170
+pygame/examples/data/boom.wav,sha256=kfoWs0VVDGHv0JSa46nXZBGyw70-jpfPq_B31qNA_F8,12562
+pygame/examples/data/brick.png,sha256=K_mshK0aL81nzOjAorTXyPps6n9mvofLeOWFXFpVjYA,170
+pygame/examples/data/car_door.wav,sha256=TwYWVqme5NqVVID1N4es92RSKEdTYkxbNx6dNamK-_4,3910
+pygame/examples/data/chimp.png,sha256=gFY5lDOflZ5fCMXpL9_HmipP4-3ALn_r6cCB9yTZKBk,826
+pygame/examples/data/city.png,sha256=c0Nu2o7x7QmvGMDmDCaPnhvJ8tPNuguKKpI_Z-NfQ40,143
+pygame/examples/data/crimson.pnm,sha256=o9ziiY4ox_cCmEo07w08SQckCQTRttxtLgKBE0VmZY8,3124
+pygame/examples/data/cursor.png,sha256=3RDqIuKTXH8Bs67n_ZwEbuS09dQtJeKRgSMR6D9gtWQ,2708
+pygame/examples/data/danger.gif,sha256=m0CBKalFbkqlohgOmrwkwVOfqBhRWonb7xm1pzbDy2Q,2761
+pygame/examples/data/explosion1.gif,sha256=WYcdwbZqmYdaaaPYFiR5vka0Anp4F4nnNlpSSx_1xug,6513
+pygame/examples/data/fist.png,sha256=X0VOsy6fP0UGqBjy7baoBX8XAXyp_1_s2tOItbtA7EI,86196
+pygame/examples/data/green.pcx,sha256=si9WT7dyn3nsXoh34UBW0yOCKWbC-Rz0fKkc_7TDRbY,320
+pygame/examples/data/grey.pgm,sha256=uWTtnBH-Fv605OtEJzS9fG5ns9XaeUHq2YeAC_cdkKU,4155
+pygame/examples/data/house_lo.mp3,sha256=R0nZUXymMp_XLPU8S1yvsiVeWT6MKLt5Rjp-WSnVrLQ,116320
+pygame/examples/data/house_lo.ogg,sha256=64FiQ1Zjq-cOj6Bmya_v3ZjEWmBaGZlTl19udKaz6sU,31334
+pygame/examples/data/house_lo.wav,sha256=B1BwfFaPIsSxaash-igVI_YE9SQd1BCXRTnSAKsNunY,78464
+pygame/examples/data/laplacian.png,sha256=uWI8dPstqMEPVuFPGtm-guu48T2-L3kn99rWA3ZhZ-Q,253
+pygame/examples/data/liquid.bmp,sha256=qtzPXhq0dr2ORNCCZ6gY2loT2Tsu0Dx5YvXB548I1Xg,11734
+pygame/examples/data/midikeys.png,sha256=9HCCmMHvlubR6G9a0jMv1C-AKeBzYfb5jjNhol2Mdqw,19666
+pygame/examples/data/player1.gif,sha256=3ZTVWGxnedKqtf3R-X1omPC0Y8jUSPGgHBAzeGhnV4c,3470
+pygame/examples/data/punch.wav,sha256=A0F1xT8aIZ6aNI_5McMqLygb1EfmdIzPi4kWkU4EwQc,4176
+pygame/examples/data/purple.xpm,sha256=3r6_3v6tob2qy-1hrQ3ujYHpuFb9UQ7LuNsHWq9mj5A,1249
+pygame/examples/data/red.jpg,sha256=mgaTBGP_k55FcqJIL7eV4jYll80zaZHPHfFtXAOLnF8,1251
+pygame/examples/data/sans.ttf,sha256=nrZ6FRet4dwlvA7xOReYCP2QwyGebk0iVJaSFbtpOhM,133088
+pygame/examples/data/scarlet.webp,sha256=iLN1RrY8LCSUnDrwYvWC99v_pLGy0iN8winH7VAyVL0,82
+pygame/examples/data/secosmic_lo.wav,sha256=-EIFkzj7k5qEqG04n7mnUGUp1SsyCJ4n08TzPT600DY,18700
+pygame/examples/data/shot.gif,sha256=bF2eY629zQzvDu83AKpveSFhJq5G4QpOE98A0tvbPFI,129
+pygame/examples/data/static.png,sha256=Xe4wN80awt7nTNiLemoSNTEKlAbGFW7djNETP8IleNs,1202
+pygame/examples/data/teal.svg,sha256=nkksR3fo0NPwC9sVXQPrPR_QrvqRiUB1vC4I-K83dho,313
+pygame/examples/data/turquoise.tif,sha256=4OkIy6CDPMv77tRR_wA9ZHA6qZzG3pjZ-1m1mNB7bcI,1186
+pygame/examples/data/whiff.wav,sha256=FMWM3XnYtce6mHFXQCYPgzT-xu-Q4DJybZfpPjG8cpE,5850
+pygame/examples/data/yellow.tga,sha256=EhxUG3SMO6bbHxr4yFggnKrsC1mYZVq-L6znAsR3z8I,3116
+pygame/examples/dropevent.py,sha256=WMvQbhrHNuSsEyv2hcFr4K4Q83MbZCKtsFNpfuH_SDU,2187
+pygame/examples/eventlist.py,sha256=aPTb0B3DAGnuG76Bz6l8aj6-r3VQ314o9LAiJEl2VHM,5912
+pygame/examples/font_viewer.py,sha256=51i0Y_0c06MRpVBLZymuP3aMEpf7SKVcJ1eKSI3n5Lo,9817
+pygame/examples/fonty.py,sha256=qiYuIracT_jwH5HFx9-tLcwc8qlgALwmL93aZjcUQrU,2073
+pygame/examples/freetype_misc.py,sha256=Fd3USUExyXsmQWWO9I8f2TMLXDooCAebYx10Pnnmbxk,3659
+pygame/examples/glcube.py,sha256=UONh_9RvLhCG8qLQUys4sE2xXY8ukf2zs0KXr_IRE5k,16860
+pygame/examples/go_over_there.py,sha256=D9F75dsbw0nKJf1aA_mWKLkfLpRuhiE5YtULy71jEoM,2139
+pygame/examples/grid.py,sha256=9dEYCiBjkNxjvk5aMukZxyGtaSVUIWXR4MCN56JEsYY,1745
+pygame/examples/headless_no_windows_needed.py,sha256=Lf-FVBNEHON53nSPLFR5DXHVua5S5N_4LX3gd_yRf_o,1299
+pygame/examples/joystick.py,sha256=pIw3_JRd9R0bpu9LPMiMuN53LVZliWehR3MJ5SFcmzo,5252
+pygame/examples/liquid.py,sha256=mGAniBgkpFYhNyM4XMoFRtlwCbQtd5aZaWCI6C23Bak,2544
+pygame/examples/mask.py,sha256=henO1A-xYDZrB6yqYVOnXkVr-8JeZbNXDODhGmczUgU,5725
+pygame/examples/midi.py,sha256=iQh1tPyyi7zejua6VJa--77aPW-i8Bb8TokRtfaHLRo,31267
+pygame/examples/moveit.py,sha256=cLYWPTnqRVud-Lbq9bVd2S1W8KA8eSExjXmFof35wdI,3330
+pygame/examples/music_drop_fade.py,sha256=bzhtDpDkjyod6Jb-rLU6KAh3KAiHQLFP1XVx717fPt0,9110
+pygame/examples/pixelarray.py,sha256=UQzu0tO7g8EOMoQPVLoFRUvMv1ePd9ybkGUg1PKYoXA,3453
+pygame/examples/playmus.py,sha256=xPhC5wCIyEOjiJkz-ZNtRUl9kladd6m0ZU_jl6QSEko,5215
+pygame/examples/resizing_new.py,sha256=8p6Sy8s74A49OXeboxmWnKGQJVO99ATE4nm7A_ADTxY,1046
+pygame/examples/scaletest.py,sha256=Iq8w-K4pf92-2oee7caNcW9KaOIosArD4AL6roR-svY,4826
+pygame/examples/scrap_clipboard.py,sha256=L2tOzkBSxV3f3hva8XiUibMmYW3oxEMlVUmnX97dXlI,3033
+pygame/examples/scroll.py,sha256=2mKc79QAHLWMO8mG50jmuWTXAvZXdtVsqwjKVFA18RY,6642
+pygame/examples/setmodescale.py,sha256=6GCUOLrGp7KITI1qoGj1hJqNxkouUqmdfYgXlD7IYns,1801
+pygame/examples/sound.py,sha256=CwQ3hSKjD_sHmXEBLfimdbt18cQcXwk5QQ7jfnOuSS0,1172
+pygame/examples/sound_array_demos.py,sha256=Pp6ZsH2WRn_T2z5JNSdpEwILbTh2t_60F5tvNL7zt_s,5756
+pygame/examples/sprite_texture.py,sha256=XCbP01L_tVSylh67kvnPfbU7jLVGXfCwLwZ-HnPa1rU,2667
+pygame/examples/stars.py,sha256=fB6OkpKUYh2WtI04nM32_8A5QDrrw8Xlg_ZCTmVfl6w,2714
+pygame/examples/testsprite.py,sha256=vQYCsn8Blzc5UpULlaAKbDsPTkP3Cgo0lJQ0nNhEbpg,6845
+pygame/examples/textinput.py,sha256=vf887f8nAInO66p4qwZbJu316I2bWmUkmZHi50hu9TQ,7579
+pygame/examples/vgrade.py,sha256=RZDRrsAi0bTg6SAh8UJqRQx8viMwjmLSyK20dCql7us,3263
+pygame/examples/video.py,sha256=v_81PS92Mxad1KelrHOAOGwLsIjE46GIM7HwUj9oSPo,4357
+pygame/fastevent.py,sha256=NOVGX3eAvQGCSHDOZZJ_VuWSyekqdPO1Wrr2MvCEQeU,1694
+pygame/fastevent.pyi,sha256=3FmWstDsaRS5TOqExgceS8jeZnkkYhSrYIgTEqSKkU0,249
+pygame/font.cp311-win_amd64.pyd,sha256=vVauI09qkGDZelQ9LXXfm6Ki1n5_jE5EAn4UcM5P_aQ,24576
+pygame/font.pyi,sha256=18UBtw7fOoyRsYvPtm2Pr_H7nKw061niIO6xG2H5Tb8,2073
+pygame/freesansbold.ttf,sha256=v5JRJp8R5LNVgqmTdglt7uPQxJc6RZy9l7C-vAH0QK0,98600
+pygame/freetype.dll,sha256=HEhzktbQaXC6PHtScFiB8fsGn2ByQ0mSdsLwwDPH328,654336
+pygame/freetype.py,sha256=OyLcjKlZXyhQEV2EZ0xMY57HypqGA77K14CJGMxw5H8,2224
+pygame/freetype.pyi,sha256=JdvIk4o8UhhVo2AQnqnJhCmKuv3YRCfWtnSHnkeZZPg,3506
+pygame/ftfont.py,sha256=IwVFbugqIjksMflM4V1jtMPcQO5D_rButgCAJhkxlrw,6134
+pygame/gfxdraw.cp311-win_amd64.pyd,sha256=0jOYA3XAF5aK1VXxZ5mevON-znF0XlwF7MrE3vyr7YE,58880
+pygame/gfxdraw.pyi,sha256=GbHQUuqOdJAxe6tQfp1EfhL3-P6vBltbayaMBeFjsVY,2500
+pygame/image.cp311-win_amd64.pyd,sha256=Sq1ZP1SjlTh06j9VqFJQmh_3_awh7-PVxfhAuf1YnV4,29696
+pygame/image.pyi,sha256=5bCTCOTJ5azmeIV82settKwR4aKfOA_kB_1mSiBTqSs,1705
+pygame/imageext.cp311-win_amd64.pyd,sha256=Jsr-cKTzD3ia9GX0OwGKcYZG_R7IH17_wtVuyRr-LzQ,17408
+pygame/joystick.cp311-win_amd64.pyd,sha256=8nrsWZPEaNfetMxm5X1Fut7bdbZX6Y-qOP40OZYaPdw,20480
+pygame/joystick.pyi,sha256=Lr0DiEuJjbuyGEc1fCPkzVMYPu_qPGUky_x-k5KikPQ,1348
+pygame/key.cp311-win_amd64.pyd,sha256=4IQGcXbrNhGBlhl2Pg3wbG5qWTxlS9th7PEsZNF8O8k,20992
+pygame/key.pyi,sha256=7Ei4SZ3tuWMb9XAtRZm2lw9Sd5BDwjzM3QS1-WRrcBY,562
+pygame/libjpeg-9.dll,sha256=OiJK9UDJZXSAD16az2SyzfuQYOcnkZ7BT70Yeptb_mk,244224
+pygame/libmodplug-1.dll,sha256=DBqQMoEuxMIAA6mXQj5ntx7LXlnWLNwYpb9ZEXapAQ4,265216
+pygame/libogg-0.dll,sha256=V6vE9qmszdCL-aKwIqZmQMxialvU2sbHxPBqXfYe4f4,25600
+pygame/libopus-0.dll,sha256=dxyueUEPf8xPmToQWhjE7Z6Mvd1vgHpCIo2V9XWAiAY,368128
+pygame/libopusfile-0.dll,sha256=zKrKgYEL0tHKtGkrQlOmOfjVUWmW2w4k2IHv0-_cxqQ,46592
+pygame/libpng16-16.dll,sha256=5oi0pNGPS2zMmcbKSYD1EhjLglYQd1GS2bYLLwXv8tU,210944
+pygame/libtiff-5.dll,sha256=6_6XrF7ya5SUWvPbX_0RCkuOktwCVZv4HMsz8NXrzpU,432640
+pygame/libwebp-7.dll,sha256=mlNWO2BY9w8nJQKbfdL-lvhpwg6AkAMc0wPplN_ge1A,447488
+pygame/locals.py,sha256=IO2_D-d3Z5FStP6QDjiyN_W0QPq0i_hHuCQWhxdFRSs,1195
+pygame/locals.pyi,sha256=fLWVStrayTJQMr7r5z45ywHMIOgEYIqLYJkyjIcUsGg,9925
+pygame/macosx.py,sha256=GJYmXKulp9UCu5NgYMtHIzp22ij-QZBhNOLbrJdgtsM,329
+pygame/mask.cp311-win_amd64.pyd,sha256=rnhDcVeEnYmDgNAFrzwTlXFLH721_1utjq778oWvlvA,55296
+pygame/mask.pyi,sha256=bBxSevY0teCHn86xPnQIgx10xLd5HX2O3Ohkfrz_m5E,2304
+pygame/math.cp311-win_amd64.pyd,sha256=JwrXC4MkDAKaofeZabSGJ2F5YJMxaCRMCHhlinokbfs,76288
+pygame/math.pyi,sha256=crW5wZF1MKl2sERrePqGW1roEXACWAbyreqbi2n9zZs,11685
+pygame/midi.py,sha256=GEmQFXnCclms235CT5ULsMs6fIbnrIpwo57J-Kbla_c,24341
+pygame/midi.pyi,sha256=LlPPnnXyHdklV5OTipShPxi8WUcc-NyasfLYxz-fcGw,1774
+pygame/mixer.cp311-win_amd64.pyd,sha256=s8k7Njhzh-PNmMVE8E4TojX6tFMQEF0sNAx4GT3C_Ho,37888
+pygame/mixer.pyi,sha256=HuPeysk7q79eWlPe2r54Z-j1Kgx1JKTQZnvXCESibjA,2856
+pygame/mixer_music.cp311-win_amd64.pyd,sha256=kgi3kFJALTCpsomJVDycZwCoy6oDy4GHl4PZ09QApMQ,20480
+pygame/mixer_music.pyi,sha256=gMklc23g-bBIAGa3giyM00yi2jLedrKipx9_8lebvFY,691
+pygame/mouse.cp311-win_amd64.pyd,sha256=aGV9p_osMmsaVXao0XRBXXZ1uKSdWOgHLtrx_DKIl28,19456
+pygame/mouse.pyi,sha256=a9Y_UtpHhMVQqpE3LnkAaI3EoVjQMdVNJNVeZ-eXTXE,1184
+pygame/newbuffer.cp311-win_amd64.pyd,sha256=5Vm0RkyUw8oakdL239DozrHxae7sAjahb-ggwwVgLSI,22016
+pygame/pixelarray.cp311-win_amd64.pyd,sha256=56ctK6mqzeezpoXA7wUGcCUFNYA-yiIT3uHpY6zWdBo,47616
+pygame/pixelarray.pyi,sha256=8bDvIdo9QPBfgSSU04kxZaYCkkdv_XyXRQtA28YI6P0,1226
+pygame/pixelcopy.cp311-win_amd64.pyd,sha256=CH8hKD9gSlHVjGkXBErPMxa1AmeF6czWxTnt_nvyOs0,26624
+pygame/pixelcopy.pyi,sha256=9P6c4l_16qAfJYsQ3IkJGPMKyp_weLB1e9iQIvLYDZM,534
+pygame/pkgdata.py,sha256=RTPgP8uEaPK9GdyeOSUzdN4N9LLdrUASHUXMoUersFY,2421
+pygame/portmidi.dll,sha256=yfjZBDrBVwsQ8QTy0ArseR9WJhyE7kB3O-c9Cjgi4BM,41984
+pygame/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pygame/pygame.ico,sha256=PBF9cw0Ca9Rw2pNmDD3iXvcYYQeI9ZzZ9vxtRLQRoJc,145516
+pygame/pygame_icon.bmp,sha256=Twnby8nv4HMhGka49n-47CPseDvwrSLZ0l1o9U2Bb5s,630
+pygame/pygame_icon.icns,sha256=4jwAo9VtMhTK9hq9ibt6MZ4_sd2VsZueWZ3YAMuTPgw,264148
+pygame/pygame_icon_mac.bmp,sha256=QrAs3kEF6v7wVMlIJgktI90aUdTg9RdTmp16d2HZhNg,262282
+pygame/pypm.cp311-win_amd64.pyd,sha256=me_uwg3QTW1udBkuPYbZ-VgExD4kJihtMMrkjw8M7uw,102912
+pygame/rect.cp311-win_amd64.pyd,sha256=7QH11MQNzHLsBw4SJ1Gp1bOgC4jQCRZNiSNnWwvk4WU,45568
+pygame/rect.pyi,sha256=gOICRGGXcziZKQvJrWVJ34H3wNl6-3Qp9uyWicbLHko,7138
+pygame/rwobject.cp311-win_amd64.pyd,sha256=acT_BtJREGgrWXpCzEEigHnQaqBRPvu3uJ4Kyhzm3X0,19456
+pygame/rwobject.pyi,sha256=7pjMcSV8digIazj9i0h5se7steQNUtBBBcK-f2sY-Yo,544
+pygame/scrap.cp311-win_amd64.pyd,sha256=4yhSdx8vhwEKvtXsq3onKKycHWJlcAox0g7j0AavOp8,18944
+pygame/scrap.pyi,sha256=xEbe7P1WNSmqeFQ-M3XCX3JztjHu1-m_0x8vkL6S4bA,366
+pygame/sndarray.py,sha256=hJMTnQBEbOBYzeBRdCiGHCr3S20NqpHVevX2WFxw51I,4083
+pygame/sndarray.pyi,sha256=-kUmCShhKSazBRhHberq4kDhQau0I-02LZHvfIVYi7A,337
+pygame/sprite.py,sha256=TPphm-rkggpgY_4hnZU-No1pKJV7Av0cXIL3ba1NZYM,62852
+pygame/sprite.pyi,sha256=mvgzcgxPmkS9JXT4YxjuarZSWI_AJLT1RrguRbJ9aNE,9618
+pygame/surface.cp311-win_amd64.pyd,sha256=ltI9o9sPPeHWr459oPpopzR4nDQ8PRV4GQm4D-ZWObw,239616
+pygame/surface.pyi,sha256=mKyduOgOgekHQ3JObqdjFMkTMI22Aeat2MCAkOTWseE,4726
+pygame/surfarray.py,sha256=v2OEMPerEmDeQDzBz-XIAnpbEYgS-viNlkZ7_zz5OSE,14427
+pygame/surfarray.pyi,sha256=g4w8kePGEZGMGhdtKo0ClZ3G-VPitz7DmrtIK6a7FGY,1287
+pygame/surflock.cp311-win_amd64.pyd,sha256=4vXOrJHI_z85ck1IZImBHntTEJIedxf1TxPudUKHRPA,13824
+pygame/surflock.pyi,sha256=p6HFejTvHw2HxSUOD4vW9HolANRfvGHjADdRh63skKQ,122
+pygame/sysfont.py,sha256=AgGBnxY8kfXTbNYdNxfWDgo6NIA7xzDD5SELRLGaqzc,15446
+pygame/tests/__init__.py,sha256=wfUhz-LZF-OXZNT81UfGdofNYPCUMJoF3nwgXpzg4sE,1251
+pygame/tests/__main__.py,sha256=xLKWh5Kk0hc-2vz_OrNsMkVproZ3ndWz6ZCMY7Myk5A,3788
+pygame/tests/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/__pycache__/__main__.cpython-311.pyc,,
+pygame/tests/__pycache__/base_test.cpython-311.pyc,,
+pygame/tests/__pycache__/blit_test.cpython-311.pyc,,
+pygame/tests/__pycache__/bufferproxy_test.cpython-311.pyc,,
+pygame/tests/__pycache__/camera_test.cpython-311.pyc,,
+pygame/tests/__pycache__/color_test.cpython-311.pyc,,
+pygame/tests/__pycache__/constants_test.cpython-311.pyc,,
+pygame/tests/__pycache__/controller_test.cpython-311.pyc,,
+pygame/tests/__pycache__/cursors_test.cpython-311.pyc,,
+pygame/tests/__pycache__/display_test.cpython-311.pyc,,
+pygame/tests/__pycache__/docs_test.cpython-311.pyc,,
+pygame/tests/__pycache__/draw_test.cpython-311.pyc,,
+pygame/tests/__pycache__/event_test.cpython-311.pyc,,
+pygame/tests/__pycache__/font_test.cpython-311.pyc,,
+pygame/tests/__pycache__/freetype_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/freetype_test.cpython-311.pyc,,
+pygame/tests/__pycache__/ftfont_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/ftfont_test.cpython-311.pyc,,
+pygame/tests/__pycache__/gfxdraw_test.cpython-311.pyc,,
+pygame/tests/__pycache__/image__save_gl_surface_test.cpython-311.pyc,,
+pygame/tests/__pycache__/image_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/image_test.cpython-311.pyc,,
+pygame/tests/__pycache__/imageext_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/imageext_test.cpython-311.pyc,,
+pygame/tests/__pycache__/joystick_test.cpython-311.pyc,,
+pygame/tests/__pycache__/key_test.cpython-311.pyc,,
+pygame/tests/__pycache__/locals_test.cpython-311.pyc,,
+pygame/tests/__pycache__/mask_test.cpython-311.pyc,,
+pygame/tests/__pycache__/math_test.cpython-311.pyc,,
+pygame/tests/__pycache__/midi_test.cpython-311.pyc,,
+pygame/tests/__pycache__/mixer_music_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/mixer_music_test.cpython-311.pyc,,
+pygame/tests/__pycache__/mixer_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/mixer_test.cpython-311.pyc,,
+pygame/tests/__pycache__/mouse_test.cpython-311.pyc,,
+pygame/tests/__pycache__/pixelarray_test.cpython-311.pyc,,
+pygame/tests/__pycache__/pixelcopy_test.cpython-311.pyc,,
+pygame/tests/__pycache__/rect_test.cpython-311.pyc,,
+pygame/tests/__pycache__/rwobject_test.cpython-311.pyc,,
+pygame/tests/__pycache__/scrap_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/scrap_test.cpython-311.pyc,,
+pygame/tests/__pycache__/sndarray_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/sndarray_test.cpython-311.pyc,,
+pygame/tests/__pycache__/sprite_test.cpython-311.pyc,,
+pygame/tests/__pycache__/surface_test.cpython-311.pyc,,
+pygame/tests/__pycache__/surfarray_tags.cpython-311.pyc,,
+pygame/tests/__pycache__/surfarray_test.cpython-311.pyc,,
+pygame/tests/__pycache__/surflock_test.cpython-311.pyc,,
+pygame/tests/__pycache__/sysfont_test.cpython-311.pyc,,
+pygame/tests/__pycache__/threads_test.cpython-311.pyc,,
+pygame/tests/__pycache__/time_test.cpython-311.pyc,,
+pygame/tests/__pycache__/touch_test.cpython-311.pyc,,
+pygame/tests/__pycache__/transform_test.cpython-311.pyc,,
+pygame/tests/__pycache__/version_test.cpython-311.pyc,,
+pygame/tests/__pycache__/video_test.cpython-311.pyc,,
+pygame/tests/base_test.py,sha256=d6POJDqd_uxot9yxTxRBW2thiOD4o0HYuIHBq84OBUg,22449
+pygame/tests/blit_test.py,sha256=tfZs2E_xD2LZQoYZWKx3hHcJ80hIDjqn6uBiDt4lN7I,4725
+pygame/tests/bufferproxy_test.py,sha256=bji75h8zDPEHNXSKEnT9Gb4T0_cMcAlDxqvPdlR5WU0,16451
+pygame/tests/camera_test.py,sha256=KdGG1pLTe8Eh2SHiEsH7DuLqwn-OsaLCHm4MGCKPAvg,70
+pygame/tests/color_test.py,sha256=uUzzV-njnROb2XDNMKmR4lUy1NS-NGsTtxadu-pkNZ4,49781
+pygame/tests/constants_test.py,sha256=kOOqPnXMMka37d4VUDo70j3i_zAN74Y5QuRLnNQsRao,9308
+pygame/tests/controller_test.py,sha256=a6NSWn1k1Rpt4HTYeOAbF-cDx0KfnKsrG6DwA0vk_0k,10834
+pygame/tests/cursors_test.py,sha256=qc-T5sdh25LO-KOK16CMp9FnWCXJSwdUo29YkePeSTs,7700
+pygame/tests/display_test.py,sha256=eYem018lDt73sJdLjk32x-xSlW_FRx1qZyzibHaZwFE,46427
+pygame/tests/docs_test.py,sha256=r2qa_ox8eg2_Y5Pb9-XzZExAhqJrdVMO30guO1o7PPM,1091
+pygame/tests/draw_test.py,sha256=_pwsaLBAVheyU7XhkZ8nUbzq9iPj_f654zXKv7EV8-c,235412
+pygame/tests/event_test.py,sha256=_ti2gVPoPwWofe9W7uY_EaOFZpc_0on8mSQa2sJ3UfE,32837
+pygame/tests/fixtures/fonts/A_PyGameMono-8.png,sha256=QmhReADwKrzW5RWnG1KHEtZIqpVtwWzhXmydX1su10c,92
+pygame/tests/fixtures/fonts/PlayfairDisplaySemibold.ttf,sha256=4Q60pnYY-7dwBTVr7PBSz5r-w_kfUzhal8i85ISG7V4,236636
+pygame/tests/fixtures/fonts/PyGameMono-18-100dpi.bdf,sha256=nm3okxnfAFtADlp7s2AY43zS49NYg9jq7GVzG2lPhOQ,1947
+pygame/tests/fixtures/fonts/PyGameMono-18-75dpi.bdf,sha256=4kB0uYeEpa3W-ZAomFMpc0hD-h6FnOh2m5IPi6xzfds,1648
+pygame/tests/fixtures/fonts/PyGameMono-8.bdf,sha256=aK0KV-_osDPTPiA1BUCgZHOmufy6J9Vh5pf1IAi0_yg,1365
+pygame/tests/fixtures/fonts/PyGameMono.otf,sha256=_Af4LyMEgKKGa8jDlfik89axhLc3HoS8aG5JHWN5sZw,3128
+pygame/tests/fixtures/fonts/test_fixed.otf,sha256=FWHmFsQUobgtbm370Y5XJv1lAokTreGR5fo4tuw3Who,58464
+pygame/tests/fixtures/fonts/test_sans.ttf,sha256=nrZ6FRet4dwlvA7xOReYCP2QwyGebk0iVJaSFbtpOhM,133088
+pygame/tests/fixtures/fonts/u13079_PyGameMono-8.png,sha256=x_D28PW8aKed8ZHBK6AISEZ9vlEV76Whi770ItTuFVU,89
+pygame/tests/fixtures/xbm_cursors/white_sizing.xbm,sha256=VLAS1A417T-Vg6GMsmicUCYpOhvGsrgJJYUvdFYYteY,366
+pygame/tests/fixtures/xbm_cursors/white_sizing_mask.xbm,sha256=CKQeiOtlFoJdAts83UmTEeVk-3pxgJ9Wu2QJaCjzAQM,391
+pygame/tests/font_test.py,sha256=UtIcHo9xuxFxDrzmrTsSTzvP7vzteegqUN5yWWSJVVE,27199
+pygame/tests/freetype_tags.py,sha256=NdjMDSYHfrhopKR0JuTeUfFX-AbcCu4fsXnS1a46iVM,182
+pygame/tests/freetype_test.py,sha256=GFZUMLZF-KjXEyOhq0FqI2Oe_nt1hbkPHTkSW7RN3pk,64896
+pygame/tests/ftfont_tags.py,sha256=IvteBUDEp4rv9q6FwlTpQ9X2px-XUromSMQ921VrhCU,180
+pygame/tests/ftfont_test.py,sha256=YZesw8r_NfqcoUsg78FbAh0kJaeC6iAzixHMsQcH3gY,421
+pygame/tests/gfxdraw_test.py,sha256=XWxHvtvkMWllmlCsGhaUGCdOFBAiOfJgYg_KnUj8Q_E,32354
+pygame/tests/image__save_gl_surface_test.py,sha256=5H8TeGZNRZzu5kJInWPe8AuuKqHv-utunadoBmn--CI,1198
+pygame/tests/image_tags.py,sha256=_WJGXgTOaUn4IG7fIk1sDKfDDZP3W8N6PkrrOpPT-U8,132
+pygame/tests/image_test.py,sha256=zJ6BngnIYbmBpoU5I0yT1Ed7fbBLOqGJW3Uqm81BfEg,42598
+pygame/tests/imageext_tags.py,sha256=-vnXr7O5F1NVrEDrOHBEYdaD-JiuBT9NI-lxGps-K1U,135
+pygame/tests/imageext_test.py,sha256=Dam4nzQG1dZtJ8rtAmSw2xdhIvENATklN81mVl5Mh4I,2852
+pygame/tests/joystick_test.py,sha256=XArf2gXSYYupNOuOekpKtGlJ_vaLWWUSl7hpKnBE3FU,6078
+pygame/tests/key_test.py,sha256=rZ9EPqi8q6VQI7kQzdjW8U0Ebqk2QYnU9D7i2TXsdDY,9172
+pygame/tests/locals_test.py,sha256=2g4vCW-wJG0U_wA7VP1kieV-wSsvGInyGkLW6OjvJ4o,417
+pygame/tests/mask_test.py,sha256=95xNu2gy1TVgxKNnDdcYXgo_rKaTdKPAqeeKn1jI_Xg,245880
+pygame/tests/math_test.py,sha256=n1vDugXES3Snzh0Hy5B4Gx4OOdoFkcsjliWwm-kmm0A,111475
+pygame/tests/midi_test.py,sha256=utmDFvk5wZCcXrTTGXnl4N6dMjmkXgrIV6nGtgcws6k,16905
+pygame/tests/mixer_music_tags.py,sha256=o0gsQDjuICFYw8j3WOlIluwk9fdA42ledU1U6DIJzNU,138
+pygame/tests/mixer_music_test.py,sha256=_awXVWYd9cdqdaHI0q4jzALvoZgfhvwp1ZlXrOJx-fI,15141
+pygame/tests/mixer_tags.py,sha256=qKcn8AD46H3V87xONG0iXlGH_FveeGBgf2gE1MMh2s0,132
+pygame/tests/mixer_test.py,sha256=0tm85emdyhCNGN52GVsv-TJ99aLBMqHM1v42dPLHRPQ,52645
+pygame/tests/mouse_test.py,sha256=7u-tkrioaNXON7kGTpINtpngRFKjVrb0C73hTsA4I5A,13148
+pygame/tests/pixelarray_test.py,sha256=NKVn_4NumiMz0CHUDm7DH-OcEZI0XpAZmjenAXwDJlY,62745
+pygame/tests/pixelcopy_test.py,sha256=7FBHF-v505KOdIzUe9JkIcRnD7k8pmWKFNOQW3PUmWE,25536
+pygame/tests/rect_test.py,sha256=Zc9eroRcI6MELp17efYQKju22DfnSbwfmt-1YVbho-Y,117703
+pygame/tests/run_tests__tests/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/__pycache__/run_tests__test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/all_ok/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/__pycache__/fake_3_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/__pycache__/fake_4_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/__pycache__/fake_5_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/__pycache__/fake_6_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/__pycache__/no_assertions__ret_code_of_1__test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/__pycache__/zero_tests_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/all_ok/fake_2_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/all_ok/fake_3_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/all_ok/fake_4_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/all_ok/fake_5_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/all_ok/fake_6_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/all_ok/no_assertions__ret_code_of_1__test.py,sha256=PNrfACCpcPnO964Oxv2-9l4ciuJ-Iqw3x8HDs-kebVg,797
+pygame/tests/run_tests__tests/all_ok/zero_tests_test.py,sha256=XzLaMjkygsvNkFEqnRU9y2Ijm6bfds9n5Z6mg_LOMJQ,545
+pygame/tests/run_tests__tests/everything/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/everything/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/everything/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/everything/__pycache__/incomplete_todo_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/everything/__pycache__/magic_tag_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/everything/__pycache__/sleep_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/everything/fake_2_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/everything/incomplete_todo_test.py,sha256=71myeZtFerYY2rB-j60l5Ltz3FiRCuOR4evFXtJHC34,909
+pygame/tests/run_tests__tests/everything/magic_tag_test.py,sha256=SjIKB_7aLfGdih8cotQ34m1KbSEII_1wGQUBwrWeIyY,859
+pygame/tests/run_tests__tests/everything/sleep_test.py,sha256=AyGwZk5fQAkfeCr9VewdsuD_z5BzlVfkmbZD-XetB50,715
+pygame/tests/run_tests__tests/exclude/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/exclude/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/exclude/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/exclude/__pycache__/invisible_tag_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/exclude/__pycache__/magic_tag_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/exclude/fake_2_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/exclude/invisible_tag_test.py,sha256=AdHFvOK-kCRi2iUs68So6Ngef6C_LEdx3QpMLjhKtmM,925
+pygame/tests/run_tests__tests/exclude/magic_tag_test.py,sha256=SjIKB_7aLfGdih8cotQ34m1KbSEII_1wGQUBwrWeIyY,859
+pygame/tests/run_tests__tests/failures1/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/failures1/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/failures1/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/failures1/__pycache__/fake_3_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/failures1/__pycache__/fake_4_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/failures1/fake_2_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/failures1/fake_3_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/failures1/fake_4_test.py,sha256=xWpIVUpzevSs4bVeze48Q9jkZzss4szdw6eMOrJnZV8,949
+pygame/tests/run_tests__tests/incomplete/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/incomplete/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/incomplete/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/incomplete/__pycache__/fake_3_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/incomplete/fake_2_test.py,sha256=RVUuQZxqYScIUAflNIsXd7UE6Rxm6HHFZSi8cpz5m-k,889
+pygame/tests/run_tests__tests/incomplete/fake_3_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/incomplete_todo/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/incomplete_todo/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/incomplete_todo/__pycache__/fake_3_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/incomplete_todo/fake_2_test.py,sha256=71myeZtFerYY2rB-j60l5Ltz3FiRCuOR4evFXtJHC34,909
+pygame/tests/run_tests__tests/incomplete_todo/fake_3_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/infinite_loop/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/infinite_loop/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_1_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/infinite_loop/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/infinite_loop/fake_1_test.py,sha256=rNt-VaNziz7OmfbDXcbXbDIbwC_6ScFJ-MtenMjR68Y,906
+pygame/tests/run_tests__tests/infinite_loop/fake_2_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/print_stderr/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/print_stderr/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_3_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/print_stderr/__pycache__/fake_4_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/print_stderr/fake_2_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/print_stderr/fake_3_test.py,sha256=6AGEff135DU_spRhZ09oDGXE4lZC3dlHU_phnfOyWYY,954
+pygame/tests/run_tests__tests/print_stderr/fake_4_test.py,sha256=xWpIVUpzevSs4bVeze48Q9jkZzss4szdw6eMOrJnZV8,949
+pygame/tests/run_tests__tests/print_stdout/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/print_stdout/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_3_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/print_stdout/__pycache__/fake_4_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/print_stdout/fake_2_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/print_stdout/fake_3_test.py,sha256=cruYqrh3O3MQ8fczEFloLpsrQrYmMOd6jgxMU6e5H8w,1012
+pygame/tests/run_tests__tests/print_stdout/fake_4_test.py,sha256=xWpIVUpzevSs4bVeze48Q9jkZzss4szdw6eMOrJnZV8,949
+pygame/tests/run_tests__tests/run_tests__test.py,sha256=9mDlobUHX5baqNIJvCo4hN7XGb5qRIRO_DFfNcOno5I,4315
+pygame/tests/run_tests__tests/timeout/__init__.py,sha256=9_8wL9Scv8_Cs8HJyJHGvx1vwXErsuvlsAqNZLcJQR0,8
+pygame/tests/run_tests__tests/timeout/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/run_tests__tests/timeout/__pycache__/fake_2_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/timeout/__pycache__/sleep_test.cpython-311.pyc,,
+pygame/tests/run_tests__tests/timeout/fake_2_test.py,sha256=zFUNsDLmH9Pvpo-YEpvfW2raQyA6EL_BW3CuP10YIKU,899
+pygame/tests/run_tests__tests/timeout/sleep_test.py,sha256=5EDW4U6kYN4QIid0IgHBypJ3T3a78pILILF41DPpujk,716
+pygame/tests/rwobject_test.py,sha256=LAJun6obwHADEiONe6F68WNM9qAuL7i4hqbPErjmox4,4323
+pygame/tests/scrap_tags.py,sha256=zHyLWy2JRyfw0DamlH9dz-MZq2R2uOryjH9JRu-RCkw,671
+pygame/tests/scrap_test.py,sha256=qt47IQLTs3jqf8FEP1mBC8gX6SzbeLsjJnIdszMhbYU,9160
+pygame/tests/sndarray_tags.py,sha256=ThDQxqGFaAembuWgdYGsFSWEppVezgXJ2htYRvvDaXE,190
+pygame/tests/sndarray_test.py,sha256=z0XU6Di2a0G2eHc2FXvqhoeGOCFeM8RoB9l6SJSBZyg,6290
+pygame/tests/sprite_test.py,sha256=08ZqxvMi7Bii4gGFVy2NdKJ3yWKz1an6AyEQs8Qhmqs,47210
+pygame/tests/surface_test.py,sha256=kYDBY8HgtjHyKvrmeS8di77cOxX_9qhdcsDQgKMNZog,165737
+pygame/tests/surfarray_tags.py,sha256=AwlglKM7DrjHvvcSMm-yXb-PSxsVhJkS6VE7Z8wOhes,260
+pygame/tests/surfarray_test.py,sha256=onPau7a-nZYZOuPm4q29PE130SWi8HDAxyRaWzW51DE,25753
+pygame/tests/surflock_test.py,sha256=dMZkzND7-R_z-GaxN4ZIcpNtW3PsK1i7kdnizpU21UY,4728
+pygame/tests/sysfont_test.py,sha256=uf7ISqCvoiegyUvYTqOT1-kYQi_POeejL1TqXXeYF9Q,1463
+pygame/tests/test_utils/__init__.py,sha256=_eQvMYQ_-gFuB1fiftJLjL0RYqV3tl5jRYeBUzI8x-4,4429
+pygame/tests/test_utils/__pycache__/__init__.cpython-311.pyc,,
+pygame/tests/test_utils/__pycache__/arrinter.cpython-311.pyc,,
+pygame/tests/test_utils/__pycache__/async_sub.cpython-311.pyc,,
+pygame/tests/test_utils/__pycache__/buftools.cpython-311.pyc,,
+pygame/tests/test_utils/__pycache__/endian.cpython-311.pyc,,
+pygame/tests/test_utils/__pycache__/png.cpython-311.pyc,,
+pygame/tests/test_utils/__pycache__/run_tests.cpython-311.pyc,,
+pygame/tests/test_utils/__pycache__/test_machinery.cpython-311.pyc,,
+pygame/tests/test_utils/__pycache__/test_runner.cpython-311.pyc,,
+pygame/tests/test_utils/arrinter.py,sha256=xmfJDli6Q3SPBy5cLAF0SqTXlRc5QDZRhbDP50p5pjc,14698
+pygame/tests/test_utils/async_sub.py,sha256=2BqxoeKTo6sPlW2bwGCieEb0lwxZsHUHBnGFjSPny68,9128
+pygame/tests/test_utils/buftools.py,sha256=FMXLkVYStXRZSPkO1dpm0ZtD8P7Da7zYY_k8rprjo_s,23638
+pygame/tests/test_utils/endian.py,sha256=Rc7rl38YamHgi8EzB92Muu8C4XH6yltH9f5On7qfMpY,495
+pygame/tests/test_utils/png.py,sha256=f-s-AzEK5RD2X-Wjan-0m9kyvlqW04-eJ6WwKtxNZuQ,152365
+pygame/tests/test_utils/run_tests.py,sha256=XoPNITexQ3AOu4QT_eOQAnRLLj5ZPXLr-0eDDYFj7fU,12038
+pygame/tests/test_utils/test_machinery.py,sha256=4vsi3mOw_581298rsp4cmcQYpbB6P5PK3Eg0cTBy138,2429
+pygame/tests/test_utils/test_runner.py,sha256=ktlXMmx0LOD9gmeTXyk72Ozo1UkYlUUJGoYoohdMZfY,9328
+pygame/tests/threads_test.py,sha256=YMahjfAW7F381dFv05XvazR3cLYP3Sbby1h57tIqYK0,7840
+pygame/tests/time_test.py,sha256=lQTubG8CiDnTwHOcV0Esvk1QJX90vjbxZNDdorg1wZU,16065
+pygame/tests/touch_test.py,sha256=9e5LDHeZrtQSaUBrb9dLHT1YDuNuccSlYvcYIWYIm7k,3216
+pygame/tests/transform_test.py,sha256=EryZIaG25yunlIW9wS4pnQhtswVNI-IBp9oAJzTe7zY,53328
+pygame/tests/version_test.py,sha256=dvNIneFf1c4PAKa4xo1YLAlYRDFYL8_ZeUwI1FS55Is,1536
+pygame/tests/video_test.py,sha256=USdLAov8GnN_9vsXl_1pe0MI0ddM3KurURDhVQIV3nY,694
+pygame/threads/__init__.py,sha256=Uk3jRFbWy0uglYVYhb9XIgN3g6tT1GCt19YY2wzxC6U,8068
+pygame/threads/__pycache__/__init__.cpython-311.pyc,,
+pygame/time.cp311-win_amd64.pyd,sha256=jTgH8QOJdKMbSIPHCrBrDXEGfMnMh-Eu_74U8dYCOuo,18944
+pygame/time.pyi,sha256=0dUmVQjxwyhXkSRGX0DnqM2-0JzOMIVbHx4psLfrlhI,501
+pygame/transform.cp311-win_amd64.pyd,sha256=Jy8ru6qCNbilb9UbUkVEdWTxLr7IblUaDyj9koXBeAk,58368
+pygame/transform.pyi,sha256=EsjIBP706hur5c6aKmUBMbCp9cPQIilWcqkSHkCeUk4,1999
+pygame/version.py,sha256=qL1Df5o1d03r5AkxvQH01nVkugxW64-zk3fKqCPwaKo,2526
+pygame/version.pyi,sha256=NvmU4694WwSRWMiZ5WL3APQYA2s_3xY4foOnPsncNuM,600
+pygame/zlib1.dll,sha256=sfWKF_O_1VUj5772haz1sy0cKm8lq9zUQmgSZv0mqwg,108544
diff --git a/.venv/Lib/site-packages/pygame-2.5.2.dist-info/REQUESTED b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/REQUESTED
new file mode 100644
index 00000000..e69de29b
diff --git a/.venv/Lib/site-packages/pygame-2.5.2.dist-info/WHEEL b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/WHEEL
new file mode 100644
index 00000000..6d160455
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/WHEEL
@@ -0,0 +1,5 @@
+Wheel-Version: 1.0
+Generator: bdist_wheel (0.41.2)
+Root-Is-Purelib: false
+Tag: cp311-cp311-win_amd64
+
diff --git a/.venv/Lib/site-packages/pygame-2.5.2.dist-info/entry_points.txt b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/entry_points.txt
new file mode 100644
index 00000000..05adb067
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/entry_points.txt
@@ -0,0 +1,2 @@
+[pyinstaller40]
+hook-dirs = pygame.__pyinstaller:get_hook_dirs
diff --git a/.venv/Lib/site-packages/pygame-2.5.2.dist-info/top_level.txt b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/top_level.txt
new file mode 100644
index 00000000..0cb7ff1d
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame-2.5.2.dist-info/top_level.txt
@@ -0,0 +1 @@
+pygame
diff --git a/.venv/Lib/site-packages/pygame/SDL2.dll b/.venv/Lib/site-packages/pygame/SDL2.dll
new file mode 100644
index 00000000..95107d91
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/SDL2.dll differ
diff --git a/.venv/Lib/site-packages/pygame/SDL2_image.dll b/.venv/Lib/site-packages/pygame/SDL2_image.dll
new file mode 100644
index 00000000..d7016555
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/SDL2_image.dll differ
diff --git a/.venv/Lib/site-packages/pygame/SDL2_mixer.dll b/.venv/Lib/site-packages/pygame/SDL2_mixer.dll
new file mode 100644
index 00000000..859ef9fe
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/SDL2_mixer.dll differ
diff --git a/.venv/Lib/site-packages/pygame/SDL2_ttf.dll b/.venv/Lib/site-packages/pygame/SDL2_ttf.dll
new file mode 100644
index 00000000..fe2d4c74
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/SDL2_ttf.dll differ
diff --git a/.venv/Lib/site-packages/pygame/__init__.py b/.venv/Lib/site-packages/pygame/__init__.py
new file mode 100644
index 00000000..da8bff7c
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/__init__.py
@@ -0,0 +1,345 @@
+# pygame - Python Game Library
+# Copyright (C) 2000-2001 Pete Shinners
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Pete Shinners
+# pete@shinners.org
+"""Pygame is a set of Python modules designed for writing games.
+It is written on top of the excellent SDL library. This allows you
+to create fully featured games and multimedia programs in the python
+language. The package is highly portable, with games running on
+Windows, MacOS, OS X, BeOS, FreeBSD, IRIX, and Linux."""
+
+import sys
+import os
+
+# Choose Windows display driver
+if os.name == "nt":
+ pygame_dir = os.path.split(__file__)[0]
+
+ # pypy does not find the dlls, so we add package folder to PATH.
+ os.environ["PATH"] = os.environ["PATH"] + ";" + pygame_dir
+
+ # windows store python does not find the dlls, so we run this
+ if sys.version_info > (3, 8):
+ os.add_dll_directory(pygame_dir) # only available in 3.8+
+
+ # cleanup namespace
+ del pygame_dir
+
+# when running under X11, always set the SDL window WM_CLASS to make the
+# window managers correctly match the pygame window.
+elif "DISPLAY" in os.environ and "SDL_VIDEO_X11_WMCLASS" not in os.environ:
+ os.environ["SDL_VIDEO_X11_WMCLASS"] = os.path.basename(sys.argv[0])
+
+
+def _attribute_undefined(name):
+ raise RuntimeError(f"{name} is not available")
+
+
+class MissingModule:
+ _NOT_IMPLEMENTED_ = True
+
+ def __init__(self, name, urgent=0):
+ self.name = name
+ exc_type, exc_msg = sys.exc_info()[:2]
+ self.info = str(exc_msg)
+ self.reason = f"{exc_type.__name__}: {self.info}"
+ self.urgent = urgent
+ if urgent:
+ self.warn()
+
+ def __getattr__(self, var):
+ if not self.urgent:
+ self.warn()
+ self.urgent = 1
+ missing_msg = f"{self.name} module not available ({self.reason})"
+ raise NotImplementedError(missing_msg)
+
+ def __bool__(self):
+ return False
+
+ def warn(self):
+ msg_type = "import" if self.urgent else "use"
+ message = f"{msg_type} {self.name}: {self.info}\n({self.reason})"
+ try:
+ import warnings
+
+ level = 4 if self.urgent else 3
+ warnings.warn(message, RuntimeWarning, level)
+ except ImportError:
+ print(message)
+
+
+# we need to import like this, each at a time. the cleanest way to import
+# our modules is with the import command (not the __import__ function)
+# isort: skip_file
+
+# first, the "required" modules
+from pygame.base import * # pylint: disable=wildcard-import; lgtm[py/polluting-import]
+from pygame.constants import * # now has __all__ pylint: disable=wildcard-import; lgtm[py/polluting-import]
+from pygame.version import * # pylint: disable=wildcard-import; lgtm[py/polluting-import]
+from pygame.rect import Rect
+from pygame.rwobject import encode_string, encode_file_path
+import pygame.surflock
+import pygame.color
+
+Color = pygame.color.Color
+import pygame.bufferproxy
+
+BufferProxy = pygame.bufferproxy.BufferProxy
+import pygame.math
+
+Vector2 = pygame.math.Vector2
+Vector3 = pygame.math.Vector3
+
+__version__ = ver
+
+# next, the "standard" modules
+# we still allow them to be missing for stripped down pygame distributions
+if get_sdl_version() < (2, 0, 0):
+ # cdrom only available for SDL 1.2.X
+ try:
+ import pygame.cdrom
+ except (ImportError, OSError):
+ cdrom = MissingModule("cdrom", urgent=1)
+
+try:
+ import pygame.display
+except (ImportError, OSError):
+ display = MissingModule("display", urgent=1)
+
+try:
+ import pygame.draw
+except (ImportError, OSError):
+ draw = MissingModule("draw", urgent=1)
+
+try:
+ import pygame.event
+except (ImportError, OSError):
+ event = MissingModule("event", urgent=1)
+
+try:
+ import pygame.image
+except (ImportError, OSError):
+ image = MissingModule("image", urgent=1)
+
+try:
+ import pygame.joystick
+except (ImportError, OSError):
+ joystick = MissingModule("joystick", urgent=1)
+
+try:
+ import pygame.key
+except (ImportError, OSError):
+ key = MissingModule("key", urgent=1)
+
+try:
+ import pygame.mouse
+except (ImportError, OSError):
+ mouse = MissingModule("mouse", urgent=1)
+
+try:
+ import pygame.cursors
+ from pygame.cursors import Cursor
+except (ImportError, OSError):
+ cursors = MissingModule("cursors", urgent=1)
+
+ def Cursor(*args): # pylint: disable=unused-argument
+ _attribute_undefined("pygame.Cursor")
+
+
+try:
+ import pygame.sprite
+except (ImportError, OSError):
+ sprite = MissingModule("sprite", urgent=1)
+
+try:
+ import pygame.threads
+except (ImportError, OSError):
+ threads = MissingModule("threads", urgent=1)
+
+try:
+ import pygame.pixelcopy
+except (ImportError, OSError):
+ pixelcopy = MissingModule("pixelcopy", urgent=1)
+
+
+try:
+ from pygame.surface import Surface, SurfaceType
+except (ImportError, OSError):
+
+ def Surface(size, flags, depth, masks): # pylint: disable=unused-argument
+ _attribute_undefined("pygame.Surface")
+
+ SurfaceType = Surface
+
+try:
+ import pygame.mask
+ from pygame.mask import Mask
+except (ImportError, OSError):
+ mask = MissingModule("mask", urgent=0)
+
+ def Mask(size, fill): # pylint: disable=unused-argument
+ _attribute_undefined("pygame.Mask")
+
+
+try:
+ from pygame.pixelarray import PixelArray
+except (ImportError, OSError):
+
+ def PixelArray(surface): # pylint: disable=unused-argument
+ _attribute_undefined("pygame.PixelArray")
+
+
+try:
+ from pygame.overlay import Overlay
+except (ImportError, OSError):
+
+ def Overlay(format, size): # pylint: disable=unused-argument
+ _attribute_undefined("pygame.Overlay")
+
+
+try:
+ import pygame.time
+except (ImportError, OSError):
+ time = MissingModule("time", urgent=1)
+
+try:
+ import pygame.transform
+except (ImportError, OSError):
+ transform = MissingModule("transform", urgent=1)
+
+# lastly, the "optional" pygame modules
+if "PYGAME_FREETYPE" in os.environ:
+ try:
+ import pygame.ftfont as font
+
+ sys.modules["pygame.font"] = font
+ except (ImportError, OSError):
+ pass
+try:
+ import pygame.font
+ import pygame.sysfont
+
+ pygame.font.SysFont = pygame.sysfont.SysFont
+ pygame.font.get_fonts = pygame.sysfont.get_fonts
+ pygame.font.match_font = pygame.sysfont.match_font
+except (ImportError, OSError):
+ font = MissingModule("font", urgent=0)
+
+# try and load pygame.mixer_music before mixer, for py2app...
+try:
+ import pygame.mixer_music
+
+ # del pygame.mixer_music
+ # print("NOTE2: failed importing pygame.mixer_music in lib/__init__.py")
+except (ImportError, OSError):
+ pass
+
+try:
+ import pygame.mixer
+except (ImportError, OSError):
+ mixer = MissingModule("mixer", urgent=0)
+
+try:
+ import pygame.scrap
+except (ImportError, OSError):
+ scrap = MissingModule("scrap", urgent=0)
+
+try:
+ import pygame.surfarray
+except (ImportError, OSError):
+ surfarray = MissingModule("surfarray", urgent=0)
+
+try:
+ import pygame.sndarray
+except (ImportError, OSError):
+ sndarray = MissingModule("sndarray", urgent=0)
+
+try:
+ import pygame.fastevent
+except (ImportError, OSError):
+ fastevent = MissingModule("fastevent", urgent=0)
+
+# there's also a couple "internal" modules not needed
+# by users, but putting them here helps "dependency finder"
+# programs get everything they need (like py2exe)
+try:
+ import pygame.imageext
+
+ del pygame.imageext
+except (ImportError, OSError):
+ pass
+
+# this internal module needs to be included for dependency
+# finders, but can't be deleted, as some tests need it
+try:
+ import pygame.pkgdata
+
+except (ImportError, OSError):
+ pass
+
+
+def packager_imports():
+ """some additional imports that py2app/py2exe will want to see"""
+ import atexit
+ import numpy
+ import OpenGL.GL
+ import pygame.macosx
+ import pygame.colordict
+
+
+# make Rects pickleable
+
+import copyreg
+
+
+def __rect_constructor(x, y, w, h):
+ return Rect(x, y, w, h)
+
+
+def __rect_reduce(r):
+ assert isinstance(r, Rect)
+ return __rect_constructor, (r.x, r.y, r.w, r.h)
+
+
+copyreg.pickle(Rect, __rect_reduce, __rect_constructor)
+
+
+# make Colors pickleable
+def __color_constructor(r, g, b, a):
+ return Color(r, g, b, a)
+
+
+def __color_reduce(c):
+ assert isinstance(c, Color)
+ return __color_constructor, (c.r, c.g, c.b, c.a)
+
+
+copyreg.pickle(Color, __color_reduce, __color_constructor)
+
+# Thanks for supporting pygame. Without support now, there won't be pygame later.
+if "PYGAME_HIDE_SUPPORT_PROMPT" not in os.environ:
+ print(
+ "pygame {} (SDL {}.{}.{}, Python {}.{}.{})".format( # pylint: disable=consider-using-f-string
+ ver, *get_sdl_version() + sys.version_info[0:3]
+ )
+ )
+ print("Hello from the pygame community. https://www.pygame.org/contribute.html")
+
+# cleanup namespace
+del pygame, os, sys, MissingModule, copyreg, packager_imports
diff --git a/.venv/Lib/site-packages/pygame/__init__.pyi b/.venv/Lib/site-packages/pygame/__init__.pyi
new file mode 100644
index 00000000..2d26fd11
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/__init__.pyi
@@ -0,0 +1,632 @@
+# buildconfig/stubs/gen_stubs.py
+# A script to auto-generate locals.pyi, constants.pyi and __init__.pyi typestubs
+# IMPORTANT NOTE: Do not edit this file by hand!
+
+
+from typing import Tuple, NoReturn
+
+def Overlay(format: int, size: Tuple[int, int]) -> NoReturn: ...
+
+from pygame import (
+ display as display,
+ draw as draw,
+ event as event,
+ font as font,
+ image as image,
+ key as key,
+ mixer as mixer,
+ mouse as mouse,
+ time as time,
+ cursors as cursors,
+ joystick as joystick,
+ math as math,
+ mask as mask,
+ pixelcopy as pixelcopy,
+ sndarray as sndarray,
+ sprite as sprite,
+ surfarray as surfarray,
+ transform as transform,
+ fastevent as fastevent,
+ scrap as scrap,
+ threads as threads,
+ version as version,
+ base as base,
+ bufferproxy as bufferproxy,
+ color as color,
+ colordict as colordict,
+ mixer_music as mixer_music,
+ pixelarray as pixelarray,
+ rect as rect,
+ rwobject as rwobject,
+ surface as surface,
+ surflock as surflock,
+ sysfont as sysfont,
+)
+
+from .rect import Rect as Rect
+from .surface import Surface as Surface, SurfaceType as SurfaceType
+from .color import Color as Color
+from .pixelarray import PixelArray as PixelArray
+from .math import Vector2 as Vector2, Vector3 as Vector3
+from .cursors import Cursor as Cursor
+from .bufferproxy import BufferProxy as BufferProxy
+from .mask import Mask as Mask
+from .base import (
+ BufferError as BufferError,
+ HAVE_NEWBUF as HAVE_NEWBUF,
+ error as error,
+ get_array_interface as get_array_interface,
+ get_error as get_error,
+ get_init as get_init,
+ get_sdl_byteorder as get_sdl_byteorder,
+ get_sdl_version as get_sdl_version,
+ init as init,
+ quit as quit,
+ register_quit as register_quit,
+ set_error as set_error,
+)
+
+from .rwobject import (
+ encode_file_path as encode_file_path,
+ encode_string as encode_string,
+)
+
+from .version import SDL as SDL, rev as rev, ver as ver, vernum as vernum, ver as __version__
+from .constants import (
+ ACTIVEEVENT as ACTIVEEVENT,
+ ANYFORMAT as ANYFORMAT,
+ APPACTIVE as APPACTIVE,
+ APPINPUTFOCUS as APPINPUTFOCUS,
+ APPMOUSEFOCUS as APPMOUSEFOCUS,
+ APP_DIDENTERBACKGROUND as APP_DIDENTERBACKGROUND,
+ APP_DIDENTERFOREGROUND as APP_DIDENTERFOREGROUND,
+ APP_LOWMEMORY as APP_LOWMEMORY,
+ APP_TERMINATING as APP_TERMINATING,
+ APP_WILLENTERBACKGROUND as APP_WILLENTERBACKGROUND,
+ APP_WILLENTERFOREGROUND as APP_WILLENTERFOREGROUND,
+ ASYNCBLIT as ASYNCBLIT,
+ AUDIODEVICEADDED as AUDIODEVICEADDED,
+ AUDIODEVICEREMOVED as AUDIODEVICEREMOVED,
+ AUDIO_ALLOW_ANY_CHANGE as AUDIO_ALLOW_ANY_CHANGE,
+ AUDIO_ALLOW_CHANNELS_CHANGE as AUDIO_ALLOW_CHANNELS_CHANGE,
+ AUDIO_ALLOW_FORMAT_CHANGE as AUDIO_ALLOW_FORMAT_CHANGE,
+ AUDIO_ALLOW_FREQUENCY_CHANGE as AUDIO_ALLOW_FREQUENCY_CHANGE,
+ AUDIO_S16 as AUDIO_S16,
+ AUDIO_S16LSB as AUDIO_S16LSB,
+ AUDIO_S16MSB as AUDIO_S16MSB,
+ AUDIO_S16SYS as AUDIO_S16SYS,
+ AUDIO_S8 as AUDIO_S8,
+ AUDIO_U16 as AUDIO_U16,
+ AUDIO_U16LSB as AUDIO_U16LSB,
+ AUDIO_U16MSB as AUDIO_U16MSB,
+ AUDIO_U16SYS as AUDIO_U16SYS,
+ AUDIO_U8 as AUDIO_U8,
+ BIG_ENDIAN as BIG_ENDIAN,
+ BLENDMODE_ADD as BLENDMODE_ADD,
+ BLENDMODE_BLEND as BLENDMODE_BLEND,
+ BLENDMODE_MOD as BLENDMODE_MOD,
+ BLENDMODE_NONE as BLENDMODE_NONE,
+ BLEND_ADD as BLEND_ADD,
+ BLEND_ALPHA_SDL2 as BLEND_ALPHA_SDL2,
+ BLEND_MAX as BLEND_MAX,
+ BLEND_MIN as BLEND_MIN,
+ BLEND_MULT as BLEND_MULT,
+ BLEND_PREMULTIPLIED as BLEND_PREMULTIPLIED,
+ BLEND_RGBA_ADD as BLEND_RGBA_ADD,
+ BLEND_RGBA_MAX as BLEND_RGBA_MAX,
+ BLEND_RGBA_MIN as BLEND_RGBA_MIN,
+ BLEND_RGBA_MULT as BLEND_RGBA_MULT,
+ BLEND_RGBA_SUB as BLEND_RGBA_SUB,
+ BLEND_RGB_ADD as BLEND_RGB_ADD,
+ BLEND_RGB_MAX as BLEND_RGB_MAX,
+ BLEND_RGB_MIN as BLEND_RGB_MIN,
+ BLEND_RGB_MULT as BLEND_RGB_MULT,
+ BLEND_RGB_SUB as BLEND_RGB_SUB,
+ BLEND_SUB as BLEND_SUB,
+ BUTTON_LEFT as BUTTON_LEFT,
+ BUTTON_MIDDLE as BUTTON_MIDDLE,
+ BUTTON_RIGHT as BUTTON_RIGHT,
+ BUTTON_WHEELDOWN as BUTTON_WHEELDOWN,
+ BUTTON_WHEELUP as BUTTON_WHEELUP,
+ BUTTON_X1 as BUTTON_X1,
+ BUTTON_X2 as BUTTON_X2,
+ CLIPBOARDUPDATE as CLIPBOARDUPDATE,
+ CONTROLLERAXISMOTION as CONTROLLERAXISMOTION,
+ CONTROLLERBUTTONDOWN as CONTROLLERBUTTONDOWN,
+ CONTROLLERBUTTONUP as CONTROLLERBUTTONUP,
+ CONTROLLERDEVICEADDED as CONTROLLERDEVICEADDED,
+ CONTROLLERDEVICEREMAPPED as CONTROLLERDEVICEREMAPPED,
+ CONTROLLERDEVICEREMOVED as CONTROLLERDEVICEREMOVED,
+ CONTROLLERSENSORUPDATE as CONTROLLERSENSORUPDATE,
+ CONTROLLERTOUCHPADDOWN as CONTROLLERTOUCHPADDOWN,
+ CONTROLLERTOUCHPADMOTION as CONTROLLERTOUCHPADMOTION,
+ CONTROLLERTOUCHPADUP as CONTROLLERTOUCHPADUP,
+ CONTROLLER_AXIS_INVALID as CONTROLLER_AXIS_INVALID,
+ CONTROLLER_AXIS_LEFTX as CONTROLLER_AXIS_LEFTX,
+ CONTROLLER_AXIS_LEFTY as CONTROLLER_AXIS_LEFTY,
+ CONTROLLER_AXIS_MAX as CONTROLLER_AXIS_MAX,
+ CONTROLLER_AXIS_RIGHTX as CONTROLLER_AXIS_RIGHTX,
+ CONTROLLER_AXIS_RIGHTY as CONTROLLER_AXIS_RIGHTY,
+ CONTROLLER_AXIS_TRIGGERLEFT as CONTROLLER_AXIS_TRIGGERLEFT,
+ CONTROLLER_AXIS_TRIGGERRIGHT as CONTROLLER_AXIS_TRIGGERRIGHT,
+ CONTROLLER_BUTTON_A as CONTROLLER_BUTTON_A,
+ CONTROLLER_BUTTON_B as CONTROLLER_BUTTON_B,
+ CONTROLLER_BUTTON_BACK as CONTROLLER_BUTTON_BACK,
+ CONTROLLER_BUTTON_DPAD_DOWN as CONTROLLER_BUTTON_DPAD_DOWN,
+ CONTROLLER_BUTTON_DPAD_LEFT as CONTROLLER_BUTTON_DPAD_LEFT,
+ CONTROLLER_BUTTON_DPAD_RIGHT as CONTROLLER_BUTTON_DPAD_RIGHT,
+ CONTROLLER_BUTTON_DPAD_UP as CONTROLLER_BUTTON_DPAD_UP,
+ CONTROLLER_BUTTON_GUIDE as CONTROLLER_BUTTON_GUIDE,
+ CONTROLLER_BUTTON_INVALID as CONTROLLER_BUTTON_INVALID,
+ CONTROLLER_BUTTON_LEFTSHOULDER as CONTROLLER_BUTTON_LEFTSHOULDER,
+ CONTROLLER_BUTTON_LEFTSTICK as CONTROLLER_BUTTON_LEFTSTICK,
+ CONTROLLER_BUTTON_MAX as CONTROLLER_BUTTON_MAX,
+ CONTROLLER_BUTTON_RIGHTSHOULDER as CONTROLLER_BUTTON_RIGHTSHOULDER,
+ CONTROLLER_BUTTON_RIGHTSTICK as CONTROLLER_BUTTON_RIGHTSTICK,
+ CONTROLLER_BUTTON_START as CONTROLLER_BUTTON_START,
+ CONTROLLER_BUTTON_X as CONTROLLER_BUTTON_X,
+ CONTROLLER_BUTTON_Y as CONTROLLER_BUTTON_Y,
+ DOUBLEBUF as DOUBLEBUF,
+ DROPBEGIN as DROPBEGIN,
+ DROPCOMPLETE as DROPCOMPLETE,
+ DROPFILE as DROPFILE,
+ DROPTEXT as DROPTEXT,
+ FINGERDOWN as FINGERDOWN,
+ FINGERMOTION as FINGERMOTION,
+ FINGERUP as FINGERUP,
+ FULLSCREEN as FULLSCREEN,
+ GL_ACCELERATED_VISUAL as GL_ACCELERATED_VISUAL,
+ GL_ACCUM_ALPHA_SIZE as GL_ACCUM_ALPHA_SIZE,
+ GL_ACCUM_BLUE_SIZE as GL_ACCUM_BLUE_SIZE,
+ GL_ACCUM_GREEN_SIZE as GL_ACCUM_GREEN_SIZE,
+ GL_ACCUM_RED_SIZE as GL_ACCUM_RED_SIZE,
+ GL_ALPHA_SIZE as GL_ALPHA_SIZE,
+ GL_BLUE_SIZE as GL_BLUE_SIZE,
+ GL_BUFFER_SIZE as GL_BUFFER_SIZE,
+ GL_CONTEXT_DEBUG_FLAG as GL_CONTEXT_DEBUG_FLAG,
+ GL_CONTEXT_FLAGS as GL_CONTEXT_FLAGS,
+ GL_CONTEXT_FORWARD_COMPATIBLE_FLAG as GL_CONTEXT_FORWARD_COMPATIBLE_FLAG,
+ GL_CONTEXT_MAJOR_VERSION as GL_CONTEXT_MAJOR_VERSION,
+ GL_CONTEXT_MINOR_VERSION as GL_CONTEXT_MINOR_VERSION,
+ GL_CONTEXT_PROFILE_COMPATIBILITY as GL_CONTEXT_PROFILE_COMPATIBILITY,
+ GL_CONTEXT_PROFILE_CORE as GL_CONTEXT_PROFILE_CORE,
+ GL_CONTEXT_PROFILE_ES as GL_CONTEXT_PROFILE_ES,
+ GL_CONTEXT_PROFILE_MASK as GL_CONTEXT_PROFILE_MASK,
+ GL_CONTEXT_RELEASE_BEHAVIOR as GL_CONTEXT_RELEASE_BEHAVIOR,
+ GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH as GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH,
+ GL_CONTEXT_RELEASE_BEHAVIOR_NONE as GL_CONTEXT_RELEASE_BEHAVIOR_NONE,
+ GL_CONTEXT_RESET_ISOLATION_FLAG as GL_CONTEXT_RESET_ISOLATION_FLAG,
+ GL_CONTEXT_ROBUST_ACCESS_FLAG as GL_CONTEXT_ROBUST_ACCESS_FLAG,
+ GL_DEPTH_SIZE as GL_DEPTH_SIZE,
+ GL_DOUBLEBUFFER as GL_DOUBLEBUFFER,
+ GL_FRAMEBUFFER_SRGB_CAPABLE as GL_FRAMEBUFFER_SRGB_CAPABLE,
+ GL_GREEN_SIZE as GL_GREEN_SIZE,
+ GL_MULTISAMPLEBUFFERS as GL_MULTISAMPLEBUFFERS,
+ GL_MULTISAMPLESAMPLES as GL_MULTISAMPLESAMPLES,
+ GL_RED_SIZE as GL_RED_SIZE,
+ GL_SHARE_WITH_CURRENT_CONTEXT as GL_SHARE_WITH_CURRENT_CONTEXT,
+ GL_STENCIL_SIZE as GL_STENCIL_SIZE,
+ GL_STEREO as GL_STEREO,
+ GL_SWAP_CONTROL as GL_SWAP_CONTROL,
+ HAT_CENTERED as HAT_CENTERED,
+ HAT_DOWN as HAT_DOWN,
+ HAT_LEFT as HAT_LEFT,
+ HAT_LEFTDOWN as HAT_LEFTDOWN,
+ HAT_LEFTUP as HAT_LEFTUP,
+ HAT_RIGHT as HAT_RIGHT,
+ HAT_RIGHTDOWN as HAT_RIGHTDOWN,
+ HAT_RIGHTUP as HAT_RIGHTUP,
+ HAT_UP as HAT_UP,
+ HIDDEN as HIDDEN,
+ HWACCEL as HWACCEL,
+ HWPALETTE as HWPALETTE,
+ HWSURFACE as HWSURFACE,
+ JOYAXISMOTION as JOYAXISMOTION,
+ JOYBALLMOTION as JOYBALLMOTION,
+ JOYBUTTONDOWN as JOYBUTTONDOWN,
+ JOYBUTTONUP as JOYBUTTONUP,
+ JOYDEVICEADDED as JOYDEVICEADDED,
+ JOYDEVICEREMOVED as JOYDEVICEREMOVED,
+ JOYHATMOTION as JOYHATMOTION,
+ KEYDOWN as KEYDOWN,
+ KEYMAPCHANGED as KEYMAPCHANGED,
+ KEYUP as KEYUP,
+ KMOD_ALT as KMOD_ALT,
+ KMOD_CAPS as KMOD_CAPS,
+ KMOD_CTRL as KMOD_CTRL,
+ KMOD_GUI as KMOD_GUI,
+ KMOD_LALT as KMOD_LALT,
+ KMOD_LCTRL as KMOD_LCTRL,
+ KMOD_LGUI as KMOD_LGUI,
+ KMOD_LMETA as KMOD_LMETA,
+ KMOD_LSHIFT as KMOD_LSHIFT,
+ KMOD_META as KMOD_META,
+ KMOD_MODE as KMOD_MODE,
+ KMOD_NONE as KMOD_NONE,
+ KMOD_NUM as KMOD_NUM,
+ KMOD_RALT as KMOD_RALT,
+ KMOD_RCTRL as KMOD_RCTRL,
+ KMOD_RGUI as KMOD_RGUI,
+ KMOD_RMETA as KMOD_RMETA,
+ KMOD_RSHIFT as KMOD_RSHIFT,
+ KMOD_SHIFT as KMOD_SHIFT,
+ KSCAN_0 as KSCAN_0,
+ KSCAN_1 as KSCAN_1,
+ KSCAN_2 as KSCAN_2,
+ KSCAN_3 as KSCAN_3,
+ KSCAN_4 as KSCAN_4,
+ KSCAN_5 as KSCAN_5,
+ KSCAN_6 as KSCAN_6,
+ KSCAN_7 as KSCAN_7,
+ KSCAN_8 as KSCAN_8,
+ KSCAN_9 as KSCAN_9,
+ KSCAN_A as KSCAN_A,
+ KSCAN_AC_BACK as KSCAN_AC_BACK,
+ KSCAN_APOSTROPHE as KSCAN_APOSTROPHE,
+ KSCAN_B as KSCAN_B,
+ KSCAN_BACKSLASH as KSCAN_BACKSLASH,
+ KSCAN_BACKSPACE as KSCAN_BACKSPACE,
+ KSCAN_BREAK as KSCAN_BREAK,
+ KSCAN_C as KSCAN_C,
+ KSCAN_CAPSLOCK as KSCAN_CAPSLOCK,
+ KSCAN_CLEAR as KSCAN_CLEAR,
+ KSCAN_COMMA as KSCAN_COMMA,
+ KSCAN_CURRENCYSUBUNIT as KSCAN_CURRENCYSUBUNIT,
+ KSCAN_CURRENCYUNIT as KSCAN_CURRENCYUNIT,
+ KSCAN_D as KSCAN_D,
+ KSCAN_DELETE as KSCAN_DELETE,
+ KSCAN_DOWN as KSCAN_DOWN,
+ KSCAN_E as KSCAN_E,
+ KSCAN_END as KSCAN_END,
+ KSCAN_EQUALS as KSCAN_EQUALS,
+ KSCAN_ESCAPE as KSCAN_ESCAPE,
+ KSCAN_EURO as KSCAN_EURO,
+ KSCAN_F as KSCAN_F,
+ KSCAN_F1 as KSCAN_F1,
+ KSCAN_F10 as KSCAN_F10,
+ KSCAN_F11 as KSCAN_F11,
+ KSCAN_F12 as KSCAN_F12,
+ KSCAN_F13 as KSCAN_F13,
+ KSCAN_F14 as KSCAN_F14,
+ KSCAN_F15 as KSCAN_F15,
+ KSCAN_F2 as KSCAN_F2,
+ KSCAN_F3 as KSCAN_F3,
+ KSCAN_F4 as KSCAN_F4,
+ KSCAN_F5 as KSCAN_F5,
+ KSCAN_F6 as KSCAN_F6,
+ KSCAN_F7 as KSCAN_F7,
+ KSCAN_F8 as KSCAN_F8,
+ KSCAN_F9 as KSCAN_F9,
+ KSCAN_G as KSCAN_G,
+ KSCAN_GRAVE as KSCAN_GRAVE,
+ KSCAN_H as KSCAN_H,
+ KSCAN_HELP as KSCAN_HELP,
+ KSCAN_HOME as KSCAN_HOME,
+ KSCAN_I as KSCAN_I,
+ KSCAN_INSERT as KSCAN_INSERT,
+ KSCAN_INTERNATIONAL1 as KSCAN_INTERNATIONAL1,
+ KSCAN_INTERNATIONAL2 as KSCAN_INTERNATIONAL2,
+ KSCAN_INTERNATIONAL3 as KSCAN_INTERNATIONAL3,
+ KSCAN_INTERNATIONAL4 as KSCAN_INTERNATIONAL4,
+ KSCAN_INTERNATIONAL5 as KSCAN_INTERNATIONAL5,
+ KSCAN_INTERNATIONAL6 as KSCAN_INTERNATIONAL6,
+ KSCAN_INTERNATIONAL7 as KSCAN_INTERNATIONAL7,
+ KSCAN_INTERNATIONAL8 as KSCAN_INTERNATIONAL8,
+ KSCAN_INTERNATIONAL9 as KSCAN_INTERNATIONAL9,
+ KSCAN_J as KSCAN_J,
+ KSCAN_K as KSCAN_K,
+ KSCAN_KP0 as KSCAN_KP0,
+ KSCAN_KP1 as KSCAN_KP1,
+ KSCAN_KP2 as KSCAN_KP2,
+ KSCAN_KP3 as KSCAN_KP3,
+ KSCAN_KP4 as KSCAN_KP4,
+ KSCAN_KP5 as KSCAN_KP5,
+ KSCAN_KP6 as KSCAN_KP6,
+ KSCAN_KP7 as KSCAN_KP7,
+ KSCAN_KP8 as KSCAN_KP8,
+ KSCAN_KP9 as KSCAN_KP9,
+ KSCAN_KP_0 as KSCAN_KP_0,
+ KSCAN_KP_1 as KSCAN_KP_1,
+ KSCAN_KP_2 as KSCAN_KP_2,
+ KSCAN_KP_3 as KSCAN_KP_3,
+ KSCAN_KP_4 as KSCAN_KP_4,
+ KSCAN_KP_5 as KSCAN_KP_5,
+ KSCAN_KP_6 as KSCAN_KP_6,
+ KSCAN_KP_7 as KSCAN_KP_7,
+ KSCAN_KP_8 as KSCAN_KP_8,
+ KSCAN_KP_9 as KSCAN_KP_9,
+ KSCAN_KP_DIVIDE as KSCAN_KP_DIVIDE,
+ KSCAN_KP_ENTER as KSCAN_KP_ENTER,
+ KSCAN_KP_EQUALS as KSCAN_KP_EQUALS,
+ KSCAN_KP_MINUS as KSCAN_KP_MINUS,
+ KSCAN_KP_MULTIPLY as KSCAN_KP_MULTIPLY,
+ KSCAN_KP_PERIOD as KSCAN_KP_PERIOD,
+ KSCAN_KP_PLUS as KSCAN_KP_PLUS,
+ KSCAN_L as KSCAN_L,
+ KSCAN_LALT as KSCAN_LALT,
+ KSCAN_LANG1 as KSCAN_LANG1,
+ KSCAN_LANG2 as KSCAN_LANG2,
+ KSCAN_LANG3 as KSCAN_LANG3,
+ KSCAN_LANG4 as KSCAN_LANG4,
+ KSCAN_LANG5 as KSCAN_LANG5,
+ KSCAN_LANG6 as KSCAN_LANG6,
+ KSCAN_LANG7 as KSCAN_LANG7,
+ KSCAN_LANG8 as KSCAN_LANG8,
+ KSCAN_LANG9 as KSCAN_LANG9,
+ KSCAN_LCTRL as KSCAN_LCTRL,
+ KSCAN_LEFT as KSCAN_LEFT,
+ KSCAN_LEFTBRACKET as KSCAN_LEFTBRACKET,
+ KSCAN_LGUI as KSCAN_LGUI,
+ KSCAN_LMETA as KSCAN_LMETA,
+ KSCAN_LSHIFT as KSCAN_LSHIFT,
+ KSCAN_LSUPER as KSCAN_LSUPER,
+ KSCAN_M as KSCAN_M,
+ KSCAN_MENU as KSCAN_MENU,
+ KSCAN_MINUS as KSCAN_MINUS,
+ KSCAN_MODE as KSCAN_MODE,
+ KSCAN_N as KSCAN_N,
+ KSCAN_NONUSBACKSLASH as KSCAN_NONUSBACKSLASH,
+ KSCAN_NONUSHASH as KSCAN_NONUSHASH,
+ KSCAN_NUMLOCK as KSCAN_NUMLOCK,
+ KSCAN_NUMLOCKCLEAR as KSCAN_NUMLOCKCLEAR,
+ KSCAN_O as KSCAN_O,
+ KSCAN_P as KSCAN_P,
+ KSCAN_PAGEDOWN as KSCAN_PAGEDOWN,
+ KSCAN_PAGEUP as KSCAN_PAGEUP,
+ KSCAN_PAUSE as KSCAN_PAUSE,
+ KSCAN_PERIOD as KSCAN_PERIOD,
+ KSCAN_POWER as KSCAN_POWER,
+ KSCAN_PRINT as KSCAN_PRINT,
+ KSCAN_PRINTSCREEN as KSCAN_PRINTSCREEN,
+ KSCAN_Q as KSCAN_Q,
+ KSCAN_R as KSCAN_R,
+ KSCAN_RALT as KSCAN_RALT,
+ KSCAN_RCTRL as KSCAN_RCTRL,
+ KSCAN_RETURN as KSCAN_RETURN,
+ KSCAN_RGUI as KSCAN_RGUI,
+ KSCAN_RIGHT as KSCAN_RIGHT,
+ KSCAN_RIGHTBRACKET as KSCAN_RIGHTBRACKET,
+ KSCAN_RMETA as KSCAN_RMETA,
+ KSCAN_RSHIFT as KSCAN_RSHIFT,
+ KSCAN_RSUPER as KSCAN_RSUPER,
+ KSCAN_S as KSCAN_S,
+ KSCAN_SCROLLLOCK as KSCAN_SCROLLLOCK,
+ KSCAN_SCROLLOCK as KSCAN_SCROLLOCK,
+ KSCAN_SEMICOLON as KSCAN_SEMICOLON,
+ KSCAN_SLASH as KSCAN_SLASH,
+ KSCAN_SPACE as KSCAN_SPACE,
+ KSCAN_SYSREQ as KSCAN_SYSREQ,
+ KSCAN_T as KSCAN_T,
+ KSCAN_TAB as KSCAN_TAB,
+ KSCAN_U as KSCAN_U,
+ KSCAN_UNKNOWN as KSCAN_UNKNOWN,
+ KSCAN_UP as KSCAN_UP,
+ KSCAN_V as KSCAN_V,
+ KSCAN_W as KSCAN_W,
+ KSCAN_X as KSCAN_X,
+ KSCAN_Y as KSCAN_Y,
+ KSCAN_Z as KSCAN_Z,
+ K_0 as K_0,
+ K_1 as K_1,
+ K_2 as K_2,
+ K_3 as K_3,
+ K_4 as K_4,
+ K_5 as K_5,
+ K_6 as K_6,
+ K_7 as K_7,
+ K_8 as K_8,
+ K_9 as K_9,
+ K_AC_BACK as K_AC_BACK,
+ K_AMPERSAND as K_AMPERSAND,
+ K_ASTERISK as K_ASTERISK,
+ K_AT as K_AT,
+ K_BACKQUOTE as K_BACKQUOTE,
+ K_BACKSLASH as K_BACKSLASH,
+ K_BACKSPACE as K_BACKSPACE,
+ K_BREAK as K_BREAK,
+ K_CAPSLOCK as K_CAPSLOCK,
+ K_CARET as K_CARET,
+ K_CLEAR as K_CLEAR,
+ K_COLON as K_COLON,
+ K_COMMA as K_COMMA,
+ K_CURRENCYSUBUNIT as K_CURRENCYSUBUNIT,
+ K_CURRENCYUNIT as K_CURRENCYUNIT,
+ K_DELETE as K_DELETE,
+ K_DOLLAR as K_DOLLAR,
+ K_DOWN as K_DOWN,
+ K_END as K_END,
+ K_EQUALS as K_EQUALS,
+ K_ESCAPE as K_ESCAPE,
+ K_EURO as K_EURO,
+ K_EXCLAIM as K_EXCLAIM,
+ K_F1 as K_F1,
+ K_F10 as K_F10,
+ K_F11 as K_F11,
+ K_F12 as K_F12,
+ K_F13 as K_F13,
+ K_F14 as K_F14,
+ K_F15 as K_F15,
+ K_F2 as K_F2,
+ K_F3 as K_F3,
+ K_F4 as K_F4,
+ K_F5 as K_F5,
+ K_F6 as K_F6,
+ K_F7 as K_F7,
+ K_F8 as K_F8,
+ K_F9 as K_F9,
+ K_GREATER as K_GREATER,
+ K_HASH as K_HASH,
+ K_HELP as K_HELP,
+ K_HOME as K_HOME,
+ K_INSERT as K_INSERT,
+ K_KP0 as K_KP0,
+ K_KP1 as K_KP1,
+ K_KP2 as K_KP2,
+ K_KP3 as K_KP3,
+ K_KP4 as K_KP4,
+ K_KP5 as K_KP5,
+ K_KP6 as K_KP6,
+ K_KP7 as K_KP7,
+ K_KP8 as K_KP8,
+ K_KP9 as K_KP9,
+ K_KP_0 as K_KP_0,
+ K_KP_1 as K_KP_1,
+ K_KP_2 as K_KP_2,
+ K_KP_3 as K_KP_3,
+ K_KP_4 as K_KP_4,
+ K_KP_5 as K_KP_5,
+ K_KP_6 as K_KP_6,
+ K_KP_7 as K_KP_7,
+ K_KP_8 as K_KP_8,
+ K_KP_9 as K_KP_9,
+ K_KP_DIVIDE as K_KP_DIVIDE,
+ K_KP_ENTER as K_KP_ENTER,
+ K_KP_EQUALS as K_KP_EQUALS,
+ K_KP_MINUS as K_KP_MINUS,
+ K_KP_MULTIPLY as K_KP_MULTIPLY,
+ K_KP_PERIOD as K_KP_PERIOD,
+ K_KP_PLUS as K_KP_PLUS,
+ K_LALT as K_LALT,
+ K_LCTRL as K_LCTRL,
+ K_LEFT as K_LEFT,
+ K_LEFTBRACKET as K_LEFTBRACKET,
+ K_LEFTPAREN as K_LEFTPAREN,
+ K_LESS as K_LESS,
+ K_LGUI as K_LGUI,
+ K_LMETA as K_LMETA,
+ K_LSHIFT as K_LSHIFT,
+ K_LSUPER as K_LSUPER,
+ K_MENU as K_MENU,
+ K_MINUS as K_MINUS,
+ K_MODE as K_MODE,
+ K_NUMLOCK as K_NUMLOCK,
+ K_NUMLOCKCLEAR as K_NUMLOCKCLEAR,
+ K_PAGEDOWN as K_PAGEDOWN,
+ K_PAGEUP as K_PAGEUP,
+ K_PAUSE as K_PAUSE,
+ K_PERCENT as K_PERCENT,
+ K_PERIOD as K_PERIOD,
+ K_PLUS as K_PLUS,
+ K_POWER as K_POWER,
+ K_PRINT as K_PRINT,
+ K_PRINTSCREEN as K_PRINTSCREEN,
+ K_QUESTION as K_QUESTION,
+ K_QUOTE as K_QUOTE,
+ K_QUOTEDBL as K_QUOTEDBL,
+ K_RALT as K_RALT,
+ K_RCTRL as K_RCTRL,
+ K_RETURN as K_RETURN,
+ K_RGUI as K_RGUI,
+ K_RIGHT as K_RIGHT,
+ K_RIGHTBRACKET as K_RIGHTBRACKET,
+ K_RIGHTPAREN as K_RIGHTPAREN,
+ K_RMETA as K_RMETA,
+ K_RSHIFT as K_RSHIFT,
+ K_RSUPER as K_RSUPER,
+ K_SCROLLLOCK as K_SCROLLLOCK,
+ K_SCROLLOCK as K_SCROLLOCK,
+ K_SEMICOLON as K_SEMICOLON,
+ K_SLASH as K_SLASH,
+ K_SPACE as K_SPACE,
+ K_SYSREQ as K_SYSREQ,
+ K_TAB as K_TAB,
+ K_UNDERSCORE as K_UNDERSCORE,
+ K_UNKNOWN as K_UNKNOWN,
+ K_UP as K_UP,
+ K_a as K_a,
+ K_b as K_b,
+ K_c as K_c,
+ K_d as K_d,
+ K_e as K_e,
+ K_f as K_f,
+ K_g as K_g,
+ K_h as K_h,
+ K_i as K_i,
+ K_j as K_j,
+ K_k as K_k,
+ K_l as K_l,
+ K_m as K_m,
+ K_n as K_n,
+ K_o as K_o,
+ K_p as K_p,
+ K_q as K_q,
+ K_r as K_r,
+ K_s as K_s,
+ K_t as K_t,
+ K_u as K_u,
+ K_v as K_v,
+ K_w as K_w,
+ K_x as K_x,
+ K_y as K_y,
+ K_z as K_z,
+ LIL_ENDIAN as LIL_ENDIAN,
+ LOCALECHANGED as LOCALECHANGED,
+ MIDIIN as MIDIIN,
+ MIDIOUT as MIDIOUT,
+ MOUSEBUTTONDOWN as MOUSEBUTTONDOWN,
+ MOUSEBUTTONUP as MOUSEBUTTONUP,
+ MOUSEMOTION as MOUSEMOTION,
+ MOUSEWHEEL as MOUSEWHEEL,
+ MULTIGESTURE as MULTIGESTURE,
+ NOEVENT as NOEVENT,
+ NOFRAME as NOFRAME,
+ NUMEVENTS as NUMEVENTS,
+ OPENGL as OPENGL,
+ OPENGLBLIT as OPENGLBLIT,
+ PREALLOC as PREALLOC,
+ QUIT as QUIT,
+ RENDER_DEVICE_RESET as RENDER_DEVICE_RESET,
+ RENDER_TARGETS_RESET as RENDER_TARGETS_RESET,
+ RESIZABLE as RESIZABLE,
+ RLEACCEL as RLEACCEL,
+ RLEACCELOK as RLEACCELOK,
+ SCALED as SCALED,
+ SCRAP_BMP as SCRAP_BMP,
+ SCRAP_CLIPBOARD as SCRAP_CLIPBOARD,
+ SCRAP_PBM as SCRAP_PBM,
+ SCRAP_PPM as SCRAP_PPM,
+ SCRAP_SELECTION as SCRAP_SELECTION,
+ SCRAP_TEXT as SCRAP_TEXT,
+ SHOWN as SHOWN,
+ SRCALPHA as SRCALPHA,
+ SRCCOLORKEY as SRCCOLORKEY,
+ SWSURFACE as SWSURFACE,
+ SYSTEM_CURSOR_ARROW as SYSTEM_CURSOR_ARROW,
+ SYSTEM_CURSOR_CROSSHAIR as SYSTEM_CURSOR_CROSSHAIR,
+ SYSTEM_CURSOR_HAND as SYSTEM_CURSOR_HAND,
+ SYSTEM_CURSOR_IBEAM as SYSTEM_CURSOR_IBEAM,
+ SYSTEM_CURSOR_NO as SYSTEM_CURSOR_NO,
+ SYSTEM_CURSOR_SIZEALL as SYSTEM_CURSOR_SIZEALL,
+ SYSTEM_CURSOR_SIZENESW as SYSTEM_CURSOR_SIZENESW,
+ SYSTEM_CURSOR_SIZENS as SYSTEM_CURSOR_SIZENS,
+ SYSTEM_CURSOR_SIZENWSE as SYSTEM_CURSOR_SIZENWSE,
+ SYSTEM_CURSOR_SIZEWE as SYSTEM_CURSOR_SIZEWE,
+ SYSTEM_CURSOR_WAIT as SYSTEM_CURSOR_WAIT,
+ SYSTEM_CURSOR_WAITARROW as SYSTEM_CURSOR_WAITARROW,
+ SYSWMEVENT as SYSWMEVENT,
+ TEXTEDITING as TEXTEDITING,
+ TEXTINPUT as TEXTINPUT,
+ TIMER_RESOLUTION as TIMER_RESOLUTION,
+ USEREVENT as USEREVENT,
+ USEREVENT_DROPFILE as USEREVENT_DROPFILE,
+ VIDEOEXPOSE as VIDEOEXPOSE,
+ VIDEORESIZE as VIDEORESIZE,
+ WINDOWCLOSE as WINDOWCLOSE,
+ WINDOWDISPLAYCHANGED as WINDOWDISPLAYCHANGED,
+ WINDOWENTER as WINDOWENTER,
+ WINDOWEXPOSED as WINDOWEXPOSED,
+ WINDOWFOCUSGAINED as WINDOWFOCUSGAINED,
+ WINDOWFOCUSLOST as WINDOWFOCUSLOST,
+ WINDOWHIDDEN as WINDOWHIDDEN,
+ WINDOWHITTEST as WINDOWHITTEST,
+ WINDOWICCPROFCHANGED as WINDOWICCPROFCHANGED,
+ WINDOWLEAVE as WINDOWLEAVE,
+ WINDOWMAXIMIZED as WINDOWMAXIMIZED,
+ WINDOWMINIMIZED as WINDOWMINIMIZED,
+ WINDOWMOVED as WINDOWMOVED,
+ WINDOWRESIZED as WINDOWRESIZED,
+ WINDOWRESTORED as WINDOWRESTORED,
+ WINDOWSHOWN as WINDOWSHOWN,
+ WINDOWSIZECHANGED as WINDOWSIZECHANGED,
+ WINDOWTAKEFOCUS as WINDOWTAKEFOCUS,
+)
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 00000000..3b6d09f7
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/_camera_opencv.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/_camera_opencv.cpython-311.pyc
new file mode 100644
index 00000000..b1dc2422
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/_camera_opencv.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/_camera_vidcapture.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/_camera_vidcapture.cpython-311.pyc
new file mode 100644
index 00000000..578efe5f
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/_camera_vidcapture.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/camera.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/camera.cpython-311.pyc
new file mode 100644
index 00000000..3c87f545
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/camera.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/colordict.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/colordict.cpython-311.pyc
new file mode 100644
index 00000000..2371f1cd
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/colordict.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/cursors.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/cursors.cpython-311.pyc
new file mode 100644
index 00000000..6b8895e1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/cursors.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/draw_py.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/draw_py.cpython-311.pyc
new file mode 100644
index 00000000..62a001e1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/draw_py.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/fastevent.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/fastevent.cpython-311.pyc
new file mode 100644
index 00000000..e0382cb9
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/fastevent.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/freetype.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/freetype.cpython-311.pyc
new file mode 100644
index 00000000..ad9292af
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/freetype.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/ftfont.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/ftfont.cpython-311.pyc
new file mode 100644
index 00000000..079f9ede
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/ftfont.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/locals.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/locals.cpython-311.pyc
new file mode 100644
index 00000000..a03fa510
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/locals.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/macosx.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/macosx.cpython-311.pyc
new file mode 100644
index 00000000..535f3728
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/macosx.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/midi.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/midi.cpython-311.pyc
new file mode 100644
index 00000000..4097aea6
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/midi.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/pkgdata.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/pkgdata.cpython-311.pyc
new file mode 100644
index 00000000..bf2f578d
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/pkgdata.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/sndarray.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/sndarray.cpython-311.pyc
new file mode 100644
index 00000000..bed6234a
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/sndarray.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/sprite.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/sprite.cpython-311.pyc
new file mode 100644
index 00000000..e8e456f3
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/sprite.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/surfarray.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/surfarray.cpython-311.pyc
new file mode 100644
index 00000000..f12eff9b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/surfarray.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/sysfont.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/sysfont.cpython-311.pyc
new file mode 100644
index 00000000..b0671afa
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/sysfont.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pycache__/version.cpython-311.pyc
new file mode 100644
index 00000000..4cf7d727
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pycache__/version.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pyinstaller/__init__.py b/.venv/Lib/site-packages/pygame/__pyinstaller/__init__.py
new file mode 100644
index 00000000..1c52aadf
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/__pyinstaller/__init__.py
@@ -0,0 +1,5 @@
+import os
+
+
+def get_hook_dirs():
+ return [os.path.dirname(__file__)]
diff --git a/.venv/Lib/site-packages/pygame/__pyinstaller/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pyinstaller/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 00000000..5d92fdc1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pyinstaller/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pyinstaller/__pycache__/hook-pygame.cpython-311.pyc b/.venv/Lib/site-packages/pygame/__pyinstaller/__pycache__/hook-pygame.cpython-311.pyc
new file mode 100644
index 00000000..bc28ed06
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/__pyinstaller/__pycache__/hook-pygame.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/__pyinstaller/hook-pygame.py b/.venv/Lib/site-packages/pygame/__pyinstaller/hook-pygame.py
new file mode 100644
index 00000000..01477b6d
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/__pyinstaller/hook-pygame.py
@@ -0,0 +1,45 @@
+"""
+binaries hook for pygame seems to be required for pygame 2.0 Windows.
+Otherwise some essential DLLs will not be transferred to the exe.
+
+And also put hooks for datas, resources that pygame uses, to work
+correctly with pyinstaller
+"""
+
+import os
+import platform
+
+from pygame import __file__ as pygame_main_file
+
+# Get pygame's folder
+pygame_folder = os.path.dirname(os.path.abspath(pygame_main_file))
+
+# datas is the variable that pyinstaller looks for while processing hooks
+datas = []
+
+
+# A helper to append the relative path of a resource to hook variable - datas
+def _append_to_datas(file_path):
+ res_path = os.path.join(pygame_folder, file_path)
+ if os.path.exists(res_path):
+ datas.append((res_path, "pygame"))
+
+
+# First append the font file, then based on the OS, append pygame icon file
+_append_to_datas("freesansbold.ttf")
+if platform.system() == "Darwin":
+ _append_to_datas("pygame_icon_mac.bmp")
+else:
+ _append_to_datas("pygame_icon.bmp")
+
+if platform.system() == "Windows":
+ from PyInstaller.utils.hooks import collect_dynamic_libs
+
+ pre_binaries = collect_dynamic_libs("pygame")
+ binaries = []
+
+ for b in pre_binaries:
+ binary, location = b
+ # settles all the DLLs into the top level folder, which prevents duplication
+ # with the DLLs already being put there.
+ binaries.append((binary, "."))
diff --git a/.venv/Lib/site-packages/pygame/_camera.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_camera.cp311-win_amd64.pyd
new file mode 100644
index 00000000..6096db5b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_camera.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/_camera_opencv.py b/.venv/Lib/site-packages/pygame/_camera_opencv.py
new file mode 100644
index 00000000..8f1bb55e
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_camera_opencv.py
@@ -0,0 +1,208 @@
+"""pygame.camera backend that uses OpenCV.
+
+Uses the cv2 module opencv for python.
+See https://pypi.org/project/opencv-python/ for wheels version.
+
+python3 -m pip install opencv-python --user
+"""
+import numpy
+import cv2
+import time
+
+import pygame
+
+
+def list_cameras():
+ """ """
+ index = 0
+ device_idx = []
+ failed = 0
+
+ # Sometimes there are gaps between the device index.
+ # We keep trying max_gaps times.
+ max_gaps = 3
+
+ while failed < max_gaps:
+ vcap = cv2.VideoCapture(index)
+ if not vcap.read()[0]:
+ failed += 1
+ else:
+ device_idx.append(index)
+ vcap.release()
+ index += 1
+ return device_idx
+
+
+def list_cameras_darwin():
+ import subprocess
+ from xml.etree import ElementTree
+
+ # pylint: disable=consider-using-with
+ flout, _ = subprocess.Popen(
+ "system_profiler -xml SPCameraDataType",
+ shell=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ ).communicate()
+
+ last_text = None
+ cameras = []
+
+ for node in ElementTree.fromstring(flout).iterfind("./array/dict/array/dict/*"):
+ if last_text == "_name":
+ cameras.append(node.text)
+ last_text = node.text
+
+ return cameras
+
+
+class Camera:
+ def __init__(self, device=0, size=(640, 480), mode="RGB", api_preference=None):
+ """
+ api_preference - cv2.CAP_DSHOW cv2.CAP_V4L2 cv2.CAP_MSMF and others
+
+ # See https://docs.opencv.org/3.4/d4/d15/group__videoio__flags__base.html
+ """
+ self._device_index = device
+ self._size = size
+
+ self.api_preference = api_preference
+ if api_preference is not None:
+ if sys.platform == "win32":
+ # seems more compatible on windows?
+ self.api_preference = cv2.CAP_DSHOW
+
+ if mode == "RGB":
+ self._fmt = cv2.COLOR_BGR2RGB
+ elif mode == "YUV":
+ self._fmt = cv2.COLOR_BGR2YUV
+ elif mode == "HSV":
+ self._fmt = cv2.COLOR_BGR2HSV
+ else:
+ raise ValueError("Not a supported mode")
+
+ self._open = False
+
+ # all of this could have been done in the constructor, but creating
+ # the VideoCapture is very time consuming, so it makes more sense in the
+ # actual start() method
+ def start(self):
+ if self._open:
+ return
+
+ self._cam = cv2.VideoCapture(self._device_index, self.api_preference)
+
+ if not self._cam.isOpened():
+ raise ValueError("Could not open camera.")
+
+ self._cam.set(cv2.CAP_PROP_FRAME_WIDTH, self._size[0])
+ self._cam.set(cv2.CAP_PROP_FRAME_HEIGHT, self._size[1])
+
+ w = self._cam.get(cv2.CAP_PROP_FRAME_WIDTH)
+ h = self._cam.get(cv2.CAP_PROP_FRAME_HEIGHT)
+ self._size = (int(w), int(h))
+
+ self._flipx = False
+ self._flipy = False
+ self._brightness = 1
+
+ self._frametime = 1 / self._cam.get(cv2.CAP_PROP_FPS)
+ self._last_frame_time = 0
+
+ self._open = True
+
+ def stop(self):
+ if self._open:
+ self._cam.release()
+ self._cam = None
+ self._open = False
+
+ def _check_open(self):
+ if not self._open:
+ raise pygame.error("Camera must be started")
+
+ def get_size(self):
+ self._check_open()
+
+ return self._size
+
+ def set_controls(self, hflip=None, vflip=None, brightness=None):
+ self._check_open()
+
+ if hflip is not None:
+ self._flipx = bool(hflip)
+ if vflip is not None:
+ self._flipy = bool(vflip)
+ if brightness is not None:
+ self._cam.set(cv2.CAP_PROP_BRIGHTNESS, brightness)
+
+ return self.get_controls()
+
+ def get_controls(self):
+ self._check_open()
+
+ return (self._flipx, self._flipy, self._cam.get(cv2.CAP_PROP_BRIGHTNESS))
+
+ def query_image(self):
+ self._check_open()
+
+ current_time = time.time()
+ if current_time - self._last_frame_time > self._frametime:
+ return True
+ return False
+
+ def get_image(self, dest_surf=None):
+ self._check_open()
+
+ self._last_frame_time = time.time()
+
+ _, image = self._cam.read()
+
+ image = cv2.cvtColor(image, self._fmt)
+
+ flip_code = None
+ if self._flipx:
+ if self._flipy:
+ flip_code = -1
+ else:
+ flip_code = 1
+ elif self._flipy:
+ flip_code = 0
+
+ if flip_code is not None:
+ image = cv2.flip(image, flip_code)
+
+ image = numpy.fliplr(image)
+ image = numpy.rot90(image)
+
+ surf = pygame.surfarray.make_surface(image)
+
+ if dest_surf:
+ dest_surf.blit(surf, (0, 0))
+ return dest_surf
+
+ return surf
+
+ def get_raw(self):
+ self._check_open()
+
+ self._last_frame_time = time.time()
+
+ _, image = self._cam.read()
+
+ return image.tobytes()
+
+
+class CameraMac(Camera):
+ def __init__(self, device=0, size=(640, 480), mode="RGB", api_preference=None):
+ if isinstance(device, int):
+ _dev = device
+ elif isinstance(device, str):
+ _dev = list_cameras_darwin().index(device)
+ else:
+ raise TypeError(
+ "OpenCV-Mac backend can take device indices or names, ints or strings, not ",
+ str(type(device)),
+ )
+
+ super().__init__(_dev, size, mode, api_preference)
diff --git a/.venv/Lib/site-packages/pygame/_camera_vidcapture.py b/.venv/Lib/site-packages/pygame/_camera_vidcapture.py
new file mode 100644
index 00000000..56df43d5
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_camera_vidcapture.py
@@ -0,0 +1,117 @@
+"""pygame.camera.Camera implementation using the videocapture module for windows.
+
+http://videocapture.sourceforge.net/
+
+Binary windows wheels:
+ https://www.lfd.uci.edu/~gohlke/pythonlibs/#videocapture
+"""
+import pygame
+
+
+def list_cameras():
+ """Always only lists one camera.
+
+ Functionality not supported in videocapture module.
+ """
+ return [0]
+
+ # this just cycles through all the cameras trying to open them
+ # cameras = []
+ # for x in range(256):
+ # try:
+ # c = Camera(x)
+ # except:
+ # break
+ # cameras.append(x)
+ # return cameras
+
+
+def init():
+ global vidcap
+ try:
+ import vidcap as vc
+ except ImportError:
+ from VideoCapture import vidcap as vc
+ vidcap = vc
+
+
+def quit():
+ global vidcap
+ vidcap = None
+
+
+class Camera:
+ # pylint: disable=unused-argument
+ def __init__(self, device=0, size=(640, 480), mode="RGB", show_video_window=0):
+ """device: VideoCapture enumerates the available video capture devices
+ on your system. If you have more than one device, specify
+ the desired one here. The device number starts from 0.
+
+ show_video_window: 0 ... do not display a video window (the default)
+ 1 ... display a video window
+
+ Mainly used for debugging, since the video window
+ can not be closed or moved around.
+ """
+ self.dev = vidcap.new_Dev(device, show_video_window)
+ width, height = size
+ self.dev.setresolution(width, height)
+
+ def display_capture_filter_properties(self):
+ """Displays a dialog containing the property page of the capture filter.
+
+ For VfW drivers you may find the option to select the resolution most
+ likely here.
+ """
+ self.dev.displaycapturefilterproperties()
+
+ def display_capture_pin_properties(self):
+ """Displays a dialog containing the property page of the capture pin.
+
+ For WDM drivers you may find the option to select the resolution most
+ likely here.
+ """
+ self.dev.displaycapturepinproperties()
+
+ def set_resolution(self, width, height):
+ """Sets the capture resolution. (without dialog)"""
+ self.dev.setresolution(width, height)
+
+ def get_buffer(self):
+ """Returns a string containing the raw pixel data."""
+ return self.dev.getbuffer()
+
+ def start(self):
+ """Not implemented."""
+
+ def set_controls(self, **kwargs):
+ """Not implemented."""
+
+ def stop(self):
+ """Not implemented."""
+
+ def get_image(self, dest_surf=None):
+ """ """
+ return self.get_surface(dest_surf)
+
+ def get_surface(self, dest_surf=None):
+ """Returns a pygame Surface."""
+ abuffer, width, height = self.get_buffer()
+ if not abuffer:
+ return None
+ surf = pygame.image.frombuffer(abuffer, (width, height), "BGR")
+ surf = pygame.transform.flip(surf, 0, 1)
+ # if there is a destination surface given, we blit onto that.
+ if dest_surf:
+ dest_surf.blit(surf, (0, 0))
+ else:
+ dest_surf = surf
+ return dest_surf
+
+
+if __name__ == "__main__":
+ import pygame.examples.camera
+
+ pygame.camera.Camera = Camera
+ pygame.camera.list_cameras = list_cameras
+ pygame.examples.camera.main()
diff --git a/.venv/Lib/site-packages/pygame/_common.pyi b/.venv/Lib/site-packages/pygame/_common.pyi
new file mode 100644
index 00000000..bd139601
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_common.pyi
@@ -0,0 +1,40 @@
+from os import PathLike
+from typing import IO, Callable, Sequence, Tuple, Union
+
+from typing_extensions import Literal as Literal
+from typing_extensions import Protocol
+
+from pygame.color import Color
+from pygame.math import Vector2
+from pygame.rect import Rect
+
+# For functions that take a file name
+AnyPath = Union[str, bytes, PathLike[str], PathLike[bytes]]
+
+# Most pygame functions that take a file argument should be able to handle
+# a FileArg type
+FileArg = Union[AnyPath, IO[bytes], IO[str]]
+
+Coordinate = Union[Tuple[float, float], Sequence[float], Vector2]
+
+# This typehint is used when a function would return an RGBA tuble
+RGBAOutput = Tuple[int, int, int, int]
+ColorValue = Union[Color, int, str, Tuple[int, int, int], RGBAOutput, Sequence[int]]
+from typing import Union
+
+def my_function(my_var: Union[int, float, complex]) -> None:
+ print(my_var)
+_CanBeRect = Union[
+ Rect,
+ Tuple[Union[float, int], Union[float, int], Union[float, int], Union[float, int]],
+ Tuple[Coordinate, Coordinate],
+ Sequence[Union[float, int]],
+ Sequence[Coordinate],
+]
+
+class _HasRectAttribute(Protocol):
+ # An object that has a rect attribute that is either a rect, or a function
+ # that returns a rect confirms to the rect protocol
+ rect: Union[RectValue, Callable[[], RectValue]]
+
+RectValue = Union[_CanBeRect, _HasRectAttribute]
diff --git a/.venv/Lib/site-packages/pygame/_freetype.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_freetype.cp311-win_amd64.pyd
new file mode 100644
index 00000000..e967aa63
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_freetype.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/__init__.py b/.venv/Lib/site-packages/pygame/_sdl2/__init__.py
new file mode 100644
index 00000000..b08b716f
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_sdl2/__init__.py
@@ -0,0 +1,3 @@
+from .sdl2 import * # pylint: disable=wildcard-import; lgtm[py/polluting-import]
+from .audio import * # pylint: disable=wildcard-import; lgtm[py/polluting-import]
+from .video import * # pylint: disable=wildcard-import; lgtm[py/polluting-import]
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/__init__.pyi b/.venv/Lib/site-packages/pygame/_sdl2/__init__.pyi
new file mode 100644
index 00000000..8f929c78
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_sdl2/__init__.pyi
@@ -0,0 +1,3 @@
+from pygame._sdl2.audio import *
+from pygame._sdl2.sdl2 import *
+from pygame._sdl2.video import *
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pygame/_sdl2/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 00000000..7983ab53
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_sdl2/__pycache__/__init__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/audio.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_sdl2/audio.cp311-win_amd64.pyd
new file mode 100644
index 00000000..eed4dce7
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_sdl2/audio.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/audio.pyi b/.venv/Lib/site-packages/pygame/_sdl2/audio.pyi
new file mode 100644
index 00000000..332f645d
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_sdl2/audio.pyi
@@ -0,0 +1,54 @@
+from typing import Callable, List
+
+AUDIO_U8: int
+AUDIO_S8: int
+AUDIO_U16LSB: int
+AUDIO_S16LSB: int
+AUDIO_U16MSB: int
+AUDIO_S16MSB: int
+AUDIO_U16: int
+AUDIO_S16: int
+AUDIO_S32LSB: int
+AUDIO_S32MSB: int
+AUDIO_S32: int
+AUDIO_F32LSB: int
+AUDIO_F32MSB: int
+AUDIO_F32: int
+
+AUDIO_ALLOW_FREQUENCY_CHANGE: int
+AUDIO_ALLOW_FORMAT_CHANGE: int
+AUDIO_ALLOW_CHANNELS_CHANGE: int
+AUDIO_ALLOW_ANY_CHANGE: int
+
+def get_audio_device_names(iscapture: bool = False) -> List[str]: ...
+
+class AudioDevice:
+ def __init__(
+ self,
+ devicename: str,
+ iscapture: bool,
+ frequency: int,
+ audioformat: int,
+ numchannels: int,
+ chunksize: int,
+ allowed_changes: int,
+ callback: Callable[[AudioDevice, memoryview], None],
+ ) -> None: ...
+ @property
+ def iscapture(self) -> bool: ...
+ @property
+ def deviceid(self) -> int: ...
+ @property
+ def devicename(self) -> str: ...
+ @property
+ def callback(self) -> Callable[[AudioDevice, memoryview], None]: ...
+ @property
+ def frequency(self) -> int: ...
+ @property
+ def audioformat(self) -> int: ...
+ @property
+ def numchannels(self) -> int: ...
+ @property
+ def chunksize(self) -> int: ...
+ def pause(self, pause_on: int) -> None: ...
+ def close(self) -> None: ...
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/controller.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_sdl2/controller.cp311-win_amd64.pyd
new file mode 100644
index 00000000..b4a39f26
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_sdl2/controller.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/controller.pyi b/.venv/Lib/site-packages/pygame/_sdl2/controller.pyi
new file mode 100644
index 00000000..3810fbba
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_sdl2/controller.pyi
@@ -0,0 +1,35 @@
+from typing import Dict, Mapping, Optional
+
+from pygame.joystick import JoystickType
+
+def init() -> None: ...
+def get_init() -> bool: ...
+def quit() -> None: ...
+def set_eventstate(state: bool) -> None: ...
+def get_eventstate() -> bool: ...
+def update() -> None: ...
+def get_count() -> int: ...
+def is_controller(index: int) -> bool: ...
+def name_forindex(index: int) -> Optional[str]: ...
+
+class Controller:
+ def __init__(self, index: int) -> None: ...
+ @property
+ def name(self) -> str: ...
+ @property
+ def id(self) -> int: ...
+ def init(self) -> None: ...
+ def get_init(self) -> bool: ...
+ def quit(self) -> None: ...
+ @staticmethod
+ def from_joystick(joy: JoystickType) -> Controller: ...
+ def attached(self) -> bool: ...
+ def as_joystick(self) -> JoystickType: ...
+ def get_axis(self, axis: int) -> int: ...
+ def get_button(self, button: int) -> bool: ...
+ def get_mapping(self) -> Dict[str, str]: ...
+ def set_mapping(self, mapping: Mapping[str, str]) -> int: ...
+ def rumble(
+ self, low_frequency: float, high_frequency: float, duration: int
+ ) -> bool: ...
+ def stop_rumble(self) -> None: ...
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/mixer.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_sdl2/mixer.cp311-win_amd64.pyd
new file mode 100644
index 00000000..a51a9b68
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_sdl2/mixer.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/sdl2.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_sdl2/sdl2.cp311-win_amd64.pyd
new file mode 100644
index 00000000..78612ed5
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_sdl2/sdl2.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/sdl2.pyi b/.venv/Lib/site-packages/pygame/_sdl2/sdl2.pyi
new file mode 100644
index 00000000..8a2b622d
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_sdl2/sdl2.pyi
@@ -0,0 +1,16 @@
+from typing import Optional
+
+INIT_TIMER: int
+INIT_AUDIO: int
+INIT_VIDEO: int
+INIT_JOYSTICK: int
+INIT_HAPTIC: int
+INIT_GAMECONTROLLER: int
+INIT_EVENTS: int
+INIT_NOPARACHUTE: int
+INIT_EVERYTHING: int
+
+class error(RuntimeError):
+ def __init__(self, message: Optional[str] = None) -> None: ...
+
+def init_subsystem(flags: int) -> None: ...
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/touch.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_sdl2/touch.cp311-win_amd64.pyd
new file mode 100644
index 00000000..13869e57
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_sdl2/touch.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/touch.pyi b/.venv/Lib/site-packages/pygame/_sdl2/touch.pyi
new file mode 100644
index 00000000..93e27457
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_sdl2/touch.pyi
@@ -0,0 +1,6 @@
+from typing import Dict, Union
+
+def get_num_devices() -> int: ...
+def get_device(index: int) -> int: ...
+def get_num_fingers(device_id: int) -> int: ...
+def get_finger(touchid: int, index: int) -> Dict[str, Union[int, float]]: ...
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/video.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_sdl2/video.cp311-win_amd64.pyd
new file mode 100644
index 00000000..841f2fd7
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_sdl2/video.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/_sdl2/video.pyi b/.venv/Lib/site-packages/pygame/_sdl2/video.pyi
new file mode 100644
index 00000000..a2d4afec
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/_sdl2/video.pyi
@@ -0,0 +1,159 @@
+from typing import Any, Generator, Iterable, Optional, Tuple, Union
+
+from pygame.rect import Rect
+from pygame.surface import Surface
+
+from .._common import RectValue, Literal, ColorValue
+
+WINDOWPOS_UNDEFINED: int
+WINDOWPOS_CENTERED: int
+
+MESSAGEBOX_ERROR: int
+MESSAGEBOX_WARNING: int
+MESSAGEBOX_INFORMATION: int
+
+class RendererDriverInfo:
+ name: str
+ flags: int
+ num_texture_formats: int
+ max_texture_width: int
+ max_texture_height: int
+
+def get_drivers() -> Generator[RendererDriverInfo, None, None]: ...
+def get_grabbed_window() -> Optional[Window]: ...
+def messagebox(
+ title: str,
+ message: str,
+ window: Optional[Window] = None,
+ info: bool = False,
+ warn: bool = False,
+ error: bool = False,
+ buttons: Tuple[str, ...] = ("OK",),
+ return_button: int = 0,
+ escape_button: int = 0,
+) -> int: ...
+
+class Window:
+ DEFAULT_SIZE: Tuple[Literal[640], Literal[480]]
+ def __init__(
+ self,
+ title: str = "pygame",
+ size: Iterable[int] = (640, 480),
+ position: Optional[Iterable[int]] = None,
+ fullscreen: bool = False,
+ fullscreen_desktop: bool = False,
+ **kwargs: bool
+ ) -> None: ...
+ @classmethod
+ def from_display_module(cls) -> Window: ...
+ @classmethod
+ def from_window(cls, other: int) -> Window: ...
+ grab: bool
+ relative_mouse: bool
+ def set_windowed(self) -> None: ...
+ def set_fullscreen(self, desktop: bool = False) -> None: ...
+ title: str
+ def destroy(self) -> None: ...
+ def hide(self) -> None: ...
+ def show(self) -> None: ...
+ def focus(self, input_only: bool = False) -> None: ...
+ def restore(self) -> None: ...
+ def maximize(self) -> None: ...
+ def minimize(self) -> None: ...
+ resizable: bool
+ borderless: bool
+ def set_icon(self, surface: Surface) -> None: ...
+ id: int
+ size: Iterable[int]
+ position: Union[int, Iterable[int]]
+ opacity: float
+ display_index: int
+ def set_modal_for(self, parent: Window) -> None: ...
+
+class Texture:
+ def __init__(
+ self,
+ renderer: Renderer,
+ size: Iterable[int],
+ static: bool = False,
+ streaming: bool = False,
+ target: bool = False,
+ ) -> None: ...
+ @staticmethod
+ def from_surface(renderer: Renderer, surface: Surface) -> Texture: ...
+ renderer: Renderer
+ width: int
+ height: int
+ alpha: int
+ blend_mode: int
+ color: ColorValue
+ def get_rect(self, **kwargs: Any) -> Rect: ...
+ def draw(
+ self,
+ srcrect: Optional[RectValue] = None,
+ dstrect: Optional[RectValue] = None,
+ angle: float = 0.0,
+ origin: Optional[Iterable[int]] = None,
+ flip_x: bool = False,
+ flip_y: bool = False,
+ ) -> None: ...
+ def update(self, surface: Surface, area: Optional[RectValue] = None) -> None: ...
+
+class Image:
+ def __init__(
+ self,
+ textureOrImage: Union[Texture, Image],
+ srcrect: Optional[RectValue] = None,
+ ) -> None: ...
+ def get_rect(self, **kwargs: Any) -> Rect: ...
+ def draw(
+ self, srcrect: Optional[RectValue] = None, dstrect: Optional[RectValue] = None
+ ) -> None: ...
+ angle: float
+ origin: Optional[Iterable[float]]
+ flip_x: bool
+ flip_y: bool
+ color: ColorValue
+ alpha: float
+ blend_mode: int
+ texture: Texture
+ srcrect: Rect
+
+class Renderer:
+ def __init__(
+ self,
+ window: Window,
+ index: int = -1,
+ accelerated: int = -1,
+ vsync: bool = False,
+ target_texture: bool = False,
+ ) -> None: ...
+ @classmethod
+ def from_window(cls, window: Window) -> Renderer: ...
+ draw_blend_mode: int
+ draw_color: ColorValue
+ def clear(self) -> None: ...
+ def present(self) -> None: ...
+ def get_viewport(self) -> Rect: ...
+ def set_viewport(self, area: Optional[RectValue]) -> None: ...
+ logical_size: Iterable[int]
+ scale: Iterable[float]
+ target: Optional[Texture]
+ def blit(
+ self,
+ source: Union[Texture, Image],
+ dest: Optional[RectValue] = None,
+ area: Optional[RectValue] = None,
+ special_flags: int = 0,
+ ) -> Rect: ...
+ def draw_line(self, p1: Iterable[int], p2: Iterable[int]) -> None: ...
+ def draw_point(self, point: Iterable[int]) -> None: ...
+ def draw_rect(self, rect: RectValue) -> None: ...
+ def fill_rect(self, rect: RectValue) -> None: ...
+ def to_surface(
+ self, surface: Optional[Surface] = None, area: Optional[RectValue] = None
+ ) -> Surface: ...
+ @staticmethod
+ def compose_custom_blend_mode(
+ color_mode: Tuple[int, int, int], alpha_mode: Tuple[int, int, int]
+ ) -> int: ...
diff --git a/.venv/Lib/site-packages/pygame/_sprite.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/_sprite.cp311-win_amd64.pyd
new file mode 100644
index 00000000..b700fea9
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/_sprite.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/base.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/base.cp311-win_amd64.pyd
new file mode 100644
index 00000000..830bb28a
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/base.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/base.pyi b/.venv/Lib/site-packages/pygame/base.pyi
new file mode 100644
index 00000000..c641e36a
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/base.pyi
@@ -0,0 +1,19 @@
+from typing import Any, Tuple, Callable
+
+class error(RuntimeError): ...
+class BufferError(Exception): ...
+
+# Always defined
+HAVE_NEWBUF: int = 1
+
+def init() -> Tuple[int, int]: ...
+def quit() -> None: ...
+def get_init() -> bool: ...
+def get_error() -> str: ...
+def set_error(error_msg: str) -> None: ...
+def get_sdl_version(linked: bool = True) -> Tuple[int, int, int]: ...
+def get_sdl_byteorder() -> int: ...
+def register_quit(callable: Callable[[], Any]) -> None: ...
+
+# undocumented part of pygame API, kept here to make stubtest happy
+def get_array_interface(arg: Any) -> dict: ...
diff --git a/.venv/Lib/site-packages/pygame/bufferproxy.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/bufferproxy.cp311-win_amd64.pyd
new file mode 100644
index 00000000..4f1dde81
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/bufferproxy.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/bufferproxy.pyi b/.venv/Lib/site-packages/pygame/bufferproxy.pyi
new file mode 100644
index 00000000..b77eb46c
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/bufferproxy.pyi
@@ -0,0 +1,15 @@
+from typing import Any, Dict, overload
+
+class BufferProxy:
+ parent: Any
+ length: int
+ raw: bytes
+ # possibly going to be deprecated/removed soon, in which case these
+ # typestubs must be removed too
+ __array_interface__: Dict[str, Any]
+ __array_struct__: Any
+ @overload
+ def __init__(self) -> None: ...
+ @overload
+ def __init__(self, parent: Any) -> None: ...
+ def write(self, buffer: bytes, offset: int = 0) -> None: ...
diff --git a/.venv/Lib/site-packages/pygame/camera.py b/.venv/Lib/site-packages/pygame/camera.py
new file mode 100644
index 00000000..9fc09ef7
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/camera.py
@@ -0,0 +1,211 @@
+import os
+import platform
+import sys
+import warnings
+from abc import ABC, abstractmethod
+
+from pygame import error
+
+_is_init = False
+
+
+class AbstractCamera(ABC):
+ # set_controls and get_controls are not a part of the AbstractCamera ABC,
+ # because implementations of the same can vary across different Camera
+ # types
+ @abstractmethod
+ def __init__(self, *args, **kwargs):
+ """ """
+
+ @abstractmethod
+ def start(self):
+ """ """
+
+ @abstractmethod
+ def stop(self):
+ """ """
+
+ @abstractmethod
+ def get_size(self):
+ """ """
+
+ @abstractmethod
+ def query_image(self):
+ """ """
+
+ @abstractmethod
+ def get_image(self, dest_surf=None):
+ """ """
+
+ @abstractmethod
+ def get_raw(self):
+ """ """
+
+
+def _pre_init_placeholder():
+ if not _is_init:
+ raise error("pygame.camera is not initialized")
+
+ # camera was init, and yet functions are not monkey patched. This should
+ # not happen
+ raise NotImplementedError()
+
+
+def _pre_init_placeholder_varargs(*_, **__):
+ _pre_init_placeholder()
+
+
+class _PreInitPlaceholderCamera(AbstractCamera):
+ __init__ = _pre_init_placeholder_varargs
+ start = _pre_init_placeholder_varargs
+ stop = _pre_init_placeholder_varargs
+ get_controls = _pre_init_placeholder_varargs
+ set_controls = _pre_init_placeholder_varargs
+ get_size = _pre_init_placeholder_varargs
+ query_image = _pre_init_placeholder_varargs
+ get_image = _pre_init_placeholder_varargs
+ get_raw = _pre_init_placeholder_varargs
+
+
+list_cameras = _pre_init_placeholder
+Camera = _PreInitPlaceholderCamera
+
+
+def _colorspace_not_available(*args):
+ raise RuntimeError("pygame is not built with colorspace support")
+
+
+try:
+ from pygame import _camera
+
+ colorspace = _camera.colorspace
+except ImportError:
+ # Should not happen in most cases
+ colorspace = _colorspace_not_available
+
+
+def _setup_backend(backend):
+ global list_cameras, Camera
+ if backend == "opencv-mac":
+ from pygame import _camera_opencv
+
+ list_cameras = _camera_opencv.list_cameras_darwin
+ Camera = _camera_opencv.CameraMac
+
+ elif backend == "opencv":
+ from pygame import _camera_opencv
+
+ list_cameras = _camera_opencv.list_cameras
+ Camera = _camera_opencv.Camera
+
+ elif backend in ("_camera (msmf)", "_camera (v4l2)"):
+ from pygame import _camera
+
+ list_cameras = _camera.list_cameras
+ Camera = _camera.Camera
+
+ elif backend == "videocapture":
+ from pygame import _camera_vidcapture
+
+ warnings.warn(
+ "The VideoCapture backend is not recommended and may be removed."
+ "For Python3 and Windows 8+, there is now a native Windows "
+ "backend built into pygame.",
+ DeprecationWarning,
+ stacklevel=2,
+ )
+
+ _camera_vidcapture.init()
+ list_cameras = _camera_vidcapture.list_cameras
+ Camera = _camera_vidcapture.Camera
+ else:
+ raise ValueError("unrecognized backend name")
+
+
+def get_backends():
+ possible_backends = []
+
+ if sys.platform == "win32" and int(platform.win32_ver()[0].split(".")[0]) >= 8:
+ try:
+ # If cv2 is installed, prefer that on windows.
+ import cv2
+
+ possible_backends.append("OpenCV")
+ except ImportError:
+ possible_backends.append("_camera (MSMF)")
+
+ if "linux" in sys.platform:
+ possible_backends.append("_camera (V4L2)")
+
+ if "darwin" in sys.platform:
+ possible_backends.append("OpenCV-Mac")
+
+ if "OpenCV" not in possible_backends:
+ possible_backends.append("OpenCV")
+
+ if sys.platform == "win32":
+ possible_backends.append("VideoCapture")
+
+ # see if we have any user specified defaults in environments.
+ camera_env = os.environ.get("PYGAME_CAMERA", "").lower()
+ if camera_env == "opencv": # prioritize opencv
+ if "OpenCV" in possible_backends:
+ possible_backends.remove("OpenCV")
+ possible_backends = ["OpenCV"] + possible_backends
+
+ if camera_env in ("vidcapture", "videocapture"): # prioritize vidcapture
+ if "VideoCapture" in possible_backends:
+ possible_backends.remove("VideoCapture")
+ possible_backends = ["VideoCapture"] + possible_backends
+
+ return possible_backends
+
+
+def init(backend=None):
+ global _is_init
+ # select the camera module to import here.
+
+ backends = [b.lower() for b in get_backends()]
+ if not backends:
+ raise error("No camera backends are supported on your platform!")
+
+ backend = backends[0] if backend is None else backend.lower()
+ if backend not in backends:
+ warnings.warn(
+ "We don't think this is a supported backend on this system, "
+ "but we'll try it...",
+ Warning,
+ stacklevel=2,
+ )
+
+ try:
+ _setup_backend(backend)
+ except ImportError:
+ emsg = f"Backend '{backend}' is not supported on your platform!"
+ if backend in ("opencv", "opencv-mac", "videocapture"):
+ dep = "vidcap" if backend == "videocapture" else "OpenCV"
+ emsg += (
+ f" Make sure you have '{dep}' installed to be able to use this backend"
+ )
+
+ raise error(emsg)
+
+ _is_init = True
+
+
+def quit():
+ global _is_init, Camera, list_cameras
+ # reset to their respective pre-init placeholders
+ list_cameras = _pre_init_placeholder
+ Camera = _PreInitPlaceholderCamera
+
+ _is_init = False
+
+
+if __name__ == "__main__":
+ # try and use this camera stuff with the pygame camera example.
+ import pygame.examples.camera
+
+ # pygame.camera.Camera = Camera
+ # pygame.camera.list_cameras = list_cameras
+ pygame.examples.camera.main()
diff --git a/.venv/Lib/site-packages/pygame/camera.pyi b/.venv/Lib/site-packages/pygame/camera.pyi
new file mode 100644
index 00000000..eb0360ca
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/camera.pyi
@@ -0,0 +1,49 @@
+from abc import ABC, abstractmethod
+from typing import List, Optional, Sequence, Tuple, Union
+
+from pygame.surface import Surface
+
+def get_backends() -> List[str]: ...
+def init(backend: Optional[str] = None) -> None: ...
+def quit() -> None: ...
+def list_cameras() -> List[str]: ...
+
+class AbstractCamera(ABC):
+ @abstractmethod
+ def __init__(self, *args, **kwargs) -> None: ...
+ @abstractmethod
+ def start(self) -> None: ...
+ @abstractmethod
+ def stop(self) -> None: ...
+ @abstractmethod
+ def get_size(self) -> Tuple[int, int]: ...
+ @abstractmethod
+ def query_image(self) -> bool: ...
+ @abstractmethod
+ def get_image(self, dest_surf: Optional[Surface] = None) -> Surface: ...
+ @abstractmethod
+ def get_raw(self) -> bytes: ...
+ # set_controls and get_controls are not a part of the AbstractCamera ABC,
+ # because implementations of the same can vary across different Camera
+ # types
+
+class Camera(AbstractCamera):
+ def __init__(
+ self,
+ device: Union[str, int] = 0,
+ size: Union[Tuple[int, int], Sequence[int]] = (640, 480),
+ format: str = "RGB",
+ ) -> None: ...
+ def start(self) -> None: ...
+ def stop(self) -> None: ...
+ def get_controls(self) -> Tuple[bool, bool, int]: ...
+ def set_controls(
+ self,
+ hflip: bool = ...,
+ vflip: bool = ...,
+ brightness: int = ...,
+ ) -> Tuple[bool, bool, int]: ...
+ def get_size(self) -> Tuple[int, int]: ...
+ def query_image(self) -> bool: ...
+ def get_image(self, surface: Optional[Surface] = None) -> Surface: ...
+ def get_raw(self) -> bytes: ...
diff --git a/.venv/Lib/site-packages/pygame/color.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/color.cp311-win_amd64.pyd
new file mode 100644
index 00000000..d6805ee0
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/color.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/color.pyi b/.venv/Lib/site-packages/pygame/color.pyi
new file mode 100644
index 00000000..93ed6886
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/color.pyi
@@ -0,0 +1,56 @@
+import sys
+from typing import Any, Dict, Iterator, Tuple, overload
+
+from ._common import ColorValue
+
+if sys.version_info >= (3, 9):
+ from collections.abc import Collection
+else:
+ from typing import Collection
+
+THECOLORS: Dict[str, Tuple[int, int, int, int]]
+
+# Color confirms to the Collection ABC, since it also confirms to
+# Sized, Iterable and Container ABCs
+class Color(Collection[int]):
+ r: int
+ g: int
+ b: int
+ a: int
+ cmy: Tuple[float, float, float]
+ hsva: Tuple[float, float, float, float]
+ hsla: Tuple[float, float, float, float]
+ i1i2i3: Tuple[float, float, float]
+ __hash__: None # type: ignore
+ __array_struct__: Any
+ @overload
+ def __init__(self, r: int, g: int, b: int, a: int = 255) -> None: ...
+ @overload
+ def __init__(self, rgbvalue: ColorValue) -> None: ...
+ @overload
+ def __getitem__(self, i: int) -> int: ...
+ @overload
+ def __getitem__(self, s: slice) -> Tuple[int]: ...
+ def __setitem__(self, key: int, value: int) -> None: ...
+ def __iter__(self) -> Iterator[int]: ...
+ def __add__(self, other: Color) -> Color: ...
+ def __sub__(self, other: Color) -> Color: ...
+ def __mul__(self, other: Color) -> Color: ...
+ def __floordiv__(self, other: Color) -> Color: ...
+ def __mod__(self, other: Color) -> Color: ...
+ def __int__(self) -> int: ...
+ def __float__(self) -> float: ...
+ def __len__(self) -> int: ...
+ def __index__(self) -> int: ...
+ def __invert__(self) -> Color: ...
+ def __contains__(self, other: int) -> bool: ... # type: ignore[override]
+ def normalize(self) -> Tuple[float, float, float, float]: ...
+ def correct_gamma(self, gamma: float) -> Color: ...
+ def set_length(self, length: int) -> None: ...
+ def lerp(self, color: ColorValue, amount: float) -> Color: ...
+ def premul_alpha(self) -> Color: ...
+ @overload
+ def update(self, r: int, g: int, b: int, a: int = 255) -> None: ...
+ @overload
+ def update(self, rgbvalue: ColorValue) -> None: ...
+ def grayscale(self) -> Color: ...
diff --git a/.venv/Lib/site-packages/pygame/colordict.py b/.venv/Lib/site-packages/pygame/colordict.py
new file mode 100644
index 00000000..0bd72564
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/colordict.py
@@ -0,0 +1,692 @@
+# pygame - Python Game Library
+# Copyright (C) 2000-2003 Pete Shinners
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Pete Shinners
+# pete@shinners.org
+
+""" A dictionary of RGBA tuples indexed by color names.
+
+See https://www.pygame.org/docs/ref/color_list.html for sample swatches.
+"""
+
+THECOLORS = {
+ "aliceblue": (240, 248, 255, 255),
+ "antiquewhite": (250, 235, 215, 255),
+ "antiquewhite1": (255, 239, 219, 255),
+ "antiquewhite2": (238, 223, 204, 255),
+ "antiquewhite3": (205, 192, 176, 255),
+ "antiquewhite4": (139, 131, 120, 255),
+ "aqua": (0, 255, 255, 255),
+ "aquamarine": (127, 255, 212, 255),
+ "aquamarine1": (127, 255, 212, 255),
+ "aquamarine2": (118, 238, 198, 255),
+ "aquamarine3": (102, 205, 170, 255),
+ "aquamarine4": (69, 139, 116, 255),
+ "azure": (240, 255, 255, 255),
+ "azure1": (240, 255, 255, 255),
+ "azure3": (193, 205, 205, 255),
+ "azure2": (224, 238, 238, 255),
+ "azure4": (131, 139, 139, 255),
+ "beige": (245, 245, 220, 255),
+ "bisque": (255, 228, 196, 255),
+ "bisque1": (255, 228, 196, 255),
+ "bisque2": (238, 213, 183, 255),
+ "bisque3": (205, 183, 158, 255),
+ "bisque4": (139, 125, 107, 255),
+ "black": (0, 0, 0, 255),
+ "blanchedalmond": (255, 235, 205, 255),
+ "blue": (0, 0, 255, 255),
+ "blue1": (0, 0, 255, 255),
+ "blue2": (0, 0, 238, 255),
+ "blue3": (0, 0, 205, 255),
+ "blue4": (0, 0, 139, 255),
+ "blueviolet": (138, 43, 226, 255),
+ "brown": (165, 42, 42, 255),
+ "brown1": (255, 64, 64, 255),
+ "brown2": (238, 59, 59, 255),
+ "brown3": (205, 51, 51, 255),
+ "brown4": (139, 35, 35, 255),
+ "burlywood": (222, 184, 135, 255),
+ "burlywood1": (255, 211, 155, 255),
+ "burlywood2": (238, 197, 145, 255),
+ "burlywood3": (205, 170, 125, 255),
+ "burlywood4": (139, 115, 85, 255),
+ "cadetblue": (95, 158, 160, 255),
+ "cadetblue1": (152, 245, 255, 255),
+ "cadetblue2": (142, 229, 238, 255),
+ "cadetblue3": (122, 197, 205, 255),
+ "cadetblue4": (83, 134, 139, 255),
+ "chartreuse": (127, 255, 0, 255),
+ "chartreuse1": (127, 255, 0, 255),
+ "chartreuse2": (118, 238, 0, 255),
+ "chartreuse3": (102, 205, 0, 255),
+ "chartreuse4": (69, 139, 0, 255),
+ "chocolate": (210, 105, 30, 255),
+ "chocolate1": (255, 127, 36, 255),
+ "chocolate2": (238, 118, 33, 255),
+ "chocolate3": (205, 102, 29, 255),
+ "chocolate4": (139, 69, 19, 255),
+ "coral": (255, 127, 80, 255),
+ "coral1": (255, 114, 86, 255),
+ "coral2": (238, 106, 80, 255),
+ "coral3": (205, 91, 69, 255),
+ "coral4": (139, 62, 47, 255),
+ "cornflowerblue": (100, 149, 237, 255),
+ "cornsilk": (255, 248, 220, 255),
+ "cornsilk1": (255, 248, 220, 255),
+ "cornsilk2": (238, 232, 205, 255),
+ "cornsilk3": (205, 200, 177, 255),
+ "cornsilk4": (139, 136, 120, 255),
+ "crimson": (220, 20, 60, 255),
+ "cyan": (0, 255, 255, 255),
+ "cyan1": (0, 255, 255, 255),
+ "cyan2": (0, 238, 238, 255),
+ "cyan3": (0, 205, 205, 255),
+ "cyan4": (0, 139, 139, 255),
+ "darkblue": (0, 0, 139, 255),
+ "darkcyan": (0, 139, 139, 255),
+ "darkgoldenrod": (184, 134, 11, 255),
+ "darkgoldenrod1": (255, 185, 15, 255),
+ "darkgoldenrod2": (238, 173, 14, 255),
+ "darkgoldenrod3": (205, 149, 12, 255),
+ "darkgoldenrod4": (139, 101, 8, 255),
+ "darkgray": (169, 169, 169, 255),
+ "darkgreen": (0, 100, 0, 255),
+ "darkgrey": (169, 169, 169, 255),
+ "darkkhaki": (189, 183, 107, 255),
+ "darkmagenta": (139, 0, 139, 255),
+ "darkolivegreen": (85, 107, 47, 255),
+ "darkolivegreen1": (202, 255, 112, 255),
+ "darkolivegreen2": (188, 238, 104, 255),
+ "darkolivegreen3": (162, 205, 90, 255),
+ "darkolivegreen4": (110, 139, 61, 255),
+ "darkorange": (255, 140, 0, 255),
+ "darkorange1": (255, 127, 0, 255),
+ "darkorange2": (238, 118, 0, 255),
+ "darkorange3": (205, 102, 0, 255),
+ "darkorange4": (139, 69, 0, 255),
+ "darkorchid": (153, 50, 204, 255),
+ "darkorchid1": (191, 62, 255, 255),
+ "darkorchid2": (178, 58, 238, 255),
+ "darkorchid3": (154, 50, 205, 255),
+ "darkorchid4": (104, 34, 139, 255),
+ "darkred": (139, 0, 0, 255),
+ "darksalmon": (233, 150, 122, 255),
+ "darkseagreen": (143, 188, 143, 255),
+ "darkseagreen1": (193, 255, 193, 255),
+ "darkseagreen2": (180, 238, 180, 255),
+ "darkseagreen3": (155, 205, 155, 255),
+ "darkseagreen4": (105, 139, 105, 255),
+ "darkslateblue": (72, 61, 139, 255),
+ "darkslategray": (47, 79, 79, 255),
+ "darkslategray1": (151, 255, 255, 255),
+ "darkslategray2": (141, 238, 238, 255),
+ "darkslategray3": (121, 205, 205, 255),
+ "darkslategray4": (82, 139, 139, 255),
+ "darkslategrey": (47, 79, 79, 255),
+ "darkturquoise": (0, 206, 209, 255),
+ "darkviolet": (148, 0, 211, 255),
+ "deeppink": (255, 20, 147, 255),
+ "deeppink1": (255, 20, 147, 255),
+ "deeppink2": (238, 18, 137, 255),
+ "deeppink3": (205, 16, 118, 255),
+ "deeppink4": (139, 10, 80, 255),
+ "deepskyblue": (0, 191, 255, 255),
+ "deepskyblue1": (0, 191, 255, 255),
+ "deepskyblue2": (0, 178, 238, 255),
+ "deepskyblue3": (0, 154, 205, 255),
+ "deepskyblue4": (0, 104, 139, 255),
+ "dimgray": (105, 105, 105, 255),
+ "dimgrey": (105, 105, 105, 255),
+ "dodgerblue": (30, 144, 255, 255),
+ "dodgerblue1": (30, 144, 255, 255),
+ "dodgerblue2": (28, 134, 238, 255),
+ "dodgerblue3": (24, 116, 205, 255),
+ "dodgerblue4": (16, 78, 139, 255),
+ "firebrick": (178, 34, 34, 255),
+ "firebrick1": (255, 48, 48, 255),
+ "firebrick2": (238, 44, 44, 255),
+ "firebrick3": (205, 38, 38, 255),
+ "firebrick4": (139, 26, 26, 255),
+ "floralwhite": (255, 250, 240, 255),
+ "forestgreen": (34, 139, 34, 255),
+ "fuchsia": (255, 0, 255, 255),
+ "gainsboro": (220, 220, 220, 255),
+ "ghostwhite": (248, 248, 255, 255),
+ "gold": (255, 215, 0, 255),
+ "gold1": (255, 215, 0, 255),
+ "gold2": (238, 201, 0, 255),
+ "gold3": (205, 173, 0, 255),
+ "gold4": (139, 117, 0, 255),
+ "goldenrod": (218, 165, 32, 255),
+ "goldenrod1": (255, 193, 37, 255),
+ "goldenrod2": (238, 180, 34, 255),
+ "goldenrod3": (205, 155, 29, 255),
+ "goldenrod4": (139, 105, 20, 255),
+ "gray": (190, 190, 190, 255),
+ "gray0": (0, 0, 0, 255),
+ "gray1": (3, 3, 3, 255),
+ "gray2": (5, 5, 5, 255),
+ "gray3": (8, 8, 8, 255),
+ "gray4": (10, 10, 10, 255),
+ "gray5": (13, 13, 13, 255),
+ "gray6": (15, 15, 15, 255),
+ "gray7": (18, 18, 18, 255),
+ "gray8": (20, 20, 20, 255),
+ "gray9": (23, 23, 23, 255),
+ "gray10": (26, 26, 26, 255),
+ "gray11": (28, 28, 28, 255),
+ "gray12": (31, 31, 31, 255),
+ "gray13": (33, 33, 33, 255),
+ "gray14": (36, 36, 36, 255),
+ "gray15": (38, 38, 38, 255),
+ "gray16": (41, 41, 41, 255),
+ "gray17": (43, 43, 43, 255),
+ "gray18": (46, 46, 46, 255),
+ "gray19": (48, 48, 48, 255),
+ "gray20": (51, 51, 51, 255),
+ "gray21": (54, 54, 54, 255),
+ "gray22": (56, 56, 56, 255),
+ "gray23": (59, 59, 59, 255),
+ "gray24": (61, 61, 61, 255),
+ "gray25": (64, 64, 64, 255),
+ "gray26": (66, 66, 66, 255),
+ "gray27": (69, 69, 69, 255),
+ "gray28": (71, 71, 71, 255),
+ "gray29": (74, 74, 74, 255),
+ "gray30": (77, 77, 77, 255),
+ "gray31": (79, 79, 79, 255),
+ "gray32": (82, 82, 82, 255),
+ "gray33": (84, 84, 84, 255),
+ "gray34": (87, 87, 87, 255),
+ "gray35": (89, 89, 89, 255),
+ "gray36": (92, 92, 92, 255),
+ "gray37": (94, 94, 94, 255),
+ "gray38": (97, 97, 97, 255),
+ "gray39": (99, 99, 99, 255),
+ "gray40": (102, 102, 102, 255),
+ "gray41": (105, 105, 105, 255),
+ "gray42": (107, 107, 107, 255),
+ "gray43": (110, 110, 110, 255),
+ "gray44": (112, 112, 112, 255),
+ "gray45": (115, 115, 115, 255),
+ "gray46": (117, 117, 117, 255),
+ "gray47": (120, 120, 120, 255),
+ "gray48": (122, 122, 122, 255),
+ "gray49": (125, 125, 125, 255),
+ "gray50": (127, 127, 127, 255),
+ "gray51": (130, 130, 130, 255),
+ "gray52": (133, 133, 133, 255),
+ "gray53": (135, 135, 135, 255),
+ "gray54": (138, 138, 138, 255),
+ "gray55": (140, 140, 140, 255),
+ "gray56": (143, 143, 143, 255),
+ "gray57": (145, 145, 145, 255),
+ "gray58": (148, 148, 148, 255),
+ "gray59": (150, 150, 150, 255),
+ "gray60": (153, 153, 153, 255),
+ "gray61": (156, 156, 156, 255),
+ "gray62": (158, 158, 158, 255),
+ "gray63": (161, 161, 161, 255),
+ "gray64": (163, 163, 163, 255),
+ "gray65": (166, 166, 166, 255),
+ "gray66": (168, 168, 168, 255),
+ "gray67": (171, 171, 171, 255),
+ "gray68": (173, 173, 173, 255),
+ "gray69": (176, 176, 176, 255),
+ "gray70": (179, 179, 179, 255),
+ "gray71": (181, 181, 181, 255),
+ "gray72": (184, 184, 184, 255),
+ "gray73": (186, 186, 186, 255),
+ "gray74": (189, 189, 189, 255),
+ "gray75": (191, 191, 191, 255),
+ "gray76": (194, 194, 194, 255),
+ "gray77": (196, 196, 196, 255),
+ "gray78": (199, 199, 199, 255),
+ "gray79": (201, 201, 201, 255),
+ "gray80": (204, 204, 204, 255),
+ "gray81": (207, 207, 207, 255),
+ "gray82": (209, 209, 209, 255),
+ "gray83": (212, 212, 212, 255),
+ "gray84": (214, 214, 214, 255),
+ "gray85": (217, 217, 217, 255),
+ "gray86": (219, 219, 219, 255),
+ "gray87": (222, 222, 222, 255),
+ "gray88": (224, 224, 224, 255),
+ "gray89": (227, 227, 227, 255),
+ "gray90": (229, 229, 229, 255),
+ "gray91": (232, 232, 232, 255),
+ "gray92": (235, 235, 235, 255),
+ "gray93": (237, 237, 237, 255),
+ "gray94": (240, 240, 240, 255),
+ "gray95": (242, 242, 242, 255),
+ "gray96": (245, 245, 245, 255),
+ "gray97": (247, 247, 247, 255),
+ "gray98": (250, 250, 250, 255),
+ "gray99": (252, 252, 252, 255),
+ "gray100": (255, 255, 255, 255),
+ "green": (0, 255, 0, 255),
+ "green1": (0, 255, 0, 255),
+ "green2": (0, 238, 0, 255),
+ "green3": (0, 205, 0, 255),
+ "green4": (0, 139, 0, 255),
+ "greenyellow": (173, 255, 47, 255),
+ "grey": (190, 190, 190, 255),
+ "grey0": (0, 0, 0, 255),
+ "grey1": (3, 3, 3, 255),
+ "grey2": (5, 5, 5, 255),
+ "grey3": (8, 8, 8, 255),
+ "grey4": (10, 10, 10, 255),
+ "grey5": (13, 13, 13, 255),
+ "grey6": (15, 15, 15, 255),
+ "grey7": (18, 18, 18, 255),
+ "grey8": (20, 20, 20, 255),
+ "grey9": (23, 23, 23, 255),
+ "grey10": (26, 26, 26, 255),
+ "grey11": (28, 28, 28, 255),
+ "grey12": (31, 31, 31, 255),
+ "grey13": (33, 33, 33, 255),
+ "grey14": (36, 36, 36, 255),
+ "grey15": (38, 38, 38, 255),
+ "grey16": (41, 41, 41, 255),
+ "grey17": (43, 43, 43, 255),
+ "grey18": (46, 46, 46, 255),
+ "grey19": (48, 48, 48, 255),
+ "grey20": (51, 51, 51, 255),
+ "grey21": (54, 54, 54, 255),
+ "grey22": (56, 56, 56, 255),
+ "grey23": (59, 59, 59, 255),
+ "grey24": (61, 61, 61, 255),
+ "grey25": (64, 64, 64, 255),
+ "grey26": (66, 66, 66, 255),
+ "grey27": (69, 69, 69, 255),
+ "grey28": (71, 71, 71, 255),
+ "grey29": (74, 74, 74, 255),
+ "grey30": (77, 77, 77, 255),
+ "grey31": (79, 79, 79, 255),
+ "grey32": (82, 82, 82, 255),
+ "grey33": (84, 84, 84, 255),
+ "grey34": (87, 87, 87, 255),
+ "grey35": (89, 89, 89, 255),
+ "grey36": (92, 92, 92, 255),
+ "grey37": (94, 94, 94, 255),
+ "grey38": (97, 97, 97, 255),
+ "grey39": (99, 99, 99, 255),
+ "grey40": (102, 102, 102, 255),
+ "grey41": (105, 105, 105, 255),
+ "grey42": (107, 107, 107, 255),
+ "grey43": (110, 110, 110, 255),
+ "grey44": (112, 112, 112, 255),
+ "grey45": (115, 115, 115, 255),
+ "grey46": (117, 117, 117, 255),
+ "grey47": (120, 120, 120, 255),
+ "grey48": (122, 122, 122, 255),
+ "grey49": (125, 125, 125, 255),
+ "grey50": (127, 127, 127, 255),
+ "grey51": (130, 130, 130, 255),
+ "grey52": (133, 133, 133, 255),
+ "grey53": (135, 135, 135, 255),
+ "grey54": (138, 138, 138, 255),
+ "grey55": (140, 140, 140, 255),
+ "grey56": (143, 143, 143, 255),
+ "grey57": (145, 145, 145, 255),
+ "grey58": (148, 148, 148, 255),
+ "grey59": (150, 150, 150, 255),
+ "grey60": (153, 153, 153, 255),
+ "grey61": (156, 156, 156, 255),
+ "grey62": (158, 158, 158, 255),
+ "grey63": (161, 161, 161, 255),
+ "grey64": (163, 163, 163, 255),
+ "grey65": (166, 166, 166, 255),
+ "grey66": (168, 168, 168, 255),
+ "grey67": (171, 171, 171, 255),
+ "grey68": (173, 173, 173, 255),
+ "grey69": (176, 176, 176, 255),
+ "grey70": (179, 179, 179, 255),
+ "grey71": (181, 181, 181, 255),
+ "grey72": (184, 184, 184, 255),
+ "grey73": (186, 186, 186, 255),
+ "grey74": (189, 189, 189, 255),
+ "grey75": (191, 191, 191, 255),
+ "grey76": (194, 194, 194, 255),
+ "grey77": (196, 196, 196, 255),
+ "grey78": (199, 199, 199, 255),
+ "grey79": (201, 201, 201, 255),
+ "grey80": (204, 204, 204, 255),
+ "grey81": (207, 207, 207, 255),
+ "grey82": (209, 209, 209, 255),
+ "grey83": (212, 212, 212, 255),
+ "grey84": (214, 214, 214, 255),
+ "grey85": (217, 217, 217, 255),
+ "grey86": (219, 219, 219, 255),
+ "grey87": (222, 222, 222, 255),
+ "grey88": (224, 224, 224, 255),
+ "grey89": (227, 227, 227, 255),
+ "grey90": (229, 229, 229, 255),
+ "grey91": (232, 232, 232, 255),
+ "grey92": (235, 235, 235, 255),
+ "grey93": (237, 237, 237, 255),
+ "grey94": (240, 240, 240, 255),
+ "grey95": (242, 242, 242, 255),
+ "grey96": (245, 245, 245, 255),
+ "grey97": (247, 247, 247, 255),
+ "grey98": (250, 250, 250, 255),
+ "grey99": (252, 252, 252, 255),
+ "grey100": (255, 255, 255, 255),
+ "honeydew": (240, 255, 240, 255),
+ "honeydew1": (240, 255, 240, 255),
+ "honeydew2": (224, 238, 224, 255),
+ "honeydew3": (193, 205, 193, 255),
+ "honeydew4": (131, 139, 131, 255),
+ "hotpink": (255, 105, 180, 255),
+ "hotpink1": (255, 110, 180, 255),
+ "hotpink2": (238, 106, 167, 255),
+ "hotpink3": (205, 96, 144, 255),
+ "hotpink4": (139, 58, 98, 255),
+ "indianred": (205, 92, 92, 255),
+ "indianred1": (255, 106, 106, 255),
+ "indianred2": (238, 99, 99, 255),
+ "indianred3": (205, 85, 85, 255),
+ "indianred4": (139, 58, 58, 255),
+ "indigo": (75, 0, 130, 255),
+ "ivory": (255, 255, 240, 255),
+ "ivory1": (255, 255, 240, 255),
+ "ivory2": (238, 238, 224, 255),
+ "ivory3": (205, 205, 193, 255),
+ "ivory4": (139, 139, 131, 255),
+ "khaki": (240, 230, 140, 255),
+ "khaki1": (255, 246, 143, 255),
+ "khaki2": (238, 230, 133, 255),
+ "khaki3": (205, 198, 115, 255),
+ "khaki4": (139, 134, 78, 255),
+ "lavender": (230, 230, 250, 255),
+ "lavenderblush": (255, 240, 245, 255),
+ "lavenderblush1": (255, 240, 245, 255),
+ "lavenderblush2": (238, 224, 229, 255),
+ "lavenderblush3": (205, 193, 197, 255),
+ "lavenderblush4": (139, 131, 134, 255),
+ "lawngreen": (124, 252, 0, 255),
+ "lemonchiffon": (255, 250, 205, 255),
+ "lemonchiffon1": (255, 250, 205, 255),
+ "lemonchiffon2": (238, 233, 191, 255),
+ "lemonchiffon3": (205, 201, 165, 255),
+ "lemonchiffon4": (139, 137, 112, 255),
+ "lightblue": (173, 216, 230, 255),
+ "lightblue1": (191, 239, 255, 255),
+ "lightblue2": (178, 223, 238, 255),
+ "lightblue3": (154, 192, 205, 255),
+ "lightblue4": (104, 131, 139, 255),
+ "lightcoral": (240, 128, 128, 255),
+ "lightcyan": (224, 255, 255, 255),
+ "lightcyan1": (224, 255, 255, 255),
+ "lightcyan2": (209, 238, 238, 255),
+ "lightcyan3": (180, 205, 205, 255),
+ "lightcyan4": (122, 139, 139, 255),
+ "lightgoldenrod": (238, 221, 130, 255),
+ "lightgoldenrod1": (255, 236, 139, 255),
+ "lightgoldenrod2": (238, 220, 130, 255),
+ "lightgoldenrod3": (205, 190, 112, 255),
+ "lightgoldenrod4": (139, 129, 76, 255),
+ "lightgoldenrodyellow": (250, 250, 210, 255),
+ "lightgray": (211, 211, 211, 255),
+ "lightgreen": (144, 238, 144, 255),
+ "lightgrey": (211, 211, 211, 255),
+ "lightpink": (255, 182, 193, 255),
+ "lightpink1": (255, 174, 185, 255),
+ "lightpink2": (238, 162, 173, 255),
+ "lightpink3": (205, 140, 149, 255),
+ "lightpink4": (139, 95, 101, 255),
+ "lightsalmon": (255, 160, 122, 255),
+ "lightsalmon1": (255, 160, 122, 255),
+ "lightsalmon2": (238, 149, 114, 255),
+ "lightsalmon3": (205, 129, 98, 255),
+ "lightsalmon4": (139, 87, 66, 255),
+ "lightseagreen": (32, 178, 170, 255),
+ "lightskyblue": (135, 206, 250, 255),
+ "lightskyblue1": (176, 226, 255, 255),
+ "lightskyblue2": (164, 211, 238, 255),
+ "lightskyblue3": (141, 182, 205, 255),
+ "lightskyblue4": (96, 123, 139, 255),
+ "lightslateblue": (132, 112, 255, 255),
+ "lightslategray": (119, 136, 153, 255),
+ "lightslategrey": (119, 136, 153, 255),
+ "lightsteelblue": (176, 196, 222, 255),
+ "lightsteelblue1": (202, 225, 255, 255),
+ "lightsteelblue2": (188, 210, 238, 255),
+ "lightsteelblue3": (162, 181, 205, 255),
+ "lightsteelblue4": (110, 123, 139, 255),
+ "lightyellow": (255, 255, 224, 255),
+ "lightyellow1": (255, 255, 224, 255),
+ "lightyellow2": (238, 238, 209, 255),
+ "lightyellow3": (205, 205, 180, 255),
+ "lightyellow4": (139, 139, 122, 255),
+ "linen": (250, 240, 230, 255),
+ "lime": (0, 255, 0, 255),
+ "limegreen": (50, 205, 50, 255),
+ "magenta": (255, 0, 255, 255),
+ "magenta1": (255, 0, 255, 255),
+ "magenta2": (238, 0, 238, 255),
+ "magenta3": (205, 0, 205, 255),
+ "magenta4": (139, 0, 139, 255),
+ "maroon": (176, 48, 96, 255),
+ "maroon1": (255, 52, 179, 255),
+ "maroon2": (238, 48, 167, 255),
+ "maroon3": (205, 41, 144, 255),
+ "maroon4": (139, 28, 98, 255),
+ "mediumaquamarine": (102, 205, 170, 255),
+ "mediumblue": (0, 0, 205, 255),
+ "mediumorchid": (186, 85, 211, 255),
+ "mediumorchid1": (224, 102, 255, 255),
+ "mediumorchid2": (209, 95, 238, 255),
+ "mediumorchid3": (180, 82, 205, 255),
+ "mediumorchid4": (122, 55, 139, 255),
+ "mediumpurple": (147, 112, 219, 255),
+ "mediumpurple1": (171, 130, 255, 255),
+ "mediumpurple2": (159, 121, 238, 255),
+ "mediumpurple3": (137, 104, 205, 255),
+ "mediumpurple4": (93, 71, 139, 255),
+ "mediumseagreen": (60, 179, 113, 255),
+ "mediumslateblue": (123, 104, 238, 255),
+ "mediumspringgreen": (0, 250, 154, 255),
+ "mediumturquoise": (72, 209, 204, 255),
+ "mediumvioletred": (199, 21, 133, 255),
+ "midnightblue": (25, 25, 112, 255),
+ "mintcream": (245, 255, 250, 255),
+ "mistyrose": (255, 228, 225, 255),
+ "mistyrose1": (255, 228, 225, 255),
+ "mistyrose2": (238, 213, 210, 255),
+ "mistyrose3": (205, 183, 181, 255),
+ "mistyrose4": (139, 125, 123, 255),
+ "moccasin": (255, 228, 181, 255),
+ "navajowhite": (255, 222, 173, 255),
+ "navajowhite1": (255, 222, 173, 255),
+ "navajowhite2": (238, 207, 161, 255),
+ "navajowhite3": (205, 179, 139, 255),
+ "navajowhite4": (139, 121, 94, 255),
+ "navy": (0, 0, 128, 255),
+ "navyblue": (0, 0, 128, 255),
+ "oldlace": (253, 245, 230, 255),
+ "olive": (128, 128, 0, 255),
+ "olivedrab": (107, 142, 35, 255),
+ "olivedrab1": (192, 255, 62, 255),
+ "olivedrab2": (179, 238, 58, 255),
+ "olivedrab3": (154, 205, 50, 255),
+ "olivedrab4": (105, 139, 34, 255),
+ "orange": (255, 165, 0, 255),
+ "orange1": (255, 165, 0, 255),
+ "orange2": (238, 154, 0, 255),
+ "orange3": (205, 133, 0, 255),
+ "orange4": (139, 90, 0, 255),
+ "orangered": (255, 69, 0, 255),
+ "orangered1": (255, 69, 0, 255),
+ "orangered2": (238, 64, 0, 255),
+ "orangered3": (205, 55, 0, 255),
+ "orangered4": (139, 37, 0, 255),
+ "orchid": (218, 112, 214, 255),
+ "orchid1": (255, 131, 250, 255),
+ "orchid2": (238, 122, 233, 255),
+ "orchid3": (205, 105, 201, 255),
+ "orchid4": (139, 71, 137, 255),
+ "palegreen": (152, 251, 152, 255),
+ "palegreen1": (154, 255, 154, 255),
+ "palegreen2": (144, 238, 144, 255),
+ "palegreen3": (124, 205, 124, 255),
+ "palegreen4": (84, 139, 84, 255),
+ "palegoldenrod": (238, 232, 170, 255),
+ "paleturquoise": (175, 238, 238, 255),
+ "paleturquoise1": (187, 255, 255, 255),
+ "paleturquoise2": (174, 238, 238, 255),
+ "paleturquoise3": (150, 205, 205, 255),
+ "paleturquoise4": (102, 139, 139, 255),
+ "palevioletred": (219, 112, 147, 255),
+ "palevioletred1": (255, 130, 171, 255),
+ "palevioletred2": (238, 121, 159, 255),
+ "palevioletred3": (205, 104, 137, 255),
+ "palevioletred4": (139, 71, 93, 255),
+ "papayawhip": (255, 239, 213, 255),
+ "peachpuff": (255, 218, 185, 255),
+ "peachpuff1": (255, 218, 185, 255),
+ "peachpuff2": (238, 203, 173, 255),
+ "peachpuff3": (205, 175, 149, 255),
+ "peachpuff4": (139, 119, 101, 255),
+ "peru": (205, 133, 63, 255),
+ "pink": (255, 192, 203, 255),
+ "pink1": (255, 181, 197, 255),
+ "pink2": (238, 169, 184, 255),
+ "pink3": (205, 145, 158, 255),
+ "pink4": (139, 99, 108, 255),
+ "plum": (221, 160, 221, 255),
+ "plum1": (255, 187, 255, 255),
+ "plum2": (238, 174, 238, 255),
+ "plum3": (205, 150, 205, 255),
+ "plum4": (139, 102, 139, 255),
+ "powderblue": (176, 224, 230, 255),
+ "purple": (160, 32, 240, 255),
+ "purple1": (155, 48, 255, 255),
+ "purple2": (145, 44, 238, 255),
+ "purple3": (125, 38, 205, 255),
+ "purple4": (85, 26, 139, 255),
+ "red": (255, 0, 0, 255),
+ "red1": (255, 0, 0, 255),
+ "red2": (238, 0, 0, 255),
+ "red3": (205, 0, 0, 255),
+ "red4": (139, 0, 0, 255),
+ "rosybrown": (188, 143, 143, 255),
+ "rosybrown1": (255, 193, 193, 255),
+ "rosybrown2": (238, 180, 180, 255),
+ "rosybrown3": (205, 155, 155, 255),
+ "rosybrown4": (139, 105, 105, 255),
+ "royalblue": (65, 105, 225, 255),
+ "royalblue1": (72, 118, 255, 255),
+ "royalblue2": (67, 110, 238, 255),
+ "royalblue3": (58, 95, 205, 255),
+ "royalblue4": (39, 64, 139, 255),
+ "salmon": (250, 128, 114, 255),
+ "salmon1": (255, 140, 105, 255),
+ "salmon2": (238, 130, 98, 255),
+ "salmon3": (205, 112, 84, 255),
+ "salmon4": (139, 76, 57, 255),
+ "saddlebrown": (139, 69, 19, 255),
+ "sandybrown": (244, 164, 96, 255),
+ "seagreen": (46, 139, 87, 255),
+ "seagreen1": (84, 255, 159, 255),
+ "seagreen2": (78, 238, 148, 255),
+ "seagreen3": (67, 205, 128, 255),
+ "seagreen4": (46, 139, 87, 255),
+ "seashell": (255, 245, 238, 255),
+ "seashell1": (255, 245, 238, 255),
+ "seashell2": (238, 229, 222, 255),
+ "seashell3": (205, 197, 191, 255),
+ "seashell4": (139, 134, 130, 255),
+ "sienna": (160, 82, 45, 255),
+ "sienna1": (255, 130, 71, 255),
+ "sienna2": (238, 121, 66, 255),
+ "sienna3": (205, 104, 57, 255),
+ "sienna4": (139, 71, 38, 255),
+ "silver": (192, 192, 192, 255),
+ "skyblue": (135, 206, 235, 255),
+ "skyblue1": (135, 206, 255, 255),
+ "skyblue2": (126, 192, 238, 255),
+ "skyblue3": (108, 166, 205, 255),
+ "skyblue4": (74, 112, 139, 255),
+ "slateblue": (106, 90, 205, 255),
+ "slateblue1": (131, 111, 255, 255),
+ "slateblue2": (122, 103, 238, 255),
+ "slateblue3": (105, 89, 205, 255),
+ "slateblue4": (71, 60, 139, 255),
+ "slategray": (112, 128, 144, 255),
+ "slategray1": (198, 226, 255, 255),
+ "slategray2": (185, 211, 238, 255),
+ "slategray3": (159, 182, 205, 255),
+ "slategray4": (108, 123, 139, 255),
+ "slategrey": (112, 128, 144, 255),
+ "snow": (255, 250, 250, 255),
+ "snow1": (255, 250, 250, 255),
+ "snow2": (238, 233, 233, 255),
+ "snow3": (205, 201, 201, 255),
+ "snow4": (139, 137, 137, 255),
+ "springgreen": (0, 255, 127, 255),
+ "springgreen1": (0, 255, 127, 255),
+ "springgreen2": (0, 238, 118, 255),
+ "springgreen3": (0, 205, 102, 255),
+ "springgreen4": (0, 139, 69, 255),
+ "steelblue": (70, 130, 180, 255),
+ "steelblue1": (99, 184, 255, 255),
+ "steelblue2": (92, 172, 238, 255),
+ "steelblue3": (79, 148, 205, 255),
+ "steelblue4": (54, 100, 139, 255),
+ "tan": (210, 180, 140, 255),
+ "tan1": (255, 165, 79, 255),
+ "tan2": (238, 154, 73, 255),
+ "tan3": (205, 133, 63, 255),
+ "tan4": (139, 90, 43, 255),
+ "teal": (0, 128, 128, 255),
+ "thistle": (216, 191, 216, 255),
+ "thistle1": (255, 225, 255, 255),
+ "thistle2": (238, 210, 238, 255),
+ "thistle3": (205, 181, 205, 255),
+ "thistle4": (139, 123, 139, 255),
+ "tomato": (255, 99, 71, 255),
+ "tomato1": (255, 99, 71, 255),
+ "tomato2": (238, 92, 66, 255),
+ "tomato3": (205, 79, 57, 255),
+ "tomato4": (139, 54, 38, 255),
+ "turquoise": (64, 224, 208, 255),
+ "turquoise1": (0, 245, 255, 255),
+ "turquoise2": (0, 229, 238, 255),
+ "turquoise3": (0, 197, 205, 255),
+ "turquoise4": (0, 134, 139, 255),
+ "violet": (238, 130, 238, 255),
+ "violetred": (208, 32, 144, 255),
+ "violetred1": (255, 62, 150, 255),
+ "violetred2": (238, 58, 140, 255),
+ "violetred3": (205, 50, 120, 255),
+ "violetred4": (139, 34, 82, 255),
+ "wheat": (245, 222, 179, 255),
+ "wheat1": (255, 231, 186, 255),
+ "wheat2": (238, 216, 174, 255),
+ "wheat3": (205, 186, 150, 255),
+ "wheat4": (139, 126, 102, 255),
+ "white": (255, 255, 255, 255),
+ "whitesmoke": (245, 245, 245, 255),
+ "yellow": (255, 255, 0, 255),
+ "yellow1": (255, 255, 0, 255),
+ "yellow2": (238, 238, 0, 255),
+ "yellow3": (205, 205, 0, 255),
+ "yellow4": (139, 139, 0, 255),
+ "yellowgreen": (154, 205, 50, 255),
+}
diff --git a/.venv/Lib/site-packages/pygame/constants.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/constants.cp311-win_amd64.pyd
new file mode 100644
index 00000000..24fcf4b5
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/constants.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/constants.pyi b/.venv/Lib/site-packages/pygame/constants.pyi
new file mode 100644
index 00000000..07b2d465
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/constants.pyi
@@ -0,0 +1,560 @@
+# buildconfig/stubs/gen_stubs.py
+# A script to auto-generate locals.pyi, constants.pyi and __init__.pyi typestubs
+# IMPORTANT NOTE: Do not edit this file by hand!
+
+ACTIVEEVENT: int
+ANYFORMAT: int
+APPACTIVE: int
+APPINPUTFOCUS: int
+APPMOUSEFOCUS: int
+APP_DIDENTERBACKGROUND: int
+APP_DIDENTERFOREGROUND: int
+APP_LOWMEMORY: int
+APP_TERMINATING: int
+APP_WILLENTERBACKGROUND: int
+APP_WILLENTERFOREGROUND: int
+ASYNCBLIT: int
+AUDIODEVICEADDED: int
+AUDIODEVICEREMOVED: int
+AUDIO_ALLOW_ANY_CHANGE: int
+AUDIO_ALLOW_CHANNELS_CHANGE: int
+AUDIO_ALLOW_FORMAT_CHANGE: int
+AUDIO_ALLOW_FREQUENCY_CHANGE: int
+AUDIO_S16: int
+AUDIO_S16LSB: int
+AUDIO_S16MSB: int
+AUDIO_S16SYS: int
+AUDIO_S8: int
+AUDIO_U16: int
+AUDIO_U16LSB: int
+AUDIO_U16MSB: int
+AUDIO_U16SYS: int
+AUDIO_U8: int
+BIG_ENDIAN: int
+BLENDMODE_ADD: int
+BLENDMODE_BLEND: int
+BLENDMODE_MOD: int
+BLENDMODE_NONE: int
+BLEND_ADD: int
+BLEND_ALPHA_SDL2: int
+BLEND_MAX: int
+BLEND_MIN: int
+BLEND_MULT: int
+BLEND_PREMULTIPLIED: int
+BLEND_RGBA_ADD: int
+BLEND_RGBA_MAX: int
+BLEND_RGBA_MIN: int
+BLEND_RGBA_MULT: int
+BLEND_RGBA_SUB: int
+BLEND_RGB_ADD: int
+BLEND_RGB_MAX: int
+BLEND_RGB_MIN: int
+BLEND_RGB_MULT: int
+BLEND_RGB_SUB: int
+BLEND_SUB: int
+BUTTON_LEFT: int
+BUTTON_MIDDLE: int
+BUTTON_RIGHT: int
+BUTTON_WHEELDOWN: int
+BUTTON_WHEELUP: int
+BUTTON_X1: int
+BUTTON_X2: int
+CLIPBOARDUPDATE: int
+CONTROLLERAXISMOTION: int
+CONTROLLERBUTTONDOWN: int
+CONTROLLERBUTTONUP: int
+CONTROLLERDEVICEADDED: int
+CONTROLLERDEVICEREMAPPED: int
+CONTROLLERDEVICEREMOVED: int
+CONTROLLERSENSORUPDATE: int
+CONTROLLERTOUCHPADDOWN: int
+CONTROLLERTOUCHPADMOTION: int
+CONTROLLERTOUCHPADUP: int
+CONTROLLER_AXIS_INVALID: int
+CONTROLLER_AXIS_LEFTX: int
+CONTROLLER_AXIS_LEFTY: int
+CONTROLLER_AXIS_MAX: int
+CONTROLLER_AXIS_RIGHTX: int
+CONTROLLER_AXIS_RIGHTY: int
+CONTROLLER_AXIS_TRIGGERLEFT: int
+CONTROLLER_AXIS_TRIGGERRIGHT: int
+CONTROLLER_BUTTON_A: int
+CONTROLLER_BUTTON_B: int
+CONTROLLER_BUTTON_BACK: int
+CONTROLLER_BUTTON_DPAD_DOWN: int
+CONTROLLER_BUTTON_DPAD_LEFT: int
+CONTROLLER_BUTTON_DPAD_RIGHT: int
+CONTROLLER_BUTTON_DPAD_UP: int
+CONTROLLER_BUTTON_GUIDE: int
+CONTROLLER_BUTTON_INVALID: int
+CONTROLLER_BUTTON_LEFTSHOULDER: int
+CONTROLLER_BUTTON_LEFTSTICK: int
+CONTROLLER_BUTTON_MAX: int
+CONTROLLER_BUTTON_RIGHTSHOULDER: int
+CONTROLLER_BUTTON_RIGHTSTICK: int
+CONTROLLER_BUTTON_START: int
+CONTROLLER_BUTTON_X: int
+CONTROLLER_BUTTON_Y: int
+DOUBLEBUF: int
+DROPBEGIN: int
+DROPCOMPLETE: int
+DROPFILE: int
+DROPTEXT: int
+FINGERDOWN: int
+FINGERMOTION: int
+FINGERUP: int
+FULLSCREEN: int
+GL_ACCELERATED_VISUAL: int
+GL_ACCUM_ALPHA_SIZE: int
+GL_ACCUM_BLUE_SIZE: int
+GL_ACCUM_GREEN_SIZE: int
+GL_ACCUM_RED_SIZE: int
+GL_ALPHA_SIZE: int
+GL_BLUE_SIZE: int
+GL_BUFFER_SIZE: int
+GL_CONTEXT_DEBUG_FLAG: int
+GL_CONTEXT_FLAGS: int
+GL_CONTEXT_FORWARD_COMPATIBLE_FLAG: int
+GL_CONTEXT_MAJOR_VERSION: int
+GL_CONTEXT_MINOR_VERSION: int
+GL_CONTEXT_PROFILE_COMPATIBILITY: int
+GL_CONTEXT_PROFILE_CORE: int
+GL_CONTEXT_PROFILE_ES: int
+GL_CONTEXT_PROFILE_MASK: int
+GL_CONTEXT_RELEASE_BEHAVIOR: int
+GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH: int
+GL_CONTEXT_RELEASE_BEHAVIOR_NONE: int
+GL_CONTEXT_RESET_ISOLATION_FLAG: int
+GL_CONTEXT_ROBUST_ACCESS_FLAG: int
+GL_DEPTH_SIZE: int
+GL_DOUBLEBUFFER: int
+GL_FRAMEBUFFER_SRGB_CAPABLE: int
+GL_GREEN_SIZE: int
+GL_MULTISAMPLEBUFFERS: int
+GL_MULTISAMPLESAMPLES: int
+GL_RED_SIZE: int
+GL_SHARE_WITH_CURRENT_CONTEXT: int
+GL_STENCIL_SIZE: int
+GL_STEREO: int
+GL_SWAP_CONTROL: int
+HAT_CENTERED: int
+HAT_DOWN: int
+HAT_LEFT: int
+HAT_LEFTDOWN: int
+HAT_LEFTUP: int
+HAT_RIGHT: int
+HAT_RIGHTDOWN: int
+HAT_RIGHTUP: int
+HAT_UP: int
+HIDDEN: int
+HWACCEL: int
+HWPALETTE: int
+HWSURFACE: int
+JOYAXISMOTION: int
+JOYBALLMOTION: int
+JOYBUTTONDOWN: int
+JOYBUTTONUP: int
+JOYDEVICEADDED: int
+JOYDEVICEREMOVED: int
+JOYHATMOTION: int
+KEYDOWN: int
+KEYMAPCHANGED: int
+KEYUP: int
+KMOD_ALT: int
+KMOD_CAPS: int
+KMOD_CTRL: int
+KMOD_GUI: int
+KMOD_LALT: int
+KMOD_LCTRL: int
+KMOD_LGUI: int
+KMOD_LMETA: int
+KMOD_LSHIFT: int
+KMOD_META: int
+KMOD_MODE: int
+KMOD_NONE: int
+KMOD_NUM: int
+KMOD_RALT: int
+KMOD_RCTRL: int
+KMOD_RGUI: int
+KMOD_RMETA: int
+KMOD_RSHIFT: int
+KMOD_SHIFT: int
+KSCAN_0: int
+KSCAN_1: int
+KSCAN_2: int
+KSCAN_3: int
+KSCAN_4: int
+KSCAN_5: int
+KSCAN_6: int
+KSCAN_7: int
+KSCAN_8: int
+KSCAN_9: int
+KSCAN_A: int
+KSCAN_AC_BACK: int
+KSCAN_APOSTROPHE: int
+KSCAN_B: int
+KSCAN_BACKSLASH: int
+KSCAN_BACKSPACE: int
+KSCAN_BREAK: int
+KSCAN_C: int
+KSCAN_CAPSLOCK: int
+KSCAN_CLEAR: int
+KSCAN_COMMA: int
+KSCAN_CURRENCYSUBUNIT: int
+KSCAN_CURRENCYUNIT: int
+KSCAN_D: int
+KSCAN_DELETE: int
+KSCAN_DOWN: int
+KSCAN_E: int
+KSCAN_END: int
+KSCAN_EQUALS: int
+KSCAN_ESCAPE: int
+KSCAN_EURO: int
+KSCAN_F: int
+KSCAN_F1: int
+KSCAN_F10: int
+KSCAN_F11: int
+KSCAN_F12: int
+KSCAN_F13: int
+KSCAN_F14: int
+KSCAN_F15: int
+KSCAN_F2: int
+KSCAN_F3: int
+KSCAN_F4: int
+KSCAN_F5: int
+KSCAN_F6: int
+KSCAN_F7: int
+KSCAN_F8: int
+KSCAN_F9: int
+KSCAN_G: int
+KSCAN_GRAVE: int
+KSCAN_H: int
+KSCAN_HELP: int
+KSCAN_HOME: int
+KSCAN_I: int
+KSCAN_INSERT: int
+KSCAN_INTERNATIONAL1: int
+KSCAN_INTERNATIONAL2: int
+KSCAN_INTERNATIONAL3: int
+KSCAN_INTERNATIONAL4: int
+KSCAN_INTERNATIONAL5: int
+KSCAN_INTERNATIONAL6: int
+KSCAN_INTERNATIONAL7: int
+KSCAN_INTERNATIONAL8: int
+KSCAN_INTERNATIONAL9: int
+KSCAN_J: int
+KSCAN_K: int
+KSCAN_KP0: int
+KSCAN_KP1: int
+KSCAN_KP2: int
+KSCAN_KP3: int
+KSCAN_KP4: int
+KSCAN_KP5: int
+KSCAN_KP6: int
+KSCAN_KP7: int
+KSCAN_KP8: int
+KSCAN_KP9: int
+KSCAN_KP_0: int
+KSCAN_KP_1: int
+KSCAN_KP_2: int
+KSCAN_KP_3: int
+KSCAN_KP_4: int
+KSCAN_KP_5: int
+KSCAN_KP_6: int
+KSCAN_KP_7: int
+KSCAN_KP_8: int
+KSCAN_KP_9: int
+KSCAN_KP_DIVIDE: int
+KSCAN_KP_ENTER: int
+KSCAN_KP_EQUALS: int
+KSCAN_KP_MINUS: int
+KSCAN_KP_MULTIPLY: int
+KSCAN_KP_PERIOD: int
+KSCAN_KP_PLUS: int
+KSCAN_L: int
+KSCAN_LALT: int
+KSCAN_LANG1: int
+KSCAN_LANG2: int
+KSCAN_LANG3: int
+KSCAN_LANG4: int
+KSCAN_LANG5: int
+KSCAN_LANG6: int
+KSCAN_LANG7: int
+KSCAN_LANG8: int
+KSCAN_LANG9: int
+KSCAN_LCTRL: int
+KSCAN_LEFT: int
+KSCAN_LEFTBRACKET: int
+KSCAN_LGUI: int
+KSCAN_LMETA: int
+KSCAN_LSHIFT: int
+KSCAN_LSUPER: int
+KSCAN_M: int
+KSCAN_MENU: int
+KSCAN_MINUS: int
+KSCAN_MODE: int
+KSCAN_N: int
+KSCAN_NONUSBACKSLASH: int
+KSCAN_NONUSHASH: int
+KSCAN_NUMLOCK: int
+KSCAN_NUMLOCKCLEAR: int
+KSCAN_O: int
+KSCAN_P: int
+KSCAN_PAGEDOWN: int
+KSCAN_PAGEUP: int
+KSCAN_PAUSE: int
+KSCAN_PERIOD: int
+KSCAN_POWER: int
+KSCAN_PRINT: int
+KSCAN_PRINTSCREEN: int
+KSCAN_Q: int
+KSCAN_R: int
+KSCAN_RALT: int
+KSCAN_RCTRL: int
+KSCAN_RETURN: int
+KSCAN_RGUI: int
+KSCAN_RIGHT: int
+KSCAN_RIGHTBRACKET: int
+KSCAN_RMETA: int
+KSCAN_RSHIFT: int
+KSCAN_RSUPER: int
+KSCAN_S: int
+KSCAN_SCROLLLOCK: int
+KSCAN_SCROLLOCK: int
+KSCAN_SEMICOLON: int
+KSCAN_SLASH: int
+KSCAN_SPACE: int
+KSCAN_SYSREQ: int
+KSCAN_T: int
+KSCAN_TAB: int
+KSCAN_U: int
+KSCAN_UNKNOWN: int
+KSCAN_UP: int
+KSCAN_V: int
+KSCAN_W: int
+KSCAN_X: int
+KSCAN_Y: int
+KSCAN_Z: int
+K_0: int
+K_1: int
+K_2: int
+K_3: int
+K_4: int
+K_5: int
+K_6: int
+K_7: int
+K_8: int
+K_9: int
+K_AC_BACK: int
+K_AMPERSAND: int
+K_ASTERISK: int
+K_AT: int
+K_BACKQUOTE: int
+K_BACKSLASH: int
+K_BACKSPACE: int
+K_BREAK: int
+K_CAPSLOCK: int
+K_CARET: int
+K_CLEAR: int
+K_COLON: int
+K_COMMA: int
+K_CURRENCYSUBUNIT: int
+K_CURRENCYUNIT: int
+K_DELETE: int
+K_DOLLAR: int
+K_DOWN: int
+K_END: int
+K_EQUALS: int
+K_ESCAPE: int
+K_EURO: int
+K_EXCLAIM: int
+K_F1: int
+K_F10: int
+K_F11: int
+K_F12: int
+K_F13: int
+K_F14: int
+K_F15: int
+K_F2: int
+K_F3: int
+K_F4: int
+K_F5: int
+K_F6: int
+K_F7: int
+K_F8: int
+K_F9: int
+K_GREATER: int
+K_HASH: int
+K_HELP: int
+K_HOME: int
+K_INSERT: int
+K_KP0: int
+K_KP1: int
+K_KP2: int
+K_KP3: int
+K_KP4: int
+K_KP5: int
+K_KP6: int
+K_KP7: int
+K_KP8: int
+K_KP9: int
+K_KP_0: int
+K_KP_1: int
+K_KP_2: int
+K_KP_3: int
+K_KP_4: int
+K_KP_5: int
+K_KP_6: int
+K_KP_7: int
+K_KP_8: int
+K_KP_9: int
+K_KP_DIVIDE: int
+K_KP_ENTER: int
+K_KP_EQUALS: int
+K_KP_MINUS: int
+K_KP_MULTIPLY: int
+K_KP_PERIOD: int
+K_KP_PLUS: int
+K_LALT: int
+K_LCTRL: int
+K_LEFT: int
+K_LEFTBRACKET: int
+K_LEFTPAREN: int
+K_LESS: int
+K_LGUI: int
+K_LMETA: int
+K_LSHIFT: int
+K_LSUPER: int
+K_MENU: int
+K_MINUS: int
+K_MODE: int
+K_NUMLOCK: int
+K_NUMLOCKCLEAR: int
+K_PAGEDOWN: int
+K_PAGEUP: int
+K_PAUSE: int
+K_PERCENT: int
+K_PERIOD: int
+K_PLUS: int
+K_POWER: int
+K_PRINT: int
+K_PRINTSCREEN: int
+K_QUESTION: int
+K_QUOTE: int
+K_QUOTEDBL: int
+K_RALT: int
+K_RCTRL: int
+K_RETURN: int
+K_RGUI: int
+K_RIGHT: int
+K_RIGHTBRACKET: int
+K_RIGHTPAREN: int
+K_RMETA: int
+K_RSHIFT: int
+K_RSUPER: int
+K_SCROLLLOCK: int
+K_SCROLLOCK: int
+K_SEMICOLON: int
+K_SLASH: int
+K_SPACE: int
+K_SYSREQ: int
+K_TAB: int
+K_UNDERSCORE: int
+K_UNKNOWN: int
+K_UP: int
+K_a: int
+K_b: int
+K_c: int
+K_d: int
+K_e: int
+K_f: int
+K_g: int
+K_h: int
+K_i: int
+K_j: int
+K_k: int
+K_l: int
+K_m: int
+K_n: int
+K_o: int
+K_p: int
+K_q: int
+K_r: int
+K_s: int
+K_t: int
+K_u: int
+K_v: int
+K_w: int
+K_x: int
+K_y: int
+K_z: int
+LIL_ENDIAN: int
+LOCALECHANGED: int
+MIDIIN: int
+MIDIOUT: int
+MOUSEBUTTONDOWN: int
+MOUSEBUTTONUP: int
+MOUSEMOTION: int
+MOUSEWHEEL: int
+MULTIGESTURE: int
+NOEVENT: int
+NOFRAME: int
+NUMEVENTS: int
+OPENGL: int
+OPENGLBLIT: int
+PREALLOC: int
+QUIT: int
+RENDER_DEVICE_RESET: int
+RENDER_TARGETS_RESET: int
+RESIZABLE: int
+RLEACCEL: int
+RLEACCELOK: int
+SCALED: int
+SCRAP_BMP: str
+SCRAP_CLIPBOARD: int
+SCRAP_PBM: str
+SCRAP_PPM: str
+SCRAP_SELECTION: int
+SCRAP_TEXT: str
+SHOWN: int
+SRCALPHA: int
+SRCCOLORKEY: int
+SWSURFACE: int
+SYSTEM_CURSOR_ARROW: int
+SYSTEM_CURSOR_CROSSHAIR: int
+SYSTEM_CURSOR_HAND: int
+SYSTEM_CURSOR_IBEAM: int
+SYSTEM_CURSOR_NO: int
+SYSTEM_CURSOR_SIZEALL: int
+SYSTEM_CURSOR_SIZENESW: int
+SYSTEM_CURSOR_SIZENS: int
+SYSTEM_CURSOR_SIZENWSE: int
+SYSTEM_CURSOR_SIZEWE: int
+SYSTEM_CURSOR_WAIT: int
+SYSTEM_CURSOR_WAITARROW: int
+SYSWMEVENT: int
+TEXTEDITING: int
+TEXTINPUT: int
+TIMER_RESOLUTION: int
+USEREVENT: int
+USEREVENT_DROPFILE: int
+VIDEOEXPOSE: int
+VIDEORESIZE: int
+WINDOWCLOSE: int
+WINDOWDISPLAYCHANGED: int
+WINDOWENTER: int
+WINDOWEXPOSED: int
+WINDOWFOCUSGAINED: int
+WINDOWFOCUSLOST: int
+WINDOWHIDDEN: int
+WINDOWHITTEST: int
+WINDOWICCPROFCHANGED: int
+WINDOWLEAVE: int
+WINDOWMAXIMIZED: int
+WINDOWMINIMIZED: int
+WINDOWMOVED: int
+WINDOWRESIZED: int
+WINDOWRESTORED: int
+WINDOWSHOWN: int
+WINDOWSIZECHANGED: int
+WINDOWTAKEFOCUS: int
diff --git a/.venv/Lib/site-packages/pygame/cursors.py b/.venv/Lib/site-packages/pygame/cursors.py
new file mode 100644
index 00000000..0ba3ac42
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/cursors.py
@@ -0,0 +1,844 @@
+# pygame - Python Game Library
+# Copyright (C) 2000-2003 Pete Shinners
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Pete Shinners
+# pete@shinners.org
+
+"""Set of cursor resources available for use. These cursors come
+in a sequence of values that are needed as the arguments for
+pygame.mouse.set_cursor(). To dereference the sequence in place
+and create the cursor in one step, call like this:
+ pygame.mouse.set_cursor(*pygame.cursors.arrow).
+
+Here is a list of available cursors:
+ arrow, diamond, ball, broken_x, tri_left, tri_right
+
+There is also a sample string cursor named 'thickarrow_strings'.
+The compile() function can convert these string cursors into cursor byte data that can be used to
+create Cursor objects.
+
+Alternately, you can also create Cursor objects using surfaces or cursors constants,
+such as pygame.SYSTEM_CURSOR_ARROW.
+"""
+
+import pygame
+
+_cursor_id_table = {
+ pygame.SYSTEM_CURSOR_ARROW: "SYSTEM_CURSOR_ARROW",
+ pygame.SYSTEM_CURSOR_IBEAM: "SYSTEM_CURSOR_IBEAM",
+ pygame.SYSTEM_CURSOR_WAIT: "SYSTEM_CURSOR_WAIT",
+ pygame.SYSTEM_CURSOR_CROSSHAIR: "SYSTEM_CURSOR_CROSSHAIR",
+ pygame.SYSTEM_CURSOR_WAITARROW: "SYSTEM_CURSOR_WAITARROW",
+ pygame.SYSTEM_CURSOR_SIZENWSE: "SYSTEM_CURSOR_SIZENWSE",
+ pygame.SYSTEM_CURSOR_SIZENESW: "SYSTEM_CURSOR_SIZENESW",
+ pygame.SYSTEM_CURSOR_SIZEWE: "SYSTEM_CURSOR_SIZEWE",
+ pygame.SYSTEM_CURSOR_SIZENS: "SYSTEM_CURSOR_SIZENS",
+ pygame.SYSTEM_CURSOR_SIZEALL: "SYSTEM_CURSOR_SIZEALL",
+ pygame.SYSTEM_CURSOR_NO: "SYSTEM_CURSOR_NO",
+ pygame.SYSTEM_CURSOR_HAND: "SYSTEM_CURSOR_HAND",
+}
+
+
+class Cursor:
+ def __init__(self, *args):
+ """Cursor(size, hotspot, xormasks, andmasks) -> Cursor
+ Cursor(hotspot, Surface) -> Cursor
+ Cursor(constant) -> Cursor
+ Cursor(Cursor) -> copies the Cursor object passed as an argument
+ Cursor() -> Cursor
+
+ pygame object for representing cursors
+
+ You can initialize a cursor from a system cursor or use the
+ constructor on an existing Cursor object, which will copy it.
+ Providing a Surface instance will render the cursor displayed
+ as that Surface when used.
+
+ These Surfaces may use other colors than black and white."""
+ if len(args) == 0:
+ self.type = "system"
+ self.data = (pygame.SYSTEM_CURSOR_ARROW,)
+ elif len(args) == 1 and args[0] in _cursor_id_table:
+ self.type = "system"
+ self.data = (args[0],)
+ elif len(args) == 1 and isinstance(args[0], Cursor):
+ self.type = args[0].type
+ self.data = args[0].data
+ elif (
+ len(args) == 2 and len(args[0]) == 2 and isinstance(args[1], pygame.Surface)
+ ):
+ self.type = "color"
+ self.data = tuple(args)
+ elif len(args) == 4 and len(args[0]) == 2 and len(args[1]) == 2:
+ self.type = "bitmap"
+ # pylint: disable=consider-using-generator
+ # See https://github.com/pygame/pygame/pull/2509 for analysis
+ self.data = tuple(tuple(arg) for arg in args)
+ else:
+ raise TypeError("Arguments must match a cursor specification")
+
+ def __len__(self):
+ return len(self.data)
+
+ def __iter__(self):
+ return iter(self.data)
+
+ def __getitem__(self, index):
+ return self.data[index]
+
+ def __eq__(self, other):
+ return isinstance(other, Cursor) and self.data == other.data
+
+ def __ne__(self, other):
+ return not self.__eq__(other)
+
+ def __copy__(self):
+ """Clone the current Cursor object.
+ You can do the same thing by doing Cursor(Cursor)."""
+ return self.__class__(self)
+
+ copy = __copy__
+
+ def __hash__(self):
+ return hash(tuple([self.type] + list(self.data)))
+
+ def __repr__(self):
+ if self.type == "system":
+ id_string = _cursor_id_table.get(self.data[0], "constant lookup error")
+ return f""
+ if self.type == "bitmap":
+ size = f"size: {self.data[0]}"
+ hotspot = f"hotspot: {self.data[1]}"
+ return f""
+ if self.type == "color":
+ hotspot = f"hotspot: {self.data[0]}"
+ surf = repr(self.data[1])
+ return f""
+ raise TypeError("Invalid Cursor")
+
+
+# Python side of the set_cursor function: C side in mouse.c
+def set_cursor(*args):
+ """set_cursor(pygame.cursors.Cursor OR args for a pygame.cursors.Cursor) -> None
+ set the mouse cursor to a new cursor"""
+ cursor = Cursor(*args)
+ pygame.mouse._set_cursor(**{cursor.type: cursor.data})
+
+
+pygame.mouse.set_cursor = set_cursor
+del set_cursor # cleanup namespace
+
+
+# Python side of the get_cursor function: C side in mouse.c
+def get_cursor():
+ """get_cursor() -> pygame.cursors.Cursor
+ get the current mouse cursor"""
+ return Cursor(*pygame.mouse._get_cursor())
+
+
+pygame.mouse.get_cursor = get_cursor
+del get_cursor # cleanup namespace
+
+arrow = Cursor(
+ (16, 16),
+ (0, 0),
+ (
+ 0x00,
+ 0x00,
+ 0x40,
+ 0x00,
+ 0x60,
+ 0x00,
+ 0x70,
+ 0x00,
+ 0x78,
+ 0x00,
+ 0x7C,
+ 0x00,
+ 0x7E,
+ 0x00,
+ 0x7F,
+ 0x00,
+ 0x7F,
+ 0x80,
+ 0x7C,
+ 0x00,
+ 0x6C,
+ 0x00,
+ 0x46,
+ 0x00,
+ 0x06,
+ 0x00,
+ 0x03,
+ 0x00,
+ 0x03,
+ 0x00,
+ 0x00,
+ 0x00,
+ ),
+ (
+ 0x40,
+ 0x00,
+ 0xE0,
+ 0x00,
+ 0xF0,
+ 0x00,
+ 0xF8,
+ 0x00,
+ 0xFC,
+ 0x00,
+ 0xFE,
+ 0x00,
+ 0xFF,
+ 0x00,
+ 0xFF,
+ 0x80,
+ 0xFF,
+ 0xC0,
+ 0xFF,
+ 0x80,
+ 0xFE,
+ 0x00,
+ 0xEF,
+ 0x00,
+ 0x4F,
+ 0x00,
+ 0x07,
+ 0x80,
+ 0x07,
+ 0x80,
+ 0x03,
+ 0x00,
+ ),
+)
+
+diamond = Cursor(
+ (16, 16),
+ (7, 7),
+ (
+ 0,
+ 0,
+ 1,
+ 0,
+ 3,
+ 128,
+ 7,
+ 192,
+ 14,
+ 224,
+ 28,
+ 112,
+ 56,
+ 56,
+ 112,
+ 28,
+ 56,
+ 56,
+ 28,
+ 112,
+ 14,
+ 224,
+ 7,
+ 192,
+ 3,
+ 128,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ),
+ (
+ 1,
+ 0,
+ 3,
+ 128,
+ 7,
+ 192,
+ 15,
+ 224,
+ 31,
+ 240,
+ 62,
+ 248,
+ 124,
+ 124,
+ 248,
+ 62,
+ 124,
+ 124,
+ 62,
+ 248,
+ 31,
+ 240,
+ 15,
+ 224,
+ 7,
+ 192,
+ 3,
+ 128,
+ 1,
+ 0,
+ 0,
+ 0,
+ ),
+)
+
+ball = Cursor(
+ (16, 16),
+ (7, 7),
+ (
+ 0,
+ 0,
+ 3,
+ 192,
+ 15,
+ 240,
+ 24,
+ 248,
+ 51,
+ 252,
+ 55,
+ 252,
+ 127,
+ 254,
+ 127,
+ 254,
+ 127,
+ 254,
+ 127,
+ 254,
+ 63,
+ 252,
+ 63,
+ 252,
+ 31,
+ 248,
+ 15,
+ 240,
+ 3,
+ 192,
+ 0,
+ 0,
+ ),
+ (
+ 3,
+ 192,
+ 15,
+ 240,
+ 31,
+ 248,
+ 63,
+ 252,
+ 127,
+ 254,
+ 127,
+ 254,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 255,
+ 127,
+ 254,
+ 127,
+ 254,
+ 63,
+ 252,
+ 31,
+ 248,
+ 15,
+ 240,
+ 3,
+ 192,
+ ),
+)
+
+broken_x = Cursor(
+ (16, 16),
+ (7, 7),
+ (
+ 0,
+ 0,
+ 96,
+ 6,
+ 112,
+ 14,
+ 56,
+ 28,
+ 28,
+ 56,
+ 12,
+ 48,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 12,
+ 48,
+ 28,
+ 56,
+ 56,
+ 28,
+ 112,
+ 14,
+ 96,
+ 6,
+ 0,
+ 0,
+ ),
+ (
+ 224,
+ 7,
+ 240,
+ 15,
+ 248,
+ 31,
+ 124,
+ 62,
+ 62,
+ 124,
+ 30,
+ 120,
+ 14,
+ 112,
+ 0,
+ 0,
+ 0,
+ 0,
+ 14,
+ 112,
+ 30,
+ 120,
+ 62,
+ 124,
+ 124,
+ 62,
+ 248,
+ 31,
+ 240,
+ 15,
+ 224,
+ 7,
+ ),
+)
+
+tri_left = Cursor(
+ (16, 16),
+ (1, 1),
+ (
+ 0,
+ 0,
+ 96,
+ 0,
+ 120,
+ 0,
+ 62,
+ 0,
+ 63,
+ 128,
+ 31,
+ 224,
+ 31,
+ 248,
+ 15,
+ 254,
+ 15,
+ 254,
+ 7,
+ 128,
+ 7,
+ 128,
+ 3,
+ 128,
+ 3,
+ 128,
+ 1,
+ 128,
+ 1,
+ 128,
+ 0,
+ 0,
+ ),
+ (
+ 224,
+ 0,
+ 248,
+ 0,
+ 254,
+ 0,
+ 127,
+ 128,
+ 127,
+ 224,
+ 63,
+ 248,
+ 63,
+ 254,
+ 31,
+ 255,
+ 31,
+ 255,
+ 15,
+ 254,
+ 15,
+ 192,
+ 7,
+ 192,
+ 7,
+ 192,
+ 3,
+ 192,
+ 3,
+ 192,
+ 1,
+ 128,
+ ),
+)
+
+tri_right = Cursor(
+ (16, 16),
+ (14, 1),
+ (
+ 0,
+ 0,
+ 0,
+ 6,
+ 0,
+ 30,
+ 0,
+ 124,
+ 1,
+ 252,
+ 7,
+ 248,
+ 31,
+ 248,
+ 127,
+ 240,
+ 127,
+ 240,
+ 1,
+ 224,
+ 1,
+ 224,
+ 1,
+ 192,
+ 1,
+ 192,
+ 1,
+ 128,
+ 1,
+ 128,
+ 0,
+ 0,
+ ),
+ (
+ 0,
+ 7,
+ 0,
+ 31,
+ 0,
+ 127,
+ 1,
+ 254,
+ 7,
+ 254,
+ 31,
+ 252,
+ 127,
+ 252,
+ 255,
+ 248,
+ 255,
+ 248,
+ 127,
+ 240,
+ 3,
+ 240,
+ 3,
+ 224,
+ 3,
+ 224,
+ 3,
+ 192,
+ 3,
+ 192,
+ 1,
+ 128,
+ ),
+)
+
+
+# Here is an example string resource cursor. To use this:
+# curs, mask = pygame.cursors.compile_cursor(pygame.cursors.thickarrow_strings, 'X', '.')
+# pygame.mouse.set_cursor((24, 24), (0, 0), curs, mask)
+# Be warned, though, that cursors created from compiled strings do not support colors.
+
+# sized 24x24
+thickarrow_strings = (
+ "XX ",
+ "XXX ",
+ "XXXX ",
+ "XX.XX ",
+ "XX..XX ",
+ "XX...XX ",
+ "XX....XX ",
+ "XX.....XX ",
+ "XX......XX ",
+ "XX.......XX ",
+ "XX........XX ",
+ "XX........XXX ",
+ "XX......XXXXX ",
+ "XX.XXX..XX ",
+ "XXXX XX..XX ",
+ "XX XX..XX ",
+ " XX..XX ",
+ " XX..XX ",
+ " XX..XX ",
+ " XXXX ",
+ " XX ",
+ " ",
+ " ",
+ " ",
+)
+
+# sized 24x16
+sizer_x_strings = (
+ " X X ",
+ " XX XX ",
+ " X.X X.X ",
+ " X..X X..X ",
+ " X...XXXXXXXX...X ",
+ "X................X ",
+ " X...XXXXXXXX...X ",
+ " X..X X..X ",
+ " X.X X.X ",
+ " XX XX ",
+ " X X ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+)
+
+# sized 16x24
+sizer_y_strings = (
+ " X ",
+ " X.X ",
+ " X...X ",
+ " X.....X ",
+ " X.......X ",
+ "XXXXX.XXXXX ",
+ " X.X ",
+ " X.X ",
+ " X.X ",
+ " X.X ",
+ " X.X ",
+ " X.X ",
+ " X.X ",
+ "XXXXX.XXXXX ",
+ " X.......X ",
+ " X.....X ",
+ " X...X ",
+ " X.X ",
+ " X ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+)
+
+# sized 24x16
+sizer_xy_strings = (
+ "XXXXXXXX ",
+ "X.....X ",
+ "X....X ",
+ "X...X ",
+ "X..X.X ",
+ "X.X X.X ",
+ "XX X.X X ",
+ "X X.X XX ",
+ " X.XX.X ",
+ " X...X ",
+ " X...X ",
+ " X....X ",
+ " X.....X ",
+ " XXXXXXXX ",
+ " ",
+ " ",
+)
+
+# sized 8x16
+textmarker_strings = (
+ "ooo ooo ",
+ " o ",
+ " o ",
+ " o ",
+ " o ",
+ " o ",
+ " o ",
+ " o ",
+ " o ",
+ " o ",
+ " o ",
+ "ooo ooo ",
+ " ",
+ " ",
+ " ",
+ " ",
+)
+
+
+def compile(strings, black="X", white=".", xor="o"):
+ """pygame.cursors.compile(strings, black, white, xor) -> data, mask
+ compile cursor strings into cursor data
+
+ This takes a set of strings with equal length and computes
+ the binary data for that cursor. The string widths must be
+ divisible by 8.
+
+ The black and white arguments are single letter strings that
+ tells which characters will represent black pixels, and which
+ characters represent white pixels. All other characters are
+ considered clear.
+
+ Some systems allow you to set a special toggle color for the
+ system color, this is also called the xor color. If the system
+ does not support xor cursors, that color will simply be black.
+
+ This returns a tuple containing the cursor data and cursor mask
+ data. Both these arguments are used when setting a cursor with
+ pygame.mouse.set_cursor().
+ """
+ # first check for consistent lengths
+ size = len(strings[0]), len(strings)
+ if size[0] % 8 or size[1] % 8:
+ raise ValueError(f"cursor string sizes must be divisible by 8 {size}")
+
+ for s in strings[1:]:
+ if len(s) != size[0]:
+ raise ValueError("Cursor strings are inconsistent lengths")
+
+ # create the data arrays.
+ # this could stand a little optimizing
+ maskdata = []
+ filldata = []
+ maskitem = fillitem = 0
+ step = 8
+ for s in strings:
+ for c in s:
+ maskitem = maskitem << 1
+ fillitem = fillitem << 1
+ step = step - 1
+ if c == black:
+ maskitem = maskitem | 1
+ fillitem = fillitem | 1
+ elif c == white:
+ maskitem = maskitem | 1
+ elif c == xor:
+ fillitem = fillitem | 1
+
+ if not step:
+ maskdata.append(maskitem)
+ filldata.append(fillitem)
+ maskitem = fillitem = 0
+ step = 8
+
+ return tuple(filldata), tuple(maskdata)
+
+
+def load_xbm(curs, mask):
+ """pygame.cursors.load_xbm(cursorfile, maskfile) -> cursor_args
+ reads a pair of XBM files into set_cursor arguments
+
+ Arguments can either be filenames or filelike objects
+ with the readlines method. Not largely tested, but
+ should work with typical XBM files.
+ """
+
+ def bitswap(num):
+ val = 0
+ for x in range(8):
+ b = num & (1 << x) != 0
+ val = val << 1 | b
+ return val
+
+ if hasattr(curs, "readlines"):
+ curs = curs.readlines()
+ else:
+ with open(curs, encoding="ascii") as cursor_f:
+ curs = cursor_f.readlines()
+
+ if hasattr(mask, "readlines"):
+ mask = mask.readlines()
+ else:
+ with open(mask, encoding="ascii") as mask_f:
+ mask = mask_f.readlines()
+
+ # avoid comments
+ for i, line in enumerate(curs):
+ if line.startswith("#define"):
+ curs = curs[i:]
+ break
+
+ for i, line in enumerate(mask):
+ if line.startswith("#define"):
+ mask = mask[i:]
+ break
+
+ # load width,height
+ width = int(curs[0].split()[-1])
+ height = int(curs[1].split()[-1])
+ # load hotspot position
+ if curs[2].startswith("#define"):
+ hotx = int(curs[2].split()[-1])
+ hoty = int(curs[3].split()[-1])
+ else:
+ hotx = hoty = 0
+
+ info = width, height, hotx, hoty
+
+ possible_starts = ("static char", "static unsigned char")
+ for i, line in enumerate(curs):
+ if line.startswith(possible_starts):
+ break
+ data = " ".join(curs[i + 1 :]).replace("};", "").replace(",", " ")
+ cursdata = []
+ for x in data.split():
+ cursdata.append(bitswap(int(x, 16)))
+ cursdata = tuple(cursdata)
+ for i, line in enumerate(mask):
+ if line.startswith(possible_starts):
+ break
+ data = " ".join(mask[i + 1 :]).replace("};", "").replace(",", " ")
+ maskdata = []
+ for x in data.split():
+ maskdata.append(bitswap(int(x, 16)))
+
+ maskdata = tuple(maskdata)
+ return info[:2], info[2:], cursdata, maskdata
diff --git a/.venv/Lib/site-packages/pygame/cursors.pyi b/.venv/Lib/site-packages/pygame/cursors.pyi
new file mode 100644
index 00000000..7edc62b5
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/cursors.pyi
@@ -0,0 +1,91 @@
+from typing import Any, Iterator, Sequence, Tuple, Union, overload
+
+from pygame.surface import Surface
+
+from ._common import FileArg, Literal
+
+_Small_string = Tuple[
+ str, str, str, str, str, str, str, str, str, str, str, str, str, str, str, str
+]
+_Big_string = Tuple[
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+ str,
+]
+
+arrow: Cursor
+diamond: Cursor
+broken_x: Cursor
+tri_left: Cursor
+tri_right: Cursor
+ball: Cursor
+thickarrow_strings: _Big_string
+sizer_x_strings: _Small_string
+sizer_y_strings: _Big_string
+sizer_xy_strings: _Small_string
+textmarker_strings: _Small_string
+
+def compile(
+ strings: Sequence[str],
+ black: str = "X",
+ white: str = ".",
+ xor: str = "o",
+) -> Tuple[Tuple[int, ...], Tuple[int, ...]]: ...
+def load_xbm(
+ curs: FileArg, mask: FileArg
+) -> Tuple[Tuple[int, int], Tuple[int, int], Tuple[int, ...], Tuple[int, ...]]: ...
+
+class Cursor:
+ @overload
+ def __init__(self, constant: int = ...) -> None: ...
+ @overload
+ def __init__(self, cursor: Cursor) -> None: ...
+ @overload
+ def __init__(
+ self,
+ size: Union[Tuple[int, int], Sequence[int]],
+ hotspot: Union[Tuple[int, int], Sequence[int]],
+ xormasks: Sequence[int],
+ andmasks: Sequence[int],
+ ) -> None: ...
+ @overload
+ def __init__(
+ self,
+ hotspot: Union[Tuple[int, int], Sequence[int]],
+ surface: Surface,
+ ) -> None: ...
+ def __iter__(self) -> Iterator[Any]: ...
+ def __len__(self) -> int: ...
+ def __copy__(self) -> Cursor: ...
+ def __hash__(self) -> int: ...
+ def __getitem__(
+ self, index: int
+ ) -> Union[int, Tuple[int, int], Sequence[int], Surface]: ...
+ copy = __copy__
+ type: Literal["system", "color", "bitmap"]
+ data: Union[
+ Tuple[int],
+ Tuple[Tuple[int, int], Tuple[int, int], Tuple[int, ...], Tuple[int, ...]],
+ Tuple[Union[Tuple[int, int], Sequence[int]], Surface],
+ ]
diff --git a/.venv/Lib/site-packages/pygame/display.cp311-win_amd64.pyd b/.venv/Lib/site-packages/pygame/display.cp311-win_amd64.pyd
new file mode 100644
index 00000000..091ac86f
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/display.cp311-win_amd64.pyd differ
diff --git a/.venv/Lib/site-packages/pygame/display.pyi b/.venv/Lib/site-packages/pygame/display.pyi
new file mode 100644
index 00000000..443a1f93
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/display.pyi
@@ -0,0 +1,77 @@
+from typing import Union, Tuple, List, Optional, Dict, Sequence, overload
+
+from pygame.surface import Surface
+from pygame.constants import FULLSCREEN
+from ._common import Coordinate, RectValue, ColorValue, RGBAOutput
+
+class _VidInfo:
+ hw: int
+ wm: int
+ video_mem: int
+ bitsize: int
+ bytesize: int
+ masks: RGBAOutput
+ shifts: RGBAOutput
+ losses: RGBAOutput
+ blit_hw: int
+ blit_hw_CC: int
+ blit_hw_A: int
+ blit_sw: int
+ blit_sw_CC: int
+ blit_sw_A: int
+ current_h: int
+ current_w: int
+
+def init() -> None: ...
+def quit() -> None: ...
+def get_init() -> bool: ...
+def set_mode(
+ size: Coordinate = (0, 0),
+ flags: int = 0,
+ depth: int = 0,
+ display: int = 0,
+ vsync: int = 0,
+) -> Surface: ...
+def get_surface() -> Surface: ...
+def flip() -> None: ...
+@overload
+def update(
+ rectangle: Optional[Union[RectValue, Sequence[Optional[RectValue]]]] = None
+) -> None: ...
+@overload
+def update(x: int, y: int, w: int, h: int) -> None: ...
+@overload
+def update(xy: Coordinate, wh: Coordinate) -> None: ...
+def get_driver() -> str: ...
+def Info() -> _VidInfo: ...
+def get_wm_info() -> Dict[str, int]: ...
+def list_modes(
+ depth: int = 0,
+ flags: int = FULLSCREEN,
+ display: int = 0,
+) -> List[Tuple[int, int]]: ...
+def mode_ok(
+ size: Union[Sequence[int], Tuple[int, int]],
+ flags: int = 0,
+ depth: int = 0,
+ display: int = 0,
+) -> int: ...
+def gl_get_attribute(flag: int) -> int: ...
+def gl_set_attribute(flag: int, value: int) -> None: ...
+def get_active() -> bool: ...
+def iconify() -> bool: ...
+def toggle_fullscreen() -> int: ...
+def set_gamma(red: float, green: float = ..., blue: float = ...) -> int: ...
+def set_gamma_ramp(
+ red: Sequence[int], green: Sequence[int], blue: Sequence[int]
+) -> int: ...
+def set_icon(surface: Surface) -> None: ...
+def set_caption(title: str, icontitle: Optional[str] = None) -> None: ...
+def get_caption() -> Tuple[str, str]: ...
+def set_palette(palette: Sequence[ColorValue]) -> None: ...
+def get_num_displays() -> int: ...
+def get_window_size() -> Tuple[int, int]: ...
+def get_allow_screensaver() -> bool: ...
+def set_allow_screensaver(value: bool = True) -> None: ...
+def get_desktop_sizes() -> List[Tuple[int, int]]: ...
+def is_fullscreen() -> bool: ...
diff --git a/.venv/Lib/site-packages/pygame/docs/__main__.py b/.venv/Lib/site-packages/pygame/docs/__main__.py
new file mode 100644
index 00000000..249b65ee
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/__main__.py
@@ -0,0 +1,37 @@
+# python -m pygame.docs
+
+import os
+import webbrowser
+from urllib.parse import quote, urlunparse
+
+
+def _iterpath(path):
+ path, last = os.path.split(path)
+ if last:
+ yield from _iterpath(path)
+ yield last
+
+
+# for test suite to confirm pygame built with local docs
+def has_local_docs():
+ pkg_dir = os.path.dirname(os.path.abspath(__file__))
+ main_page = os.path.join(pkg_dir, "generated", "index.html")
+ return os.path.exists(main_page)
+
+
+def open_docs():
+ pkg_dir = os.path.dirname(os.path.abspath(__file__))
+ main_page = os.path.join(pkg_dir, "generated", "index.html")
+ if os.path.exists(main_page):
+ url_path = quote("/".join(_iterpath(main_page)))
+ drive, rest = os.path.splitdrive(__file__)
+ if drive:
+ url_path = f"{drive}/{url_path}"
+ url = urlunparse(("file", "", url_path, "", "", ""))
+ else:
+ url = "https://www.pygame.org/docs/"
+ webbrowser.open(url)
+
+
+if __name__ == "__main__":
+ open_docs()
diff --git a/.venv/Lib/site-packages/pygame/docs/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pygame/docs/__pycache__/__main__.cpython-311.pyc
new file mode 100644
index 00000000..af3bdb3e
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/__pycache__/__main__.cpython-311.pyc differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/LGPL.txt b/.venv/Lib/site-packages/pygame/docs/generated/LGPL.txt
new file mode 100644
index 00000000..b1e3f5a2
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/LGPL.txt
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput1.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput1.gif
new file mode 100644
index 00000000..8c7f7ea6
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput1.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput11.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput11.gif
new file mode 100644
index 00000000..8c7f7ea6
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput11.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput2.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput2.gif
new file mode 100644
index 00000000..2094e3aa
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput2.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput21.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput21.gif
new file mode 100644
index 00000000..2094e3aa
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput21.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput3.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput3.gif
new file mode 100644
index 00000000..3a0d748a
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput3.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput31.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput31.gif
new file mode 100644
index 00000000..3a0d748a
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput31.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput4.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput4.gif
new file mode 100644
index 00000000..415644e6
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput4.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput41.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput41.gif
new file mode 100644
index 00000000..415644e6
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput41.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput5.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput5.gif
new file mode 100644
index 00000000..5796b4e1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput5.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput51.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput51.gif
new file mode 100644
index 00000000..5796b4e1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedInputOutput51.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha1.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha1.gif
new file mode 100644
index 00000000..c0d41244
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha1.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha11.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha11.gif
new file mode 100644
index 00000000..c0d41244
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha11.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha2.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha2.gif
new file mode 100644
index 00000000..00b443da
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha2.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha21.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha21.gif
new file mode 100644
index 00000000..00b443da
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha21.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha3.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha3.gif
new file mode 100644
index 00000000..be1204dd
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha3.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha31.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha31.gif
new file mode 100644
index 00000000..be1204dd
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputAlpha31.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess1.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess1.gif
new file mode 100644
index 00000000..20edf216
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess1.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess11.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess11.gif
new file mode 100644
index 00000000..20edf216
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess11.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess2.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess2.gif
new file mode 100644
index 00000000..5445c0e2
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess2.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess21.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess21.gif
new file mode 100644
index 00000000..5445c0e2
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess21.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess3.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess3.gif
new file mode 100644
index 00000000..0da81f17
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess3.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess31.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess31.gif
new file mode 100644
index 00000000..0da81f17
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess31.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess4.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess4.gif
new file mode 100644
index 00000000..18506fae
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess4.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess41.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess41.gif
new file mode 100644
index 00000000..18506fae
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess41.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess5.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess5.gif
new file mode 100644
index 00000000..def0e06b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess5.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess51.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess51.gif
new file mode 100644
index 00000000..def0e06b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess51.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess6.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess6.gif
new file mode 100644
index 00000000..127cc1e8
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess6.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess61.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess61.gif
new file mode 100644
index 00000000..127cc1e8
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/AdvancedOutputProcess61.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-resultscreen.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-resultscreen.png
new file mode 100644
index 00000000..9280cbe8
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-resultscreen.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-resultscreen1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-resultscreen1.png
new file mode 100644
index 00000000..9280cbe8
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-resultscreen1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-sourcecode.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-sourcecode.png
new file mode 100644
index 00000000..d378854b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-sourcecode.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-sourcecode1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-sourcecode1.png
new file mode 100644
index 00000000..d378854b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-INPUT-sourcecode1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-resultscreen.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-resultscreen.png
new file mode 100644
index 00000000..f4e8322c
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-resultscreen.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-resultscreen1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-resultscreen1.png
new file mode 100644
index 00000000..f4e8322c
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-resultscreen1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-sourcecode.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-sourcecode.png
new file mode 100644
index 00000000..b20873a1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-sourcecode.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-sourcecode1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-sourcecode1.png
new file mode 100644
index 00000000..b20873a1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-PROCESS-sourcecode1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-ouput-result-screen.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-ouput-result-screen.png
new file mode 100644
index 00000000..d8628e11
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-ouput-result-screen.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-ouput-result-screen1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-ouput-result-screen1.png
new file mode 100644
index 00000000..d8628e11
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Bagic-ouput-result-screen1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Basic-ouput-sourcecode.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Basic-ouput-sourcecode.png
new file mode 100644
index 00000000..659c981b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Basic-ouput-sourcecode.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/Basic-ouput-sourcecode1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/Basic-ouput-sourcecode1.png
new file mode 100644
index 00000000..659c981b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/Basic-ouput-sourcecode1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/angle_to.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/angle_to.png
new file mode 100644
index 00000000..2cf3b2a5
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/angle_to.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_average.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_average.jpg
new file mode 100644
index 00000000..043e485b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_average.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_background.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_background.jpg
new file mode 100644
index 00000000..cfcbd02c
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_background.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_green.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_green.jpg
new file mode 100644
index 00000000..24c4b09b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_green.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_hsv.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_hsv.jpg
new file mode 100644
index 00000000..afe95597
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_hsv.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_mask.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_mask.jpg
new file mode 100644
index 00000000..cd8ed1de
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_mask.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_rgb.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_rgb.jpg
new file mode 100644
index 00000000..3401421b
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_rgb.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_thresh.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_thresh.jpg
new file mode 100644
index 00000000..cb2426ff
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_thresh.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_thresholded.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_thresholded.jpg
new file mode 100644
index 00000000..c4ee891a
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_thresholded.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_yuv.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_yuv.jpg
new file mode 100644
index 00000000..1cda596f
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/camera_yuv.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/chimpshot.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/chimpshot.gif
new file mode 100644
index 00000000..c27191d1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/chimpshot.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/draw_module_example.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/draw_module_example.png
new file mode 100644
index 00000000..42d6ed18
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/draw_module_example.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_ball.gif b/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_ball.gif
new file mode 100644
index 00000000..bbc4a95f
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_ball.gif differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_blade.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_blade.jpg
new file mode 100644
index 00000000..2ed490cb
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_blade.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_freedom.jpg b/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_freedom.jpg
new file mode 100644
index 00000000..9ed473d5
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/intro_freedom.jpg differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-Battleship.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-Battleship.png
new file mode 100644
index 00000000..35674f69
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-Battleship.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-Battleship1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-Battleship1.png
new file mode 100644
index 00000000..35674f69
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-Battleship1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-PuyoPuyo.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-PuyoPuyo.png
new file mode 100644
index 00000000..dc104ead
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-PuyoPuyo.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-PuyoPuyo1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-PuyoPuyo1.png
new file mode 100644
index 00000000..dc104ead
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-PuyoPuyo1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-TPS.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-TPS.png
new file mode 100644
index 00000000..9c8cb0c1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-TPS.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-TPS1.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-TPS1.png
new file mode 100644
index 00000000..9c8cb0c1
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/introduction-TPS1.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/joystick_calls.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/joystick_calls.png
new file mode 100644
index 00000000..c713bfe0
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/joystick_calls.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_lofi.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_lofi.png
new file mode 100644
index 00000000..b9e9f569
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_lofi.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_logo.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_logo.png
new file mode 100644
index 00000000..0de28c4c
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_logo.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_powered.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_powered.png
new file mode 100644
index 00000000..4d5bf4bb
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_powered.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_powered_lowres.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_powered_lowres.png
new file mode 100644
index 00000000..642ae7a6
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_powered_lowres.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_tiny.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_tiny.png
new file mode 100644
index 00000000..5ee063a7
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/pygame_tiny.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_allblack.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_allblack.png
new file mode 100644
index 00000000..80cbc35e
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_allblack.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_flipped.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_flipped.png
new file mode 100644
index 00000000..742f4f3a
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_flipped.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_redimg.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_redimg.png
new file mode 100644
index 00000000..58e9c3f6
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_redimg.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_rgbarray.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_rgbarray.png
new file mode 100644
index 00000000..8513ef75
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_rgbarray.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_scaledown.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_scaledown.png
new file mode 100644
index 00000000..0be3541d
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_scaledown.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_scaleup.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_scaleup.png
new file mode 100644
index 00000000..ff1f15e7
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_scaleup.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_soften.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_soften.png
new file mode 100644
index 00000000..c1d4ce48
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_soften.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_striped.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_striped.png
new file mode 100644
index 00000000..2ca4a79d
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_striped.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_xfade.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_xfade.png
new file mode 100644
index 00000000..8b907068
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/surfarray_xfade.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_basic.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_basic.png
new file mode 100644
index 00000000..849adb5c
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_basic.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_event-flowchart.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_event-flowchart.png
new file mode 100644
index 00000000..6a33613c
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_event-flowchart.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_formulae.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_formulae.png
new file mode 100644
index 00000000..f04b482a
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_formulae.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_radians.png b/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_radians.png
new file mode 100644
index 00000000..4569df1c
Binary files /dev/null and b/.venv/Lib/site-packages/pygame/docs/generated/_images/tom_radians.png differ
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/c_api.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/c_api.rst.txt
new file mode 100644
index 00000000..734289f0
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/c_api.rst.txt
@@ -0,0 +1,25 @@
+pygame C API
+============
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ c_api/slots.rst
+ c_api/base.rst
+ c_api/bufferproxy.rst
+ c_api/color.rst
+ c_api/display.rst
+ c_api/event.rst
+ c_api/freetype.rst
+ c_api/mixer.rst
+ c_api/rect.rst
+ c_api/rwobject.rst
+ c_api/surface.rst
+ c_api/surflock.rst
+ c_api/version.rst
+
+
+src_c/include/ contains header files for applications
+that use the pygame C API, while src_c/ contains
+headers used by pygame internally.
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/filepaths.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/filepaths.rst.txt
new file mode 100644
index 00000000..e17f6875
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/filepaths.rst.txt
@@ -0,0 +1,17 @@
+File Path Function Arguments
+============================
+
+A pygame function or method which takes a file path argument will accept
+either a Unicode or a byte (8-bit or ASCII character) string.
+Unicode strings are translated to Python's default filesystem encoding,
+as returned by sys.getfilesystemencoding(). A Unicode code point
+above U+FFFF (``\uFFFF``) can be coded directly with a 32-bit escape sequences
+(``\Uxxxxxxxx``), even for Python interpreters built with an UCS-2
+(16-bit character) Unicode type. Byte strings are passed
+to the operating system unchanged.
+
+Null characters (``\x00``) are not permitted in the path, raising an exception.
+An exception is also raised if an Unicode file path cannot be encoded.
+How UTF-16 surrogate codes are handled is Python-interpreter-dependent.
+Use UTF-32 code points and 32-bit escape sequences instead.
+The exception types are function-dependent.
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/index.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/index.rst.txt
new file mode 100644
index 00000000..8d34d7cc
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/index.rst.txt
@@ -0,0 +1,213 @@
+Pygame Front Page
+=================
+
+.. toctree::
+ :maxdepth: 2
+ :glob:
+ :hidden:
+
+ ref/*
+ tut/*
+ tut/en/**/*
+ tut/ko/**/*
+ c_api
+ filepaths
+ logos
+
+Quick start
+-----------
+
+Welcome to pygame! Once you've got pygame installed (:code:`pip install pygame` or
+:code:`pip3 install pygame` for most people), the next question is how to get a game
+loop running. Pygame, unlike some other libraries, gives you full control of program
+execution. That freedom means it is easy to mess up in your initial steps.
+
+Here is a good example of a basic setup (opens the window, updates the screen, and handles events)--
+
+.. literalinclude:: ref/code_examples/base_script.py
+
+Here is a slightly more fleshed out example, which shows you how to move something
+(a circle in this case) around on screen--
+
+.. literalinclude:: ref/code_examples/base_script_example.py
+
+For more in depth reference, check out the :ref:`tutorials-reference-label`
+section below, check out a video tutorial (`I'm a fan of this one
+`_), or reference the API
+documentation by module.
+
+Documents
+---------
+
+`Readme`_
+ Basic information about pygame: what it is, who is involved, and where to find it.
+
+`Install`_
+ Steps needed to compile pygame on several platforms.
+ Also help on finding and installing prebuilt binaries for your system.
+
+:doc:`filepaths`
+ How pygame handles file system paths.
+
+:doc:`Pygame Logos `
+ The logos of Pygame in different resolutions.
+
+
+`LGPL License`_
+ This is the license pygame is distributed under.
+ It provides for pygame to be distributed with open source and commercial software.
+ Generally, if pygame is not changed, it can be used with any type of program.
+
+.. _tutorials-reference-label:
+
+Tutorials
+---------
+
+:doc:`Introduction to Pygame `
+ An introduction to the basics of pygame.
+ This is written for users of Python and appeared in volume two of the Py magazine.
+
+:doc:`Import and Initialize `
+ The beginning steps on importing and initializing pygame.
+ The pygame package is made of several modules.
+ Some modules are not included on all platforms.
+
+:doc:`How do I move an Image? `
+ A basic tutorial that covers the concepts behind 2D computer animation.
+ Information about drawing and clearing objects to make them appear animated.
+
+:doc:`Chimp Tutorial, Line by Line `
+ The pygame examples include a simple program with an interactive fist and a chimpanzee.
+ This was inspired by the annoying flash banner of the early 2000s.
+ This tutorial examines every line of code used in the example.
+
+:doc:`Sprite Module Introduction `
+ Pygame includes a higher level sprite module to help organize games.
+ The sprite module includes several classes that help manage details found in almost all games types.
+ The Sprite classes are a bit more advanced than the regular pygame modules,
+ and need more understanding to be properly used.
+
+:doc:`Surfarray Introduction `
+ Pygame used the NumPy python module to allow efficient per pixel effects on images.
+ Using the surface arrays is an advanced feature that allows custom effects and filters.
+ This also examines some of the simple effects from the pygame example, arraydemo.py.
+
+:doc:`Camera Module Introduction `
+ Pygame, as of 1.9, has a camera module that allows you to capture images,
+ watch live streams, and do some basic computer vision.
+ This tutorial covers those use cases.
+
+:doc:`Newbie Guide `
+ A list of thirteen helpful tips for people to get comfortable using pygame.
+
+:doc:`Making Games Tutorial `
+ A large tutorial that covers the bigger topics needed to create an entire game.
+
+:doc:`Display Modes `
+ Getting a display surface for the screen.
+
+:doc:`한국어 튜토리얼 (Korean Tutorial) `
+ 빨간블록 검은블록
+
+
+Reference
+---------
+
+:ref:`genindex`
+ A list of all functions, classes, and methods in the pygame package.
+
+:doc:`ref/bufferproxy`
+ An array protocol view of surface pixels
+
+:doc:`ref/color`
+ Color representation.
+
+:doc:`ref/cursors`
+ Loading and compiling cursor images.
+
+:doc:`ref/display`
+ Configure the display surface.
+
+:doc:`ref/draw`
+ Drawing simple shapes like lines and ellipses to surfaces.
+
+:doc:`ref/event`
+ Manage the incoming events from various input devices and the windowing platform.
+
+:doc:`ref/examples`
+ Various programs demonstrating the use of individual pygame modules.
+
+:doc:`ref/font`
+ Loading and rendering TrueType fonts.
+
+:doc:`ref/freetype`
+ Enhanced pygame module for loading and rendering font faces.
+
+:doc:`ref/gfxdraw`
+ Anti-aliasing draw functions.
+
+:doc:`ref/image`
+ Loading, saving, and transferring of surfaces.
+
+:doc:`ref/joystick`
+ Manage the joystick devices.
+
+:doc:`ref/key`
+ Manage the keyboard device.
+
+:doc:`ref/locals`
+ Pygame constants.
+
+:doc:`ref/mixer`
+ Load and play sounds
+
+:doc:`ref/mouse`
+ Manage the mouse device and display.
+
+:doc:`ref/music`
+ Play streaming music tracks.
+
+:doc:`ref/pygame`
+ Top level functions to manage pygame.
+
+:doc:`ref/pixelarray`
+ Manipulate image pixel data.
+
+:doc:`ref/rect`
+ Flexible container for a rectangle.
+
+:doc:`ref/scrap`
+ Native clipboard access.
+
+:doc:`ref/sndarray`
+ Manipulate sound sample data.
+
+:doc:`ref/sprite`
+ Higher level objects to represent game images.
+
+:doc:`ref/surface`
+ Objects for images and the screen.
+
+:doc:`ref/surfarray`
+ Manipulate image pixel data.
+
+:doc:`ref/tests`
+ Test pygame.
+
+:doc:`ref/time`
+ Manage timing and framerate.
+
+:doc:`ref/transform`
+ Resize and move images.
+
+:doc:`pygame C API `
+ The C api shared amongst pygame extension modules.
+
+:ref:`search`
+ Search pygame documents by keyword.
+
+.. _Readme: ../wiki/about
+
+.. _Install: ../wiki/GettingStarted#Pygame%20Installation
+
+.. _LGPL License: LGPL.txt
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/logos.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/logos.rst.txt
new file mode 100644
index 00000000..a7ee4931
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/logos.rst.txt
@@ -0,0 +1,47 @@
+*************************************************
+ Pygame Logos Page
+*************************************************
+
+Pygame Logos
+============
+
+These logos are available for use in your own game projects.
+Please put them up wherever you see fit. The logo was created
+by TheCorruptor on July 29, 2001 and upscaled by Mega_JC on
+August 29, 2021.
+
+.. container:: fullwidth
+
+ .. image:: _static/pygame_logo.png
+
+ | `pygame_logo.svg <_static/pygame_logo.svg>`_
+ | `pygame_logo.png <_static/pygame_logo.png>`_ - 1561 x 438
+
+ .. image:: _static/pygame_lofi.png
+
+ | `pygame_lofi.svg <_static/pygame_lofi.svg>`_
+ | `pygame_lofi.png <_static/pygame_lofi.png>`_ - 1561 x 438
+
+ .. image:: _static/pygame_powered.png
+
+ | `pygame_powered.svg <_static/pygame_powered.svg>`_
+ | `pygame_powered.png <_static/pygame_powered.png>`_ - 1617 x 640
+
+ .. image:: _static/pygame_tiny.png
+
+ | `pygame_tiny.png <_static/pygame_tiny.png>`_ - 214 x 60
+
+ .. image:: _static/pygame_powered_lowres.png
+
+ | `pygame_powered_lowres.png <_static/pygame_powered_lowres.png>`_ - 101 x 40
+
+
+There is a higher resolution layered photoshop image
+available `here `_. *(1.3 MB)*
+
+Legacy logos
+------------
+
+.. container:: fullwidth
+
+ `legacy_logos.zip <_static/legacy_logos.zip>`_ - 50.1 KB
\ No newline at end of file
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/bufferproxy.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/bufferproxy.rst.txt
new file mode 100644
index 00000000..bb4e6935
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/bufferproxy.rst.txt
@@ -0,0 +1,113 @@
+.. include:: common.txt
+
+.. default-domain:: py
+
+:class:`pygame.BufferProxy`
+===========================
+
+.. currentmodule:: pygame
+
+.. class:: BufferProxy
+
+ | :sl:`pygame object to export a surface buffer through an array protocol`
+ | :sg:`BufferProxy() -> BufferProxy`
+
+ :class:`BufferProxy` is a pygame support type, designed as the return value
+ of the :meth:`Surface.get_buffer` and :meth:`Surface.get_view` methods.
+ For all Python versions a :class:`BufferProxy` object exports a C struct
+ and Python level array interface on behalf of its parent object's buffer.
+ A new buffer interface is also exported.
+ In pygame, :class:`BufferProxy` is key to implementing the
+ :mod:`pygame.surfarray` module.
+
+ :class:`BufferProxy` instances can be created directly from Python code,
+ either for a parent that exports an interface, or from a Python ``dict``
+ describing an object's buffer layout. The dict entries are based on the
+ Python level array interface mapping. The following keys are recognized:
+
+ ``"shape"`` : tuple
+ The length of each array dimension as a tuple of integers. The
+ length of the tuple is the number of dimensions in the array.
+
+ ``"typestr"`` : string
+ The array element type as a length 3 string. The first character
+ gives byteorder, '<' for little-endian, '>' for big-endian, and
+ '\|' for not applicable. The second character is the element type,
+ 'i' for signed integer, 'u' for unsigned integer, 'f' for floating
+ point, and 'V' for an chunk of bytes. The third character gives the
+ bytesize of the element, from '1' to '9' bytes. So, for example,
+ " Surface`
+ | :sg:`parent -> `
+
+ The :class:`Surface` which returned the :class:`BufferProxy` object or
+ the object passed to a :class:`BufferProxy` call.
+
+ .. attribute:: length
+
+ | :sl:`The size, in bytes, of the exported buffer.`
+ | :sg:`length -> int`
+
+ The number of valid bytes of data exported. For discontinuous data,
+ that is data which is not a single block of memory, the bytes within
+ the gaps are excluded from the count. This property is equivalent to
+ the ``Py_buffer`` C struct ``len`` field.
+
+ .. attribute:: raw
+
+ | :sl:`A copy of the exported buffer as a single block of bytes.`
+ | :sg:`raw -> bytes`
+
+ The buffer data as a ``str``/``bytes`` object.
+ Any gaps in the exported data are removed.
+
+ .. method:: write
+
+ | :sl:`Write raw bytes to object buffer.`
+ | :sg:`write(buffer, offset=0)`
+
+ Overwrite bytes in the parent object's data. The data must be C or F
+ contiguous, otherwise a ValueError is raised. Argument `buffer` is a
+ ``str``/``bytes`` object. An optional offset gives a
+ start position, in bytes, within the buffer where overwriting begins.
+ If the offset is negative or greater that or equal to the buffer proxy's
+ :attr:`length` value, an ``IndexException`` is raised.
+ If ``len(buffer) > proxy.length + offset``, a ``ValueError`` is raised.
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/camera.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/camera.rst.txt
new file mode 100644
index 00000000..a4123921
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/camera.rst.txt
@@ -0,0 +1,250 @@
+.. include:: common.txt
+
+:mod:`pygame.camera`
+====================
+
+.. module:: pygame.camera
+ :synopsis: pygame module for camera use
+
+| :sl:`pygame module for camera use`
+
+.. note::
+ Use import pygame.camera before using this module.
+
+Pygame currently supports Linux (V4L2) and Windows (MSMF) cameras natively,
+with wider platform support available via an integrated OpenCV backend.
+
+.. versionadded:: 2.0.2 Windows native camera support
+.. versionadded:: 2.0.3 New OpenCV backends
+
+EXPERIMENTAL!: This API may change or disappear in later pygame releases. If
+you use this, your code will very likely break with the next pygame release.
+
+The Bayer to ``RGB`` function is based on:
+
+::
+
+ Sonix SN9C101 based webcam basic I/F routines
+ Copyright (C) 2004 Takafumi Mizuno
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+New in pygame 1.9.0.
+
+.. function:: init
+
+ | :sl:`Module init`
+ | :sg:`init(backend = None) -> None`
+
+ This function starts up the camera module, choosing the best webcam backend
+ it can find for your system. This is not guaranteed to succeed, and may even
+ attempt to import third party modules, like `OpenCV`. If you want to
+ override its backend choice, you can call pass the name of the backend you
+ want into this function. More about backends in
+ :func:`get_backends()`.
+
+ .. versionchanged:: 2.0.3 Option to explicitly select backend
+
+ .. ## pygame.camera.init ##
+
+.. function:: get_backends
+
+ | :sl:`Get the backends supported on this system`
+ | :sg:`get_backends() -> [str]`
+
+ This function returns every backend it thinks has a possibility of working
+ on your system, in order of priority.
+
+ pygame.camera Backends:
+ ::
+
+ Backend OS Description
+ ---------------------------------------------------------------------------------
+ _camera (MSMF) Windows Builtin, works on Windows 8+ Python3
+ _camera (V4L2) Linux Builtin
+ OpenCV Any Uses `opencv-python` module, can't enumerate cameras
+ OpenCV-Mac Mac Same as OpenCV, but has camera enumeration
+ VideoCapture Windows Uses abandoned `VideoCapture` module, can't enumerate
+ cameras, may be removed in the future
+
+ There are two main differences among backends.
+
+ The _camera backends are built in to pygame itself, and require no third
+ party imports. All the other backends do. For the OpenCV and VideoCapture
+ backends, those modules need to be installed on your system.
+
+ The other big difference is "camera enumeration." Some backends don't have
+ a way to list out camera names, or even the number of cameras on the
+ system. In these cases, :func:`list_cameras()` will return
+ something like ``[0]``. If you know you have multiple cameras on the
+ system, these backend ports will pass through a "camera index number"
+ through if you use that as the ``device`` parameter.
+
+ .. versionadded:: 2.0.3
+
+ .. ## pygame.camera.get_backends ##
+
+.. function:: colorspace
+
+ | :sl:`Surface colorspace conversion`
+ | :sg:`colorspace(Surface, format, DestSurface = None) -> Surface`
+
+ Allows for conversion from "RGB" to a destination colorspace of "HSV" or
+ "YUV". The source and destination surfaces must be the same size and pixel
+ depth. This is useful for computer vision on devices with limited processing
+ power. Capture as small of an image as possible, ``transform.scale()`` it
+ even smaller, and then convert the colorspace to ``YUV`` or ``HSV`` before
+ doing any processing on it.
+
+ .. ## pygame.camera.colorspace ##
+
+.. function:: list_cameras
+
+ | :sl:`returns a list of available cameras`
+ | :sg:`list_cameras() -> [cameras]`
+
+ Checks the computer for available cameras and returns a list of strings of
+ camera names, ready to be fed into :class:`pygame.camera.Camera`.
+
+ If the camera backend doesn't support webcam enumeration, this will return
+ something like ``[0]``. See :func:`get_backends()` for much more
+ information.
+
+ .. ## pygame.camera.list_cameras ##
+
+.. class:: Camera
+
+ | :sl:`load a camera`
+ | :sg:`Camera(device, (width, height), format) -> Camera`
+
+ Loads a camera. On Linux, the device is typically something like
+ "/dev/video0". Default width and height are 640 by 480.
+ Format is the desired colorspace of the output.
+ This is useful for computer vision purposes. The default is
+ ``RGB``. The following are supported:
+
+ * ``RGB`` - Red, Green, Blue
+
+ * ``YUV`` - Luma, Blue Chrominance, Red Chrominance
+
+ * ``HSV`` - Hue, Saturation, Value
+
+ .. method:: start
+
+ | :sl:`opens, initializes, and starts capturing`
+ | :sg:`start() -> None`
+
+ Opens the camera device, attempts to initialize it, and begins recording
+ images to a buffer. The camera must be started before any of the below
+ functions can be used.
+
+ .. ## Camera.start ##
+
+ .. method:: stop
+
+ | :sl:`stops, uninitializes, and closes the camera`
+ | :sg:`stop() -> None`
+
+ Stops recording, uninitializes the camera, and closes it. Once a camera
+ is stopped, the below functions cannot be used until it is started again.
+
+ .. ## Camera.stop ##
+
+ .. method:: get_controls
+
+ | :sl:`gets current values of user controls`
+ | :sg:`get_controls() -> (hflip = bool, vflip = bool, brightness)`
+
+ If the camera supports it, get_controls will return the current settings
+ for horizontal and vertical image flip as bools and brightness as an int.
+ If unsupported, it will return the default values of (0, 0, 0). Note that
+ the return values here may be different than those returned by
+ set_controls, though these are more likely to be correct.
+
+ .. ## Camera.get_controls ##
+
+ .. method:: set_controls
+
+ | :sl:`changes camera settings if supported by the camera`
+ | :sg:`set_controls(hflip = bool, vflip = bool, brightness) -> (hflip = bool, vflip = bool, brightness)`
+
+ Allows you to change camera settings if the camera supports it. The
+ return values will be the input values if the camera claims it succeeded
+ or the values previously in use if not. Each argument is optional, and
+ the desired one can be chosen by supplying the keyword, like hflip. Note
+ that the actual settings being used by the camera may not be the same as
+ those returned by set_controls. On Windows, :code:`hflip` and :code:`vflip` are
+ implemented by pygame, not by the Camera, so they should always work, but
+ :code:`brightness` is unsupported.
+
+ .. ## Camera.set_controls ##
+
+ .. method:: get_size
+
+ | :sl:`returns the dimensions of the images being recorded`
+ | :sg:`get_size() -> (width, height)`
+
+ Returns the current dimensions of the images being captured by the
+ camera. This will return the actual size, which may be different than the
+ one specified during initialization if the camera did not support that
+ size.
+
+ .. ## Camera.get_size ##
+
+ .. method:: query_image
+
+ | :sl:`checks if a frame is ready`
+ | :sg:`query_image() -> bool`
+
+ If an image is ready to get, it returns true. Otherwise it returns false.
+ Note that some webcams will always return False and will only queue a
+ frame when called with a blocking function like :func:`get_image()`.
+ On Windows (MSMF), and the OpenCV backends, :func:`query_image()`
+ should be reliable, though. This is useful to separate the framerate of
+ the game from that of the camera without having to use threading.
+
+ .. ## Camera.query_image ##
+
+ .. method:: get_image
+
+ | :sl:`captures an image as a Surface`
+ | :sg:`get_image(Surface = None) -> Surface`
+
+ Pulls an image off of the buffer as an ``RGB`` Surface. It can optionally
+ reuse an existing Surface to save time. The bit-depth of the surface is
+ 24 bits on Linux, 32 bits on Windows, or the same as the optionally
+ supplied Surface.
+
+ .. ## Camera.get_image ##
+
+ .. method:: get_raw
+
+ | :sl:`returns an unmodified image as bytes`
+ | :sg:`get_raw() -> bytes`
+
+ Gets an image from a camera as a string in the native pixelformat of the
+ camera. Useful for integration with other libraries. This returns a
+ bytes object
+
+ .. ## Camera.get_raw ##
+
+ .. ## pygame.camera.Camera ##
+
+.. ## pygame.camera ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/cdrom.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/cdrom.rst.txt
new file mode 100644
index 00000000..62688c9d
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/cdrom.rst.txt
@@ -0,0 +1,310 @@
+.. include:: common.txt
+
+:mod:`pygame.cdrom`
+===================
+
+.. module:: pygame.cdrom
+ :synopsis: pygame module for audio cdrom control
+
+| :sl:`pygame module for audio cdrom control`
+
+.. warning::
+ This module is non functional in pygame 2.0 and above, unless you have manually compiled pygame with SDL1.
+ This module will not be supported in the future.
+ One alternative for python cdrom functionality is `pycdio `_.
+
+The cdrom module manages the ``CD`` and ``DVD`` drives on a computer. It can
+also control the playback of audio CDs. This module needs to be initialized
+before it can do anything. Each ``CD`` object you create represents a cdrom
+drive and must also be initialized individually before it can do most things.
+
+.. function:: init
+
+ | :sl:`initialize the cdrom module`
+ | :sg:`init() -> None`
+
+ Initialize the cdrom module. This will scan the system for all ``CD``
+ devices. The module must be initialized before any other functions will
+ work. This automatically happens when you call ``pygame.init()``.
+
+ It is safe to call this function more than once.
+
+ .. ## pygame.cdrom.init ##
+
+.. function:: quit
+
+ | :sl:`uninitialize the cdrom module`
+ | :sg:`quit() -> None`
+
+ Uninitialize the cdrom module. After you call this any existing ``CD``
+ objects will no longer work.
+
+ It is safe to call this function more than once.
+
+ .. ## pygame.cdrom.quit ##
+
+.. function:: get_init
+
+ | :sl:`true if the cdrom module is initialized`
+ | :sg:`get_init() -> bool`
+
+ Test if the cdrom module is initialized or not. This is different than the
+ ``CD.init()`` since each drive must also be initialized individually.
+
+ .. ## pygame.cdrom.get_init ##
+
+.. function:: get_count
+
+ | :sl:`number of cd drives on the system`
+ | :sg:`get_count() -> count`
+
+ Return the number of cd drives on the system. When you create ``CD`` objects
+ you need to pass an integer id that must be lower than this count. The count
+ will be 0 if there are no drives on the system.
+
+ .. ## pygame.cdrom.get_count ##
+
+.. class:: CD
+
+ | :sl:`class to manage a cdrom drive`
+ | :sg:`CD(id) -> CD`
+
+ You can create a ``CD`` object for each cdrom on the system. Use
+ ``pygame.cdrom.get_count()`` to determine how many drives actually exist.
+ The id argument is an integer of the drive, starting at zero.
+
+ The ``CD`` object is not initialized, you can only call ``CD.get_id()`` and
+ ``CD.get_name()`` on an uninitialized drive.
+
+ It is safe to create multiple ``CD`` objects for the same drive, they will
+ all cooperate normally.
+
+ .. method:: init
+
+ | :sl:`initialize a cdrom drive for use`
+ | :sg:`init() -> None`
+
+ Initialize the cdrom drive for use. The drive must be initialized for
+ most ``CD`` methods to work. Even if the rest of pygame has been
+ initialized.
+
+ There may be a brief pause while the drive is initialized. Avoid
+ ``CD.init()`` if the program should not stop for a second or two.
+
+ .. ## CD.init ##
+
+ .. method:: quit
+
+ | :sl:`uninitialize a cdrom drive for use`
+ | :sg:`quit() -> None`
+
+ Uninitialize a drive for use. Call this when your program will not be
+ accessing the drive for awhile.
+
+ .. ## CD.quit ##
+
+ .. method:: get_init
+
+ | :sl:`true if this cd device initialized`
+ | :sg:`get_init() -> bool`
+
+ Test if this ``CDROM`` device is initialized. This is different than the
+ ``pygame.cdrom.init()`` since each drive must also be initialized
+ individually.
+
+ .. ## CD.get_init ##
+
+ .. method:: play
+
+ | :sl:`start playing audio`
+ | :sg:`play(track, start=None, end=None) -> None`
+
+ Playback audio from an audio cdrom in the drive. Besides the track number
+ argument, you can also pass a starting and ending time for playback. The
+ start and end time are in seconds, and can limit the section of an audio
+ track played.
+
+ If you pass a start time but no end, the audio will play to the end of
+ the track. If you pass a start time and 'None' for the end time, the
+ audio will play to the end of the entire disc.
+
+ See the ``CD.get_numtracks()`` and ``CD.get_track_audio()`` to find
+ tracks to playback.
+
+ Note, track 0 is the first track on the ``CD``. Track numbers start at
+ zero.
+
+ .. ## CD.play ##
+
+ .. method:: stop
+
+ | :sl:`stop audio playback`
+ | :sg:`stop() -> None`
+
+ Stops playback of audio from the cdrom. This will also lose the current
+ playback position. This method does nothing if the drive isn't already
+ playing audio.
+
+ .. ## CD.stop ##
+
+ .. method:: pause
+
+ | :sl:`temporarily stop audio playback`
+ | :sg:`pause() -> None`
+
+ Temporarily stop audio playback on the ``CD``. The playback can be
+ resumed at the same point with the ``CD.resume()`` method. If the ``CD``
+ is not playing this method does nothing.
+
+ Note, track 0 is the first track on the ``CD``. Track numbers start at
+ zero.
+
+ .. ## CD.pause ##
+
+ .. method:: resume
+
+ | :sl:`unpause audio playback`
+ | :sg:`resume() -> None`
+
+ Unpause a paused ``CD``. If the ``CD`` is not paused or already playing,
+ this method does nothing.
+
+ .. ## CD.resume ##
+
+ .. method:: eject
+
+ | :sl:`eject or open the cdrom drive`
+ | :sg:`eject() -> None`
+
+ This will open the cdrom drive and eject the cdrom. If the drive is
+ playing or paused it will be stopped.
+
+ .. ## CD.eject ##
+
+ .. method:: get_id
+
+ | :sl:`the index of the cdrom drive`
+ | :sg:`get_id() -> id`
+
+ Returns the integer id that was used to create the ``CD`` instance. This
+ method can work on an uninitialized ``CD``.
+
+ .. ## CD.get_id ##
+
+ .. method:: get_name
+
+ | :sl:`the system name of the cdrom drive`
+ | :sg:`get_name() -> name`
+
+ Return the string name of the drive. This is the system name used to
+ represent the drive. It is often the drive letter or device name. This
+ method can work on an uninitialized ``CD``.
+
+ .. ## CD.get_name ##
+
+ .. method:: get_busy
+
+ | :sl:`true if the drive is playing audio`
+ | :sg:`get_busy() -> bool`
+
+ Returns True if the drive busy playing back audio.
+
+ .. ## CD.get_busy ##
+
+ .. method:: get_paused
+
+ | :sl:`true if the drive is paused`
+ | :sg:`get_paused() -> bool`
+
+ Returns True if the drive is currently paused.
+
+ .. ## CD.get_paused ##
+
+ .. method:: get_current
+
+ | :sl:`the current audio playback position`
+ | :sg:`get_current() -> track, seconds`
+
+ Returns both the current track and time of that track. This method works
+ when the drive is either playing or paused.
+
+ Note, track 0 is the first track on the ``CD``. Track numbers start at
+ zero.
+
+ .. ## CD.get_current ##
+
+ .. method:: get_empty
+
+ | :sl:`False if a cdrom is in the drive`
+ | :sg:`get_empty() -> bool`
+
+ Return False if there is a cdrom currently in the drive. If the drive is
+ empty this will return True.
+
+ .. ## CD.get_empty ##
+
+ .. method:: get_numtracks
+
+ | :sl:`the number of tracks on the cdrom`
+ | :sg:`get_numtracks() -> count`
+
+ Return the number of tracks on the cdrom in the drive. This will return
+ zero of the drive is empty or has no tracks.
+
+ .. ## CD.get_numtracks ##
+
+ .. method:: get_track_audio
+
+ | :sl:`true if the cdrom track has audio data`
+ | :sg:`get_track_audio(track) -> bool`
+
+ Determine if a track on a cdrom contains audio data. You can also call
+ ``CD.num_tracks()`` and ``CD.get_all()`` to determine more information
+ about the cdrom.
+
+ Note, track 0 is the first track on the ``CD``. Track numbers start at
+ zero.
+
+ .. ## CD.get_track_audio ##
+
+ .. method:: get_all
+
+ | :sl:`get all track information`
+ | :sg:`get_all() -> [(audio, start, end, length), ...]`
+
+ Return a list with information for every track on the cdrom. The
+ information consists of a tuple with four values. The audio value is True
+ if the track contains audio data. The start, end, and length values are
+ floating point numbers in seconds. Start and end represent absolute times
+ on the entire disc.
+
+ .. ## CD.get_all ##
+
+ .. method:: get_track_start
+
+ | :sl:`start time of a cdrom track`
+ | :sg:`get_track_start(track) -> seconds`
+
+ Return the absolute time in seconds where at start of the cdrom track.
+
+ Note, track 0 is the first track on the ``CD``. Track numbers start at
+ zero.
+
+ .. ## CD.get_track_start ##
+
+ .. method:: get_track_length
+
+ | :sl:`length of a cdrom track`
+ | :sg:`get_track_length(track) -> seconds`
+
+ Return a floating point value in seconds of the length of the cdrom
+ track.
+
+ Note, track 0 is the first track on the ``CD``. Track numbers start at
+ zero.
+
+ .. ## CD.get_track_length ##
+
+ .. ## pygame.cdrom.CD ##
+
+.. ## pygame.cdrom ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/color.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/color.rst.txt
new file mode 100644
index 00000000..fc5c123a
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/color.rst.txt
@@ -0,0 +1,283 @@
+.. include:: common.txt
+
+:mod:`pygame.Color`
+===================
+
+.. currentmodule:: pygame
+
+.. class:: Color
+
+ | :sl:`pygame object for color representations`
+ | :sg:`Color(r, g, b) -> Color`
+ | :sg:`Color(r, g, b, a=255) -> Color`
+ | :sg:`Color(color_value) -> Color`
+
+ The ``Color`` class represents ``RGBA`` color values using a value range of
+ 0 to 255 inclusive. It allows basic arithmetic operations — binary
+ operations ``+``, ``-``, ``*``, ``//``, ``%``, and unary operation ``~`` — to
+ create new colors, supports conversions to other color spaces such as ``HSV``
+ or ``HSL`` and lets you adjust single color channels.
+ Alpha defaults to 255 (fully opaque) when not given.
+ The arithmetic operations and ``correct_gamma()`` method preserve subclasses.
+ For the binary operators, the class of the returned color is that of the
+ left hand color object of the operator.
+
+ Color objects support equality comparison with other color objects and 3 or
+ 4 element tuples of integers. There was a bug in pygame 1.8.1
+ where the default alpha was 0, not 255 like previously.
+
+ Color objects export the C level array interface. The interface exports a
+ read-only one dimensional unsigned byte array of the same assigned length
+ as the color. The new buffer interface is also exported, with the same
+ characteristics as the array interface.
+
+ The floor division, ``//``, and modulus, ``%``, operators do not raise
+ an exception for division by zero. Instead, if a color, or alpha, channel
+ in the right hand color is 0, then the result is 0. For example: ::
+
+ # These expressions are True
+ Color(255, 255, 255, 255) // Color(0, 64, 64, 64) == Color(0, 3, 3, 3)
+ Color(255, 255, 255, 255) % Color(64, 64, 64, 0) == Color(63, 63, 63, 0)
+
+ Use ``int(color)`` to return the immutable integer value of the color,
+ usable as a ``dict`` key. This integer value differs from the mapped
+ pixel values of :meth:`pygame.Surface.get_at_mapped`,
+ :meth:`pygame.Surface.map_rgb` and :meth:`pygame.Surface.unmap_rgb`.
+ It can be passed as a ``color_value`` argument to :class:`Color`
+ (useful with sets).
+
+ See :doc:`color_list` for samples of the available named colors.
+
+ :param int r: red value in the range of 0 to 255 inclusive
+ :param int g: green value in the range of 0 to 255 inclusive
+ :param int b: blue value in the range of 0 to 255 inclusive
+ :param int a: (optional) alpha value in the range of 0 to 255 inclusive,
+ default is 255
+ :param color_value: color value (see note below for the supported formats)
+
+ .. note::
+ Supported ``color_value`` formats:
+ | - **Color object:** clones the given :class:`Color` object
+ | - **Color name: str:** name of the color to use, e.g. ``'red'``
+ (all the supported name strings can be found in the
+ :doc:`color_list`, with sample swatches)
+ | - **HTML color format str:** ``'#rrggbbaa'`` or ``'#rrggbb'``,
+ where rr, gg, bb, and aa are 2-digit hex numbers in the range
+ of 0 to 0xFF inclusive, the aa (alpha) value defaults to 0xFF
+ if not provided
+ | - **hex number str:** ``'0xrrggbbaa'`` or ``'0xrrggbb'``, where
+ rr, gg, bb, and aa are 2-digit hex numbers in the range of 0x00
+ to 0xFF inclusive, the aa (alpha) value defaults to 0xFF if not
+ provided
+ | - **int:** int value of the color to use, using hex numbers can
+ make this parameter more readable, e.g. ``0xrrggbbaa``, where rr,
+ gg, bb, and aa are 2-digit hex numbers in the range of 0x00 to
+ 0xFF inclusive, note that the aa (alpha) value is not optional for
+ the int format and must be provided
+ | - **tuple/list of int color values:** ``(R, G, B, A)`` or
+ ``(R, G, B)``, where R, G, B, and A are int values in the range of
+ 0 to 255 inclusive, the A (alpha) value defaults to 255 if not
+ provided
+
+ :type color_value: Color or str or int or tuple(int, int, int, [int]) or
+ list(int, int, int, [int])
+
+ :returns: a newly created :class:`Color` object
+ :rtype: Color
+
+ .. versionchanged:: 2.0.0
+ Support for tuples, lists, and :class:`Color` objects when creating
+ :class:`Color` objects.
+ .. versionchanged:: 1.9.2 Color objects export the C level array interface.
+ .. versionchanged:: 1.9.0 Color objects support 4-element tuples of integers.
+ .. versionchanged:: 1.8.1 New implementation of the class.
+
+ .. attribute:: r
+
+ | :sl:`Gets or sets the red value of the Color.`
+ | :sg:`r -> int`
+
+ The red value of the Color.
+
+ .. ## Color.r ##
+
+ .. attribute:: g
+
+ | :sl:`Gets or sets the green value of the Color.`
+ | :sg:`g -> int`
+
+ The green value of the Color.
+
+ .. ## Color.g ##
+
+ .. attribute:: b
+
+ | :sl:`Gets or sets the blue value of the Color.`
+ | :sg:`b -> int`
+
+ The blue value of the Color.
+
+ .. ## Color.b ##
+
+ .. attribute:: a
+
+ | :sl:`Gets or sets the alpha value of the Color.`
+ | :sg:`a -> int`
+
+ The alpha value of the Color.
+
+ .. ## Color.a ##
+
+ .. attribute:: cmy
+
+ | :sl:`Gets or sets the CMY representation of the Color.`
+ | :sg:`cmy -> tuple`
+
+ The ``CMY`` representation of the Color. The ``CMY`` components are in
+ the ranges ``C`` = [0, 1], ``M`` = [0, 1], ``Y`` = [0, 1]. Note that this
+ will not return the absolutely exact ``CMY`` values for the set ``RGB``
+ values in all cases. Due to the ``RGB`` mapping from 0-255 and the
+ ``CMY`` mapping from 0-1 rounding errors may cause the ``CMY`` values to
+ differ slightly from what you might expect.
+
+ .. ## Color.cmy ##
+
+ .. attribute:: hsva
+
+ | :sl:`Gets or sets the HSVA representation of the Color.`
+ | :sg:`hsva -> tuple`
+
+ The ``HSVA`` representation of the Color. The ``HSVA`` components are in
+ the ranges ``H`` = [0, 360], ``S`` = [0, 100], ``V`` = [0, 100], A = [0,
+ 100]. Note that this will not return the absolutely exact ``HSV`` values
+ for the set ``RGB`` values in all cases. Due to the ``RGB`` mapping from
+ 0-255 and the ``HSV`` mapping from 0-100 and 0-360 rounding errors may
+ cause the ``HSV`` values to differ slightly from what you might expect.
+
+ .. ## Color.hsva ##
+
+ .. attribute:: hsla
+
+ | :sl:`Gets or sets the HSLA representation of the Color.`
+ | :sg:`hsla -> tuple`
+
+ The ``HSLA`` representation of the Color. The ``HSLA`` components are in
+ the ranges ``H`` = [0, 360], ``S`` = [0, 100], ``L`` = [0, 100], A = [0,
+ 100]. Note that this will not return the absolutely exact ``HSL`` values
+ for the set ``RGB`` values in all cases. Due to the ``RGB`` mapping from
+ 0-255 and the ``HSL`` mapping from 0-100 and 0-360 rounding errors may
+ cause the ``HSL`` values to differ slightly from what you might expect.
+
+ .. ## Color.hsla ##
+
+ .. attribute:: i1i2i3
+
+ | :sl:`Gets or sets the I1I2I3 representation of the Color.`
+ | :sg:`i1i2i3 -> tuple`
+
+ The ``I1I2I3`` representation of the Color. The ``I1I2I3`` components are
+ in the ranges ``I1`` = [0, 1], ``I2`` = [-0.5, 0.5], ``I3`` = [-0.5,
+ 0.5]. Note that this will not return the absolutely exact ``I1I2I3``
+ values for the set ``RGB`` values in all cases. Due to the ``RGB``
+ mapping from 0-255 and the ``I1I2I3`` mapping from 0-1 rounding errors
+ may cause the ``I1I2I3`` values to differ slightly from what you might
+ expect.
+
+ .. ## Color.i1i2i3 ##
+
+ .. method:: normalize
+
+ | :sl:`Returns the normalized RGBA values of the Color.`
+ | :sg:`normalize() -> tuple`
+
+ Returns the normalized ``RGBA`` values of the Color as floating point
+ values.
+
+ .. ## Color.normalize ##
+
+ .. method:: correct_gamma
+
+ | :sl:`Applies a certain gamma value to the Color.`
+ | :sg:`correct_gamma (gamma) -> Color`
+
+ Applies a certain gamma value to the Color and returns a new Color with
+ the adjusted ``RGBA`` values.
+
+ .. ## Color.correct_gamma ##
+
+ .. method:: set_length
+
+ | :sl:`Set the number of elements in the Color to 1,2,3, or 4.`
+ | :sg:`set_length(len) -> None`
+
+ DEPRECATED: You may unpack the values you need like so,
+ ``r, g, b, _ = pygame.Color(100, 100, 100)``
+ If you only want r, g and b
+ Or
+ ``r, g, *_ = pygame.Color(100, 100, 100)``
+ if you only want r and g
+
+ The default Color length is 4. Colors can have lengths 1,2,3 or 4. This
+ is useful if you want to unpack to r,g,b and not r,g,b,a. If you want to
+ get the length of a Color do ``len(acolor)``.
+
+ .. deprecated:: 2.1.3
+ .. versionadded:: 1.9.0
+
+ .. ## Color.set_length ##
+
+ .. method:: grayscale
+
+ | :sl:`returns the grayscale of a Color`
+ | :sg:`grayscale() -> Color`
+
+ Returns a Color which represents the grayscaled version of self using the luminosity formula which weights red, green and blue according to their wavelengths..
+
+ .. ## Color.grayscale ##
+
+ .. method:: lerp
+
+ | :sl:`returns a linear interpolation to the given Color.`
+ | :sg:`lerp(Color, float) -> Color`
+
+ Returns a Color which is a linear interpolation between self and the
+ given Color in RGBA space. The second parameter determines how far
+ between self and other the result is going to be.
+ It must be a value between 0 and 1 where 0 means self and 1 means
+ other will be returned.
+
+ .. versionadded:: 2.0.1
+
+ .. ## Color.lerp ##
+
+ .. method:: premul_alpha
+
+ | :sl:`returns a Color where the r,g,b components have been multiplied by the alpha.`
+ | :sg:`premul_alpha() -> Color`
+
+ Returns a new Color where each of the red, green and blue colour
+ channels have been multiplied by the alpha channel of the original
+ color. The alpha channel remains unchanged.
+
+ This is useful when working with the ``BLEND_PREMULTIPLIED`` blending mode
+ flag for :meth:`pygame.Surface.blit()`, which assumes that all surfaces using
+ it are using pre-multiplied alpha colors.
+
+ .. versionadded:: 2.0.0
+
+ .. ## Color.premul_alpha ##
+
+ .. method:: update
+
+ | :sl:`Sets the elements of the color`
+ | :sg:`update(r, g, b) -> None`
+ | :sg:`update(r, g, b, a=255) -> None`
+ | :sg:`update(color_value) -> None`
+
+ Sets the elements of the color. See parameters for :meth:`pygame.Color` for the
+ parameters of this function. If the alpha value was not set it will not change.
+
+ .. versionadded:: 2.0.1
+
+ .. ## Color.update ##
+ .. ## pygame.Color ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/color_list.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/color_list.rst.txt
new file mode 100644
index 00000000..b6cf2895
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/color_list.rst.txt
@@ -0,0 +1,2014 @@
+.. include:: common.txt
+
+Named Colors
+============
+
+.. raw:: html
+
+
+
+:doc:`color` lets you specify any of these named colors when creating a new
+``pygame.Color`` (taken from the
+`colordict module `_).
+
+.. role:: aliceblue
+.. role:: antiquewhite
+.. role:: antiquewhite1
+.. role:: antiquewhite2
+.. role:: antiquewhite3
+.. role:: antiquewhite4
+.. role:: aqua
+.. role:: aquamarine
+.. role:: aquamarine1
+.. role:: aquamarine2
+.. role:: aquamarine3
+.. role:: aquamarine4
+.. role:: azure
+.. role:: azure1
+.. role:: azure2
+.. role:: azure3
+.. role:: azure4
+.. role:: beige
+.. role:: bisque
+.. role:: bisque1
+.. role:: bisque2
+.. role:: bisque3
+.. role:: bisque4
+.. role:: black
+.. role:: blanchedalmond
+.. role:: blue
+.. role:: blue1
+.. role:: blue2
+.. role:: blue3
+.. role:: blue4
+.. role:: blueviolet
+.. role:: brown
+.. role:: brown1
+.. role:: brown2
+.. role:: brown3
+.. role:: brown4
+.. role:: burlywood
+.. role:: burlywood1
+.. role:: burlywood2
+.. role:: burlywood3
+.. role:: burlywood4
+.. role:: cadetblue
+.. role:: cadetblue1
+.. role:: cadetblue2
+.. role:: cadetblue3
+.. role:: cadetblue4
+.. role:: chartreuse
+.. role:: chartreuse1
+.. role:: chartreuse2
+.. role:: chartreuse3
+.. role:: chartreuse4
+.. role:: chocolate
+.. role:: chocolate1
+.. role:: chocolate2
+.. role:: chocolate3
+.. role:: chocolate4
+.. role:: coral
+.. role:: coral1
+.. role:: coral2
+.. role:: coral3
+.. role:: coral4
+.. role:: cornflowerblue
+.. role:: cornsilk
+.. role:: cornsilk1
+.. role:: cornsilk2
+.. role:: cornsilk3
+.. role:: cornsilk4
+.. role:: crimson
+.. role:: cyan
+.. role:: cyan1
+.. role:: cyan2
+.. role:: cyan3
+.. role:: cyan4
+.. role:: darkblue
+.. role:: darkcyan
+.. role:: darkgoldenrod
+.. role:: darkgoldenrod1
+.. role:: darkgoldenrod2
+.. role:: darkgoldenrod3
+.. role:: darkgoldenrod4
+.. role:: darkgray
+.. role:: darkgreen
+.. role:: darkgrey
+.. role:: darkkhaki
+.. role:: darkmagenta
+.. role:: darkolivegreen
+.. role:: darkolivegreen1
+.. role:: darkolivegreen2
+.. role:: darkolivegreen3
+.. role:: darkolivegreen4
+.. role:: darkorange
+.. role:: darkorange1
+.. role:: darkorange2
+.. role:: darkorange3
+.. role:: darkorange4
+.. role:: darkorchid
+.. role:: darkorchid1
+.. role:: darkorchid2
+.. role:: darkorchid3
+.. role:: darkorchid4
+.. role:: darkred
+.. role:: darksalmon
+.. role:: darkseagreen
+.. role:: darkseagreen1
+.. role:: darkseagreen2
+.. role:: darkseagreen3
+.. role:: darkseagreen4
+.. role:: darkslateblue
+.. role:: darkslategray
+.. role:: darkslategray1
+.. role:: darkslategray2
+.. role:: darkslategray3
+.. role:: darkslategray4
+.. role:: darkslategrey
+.. role:: darkturquoise
+.. role:: darkviolet
+.. role:: deeppink
+.. role:: deeppink1
+.. role:: deeppink2
+.. role:: deeppink3
+.. role:: deeppink4
+.. role:: deepskyblue
+.. role:: deepskyblue1
+.. role:: deepskyblue2
+.. role:: deepskyblue3
+.. role:: deepskyblue4
+.. role:: dimgray
+.. role:: dimgrey
+.. role:: dodgerblue
+.. role:: dodgerblue1
+.. role:: dodgerblue2
+.. role:: dodgerblue3
+.. role:: dodgerblue4
+.. role:: firebrick
+.. role:: firebrick1
+.. role:: firebrick2
+.. role:: firebrick3
+.. role:: firebrick4
+.. role:: floralwhite
+.. role:: forestgreen
+.. role:: fuchsia
+.. role:: gainsboro
+.. role:: ghostwhite
+.. role:: gold
+.. role:: gold1
+.. role:: gold2
+.. role:: gold3
+.. role:: gold4
+.. role:: goldenrod
+.. role:: goldenrod1
+.. role:: goldenrod2
+.. role:: goldenrod3
+.. role:: goldenrod4
+.. role:: gray
+.. role:: gray0
+.. role:: gray1
+.. role:: gray2
+.. role:: gray3
+.. role:: gray4
+.. role:: gray5
+.. role:: gray6
+.. role:: gray7
+.. role:: gray8
+.. role:: gray9
+.. role:: gray10
+.. role:: gray11
+.. role:: gray12
+.. role:: gray13
+.. role:: gray14
+.. role:: gray15
+.. role:: gray16
+.. role:: gray17
+.. role:: gray18
+.. role:: gray19
+.. role:: gray20
+.. role:: gray21
+.. role:: gray22
+.. role:: gray23
+.. role:: gray24
+.. role:: gray25
+.. role:: gray26
+.. role:: gray27
+.. role:: gray28
+.. role:: gray29
+.. role:: gray30
+.. role:: gray31
+.. role:: gray32
+.. role:: gray33
+.. role:: gray34
+.. role:: gray35
+.. role:: gray36
+.. role:: gray37
+.. role:: gray38
+.. role:: gray39
+.. role:: gray40
+.. role:: gray41
+.. role:: gray42
+.. role:: gray43
+.. role:: gray44
+.. role:: gray45
+.. role:: gray46
+.. role:: gray47
+.. role:: gray48
+.. role:: gray49
+.. role:: gray50
+.. role:: gray51
+.. role:: gray52
+.. role:: gray53
+.. role:: gray54
+.. role:: gray55
+.. role:: gray56
+.. role:: gray57
+.. role:: gray58
+.. role:: gray59
+.. role:: gray60
+.. role:: gray61
+.. role:: gray62
+.. role:: gray63
+.. role:: gray64
+.. role:: gray65
+.. role:: gray66
+.. role:: gray67
+.. role:: gray68
+.. role:: gray69
+.. role:: gray70
+.. role:: gray71
+.. role:: gray72
+.. role:: gray73
+.. role:: gray74
+.. role:: gray75
+.. role:: gray76
+.. role:: gray77
+.. role:: gray78
+.. role:: gray79
+.. role:: gray80
+.. role:: gray81
+.. role:: gray82
+.. role:: gray83
+.. role:: gray84
+.. role:: gray85
+.. role:: gray86
+.. role:: gray87
+.. role:: gray88
+.. role:: gray89
+.. role:: gray90
+.. role:: gray91
+.. role:: gray92
+.. role:: gray93
+.. role:: gray94
+.. role:: gray95
+.. role:: gray96
+.. role:: gray97
+.. role:: gray98
+.. role:: gray99
+.. role:: gray100
+.. role:: green
+.. role:: green1
+.. role:: green2
+.. role:: green3
+.. role:: green4
+.. role:: greenyellow
+.. role:: grey
+.. role:: grey0
+.. role:: grey1
+.. role:: grey2
+.. role:: grey3
+.. role:: grey4
+.. role:: grey5
+.. role:: grey6
+.. role:: grey7
+.. role:: grey8
+.. role:: grey9
+.. role:: grey10
+.. role:: grey11
+.. role:: grey12
+.. role:: grey13
+.. role:: grey14
+.. role:: grey15
+.. role:: grey16
+.. role:: grey17
+.. role:: grey18
+.. role:: grey19
+.. role:: grey20
+.. role:: grey21
+.. role:: grey22
+.. role:: grey23
+.. role:: grey24
+.. role:: grey25
+.. role:: grey26
+.. role:: grey27
+.. role:: grey28
+.. role:: grey29
+.. role:: grey30
+.. role:: grey31
+.. role:: grey32
+.. role:: grey33
+.. role:: grey34
+.. role:: grey35
+.. role:: grey36
+.. role:: grey37
+.. role:: grey38
+.. role:: grey39
+.. role:: grey40
+.. role:: grey41
+.. role:: grey42
+.. role:: grey43
+.. role:: grey44
+.. role:: grey45
+.. role:: grey46
+.. role:: grey47
+.. role:: grey48
+.. role:: grey49
+.. role:: grey50
+.. role:: grey51
+.. role:: grey52
+.. role:: grey53
+.. role:: grey54
+.. role:: grey55
+.. role:: grey56
+.. role:: grey57
+.. role:: grey58
+.. role:: grey59
+.. role:: grey60
+.. role:: grey61
+.. role:: grey62
+.. role:: grey63
+.. role:: grey64
+.. role:: grey65
+.. role:: grey66
+.. role:: grey67
+.. role:: grey68
+.. role:: grey69
+.. role:: grey70
+.. role:: grey71
+.. role:: grey72
+.. role:: grey73
+.. role:: grey74
+.. role:: grey75
+.. role:: grey76
+.. role:: grey77
+.. role:: grey78
+.. role:: grey79
+.. role:: grey80
+.. role:: grey81
+.. role:: grey82
+.. role:: grey83
+.. role:: grey84
+.. role:: grey85
+.. role:: grey86
+.. role:: grey87
+.. role:: grey88
+.. role:: grey89
+.. role:: grey90
+.. role:: grey91
+.. role:: grey92
+.. role:: grey93
+.. role:: grey94
+.. role:: grey95
+.. role:: grey96
+.. role:: grey97
+.. role:: grey98
+.. role:: grey99
+.. role:: grey100
+.. role:: honeydew
+.. role:: honeydew1
+.. role:: honeydew2
+.. role:: honeydew3
+.. role:: honeydew4
+.. role:: hotpink
+.. role:: hotpink1
+.. role:: hotpink2
+.. role:: hotpink3
+.. role:: hotpink4
+.. role:: indianred
+.. role:: indianred1
+.. role:: indianred2
+.. role:: indianred3
+.. role:: indianred4
+.. role:: indigo
+.. role:: ivory
+.. role:: ivory1
+.. role:: ivory2
+.. role:: ivory3
+.. role:: ivory4
+.. role:: khaki
+.. role:: khaki1
+.. role:: khaki2
+.. role:: khaki3
+.. role:: khaki4
+.. role:: lavender
+.. role:: lavenderblush
+.. role:: lavenderblush1
+.. role:: lavenderblush2
+.. role:: lavenderblush3
+.. role:: lavenderblush4
+.. role:: lawngreen
+.. role:: lemonchiffon
+.. role:: lemonchiffon1
+.. role:: lemonchiffon2
+.. role:: lemonchiffon3
+.. role:: lemonchiffon4
+.. role:: lightblue
+.. role:: lightblue1
+.. role:: lightblue2
+.. role:: lightblue3
+.. role:: lightblue4
+.. role:: lightcoral
+.. role:: lightcyan
+.. role:: lightcyan1
+.. role:: lightcyan2
+.. role:: lightcyan3
+.. role:: lightcyan4
+.. role:: lightgoldenrod
+.. role:: lightgoldenrod1
+.. role:: lightgoldenrod2
+.. role:: lightgoldenrod3
+.. role:: lightgoldenrod4
+.. role:: lightgoldenrodyellow
+.. role:: lightgray
+.. role:: lightgreen
+.. role:: lightgrey
+.. role:: lightpink
+.. role:: lightpink1
+.. role:: lightpink2
+.. role:: lightpink3
+.. role:: lightpink4
+.. role:: lightsalmon
+.. role:: lightsalmon1
+.. role:: lightsalmon2
+.. role:: lightsalmon3
+.. role:: lightsalmon4
+.. role:: lightseagreen
+.. role:: lightskyblue
+.. role:: lightskyblue1
+.. role:: lightskyblue2
+.. role:: lightskyblue3
+.. role:: lightskyblue4
+.. role:: lightslateblue
+.. role:: lightslategray
+.. role:: lightslategrey
+.. role:: lightsteelblue
+.. role:: lightsteelblue1
+.. role:: lightsteelblue2
+.. role:: lightsteelblue3
+.. role:: lightsteelblue4
+.. role:: lightyellow
+.. role:: lightyellow1
+.. role:: lightyellow2
+.. role:: lightyellow3
+.. role:: lightyellow4
+.. role:: limegreen
+.. role:: lime
+.. role:: linen
+.. role:: magenta
+.. role:: magenta1
+.. role:: magenta2
+.. role:: magenta3
+.. role:: magenta4
+.. role:: maroon
+.. role:: maroon1
+.. role:: maroon2
+.. role:: maroon3
+.. role:: maroon4
+.. role:: mediumaquamarine
+.. role:: mediumblue
+.. role:: mediumorchid
+.. role:: mediumorchid1
+.. role:: mediumorchid2
+.. role:: mediumorchid3
+.. role:: mediumorchid4
+.. role:: mediumpurple
+.. role:: mediumpurple1
+.. role:: mediumpurple2
+.. role:: mediumpurple3
+.. role:: mediumpurple4
+.. role:: mediumseagreen
+.. role:: mediumslateblue
+.. role:: mediumspringgreen
+.. role:: mediumturquoise
+.. role:: mediumvioletred
+.. role:: midnightblue
+.. role:: mintcream
+.. role:: mistyrose
+.. role:: mistyrose1
+.. role:: mistyrose2
+.. role:: mistyrose3
+.. role:: mistyrose4
+.. role:: moccasin
+.. role:: navajowhite
+.. role:: navajowhite1
+.. role:: navajowhite2
+.. role:: navajowhite3
+.. role:: navajowhite4
+.. role:: navy
+.. role:: navyblue
+.. role:: oldlace
+.. role:: olive
+.. role:: olivedrab
+.. role:: olivedrab1
+.. role:: olivedrab2
+.. role:: olivedrab3
+.. role:: olivedrab4
+.. role:: orange
+.. role:: orange1
+.. role:: orange2
+.. role:: orange3
+.. role:: orange4
+.. role:: orangered
+.. role:: orangered1
+.. role:: orangered2
+.. role:: orangered3
+.. role:: orangered4
+.. role:: orchid
+.. role:: orchid1
+.. role:: orchid2
+.. role:: orchid3
+.. role:: orchid4
+.. role:: palegoldenrod
+.. role:: palegreen
+.. role:: palegreen1
+.. role:: palegreen2
+.. role:: palegreen3
+.. role:: palegreen4
+.. role:: paleturquoise
+.. role:: paleturquoise1
+.. role:: paleturquoise2
+.. role:: paleturquoise3
+.. role:: paleturquoise4
+.. role:: palevioletred
+.. role:: palevioletred1
+.. role:: palevioletred2
+.. role:: palevioletred3
+.. role:: palevioletred4
+.. role:: papayawhip
+.. role:: peachpuff
+.. role:: peachpuff1
+.. role:: peachpuff2
+.. role:: peachpuff3
+.. role:: peachpuff4
+.. role:: peru
+.. role:: pink
+.. role:: pink1
+.. role:: pink2
+.. role:: pink3
+.. role:: pink4
+.. role:: plum
+.. role:: plum1
+.. role:: plum2
+.. role:: plum3
+.. role:: plum4
+.. role:: powderblue
+.. role:: purple
+.. role:: purple1
+.. role:: purple2
+.. role:: purple3
+.. role:: purple4
+.. role:: red
+.. role:: red1
+.. role:: red2
+.. role:: red3
+.. role:: red4
+.. role:: rosybrown
+.. role:: rosybrown1
+.. role:: rosybrown2
+.. role:: rosybrown3
+.. role:: rosybrown4
+.. role:: royalblue
+.. role:: royalblue1
+.. role:: royalblue2
+.. role:: royalblue3
+.. role:: royalblue4
+.. role:: saddlebrown
+.. role:: salmon
+.. role:: salmon1
+.. role:: salmon2
+.. role:: salmon3
+.. role:: salmon4
+.. role:: sandybrown
+.. role:: seagreen
+.. role:: seagreen1
+.. role:: seagreen2
+.. role:: seagreen3
+.. role:: seagreen4
+.. role:: seashell
+.. role:: seashell1
+.. role:: seashell2
+.. role:: seashell3
+.. role:: seashell4
+.. role:: sienna
+.. role:: sienna1
+.. role:: sienna2
+.. role:: sienna3
+.. role:: sienna4
+.. role:: silver
+.. role:: skyblue
+.. role:: skyblue1
+.. role:: skyblue2
+.. role:: skyblue3
+.. role:: skyblue4
+.. role:: slateblue
+.. role:: slateblue1
+.. role:: slateblue2
+.. role:: slateblue3
+.. role:: slateblue4
+.. role:: slategray
+.. role:: slategray1
+.. role:: slategray2
+.. role:: slategray3
+.. role:: slategray4
+.. role:: slategrey
+.. role:: snow
+.. role:: snow1
+.. role:: snow2
+.. role:: snow3
+.. role:: snow4
+.. role:: springgreen
+.. role:: springgreen1
+.. role:: springgreen2
+.. role:: springgreen3
+.. role:: springgreen4
+.. role:: steelblue
+.. role:: steelblue1
+.. role:: steelblue2
+.. role:: steelblue3
+.. role:: steelblue4
+.. role:: tan
+.. role:: tan1
+.. role:: tan2
+.. role:: tan3
+.. role:: tan4
+.. role:: teal
+.. role:: thistle
+.. role:: thistle1
+.. role:: thistle2
+.. role:: thistle3
+.. role:: thistle4
+.. role:: tomato
+.. role:: tomato1
+.. role:: tomato2
+.. role:: tomato3
+.. role:: tomato4
+.. role:: turquoise
+.. role:: turquoise1
+.. role:: turquoise2
+.. role:: turquoise3
+.. role:: turquoise4
+.. role:: violet
+.. role:: violetred
+.. role:: violetred1
+.. role:: violetred2
+.. role:: violetred3
+.. role:: violetred4
+.. role:: wheat
+.. role:: wheat1
+.. role:: wheat2
+.. role:: wheat3
+.. role:: wheat4
+.. role:: white
+.. role:: whitesmoke
+.. role:: yellow
+.. role:: yellow1
+.. role:: yellow2
+.. role:: yellow3
+.. role:: yellow4
+.. role:: yellowgreen
+
+========================== ======================================================================================================
+Name Color
+========================== ======================================================================================================
+``aliceblue`` :aliceblue:`████████`
+``antiquewhite`` :antiquewhite:`████████`
+``antiquewhite1`` :antiquewhite1:`████████`
+``antiquewhite2`` :antiquewhite2:`████████`
+``antiquewhite3`` :antiquewhite3:`████████`
+``antiquewhite4`` :antiquewhite4:`████████`
+``aqua`` :aqua:`████████`
+``aquamarine`` :aquamarine:`████████`
+``aquamarine1`` :aquamarine1:`████████`
+``aquamarine2`` :aquamarine2:`████████`
+``aquamarine3`` :aquamarine3:`████████`
+``aquamarine4`` :aquamarine4:`████████`
+``azure`` :azure:`████████`
+``azure1`` :azure1:`████████`
+``azure2`` :azure2:`████████`
+``azure3`` :azure3:`████████`
+``azure4`` :azure4:`████████`
+``beige`` :beige:`████████`
+``bisque`` :bisque:`████████`
+``bisque1`` :bisque1:`████████`
+``bisque2`` :bisque2:`████████`
+``bisque3`` :bisque3:`████████`
+``bisque4`` :bisque4:`████████`
+``black`` :black:`████████`
+``blanchedalmond`` :blanchedalmond:`████████`
+``blue`` :blue:`████████`
+``blue1`` :blue1:`████████`
+``blue2`` :blue2:`████████`
+``blue3`` :blue3:`████████`
+``blue4`` :blue4:`████████`
+``blueviolet`` :blueviolet:`████████`
+``brown`` :brown:`████████`
+``brown1`` :brown1:`████████`
+``brown2`` :brown2:`████████`
+``brown3`` :brown3:`████████`
+``brown4`` :brown4:`████████`
+``burlywood`` :burlywood:`████████`
+``burlywood1`` :burlywood1:`████████`
+``burlywood2`` :burlywood2:`████████`
+``burlywood3`` :burlywood3:`████████`
+``burlywood4`` :burlywood4:`████████`
+``cadetblue`` :cadetblue:`████████`
+``cadetblue1`` :cadetblue1:`████████`
+``cadetblue2`` :cadetblue2:`████████`
+``cadetblue3`` :cadetblue3:`████████`
+``cadetblue4`` :cadetblue4:`████████`
+``chartreuse`` :chartreuse:`████████`
+``chartreuse1`` :chartreuse1:`████████`
+``chartreuse2`` :chartreuse2:`████████`
+``chartreuse3`` :chartreuse3:`████████`
+``chartreuse4`` :chartreuse4:`████████`
+``chocolate`` :chocolate:`████████`
+``chocolate1`` :chocolate1:`████████`
+``chocolate2`` :chocolate2:`████████`
+``chocolate3`` :chocolate3:`████████`
+``chocolate4`` :chocolate4:`████████`
+``coral`` :coral:`████████`
+``coral1`` :coral1:`████████`
+``coral2`` :coral2:`████████`
+``coral3`` :coral3:`████████`
+``coral4`` :coral4:`████████`
+``cornflowerblue`` :cornflowerblue:`████████`
+``cornsilk`` :cornsilk:`████████`
+``cornsilk1`` :cornsilk1:`████████`
+``cornsilk2`` :cornsilk2:`████████`
+``cornsilk3`` :cornsilk3:`████████`
+``cornsilk4`` :cornsilk4:`████████`
+``crimson`` :crimson:`████████`
+``cyan`` :cyan:`████████`
+``cyan1`` :cyan1:`████████`
+``cyan2`` :cyan2:`████████`
+``cyan3`` :cyan3:`████████`
+``cyan4`` :cyan4:`████████`
+``darkblue`` :darkblue:`████████`
+``darkcyan`` :darkcyan:`████████`
+``darkgoldenrod`` :darkgoldenrod:`████████`
+``darkgoldenrod1`` :darkgoldenrod1:`████████`
+``darkgoldenrod2`` :darkgoldenrod2:`████████`
+``darkgoldenrod3`` :darkgoldenrod3:`████████`
+``darkgoldenrod4`` :darkgoldenrod4:`████████`
+``darkgray`` :darkgray:`████████`
+``darkgreen`` :darkgreen:`████████`
+``darkgrey`` :darkgrey:`████████`
+``darkkhaki`` :darkkhaki:`████████`
+``darkmagenta`` :darkmagenta:`████████`
+``darkolivegreen`` :darkolivegreen:`████████`
+``darkolivegreen1`` :darkolivegreen1:`████████`
+``darkolivegreen2`` :darkolivegreen2:`████████`
+``darkolivegreen3`` :darkolivegreen3:`████████`
+``darkolivegreen4`` :darkolivegreen4:`████████`
+``darkorange`` :darkorange:`████████`
+``darkorange1`` :darkorange1:`████████`
+``darkorange2`` :darkorange2:`████████`
+``darkorange3`` :darkorange3:`████████`
+``darkorange4`` :darkorange4:`████████`
+``darkorchid`` :darkorchid:`████████`
+``darkorchid1`` :darkorchid1:`████████`
+``darkorchid2`` :darkorchid2:`████████`
+``darkorchid3`` :darkorchid3:`████████`
+``darkorchid4`` :darkorchid4:`████████`
+``darkred`` :darkred:`████████`
+``darksalmon`` :darksalmon:`████████`
+``darkseagreen`` :darkseagreen:`████████`
+``darkseagreen1`` :darkseagreen1:`████████`
+``darkseagreen2`` :darkseagreen2:`████████`
+``darkseagreen3`` :darkseagreen3:`████████`
+``darkseagreen4`` :darkseagreen4:`████████`
+``darkslateblue`` :darkslateblue:`████████`
+``darkslategray`` :darkslategray:`████████`
+``darkslategray1`` :darkslategray1:`████████`
+``darkslategray2`` :darkslategray2:`████████`
+``darkslategray3`` :darkslategray3:`████████`
+``darkslategray4`` :darkslategray4:`████████`
+``darkslategrey`` :darkslategrey:`████████`
+``darkturquoise`` :darkturquoise:`████████`
+``darkviolet`` :darkviolet:`████████`
+``deeppink`` :deeppink:`████████`
+``deeppink1`` :deeppink1:`████████`
+``deeppink2`` :deeppink2:`████████`
+``deeppink3`` :deeppink3:`████████`
+``deeppink4`` :deeppink4:`████████`
+``deepskyblue`` :deepskyblue:`████████`
+``deepskyblue1`` :deepskyblue1:`████████`
+``deepskyblue2`` :deepskyblue2:`████████`
+``deepskyblue3`` :deepskyblue3:`████████`
+``deepskyblue4`` :deepskyblue4:`████████`
+``dimgray`` :dimgray:`████████`
+``dimgrey`` :dimgrey:`████████`
+``dodgerblue`` :dodgerblue:`████████`
+``dodgerblue1`` :dodgerblue1:`████████`
+``dodgerblue2`` :dodgerblue2:`████████`
+``dodgerblue3`` :dodgerblue3:`████████`
+``dodgerblue4`` :dodgerblue4:`████████`
+``firebrick`` :firebrick:`████████`
+``firebrick1`` :firebrick1:`████████`
+``firebrick2`` :firebrick2:`████████`
+``firebrick3`` :firebrick3:`████████`
+``firebrick4`` :firebrick4:`████████`
+``floralwhite`` :floralwhite:`████████`
+``forestgreen`` :forestgreen:`████████`
+``fuchsia`` :fuchsia:`████████`
+``gainsboro`` :gainsboro:`████████`
+``ghostwhite`` :ghostwhite:`████████`
+``gold`` :gold:`████████`
+``gold1`` :gold1:`████████`
+``gold2`` :gold2:`████████`
+``gold3`` :gold3:`████████`
+``gold4`` :gold4:`████████`
+``goldenrod`` :goldenrod:`████████`
+``goldenrod1`` :goldenrod1:`████████`
+``goldenrod2`` :goldenrod2:`████████`
+``goldenrod3`` :goldenrod3:`████████`
+``goldenrod4`` :goldenrod4:`████████`
+``gray`` :gray:`████████`
+``gray0`` :gray0:`████████`
+``gray1`` :gray1:`████████`
+``gray2`` :gray2:`████████`
+``gray3`` :gray3:`████████`
+``gray4`` :gray4:`████████`
+``gray5`` :gray5:`████████`
+``gray6`` :gray6:`████████`
+``gray7`` :gray7:`████████`
+``gray8`` :gray8:`████████`
+``gray9`` :gray9:`████████`
+``gray10`` :gray10:`████████`
+``gray11`` :gray11:`████████`
+``gray12`` :gray12:`████████`
+``gray13`` :gray13:`████████`
+``gray14`` :gray14:`████████`
+``gray15`` :gray15:`████████`
+``gray16`` :gray16:`████████`
+``gray17`` :gray17:`████████`
+``gray18`` :gray18:`████████`
+``gray19`` :gray19:`████████`
+``gray20`` :gray20:`████████`
+``gray21`` :gray21:`████████`
+``gray22`` :gray22:`████████`
+``gray23`` :gray23:`████████`
+``gray24`` :gray24:`████████`
+``gray25`` :gray25:`████████`
+``gray26`` :gray26:`████████`
+``gray27`` :gray27:`████████`
+``gray28`` :gray28:`████████`
+``gray29`` :gray29:`████████`
+``gray30`` :gray30:`████████`
+``gray31`` :gray31:`████████`
+``gray32`` :gray32:`████████`
+``gray33`` :gray33:`████████`
+``gray34`` :gray34:`████████`
+``gray35`` :gray35:`████████`
+``gray36`` :gray36:`████████`
+``gray37`` :gray37:`████████`
+``gray38`` :gray38:`████████`
+``gray39`` :gray39:`████████`
+``gray40`` :gray40:`████████`
+``gray41`` :gray41:`████████`
+``gray42`` :gray42:`████████`
+``gray43`` :gray43:`████████`
+``gray44`` :gray44:`████████`
+``gray45`` :gray45:`████████`
+``gray46`` :gray46:`████████`
+``gray47`` :gray47:`████████`
+``gray48`` :gray48:`████████`
+``gray49`` :gray49:`████████`
+``gray50`` :gray50:`████████`
+``gray51`` :gray51:`████████`
+``gray52`` :gray52:`████████`
+``gray53`` :gray53:`████████`
+``gray54`` :gray54:`████████`
+``gray55`` :gray55:`████████`
+``gray56`` :gray56:`████████`
+``gray57`` :gray57:`████████`
+``gray58`` :gray58:`████████`
+``gray59`` :gray59:`████████`
+``gray60`` :gray60:`████████`
+``gray61`` :gray61:`████████`
+``gray62`` :gray62:`████████`
+``gray63`` :gray63:`████████`
+``gray64`` :gray64:`████████`
+``gray65`` :gray65:`████████`
+``gray66`` :gray66:`████████`
+``gray67`` :gray67:`████████`
+``gray68`` :gray68:`████████`
+``gray69`` :gray69:`████████`
+``gray70`` :gray70:`████████`
+``gray71`` :gray71:`████████`
+``gray72`` :gray72:`████████`
+``gray73`` :gray73:`████████`
+``gray74`` :gray74:`████████`
+``gray75`` :gray75:`████████`
+``gray76`` :gray76:`████████`
+``gray77`` :gray77:`████████`
+``gray78`` :gray78:`████████`
+``gray79`` :gray79:`████████`
+``gray80`` :gray80:`████████`
+``gray81`` :gray81:`████████`
+``gray82`` :gray82:`████████`
+``gray83`` :gray83:`████████`
+``gray84`` :gray84:`████████`
+``gray85`` :gray85:`████████`
+``gray86`` :gray86:`████████`
+``gray87`` :gray87:`████████`
+``gray88`` :gray88:`████████`
+``gray89`` :gray89:`████████`
+``gray90`` :gray90:`████████`
+``gray91`` :gray91:`████████`
+``gray92`` :gray92:`████████`
+``gray93`` :gray93:`████████`
+``gray94`` :gray94:`████████`
+``gray95`` :gray95:`████████`
+``gray96`` :gray96:`████████`
+``gray97`` :gray97:`████████`
+``gray98`` :gray98:`████████`
+``gray99`` :gray99:`████████`
+``gray100`` :gray100:`████████`
+``green`` :green:`████████`
+``green1`` :green1:`████████`
+``green2`` :green2:`████████`
+``green3`` :green3:`████████`
+``green4`` :green4:`████████`
+``greenyellow`` :greenyellow:`████████`
+``grey`` :grey:`████████`
+``grey0`` :grey0:`████████`
+``grey1`` :grey1:`████████`
+``grey2`` :grey2:`████████`
+``grey3`` :grey3:`████████`
+``grey4`` :grey4:`████████`
+``grey5`` :grey5:`████████`
+``grey6`` :grey6:`████████`
+``grey7`` :grey7:`████████`
+``grey8`` :grey8:`████████`
+``grey9`` :grey9:`████████`
+``grey10`` :grey10:`████████`
+``grey11`` :grey11:`████████`
+``grey12`` :grey12:`████████`
+``grey13`` :grey13:`████████`
+``grey14`` :grey14:`████████`
+``grey15`` :grey15:`████████`
+``grey16`` :grey16:`████████`
+``grey17`` :grey17:`████████`
+``grey18`` :grey18:`████████`
+``grey19`` :grey19:`████████`
+``grey20`` :grey20:`████████`
+``grey21`` :grey21:`████████`
+``grey22`` :grey22:`████████`
+``grey23`` :grey23:`████████`
+``grey24`` :grey24:`████████`
+``grey25`` :grey25:`████████`
+``grey26`` :grey26:`████████`
+``grey27`` :grey27:`████████`
+``grey28`` :grey28:`████████`
+``grey29`` :grey29:`████████`
+``grey30`` :grey30:`████████`
+``grey31`` :grey31:`████████`
+``grey32`` :grey32:`████████`
+``grey33`` :grey33:`████████`
+``grey34`` :grey34:`████████`
+``grey35`` :grey35:`████████`
+``grey36`` :grey36:`████████`
+``grey37`` :grey37:`████████`
+``grey38`` :grey38:`████████`
+``grey39`` :grey39:`████████`
+``grey40`` :grey40:`████████`
+``grey41`` :grey41:`████████`
+``grey42`` :grey42:`████████`
+``grey43`` :grey43:`████████`
+``grey44`` :grey44:`████████`
+``grey45`` :grey45:`████████`
+``grey46`` :grey46:`████████`
+``grey47`` :grey47:`████████`
+``grey48`` :grey48:`████████`
+``grey49`` :grey49:`████████`
+``grey50`` :grey50:`████████`
+``grey51`` :grey51:`████████`
+``grey52`` :grey52:`████████`
+``grey53`` :grey53:`████████`
+``grey54`` :grey54:`████████`
+``grey55`` :grey55:`████████`
+``grey56`` :grey56:`████████`
+``grey57`` :grey57:`████████`
+``grey58`` :grey58:`████████`
+``grey59`` :grey59:`████████`
+``grey60`` :grey60:`████████`
+``grey61`` :grey61:`████████`
+``grey62`` :grey62:`████████`
+``grey63`` :grey63:`████████`
+``grey64`` :grey64:`████████`
+``grey65`` :grey65:`████████`
+``grey66`` :grey66:`████████`
+``grey67`` :grey67:`████████`
+``grey68`` :grey68:`████████`
+``grey69`` :grey69:`████████`
+``grey70`` :grey70:`████████`
+``grey71`` :grey71:`████████`
+``grey72`` :grey72:`████████`
+``grey73`` :grey73:`████████`
+``grey74`` :grey74:`████████`
+``grey75`` :grey75:`████████`
+``grey76`` :grey76:`████████`
+``grey77`` :grey77:`████████`
+``grey78`` :grey78:`████████`
+``grey79`` :grey79:`████████`
+``grey80`` :grey80:`████████`
+``grey81`` :grey81:`████████`
+``grey82`` :grey82:`████████`
+``grey83`` :grey83:`████████`
+``grey84`` :grey84:`████████`
+``grey85`` :grey85:`████████`
+``grey86`` :grey86:`████████`
+``grey87`` :grey87:`████████`
+``grey88`` :grey88:`████████`
+``grey89`` :grey89:`████████`
+``grey90`` :grey90:`████████`
+``grey91`` :grey91:`████████`
+``grey92`` :grey92:`████████`
+``grey93`` :grey93:`████████`
+``grey94`` :grey94:`████████`
+``grey95`` :grey95:`████████`
+``grey96`` :grey96:`████████`
+``grey97`` :grey97:`████████`
+``grey98`` :grey98:`████████`
+``grey99`` :grey99:`████████`
+``grey100`` :grey100:`████████`
+``honeydew`` :honeydew:`████████`
+``honeydew1`` :honeydew1:`████████`
+``honeydew2`` :honeydew2:`████████`
+``honeydew3`` :honeydew3:`████████`
+``honeydew4`` :honeydew4:`████████`
+``hotpink`` :hotpink:`████████`
+``hotpink1`` :hotpink1:`████████`
+``hotpink2`` :hotpink2:`████████`
+``hotpink3`` :hotpink3:`████████`
+``hotpink4`` :hotpink4:`████████`
+``indianred`` :indianred:`████████`
+``indianred1`` :indianred1:`████████`
+``indianred2`` :indianred2:`████████`
+``indianred3`` :indianred3:`████████`
+``indianred4`` :indianred4:`████████`
+``indigo`` :indigo:`████████`
+``ivory`` :ivory:`████████`
+``ivory1`` :ivory1:`████████`
+``ivory2`` :ivory2:`████████`
+``ivory3`` :ivory3:`████████`
+``ivory4`` :ivory4:`████████`
+``khaki`` :khaki:`████████`
+``khaki1`` :khaki1:`████████`
+``khaki2`` :khaki2:`████████`
+``khaki3`` :khaki3:`████████`
+``khaki4`` :khaki4:`████████`
+``lavender`` :lavender:`████████`
+``lavenderblush`` :lavenderblush:`████████`
+``lavenderblush1`` :lavenderblush1:`████████`
+``lavenderblush2`` :lavenderblush2:`████████`
+``lavenderblush3`` :lavenderblush3:`████████`
+``lavenderblush4`` :lavenderblush4:`████████`
+``lawngreen`` :lawngreen:`████████`
+``lemonchiffon`` :lemonchiffon:`████████`
+``lemonchiffon1`` :lemonchiffon1:`████████`
+``lemonchiffon2`` :lemonchiffon2:`████████`
+``lemonchiffon3`` :lemonchiffon3:`████████`
+``lemonchiffon4`` :lemonchiffon4:`████████`
+``lightblue`` :lightblue:`████████`
+``lightblue1`` :lightblue1:`████████`
+``lightblue2`` :lightblue2:`████████`
+``lightblue3`` :lightblue3:`████████`
+``lightblue4`` :lightblue4:`████████`
+``lightcoral`` :lightcoral:`████████`
+``lightcyan`` :lightcyan:`████████`
+``lightcyan1`` :lightcyan1:`████████`
+``lightcyan2`` :lightcyan2:`████████`
+``lightcyan3`` :lightcyan3:`████████`
+``lightcyan4`` :lightcyan4:`████████`
+``lightgoldenrod`` :lightgoldenrod:`████████`
+``lightgoldenrod1`` :lightgoldenrod1:`████████`
+``lightgoldenrod2`` :lightgoldenrod2:`████████`
+``lightgoldenrod3`` :lightgoldenrod3:`████████`
+``lightgoldenrod4`` :lightgoldenrod4:`████████`
+``lightgoldenrodyellow`` :lightgoldenrodyellow:`████████`
+``lightgray`` :lightgray:`████████`
+``lightgreen`` :lightgreen:`████████`
+``lightgrey`` :lightgrey:`████████`
+``lightpink`` :lightpink:`████████`
+``lightpink1`` :lightpink1:`████████`
+``lightpink2`` :lightpink2:`████████`
+``lightpink3`` :lightpink3:`████████`
+``lightpink4`` :lightpink4:`████████`
+``lightsalmon`` :lightsalmon:`████████`
+``lightsalmon1`` :lightsalmon1:`████████`
+``lightsalmon2`` :lightsalmon2:`████████`
+``lightsalmon3`` :lightsalmon3:`████████`
+``lightsalmon4`` :lightsalmon4:`████████`
+``lightseagreen`` :lightseagreen:`████████`
+``lightskyblue`` :lightskyblue:`████████`
+``lightskyblue1`` :lightskyblue1:`████████`
+``lightskyblue2`` :lightskyblue2:`████████`
+``lightskyblue3`` :lightskyblue3:`████████`
+``lightskyblue4`` :lightskyblue4:`████████`
+``lightslateblue`` :lightslateblue:`████████`
+``lightslategray`` :lightslategray:`████████`
+``lightslategrey`` :lightslategrey:`████████`
+``lightsteelblue`` :lightsteelblue:`████████`
+``lightsteelblue1`` :lightsteelblue1:`████████`
+``lightsteelblue2`` :lightsteelblue2:`████████`
+``lightsteelblue3`` :lightsteelblue3:`████████`
+``lightsteelblue4`` :lightsteelblue4:`████████`
+``lightyellow`` :lightyellow:`████████`
+``lightyellow1`` :lightyellow1:`████████`
+``lightyellow2`` :lightyellow2:`████████`
+``lightyellow3`` :lightyellow3:`████████`
+``lightyellow4`` :lightyellow4:`████████`
+``lime`` :lime:`████████`
+``limegreen`` :limegreen:`████████`
+``linen`` :linen:`████████`
+``magenta`` :magenta:`████████`
+``magenta1`` :magenta1:`████████`
+``magenta2`` :magenta2:`████████`
+``magenta3`` :magenta3:`████████`
+``magenta4`` :magenta4:`████████`
+``maroon`` :maroon:`████████`
+``maroon1`` :maroon1:`████████`
+``maroon2`` :maroon2:`████████`
+``maroon3`` :maroon3:`████████`
+``maroon4`` :maroon4:`████████`
+``mediumaquamarine`` :mediumaquamarine:`████████`
+``mediumblue`` :mediumblue:`████████`
+``mediumorchid`` :mediumorchid:`████████`
+``mediumorchid1`` :mediumorchid1:`████████`
+``mediumorchid2`` :mediumorchid2:`████████`
+``mediumorchid3`` :mediumorchid3:`████████`
+``mediumorchid4`` :mediumorchid4:`████████`
+``mediumpurple`` :mediumpurple:`████████`
+``mediumpurple1`` :mediumpurple1:`████████`
+``mediumpurple2`` :mediumpurple2:`████████`
+``mediumpurple3`` :mediumpurple3:`████████`
+``mediumpurple4`` :mediumpurple4:`████████`
+``mediumseagreen`` :mediumseagreen:`████████`
+``mediumslateblue`` :mediumslateblue:`████████`
+``mediumspringgreen`` :mediumspringgreen:`████████`
+``mediumturquoise`` :mediumturquoise:`████████`
+``mediumvioletred`` :mediumvioletred:`████████`
+``midnightblue`` :midnightblue:`████████`
+``mintcream`` :mintcream:`████████`
+``mistyrose`` :mistyrose:`████████`
+``mistyrose1`` :mistyrose1:`████████`
+``mistyrose2`` :mistyrose2:`████████`
+``mistyrose3`` :mistyrose3:`████████`
+``mistyrose4`` :mistyrose4:`████████`
+``moccasin`` :moccasin:`████████`
+``navajowhite`` :navajowhite:`████████`
+``navajowhite1`` :navajowhite1:`████████`
+``navajowhite2`` :navajowhite2:`████████`
+``navajowhite3`` :navajowhite3:`████████`
+``navajowhite4`` :navajowhite4:`████████`
+``navy`` :navy:`████████`
+``navyblue`` :navyblue:`████████`
+``oldlace`` :oldlace:`████████`
+``olive`` :olive:`████████`
+``olivedrab`` :olivedrab:`████████`
+``olivedrab1`` :olivedrab1:`████████`
+``olivedrab2`` :olivedrab2:`████████`
+``olivedrab3`` :olivedrab3:`████████`
+``olivedrab4`` :olivedrab4:`████████`
+``orange`` :orange:`████████`
+``orange1`` :orange1:`████████`
+``orange2`` :orange2:`████████`
+``orange3`` :orange3:`████████`
+``orange4`` :orange4:`████████`
+``orangered`` :orangered:`████████`
+``orangered1`` :orangered1:`████████`
+``orangered2`` :orangered2:`████████`
+``orangered3`` :orangered3:`████████`
+``orangered4`` :orangered4:`████████`
+``orchid`` :orchid:`████████`
+``orchid1`` :orchid1:`████████`
+``orchid2`` :orchid2:`████████`
+``orchid3`` :orchid3:`████████`
+``orchid4`` :orchid4:`████████`
+``palegoldenrod`` :palegoldenrod:`████████`
+``palegreen`` :palegreen:`████████`
+``palegreen1`` :palegreen1:`████████`
+``palegreen2`` :palegreen2:`████████`
+``palegreen3`` :palegreen3:`████████`
+``palegreen4`` :palegreen4:`████████`
+``paleturquoise`` :paleturquoise:`████████`
+``paleturquoise1`` :paleturquoise1:`████████`
+``paleturquoise2`` :paleturquoise2:`████████`
+``paleturquoise3`` :paleturquoise3:`████████`
+``paleturquoise4`` :paleturquoise4:`████████`
+``palevioletred`` :palevioletred:`████████`
+``palevioletred1`` :palevioletred1:`████████`
+``palevioletred2`` :palevioletred2:`████████`
+``palevioletred3`` :palevioletred3:`████████`
+``palevioletred4`` :palevioletred4:`████████`
+``papayawhip`` :papayawhip:`████████`
+``peachpuff`` :peachpuff:`████████`
+``peachpuff1`` :peachpuff1:`████████`
+``peachpuff2`` :peachpuff2:`████████`
+``peachpuff3`` :peachpuff3:`████████`
+``peachpuff4`` :peachpuff4:`████████`
+``peru`` :peru:`████████`
+``pink`` :pink:`████████`
+``pink1`` :pink1:`████████`
+``pink2`` :pink2:`████████`
+``pink3`` :pink3:`████████`
+``pink4`` :pink4:`████████`
+``plum`` :plum:`████████`
+``plum1`` :plum1:`████████`
+``plum2`` :plum2:`████████`
+``plum3`` :plum3:`████████`
+``plum4`` :plum4:`████████`
+``powderblue`` :powderblue:`████████`
+``purple`` :purple:`████████`
+``purple1`` :purple1:`████████`
+``purple2`` :purple2:`████████`
+``purple3`` :purple3:`████████`
+``purple4`` :purple4:`████████`
+``red`` :red:`████████`
+``red1`` :red1:`████████`
+``red2`` :red2:`████████`
+``red3`` :red3:`████████`
+``red4`` :red4:`████████`
+``rosybrown`` :rosybrown:`████████`
+``rosybrown1`` :rosybrown1:`████████`
+``rosybrown2`` :rosybrown2:`████████`
+``rosybrown3`` :rosybrown3:`████████`
+``rosybrown4`` :rosybrown4:`████████`
+``royalblue`` :royalblue:`████████`
+``royalblue1`` :royalblue1:`████████`
+``royalblue2`` :royalblue2:`████████`
+``royalblue3`` :royalblue3:`████████`
+``royalblue4`` :royalblue4:`████████`
+``saddlebrown`` :saddlebrown:`████████`
+``salmon`` :salmon:`████████`
+``salmon1`` :salmon1:`████████`
+``salmon2`` :salmon2:`████████`
+``salmon3`` :salmon3:`████████`
+``salmon4`` :salmon4:`████████`
+``sandybrown`` :sandybrown:`████████`
+``seagreen`` :seagreen:`████████`
+``seagreen1`` :seagreen1:`████████`
+``seagreen2`` :seagreen2:`████████`
+``seagreen3`` :seagreen3:`████████`
+``seagreen4`` :seagreen4:`████████`
+``seashell`` :seashell:`████████`
+``seashell1`` :seashell1:`████████`
+``seashell2`` :seashell2:`████████`
+``seashell3`` :seashell3:`████████`
+``seashell4`` :seashell4:`████████`
+``sienna`` :sienna:`████████`
+``sienna1`` :sienna1:`████████`
+``sienna2`` :sienna2:`████████`
+``sienna3`` :sienna3:`████████`
+``sienna4`` :sienna4:`████████`
+``silver`` :silver:`████████`
+``skyblue`` :skyblue:`████████`
+``skyblue1`` :skyblue1:`████████`
+``skyblue2`` :skyblue2:`████████`
+``skyblue3`` :skyblue3:`████████`
+``skyblue4`` :skyblue4:`████████`
+``slateblue`` :slateblue:`████████`
+``slateblue1`` :slateblue1:`████████`
+``slateblue2`` :slateblue2:`████████`
+``slateblue3`` :slateblue3:`████████`
+``slateblue4`` :slateblue4:`████████`
+``slategray`` :slategray:`████████`
+``slategray1`` :slategray1:`████████`
+``slategray2`` :slategray2:`████████`
+``slategray3`` :slategray3:`████████`
+``slategray4`` :slategray4:`████████`
+``slategrey`` :slategrey:`████████`
+``snow`` :snow:`████████`
+``snow1`` :snow1:`████████`
+``snow2`` :snow2:`████████`
+``snow3`` :snow3:`████████`
+``snow4`` :snow4:`████████`
+``springgreen`` :springgreen:`████████`
+``springgreen1`` :springgreen1:`████████`
+``springgreen2`` :springgreen2:`████████`
+``springgreen3`` :springgreen3:`████████`
+``springgreen4`` :springgreen4:`████████`
+``steelblue`` :steelblue:`████████`
+``steelblue1`` :steelblue1:`████████`
+``steelblue2`` :steelblue2:`████████`
+``steelblue3`` :steelblue3:`████████`
+``steelblue4`` :steelblue4:`████████`
+``tan`` :tan:`████████`
+``tan1`` :tan1:`████████`
+``tan2`` :tan2:`████████`
+``tan3`` :tan3:`████████`
+``tan4`` :tan4:`████████`
+``teal`` :teal:`████████`
+``thistle`` :thistle:`████████`
+``thistle1`` :thistle1:`████████`
+``thistle2`` :thistle2:`████████`
+``thistle3`` :thistle3:`████████`
+``thistle4`` :thistle4:`████████`
+``tomato`` :tomato:`████████`
+``tomato1`` :tomato1:`████████`
+``tomato2`` :tomato2:`████████`
+``tomato3`` :tomato3:`████████`
+``tomato4`` :tomato4:`████████`
+``turquoise`` :turquoise:`████████`
+``turquoise1`` :turquoise1:`████████`
+``turquoise2`` :turquoise2:`████████`
+``turquoise3`` :turquoise3:`████████`
+``turquoise4`` :turquoise4:`████████`
+``violet`` :violet:`████████`
+``violetred`` :violetred:`████████`
+``violetred1`` :violetred1:`████████`
+``violetred2`` :violetred2:`████████`
+``violetred3`` :violetred3:`████████`
+``violetred4`` :violetred4:`████████`
+``wheat`` :wheat:`████████`
+``wheat1`` :wheat1:`████████`
+``wheat2`` :wheat2:`████████`
+``wheat3`` :wheat3:`████████`
+``wheat4`` :wheat4:`████████`
+``white`` :white:`████████`
+``whitesmoke`` :whitesmoke:`████████`
+``yellow`` :yellow:`████████`
+``yellow1`` :yellow1:`████████`
+``yellow2`` :yellow2:`████████`
+``yellow3`` :yellow3:`████████`
+``yellow4`` :yellow4:`████████`
+``yellowgreen`` :yellowgreen:`████████`
+========================== ======================================================================================================
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/cursors.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/cursors.rst.txt
new file mode 100644
index 00000000..6ea68e24
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/cursors.rst.txt
@@ -0,0 +1,251 @@
+.. include:: common.txt
+
+:mod:`pygame.cursors`
+=====================
+
+.. module:: pygame.cursors
+ :synopsis: pygame module for cursor resources
+
+| :sl:`pygame module for cursor resources`
+
+Pygame offers control over the system hardware cursor. Pygame supports
+black and white cursors (bitmap cursors), as well as system variant cursors and color cursors.
+You control the cursor with functions inside :mod:`pygame.mouse`.
+
+This cursors module contains functions for loading and decoding various
+cursor formats. These allow you to easily store your cursors in external files
+or directly as encoded python strings.
+
+The module includes several standard cursors. The :func:`pygame.mouse.set_cursor()`
+function takes several arguments. All those arguments have been stored in a
+single tuple you can call like this:
+
+::
+
+ >>> pygame.mouse.set_cursor(*pygame.cursors.arrow)
+
+The following variables can be passed to ``pygame.mouse.set_cursor`` function:
+
+ * ``pygame.cursors.arrow``
+
+ * ``pygame.cursors.diamond``
+
+ * ``pygame.cursors.broken_x``
+
+ * ``pygame.cursors.tri_left``
+
+ * ``pygame.cursors.tri_right``
+
+This module also contains a few cursors as formatted strings. You'll need to
+pass these to ``pygame.cursors.compile()`` function before you can use them.
+The example call would look like this:
+
+::
+
+ >>> cursor = pygame.cursors.compile(pygame.cursors.textmarker_strings)
+ >>> pygame.mouse.set_cursor((8, 16), (0, 0), *cursor)
+
+The following strings can be converted into cursor bitmaps with
+``pygame.cursors.compile()`` :
+
+ * ``pygame.cursors.thickarrow_strings``
+
+ * ``pygame.cursors.sizer_x_strings``
+
+ * ``pygame.cursors.sizer_y_strings``
+
+ * ``pygame.cursors.sizer_xy_strings``
+
+ * ``pygame.cursor.textmarker_strings``
+
+.. function:: compile
+
+ | :sl:`create binary cursor data from simple strings`
+ | :sg:`compile(strings, black='X', white='.', xor='o') -> data, mask`
+
+ A sequence of strings can be used to create binary cursor data for the
+ system cursor. This returns the binary data in the form of two tuples.
+ Those can be passed as the third and fourth arguments respectively of the
+ :func:`pygame.mouse.set_cursor()` function.
+
+ If you are creating your own cursor strings, you can use any value represent
+ the black and white pixels. Some system allow you to set a special toggle
+ color for the system color, this is also called the xor color. If the system
+ does not support xor cursors, that color will simply be black.
+
+ The height must be divisible by 8. The width of the strings must all be equal
+ and be divisible by 8. If these two conditions are not met, ``ValueError`` is
+ raised.
+ An example set of cursor strings looks like this
+
+ ::
+
+ thickarrow_strings = ( #sized 24x24
+ "XX ",
+ "XXX ",
+ "XXXX ",
+ "XX.XX ",
+ "XX..XX ",
+ "XX...XX ",
+ "XX....XX ",
+ "XX.....XX ",
+ "XX......XX ",
+ "XX.......XX ",
+ "XX........XX ",
+ "XX........XXX ",
+ "XX......XXXXX ",
+ "XX.XXX..XX ",
+ "XXXX XX..XX ",
+ "XX XX..XX ",
+ " XX..XX ",
+ " XX..XX ",
+ " XX..XX ",
+ " XXXX ",
+ " XX ",
+ " ",
+ " ",
+ " ")
+
+ .. ## pygame.cursors.compile ##
+
+.. function:: load_xbm
+
+ | :sl:`load cursor data from an XBM file`
+ | :sg:`load_xbm(cursorfile) -> cursor_args`
+ | :sg:`load_xbm(cursorfile, maskfile) -> cursor_args`
+
+ This loads cursors for a simple subset of ``XBM`` files. ``XBM`` files are
+ traditionally used to store cursors on UNIX systems, they are an ASCII
+ format used to represent simple images.
+
+ Sometimes the black and white color values will be split into two separate
+ ``XBM`` files. You can pass a second maskfile argument to load the two
+ images into a single cursor.
+
+ The cursorfile and maskfile arguments can either be filenames or file-like
+ object with the readlines method.
+
+ The return value cursor_args can be passed directly to the
+ ``pygame.mouse.set_cursor()`` function.
+
+ .. ## pygame.cursors.load_xbm ##
+
+
+
+.. class:: Cursor
+
+ | :sl:`pygame object representing a cursor`
+ | :sg:`Cursor(size, hotspot, xormasks, andmasks) -> Cursor`
+ | :sg:`Cursor(hotspot, surface) -> Cursor`
+ | :sg:`Cursor(constant) -> Cursor`
+ | :sg:`Cursor(Cursor) -> Cursor`
+ | :sg:`Cursor() -> Cursor`
+
+ In pygame 2, there are 3 types of cursors you can create to give your
+ game that little bit of extra polish. There's **bitmap** type cursors,
+ which existed in pygame 1.x, and are compiled from a string or load from an xbm file.
+ Then there are **system** type cursors, where you choose a preset that will
+ convey the same meaning but look native across different operating systems.
+ Finally you can create a **color** cursor, which displays a pygame surface as the cursor.
+
+ **Creating a system cursor**
+
+ Choose a constant from this list, pass it into ``pygame.cursors.Cursor(constant)``,
+ and you're good to go. Be advised that not all systems support every system
+ cursor, and you may get a substitution instead. For example, on MacOS,
+ WAIT/WAITARROW should show up as an arrow, and SIZENWSE/SIZENESW/SIZEALL
+ should show up as a closed hand. And on Wayland, every SIZE cursor should
+ show up as a hand.
+
+ ::
+
+ Pygame Cursor Constant Description
+ --------------------------------------------
+ pygame.SYSTEM_CURSOR_ARROW arrow
+ pygame.SYSTEM_CURSOR_IBEAM i-beam
+ pygame.SYSTEM_CURSOR_WAIT wait
+ pygame.SYSTEM_CURSOR_CROSSHAIR crosshair
+ pygame.SYSTEM_CURSOR_WAITARROW small wait cursor
+ (or wait if not available)
+ pygame.SYSTEM_CURSOR_SIZENWSE double arrow pointing
+ northwest and southeast
+ pygame.SYSTEM_CURSOR_SIZENESW double arrow pointing
+ northeast and southwest
+ pygame.SYSTEM_CURSOR_SIZEWE double arrow pointing
+ west and east
+ pygame.SYSTEM_CURSOR_SIZENS double arrow pointing
+ north and south
+ pygame.SYSTEM_CURSOR_SIZEALL four pointed arrow pointing
+ north, south, east, and west
+ pygame.SYSTEM_CURSOR_NO slashed circle or crossbones
+ pygame.SYSTEM_CURSOR_HAND hand
+
+ **Creating a cursor without passing arguments**
+
+ In addition to the cursor constants available and described above,
+ you can also call ``pygame.cursors.Cursor()``, and your cursor is ready (doing that is the same as
+ calling ``pygame.cursors.Cursor(pygame.SYSTEM_CURSOR_ARROW)``.
+ Doing one of those calls actually creates a system cursor using the default native image.
+
+ **Creating a color cursor**
+
+ To create a color cursor, create a ``Cursor`` from a ``hotspot`` and a ``surface``.
+ ``hotspot`` is an (x,y) coordinate that determines where in the cursor the exact point is.
+ The hotspot position must be within the bounds of the ``surface``.
+
+ **Creating a bitmap cursor**
+
+ When the mouse cursor is visible, it will be displayed as a black and white
+ bitmap using the given bitmask arrays. The ``size`` is a sequence containing
+ the cursor width and height. ``hotspot`` is a sequence containing the cursor
+ hotspot position.
+
+ A cursor has a width and height, but a mouse position is represented by a
+ set of point coordinates. So the value passed into the cursor ``hotspot``
+ variable helps pygame to actually determine at what exact point the cursor
+ is at.
+
+ ``xormasks`` is a sequence of bytes containing the cursor xor data masks.
+ Lastly ``andmasks``, a sequence of bytes containing the cursor bitmask data.
+ To create these variables, we can make use of the
+ :func:`pygame.cursors.compile()` function.
+
+ Width and height must be a multiple of 8, and the mask arrays must be the
+ correct size for the given width and height. Otherwise an exception is raised.
+
+ .. method:: copy
+
+ | :sl:`copy the current cursor`
+ | :sg:`copy() -> Cursor`
+
+ Returns a new Cursor object with the same data and hotspot as the original.
+ .. ## pygame.cursors.Cursor.copy ##
+
+
+ .. attribute:: type
+
+ | :sl:`Gets the cursor type`
+ | :sg:`type -> string`
+
+ The type will be ``"system"``, ``"bitmap"``, or ``"color"``.
+
+ .. ## pygame.cursors.Cursor.type ##
+
+ .. attribute:: data
+
+ | :sl:`Gets the cursor data`
+ | :sg:`data -> tuple`
+
+ Returns the data that was used to create this cursor object, wrapped up in a tuple.
+
+ .. ## pygame.cursors.Cursor.data ##
+
+ .. versionadded:: 2.0.1
+
+ .. ## pygame.cursors.Cursor ##
+
+.. ## pygame.cursors ##
+
+Example code for creating and settings cursors. (Click the mouse to switch cursor)
+
+.. literalinclude:: code_examples/cursors_module_example.py
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/display.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/display.rst.txt
new file mode 100644
index 00000000..c669eabc
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/display.rst.txt
@@ -0,0 +1,737 @@
+.. include:: common.txt
+
+:mod:`pygame.display`
+=====================
+
+.. module:: pygame.display
+ :synopsis: pygame module to control the display window and screen
+
+| :sl:`pygame module to control the display window and screen`
+
+This module offers control over the pygame display. Pygame has a single display
+Surface that is either contained in a window or runs full screen. Once you
+create the display you treat it as a regular Surface. Changes are not
+immediately visible onscreen; you must choose one of the two flipping functions
+to update the actual display.
+
+The origin of the display, where x = 0 and y = 0, is the top left of the
+screen. Both axes increase positively towards the bottom right of the screen.
+
+The pygame display can actually be initialized in one of several modes. By
+default, the display is a basic software driven framebuffer. You can request
+special modules like automatic scaling or OpenGL support. These are
+controlled by flags passed to ``pygame.display.set_mode()``.
+
+Pygame can only have a single display active at any time. Creating a new one
+with ``pygame.display.set_mode()`` will close the previous display. To detect
+the number and size of attached screens, you can use
+``pygame.display.get_desktop_sizes`` and then select appropriate window size
+and display index to pass to ``pygame.display.set_mode()``.
+
+For backward compatibility ``pygame.display`` allows precise control over
+the pixel format or display resolutions. This used to be necessary with old
+graphics cards and CRT screens, but is usually not needed any more. Use the
+functions ``pygame.display.mode_ok()``, ``pygame.display.list_modes()``, and
+``pygame.display.Info()`` to query detailed information about the display.
+
+Once the display Surface is created, the functions from this module affect the
+single existing display. The Surface becomes invalid if the module is
+uninitialized. If a new display mode is set, the existing Surface will
+automatically switch to operate on the new display.
+
+When the display mode is set, several events are placed on the pygame event
+queue. ``pygame.QUIT`` is sent when the user has requested the program to
+shut down. The window will receive ``pygame.ACTIVEEVENT`` events as the display
+gains and loses input focus. If the display is set with the
+``pygame.RESIZABLE`` flag, ``pygame.VIDEORESIZE`` events will be sent when the
+user adjusts the window dimensions. Hardware displays that draw direct to the
+screen will get ``pygame.VIDEOEXPOSE`` events when portions of the window must
+be redrawn.
+
+A new windowevent API was introduced in pygame 2.0.1. Check event module docs
+for more information on that
+
+Some display environments have an option for automatically stretching all
+windows. When this option is enabled, this automatic stretching distorts the
+appearance of the pygame window. In the pygame examples directory, there is
+example code (prevent_display_stretching.py) which shows how to disable this
+automatic stretching of the pygame display on Microsoft Windows (Vista or newer
+required).
+
+.. function:: init
+
+ | :sl:`Initialize the display module`
+ | :sg:`init() -> None`
+
+ Initializes the pygame display module. The display module cannot do anything
+ until it is initialized. This is usually handled for you automatically when
+ you call the higher level ``pygame.init()``.
+
+ Pygame will select from one of several internal display backends when it is
+ initialized. The display mode will be chosen depending on the platform and
+ permissions of current user. Before the display module is initialized the
+ environment variable ``SDL_VIDEODRIVER`` can be set to control which backend
+ is used. The systems with multiple choices are listed here.
+
+ ::
+
+ Windows : windib, directx
+ Unix : x11, dga, fbcon, directfb, ggi, vgl, svgalib, aalib
+
+ On some platforms it is possible to embed the pygame display into an already
+ existing window. To do this, the environment variable ``SDL_WINDOWID`` must
+ be set to a string containing the window id or handle. The environment
+ variable is checked when the pygame display is initialized. Be aware that
+ there can be many strange side effects when running in an embedded display.
+
+ It is harmless to call this more than once, repeated calls have no effect.
+
+ .. ## pygame.display.init ##
+
+.. function:: quit
+
+ | :sl:`Uninitialize the display module`
+ | :sg:`quit() -> None`
+
+ This will shut down the entire display module. This means any active
+ displays will be closed. This will also be handled automatically when the
+ program exits.
+
+ It is harmless to call this more than once, repeated calls have no effect.
+
+ .. ## pygame.display.quit ##
+
+.. function:: get_init
+
+ | :sl:`Returns True if the display module has been initialized`
+ | :sg:`get_init() -> bool`
+
+ Returns True if the :mod:`pygame.display` module is currently initialized.
+
+ .. ## pygame.display.get_init ##
+
+.. function:: set_mode
+
+ | :sl:`Initialize a window or screen for display`
+ | :sg:`set_mode(size=(0, 0), flags=0, depth=0, display=0, vsync=0) -> Surface`
+
+ This function will create a display Surface. The arguments passed in are
+ requests for a display type. The actual created display will be the best
+ possible match supported by the system.
+
+ Note that calling this function implicitly initializes ``pygame.display``, if
+ it was not initialized before.
+
+ The size argument is a pair of numbers representing the width and
+ height. The flags argument is a collection of additional options. The depth
+ argument represents the number of bits to use for color.
+
+ The Surface that gets returned can be drawn to like a regular Surface but
+ changes will eventually be seen on the monitor.
+
+ If no size is passed or is set to ``(0, 0)`` and pygame uses ``SDL``
+ version 1.2.10 or above, the created Surface will have the same size as the
+ current screen resolution. If only the width or height are set to ``0``, the
+ Surface will have the same width or height as the screen resolution. Using a
+ ``SDL`` version prior to 1.2.10 will raise an exception.
+
+ It is usually best to not pass the depth argument. It will default to the
+ best and fastest color depth for the system. If your game requires a
+ specific color format you can control the depth with this argument. Pygame
+ will emulate an unavailable color depth which can be slow.
+
+ When requesting fullscreen display modes, sometimes an exact match for the
+ requested size cannot be made. In these situations pygame will select
+ the closest compatible match. The returned surface will still always match
+ the requested size.
+
+ On high resolution displays(4k, 1080p) and tiny graphics games (640x480)
+ show up very small so that they are unplayable. SCALED scales up the window
+ for you. The game thinks it's a 640x480 window, but really it can be bigger.
+ Mouse events are scaled for you, so your game doesn't need to do it. Note
+ that SCALED is considered an experimental API and may change in future
+ releases.
+
+ The flags argument controls which type of display you want. There are
+ several to choose from, and you can even combine multiple types using the
+ bitwise or operator, (the pipe "|" character). Here are the display
+ flags you will want to choose from:
+
+ ::
+
+ pygame.FULLSCREEN create a fullscreen display
+ pygame.DOUBLEBUF only applicable with OPENGL
+ pygame.HWSURFACE (obsolete in pygame 2) hardware accelerated, only in FULLSCREEN
+ pygame.OPENGL create an OpenGL-renderable display
+ pygame.RESIZABLE display window should be sizeable
+ pygame.NOFRAME display window will have no border or controls
+ pygame.SCALED resolution depends on desktop size and scale graphics
+ pygame.SHOWN window is opened in visible mode (default)
+ pygame.HIDDEN window is opened in hidden mode
+
+
+ .. versionadded:: 2.0.0 ``SCALED``, ``SHOWN`` and ``HIDDEN``
+
+ By setting the ``vsync`` parameter to ``1``, it is possible to get a display
+ with vertical sync, but you are not guaranteed to get one. The request only
+ works at all for calls to ``set_mode()`` with the ``pygame.OPENGL`` or
+ ``pygame.SCALED`` flags set, and is still not guaranteed even with one of
+ those set. What you get depends on the hardware and driver configuration
+ of the system pygame is running on. Here is an example usage of a call
+ to ``set_mode()`` that may give you a display with vsync:
+
+ ::
+
+ flags = pygame.OPENGL | pygame.FULLSCREEN
+ window_surface = pygame.display.set_mode((1920, 1080), flags, vsync=1)
+
+ Vsync behaviour is considered experimental, and may change in future releases.
+
+ .. versionadded:: 2.0.0 ``vsync``
+
+ Basic example:
+
+ ::
+
+ # Open a window on the screen
+ screen_width=700
+ screen_height=400
+ screen=pygame.display.set_mode([screen_width, screen_height])
+
+ The display index ``0`` means the default display is used. If no display
+ index argument is provided, the default display can be overridden with an
+ environment variable.
+
+
+ .. versionchanged:: 1.9.5 ``display`` argument added
+
+ .. versionchanged:: 2.1.3
+ pygame now ensures that subsequent calls to this function clears the
+ window to black. On older versions, this was an implementation detail
+ on the major platforms this function was tested with.
+
+ .. ## pygame.display.set_mode ##
+
+.. function:: get_surface
+
+ | :sl:`Get a reference to the currently set display surface`
+ | :sg:`get_surface() -> Surface`
+
+ Return a reference to the currently set display Surface. If no display mode
+ has been set this will return None.
+
+ .. ## pygame.display.get_surface ##
+
+.. function:: flip
+
+ | :sl:`Update the full display Surface to the screen`
+ | :sg:`flip() -> None`
+
+ This will update the contents of the entire display. If your display mode is
+ using the flags ``pygame.HWSURFACE`` and ``pygame.DOUBLEBUF`` on pygame 1,
+ this will wait for a vertical retrace and swap the surfaces.
+
+ When using an ``pygame.OPENGL`` display mode this will perform a gl buffer
+ swap.
+
+ .. ## pygame.display.flip ##
+
+.. function:: update
+
+ | :sl:`Update portions of the screen for software displays`
+ | :sg:`update(rectangle=None) -> None`
+ | :sg:`update(rectangle_list) -> None`
+
+ This function is like an optimized version of ``pygame.display.flip()`` for
+ software displays. It allows only a portion of the screen to be updated,
+ instead of the entire area. If no argument is passed it updates the entire
+ Surface area like ``pygame.display.flip()``.
+
+ Note that calling ``display.update(None)`` means no part of the window is
+ updated. Whereas ``display.update()`` means the whole window is updated.
+
+ You can pass the function a single rectangle, or a sequence of rectangles.
+ It is more efficient to pass many rectangles at once than to call update
+ multiple times with single or a partial list of rectangles. If passing a
+ sequence of rectangles it is safe to include None values in the list, which
+ will be skipped.
+
+ This call cannot be used on ``pygame.OPENGL`` displays and will generate an
+ exception.
+
+ .. ## pygame.display.update ##
+
+.. function:: get_driver
+
+ | :sl:`Get the name of the pygame display backend`
+ | :sg:`get_driver() -> name`
+
+ Pygame chooses one of many available display backends when it is
+ initialized. This returns the internal name used for the display backend.
+ This can be used to provide limited information about what display
+ capabilities might be accelerated. See the ``SDL_VIDEODRIVER`` flags in
+ ``pygame.display.set_mode()`` to see some of the common options.
+
+ .. ## pygame.display.get_driver ##
+
+.. function:: Info
+
+ | :sl:`Create a video display information object`
+ | :sg:`Info() -> VideoInfo`
+
+ Creates a simple object containing several attributes to describe the
+ current graphics environment. If this is called before
+ ``pygame.display.set_mode()`` some platforms can provide information about
+ the default display mode. This can also be called after setting the display
+ mode to verify specific display options were satisfied. The VidInfo object
+ has several attributes:
+
+ ::
+
+ hw: 1 if the display is hardware accelerated
+ wm: 1 if windowed display modes can be used
+ video_mem: The megabytes of video memory on the display. This is 0 if
+ unknown
+ bitsize: Number of bits used to store each pixel
+ bytesize: Number of bytes used to store each pixel
+ masks: Four values used to pack RGBA values into pixels
+ shifts: Four values used to pack RGBA values into pixels
+ losses: Four values used to pack RGBA values into pixels
+ blit_hw: 1 if hardware Surface blitting is accelerated
+ blit_hw_CC: 1 if hardware Surface colorkey blitting is accelerated
+ blit_hw_A: 1 if hardware Surface pixel alpha blitting is accelerated
+ blit_sw: 1 if software Surface blitting is accelerated
+ blit_sw_CC: 1 if software Surface colorkey blitting is accelerated
+ blit_sw_A: 1 if software Surface pixel alpha blitting is accelerated
+ current_h, current_w: Height and width of the current video mode, or
+ of the desktop mode if called before the display.set_mode
+ is called. (current_h, current_w are available since
+ SDL 1.2.10, and pygame 1.8.0). They are -1 on error, or if
+ an old SDL is being used.
+
+ .. ## pygame.display.Info ##
+
+.. function:: get_wm_info
+
+ | :sl:`Get information about the current windowing system`
+ | :sg:`get_wm_info() -> dict`
+
+ Creates a dictionary filled with string keys. The strings and values are
+ arbitrarily created by the system. Some systems may have no information and
+ an empty dictionary will be returned. Most platforms will return a "window"
+ key with the value set to the system id for the current display.
+
+ .. versionadded:: 1.7.1
+
+ .. ## pygame.display.get_wm_info ##
+
+.. function:: get_desktop_sizes
+
+ | :sl:`Get sizes of active desktops`
+ | :sg:`get_desktop_sizes() -> list`
+
+ This function returns the sizes of the currently configured
+ virtual desktops as a list of (x, y) tuples of integers.
+
+ The length of the list is not the same as the number of attached monitors,
+ as a desktop can be mirrored across multiple monitors. The desktop sizes
+ do not indicate the maximum monitor resolutions supported by the hardware,
+ but the desktop size configured in the operating system.
+
+ In order to fit windows into the desktop as it is currently configured, and
+ to respect the resolution configured by the operating system in fullscreen
+ mode, this function *should* be used to replace many use cases of
+ ``pygame.display.list_modes()`` whenever applicable.
+
+ .. versionadded:: 2.0.0
+
+.. function:: list_modes
+
+ | :sl:`Get list of available fullscreen modes`
+ | :sg:`list_modes(depth=0, flags=pygame.FULLSCREEN, display=0) -> list`
+
+ This function returns a list of possible sizes for a specified color
+ depth. The return value will be an empty list if no display modes are
+ available with the given arguments. A return value of ``-1`` means that
+ any requested size should work (this is likely the case for windowed
+ modes). Mode sizes are sorted from biggest to smallest.
+
+ If depth is ``0``, the current/best color depth for the display is used.
+ The flags defaults to ``pygame.FULLSCREEN``, but you may need to add
+ additional flags for specific fullscreen modes.
+
+ The display index ``0`` means the default display is used.
+
+ Since pygame 2.0, ``pygame.display.get_desktop_sizes()`` has taken over
+ some use cases from ``pygame.display.list_modes()``:
+
+ To find a suitable size for non-fullscreen windows, it is preferable to
+ use ``pygame.display.get_desktop_sizes()`` to get the size of the *current*
+ desktop, and to then choose a smaller window size. This way, the window is
+ guaranteed to fit, even when the monitor is configured to a lower resolution
+ than the maximum supported by the hardware.
+
+ To avoid changing the physical monitor resolution, it is also preferable to
+ use ``pygame.display.get_desktop_sizes()`` to determine the fullscreen
+ resolution. Developers are strongly advised to default to the current
+ physical monitor resolution unless the user explicitly requests a different
+ one (e.g. in an options menu or configuration file).
+
+ .. versionchanged:: 1.9.5 ``display`` argument added
+
+ .. ## pygame.display.list_modes ##
+
+.. function:: mode_ok
+
+ | :sl:`Pick the best color depth for a display mode`
+ | :sg:`mode_ok(size, flags=0, depth=0, display=0) -> depth`
+
+ This function uses the same arguments as ``pygame.display.set_mode()``. It
+ is used to determine if a requested display mode is available. It will
+ return ``0`` if the display mode cannot be set. Otherwise it will return a
+ pixel depth that best matches the display asked for.
+
+ Usually the depth argument is not passed, but some platforms can support
+ multiple display depths. If passed it will hint to which depth is a better
+ match.
+
+ The function will return ``0`` if the passed display flags cannot be set.
+
+ The display index ``0`` means the default display is used.
+
+ .. versionchanged:: 1.9.5 ``display`` argument added
+
+ .. ## pygame.display.mode_ok ##
+
+.. function:: gl_get_attribute
+
+ | :sl:`Get the value for an OpenGL flag for the current display`
+ | :sg:`gl_get_attribute(flag) -> value`
+
+ After calling ``pygame.display.set_mode()`` with the ``pygame.OPENGL`` flag,
+ it is a good idea to check the value of any requested OpenGL attributes. See
+ ``pygame.display.gl_set_attribute()`` for a list of valid flags.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## pygame.display.gl_get_attribute ##
+
+.. function:: gl_set_attribute
+
+ | :sl:`Request an OpenGL display attribute for the display mode`
+ | :sg:`gl_set_attribute(flag, value) -> None`
+
+ When calling ``pygame.display.set_mode()`` with the ``pygame.OPENGL`` flag,
+ Pygame automatically handles setting the OpenGL attributes like color and
+ double-buffering. OpenGL offers several other attributes you may want control
+ over. Pass one of these attributes as the flag, and its appropriate value.
+ This must be called before ``pygame.display.set_mode()``.
+
+ Many settings are the requested minimum. Creating a window with an OpenGL context
+ will fail if OpenGL cannot provide the requested attribute, but it may for example
+ give you a stencil buffer even if you request none, or it may give you a larger
+ one than requested.
+
+ The ``OPENGL`` flags are:
+
+ ::
+
+ GL_ALPHA_SIZE, GL_DEPTH_SIZE, GL_STENCIL_SIZE, GL_ACCUM_RED_SIZE,
+ GL_ACCUM_GREEN_SIZE, GL_ACCUM_BLUE_SIZE, GL_ACCUM_ALPHA_SIZE,
+ GL_MULTISAMPLEBUFFERS, GL_MULTISAMPLESAMPLES, GL_STEREO
+
+ :const:`GL_MULTISAMPLEBUFFERS`
+
+ Whether to enable multisampling anti-aliasing.
+ Defaults to 0 (disabled).
+
+ Set ``GL_MULTISAMPLESAMPLES`` to a value
+ above 0 to control the amount of anti-aliasing.
+ A typical value is 2 or 3.
+
+ :const:`GL_STENCIL_SIZE`
+
+ Minimum bit size of the stencil buffer. Defaults to 0.
+
+ :const:`GL_DEPTH_SIZE`
+
+ Minimum bit size of the depth buffer. Defaults to 16.
+
+ :const:`GL_STEREO`
+
+ 1 enables stereo 3D. Defaults to 0.
+
+ :const:`GL_BUFFER_SIZE`
+
+ Minimum bit size of the frame buffer. Defaults to 0.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. versionadded:: 2.0.0 Additional attributes:
+
+ ::
+
+ GL_ACCELERATED_VISUAL,
+ GL_CONTEXT_MAJOR_VERSION, GL_CONTEXT_MINOR_VERSION,
+ GL_CONTEXT_FLAGS, GL_CONTEXT_PROFILE_MASK,
+ GL_SHARE_WITH_CURRENT_CONTEXT,
+ GL_CONTEXT_RELEASE_BEHAVIOR,
+ GL_FRAMEBUFFER_SRGB_CAPABLE
+
+ :const:`GL_CONTEXT_PROFILE_MASK`
+
+ Sets the OpenGL profile to one of these values:
+
+ ::
+
+ GL_CONTEXT_PROFILE_CORE disable deprecated features
+ GL_CONTEXT_PROFILE_COMPATIBILITY allow deprecated features
+ GL_CONTEXT_PROFILE_ES allow only the ES feature
+ subset of OpenGL
+
+ :const:`GL_ACCELERATED_VISUAL`
+
+ Set to 1 to require hardware acceleration, or 0 to force software render.
+ By default, both are allowed.
+
+ .. ## pygame.display.gl_set_attribute ##
+
+.. function:: get_active
+
+ | :sl:`Returns True when the display is active on the screen`
+ | :sg:`get_active() -> bool`
+
+ Returns True when the display Surface is considered actively
+ renderable on the screen and may be visible to the user. This is
+ the default state immediately after ``pygame.display.set_mode()``.
+ This method may return True even if the application is fully hidden
+ behind another application window.
+
+ This will return False if the display Surface has been iconified or
+ minimized (either via ``pygame.display.iconify()`` or via an OS
+ specific method such as the minimize-icon available on most
+ desktops).
+
+ The method can also return False for other reasons without the
+ application being explicitly iconified or minimized by the user. A
+ notable example being if the user has multiple virtual desktops and
+ the display Surface is not on the active virtual desktop.
+
+ .. note:: This function returning True is unrelated to whether the
+ application has input focus. Please see
+ ``pygame.key.get_focused()`` and ``pygame.mouse.get_focused()``
+ for APIs related to input focus.
+
+ .. ## pygame.display.get_active ##
+
+.. function:: iconify
+
+ | :sl:`Iconify the display surface`
+ | :sg:`iconify() -> bool`
+
+ Request the window for the display surface be iconified or hidden. Not all
+ systems and displays support an iconified display. The function will return
+ True if successful.
+
+ When the display is iconified ``pygame.display.get_active()`` will return
+ ``False``. The event queue should receive an ``ACTIVEEVENT`` event when the
+ window has been iconified. Additionally, the event queue also receives a
+ ``WINDOWEVENT_MINIMIZED`` event when the window has been iconified on pygame 2.
+
+ .. ## pygame.display.iconify ##
+
+.. function:: toggle_fullscreen
+
+ | :sl:`Switch between fullscreen and windowed displays`
+ | :sg:`toggle_fullscreen() -> int`
+
+ Switches the display window between windowed and fullscreen modes.
+ Display driver support is not great when using pygame 1, but with
+ pygame 2 it is the most reliable method to switch to and from fullscreen.
+
+ Supported display drivers in pygame 1:
+
+ * x11 (Linux/Unix)
+ * wayland (Linux/Unix)
+
+ Supported display drivers in pygame 2:
+
+ * windows (Windows)
+ * x11 (Linux/Unix)
+ * wayland (Linux/Unix)
+ * cocoa (OSX/Mac)
+
+ .. Note:: :func:`toggle_fullscreen` doesn't work on Windows
+ unless the window size is in :func:`pygame.display.list_modes()` or
+ the window is created with the flag ``pygame.SCALED``.
+ See `issue #2380 `_.
+
+ .. ## pygame.display.toggle_fullscreen ##
+
+.. function:: set_gamma
+
+ | :sl:`Change the hardware gamma ramps`
+ | :sg:`set_gamma(red, green=None, blue=None) -> bool`
+
+ DEPRECATED: This functionality will go away in SDL3.
+
+ Set the red, green, and blue gamma values on the display hardware. If the
+ green and blue arguments are not passed, they will both be the same as red.
+ Not all systems and hardware support gamma ramps, if the function succeeds
+ it will return ``True``.
+
+ A gamma value of ``1.0`` creates a linear color table. Lower values will
+ darken the display and higher values will brighten.
+
+ .. deprecated:: 2.2.0
+
+ .. ## pygame.display.set_gamma ##
+
+.. function:: set_gamma_ramp
+
+ | :sl:`Change the hardware gamma ramps with a custom lookup`
+ | :sg:`set_gamma_ramp(red, green, blue) -> bool`
+
+ DEPRECATED: This functionality will go away in SDL3.
+
+ Set the red, green, and blue gamma ramps with an explicit lookup table. Each
+ argument should be sequence of 256 integers. The integers should range
+ between ``0`` and ``0xffff``. Not all systems and hardware support gamma
+ ramps, if the function succeeds it will return ``True``.
+
+ .. deprecated:: 2.2.0
+
+ .. ## pygame.display.set_gamma_ramp ##
+
+.. function:: set_icon
+
+ | :sl:`Change the system image for the display window`
+ | :sg:`set_icon(Surface) -> None`
+
+ Sets the runtime icon the system will use to represent the display window.
+ All windows default to a simple pygame logo for the window icon.
+
+ Note that calling this function implicitly initializes ``pygame.display``, if
+ it was not initialized before.
+
+ You can pass any surface, but most systems want a smaller image around
+ 32x32. The image can have colorkey transparency which will be passed to the
+ system.
+
+ Some systems do not allow the window icon to change after it has been shown.
+ This function can be called before ``pygame.display.set_mode()`` to create
+ the icon before the display mode is set.
+
+ .. ## pygame.display.set_icon ##
+
+.. function:: set_caption
+
+ | :sl:`Set the current window caption`
+ | :sg:`set_caption(title, icontitle=None) -> None`
+
+ If the display has a window title, this function will change the name on the
+ window. In pygame 1.x, some systems supported an alternate shorter title to
+ be used for minimized displays, but in pygame 2 ``icontitle`` does nothing.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## pygame.display.set_caption ##
+
+.. function:: get_caption
+
+ | :sl:`Get the current window caption`
+ | :sg:`get_caption() -> (title, icontitle)`
+
+ Returns the title and icontitle for the display window. In pygame 2.x
+ these will always be the same value.
+
+ .. ## pygame.display.get_caption ##
+
+.. function:: set_palette
+
+ | :sl:`Set the display color palette for indexed displays`
+ | :sg:`set_palette(palette=None) -> None`
+
+ This will change the video display color palette for 8-bit displays. This
+ does not change the palette for the actual display Surface, only the palette
+ that is used to display the Surface. If no palette argument is passed, the
+ system default palette will be restored. The palette is a sequence of
+ ``RGB`` triplets.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## pygame.display.set_palette ##
+
+.. function:: get_num_displays
+
+ | :sl:`Return the number of displays`
+ | :sg:`get_num_displays() -> int`
+
+ Returns the number of available displays. This is always 1 if
+ :func:`pygame.get_sdl_version()` returns a major version number below 2.
+
+ .. versionadded:: 1.9.5
+
+ .. ## pygame.display.get_num_displays ##
+
+.. function:: get_window_size
+
+ | :sl:`Return the size of the window or screen`
+ | :sg:`get_window_size() -> tuple`
+
+ Returns the size of the window initialized with :func:`pygame.display.set_mode()`.
+ This may differ from the size of the display surface if ``SCALED`` is used.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.display.get_window_size ##
+
+.. function:: get_allow_screensaver
+
+ | :sl:`Return whether the screensaver is allowed to run.`
+ | :sg:`get_allow_screensaver() -> bool`
+
+ Return whether screensaver is allowed to run whilst the app is running.
+ Default is ``False``.
+ By default pygame does not allow the screensaver during game play.
+
+ .. note:: Some platforms do not have a screensaver or support
+ disabling the screensaver. Please see
+ :func:`pygame.display.set_allow_screensaver()` for
+ caveats with screensaver support.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.display.get_allow_screensaver ##
+
+.. function:: set_allow_screensaver
+
+ | :sl:`Set whether the screensaver may run`
+ | :sg:`set_allow_screensaver(bool) -> None`
+
+ Change whether screensavers should be allowed whilst the app is running.
+ The default value of the argument to the function is True.
+ By default pygame does not allow the screensaver during game play.
+
+ If the screensaver has been disallowed due to this function, it will automatically
+ be allowed to run when :func:`pygame.quit()` is called.
+
+ It is possible to influence the default value via the environment variable
+ ``SDL_HINT_VIDEO_ALLOW_SCREENSAVER``, which can be set to either ``0`` (disable)
+ or ``1`` (enable).
+
+ .. note:: Disabling screensaver is subject to platform support.
+ When platform support is absent, this function will
+ silently appear to work even though the screensaver state
+ is unchanged. The lack of feedback is due to SDL not
+ providing any supported method for determining whether
+ it supports changing the screensaver state.
+ ``SDL_HINT_VIDEO_ALLOW_SCREENSAVER`` is available in SDL 2.0.2 or later.
+ SDL1.2 does not implement this.
+
+ .. versionadded:: 2.0.0
+
+
+ .. ## pygame.display.set_allow_screensaver ##
+
+.. ## pygame.display ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/draw.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/draw.rst.txt
new file mode 100644
index 00000000..a7598605
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/draw.rst.txt
@@ -0,0 +1,557 @@
+.. include:: common.txt
+
+:mod:`pygame.draw`
+==================
+
+.. module:: pygame.draw
+ :synopsis: pygame module for drawing shapes
+
+| :sl:`pygame module for drawing shapes`
+
+Draw several simple shapes to a surface. These functions will work for
+rendering to any format of surface.
+
+Most of the functions take a width argument to represent the size of stroke
+(thickness) around the edge of the shape. If a width of 0 is passed the shape
+will be filled (solid).
+
+All the drawing functions respect the clip area for the surface and will be
+constrained to that area. The functions return a rectangle representing the
+bounding area of changed pixels. This bounding rectangle is the 'minimum'
+bounding box that encloses the affected area.
+
+All the drawing functions accept a color argument that can be one of the
+following formats:
+
+ - a :mod:`pygame.Color` object
+ - an ``(RGB)`` triplet (tuple/list)
+ - an ``(RGBA)`` quadruplet (tuple/list)
+ - an integer value that has been mapped to the surface's pixel format
+ (see :func:`pygame.Surface.map_rgb` and :func:`pygame.Surface.unmap_rgb`)
+
+A color's alpha value will be written directly into the surface (if the
+surface contains pixel alphas), but the draw function will not draw
+transparently.
+
+These functions temporarily lock the surface they are operating on. Many
+sequential drawing calls can be sped up by locking and unlocking the surface
+object around the draw calls (see :func:`pygame.Surface.lock` and
+:func:`pygame.Surface.unlock`).
+
+.. note ::
+ See the :mod:`pygame.gfxdraw` module for alternative draw methods.
+
+
+.. function:: rect
+
+ | :sl:`draw a rectangle`
+ | :sg:`rect(surface, color, rect) -> Rect`
+ | :sg:`rect(surface, color, rect, width=0, border_radius=0, border_top_left_radius=-1, border_top_right_radius=-1, border_bottom_left_radius=-1, border_bottom_right_radius=-1) -> Rect`
+
+ Draws a rectangle on the given surface.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param Rect rect: rectangle to draw, position and dimensions
+ :param int width: (optional) used for line thickness or to indicate that
+ the rectangle is to be filled (not to be confused with the width value
+ of the ``rect`` parameter)
+
+ | if ``width == 0``, (default) fill the rectangle
+ | if ``width > 0``, used for line thickness
+ | if ``width < 0``, nothing will be drawn
+ |
+
+ .. versionchanged:: 2.1.1
+ Drawing rects with width now draws the width correctly inside the
+ rect's area, rather than using an internal call to draw.lines(),
+ which had half the width spill outside the rect area.
+
+ :param int border_radius: (optional) used for drawing rectangle with rounded corners.
+ The supported range is [0, min(height, width) / 2], with 0 representing a rectangle
+ without rounded corners.
+ :param int border_top_left_radius: (optional) used for setting the value of top left
+ border. If you don't set this value, it will use the border_radius value.
+ :param int border_top_right_radius: (optional) used for setting the value of top right
+ border. If you don't set this value, it will use the border_radius value.
+ :param int border_bottom_left_radius: (optional) used for setting the value of bottom left
+ border. If you don't set this value, it will use the border_radius value.
+ :param int border_bottom_right_radius: (optional) used for setting the value of bottom right
+ border. If you don't set this value, it will use the border_radius value.
+
+ | if ``border_radius < 1`` it will draw rectangle without rounded corners
+ | if any of border radii has the value ``< 0`` it will use value of the border_radius
+ | If sum of radii on the same side of the rectangle is greater than the rect size the radii
+ | will get scaled
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the position of the given ``rect``
+ parameter and its width and height will be 0
+ :rtype: Rect
+
+ .. note::
+ The :func:`pygame.Surface.fill()` method works just as well for drawing
+ filled rectangles and can be hardware accelerated on some platforms.
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+ .. versionchanged:: 2.0.0.dev8 Added support for border radius.
+
+ .. ## pygame.draw.rect ##
+
+.. function:: polygon
+
+ | :sl:`draw a polygon`
+ | :sg:`polygon(surface, color, points) -> Rect`
+ | :sg:`polygon(surface, color, points, width=0) -> Rect`
+
+ Draws a polygon on the given surface.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param points: a sequence of 3 or more (x, y) coordinates that make up the
+ vertices of the polygon, each *coordinate* in the sequence must be a
+ tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats,
+ e.g. ``[(x1, y1), (x2, y2), (x3, y3)]``
+ :type points: tuple(coordinate) or list(coordinate)
+ :param int width: (optional) used for line thickness or to indicate that
+ the polygon is to be filled
+
+ | if width == 0, (default) fill the polygon
+ | if width > 0, used for line thickness
+ | if width < 0, nothing will be drawn
+ |
+
+ .. note::
+ When using ``width`` values ``> 1``, the edge lines will grow
+ outside the original boundary of the polygon. For more details on
+ how the thickness for edge lines grow, refer to the ``width`` notes
+ of the :func:`pygame.draw.line` function.
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the position of the first point in the
+ ``points`` parameter (float values will be truncated) and its width and
+ height will be 0
+ :rtype: Rect
+
+ :raises ValueError: if ``len(points) < 3`` (must have at least 3 points)
+ :raises TypeError: if ``points`` is not a sequence or ``points`` does not
+ contain number pairs
+
+ .. note::
+ For an aapolygon, use :func:`aalines()` with ``closed=True``.
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+
+ .. ## pygame.draw.polygon ##
+
+.. function:: circle
+
+ | :sl:`draw a circle`
+ | :sg:`circle(surface, color, center, radius) -> Rect`
+ | :sg:`circle(surface, color, center, radius, width=0, draw_top_right=None, draw_top_left=None, draw_bottom_left=None, draw_bottom_right=None) -> Rect`
+
+ Draws a circle on the given surface.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param center: center point of the circle as a sequence of 2 ints/floats,
+ e.g. ``(x, y)``
+ :type center: tuple(int or float, int or float) or
+ list(int or float, int or float) or Vector2(int or float, int or float)
+ :param radius: radius of the circle, measured from the ``center`` parameter,
+ nothing will be drawn if the ``radius`` is less than 1
+ :type radius: int or float
+ :param int width: (optional) used for line thickness or to indicate that
+ the circle is to be filled
+
+ | if ``width == 0``, (default) fill the circle
+ | if ``width > 0``, used for line thickness
+ | if ``width < 0``, nothing will be drawn
+ |
+
+ .. note::
+ When using ``width`` values ``> 1``, the edge lines will only grow
+ inward.
+ :param bool draw_top_right: (optional) if this is set to True then the top right corner
+ of the circle will be drawn
+ :param bool draw_top_left: (optional) if this is set to True then the top left corner
+ of the circle will be drawn
+ :param bool draw_bottom_left: (optional) if this is set to True then the bottom left corner
+ of the circle will be drawn
+ :param bool draw_bottom_right: (optional) if this is set to True then the bottom right corner
+ of the circle will be drawn
+
+ | if any of the draw_circle_part is True then it will draw all circle parts that have the True
+ | value, otherwise it will draw the entire circle.
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the ``center`` parameter value (float
+ values will be truncated) and its width and height will be 0
+ :rtype: Rect
+
+ :raises TypeError: if ``center`` is not a sequence of two numbers
+ :raises TypeError: if ``radius`` is not a number
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+ Nothing is drawn when the radius is 0 (a pixel at the ``center`` coordinates
+ used to be drawn when the radius equaled 0).
+ Floats, and Vector2 are accepted for the ``center`` param.
+ The drawing algorithm was improved to look more like a circle.
+ .. versionchanged:: 2.0.0.dev8 Added support for drawing circle quadrants.
+
+ .. ## pygame.draw.circle ##
+
+.. function:: ellipse
+
+ | :sl:`draw an ellipse`
+ | :sg:`ellipse(surface, color, rect) -> Rect`
+ | :sg:`ellipse(surface, color, rect, width=0) -> Rect`
+
+ Draws an ellipse on the given surface.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param Rect rect: rectangle to indicate the position and dimensions of the
+ ellipse, the ellipse will be centered inside the rectangle and bounded
+ by it
+ :param int width: (optional) used for line thickness or to indicate that
+ the ellipse is to be filled (not to be confused with the width value
+ of the ``rect`` parameter)
+
+ | if ``width == 0``, (default) fill the ellipse
+ | if ``width > 0``, used for line thickness
+ | if ``width < 0``, nothing will be drawn
+ |
+
+ .. note::
+ When using ``width`` values ``> 1``, the edge lines will only grow
+ inward from the original boundary of the ``rect`` parameter.
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the position of the given ``rect``
+ parameter and its width and height will be 0
+ :rtype: Rect
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+
+ .. ## pygame.draw.ellipse ##
+
+.. function:: arc
+
+ | :sl:`draw an elliptical arc`
+ | :sg:`arc(surface, color, rect, start_angle, stop_angle) -> Rect`
+ | :sg:`arc(surface, color, rect, start_angle, stop_angle, width=1) -> Rect`
+
+ Draws an elliptical arc on the given surface.
+
+ The two angle arguments are given in radians and indicate the start and stop
+ positions of the arc. The arc is drawn in a counterclockwise direction from
+ the ``start_angle`` to the ``stop_angle``.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param Rect rect: rectangle to indicate the position and dimensions of the
+ ellipse which the arc will be based on, the ellipse will be centered
+ inside the rectangle
+ :param float start_angle: start angle of the arc in radians
+ :param float stop_angle: stop angle of the arc in
+ radians
+
+ | if ``start_angle < stop_angle``, the arc is drawn in a
+ counterclockwise direction from the ``start_angle`` to the
+ ``stop_angle``
+ | if ``start_angle > stop_angle``, tau (tau == 2 * pi) will be added
+ to the ``stop_angle``, if the resulting stop angle value is greater
+ than the ``start_angle`` the above ``start_angle < stop_angle`` case
+ applies, otherwise nothing will be drawn
+ | if ``start_angle == stop_angle``, nothing will be drawn
+ |
+
+ :param int width: (optional) used for line thickness (not to be confused
+ with the width value of the ``rect`` parameter)
+
+ | if ``width == 0``, nothing will be drawn
+ | if ``width > 0``, (default is 1) used for line thickness
+ | if ``width < 0``, same as ``width == 0``
+
+ .. note::
+ When using ``width`` values ``> 1``, the edge lines will only grow
+ inward from the original boundary of the ``rect`` parameter.
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the position of the given ``rect``
+ parameter and its width and height will be 0
+ :rtype: Rect
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+
+ .. ## pygame.draw.arc ##
+
+.. function:: line
+
+ | :sl:`draw a straight line`
+ | :sg:`line(surface, color, start_pos, end_pos) -> Rect`
+ | :sg:`line(surface, color, start_pos, end_pos, width=1) -> Rect`
+
+ Draws a straight line on the given surface. There are no endcaps. For thick
+ lines the ends are squared off.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param start_pos: start position of the line, (x, y)
+ :type start_pos: tuple(int or float, int or float) or
+ list(int or float, int or float) or Vector2(int or float, int or float)
+ :param end_pos: end position of the line, (x, y)
+ :type end_pos: tuple(int or float, int or float) or
+ list(int or float, int or float) or Vector2(int or float, int or float)
+ :param int width: (optional) used for line thickness
+
+ | if width >= 1, used for line thickness (default is 1)
+ | if width < 1, nothing will be drawn
+ |
+
+ .. note::
+ When using ``width`` values ``> 1``, lines will grow as follows.
+
+ For odd ``width`` values, the thickness of each line grows with the
+ original line being in the center.
+
+ For even ``width`` values, the thickness of each line grows with the
+ original line being offset from the center (as there is no exact
+ center line drawn). As a result, lines with a slope < 1
+ (horizontal-ish) will have 1 more pixel of thickness below the
+ original line (in the y direction). Lines with a slope >= 1
+ (vertical-ish) will have 1 more pixel of thickness to the right of
+ the original line (in the x direction).
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the ``start_pos`` parameter value (float
+ values will be truncated) and its width and height will be 0
+ :rtype: Rect
+
+ :raises TypeError: if ``start_pos`` or ``end_pos`` is not a sequence of
+ two numbers
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+
+ .. ## pygame.draw.line ##
+
+.. function:: lines
+
+ | :sl:`draw multiple contiguous straight line segments`
+ | :sg:`lines(surface, color, closed, points) -> Rect`
+ | :sg:`lines(surface, color, closed, points, width=1) -> Rect`
+
+ Draws a sequence of contiguous straight lines on the given surface. There are
+ no endcaps or miter joints. For thick lines the ends are squared off.
+ Drawing thick lines with sharp corners can have undesired looking results.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param bool closed: if ``True`` an additional line segment is drawn between
+ the first and last points in the ``points`` sequence
+ :param points: a sequence of 2 or more (x, y) coordinates, where each
+ *coordinate* in the sequence must be a
+ tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats and adjacent
+ coordinates will be connected by a line segment, e.g. for the
+ points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will be drawn
+ from ``(x1, y1)`` to ``(x2, y2)`` and from ``(x2, y2)`` to ``(x3, y3)``,
+ additionally if the ``closed`` parameter is ``True`` another line segment
+ will be drawn from ``(x3, y3)`` to ``(x1, y1)``
+ :type points: tuple(coordinate) or list(coordinate)
+ :param int width: (optional) used for line thickness
+
+ | if width >= 1, used for line thickness (default is 1)
+ | if width < 1, nothing will be drawn
+ |
+
+ .. note::
+ When using ``width`` values ``> 1`` refer to the ``width`` notes
+ of :func:`line` for details on how thick lines grow.
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the position of the first point in the
+ ``points`` parameter (float values will be truncated) and its width and
+ height will be 0
+ :rtype: Rect
+
+ :raises ValueError: if ``len(points) < 2`` (must have at least 2 points)
+ :raises TypeError: if ``points`` is not a sequence or ``points`` does not
+ contain number pairs
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+
+ .. ## pygame.draw.lines ##
+
+.. function:: aaline
+
+ | :sl:`draw a straight antialiased line`
+ | :sg:`aaline(surface, color, start_pos, end_pos) -> Rect`
+ | :sg:`aaline(surface, color, start_pos, end_pos, blend=1) -> Rect`
+
+ Draws a straight antialiased line on the given surface.
+
+ The line has a thickness of one pixel and the endpoints have a height and
+ width of one pixel each.
+
+ The way a line and its endpoints are drawn:
+ If both endpoints are equal, only a single pixel is drawn (after
+ rounding floats to nearest integer).
+
+ Otherwise if the line is not steep (i.e. if the length along the x-axis
+ is greater than the height along the y-axis):
+
+ For each endpoint:
+
+ If ``x``, the endpoint's x-coordinate, is a whole number find
+ which pixels would be covered by it and draw them.
+
+ Otherwise:
+
+ Calculate the position of the nearest point with a whole number
+ for its x-coordinate, when extending the line past the
+ endpoint.
+
+ Find which pixels would be covered and how much by that point.
+
+ If the endpoint is the left one, multiply the coverage by (1 -
+ the decimal part of ``x``).
+
+ Otherwise multiply the coverage by the decimal part of ``x``.
+
+ Then draw those pixels.
+
+ *e.g.:*
+ | The left endpoint of the line ``((1, 1.3), (5, 3))`` would
+ cover 70% of the pixel ``(1, 1)`` and 30% of the pixel
+ ``(1, 2)`` while the right one would cover 100% of the
+ pixel ``(5, 3)``.
+ | The left endpoint of the line ``((1.2, 1.4), (4.6, 3.1))``
+ would cover 56% *(i.e. 0.8 * 70%)* of the pixel ``(1, 1)``
+ and 24% *(i.e. 0.8 * 30%)* of the pixel ``(1, 2)`` while
+ the right one would cover 42% *(i.e. 0.6 * 70%)* of the
+ pixel ``(5, 3)`` and 18% *(i.e. 0.6 * 30%)* of the pixel
+ ``(5, 4)`` while the right
+
+ Then for each point between the endpoints, along the line, whose
+ x-coordinate is a whole number:
+
+ Find which pixels would be covered and how much by that point and
+ draw them.
+
+ *e.g.:*
+ | The points along the line ``((1, 1), (4, 2.5))`` would be
+ ``(2, 1.5)`` and ``(3, 2)`` and would cover 50% of the pixel
+ ``(2, 1)``, 50% of the pixel ``(2, 2)`` and 100% of the pixel
+ ``(3, 2)``.
+ | The points along the line ``((1.2, 1.4), (4.6, 3.1))`` would
+ be ``(2, 1.8)`` (covering 20% of the pixel ``(2, 1)`` and 80%
+ of the pixel ``(2, 2)``), ``(3, 2.3)`` (covering 70% of the
+ pixel ``(3, 2)`` and 30% of the pixel ``(3, 3)``) and ``(4,
+ 2.8)`` (covering 20% of the pixel ``(2, 1)`` and 80% of the
+ pixel ``(2, 2)``)
+
+ Otherwise do the same for steep lines as for non-steep lines except
+ along the y-axis instead of the x-axis (using ``y`` instead of ``x``,
+ top instead of left and bottom instead of right).
+
+ .. note::
+ Regarding float values for coordinates, a point with coordinate
+ consisting of two whole numbers is considered being right in the center
+ of said pixel (and having a height and width of 1 pixel would therefore
+ completely cover it), while a point with coordinate where one (or both)
+ of the numbers have non-zero decimal parts would be partially covering
+ two (or four if both numbers have decimal parts) adjacent pixels, *e.g.*
+ the point ``(1.4, 2)`` covers 60% of the pixel ``(1, 2)`` and 40% of the
+ pixel ``(2,2)``.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param start_pos: start position of the line, (x, y)
+ :type start_pos: tuple(int or float, int or float) or
+ list(int or float, int or float) or Vector2(int or float, int or float)
+ :param end_pos: end position of the line, (x, y)
+ :type end_pos: tuple(int or float, int or float) or
+ list(int or float, int or float) or Vector2(int or float, int or float)
+ :param int blend: (optional) (deprecated) if non-zero (default) the line will be blended
+ with the surface's existing pixel shades, otherwise it will overwrite them
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the ``start_pos`` parameter value (float
+ values will be truncated) and its width and height will be 0
+ :rtype: Rect
+
+ :raises TypeError: if ``start_pos`` or ``end_pos`` is not a sequence of
+ two numbers
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+
+ .. ## pygame.draw.aaline ##
+
+.. function:: aalines
+
+ | :sl:`draw multiple contiguous straight antialiased line segments`
+ | :sg:`aalines(surface, color, closed, points) -> Rect`
+ | :sg:`aalines(surface, color, closed, points, blend=1) -> Rect`
+
+ Draws a sequence of contiguous straight antialiased lines on the given
+ surface.
+
+ :param Surface surface: surface to draw on
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or int or tuple(int, int, int, [int])
+ :param bool closed: if ``True`` an additional line segment is drawn between
+ the first and last points in the ``points`` sequence
+ :param points: a sequence of 2 or more (x, y) coordinates, where each
+ *coordinate* in the sequence must be a
+ tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats and adjacent
+ coordinates will be connected by a line segment, e.g. for the
+ points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will be drawn
+ from ``(x1, y1)`` to ``(x2, y2)`` and from ``(x2, y2)`` to ``(x3, y3)``,
+ additionally if the ``closed`` parameter is ``True`` another line segment
+ will be drawn from ``(x3, y3)`` to ``(x1, y1)``
+ :type points: tuple(coordinate) or list(coordinate)
+ :param int blend: (optional) (deprecated) if non-zero (default) each line will be blended
+ with the surface's existing pixel shades, otherwise the pixels will be
+ overwritten
+
+ :returns: a rect bounding the changed pixels, if nothing is drawn the
+ bounding rect's position will be the position of the first point in the
+ ``points`` parameter (float values will be truncated) and its width and
+ height will be 0
+ :rtype: Rect
+
+ :raises ValueError: if ``len(points) < 2`` (must have at least 2 points)
+ :raises TypeError: if ``points`` is not a sequence or ``points`` does not
+ contain number pairs
+
+ .. versionchanged:: 2.0.0 Added support for keyword arguments.
+
+ .. ## pygame.draw.aalines ##
+
+.. ## pygame.draw ##
+
+.. figure:: code_examples/draw_module_example.png
+ :alt: draw module example
+
+ Example code for draw module.
+
+.. literalinclude:: code_examples/draw_module_example.py
+
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/event.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/event.rst.txt
new file mode 100644
index 00000000..0e4db222
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/event.rst.txt
@@ -0,0 +1,565 @@
+.. include:: common.txt
+
+:mod:`pygame.event`
+===================
+
+.. module:: pygame.event
+ :synopsis: pygame module for interacting with events and queues
+
+| :sl:`pygame module for interacting with events and queues`
+
+Pygame handles all its event messaging through an event queue. The routines in
+this module help you manage that event queue. The input queue is heavily
+dependent on the :mod:`pygame.display` module. If the display has not been
+initialized and a video mode not set, the event queue may not work properly.
+
+The event queue has an upper limit on the number of events it can hold. When
+the queue becomes full new events are quietly dropped. To prevent lost events,
+especially input events which signal a quit command, your program must handle
+events every frame (with ``pygame.event.get()``, ``pygame.event.pump()``,
+``pygame.event.wait()``, ``pygame.event.peek()`` or ``pygame.event.clear()``)
+and process them. Not handling events may cause your system to decide your
+program has locked up. To speed up queue processing use
+:func:`pygame.event.set_blocked()` to limit which events get queued.
+
+To get the state of various input devices, you can forego the event queue and
+access the input devices directly with their appropriate modules:
+:mod:`pygame.mouse`, :mod:`pygame.key`, and :mod:`pygame.joystick`. If you use
+this method, remember that pygame requires some form of communication with the
+system window manager and other parts of the platform. To keep pygame in sync
+with the system, you will need to call :func:`pygame.event.pump()` to keep
+everything current. Usually, this should be called once per game loop.
+Note: Joysticks will not send any events until the device has been initialized.
+
+The event queue contains :class:`pygame.event.Event` event objects.
+There are a variety of ways to access the queued events, from simply
+checking for the existence of events, to grabbing them directly off the stack.
+The event queue also offers some simple filtering which can slightly help
+performance by blocking certain event types from the queue. Use
+:func:`pygame.event.set_allowed()` and :func:`pygame.event.set_blocked()` to
+change this filtering. By default, all event types can be placed on the queue.
+
+All :class:`pygame.event.Event` instances contain an event type identifier
+and attributes specific to that event type. The event type identifier is
+accessible as the :attr:`pygame.event.Event.type` property. Any of the
+event specific attributes can be accessed through the
+:attr:`pygame.event.Event.__dict__` attribute or directly as an attribute
+of the event object (as member lookups are passed through to the object's
+dictionary values). The event object has no method functions. Users can create
+their own new events with the :func:`pygame.event.Event()` function.
+
+The event type identifier is in between the values of ``NOEVENT`` and
+``NUMEVENTS``. User defined events should have a value in the inclusive range
+of ``USEREVENT`` to ``NUMEVENTS - 1``. User defined events can get a custom
+event number with :func:`pygame.event.custom_type()`.
+It is recommended all user events follow this system.
+
+Events support equality and inequality comparisons. Two events are equal if
+they are the same type and have identical attribute values.
+
+While debugging and experimenting, you can print an event object for a quick
+display of its type and members. The function :func:`pygame.event.event_name()`
+can be used to get a string representing the name of the event type.
+
+Events that come from the system will have a guaranteed set of member
+attributes based on the type. The following is a list event types with their
+specific attributes.
+
+::
+
+ QUIT none
+ ACTIVEEVENT gain, state
+ KEYDOWN key, mod, unicode, scancode
+ KEYUP key, mod, unicode, scancode
+ MOUSEMOTION pos, rel, buttons, touch
+ MOUSEBUTTONUP pos, button, touch
+ MOUSEBUTTONDOWN pos, button, touch
+ JOYAXISMOTION joy (deprecated), instance_id, axis, value
+ JOYBALLMOTION joy (deprecated), instance_id, ball, rel
+ JOYHATMOTION joy (deprecated), instance_id, hat, value
+ JOYBUTTONUP joy (deprecated), instance_id, button
+ JOYBUTTONDOWN joy (deprecated), instance_id, button
+ VIDEORESIZE size, w, h
+ VIDEOEXPOSE none
+ USEREVENT code
+
+.. versionchanged:: 2.0.0 The ``joy`` attribute was deprecated, ``instance_id`` was added.
+
+.. versionchanged:: 2.0.1 The ``unicode`` attribute was added to ``KEYUP`` event.
+
+Note that ``ACTIVEEVENT``, ``VIDEORESIZE`` and ``VIDEOEXPOSE`` are considered
+as "legacy" events, the use of pygame2 ``WINDOWEVENT`` API is recommended over
+the use of this older API.
+
+You can also find a list of constants for keyboard keys
+:ref:`here `.
+
+A keyboard event occurs when a key is pressed (``KEYDOWN``) and when a key is released (``KEYUP``)
+The ``key`` attribute of keyboard events contains the value of what key was pressed or released.
+The ``mod`` attribute contains information about the state of keyboard modifiers (SHIFT, CTRL, ALT, etc.).
+The ``unicode`` attribute stores the 16-bit unicode value of the key that was pressed or released.
+The ``scancode`` attribute represents the physical location of a key on the keyboard.
+
+The ``ACTIVEEVENT`` contains information about the application gaining or losing focus. The ``gain`` attribute
+will be 1 if the mouse enters the window, otherwise ``gain`` will be 0. The ``state`` attribute will have a
+value of ``SDL_APPMOUSEFOCUS`` if mouse focus was gained/lost, ``SDL_APPINPUTFOCUS`` if the application loses
+or gains keyboard focus, or ``SDL_APPACTIVE`` if the application is minimized (``gain`` will be 0) or restored.
+
+|
+
+When compiled with SDL2, pygame has these additional events and their
+attributes.
+
+::
+
+ AUDIODEVICEADDED which, iscapture (SDL backend >= 2.0.4)
+ AUDIODEVICEREMOVED which, iscapture (SDL backend >= 2.0.4)
+ FINGERMOTION touch_id, finger_id, x, y, dx, dy
+ FINGERDOWN touch_id, finger_id, x, y, dx, dy
+ FINGERUP touch_id, finger_id, x, y, dx, dy
+ MOUSEWHEEL which, flipped, x, y, touch, precise_x, precise_y
+ MULTIGESTURE touch_id, x, y, pinched, rotated, num_fingers
+ TEXTEDITING text, start, length
+ TEXTINPUT text
+
+.. versionadded:: 1.9.5
+
+.. versionchanged:: 2.0.2 Fixed amount horizontal scroll (x, positive to the right and negative to the left).
+
+.. versionchanged:: 2.0.2 The ``touch`` attribute was added to all the ``MOUSE`` events.
+
+The ``touch`` attribute of ``MOUSE`` events indicates whether or not the events were generated
+by a touch input device, and not a real mouse. You might want to ignore such events, if your application
+already handles ``FINGERMOTION``, ``FINGERDOWN`` and ``FINGERUP`` events.
+
+.. versionadded:: 2.1.3 Added ``precise_x`` and ``precise_y`` to ``MOUSEWHEEL`` events
+
+``MOUSEWHEEL`` event occurs whenever the mouse wheel is moved.
+The ``which`` attribute determines if the event was generated from a touch input device vs an actual
+mousewheel.
+The ``preciseX`` attribute contains a float with the amount scrolled horizontally (positive to the right,
+negative to the left).
+The ``preciseY`` attribute contains a float with the amount scrolled vertically (positive away from user,
+negative towards user).
+The ``flipped`` attribute determines if the values in x and y will be opposite or not. If ``SDL_MOUSEWHEEL_FLIPPED``
+is defined, the direction of x and y will be opposite.
+
+``TEXTEDITING`` event is triggered when a user activates an input method via hotkey or selecting an
+input method in a GUI and starts typing
+
+The ``which`` attribute for ``AUDIODEVICE*`` events is an integer representing the index for new audio
+devices that are added. ``AUDIODEVICE*`` events are used to update audio settings or device list.
+
+|
+
+Many new events were introduced in pygame 2.
+
+pygame can recognize text or files dropped in its window. If a file
+is dropped, ``DROPFILE`` event will be sent, ``file`` will be its path.
+The ``DROPTEXT`` event is only supported on X11.
+
+``MIDIIN`` and ``MIDIOUT`` are events reserved for :mod:`pygame.midi` use.
+``MIDI*`` events differ from ``AUDIODEVICE*`` events in that AUDIODEVICE
+events are triggered when there is a state change related to an audio
+input/output device.
+
+pygame 2 also supports controller hot-plugging
+
+::
+
+ Event name Attributes and notes
+
+ DROPFILE file
+ DROPBEGIN (SDL backend >= 2.0.5)
+ DROPCOMPLETE (SDL backend >= 2.0.5)
+ DROPTEXT text (SDL backend >= 2.0.5)
+ MIDIIN
+ MIDIOUT
+ CONTROLLERDEVICEADDED device_index
+ JOYDEVICEADDED device_index
+ CONTROLLERDEVICEREMOVED instance_id
+ JOYDEVICEREMOVED instance_id
+ CONTROLLERDEVICEREMAPPED instance_id
+ KEYMAPCHANGED (SDL backend >= 2.0.4)
+ CLIPBOARDUPDATE
+ RENDER_TARGETS_RESET (SDL backend >= 2.0.2)
+ RENDER_DEVICE_RESET (SDL backend >= 2.0.4)
+ LOCALECHANGED (SDL backend >= 2.0.14)
+
+Also in this version, ``instance_id`` attributes were added to joystick events,
+and the ``joy`` attribute was deprecated.
+
+``KEYMAPCHANGED`` is a type of an event sent when keymap changes due to a
+system event such as an input language or keyboard layout change.
+
+``CLIPBOARDUPDATE`` is an event sent when clipboard changes. This can still
+be considered as an experimental feature, some kinds of clipboard changes might
+not trigger this event.
+
+``LOCALECHANGED`` is an event sent when user locale changes
+
+.. versionadded:: 2.0.0
+
+.. versionadded:: 2.1.3 ``KEYMAPCHANGED``, ``CLIPBOARDUPDATE``,
+ ``RENDER_TARGETS_RESET``, ``RENDER_DEVICE_RESET`` and ``LOCALECHANGED``
+
+|
+
+Since pygame 2.0.1, there are a new set of events, called window events.
+Here is a list of all window events, along with a short description
+
+::
+
+ Event type Short description
+
+ WINDOWSHOWN Window became shown
+ WINDOWHIDDEN Window became hidden
+ WINDOWEXPOSED Window got updated by some external event
+ WINDOWMOVED Window got moved
+ WINDOWRESIZED Window got resized
+ WINDOWSIZECHANGED Window changed its size
+ WINDOWMINIMIZED Window was minimized
+ WINDOWMAXIMIZED Window was maximized
+ WINDOWRESTORED Window was restored
+ WINDOWENTER Mouse entered the window
+ WINDOWLEAVE Mouse left the window
+ WINDOWFOCUSGAINED Window gained focus
+ WINDOWFOCUSLOST Window lost focus
+ WINDOWCLOSE Window was closed
+ WINDOWTAKEFOCUS Window was offered focus (SDL backend >= 2.0.5)
+ WINDOWHITTEST Window has a special hit test (SDL backend >= 2.0.5)
+ WINDOWICCPROFCHANGED Window ICC profile changed (SDL backend >= 2.0.18)
+ WINDOWDISPLAYCHANGED Window moved on a new display (SDL backend >= 2.0.18)
+
+
+``WINDOWMOVED``, ``WINDOWRESIZED`` and ``WINDOWSIZECHANGED`` have ``x`` and
+``y`` attributes, ``WINDOWDISPLAYCHANGED`` has a ``display_index`` attribute.
+All windowevents have a ``window`` attribute.
+
+.. versionadded:: 2.0.1
+
+.. versionadded:: 2.1.3 ``WINDOWICCPROFCHANGED`` and ``WINDOWDISPLAYCHANGED``
+
+|
+
+On Android, the following events can be generated
+
+::
+
+ Event type Short description
+
+ APP_TERMINATING OS is terminating the application
+ APP_LOWMEMORY OS is low on memory, try to free memory if possible
+ APP_WILLENTERBACKGROUND Application is entering background
+ APP_DIDENTERBACKGROUND Application entered background
+ APP_WILLENTERFOREGROUND Application is entering foreground
+ APP_DIDENTERFOREGROUND Application entered foreground
+
+.. versionadded:: 2.1.3
+
+|
+
+.. function:: pump
+
+ | :sl:`internally process pygame event handlers`
+ | :sg:`pump() -> None`
+
+ For each frame of your game, you will need to make some sort of call to the
+ event queue. This ensures your program can internally interact with the rest
+ of the operating system. If you are not using other event functions in your
+ game, you should call ``pygame.event.pump()`` to allow pygame to handle
+ internal actions.
+
+ This function is not necessary if your program is consistently processing
+ events on the queue through the other :mod:`pygame.event` functions.
+
+ There are important things that must be dealt with internally in the event
+ queue. The main window may need to be repainted or respond to the system. If
+ you fail to make a call to the event queue for too long, the system may
+ decide your program has locked up.
+
+ .. caution::
+ This function should only be called in the thread that initialized :mod:`pygame.display`.
+
+ .. ## pygame.event.pump ##
+
+.. function:: get
+
+ | :sl:`get events from the queue`
+ | :sg:`get(eventtype=None) -> Eventlist`
+ | :sg:`get(eventtype=None, pump=True) -> Eventlist`
+ | :sg:`get(eventtype=None, pump=True, exclude=None) -> Eventlist`
+
+ This will get all the messages and remove them from the queue. If a type or
+ sequence of types is given only those messages will be removed from the
+ queue and returned.
+
+ If a type or sequence of types is passed in the ``exclude`` argument
+ instead, then all only *other* messages will be removed from the queue. If
+ an ``exclude`` parameter is passed, the ``eventtype`` parameter *must* be
+ None.
+
+ If you are only taking specific events from the queue, be aware that the
+ queue could eventually fill up with the events you are not interested.
+
+ If ``pump`` is ``True`` (the default), then :func:`pygame.event.pump()` will be called.
+
+ .. versionchanged:: 1.9.5 Added ``pump`` argument
+ .. versionchanged:: 2.0.2 Added ``exclude`` argument
+
+ .. ## pygame.event.get ##
+
+.. function:: poll
+
+ | :sl:`get a single event from the queue`
+ | :sg:`poll() -> Event instance`
+
+ Returns a single event from the queue. If the event queue is empty an event
+ of type ``pygame.NOEVENT`` will be returned immediately. The returned event
+ is removed from the queue.
+
+ .. caution::
+ This function should only be called in the thread that initialized :mod:`pygame.display`.
+
+ .. ## pygame.event.poll ##
+
+.. function:: wait
+
+ | :sl:`wait for a single event from the queue`
+ | :sg:`wait() -> Event instance`
+ | :sg:`wait(timeout) -> Event instance`
+
+ Returns a single event from the queue. If the queue is empty this function
+ will wait until one is created. From pygame 2.0.0, if a ``timeout`` argument
+ is given, the function will return an event of type ``pygame.NOEVENT``
+ if no events enter the queue in ``timeout`` milliseconds. The event is removed
+ from the queue once it has been returned. While the program is waiting it will
+ sleep in an idle state. This is important for programs that want to share the
+ system with other applications.
+
+ .. versionchanged:: 2.0.0.dev13 Added ``timeout`` argument
+
+ .. caution::
+ This function should only be called in the thread that initialized :mod:`pygame.display`.
+
+ .. ## pygame.event.wait ##
+
+.. function:: peek
+
+ | :sl:`test if event types are waiting on the queue`
+ | :sg:`peek(eventtype=None) -> bool`
+ | :sg:`peek(eventtype=None, pump=True) -> bool`
+
+ Returns ``True`` if there are any events of the given type waiting on the
+ queue. If a sequence of event types is passed, this will return ``True`` if
+ any of those events are on the queue.
+
+ If ``pump`` is ``True`` (the default), then :func:`pygame.event.pump()` will be called.
+
+ .. versionchanged:: 1.9.5 Added ``pump`` argument
+
+ .. ## pygame.event.peek ##
+
+.. function:: clear
+
+ | :sl:`remove all events from the queue`
+ | :sg:`clear(eventtype=None) -> None`
+ | :sg:`clear(eventtype=None, pump=True) -> None`
+
+ Removes all events from the queue. If ``eventtype`` is given, removes the given event
+ or sequence of events. This has the same effect as :func:`pygame.event.get()` except ``None``
+ is returned. It can be slightly more efficient when clearing a full event queue.
+
+ If ``pump`` is ``True`` (the default), then :func:`pygame.event.pump()` will be called.
+
+ .. versionchanged:: 1.9.5 Added ``pump`` argument
+
+ .. ## pygame.event.clear ##
+
+.. function:: event_name
+
+ | :sl:`get the string name from an event id`
+ | :sg:`event_name(type) -> string`
+
+ Returns a string representing the name (in CapWords style) of the given
+ event type.
+
+ "UserEvent" is returned for all values in the user event id range.
+ "Unknown" is returned when the event type does not exist.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+ .. ## pygame.event.event_name ##
+
+
+.. function:: set_blocked
+
+ | :sl:`control which events are allowed on the queue`
+ | :sg:`set_blocked(type) -> None`
+ | :sg:`set_blocked(typelist) -> None`
+ | :sg:`set_blocked(None) -> None`
+
+ The given event types are not allowed to appear on the event queue. By
+ default all events can be placed on the queue. It is safe to disable an
+ event type multiple times.
+
+ If ``None`` is passed as the argument, ALL of the event types are blocked
+ from being placed on the queue.
+
+ .. ## pygame.event.set_blocked ##
+
+.. function:: set_allowed
+
+ | :sl:`control which events are allowed on the queue`
+ | :sg:`set_allowed(type) -> None`
+ | :sg:`set_allowed(typelist) -> None`
+ | :sg:`set_allowed(None) -> None`
+
+ The given event types are allowed to appear on the event queue. By default,
+ all event types can be placed on the queue. It is safe to enable an event
+ type multiple times.
+
+ If ``None`` is passed as the argument, ALL of the event types are allowed
+ to be placed on the queue.
+
+ .. ## pygame.event.set_allowed ##
+
+.. function:: get_blocked
+
+ | :sl:`test if a type of event is blocked from the queue`
+ | :sg:`get_blocked(type) -> bool`
+ | :sg:`get_blocked(typelist) -> bool`
+
+ Returns ``True`` if the given event type is blocked from the queue. If a
+ sequence of event types is passed, this will return ``True`` if any of those
+ event types are blocked.
+
+ .. ## pygame.event.get_blocked ##
+
+.. function:: set_grab
+
+ | :sl:`control the sharing of input devices with other applications`
+ | :sg:`set_grab(bool) -> None`
+
+ When your program runs in a windowed environment, it will share the mouse
+ and keyboard devices with other applications that have focus. If your
+ program sets the event grab to ``True``, it will lock all input into your
+ program.
+
+ It is best to not always grab the input, since it prevents the user from
+ doing other things on their system.
+
+ .. ## pygame.event.set_grab ##
+
+.. function:: get_grab
+
+ | :sl:`test if the program is sharing input devices`
+ | :sg:`get_grab() -> bool`
+
+ Returns ``True`` when the input events are grabbed for this application.
+
+ .. ## pygame.event.get_grab ##
+
+.. function:: set_keyboard_grab
+
+ | :sl:`grab enables capture of system keyboard shortcuts like Alt+Tab or the Meta/Super key.`
+ | :sg:`set_keyboard_grab(bool) -> None`
+
+ Keyboard grab enables capture of system keyboard shortcuts like Alt+Tab or the Meta/Super key.
+ Note that not all system keyboard shortcuts can be captured by applications (one example is Ctrl+Alt+Del on Windows).
+ This is primarily intended for specialized applications such as VNC clients or VM frontends. Normal games should not use keyboard grab.
+
+ .. versionadded:: 2.5.0
+
+ .. ## pygame.event.set_keyboard_grab ##
+
+.. function:: get_keyboard_grab
+
+ | :sl:`get the current keyboard grab state`
+ | :sg:`get_keyboard_grab() -> bool`
+
+ Returns ``True`` when keyboard grab is enabled.
+
+ .. versionadded:: 2.5.0
+
+ .. ## pygame.event.get_keyboard_grab ##
+
+.. function:: post
+
+ | :sl:`place a new event on the queue`
+ | :sg:`post(Event) -> bool`
+
+ Places the given event at the end of the event queue.
+
+ This is usually used for placing custom events on the event queue.
+ Any type of event can be posted, and the events posted can have any attributes.
+
+ This returns a boolean on whether the event was posted or not. Blocked events
+ cannot be posted, and this function returns ``False`` if you try to post them.
+
+ .. versionchanged:: 2.0.1 returns a boolean, previously returned ``None``
+
+ .. ## pygame.event.post ##
+
+.. function:: custom_type
+
+ | :sl:`make custom user event type`
+ | :sg:`custom_type() -> int`
+
+ Reserves a ``pygame.USEREVENT`` for a custom use.
+
+ If too many events are made a :exc:`pygame.error` is raised.
+
+ .. versionadded:: 2.0.0.dev3
+
+ .. ## pygame.event.custom_type ##
+
+.. class:: Event
+
+ | :sl:`pygame object for representing events`
+ | :sg:`Event(type, dict) -> Event`
+ | :sg:`Event(type, \**attributes) -> Event`
+
+ A pygame object used for representing an event. ``Event`` instances
+ support attribute assignment and deletion.
+
+ When creating the object, the attributes may come from a dictionary
+ argument with string keys or from keyword arguments.
+
+ .. note::
+ From version 2.1.3 ``EventType`` is an alias for ``Event``. Beforehand,
+ ``Event`` was a function that returned ``EventType`` instances. Use of
+ ``Event`` is preferred over ``EventType`` wherever it is possible, as
+ the latter could be deprecated in a future version.
+
+ .. attribute:: type
+
+ | :sl:`event type identifier.`
+ | :sg:`type -> int`
+
+ Read-only. The event type identifier. For user created event
+ objects, this is the ``type`` argument passed to
+ :func:`pygame.event.Event()`.
+
+ For example, some predefined event identifiers are ``QUIT`` and
+ ``MOUSEMOTION``.
+
+ .. ## pygame.event.Event.type ##
+
+ .. attribute:: __dict__
+
+ | :sl:`event attribute dictionary`
+ | :sg:`__dict__ -> dict`
+
+ Read-only. The event type specific attributes of an event. The
+ ``dict`` attribute is a synonym for backward compatibility.
+
+ For example, the attributes of a ``KEYDOWN`` event would be ``unicode``,
+ ``key``, and ``mod``
+
+ .. ## pygame.event.Event.__dict__ ##
+
+ .. versionadded:: 1.9.2 Mutable attributes.
+
+ .. ## pygame.event.Event ##
+
+.. ## pygame.event ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/examples.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/examples.rst.txt
new file mode 100644
index 00000000..000ea76c
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/examples.rst.txt
@@ -0,0 +1,451 @@
+.. include:: common.txt
+
+:mod:`pygame.examples`
+======================
+
+.. module:: pygame.examples
+ :synopsis: module of example programs
+
+| :sl:`module of example programs`
+
+These examples should help get you started with pygame. Here is a brief rundown
+of what you get. The source code for these examples is in the public domain.
+Feel free to use for your own projects.
+
+There are several ways to run the examples. First they can be run as
+stand-alone programs. Second they can be imported and their ``main()`` methods
+called (see below). Finally, the easiest way is to use the python -m option:
+
+::
+
+ python -m pygame.examples.
+
+eg:
+
+::
+
+ python -m pygame.examples.scaletest someimage.png
+
+Resources such as images and sounds for the examples are found in the
+pygame/examples/data subdirectory.
+
+You can find where the example files are installed by using the following
+commands inside the python interpreter.
+
+::
+
+ >>> import pygame.examples.scaletest
+ >>> pygame.examples.scaletest.__file__
+ '/usr/lib/python2.6/site-packages/pygame/examples/scaletest.py'
+
+On each OS and version of Python the location will be slightly different.
+For example on Windows it might be in 'C:/Python26/Lib/site-packages/pygame/examples/'
+On Mac OS X it might be in '/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pygame/examples/'
+
+
+You can also run the examples in the python interpreter by calling each modules main() function.
+
+::
+
+ >>> import pygame.examples.scaletest
+ >>> pygame.examples.scaletest.main()
+
+
+We're always on the lookout for more examples and/or example requests. Code
+like this is probably the best way to start getting involved with python
+gaming.
+
+examples as a package is new to pygame 1.9.0. But most of the examples came with
+pygame much earlier.
+
+.. function:: aliens.main
+
+ | :sl:`play the full aliens example`
+ | :sg:`aliens.main() -> None`
+
+ This started off as a port of the ``SDL`` demonstration, Aliens. Now it has
+ evolved into something sort of resembling fun. This demonstrates a lot of
+ different uses of sprites and optimized blitting. Also transparency,
+ colorkeys, fonts, sound, music, joystick, and more. (PS, my high score is
+ 117! goodluck)
+
+ .. ## pygame.examples.aliens.main ##
+
+.. function:: stars.main
+
+ | :sl:`run a simple starfield example`
+ | :sg:`stars.main() -> None`
+
+ A simple starfield example. You can change the center of perspective by
+ leftclicking the mouse on the screen.
+
+ .. ## pygame.examples.stars.main ##
+
+.. function:: chimp.main
+
+ | :sl:`hit the moving chimp`
+ | :sg:`chimp.main() -> None`
+
+ This simple example is derived from the line-by-line tutorial that comes
+ with pygame. It is based on a 'popular' web banner. Note there are comments
+ here, but for the full explanation, follow along in the tutorial.
+
+ .. ## pygame.examples.chimp.main ##
+
+.. function:: moveit.main
+
+ | :sl:`display animated objects on the screen`
+ | :sg:`moveit.main() -> None`
+
+ This is the full and final example from the Pygame Tutorial, "How Do I Make
+ It Move". It creates 10 objects and animates them on the screen.
+
+ Note it's a bit scant on error checking, but it's easy to read. :]
+ Fortunately, this is python, and we needn't wrestle with a pile of error
+ codes.
+
+ .. ## pygame.examples.moveit.main ##
+
+.. function:: fonty.main
+
+ | :sl:`run a font rendering example`
+ | :sg:`fonty.main() -> None`
+
+ Super quick, super simple application demonstrating the different ways to
+ render fonts with the font module
+
+ .. ## pygame.examples.fonty.main ##
+
+.. function:: freetype_misc.main
+
+ | :sl:`run a FreeType rendering example`
+ | :sg:`freetype_misc.main() -> None`
+
+ A showcase of rendering features the :class:`pygame.freetype.Font`
+ class provides in addition to those available with :class:`pygame.font.Font`.
+ It is a demonstration of direct to surface rendering, with vertical text
+ and rotated text, opaque text and semi transparent text, horizontally
+ stretched text and vertically stretched text.
+
+ .. ## pygame.examples.fonty.main ##
+
+.. function:: vgrade.main
+
+ | :sl:`display a vertical gradient`
+ | :sg:`vgrade.main() -> None`
+
+ Demonstrates creating a vertical gradient with pixelcopy and NumPy python.
+ The app will create a new gradient every half second and report the time
+ needed to create and display the image. If you're not prepared to start
+ working with the NumPy arrays, don't worry about the source for this one :]
+
+ .. ## pygame.examples.vgrade.main ##
+
+.. function:: eventlist.main
+
+ | :sl:`display pygame events`
+ | :sg:`eventlist.main() -> None`
+
+ Eventlist is a sloppy style of pygame, but is a handy tool for learning
+ about pygame events and input. At the top of the screen are the state of
+ several device values, and a scrolling list of events are displayed on the
+ bottom.
+
+ This is not quality 'ui' code at all, but you can see how to implement very
+ non-interactive status displays, or even a crude text output control.
+
+ .. ## pygame.examples.eventlist.main ##
+
+.. function:: arraydemo.main
+
+ | :sl:`show various surfarray effects`
+ | :sg:`arraydemo.main(arraytype=None) -> None`
+
+ Another example filled with various surfarray effects. It requires the
+ surfarray and image modules to be installed. This little demo can also make
+ a good starting point for any of your own tests with surfarray
+
+ The ``arraytype`` parameter is deprecated; passing any value besides 'numpy'
+ will raise ValueError.
+
+ .. ## pygame.examples.arraydemo.main ##
+
+.. function:: sound.main
+
+ | :sl:`load and play a sound`
+ | :sg:`sound.main(file_path=None) -> None`
+
+ Extremely basic testing of the mixer module. Load a sound and play it. All
+ from the command shell, no graphics.
+
+ If provided, use the audio file 'file_path', otherwise use a default file.
+
+ ``sound.py`` optional command line argument: an audio file
+
+ .. ## pygame.examples.sound.main ##
+
+.. function:: sound_array_demos.main
+
+ | :sl:`play various sndarray effects`
+ | :sg:`sound_array_demos.main(arraytype=None) -> None`
+
+
+ Uses sndarray and NumPy to create offset faded copies of the
+ original sound. Currently it just uses hardcoded values for the number of
+ echoes and the delay. Easy for you to recreate as needed.
+
+ The ``arraytype`` parameter is deprecated; passing any value besides 'numpy'
+ will raise ValueError.
+
+ .. ## pygame.examples.sound_array_demos.main ##
+
+.. function:: liquid.main
+
+ | :sl:`display an animated liquid effect`
+ | :sg:`liquid.main() -> None`
+
+ This example was created in a quick comparison with the BlitzBasic gaming
+ language. Nonetheless, it demonstrates a quick 8-bit setup (with colormap).
+
+ .. ## pygame.examples.liquid.main ##
+
+.. function:: glcube.main
+
+ | :sl:`display an animated 3D cube using OpenGL`
+ | :sg:`glcube.main() -> None`
+
+ Using PyOpenGL and pygame, this creates a spinning 3D multicolored cube.
+
+ .. ## pygame.examples.glcube.main ##
+
+.. function:: scrap_clipboard.main
+
+ | :sl:`access the clipboard`
+ | :sg:`scrap_clipboard.main() -> None`
+
+ A simple demonstration example for the clipboard support.
+
+ .. ## pygame.examples.scrap_clipboard.main ##
+
+.. function:: mask.main
+
+ | :sl:`display multiple images bounce off each other using collision detection`
+ | :sg:`mask.main(*args) -> None`
+
+ Positional arguments:
+
+ ::
+
+ one or more image file names.
+
+ This ``pygame.masks`` demo will display multiple moving sprites bouncing off
+ each other. More than one sprite image can be provided.
+
+ If run as a program then ``mask.py`` takes one or more image files as
+ command line arguments.
+
+ .. ## pygame.examples.mask.main ##
+
+.. function:: testsprite.main
+
+ | :sl:`show lots of sprites moving around`
+ | :sg:`testsprite.main(update_rects = True, use_static = False, use_FastRenderGroup = False, screen_dims = [640, 480], use_alpha = False, flags = 0) -> None`
+
+ Optional keyword arguments:
+
+ ::
+
+ update_rects - use the RenderUpdate sprite group class
+ use_static - include non-moving images
+ use_FastRenderGroup - Use the FastRenderGroup sprite group
+ screen_dims - pygame window dimensions
+ use_alpha - use alpha blending
+ flags - additional display mode flags
+
+ Like the ``testsprite.c`` that comes with SDL, this pygame version shows
+ lots of sprites moving around.
+
+ If run as a stand-alone program then no command line arguments are taken.
+
+ .. ## pygame.examples.testsprite.main ##
+
+.. function:: headless_no_windows_needed.main
+
+ | :sl:`write an image file that is smoothscaled copy of an input file`
+ | :sg:`headless_no_windows_needed.main(fin, fout, w, h) -> None`
+
+ arguments:
+
+ ::
+
+ fin - name of an input image file
+ fout - name of the output file to create/overwrite
+ w, h - size of the rescaled image, as integer width and height
+
+ How to use pygame with no windowing system, like on headless servers.
+
+ Thumbnail generation with scaling is an example of what you can do with
+ pygame.
+
+ ``NOTE``: the pygame scale function uses MMX/SSE if available, and can be
+ run in multiple threads.
+
+ If ``headless_no_windows_needed.py`` is run as a program it takes the
+ following command line arguments:
+
+ ::
+
+ -scale inputimage outputimage new_width new_height
+ eg. -scale in.png outpng 50 50
+
+ .. ## pygame.examples.headless_no_windows_needed.main ##
+
+.. function:: joystick.main
+
+ | :sl:`demonstrate joystick functionality`
+ | :sg:`joystick.main() -> None`
+
+ A demo showing full joystick support.
+
+ .. versionadded:: 2.0.2
+
+ .. ## pygame.examples.joystick.main ##
+
+.. function:: blend_fill.main
+
+ | :sl:`demonstrate the various surface.fill method blend options`
+ | :sg:`blend_fill.main() -> None`
+
+ A interactive demo that lets one choose which BLEND_xxx option to apply to a
+ surface.
+
+ .. ## pygame.examples.blend_fill.main ##
+
+.. function:: blit_blends.main
+
+ | :sl:`uses alternative additive fill to that of surface.fill`
+ | :sg:`blit_blends.main() -> None`
+
+ Fake additive blending. Using NumPy. it doesn't clamp. Press r,g,b Somewhat
+ like blend_fill.
+
+ .. ## pygame.examples.blit_blends.main ##
+
+.. function:: cursors.main
+
+ | :sl:`display two different custom cursors`
+ | :sg:`cursors.main() -> None`
+
+ Display an arrow or circle with crossbar cursor.
+
+ .. ## pygame.examples.cursors.main ##
+
+.. function:: pixelarray.main
+
+ | :sl:`display various pixelarray generated effects`
+ | :sg:`pixelarray.main() -> None`
+
+ Display various pixelarray generated effects.
+
+ .. ## pygame.examples.pixelarray.main ##
+
+.. function:: scaletest.main
+
+ | :sl:`interactively scale an image using smoothscale`
+ | :sg:`scaletest.main(imagefile, convert_alpha=False, run_speed_test=True) -> None`
+
+ arguments:
+
+ ::
+
+ imagefile - file name of source image (required)
+ convert_alpha - use convert_alpha() on the surf (default False)
+ run_speed_test - (default False)
+
+ A smoothscale example that resized an image on the screen. Vertical and
+ horizontal arrow keys are used to change the width and height of the
+ displayed image. If the convert_alpha option is True then the source image
+ is forced to have source alpha, whether or not the original images does. If
+ run_speed_test is True then a background timing test is performed instead of
+ the interactive scaler.
+
+ If ``scaletest.py`` is run as a program then the command line options are:
+
+ ::
+
+ ImageFile [-t] [-convert_alpha]
+ [-t] = Run Speed Test
+ [-convert_alpha] = Use convert_alpha() on the surf.
+
+ .. ## pygame.examples.scaletest.main ##
+
+.. function:: midi.main
+
+ | :sl:`run a midi example`
+ | :sg:`midi.main(mode='output', device_id=None) -> None`
+
+ Arguments:
+
+ ::
+
+ mode - if 'output' run a midi keyboard output example
+ 'input' run a midi event logger input example
+ 'list' list available midi devices
+ (default 'output')
+ device_id - midi device number; if None then use the default midi input or
+ output device for the system
+
+ The output example shows how to translate mouse clicks or computer keyboard
+ events into midi notes. It implements a rudimentary button widget and state
+ machine.
+
+ The input example shows how to translate midi input to pygame events.
+
+ With the use of a virtual midi patch cord the output and input examples can
+ be run as separate processes and connected so the keyboard output is
+ displayed on a console.
+
+ new to pygame 1.9.0
+
+ .. ## pygame.examples.midi.main ##
+
+.. function:: scroll.main
+
+ | :sl:`run a Surface.scroll example that shows a magnified image`
+ | :sg:`scroll.main(image_file=None) -> None`
+
+ This example shows a scrollable image that has a zoom factor of eight. It
+ uses the :meth:`Surface.scroll() `
+ function to shift the image on the display surface.
+ A clip rectangle protects a margin area. If called as a function,
+ the example accepts an optional image file path. If run as a program it
+ takes an optional file path command line argument. If no file is provided a
+ default image file is used.
+
+ When running click on a black triangle to move one pixel in the direction
+ the triangle points. Or use the arrow keys. Close the window or press
+ ``ESC`` to quit.
+
+ .. ## pygame.examples.scroll.main ##
+
+.. function:: camera.main
+
+ | :sl:`display video captured live from an attached camera`
+ | :sg:`camera.main() -> None`
+
+ A simple live video player, it uses the first available camera it finds on
+ the system.
+
+ .. ## pygame.examples.camera.main ##
+
+.. function:: playmus.main
+
+ | :sl:`play an audio file`
+ | :sg:`playmus.main(file_path) -> None`
+
+ A simple music player with window and keyboard playback control. Playback can
+ be paused and rewound to the beginning.
+
+ .. ## pygame.examples.playmus.main ##
+
+.. ## pygame.examples ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/fastevent.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/fastevent.rst.txt
new file mode 100644
index 00000000..a2efe5f3
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/fastevent.rst.txt
@@ -0,0 +1,109 @@
+.. include:: common.txt
+
+:mod:`pygame.fastevent`
+=======================
+
+.. module:: pygame.fastevent
+ :synopsis: pygame module for interacting with events and queues from multiple
+ threads.
+
+| :sl:`pygame module for interacting with events and queues`
+
+IMPORTANT NOTE: THIS MODULE IS DEPRECATED IN PYGAME 2.2
+
+In older pygame versions before pygame 2, :mod:`pygame.event` was not well
+suited for posting events from different threads. This module served as a
+replacement (with less features) for multithreaded use. Now, the usage of this
+module is highly discouraged in favour of use of the main :mod:`pygame.event`
+module. This module will be removed in a future pygame version.
+
+Below, the legacy docs of the module is provided
+
+.. function:: init
+
+ | :sl:`initialize pygame.fastevent`
+ | :sg:`init() -> None`
+
+ Initialize the pygame.fastevent module.
+
+ .. ## pygame.fastevent.init ##
+
+.. function:: get_init
+
+ | :sl:`returns True if the fastevent module is currently initialized`
+ | :sg:`get_init() -> bool`
+
+ Returns True if the pygame.fastevent module is currently initialized.
+
+ .. ## pygame.fastevent.get_init ##
+
+.. function:: pump
+
+ | :sl:`internally process pygame event handlers`
+ | :sg:`pump() -> None`
+
+ For each frame of your game, you will need to make some sort of call to the
+ event queue. This ensures your program can internally interact with the rest
+ of the operating system.
+
+ This function is not necessary if your program is consistently processing
+ events on the queue through the other :mod:`pygame.fastevent` functions.
+
+ There are important things that must be dealt with internally in the event
+ queue. The main window may need to be repainted or respond to the system. If
+ you fail to make a call to the event queue for too long, the system may
+ decide your program has locked up.
+
+ .. ## pygame.fastevent.pump ##
+
+.. function:: wait
+
+ | :sl:`wait for an event`
+ | :sg:`wait() -> Event`
+
+ Returns the current event on the queue. If there are no messages
+ waiting on the queue, this will not return until one is available.
+ Sometimes it is important to use this wait to get events from the queue,
+ it will allow your application to idle when the user isn't doing anything
+ with it.
+
+ .. ## pygame.fastevent.wait ##
+
+.. function:: poll
+
+ | :sl:`get an available event`
+ | :sg:`poll() -> Event`
+
+ Returns next event on queue. If there is no event waiting on the queue,
+ this will return an event with type NOEVENT.
+
+ .. ## pygame.fastevent.poll ##
+
+.. function:: get
+
+ | :sl:`get all events from the queue`
+ | :sg:`get() -> list of Events`
+
+ This will get all the messages and remove them from the queue.
+
+ .. ## pygame.fastevent.get ##
+
+.. function:: post
+
+ | :sl:`place an event on the queue`
+ | :sg:`post(Event) -> None`
+
+ This will post your own event objects onto the event queue. You can post
+ any event type you want, but some care must be taken. For example, if you
+ post a MOUSEBUTTONDOWN event to the queue, it is likely any code receiving
+ the event will expect the standard MOUSEBUTTONDOWN attributes to be
+ available, like 'pos' and 'button'.
+
+ Because pygame.fastevent.post() may have to wait for the queue to empty,
+ you can get into a dead lock if you try to append an event on to a full
+ queue from the thread that processes events. For that reason I do not
+ recommend using this function in the main thread of an SDL program.
+
+ .. ## pygame.fastevent.post ##
+
+.. ## pygame.fastevent ##
\ No newline at end of file
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/font.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/font.rst.txt
new file mode 100644
index 00000000..9f09a8b3
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/font.rst.txt
@@ -0,0 +1,499 @@
+.. include:: common.txt
+
+:mod:`pygame.font`
+==================
+
+.. module:: pygame.font
+ :synopsis: pygame module for loading and rendering fonts
+
+| :sl:`pygame module for loading and rendering fonts`
+
+The font module allows for rendering TrueType fonts into Surface objects.
+This module is built on top of the SDL_ttf library, which comes with all
+normal pygame installations.
+
+Most of the work done with fonts are done by using the actual Font objects.
+The module by itself only has routines to support the creation of Font objects
+with :func:`pygame.font.Font`.
+
+You can load fonts from the system by using the :func:`pygame.font.SysFont`
+function. There are a few other functions to help look up the system fonts.
+
+Pygame comes with a builtin default font, freesansbold. This can always be
+accessed by passing ``None`` as the font name.
+
+Before pygame 2.0.3, pygame.font accepts any UCS-2 / UTF-16 character
+('\\u0001' to '\\uFFFF'). After 2.0.3, pygame.font built with SDL_ttf
+2.0.15 accepts any valid UCS-4 / UTF-32 character
+(like emojis, if the font has them) ('\\U00000001' to '\\U0010FFFF')).
+More about this in :func:`Font.render`.
+
+Before pygame 2.0.3, this character space restriction can be avoided by
+using the :mod:`pygame.freetype` based ``pygame.ftfont`` to emulate the Font
+module. This can be used by defining the environment variable PYGAME_FREETYPE
+before the first import of :mod:`pygame`. Since the problem ``pygame.ftfont``
+solves no longer exists, it will likely be removed in the future.
+
+.. function:: init
+
+ | :sl:`initialize the font module`
+ | :sg:`init() -> None`
+
+ This method is called automatically by ``pygame.init()``. It initializes the
+ font module. The module must be initialized before any other functions will
+ work.
+
+ It is safe to call this function more than once.
+
+ .. ## pygame.font.init ##
+
+.. function:: quit
+
+ | :sl:`uninitialize the font module`
+ | :sg:`quit() -> None`
+
+ Manually uninitialize SDL_ttf's font system. This is called automatically by
+ ``pygame.quit()``.
+
+ It is safe to call this function even if font is currently not initialized.
+
+ .. ## pygame.font.quit ##
+
+.. function:: get_init
+
+ | :sl:`true if the font module is initialized`
+ | :sg:`get_init() -> bool`
+
+ Test if the font module is initialized or not.
+
+ .. ## pygame.font.get_init ##
+
+.. function:: get_default_font
+
+ | :sl:`get the filename of the default font`
+ | :sg:`get_default_font() -> string`
+
+ Return the filename of the system font. This is not the full path to the
+ file. This file can usually be found in the same directory as the font
+ module, but it can also be bundled in separate archives.
+
+ .. ## pygame.font.get_default_font ##
+
+.. function:: get_sdl_ttf_version
+
+ | :sl:`gets SDL_ttf version`
+ | :sg:`get_sdl_ttf_version(linked=True) -> (major, minor, patch)`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave get_sdl_ttf_version feedback with authors `_
+
+ Returns a tuple of integers that identify SDL_ttf's version.
+ SDL_ttf is the underlying font rendering library, written in C,
+ on which pygame's font module depends. If 'linked' is True (the default),
+ the function returns the version of the linked TTF library.
+ Otherwise this function returns the version of TTF pygame was compiled with
+
+ .. versionadded:: 2.1.3
+
+ .. ## pygame.font.get_sdl_ttf_version ##
+
+.. function:: get_fonts
+
+ | :sl:`get all available fonts`
+ | :sg:`get_fonts() -> list of strings`
+
+ Returns a list of all the fonts available on the system. The names of the
+ fonts will be set to lowercase with all spaces and punctuation removed. This
+ works on most systems, but some will return an empty list if they cannot
+ find fonts.
+
+ .. versionchanged:: 2.1.3 Checks through user fonts instead of just global fonts for Windows.
+
+ .. ## pygame.font.get_fonts ##
+
+.. function:: match_font
+
+ | :sl:`find a specific font on the system`
+ | :sg:`match_font(name, bold=False, italic=False) -> path`
+
+ Returns the full path to a font file on the system. If bold or italic are
+ set to true, this will attempt to find the correct family of font.
+
+ The font name can also be an iterable of font names, a string of
+ comma-separated font names, or a bytes of comma-separated font names, in
+ which case the set of names will be searched in order.
+ If none of the given names are found, None is returned.
+
+ .. versionadded:: 2.0.1 Accept an iterable of font names.
+
+ .. versionchanged:: 2.1.3 Checks through user fonts instead of just global fonts for Windows.
+
+ Example:
+
+ ::
+
+ print pygame.font.match_font('bitstreamverasans')
+ # output is: /usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf
+ # (but only if you have Vera on your system)
+
+ .. ## pygame.font.match_font ##
+
+.. function:: SysFont
+
+ | :sl:`create a Font object from the system fonts`
+ | :sg:`SysFont(name, size, bold=False, italic=False) -> Font`
+
+ Return a new Font object that is loaded from the system fonts. The font will
+ match the requested bold and italic flags. Pygame uses a small set of common
+ font aliases. If the specific font you ask for is not available, a reasonable
+ alternative may be used. If a suitable system font is not found this will
+ fall back on loading the default pygame font.
+
+ The font name can also be an iterable of font names, a string of
+ comma-separated font names, or a bytes of comma-separated font names, in
+ which case the set of names will be searched in order.
+
+ .. versionadded:: 2.0.1 Accept an iterable of font names.
+
+ .. versionchanged:: 2.1.3 Checks through user fonts instead of just global fonts for Windows.
+
+ .. ## pygame.font.SysFont ##
+
+.. class:: Font
+
+ | :sl:`create a new Font object from a file`
+ | :sg:`Font(file_path=None, size=12) -> Font`
+ | :sg:`Font(file_path, size) -> Font`
+ | :sg:`Font(pathlib.Path, size) -> Font`
+ | :sg:`Font(object, size) -> Font`
+
+ Load a new font from a given filename or a python file object. The size is
+ the height of the font in pixels. If the filename is ``None`` the pygame
+ default font will be loaded. If a font cannot be loaded from the arguments
+ given an exception will be raised. Once the font is created the size cannot
+ be changed. If no arguments are given then the default font will be used and
+ a font size of 12 is used.
+
+ Font objects are mainly used to render text into new Surface objects. The
+ render can emulate bold or italic features, but it is better to load from a
+ font with actual italic or bold glyphs.
+
+ .. attribute:: bold
+
+ | :sl:`Gets or sets whether the font should be rendered in (faked) bold.`
+ | :sg:`bold -> bool`
+
+ Whether the font should be rendered in bold.
+
+ When set to True, this enables the bold rendering of text. This
+ is a fake stretching of the font that doesn't look good on many
+ font types. If possible load the font from a real bold font
+ file. While bold, the font will have a different width than when
+ normal. This can be mixed with the italic, underline and
+ strikethrough modes.
+
+ .. versionadded:: 2.0.0
+
+ .. ## Font.bold ##
+
+ .. attribute:: italic
+
+ | :sl:`Gets or sets whether the font should be rendered in (faked) italics.`
+ | :sg:`italic -> bool`
+
+ Whether the font should be rendered in italic.
+
+ When set to True, this enables fake rendering of italic
+ text. This is a fake skewing of the font that doesn't look good
+ on many font types. If possible load the font from a real italic
+ font file. While italic the font will have a different width
+ than when normal. This can be mixed with the bold, underline and
+ strikethrough modes.
+
+ .. versionadded:: 2.0.0
+
+ .. ## Font.italic ##
+
+ .. attribute:: underline
+
+ | :sl:`Gets or sets whether the font should be rendered with an underline.`
+ | :sg:`underline -> bool`
+
+ Whether the font should be rendered in underline.
+
+ When set to True, all rendered fonts will include an
+ underline. The underline is always one pixel thick, regardless
+ of font size. This can be mixed with the bold, italic and
+ strikethrough modes.
+
+ .. versionadded:: 2.0.0
+
+ .. ## Font.underline ##
+
+ .. attribute:: strikethrough
+
+ | :sl:`Gets or sets whether the font should be rendered with a strikethrough.`
+ | :sg:`strikethrough -> bool`
+
+ Whether the font should be rendered with a strikethrough.
+
+ When set to True, all rendered fonts will include an
+ strikethrough. The strikethrough is always one pixel thick,
+ regardless of font size. This can be mixed with the bold,
+ italic and underline modes.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Font.strikethrough ##
+
+ .. method:: render
+
+ | :sl:`draw text on a new Surface`
+ | :sg:`render(text, antialias, color, background=None) -> Surface`
+
+ This creates a new Surface with the specified text rendered on it.
+ :mod:`pygame.font` provides no way to directly draw text on an existing
+ Surface: instead you must use :func:`Font.render` to create an image
+ (Surface) of the text, then blit this image onto another Surface.
+
+ The text can only be a single line: newline characters are not rendered.
+ Null characters ('\x00') raise a TypeError. Both Unicode and char (byte)
+ strings are accepted. For Unicode strings only UCS-2 characters
+ ('\\u0001' to '\\uFFFF') were previously supported and any greater
+ unicode codepoint would raise a UnicodeError. Now, characters in the
+ UCS-4 range are supported. For char strings a ``LATIN1`` encoding is
+ assumed. The antialias argument is a boolean: if True the characters
+ will have smooth edges. The color argument is the color of the text
+ [e.g.: (0,0,255) for blue]. The optional background argument is a color
+ to use for the text background. If no background is passed the area
+ outside the text will be transparent.
+
+ The Surface returned will be of the dimensions required to hold the text.
+ (the same as those returned by :func:`Font.size`). If an empty string is passed
+ for the text, a blank surface will be returned that is zero pixel wide and
+ the height of the font.
+
+ Depending on the type of background and antialiasing used, this returns
+ different types of Surfaces. For performance reasons, it is good to know
+ what type of image will be used. If antialiasing is not used, the return
+ image will always be an 8-bit image with a two-color palette. If the
+ background is transparent a colorkey will be set. Antialiased images are
+ rendered to 24-bit ``RGB`` images. If the background is transparent a
+ pixel alpha will be included.
+
+ Optimization: if you know that the final destination for the text (on the
+ screen) will always have a solid background, and the text is antialiased,
+ you can improve performance by specifying the background color. This will
+ cause the resulting image to maintain transparency information by
+ colorkey rather than (much less efficient) alpha values.
+
+ If you render '\\n' an unknown char will be rendered. Usually a
+ rectangle. Instead you need to handle newlines yourself.
+
+ Font rendering is not thread safe: only a single thread can render text
+ at any time.
+
+ .. versionchanged:: 2.0.3 Rendering UCS4 unicode works and does not
+ raise an exception. Use `if hasattr(pygame.font, "UCS4"):` to see if
+ pygame supports rendering UCS4 unicode including more languages and
+ emoji.
+
+ .. ## Font.render ##
+
+ .. method:: size
+
+ | :sl:`determine the amount of space needed to render text`
+ | :sg:`size(text) -> (width, height)`
+
+ Returns the dimensions needed to render the text. This can be used to
+ help determine the positioning needed for text before it is rendered. It
+ can also be used for word wrapping and other layout effects.
+
+ Be aware that most fonts use kerning which adjusts the widths for
+ specific letter pairs. For example, the width for "ae" will not always
+ match the width for "a" + "e".
+
+ .. ## Font.size ##
+
+ .. method:: set_underline
+
+ | :sl:`control if text is rendered with an underline`
+ | :sg:`set_underline(bool) -> None`
+
+ When enabled, all rendered fonts will include an underline. The underline
+ is always one pixel thick, regardless of font size. This can be mixed
+ with the bold, italic and strikethrough modes.
+
+ .. note:: This is the same as the :attr:`underline` attribute.
+
+ .. ## Font.set_underline ##
+
+ .. method:: get_underline
+
+ | :sl:`check if text will be rendered with an underline`
+ | :sg:`get_underline() -> bool`
+
+ Return True when the font underline is enabled.
+
+ .. note:: This is the same as the :attr:`underline` attribute.
+
+ .. ## Font.get_underline ##
+
+ .. method:: set_strikethrough
+
+ | :sl:`control if text is rendered with a strikethrough`
+ | :sg:`set_strikethrough(bool) -> None`
+
+ When enabled, all rendered fonts will include a strikethrough. The
+ strikethrough is always one pixel thick, regardless of font size.
+ This can be mixed with the bold, italic and underline modes.
+
+ .. note:: This is the same as the :attr:`strikethrough` attribute.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Font.set_strikethrough ##
+
+ .. method:: get_strikethrough
+
+ | :sl:`check if text will be rendered with a strikethrough`
+ | :sg:`get_strikethrough() -> bool`
+
+ Return True when the font strikethrough is enabled.
+
+ .. note:: This is the same as the :attr:`strikethrough` attribute.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Font.get_strikethrough ##
+
+ .. method:: set_bold
+
+ | :sl:`enable fake rendering of bold text`
+ | :sg:`set_bold(bool) -> None`
+
+ Enables the bold rendering of text. This is a fake stretching of the font
+ that doesn't look good on many font types. If possible load the font from
+ a real bold font file. While bold, the font will have a different width
+ than when normal. This can be mixed with the italic, underline and
+ strikethrough modes.
+
+ .. note:: This is the same as the :attr:`bold` attribute.
+
+ .. ## Font.set_bold ##
+
+ .. method:: get_bold
+
+ | :sl:`check if text will be rendered bold`
+ | :sg:`get_bold() -> bool`
+
+ Return True when the font bold rendering mode is enabled.
+
+ .. note:: This is the same as the :attr:`bold` attribute.
+
+ .. ## Font.get_bold ##
+
+ .. method:: set_italic
+
+ | :sl:`enable fake rendering of italic text`
+ | :sg:`set_italic(bool) -> None`
+
+ Enables fake rendering of italic text. This is a fake skewing of the font
+ that doesn't look good on many font types. If possible load the font from
+ a real italic font file. While italic the font will have a different
+ width than when normal. This can be mixed with the bold, underline and
+ strikethrough modes.
+
+ .. note:: This is the same as the :attr:`italic` attribute.
+
+ .. ## Font.set_italic ##
+
+ .. method:: metrics
+
+ | :sl:`gets the metrics for each character in the passed string`
+ | :sg:`metrics(text) -> list`
+
+ The list contains tuples for each character, which contain the minimum
+ ``X`` offset, the maximum ``X`` offset, the minimum ``Y`` offset, the
+ maximum ``Y`` offset and the advance offset (bearing plus width) of the
+ character. [(minx, maxx, miny, maxy, advance), (minx, maxx, miny, maxy,
+ advance), ...]. None is entered in the list for each unrecognized
+ character.
+
+ .. ## Font.metrics ##
+
+ .. method:: get_italic
+
+ | :sl:`check if the text will be rendered italic`
+ | :sg:`get_italic() -> bool`
+
+ Return True when the font italic rendering mode is enabled.
+
+ .. note:: This is the same as the :attr:`italic` attribute.
+
+ .. ## Font.get_italic ##
+
+ .. method:: get_linesize
+
+ | :sl:`get the line space of the font text`
+ | :sg:`get_linesize() -> int`
+
+ Return the height in pixels for a line of text with the font. When
+ rendering multiple lines of text this is the recommended amount of space
+ between lines.
+
+ .. ## Font.get_linesize ##
+
+ .. method:: get_height
+
+ | :sl:`get the height of the font`
+ | :sg:`get_height() -> int`
+
+ Return the height in pixels of the actual rendered text. This is the
+ average size for each glyph in the font.
+
+ .. ## Font.get_height ##
+
+ .. method:: get_ascent
+
+ | :sl:`get the ascent of the font`
+ | :sg:`get_ascent() -> int`
+
+ Return the height in pixels for the font ascent. The ascent is the number
+ of pixels from the font baseline to the top of the font.
+
+ .. ## Font.get_ascent ##
+
+ .. method:: get_descent
+
+ | :sl:`get the descent of the font`
+ | :sg:`get_descent() -> int`
+
+ Return the height in pixels for the font descent. The descent is the
+ number of pixels from the font baseline to the bottom of the font.
+
+ .. ## Font.get_descent ##
+
+ .. method:: set_script
+
+ | :sl:`set the script code for text shaping`
+ | :sg:`set_script(str) -> None`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave feedback with authors `_
+
+ Sets the script used by harfbuzz text shaping, taking a 4 character
+ script code as input. For example, Hindi is written in the Devanagari
+ script, for which the script code is `"Deva"`. See the full list of
+ script codes in `ISO 15924 `_.
+
+ This method requires pygame built with SDL_ttf 2.20.0 or above. Otherwise the
+ method will raise a pygame.error.
+
+ .. versionadded:: 2.2.0
+
+ .. ## Font.set_script ##
+
+ .. ## pygame.font.Font ##
+
+.. ## pygame.font ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/freetype.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/freetype.rst.txt
new file mode 100644
index 00000000..0f282acb
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/freetype.rst.txt
@@ -0,0 +1,770 @@
+.. include:: common.txt
+
+:mod:`pygame.freetype`
+======================
+
+.. module:: pygame.freetype
+ :synopsis: Enhanced pygame module for loading and rendering computer fonts
+
+| :sl:`Enhanced pygame module for loading and rendering computer fonts`
+
+The ``pygame.freetype`` module is a replacement for :mod:`pygame.font`.
+It has all of the functionality of the original, plus many new features.
+Yet is has absolutely no dependencies on the SDL_ttf library.
+It is implemented directly on the FreeType 2 library.
+The ``pygame.freetype`` module is not itself backward compatible with
+:mod:`pygame.font`.
+Instead, use the ``pygame.ftfont`` module as a drop-in replacement
+for :mod:`pygame.font`.
+
+All font file formats supported by FreeType can be rendered by
+``pygame.freetype``, namely ``TTF``, Type1, ``CFF``, OpenType,
+``SFNT``, ``PCF``, ``FNT``, ``BDF``, ``PFR`` and Type42 fonts.
+All glyphs having UTF-32 code points are accessible
+(see :attr:`Font.ucs4`).
+
+Most work on fonts is done using :class:`Font` instances.
+The module itself only has routines for initialization and creation
+of :class:`Font` objects.
+You can load fonts from the system using the :func:`SysFont` function.
+
+Extra support of bitmap fonts is available. Available bitmap sizes can
+be listed (see :meth:`Font.get_sizes`). For bitmap only fonts :class:`Font`
+can set the size for you (see the :attr:`Font.size` property).
+
+For now undefined character codes are replaced with the ``.notdef``
+(not defined) character.
+How undefined codes are handled may become configurable in a future release.
+
+Pygame comes with a built-in default font. This can always be accessed by
+passing None as the font name to the :class:`Font` constructor.
+
+Extra rendering features available to :class:`pygame.freetype.Font`
+are direct to surface rendering (see :meth:`Font.render_to`), character kerning
+(see :attr:`Font.kerning`), vertical layout (see :attr:`Font.vertical`),
+rotation of rendered text (see :attr:`Font.rotation`),
+and the strong style (see :attr:`Font.strong`).
+Some properties are configurable, such as
+strong style strength (see :attr:`Font.strength`) and underline positioning
+(see :attr:`Font.underline_adjustment`). Text can be positioned by the upper
+right corner of the text box or by the text baseline (see :attr:`Font.origin`).
+Finally, a font's vertical and horizontal size can be adjusted separately
+(see :attr:`Font.size`).
+The :any:`pygame.examples.freetype_misc `
+example shows these features in use.
+
+The pygame package does not import ``freetype`` automatically when
+loaded. This module must be imported explicitly to be used. ::
+
+ import pygame
+ import pygame.freetype
+
+.. versionadded:: 1.9.2 :mod:`freetype`
+
+
+.. function:: get_error
+
+ | :sl:`Return the latest FreeType error`
+ | :sg:`get_error() -> str`
+ | :sg:`get_error() -> None`
+
+ Return a description of the last error which occurred in the FreeType2
+ library, or ``None`` if no errors have occurred.
+
+.. function:: get_version
+
+ | :sl:`Return the FreeType version`
+ | :sg:`get_version(linked=True) -> (int, int, int)`
+
+ Returns the version of the FreeType library in use by this module. ``linked=True``
+ is the default behavior and returns the linked version of FreeType and ``linked=False``
+ returns the compiled version of FreeType.
+
+ Note that the ``freetype`` module depends on the FreeType 2 library.
+ It will not compile with the original FreeType 1.0. Hence, the first element
+ of the tuple will always be "2".
+
+ .. versionchanged:: 2.2.0 ``linked`` keyword argument added and default behavior changed from returning compiled version to returning linked version
+
+.. function:: init
+
+ | :sl:`Initialize the underlying FreeType library.`
+ | :sg:`init(cache_size=64, resolution=72) -> None`
+
+ This function initializes the underlying FreeType library and must be
+ called before trying to use any of the functionality of the ``freetype``
+ module.
+
+ However, :func:`pygame.init()` will automatically call this function
+ if the ``freetype`` module is already imported. It is safe to call this
+ function more than once.
+
+ Optionally, you may specify a default *cache_size* for the Glyph cache: the
+ maximum number of glyphs that will be cached at any given time by the
+ module. Exceedingly small values will be automatically tuned for
+ performance. Also a default pixel *resolution*, in dots per inch, can
+ be given to adjust font scaling.
+
+.. function:: quit
+
+ | :sl:`Shut down the underlying FreeType library.`
+ | :sg:`quit() -> None`
+
+ This function closes the ``freetype`` module. After calling this
+ function, you should not invoke any class, method or function related to the
+ ``freetype`` module as they are likely to fail or might give unpredictable
+ results. It is safe to call this function even if the module hasn't been
+ initialized yet.
+
+.. function:: get_init
+
+ | :sl:`Returns True if the FreeType module is currently initialized.`
+ | :sg:`get_init() -> bool`
+
+ Returns ``True`` if the ``pygame.freetype`` module is currently initialized.
+
+ .. versionadded:: 1.9.5
+
+.. function:: was_init
+
+ | :sl:`DEPRECATED: Use get_init() instead.`
+ | :sg:`was_init() -> bool`
+
+ DEPRECATED: Returns ``True`` if the ``pygame.freetype`` module is currently
+ initialized. Use ``get_init()`` instead.
+
+.. function:: get_cache_size
+
+ | :sl:`Return the glyph case size`
+ | :sg:`get_cache_size() -> long`
+
+ See :func:`pygame.freetype.init()`.
+
+.. function:: get_default_resolution
+
+ | :sl:`Return the default pixel size in dots per inch`
+ | :sg:`get_default_resolution() -> long`
+
+ Returns the default pixel size, in dots per inch, for the module.
+ The default is 72 DPI.
+
+.. function:: set_default_resolution
+
+ | :sl:`Set the default pixel size in dots per inch for the module`
+ | :sg:`set_default_resolution([resolution])`
+
+ Set the default pixel size, in dots per inch, for the module. If the
+ optional argument is omitted or zero the resolution is reset to 72 DPI.
+
+.. function:: SysFont
+
+ | :sl:`create a Font object from the system fonts`
+ | :sg:`SysFont(name, size, bold=False, italic=False) -> Font`
+
+ Return a new Font object that is loaded from the system fonts. The font will
+ match the requested *bold* and *italic* flags. Pygame uses a small set of
+ common font aliases. If the specific font you ask for is not available, a
+ reasonable alternative may be used. If a suitable system font is not found
+ this will fall back on loading the default pygame font.
+
+ The font *name* can also be an iterable of font names, a string of
+ comma-separated font names, or a bytes of comma-separated font names, in
+ which case the set of names will be searched in order.
+
+ .. versionadded:: 2.0.1 Accept an iterable of font names.
+
+.. function:: get_default_font
+
+ | :sl:`Get the filename of the default font`
+ | :sg:`get_default_font() -> string`
+
+ Return the filename of the default pygame font. This is not the full path
+ to the file. The file is usually in the same directory as the font module,
+ but can also be bundled in a separate archive.
+
+.. class:: Font
+
+ | :sl:`Create a new Font instance from a supported font file.`
+ | :sg:`Font(file, size=0, font_index=0, resolution=0, ucs4=False) -> Font`
+ | :sg:`Font(pathlib.Path) -> Font`
+
+ Argument *file* can be either a string representing the font's filename, a
+ file-like object containing the font, or None; if None, a default,
+ Pygame, font is used.
+
+ .. _freetype-font-size-argument:
+
+ Optionally, a *size* argument may be specified to set the default size in
+ points, which determines the size of the rendered characters.
+ The size can also be passed explicitly to each method call.
+ Because of the way the caching system works, specifying a default size on
+ the constructor doesn't imply a performance gain over manually passing
+ the size on each function call. If the font is bitmap and no *size*
+ is given, the default size is set to the first available size for the font.
+
+ If the font file has more than one font, the font to load can be chosen with
+ the *index* argument. An exception is raised for an out-of-range font index
+ value.
+
+ The optional *resolution* argument sets the pixel size, in dots per inch,
+ for use in scaling glyphs for this Font instance. If 0 then the default
+ module value, set by :func:`init`, is used. The Font object's
+ resolution can only be changed by re-initializing the Font instance.
+
+ The optional *ucs4* argument, an integer, sets the default text translation
+ mode: 0 (False) recognize UTF-16 surrogate pairs, any other value (True),
+ to treat Unicode text as UCS-4, with no surrogate pairs. See
+ :attr:`Font.ucs4`.
+
+ .. attribute:: name
+
+ | :sl:`Proper font name.`
+ | :sg:`name -> string`
+
+ Read only. Returns the real (long) name of the font, as
+ recorded in the font file.
+
+ .. attribute:: path
+
+ | :sl:`Font file path`
+ | :sg:`path -> unicode`
+
+ Read only. Returns the path of the loaded font file
+
+ .. attribute:: size
+
+ | :sl:`The default point size used in rendering`
+ | :sg:`size -> float`
+ | :sg:`size -> (float, float)`
+
+ Get or set the default size for text metrics and rendering. It can be
+ a single point size, given as a Python ``int`` or ``float``, or a
+ font ppem (width, height) ``tuple``. Size values are non-negative.
+ A zero size or width represents an undefined size. In this case
+ the size must be given as a method argument, or an exception is
+ raised. A zero width but non-zero height is a ValueError.
+
+ For a scalable font, a single number value is equivalent to a tuple
+ with width equal height. A font can be stretched vertically with
+ height set greater than width, or horizontally with width set
+ greater than height. For embedded bitmaps, as listed by :meth:`get_sizes`,
+ use the nominal width and height to select an available size.
+
+ Font size differs for a non-scalable, bitmap, font. During a
+ method call it must match one of the available sizes returned by
+ method :meth:`get_sizes`. If not, an exception is raised.
+ If the size is a single number, the size is first matched against the
+ point size value. If no match, then the available size with the
+ same nominal width and height is chosen.
+
+ .. method:: get_rect
+
+ | :sl:`Return the size and offset of rendered text`
+ | :sg:`get_rect(text, style=STYLE_DEFAULT, rotation=0, size=0) -> rect`
+
+ Gets the final dimensions and origin, in pixels, of *text* using the
+ optional *size* in points, *style*, and *rotation*. For other
+ relevant render properties, and for any optional argument not given,
+ the default values set for the :class:`Font` instance are used.
+
+ Returns a :class:`Rect ` instance containing the
+ width and height of the text's bounding box and the position of the
+ text's origin.
+ The origin is useful in aligning separately rendered pieces of text.
+ It gives the baseline position and bearing at the start of the text.
+ See the :meth:`render_to` method for an example.
+
+ If *text* is a char (byte) string, its encoding is assumed to be
+ ``LATIN1``.
+
+ Optionally, *text* can be ``None``, which will return the bounding
+ rectangle for the text passed to a previous :meth:`get_rect`,
+ :meth:`render`, :meth:`render_to`, :meth:`render_raw`, or
+ :meth:`render_raw_to` call. See :meth:`render_to` for more
+ details.
+
+ .. method:: get_metrics
+
+ | :sl:`Return the glyph metrics for the given text`
+ | :sg:`get_metrics(text, size=0) -> [(...), ...]`
+
+ Returns the glyph metrics for each character in *text*.
+
+ The glyph metrics are returned as a list of tuples. Each tuple gives
+ metrics of a single character glyph. The glyph metrics are:
+
+ ::
+
+ (min_x, max_x, min_y, max_y, horizontal_advance_x, horizontal_advance_y)
+
+ The bounding box min_x, max_x, min_y, and max_y values are returned as
+ grid-fitted pixel coordinates of type int. The advance values are
+ float values.
+
+ The calculations are done using the font's default size in points.
+ Optionally you may specify another point size with the *size* argument.
+
+ The metrics are adjusted for the current rotation, strong, and oblique
+ settings.
+
+ If text is a char (byte) string, then its encoding is assumed to be
+ ``LATIN1``.
+
+ .. attribute:: height
+
+ | :sl:`The unscaled height of the font in font units`
+ | :sg:`height -> int`
+
+ Read only. Gets the height of the font. This is the average value of all
+ glyphs in the font.
+
+ .. attribute:: ascender
+
+ | :sl:`The unscaled ascent of the font in font units`
+ | :sg:`ascender -> int`
+
+ Read only. Return the number of units from the font's baseline to
+ the top of the bounding box.
+
+ .. attribute:: descender
+
+ | :sl:`The unscaled descent of the font in font units`
+ | :sg:`descender -> int`
+
+ Read only. Return the height in font units for the font descent.
+ The descent is the number of units from the font's baseline to the
+ bottom of the bounding box.
+
+ .. method:: get_sized_ascender
+
+ | :sl:`The scaled ascent of the font in pixels`
+ | :sg:`get_sized_ascender(=0) -> int`
+
+ Return the number of units from the font's baseline to the top of the
+ bounding box. It is not adjusted for strong or rotation.
+
+ .. method:: get_sized_descender
+
+ | :sl:`The scaled descent of the font in pixels`
+ | :sg:`get_sized_descender(=0) -> int`
+
+ Return the number of pixels from the font's baseline to the top of the
+ bounding box. It is not adjusted for strong or rotation.
+
+ .. method:: get_sized_height
+
+ | :sl:`The scaled height of the font in pixels`
+ | :sg:`get_sized_height(=0) -> int`
+
+ Returns the height of the font. This is the average value of all
+ glyphs in the font. It is not adjusted for strong or rotation.
+
+ .. method:: get_sized_glyph_height
+
+ | :sl:`The scaled bounding box height of the font in pixels`
+ | :sg:`get_sized_glyph_height(=0) -> int`
+
+ Return the glyph bounding box height of the font in pixels.
+ This is the average value of all glyphs in the font.
+ It is not adjusted for strong or rotation.
+
+ .. method:: get_sizes
+
+ | :sl:`return the available sizes of embedded bitmaps`
+ | :sg:`get_sizes() -> [(int, int, int, float, float), ...]`
+ | :sg:`get_sizes() -> []`
+
+ Returns a list of tuple records, one for each point size
+ supported. Each tuple containing the point size, the height in pixels,
+ width in pixels, horizontal ppem (nominal width) in fractional pixels,
+ and vertical ppem (nominal height) in fractional pixels.
+
+ .. method:: render
+
+ | :sl:`Return rendered text as a surface`
+ | :sg:`render(text, fgcolor=None, bgcolor=None, style=STYLE_DEFAULT, rotation=0, size=0) -> (Surface, Rect)`
+
+ Returns a new :class:`Surface `,
+ with the text rendered to it
+ in the color given by 'fgcolor'. If no foreground color is given,
+ the default foreground color, :attr:`fgcolor ` is used.
+ If ``bgcolor`` is given, the surface
+ will be filled with this color. When no background color is given,
+ the surface background is transparent, zero alpha. Normally the returned
+ surface has a 32 bit pixel size. However, if ``bgcolor`` is ``None``
+ and anti-aliasing is disabled a monochrome 8 bit colorkey surface,
+ with colorkey set for the background color, is returned.
+
+ The return value is a tuple: the new surface and the bounding
+ rectangle giving the size and origin of the rendered text.
+
+ If an empty string is passed for text then the returned Rect is zero
+ width and the height of the font.
+
+ Optional *fgcolor*, *style*, *rotation*, and *size* arguments override
+ the default values set for the :class:`Font` instance.
+
+ If *text* is a char (byte) string, then its encoding is assumed to be
+ ``LATIN1``.
+
+ Optionally, *text* can be ``None``, which will render the text
+ passed to a previous :meth:`get_rect`, :meth:`render`, :meth:`render_to`,
+ :meth:`render_raw`, or :meth:`render_raw_to` call.
+ See :meth:`render_to` for details.
+
+ .. method:: render_to
+
+ | :sl:`Render text onto an existing surface`
+ | :sg:`render_to(surf, dest, text, fgcolor=None, bgcolor=None, style=STYLE_DEFAULT, rotation=0, size=0) -> Rect`
+
+ Renders the string *text* to the :mod:`pygame.Surface` *surf*,
+ at position *dest*, a (x, y) surface coordinate pair.
+ If either x or y is not an integer it is converted to one if possible.
+ Any sequence where the first two items are x and y positional elements
+ is accepted, including a :class:`Rect ` instance.
+ As with :meth:`render`,
+ optional *fgcolor*, *style*, *rotation*, and *size* argument are
+ available.
+
+ If a background color *bgcolor* is given, the text bounding box is
+ first filled with that color. The text is blitted next.
+ Both the background fill and text rendering involve full alpha blits.
+ That is, the alpha values of the foreground, background, and destination
+ target surface all affect the blit.
+
+ The return value is a rectangle giving the size and position of the
+ rendered text within the surface.
+
+ If an empty string is passed for text then the returned
+ :class:`Rect ` is zero width and the height of the font.
+ The rect will test False.
+
+ Optionally, *text* can be set ``None``, which will re-render text
+ passed to a previous :meth:`render_to`, :meth:`get_rect`, :meth:`render`,
+ :meth:`render_raw`, or :meth:`render_raw_to` call. Primarily, this
+ feature is an aid to using :meth:`render_to` in combination with
+ :meth:`get_rect`. An example: ::
+
+ def word_wrap(surf, text, font, color=(0, 0, 0)):
+ font.origin = True
+ words = text.split(' ')
+ width, height = surf.get_size()
+ line_spacing = font.get_sized_height() + 2
+ x, y = 0, line_spacing
+ space = font.get_rect(' ')
+ for word in words:
+ bounds = font.get_rect(word)
+ if x + bounds.width + bounds.x >= width:
+ x, y = 0, y + line_spacing
+ if x + bounds.width + bounds.x >= width:
+ raise ValueError("word too wide for the surface")
+ if y + bounds.height - bounds.y >= height:
+ raise ValueError("text to long for the surface")
+ font.render_to(surf, (x, y), None, color)
+ x += bounds.width + space.width
+ return x, y
+
+ When :meth:`render_to` is called with the same
+ font properties ― :attr:`size`, :attr:`style`, :attr:`strength`,
+ :attr:`wide`, :attr:`antialiased`, :attr:`vertical`, :attr:`rotation`,
+ :attr:`kerning`, and :attr:`use_bitmap_strikes` ― as :meth:`get_rect`,
+ :meth:`render_to` will use the layout calculated by :meth:`get_rect`.
+ Otherwise, :meth:`render_to` will recalculate the layout if called
+ with a text string or one of the above properties has changed
+ after the :meth:`get_rect` call.
+
+ If *text* is a char (byte) string, then its encoding is assumed to be
+ ``LATIN1``.
+
+ .. method:: render_raw
+
+ | :sl:`Return rendered text as a string of bytes`
+ | :sg:`render_raw(text, style=STYLE_DEFAULT, rotation=0, size=0, invert=False) -> (bytes, (int, int))`
+
+ Like :meth:`render` but with the pixels returned as a byte string
+ of 8-bit gray-scale values. The foreground color is 255, the
+ background 0, useful as an alpha mask for a foreground pattern.
+
+ .. method:: render_raw_to
+
+ | :sl:`Render text into an array of ints`
+ | :sg:`render_raw_to(array, text, dest=None, style=STYLE_DEFAULT, rotation=0, size=0, invert=False) -> Rect`
+
+ Render to an array object exposing an array struct interface. The array
+ must be two dimensional with integer items. The default *dest* value,
+ ``None``, is equivalent to position (0, 0). See :meth:`render_to`.
+ As with the other render methods, *text* can be ``None`` to
+ render a text string passed previously to another method.
+
+ The return value is a :func:`pygame.Rect` giving the size and position of
+ the rendered text.
+
+ .. attribute:: style
+
+ | :sl:`The font's style flags`
+ | :sg:`style -> int`
+
+ Gets or sets the default style of the Font. This default style will be
+ used for all text rendering and size calculations unless overridden
+ specifically a render or :meth:`get_rect` call.
+ The style value may be a bit-wise OR of one or more of the following
+ constants:
+
+ ::
+
+ STYLE_NORMAL
+ STYLE_UNDERLINE
+ STYLE_OBLIQUE
+ STYLE_STRONG
+ STYLE_WIDE
+ STYLE_DEFAULT
+
+ These constants may be found on the FreeType constants module.
+ Optionally, the default style can be modified or obtained accessing the
+ individual style attributes (underline, oblique, strong).
+
+ The ``STYLE_OBLIQUE`` and ``STYLE_STRONG`` styles are for
+ scalable fonts only. An attempt to set either for a bitmap font raises
+ an AttributeError. An attempt to set either for an inactive font,
+ as returned by ``Font.__new__()``, raises a RuntimeError.
+
+ Assigning ``STYLE_DEFAULT`` to the :attr:`style` property leaves
+ the property unchanged, as this property defines the default.
+ The :attr:`style` property will never return ``STYLE_DEFAULT``.
+
+ .. attribute:: underline
+
+ | :sl:`The state of the font's underline style flag`
+ | :sg:`underline -> bool`
+
+ Gets or sets whether the font will be underlined when drawing text. This
+ default style value will be used for all text rendering and size
+ calculations unless overridden specifically in a render or
+ :meth:`get_rect` call, via the 'style' parameter.
+
+ .. attribute:: strong
+
+ | :sl:`The state of the font's strong style flag`
+ | :sg:`strong -> bool`
+
+ Gets or sets whether the font will be bold when drawing text. This
+ default style value will be used for all text rendering and size
+ calculations unless overridden specifically in a render or
+ :meth:`get_rect` call, via the 'style' parameter.
+
+ .. attribute:: oblique
+
+ | :sl:`The state of the font's oblique style flag`
+ | :sg:`oblique -> bool`
+
+ Gets or sets whether the font will be rendered as oblique. This
+ default style value will be used for all text rendering and size
+ calculations unless overridden specifically in a render or
+ :meth:`get_rect` call, via the *style* parameter.
+
+ The oblique style is only supported for scalable (outline) fonts.
+ An attempt to set this style on a bitmap font will raise an
+ AttributeError. If the font object is inactive, as returned by
+ ``Font.__new__()``, setting this property raises a RuntimeError.
+
+ .. attribute:: wide
+
+ | :sl:`The state of the font's wide style flag`
+ | :sg:`wide -> bool`
+
+ Gets or sets whether the font will be stretched horizontally
+ when drawing text. It produces a result similar to
+ :class:`pygame.font.Font`'s bold. This style not available for
+ rotated text.
+
+ .. attribute:: strength
+
+ | :sl:`The strength associated with the strong or wide font styles`
+ | :sg:`strength -> float`
+
+ The amount by which a font glyph's size is enlarged for the
+ strong or wide transformations, as a fraction of the untransformed
+ size. For the wide style only the horizontal dimension is
+ increased. For strong text both the horizontal and vertical
+ dimensions are enlarged. A wide style of strength 0.08333 ( 1/12 ) is
+ equivalent to the :class:`pygame.font.Font` bold style.
+ The default is 0.02778 ( 1/36 ).
+
+ The strength style is only supported for scalable (outline) fonts.
+ An attempt to set this property on a bitmap font will raise an
+ AttributeError. If the font object is inactive, as returned by
+ ``Font.__new__()``, assignment to this property raises a RuntimeError.
+
+ .. attribute:: underline_adjustment
+
+ | :sl:`Adjustment factor for the underline position`
+ | :sg:`underline_adjustment -> float`
+
+ Gets or sets a factor which, when positive, is multiplied with the
+ font's underline offset to adjust the underline position. A negative
+ value turns an underline into a strike-through or overline. It is
+ multiplied with the ascender. Accepted values range between -2.0 and 2.0
+ inclusive. A value of 0.5 closely matches Tango underlining. A value of
+ 1.0 mimics :class:`pygame.font.Font` underlining.
+
+ .. attribute:: fixed_width
+
+ | :sl:`Gets whether the font is fixed-width`
+ | :sg:`fixed_width -> bool`
+
+ Read only. Returns ``True`` if the font contains fixed-width
+ characters (for example Courier, Bitstream Vera Sans Mono, Andale Mono).
+
+ .. attribute:: fixed_sizes
+
+ | :sl:`the number of available bitmap sizes for the font`
+ | :sg:`fixed_sizes -> int`
+
+ Read only. Returns the number of point sizes for which the font contains
+ bitmap character images. If zero then the font is not a bitmap font.
+ A scalable font may contain pre-rendered point sizes as strikes.
+
+ .. attribute:: scalable
+
+ | :sl:`Gets whether the font is scalable`
+ | :sg:`scalable -> bool`
+
+ Read only. Returns ``True`` if the font contains outline glyphs.
+ If so, the point size is not limited to available bitmap sizes.
+
+ .. attribute:: use_bitmap_strikes
+
+ | :sl:`allow the use of embedded bitmaps in an outline font file`
+ | :sg:`use_bitmap_strikes -> bool`
+
+ Some scalable fonts include embedded bitmaps for particular point
+ sizes. This property controls whether or not those bitmap strikes
+ are used. Set it ``False`` to disable the loading of any bitmap
+ strike. Set it ``True``, the default, to permit bitmap strikes
+ for a non-rotated render with no style other than :attr:`wide` or
+ :attr:`underline`. This property is ignored for bitmap fonts.
+
+ See also :attr:`fixed_sizes` and :meth:`get_sizes`.
+
+ .. attribute:: antialiased
+
+ | :sl:`Font anti-aliasing mode`
+ | :sg:`antialiased -> bool`
+
+ Gets or sets the font's anti-aliasing mode. This defaults to
+ ``True`` on all fonts, which are rendered with full 8 bit blending.
+
+ Set to ``False`` to do monochrome rendering. This should
+ provide a small speed gain and reduce cache memory size.
+
+ .. attribute:: kerning
+
+ | :sl:`Character kerning mode`
+ | :sg:`kerning -> bool`
+
+ Gets or sets the font's kerning mode. This defaults to ``False``
+ on all fonts, which will be rendered without kerning.
+
+ Set to ``True`` to add kerning between character pairs, if supported
+ by the font, when positioning glyphs.
+
+ .. attribute:: vertical
+
+ | :sl:`Font vertical mode`
+ | :sg:`vertical -> bool`
+
+ Gets or sets whether the characters are laid out vertically rather
+ than horizontally. May be useful when rendering Kanji or some other
+ vertical script.
+
+ Set to ``True`` to switch to a vertical text layout. The default
+ is ``False``, place horizontally.
+
+ Note that the :class:`Font` class does not automatically determine
+ script orientation. Vertical layout must be selected explicitly.
+
+ Also note that several font formats (especially bitmap based ones) don't
+ contain the necessary metrics to draw glyphs vertically, so drawing in
+ those cases will give unspecified results.
+
+ .. attribute:: rotation
+
+ | :sl:`text rotation in degrees counterclockwise`
+ | :sg:`rotation -> int`
+
+ Gets or sets the baseline angle of the rendered text. The angle is
+ represented as integer degrees. The default angle is 0, with horizontal
+ text rendered along the X-axis, and vertical text along the Y-axis.
+ A positive value rotates these axes counterclockwise that many degrees.
+ A negative angle corresponds to a clockwise rotation. The rotation
+ value is normalized to a value within the range 0 to 359 inclusive
+ (eg. 390 -> 390 - 360 -> 30, -45 -> 360 + -45 -> 315,
+ 720 -> 720 - (2 * 360) -> 0).
+
+ Only scalable (outline) fonts can be rotated. An attempt to change
+ the rotation of a bitmap font raises an AttributeError.
+ An attempt to change the rotation of an inactive font instance, as
+ returned by ``Font.__new__()``, raises a RuntimeError.
+
+ .. attribute:: fgcolor
+
+ | :sl:`default foreground color`
+ | :sg:`fgcolor -> Color`
+
+ Gets or sets the default glyph rendering color. It is initially opaque
+ black ― (0, 0, 0, 255). Applies to :meth:`render` and :meth:`render_to`.
+
+ .. attribute:: bgcolor
+
+ | :sl:`default background color`
+ | :sg:`bgcolor -> Color`
+
+ Gets or sets the default background rendering color. Initially it is
+ unset and text will render with a transparent background by default.
+ Applies to :meth:`render` and :meth:`render_to`.
+
+ .. versionadded:: 2.0.0
+
+ .. attribute:: origin
+
+ | :sl:`Font render to text origin mode`
+ | :sg:`origin -> bool`
+
+ If set ``True``, :meth:`render_to` and :meth:`render_raw_to` will
+ take the *dest* position to be that of the text origin, as opposed to
+ the top-left corner of the bounding box. See :meth:`get_rect` for
+ details.
+
+ .. attribute:: pad
+
+ | :sl:`padded boundary mode`
+ | :sg:`pad -> bool`
+
+ If set ``True``, then the text boundary rectangle will be inflated
+ to match that of :class:`font.Font `.
+ Otherwise, the boundary rectangle is just large enough for the text.
+
+ .. attribute:: ucs4
+
+ | :sl:`Enable UCS-4 mode`
+ | :sg:`ucs4 -> bool`
+
+ Gets or sets the decoding of Unicode text. By default, the
+ freetype module performs UTF-16 surrogate pair decoding on Unicode text.
+ This allows 32-bit escape sequences ('\Uxxxxxxxx') between 0x10000 and
+ 0x10FFFF to represent their corresponding UTF-32 code points on Python
+ interpreters built with a UCS-2 Unicode type (on Windows, for instance).
+ It also means character values within the UTF-16 surrogate area (0xD800
+ to 0xDFFF) are considered part of a surrogate pair. A malformed surrogate
+ pair will raise a UnicodeEncodeError. Setting ucs4 ``True`` turns
+ surrogate pair decoding off, allowing access the full UCS-4 character
+ range to a Python interpreter built with four-byte Unicode character
+ support.
+
+ .. attribute:: resolution
+
+ | :sl:`Pixel resolution in dots per inch`
+ | :sg:`resolution -> int`
+
+ Read only. Gets pixel size used in scaling font glyphs for this
+ :class:`Font` instance.
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/gfxdraw.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/gfxdraw.rst.txt
new file mode 100644
index 00000000..28153a31
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/gfxdraw.rst.txt
@@ -0,0 +1,628 @@
+.. include:: common.txt
+
+:mod:`pygame.gfxdraw`
+=====================
+
+.. module:: pygame.gfxdraw
+ :synopsis: pygame module for drawing shapes
+
+| :sl:`pygame module for drawing shapes`
+
+**EXPERIMENTAL!**: This API may change or disappear in later pygame releases. If
+you use this, your code may break with the next pygame release.
+
+The pygame package does not import gfxdraw automatically when loaded, so it
+must imported explicitly to be used.
+
+::
+
+ import pygame
+ import pygame.gfxdraw
+
+For all functions the arguments are strictly positional and integers are
+accepted for coordinates and radii. The ``color`` argument can be one of the
+following formats:
+
+ - a :mod:`pygame.Color` object
+ - an ``(RGB)`` triplet (tuple/list)
+ - an ``(RGBA)`` quadruplet (tuple/list)
+
+The functions :meth:`rectangle` and :meth:`box` will accept any ``(x, y, w, h)``
+sequence for their ``rect`` argument, though :mod:`pygame.Rect` instances are
+preferred.
+
+To draw a filled antialiased shape, first use the antialiased (aa*) version
+of the function, and then use the filled (filled_*) version.
+For example:
+
+::
+
+ col = (255, 0, 0)
+ surf.fill((255, 255, 255))
+ pygame.gfxdraw.aacircle(surf, x, y, 30, col)
+ pygame.gfxdraw.filled_circle(surf, x, y, 30, col)
+
+
+.. note::
+ For threading, each of the functions releases the GIL during the C part of
+ the call.
+
+.. note::
+ See the :mod:`pygame.draw` module for alternative draw methods.
+ The ``pygame.gfxdraw`` module differs from the :mod:`pygame.draw` module in
+ the API it uses and the different draw functions available.
+ ``pygame.gfxdraw`` wraps the primitives from the library called SDL_gfx,
+ rather than using modified versions.
+
+.. versionadded:: 1.9.0
+
+
+.. function:: pixel
+
+ | :sl:`draw a pixel`
+ | :sg:`pixel(surface, x, y, color) -> None`
+
+ Draws a single pixel, at position (x ,y), on the given surface.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the pixel
+ :param int y: y coordinate of the pixel
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.pixel ##
+
+.. function:: hline
+
+ | :sl:`draw a horizontal line`
+ | :sg:`hline(surface, x1, x2, y, color) -> None`
+
+ Draws a straight horizontal line (``(x1, y)`` to ``(x2, y)``) on the given
+ surface. There are no endcaps.
+
+ :param Surface surface: surface to draw on
+ :param int x1: x coordinate of one end of the line
+ :param int x2: x coordinate of the other end of the line
+ :param int y: y coordinate of the line
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.hline ##
+
+.. function:: vline
+
+ | :sl:`draw a vertical line`
+ | :sg:`vline(surface, x, y1, y2, color) -> None`
+
+ Draws a straight vertical line (``(x, y1)`` to ``(x, y2)``) on the given
+ surface. There are no endcaps.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the line
+ :param int y1: y coordinate of one end of the line
+ :param int y2: y coordinate of the other end of the line
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.vline ##
+
+.. function:: line
+
+ | :sl:`draw a line`
+ | :sg:`line(surface, x1, y1, x2, y2, color) -> None`
+
+ Draws a straight line (``(x1, y1)`` to ``(x2, y2)``) on the given surface.
+ There are no endcaps.
+
+ :param Surface surface: surface to draw on
+ :param int x1: x coordinate of one end of the line
+ :param int y1: y coordinate of one end of the line
+ :param int x2: x coordinate of the other end of the line
+ :param int y2: y coordinate of the other end of the line
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.line ##
+
+.. function:: rectangle
+
+ | :sl:`draw a rectangle`
+ | :sg:`rectangle(surface, rect, color) -> None`
+
+ Draws an unfilled rectangle on the given surface. For a filled rectangle use
+ :meth:`box`.
+
+ :param Surface surface: surface to draw on
+ :param Rect rect: rectangle to draw, position and dimensions
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. note::
+ The ``rect.bottom`` and ``rect.right`` attributes of a :mod:`pygame.Rect`
+ always lie one pixel outside of its actual border. Therefore, these
+ values will not be included as part of the drawing.
+
+ .. ## pygame.gfxdraw.rectangle ##
+
+.. function:: box
+
+ | :sl:`draw a filled rectangle`
+ | :sg:`box(surface, rect, color) -> None`
+
+ Draws a filled rectangle on the given surface. For an unfilled rectangle use
+ :meth:`rectangle`.
+
+ :param Surface surface: surface to draw on
+ :param Rect rect: rectangle to draw, position and dimensions
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. note::
+ The ``rect.bottom`` and ``rect.right`` attributes of a :mod:`pygame.Rect`
+ always lie one pixel outside of its actual border. Therefore, these
+ values will not be included as part of the drawing.
+
+ .. note::
+ The :func:`pygame.Surface.fill` method works just as well for drawing
+ filled rectangles. In fact :func:`pygame.Surface.fill` can be hardware
+ accelerated on some platforms with both software and hardware display
+ modes.
+
+ .. ## pygame.gfxdraw.box ##
+
+.. function:: circle
+
+ | :sl:`draw a circle`
+ | :sg:`circle(surface, x, y, r, color) -> None`
+
+ Draws an unfilled circle on the given surface. For a filled circle use
+ :meth:`filled_circle`.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the center of the circle
+ :param int y: y coordinate of the center of the circle
+ :param int r: radius of the circle
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.circle ##
+
+.. function:: aacircle
+
+ | :sl:`draw an antialiased circle`
+ | :sg:`aacircle(surface, x, y, r, color) -> None`
+
+ Draws an unfilled antialiased circle on the given surface.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the center of the circle
+ :param int y: y coordinate of the center of the circle
+ :param int r: radius of the circle
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.aacircle ##
+
+.. function:: filled_circle
+
+ | :sl:`draw a filled circle`
+ | :sg:`filled_circle(surface, x, y, r, color) -> None`
+
+ Draws a filled circle on the given surface. For an unfilled circle use
+ :meth:`circle`.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the center of the circle
+ :param int y: y coordinate of the center of the circle
+ :param int r: radius of the circle
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.filled_circle ##
+
+.. function:: ellipse
+
+ | :sl:`draw an ellipse`
+ | :sg:`ellipse(surface, x, y, rx, ry, color) -> None`
+
+ Draws an unfilled ellipse on the given surface. For a filled ellipse use
+ :meth:`filled_ellipse`.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the center of the ellipse
+ :param int y: y coordinate of the center of the ellipse
+ :param int rx: horizontal radius of the ellipse
+ :param int ry: vertical radius of the ellipse
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.ellipse ##
+
+.. function:: aaellipse
+
+ | :sl:`draw an antialiased ellipse`
+ | :sg:`aaellipse(surface, x, y, rx, ry, color) -> None`
+
+ Draws an unfilled antialiased ellipse on the given surface.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the center of the ellipse
+ :param int y: y coordinate of the center of the ellipse
+ :param int rx: horizontal radius of the ellipse
+ :param int ry: vertical radius of the ellipse
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.aaellipse ##
+
+.. function:: filled_ellipse
+
+ | :sl:`draw a filled ellipse`
+ | :sg:`filled_ellipse(surface, x, y, rx, ry, color) -> None`
+
+ Draws a filled ellipse on the given surface. For an unfilled ellipse use
+ :meth:`ellipse`.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the center of the ellipse
+ :param int y: y coordinate of the center of the ellipse
+ :param int rx: horizontal radius of the ellipse
+ :param int ry: vertical radius of the ellipse
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.filled_ellipse ##
+
+.. function:: arc
+
+ | :sl:`draw an arc`
+ | :sg:`arc(surface, x, y, r, start_angle, stop_angle, color) -> None`
+
+ Draws an arc on the given surface. For an arc with its endpoints connected
+ to its center use :meth:`pie`.
+
+ The two angle arguments are given in degrees and indicate the start and stop
+ positions of the arc. The arc is drawn in a clockwise direction from the
+ ``start_angle`` to the ``stop_angle``. If ``start_angle == stop_angle``,
+ nothing will be drawn
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the center of the arc
+ :param int y: y coordinate of the center of the arc
+ :param int r: radius of the arc
+ :param int start_angle: start angle in degrees
+ :param int stop_angle: stop angle in degrees
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. note::
+ This function uses *degrees* while the :func:`pygame.draw.arc` function
+ uses *radians*.
+
+ .. ## pygame.gfxdraw.arc ##
+
+.. function:: pie
+
+ | :sl:`draw a pie`
+ | :sg:`pie(surface, x, y, r, start_angle, stop_angle, color) -> None`
+
+ Draws an unfilled pie on the given surface. A pie is an :meth:`arc` with its
+ endpoints connected to its center.
+
+ The two angle arguments are given in degrees and indicate the start and stop
+ positions of the pie. The pie is drawn in a clockwise direction from the
+ ``start_angle`` to the ``stop_angle``. If ``start_angle == stop_angle``,
+ a straight line will be drawn from the center position at the given angle,
+ to a length of the radius.
+
+ :param Surface surface: surface to draw on
+ :param int x: x coordinate of the center of the pie
+ :param int y: y coordinate of the center of the pie
+ :param int r: radius of the pie
+ :param int start_angle: start angle in degrees
+ :param int stop_angle: stop angle in degrees
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.pie ##
+
+.. function:: trigon
+
+ | :sl:`draw a trigon/triangle`
+ | :sg:`trigon(surface, x1, y1, x2, y2, x3, y3, color) -> None`
+
+ Draws an unfilled trigon (triangle) on the given surface. For a filled
+ trigon use :meth:`filled_trigon`.
+
+ A trigon can also be drawn using :meth:`polygon` e.g.
+ ``polygon(surface, ((x1, y1), (x2, y2), (x3, y3)), color)``
+
+ :param Surface surface: surface to draw on
+ :param int x1: x coordinate of the first corner of the trigon
+ :param int y1: y coordinate of the first corner of the trigon
+ :param int x2: x coordinate of the second corner of the trigon
+ :param int y2: y coordinate of the second corner of the trigon
+ :param int x3: x coordinate of the third corner of the trigon
+ :param int y3: y coordinate of the third corner of the trigon
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.trigon ##
+
+.. function:: aatrigon
+
+ | :sl:`draw an antialiased trigon/triangle`
+ | :sg:`aatrigon(surface, x1, y1, x2, y2, x3, y3, color) -> None`
+
+ Draws an unfilled antialiased trigon (triangle) on the given surface.
+
+ An aatrigon can also be drawn using :meth:`aapolygon` e.g.
+ ``aapolygon(surface, ((x1, y1), (x2, y2), (x3, y3)), color)``
+
+ :param Surface surface: surface to draw on
+ :param int x1: x coordinate of the first corner of the trigon
+ :param int y1: y coordinate of the first corner of the trigon
+ :param int x2: x coordinate of the second corner of the trigon
+ :param int y2: y coordinate of the second corner of the trigon
+ :param int x3: x coordinate of the third corner of the trigon
+ :param int y3: y coordinate of the third corner of the trigon
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.aatrigon ##
+
+.. function:: filled_trigon
+
+ | :sl:`draw a filled trigon/triangle`
+ | :sg:`filled_trigon(surface, x1, y1, x2, y2, x3, y3, color) -> None`
+
+ Draws a filled trigon (triangle) on the given surface. For an unfilled
+ trigon use :meth:`trigon`.
+
+ A filled_trigon can also be drawn using :meth:`filled_polygon` e.g.
+ ``filled_polygon(surface, ((x1, y1), (x2, y2), (x3, y3)), color)``
+
+ :param Surface surface: surface to draw on
+ :param int x1: x coordinate of the first corner of the trigon
+ :param int y1: y coordinate of the first corner of the trigon
+ :param int x2: x coordinate of the second corner of the trigon
+ :param int y2: y coordinate of the second corner of the trigon
+ :param int x3: x coordinate of the third corner of the trigon
+ :param int y3: y coordinate of the third corner of the trigon
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## pygame.gfxdraw.filled_trigon ##
+
+.. function:: polygon
+
+ | :sl:`draw a polygon`
+ | :sg:`polygon(surface, points, color) -> None`
+
+ Draws an unfilled polygon on the given surface. For a filled polygon use
+ :meth:`filled_polygon`.
+
+ The adjacent coordinates in the ``points`` argument, as well as the first
+ and last points, will be connected by line segments.
+ e.g. For the points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will
+ be drawn from ``(x1, y1)`` to ``(x2, y2)``, from ``(x2, y2)`` to
+ ``(x3, y3)``, and from ``(x3, y3)`` to ``(x1, y1)``.
+
+ :param Surface surface: surface to draw on
+ :param points: a sequence of 3 or more (x, y) coordinates, where each
+ *coordinate* in the sequence must be a
+ tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats (float values
+ will be truncated)
+ :type points: tuple(coordinate) or list(coordinate)
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ :raises ValueError: if ``len(points) < 3`` (must have at least 3 points)
+ :raises IndexError: if ``len(coordinate) < 2`` (each coordinate must have
+ at least 2 items)
+
+ .. ## pygame.gfxdraw.polygon ##
+
+.. function:: aapolygon
+
+ | :sl:`draw an antialiased polygon`
+ | :sg:`aapolygon(surface, points, color) -> None`
+
+ Draws an unfilled antialiased polygon on the given surface.
+
+ The adjacent coordinates in the ``points`` argument, as well as the first
+ and last points, will be connected by line segments.
+ e.g. For the points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will
+ be drawn from ``(x1, y1)`` to ``(x2, y2)``, from ``(x2, y2)`` to
+ ``(x3, y3)``, and from ``(x3, y3)`` to ``(x1, y1)``.
+
+ :param Surface surface: surface to draw on
+ :param points: a sequence of 3 or more (x, y) coordinates, where each
+ *coordinate* in the sequence must be a
+ tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats (float values
+ will be truncated)
+ :type points: tuple(coordinate) or list(coordinate)
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ :raises ValueError: if ``len(points) < 3`` (must have at least 3 points)
+ :raises IndexError: if ``len(coordinate) < 2`` (each coordinate must have
+ at least 2 items)
+
+ .. ## pygame.gfxdraw.aapolygon ##
+
+.. function:: filled_polygon
+
+ | :sl:`draw a filled polygon`
+ | :sg:`filled_polygon(surface, points, color) -> None`
+
+ Draws a filled polygon on the given surface. For an unfilled polygon use
+ :meth:`polygon`.
+
+ The adjacent coordinates in the ``points`` argument, as well as the first
+ and last points, will be connected by line segments.
+ e.g. For the points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will
+ be drawn from ``(x1, y1)`` to ``(x2, y2)``, from ``(x2, y2)`` to
+ ``(x3, y3)``, and from ``(x3, y3)`` to ``(x1, y1)``.
+
+ :param Surface surface: surface to draw on
+ :param points: a sequence of 3 or more (x, y) coordinates, where each
+ *coordinate* in the sequence must be a
+ tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats (float values
+ will be truncated)`
+ :type points: tuple(coordinate) or list(coordinate)
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ :raises ValueError: if ``len(points) < 3`` (must have at least 3 points)
+ :raises IndexError: if ``len(coordinate) < 2`` (each coordinate must have
+ at least 2 items)
+
+ .. ## pygame.gfxdraw.filled_polygon ##
+
+.. function:: textured_polygon
+
+ | :sl:`draw a textured polygon`
+ | :sg:`textured_polygon(surface, points, texture, tx, ty) -> None`
+
+ Draws a textured polygon on the given surface. For better performance, the
+ surface and the texture should have the same format.
+
+ A per-pixel alpha texture blit to a per-pixel alpha surface will differ from
+ a :func:`pygame.Surface.blit` blit. Also, a per-pixel alpha texture cannot be
+ used with an 8-bit per pixel destination.
+
+ The adjacent coordinates in the ``points`` argument, as well as the first
+ and last points, will be connected by line segments.
+ e.g. For the points ``[(x1, y1), (x2, y2), (x3, y3)]`` a line segment will
+ be drawn from ``(x1, y1)`` to ``(x2, y2)``, from ``(x2, y2)`` to
+ ``(x3, y3)``, and from ``(x3, y3)`` to ``(x1, y1)``.
+
+ :param Surface surface: surface to draw on
+ :param points: a sequence of 3 or more (x, y) coordinates, where each
+ *coordinate* in the sequence must be a
+ tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats (float values
+ will be truncated)
+ :type points: tuple(coordinate) or list(coordinate)
+ :param Surface texture: texture to draw on the polygon
+ :param int tx: x offset of the texture
+ :param int ty: y offset of the texture
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ :raises ValueError: if ``len(points) < 3`` (must have at least 3 points)
+ :raises IndexError: if ``len(coordinate) < 2`` (each coordinate must have
+ at least 2 items)
+
+ .. ## pygame.gfxdraw.textured_polygon ##
+
+.. function:: bezier
+
+ | :sl:`draw a Bezier curve`
+ | :sg:`bezier(surface, points, steps, color) -> None`
+
+ Draws a Bézier curve on the given surface.
+
+ :param Surface surface: surface to draw on
+ :param points: a sequence of 3 or more (x, y) coordinates used to form a
+ curve, where each *coordinate* in the sequence must be a
+ tuple/list/:class:`pygame.math.Vector2` of 2 ints/floats (float values
+ will be truncated)
+ :type points: tuple(coordinate) or list(coordinate)
+ :param int steps: number of steps for the interpolation, the minimum is 2
+ :param color: color to draw with, the alpha value is optional if using a
+ tuple ``(RGB[A])``
+ :type color: Color or tuple(int, int, int, [int])
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ :raises ValueError: if ``steps < 2``
+ :raises ValueError: if ``len(points) < 3`` (must have at least 3 points)
+ :raises IndexError: if ``len(coordinate) < 2`` (each coordinate must have
+ at least 2 items)
+
+ .. ## pygame.gfxdraw.bezier ##
+
+.. ## pygame.gfxdraw ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/image.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/image.rst.txt
new file mode 100644
index 00000000..ec2e4fc4
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/image.rst.txt
@@ -0,0 +1,375 @@
+.. include:: common.txt
+
+:mod:`pygame.image`
+===================
+
+.. module:: pygame.image
+ :synopsis: pygame module for loading and saving images
+
+| :sl:`pygame module for image transfer`
+
+The image module contains functions for loading and saving pictures, as well as
+transferring Surfaces to formats usable by other packages.
+
+Note that there is no Image class; an image is loaded as a Surface object. The
+Surface class allows manipulation (drawing lines, setting pixels, capturing
+regions, etc.).
+
+In the vast majority of installations, pygame is built to support extended
+formats, using the SDL_Image library behind the scenes. However, some
+installations may only support uncompressed ``BMP`` images. With full image
+support, the :func:`pygame.image.load()` function can load the following
+formats.
+
+ * ``BMP``
+
+ * ``GIF`` (non-animated)
+
+ * ``JPEG``
+
+ * ``LBM`` (and ``PBM``, ``PGM``, ``PPM``)
+
+ * ``PCX``
+
+ * ``PNG``
+
+ * ``PNM``
+
+ * ``SVG`` (limited support, using Nano SVG)
+
+ * ``TGA`` (uncompressed)
+
+ * ``TIFF``
+
+ * ``WEBP``
+
+ * ``XPM``
+
+
+.. versionadded:: 2.0 Loading SVG, WebP, PNM
+
+Saving images only supports a limited set of formats. You can save to the
+following formats.
+
+ * ``BMP``
+
+ * ``JPEG``
+
+ * ``PNG``
+
+ * ``TGA``
+
+
+``JPEG`` and ``JPG``, as well as ``TIF`` and ``TIFF`` refer to the same file format
+
+.. versionadded:: 1.8 Saving PNG and JPEG files.
+
+
+.. function:: load
+
+ | :sl:`load new image from a file (or file-like object)`
+ | :sg:`load(filename) -> Surface`
+ | :sg:`load(fileobj, namehint="") -> Surface`
+
+ Load an image from a file source. You can pass either a filename, a Python
+ file-like object, or a pathlib.Path.
+
+ Pygame will automatically determine the image type (e.g., ``GIF`` or bitmap)
+ and create a new Surface object from the data. In some cases it will need to
+ know the file extension (e.g., ``GIF`` images should end in ".gif"). If you
+ pass a raw file-like object, you may also want to pass the original filename
+ as the namehint argument.
+
+ The returned Surface will contain the same color format, colorkey and alpha
+ transparency as the file it came from. You will often want to call
+ :func:`pygame.Surface.convert()` with no arguments, to create a copy that
+ will draw more quickly on the screen.
+
+ For alpha transparency, like in .png images, use the
+ :func:`pygame.Surface.convert_alpha()` method after loading so that the
+ image has per pixel transparency.
+
+ Pygame may not always be built to support all image formats. At minimum it
+ will support uncompressed ``BMP``. If :func:`pygame.image.get_extended()`
+ returns ``True``, you should be able to load most images (including PNG, JPG
+ and GIF).
+
+ You should use :func:`os.path.join()` for compatibility.
+
+ ::
+
+ eg. asurf = pygame.image.load(os.path.join('data', 'bla.png'))
+
+ .. ## pygame.image.load ##
+
+.. function:: save
+
+ | :sl:`save an image to file (or file-like object)`
+ | :sg:`save(Surface, filename) -> None`
+ | :sg:`save(Surface, fileobj, namehint="") -> None`
+
+ This will save your Surface as either a ``BMP``, ``TGA``, ``PNG``, or
+ ``JPEG`` image. If the filename extension is unrecognized it will default to
+ ``TGA``. Both ``TGA``, and ``BMP`` file formats create uncompressed files.
+ You can pass a filename, a pathlib.Path or a Python file-like object.
+ For file-like object, the image is saved to ``TGA`` format unless
+ a namehint with a recognizable extension is passed in.
+
+ .. note:: When saving to a file-like object, it seems that for most formats,
+ the object needs to be flushed after saving to it to make loading
+ from it possible.
+
+ .. versionchanged:: 1.8 Saving PNG and JPEG files.
+ .. versionchanged:: 2.0.0
+ The ``namehint`` parameter was added to make it possible
+ to save other formats than ``TGA`` to a file-like object.
+ Saving to a file-like object with JPEG is possible.
+
+ .. ## pygame.image.save ##
+
+.. function:: get_sdl_image_version
+
+ | :sl:`get version number of the SDL_Image library being used`
+ | :sg:`get_sdl_image_version(linked=True) -> None`
+ | :sg:`get_sdl_image_version(linked=True) -> (major, minor, patch)`
+
+ If pygame is built with extended image formats, then this function will
+ return the SDL_Image library's version number as a tuple of 3 integers
+ ``(major, minor, patch)``. If not, then it will return ``None``.
+
+ ``linked=True`` is the default behavior and the function will return the
+ version of the library that Pygame is linked against, while ``linked=False``
+ will return the version of the library that Pygame is compiled against.
+
+ .. versionadded:: 2.0.0
+
+ .. versionchanged:: 2.2.0 ``linked`` keyword argument added and default behavior changed from returning compiled version to returning linked version
+
+ .. ## pygame.image.get_sdl_image_version ##
+
+.. function:: get_extended
+
+ | :sl:`test if extended image formats can be loaded`
+ | :sg:`get_extended() -> bool`
+
+ If pygame is built with extended image formats this function will return
+ True. It is still not possible to determine which formats will be available,
+ but generally you will be able to load them all.
+
+ .. ## pygame.image.get_extended ##
+
+.. function:: tostring
+
+ | :sl:`transfer image to byte buffer`
+ | :sg:`tostring(Surface, format, flipped=False) -> bytes`
+
+ Creates a string of bytes that can be transferred with the ``fromstring``
+ or ``frombytes`` methods in other Python imaging packages. Some Python
+ image packages prefer their images in bottom-to-top format (PyOpenGL for
+ example). If you pass ``True`` for the flipped argument, the byte buffer
+ will be vertically flipped.
+
+ The format argument is a string of one of the following values. Note that
+ only 8-bit Surfaces can use the "P" format. The other formats will work for
+ any Surface. Also note that other Python image packages support more formats
+ than pygame.
+
+ * ``P``, 8-bit palettized Surfaces
+
+ * ``RGB``, 24-bit image
+
+ * ``RGBX``, 32-bit image with unused space
+
+ * ``RGBA``, 32-bit image with an alpha channel
+
+ * ``ARGB``, 32-bit image with alpha channel first
+
+ * ``BGRA``, 32-bit image with alpha channel, red and blue channels swapped
+
+ * ``RGBA_PREMULT``, 32-bit image with colors scaled by alpha channel
+
+ * ``ARGB_PREMULT``, 32-bit image with colors scaled by alpha channel, alpha channel first
+
+ .. note:: it is preferred to use :func:`tobytes` as of pygame 2.1.3
+
+ .. versionadded:: 2.1.3 BGRA format
+ .. ## pygame.image.tostring ##
+
+.. function:: tobytes
+
+ | :sl:`transfer image to byte buffer`
+ | :sg:`tobytes(Surface, format, flipped=False) -> bytes`
+
+ Creates a string of bytes that can be transferred with the ``fromstring``
+ or ``frombytes`` methods in other Python imaging packages. Some Python
+ image packages prefer their images in bottom-to-top format (PyOpenGL for
+ example). If you pass ``True`` for the flipped argument, the byte buffer
+ will be vertically flipped.
+
+ The format argument is a string of one of the following values. Note that
+ only 8-bit Surfaces can use the "P" format. The other formats will work for
+ any Surface. Also note that other Python image packages support more formats
+ than pygame.
+
+ * ``P``, 8-bit palettized Surfaces
+
+ * ``RGB``, 24-bit image
+
+ * ``RGBX``, 32-bit image with unused space
+
+ * ``RGBA``, 32-bit image with an alpha channel
+
+ * ``ARGB``, 32-bit image with alpha channel first
+
+ * ``BGRA``, 32-bit image with alpha channel, red and blue channels swapped
+
+ * ``RGBA_PREMULT``, 32-bit image with colors scaled by alpha channel
+
+ * ``ARGB_PREMULT``, 32-bit image with colors scaled by alpha channel, alpha channel first
+
+ .. note:: this function is an alias for :func:`tostring`. The use of this
+ function is recommended over :func:`tostring` as of pygame 2.1.3.
+ This function was introduced so it matches nicely with other
+ libraries (PIL, numpy, etc), and with people's expectations.
+
+ .. versionadded:: 2.1.3
+
+ .. ## pygame.image.tobytes ##
+
+
+.. function:: fromstring
+
+ | :sl:`create new Surface from a byte buffer`
+ | :sg:`fromstring(bytes, size, format, flipped=False) -> Surface`
+
+ This function takes arguments similar to :func:`pygame.image.tostring()`.
+ The size argument is a pair of numbers representing the width and height.
+ Once the new Surface is created it is independent from the memory of the
+ bytes passed in.
+
+ The bytes and format passed must compute to the exact size of image
+ specified. Otherwise a ``ValueError`` will be raised.
+
+ See the :func:`pygame.image.frombuffer()` method for a potentially faster
+ way to transfer images into pygame.
+
+ .. note:: it is preferred to use :func:`frombytes` as of pygame 2.1.3
+
+ .. ## pygame.image.fromstring ##
+
+.. function:: frombytes
+
+ | :sl:`create new Surface from a byte buffer`
+ | :sg:`frombytes(bytes, size, format, flipped=False) -> Surface`
+
+ This function takes arguments similar to :func:`pygame.image.tobytes()`.
+ The size argument is a pair of numbers representing the width and height.
+ Once the new Surface is created it is independent from the memory of the
+ bytes passed in.
+
+ The bytes and format passed must compute to the exact size of image
+ specified. Otherwise a ``ValueError`` will be raised.
+
+ See the :func:`pygame.image.frombuffer()` method for a potentially faster
+ way to transfer images into pygame.
+
+ .. note:: this function is an alias for :func:`fromstring`. The use of this
+ function is recommended over :func:`fromstring` as of pygame 2.1.3.
+ This function was introduced so it matches nicely with other
+ libraries (PIL, numpy, etc), and with people's expectations.
+
+ .. versionadded:: 2.1.3
+
+ .. ## pygame.image.frombytes ##
+
+.. function:: frombuffer
+
+ | :sl:`create a new Surface that shares data inside a bytes buffer`
+ | :sg:`frombuffer(buffer, size, format) -> Surface`
+
+ Create a new Surface that shares pixel data directly from a buffer. This
+ buffer can be bytes, a bytearray, a memoryview, a
+ :class:`pygame.BufferProxy`, or any object that supports the buffer protocol.
+ This method takes similar arguments to :func:`pygame.image.fromstring()`, but
+ is unable to vertically flip the source data.
+
+ This will run much faster than :func:`pygame.image.fromstring`, since no
+ pixel data must be allocated and copied.
+
+ It accepts the following 'format' arguments:
+
+ * ``P``, 8-bit palettized Surfaces
+
+ * ``RGB``, 24-bit image
+
+ * ``BGR``, 24-bit image, red and blue channels swapped.
+
+ * ``RGBX``, 32-bit image with unused space
+
+ * ``RGBA``, 32-bit image with an alpha channel
+
+ * ``ARGB``, 32-bit image with alpha channel first
+
+ * ``BGRA``, 32-bit image with alpha channel, red and blue channels swapped
+
+ .. versionadded:: 2.1.3 BGRA format
+ .. ## pygame.image.frombuffer ##
+
+.. function:: load_basic
+
+ | :sl:`load new BMP image from a file (or file-like object)`
+ | :sg:`load_basic(file) -> Surface`
+
+ Load an image from a file source. You can pass either a filename or a Python
+ file-like object, or a pathlib.Path.
+
+ This function only supports loading "basic" image format, ie ``BMP``
+ format.
+ This function is always available, no matter how pygame was built.
+
+ .. ## pygame.image.load_basic ##
+
+.. function:: load_extended
+
+ | :sl:`load an image from a file (or file-like object)`
+ | :sg:`load_extended(filename) -> Surface`
+ | :sg:`load_extended(fileobj, namehint="") -> Surface`
+
+ This function is similar to :func:`pygame.image.load()`, except that this
+ function can only be used if pygame was built with extended image format
+ support.
+
+ .. versionchanged:: 2.0.1
+ This function is always available, but raises an
+ ``NotImplementedError`` if extended image formats are
+ not supported.
+ Previously, this function may or may not be
+ available, depending on the state of extended image
+ format support.
+
+ .. ## pygame.image.load_extended ##
+
+.. function:: save_extended
+
+ | :sl:`save a png/jpg image to file (or file-like object)`
+ | :sg:`save_extended(Surface, filename) -> None`
+ | :sg:`save_extended(Surface, fileobj, namehint="") -> None`
+
+ This will save your Surface as either a ``PNG`` or ``JPEG`` image.
+
+ In case the image is being saved to a file-like object, this function
+ uses the namehint argument to determine the format of the file being
+ saved. Saves to ``JPEG`` in case the namehint was not specified while
+ saving to a file-like object.
+
+ .. versionchanged:: 2.0.1
+ This function is always available, but raises an
+ ``NotImplementedError`` if extended image formats are
+ not supported.
+ Previously, this function may or may not be
+ available, depending on the state of extended image
+ format support.
+
+ .. ## pygame.image.save_extended ##
+
+.. ## pygame.image ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/joystick.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/joystick.rst.txt
new file mode 100644
index 00000000..dba5b20d
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/joystick.rst.txt
@@ -0,0 +1,697 @@
+.. include:: common.txt
+
+:mod:`pygame.joystick`
+======================
+
+.. module:: pygame.joystick
+ :synopsis: Pygame module for interacting with joysticks, gamepads, and trackballs.
+
+| :sl:`Pygame module for interacting with joysticks, gamepads, and trackballs.`
+
+The joystick module manages the joystick devices on a computer.
+Joystick devices include trackballs and video-game-style
+gamepads, and the module allows the use of multiple buttons and "hats".
+Computers may manage multiple joysticks at a time.
+
+Each instance of the Joystick class represents one gaming device plugged
+into the computer. If a gaming pad has multiple joysticks on it, then the
+joystick object can actually represent multiple joysticks on that single
+game device.
+
+For a quick way to initialise the joystick module and get a list of Joystick instances
+use the following code::
+
+ pygame.joystick.init()
+ joysticks = [pygame.joystick.Joystick(x) for x in range(pygame.joystick.get_count())]
+
+The following event types will be generated by the joysticks ::
+
+ JOYAXISMOTION JOYBALLMOTION JOYBUTTONDOWN JOYBUTTONUP JOYHATMOTION
+
+And in pygame 2, which supports hotplugging::
+
+ JOYDEVICEADDED JOYDEVICEREMOVED
+
+Note that in pygame 2, joysticks events use a unique "instance ID". The device index
+passed in the constructor to a Joystick object is not unique after devices have
+been added and removed. You must call :meth:`Joystick.get_instance_id()` to find
+the instance ID that was assigned to a Joystick on opening.
+
+The event queue needs to be pumped frequently for some of the methods to work.
+So call one of pygame.event.get, pygame.event.wait, or pygame.event.pump regularly.
+
+To be able to get joystick events and update the joystick objects while the window
+is not in focus, you may set the ``SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS`` environment
+variable. See :ref:`environment variables ` for more details.
+
+
+.. function:: init
+
+ | :sl:`Initialize the joystick module.`
+ | :sg:`init() -> None`
+
+ This function is called automatically by ``pygame.init()``.
+
+ It initializes the joystick module. The module must be initialized before any
+ other functions will work.
+
+ It is safe to call this function more than once.
+
+ .. ## pygame.joystick.init ##
+
+.. function:: quit
+
+ | :sl:`Uninitialize the joystick module.`
+ | :sg:`quit() -> None`
+
+ Uninitialize the joystick module. After you call this any existing joystick
+ objects will no longer work.
+
+ It is safe to call this function more than once.
+
+ .. ## pygame.joystick.quit ##
+
+.. function:: get_init
+
+ | :sl:`Returns True if the joystick module is initialized.`
+ | :sg:`get_init() -> bool`
+
+ Test if the ``pygame.joystick.init()`` function has been called.
+
+ .. ## pygame.joystick.get_init ##
+
+.. function:: get_count
+
+ | :sl:`Returns the number of joysticks.`
+ | :sg:`get_count() -> count`
+
+ Return the number of joystick devices on the system. The count will be ``0``
+ if there are no joysticks on the system.
+
+ When you create Joystick objects using ``Joystick(id)``, you pass an integer
+ that must be lower than this count.
+
+ .. ## pygame.joystick.get_count ##
+
+.. class:: Joystick
+
+ | :sl:`Create a new Joystick object.`
+ | :sg:`Joystick(id) -> Joystick`
+
+ Create a new joystick to access a physical device. The id argument must be a
+ value from ``0`` to ``pygame.joystick.get_count() - 1``.
+
+ Joysticks are initialised on creation and are shut down when deallocated.
+ Once the device is initialized the pygame event queue will start receiving
+ events about its input.
+
+ .. versionchanged:: 2.0.0 Joystick objects are now opened immediately on creation.
+
+ .. method:: init
+
+ | :sl:`initialize the Joystick`
+ | :sg:`init() -> None`
+
+ Initialize the joystick, if it has been closed. It is safe to call this
+ even if the joystick is already initialized.
+
+ .. deprecated:: 2.0.0
+
+ In future it will not be possible to reinitialise a closed Joystick
+ object. Will be removed in Pygame 2.1.
+
+ .. ## Joystick.init ##
+
+ .. method:: quit
+
+ | :sl:`uninitialize the Joystick`
+ | :sg:`quit() -> None`
+
+ Close a Joystick object. After this the pygame event queue will no longer
+ receive events from the device.
+
+ It is safe to call this more than once.
+
+ .. ## Joystick.quit ##
+
+ .. method:: get_init
+
+ | :sl:`check if the Joystick is initialized`
+ | :sg:`get_init() -> bool`
+
+ Return True if the Joystick object is currently initialised.
+
+ .. ## Joystick.get_init ##
+
+ .. method:: get_id
+
+ | :sl:`get the device index (deprecated)`
+ | :sg:`get_id() -> int`
+
+ Returns the original device index for this device. This is the same
+ value that was passed to the ``Joystick()`` constructor. This method can
+ safely be called while the Joystick is not initialized.
+
+ .. deprecated:: 2.0.0
+
+ The original device index is not useful in pygame 2. Use
+ :meth:`.get_instance_id` instead. Will be removed in Pygame 2.1.
+
+ .. method:: get_instance_id() -> int
+
+ | :sl:`get the joystick instance id`
+ | :sg:`get_instance_id() -> int`
+
+ Get the joystick instance ID. This matches the ``instance_id`` field
+ that is given in joystick events.
+
+ .. versionadded:: 2.0.0dev11
+
+ .. method:: get_guid() -> str
+
+ | :sl:`get the joystick GUID`
+ | :sg:`get_guid() -> str`
+
+ Get the GUID string. This identifies the exact hardware of the joystick
+ device.
+
+ .. versionadded:: 2.0.0dev11
+
+ .. method:: get_power_level() -> str
+
+ | :sl:`get the approximate power status of the device`
+ | :sg:`get_power_level() -> str`
+
+ Get a string giving the power status of the device.
+
+ One of: ``empty``, ``low``, ``medium``, ``full``, ``wired``, ``max``, or
+ ``unknown``.
+
+ .. versionadded:: 2.0.0dev11
+
+ .. ## Joystick.get_id ##
+
+ .. method:: get_name
+
+ | :sl:`get the Joystick system name`
+ | :sg:`get_name() -> string`
+
+ Returns the system name for this joystick device. It is unknown what name
+ the system will give to the Joystick, but it should be a unique name that
+ identifies the device. This method can safely be called while the
+ Joystick is not initialized.
+
+ .. ## Joystick.get_name ##
+
+ .. method:: get_numaxes
+
+ | :sl:`get the number of axes on a Joystick`
+ | :sg:`get_numaxes() -> int`
+
+ Returns the number of input axes are on a Joystick. There will usually be
+ two for the position. Controls like rudders and throttles are treated as
+ additional axes.
+
+ The ``pygame.JOYAXISMOTION`` events will be in the range from ``-1.0``
+ to ``1.0``. A value of ``0.0`` means the axis is centered. Gamepad devices
+ will usually be ``-1``, ``0``, or ``1`` with no values in between. Older
+ analog joystick axes will not always use the full ``-1`` to ``1`` range,
+ and the centered value will be some area around ``0``.
+
+ Analog joysticks usually have a bit of noise in their axis, which will
+ generate a lot of rapid small motion events.
+
+ .. ## Joystick.get_numaxes ##
+
+ .. method:: get_axis
+
+ | :sl:`get the current position of an axis`
+ | :sg:`get_axis(axis_number) -> float`
+
+ Returns the current position of a joystick axis. The value will range
+ from ``-1`` to ``1`` with a value of ``0`` being centered. You may want
+ to take into account some tolerance to handle jitter, and joystick drift
+ may keep the joystick from centering at ``0`` or using the full range of
+ position values.
+
+ The axis number must be an integer from ``0`` to ``get_numaxes() - 1``.
+
+ When using gamepads both the control sticks and the analog triggers are
+ usually reported as axes.
+
+ .. ## Joystick.get_axis ##
+
+ .. method:: get_numballs
+
+ | :sl:`get the number of trackballs on a Joystick`
+ | :sg:`get_numballs() -> int`
+
+ Returns the number of trackball devices on a Joystick. These devices work
+ similar to a mouse but they have no absolute position; they only have
+ relative amounts of movement.
+
+ The ``pygame.JOYBALLMOTION`` event will be sent when the trackball is
+ rolled. It will report the amount of movement on the trackball.
+
+ .. ## Joystick.get_numballs ##
+
+ .. method:: get_ball
+
+ | :sl:`get the relative position of a trackball`
+ | :sg:`get_ball(ball_number) -> x, y`
+
+ Returns the relative movement of a joystick button. The value is a ``x, y``
+ pair holding the relative movement since the last call to get_ball.
+
+ The ball number must be an integer from ``0`` to ``get_numballs() - 1``.
+
+ .. ## Joystick.get_ball ##
+
+ .. method:: get_numbuttons
+
+ | :sl:`get the number of buttons on a Joystick`
+ | :sg:`get_numbuttons() -> int`
+
+ Returns the number of pushable buttons on the joystick. These buttons
+ have a boolean (on or off) state.
+
+ Buttons generate a ``pygame.JOYBUTTONDOWN`` and ``pygame.JOYBUTTONUP``
+ event when they are pressed and released.
+
+ .. ## Joystick.get_numbuttons ##
+
+ .. method:: get_button
+
+ | :sl:`get the current button state`
+ | :sg:`get_button(button) -> bool`
+
+ Returns the current state of a joystick button.
+
+ .. ## Joystick.get_button ##
+
+ .. method:: get_numhats
+
+ | :sl:`get the number of hat controls on a Joystick`
+ | :sg:`get_numhats() -> int`
+
+ Returns the number of joystick hats on a Joystick. Hat devices are like
+ miniature digital joysticks on a joystick. Each hat has two axes of
+ input.
+
+ The ``pygame.JOYHATMOTION`` event is generated when the hat changes
+ position. The ``position`` attribute for the event contains a pair of
+ values that are either ``-1``, ``0``, or ``1``. A position of ``(0, 0)``
+ means the hat is centered.
+
+ .. ## Joystick.get_numhats ##
+
+ .. method:: get_hat
+
+ | :sl:`get the position of a joystick hat`
+ | :sg:`get_hat(hat_number) -> x, y`
+
+ Returns the current position of a position hat. The position is given as
+ two values representing the ``x`` and ``y`` position for the hat. ``(0, 0)``
+ means centered. A value of ``-1`` means left/down and a value of ``1`` means
+ right/up: so ``(-1, 0)`` means left; ``(1, 0)`` means right; ``(0, 1)`` means
+ up; ``(1, 1)`` means upper-right; etc.
+
+ This value is digital, ``i.e.``, each coordinate can be ``-1``, ``0`` or ``1``
+ but never in-between.
+
+ The hat number must be between ``0`` and ``get_numhats() - 1``.
+
+ .. ## Joystick.get_hat ##
+
+ .. method:: rumble
+
+ | :sl:`Start a rumbling effect`
+ | :sg:`rumble(low_frequency, high_frequency, duration) -> bool`
+
+ Start a rumble effect on the joystick, with the specified strength ranging
+ from 0 to 1. Duration is length of the effect, in ms. Setting the duration
+ to 0 will play the effect until another one overwrites it or
+ :meth:`Joystick.stop_rumble` is called. If an effect is already
+ playing, then it will be overwritten.
+
+ Returns True if the rumble was played successfully or False if the
+ joystick does not support it or :meth:`pygame.version.SDL` is below 2.0.9.
+
+ .. versionadded:: 2.0.2
+
+ .. ## Joystick.rumble ##
+
+ .. method:: stop_rumble
+
+ | :sl:`Stop any rumble effect playing`
+ | :sg:`stop_rumble() -> None`
+
+ Stops any rumble effect playing on the joystick. See
+ :meth:`Joystick.rumble` for more information.
+
+ .. versionadded:: 2.0.2
+
+ .. ## Joystick.stop_rumble ##
+
+ .. ## pygame.joystick.Joystick ##
+
+.. ## pygame.joystick ##
+
+.. figure:: code_examples/joystick_calls.png
+ :scale: 100 %
+ :alt: joystick module example
+
+ Example code for joystick module.
+
+.. literalinclude:: ../../../examples/joystick.py
+
+.. _controller-mappings:
+
+
+Common Controller Axis Mappings
+===============================
+
+Controller mappings are drawn from the underlying SDL library which pygame uses and they differ
+between pygame 1 and pygame 2. Below are a couple of mappings for three popular controllers.
+
+Axis and hat mappings are listed from -1 to +1.
+
+
+Nintendo Switch Left Joy-Con (pygame 2.x)
+*****************************************
+
+The Nintendo Switch Left Joy-Con has 4 axes, 11 buttons, and 0 hats. The values for the 4 axes never change.
+The controller is recognized as "Wireless Gamepad"
+
+
+* **Buttons**::
+
+ D-pad Up - Button 0
+ D-pad Down - Button 1
+ D-pad Left - Button 2
+ D-pad Right - Button 3
+ SL - Button 4
+ SR - Button 5
+ - - Button 8
+ Stick In - Button 10
+ Capture - Button 13
+ L - Button 14
+ ZL - Button 15
+
+* **Hat/JoyStick**::
+
+ Down -> Up - Y Axis
+ Left -> Right - X Axis
+
+
+Nintendo Switch Right Joy-Con (pygame 2.x)
+******************************************
+
+The Nintendo Switch Right Joy-Con has 4 axes, 11 buttons, and 0 hats. The values for the 4 axes never change.
+The controller is recognized as "Wireless Gamepad"
+
+
+* **Buttons**::
+
+ A Button - Button 0
+ B Button - Button 1
+ X Button - Button 2
+ Y Button - Button 3
+ SL - Button 4
+ SR - Button 5
+ + - Button 9
+ Stick In - Button 11
+ Home - Button 12
+ R - Button 14
+ ZR - Button 15
+
+* **Hat/JoyStick**::
+
+ Down -> Up - Y Axis
+ Left -> Right - X Axis
+
+
+Nintendo Switch Pro Controller (pygame 2.x)
+*******************************************
+
+The Nintendo Switch Pro Controller has 6 axes, 16 buttons, and 0 hats.
+The controller is recognized as "Nintendo Switch Pro Controller".
+
+
+* **Left Stick**::
+
+ Left -> Right - Axis 0
+ Up -> Down - Axis 1
+
+* **Right Stick**::
+
+ Left -> Right - Axis 2
+ Up -> Down - Axis 3
+
+* **Left Trigger**::
+
+ Out -> In - Axis 4
+
+* **Right Trigger**::
+
+ Out -> In - Axis 5
+
+* **Buttons**::
+
+ A Button - Button 0
+ B Button - Button 1
+ X Button - Button 2
+ Y Button - Button 3
+ - Button - Button 4
+ Home Button - Button 5
+ + Button - Button 6
+ L. Stick In - Button 7
+ R. Stick In - Button 8
+ Left Bumper - Button 9
+ Right Bumper - Button 10
+ D-pad Up - Button 11
+ D-pad Down - Button 12
+ D-pad Left - Button 13
+ D-pad Right - Button 14
+ Capture Button - Button 15
+
+
+XBox 360 Controller (pygame 2.x)
+********************************
+
+The Xbox 360 controller mapping has 6 axes, 11 buttons and 1 hat.
+The controller is recognized as "Xbox 360 Controller".
+
+* **Left Stick**::
+
+ Left -> Right - Axis 0
+ Up -> Down - Axis 1
+
+* **Right Stick**::
+
+ Left -> Right - Axis 3
+ Up -> Down - Axis 4
+
+* **Left Trigger**::
+
+ Out -> In - Axis 2
+
+* **Right Trigger**::
+
+ Out -> In - Axis 5
+
+* **Buttons**::
+
+ A Button - Button 0
+ B Button - Button 1
+ X Button - Button 2
+ Y Button - Button 3
+ Left Bumper - Button 4
+ Right Bumper - Button 5
+ Back Button - Button 6
+ Start Button - Button 7
+ L. Stick In - Button 8
+ R. Stick In - Button 9
+ Guide Button - Button 10
+
+* **Hat/D-pad**::
+
+ Down -> Up - Y Axis
+ Left -> Right - X Axis
+
+
+Playstation 4 Controller (pygame 2.x)
+*************************************
+
+The PlayStation 4 controller mapping has 6 axes and 16 buttons.
+The controller is recognized as "PS4 Controller".
+
+* **Left Stick**::
+
+ Left -> Right - Axis 0
+ Up -> Down - Axis 1
+
+* **Right Stick**::
+
+ Left -> Right - Axis 2
+ Up -> Down - Axis 3
+
+* **Left Trigger**::
+
+ Out -> In - Axis 4
+
+* **Right Trigger**::
+
+ Out -> In - Axis 5
+
+* **Buttons**::
+
+ Cross Button - Button 0
+ Circle Button - Button 1
+ Square Button - Button 2
+ Triangle Button - Button 3
+ Share Button - Button 4
+ PS Button - Button 5
+ Options Button - Button 6
+ L. Stick In - Button 7
+ R. Stick In - Button 8
+ Left Bumper - Button 9
+ Right Bumper - Button 10
+ D-pad Up - Button 11
+ D-pad Down - Button 12
+ D-pad Left - Button 13
+ D-pad Right - Button 14
+ Touch Pad Click - Button 15
+
+Playstation 5 Controller (pygame 2.x)
+*************************************
+
+The PlayStation 5 controller mapping has 6 axes, 13 buttons, and 1 hat.
+The controller is recognized as "Sony Interactive Entertainment Wireless Controller".
+
+* **Left Stick**::
+
+ Left -> Right - Axis 0
+ Up -> Down - Axis 1
+
+* **Right Stick**::
+
+ Left -> Right - Axis 3
+ Up -> Down - Axis 4
+
+* **Left Trigger**::
+
+ Out -> In - Axis 2
+
+* **Right Trigger**::
+
+ Out -> In - Axis 5
+
+* **Buttons**::
+
+ Cross Button - Button 0
+ Circle Button - Button 1
+ Square Button - Button 2
+ Triangle Button - Button 3
+ Left Bumper - Button 4
+ Right Bumper - Button 5
+ Left Trigger - Button 6
+ Right Trigger - Button 7
+ Share Button - Button 8
+ Options Button - Button 9
+ PS Button - Button 10
+ Left Stick in - Button 11
+ Right Stick in - Button 12
+
+* **Hat/D-pad**::
+
+ Down -> Up - Y Axis
+ Left -> Right - X Axis
+
+
+
+XBox 360 Controller (pygame 1.x)
+********************************
+
+The Xbox 360 controller mapping has 5 axes, 10 buttons, and 1 hat.
+The controller is recognized as "Controller (XBOX 360 For Windows)".
+
+* **Left Stick**::
+
+ Left -> Right - Axis 0
+ Up -> Down - Axis 1
+
+* **Right Stick**::
+
+ Left -> Right - Axis 4
+ Up -> Down - Axis 3
+
+* **Left Trigger & Right Trigger**::
+
+ RT -> LT - Axis 2
+
+* **Buttons**::
+
+ A Button - Button 0
+ B Button - Button 1
+ X Button - Button 2
+ Y Button - Button 3
+ Left Bumper - Button 4
+ Right Bumper - Button 5
+ Back Button - Button 6
+ Start Button - Button 7
+ L. Stick In - Button 8
+ R. Stick In - Button 9
+
+* **Hat/D-pad**::
+
+ Down -> Up - Y Axis
+ Left -> Right - X Axis
+
+
+Playstation 4 Controller (pygame 1.x)
+*************************************
+
+The PlayStation 4 controller mapping has 6 axes, 14 buttons, and 1 hat.
+The controller is recognized as "Wireless Controller".
+
+* **Left Stick**::
+
+ Left -> Right - Axis 0
+ Up -> Down - Axis 1
+
+* **Right Stick**::
+
+ Left -> Right - Axis 2
+ Up -> Down - Axis 3
+
+* **Left Trigger**::
+
+ Out -> In - Axis 5
+
+* **Right Trigger**::
+
+ Out -> In - Axis 4
+
+* **Buttons**::
+
+ Cross Button - Button 0
+ Circle Button - Button 1
+ Square Button - Button 2
+ Triangle Button - Button 3
+ Left Bumper - Button 4
+ Right Bumper - Button 5
+ L. Trigger(Full)- Button 6
+ R. Trigger(Full)- Button 7
+ Share Button - Button 8
+ Options Button - Button 9
+ L. Stick In - Button 10
+ R. Stick In - Button 11
+ PS Button - Button 12
+ Touch Pad Click - Button 13
+
+* **Hat/D-pad**::
+
+ Down -> Up - Y Axis
+ Left -> Right - X Axis
+
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/key.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/key.rst.txt
new file mode 100644
index 00000000..134f2549
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/key.rst.txt
@@ -0,0 +1,455 @@
+.. include:: common.txt
+
+:mod:`pygame.key`
+=================
+
+.. module:: pygame.key
+ :synopsis: pygame module to work with the keyboard
+
+| :sl:`pygame module to work with the keyboard`
+
+This module contains functions for dealing with the keyboard.
+
+The :mod:`pygame.event` queue gets ``pygame.KEYDOWN`` and ``pygame.KEYUP``
+events when the keyboard buttons are pressed and released. Both events have
+``key`` and ``mod`` attributes.
+
+ * ``key``: an :ref:`integer ID ` representing every key
+ on the keyboard
+ * ``mod``: a bitmask of all the :ref:`modifier keys `
+ that were in a pressed state when the event occurred
+
+The ``pygame.KEYDOWN`` event has the additional attributes ``unicode`` and
+``scancode``.
+
+ * ``unicode``: a single character string that is the fully translated
+ character entered, this takes into account the shift and composition keys
+ * ``scancode``: the platform-specific key code, which could be different from
+ keyboard to keyboard, but is useful for key selection of weird keys like
+ the multimedia keys
+
+.. versionadded:: 2.0.0
+ The ``pygame.TEXTINPUT`` event is preferred to the ``unicode`` attribute
+ of ``pygame.KEYDOWN``. The attribute ``text`` contains the input.
+
+
+.. _key-constants-label:
+
+The following is a list of all the constants (from :mod:`pygame.locals`) used to
+represent keyboard keys.
+
+Portability note: The integers for key constants differ between pygame 1 and 2.
+Always use key constants (``K_a``) rather than integers directly (``97``) so
+that your key handling code works well on both pygame 1 and pygame 2.
+
+
+::
+
+ pygame
+ Constant ASCII Description
+ ---------------------------------
+ K_BACKSPACE \b backspace
+ K_TAB \t tab
+ K_CLEAR clear
+ K_RETURN \r return
+ K_PAUSE pause
+ K_ESCAPE ^[ escape
+ K_SPACE space
+ K_EXCLAIM ! exclaim
+ K_QUOTEDBL " quotedbl
+ K_HASH # hash
+ K_DOLLAR $ dollar
+ K_AMPERSAND & ampersand
+ K_QUOTE quote
+ K_LEFTPAREN ( left parenthesis
+ K_RIGHTPAREN ) right parenthesis
+ K_ASTERISK * asterisk
+ K_PLUS + plus sign
+ K_COMMA , comma
+ K_MINUS - minus sign
+ K_PERIOD . period
+ K_SLASH / forward slash
+ K_0 0 0
+ K_1 1 1
+ K_2 2 2
+ K_3 3 3
+ K_4 4 4
+ K_5 5 5
+ K_6 6 6
+ K_7 7 7
+ K_8 8 8
+ K_9 9 9
+ K_COLON : colon
+ K_SEMICOLON ; semicolon
+ K_LESS < less-than sign
+ K_EQUALS = equals sign
+ K_GREATER > greater-than sign
+ K_QUESTION ? question mark
+ K_AT @ at
+ K_LEFTBRACKET [ left bracket
+ K_BACKSLASH \ backslash
+ K_RIGHTBRACKET ] right bracket
+ K_CARET ^ caret
+ K_UNDERSCORE _ underscore
+ K_BACKQUOTE ` grave
+ K_a a a
+ K_b b b
+ K_c c c
+ K_d d d
+ K_e e e
+ K_f f f
+ K_g g g
+ K_h h h
+ K_i i i
+ K_j j j
+ K_k k k
+ K_l l l
+ K_m m m
+ K_n n n
+ K_o o o
+ K_p p p
+ K_q q q
+ K_r r r
+ K_s s s
+ K_t t t
+ K_u u u
+ K_v v v
+ K_w w w
+ K_x x x
+ K_y y y
+ K_z z z
+ K_DELETE delete
+ K_KP0 keypad 0
+ K_KP1 keypad 1
+ K_KP2 keypad 2
+ K_KP3 keypad 3
+ K_KP4 keypad 4
+ K_KP5 keypad 5
+ K_KP6 keypad 6
+ K_KP7 keypad 7
+ K_KP8 keypad 8
+ K_KP9 keypad 9
+ K_KP_PERIOD . keypad period
+ K_KP_DIVIDE / keypad divide
+ K_KP_MULTIPLY * keypad multiply
+ K_KP_MINUS - keypad minus
+ K_KP_PLUS + keypad plus
+ K_KP_ENTER \r keypad enter
+ K_KP_EQUALS = keypad equals
+ K_UP up arrow
+ K_DOWN down arrow
+ K_RIGHT right arrow
+ K_LEFT left arrow
+ K_INSERT insert
+ K_HOME home
+ K_END end
+ K_PAGEUP page up
+ K_PAGEDOWN page down
+ K_F1 F1
+ K_F2 F2
+ K_F3 F3
+ K_F4 F4
+ K_F5 F5
+ K_F6 F6
+ K_F7 F7
+ K_F8 F8
+ K_F9 F9
+ K_F10 F10
+ K_F11 F11
+ K_F12 F12
+ K_F13 F13
+ K_F14 F14
+ K_F15 F15
+ K_NUMLOCK numlock
+ K_CAPSLOCK capslock
+ K_SCROLLOCK scrollock
+ K_RSHIFT right shift
+ K_LSHIFT left shift
+ K_RCTRL right control
+ K_LCTRL left control
+ K_RALT right alt
+ K_LALT left alt
+ K_RMETA right meta
+ K_LMETA left meta
+ K_LSUPER left Windows key
+ K_RSUPER right Windows key
+ K_MODE mode shift
+ K_HELP help
+ K_PRINT print screen
+ K_SYSREQ sysrq
+ K_BREAK break
+ K_MENU menu
+ K_POWER power
+ K_EURO Euro
+ K_AC_BACK Android back button
+
+
+.. _key-modifiers-label:
+
+The keyboard also has a list of modifier states (from :mod:`pygame.locals`) that
+can be assembled by bitwise-ORing them together.
+
+::
+
+ pygame
+ Constant Description
+ -------------------------
+ KMOD_NONE no modifier keys pressed
+ KMOD_LSHIFT left shift
+ KMOD_RSHIFT right shift
+ KMOD_SHIFT left shift or right shift or both
+ KMOD_LCTRL left control
+ KMOD_RCTRL right control
+ KMOD_CTRL left control or right control or both
+ KMOD_LALT left alt
+ KMOD_RALT right alt
+ KMOD_ALT left alt or right alt or both
+ KMOD_LMETA left meta
+ KMOD_RMETA right meta
+ KMOD_META left meta or right meta or both
+ KMOD_CAPS caps lock
+ KMOD_NUM num lock
+ KMOD_MODE AltGr
+
+
+The modifier information is contained in the ``mod`` attribute of the
+``pygame.KEYDOWN`` and ``pygame.KEYUP`` events. The ``mod`` attribute is a
+bitmask of all the modifier keys that were in a pressed state when the event
+occurred. The modifier information can be decoded using a bitwise AND (except
+for ``KMOD_NONE``, which should be compared using equals ``==``). For example:
+
+::
+
+ for event in pygame.event.get():
+ if event.type == pygame.KEYDOWN or event.type == pygame.KEYUP:
+ if event.mod == pygame.KMOD_NONE:
+ print('No modifier keys were in a pressed state when this '
+ 'event occurred.')
+ else:
+ if event.mod & pygame.KMOD_LSHIFT:
+ print('Left shift was in a pressed state when this event '
+ 'occurred.')
+ if event.mod & pygame.KMOD_RSHIFT:
+ print('Right shift was in a pressed state when this event '
+ 'occurred.')
+ if event.mod & pygame.KMOD_SHIFT:
+ print('Left shift or right shift or both were in a '
+ 'pressed state when this event occurred.')
+
+
+
+.. function:: get_focused
+
+ | :sl:`true if the display is receiving keyboard input from the system`
+ | :sg:`get_focused() -> bool`
+
+ Returns ``True`` when the display window has keyboard focus from the
+ system. If the display needs to ensure it does not lose keyboard focus, it
+ can use :func:`pygame.event.set_grab()` to grab all input.
+
+ .. ## pygame.key.get_focused ##
+
+.. function:: get_pressed
+
+ | :sl:`get the state of all keyboard buttons`
+ | :sg:`get_pressed() -> bools`
+
+ Returns a sequence of boolean values representing the state of every key on
+ the keyboard. Use the key constant values to index the array. A ``True``
+ value means that the button is pressed.
+
+ .. note::
+ Getting the list of pushed buttons with this function is not the proper
+ way to handle text entry from the user. There is no way to know the order
+ of keys pressed, and rapidly pushed keys can be completely unnoticed
+ between two calls to ``pygame.key.get_pressed()``. There is also no way to
+ translate these pushed keys into a fully translated character value. See
+ the ``pygame.KEYDOWN`` events on the :mod:`pygame.event` queue for this
+ functionality.
+
+ .. versionadded:: 2.2.0
+ The collection of bools returned by ``get_pressed`` can not be iterated
+ over because the indexes of the internal tuple does not correpsond to the
+ keycodes.
+
+ .. versionadded:: 2.5.0
+ Iteration over the collection of bools returned by ``get_pressed`` is now
+ restored. However it still does not make sense to iterate over it. Currently.
+
+ .. ## pygame.key.get_pressed ##
+
+.. function:: get_mods
+
+ | :sl:`determine which modifier keys are being held`
+ | :sg:`get_mods() -> int`
+
+ Returns a single integer representing a bitmask of all the modifier keys
+ being held. Using bitwise operators you can test if specific
+ :ref:`modifier keys ` are pressed.
+
+ .. ## pygame.key.get_mods ##
+
+.. function:: set_mods
+
+ | :sl:`temporarily set which modifier keys are pressed`
+ | :sg:`set_mods(int) -> None`
+
+ Create a bitmask of the :ref:`modifier key constants `
+ you want to impose on your program.
+
+ .. ## pygame.key.set_mods ##
+
+.. function:: set_repeat
+
+ | :sl:`control how held keys are repeated`
+ | :sg:`set_repeat() -> None`
+ | :sg:`set_repeat(delay) -> None`
+ | :sg:`set_repeat(delay, interval) -> None`
+
+ When the keyboard repeat is enabled, keys that are held down will generate
+ multiple ``pygame.KEYDOWN`` events. The ``delay`` parameter is the number of
+ milliseconds before the first repeated ``pygame.KEYDOWN`` event will be sent.
+ After that, another ``pygame.KEYDOWN`` event will be sent every ``interval``
+ milliseconds. If a ``delay`` value is provided and an ``interval`` value is
+ not provided or is 0, then the ``interval`` will be set to the same value as
+ ``delay``.
+
+ To disable key repeat call this function with no arguments or with ``delay``
+ set to 0.
+
+ When pygame is initialized the key repeat is disabled.
+
+ :raises ValueError: if ``delay`` or ``interval`` is < 0
+
+ .. versionchanged:: 2.0.0 A ``ValueError`` is now raised (instead of a
+ ``pygame.error``) if ``delay`` or ``interval`` is < 0.
+
+ .. ## pygame.key.set_repeat ##
+
+.. function:: get_repeat
+
+ | :sl:`see how held keys are repeated`
+ | :sg:`get_repeat() -> (delay, interval)`
+
+ Get the ``delay`` and ``interval`` keyboard repeat values. Refer to
+ :func:`pygame.key.set_repeat()` for a description of these values.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.key.get_repeat ##
+
+.. function:: name
+
+ | :sl:`get the name of a key identifier`
+ | :sg:`name(key, use_compat=True) -> str`
+
+ Get the descriptive name of the button from a keyboard button id constant.
+ Returns an empty string (``""``) if the key is not found.
+
+ If ``use_compat`` argument is ``True`` (which is the default), this function
+ returns the legacy name of a key where applicable. The return value is
+ expected to be the same across different pygame versions (provided the
+ corresponding key constant exists and is unique). If the return value is
+ passed to the ``key_code`` function, the original constant will be returned.
+
+ **Experimental:** ``use_compat`` paramater still in development for testing and feedback. It may change.
+ `Please leave use_compat feedback with authors `_
+
+ If this argument is ``False``, the returned name may be prettier to display
+ and may cover a wider range of keys than with ``use_compat``, but there are
+ no guarantees that this name will be the same across different pygame
+ versions. If the name returned is passed to the ``key_code`` function, the
+ original constant is returned back (this is an implementation detail which
+ may change later, do not rely on this)
+
+ .. versionchanged:: 2.1.3 Added ``use_compat`` argument and guaranteed API stability for it
+
+ .. ## pygame.key.name ##
+
+.. function:: key_code
+
+ | :sl:`get the key identifier from a key name`
+ | :sg:`key_code(name=string) -> int`
+
+ Get the key identifier code from the descriptive name of the key. This
+ returns an integer matching one of the K_* keycodes. For example:
+
+ ::
+
+ >>> pygame.key.key_code("return") == pygame.K_RETURN
+ True
+ >>> pygame.key.key_code("0") == pygame.K_0
+ True
+ >>> pygame.key.key_code("space") == pygame.K_SPACE
+ True
+
+ :raises ValueError: if the key name is not known.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.key.key_code ##
+
+.. function:: start_text_input
+
+ | :sl:`start handling Unicode text input events`
+ | :sg:`start_text_input() -> None`
+
+ Start receiving ``pygame.TEXTEDITING`` and ``pygame.TEXTINPUT``
+ events. If applicable, show the on-screen keyboard or IME editor.
+
+ For many languages, key presses will automatically generate a
+ corresponding ``pygame.TEXTINPUT`` event. Special keys like
+ escape or function keys, and certain key combinations will not
+ generate ``pygame.TEXTINPUT`` events.
+
+ In other languages, entering a single symbol may require multiple
+ key presses, or a language-specific user interface. In this case,
+ ``pygame.TEXTINPUT`` events are preferable to ``pygame.KEYDOWN``
+ events for text input.
+
+ A ``pygame.TEXTEDITING`` event is received when an IME composition
+ is started or changed. It contains the composition ``text``, ``length``,
+ and editing ``start`` position within the composition (attributes
+ ``text``, ``length``, and ``start``, respectively).
+ When the composition is committed (or non-IME input is received),
+ a ``pygame.TEXTINPUT`` event is generated.
+
+ Text input events handling is on by default.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.key.start_text_input ##
+
+.. function:: stop_text_input
+
+ | :sl:`stop handling Unicode text input events`
+ | :sg:`stop_text_input() -> None`
+
+ Stop receiving ``pygame.TEXTEDITING`` and ``pygame.TEXTINPUT``
+ events. If an on-screen keyboard or IME editor was shown with
+ ``pygame.key.start_text_input()``, hide it again.
+
+ Text input events handling is on by default.
+
+ To avoid triggering the IME editor or the on-screen keyboard
+ when the user is holding down a key during gameplay, text input
+ should be disabled once text entry is finished, or when the user
+ clicks outside of a text box.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.key.stop_text_input ##
+
+.. function:: set_text_input_rect
+
+ | :sl:`controls the position of the candidate list`
+ | :sg:`set_text_input_rect(Rect) -> None`
+
+ This sets the rectangle used for typing with an IME.
+ It controls where the candidate list will open, if supported.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.key.set_text_input_rect ##
+
+.. ## pygame.key ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/locals.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/locals.rst.txt
new file mode 100644
index 00000000..091dbaab
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/locals.rst.txt
@@ -0,0 +1,27 @@
+.. include:: common.txt
+
+:mod:`pygame.locals`
+====================
+
+.. module:: pygame.locals
+ :synopsis: pygame constants
+
+| :sl:`pygame constants`
+
+This module contains various constants used by pygame. Its contents are
+automatically placed in the pygame module namespace. However, an application
+can use ``pygame.locals`` to include only the pygame constants with a ``from
+pygame.locals import *``.
+
+Detailed descriptions of the various constants can be found throughout the
+pygame documentation. Here are the locations of some of them.
+
+ - The :mod:`pygame.display` module contains flags like ``FULLSCREEN`` used
+ by :func:`pygame.display.set_mode`.
+ - The :mod:`pygame.event` module contains the various event types.
+ - The :mod:`pygame.key` module lists the keyboard constants and modifiers
+ (``K_``\* and ``MOD_``\*) relating to the ``key`` and ``mod`` attributes of
+ the ``KEYDOWN`` and ``KEYUP`` events.
+ - The :mod:`pygame.time` module defines ``TIMER_RESOLUTION``.
+
+.. ## pygame.locals ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mask.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mask.rst.txt
new file mode 100644
index 00000000..f4365cfd
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mask.rst.txt
@@ -0,0 +1,642 @@
+.. include:: common.txt
+
+:mod:`pygame.mask`
+==================
+
+.. module:: pygame.mask
+ :synopsis: pygame module for image masks.
+
+| :sl:`pygame module for image masks.`
+
+Useful for fast pixel perfect collision detection. A mask uses 1 bit per-pixel
+to store which parts collide.
+
+.. versionadded:: 1.8
+
+.. versionchanged:: 2.0.2 Mask functions now support keyword arguments.
+
+.. versionchanged:: 2.0.2 Mask functions that take positions or offsets now
+ support :class:`pygame.math.Vector2` arguments.
+
+
+.. function:: from_surface
+
+ | :sl:`Creates a Mask from the given surface`
+ | :sg:`from_surface(surface) -> Mask`
+ | :sg:`from_surface(surface, threshold=127) -> Mask`
+
+ Creates a :class:`Mask` object from the given surface by setting all the
+ opaque pixels and not setting the transparent pixels.
+
+ If the surface uses a color-key, then it is used to decide which bits in
+ the resulting mask are set. All the pixels that are **not** equal to the
+ color-key are **set** and the pixels equal to the color-key are not set.
+
+ If a color-key is not used, then the alpha value of each pixel is used to
+ decide which bits in the resulting mask are set. All the pixels that have an
+ alpha value **greater than** the ``threshold`` parameter are **set** and the
+ pixels with an alpha value less than or equal to the ``threshold`` are
+ not set.
+
+ :param Surface surface: the surface to create the mask from
+ :param int threshold: (optional) the alpha threshold (default is 127) to
+ compare with each surface pixel's alpha value, if the ``surface`` is
+ color-keyed this parameter is ignored
+
+ :returns: a newly created :class:`Mask` object from the given surface
+ :rtype: Mask
+
+ .. note::
+ This function is used to create the masks for
+ :func:`pygame.sprite.collide_mask`.
+
+ .. ## pygame.mask.from_surface ##
+
+.. function:: from_threshold
+
+ | :sl:`Creates a mask by thresholding Surfaces`
+ | :sg:`from_threshold(surface, color) -> Mask`
+ | :sg:`from_threshold(surface, color, threshold=(0, 0, 0, 255), othersurface=None, palette_colors=1) -> Mask`
+
+ This is a more featureful method of getting a :class:`Mask` from a surface.
+
+ If the optional ``othersurface`` is not used, all the pixels **within** the
+ ``threshold`` of the ``color`` parameter are **set** in the resulting mask.
+
+ If the optional ``othersurface`` is used, every pixel in the first surface
+ that is **within** the ``threshold`` of the corresponding pixel in
+ ``othersurface`` is **set** in the resulting mask.
+
+ :param Surface surface: the surface to create the mask from
+ :param color: color used to check if the surface's pixels are within the
+ given ``threshold`` range, this parameter is ignored if the optional
+ ``othersurface`` parameter is supplied
+ :type color: Color or int or tuple(int, int, int, [int]) or list[int, int, int, [int]]
+ :param threshold: (optional) the threshold range used to check the difference
+ between two colors (default is ``(0, 0, 0, 255)``)
+ :type threshold: Color or int or tuple(int, int, int, [int]) or list[int, int, int, [int]]
+ :param Surface othersurface: (optional) used to check whether the pixels of
+ the first surface are within the given ``threshold`` range of the pixels
+ from this surface (default is ``None``)
+ :param int palette_colors: (optional) indicates whether to use the palette
+ colors or not, a nonzero value causes the palette colors to be used and a
+ 0 causes them not to be used (default is 1)
+
+ :returns: a newly created :class:`Mask` object from the given surface
+ :rtype: Mask
+
+ .. ## pygame.mask.from_threshold ##
+
+.. class:: Mask
+
+ | :sl:`pygame object for representing 2D bitmasks`
+ | :sg:`Mask(size=(width, height)) -> Mask`
+ | :sg:`Mask(size=(width, height), fill=False) -> Mask`
+
+ A ``Mask`` object is used to represent a 2D bitmask. Each bit in
+ the mask represents a pixel. 1 is used to indicate a set bit and 0 is used
+ to indicate an unset bit. Set bits in a mask can be used to detect collisions
+ with other masks and their set bits.
+
+ A filled mask has all of its bits set to 1, conversely an
+ unfilled/cleared/empty mask has all of its bits set to 0. Masks can be
+ created unfilled (default) or filled by using the ``fill`` parameter. Masks
+ can also be cleared or filled using the :func:`pygame.mask.Mask.clear()` and
+ :func:`pygame.mask.Mask.fill()` methods respectively.
+
+ A mask's coordinates start in the top left corner at ``(0, 0)`` just like
+ :mod:`pygame.Surface`. Individual bits can be accessed using the
+ :func:`pygame.mask.Mask.get_at()` and :func:`pygame.mask.Mask.set_at()`
+ methods.
+
+ .. _mask-offset-label:
+
+ The methods :meth:`overlap`, :meth:`overlap_area`, :meth:`overlap_mask`,
+ :meth:`draw`, :meth:`erase`, and :meth:`convolve` use an offset parameter
+ to indicate the offset of another mask's top left corner from the calling
+ mask's top left corner. The calling mask's top left corner is considered to
+ be the origin ``(0, 0)``. Offsets are a sequence of two values
+ ``(x_offset, y_offset)``. Positive and negative offset values are supported.
+
+ ::
+
+ 0 to x (x_offset)
+ : :
+ 0 ..... +----:---------+
+ to | : |
+ y .......... +-----------+
+ (y_offset) | | othermask |
+ | +-----------+
+ | calling_mask |
+ +--------------+
+
+ :param size: the dimensions of the mask (width and height)
+ :param bool fill: (optional) create an unfilled mask (default: ``False``) or
+ filled mask (``True``)
+
+ :returns: a newly created :class:`Mask` object
+ :rtype: Mask
+
+ .. versionchanged:: 2.0.0
+ Shallow copy support added. The :class:`Mask` class supports the special
+ method ``__copy__()`` and shallow copying via ``copy.copy(mask)``.
+ .. versionchanged:: 2.0.0 Subclassing support added. The :class:`Mask` class
+ can be used as a base class.
+ .. versionchanged:: 1.9.5 Added support for keyword arguments.
+ .. versionchanged:: 1.9.5 Added the optional keyword parameter ``fill``.
+ .. versionchanged:: 1.9.5 Added support for masks with a width and/or a
+ height of 0.
+
+ .. method:: copy
+
+ | :sl:`Returns a new copy of the mask`
+ | :sg:`copy() -> Mask`
+
+ :returns: a new copy of this mask, the new mask will have the same width,
+ height, and set/unset bits as the original
+ :rtype: Mask
+
+ .. note::
+ If a mask subclass needs to copy any instance specific attributes
+ then it should override the ``__copy__()`` method. The overridden
+ ``__copy__()`` method needs to call ``super().__copy__()`` and then
+ copy the required data as in the following example code.
+
+ ::
+
+ class SubMask(pygame.mask.Mask):
+ def __copy__(self):
+ new_mask = super().__copy__()
+ # Do any SubMask attribute copying here.
+ return new_mask
+
+ .. versionadded:: 2.0.0
+
+ .. ## Mask.copy ##
+
+ .. method:: get_size
+
+ | :sl:`Returns the size of the mask`
+ | :sg:`get_size() -> (width, height)`
+
+ :returns: the size of the mask, (width, height)
+ :rtype: tuple(int, int)
+
+ .. ## Mask.get_size ##
+
+ .. method:: get_rect
+
+ | :sl:`Returns a Rect based on the size of the mask`
+ | :sg:`get_rect(\**kwargs) -> Rect`
+
+ Returns a new :func:`pygame.Rect` object based on the size of this mask.
+ The rect's default position will be ``(0, 0)`` and its default width and
+ height will be the same as this mask's. The rect's attributes can be
+ altered via :func:`pygame.Rect` attribute keyword arguments/values passed
+ into this method. As an example, ``a_mask.get_rect(center=(10, 5))`` would
+ create a :func:`pygame.Rect` based on the mask's size centered at the
+ given position.
+
+ :param dict kwargs: :func:`pygame.Rect` attribute keyword arguments/values
+ that will be applied to the rect
+
+ :returns: a new :func:`pygame.Rect` object based on the size of this mask
+ with any :func:`pygame.Rect` attribute keyword arguments/values applied
+ to it
+ :rtype: Rect
+
+ .. versionadded:: 2.0.0
+
+ .. ## Mask.get_rect ##
+
+ .. method:: get_at
+
+ | :sl:`Gets the bit at the given position`
+ | :sg:`get_at(pos) -> int`
+
+ :param pos: the position of the bit to get (x, y)
+
+ :returns: 1 if the bit is set, 0 if the bit is not set
+ :rtype: int
+
+ :raises IndexError: if the position is outside of the mask's bounds
+
+ .. ## Mask.get_at ##
+
+ .. method:: set_at
+
+ | :sl:`Sets the bit at the given position`
+ | :sg:`set_at(pos) -> None`
+ | :sg:`set_at(pos, value=1) -> None`
+
+ :param pos: the position of the bit to set (x, y)
+ :param int value: any nonzero int will set the bit to 1, 0 will set the
+ bit to 0 (default is 1)
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ :raises IndexError: if the position is outside of the mask's bounds
+
+ .. ## Mask.set_at ##
+
+ .. method:: overlap
+
+ | :sl:`Returns the point of intersection`
+ | :sg:`overlap(other, offset) -> (x, y)`
+ | :sg:`overlap(other, offset) -> None`
+
+ Returns the first point of intersection encountered between this mask and
+ ``other``. A point of intersection is 2 overlapping set bits.
+
+ The current algorithm searches the overlapping area in
+ ``sizeof(unsigned long int) * CHAR_BIT`` bit wide column blocks (the value
+ of ``sizeof(unsigned long int) * CHAR_BIT`` is platform dependent, for
+ clarity it will be referred to as ``W``). Starting at the top left corner
+ it checks bits 0 to ``W - 1`` of the first row (``(0, 0)`` to
+ ``(W - 1, 0)``) then continues to the next row (``(0, 1)`` to
+ ``(W - 1, 1)``). Once this entire column block is checked, it continues to
+ the next one (``W`` to ``2 * W - 1``). This is repeated until it finds a
+ point of intersection or the entire overlapping area is checked.
+
+ :param Mask other: the other mask to overlap with this mask
+ :param offset: the offset of ``other`` from this mask, for more
+ details refer to the :ref:`Mask offset notes `
+
+ :returns: point of intersection or ``None`` if no intersection
+ :rtype: tuple(int, int) or NoneType
+
+ .. ## Mask.overlap ##
+
+ .. method:: overlap_area
+
+ | :sl:`Returns the number of overlapping set bits`
+ | :sg:`overlap_area(other, offset) -> numbits`
+
+ Returns the number of overlapping set bits between between this mask and
+ ``other``.
+
+ This can be useful for collision detection. An approximate collision
+ normal can be found by calculating the gradient of the overlapping area
+ through the finite difference.
+
+ ::
+
+ dx = mask.overlap_area(other, (x + 1, y)) - mask.overlap_area(other, (x - 1, y))
+ dy = mask.overlap_area(other, (x, y + 1)) - mask.overlap_area(other, (x, y - 1))
+
+ :param Mask other: the other mask to overlap with this mask
+ :param offset: the offset of ``other`` from this mask, for more
+ details refer to the :ref:`Mask offset notes `
+
+ :returns: the number of overlapping set bits
+ :rtype: int
+
+ .. ## Mask.overlap_area ##
+
+ .. method:: overlap_mask
+
+ | :sl:`Returns a mask of the overlapping set bits`
+ | :sg:`overlap_mask(other, offset) -> Mask`
+
+ Returns a :class:`Mask`, the same size as this mask, containing the
+ overlapping set bits between this mask and ``other``.
+
+ :param Mask other: the other mask to overlap with this mask
+ :param offset: the offset of ``other`` from this mask, for more
+ details refer to the :ref:`Mask offset notes `
+
+ :returns: a newly created :class:`Mask` with the overlapping bits set
+ :rtype: Mask
+
+ .. ## Mask.overlap_mask ##
+
+ .. method:: fill
+
+ | :sl:`Sets all bits to 1`
+ | :sg:`fill() -> None`
+
+ Sets all bits in the mask to 1.
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## Mask.fill ##
+
+ .. method:: clear
+
+ | :sl:`Sets all bits to 0`
+ | :sg:`clear() -> None`
+
+ Sets all bits in the mask to 0.
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## Mask.clear ##
+
+ .. method:: invert
+
+ | :sl:`Flips all the bits`
+ | :sg:`invert() -> None`
+
+ Flips all of the bits in the mask. All the set bits are cleared to 0 and
+ all the unset bits are set to 1.
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## Mask.invert ##
+
+ .. method:: scale
+
+ | :sl:`Resizes a mask`
+ | :sg:`scale((width, height)) -> Mask`
+
+ Creates a new :class:`Mask` of the requested size with its bits scaled
+ from this mask.
+
+ :param size: the width and height (size) of the mask to create
+
+ :returns: a new :class:`Mask` object with its bits scaled from this mask
+ :rtype: Mask
+
+ :raises ValueError: if ``width < 0`` or ``height < 0``
+
+ .. ## Mask.scale ##
+
+ .. method:: draw
+
+ | :sl:`Draws a mask onto another`
+ | :sg:`draw(other, offset) -> None`
+
+ Performs a bitwise OR, drawing ``othermask`` onto this mask.
+
+ :param Mask other: the mask to draw onto this mask
+ :param offset: the offset of ``other`` from this mask, for more
+ details refer to the :ref:`Mask offset notes `
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## Mask.draw ##
+
+ .. method:: erase
+
+ | :sl:`Erases a mask from another`
+ | :sg:`erase(other, offset) -> None`
+
+ Erases (clears) all bits set in ``other`` from this mask.
+
+ :param Mask other: the mask to erase from this mask
+ :param offset: the offset of ``other`` from this mask, for more
+ details refer to the :ref:`Mask offset notes `
+
+ :returns: ``None``
+ :rtype: NoneType
+
+ .. ## Mask.erase ##
+
+ .. method:: count
+
+ | :sl:`Returns the number of set bits`
+ | :sg:`count() -> bits`
+
+ :returns: the number of set bits in the mask
+ :rtype: int
+
+ .. ## Mask.count ##
+
+ .. method:: centroid
+
+ | :sl:`Returns the centroid of the set bits`
+ | :sg:`centroid() -> (x, y)`
+
+ Finds the centroid (the center mass of the set bits) for this mask.
+
+ :returns: a coordinate tuple indicating the centroid of the mask, it will
+ return ``(0, 0)`` if the mask has no bits set
+ :rtype: tuple(int, int)
+
+ .. ## Mask.centroid ##
+
+ .. method:: angle
+
+ | :sl:`Returns the orientation of the set bits`
+ | :sg:`angle() -> theta`
+
+ Finds the approximate orientation (from -90 to 90 degrees) of the set bits
+ in the mask. This works best if performed on a mask with only one
+ connected component.
+
+ :returns: the orientation of the set bits in the mask, it will return
+ ``0.0`` if the mask has no bits set
+ :rtype: float
+
+ .. note::
+ See :meth:`connected_component` for details on how a connected
+ component is calculated.
+
+ .. ## Mask.angle ##
+
+ .. method:: outline
+
+ | :sl:`Returns a list of points outlining an object`
+ | :sg:`outline() -> [(x, y), ...]`
+ | :sg:`outline(every=1) -> [(x, y), ...]`
+
+ Returns a list of points of the outline of the first connected component
+ encountered in the mask. To find a connected component, the mask is
+ searched per row (left to right) starting in the top left corner.
+
+ The ``every`` optional parameter skips set bits in the outline. For
+ example, setting it to 10 would return a list of every 10th set bit in the
+ outline.
+
+ :param int every: (optional) indicates the number of bits to skip over in
+ the outline (default is 1)
+
+ :returns: a list of points outlining the first connected component
+ encountered, an empty list is returned if the mask has no bits set
+ :rtype: list[tuple(int, int)]
+
+ .. note::
+ See :meth:`connected_component` for details on how a connected
+ component is calculated.
+
+ .. ## Mask.outline ##
+
+ .. method:: convolve
+
+ | :sl:`Returns the convolution of this mask with another mask`
+ | :sg:`convolve(other) -> Mask`
+ | :sg:`convolve(other, output=None, offset=(0, 0)) -> Mask`
+
+ Convolve this mask with the given ``other`` Mask.
+
+ :param Mask other: mask to convolve this mask with
+ :param output: (optional) mask for output (default is ``None``)
+ :type output: Mask or NoneType
+ :param offset: the offset of ``other`` from this mask, (default is
+ ``(0, 0)``)
+
+ :returns: a :class:`Mask` with the ``(i - offset[0], j - offset[1])`` bit
+ set, if shifting ``other`` (such that its bottom right corner is at
+ ``(i, j)``) causes it to overlap with this mask
+
+ If an ``output`` Mask is specified, the output is drawn onto it and
+ it is returned. Otherwise a mask of size ``(MAX(0, width + other mask's
+ width - 1), MAX(0, height + other mask's height - 1))`` is created and
+ returned.
+ :rtype: Mask
+
+ .. ## Mask.convolve ##
+
+ .. method:: connected_component
+
+ | :sl:`Returns a mask containing a connected component`
+ | :sg:`connected_component() -> Mask`
+ | :sg:`connected_component(pos) -> Mask`
+
+ A connected component is a group (1 or more) of connected set bits
+ (orthogonally and diagonally). The SAUF algorithm, which checks 8 point
+ connectivity, is used to find a connected component in the mask.
+
+ By default this method will return a :class:`Mask` containing the largest
+ connected component in the mask. Optionally, a bit coordinate can be
+ specified and the connected component containing it will be returned. If
+ the bit at the given location is not set, the returned :class:`Mask` will
+ be empty (no bits set).
+
+ :param pos: (optional) selects the connected component that contains the
+ bit at this position
+
+ :returns: a :class:`Mask` object (same size as this mask) with the largest
+ connected component from this mask, if this mask has no bits set then
+ an empty mask will be returned
+
+ If the ``pos`` parameter is provided then the mask returned will have
+ the connected component that contains this position. An empty mask will
+ be returned if the ``pos`` parameter selects an unset bit.
+ :rtype: Mask
+
+ :raises IndexError: if the optional ``pos`` parameter is outside of the
+ mask's bounds
+
+ .. ## Mask.connected_component ##
+
+ .. method:: connected_components
+
+ | :sl:`Returns a list of masks of connected components`
+ | :sg:`connected_components() -> [Mask, ...]`
+ | :sg:`connected_components(minimum=0) -> [Mask, ...]`
+
+ Provides a list containing a :class:`Mask` object for each connected
+ component.
+
+ :param int minimum: (optional) indicates the minimum number of bits (to
+ filter out noise) per connected component (default is 0, which equates
+ to no minimum and is equivalent to setting it to 1, as a connected
+ component must have at least 1 bit set)
+
+ :returns: a list containing a :class:`Mask` object for each connected
+ component, an empty list is returned if the mask has no bits set
+ :rtype: list[Mask]
+
+ .. note::
+ See :meth:`connected_component` for details on how a connected
+ component is calculated.
+
+ .. ## Mask.connected_components ##
+
+ .. method:: get_bounding_rects
+
+ | :sl:`Returns a list of bounding rects of connected components`
+ | :sg:`get_bounding_rects() -> [Rect, ...]`
+
+ Provides a list containing a bounding rect for each connected component.
+
+ :returns: a list containing a bounding rect for each connected component,
+ an empty list is returned if the mask has no bits set
+ :rtype: list[Rect]
+
+ .. note::
+ See :meth:`connected_component` for details on how a connected
+ component is calculated.
+
+ .. ## Mask.get_bounding_rects ##
+
+ .. method:: to_surface
+
+ | :sl:`Returns a surface with the mask drawn on it`
+ | :sg:`to_surface() -> Surface`
+ | :sg:`to_surface(surface=None, setsurface=None, unsetsurface=None, setcolor=(255, 255, 255, 255), unsetcolor=(0, 0, 0, 255), dest=(0, 0)) -> Surface`
+
+ Draws this mask on the given surface. Set bits (bits set to 1) and unset
+ bits (bits set to 0) can be drawn onto a surface.
+
+ :param surface: (optional) Surface to draw mask onto, if no surface is
+ provided one will be created (default is ``None``, which will cause a
+ surface with the parameters
+ ``Surface(size=mask.get_size(), flags=SRCALPHA, depth=32)`` to be
+ created, drawn on, and returned)
+ :type surface: Surface or None
+ :param setsurface: (optional) use this surface's color values to draw
+ set bits (default is ``None``), if this surface is smaller than the
+ mask any bits outside its bounds will use the ``setcolor`` value
+ :type setsurface: Surface or None
+ :param unsetsurface: (optional) use this surface's color values to draw
+ unset bits (default is ``None``), if this surface is smaller than the
+ mask any bits outside its bounds will use the ``unsetcolor`` value
+ :type unsetsurface: Surface or None
+ :param setcolor: (optional) color to draw set bits (default is
+ ``(255, 255, 255, 255)``, white), use ``None`` to skip drawing the set
+ bits, the ``setsurface`` parameter (if set) will takes precedence over
+ this parameter
+ :type setcolor: Color or str or int or tuple(int, int, int, [int]) or
+ list(int, int, int, [int]) or None
+ :param unsetcolor: (optional) color to draw unset bits (default is
+ ``(0, 0, 0, 255)``, black), use ``None`` to skip drawing the unset
+ bits, the ``unsetsurface`` parameter (if set) will takes precedence
+ over this parameter
+ :type unsetcolor: Color or str or int or tuple(int, int, int, [int]) or
+ list(int, int, int, [int]) or None
+ :param dest: (optional) surface destination of where to position the
+ topleft corner of the mask being drawn (default is ``(0, 0)``), if a
+ Rect is used as the ``dest`` parameter, its ``x`` and ``y`` attributes
+ will be used as the destination, **NOTE1:** rects with a negative width
+ or height value will not be normalized before using their ``x`` and
+ ``y`` values, **NOTE2:** this destination value is only used to
+ position the mask on the surface, it does not offset the ``setsurface``
+ and ``unsetsurface`` from the mask, they are always aligned with the
+ mask (i.e. position ``(0, 0)`` on the mask always corresponds to
+ position ``(0, 0)`` on the ``setsurface`` and ``unsetsurface``)
+ :type dest: Rect or tuple(int, int) or list(int, int) or Vector2(int, int)
+
+ :returns: the ``surface`` parameter (or a newly created surface if no
+ ``surface`` parameter was provided) with this mask drawn on it
+ :rtype: Surface
+
+ :raises ValueError: if the ``setsurface`` parameter or ``unsetsurface``
+ parameter does not have the same format (bytesize/bitsize/alpha) as
+ the ``surface`` parameter
+
+ .. note ::
+ To skip drawing the set bits, both ``setsurface`` and ``setcolor`` must
+ be ``None``. The ``setsurface`` parameter defaults to ``None``, but
+ ``setcolor`` defaults to a color value and therefore must be set to
+ ``None``.
+
+ .. note ::
+ To skip drawing the unset bits, both ``unsetsurface`` and
+ ``unsetcolor`` must be ``None``. The ``unsetsurface`` parameter
+ defaults to ``None``, but ``unsetcolor`` defaults to a color value and
+ therefore must be set to ``None``.
+
+ .. versionadded:: 2.0.0
+
+ .. ## Mask.to_surface ##
+
+ .. ## pygame.mask.Mask ##
+
+.. ## pygame.mask ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/math.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/math.rst.txt
new file mode 100644
index 00000000..0f037d9f
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/math.rst.txt
@@ -0,0 +1,1143 @@
+.. include:: common.txt
+
+:mod:`pygame.math`
+==================
+
+.. module:: pygame.math
+ :synopsis: pygame module for vector classes
+
+| :sl:`pygame module for vector classes`
+
+The pygame math module currently provides Vector classes in two and three
+dimensions, ``Vector2`` and ``Vector3`` respectively.
+
+They support the following numerical operations: ``vec + vec``, ``vec - vec``,
+``vec * number``, ``number * vec``, ``vec / number``, ``vec // number``, ``vec += vec``,
+``vec -= vec``, ``vec *= number``, ``vec /= number``, ``vec //= number``, ``round(vec, ndigits=0)``.
+
+All these operations will be performed elementwise.
+In addition ``vec * vec`` will perform a scalar-product (a.k.a. dot-product).
+If you want to multiply every element from vector v with every element from
+vector w you can use the elementwise method: ``v.elementwise() * w``
+
+The coordinates of a vector can be retrieved or set using attributes or
+subscripts
+
+::
+
+ v = pygame.Vector3()
+
+ v.x = 5
+ v[1] = 2 * v.x
+ print(v[1]) # 10
+
+ v.x == v[0]
+ v.y == v[1]
+ v.z == v[2]
+
+Multiple coordinates can be set using slices or swizzling
+
+::
+
+ v = pygame.Vector2()
+ v.xy = 1, 2
+ v[:] = 1, 2
+
+.. versionadded:: 1.9.2pre
+.. versionchanged:: 1.9.4 Removed experimental notice.
+.. versionchanged:: 1.9.4 Allow scalar construction like GLSL Vector2(2) == Vector2(2.0, 2.0)
+.. versionchanged:: 1.9.4 :mod:`pygame.math` import not required. More convenient ``pygame.Vector2`` and ``pygame.Vector3``.
+.. versionchanged:: 2.2.0 `round` returns a new vector with components rounded to the specified digits.
+
+.. function:: clamp
+
+ | :sl:`returns value clamped to min and max.`
+ | :sg:`clamp(value, min, max) -> float`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave clamp feedback with authors `_
+
+ Clamps a numeric ``value`` so that it's no lower than ``min``, and no higher
+ than ``max``.
+
+ .. versionadded:: 2.1.3
+
+ .. ## math.clamp ##
+
+.. function:: lerp
+
+ | :sl:`interpolates between two values by a weight.`
+ | :sg:`lerp(a, b, weight) -> float`
+
+ Linearly interpolates between ``a`` and ``b`` by ``weight`` using the formula ``a + (b-a) * weight``.
+
+ If ``weight`` is ``0.5``, ``lerp`` will return the value half-way between ``a``
+ and ``b``. When ``a = 10`` and ``b = 20``, ``lerp(a, b, 0.5)`` will return ``15``. You
+ can think of weight as the percentage of interpolation from ``a`` to ``b``, ``0.0``
+ being 0% and ``1.0`` being 100%.
+
+ ``lerp`` can be used for many things. You could rotate a sprite by a weight with
+ ``angle = lerp(0, 360, weight)``. You could even scale an enemy's attack value
+ based on the level you're playing:
+
+ ::
+
+ FINAL_LEVEL = 10
+ current_level = 2
+
+ attack = lerp(10, 50, current_level/MAX_LEVEL) # 18
+
+ If you're on level 0, ``attack`` will be ``10``, if you're on level 10,
+ ``attack`` will be ``50``. If you're on level 5, the
+ result of ``current_level/MAX_LEVEL`` will be ``0.5``
+ which represents 50%, therefore ``attack`` will be ``30``, which is the midpoint of ``10`` and ``50``.
+
+ Raises a ValueError if ``weight`` is outside the range of ``[0, 1]``.
+
+ .. versionadded:: 2.1.3
+
+ .. ## math.lerp ##
+
+.. class:: Vector2
+
+ | :sl:`a 2-Dimensional Vector`
+ | :sg:`Vector2() -> Vector2(0, 0)`
+ | :sg:`Vector2(int) -> Vector2`
+ | :sg:`Vector2(float) -> Vector2`
+ | :sg:`Vector2(Vector2) -> Vector2`
+ | :sg:`Vector2(x, y) -> Vector2`
+ | :sg:`Vector2((x, y)) -> Vector2`
+
+ Some general information about the ``Vector2`` class.
+
+ .. versionchanged:: 2.1.3
+ Inherited methods of vector subclasses now correctly return an instance of the
+ subclass instead of the superclass
+
+ .. method:: dot
+
+ | :sl:`calculates the dot- or scalar-product with the other vector`
+ | :sg:`dot(Vector2) -> float`
+
+ .. ## Vector2.dot ##
+
+ .. method:: cross
+
+ | :sl:`calculates the cross- or vector-product`
+ | :sg:`cross(Vector2) -> float`
+
+ calculates the third component of the cross-product.
+
+ .. ## Vector2.cross ##
+
+ .. method:: magnitude
+
+ | :sl:`returns the Euclidean magnitude of the vector.`
+ | :sg:`magnitude() -> float`
+
+ calculates the magnitude of the vector which follows from the
+ theorem: ``vec.magnitude() == math.sqrt(vec.x**2 + vec.y**2)``
+
+ .. ## Vector2.magnitude ##
+
+ .. method:: magnitude_squared
+
+ | :sl:`returns the squared magnitude of the vector.`
+ | :sg:`magnitude_squared() -> float`
+
+ calculates the magnitude of the vector which follows from the
+ theorem: ``vec.magnitude_squared() == vec.x**2 + vec.y**2``. This
+ is faster than ``vec.magnitude()`` because it avoids the square root.
+
+ .. ## Vector2.magnitude_squared ##
+
+ .. method:: length
+
+ | :sl:`returns the Euclidean length of the vector.`
+ | :sg:`length() -> float`
+
+ calculates the Euclidean length of the vector which follows from the
+ Pythagorean theorem: ``vec.length() == math.sqrt(vec.x**2 + vec.y**2)``
+
+ .. ## Vector2.length ##
+
+ .. method:: length_squared
+
+ | :sl:`returns the squared Euclidean length of the vector.`
+ | :sg:`length_squared() -> float`
+
+ calculates the Euclidean length of the vector which follows from the
+ Pythagorean theorem: ``vec.length_squared() == vec.x**2 + vec.y**2``.
+ This is faster than ``vec.length()`` because it avoids the square root.
+
+ .. ## Vector2.length_squared ##
+
+ .. method:: normalize
+
+ | :sl:`returns a vector with the same direction but length 1.`
+ | :sg:`normalize() -> Vector2`
+
+ Returns a new vector that has ``length`` equal to ``1`` and the same
+ direction as self.
+
+ .. ## Vector2.normalize ##
+
+ .. method:: normalize_ip
+
+ | :sl:`normalizes the vector in place so that its length is 1.`
+ | :sg:`normalize_ip() -> None`
+
+ Normalizes the vector so that it has ``length`` equal to ``1``.
+ The direction of the vector is not changed.
+
+ .. ## Vector2.normalize_ip ##
+
+ .. method:: is_normalized
+
+ | :sl:`tests if the vector is normalized i.e. has length == 1.`
+ | :sg:`is_normalized() -> Bool`
+
+ Returns True if the vector has ``length`` equal to ``1``. Otherwise
+ it returns ``False``.
+
+ .. ## Vector2.is_normalized ##
+
+ .. method:: scale_to_length
+
+ | :sl:`scales the vector to a given length.`
+ | :sg:`scale_to_length(float) -> None`
+
+ Scales the vector so that it has the given length. The direction of the
+ vector is not changed. You can also scale to length ``0``. If the vector
+ is the zero vector (i.e. has length ``0`` thus no direction) a
+ ``ValueError`` is raised.
+
+ .. ## Vector2.scale_to_length ##
+
+ .. method:: reflect
+
+ | :sl:`returns a vector reflected of a given normal.`
+ | :sg:`reflect(Vector2) -> Vector2`
+
+ Returns a new vector that points in the direction as if self would bounce
+ of a surface characterized by the given surface normal. The length of the
+ new vector is the same as self's.
+
+ .. ## Vector2.reflect ##
+
+ .. method:: reflect_ip
+
+ | :sl:`reflect the vector of a given normal in place.`
+ | :sg:`reflect_ip(Vector2) -> None`
+
+ Changes the direction of self as if it would have been reflected of a
+ surface with the given surface normal.
+
+ .. ## Vector2.reflect_ip ##
+
+ .. method:: distance_to
+
+ | :sl:`calculates the Euclidean distance to a given vector.`
+ | :sg:`distance_to(Vector2) -> float`
+
+ .. ## Vector2.distance_to ##
+
+ .. method:: distance_squared_to
+
+ | :sl:`calculates the squared Euclidean distance to a given vector.`
+ | :sg:`distance_squared_to(Vector2) -> float`
+
+ .. ## Vector2.distance_squared_to ##
+
+ .. method:: move_towards
+
+ | :sl:`returns a vector moved toward the target by a given distance.`
+ | :sg:`move_towards(Vector2, float) -> Vector2`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave move_towards feedback with authors `_
+
+ Returns a Vector which is moved towards the given Vector by a given
+ distance and does not overshoot past its target Vector.
+ The first parameter determines the target Vector, while the second
+ parameter determines the delta distance. If the distance is in the
+ negatives, then it will move away from the target Vector.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Vector2.move_towards ##
+
+ .. method:: move_towards_ip
+
+ | :sl:`moves the vector toward its target at a given distance.`
+ | :sg:`move_towards_ip(Vector2, float) -> None`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave move_towards_ip feedback with authors `_
+
+ Moves itself toward the given Vector at a given distance and does not
+ overshoot past its target Vector.
+ The first parameter determines the target Vector, while the second
+ parameter determines the delta distance. If the distance is in the
+ negatives, then it will move away from the target Vector.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Vector2.move_towards_ip ##
+
+ .. method:: lerp
+
+ | :sl:`returns a linear interpolation to the given vector.`
+ | :sg:`lerp(Vector2, float) -> Vector2`
+
+ Returns a Vector which is a linear interpolation between self and the
+ given Vector. The second parameter determines how far between self and
+ other the result is going to be. It must be a value between ``0`` and ``1``
+ where ``0`` means self and ``1`` means other will be returned.
+
+ .. ## Vector2.lerp ##
+
+ .. method:: slerp
+
+ | :sl:`returns a spherical interpolation to the given vector.`
+ | :sg:`slerp(Vector2, float) -> Vector2`
+
+ Calculates the spherical interpolation from self to the given Vector. The
+ second argument - often called t - must be in the range ``[-1, 1]``. It
+ parametrizes where - in between the two vectors - the result should be.
+ If a negative value is given the interpolation will not take the
+ complement of the shortest path.
+
+ .. ## Vector2.slerp ##
+
+ .. method:: elementwise
+
+ | :sl:`The next operation will be performed elementwise.`
+ | :sg:`elementwise() -> VectorElementwiseProxy`
+
+ Applies the following operation to each element of the vector.
+
+ .. ## Vector2.elementwise ##
+
+ .. method:: rotate
+
+ | :sl:`rotates a vector by a given angle in degrees.`
+ | :sg:`rotate(angle) -> Vector2`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise by the given angle in degrees.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector2.rotate ##
+
+ .. method:: rotate_rad
+
+ | :sl:`rotates a vector by a given angle in radians.`
+ | :sg:`rotate_rad(angle) -> Vector2`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise by the given angle in radians.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.0.0
+
+ .. ## Vector2.rotate_rad ##
+
+ .. method:: rotate_ip
+
+ | :sl:`rotates the vector by a given angle in degrees in place.`
+ | :sg:`rotate_ip(angle) -> None`
+
+ Rotates the vector counterclockwise by the given angle in degrees. The
+ length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector2.rotate_ip ##
+
+ .. method:: rotate_ip_rad
+
+ | :sl:`rotates the vector by a given angle in radians in place.`
+ | :sg:`rotate_ip_rad(angle) -> None`
+
+ DEPRECATED: Use rotate_rad_ip() instead.
+
+ .. versionadded:: 2.0.0
+ .. deprecated:: 2.1.1
+
+ .. ## Vector2.rotate_rad_ip ##
+
+ .. method:: rotate_rad_ip
+
+ | :sl:`rotates the vector by a given angle in radians in place.`
+ | :sg:`rotate_rad_ip(angle) -> None`
+
+ Rotates the vector counterclockwise by the given angle in radians. The
+ length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.1.1
+
+ .. ## Vector2.rotate_rad_ip ##
+
+ .. method:: angle_to
+
+ | :sl:`calculates the angle to a given vector in degrees.`
+ | :sg:`angle_to(Vector2) -> float`
+
+ Returns the angle from self to the passed ``Vector2`` that would rotate self
+ to be aligned with the passed ``Vector2`` without crossing over the negative
+ x-axis.
+
+ .. figure:: code_examples/angle_to.png
+ :alt: angle_to image
+
+ Example demonstrating the angle returned
+
+ .. ## Vector2.angle_to ##
+
+ .. method:: as_polar
+
+ | :sl:`returns a tuple with radial distance and azimuthal angle.`
+ | :sg:`as_polar() -> (r, phi)`
+
+ Returns a tuple ``(r, phi)`` where r is the radial distance, and phi
+ is the azimuthal angle.
+
+ .. ## Vector2.as_polar ##
+
+ .. method:: from_polar
+
+ | :sl:`Creates a Vector2(x, y) or sets x and y from a polar coordinates tuple.`
+ | :sg:`Vector2.from_polar((r, phi)) -> Vector2`
+ | :sg:`Vector2().from_polar((r, phi)) -> None`
+
+ If used from the class creates a Vector2(x,y), else sets x and y.
+ The values of x and y are defined from a tuple ``(r, phi)`` where r
+ is the radial distance, and phi is the azimuthal angle.
+
+ .. ## Vector2.from_polar ##
+
+ .. method:: project
+
+ | :sl:`projects a vector onto another.`
+ | :sg:`project(Vector2) -> Vector2`
+
+ Returns the projected vector. This is useful for collision detection in finding the components in a certain direction (e.g. in direction of the wall).
+ For a more detailed explanation see `Wikipedia `_.
+
+ .. versionadded:: 2.0.2
+
+ .. ## Vector2.project ##
+
+
+ .. method:: copy
+
+ | :sl:`Returns a copy of itself.`
+ | :sg:`copy() -> Vector2`
+
+ Returns a new Vector2 having the same dimensions.
+
+ .. versionadded:: 2.1.1
+
+ .. ## Vector2.copy ##
+
+
+ .. method:: clamp_magnitude
+
+ | :sl:`Returns a copy of a vector with the magnitude clamped between max_length and min_length.`
+ | :sg:`clamp_magnitude(max_length) -> Vector2`
+ | :sg:`clamp_magnitude(min_length, max_length) -> Vector2`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave clamp_magnitude feedback with authors `_
+
+ Returns a new copy of a vector with the magnitude clamped between
+ ``max_length`` and ``min_length``. If only one argument is passed, it is
+ taken to be the ``max_length``
+
+ This function raises ``ValueError`` if ``min_length`` is greater than
+ ``max_length``, or if either of these values are negative.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Vector2.clamp_magnitude ##
+
+
+ .. method:: clamp_magnitude_ip
+
+ | :sl:`Clamps the vector's magnitude between max_length and min_length`
+ | :sg:`clamp_magnitude_ip(max_length) -> None`
+ | :sg:`clamp_magnitude_ip(min_length, max_length) -> None`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave clamp_magnitude_ip feedback with authors `_
+
+ Clamps the vector's magnitude between ``max_length`` and ``min_length``.
+ If only one argument is passed, it is taken to be the ``max_length``
+
+ This function raises ``ValueError`` if ``min_length`` is greater than
+ ``max_length``, or if either of these values are negative.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Vector2.clamp_magnitude_ip ##
+
+
+ .. method:: update
+
+ | :sl:`Sets the coordinates of the vector.`
+ | :sg:`update() -> None`
+ | :sg:`update(int) -> None`
+ | :sg:`update(float) -> None`
+ | :sg:`update(Vector2) -> None`
+ | :sg:`update(x, y) -> None`
+ | :sg:`update((x, y)) -> None`
+
+ Sets coordinates x and y in place.
+
+ .. versionadded:: 1.9.5
+
+ .. ## Vector2.update ##
+
+
+ .. attribute:: epsilon
+
+ | :sl:`Determines the tolerance of vector calculations.`
+
+ Both Vector classes have a value named ``epsilon`` that defaults to ``1e-6``.
+ This value acts as a numerical margin in various methods to account for floating point
+ arithmetic errors. Specifically, ``epsilon`` is used in the following places:
+
+ * comparing Vectors (``==`` and ``!=``)
+ * the ``is_normalized`` method (if the square of the length is within ``epsilon`` of 1, it's normalized)
+ * slerping (a Vector with a length of ``> True
+ print(v == u) # >> False
+
+ You'll probably never have to change ``epsilon`` from the default value, but in rare situations you might
+ find that either the margin is too large or too small, in which case changing ``epsilon`` slightly
+ might help you out.
+
+
+ .. ## pygame.math.Vector2 ##
+
+.. class:: Vector3
+
+ | :sl:`a 3-Dimensional Vector`
+ | :sg:`Vector3() -> Vector3(0, 0, 0)`
+ | :sg:`Vector3(int) -> Vector3`
+ | :sg:`Vector3(float) -> Vector3`
+ | :sg:`Vector3(Vector3) -> Vector3`
+ | :sg:`Vector3(x, y, z) -> Vector3`
+ | :sg:`Vector3((x, y, z)) -> Vector3`
+
+ Some general information about the Vector3 class.
+
+ .. versionchanged:: 2.1.3
+ Inherited methods of vector subclasses now correctly return an instance of the
+ subclass instead of the superclass
+
+ .. method:: dot
+
+ | :sl:`calculates the dot- or scalar-product with the other vector`
+ | :sg:`dot(Vector3) -> float`
+
+ .. ## Vector3.dot ##
+
+ .. method:: cross
+
+ | :sl:`calculates the cross- or vector-product`
+ | :sg:`cross(Vector3) -> Vector3`
+
+ calculates the cross-product.
+
+ .. ## Vector3.cross ##
+
+ .. method:: magnitude
+
+ | :sl:`returns the Euclidean magnitude of the vector.`
+ | :sg:`magnitude() -> float`
+
+ calculates the magnitude of the vector which follows from the
+ theorem: ``vec.magnitude() == math.sqrt(vec.x**2 + vec.y**2 + vec.z**2)``
+
+ .. ## Vector3.magnitude ##
+
+ .. method:: magnitude_squared
+
+ | :sl:`returns the squared Euclidean magnitude of the vector.`
+ | :sg:`magnitude_squared() -> float`
+
+ calculates the magnitude of the vector which follows from the
+ theorem:
+ ``vec.magnitude_squared() == vec.x**2 + vec.y**2 + vec.z**2``.
+ This is faster than ``vec.magnitude()`` because it avoids the
+ square root.
+
+ .. ## Vector3.magnitude_squared ##
+
+ .. method:: length
+
+ | :sl:`returns the Euclidean length of the vector.`
+ | :sg:`length() -> float`
+
+ calculates the Euclidean length of the vector which follows from the
+ Pythagorean theorem:
+ ``vec.length() == math.sqrt(vec.x**2 + vec.y**2 + vec.z**2)``
+
+ .. ## Vector3.length ##
+
+ .. method:: length_squared
+
+ | :sl:`returns the squared Euclidean length of the vector.`
+ | :sg:`length_squared() -> float`
+
+ calculates the Euclidean length of the vector which follows from the
+ Pythagorean theorem:
+ ``vec.length_squared() == vec.x**2 + vec.y**2 + vec.z**2``.
+ This is faster than ``vec.length()`` because it avoids the square root.
+
+ .. ## Vector3.length_squared ##
+
+ .. method:: normalize
+
+ | :sl:`returns a vector with the same direction but length 1.`
+ | :sg:`normalize() -> Vector3`
+
+ Returns a new vector that has ``length`` equal to ``1`` and the same
+ direction as self.
+
+ .. ## Vector3.normalize ##
+
+ .. method:: normalize_ip
+
+ | :sl:`normalizes the vector in place so that its length is 1.`
+ | :sg:`normalize_ip() -> None`
+
+ Normalizes the vector so that it has ``length`` equal to ``1``. The
+ direction of the vector is not changed.
+
+ .. ## Vector3.normalize_ip ##
+
+ .. method:: is_normalized
+
+ | :sl:`tests if the vector is normalized i.e. has length == 1.`
+ | :sg:`is_normalized() -> Bool`
+
+ Returns True if the vector has ``length`` equal to ``1``. Otherwise it
+ returns ``False``.
+
+ .. ## Vector3.is_normalized ##
+
+ .. method:: scale_to_length
+
+ | :sl:`scales the vector to a given length.`
+ | :sg:`scale_to_length(float) -> None`
+
+ Scales the vector so that it has the given length. The direction of the
+ vector is not changed. You can also scale to length ``0``. If the vector
+ is the zero vector (i.e. has length ``0`` thus no direction) a
+ ``ValueError`` is raised.
+
+ .. ## Vector3.scale_to_length ##
+
+ .. method:: reflect
+
+ | :sl:`returns a vector reflected of a given normal.`
+ | :sg:`reflect(Vector3) -> Vector3`
+
+ Returns a new vector that points in the direction as if self would bounce
+ of a surface characterized by the given surface normal. The length of the
+ new vector is the same as self's.
+
+ .. ## Vector3.reflect ##
+
+ .. method:: reflect_ip
+
+ | :sl:`reflect the vector of a given normal in place.`
+ | :sg:`reflect_ip(Vector3) -> None`
+
+ Changes the direction of self as if it would have been reflected of a
+ surface with the given surface normal.
+
+ .. ## Vector3.reflect_ip ##
+
+ .. method:: distance_to
+
+ | :sl:`calculates the Euclidean distance to a given vector.`
+ | :sg:`distance_to(Vector3) -> float`
+
+ .. ## Vector3.distance_to ##
+
+ .. method:: distance_squared_to
+
+ | :sl:`calculates the squared Euclidean distance to a given vector.`
+ | :sg:`distance_squared_to(Vector3) -> float`
+
+ .. ## Vector3.distance_squared_to ##
+
+ .. method:: move_towards
+
+ | :sl:`returns a vector moved toward the target by a given distance.`
+ | :sg:`move_towards(Vector3, float) -> Vector3`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave move_towards feedback with authors `_
+
+ Returns a Vector which is moved towards the given Vector by a given
+ distance and does not overshoot past its target Vector.
+ The first parameter determines the target Vector, while the second
+ parameter determines the delta distance. If the distance is in the
+ negatives, then it will move away from the target Vector.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Vector3.move_towards ##
+
+ .. method:: move_towards_ip
+
+ | :sl:`moves the vector toward its target at a given distance.`
+ | :sg:`move_towards_ip(Vector3, float) -> None`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave move_towards_ip feedback with authors `_
+
+ Moves itself toward the given Vector at a given distance and does not
+ overshoot past its target Vector.
+ The first parameter determines the target Vector, while the second
+ parameter determines the delta distance. If the distance is in the
+ negatives, then it will move away from the target Vector.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Vector3.move_towards_ip ##
+
+ .. method:: lerp
+
+ | :sl:`returns a linear interpolation to the given vector.`
+ | :sg:`lerp(Vector3, float) -> Vector3`
+
+ Returns a Vector which is a linear interpolation between self and the
+ given Vector. The second parameter determines how far between self an
+ other the result is going to be. It must be a value between ``0`` and
+ ``1``, where ``0`` means self and ``1`` means other will be returned.
+
+ .. ## Vector3.lerp ##
+
+ .. method:: slerp
+
+ | :sl:`returns a spherical interpolation to the given vector.`
+ | :sg:`slerp(Vector3, float) -> Vector3`
+
+ Calculates the spherical interpolation from self to the given Vector. The
+ second argument - often called t - must be in the range ``[-1, 1]``. It
+ parametrizes where - in between the two vectors - the result should be.
+ If a negative value is given the interpolation will not take the
+ complement of the shortest path.
+
+ .. ## Vector3.slerp ##
+
+ .. method:: elementwise
+
+ | :sl:`The next operation will be performed elementwise.`
+ | :sg:`elementwise() -> VectorElementwiseProxy`
+
+ Applies the following operation to each element of the vector.
+
+ .. ## Vector3.elementwise ##
+
+ .. method:: rotate
+
+ | :sl:`rotates a vector by a given angle in degrees.`
+ | :sg:`rotate(angle, Vector3) -> Vector3`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise by the given angle in degrees around the given axis.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector3.rotate ##
+
+ .. method:: rotate_rad
+
+ | :sl:`rotates a vector by a given angle in radians.`
+ | :sg:`rotate_rad(angle, Vector3) -> Vector3`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise by the given angle in radians around the given axis.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.0.0
+
+ .. ## Vector3.rotate_rad ##
+
+ .. method:: rotate_ip
+
+ | :sl:`rotates the vector by a given angle in degrees in place.`
+ | :sg:`rotate_ip(angle, Vector3) -> None`
+
+ Rotates the vector counterclockwise around the given axis by the given
+ angle in degrees. The length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector3.rotate_ip ##
+
+ .. method:: rotate_ip_rad
+
+ | :sl:`rotates the vector by a given angle in radians in place.`
+ | :sg:`rotate_ip_rad(angle, Vector3) -> None`
+
+ DEPRECATED: Use rotate_rad_ip() instead.
+
+ .. versionadded:: 2.0.0
+ .. deprecated:: 2.1.1
+
+ .. ## Vector3.rotate_ip_rad ##
+
+ .. method:: rotate_rad_ip
+
+ | :sl:`rotates the vector by a given angle in radians in place.`
+ | :sg:`rotate_rad_ip(angle, Vector3) -> None`
+
+ Rotates the vector counterclockwise around the given axis by the given
+ angle in radians. The length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.1.1
+
+ .. ## Vector3.rotate_rad_ip ##
+
+ .. method:: rotate_x
+
+ | :sl:`rotates a vector around the x-axis by the angle in degrees.`
+ | :sg:`rotate_x(angle) -> Vector3`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise around the x-axis by the given angle in degrees.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector3.rotate_x ##
+
+ .. method:: rotate_x_rad
+
+ | :sl:`rotates a vector around the x-axis by the angle in radians.`
+ | :sg:`rotate_x_rad(angle) -> Vector3`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise around the x-axis by the given angle in radians.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.0.0
+
+ .. ## Vector3.rotate_x_rad ##
+
+ .. method:: rotate_x_ip
+
+ | :sl:`rotates the vector around the x-axis by the angle in degrees in place.`
+ | :sg:`rotate_x_ip(angle) -> None`
+
+ Rotates the vector counterclockwise around the x-axis by the given angle
+ in degrees. The length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector3.rotate_x_ip ##
+
+ .. method:: rotate_x_ip_rad
+
+ | :sl:`rotates the vector around the x-axis by the angle in radians in place.`
+ | :sg:`rotate_x_ip_rad(angle) -> None`
+
+ DEPRECATED: Use rotate_x_rad_ip() instead.
+
+ .. versionadded:: 2.0.0
+ .. deprecated:: 2.1.1
+
+ .. ## Vector3.rotate_x_ip_rad ##
+
+ .. method:: rotate_x_rad_ip
+
+ | :sl:`rotates the vector around the x-axis by the angle in radians in place.`
+ | :sg:`rotate_x_rad_ip(angle) -> None`
+
+ Rotates the vector counterclockwise around the x-axis by the given angle
+ in radians. The length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.1.1
+
+ .. ## Vector3.rotate_x_rad_ip ##
+
+ .. method:: rotate_y
+
+ | :sl:`rotates a vector around the y-axis by the angle in degrees.`
+ | :sg:`rotate_y(angle) -> Vector3`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise around the y-axis by the given angle in degrees.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector3.rotate_y ##
+
+ .. method:: rotate_y_rad
+
+ | :sl:`rotates a vector around the y-axis by the angle in radians.`
+ | :sg:`rotate_y_rad(angle) -> Vector3`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise around the y-axis by the given angle in radians.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.0.0
+
+ .. ## Vector3.rotate_y_rad ##
+
+ .. method:: rotate_y_ip
+
+ | :sl:`rotates the vector around the y-axis by the angle in degrees in place.`
+ | :sg:`rotate_y_ip(angle) -> None`
+
+ Rotates the vector counterclockwise around the y-axis by the given angle
+ in degrees. The length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector3.rotate_y_ip ##
+
+ .. method:: rotate_y_ip_rad
+
+ | :sl:`rotates the vector around the y-axis by the angle in radians in place.`
+ | :sg:`rotate_y_ip_rad(angle) -> None`
+
+ DEPRECATED: Use rotate_y_rad_ip() instead.
+
+ .. versionadded:: 2.0.0
+ .. deprecated:: 2.1.1
+
+ .. ## Vector3.rotate_y_ip_rad ##
+
+ .. method:: rotate_y_rad_ip
+
+ | :sl:`rotates the vector around the y-axis by the angle in radians in place.`
+ | :sg:`rotate_y_rad_ip(angle) -> None`
+
+ Rotates the vector counterclockwise around the y-axis by the given angle
+ in radians. The length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.1.1
+
+ .. ## Vector3.rotate_y_rad_ip ##
+
+ .. method:: rotate_z
+
+ | :sl:`rotates a vector around the z-axis by the angle in degrees.`
+ | :sg:`rotate_z(angle) -> Vector3`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise around the z-axis by the given angle in degrees.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector3.rotate_z ##
+
+ .. method:: rotate_z_rad
+
+ | :sl:`rotates a vector around the z-axis by the angle in radians.`
+ | :sg:`rotate_z_rad(angle) -> Vector3`
+
+ Returns a vector which has the same length as self but is rotated
+ counterclockwise around the z-axis by the given angle in radians.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.0.0
+
+ .. ## Vector3.rotate_z_rad ##
+
+ .. method:: rotate_z_ip
+
+ | :sl:`rotates the vector around the z-axis by the angle in degrees in place.`
+ | :sg:`rotate_z_ip(angle) -> None`
+
+ Rotates the vector counterclockwise around the z-axis by the given angle
+ in degrees. The length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. ## Vector3.rotate_z_ip ##
+
+ .. method:: rotate_z_ip_rad
+
+ | :sl:`rotates the vector around the z-axis by the angle in radians in place.`
+ | :sg:`rotate_z_ip_rad(angle) -> None`
+
+ DEPRECATED: Use rotate_z_rad_ip() instead.
+
+ .. deprecated:: 2.1.1
+
+ .. ## Vector3.rotate_z_ip_rad ##
+
+ .. method:: rotate_z_rad_ip
+
+ | :sl:`rotates the vector around the z-axis by the angle in radians in place.`
+ | :sg:`rotate_z_rad_ip(angle) -> None`
+
+ Rotates the vector counterclockwise around the z-axis by the given angle
+ in radians. The length of the vector is not changed.
+ (Note that due to pygame's inverted y coordinate system, the rotation
+ will look clockwise if displayed).
+
+ .. versionadded:: 2.1.1
+
+ .. ## Vector3.rotate_z_rad_ip ##
+
+ .. method:: angle_to
+
+ | :sl:`calculates the angle to a given vector in degrees.`
+ | :sg:`angle_to(Vector3) -> float`
+
+ Returns the angle between self and the given vector.
+
+ .. ## Vector3.angle_to ##
+
+ .. method:: as_spherical
+
+ | :sl:`returns a tuple with radial distance, inclination and azimuthal angle.`
+ | :sg:`as_spherical() -> (r, theta, phi)`
+
+ Returns a tuple ``(r, theta, phi)`` where r is the radial distance, theta is
+ the inclination angle and phi is the azimuthal angle.
+
+ .. ## Vector3.as_spherical ##
+
+ .. method:: from_spherical
+
+ | :sl:`Creates a Vector3(x, y, z) or sets x, y and z from a spherical coordinates 3-tuple.`
+ | :sg:`Vector3.from_spherical((r, theta, phi)) -> Vector3`
+ | :sg:`Vector3().from_spherical((r, theta, phi)) -> None`
+
+ If used from the class creates a Vector3(x, y, z), else sets x, y, and z.
+ The values of x, y, and z are from a tuple ``(r, theta, phi)`` where r is the radial
+ distance, theta is the inclination angle and phi is the azimuthal angle.
+
+ .. ## Vector3.from_spherical ##
+
+ .. method:: project
+
+ | :sl:`projects a vector onto another.`
+ | :sg:`project(Vector3) -> Vector3`
+
+ Returns the projected vector. This is useful for collision detection in finding the components in a certain direction (e.g. in direction of the wall).
+ For a more detailed explanation see `Wikipedia `_.
+
+ .. versionadded:: 2.0.2
+
+ .. ## Vector3.project ##
+
+ .. method:: copy
+
+ | :sl:`Returns a copy of itself.`
+ | :sg:`copy() -> Vector3`
+
+ Returns a new Vector3 having the same dimensions.
+
+ .. versionadded:: 2.1.1
+
+ .. ## Vector3.copy ##
+
+
+ .. method:: clamp_magnitude
+
+ | :sl:`Returns a copy of a vector with the magnitude clamped between max_length and min_length.`
+ | :sg:`clamp_magnitude(max_length) -> Vector3`
+ | :sg:`clamp_magnitude(min_length, max_length) -> Vector3`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave clamp_magnitude feedback with authors `_
+
+ Returns a new copy of a vector with the magnitude clamped between
+ ``max_length`` and ``min_length``. If only one argument is passed, it is
+ taken to be the ``max_length``
+
+ This function raises ``ValueError`` if ``min_length`` is greater than
+ ``max_length``, or if either of these values are negative.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Vector3.clamp_magnitude ##
+
+
+ .. method:: clamp_magnitude_ip
+
+ | :sl:`Clamps the vector's magnitude between max_length and min_length`
+ | :sg:`clamp_magnitude_ip(max_length) -> None`
+ | :sg:`clamp_magnitude_ip(min_length, max_length) -> None`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave clamp_magnitude_ip feedback with authors `_
+
+ Clamps the vector's magnitude between ``max_length`` and ``min_length``.
+ If only one argument is passed, it is taken to be the ``max_length``
+
+ This function raises ``ValueError`` if ``min_length`` is greater than
+ ``max_length``, or if either of these values are negative.
+
+ .. versionadded:: 2.1.3
+
+ .. ## Vector3.clamp_magnitude_ip ##
+
+ .. method:: update
+
+ | :sl:`Sets the coordinates of the vector.`
+ | :sg:`update() -> None`
+ | :sg:`update(int) -> None`
+ | :sg:`update(float) -> None`
+ | :sg:`update(Vector3) -> None`
+ | :sg:`update(x, y, z) -> None`
+ | :sg:`update((x, y, z)) -> None`
+
+ Sets coordinates x, y, and z in place.
+
+ .. versionadded:: 1.9.5
+
+ .. ## Vector3.update ##
+
+ .. attribute:: epsilon
+
+ | :sl:`Determines the tolerance of vector calculations.`
+
+ With lengths within this number, vectors are considered equal. For more information see :attr:`pygame.math.Vector2.epsilon`
+
+ .. ## ##
+
+ .. ## pygame.math.Vector3 ##
+
+.. ## pygame.math ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/midi.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/midi.rst.txt
new file mode 100644
index 00000000..edc9f252
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/midi.rst.txt
@@ -0,0 +1,484 @@
+.. include:: common.txt
+
+:mod:`pygame.midi`
+==================
+
+.. module:: pygame.midi
+ :synopsis: pygame module for interacting with midi input and output.
+
+| :sl:`pygame module for interacting with midi input and output.`
+
+.. versionadded:: 1.9.0
+
+The midi module can send output to midi devices and get input from midi
+devices. It can also list midi devices on the system.
+
+The midi module supports real and virtual midi devices.
+
+It uses the portmidi library. Is portable to which ever platforms portmidi
+supports (currently Windows, Mac OS X, and Linux).
+
+This uses pyportmidi for now, but may use its own bindings at some point in the
+future. The pyportmidi bindings are included with pygame.
+
+|
+
+.. versionadded:: 2.0.0
+
+These are pygame events (:mod:`pygame.event`) reserved for midi use. The
+``MIDIIN`` event is used by :func:`pygame.midi.midis2events` when converting
+midi events to pygame events.
+
+::
+
+ MIDIIN
+ MIDIOUT
+
+|
+
+.. function:: init
+
+ | :sl:`initialize the midi module`
+ | :sg:`init() -> None`
+
+ Initializes the :mod:`pygame.midi` module. Must be called before using the
+ :mod:`pygame.midi` module.
+
+ It is safe to call this more than once.
+
+ .. ## pygame.midi.init ##
+
+.. function:: quit
+
+ | :sl:`uninitialize the midi module`
+ | :sg:`quit() -> None`
+
+ Uninitializes the :mod:`pygame.midi` module. If :func:`pygame.midi.init` was
+ called to initialize the :mod:`pygame.midi` module, then this function will
+ be called automatically when your program exits.
+
+ It is safe to call this function more than once.
+
+ .. ## pygame.midi.quit ##
+
+.. function:: get_init
+
+ | :sl:`returns True if the midi module is currently initialized`
+ | :sg:`get_init() -> bool`
+
+ Gets the initialization state of the :mod:`pygame.midi` module.
+
+ :returns: ``True`` if the :mod:`pygame.midi` module is currently initialized.
+ :rtype: bool
+
+ .. versionadded:: 1.9.5
+
+ .. ## pygame.midi.get_init ##
+
+.. class:: Input
+
+ | :sl:`Input is used to get midi input from midi devices.`
+ | :sg:`Input(device_id) -> None`
+ | :sg:`Input(device_id, buffer_size) -> None`
+
+ :param int device_id: midi device id
+ :param int buffer_size: (optional) the number of input events to be buffered
+
+ .. method:: close
+
+ | :sl:`closes a midi stream, flushing any pending buffers.`
+ | :sg:`close() -> None`
+
+ PortMidi attempts to close open streams when the application exits.
+
+ .. note:: This is particularly difficult under Windows.
+
+ .. ## Input.close ##
+
+ .. method:: poll
+
+ | :sl:`returns True if there's data, or False if not.`
+ | :sg:`poll() -> bool`
+
+ Used to indicate if any data exists.
+
+ :returns: ``True`` if there is data, ``False`` otherwise
+ :rtype: bool
+
+ :raises MidiException: on error
+
+ .. ## Input.poll ##
+
+ .. method:: read
+
+ | :sl:`reads num_events midi events from the buffer.`
+ | :sg:`read(num_events) -> midi_event_list`
+
+ Reads from the input buffer and gives back midi events.
+
+ :param int num_events: number of input events to read
+
+ :returns: the format for midi_event_list is
+ ``[[[status, data1, data2, data3], timestamp], ...]``
+ :rtype: list
+
+ .. ## Input.read ##
+
+ .. ## pygame.midi.Input ##
+
+.. class:: Output
+
+ | :sl:`Output is used to send midi to an output device`
+ | :sg:`Output(device_id) -> None`
+ | :sg:`Output(device_id, latency=0) -> None`
+ | :sg:`Output(device_id, buffer_size=256) -> None`
+ | :sg:`Output(device_id, latency, buffer_size) -> None`
+
+ The ``buffer_size`` specifies the number of output events to be buffered
+ waiting for output. In some cases (see below) PortMidi does not buffer
+ output at all and merely passes data to a lower-level API, in which case
+ buffersize is ignored.
+
+ ``latency`` is the delay in milliseconds applied to timestamps to determine
+ when the output should actually occur. If ``latency`` is <<0, 0 is assumed.
+
+ If ``latency`` is zero, timestamps are ignored and all output is delivered
+ immediately. If ``latency`` is greater than zero, output is delayed until the
+ message timestamp plus the ``latency``. In some cases, PortMidi can obtain
+ better timing than your application by passing timestamps along to the
+ device driver or hardware. Latency may also help you to synchronize midi
+ data to audio data by matching midi latency to the audio buffer latency.
+
+ .. note::
+ Time is measured relative to the time source indicated by time_proc.
+ Timestamps are absolute, not relative delays or offsets.
+
+ .. method:: abort
+
+ | :sl:`terminates outgoing messages immediately`
+ | :sg:`abort() -> None`
+
+ The caller should immediately close the output port; this call may result
+ in transmission of a partial midi message. There is no abort for Midi
+ input because the user can simply ignore messages in the buffer and close
+ an input device at any time.
+
+ .. ## Output.abort ##
+
+ .. method:: close
+
+ | :sl:`closes a midi stream, flushing any pending buffers.`
+ | :sg:`close() -> None`
+
+ PortMidi attempts to close open streams when the application exits.
+
+ .. note:: This is particularly difficult under Windows.
+
+ .. ## Output.close ##
+
+ .. method:: note_off
+
+ | :sl:`turns a midi note off (note must be on)`
+ | :sg:`note_off(note, velocity=None, channel=0) -> None`
+
+ Turn a note off in the output stream. The note must already be on for
+ this to work correctly.
+
+ .. ## Output.note_off ##
+
+ .. method:: note_on
+
+ | :sl:`turns a midi note on (note must be off)`
+ | :sg:`note_on(note, velocity=None, channel=0) -> None`
+
+ Turn a note on in the output stream. The note must already be off for
+ this to work correctly.
+
+ .. ## Output.note_on ##
+
+ .. method:: set_instrument
+
+ | :sl:`select an instrument, with a value between 0 and 127`
+ | :sg:`set_instrument(instrument_id, channel=0) -> None`
+
+ Select an instrument.
+
+ .. ## Output.set_instrument ##
+
+ .. method:: pitch_bend
+
+ | :sl:`modify the pitch of a channel.`
+ | :sg:`set_instrument(value=0, channel=0) -> None`
+
+ Adjust the pitch of a channel. The value is a signed integer
+ from -8192 to +8191. For example, 0 means "no change", +4096 is
+ typically a semitone higher, and -8192 is 1 whole tone lower (though
+ the musical range corresponding to the pitch bend range can also be
+ changed in some synthesizers).
+
+ If no value is given, the pitch bend is returned to "no change".
+
+ .. versionadded:: 1.9.4
+
+ .. method:: write
+
+ | :sl:`writes a list of midi data to the Output`
+ | :sg:`write(data) -> None`
+
+ Writes series of MIDI information in the form of a list.
+
+ :param list data: data to write, the expected format is
+ ``[[[status, data1=0, data2=0, ...], timestamp], ...]``
+ with the ``data#`` fields being optional
+
+ :raises IndexError: if more than 1024 elements in the data list
+
+ Example:
+ ::
+
+ # Program change at time 20000 and 500ms later send note 65 with
+ # velocity 100.
+ write([[[0xc0, 0, 0], 20000], [[0x90, 60, 100], 20500]])
+
+ .. note::
+ - Timestamps will be ignored if latency = 0
+ - To get a note to play immediately, send MIDI info with timestamp
+ read from function Time
+ - Optional data fields: ``write([[[0xc0, 0, 0], 20000]])`` is
+ equivalent to ``write([[[0xc0], 20000]])``
+
+ .. ## Output.write ##
+
+ .. method:: write_short
+
+ | :sl:`writes up to 3 bytes of midi data to the Output`
+ | :sg:`write_short(status) -> None`
+ | :sg:`write_short(status, data1=0, data2=0) -> None`
+
+ Output MIDI information of 3 bytes or less. The ``data`` fields are
+ optional and assumed to be 0 if omitted.
+
+ Examples of status byte values:
+ ::
+
+ 0xc0 # program change
+ 0x90 # note on
+ # etc.
+
+ Example:
+ ::
+
+ # note 65 on with velocity 100
+ write_short(0x90, 65, 100)
+
+ .. ## Output.write_short ##
+
+ .. method:: write_sys_ex
+
+ | :sl:`writes a timestamped system-exclusive midi message.`
+ | :sg:`write_sys_ex(when, msg) -> None`
+
+ Writes a timestamped system-exclusive midi message.
+
+ :param msg: midi message
+ :type msg: list[int] or str
+ :param when: timestamp in milliseconds
+
+ Example:
+ ::
+
+ midi_output.write_sys_ex(0, '\xF0\x7D\x10\x11\x12\x13\xF7')
+
+ # is equivalent to
+
+ midi_output.write_sys_ex(pygame.midi.time(),
+ [0xF0, 0x7D, 0x10, 0x11, 0x12, 0x13, 0xF7])
+
+ .. ## Output.write_sys_ex ##
+
+ .. ## pygame.midi.Output ##
+
+.. function:: get_count
+
+ | :sl:`gets the number of devices.`
+ | :sg:`get_count() -> num_devices`
+
+ Device ids range from 0 to ``get_count() - 1``
+
+ .. ## pygame.midi.get_count ##
+
+.. function:: get_default_input_id
+
+ | :sl:`gets default input device number`
+ | :sg:`get_default_input_id() -> default_id`
+
+ The following describes the usage details for this function and the
+ :func:`get_default_output_id` function.
+
+ Return the default device ID or ``-1`` if there are no devices. The result
+ can be passed to the :class:`Input`/:class:`Output` class.
+
+ On a PC the user can specify a default device by setting an environment
+ variable. To use device #1, for example:
+ ::
+
+ set PM_RECOMMENDED_INPUT_DEVICE=1
+ or
+ set PM_RECOMMENDED_OUTPUT_DEVICE=1
+
+ The user should first determine the available device ID by using the
+ supplied application "testin" or "testout".
+
+ In general, the registry is a better place for this kind of info. With
+ USB devices that can come and go, using integers is not very reliable
+ for device identification. Under Windows, if ``PM_RECOMMENDED_INPUT_DEVICE``
+ (or ``PM_RECOMMENDED_OUTPUT_DEVICE``) is NOT found in the environment,
+ then the default device is obtained by looking for a string in the registry
+ under:
+ ::
+
+ HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Input_Device
+ or
+ HKEY_LOCAL_MACHINE/SOFTWARE/PortMidi/Recommended_Output_Device
+
+
+ The number of the first device with a substring that matches the
+ string exactly is returned. For example, if the string in the registry is
+ "USB" and device 1 is named "In USB MidiSport 1x1", then that will be
+ the default input because it contains the string "USB".
+
+ In addition to the name, :func:`get_device_info()` returns "interf", which is
+ the interface name. The "interface" is the underlying software system or
+ API used by PortMidi to access devices. Supported interfaces:
+ ::
+
+ MMSystem # the only Win32 interface currently supported
+ ALSA # the only Linux interface currently supported
+ CoreMIDI # the only Mac OS X interface currently supported
+ # DirectX - not implemented
+ # OSS - not implemented
+
+ To specify both the interface and the device name in the registry, separate
+ the two with a comma and a space. The string before the comma must be a
+ substring of the "interf" string and the string after the space must be a
+ substring of the "name" name string in order to match the device. e.g.:
+ ::
+
+ MMSystem, In USB MidiSport 1x1
+
+ .. note::
+ In the current release, the default is simply the first device (the
+ input or output device with the lowest PmDeviceID).
+
+ .. ## pygame.midi.get_default_input_id ##
+
+.. function:: get_default_output_id
+
+ | :sl:`gets default output device number`
+ | :sg:`get_default_output_id() -> default_id`
+
+ See :func:`get_default_input_id` for usage details.
+
+ .. ## pygame.midi.get_default_output_id ##
+
+.. function:: get_device_info
+
+ | :sl:`returns information about a midi device`
+ | :sg:`get_device_info(an_id) -> (interf, name, input, output, opened)`
+ | :sg:`get_device_info(an_id) -> None`
+
+ Gets the device info for a given id.
+
+ :param int an_id: id of the midi device being queried
+
+ :returns: if the id is out of range ``None`` is returned, otherwise
+ a tuple of (interf, name, input, output, opened) is returned.
+
+ - interf: string describing the device interface (e.g. 'ALSA')
+ - name: string name of the device (e.g. 'Midi Through Port-0')
+ - input: 1 if the device is an input device, otherwise 0
+ - output: 1 if the device is an output device, otherwise 0
+ - opened: 1 if the device is opened, otherwise 0
+ :rtype: tuple or None
+
+ .. ## pygame.midi.get_device_info ##
+
+.. function:: midis2events
+
+ | :sl:`converts midi events to pygame events`
+ | :sg:`midis2events(midi_events, device_id) -> [Event, ...]`
+
+ Takes a sequence of midi events and returns list of pygame events.
+
+ The ``midi_events`` data is expected to be a sequence of
+ ``((status, data1, data2, data3), timestamp)`` midi events (all values
+ required).
+
+ :returns: a list of pygame events of event type ``MIDIIN``
+ :rtype: list
+
+ .. ## pygame.midi.midis2events ##
+
+.. function:: time
+
+ | :sl:`returns the current time in ms of the PortMidi timer`
+ | :sg:`time() -> time`
+
+ The time is reset to 0 when the :mod:`pygame.midi` module is initialized.
+
+ .. ## pygame.midi.time ##
+
+
+.. function:: frequency_to_midi
+
+ | :sl:`Converts a frequency into a MIDI note. Rounds to the closest midi note.`
+ | :sg:`frequency_to_midi(midi_note) -> midi_note`
+
+ example:
+ ::
+
+ frequency_to_midi(27.5) == 21
+
+ .. versionadded:: 1.9.5
+
+ .. ## pygame.midi.frequency_to_midi ##
+
+
+.. function:: midi_to_frequency
+
+ | :sl:`Converts a midi note to a frequency.`
+ | :sg:`midi_to_frequency(midi_note) -> frequency`
+
+ example:
+ ::
+
+ midi_to_frequency(21) == 27.5
+
+ .. versionadded:: 1.9.5
+
+ .. ## pygame.midi.midi_to_frequency ##
+
+
+.. function:: midi_to_ansi_note
+
+ | :sl:`Returns the Ansi Note name for a midi number.`
+ | :sg:`midi_to_ansi_note(midi_note) -> ansi_note`
+
+ example:
+ ::
+
+ midi_to_ansi_note(21) == 'A0'
+
+ .. versionadded:: 1.9.5
+
+ .. ## pygame.midi.midi_to_ansi_note ##
+
+.. exception:: MidiException
+
+ | :sl:`exception that pygame.midi functions and classes can raise`
+ | :sg:`MidiException(errno) -> None`
+
+ .. ## pygame.midi.MidiException ##
+
+
+.. ## pygame.midi ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mixer.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mixer.rst.txt
new file mode 100644
index 00000000..07bc7932
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mixer.rst.txt
@@ -0,0 +1,605 @@
+.. include:: common.txt
+
+:mod:`pygame.mixer`
+===================
+
+.. module:: pygame.mixer
+ :synopsis: pygame module for loading and playing sounds
+
+| :sl:`pygame module for loading and playing sounds`
+
+This module contains classes for loading Sound objects and controlling
+playback. The mixer module is optional and depends on SDL_mixer. Your program
+should test that :mod:`pygame.mixer` is available and initialized before using
+it.
+
+The mixer module has a limited number of channels for playback of sounds.
+Usually programs tell pygame to start playing audio and it selects an available
+channel automatically. The default is 8 simultaneous channels, but complex
+programs can get more precise control over the number of channels and their
+use.
+
+All sound playback is mixed in background threads. When you begin to play a
+Sound object, it will return immediately while the sound continues to play. A
+single Sound object can also be actively played back multiple times.
+
+The mixer also has a special streaming channel. This is for music playback and
+is accessed through the :mod:`pygame.mixer.music` module. Consider using this
+module for playing long running music. Unlike mixer module, the music module
+streams the music from the files without loading music at once into memory.
+
+The mixer module must be initialized like other pygame modules, but it has some
+extra conditions. The ``pygame.mixer.init()`` function takes several optional
+arguments to control the playback rate and sample size. Pygame will default to
+reasonable values, but pygame cannot perform Sound resampling, so the mixer
+should be initialized to match the values of your audio resources.
+
+``NOTE``: For less laggy sound use a smaller buffer size. The default
+is set to reduce the chance of scratchy sounds on some computers. You can
+change the default buffer by calling :func:`pygame.mixer.pre_init` before
+:func:`pygame.mixer.init` or :func:`pygame.init` is called. For example:
+``pygame.mixer.pre_init(44100,-16,2, 1024)``
+
+
+.. function:: init
+
+ | :sl:`initialize the mixer module`
+ | :sg:`init(frequency=44100, size=-16, channels=2, buffer=512, devicename=None, allowedchanges=AUDIO_ALLOW_FREQUENCY_CHANGE | AUDIO_ALLOW_CHANNELS_CHANGE) -> None`
+
+ Initialize the mixer module for Sound loading and playback. The default
+ arguments can be overridden to provide specific audio mixing. Keyword
+ arguments are accepted. For backwards compatibility, argument values of
+ 0 are replaced with the startup defaults, except for ``allowedchanges``,
+ where -1 is used. (startup defaults may be changed by a :func:`pre_init` call).
+
+ The size argument represents how many bits are used for each audio sample.
+ If the value is negative then signed sample values will be used. Positive
+ values mean unsigned audio samples will be used. An invalid value raises an
+ exception.
+
+ The channels argument is used to specify whether to use mono or stereo. 1
+ for mono and 2 for stereo.
+
+ The buffer argument controls the number of internal samples used in the
+ sound mixer. The default value should work for most cases. It can be lowered
+ to reduce latency, but sound dropout may occur. It can be raised to larger
+ values to ensure playback never skips, but it will impose latency on sound
+ playback. The buffer size must be a power of two (if not it is rounded up to
+ the next nearest power of 2).
+
+ Some platforms require the :mod:`pygame.mixer` module to be initialized
+ after the display modules have initialized. The top level ``pygame.init()``
+ takes care of this automatically, but cannot pass any arguments to the mixer
+ init. To solve this, mixer has a function ``pygame.mixer.pre_init()`` to set
+ the proper defaults before the toplevel init is used.
+
+ When using allowedchanges=0 it will convert the samples at runtime to match
+ what the hardware supports. For example a sound card may not
+ support 16bit sound samples, so instead it will use 8bit samples internally.
+ If AUDIO_ALLOW_FORMAT_CHANGE is supplied, then the requested format will
+ change to the closest that SDL2 supports.
+
+ Apart from 0, allowedchanged accepts the following constants ORed together:
+
+ - AUDIO_ALLOW_FREQUENCY_CHANGE
+ - AUDIO_ALLOW_FORMAT_CHANGE
+ - AUDIO_ALLOW_CHANNELS_CHANGE
+ - AUDIO_ALLOW_ANY_CHANGE
+
+ It is safe to call this more than once, but after the mixer is initialized
+ you cannot change the playback arguments without first calling
+ ``pygame.mixer.quit()``.
+
+ .. versionchanged:: 1.8 The default ``buffersize`` changed from 1024 to 3072.
+ .. versionchanged:: 1.9.1 The default ``buffersize`` changed from 3072 to 4096.
+ .. versionchanged:: 2.0.0 The default ``buffersize`` changed from 4096 to 512.
+ .. versionchanged:: 2.0.0 The default ``frequency`` changed from 22050 to 44100.
+ .. versionchanged:: 2.0.0 ``size`` can be 32 (32-bit floats).
+ .. versionchanged:: 2.0.0 ``channels`` can also be 4 or 6.
+ .. versionadded:: 2.0.0 ``allowedchanges``, ``devicename`` arguments added
+
+ .. ## pygame.mixer.init ##
+
+.. function:: pre_init
+
+ | :sl:`preset the mixer init arguments`
+ | :sg:`pre_init(frequency=44100, size=-16, channels=2, buffer=512, devicename=None, allowedchanges=AUDIO_ALLOW_FREQUENCY_CHANGE | AUDIO_ALLOW_CHANNELS_CHANGE) -> None`
+
+ Call pre_init to change the defaults used when the real
+ ``pygame.mixer.init()`` is called. Keyword arguments are accepted. The best
+ way to set custom mixer playback values is to call
+ ``pygame.mixer.pre_init()`` before calling the top level ``pygame.init()``.
+ For backwards compatibility, argument values of 0 are replaced with the
+ startup defaults, except for ``allowedchanges``, where -1 is used.
+
+ .. versionchanged:: 1.8 The default ``buffersize`` changed from 1024 to 3072.
+ .. versionchanged:: 1.9.1 The default ``buffersize`` changed from 3072 to 4096.
+ .. versionchanged:: 2.0.0 The default ``buffersize`` changed from 4096 to 512.
+ .. versionchanged:: 2.0.0 The default ``frequency`` changed from 22050 to 44100.
+ .. versionadded:: 2.0.0 ``allowedchanges``, ``devicename`` arguments added
+
+ .. ## pygame.mixer.pre_init ##
+
+.. function:: quit
+
+ | :sl:`uninitialize the mixer`
+ | :sg:`quit() -> None`
+
+ This will uninitialize :mod:`pygame.mixer`. All playback will stop and any
+ loaded Sound objects may not be compatible with the mixer if it is
+ reinitialized later.
+
+ .. ## pygame.mixer.quit ##
+
+.. function:: get_init
+
+ | :sl:`test if the mixer is initialized`
+ | :sg:`get_init() -> (frequency, format, channels)`
+
+ If the mixer is initialized, this returns the playback arguments it is
+ using. If the mixer has not been initialized this returns ``None``.
+
+ .. ## pygame.mixer.get_init ##
+
+.. function:: stop
+
+ | :sl:`stop playback of all sound channels`
+ | :sg:`stop() -> None`
+
+ This will stop all playback of all active mixer channels.
+
+ .. ## pygame.mixer.stop ##
+
+.. function:: pause
+
+ | :sl:`temporarily stop playback of all sound channels`
+ | :sg:`pause() -> None`
+
+ This will temporarily stop all playback on the active mixer channels. The
+ playback can later be resumed with ``pygame.mixer.unpause()``
+
+ .. ## pygame.mixer.pause ##
+
+.. function:: unpause
+
+ | :sl:`resume paused playback of sound channels`
+ | :sg:`unpause() -> None`
+
+ This will resume all active sound channels after they have been paused.
+
+ .. ## pygame.mixer.unpause ##
+
+.. function:: fadeout
+
+ | :sl:`fade out the volume on all sounds before stopping`
+ | :sg:`fadeout(time) -> None`
+
+ This will fade out the volume on all active channels over the time argument
+ in milliseconds. After the sound is muted the playback will stop.
+
+ .. ## pygame.mixer.fadeout ##
+
+.. function:: set_num_channels
+
+ | :sl:`set the total number of playback channels`
+ | :sg:`set_num_channels(count) -> None`
+
+ Sets the number of available channels for the mixer. The default value is 8.
+ The value can be increased or decreased. If the value is decreased, sounds
+ playing on the truncated channels are stopped.
+
+ .. ## pygame.mixer.set_num_channels ##
+
+.. function:: get_num_channels
+
+ | :sl:`get the total number of playback channels`
+ | :sg:`get_num_channels() -> count`
+
+ Returns the number of currently active playback channels.
+
+ .. ## pygame.mixer.get_num_channels ##
+
+.. function:: set_reserved
+
+ | :sl:`reserve channels from being automatically used`
+ | :sg:`set_reserved(count) -> count`
+
+ The mixer can reserve any number of channels that will not be automatically
+ selected for playback by Sounds. This means that whenever you play a Sound
+ without specifying a channel, a reserved channel will never be used. If sounds
+ are currently playing on the reserved channels they will not be stopped.
+
+ This allows the application to reserve a specific number of channels for
+ important sounds that must not be dropped or have a guaranteed channel to
+ play on.
+
+ Will return number of channels actually reserved, this may be less than requested
+ depending on the number of channels previously allocated.
+
+ .. ## pygame.mixer.set_reserved ##
+
+.. function:: find_channel
+
+ | :sl:`find an unused channel`
+ | :sg:`find_channel(force=False) -> Channel`
+
+ This will find and return an inactive Channel object. If there are no
+ inactive Channels this function will return ``None``. If there are no
+ inactive channels and the force argument is ``True``, this will find the
+ Channel with the longest running Sound and return it.
+
+ .. ## pygame.mixer.find_channel ##
+
+.. function:: get_busy
+
+ | :sl:`test if any sound is being mixed`
+ | :sg:`get_busy() -> bool`
+
+ Returns ``True`` if the mixer is busy mixing any channels. If the mixer is
+ idle then this return ``False``.
+
+ .. ## pygame.mixer.get_busy ##
+
+.. function:: get_sdl_mixer_version
+
+ | :sl:`get the mixer's SDL version`
+ | :sg:`get_sdl_mixer_version() -> (major, minor, patch)`
+ | :sg:`get_sdl_mixer_version(linked=True) -> (major, minor, patch)`
+
+ :param bool linked: if ``True`` (default) the linked version number is
+ returned, otherwise the compiled version number is returned
+
+ :returns: the mixer's SDL library version number (linked or compiled
+ depending on the ``linked`` parameter) as a tuple of 3 integers
+ ``(major, minor, patch)``
+ :rtype: tuple
+
+ .. note::
+ The linked and compile version numbers should be the same.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.mixer.get_sdl_mixer_version ##
+
+.. class:: Sound
+
+ | :sl:`Create a new Sound object from a file or buffer object`
+ | :sg:`Sound(filename) -> Sound`
+ | :sg:`Sound(file=filename) -> Sound`
+ | :sg:`Sound(file=pathlib_path) -> Sound`
+ | :sg:`Sound(buffer) -> Sound`
+ | :sg:`Sound(buffer=buffer) -> Sound`
+ | :sg:`Sound(object) -> Sound`
+ | :sg:`Sound(file=object) -> Sound`
+ | :sg:`Sound(array=object) -> Sound`
+
+ Load a new sound buffer from a filename, a python file object or a readable
+ buffer object. Limited resampling will be performed to help the sample match
+ the initialize arguments for the mixer. A Unicode string can only be a file
+ pathname. A bytes object can be either a pathname or a buffer object.
+ Use the 'file' or 'buffer' keywords to avoid ambiguity; otherwise Sound may
+ guess wrong. If the array keyword is used, the object is expected to export
+ a new buffer interface (The object is checked for a buffer interface first.)
+
+ The Sound object represents actual sound sample data. Methods that change
+ the state of the Sound object will the all instances of the Sound playback.
+ A Sound object also exports a new buffer interface.
+
+ The Sound can be loaded from an ``OGG`` audio file or from an uncompressed
+ ``WAV``.
+
+ Note: The buffer will be copied internally, no data will be shared between
+ it and the Sound object.
+
+ For now buffer and array support is consistent with ``sndarray.make_sound``
+ for Numeric arrays, in that sample sign and byte order are ignored. This
+ will change, either by correctly handling sign and byte order, or by raising
+ an exception when different. Also, source samples are truncated to fit the
+ audio sample size. This will not change.
+
+ .. versionadded:: 1.8 ``pygame.mixer.Sound(buffer)``
+ .. versionadded:: 1.9.2
+ :class:`pygame.mixer.Sound` keyword arguments and array interface support
+ .. versionadded:: 2.0.1 pathlib.Path support on Python 3.
+
+ .. method:: play
+
+ | :sl:`begin sound playback`
+ | :sg:`play(loops=0, maxtime=0, fade_ms=0) -> Channel`
+
+ Begin playback of the Sound (i.e., on the computer's speakers) on an
+ available Channel. This will forcibly select a Channel, so playback may
+ cut off a currently playing sound if necessary.
+
+ The loops argument controls how many times the sample will be repeated
+ after being played the first time. A value of 5 means that the sound will
+ be played once, then repeated five times, and so is played a total of six
+ times. The default value (zero) means the Sound is not repeated, and so
+ is only played once. If loops is set to -1 the Sound will loop
+ indefinitely (though you can still call ``stop()`` to stop it).
+
+ The maxtime argument can be used to stop playback after a given number of
+ milliseconds.
+
+ The fade_ms argument will make the sound start playing at 0 volume and
+ fade up to full volume over the time given. The sample may end before the
+ fade-in is complete.
+
+ This returns the Channel object for the channel that was selected.
+
+ .. ## Sound.play ##
+
+ .. method:: stop
+
+ | :sl:`stop sound playback`
+ | :sg:`stop() -> None`
+
+ This will stop the playback of this Sound on any active Channels.
+
+ .. ## Sound.stop ##
+
+ .. method:: fadeout
+
+ | :sl:`stop sound playback after fading out`
+ | :sg:`fadeout(time) -> None`
+
+ This will stop playback of the sound after fading it out over the time
+ argument in milliseconds. The Sound will fade and stop on all actively
+ playing channels.
+
+ .. ## Sound.fadeout ##
+
+ .. method:: set_volume
+
+ | :sl:`set the playback volume for this Sound`
+ | :sg:`set_volume(value) -> None`
+
+ This will set the playback volume (loudness) for this Sound. This will
+ immediately affect the Sound if it is playing. It will also affect any
+ future playback of this Sound.
+
+ :param float value: volume in the range of 0.0 to 1.0 (inclusive)
+
+ | If value < 0.0, the volume will not be changed
+ | If value > 1.0, the volume will be set to 1.0
+
+ .. ## Sound.set_volume ##
+
+ .. method:: get_volume
+
+ | :sl:`get the playback volume`
+ | :sg:`get_volume() -> value`
+
+ Return a value from 0.0 to 1.0 representing the volume for this Sound.
+
+ .. ## Sound.get_volume ##
+
+ .. method:: get_num_channels
+
+ | :sl:`count how many times this Sound is playing`
+ | :sg:`get_num_channels() -> count`
+
+ Return the number of active channels this sound is playing on.
+
+ .. ## Sound.get_num_channels ##
+
+ .. method:: get_length
+
+ | :sl:`get the length of the Sound`
+ | :sg:`get_length() -> seconds`
+
+ Return the length of this Sound in seconds.
+
+ .. ## Sound.get_length ##
+
+ .. method:: get_raw
+
+ | :sl:`return a bytestring copy of the Sound samples.`
+ | :sg:`get_raw() -> bytes`
+
+ Return a copy of the Sound object buffer as a bytes.
+
+ .. versionadded:: 1.9.2
+
+ .. ## Sound.get_raw ##
+
+ .. ## pygame.mixer.Sound ##
+
+.. class:: Channel
+
+ | :sl:`Create a Channel object for controlling playback`
+ | :sg:`Channel(id) -> Channel`
+
+ Return a Channel object for one of the current channels. The id must be a
+ value from 0 to the value of ``pygame.mixer.get_num_channels()``.
+
+ The Channel object can be used to get fine control over the playback of
+ Sounds. A channel can only playback a single Sound at time. Using channels
+ is entirely optional since pygame can manage them by default.
+
+ .. method:: play
+
+ | :sl:`play a Sound on a specific Channel`
+ | :sg:`play(Sound, loops=0, maxtime=0, fade_ms=0) -> None`
+
+ This will begin playback of a Sound on a specific Channel. If the Channel
+ is currently playing any other Sound it will be stopped.
+
+ The loops argument has the same meaning as in ``Sound.play()``: it is the
+ number of times to repeat the sound after the first time. If it is 3, the
+ sound will be played 4 times (the first time, then three more). If loops
+ is -1 then the playback will repeat indefinitely.
+
+ As in ``Sound.play()``, the maxtime argument can be used to stop playback
+ of the Sound after a given number of milliseconds.
+
+ As in ``Sound.play()``, the fade_ms argument can be used fade in the
+ sound.
+
+ .. ## Channel.play ##
+
+ .. method:: stop
+
+ | :sl:`stop playback on a Channel`
+ | :sg:`stop() -> None`
+
+ Stop sound playback on a channel. After playback is stopped the channel
+ becomes available for new Sounds to play on it.
+
+ .. ## Channel.stop ##
+
+ .. method:: pause
+
+ | :sl:`temporarily stop playback of a channel`
+ | :sg:`pause() -> None`
+
+ Temporarily stop the playback of sound on a channel. It can be resumed at
+ a later time with ``Channel.unpause()``
+
+ .. ## Channel.pause ##
+
+ .. method:: unpause
+
+ | :sl:`resume pause playback of a channel`
+ | :sg:`unpause() -> None`
+
+ Resume the playback on a paused channel.
+
+ .. ## Channel.unpause ##
+
+ .. method:: fadeout
+
+ | :sl:`stop playback after fading channel out`
+ | :sg:`fadeout(time) -> None`
+
+ Stop playback of a channel after fading out the sound over the given time
+ argument in milliseconds.
+
+ .. ## Channel.fadeout ##
+
+ .. method:: set_volume
+
+ | :sl:`set the volume of a playing channel`
+ | :sg:`set_volume(value) -> None`
+ | :sg:`set_volume(left, right) -> None`
+
+ Set the volume (loudness) of a playing sound. When a channel starts to
+ play its volume value is reset. This only affects the current sound. The
+ value argument is between 0.0 and 1.0.
+
+ If one argument is passed, it will be the volume of both speakers. If two
+ arguments are passed and the mixer is in stereo mode, the first argument
+ will be the volume of the left speaker and the second will be the volume
+ of the right speaker. (If the second argument is ``None``, the first
+ argument will be the volume of both speakers.)
+
+ If the channel is playing a Sound on which ``set_volume()`` has also been
+ called, both calls are taken into account. For example:
+
+ ::
+
+ sound = pygame.mixer.Sound("s.wav")
+ channel = s.play() # Sound plays at full volume by default
+ sound.set_volume(0.9) # Now plays at 90% of full volume.
+ sound.set_volume(0.6) # Now plays at 60% (previous value replaced).
+ channel.set_volume(0.5) # Now plays at 30% (0.6 * 0.5).
+
+ .. ## Channel.set_volume ##
+
+ .. method:: get_volume
+
+ | :sl:`get the volume of the playing channel`
+ | :sg:`get_volume() -> value`
+
+ Return the volume of the channel for the current playing sound. This does
+ not take into account stereo separation used by
+ :meth:`Channel.set_volume`. The Sound object also has its own volume
+ which is mixed with the channel.
+
+ .. ## Channel.get_volume ##
+
+ .. method:: get_busy
+
+ | :sl:`check if the channel is active`
+ | :sg:`get_busy() -> bool`
+
+ Returns ``True`` if the channel is actively mixing sound. If the channel
+ is idle this returns ``False``.
+
+ .. ## Channel.get_busy ##
+
+ .. method:: get_sound
+
+ | :sl:`get the currently playing Sound`
+ | :sg:`get_sound() -> Sound`
+
+ Return the actual Sound object currently playing on this channel. If the
+ channel is idle ``None`` is returned.
+
+ .. ## Channel.get_sound ##
+
+ .. method:: queue
+
+ | :sl:`queue a Sound object to follow the current`
+ | :sg:`queue(Sound) -> None`
+
+ When a Sound is queued on a Channel, it will begin playing immediately
+ after the current Sound is finished. Each channel can only have a single
+ Sound queued at a time. The queued Sound will only play if the current
+ playback finished automatically. It is cleared on any other call to
+ ``Channel.stop()`` or ``Channel.play()``.
+
+ If there is no sound actively playing on the Channel then the Sound will
+ begin playing immediately.
+
+ .. ## Channel.queue ##
+
+ .. method:: get_queue
+
+ | :sl:`return any Sound that is queued`
+ | :sg:`get_queue() -> Sound`
+
+ If a Sound is already queued on this channel it will be returned. Once
+ the queued sound begins playback it will no longer be on the queue.
+
+ .. ## Channel.get_queue ##
+
+ .. method:: set_endevent
+
+ | :sl:`have the channel send an event when playback stops`
+ | :sg:`set_endevent() -> None`
+ | :sg:`set_endevent(type) -> None`
+
+ When an endevent is set for a channel, it will send an event to the
+ pygame queue every time a sound finishes playing on that channel (not
+ just the first time). Use ``pygame.event.get()`` to retrieve the endevent
+ once it's sent.
+
+ Note that if you called ``Sound.play(n)`` or ``Channel.play(sound,n)``,
+ the end event is sent only once: after the sound has been played "n+1"
+ times (see the documentation of Sound.play).
+
+ If ``Channel.stop()`` or ``Channel.play()`` is called while the sound was
+ still playing, the event will be posted immediately.
+
+ The type argument will be the event id sent to the queue. This can be any
+ valid event type, but a good choice would be a value between
+ ``pygame.locals.USEREVENT`` and ``pygame.locals.NUMEVENTS``. If no type
+ argument is given then the Channel will stop sending endevents.
+
+ .. ## Channel.set_endevent ##
+
+ .. method:: get_endevent
+
+ | :sl:`get the event a channel sends when playback stops`
+ | :sg:`get_endevent() -> type`
+
+ Returns the event type to be sent every time the Channel finishes
+ playback of a Sound. If there is no endevent the function returns
+ ``pygame.NOEVENT``.
+
+ .. ## Channel.get_endevent ##
+
+ .. ## pygame.mixer.Channel ##
+
+.. ## pygame.mixer ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mouse.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mouse.rst.txt
new file mode 100644
index 00000000..dda6c7bd
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/mouse.rst.txt
@@ -0,0 +1,219 @@
+.. include:: common.txt
+
+:mod:`pygame.mouse`
+===================
+
+.. module:: pygame.mouse
+ :synopsis: pygame module to work with the mouse
+
+| :sl:`pygame module to work with the mouse`
+
+The mouse functions can be used to get the current state of the mouse device.
+These functions can also alter the system cursor for the mouse.
+
+When the display mode is set, the event queue will start receiving mouse
+events. The mouse buttons generate ``pygame.MOUSEBUTTONDOWN`` and
+``pygame.MOUSEBUTTONUP`` events when they are pressed and released. These
+events contain a button attribute representing which button was pressed. The
+mouse wheel will generate ``pygame.MOUSEBUTTONDOWN`` and
+``pygame.MOUSEBUTTONUP`` events when rolled. The button will be set to 4
+when the wheel is rolled up, and to button 5 when the wheel is rolled down.
+Whenever the mouse is moved it generates a ``pygame.MOUSEMOTION`` event. The
+mouse movement is broken into small and accurate motion events. As the mouse
+is moving many motion events will be placed on the queue. Mouse motion events
+that are not properly cleaned from the event queue are the primary reason the
+event queue fills up.
+
+If the mouse cursor is hidden, and input is grabbed to the current display the
+mouse will enter a virtual input mode, where the relative movements of the
+mouse will never be stopped by the borders of the screen. See the functions
+``pygame.mouse.set_visible()`` and ``pygame.event.set_grab()`` to get this
+configured.
+
+
+**Mouse Wheel Behavior in pygame 2**
+
+There is proper functionality for mouse wheel behaviour with pygame 2 supporting
+``pygame.MOUSEWHEEL`` events. The new events support horizontal and vertical
+scroll movements, with signed integer values representing the amount scrolled
+(``x`` and ``y``), as well as ``flipped`` direction (the set positive and
+negative values for each axis is flipped). Read more about SDL2
+input-related changes here ``_
+
+In pygame 2, the mouse wheel functionality can be used by listening for the
+``pygame.MOUSEWHEEL`` type of an event (Bear in mind they still emit
+``pygame.MOUSEBUTTONDOWN`` events like in pygame 1.x, as well).
+When this event is triggered, a developer can access the appropriate ``Event`` object
+with ``pygame.event.get()``. The object can be used to access data about the mouse
+scroll, such as ``which`` (it will tell you what exact mouse device trigger the event).
+
+.. code-block:: python
+ :caption: Code example of mouse scroll (tested on 2.0.0.dev7)
+ :name: test.py
+
+ # Taken from husano896's PR thread (slightly modified)
+ import pygame
+ from pygame.locals import *
+ pygame.init()
+ screen = pygame.display.set_mode((640, 480))
+ clock = pygame.time.Clock()
+
+ def main():
+ while True:
+ for event in pygame.event.get():
+ if event.type == QUIT:
+ pygame.quit()
+ return
+ elif event.type == MOUSEWHEEL:
+ print(event)
+ print(event.x, event.y)
+ print(event.flipped)
+ print(event.which)
+ # can access properties with
+ # proper notation(ex: event.y)
+ clock.tick(60)
+
+ # Execute game:
+ main()
+
+.. function:: get_pressed
+
+ | :sl:`get the state of the mouse buttons`
+ | :sg:`get_pressed(num_buttons=3) -> (button1, button2, button3)`
+ | :sg:`get_pressed(num_buttons=5) -> (button1, button2, button3, button4, button5)`
+
+ Returns a sequence of booleans representing the state of all the mouse
+ buttons. A true value means the mouse is currently being pressed at the time
+ of the call.
+
+ Note, to get all of the mouse events it is better to use either
+ ``pygame.event.wait()`` or ``pygame.event.get()`` and check all of those
+ events to see if they are ``MOUSEBUTTONDOWN``, ``MOUSEBUTTONUP``, or
+ ``MOUSEMOTION``.
+
+ Note, that on ``X11`` some X servers use middle button emulation. When you
+ click both buttons ``1`` and ``3`` at the same time a ``2`` button event
+ can be emitted.
+
+ Note, remember to call ``pygame.event.get()`` before this function.
+ Otherwise it will not work as expected.
+
+ To support five button mice, an optional parameter ``num_buttons`` has been
+ added in pygame 2. When this is set to ``5``, ``button4`` and ``button5``
+ are added to the returned tuple. Only ``3`` and ``5`` are valid values
+ for this parameter.
+
+ .. versionchanged:: 2.0.0 ``num_buttons`` argument added
+
+ .. ## pygame.mouse.get_pressed ##
+
+.. function:: get_pos
+
+ | :sl:`get the mouse cursor position`
+ | :sg:`get_pos() -> (x, y)`
+
+ Returns the ``x`` and ``y`` position of the mouse cursor. The position is
+ relative to the top-left corner of the display. The cursor position can be
+ located outside of the display window, but is always constrained to the
+ screen.
+
+ .. ## pygame.mouse.get_pos ##
+
+.. function:: get_rel
+
+ | :sl:`get the amount of mouse movement`
+ | :sg:`get_rel() -> (x, y)`
+
+ Returns the amount of movement in ``x`` and ``y`` since the previous call to
+ this function. The relative movement of the mouse cursor is constrained to
+ the edges of the screen, but see the virtual input mouse mode for a way
+ around this. Virtual input mode is described at the top of the page.
+
+ .. ## pygame.mouse.get_rel ##
+
+.. function:: set_pos
+
+ | :sl:`set the mouse cursor position`
+ | :sg:`set_pos([x, y]) -> None`
+
+ Set the current mouse position to arguments given. If the mouse cursor is
+ visible it will jump to the new coordinates. Moving the mouse will generate
+ a new ``pygame.MOUSEMOTION`` event.
+
+ .. ## pygame.mouse.set_pos ##
+
+.. function:: set_visible
+
+ | :sl:`hide or show the mouse cursor`
+ | :sg:`set_visible(bool) -> bool`
+
+ If the bool argument is true, the mouse cursor will be visible. This will
+ return the previous visible state of the cursor.
+
+ .. ## pygame.mouse.set_visible ##
+
+.. function:: get_visible
+
+ | :sl:`get the current visibility state of the mouse cursor`
+ | :sg:`get_visible() -> bool`
+
+ Get the current visibility state of the mouse cursor. ``True`` if the mouse is
+ visible, ``False`` otherwise.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.mouse.get_visible ##
+
+.. function:: get_focused
+
+ | :sl:`check if the display is receiving mouse input`
+ | :sg:`get_focused() -> bool`
+
+ Returns true when pygame is receiving mouse input events (or, in windowing
+ terminology, is "active" or has the "focus").
+
+ This method is most useful when working in a window. By contrast, in
+ full-screen mode, this method always returns true.
+
+ Note: under ``MS`` Windows, the window that has the mouse focus also has the
+ keyboard focus. But under X-Windows, one window can receive mouse events and
+ another receive keyboard events. ``pygame.mouse.get_focused()`` indicates
+ whether the pygame window receives mouse events.
+
+ .. ## pygame.mouse.get_focused ##
+
+.. function:: set_cursor
+
+ | :sl:`set the mouse cursor to a new cursor`
+ | :sg:`set_cursor(pygame.cursors.Cursor) -> None`
+ | :sg:`set_cursor(size, hotspot, xormasks, andmasks) -> None`
+ | :sg:`set_cursor(hotspot, surface) -> None`
+ | :sg:`set_cursor(constant) -> None`
+
+ Set the mouse cursor to something new. This function accepts either an explicit
+ ``Cursor`` object or arguments to create a ``Cursor`` object.
+
+ See :class:`pygame.cursors.Cursor` for help creating cursors and for examples.
+
+ .. versionchanged:: 2.0.1
+
+ .. ## pygame.mouse.set_cursor ##
+
+
+.. function:: get_cursor
+
+ | :sl:`get the current mouse cursor`
+ | :sg:`get_cursor() -> pygame.cursors.Cursor`
+
+ Get the information about the mouse system cursor. The return value contains
+ the same data as the arguments passed into :func:`pygame.mouse.set_cursor()`.
+
+ .. note:: Code that unpacked a get_cursor() call into
+ ``size, hotspot, xormasks, andmasks`` will still work,
+ assuming the call returns an old school type cursor.
+
+ .. versionchanged:: 2.0.1
+
+ .. ## pygame.mouse.get_cursor ##
+
+.. ## pygame.mouse ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/music.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/music.rst.txt
new file mode 100644
index 00000000..96a7b815
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/music.rst.txt
@@ -0,0 +1,274 @@
+.. include:: common.txt
+
+:mod:`pygame.mixer.music`
+=========================
+
+.. module:: pygame.mixer.music
+ :synopsis: pygame module for controlling streamed audio
+
+| :sl:`pygame module for controlling streamed audio`
+
+The music module is closely tied to :mod:`pygame.mixer`. Use the music module
+to control the playback of music in the sound mixer.
+
+The difference between the music playback and regular Sound playback is that
+the music is streamed, and never actually loaded all at once. The mixer system
+only supports a single music stream at once.
+
+On older pygame versions, ``MP3`` support was limited under Mac and Linux. This
+changed in pygame ``v2.0.2`` which got improved MP3 support. Consider using
+``OGG`` file format for music as that can give slightly better compression than
+MP3 in most cases.
+
+.. function:: load
+
+ | :sl:`Load a music file for playback`
+ | :sg:`load(filename) -> None`
+ | :sg:`load(fileobj, namehint="") -> None`
+
+ This will load a music filename/file object and prepare it for playback. If
+ a music stream is already playing it will be stopped. This does not start
+ the music playing.
+
+ If you are loading from a file object, the namehint parameter can be used to specify
+ the type of music data in the object. For example: :code:`load(fileobj, "ogg")`.
+
+ .. versionchanged:: 2.0.2 Added optional ``namehint`` argument
+
+ .. ## pygame.mixer.music.load ##
+
+.. function:: unload
+
+ | :sl:`Unload the currently loaded music to free up resources`
+ | :sg:`unload() -> None`
+
+ This closes resources like files for any music that may be loaded.
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.mixer.music.load ##
+
+
+.. function:: play
+
+ | :sl:`Start the playback of the music stream`
+ | :sg:`play(loops=0, start=0.0, fade_ms=0) -> None`
+
+ This will play the loaded music stream. If the music is already playing it
+ will be restarted.
+
+ ``loops`` is an optional integer argument, which is ``0`` by default, which
+ indicates how many times to repeat the music. The music repeats indefinitely if
+ this argument is set to ``-1``.
+
+ ``start`` is an optional float argument, which is ``0.0`` by default, which
+ denotes the position in time from which the music starts playing. The starting
+ position depends on the format of the music played. ``MP3`` and ``OGG`` use
+ the position as time in seconds. For ``MP3`` files the start time position
+ selected may not be accurate as things like variable bit rate encoding and ID3
+ tags can throw off the timing calculations. For ``MOD`` music it is the pattern
+ order number. Passing a start position will raise a NotImplementedError if
+ the start position cannot be set.
+
+ ``fade_ms`` is an optional integer argument, which is ``0`` by default,
+ which denotes the period of time (in milliseconds) over which the music
+ will fade up from volume level ``0.0`` to full volume (or the volume level
+ previously set by :func:`set_volume`). The sample may end before the fade-in
+ is complete. If the music is already streaming ``fade_ms`` is ignored.
+
+ .. versionchanged:: 2.0.0 Added optional ``fade_ms`` argument
+
+ .. ## pygame.mixer.music.play ##
+
+.. function:: rewind
+
+ | :sl:`restart music`
+ | :sg:`rewind() -> None`
+
+ Resets playback of the current music to the beginning. If :func:`pause` has
+ previously been used to pause the music, the music will remain paused.
+
+ .. note:: :func:`rewind` supports a limited number of file types and notably
+ ``WAV`` files are NOT supported. For unsupported file types use :func:`play`
+ which will restart the music that's already playing (note that this
+ will start the music playing again even if previously paused).
+
+ .. ## pygame.mixer.music.rewind ##
+
+.. function:: stop
+
+ | :sl:`stop the music playback`
+ | :sg:`stop() -> None`
+
+ Stops the music playback if it is currently playing.
+ endevent will be triggered, if set.
+ It won't unload the music.
+
+ .. ## pygame.mixer.music.stop ##
+
+.. function:: pause
+
+ | :sl:`temporarily stop music playback`
+ | :sg:`pause() -> None`
+
+ Temporarily stop playback of the music stream. It can be resumed with the
+ :func:`unpause` function.
+
+ .. ## pygame.mixer.music.pause ##
+
+.. function:: unpause
+
+ | :sl:`resume paused music`
+ | :sg:`unpause() -> None`
+
+ This will resume the playback of a music stream after it has been paused.
+
+ .. ## pygame.mixer.music.unpause ##
+
+.. function:: fadeout
+
+ | :sl:`stop music playback after fading out`
+ | :sg:`fadeout(time) -> None`
+
+ Fade out and stop the currently playing music.
+
+ The ``time`` argument denotes the integer milliseconds for which the
+ fading effect is generated.
+
+ Note, that this function blocks until the music has faded out. Calls
+ to :func:`fadeout` and :func:`set_volume` will have no effect during
+ this time. If an event was set using :func:`set_endevent` it will be
+ called after the music has faded.
+
+ .. ## pygame.mixer.music.fadeout ##
+
+.. function:: set_volume
+
+ | :sl:`set the music volume`
+ | :sg:`set_volume(volume) -> None`
+
+ Set the volume of the music playback.
+
+ The ``volume`` argument is a float between ``0.0`` and ``1.0`` that sets
+ the volume level. When new music is loaded the volume is reset to full
+ volume. If ``volume`` is a negative value it will be ignored and the
+ volume will remain set at the current level. If the ``volume`` argument
+ is greater than ``1.0``, the volume will be set to ``1.0``.
+
+ .. ## pygame.mixer.music.set_volume ##
+
+.. function:: get_volume
+
+ | :sl:`get the music volume`
+ | :sg:`get_volume() -> value`
+
+ Returns the current volume for the mixer. The value will be between ``0.0``
+ and ``1.0``.
+
+ .. ## pygame.mixer.music.get_volume ##
+
+.. function:: get_busy
+
+ | :sl:`check if the music stream is playing`
+ | :sg:`get_busy() -> bool`
+
+ Returns True when the music stream is actively playing. When the music is
+ idle this returns False. In pygame 2.0.1 and above this function returns
+ False when the music is paused. In pygame 1 it returns True when the music
+ is paused.
+
+ .. versionchanged:: 2.0.1 Returns False when music paused.
+
+ .. ## pygame.mixer.music.get_busy ##
+
+.. function:: set_pos
+
+ | :sl:`set position to play from`
+ | :sg:`set_pos(pos) -> None`
+
+ This sets the position in the music file where playback will start.
+ The meaning of "pos", a float (or a number that can be converted to a float),
+ depends on the music format.
+
+ For ``MOD`` files, pos is the integer pattern number in the module.
+ For ``OGG`` it is the absolute position, in seconds, from
+ the beginning of the sound. For ``MP3`` files, it is the relative position,
+ in seconds, from the current position. For absolute positioning in an ``MP3``
+ file, first call :func:`rewind`.
+
+ Other file formats are unsupported. Newer versions of SDL_mixer have
+ better positioning support than earlier ones. An SDLError is raised if a
+ particular format does not support positioning.
+
+ Function :func:`set_pos` calls underlining SDL_mixer function
+ ``Mix_SetMusicPosition``.
+
+ .. versionadded:: 1.9.2
+
+ .. ## pygame.mixer.music.set_pos ##
+
+.. function:: get_pos
+
+ | :sl:`get the music play time`
+ | :sg:`get_pos() -> time`
+
+ This gets the number of milliseconds that the music has been playing for.
+ The returned time only represents how long the music has been playing; it
+ does not take into account any starting position offsets.
+
+ .. ## pygame.mixer.music.get_pos ##
+
+.. function:: queue
+
+ | :sl:`queue a sound file to follow the current`
+ | :sg:`queue(filename) -> None`
+ | :sg:`queue(fileobj, namehint="", loops=0) -> None`
+
+ This will load a sound file and queue it. A queued sound file will begin as
+ soon as the current sound naturally ends. Only one sound can be queued at a
+ time. Queuing a new sound while another sound is queued will result in the
+ new sound becoming the queued sound. Also, if the current sound is ever
+ stopped or changed, the queued sound will be lost.
+
+ If you are loading from a file object, the namehint parameter can be used to specify
+ the type of music data in the object. For example: :code:`queue(fileobj, "ogg")`.
+
+ The following example will play music by Bach six times, then play music by
+ Mozart once:
+
+ ::
+
+ pygame.mixer.music.load('bach.ogg')
+ pygame.mixer.music.play(5) # Plays six times, not five!
+ pygame.mixer.music.queue('mozart.ogg')
+
+ .. versionchanged:: 2.0.2 Added optional ``namehint`` argument
+
+ .. ## pygame.mixer.music.queue ##
+
+.. function:: set_endevent
+
+ | :sl:`have the music send an event when playback stops`
+ | :sg:`set_endevent() -> None`
+ | :sg:`set_endevent(type) -> None`
+
+ This causes pygame to signal (by means of the event queue) when the music is
+ done playing. The argument determines the type of event that will be queued.
+
+ The event will be queued every time the music finishes, not just the first
+ time. To stop the event from being queued, call this method with no
+ argument.
+
+ .. ## pygame.mixer.music.set_endevent ##
+
+.. function:: get_endevent
+
+ | :sl:`get the event a channel sends when playback stops`
+ | :sg:`get_endevent() -> type`
+
+ Returns the event type to be sent every time the music finishes playback. If
+ there is no endevent the function returns ``pygame.NOEVENT``.
+
+ .. ## pygame.mixer.music.get_endevent ##
+
+.. ## pygame.mixer.music ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/overlay.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/overlay.rst.txt
new file mode 100644
index 00000000..04ff9ae1
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/overlay.rst.txt
@@ -0,0 +1,79 @@
+.. include:: common.txt
+
+:mod:`pygame.Overlay`
+=====================
+
+.. currentmodule:: pygame
+
+.. warning::
+ This module is non functional in pygame 2.0 and above, unless you have manually compiled pygame with SDL1.
+ This module will not be supported in the future.
+
+.. class:: Overlay
+
+ | :sl:`pygame object for video overlay graphics`
+ | :sg:`Overlay(format, (width, height)) -> Overlay`
+
+ The Overlay objects provide support for accessing hardware video overlays.
+ Video overlays do not use standard ``RGB`` pixel formats, and can use
+ multiple resolutions of data to create a single image.
+
+ The Overlay objects represent lower level access to the display hardware. To
+ use the object you must understand the technical details of video overlays.
+
+ The Overlay format determines the type of pixel data used. Not all hardware
+ will support all types of overlay formats. Here is a list of available
+ format types:
+
+ ::
+
+ YV12_OVERLAY, IYUV_OVERLAY, YUY2_OVERLAY, UYVY_OVERLAY, YVYU_OVERLAY
+
+ The width and height arguments control the size for the overlay image data.
+ The overlay image can be displayed at any size, not just the resolution of
+ the overlay.
+
+ The overlay objects are always visible, and always show above the regular
+ display contents.
+
+ .. method:: display
+
+ | :sl:`set the overlay pixel data`
+ | :sg:`display((y, u, v)) -> None`
+ | :sg:`display() -> None`
+
+ Display the YUV data in SDL's overlay planes. The y, u, and v arguments
+ are strings of binary data. The data must be in the correct format used
+ to create the Overlay.
+
+ If no argument is passed in, the Overlay will simply be redrawn with the
+ current data. This can be useful when the Overlay is not really hardware
+ accelerated.
+
+ The strings are not validated, and improperly sized strings could crash
+ the program.
+
+ .. ## Overlay.display ##
+
+ .. method:: set_location
+
+ | :sl:`control where the overlay is displayed`
+ | :sg:`set_location(rect) -> None`
+
+ Set the location for the overlay. The overlay will always be shown
+ relative to the main display Surface. This does not actually redraw the
+ overlay, it will be updated on the next call to ``Overlay.display()``.
+
+ .. ## Overlay.set_location ##
+
+ .. method:: get_hardware
+
+ | :sl:`test if the Overlay is hardware accelerated`
+ | :sg:`get_hardware(rect) -> int`
+
+ Returns a True value when the Overlay is hardware accelerated. If the
+ platform does not support acceleration, software rendering is used.
+
+ .. ## Overlay.get_hardware ##
+
+ .. ## pygame.Overlay ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pixelarray.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pixelarray.rst.txt
new file mode 100644
index 00000000..9bdc38c0
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pixelarray.rst.txt
@@ -0,0 +1,295 @@
+.. include:: common.txt
+
+:class:`pygame.PixelArray`
+==========================
+
+.. currentmodule:: pygame
+
+.. class:: PixelArray
+
+ | :sl:`pygame object for direct pixel access of surfaces`
+ | :sg:`PixelArray(Surface) -> PixelArray`
+
+ The PixelArray wraps a Surface and provides direct access to the
+ surface's pixels. A pixel array can be one or two dimensional.
+ A two dimensional array, like its surface, is indexed [column, row].
+ Pixel arrays support slicing, both for returning a subarray or
+ for assignment. A pixel array sliced on a single column or row
+ returns a one dimensional pixel array. Arithmetic and other operations
+ are not supported. A pixel array can be safely assigned to itself.
+ Finally, pixel arrays export an array struct interface, allowing
+ them to interact with :mod:`pygame.pixelcopy` methods and NumPy
+ arrays.
+
+ A PixelArray pixel item can be assigned a raw integer values, a
+ :class:`pygame.Color` instance, or a (r, g, b[, a]) tuple.
+
+ ::
+
+ pxarray[x, y] = 0xFF00FF
+ pxarray[x, y] = pygame.Color(255, 0, 255)
+ pxarray[x, y] = (255, 0, 255)
+
+ However, only a pixel's integer value is returned. So, to compare a pixel
+ to a particular color the color needs to be first mapped using
+ the :meth:`Surface.map_rgb()` method of the Surface object for which the
+ PixelArray was created.
+
+ ::
+
+ pxarray = pygame.PixelArray(surface)
+ # Check, if the first pixel at the topleft corner is blue
+ if pxarray[0, 0] == surface.map_rgb((0, 0, 255)):
+ ...
+
+ When assigning to a range of of pixels, a non tuple sequence of colors or
+ a PixelArray can be used as the value. For a sequence, the length must
+ match the PixelArray width.
+
+ ::
+
+ pxarray[a:b] = 0xFF00FF # set all pixels to 0xFF00FF
+ pxarray[a:b] = (0xFF00FF, 0xAACCEE, ... ) # first pixel = 0xFF00FF,
+ # second pixel = 0xAACCEE, ...
+ pxarray[a:b] = [(255, 0, 255), (170, 204, 238), ...] # same as above
+ pxarray[a:b] = [(255, 0, 255), 0xAACCEE, ...] # same as above
+ pxarray[a:b] = otherarray[x:y] # slice sizes must match
+
+ For PixelArray assignment, if the right hand side array has a row length
+ of 1, then the column is broadcast over the target array's rows. An
+ array of height 1 is broadcast over the target's columns, and is equivalent
+ to assigning a 1D PixelArray.
+
+ Subscript slices can also be used to assign to a rectangular subview of
+ the target PixelArray.
+
+ ::
+
+ # Create some new PixelArray objects providing a different view
+ # of the original array/surface.
+ newarray = pxarray[2:4, 3:5]
+ otherarray = pxarray[::2, ::2]
+
+ Subscript slices can also be used to do fast rectangular pixel manipulations
+ instead of iterating over the x or y axis. The
+
+ ::
+
+ pxarray[::2, :] = (0, 0, 0) # Make even columns black.
+ pxarray[::2] = (0, 0, 0) # Same as [::2, :]
+
+ During its lifetime, the PixelArray locks the surface, thus you explicitly
+ have to close() it once its not used any more and the surface should perform
+ operations in the same scope. It is best to use it as a context manager
+ using the with PixelArray(surf) as pixel_array: style. So it works on pypy too.
+
+ A simple ``:`` slice index for the column can be omitted.
+
+ ::
+
+ pxarray[::2, ...] = (0, 0, 0) # Same as pxarray[::2, :]
+ pxarray[...] = (255, 0, 0) # Same as pxarray[:]
+
+ A note about PixelArray to PixelArray assignment, for arrays with an
+ item size of 3 (created from 24 bit surfaces) pixel values are translated
+ from the source to the destinations format. The red, green, and blue
+ color elements of each pixel are shifted to match the format of the
+ target surface. For all other pixel sizes no such remapping occurs.
+ This should change in later pygame releases, where format conversions
+ are performed for all pixel sizes. To avoid code breakage when full mapped
+ copying is implemented it is suggested PixelArray to PixelArray copies be
+ only between surfaces of identical format.
+
+ .. versionadded:: 1.9.4
+
+ - close() method was added. For explicitly cleaning up.
+ - being able to use PixelArray as a context manager for cleanup.
+ - both of these are useful for when working without reference counting (pypy).
+
+ .. versionadded:: 1.9.2
+
+ - array struct interface
+ - transpose method
+ - broadcasting for a length 1 dimension
+
+ .. versionchanged:: 1.9.2
+
+ - A 2D PixelArray can have a length 1 dimension.
+ Only an integer index on a 2D PixelArray returns a 1D array.
+ - For assignment, a tuple can only be a color. Any other sequence type
+ is a sequence of colors.
+
+
+ .. versionadded: 1.8.0
+ Subscript support
+
+ .. versionadded: 1.8.1
+ Methods :meth:`make_surface`, :meth:`replace`, :meth:`extract`, and
+ :meth:`compare`
+
+ .. versionadded: 1.9.2
+ Properties :attr:`itemsize`, :attr:`ndim`, :attr:`shape`,
+ and :attr:`strides`
+
+ .. versionadded: 1.9.2
+ Array struct interface
+
+ .. versionadded: 1.9.4
+ Methods :meth:`close`
+
+ .. attribute:: surface
+
+ | :sl:`Gets the Surface the PixelArray uses.`
+ | :sg:`surface -> Surface`
+
+ The Surface the PixelArray was created for.
+
+ .. ## PixelArray.surface ##
+
+ .. attribute:: itemsize
+
+ | :sl:`Returns the byte size of a pixel array item`
+ | :sg:`itemsize -> int`
+
+ This is the same as :meth:`Surface.get_bytesize` for the
+ pixel array's surface.
+
+ .. versionadded:: 1.9.2
+
+ .. attribute:: ndim
+
+ | :sl:`Returns the number of dimensions.`
+ | :sg:`ndim -> int`
+
+ A pixel array can be 1 or 2 dimensional.
+
+ .. versionadded:: 1.9.2
+
+ .. attribute:: shape
+
+ | :sl:`Returns the array size.`
+ | :sg:`shape -> tuple of int's`
+
+ A tuple or length :attr:`ndim` giving the length of each
+ dimension. Analogous to :meth:`Surface.get_size`.
+
+ .. versionadded:: 1.9.2
+
+ .. attribute:: strides
+
+ | :sl:`Returns byte offsets for each array dimension.`
+ | :sg:`strides -> tuple of int's`
+
+ A tuple or length :attr:`ndim` byte counts. When a stride is
+ multiplied by the corresponding index it gives the offset
+ of that index from the start of the array. A stride is negative
+ for an array that has is inverted (has a negative step).
+
+ .. versionadded:: 1.9.2
+
+ .. method:: make_surface
+
+ | :sl:`Creates a new Surface from the current PixelArray.`
+ | :sg:`make_surface() -> Surface`
+
+ Creates a new Surface from the current PixelArray. Depending on the
+ current PixelArray the size, pixel order etc. will be different from the
+ original Surface.
+
+ ::
+
+ # Create a new surface flipped around the vertical axis.
+ sf = pxarray[:,::-1].make_surface ()
+
+ .. versionadded:: 1.8.1
+
+ .. ## PixelArray.make_surface ##
+
+ .. method:: replace
+
+ | :sl:`Replaces the passed color in the PixelArray with another one.`
+ | :sg:`replace(color, repcolor, distance=0, weights=(0.299, 0.587, 0.114)) -> None`
+
+ Replaces the pixels with the passed color in the PixelArray by changing
+ them them to the passed replacement color.
+
+ It uses a simple weighted Euclidean distance formula to calculate the
+ distance between the colors. The distance space ranges from 0.0 to 1.0
+ and is used as threshold for the color detection. This causes the
+ replacement to take pixels with a similar, but not exactly identical
+ color, into account as well.
+
+ This is an in place operation that directly affects the pixels of the
+ PixelArray.
+
+ .. versionadded:: 1.8.1
+
+ .. ## PixelArray.replace ##
+
+ .. method:: extract
+
+ | :sl:`Extracts the passed color from the PixelArray.`
+ | :sg:`extract(color, distance=0, weights=(0.299, 0.587, 0.114)) -> PixelArray`
+
+ Extracts the passed color by changing all matching pixels to white, while
+ non-matching pixels are changed to black. This returns a new PixelArray
+ with the black/white color mask.
+
+ It uses a simple weighted Euclidean distance formula to calculate the
+ distance between the colors. The distance space ranges from 0.0 to 1.0
+ and is used as threshold for the color detection. This causes the
+ extraction to take pixels with a similar, but not exactly identical
+ color, into account as well.
+
+ .. versionadded:: 1.8.1
+
+ .. ## PixelArray.extract ##
+
+ .. method:: compare
+
+ | :sl:`Compares the PixelArray with another one.`
+ | :sg:`compare(array, distance=0, weights=(0.299, 0.587, 0.114)) -> PixelArray`
+
+ Compares the contents of the PixelArray with those from the passed in
+ PixelArray. It returns a new PixelArray with a black/white color mask
+ that indicates the differences (black) of both arrays. Both PixelArray
+ objects must have identical bit depths and dimensions.
+
+ It uses a simple weighted Euclidean distance formula to calculate the
+ distance between the colors. The distance space ranges from 0.0 to 1.0
+ and is used as a threshold for the color detection. This causes the
+ comparison to mark pixels with a similar, but not exactly identical
+ color, as white.
+
+ .. versionadded:: 1.8.1
+
+ .. ## PixelArray.compare ##
+
+ .. method:: transpose
+
+ | :sl:`Exchanges the x and y axis.`
+ | :sg:`transpose() -> PixelArray`
+
+ This method returns a new view of the pixel array with the rows and
+ columns swapped. So for a (w, h) sized array a (h, w) slice is returned.
+ If an array is one dimensional, then a length 1 x dimension is added,
+ resulting in a 2D pixel array.
+
+ .. versionadded:: 1.9.2
+
+ .. ## PixelArray.transpose ##
+
+ .. method:: close
+
+ | :sl:`Closes the PixelArray, and releases Surface lock.`
+ | :sg:`close() -> PixelArray`
+
+ This method is for explicitly closing the PixelArray, and releasing
+ a lock on the Surface.
+
+ .. versionadded:: 1.9.4
+
+ .. ## PixelArray.close ##
+
+
+ .. ## pygame.PixelArray ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pixelcopy.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pixelcopy.rst.txt
new file mode 100644
index 00000000..dd8ecf73
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pixelcopy.rst.txt
@@ -0,0 +1,104 @@
+.. include:: common.txt
+
+:mod:`pygame.pixelcopy`
+=======================
+
+.. module:: pygame.pixelcopy
+ :synopsis: pygame module for general pixel array copying
+
+| :sl:`pygame module for general pixel array copying`
+
+The ``pygame.pixelcopy`` module contains functions for copying between
+surfaces and objects exporting an array structure interface. It is a backend
+for :mod:`pygame.surfarray`, adding NumPy support. But pixelcopy is more
+general, and intended for direct use.
+
+The array struct interface exposes an array's data in a standard way.
+It was introduced in NumPy. In Python 2.7 and above it is replaced by the
+new buffer protocol, though the buffer protocol is still a work in progress.
+The array struct interface, on the other hand, is stable and works with earlier
+Python versions. So for now the array struct interface is the predominate way
+pygame handles array introspection.
+
+For 2d arrays of integer pixel values, the values are mapped to the
+pixel format of the related surface. To get the actual color of a pixel
+value use :meth:`pygame.Surface.unmap_rgb`. 2d arrays can only be used
+directly between surfaces having the same pixel layout.
+
+New in pygame 1.9.2.
+
+.. function:: surface_to_array
+
+ | :sl:`copy surface pixels to an array object`
+ | :sg:`surface_to_array(array, surface, kind='P', opaque=255, clear=0) -> None`
+
+ The surface_to_array function copies pixels from a Surface object
+ to a 2D or 3D array. Depending on argument ``kind`` and the target array
+ dimension, a copy may be raw pixel value, RGB, a color component slice,
+ or colorkey alpha transparency value. Recognized ``kind`` values are the
+ single character codes 'P', 'R', 'G', 'B', 'A', and 'C'. Kind codes are case
+ insensitive, so 'p' is equivalent to 'P'. The first two dimensions
+ of the target must be the surface size (w, h).
+
+ The default 'P' kind code does a direct raw integer pixel (mapped) value
+ copy to a 2D array and a 'RGB' pixel component (unmapped) copy to a 3D array
+ having shape (w, h, 3). For an 8 bit colormap surface this means the
+ table index is copied to a 2D array, not the table value itself. A 2D
+ array's item size must be at least as large as the surface's pixel
+ byte size. The item size of a 3D array must be at least one byte.
+
+ For the 'R', 'G', 'B', and 'A' copy kinds a single color component
+ of the unmapped surface pixels are copied to the target 2D array.
+ For kind 'A' and surfaces with source alpha (the surface was created with
+ the SRCALPHA flag), has a colorkey
+ (set with :meth:`Surface.set_colorkey() `),
+ or has a blanket alpha
+ (set with :meth:`Surface.set_alpha() `)
+ then the alpha values are those expected for a SDL surface.
+ If a surface has no explicit alpha value, then the target array
+ is filled with the value of the optional ``opaque`` surface_to_array
+ argument (default 255: not transparent).
+
+ Copy kind 'C' is a special case for alpha copy of a source surface
+ with colorkey. Unlike the 'A' color component copy, the ``clear``
+ argument value is used for colorkey matches, ``opaque`` otherwise.
+ By default, a match has alpha 0 (totally transparent), while everything
+ else is alpha 255 (totally opaque). It is a more general implementation
+ of :meth:`pygame.surfarray.array_colorkey`.
+
+ Specific to surface_to_array, a ValueError is raised for target arrays
+ with incorrect shape or item size. A TypeError is raised for an incorrect
+ kind code. Surface specific problems, such as locking, raise a pygame.error.
+
+ .. ## pygame.pixelcopy.surface_to_array ##
+
+.. function:: array_to_surface
+
+ | :sl:`copy an array object to a surface`
+ | :sg:`array_to_surface(, ) -> None`
+
+ See :func:`pygame.surfarray.blit_array`.
+
+ .. ## pygame.pixelcopy.array_to_surface ##
+
+.. function:: map_array
+
+ | :sl:`copy an array to another array, using surface format`
+ | :sg:`map_array(, , ) -> None`
+
+ Map an array of color element values - (w, h, ..., 3) - to an array of
+ pixels - (w, h) according to the format of .
+
+ .. ## pygame.pixelcopy.map_array ##
+
+.. function:: make_surface
+
+ | :sl:`Copy an array to a new surface`
+ | :sg:`pygame.pixelcopy.make_surface(array) -> Surface`
+
+ Create a new Surface that best resembles the data and format of the array.
+ The array can be 2D or 3D with any sized integer values.
+
+ .. ## pygame.pixelcopy.make_surface ##
+
+.. ## pygame.pixelcopy ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pygame.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pygame.rst.txt
new file mode 100644
index 00000000..280831a3
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/pygame.rst.txt
@@ -0,0 +1,505 @@
+.. include:: common.txt
+
+:mod:`pygame`
+=============
+
+.. module:: pygame
+ :synopsis: the top level pygame package
+
+| :sl:`the top level pygame package`
+
+The pygame package represents the top-level package for others to use. Pygame
+itself is broken into many submodules, but this does not affect programs that
+use pygame.
+
+As a convenience, most of the top-level variables in pygame have been placed
+inside a module named :mod:`pygame.locals`. This is meant to be used with
+``from pygame.locals import *``, in addition to ``import pygame``.
+
+When you ``import pygame`` all available pygame submodules are automatically
+imported. Be aware that some of the pygame modules are considered *optional*,
+and may not be available. In that case, pygame will provide a placeholder
+object instead of the module, which can be used to test for availability.
+
+.. function:: init
+
+ | :sl:`initialize all imported pygame modules`
+ | :sg:`init() -> (numpass, numfail)`
+
+ Initialize all imported pygame modules. No exceptions will be raised if a
+ module fails, but the total number if successful and failed inits will be
+ returned as a tuple. You can always initialize individual modules manually,
+ but :func:`pygame.init` is a convenient way to get everything started. The
+ ``init()`` functions for individual modules will raise exceptions when they
+ fail.
+
+ You may want to initialize the different modules separately to speed up your
+ program or to not use modules your game does not require.
+
+ It is safe to call this ``init()`` more than once as repeated calls will have
+ no effect. This is true even if you have ``pygame.quit()`` all the modules.
+
+ .. ## pygame.init ##
+
+.. function:: quit
+
+ | :sl:`uninitialize all pygame modules`
+ | :sg:`quit() -> None`
+
+ Uninitialize all pygame modules that have previously been initialized. When
+ the Python interpreter shuts down, this method is called regardless, so your
+ program should not need it, except when it wants to terminate its pygame
+ resources and continue. It is safe to call this function more than once as
+ repeated calls have no effect.
+
+ .. note::
+ Calling :func:`pygame.quit` will not exit your program. Consider letting
+ your program end in the same way a normal Python program will end.
+
+ .. ## pygame.quit ##
+
+.. function:: get_init
+
+ | :sl:`returns True if pygame is currently initialized`
+ | :sg:`get_init() -> bool`
+
+ Returns ``True`` if pygame is currently initialized.
+
+ .. versionadded:: 1.9.5
+
+ .. ## pygame.get_init ##
+
+.. exception:: error
+
+ | :sl:`standard pygame exception`
+ | :sg:`raise pygame.error(message)`
+
+ This exception is raised whenever a pygame or SDL operation fails. You
+ can catch any anticipated problems and deal with the error. The exception is
+ always raised with a descriptive message about the problem.
+
+ Derived from the ``RuntimeError`` exception, which can also be used to catch
+ these raised errors.
+
+ .. ## pygame.error ##
+
+.. function:: get_error
+
+ | :sl:`get the current error message`
+ | :sg:`get_error() -> errorstr`
+
+ SDL maintains an internal error message. This message will usually be
+ given to you when :func:`pygame.error` is raised, so this function will
+ rarely be needed.
+
+ .. ## pygame.get_error ##
+
+.. function:: set_error
+
+ | :sl:`set the current error message`
+ | :sg:`set_error(error_msg) -> None`
+
+ SDL maintains an internal error message. This message will usually be
+ given to you when :func:`pygame.error` is raised, so this function will
+ rarely be needed.
+
+ .. ## pygame.set_error ##
+
+.. function:: get_sdl_version
+
+ | :sl:`get the version number of SDL`
+ | :sg:`get_sdl_version(linked=True) -> major, minor, patch`
+
+ Returns the three version numbers of the SDL library. ``linked=True``
+ will cause the function to return the version of the library that pygame
+ is linked against while ``linked=False`` will cause the function to return
+ the version of the library that pygame is compiled against.
+ It can be used to detect which features may or may not be
+ available through pygame.
+
+ .. versionadded:: 1.7.0
+
+ .. versionchanged:: 2.2.0 ``linked`` keyword argument added
+
+ .. ## pygame.get_sdl_version ##
+
+.. function:: get_sdl_byteorder
+
+ | :sl:`get the byte order of SDL`
+ | :sg:`get_sdl_byteorder() -> int`
+
+ Returns the byte order of the SDL library. It returns ``1234`` for little
+ endian byte order and ``4321`` for big endian byte order.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.get_sdl_byteorder ##
+
+.. function:: register_quit
+
+ | :sl:`register a function to be called when pygame quits`
+ | :sg:`register_quit(callable) -> None`
+
+ When :func:`pygame.quit` is called, all registered quit functions are
+ called. Pygame modules do this automatically when they are initializing, so
+ this function will rarely be needed.
+
+ .. ## pygame.register_quit ##
+
+.. function:: encode_string
+
+ | :sl:`Encode a Unicode or bytes object`
+ | :sg:`encode_string([obj [, encoding [, errors [, etype]]]]) -> bytes or None`
+
+ obj: If Unicode, encode; if bytes, return unaltered; if anything else,
+ return ``None``; if not given, raise ``SyntaxError``.
+
+ encoding (string): If present, encoding to use. The default is
+ ``'unicode_escape'``.
+
+ errors (string): If given, how to handle unencodable characters. The default
+ is ``'backslashreplace'``.
+
+ etype (exception type): If given, the exception type to raise for an
+ encoding error. The default is ``UnicodeEncodeError``, as returned by
+ ``PyUnicode_AsEncodedString()``. For the default encoding and errors values
+ there should be no encoding errors.
+
+ This function is used in encoding file paths. Keyword arguments are
+ supported.
+
+ .. versionadded:: 1.9.2 (primarily for use in unit tests)
+
+ .. ## pygame.encode_string ##
+
+.. function:: encode_file_path
+
+ | :sl:`Encode a Unicode or bytes object as a file system path`
+ | :sg:`encode_file_path([obj [, etype]]) -> bytes or None`
+
+ obj: If Unicode, encode; if bytes, return unaltered; if anything else,
+ return ``None``; if not given, raise ``SyntaxError``.
+
+ etype (exception type): If given, the exception type to raise for an
+ encoding error. The default is ``UnicodeEncodeError``, as returned by
+ ``PyUnicode_AsEncodedString()``.
+
+ This function is used to encode file paths in pygame. Encoding is to the
+ codec as returned by ``sys.getfilesystemencoding()``. Keyword arguments are
+ supported.
+
+ .. versionadded:: 1.9.2 (primarily for use in unit tests)
+
+ .. ## pygame.encode_file_path ##
+
+
+:mod:`pygame.version`
+=====================
+
+.. module:: pygame.version
+ :synopsis: small module containing version information
+
+| :sl:`small module containing version information`
+
+This module is automatically imported into the pygame package and can be used to
+check which version of pygame has been imported.
+
+.. data:: ver
+
+ | :sl:`version number as a string`
+ | :sg:`ver = '1.2'`
+
+ This is the version represented as a string. It can contain a micro release
+ number as well, e.g. ``'1.5.2'``
+
+ .. ## pygame.version.ver ##
+
+.. data:: vernum
+
+ | :sl:`tupled integers of the version`
+ | :sg:`vernum = (1, 5, 3)`
+
+ This version information can easily be compared with other version
+ numbers of the same format. An example of checking pygame version numbers
+ would look like this:
+
+ ::
+
+ if pygame.version.vernum < (1, 5):
+ print('Warning, older version of pygame (%s)' % pygame.version.ver)
+ disable_advanced_features = True
+
+ .. versionadded:: 1.9.6 Attributes ``major``, ``minor``, and ``patch``.
+
+ ::
+
+ vernum.major == vernum[0]
+ vernum.minor == vernum[1]
+ vernum.patch == vernum[2]
+
+ .. versionchanged:: 1.9.6
+ ``str(pygame.version.vernum)`` returns a string like ``"2.0.0"`` instead
+ of ``"(2, 0, 0)"``.
+
+ .. versionchanged:: 1.9.6
+ ``repr(pygame.version.vernum)`` returns a string like
+ ``"PygameVersion(major=2, minor=0, patch=0)"`` instead of ``"(2, 0, 0)"``.
+
+ .. ## pygame.version.vernum ##
+
+.. data:: rev
+
+ | :sl:`repository revision of the build`
+ | :sg:`rev = 'a6f89747b551+'`
+
+ The Mercurial node identifier of the repository checkout from which this
+ package was built. If the identifier ends with a plus sign '+' then the
+ package contains uncommitted changes. Please include this revision number
+ in bug reports, especially for non-release pygame builds.
+
+ Important note: pygame development has moved to github, this variable is
+ obsolete now. As soon as development shifted to github, this variable started
+ returning an empty string ``""``.
+ It has always been returning an empty string since ``v1.9.5``.
+
+ .. versionchanged:: 1.9.5
+ Always returns an empty string ``""``.
+
+ .. ## pygame.version.rev ##
+
+.. data:: SDL
+
+ | :sl:`tupled integers of the SDL library version`
+ | :sg:`SDL = '(2, 0, 12)'`
+
+ This is the SDL library version represented as an extended tuple. It also has
+ attributes 'major', 'minor' & 'patch' that can be accessed like this:
+
+ ::
+
+ >>> pygame.version.SDL.major
+ 2
+
+ printing the whole thing returns a string like this:
+
+ ::
+
+ >>> pygame.version.SDL
+ SDLVersion(major=2, minor=0, patch=12)
+
+ .. versionadded:: 2.0.0
+
+ .. ## pygame.version.SDL ##
+
+.. ## pygame.version ##
+
+.. ## pygame ##
+
+.. _environment-variables:
+
+**Setting Environment Variables**
+
+Some aspects of pygame's behaviour can be controlled by setting environment variables, they cover a wide
+range of the library's functionality. Some of the variables are from pygame itself, while others come from
+the underlying C SDL library that pygame uses.
+
+In python, environment variables are usually set in code like this::
+
+ import os
+ os.environ['NAME_OF_ENVIRONMENT_VARIABLE'] = 'value_to_set'
+
+Or to preserve users ability to override the variable::
+
+ import os
+ os.environ['ENV_VAR'] = os.environ.get('ENV_VAR', 'value')
+
+If the variable is more useful for users of an app to set than the developer then they can set it like this:
+
+**Windows**::
+
+ set NAME_OF_ENVIRONMENT_VARIABLE=value_to_set
+ python my_application.py
+
+**Linux/Mac**::
+
+ ENV_VAR=value python my_application.py
+
+For some variables they need to be set before initialising pygame, some must be set before even importing pygame,
+and others can simply be set right before the area of code they control is run.
+
+Below is a list of environment variables, their settable values, and a brief description of what they do.
+
+|
+
+**Pygame Environment Variables**
+
+These variables are defined by pygame itself.
+
+|
+
+::
+
+ PYGAME_DISPLAY - Experimental (subject to change)
+ Set index of the display to use, "0" is the default.
+
+This sets the display where pygame will open its window
+or screen. The value set here will be used if set before
+calling :func:`pygame.display.set_mode()`, and as long as no
+'display' parameter is passed into :func:`pygame.display.set_mode()`.
+
+|
+
+::
+
+ PYGAME_FORCE_SCALE -
+ Set to "photo" or "default".
+
+This forces set_mode() to use the SCALED display mode and,
+if "photo" is set, makes the scaling use the slowest, but
+highest quality anisotropic scaling algorithm, if it is
+available. Must be set before calling :func:`pygame.display.set_mode()`.
+
+|
+
+::
+
+ PYGAME_BLEND_ALPHA_SDL2 - New in pygame 2.0.0
+ Set to "1" to enable the SDL2 blitter.
+
+This makes pygame use the SDL2 blitter for all alpha
+blending. The SDL2 blitter is sometimes faster than
+the default blitter but uses a different formula so
+the final colours may differ. Must be set before
+:func:`pygame.init()` is called.
+
+|
+
+::
+
+ PYGAME_HIDE_SUPPORT_PROMPT -
+ Set to "1" to hide the prompt.
+
+This stops the welcome message popping up in the
+console that tells you which version of python,
+pygame & SDL you are using. Must be set before
+importing pygame.
+
+|
+
+::
+
+ PYGAME_FREETYPE -
+ Set to "1" to enable.
+
+This switches the pygame.font module to a pure
+freetype implementation that bypasses SDL_ttf.
+See the font module for why you might want to
+do this. Must be set before importing pygame.
+
+|
+
+::
+
+ PYGAME_CAMERA -
+ Set to "opencv" or "vidcapture"
+
+Forces the library backend used in the camera
+module, overriding the platform defaults. Must
+be set before calling :func:`pygame.camera.init()`.
+
+In pygame 2.0.3, backends can be set programmatically instead, and the old
+OpenCV backend has been replaced with one on top of "opencv-python," rather
+than the old "highgui" OpenCV port. Also, there is a new native Windows
+backend available.
+
+|
+|
+
+**SDL Environment Variables**
+
+These variables are defined by SDL.
+
+For documentation on the environment variables available in
+pygame 1 try `here
+`__.
+For Pygame 2, some selected environment variables are listed below.
+
+|
+
+::
+
+ SDL_VIDEO_CENTERED -
+ Set to "1" to enable centering the window.
+
+This will make the pygame window open in the centre of the display.
+Must be set before calling :func:`pygame.display.set_mode()`.
+
+|
+
+::
+
+ SDL_VIDEO_WINDOW_POS -
+ Set to "x,y" to position the top left corner of the window.
+
+This allows control over the placement of the pygame window within
+the display. Must be set before calling :func:`pygame.display.set_mode()`.
+
+|
+
+::
+
+ SDL_VIDEODRIVER -
+ Set to "drivername" to change the video driver used.
+
+On some platforms there are multiple video drivers available and
+this allows users to pick between them. More information is available
+`here `__. Must be set before
+calling :func:`pygame.init()` or :func:`pygame.display.init()`.
+
+|
+
+::
+
+ SDL_AUDIODRIVER -
+ Set to "drivername" to change the audio driver used.
+
+On some platforms there are multiple audio drivers available and
+this allows users to pick between them. More information is available
+`here `__. Must be set before
+calling :func:`pygame.init()` or :func:`pygame.mixer.init()`.
+
+|
+
+::
+
+ SDL_VIDEO_ALLOW_SCREENSAVER
+ Set to "1" to allow screensavers while pygame apps are running.
+
+By default pygame apps disable screensavers while
+they are running. Setting this environment variable allows users or
+developers to change that and make screensavers run again.
+
+|
+
+::
+
+ SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR
+ Set to "0" to re-enable the compositor.
+
+By default SDL tries to disable the X11 compositor for all pygame
+apps. This is usually a good thing as it's faster, however if you
+have an app which *doesn't* update every frame and are using linux
+you may want to disable this bypass. The bypass has reported problems
+on KDE linux. This variable is only used on x11/linux platforms.
+
+|
+
+::
+
+ SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS
+ Set to "1" to allow joysticks to be updated even when the window is out of focus
+
+By default, when the window is not in focus, input devices do not get
+updated. However, using this environment variable it is possible to get
+joystick updates even when the window is in the background. Must be set
+before calling :func:`pygame.init()` or :func:`pygame.joystick.init()`.
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/rect.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/rect.rst.txt
new file mode 100644
index 00000000..ce4e605e
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/rect.rst.txt
@@ -0,0 +1,604 @@
+.. include:: common.txt
+
+:mod:`pygame.Rect`
+==================
+
+.. currentmodule:: pygame
+
+.. class:: Rect
+
+ | :sl:`pygame object for storing rectangular coordinates`
+ | :sg:`Rect(left, top, width, height) -> Rect`
+ | :sg:`Rect((left, top), (width, height)) -> Rect`
+ | :sg:`Rect(object) -> Rect`
+
+ Pygame uses Rect objects to store and manipulate rectangular areas. A Rect
+ can be created from a combination of left, top, width, and height values.
+ Rects can also be created from Python objects that are already a Rect or
+ have an attribute named "rect".
+
+ Any Pygame function that requires a Rect argument also accepts any of these
+ values to construct a Rect. This makes it easier to create Rects on the fly
+ as arguments for functions.
+
+ The Rect functions that change the position or size of a Rect return a new
+ copy of the Rect with the affected changes. The original Rect is not
+ modified. Some methods have an alternate "in-place" version that returns
+ None but affects the original Rect. These "in-place" methods are denoted
+ with the "ip" suffix.
+
+ The Rect object has several virtual attributes which can be used to move and
+ align the Rect:
+
+ ::
+
+ x,y
+ top, left, bottom, right
+ topleft, bottomleft, topright, bottomright
+ midtop, midleft, midbottom, midright
+ center, centerx, centery
+ size, width, height
+ w,h
+
+ All of these attributes can be assigned to:
+
+ ::
+
+ rect1.right = 10
+ rect2.center = (20,30)
+
+ Assigning to size, width or height changes the dimensions of the rectangle;
+ all other assignments move the rectangle without resizing it. Notice that
+ some attributes are integers and others are pairs of integers.
+
+ If a Rect has a nonzero width or height, it will return ``True`` for a
+ nonzero test. Some methods return a Rect with 0 size to represent an invalid
+ rectangle. A Rect with a 0 size will not collide when using collision
+ detection methods (e.g. :meth:`collidepoint`, :meth:`colliderect`, etc.).
+
+ The coordinates for Rect objects are all integers. The size values can be
+ programmed to have negative values, but these are considered illegal Rects
+ for most operations.
+
+ There are several collision tests between other rectangles. Most python
+ containers can be searched for collisions against a single Rect.
+
+ The area covered by a Rect does not include the right- and bottom-most edge
+ of pixels. If one Rect's bottom border is another Rect's top border (i.e.,
+ rect1.bottom=rect2.top), the two meet exactly on the screen but do not
+ overlap, and ``rect1.colliderect(rect2)`` returns false.
+
+ The Rect object is also iterable:
+
+ ::
+
+ r = Rect(0, 1, 2, 3)
+ x, y, w, h = r
+
+ .. versionadded:: 1.9.2
+ The Rect class can be subclassed. Methods such as ``copy()`` and ``move()``
+ will recognize this and return instances of the subclass.
+ However, the subclass's ``__init__()`` method is not called,
+ and ``__new__()`` is assumed to take no arguments. So these methods should be
+ overridden if any extra attributes need to be copied.
+
+ .. method:: copy
+
+ | :sl:`copy the rectangle`
+ | :sg:`copy() -> Rect`
+
+ Returns a new rectangle having the same position and size as the original.
+
+ New in pygame 1.9
+
+ .. ## Rect.copy ##
+
+ .. method:: move
+
+ | :sl:`moves the rectangle`
+ | :sg:`move(x, y) -> Rect`
+
+ Returns a new rectangle that is moved by the given offset. The x and y
+ arguments can be any integer value, positive or negative.
+
+ .. ## Rect.move ##
+
+ .. method:: move_ip
+
+ | :sl:`moves the rectangle, in place`
+ | :sg:`move_ip(x, y) -> None`
+
+ Same as the ``Rect.move()`` method, but operates in place.
+
+ .. ## Rect.move_ip ##
+
+ .. method:: inflate
+
+ | :sl:`grow or shrink the rectangle size`
+ | :sg:`inflate(x, y) -> Rect`
+
+ Returns a new rectangle with the size changed by the given offset. The
+ rectangle remains centered around its current center. Negative values
+ will shrink the rectangle. Note, uses integers, if the offset given is
+ too small(< 2 > -2), center will be off.
+
+ .. ## Rect.inflate ##
+
+ .. method:: inflate_ip
+
+ | :sl:`grow or shrink the rectangle size, in place`
+ | :sg:`inflate_ip(x, y) -> None`
+
+ Same as the ``Rect.inflate()`` method, but operates in place.
+
+ .. ## Rect.inflate_ip ##
+
+ .. method:: scale_by
+
+ | :sl:`scale the rectangle by given a multiplier`
+ | :sg:`scale_by(scalar) -> Rect`
+ | :sg:`scale_by(scalex, scaley) -> Rect`
+
+ Returns a new rectangle with the size scaled by the given multipliers.
+ The rectangle remains centered around its current center. A single
+ scalar or separate width and height scalars are allowed. Values above
+ one will increase the size of the rectangle, whereas values between
+ zero and one will decrease the size of the rectangle.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## Rect.scale_by ##
+
+ .. method:: scale_by_ip
+
+ | :sl:`grow or shrink the rectangle size, in place`
+ | :sg:`scale_by_ip(scalar) -> None`
+ | :sg:`scale_by_ip(scalex, scaley) -> None`
+
+ Same as the ``Rect.scale_by()`` method, but operates in place.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## Rect.scale_by_ip ##
+
+ .. method:: update
+
+ | :sl:`sets the position and size of the rectangle`
+ | :sg:`update(left, top, width, height) -> None`
+ | :sg:`update((left, top), (width, height)) -> None`
+ | :sg:`update(object) -> None`
+
+ Sets the position and size of the rectangle, in place. See
+ parameters for :meth:`pygame.Rect` for the parameters of this function.
+
+ .. versionadded:: 2.0.1
+
+ .. ## Rect.update ##
+
+ .. method:: clamp
+
+ | :sl:`moves the rectangle inside another`
+ | :sg:`clamp(Rect) -> Rect`
+
+ Returns a new rectangle that is moved to be completely inside the
+ argument Rect. If the rectangle is too large to fit inside, it is
+ centered inside the argument Rect, but its size is not changed.
+
+ .. ## Rect.clamp ##
+
+ .. method:: clamp_ip
+
+ | :sl:`moves the rectangle inside another, in place`
+ | :sg:`clamp_ip(Rect) -> None`
+
+ Same as the ``Rect.clamp()`` method, but operates in place.
+
+ .. ## Rect.clamp_ip ##
+
+ .. method:: clip
+
+ | :sl:`crops a rectangle inside another`
+ | :sg:`clip(Rect) -> Rect`
+
+ Returns a new rectangle that is cropped to be completely inside the
+ argument Rect. If the two rectangles do not overlap to begin with, a Rect
+ with 0 size is returned.
+
+ .. ## Rect.clip ##
+
+ .. method:: clipline
+
+ | :sl:`crops a line inside a rectangle`
+ | :sg:`clipline(x1, y1, x2, y2) -> ((cx1, cy1), (cx2, cy2))`
+ | :sg:`clipline(x1, y1, x2, y2) -> ()`
+ | :sg:`clipline((x1, y1), (x2, y2)) -> ((cx1, cy1), (cx2, cy2))`
+ | :sg:`clipline((x1, y1), (x2, y2)) -> ()`
+ | :sg:`clipline((x1, y1, x2, y2)) -> ((cx1, cy1), (cx2, cy2))`
+ | :sg:`clipline((x1, y1, x2, y2)) -> ()`
+ | :sg:`clipline(((x1, y1), (x2, y2))) -> ((cx1, cy1), (cx2, cy2))`
+ | :sg:`clipline(((x1, y1), (x2, y2))) -> ()`
+
+ Returns the coordinates of a line that is cropped to be completely inside
+ the rectangle. If the line does not overlap the rectangle, then an empty
+ tuple is returned.
+
+ The line to crop can be any of the following formats (floats can be used
+ in place of ints, but they will be truncated):
+
+ - four ints
+ - 2 lists/tuples/Vector2s of 2 ints
+ - a list/tuple of four ints
+ - a list/tuple of 2 lists/tuples/Vector2s of 2 ints
+
+ :returns: a tuple with the coordinates of the given line cropped to be
+ completely inside the rectangle is returned, if the given line does
+ not overlap the rectangle, an empty tuple is returned
+ :rtype: tuple(tuple(int, int), tuple(int, int)) or ()
+
+ :raises TypeError: if the line coordinates are not given as one of the
+ above described line formats
+
+ .. note ::
+ This method can be used for collision detection between a rect and a
+ line. See example code below.
+
+ .. note ::
+ The ``rect.bottom`` and ``rect.right`` attributes of a
+ :mod:`pygame.Rect` always lie one pixel outside of its actual border.
+
+ ::
+
+ # Example using clipline().
+ clipped_line = rect.clipline(line)
+
+ if clipped_line:
+ # If clipped_line is not an empty tuple then the line
+ # collides/overlaps with the rect. The returned value contains
+ # the endpoints of the clipped line.
+ start, end = clipped_line
+ x1, y1 = start
+ x2, y2 = end
+ else:
+ print("No clipping. The line is fully outside the rect.")
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. versionadded:: 2.0.0
+
+ .. ## Rect.clipline ##
+
+ .. method:: union
+
+ | :sl:`joins two rectangles into one`
+ | :sg:`union(Rect) -> Rect`
+
+ Returns a new rectangle that completely covers the area of the two
+ provided rectangles. There may be area inside the new Rect that is not
+ covered by the originals.
+
+ .. ## Rect.union ##
+
+ .. method:: union_ip
+
+ | :sl:`joins two rectangles into one, in place`
+ | :sg:`union_ip(Rect) -> None`
+
+ Same as the ``Rect.union()`` method, but operates in place.
+
+ .. ## Rect.union_ip ##
+
+ .. method:: unionall
+
+ | :sl:`the union of many rectangles`
+ | :sg:`unionall(Rect_sequence) -> Rect`
+
+ Returns the union of one rectangle with a sequence of many rectangles.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## Rect.unionall ##
+
+ .. method:: unionall_ip
+
+ | :sl:`the union of many rectangles, in place`
+ | :sg:`unionall_ip(Rect_sequence) -> None`
+
+ The same as the ``Rect.unionall()`` method, but operates in place.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## Rect.unionall_ip ##
+
+ .. method:: fit
+
+ | :sl:`resize and move a rectangle with aspect ratio`
+ | :sg:`fit(Rect) -> Rect`
+
+ Returns a new rectangle that is moved and resized to fit another. The
+ aspect ratio of the original Rect is preserved, so the new rectangle may
+ be smaller than the target in either width or height.
+
+ .. ## Rect.fit ##
+
+ .. method:: normalize
+
+ | :sl:`correct negative sizes`
+ | :sg:`normalize() -> None`
+
+ This will flip the width or height of a rectangle if it has a negative
+ size. The rectangle will remain in the same place, with only the sides
+ swapped.
+
+ .. ## Rect.normalize ##
+
+ .. method:: contains
+
+ | :sl:`test if one rectangle is inside another`
+ | :sg:`contains(Rect) -> bool`
+
+ Returns true when the argument is completely inside the Rect.
+
+ .. ## Rect.contains ##
+
+ .. method:: collidepoint
+
+ | :sl:`test if a point is inside a rectangle`
+ | :sg:`collidepoint(x, y) -> bool`
+ | :sg:`collidepoint((x,y)) -> bool`
+
+ Returns true if the given point is inside the rectangle. A point along
+ the right or bottom edge is not considered to be inside the rectangle.
+
+ .. note ::
+ For collision detection between a rect and a line the :meth:`clipline`
+ method can be used.
+
+ .. ## Rect.collidepoint ##
+
+ .. method:: colliderect
+
+ | :sl:`test if two rectangles overlap`
+ | :sg:`colliderect(Rect) -> bool`
+
+ Returns true if any portion of either rectangle overlap (except the
+ top+bottom or left+right edges).
+
+ .. note ::
+ For collision detection between a rect and a line the :meth:`clipline`
+ method can be used.
+
+ .. ## Rect.colliderect ##
+
+ .. method:: collidelist
+
+ | :sl:`test if one rectangle in a list intersects`
+ | :sg:`collidelist(list) -> index`
+
+ Test whether the rectangle collides with any in a sequence of rectangles.
+ The index of the first collision found is returned. If no collisions are
+ found an index of -1 is returned.
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## Rect.collidelist ##
+
+ .. method:: collidelistall
+
+ | :sl:`test if all rectangles in a list intersect`
+ | :sg:`collidelistall(list) -> indices`
+
+ Returns a list of all the indices that contain rectangles that collide
+ with the Rect. If no intersecting rectangles are found, an empty list is
+ returned.
+
+ Not only Rects are valid arguments, but these are all valid calls:
+
+ .. code-block:: python
+
+ Rect = pygame.Rect
+ r = Rect(0, 0, 10, 10)
+
+ list_of_rects = [Rect(1, 1, 1, 1), Rect(2, 2, 2, 2)]
+ indices0 = r.collidelistall(list_of_rects)
+
+ list_of_lists = [[1, 1, 1, 1], [2, 2, 2, 2]]
+ indices1 = r.collidelistall(list_of_lists)
+
+ list_of_tuples = [(1, 1, 1, 1), (2, 2, 2, 2)]
+ indices2 = r.collidelistall(list_of_tuples)
+
+ list_of_double_tuples = [((1, 1), (1, 1)), ((2, 2), (2, 2))]
+ indices3 = r.collidelistall(list_of_double_tuples)
+
+ class ObjectWithRectAttribute(object):
+ def __init__(self, r):
+ self.rect = r
+
+ list_of_object_with_rect_attribute = [
+ ObjectWithRectAttribute(Rect(1, 1, 1, 1)),
+ ObjectWithRectAttribute(Rect(2, 2, 2, 2)),
+ ]
+ indices4 = r.collidelistall(list_of_object_with_rect_attribute)
+
+ class ObjectWithCallableRectAttribute(object):
+ def __init__(self, r):
+ self._rect = r
+
+ def rect(self):
+ return self._rect
+
+ list_of_object_with_callable_rect = [
+ ObjectWithCallableRectAttribute(Rect(1, 1, 1, 1)),
+ ObjectWithCallableRectAttribute(Rect(2, 2, 2, 2)),
+ ]
+ indices5 = r.collidelistall(list_of_object_with_callable_rect)
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## Rect.collidelistall ##
+
+ .. method:: collideobjects
+
+ | :sl:`test if any object in a list intersects`
+ | :sg:`collideobjects(rect_list) -> object`
+ | :sg:`collideobjects(obj_list, key=func) -> object`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave collideobjects feedback with authors `_
+
+ Test whether the rectangle collides with any object in the sequence.
+ The object of the first collision found is returned. If no collisions are
+ found then ``None`` is returned
+
+ If key is given, then it should be a method taking an object from the list
+ as input and returning a rect like object e.g. ``lambda obj: obj.rectangle``.
+ If an object has multiple attributes of type Rect then key could return one
+ of them.
+
+ .. code-block:: python
+
+ r = Rect(1, 1, 10, 10)
+
+ rects = [
+ Rect(1, 1, 10, 10),
+ Rect(5, 5, 10, 10),
+ Rect(15, 15, 1, 1),
+ Rect(2, 2, 1, 1),
+ ]
+
+ result = r.collideobjects(rects) # ->
+ print(result)
+
+ class ObjectWithSomRectAttribute:
+ def __init__(self, name, collision_box, draw_rect):
+ self.name = name
+ self.draw_rect = draw_rect
+ self.collision_box = collision_box
+
+ def __repr__(self):
+ return f'<{self.__class__.__name__}("{self.name}", {list(self.collision_box)}, {list(self.draw_rect)})>'
+
+ objects = [
+ ObjectWithSomRectAttribute("A", Rect(15, 15, 1, 1), Rect(150, 150, 50, 50)),
+ ObjectWithSomRectAttribute("B", Rect(1, 1, 10, 10), Rect(300, 300, 50, 50)),
+ ObjectWithSomRectAttribute("C", Rect(5, 5, 10, 10), Rect(200, 500, 50, 50)),
+ ]
+
+ # collision = r.collideobjects(objects) # this does not work because the items in the list are no Rect like object
+ collision = r.collideobjects(
+ objects, key=lambda o: o.collision_box
+ ) # ->
+ print(collision)
+
+ screen_rect = r.collideobjects(objects, key=lambda o: o.draw_rect) # -> None
+ print(screen_rect)
+
+ .. versionadded:: 2.1.3
+
+ .. ## Rect.collideobjects ##
+
+ .. method:: collideobjectsall
+
+ | :sl:`test if all objects in a list intersect`
+ | :sg:`collideobjectsall(rect_list) -> objects`
+ | :sg:`collideobjectsall(obj_list, key=func) -> objects`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave collideobjectsall feedback with authors `_
+
+ Returns a list of all the objects that contain rectangles that collide
+ with the Rect. If no intersecting objects are found, an empty list is
+ returned.
+
+ If key is given, then it should be a method taking an object from the list
+ as input and returning a rect like object e.g. ``lambda obj: obj.rectangle``.
+ If an object has multiple attributes of type Rect then key could return one
+ of them.
+
+ .. code-block:: python
+
+ r = Rect(1, 1, 10, 10)
+
+ rects = [
+ Rect(1, 1, 10, 10),
+ Rect(5, 5, 10, 10),
+ Rect(15, 15, 1, 1),
+ Rect(2, 2, 1, 1),
+ ]
+
+ result = r.collideobjectsall(
+ rects
+ ) # -> [, , ]
+ print(result)
+
+ class ObjectWithSomRectAttribute:
+ def __init__(self, name, collision_box, draw_rect):
+ self.name = name
+ self.draw_rect = draw_rect
+ self.collision_box = collision_box
+
+ def __repr__(self):
+ return f'<{self.__class__.__name__}("{self.name}", {list(self.collision_box)}, {list(self.draw_rect)})>'
+
+ objects = [
+ ObjectWithSomRectAttribute("A", Rect(1, 1, 10, 10), Rect(300, 300, 50, 50)),
+ ObjectWithSomRectAttribute("B", Rect(5, 5, 10, 10), Rect(200, 500, 50, 50)),
+ ObjectWithSomRectAttribute("C", Rect(15, 15, 1, 1), Rect(150, 150, 50, 50)),
+ ]
+
+ # collisions = r.collideobjectsall(objects) # this does not work because ObjectWithSomRectAttribute is not a Rect like object
+ collisions = r.collideobjectsall(
+ objects, key=lambda o: o.collision_box
+ ) # -> [, ]
+ print(collisions)
+
+ screen_rects = r.collideobjectsall(objects, key=lambda o: o.draw_rect) # -> []
+ print(screen_rects)
+
+ .. versionadded:: 2.1.3
+
+ .. ## Rect.collideobjectsall ##
+
+ .. method:: collidedict
+
+ | :sl:`test if one rectangle in a dictionary intersects`
+ | :sg:`collidedict(dict) -> (key, value)`
+ | :sg:`collidedict(dict) -> None`
+ | :sg:`collidedict(dict, use_values=0) -> (key, value)`
+ | :sg:`collidedict(dict, use_values=0) -> None`
+
+ Returns the first key and value pair that intersects with the calling
+ Rect object. If no collisions are found, ``None`` is returned. If
+ ``use_values`` is 0 (default) then the dict's keys will be used in the
+ collision detection, otherwise the dict's values will be used.
+
+ .. note ::
+ Rect objects cannot be used as keys in a dictionary (they are not
+ hashable), so they must be converted to a tuple.
+ e.g. ``rect.collidedict({tuple(key_rect) : value})``
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## Rect.collidedict ##
+
+ .. method:: collidedictall
+
+ | :sl:`test if all rectangles in a dictionary intersect`
+ | :sg:`collidedictall(dict) -> [(key, value), ...]`
+ | :sg:`collidedictall(dict, use_values=0) -> [(key, value), ...]`
+
+ Returns a list of all the key and value pairs that intersect with the
+ calling Rect object. If no collisions are found an empty list is returned.
+ If ``use_values`` is 0 (default) then the dict's keys will be used in the
+ collision detection, otherwise the dict's values will be used.
+
+ .. note ::
+ Rect objects cannot be used as keys in a dictionary (they are not
+ hashable), so they must be converted to a tuple.
+ e.g. ``rect.collidedictall({tuple(key_rect) : value})``
+
+ .. versionchanged:: 2.5.0 Added support for keyword arguments.
+
+ .. ## Rect.collidedictall ##
+
+ .. ## pygame.Rect ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/scrap.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/scrap.rst.txt
new file mode 100644
index 00000000..1aac5d09
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/scrap.rst.txt
@@ -0,0 +1,240 @@
+.. include:: common.txt
+
+:mod:`pygame.scrap`
+===================
+
+.. module:: pygame.scrap
+ :synopsis: pygame module for clipboard support.
+
+| :sl:`pygame module for clipboard support.`
+
+**EXPERIMENTAL!**: This API may change or disappear in later pygame releases. If
+you use this, your code may break with the next pygame release.
+
+The scrap module is for transferring data to/from the clipboard. This allows
+for cutting and pasting data between pygame and other applications. Some basic
+data (MIME) types are defined and registered:
+
+::
+
+ pygame string
+ constant value description
+ --------------------------------------------------
+ SCRAP_TEXT "text/plain" plain text
+ SCRAP_BMP "image/bmp" BMP encoded image data
+ SCRAP_PBM "image/pbm" PBM encoded image data
+ SCRAP_PPM "image/ppm" PPM encoded image data
+
+``pygame.SCRAP_PPM``, ``pygame.SCRAP_PBM`` and ``pygame.SCRAP_BMP`` are
+suitable for surface buffers to be shared with other applications.
+``pygame.SCRAP_TEXT`` is an alias for the plain text clipboard type.
+
+Depending on the platform, additional types are automatically registered when
+data is placed into the clipboard to guarantee a consistent sharing behaviour
+with other applications. The following listed types can be used as strings to
+be passed to the respective :mod:`pygame.scrap` module functions.
+
+For **Windows** platforms, these additional types are supported automatically
+and resolve to their internal definitions:
+
+::
+
+ "text/plain;charset=utf-8" UTF-8 encoded text
+ "audio/wav" WAV encoded audio
+ "image/tiff" TIFF encoded image data
+
+For **X11** platforms, these additional types are supported automatically and
+resolve to their internal definitions:
+
+::
+
+ "text/plain;charset=utf-8" UTF-8 encoded text
+ "UTF8_STRING" UTF-8 encoded text
+ "COMPOUND_TEXT" COMPOUND text
+
+User defined types can be used, but the data might not be accessible by other
+applications unless they know what data type to look for.
+Example: Data placed into the clipboard by
+``pygame.scrap.put("my_data_type", byte_data)`` can only be accessed by
+applications which query the clipboard for the ``"my_data_type"`` data type.
+
+For an example of how the scrap module works refer to the examples page
+(:func:`pygame.examples.scrap_clipboard.main`) or the code directly in GitHub
+(`pygame/examples/scrap_clipboard.py `_).
+
+.. versionadded:: 1.8
+
+.. note::
+ The scrap module is currently only supported for Windows, X11 and Mac OS X.
+ On Mac OS X only text works at the moment - other types may be supported in
+ future releases.
+
+.. function:: init
+
+ | :sl:`Initializes the scrap module.`
+ | :sg:`init() -> None`
+
+ Initialize the scrap module.
+
+ :raises pygame.error: if unable to initialize scrap module
+
+ .. note:: The scrap module requires :func:`pygame.display.set_mode()` be
+ called before being initialized.
+
+ .. ## pygame.scrap.init ##
+
+.. function:: get_init
+
+ | :sl:`Returns True if the scrap module is currently initialized.`
+ | :sg:`get_init() -> bool`
+
+ Gets the scrap module's initialization state.
+
+ :returns: ``True`` if the :mod:`pygame.scrap` module is currently
+ initialized, ``False`` otherwise
+ :rtype: bool
+
+ .. versionadded:: 1.9.5
+
+ .. ## pygame.scrap.get_init ##
+
+.. function:: get
+
+ | :sl:`Gets the data for the specified type from the clipboard.`
+ | :sg:`get(type) -> bytes | None`
+
+ Retrieves the data for the specified type from the clipboard. The data is
+ returned as a byte string and might need further processing (such as
+ decoding to Unicode).
+
+ :param string type: data type to retrieve from the clipboard
+
+ :returns: data (bytes object) for the given type identifier or ``None`` if
+ no data for the given type is available
+ :rtype: bytes | None
+
+ ::
+
+ text = pygame.scrap.get(pygame.SCRAP_TEXT)
+ if text:
+ print("There is text in the clipboard.")
+ else:
+ print("There does not seem to be text in the clipboard.")
+
+ .. ## pygame.scrap.get ##
+
+.. function:: get_types
+
+ | :sl:`Gets a list of the available clipboard types.`
+ | :sg:`get_types() -> list`
+
+ Gets a list of data type string identifiers for the data currently
+ available on the clipboard. Each identifier can be used in the
+ :func:`pygame.scrap.get()` method to get the clipboard content of the
+ specific type.
+
+ :returns: list of strings of the available clipboard data types, if there
+ is no data in the clipboard an empty list is returned
+ :rtype: list
+
+ ::
+
+ for t in pygame.scrap.get_types():
+ if "text" in t:
+ # There is some content with the word "text" in its type string.
+ print(pygame.scrap.get(t))
+
+ .. ## pygame.scrap.get_types ##
+
+.. function:: put
+
+ | :sl:`Places data into the clipboard.`
+ | :sg:`put(type, data) -> None`
+
+ Places data for a given clipboard type into the clipboard. The data must
+ be a string buffer. The type is a string identifying the type of data to be
+ placed into the clipboard. This can be one of the predefined
+ ``pygame.SCRAP_PBM``, ``pygame.SCRAP_PPM``, ``pygame.SCRAP_BMP`` or
+ ``pygame.SCRAP_TEXT`` values or a user defined string identifier.
+
+ :param string type: type identifier of the data to be placed into the
+ clipboard
+ :param data: data to be place into the clipboard, a bytes object
+ :type data: bytes
+
+ :raises pygame.error: if unable to put the data into the clipboard
+
+ ::
+
+ with open("example.bmp", "rb") as fp:
+ pygame.scrap.put(pygame.SCRAP_BMP, fp.read())
+ # The image data is now on the clipboard for other applications to access
+ # it.
+ pygame.scrap.put(pygame.SCRAP_TEXT, b"A text to copy")
+ pygame.scrap.put("Plain text", b"Data for user defined type 'Plain text'")
+
+ .. ## pygame.scrap.put ##
+
+.. function:: contains
+
+ | :sl:`Checks whether data for a given type is available in the clipboard.`
+ | :sg:`contains(type) -> bool`
+
+ Checks whether data for the given type is currently available in the
+ clipboard.
+
+ :param string type: data type to check availability of
+
+ :returns: ``True`` if data for the passed type is available in the
+ clipboard, ``False`` otherwise
+ :rtype: bool
+
+ ::
+
+ if pygame.scrap.contains(pygame.SCRAP_TEXT):
+ print("There is text in the clipboard.")
+ if pygame.scrap.contains("own_data_type"):
+ print("There is stuff in the clipboard.")
+
+ .. ## pygame.scrap.contains ##
+
+.. function:: lost
+
+ | :sl:`Indicates if the clipboard ownership has been lost by the pygame application.`
+ | :sg:`lost() -> bool`
+
+ Indicates if the clipboard ownership has been lost by the pygame
+ application.
+
+ :returns: ``True``, if the clipboard ownership has been lost by the pygame
+ application, ``False`` if the pygame application still owns the clipboard
+ :rtype: bool
+
+ ::
+
+ if pygame.scrap.lost():
+ print("The clipboard is in use by another application.")
+
+ .. ## pygame.scrap.lost ##
+
+.. function:: set_mode
+
+ | :sl:`Sets the clipboard access mode.`
+ | :sg:`set_mode(mode) -> None`
+
+ Sets the access mode for the clipboard. This is only of interest for X11
+ environments where clipboard modes ``pygame.SCRAP_SELECTION`` (for mouse
+ selections) and ``pygame.SCRAP_CLIPBOARD`` (for the clipboard) are
+ available. Setting the mode to ``pygame.SCRAP_SELECTION`` in other
+ environments will not change the mode from ``pygame.SCRAP_CLIPBOARD``.
+
+ :param mode: access mode, supported values are ``pygame.SCRAP_CLIPBOARD``
+ and ``pygame.SCRAP_SELECTION`` (``pygame.SCRAP_SELECTION`` only has an
+ effect when used on X11 platforms)
+
+ :raises ValueError: if the ``mode`` parameter is not
+ ``pygame.SCRAP_CLIPBOARD`` or ``pygame.SCRAP_SELECTION``
+
+ .. ## pygame.scrap.set_mode ##
+
+.. ## pygame.scrap ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sdl2_controller.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sdl2_controller.rst.txt
new file mode 100644
index 00000000..dbea64a9
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sdl2_controller.rst.txt
@@ -0,0 +1,290 @@
+.. include:: common.txt
+
+:mod:`pygame._sdl2.controller`
+==============================
+
+.. module:: pygame._sdl2.controller
+ :synopsis: pygame module to work with controllers
+
+| :sl:`Pygame module to work with controllers.`
+
+.. note::
+ Use import pygame._sdl2.controller before using this module.
+
+This module offers control over common controller types like the dualshock 4 or
+the xbox 360 controllers: They have two analog sticks, two triggers, two shoulder buttons,
+a dpad, 4 buttons on the side, 2 (or 3) buttons in the middle.
+
+Pygame uses xbox controllers naming conventions (like a, b, x, y for buttons) but
+they always refer to the same buttons. For example ``CONTROLLER_BUTTON_X`` is
+always the leftmost button of the 4 buttons on the right.
+
+Controllers can generate the following events::
+
+ CONTROLLERAXISMOTION, CONTROLLERBUTTONDOWN, CONTROLLERBUTTONUP,
+ CONTROLLERDEVICEREMAPPED, CONTROLLERDEVICEADDED, CONTROLLERDEVICEREMOVED
+
+Additionally if pygame is built with SDL 2.0.14 or higher the following events can also be generated
+(to get the version of sdl pygame is built with use :meth:`pygame.version.SDL`)::
+
+ CONTROLLERTOUCHPADDOWN, CONTROLLERTOUCHPADMOTION, CONTROLLERTOUCHPADUP
+
+These events can be enabled/disabled by :meth:`pygame._sdl2.controller.set_eventstate`
+Note that controllers can generate joystick events as well. This function only toggles
+events related to controllers.
+
+.. note::
+ See the :mod:`pygame.joystick` for a more versatile but more advanced api.
+
+.. versionadded:: 2 This module requires SDL2.
+
+.. function:: init
+
+ | :sl:`initialize the controller module`
+ | :sg:`init() -> None`
+
+ Initialize the controller module.
+
+ .. ## pygame._sdl2.controller.init ##
+
+.. function:: quit
+
+ | :sl:`Uninitialize the controller module.`
+ | :sg:`quit() -> None`
+
+ Uninitialize the controller module.
+
+ .. ## pygame._sdl2.controller.quit ##
+
+.. function:: get_init
+
+ | :sl:`Returns True if the controller module is initialized.`
+ | :sg:`get_init() -> bool`
+
+ Test if ``pygame._sdl2.controller.init()`` was called.
+
+ .. ## pygame._sdl2.controller.get_init ##
+
+.. function:: set_eventstate
+
+ | :sl:`Sets the current state of events related to controllers`
+ | :sg:`set_eventstate(state) -> None`
+
+ Enable or disable events connected to controllers.
+
+ .. note::
+ Controllers can still generate joystick events, which will not be toggled by this function.
+
+ .. versionchanged:: 2.0.2: Changed return type from int to None
+
+ .. ## pygame._sdl2.controller.set_eventstate ##
+
+.. function:: get_eventstate
+
+ | :sl:`Gets the current state of events related to controllers`
+ | :sg:`get_eventstate() -> bool`
+
+ Returns the current state of events related to controllers, True meaning
+ events will be posted.
+
+ .. versionadded:: 2.0.2
+
+ .. ## pygame._sdl2.controller.get_eventstate ##
+
+.. function:: get_count
+
+ | :sl:`Get the number of joysticks connected`
+ | :sg:`get_count() -> int`
+
+ Get the number of joysticks connected.
+
+ .. ## pygame._sdl2.controller.get_count ##
+
+.. function:: is_controller
+
+ | :sl:`Check if the given joystick is supported by the game controller interface`
+ | :sg:`is_controller(index) -> bool`
+
+ Returns True if the index given can be used to create a controller object.
+
+ .. ## pygame._sdl2.controller.is_controller ##
+
+.. function:: name_forindex
+
+ | :sl:`Get the name of the controller`
+ | :sg:`name_forindex(index) -> name or None`
+
+ Returns the name of controller, or None if there's no name or the
+ index is invalid.
+
+ .. ## pygame._sdl2.controller.name_forindex ##
+
+.. class:: Controller
+
+ | :sl:`Create a new Controller object.`
+ | :sg:`Controller(index) -> Controller`
+
+ Create a new Controller object. Index should be integer between
+ 0 and ``pygame._sdl2.controller.get_count()``. Controllers also
+ can be created from a ``pygame.joystick.Joystick`` using
+ ``pygame._sdl2.controller.from_joystick``. Controllers are
+ initialized on creation.
+
+ .. method:: quit
+
+ | :sl:`uninitialize the Controller`
+ | :sg:`quit() -> None`
+
+ Close a Controller object. After this the pygame event queue will no longer
+ receive events from the device.
+
+ It is safe to call this more than once.
+
+ .. ## Controller.quit ##
+
+ .. method:: get_init
+
+ | :sl:`check if the Controller is initialized`
+ | :sg:`get_init() -> bool`
+
+ Returns True if the Controller object is currently initialised.
+
+ .. ## Controller.get_init ##
+
+ .. staticmethod:: from_joystick
+
+ | :sl:`Create a Controller from a pygame.joystick.Joystick object`
+ | :sg:`from_joystick(joystick) -> Controller`
+
+ Create a Controller object from a ``pygame.joystick.Joystick`` object
+
+ .. ## Controller.from_joystick ##
+
+ .. method:: attached
+
+ | :sl:`Check if the Controller has been opened and is currently connected.`
+ | :sg:`attached() -> bool`
+
+ Returns True if the Controller object is opened and connected.
+
+ .. ## Controller.attached ##
+
+ .. method:: as_joystick
+
+ | :sl:`Returns a pygame.joystick.Joystick() object`
+ | :sg:`as_joystick() -> Joystick object`
+
+ Returns a pygame.joystick.Joystick() object created from this controller's index
+
+ .. ## Controller.as_joystick ##
+
+ .. method:: get_axis
+
+ | :sl:`Get the current state of a joystick axis`
+ | :sg:`get_axis(axis) -> int`
+
+ Get the current state of a trigger or joystick axis.
+ The axis argument must be one of the following constants::
+
+ CONTROLLER_AXIS_LEFTX, CONTROLLER_AXIS_LEFTY,
+ CONTROLLER_AXIS_RIGHTX, CONTROLLER_AXIS_RIGHTY,
+ CONTROLLER_AXIS_TRIGGERLEFT, CONTROLLER_AXIS_TRIGGERRIGHT
+
+ Joysticks can return a value between -32768 and 32767. Triggers however
+ can only return a value between 0 and 32768.
+
+ .. ## Controller.get_axis ##
+
+ .. method:: get_button
+
+ | :sl:`Get the current state of a button`
+ | :sg:`get_button(button) -> bool`
+
+ Get the current state of a button, True meaning it is pressed down.
+ The button argument must be one of the following constants::
+
+ CONTROLLER_BUTTON_A, CONTROLLER_BUTTON_B,
+ CONTROLLER_BUTTON_X, CONTROLLER_BUTTON_Y
+ CONTROLLER_BUTTON_DPAD_UP, CONTROLLER_BUTTON_DPAD_DOWN,
+ CONTROLLER_BUTTON_DPAD_LEFT, CONTROLLER_BUTTON_DPAD_RIGHT,
+ CONTROLLER_BUTTON_LEFTSHOULDER, CONTROLLER_BUTTON_RIGHTSHOULDER,
+ CONTROLLER_BUTTON_LEFTSTICK, CONTROLLER_BUTTON_RIGHTSTICK,
+ CONTROLLER_BUTTON_BACK, CONTROLLER_BUTTON_GUIDE,
+ CONTROLLER_BUTTON_START
+
+
+ .. ## Controller.get_button ##
+
+ .. method:: get_mapping
+
+ | :sl:`Get the mapping assigned to the controller`
+ | :sg:`get_mapping() -> mapping`
+
+ Returns a dict containing the mapping of the Controller. For more
+ information see :meth:`Controller.set_mapping()`
+
+ .. versionchanged:: 2.0.2: Return type changed from ``str`` to ``dict``
+
+ .. ## Contorller.get_mapping ##
+
+ .. method:: set_mapping
+
+ | :sl:`Assign a mapping to the controller`
+ | :sg:`set_mapping(mapping) -> int`
+
+ Rebind buttons, axes, triggers and dpads. The mapping should be a
+ dict containing all buttons, hats and axes. The easiest way to get this
+ is to use the dict returned by :meth:`Controller.get_mapping`. To edit
+ this mapping assign a value to the original button. The value of the
+ dictionary must be a button, hat or axis represented in the following way:
+
+ * For a button use: bX where X is the index of the button.
+ * For a hat use: hX.Y where X is the index and the Y is the direction (up: 1, right: 2, down: 3, left: 4).
+ * For an axis use: aX where x is the index of the axis.
+
+ An example of mapping::
+
+ mapping = controller.get_mapping() # Get current mapping
+ mapping["a"] = "b3" # Remap button a to y
+ mapping["y"] = "b0" # Remap button y to a
+ controller.set_mapping(mapping) # Set the mapping
+
+
+ The function will return 1 if a new mapping is added or 0 if an existing one is updated.
+
+ .. versionchanged:: 2.0.2: Renamed from ``add_mapping`` to ``set_mapping``
+ .. versionchanged:: 2.0.2: Argument type changed from ``str`` to ``dict``
+
+ .. ## Contorller.set_mapping ##
+
+ .. method:: rumble
+
+ | :sl:`Start a rumbling effect`
+ | :sg:`rumble(low_frequency, high_frequency, duration) -> bool`
+
+ Start a rumble effect on the controller, with the specified strength ranging
+ from 0 to 1. Duration is length of the effect, in ms. Setting the duration
+ to 0 will play the effect until another one overwrites it or
+ :meth:`Controller.stop_rumble` is called. If an effect is already
+ playing, then it will be overwritten.
+
+ Returns True if the rumble was played successfully or False if the
+ controller does not support it or :meth:`pygame.version.SDL` is below 2.0.9.
+
+ .. versionadded:: 2.0.2
+
+ .. ## Contorller.rumble ##
+
+ .. method:: stop_rumble
+
+ | :sl:`Stop any rumble effect playing`
+ | :sg:`stop_rumble() -> None`
+
+ Stops any rumble effect playing on the controller. See
+ :meth:`Controller.rumble` for more information.
+
+ .. versionadded:: 2.0.2
+
+ .. ## Contorller.stop_rumble ##
+
+.. ## pygame._sdl2.controller ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sdl2_video.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sdl2_video.rst.txt
new file mode 100644
index 00000000..e273363b
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sdl2_video.rst.txt
@@ -0,0 +1,334 @@
+.. include:: common.txt
+
+:mod:`pygame.sdl2_video`
+========================
+
+.. module:: pygame._sdl2.video
+ :synopsis: Experimental pygame module for porting new SDL video systems
+
+.. warning::
+ This module isn't ready for prime time yet, it's still in development.
+ These docs are primarily meant to help the pygame developers and super-early adopters
+ who are in communication with the developers. This API will change.
+
+| :sl:`Experimental pygame module for porting new SDL video systems`
+
+.. class:: Window
+
+ | :sl:`pygame object that represents a window`
+ | :sg:`Window(title="pygame", size=(640, 480), position=None, fullscreen=False, fullscreen_desktop=False, keywords) -> Window`
+
+ .. classmethod:: from_display_module
+
+ | :sl:`Creates window using window created by pygame.display.set_mode().`
+ | :sg:`from_display_module() -> Window`
+
+ .. classmethod:: from_window
+
+ | :sl:`Create Window from another window. Could be from another UI toolkit.`
+ | :sg:`from_window(other) -> Window`
+
+ .. attribute:: grab
+
+ | :sl:`Gets or sets whether the mouse is confined to the window.`
+ | :sg:`grab -> bool`
+
+ .. attribute:: relative_mouse
+
+ | :sl:`Gets or sets the window's relative mouse motion state.`
+ | :sg:`relative_mouse -> bool`
+
+ .. method:: set_windowed
+
+ | :sl:`Enable windowed mode (exit fullscreen).`
+ | :sg:`set_windowed() -> None`
+
+ .. method:: set_fullscreen
+
+ | :sl:`Enter fullscreen.`
+ | :sg:`set_fullscreen(desktop=False) -> None`
+
+ .. attribute:: title
+
+ | :sl:`Gets or sets whether the window title.`
+ | :sg:`title -> string`
+
+ .. method:: destroy
+
+ | :sl:`Destroys the window.`
+ | :sg:`destroy() -> None`
+
+ .. method:: hide
+
+ | :sl:`Hide the window.`
+ | :sg:`hide() -> None`
+
+ .. method:: show
+
+ | :sl:`Show the window.`
+ | :sg:`show() -> None`
+
+ .. method:: focus
+
+ | :sl:`Raise the window above other windows and set the input focus. The "input_only" argument is only supported on X11.`
+ | :sg:`focus(input_only=False) -> None`
+
+ .. method:: restore
+
+ | :sl:`Restore the size and position of a minimized or maximized window.`
+ | :sg:`restore() -> None`
+
+ .. method:: maximize
+
+ | :sl:`Maximize the window.`
+ | :sg:`maximize() -> None`
+
+ .. method:: minimize
+
+ | :sl:`Minimize the window.`
+ | :sg:`maximize() -> None`
+
+ .. attribute:: resizable
+
+ | :sl:`Gets and sets whether the window is resizable.`
+ | :sg:`resizable -> bool`
+
+ .. attribute:: borderless
+
+ | :sl:`Add or remove the border from the window.`
+ | :sg:`borderless -> bool`
+
+ .. method:: set_icon
+
+ | :sl:`Set the icon for the window.`
+ | :sg:`set_icon(surface) -> None`
+
+ .. attribute:: id
+
+ | :sl:`Get the unique window ID. *Read-only*`
+ | :sg:`id -> int`
+
+ .. attribute:: size
+
+ | :sl:`Gets and sets the window size.`
+ | :sg:`size -> (int, int)`
+
+ .. attribute:: position
+
+ | :sl:`Gets and sets the window position.`
+ | :sg:`position -> (int, int) or WINDOWPOS_CENTERED or WINDOWPOS_UNDEFINED`
+
+ .. attribute:: opacity
+
+ | :sl:`Gets and sets the window opacity. Between 0.0 (fully transparent) and 1.0 (fully opaque).`
+ | :sg:`opacity -> float`
+
+ .. attribute:: display_index
+
+ | :sl:`Get the index of the display that owns the window. *Read-only*`
+ | :sg:`display_index -> int`
+
+ .. method:: set_modal_for
+
+ | :sl:`Set the window as a modal for a parent window. This function is only supported on X11.`
+ | :sg:`set_modal_for(Window) -> None`
+
+.. class:: Texture
+
+ | :sl:`pygame object that representing a Texture.`
+ | :sg:`Texture(renderer, size, depth=0, static=False, streaming=False, target=False) -> Texture`
+
+ .. staticmethod:: from_surface
+
+ | :sl:`Create a texture from an existing surface.`
+ | :sg:`from_surface(renderer, surface) -> Texture`
+
+ .. attribute:: renderer
+
+ | :sl:`Gets the renderer associated with the Texture. *Read-only*`
+ | :sg:`renderer -> Renderer`
+
+ .. attribute:: width
+
+ | :sl:`Gets the width of the Texture. *Read-only*`
+ | :sg:`width -> int`
+
+ .. attribute:: height
+
+ | :sl:`Gets the height of the Texture. *Read-only*`
+ | :sg:`height -> int`
+
+ .. attribute:: alpha
+
+ | :sl:`Gets and sets an additional alpha value multiplied into render copy operations.`
+ | :sg:`alpha -> int`
+
+ .. attribute:: blend_mode
+
+ | :sl:`Gets and sets the blend mode for the Texture.`
+ | :sg:`blend_mode -> int`
+
+ .. attribute:: color
+
+ | :sl:`Gets and sets an additional color value multiplied into render copy operations.`
+ | :sg:`color -> color`
+
+ .. method:: get_rect
+
+ | :sl:`Get the rectangular area of the texture.`
+ | :sg:`get_rect(**kwargs) -> Rect`
+
+ .. method:: draw
+
+ | :sl:`Copy a portion of the texture to the rendering target.`
+ | :sg:`draw(srcrect=None, dstrect=None, angle=0, origin=None, flip_x=False, flip_y=False) -> None`
+
+ .. method:: update
+
+ | :sl:`Update the texture with a Surface. WARNING: Slow operation, use sparingly.`
+ | :sg:`update(surface, area=None) -> None`
+
+.. class:: Image
+
+ | :sl:`Easy way to use a portion of a Texture without worrying about srcrect all the time.`
+ | :sg:`Image(textureOrImage, srcrect=None) -> Image`
+
+ .. method:: get_rect
+
+ | :sl:`Get the rectangular area of the Image.`
+ | :sg:`get_rect() -> Rect`
+
+ .. method:: draw
+
+ | :sl:`Copy a portion of the Image to the rendering target.`
+ | :sg:`draw(srcrect=None, dstrect=None) -> None`
+
+ .. attribute:: angle
+
+ | :sl:`Gets and sets the angle the Image draws itself with.`
+ | :sg:`angle -> float`
+
+ .. attribute:: origin
+
+ | :sl:`Gets and sets the origin. Origin=None means the Image will be rotated around its center.`
+ | :sg:`origin -> (float, float) or None.`
+
+ .. attribute:: flip_x
+
+ | :sl:`Gets and sets whether the Image is flipped on the x axis.`
+ | :sg:`flip_x -> bool`
+
+ .. attribute:: flip_y
+
+ | :sl:`Gets and sets whether the Image is flipped on the y axis.`
+ | :sg:`flip_y -> bool`
+
+ .. attribute:: color
+
+ | :sl:`Gets and sets the Image color modifier.`
+ | :sg:`color -> Color`
+
+ .. attribute:: alpha
+
+ | :sl:`Gets and sets the Image alpha modifier.`
+ | :sg:`alpha -> float`
+
+ .. attribute:: blend_mode
+
+ | :sl:`Gets and sets the blend mode for the Image.`
+ | :sg:`blend_mode -> int`
+
+ .. attribute:: texture
+
+ | :sl:`Gets and sets the Texture the Image is based on.`
+ | :sg:`texture -> Texture`
+
+ .. attribute:: srcrect
+
+ | :sl:`Gets and sets the Rect the Image is based on.`
+ | :sg:`srcrect -> Rect`
+
+.. class:: Renderer
+
+ | :sl:`Create a 2D rendering context for a window.`
+ | :sg:`Renderer(window, index=-1, accelerated=-1, vsync=False, target_texture=False) -> Renderer`
+
+ .. classmethod:: from_window
+
+ | :sl:`Easy way to create a Renderer.`
+ | :sg:`from_window(window) -> Renderer`
+
+ .. attribute:: draw_blend_mode
+
+ | :sl:`Gets and sets the blend mode used by the drawing functions.`
+ | :sg:`draw_blend_mode -> int`
+
+ .. attribute:: draw_color
+
+ | :sl:`Gets and sets the color used by the drawing functions.`
+ | :sg:`draw_color -> Color`
+
+ .. method:: clear
+
+ | :sl:`Clear the current rendering target with the drawing color.`
+ | :sg:`clear() -> None`
+
+ .. method:: present
+
+ | :sl:`Updates the screen with any new rendering since previous call.`
+ | :sg:`present() -> None`
+
+ .. method:: get_viewport
+
+ | :sl:`Returns the drawing area on the target.`
+ | :sg:`get_viewport() -> Rect`
+
+ .. method:: set_viewport
+
+ | :sl:`Set the drawing area on the target. If area is None, the entire target will be used.`
+ | :sg:`set_viewport(area) -> None`
+
+ .. attribute:: logical_size
+
+ | :sl:`Gets and sets the logical size.`
+ | :sg:`logical_size -> (int width, int height)`
+
+ .. attribute:: scale
+
+ | :sl:`Gets and sets the scale.`
+ | :sg:`scale -> (float x_scale, float y_scale)`
+
+ .. attribute:: target
+
+ | :sl:`Gets and sets the render target. None represents the default target (the renderer).`
+ | :sg:`target -> Texture or None`
+
+ .. method:: blit
+
+ | :sl:`For compatibility purposes. Textures created by different Renderers cannot be shared!`
+ | :sg:`blit(source, dest, area=None, special_flags=0)-> Rect`
+
+ .. method:: draw_line
+
+ | :sl:`Draws a line.`
+ | :sg:`draw_line(p1, p2) -> None`
+
+ .. method:: draw_point
+
+ | :sl:`Draws a point.`
+ | :sg:`draw_point(point) -> None`
+
+ .. method:: draw_rect
+
+ | :sl:`Draws a rectangle.`
+ | :sg:`draw_rect(rect)-> None`
+
+ .. method:: fill_rect
+
+ | :sl:`Fills a rectangle.`
+ | :sg:`fill_rect(rect)-> None`
+
+ .. method:: to_surface
+
+ | :sl:`Read pixels from current render target and create a pygame.Surface. WARNING: Slow operation, use sparingly.`
+ | :sg:`to_surface(surface=None, area=None)-> Surface`
\ No newline at end of file
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sndarray.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sndarray.rst.txt
new file mode 100644
index 00000000..2a177649
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sndarray.rst.txt
@@ -0,0 +1,95 @@
+.. include:: common.txt
+
+:mod:`pygame.sndarray`
+======================
+
+.. module:: pygame.sndarray
+ :synopsis: pygame module for accessing sound sample data
+
+| :sl:`pygame module for accessing sound sample data`
+
+Functions to convert between NumPy arrays and Sound objects. This
+module will only be functional when pygame can use the external NumPy
+package. If NumPy can't be imported, ``surfarray`` becomes a ``MissingModule``
+object.
+
+Sound data is made of thousands of samples per second, and each sample is the
+amplitude of the wave at a particular moment in time. For example, in 22-kHz
+format, element number 5 of the array is the amplitude of the wave after
+5/22000 seconds.
+
+The arrays are indexed by the ``X`` axis first, followed by the ``Y`` axis.
+Each sample is an 8-bit or 16-bit integer, depending on the data format. A
+stereo sound file has two values per sample, while a mono sound file only has
+one.
+
+.. function:: array
+
+ | :sl:`copy Sound samples into an array`
+ | :sg:`array(Sound) -> array`
+
+ Creates a new array for the sound data and copies the samples. The array
+ will always be in the format returned from ``pygame.mixer.get_init()``.
+
+ .. ## pygame.sndarray.array ##
+
+.. function:: samples
+
+ | :sl:`reference Sound samples into an array`
+ | :sg:`samples(Sound) -> array`
+
+ Creates a new array that directly references the samples in a Sound object.
+ Modifying the array will change the Sound. The array will always be in the
+ format returned from ``pygame.mixer.get_init()``.
+
+ .. ## pygame.sndarray.samples ##
+
+.. function:: make_sound
+
+ | :sl:`convert an array into a Sound object`
+ | :sg:`make_sound(array) -> Sound`
+
+ Create a new playable Sound object from an array. The mixer module must be
+ initialized and the array format must be similar to the mixer audio format.
+
+ .. ## pygame.sndarray.make_sound ##
+
+.. function:: use_arraytype
+
+ | :sl:`Sets the array system to be used for sound arrays`
+ | :sg:`use_arraytype (arraytype) -> None`
+
+ DEPRECATED: Uses the requested array type for the module functions. The
+ only supported arraytype is ``'numpy'``. Other values will raise ValueError.
+ Using this function will raise a ``DeprecationWarning``.
+ .. ## pygame.sndarray.use_arraytype ##
+
+.. function:: get_arraytype
+
+ | :sl:`Gets the currently active array type.`
+ | :sg:`get_arraytype () -> str`
+
+ DEPRECATED: Returns the currently active array type. This will be a value of the
+ ``get_arraytypes()`` tuple and indicates which type of array module is used
+ for the array creation. Using this function will raise a ``DeprecationWarning``.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.sndarray.get_arraytype ##
+
+.. function:: get_arraytypes
+
+ | :sl:`Gets the array system types currently supported.`
+ | :sg:`get_arraytypes () -> tuple`
+
+ DEPRECATED: Checks, which array systems are available and returns them as a tuple of
+ strings. The values of the tuple can be used directly in the
+ :func:`pygame.sndarray.use_arraytype` () method. If no supported array
+ system could be found, None will be returned. Using this function will raise a
+ ``DeprecationWarning``.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.sndarray.get_arraytypes ##
+
+.. ## pygame.sndarray ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sprite.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sprite.rst.txt
new file mode 100644
index 00000000..82e8cbb1
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/sprite.rst.txt
@@ -0,0 +1,895 @@
+.. include:: common.txt
+
+:mod:`pygame.sprite`
+====================
+
+.. module:: pygame.sprite
+ :synopsis: pygame module with basic game object classes
+
+| :sl:`pygame module with basic game object classes`
+
+This module contains several simple classes to be used within games. There is
+the main Sprite class and several Group classes that contain Sprites. The use
+of these classes is entirely optional when using pygame. The classes are fairly
+lightweight and only provide a starting place for the code that is common to
+most games.
+
+The Sprite class is intended to be used as a base class for the different types
+of objects in the game. There is also a base Group class that simply stores
+sprites. A game could create new types of Group classes that operate on
+specially customized Sprite instances they contain.
+
+The basic Group class can draw the Sprites it contains to a Surface. The
+``Group.draw()`` method requires that each Sprite have a ``Surface.image``
+attribute and a ``Surface.rect``. The ``Group.clear()`` method requires these
+same attributes, and can be used to erase all the Sprites with background.
+There are also more advanced Groups: ``pygame.sprite.RenderUpdates()`` and
+``pygame.sprite.OrderedUpdates()``.
+
+Lastly, this module contains several collision functions. These help find
+sprites inside multiple groups that have intersecting bounding rectangles. To
+find the collisions, the Sprites are required to have a ``Surface.rect``
+attribute assigned.
+
+The groups are designed for high efficiency in removing and adding Sprites to
+them. They also allow cheap testing to see if a Sprite already exists in a
+Group. A given Sprite can exist in any number of groups. A game could use some
+groups to control object rendering, and a completely separate set of groups to
+control interaction or player movement. Instead of adding type attributes or
+bools to a derived Sprite class, consider keeping the Sprites inside organized
+Groups. This will allow for easier lookup later in the game.
+
+Sprites and Groups manage their relationships with the ``add()`` and
+``remove()`` methods. These methods can accept a single or multiple targets for
+membership. The default initializers for these classes also takes a single or
+list of targets for initial membership. It is safe to repeatedly add and remove
+the same Sprite from a Group.
+
+While it is possible to design sprite and group classes that don't derive from
+the Sprite and AbstractGroup classes below, it is strongly recommended that you
+extend those when you add a Sprite or Group class.
+
+Sprites are not thread safe. So lock them yourself if using threads.
+
+.. class:: Sprite
+
+ | :sl:`Simple base class for visible game objects.`
+ | :sg:`Sprite(*groups) -> Sprite`
+
+ The base class for visible game objects. Derived classes will want to
+ override the ``Sprite.update()`` and assign a ``Sprite.image`` and
+ ``Sprite.rect`` attributes. The initializer can accept any number of Group
+ instances to be added to.
+
+ When subclassing the Sprite, be sure to call the base initializer before
+ adding the Sprite to Groups. For example:
+
+ .. code-block:: python
+
+ class Block(pygame.sprite.Sprite):
+
+ # Constructor. Pass in the color of the block,
+ # and its x and y position
+ def __init__(self, color, width, height):
+ # Call the parent class (Sprite) constructor
+ pygame.sprite.Sprite.__init__(self)
+
+ # Create an image of the block, and fill it with a color.
+ # This could also be an image loaded from the disk.
+ self.image = pygame.Surface([width, height])
+ self.image.fill(color)
+
+ # Fetch the rectangle object that has the dimensions of the image
+ # Update the position of this object by setting the values of rect.x and rect.y
+ self.rect = self.image.get_rect()
+
+ .. method:: update
+
+ | :sl:`method to control sprite behavior`
+ | :sg:`update(*args, **kwargs) -> None`
+
+ The default implementation of this method does nothing; it's just a
+ convenient "hook" that you can override. This method is called by
+ ``Group.update()`` with whatever arguments you give it.
+
+ There is no need to use this method if not using the convenience method
+ by the same name in the Group class.
+
+ .. ## Sprite.update ##
+
+ .. method:: add
+
+ | :sl:`add the sprite to groups`
+ | :sg:`add(*groups) -> None`
+
+ Any number of Group instances can be passed as arguments. The Sprite will
+ be added to the Groups it is not already a member of.
+
+ .. ## Sprite.add ##
+
+ .. method:: remove
+
+ | :sl:`remove the sprite from groups`
+ | :sg:`remove(*groups) -> None`
+
+ Any number of Group instances can be passed as arguments. The Sprite will
+ be removed from the Groups it is currently a member of.
+
+ .. ## Sprite.remove ##
+
+ .. method:: kill
+
+ | :sl:`remove the Sprite from all Groups`
+ | :sg:`kill() -> None`
+
+ The Sprite is removed from all the Groups that contain it. This won't
+ change anything about the state of the Sprite. It is possible to continue
+ to use the Sprite after this method has been called, including adding it
+ to Groups.
+
+ .. ## Sprite.kill ##
+
+ .. method:: alive
+
+ | :sl:`does the sprite belong to any groups`
+ | :sg:`alive() -> bool`
+
+ Returns True when the Sprite belongs to one or more Groups.
+
+ .. ## Sprite.alive ##
+
+ .. method:: groups
+
+ | :sl:`list of Groups that contain this Sprite`
+ | :sg:`groups() -> group_list`
+
+ Return a list of all the Groups that contain this Sprite.
+
+ .. ## Sprite.groups ##
+
+ .. ## pygame.sprite.Sprite ##
+
+.. class:: WeakSprite
+
+ | :sl:`A subclass of Sprite that references its Groups weakly. This means that any group this belongs to that is not referenced anywhere else is garbage collected automatically.`
+ | :sg:`WeakSprite(*groups) -> WeakSprite`
+
+.. class:: DirtySprite
+
+ | :sl:`A subclass of Sprite with more attributes and features.`
+ | :sg:`DirtySprite(*groups) -> DirtySprite`
+
+ Extra DirtySprite attributes with their default values:
+
+ dirty = 1
+
+ ::
+
+ if set to 1, it is repainted and then set to 0 again
+ if set to 2 then it is always dirty ( repainted each frame,
+ flag is not reset)
+ 0 means that it is not dirty and therefore not repainted again
+
+ blendmode = 0
+
+ ::
+
+ its the special_flags argument of blit, blendmodes
+
+ source_rect = None
+
+ ::
+
+ source rect to use, remember that it is relative to
+ topleft (0,0) of self.image
+
+ visible = 1
+
+ ::
+
+ normally 1, if set to 0 it will not be repainted
+ (you must set it dirty too to be erased from screen)
+
+ layer = 0
+
+ ::
+
+ (READONLY value, it is read when adding it to the
+ LayeredDirty, for details see doc of LayeredDirty)
+
+ .. ## ##
+
+ .. ## pygame.sprite.DirtySprite ##
+
+.. class:: Group
+
+ | :sl:`A container class to hold and manage multiple Sprite objects.`
+ | :sg:`Group(*sprites) -> Group`
+
+ A simple container for Sprite objects. This class can be inherited to create
+ containers with more specific behaviors. The constructor takes any number of
+ Sprite arguments to add to the Group. The group supports the following
+ standard Python operations:
+
+ ::
+
+ in test if a Sprite is contained
+ len the number of Sprites contained
+ bool test if any Sprites are contained
+ iter iterate through all the Sprites
+
+ The Sprites in the Group are ordered only on python 3.6 and higher.
+ Below python 3.6 drawing and iterating over the Sprites is in no particular order.
+
+ .. method:: sprites
+
+ | :sl:`list of the Sprites this Group contains`
+ | :sg:`sprites() -> sprite_list`
+
+ Return a list of all the Sprites this group contains. You can also get an
+ iterator from the group, but you cannot iterate over a Group while
+ modifying it.
+
+ .. ## Group.sprites ##
+
+ .. method:: copy
+
+ | :sl:`duplicate the Group`
+ | :sg:`copy() -> Group`
+
+ Creates a new Group with all the same Sprites as the original. If you
+ have subclassed Group, the new object will have the same (sub-)class as
+ the original. This only works if the derived class's constructor takes
+ the same arguments as the Group class's.
+
+ .. ## Group.copy ##
+
+ .. method:: add
+
+ | :sl:`add Sprites to this Group`
+ | :sg:`add(*sprites) -> None`
+
+ Add any number of Sprites to this Group. This will only add Sprites that
+ are not already members of the Group.
+
+ Each sprite argument can also be a iterator containing Sprites.
+
+ .. ## Group.add ##
+
+ .. method:: remove
+
+ | :sl:`remove Sprites from the Group`
+ | :sg:`remove(*sprites) -> None`
+
+ Remove any number of Sprites from the Group. This will only remove
+ Sprites that are already members of the Group.
+
+ Each sprite argument can also be a iterator containing Sprites.
+
+ .. ## Group.remove ##
+
+ .. method:: has
+
+ | :sl:`test if a Group contains Sprites`
+ | :sg:`has(*sprites) -> bool`
+
+ Return True if the Group contains all of the given sprites. This is
+ similar to using the "in" operator on the Group ("if sprite in group:
+ ..."), which tests if a single Sprite belongs to a Group.
+
+ Each sprite argument can also be a iterator containing Sprites.
+
+ .. ## Group.has ##
+
+ .. method:: update
+
+ | :sl:`call the update method on contained Sprites`
+ | :sg:`update(*args, **kwargs) -> None`
+
+ Calls the ``update()`` method on all Sprites in the Group. The base
+ Sprite class has an update method that takes any number of arguments and
+ does nothing. The arguments passed to ``Group.update()`` will be passed
+ to each Sprite.
+
+ There is no way to get the return value from the ``Sprite.update()``
+ methods.
+
+ .. ## Group.update ##
+
+ .. method:: draw
+
+ | :sl:`blit the Sprite images`
+ | :sg:`draw(Surface, bgsurf=None, special_flags=0) -> List[Rect]`
+
+ Draws the contained Sprites to the Surface argument. This uses the
+ ``Sprite.image`` attribute for the source surface, and ``Sprite.rect``
+ for the position. ``special_flags`` is passed to ``Surface.blit()``.
+ ``bgsurf`` is unused in this method but ``LayeredDirty.draw()`` uses
+ it.
+
+ The Group does not keep sprites in any order, so the draw order is
+ arbitrary.
+
+ .. ## Group.draw ##
+
+ .. method:: clear
+
+ | :sl:`draw a background over the Sprites`
+ | :sg:`clear(Surface_dest, background) -> None`
+
+ Erases the Sprites used in the last ``Group.draw()`` call. The
+ destination Surface is cleared by filling the drawn Sprite positions with
+ the background.
+
+ The background is usually a Surface image the same dimensions as the
+ destination Surface. However, it can also be a callback function that
+ takes two arguments; the destination Surface and an area to clear. The
+ background callback function will be called several times each clear.
+
+ Here is an example callback that will clear the Sprites with solid red:
+
+ ::
+
+ def clear_callback(surf, rect):
+ color = 255, 0, 0
+ surf.fill(color, rect)
+
+ .. ## Group.clear ##
+
+ .. method:: empty
+
+ | :sl:`remove all Sprites`
+ | :sg:`empty() -> None`
+
+ Removes all Sprites from this Group.
+
+ .. ## Group.empty ##
+
+ .. ## pygame.sprite.Group ##
+
+.. class:: WeakDirtySprite
+
+ | :sl:`A subclass of WeakSprite and DirtySprite that combines the benefits of both classes.`
+ | :sg:`WeakDirtySprite(*groups) -> WeakDirtySprite`
+
+.. class:: RenderPlain
+
+ | :sl:`Same as pygame.sprite.Group`
+
+ This class is an alias to ``pygame.sprite.Group()``. It has no additional functionality.
+
+ .. ## pygame.sprite.RenderClear ##
+
+.. class:: RenderClear
+
+ | :sl:`Same as pygame.sprite.Group`
+
+ This class is an alias to ``pygame.sprite.Group()``. It has no additional functionality.
+
+ .. ## pygame.sprite.RenderClear ##
+
+.. class:: RenderUpdates
+
+ | :sl:`Group sub-class that tracks dirty updates.`
+ | :sg:`RenderUpdates(*sprites) -> RenderUpdates`
+
+ This class is derived from ``pygame.sprite.Group()``. It has an extended
+ ``draw()`` method that tracks the changed areas of the screen.
+
+ .. method:: draw
+
+ | :sl:`blit the Sprite images and track changed areas`
+ | :sg:`draw(surface, bgsurf=None, special_flags=0) -> Rect_list`
+
+ Draws all the Sprites to the surface, the same as ``Group.draw()``. This
+ method also returns a list of Rectangular areas on the screen that have
+ been changed. The returned changes include areas of the screen that have
+ been affected by previous ``Group.clear()`` calls. ``special_flags`` is
+ passed to ``Surface.blit()``.
+
+ The returned Rect list should be passed to ``pygame.display.update()``.
+ This will help performance on software driven display modes. This type of
+ updating is usually only helpful on destinations with non-animating
+ backgrounds.
+
+ .. ## RenderUpdates.draw ##
+
+ .. ## pygame.sprite.RenderUpdates ##
+
+.. function:: OrderedUpdates
+
+ | :sl:`RenderUpdates sub-class that draws Sprites in order of addition.`
+ | :sg:`OrderedUpdates(*sprites) -> OrderedUpdates`
+
+ This class derives from ``pygame.sprite.RenderUpdates()``. It maintains the
+ order in which the Sprites were added to the Group for rendering. This makes
+ adding and removing Sprites from the Group a little slower than regular
+ Groups.
+
+ .. ## pygame.sprite.OrderedUpdates ##
+
+.. class:: LayeredUpdates
+
+ | :sl:`LayeredUpdates is a sprite group that handles layers and draws like OrderedUpdates.`
+ | :sg:`LayeredUpdates(*sprites, **kwargs) -> LayeredUpdates`
+
+ This group is fully compatible with :class:`pygame.sprite.Sprite`.
+
+ You can set the default layer through kwargs using 'default_layer' and an
+ integer for the layer. The default layer is 0.
+
+ If the sprite you add has an attribute _layer then that layer will be used.
+ If the \**kwarg contains 'layer' then the sprites passed will be added to
+ that layer (overriding the ``sprite.layer`` attribute). If neither sprite
+ has attribute layer nor \**kwarg then the default layer is used to add the
+ sprites.
+
+ .. versionadded:: 1.8
+
+ .. method:: add
+
+ | :sl:`add a sprite or sequence of sprites to a group`
+ | :sg:`add(*sprites, **kwargs) -> None`
+
+ If the ``sprite(s)`` have an attribute layer then that is used for the
+ layer. If \**kwargs contains 'layer' then the ``sprite(s)`` will be added
+ to that argument (overriding the sprite layer attribute). If neither is
+ passed then the ``sprite(s)`` will be added to the default layer.
+
+ .. ## LayeredUpdates.add ##
+
+ .. method:: sprites
+
+ | :sl:`returns a ordered list of sprites (first back, last top).`
+ | :sg:`sprites() -> sprites`
+
+ .. ## LayeredUpdates.sprites ##
+
+ .. method:: draw
+
+ | :sl:`draw all sprites in the right order onto the passed surface.`
+ | :sg:`draw(surface, bgsurf=None, special_flags=0) -> Rect_list`
+
+ .. ## LayeredUpdates.draw ##
+
+ .. method:: get_sprites_at
+
+ | :sl:`returns a list with all sprites at that position.`
+ | :sg:`get_sprites_at(pos) -> colliding_sprites`
+
+ Bottom sprites first, top last.
+
+ .. ## LayeredUpdates.get_sprites_at ##
+
+ .. method:: get_sprite
+
+ | :sl:`returns the sprite at the index idx from the groups sprites`
+ | :sg:`get_sprite(idx) -> sprite`
+
+ Raises IndexOutOfBounds if the idx is not within range.
+
+ .. ## LayeredUpdates.get_sprite ##
+
+ .. method:: remove_sprites_of_layer
+
+ | :sl:`removes all sprites from a layer and returns them as a list.`
+ | :sg:`remove_sprites_of_layer(layer_nr) -> sprites`
+
+ .. ## LayeredUpdates.remove_sprites_of_layer ##
+
+ .. method:: layers
+
+ | :sl:`returns a list of layers defined (unique), sorted from bottom up.`
+ | :sg:`layers() -> layers`
+
+ .. ## LayeredUpdates.layers ##
+
+ .. method:: change_layer
+
+ | :sl:`changes the layer of the sprite`
+ | :sg:`change_layer(sprite, new_layer) -> None`
+
+ sprite must have been added to the renderer. It is not checked.
+
+ .. ## LayeredUpdates.change_layer ##
+
+ .. method:: get_layer_of_sprite
+
+ | :sl:`returns the layer that sprite is currently in.`
+ | :sg:`get_layer_of_sprite(sprite) -> layer`
+
+ If the sprite is not found then it will return the default layer.
+
+ .. ## LayeredUpdates.get_layer_of_sprite ##
+
+ .. method:: get_top_layer
+
+ | :sl:`returns the top layer`
+ | :sg:`get_top_layer() -> layer`
+
+ .. ## LayeredUpdates.get_top_layer ##
+
+ .. method:: get_bottom_layer
+
+ | :sl:`returns the bottom layer`
+ | :sg:`get_bottom_layer() -> layer`
+
+ .. ## LayeredUpdates.get_bottom_layer ##
+
+ .. method:: move_to_front
+
+ | :sl:`brings the sprite to front layer`
+ | :sg:`move_to_front(sprite) -> None`
+
+ Brings the sprite to front, changing sprite layer to topmost layer (added
+ at the end of that layer).
+
+ .. ## LayeredUpdates.move_to_front ##
+
+ .. method:: move_to_back
+
+ | :sl:`moves the sprite to the bottom layer`
+ | :sg:`move_to_back(sprite) -> None`
+
+ Moves the sprite to the bottom layer, moving it behind all other layers
+ and adding one additional layer.
+
+ .. ## LayeredUpdates.move_to_back ##
+
+ .. method:: get_top_sprite
+
+ | :sl:`returns the topmost sprite`
+ | :sg:`get_top_sprite() -> Sprite`
+
+ .. ## LayeredUpdates.get_top_sprite ##
+
+ .. method:: get_sprites_from_layer
+
+ | :sl:`returns all sprites from a layer, ordered by how they where added`
+ | :sg:`get_sprites_from_layer(layer) -> sprites`
+
+ Returns all sprites from a layer, ordered by how they where added. It
+ uses linear search and the sprites are not removed from layer.
+
+ .. ## LayeredUpdates.get_sprites_from_layer ##
+
+ .. method:: switch_layer
+
+ | :sl:`switches the sprites from layer1 to layer2`
+ | :sg:`switch_layer(layer1_nr, layer2_nr) -> None`
+
+ The layers number must exist, it is not checked.
+
+ .. ## LayeredUpdates.switch_layer ##
+
+ .. ## pygame.sprite.LayeredUpdates ##
+
+.. class:: LayeredDirty
+
+ | :sl:`LayeredDirty group is for DirtySprite objects. Subclasses LayeredUpdates.`
+ | :sg:`LayeredDirty(*sprites, **kwargs) -> LayeredDirty`
+
+ This group requires :class:`pygame.sprite.DirtySprite` or any sprite that
+ has the following attributes:
+
+ ::
+
+ image, rect, dirty, visible, blendmode (see doc of DirtySprite).
+
+ It uses the dirty flag technique and is therefore faster than the
+ :class:`pygame.sprite.RenderUpdates` if you have many static sprites. It
+ also switches automatically between dirty rect update and full screen
+ drawing, so you do not have to worry what would be faster.
+
+ Same as for the :class:`pygame.sprite.Group`. You can specify some
+ additional attributes through kwargs:
+
+ ::
+
+ _use_update: True/False default is False
+ _default_layer: default layer where sprites without a layer are added.
+ _time_threshold: threshold time for switching between dirty rect mode
+ and fullscreen mode, defaults to 1000./80 == 1000./fps
+
+ .. versionadded:: 1.8
+
+ .. method:: draw
+
+ | :sl:`draw all sprites in the right order onto the passed surface.`
+ | :sg:`draw(surface, bgsurf=None, special_flags=None) -> Rect_list`
+
+ You can pass the background too. If a background is already set, then the
+ bgsurf argument has no effect. If present, the ``special_flags`` argument is
+ always passed to ``Surface.blit()``, overriding ``DirtySprite.blendmode``.
+ If ``special_flags`` is not present, ``DirtySprite.blendmode`` is passed
+ to the ``Surface.blit()`` instead.
+
+ .. ## LayeredDirty.draw ##
+
+ .. method:: clear
+
+ | :sl:`used to set background`
+ | :sg:`clear(surface, bgd) -> None`
+
+ .. ## LayeredDirty.clear ##
+
+ .. method:: repaint_rect
+
+ | :sl:`repaints the given area`
+ | :sg:`repaint_rect(screen_rect) -> None`
+
+ screen_rect is in screen coordinates.
+
+ .. ## LayeredDirty.repaint_rect ##
+
+ .. method:: set_clip
+
+ | :sl:`clip the area where to draw. Just pass None (default) to reset the clip`
+ | :sg:`set_clip(screen_rect=None) -> None`
+
+ .. ## LayeredDirty.set_clip ##
+
+ .. method:: get_clip
+
+ | :sl:`clip the area where to draw. Just pass None (default) to reset the clip`
+ | :sg:`get_clip() -> Rect`
+
+ .. ## LayeredDirty.get_clip ##
+
+ .. method:: change_layer
+
+ | :sl:`changes the layer of the sprite`
+ | :sg:`change_layer(sprite, new_layer) -> None`
+
+ sprite must have been added to the renderer. It is not checked.
+
+ .. ## LayeredDirty.change_layer ##
+
+ .. method:: set_timing_treshold
+
+ | :sl:`sets the threshold in milliseconds`
+ | :sg:`set_timing_treshold(time_ms) -> None`
+
+ DEPRECATED: Use set_timing_threshold() instead.
+
+ .. deprecated:: 2.1.1
+
+ .. ## LayeredDirty.set_timing_treshold ##
+
+ .. method:: set_timing_threshold
+
+ | :sl:`sets the threshold in milliseconds`
+ | :sg:`set_timing_threshold(time_ms) -> None`
+
+ Defaults to 1000.0 / 80.0. This means that the screen will be painted
+ using the flip method rather than the update method if the update
+ method is taking so long to update the screen that the frame rate falls
+ below 80 frames per second.
+
+ .. versionadded:: 2.1.1
+
+ :raises TypeError: if ``time_ms`` is not int or float
+
+ .. ## LayeredDirty.set_timing_threshold ##
+
+ .. ## pygame.sprite.LayeredDirty ##
+
+.. function:: GroupSingle
+
+ | :sl:`Group container that holds a single sprite.`
+ | :sg:`GroupSingle(sprite=None) -> GroupSingle`
+
+ The GroupSingle container only holds a single Sprite. When a new Sprite is
+ added, the old one is removed.
+
+ There is a special property, ``GroupSingle.sprite``, that accesses the
+ Sprite that this Group contains. It can be None when the Group is empty. The
+ property can also be assigned to add a Sprite into the GroupSingle
+ container.
+
+ .. ## pygame.sprite.GroupSingle ##
+
+.. function:: spritecollide
+
+ | :sl:`Find sprites in a group that intersect another sprite.`
+ | :sg:`spritecollide(sprite, group, dokill, collided = None) -> Sprite_list`
+
+ Return a list containing all Sprites in a Group that intersect with another
+ Sprite. Intersection is determined by comparing the ``Sprite.rect``
+ attribute of each Sprite.
+
+ The dokill argument is a bool. If set to True, all Sprites that collide will
+ be removed from the Group.
+
+ The collided argument is a callback function used to calculate if two
+ sprites are colliding. it should take two sprites as values, and return a
+ bool value indicating if they are colliding. If collided is not passed, all
+ sprites must have a "rect" value, which is a rectangle of the sprite area,
+ which will be used to calculate the collision.
+
+ collided callables:
+
+ ::
+
+ collide_rect, collide_rect_ratio, collide_circle,
+ collide_circle_ratio, collide_mask
+
+ Example:
+
+ .. code-block:: python
+
+ # See if the Sprite block has collided with anything in the Group block_list
+ # The True flag will remove the sprite in block_list
+ blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True)
+
+ # Check the list of colliding sprites, and add one to the score for each one
+ for block in blocks_hit_list:
+ score +=1
+
+ .. ## pygame.sprite.spritecollide ##
+
+.. function:: collide_rect
+
+ | :sl:`Collision detection between two sprites, using rects.`
+ | :sg:`collide_rect(left, right) -> bool`
+
+ Tests for collision between two sprites. Uses the pygame rect colliderect
+ function to calculate the collision. Intended to be passed as a collided
+ callback function to the \*collide functions. Sprites must have a "rect"
+ attributes.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.sprite.collide_rect ##
+
+.. function:: collide_rect_ratio
+
+ | :sl:`Collision detection between two sprites, using rects scaled to a ratio.`
+ | :sg:`collide_rect_ratio(ratio) -> collided_callable`
+
+ A callable class that checks for collisions between two sprites, using a
+ scaled version of the sprites rects.
+
+ Is created with a ratio, the instance is then intended to be passed as a
+ collided callback function to the \*collide functions.
+
+ A ratio is a floating point number - 1.0 is the same size, 2.0 is twice as
+ big, and 0.5 is half the size.
+
+ .. versionadded:: 1.8.1
+
+ .. ## pygame.sprite.collide_rect_ratio ##
+
+.. function:: collide_circle
+
+ | :sl:`Collision detection between two sprites, using circles.`
+ | :sg:`collide_circle(left, right) -> bool`
+
+ Tests for collision between two sprites, by testing to see if two circles
+ centered on the sprites overlap. If the sprites have a "radius" attribute,
+ that is used to create the circle, otherwise a circle is created that is big
+ enough to completely enclose the sprites rect as given by the "rect"
+ attribute. Intended to be passed as a collided callback function to the
+ \*collide functions. Sprites must have a "rect" and an optional "radius"
+ attribute.
+
+ .. versionadded:: 1.8.1
+
+ .. ## pygame.sprite.collide_circle ##
+
+.. function:: collide_circle_ratio
+
+ | :sl:`Collision detection between two sprites, using circles scaled to a ratio.`
+ | :sg:`collide_circle_ratio(ratio) -> collided_callable`
+
+ A callable class that checks for collisions between two sprites, using a
+ scaled version of the sprites radius.
+
+ Is created with a floating point ratio, the instance is then intended to be
+ passed as a collided callback function to the \*collide functions.
+
+ A ratio is a floating point number - 1.0 is the same size, 2.0 is twice as
+ big, and 0.5 is half the size.
+
+ The created callable tests for collision between two sprites, by testing to
+ see if two circles centered on the sprites overlap, after scaling the
+ circles radius by the stored ratio. If the sprites have a "radius"
+ attribute, that is used to create the circle, otherwise a circle is created
+ that is big enough to completely enclose the sprites rect as given by the
+ "rect" attribute. Intended to be passed as a collided callback function to
+ the \*collide functions. Sprites must have a "rect" and an optional "radius"
+ attribute.
+
+ .. versionadded:: 1.8.1
+
+ .. ## pygame.sprite.collide_circle_ratio ##
+
+.. function:: collide_mask
+
+ | :sl:`Collision detection between two sprites, using masks.`
+ | :sg:`collide_mask(sprite1, sprite2) -> (int, int)`
+ | :sg:`collide_mask(sprite1, sprite2) -> None`
+
+ Tests for collision between two sprites, by testing if their bitmasks
+ overlap (uses :func:`pygame.mask.Mask.overlap`). If the sprites have a
+ ``mask`` attribute, it is used as the mask, otherwise a mask is created from
+ the sprite's ``image`` (uses :func:`pygame.mask.from_surface`). Sprites must
+ have a ``rect`` attribute; the ``mask`` attribute is optional.
+
+ The first point of collision between the masks is returned. The collision
+ point is offset from ``sprite1``'s mask's topleft corner (which is always
+ (0, 0)). The collision point is a position within the mask and is not
+ related to the actual screen position of ``sprite1``.
+
+ This function is intended to be passed as a ``collided`` callback function
+ to the group collide functions (see :meth:`spritecollide`,
+ :meth:`groupcollide`, :meth:`spritecollideany`).
+
+ .. note::
+ To increase performance, create and set a ``mask`` attribute for all
+ sprites that will use this function to check for collisions. Otherwise,
+ each time this function is called it will create new masks.
+
+ .. note::
+ A new mask needs to be recreated each time a sprite's image is changed
+ (e.g. if a new image is used or the existing image is rotated).
+
+ ::
+
+ # Example of mask creation for a sprite.
+ sprite.mask = pygame.mask.from_surface(sprite.image)
+
+ :returns: first point of collision between the masks or ``None`` if no
+ collision
+ :rtype: tuple(int, int) or NoneType
+
+ .. versionadded:: 1.8.0
+
+ .. ## pygame.sprite.collide_mask ##
+
+.. function:: groupcollide
+
+ | :sl:`Find all sprites that collide between two groups.`
+ | :sg:`groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict`
+
+ This will find collisions between all the Sprites in two groups.
+ Collision is determined by comparing the ``Sprite.rect`` attribute of
+ each Sprite or by using the collided function if it is not None.
+
+ Every Sprite inside group1 is added to the return dictionary. The value for
+ each item is the list of Sprites in group2 that intersect.
+
+ If either dokill argument is True, the colliding Sprites will be removed
+ from their respective Group.
+
+ The collided argument is a callback function used to calculate if two sprites are
+ colliding. It should take two sprites as values and return a bool value
+ indicating if they are colliding. If collided is not passed, then all
+ sprites must have a "rect" value, which is a rectangle of the sprite area,
+ which will be used to calculate the collision.
+
+ .. ## pygame.sprite.groupcollide ##
+
+.. function:: spritecollideany
+
+ | :sl:`Simple test if a sprite intersects anything in a group.`
+ | :sg:`spritecollideany(sprite, group, collided = None) -> Sprite` Collision with the returned sprite.
+ | :sg:`spritecollideany(sprite, group, collided = None) -> None` No collision
+
+ If the sprite collides with any single sprite in the group, a single
+ sprite from the group is returned. On no collision None is returned.
+
+ If you don't need all the features of the ``pygame.sprite.spritecollide()`` function, this
+ function will be a bit quicker.
+
+ The collided argument is a callback function used to calculate if two sprites are
+ colliding. It should take two sprites as values and return a bool value
+ indicating if they are colliding. If collided is not passed, then all
+ sprites must have a "rect" value, which is a rectangle of the sprite area,
+ which will be used to calculate the collision.
+
+ .. ## pygame.sprite.spritecollideany ##
+
+.. ## ##
+
+.. ## pygame.sprite ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/surface.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/surface.rst.txt
new file mode 100644
index 00000000..82466fcc
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/surface.rst.txt
@@ -0,0 +1,949 @@
+.. include:: common.txt
+
+:mod:`pygame.Surface`
+=====================
+
+.. currentmodule:: pygame
+
+.. class:: Surface
+
+ | :sl:`pygame object for representing images`
+ | :sg:`Surface((width, height), flags=0, depth=0, masks=None) -> Surface`
+ | :sg:`Surface((width, height), flags=0, Surface) -> Surface`
+
+ A pygame Surface is used to represent any image. The Surface has a fixed
+ resolution and pixel format. Surfaces with 8-bit pixels use a color palette
+ to map to 24-bit color.
+
+ Call :meth:`pygame.Surface()` to create a new image object. The Surface will
+ be cleared to all black. The only required arguments are the sizes. With no
+ additional arguments, the Surface will be created in a format that best
+ matches the display Surface.
+
+ The pixel format can be controlled by passing the bit depth or an existing
+ Surface. The flags argument is a bitmask of additional features for the
+ surface. You can pass any combination of these flags:
+
+ ::
+
+ HWSURFACE (obsolete in pygame 2) creates the image in video memory
+ SRCALPHA the pixel format will include a per-pixel alpha
+
+ Both flags are only a request, and may not be possible for all displays and
+ formats.
+
+ Advance users can combine a set of bitmasks with a depth value. The masks
+ are a set of 4 integers representing which bits in a pixel will represent
+ each color. Normal Surfaces should not require the masks argument.
+
+ Surfaces can have many extra attributes like alpha planes, colorkeys, source
+ rectangle clipping. These functions mainly effect how the Surface is blitted
+ to other Surfaces. The blit routines will attempt to use hardware
+ acceleration when possible, otherwise they will use highly optimized
+ software blitting methods.
+
+ There are three types of transparency supported in pygame: colorkeys,
+ surface alphas, and pixel alphas. Surface alphas can be mixed with
+ colorkeys, but an image with per pixel alphas cannot use the other modes.
+ Colorkey transparency makes a single color value transparent. Any pixels
+ matching the colorkey will not be drawn. The surface alpha value is a single
+ value that changes the transparency for the entire image. A surface alpha of
+ 255 is opaque, and a value of 0 is completely transparent.
+
+ Per pixel alphas are different because they store a transparency value for
+ every pixel. This allows for the most precise transparency effects, but it
+ also the slowest. Per pixel alphas cannot be mixed with surface alpha and
+ colorkeys.
+
+ There is support for pixel access for the Surfaces. Pixel access on hardware
+ surfaces is slow and not recommended. Pixels can be accessed using the
+ :meth:`get_at()` and :meth:`set_at()` functions. These methods are fine for
+ simple access, but will be considerably slow when doing of pixel work with
+ them. If you plan on doing a lot of pixel level work, it is recommended to
+ use a :class:`pygame.PixelArray`, which gives an array like view of the
+ surface. For involved mathematical manipulations try the
+ :mod:`pygame.surfarray` module (It's quite quick, but requires NumPy.)
+
+ Any functions that directly access a surface's pixel data will need that
+ surface to be lock()'ed. These functions can :meth:`lock()` and
+ :meth:`unlock()` the surfaces themselves without assistance. But, if a
+ function will be called many times, there will be a lot of overhead for
+ multiple locking and unlocking of the surface. It is best to lock the
+ surface manually before making the function call many times, and then
+ unlocking when you are finished. All functions that need a locked surface
+ will say so in their docs. Remember to leave the Surface locked only while
+ necessary.
+
+ Surface pixels are stored internally as a single number that has all the
+ colors encoded into it. Use the :meth:`map_rgb()` and
+ :meth:`unmap_rgb()` to convert between individual red, green, and blue
+ values into a packed integer for that Surface.
+
+ Surfaces can also reference sections of other Surfaces. These are created
+ with the :meth:`subsurface()` method. Any change to either Surface will
+ effect the other.
+
+ Each Surface contains a clipping area. By default the clip area covers the
+ entire Surface. If it is changed, all drawing operations will only effect
+ the smaller area.
+
+ .. method:: blit
+
+ | :sl:`draw one image onto another`
+ | :sg:`blit(source, dest, area=None, special_flags=0) -> Rect`
+
+ Draws a source Surface onto this Surface. The draw can be positioned with
+ the dest argument. The dest argument can either be a pair of coordinates representing the position of
+ the upper left corner of the blit or a Rect, where the upper left corner of the rectangle will be used as the
+ position for the blit. The size of the destination rectangle does not
+ effect the blit.
+
+ An optional area rectangle can be passed as well. This represents a
+ smaller portion of the source Surface to draw.
+
+ .. versionadded:: 1.8
+ Optional ``special_flags``: ``BLEND_ADD``, ``BLEND_SUB``,
+ ``BLEND_MULT``, ``BLEND_MIN``, ``BLEND_MAX``.
+
+ .. versionadded:: 1.8.1
+ Optional ``special_flags``: ``BLEND_RGBA_ADD``, ``BLEND_RGBA_SUB``,
+ ``BLEND_RGBA_MULT``, ``BLEND_RGBA_MIN``, ``BLEND_RGBA_MAX``
+ ``BLEND_RGB_ADD``, ``BLEND_RGB_SUB``, ``BLEND_RGB_MULT``,
+ ``BLEND_RGB_MIN``, ``BLEND_RGB_MAX``.
+
+ .. versionadded:: 1.9.2
+ Optional ``special_flags``: ``BLEND_PREMULTIPLIED``
+
+ .. versionadded:: 2.0.0
+ Optional ``special_flags``: ``BLEND_ALPHA_SDL2`` - Uses the SDL2 blitter for alpha blending,
+ this gives different results than the default blitter, which is modelled after SDL1, due to
+ different approximations used for the alpha blending formula. The SDL2 blitter also supports
+ RLE on alpha blended surfaces which the pygame one does not.
+
+ The return rectangle is the area of the affected pixels, excluding any
+ pixels outside the destination Surface, or outside the clipping area.
+
+ Pixel alphas will be ignored when blitting to an 8 bit Surface.
+
+ For a surface with colorkey or blanket alpha, a blit to self may give
+ slightly different colors than a non self-blit.
+
+ .. ## Surface.blit ##
+
+ .. method:: blits
+
+ | :sl:`draw many images onto another`
+ | :sg:`blits(blit_sequence=((source, dest), ...), doreturn=1) -> [Rect, ...] or None`
+ | :sg:`blits(((source, dest, area), ...)) -> [Rect, ...]`
+ | :sg:`blits(((source, dest, area, special_flags), ...)) -> [Rect, ...]`
+
+ Draws many surfaces onto this Surface. It takes a sequence as input,
+ with each of the elements corresponding to the ones of :meth:`blit()`.
+ It needs at minimum a sequence of (source, dest).
+
+ :param blit_sequence: a sequence of surfaces and arguments to blit them,
+ they correspond to the :meth:`blit()` arguments
+ :param doreturn: if ``True``, return a list of rects of the areas changed,
+ otherwise return ``None``
+
+ :returns: a list of rects of the areas changed if ``doreturn`` is
+ ``True``, otherwise ``None``
+ :rtype: list or None
+
+ New in pygame 1.9.4.
+
+ .. ## Surface.blits ##
+
+
+ .. method:: convert
+
+ | :sl:`change the pixel format of an image`
+ | :sg:`convert(Surface=None) -> Surface`
+ | :sg:`convert(depth, flags=0) -> Surface`
+ | :sg:`convert(masks, flags=0) -> Surface`
+
+ Creates a new copy of the Surface with the pixel format changed. The new
+ pixel format can be determined from another existing Surface. Otherwise
+ depth, flags, and masks arguments can be used, similar to the
+ :meth:`pygame.Surface()` call.
+
+ If no arguments are passed the new Surface will have the same pixel
+ format as the display Surface. This is always the fastest format for
+ blitting. It is a good idea to convert all Surfaces before they are
+ blitted many times.
+
+ The converted Surface will have no pixel alphas. They will be stripped if
+ the original had them. See :meth:`convert_alpha()` for preserving or
+ creating per-pixel alphas.
+
+ The new copy will have the same class as the copied surface. This lets
+ as Surface subclass inherit this method without the need to override,
+ unless subclass specific instance attributes also need copying.
+
+ .. ## Surface.convert ##
+
+ .. method:: convert_alpha
+
+ | :sl:`change the pixel format of an image including per pixel alphas`
+ | :sg:`convert_alpha(Surface) -> Surface`
+ | :sg:`convert_alpha() -> Surface`
+
+ Creates a new copy of the surface with the desired pixel format. The new
+ surface will be in a format suited for quick blitting to the given format
+ with per pixel alpha. If no surface is given, the new surface will be
+ optimized for blitting to the current display.
+
+ Unlike the :meth:`convert()` method, the pixel format for the new
+ image will not be exactly the same as the requested source, but it will
+ be optimized for fast alpha blitting to the destination.
+
+ As with :meth:`convert()` the returned surface has the same class as
+ the converted surface.
+
+ .. ## Surface.convert_alpha ##
+
+ .. method:: copy
+
+ | :sl:`create a new copy of a Surface`
+ | :sg:`copy() -> Surface`
+
+ Makes a duplicate copy of a Surface. The new surface will have the same
+ pixel formats, color palettes, transparency settings, and class as the
+ original. If a Surface subclass also needs to copy any instance specific
+ attributes then it should override ``copy()``.
+
+ .. ## Surface.copy ##
+
+ .. method:: fill
+
+ | :sl:`fill Surface with a solid color`
+ | :sg:`fill(color, rect=None, special_flags=0) -> Rect`
+
+ Fill the Surface with a solid color. If no rect argument is given the
+ entire Surface will be filled. The rect argument will limit the fill to a
+ specific area. The fill will also be contained by the Surface clip area.
+
+ The color argument can be either a ``RGB`` sequence, a ``RGBA`` sequence
+ or a mapped color index. If using ``RGBA``, the Alpha (A part of
+ ``RGBA``) is ignored unless the surface uses per pixel alpha (Surface has
+ the ``SRCALPHA`` flag).
+
+ .. versionadded:: 1.8
+ Optional ``special_flags``: ``BLEND_ADD``, ``BLEND_SUB``,
+ ``BLEND_MULT``, ``BLEND_MIN``, ``BLEND_MAX``.
+
+ .. versionadded:: 1.8.1
+ Optional ``special_flags``: ``BLEND_RGBA_ADD``, ``BLEND_RGBA_SUB``,
+ ``BLEND_RGBA_MULT``, ``BLEND_RGBA_MIN``, ``BLEND_RGBA_MAX``
+ ``BLEND_RGB_ADD``, ``BLEND_RGB_SUB``, ``BLEND_RGB_MULT``,
+ ``BLEND_RGB_MIN``, ``BLEND_RGB_MAX``.
+
+ This will return the affected Surface area.
+
+ .. ## Surface.fill ##
+
+ .. method:: scroll
+
+ | :sl:`Shift the surface image in place`
+ | :sg:`scroll(dx=0, dy=0) -> None`
+
+ Move the image by dx pixels right and dy pixels down. dx and dy may be
+ negative for left and up scrolls respectively. Areas of the surface that
+ are not overwritten retain their original pixel values. Scrolling is
+ contained by the Surface clip area. It is safe to have dx and dy values
+ that exceed the surface size.
+
+ .. versionadded:: 1.9
+
+ .. ## Surface.scroll ##
+
+ .. method:: set_colorkey
+
+ | :sl:`Set the transparent colorkey`
+ | :sg:`set_colorkey(Color, flags=0) -> None`
+ | :sg:`set_colorkey(None) -> None`
+
+ Set the current color key for the Surface. When blitting this Surface
+ onto a destination, any pixels that have the same color as the colorkey
+ will be transparent. The color can be an ``RGB`` color or a mapped color
+ integer. If ``None`` is passed, the colorkey will be unset.
+
+ The colorkey will be ignored if the Surface is formatted to use per pixel
+ alpha values. The colorkey can be mixed with the full Surface alpha
+ value.
+
+ The optional flags argument can be set to ``pygame.RLEACCEL`` to provide
+ better performance on non accelerated displays. An ``RLEACCEL`` Surface
+ will be slower to modify, but quicker to blit as a source.
+
+ .. ## Surface.set_colorkey ##
+
+ .. method:: get_colorkey
+
+ | :sl:`Get the current transparent colorkey`
+ | :sg:`get_colorkey() -> RGB or None`
+
+ Return the current colorkey value for the Surface. If the colorkey is not
+ set then ``None`` is returned.
+
+ .. ## Surface.get_colorkey ##
+
+ .. method:: set_alpha
+
+ | :sl:`set the alpha value for the full Surface image`
+ | :sg:`set_alpha(value, flags=0) -> None`
+ | :sg:`set_alpha(None) -> None`
+
+ Set the current alpha value for the Surface. When blitting this Surface
+ onto a destination, the pixels will be drawn slightly transparent. The
+ alpha value is an integer from 0 to 255, 0 is fully transparent and 255
+ is fully opaque. If ``None`` is passed for the alpha value, then alpha
+ blending will be disabled, including per-pixel alpha.
+
+ This value is different than the per pixel Surface alpha. For a surface
+ with per pixel alpha, blanket alpha is ignored and ``None`` is returned.
+
+ .. versionchanged:: 2.0 per-surface alpha can be combined with per-pixel
+ alpha.
+
+ The optional flags argument can be set to ``pygame.RLEACCEL`` to provide
+ better performance on non accelerated displays. An ``RLEACCEL`` Surface
+ will be slower to modify, but quicker to blit as a source.
+
+ .. ## Surface.set_alpha ##
+
+ .. method:: get_alpha
+
+ | :sl:`get the current Surface transparency value`
+ | :sg:`get_alpha() -> int_value`
+
+ Return the current alpha value for the Surface.
+
+ .. ## Surface.get_alpha ##
+
+ .. method:: lock
+
+ | :sl:`lock the Surface memory for pixel access`
+ | :sg:`lock() -> None`
+
+ Lock the pixel data of a Surface for access. On accelerated Surfaces, the
+ pixel data may be stored in volatile video memory or nonlinear compressed
+ forms. When a Surface is locked the pixel memory becomes available to
+ access by regular software. Code that reads or writes pixel values will
+ need the Surface to be locked.
+
+ Surfaces should not remain locked for more than necessary. A locked
+ Surface can often not be displayed or managed by pygame.
+
+ Not all Surfaces require locking. The :meth:`mustlock()` method can
+ determine if it is actually required. There is no performance penalty for
+ locking and unlocking a Surface that does not need it.
+
+ All pygame functions will automatically lock and unlock the Surface data
+ as needed. If a section of code is going to make calls that will
+ repeatedly lock and unlock the Surface many times, it can be helpful to
+ wrap the block inside a lock and unlock pair.
+
+ It is safe to nest locking and unlocking calls. The surface will only be
+ unlocked after the final lock is released.
+
+ .. ## Surface.lock ##
+
+ .. method:: unlock
+
+ | :sl:`unlock the Surface memory from pixel access`
+ | :sg:`unlock() -> None`
+
+ Unlock the Surface pixel data after it has been locked. The unlocked
+ Surface can once again be drawn and managed by pygame. See the
+ :meth:`lock()` documentation for more details.
+
+ All pygame functions will automatically lock and unlock the Surface data
+ as needed. If a section of code is going to make calls that will
+ repeatedly lock and unlock the Surface many times, it can be helpful to
+ wrap the block inside a lock and unlock pair.
+
+ It is safe to nest locking and unlocking calls. The surface will only be
+ unlocked after the final lock is released.
+
+ .. ## Surface.unlock ##
+
+ .. method:: mustlock
+
+ | :sl:`test if the Surface requires locking`
+ | :sg:`mustlock() -> bool`
+
+ Returns ``True`` if the Surface is required to be locked to access pixel
+ data. Usually pure software Surfaces do not require locking. This method
+ is rarely needed, since it is safe and quickest to just lock all Surfaces
+ as needed.
+
+ All pygame functions will automatically lock and unlock the Surface data
+ as needed. If a section of code is going to make calls that will
+ repeatedly lock and unlock the Surface many times, it can be helpful to
+ wrap the block inside a lock and unlock pair.
+
+ .. ## Surface.mustlock ##
+
+ .. method:: get_locked
+
+ | :sl:`test if the Surface is current locked`
+ | :sg:`get_locked() -> bool`
+
+ Returns ``True`` when the Surface is locked. It doesn't matter how many
+ times the Surface is locked.
+
+ .. ## Surface.get_locked ##
+
+ .. method:: get_locks
+
+ | :sl:`Gets the locks for the Surface`
+ | :sg:`get_locks() -> tuple`
+
+ Returns the currently existing locks for the Surface.
+
+ .. ## Surface.get_locks ##
+
+ .. method:: get_at
+
+ | :sl:`get the color value at a single pixel`
+ | :sg:`get_at((x, y)) -> Color`
+
+ Return a copy of the ``RGBA`` Color value at the given pixel. If the
+ Surface has no per pixel alpha, then the alpha value will always be 255
+ (opaque). If the pixel position is outside the area of the Surface an
+ ``IndexError`` exception will be raised.
+
+ Getting and setting pixels one at a time is generally too slow to be used
+ in a game or realtime situation. It is better to use methods which
+ operate on many pixels at a time like with the blit, fill and draw
+ methods - or by using :mod:`pygame.surfarray`/:mod:`pygame.PixelArray`.
+
+ This function will temporarily lock and unlock the Surface as needed.
+
+ .. versionadded:: 1.9
+ Returning a Color instead of tuple. Use ``tuple(surf.get_at((x,y)))``
+ if you want a tuple, and not a Color. This should only matter if
+ you want to use the color as a key in a dict.
+
+ .. ## Surface.get_at ##
+
+ .. method:: set_at
+
+ | :sl:`set the color value for a single pixel`
+ | :sg:`set_at((x, y), Color) -> None`
+
+ Set the ``RGBA`` or mapped integer color value for a single pixel. If the
+ Surface does not have per pixel alphas, the alpha value is ignored.
+ Setting pixels outside the Surface area or outside the Surface clipping
+ will have no effect.
+
+ Getting and setting pixels one at a time is generally too slow to be used
+ in a game or realtime situation.
+
+ This function will temporarily lock and unlock the Surface as needed.
+
+ .. note:: If the surface is palettized, the pixel color will be set to the
+ most similar color in the palette.
+
+ .. ## Surface.set_at ##
+
+ .. method:: get_at_mapped
+
+ | :sl:`get the mapped color value at a single pixel`
+ | :sg:`get_at_mapped((x, y)) -> Color`
+
+ Return the integer value of the given pixel. If the pixel position is
+ outside the area of the Surface an ``IndexError`` exception will be
+ raised.
+
+ This method is intended for pygame unit testing. It unlikely has any use
+ in an application.
+
+ This function will temporarily lock and unlock the Surface as needed.
+
+ .. versionadded:: 1.9.2
+
+ .. ## Surface.get_at_mapped ##
+
+ .. method:: get_palette
+
+ | :sl:`get the color index palette for an 8-bit Surface`
+ | :sg:`get_palette() -> [RGB, RGB, RGB, ...]`
+
+ Return a list of up to 256 color elements that represent the indexed
+ colors used in an 8-bit Surface. The returned list is a copy of the
+ palette, and changes will have no effect on the Surface.
+
+ Returning a list of ``Color(with length 3)`` instances instead of tuples.
+
+ .. versionadded:: 1.9
+
+ .. ## Surface.get_palette ##
+
+ .. method:: get_palette_at
+
+ | :sl:`get the color for a single entry in a palette`
+ | :sg:`get_palette_at(index) -> RGB`
+
+ Returns the red, green, and blue color values for a single index in a
+ Surface palette. The index should be a value from 0 to 255.
+
+ .. versionadded:: 1.9
+ Returning ``Color(with length 3)`` instance instead of a tuple.
+
+ .. ## Surface.get_palette_at ##
+
+ .. method:: set_palette
+
+ | :sl:`set the color palette for an 8-bit Surface`
+ | :sg:`set_palette([RGB, RGB, RGB, ...]) -> None`
+
+ Set the full palette for an 8-bit Surface. This will replace the colors in
+ the existing palette. A partial palette can be passed and only the first
+ colors in the original palette will be changed.
+
+ This function has no effect on a Surface with more than 8-bits per pixel.
+
+ .. ## Surface.set_palette ##
+
+ .. method:: set_palette_at
+
+ | :sl:`set the color for a single index in an 8-bit Surface palette`
+ | :sg:`set_palette_at(index, RGB) -> None`
+
+ Set the palette value for a single entry in a Surface palette. The index
+ should be a value from 0 to 255.
+
+ This function has no effect on a Surface with more than 8-bits per pixel.
+
+ .. ## Surface.set_palette_at ##
+
+ .. method:: map_rgb
+
+ | :sl:`convert a color into a mapped color value`
+ | :sg:`map_rgb(Color) -> mapped_int`
+
+ Convert an ``RGBA`` color into the mapped integer value for this Surface.
+ The returned integer will contain no more bits than the bit depth of the
+ Surface. Mapped color values are not often used inside pygame, but can be
+ passed to most functions that require a Surface and a color.
+
+ See the Surface object documentation for more information about colors
+ and pixel formats.
+
+ .. ## Surface.map_rgb ##
+
+ .. method:: unmap_rgb
+
+ | :sl:`convert a mapped integer color value into a Color`
+ | :sg:`unmap_rgb(mapped_int) -> Color`
+
+ Convert an mapped integer color into the ``RGB`` color components for
+ this Surface. Mapped color values are not often used inside pygame, but
+ can be passed to most functions that require a Surface and a color.
+
+ See the Surface object documentation for more information about colors
+ and pixel formats.
+
+ .. ## Surface.unmap_rgb ##
+
+ .. method:: set_clip
+
+ | :sl:`set the current clipping area of the Surface`
+ | :sg:`set_clip(rect) -> None`
+ | :sg:`set_clip(None) -> None`
+
+ Each Surface has an active clipping area. This is a rectangle that
+ represents the only pixels on the Surface that can be modified. If
+ ``None`` is passed for the rectangle the full Surface will be available
+ for changes.
+
+ The clipping area is always restricted to the area of the Surface itself.
+ If the clip rectangle is too large it will be shrunk to fit inside the
+ Surface.
+
+ .. ## Surface.set_clip ##
+
+ .. method:: get_clip
+
+ | :sl:`get the current clipping area of the Surface`
+ | :sg:`get_clip() -> Rect`
+
+ Return a rectangle of the current clipping area. The Surface will always
+ return a valid rectangle that will never be outside the bounds of the
+ image. If the Surface has had ``None`` set for the clipping area, the
+ Surface will return a rectangle with the full area of the Surface.
+
+ .. ## Surface.get_clip ##
+
+ .. method:: subsurface
+
+ | :sl:`create a new surface that references its parent`
+ | :sg:`subsurface(Rect) -> Surface`
+
+ Returns a new Surface that shares its pixels with its new parent. The new
+ Surface is considered a child of the original. Modifications to either
+ Surface pixels will effect each other. Surface information like clipping
+ area and color keys are unique to each Surface.
+
+ The new Surface will inherit the palette, color key, and alpha settings
+ from its parent.
+
+ It is possible to have any number of subsurfaces and subsubsurfaces on
+ the parent. It is also possible to subsurface the display Surface if the
+ display mode is not hardware accelerated.
+
+ See :meth:`get_offset()` and :meth:`get_parent()` to learn more
+ about the state of a subsurface.
+
+ A subsurface will have the same class as the parent surface.
+
+ .. ## Surface.subsurface ##
+
+ .. method:: get_parent
+
+ | :sl:`find the parent of a subsurface`
+ | :sg:`get_parent() -> Surface`
+
+ Returns the parent Surface of a subsurface. If this is not a subsurface
+ then ``None`` will be returned.
+
+ .. ## Surface.get_parent ##
+
+ .. method:: get_abs_parent
+
+ | :sl:`find the top level parent of a subsurface`
+ | :sg:`get_abs_parent() -> Surface`
+
+ Returns the parent Surface of a subsurface. If this is not a subsurface
+ then this surface will be returned.
+
+ .. ## Surface.get_abs_parent ##
+
+ .. method:: get_offset
+
+ | :sl:`find the position of a child subsurface inside a parent`
+ | :sg:`get_offset() -> (x, y)`
+
+ Get the offset position of a child subsurface inside of a parent. If the
+ Surface is not a subsurface this will return (0, 0).
+
+ .. ## Surface.get_offset ##
+
+ .. method:: get_abs_offset
+
+ | :sl:`find the absolute position of a child subsurface inside its top level parent`
+ | :sg:`get_abs_offset() -> (x, y)`
+
+ Get the offset position of a child subsurface inside of its top level
+ parent Surface. If the Surface is not a subsurface this will return (0,
+ 0).
+
+ .. ## Surface.get_abs_offset ##
+
+ .. method:: get_size
+
+ | :sl:`get the dimensions of the Surface`
+ | :sg:`get_size() -> (width, height)`
+
+ Return the width and height of the Surface in pixels.
+
+ .. ## Surface.get_size ##
+
+ .. method:: get_width
+
+ | :sl:`get the width of the Surface`
+ | :sg:`get_width() -> width`
+
+ Return the width of the Surface in pixels.
+
+ .. ## Surface.get_width ##
+
+ .. method:: get_height
+
+ | :sl:`get the height of the Surface`
+ | :sg:`get_height() -> height`
+
+ Return the height of the Surface in pixels.
+
+ .. ## Surface.get_height ##
+
+ .. method:: get_rect
+
+ | :sl:`get the rectangular area of the Surface`
+ | :sg:`get_rect(\**kwargs) -> Rect`
+
+ Returns a new rectangle covering the entire surface. This rectangle will
+ always start at (0, 0) with a width and height the same size as the image.
+
+ You can pass keyword argument values to this function. These named values
+ will be applied to the attributes of the Rect before it is returned. An
+ example would be ``mysurf.get_rect(center=(100, 100))`` to create a
+ rectangle for the Surface centered at a given position.
+
+ .. ## Surface.get_rect ##
+
+ .. method:: get_bitsize
+
+ | :sl:`get the bit depth of the Surface pixel format`
+ | :sg:`get_bitsize() -> int`
+
+ Returns the number of bits used to represent each pixel. This value may
+ not exactly fill the number of bytes used per pixel. For example a 15 bit
+ Surface still requires a full 2 bytes.
+
+ .. ## Surface.get_bitsize ##
+
+ .. method:: get_bytesize
+
+ | :sl:`get the bytes used per Surface pixel`
+ | :sg:`get_bytesize() -> int`
+
+ Return the number of bytes used per pixel.
+
+ .. ## Surface.get_bytesize ##
+
+ .. method:: get_flags
+
+ | :sl:`get the additional flags used for the Surface`
+ | :sg:`get_flags() -> int`
+
+ Returns a set of current Surface features. Each feature is a bit in the
+ flags bitmask. Typical flags are ``RLEACCEL``, ``SRCALPHA``, and
+ ``SRCCOLORKEY``.
+
+ Here is a more complete list of flags. A full list can be found in
+ ``SDL_video.h``
+
+ ::
+
+ SWSURFACE 0x00000000 # Surface is in system memory
+ HWSURFACE 0x00000001 # (obsolete in pygame 2) Surface is in video memory
+ ASYNCBLIT 0x00000004 # (obsolete in pygame 2) Use asynchronous blits if possible
+
+ See :func:`pygame.display.set_mode()` for flags exclusive to the
+ display surface.
+
+ Used internally (read-only)
+
+ ::
+
+ HWACCEL 0x00000100 # Blit uses hardware acceleration
+ SRCCOLORKEY 0x00001000 # Blit uses a source color key
+ RLEACCELOK 0x00002000 # Private flag
+ RLEACCEL 0x00004000 # Surface is RLE encoded
+ SRCALPHA 0x00010000 # Blit uses source alpha blending
+ PREALLOC 0x01000000 # Surface uses preallocated memory
+
+ .. ## Surface.get_flags ##
+
+ .. method:: get_pitch
+
+ | :sl:`get the number of bytes used per Surface row`
+ | :sg:`get_pitch() -> int`
+
+ Return the number of bytes separating each row in the Surface. Surfaces
+ in video memory are not always linearly packed. Subsurfaces will also
+ have a larger pitch than their real width.
+
+ This value is not needed for normal pygame usage.
+
+ .. ## Surface.get_pitch ##
+
+ .. method:: get_masks
+
+ | :sl:`the bitmasks needed to convert between a color and a mapped integer`
+ | :sg:`get_masks() -> (R, G, B, A)`
+
+ Returns the bitmasks used to isolate each color in a mapped integer.
+
+ This value is not needed for normal pygame usage.
+
+ .. ## Surface.get_masks ##
+
+ .. method:: set_masks
+
+ | :sl:`set the bitmasks needed to convert between a color and a mapped integer`
+ | :sg:`set_masks((r,g,b,a)) -> None`
+
+ This is not needed for normal pygame usage.
+
+ .. note:: Starting in pygame 2.0, the masks are read-only and
+ accordingly this method will raise a TypeError if called.
+
+ .. deprecated:: 2.0.0
+
+ .. versionadded:: 1.8.1
+
+ .. ## Surface.set_masks ##
+
+ .. method:: get_shifts
+
+ | :sl:`the bit shifts needed to convert between a color and a mapped integer`
+ | :sg:`get_shifts() -> (R, G, B, A)`
+
+ Returns the pixel shifts need to convert between each color and a mapped
+ integer.
+
+ This value is not needed for normal pygame usage.
+
+ .. ## Surface.get_shifts ##
+
+ .. method:: set_shifts
+
+ | :sl:`sets the bit shifts needed to convert between a color and a mapped integer`
+ | :sg:`set_shifts((r,g,b,a)) -> None`
+
+ This is not needed for normal pygame usage.
+
+ .. note:: Starting in pygame 2.0, the shifts are read-only and
+ accordingly this method will raise a TypeError if called.
+
+ .. deprecated:: 2.0.0
+
+ .. versionadded:: 1.8.1
+
+ .. ## Surface.set_shifts ##
+
+ .. method:: get_losses
+
+ | :sl:`the significant bits used to convert between a color and a mapped integer`
+ | :sg:`get_losses() -> (R, G, B, A)`
+
+ Return the least significant number of bits stripped from each color in a
+ mapped integer.
+
+ This value is not needed for normal pygame usage.
+
+ .. ## Surface.get_losses ##
+
+ .. method:: get_bounding_rect
+
+ | :sl:`find the smallest rect containing data`
+ | :sg:`get_bounding_rect(min_alpha = 1) -> Rect`
+
+ Returns the smallest rectangular region that contains all the pixels in
+ the surface that have an alpha value greater than or equal to the minimum
+ alpha value.
+
+ This function will temporarily lock and unlock the Surface as needed.
+
+ .. versionadded:: 1.8
+
+ .. ## Surface.get_bounding_rect ##
+
+ .. method:: get_view
+
+ | :sl:`return a buffer view of the Surface's pixels.`
+ | :sg:`get_view(='2') -> BufferProxy`
+
+ Return an object which exports a surface's internal pixel buffer as
+ a C level array struct, Python level array interface or a C level
+ buffer interface. The new buffer protocol is supported.
+
+ The kind argument is the length 1 string '0', '1', '2', '3',
+ 'r', 'g', 'b', or 'a'. The letters are case insensitive;
+ 'A' will work as well. The argument can be either a Unicode or byte (char)
+ string. The default is '2'.
+
+ '0' returns a contiguous unstructured bytes view. No surface shape
+ information is given. A ``ValueError`` is raised if the surface's pixels
+ are discontinuous.
+
+ '1' returns a (surface-width * surface-height) array of continuous
+ pixels. A ``ValueError`` is raised if the surface pixels are
+ discontinuous.
+
+ '2' returns a (surface-width, surface-height) array of raw pixels.
+ The pixels are surface-bytesize-d unsigned integers. The pixel format is
+ surface specific. The 3 byte unsigned integers of 24 bit surfaces are
+ unlikely accepted by anything other than other pygame functions.
+
+ '3' returns a (surface-width, surface-height, 3) array of ``RGB`` color
+ components. Each of the red, green, and blue components are unsigned
+ bytes. Only 24-bit and 32-bit surfaces are supported. The color
+ components must be in either ``RGB`` or ``BGR`` order within the pixel.
+
+ 'r' for red, 'g' for green, 'b' for blue, and 'a' for alpha return a
+ (surface-width, surface-height) view of a single color component within a
+ surface: a color plane. Color components are unsigned bytes. Both 24-bit
+ and 32-bit surfaces support 'r', 'g', and 'b'. Only 32-bit surfaces with
+ ``SRCALPHA`` support 'a'.
+
+ The surface is locked only when an exposed interface is accessed.
+ For new buffer interface accesses, the surface is unlocked once the
+ last buffer view is released. For array interface and old buffer
+ interface accesses, the surface remains locked until the BufferProxy
+ object is released.
+
+ .. versionadded:: 1.9.2
+
+ .. method:: get_buffer
+
+ | :sl:`acquires a buffer object for the pixels of the Surface.`
+ | :sg:`get_buffer() -> BufferProxy`
+
+ Return a buffer object for the pixels of the Surface. The buffer can be
+ used for direct pixel access and manipulation. Surface pixel data is
+ represented as an unstructured block of memory, with a start address
+ and length in bytes. The data need not be contiguous. Any gaps are
+ included in the length, but otherwise ignored.
+
+ This method implicitly locks the Surface. The lock will be released when
+ the returned :mod:`pygame.BufferProxy` object is garbage collected.
+
+ .. versionadded:: 1.8
+
+ .. ## Surface.get_buffer ##
+
+ .. attribute:: _pixels_address
+
+ | :sl:`pixel buffer address`
+ | :sg:`_pixels_address -> int`
+
+ The starting address of the surface's raw pixel bytes.
+
+ .. versionadded:: 1.9.2
+
+ .. method:: premul_alpha
+
+ | :sl:`returns a copy of the surface with the RGB channels pre-multiplied by the alpha channel.`
+ | :sg:`premul_alpha() -> Surface`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave premul_alpha feedback with authors `_
+
+ Returns a copy of the initial surface with the red, green and blue color channels multiplied
+ by the alpha channel. This is intended to make it easier to work with the BLEND_PREMULTIPLED
+ blend mode flag of the blit() method. Surfaces which have called this method will only look
+ correct after blitting if the BLEND_PREMULTIPLED special flag is used.
+
+ It is worth noting that after calling this method, methods that return the colour of a pixel
+ such as get_at() will return the alpha multiplied colour values. It is not possible to fully
+ reverse an alpha multiplication of the colours in a surface as integer colour channel data
+ is generally reduced by the operation (e.g. 255 x 0 = 0, from there it is not possible to reconstruct
+ the original 255 from just the two remaining zeros in the colour and alpha channels).
+
+ If you call this method, and then call it again, it will multiply the colour channels by the alpha channel
+ twice. There are many possible ways to obtain a surface with the colour channels pre-multiplied by the
+ alpha channel in pygame, and it is not possible to tell the difference just from the information in the pixels.
+ It is completely possible to have two identical surfaces - one intended for pre-multiplied alpha blending and
+ one intended for normal blending. For this reason we do not store state on surfaces intended for pre-multiplied
+ alpha blending.
+
+ Surfaces without an alpha channel cannot use this method and will return an error if you use
+ it on them. It is best used on 32 bit surfaces (the default on most platforms) as the blitting
+ on these surfaces can be accelerated by SIMD versions of the pre-multiplied blitter.
+
+ In general pre-multiplied alpha blitting is faster then 'straight alpha' blitting and produces
+ superior results when blitting an alpha surface onto another surface with alpha - assuming both
+ surfaces contain pre-multiplied alpha colours.
+
+ .. versionadded:: 2.2.0
+
+ .. ## Surface.premul_alpha ##
+
+ .. ## pygame.Surface ##
+
+
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/surfarray.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/surfarray.rst.txt
new file mode 100644
index 00000000..c29723af
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/surfarray.rst.txt
@@ -0,0 +1,337 @@
+.. include:: common.txt
+
+:mod:`pygame.surfarray`
+=======================
+
+.. module:: pygame.surfarray
+ :synopsis: pygame module for accessing surface pixel data using array interfaces
+
+| :sl:`pygame module for accessing surface pixel data using array interfaces`
+
+Functions to convert between NumPy arrays and Surface objects. This module
+will only be functional when pygame can use the external NumPy package.
+If NumPy can't be imported, ``surfarray`` becomes a ``MissingModule`` object.
+
+Every pixel is stored as a single integer value to represent the red, green,
+and blue colors. The 8-bit images use a value that looks into a colormap. Pixels
+with higher depth use a bit packing process to place three or four values into
+a single number.
+
+The arrays are indexed by the ``X`` axis first, followed by the ``Y`` axis.
+Arrays that treat the pixels as a single integer are referred to as 2D arrays.
+This module can also separate the red, green, and blue color values into
+separate indices. These types of arrays are referred to as 3D arrays, and the
+last index is 0 for red, 1 for green, and 2 for blue.
+
+The pixels of a 2D array as returned by :func:`array2d` and :func:`pixels2d`
+are mapped to the specific surface. Use :meth:`pygame.Surface.unmap_rgb`
+to convert to a color, and :meth:`pygame.Surface.map_rgb` to get the surface
+specific pixel value of a color. Integer pixel values can only be used directly
+between surfaces with matching pixel layouts (see :class:`pygame.Surface`).
+
+All functions that refer to "array" will copy the surface information to a new
+numpy array. All functions that refer to "pixels" will directly reference the
+pixels from the surface and any changes performed to the array will make changes
+in the surface. As this last functions share memory with the surface, this one
+will be locked during the lifetime of the array.
+
+.. function:: array2d
+
+ | :sl:`Copy pixels into a 2d array`
+ | :sg:`array2d(Surface) -> array`
+
+ Copy the :meth:`mapped ` (raw) pixels from a Surface
+ into a 2D array.
+ The bit depth of the surface will control the size of the integer values,
+ and will work for any type of pixel format.
+
+ This function will temporarily lock the Surface as pixels are copied
+ (see the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method).
+
+ .. ## pygame.surfarray.array2d ##
+
+.. function:: pixels2d
+
+ | :sl:`Reference pixels into a 2d array`
+ | :sg:`pixels2d(Surface) -> array`
+
+ Create a new 2D array that directly references the pixel values in a
+ Surface. Any changes to the array will affect the pixels in the Surface.
+ This is a fast operation since no data is copied.
+
+ Pixels from a 24-bit Surface cannot be referenced, but all other Surface bit
+ depths can.
+
+ The Surface this references will remain locked for the lifetime of the array,
+ since the array generated by this function shares memory with the surface.
+ See the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method.
+
+ .. ## pygame.surfarray.pixels2d ##
+
+.. function:: array3d
+
+ | :sl:`Copy pixels into a 3d array`
+ | :sg:`array3d(Surface) -> array`
+
+ Copy the pixels from a Surface into a 3D array. The bit depth of the surface
+ will control the size of the integer values, and will work for any type of
+ pixel format.
+
+ This function will temporarily lock the Surface as pixels are copied (see
+ the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method).
+
+ .. ## pygame.surfarray.array3d ##
+
+.. function:: pixels3d
+
+ | :sl:`Reference pixels into a 3d array`
+ | :sg:`pixels3d(Surface) -> array`
+
+ Create a new 3D array that directly references the pixel values in a
+ Surface. Any changes to the array will affect the pixels in the Surface.
+ This is a fast operation since no data is copied.
+
+ This will only work on Surfaces that have 24-bit or 32-bit formats. Lower
+ pixel formats cannot be referenced.
+
+ The Surface this references will remain locked for the lifetime of the array,
+ since the array generated by this function shares memory with the surface.
+ See the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method.
+
+ .. ## pygame.surfarray.pixels3d ##
+
+.. function:: array_alpha
+
+ | :sl:`Copy pixel alphas into a 2d array`
+ | :sg:`array_alpha(Surface) -> array`
+
+ Copy the pixel alpha values (degree of transparency) from a Surface into a
+ 2D array. This will work for any type of Surface format. Surfaces without a
+ pixel alpha will return an array with all opaque values.
+
+ This function will temporarily lock the Surface as pixels are copied (see
+ the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method).
+
+ .. ## pygame.surfarray.array_alpha ##
+
+.. function:: pixels_alpha
+
+ | :sl:`Reference pixel alphas into a 2d array`
+ | :sg:`pixels_alpha(Surface) -> array`
+
+ Create a new 2D array that directly references the alpha values (degree of
+ transparency) in a Surface. Any changes to the array will affect the pixels
+ in the Surface. This is a fast operation since no data is copied.
+
+ This can only work on 32-bit Surfaces with a per-pixel alpha value.
+
+ The Surface this references will remain locked for the lifetime of the array,
+ since the array generated by this function shares memory with the surface.
+ See the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method.
+
+ .. ## pygame.surfarray.pixels_alpha ##
+
+.. function:: array_red
+
+ | :sl:`Copy red pixels into a 2d array`
+ | :sg:`array_red(Surface) -> array`
+
+ Copy the pixel red values from a Surface into a 2D array. This will work
+ for any type of Surface format.
+
+ This function will temporarily lock the Surface as pixels are copied (see
+ the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method).
+
+ .. versionadded:: 2.0.2
+
+ .. ## pygame.surfarray.array_red ##
+
+.. function:: pixels_red
+
+ | :sl:`Reference pixel red into a 2d array.`
+ | :sg:`pixels_red (Surface) -> array`
+
+ Create a new 2D array that directly references the red values in a Surface.
+ Any changes to the array will affect the pixels in the Surface. This is a
+ fast operation since no data is copied.
+
+ This can only work on 24-bit or 32-bit Surfaces.
+
+ The Surface this references will remain locked for the lifetime of the array,
+ since the array generated by this function shares memory with the surface.
+ See the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method.
+
+ .. ## pygame.surfarray.pixels_red ##
+
+.. function:: array_green
+
+ | :sl:`Copy green pixels into a 2d array`
+ | :sg:`array_green(Surface) -> array`
+
+ Copy the pixel green values from a Surface into a 2D array. This will work
+ for any type of Surface format.
+
+ This function will temporarily lock the Surface as pixels are copied (see
+ the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method).
+
+ .. versionadded:: 2.0.2
+
+ .. ## pygame.surfarray.array_green ##
+
+.. function:: pixels_green
+
+ | :sl:`Reference pixel green into a 2d array.`
+ | :sg:`pixels_green (Surface) -> array`
+
+ Create a new 2D array that directly references the green values in a
+ Surface. Any changes to the array will affect the pixels in the Surface.
+ This is a fast operation since no data is copied.
+
+ This can only work on 24-bit or 32-bit Surfaces.
+
+ The Surface this references will remain locked for the lifetime of the array,
+ since the array generated by this function shares memory with the surface.
+ See the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method.
+
+ .. ## pygame.surfarray.pixels_green ##
+
+.. function:: array_blue
+
+ | :sl:`Copy blue pixels into a 2d array`
+ | :sg:`array_blue(Surface) -> array`
+
+ Copy the pixel blue values from a Surface into a 2D array. This will work
+ for any type of Surface format.
+
+ This function will temporarily lock the Surface as pixels are copied (see
+ the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method).
+
+ .. versionadded:: 2.0.2
+
+ .. ## pygame.surfarray.array_blue ##
+
+.. function:: pixels_blue
+
+ | :sl:`Reference pixel blue into a 2d array.`
+ | :sg:`pixels_blue (Surface) -> array`
+
+ Create a new 2D array that directly references the blue values in a Surface.
+ Any changes to the array will affect the pixels in the Surface. This is a
+ fast operation since no data is copied.
+
+ This can only work on 24-bit or 32-bit Surfaces.
+
+ The Surface this references will remain locked for the lifetime of the array,
+ since the array generated by this function shares memory with the surface.
+ See the :meth:`pygame.Surface.lock` - lock the Surface memory for pixel
+ access method.
+
+ .. ## pygame.surfarray.pixels_blue ##
+
+.. function:: array_colorkey
+
+ | :sl:`Copy the colorkey values into a 2d array`
+ | :sg:`array_colorkey(Surface) -> array`
+
+ Create a new array with the colorkey transparency value from each pixel. If
+ the pixel matches the colorkey it will be fully transparent; otherwise it
+ will be fully opaque.
+
+ This will work on any type of Surface format. If the image has no colorkey a
+ solid opaque array will be returned.
+
+ This function will temporarily lock the Surface as pixels are copied.
+
+ .. ## pygame.surfarray.array_colorkey ##
+
+.. function:: make_surface
+
+ | :sl:`Copy an array to a new surface`
+ | :sg:`make_surface(array) -> Surface`
+
+ Create a new Surface that best resembles the data and format on the array.
+ The array can be 2D or 3D with any sized integer values. Function
+ make_surface uses the array struct interface to acquire array properties,
+ so is not limited to just NumPy arrays. See :mod:`pygame.pixelcopy`.
+
+ New in pygame 1.9.2: array struct interface support.
+
+ .. ## pygame.surfarray.make_surface ##
+
+.. function:: blit_array
+
+ | :sl:`Blit directly from a array values`
+ | :sg:`blit_array(Surface, array) -> None`
+
+ Directly copy values from an array into a Surface. This is faster than
+ converting the array into a Surface and blitting. The array must be the same
+ dimensions as the Surface and will completely replace all pixel values. Only
+ integer, ASCII character and record arrays are accepted.
+
+ This function will temporarily lock the Surface as the new values are
+ copied.
+
+ .. ## pygame.surfarray.blit_array ##
+
+.. function:: map_array
+
+ | :sl:`Map a 3d array into a 2d array`
+ | :sg:`map_array(Surface, array3d) -> array2d`
+
+ Convert a 3D array into a 2D array. This will use the given Surface format
+ to control the conversion. Palette surface formats are supported for NumPy
+ arrays.
+
+ .. ## pygame.surfarray.map_array ##
+
+.. function:: use_arraytype
+
+ | :sl:`Sets the array system to be used for surface arrays`
+ | :sg:`use_arraytype (arraytype) -> None`
+
+ DEPRECATED: Uses the requested array type for the module functions.
+ The only supported arraytype is ``'numpy'``. Other values will raise
+ ValueError. Using this function will raise a ``DeprecationWarning``.
+
+ .. ## pygame.surfarray.use_arraytype ##
+
+.. function:: get_arraytype
+
+ | :sl:`Gets the currently active array type.`
+ | :sg:`get_arraytype () -> str`
+
+ DEPRECATED: Returns the currently active array type. This will be a value of the
+ ``get_arraytypes()`` tuple and indicates which type of array module is used
+ for the array creation. Using this function will raise a ``DeprecationWarning``.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.surfarray.get_arraytype ##
+
+.. function:: get_arraytypes
+
+ | :sl:`Gets the array system types currently supported.`
+ | :sg:`get_arraytypes () -> tuple`
+
+ DEPRECATED: Checks, which array systems are available and returns them as a tuple of
+ strings. The values of the tuple can be used directly in the
+ :func:`pygame.surfarray.use_arraytype` () method. If no supported array
+ system could be found, None will be returned. Using this function will raise a
+ ``DeprecationWarning``.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.surfarray.get_arraytypes ##
+
+.. ## pygame.surfarray ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/tests.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/tests.rst.txt
new file mode 100644
index 00000000..88184f6c
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/tests.rst.txt
@@ -0,0 +1,113 @@
+.. include:: common.txt
+
+:mod:`pygame.tests`
+===================
+
+.. module:: pygame.tests
+ :synopsis: Pygame unit test suite package
+
+| :sl:`Pygame unit test suite package`
+
+A quick way to run the test suite package from the command line is to import
+the go submodule with the Python -m option:
+
+::
+
+ python -m pygame.tests []
+
+Command line option --help displays a usage message. Available options
+correspond to the :func:`pygame.tests.run` arguments.
+
+The xxxx_test submodules of the tests package are unit test suites for
+individual parts of pygame. Each can also be run as a main program. This is
+useful if the test, such as cdrom_test, is interactive.
+
+For pygame development the test suite can be run from a pygame distribution
+root directory. Program ``run_tests.py`` is provided for convenience, though
+test/go.py can be run directly.
+
+Module level tags control which modules are included in a unit test run. Tags
+are assigned to a unit test module with a corresponding _tags.py module.
+The tags module has the global __tags__, a list of tag names. For example,
+``cdrom_test.py`` has a tag file ``cdrom_tags.py`` containing a tags list that
+has the 'interactive' string. The 'interactive' tag indicates ``cdrom_test.py``
+expects user input. It is excluded from a ``run_tests.py`` or
+``pygame.tests.go`` run.
+
+Two other tags that are excluded are 'ignore' and 'subprocess_ignore'. These
+two tags indicate unit tests that will not run on a particular platform, or
+for which no corresponding pygame module is available.
+
+The test runner will list each excluded module along with the tag responsible.
+
+.. function:: run
+
+ | :sl:`Run the pygame unit test suite`
+ | :sg:`run(*args, **kwds) -> tuple`
+
+ Positional arguments (optional):
+
+ ::
+
+ The names of tests to include. If omitted then all tests are run. Test names
+ need not include the trailing '_test'.
+
+ Keyword arguments:
+
+ ::
+
+ incomplete - fail incomplete tests (default False)
+ nosubprocess - run all test suites in the current process
+ (default False, use separate subprocesses)
+ dump - dump failures/errors as dict ready to eval (default False)
+ file - if provided, the name of a file into which to dump failures/errors
+ timings - if provided, the number of times to run each individual test to
+ get an average run time (default is run each test once)
+ exclude - A list of TAG names to exclude from the run
+ show_output - show silenced stderr/stdout on errors (default False)
+ all - dump all results, not just errors (default False)
+ randomize - randomize order of tests (default False)
+ seed - if provided, a seed randomizer integer
+ multi_thread - if provided, the number of THREADS in which to run
+ subprocessed tests
+ time_out - if subprocess is True then the time limit in seconds before
+ killing a test (default 30)
+ fake - if provided, the name of the fake tests package in the
+ run_tests__tests subpackage to run instead of the normal
+ pygame tests
+ python - the path to a python executable to run subprocessed tests
+ (default sys.executable)
+
+ Return value:
+
+ ::
+
+ A tuple of total number of tests run, dictionary of error information.
+ The dictionary is empty if no errors were recorded.
+
+ By default individual test modules are run in separate subprocesses. This
+ recreates normal pygame usage where ``pygame.init()`` and ``pygame.quit()``
+ are called only once per program execution, and avoids unfortunate
+ interactions between test modules.
+
+ A time limit is placed on test execution ensuring that any frozen tests
+ processes are killed when their time allotment is expired. Use the single
+ process option if threading is not working properly or if tests are taking
+ too long. It is not guaranteed that all tests will pass in single process
+ mode.
+
+ Tests are run in a randomized order if the randomize argument is True or a
+ seed argument is provided. If no seed integer is provided then the system
+ time is used for the randomization seed value.
+
+ Individual test modules may have a __tags__ attribute, a list of tag strings
+ used to selectively omit modules from a run. By default only 'interactive'
+ modules such as cdrom_test are ignored. An interactive module must be run
+ from the console as a Python program.
+
+ This function can only be called once per Python session. It is not
+ reentrant.
+
+ .. ## pygame.tests.run ##
+
+.. ## pygame.tests ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/time.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/time.rst.txt
new file mode 100644
index 00000000..59e09997
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/time.rst.txt
@@ -0,0 +1,165 @@
+.. include:: common.txt
+
+:mod:`pygame.time`
+==================
+
+.. module:: pygame.time
+ :synopsis: pygame module for monitoring time
+
+| :sl:`pygame module for monitoring time`
+
+Times in pygame are represented in milliseconds (1/1000 seconds). Most
+platforms have a limited time resolution of around 10 milliseconds. This
+resolution, in milliseconds, is given in the ``TIMER_RESOLUTION`` constant.
+
+.. function:: get_ticks
+
+ | :sl:`get the time in milliseconds`
+ | :sg:`get_ticks() -> milliseconds`
+
+ Return the number of milliseconds since ``pygame.init()`` was called. Before
+ pygame is initialized this will always be 0.
+
+ .. ## pygame.time.get_ticks ##
+
+.. function:: wait
+
+ | :sl:`pause the program for an amount of time`
+ | :sg:`wait(milliseconds) -> time`
+
+ Will pause for a given number of milliseconds. This function sleeps the
+ process to share the processor with other programs. A program that waits for
+ even a few milliseconds will consume very little processor time. It is
+ slightly less accurate than the ``pygame.time.delay()`` function.
+
+ This returns the actual number of milliseconds used.
+
+ .. ## pygame.time.wait ##
+
+.. function:: delay
+
+ | :sl:`pause the program for an amount of time`
+ | :sg:`delay(milliseconds) -> time`
+
+ Will pause for a given number of milliseconds. This function will use the
+ processor (rather than sleeping) in order to make the delay more accurate
+ than ``pygame.time.wait()``.
+
+ This returns the actual number of milliseconds used.
+
+ .. ## pygame.time.delay ##
+
+.. function:: set_timer
+
+ | :sl:`repeatedly create an event on the event queue`
+ | :sg:`set_timer(event, millis) -> None`
+ | :sg:`set_timer(event, millis, loops=0) -> None`
+
+ Set an event to appear on the event queue every given number of milliseconds.
+ The first event will not appear until the amount of time has passed.
+
+ The ``event`` attribute can be a ``pygame.event.Event`` object or an integer
+ type that denotes an event.
+
+ ``loops`` is an integer that denotes the number of events posted. If 0 (default)
+ then the events will keep getting posted, unless explicitly stopped.
+
+ To disable the timer for such an event, call the function again with the same
+ event argument with ``millis`` argument set to 0.
+
+ It is also worth mentioning that a particular event type can only be put on a
+ timer once. In other words, there cannot be two timers for the same event type.
+ Setting an event timer for a particular event discards the old one for that
+ event type.
+
+ ``loops`` replaces the ``once`` argument, and this does not break backward
+ compatibility
+
+ .. versionadded:: 2.0.0.dev3 once argument added.
+ .. versionchanged:: 2.0.1 event argument supports ``pygame.event.Event`` object
+ .. versionadded:: 2.0.1 added loops argument to replace once argument
+
+ .. ## pygame.time.set_timer ##
+
+.. class:: Clock
+
+ | :sl:`create an object to help track time`
+ | :sg:`Clock() -> Clock`
+
+ Creates a new Clock object that can be used to track an amount of time. The
+ clock also provides several functions to help control a game's framerate.
+
+ .. method:: tick
+
+ | :sl:`update the clock`
+ | :sg:`tick(framerate=0) -> milliseconds`
+
+ This method should be called once per frame. It will compute how many
+ milliseconds have passed since the previous call.
+
+ If you pass the optional framerate argument the function will delay to
+ keep the game running slower than the given ticks per second. This can be
+ used to help limit the runtime speed of a game. By calling
+ ``Clock.tick(40)`` once per frame, the program will never run at more
+ than 40 frames per second.
+
+ Note that this function uses SDL_Delay function which is not accurate on
+ every platform, but does not use much CPU. Use tick_busy_loop if you want
+ an accurate timer, and don't mind chewing CPU.
+
+ .. ## Clock.tick ##
+
+ .. method:: tick_busy_loop
+
+ | :sl:`update the clock`
+ | :sg:`tick_busy_loop(framerate=0) -> milliseconds`
+
+ This method should be called once per frame. It will compute how many
+ milliseconds have passed since the previous call.
+
+ If you pass the optional framerate argument the function will delay to
+ keep the game running slower than the given ticks per second. This can be
+ used to help limit the runtime speed of a game. By calling
+ ``Clock.tick_busy_loop(40)`` once per frame, the program will never run at
+ more than 40 frames per second.
+
+ Note that this function uses :func:`pygame.time.delay`, which uses lots
+ of CPU in a busy loop to make sure that timing is more accurate.
+
+ .. versionadded:: 1.8
+
+ .. ## Clock.tick_busy_loop ##
+
+ .. method:: get_time
+
+ | :sl:`time used in the previous tick`
+ | :sg:`get_time() -> milliseconds`
+
+ The number of milliseconds that passed between the previous two calls to
+ ``Clock.tick()``.
+
+ .. ## Clock.get_time ##
+
+ .. method:: get_rawtime
+
+ | :sl:`actual time used in the previous tick`
+ | :sg:`get_rawtime() -> milliseconds`
+
+ Similar to ``Clock.get_time()``, but does not include any time used
+ while ``Clock.tick()`` was delaying to limit the framerate.
+
+ .. ## Clock.get_rawtime ##
+
+ .. method:: get_fps
+
+ | :sl:`compute the clock framerate`
+ | :sg:`get_fps() -> float`
+
+ Compute your game's framerate (in frames per second). It is computed by
+ averaging the last ten calls to ``Clock.tick()``.
+
+ .. ## Clock.get_fps ##
+
+ .. ## pygame.time.Clock ##
+
+.. ## pygame.time ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/touch.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/touch.rst.txt
new file mode 100644
index 00000000..320da056
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/touch.rst.txt
@@ -0,0 +1,66 @@
+.. include:: common.txt
+
+:mod:`pygame._sdl2.touch`
+=========================
+
+.. module:: pygame._sdl2.touch
+ :synopsis: pygame module to work with touch input
+
+| :sl:`pygame module to work with touch input`
+
+.. versionadded:: 2 This module requires SDL2.
+
+.. function:: get_num_devices
+
+ | :sl:`get the number of touch devices`
+ | :sg:`get_num_devices() -> int`
+
+ Return the number of available touch devices.
+
+ .. ## pygame._sdl2.touch.get_num_devices ##
+
+.. function:: get_device
+
+ | :sl:`get the a touch device id for a given index`
+ | :sg:`get_device(index) -> touchid`
+
+ :param int index: This number is at least 0 and less than the
+ :func:`number of devices `.
+
+ Return an integer id associated with the given ``index``.
+
+ .. ## pygame._sdl2.touch.get_device ##
+
+.. function:: get_num_fingers
+
+ | :sl:`the number of active fingers for a given touch device`
+ | :sg:`get_num_fingers(touchid) -> int`
+
+ Return the number of fingers active for the touch device
+ whose id is `touchid`.
+
+ .. ## pygame._sdl2.touch.get_num_fingers ##
+
+.. function:: get_finger
+
+ | :sl:`get information about an active finger`
+ | :sg:`get_finger(touchid, index) -> int`
+
+ :param int touchid: The touch device id.
+ :param int index: The index of the finger to return
+ information about, between 0 and the
+ :func:`number of active fingers `.
+
+ Return a dict for the finger ``index`` active on ``touchid``.
+ The dict contains these keys:
+
+ ::
+
+ id the id of the finger (an integer).
+ x the normalized x position of the finger, between 0 and 1.
+ y the normalized y position of the finger, between 0 and 1.
+ pressure the amount of pressure applied by the finger, between 0 and 1.
+
+ .. ## pygame._sdl2.touch.get_finger ##
+
+.. ## pygame._sdl2.touch ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/transform.rst.txt b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/transform.rst.txt
new file mode 100644
index 00000000..91a3a8f6
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_sources/ref/transform.rst.txt
@@ -0,0 +1,325 @@
+.. include:: common.txt
+
+:mod:`pygame.transform`
+=======================
+
+.. module:: pygame.transform
+ :synopsis: pygame module to transform surfaces
+
+| :sl:`pygame module to transform surfaces`
+
+A Surface transform is an operation that moves or resizes the pixels. All these
+functions take a Surface to operate on and return a new Surface with the
+results.
+
+Some of the transforms are considered destructive. These means every time they
+are performed they lose pixel data. Common examples of this are resizing and
+rotating. For this reason, it is better to re-transform the original surface
+than to keep transforming an image multiple times. (For example, suppose you
+are animating a bouncing spring which expands and contracts. If you applied the
+size changes incrementally to the previous images, you would lose detail.
+Instead, always begin with the original image and scale to the desired size.)
+
+.. versionchanged:: 2.0.2 transform functions now support keyword arguments.
+
+.. function:: flip
+
+ | :sl:`flip vertically and horizontally`
+ | :sg:`flip(surface, flip_x, flip_y) -> Surface`
+
+ This can flip a Surface either vertically, horizontally, or both.
+ The arguments ``flip_x`` and ``flip_y`` are booleans that control whether
+ to flip each axis. Flipping a Surface is non-destructive and returns a new
+ Surface with the same dimensions.
+
+ .. ## pygame.transform.flip ##
+
+.. function:: scale
+
+ | :sl:`resize to new resolution`
+ | :sg:`scale(surface, size, dest_surface=None) -> Surface`
+
+ Resizes the Surface to a new size, given as (width, height).
+ This is a fast scale operation that does not sample the results.
+
+ An optional destination surface can be used, rather than have it create a
+ new one. This is quicker if you want to repeatedly scale something. However
+ the destination must be the same size as the size (width, height) passed in. Also
+ the destination surface must be the same format.
+
+ .. ## pygame.transform.scale ##
+
+.. function:: scale_by
+
+ | :sl:`resize to new resolution, using scalar(s)`
+ | :sg:`scale_by(surface, factor, dest_surface=None) -> Surface`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave scale_by feedback with authors `_
+
+ Same as :func:`scale()`, but scales by some factor, rather than taking
+ the new size explicitly. For example, :code:`transform.scale_by(surf, 3)`
+ will triple the size of the surface in both dimensions. Optionally, the
+ scale factor can be a sequence of two numbers, controlling x and y scaling
+ separately. For example, :code:`transform.scale_by(surf, (2, 1))` doubles
+ the image width but keeps the height the same.
+
+ .. versionadded:: 2.1.3
+
+ .. ## pygame.transform.scale_by ##
+
+.. function:: rotate
+
+ | :sl:`rotate an image`
+ | :sg:`rotate(surface, angle) -> Surface`
+
+ Unfiltered counterclockwise rotation. The angle argument represents degrees
+ and can be any floating point value. Negative angle amounts will rotate
+ clockwise.
+
+ Unless rotating by 90 degree increments, the image will be padded larger to
+ hold the new size. If the image has pixel alphas, the padded area will be
+ transparent. Otherwise pygame will pick a color that matches the Surface
+ colorkey or the topleft pixel value.
+
+ .. ## pygame.transform.rotate ##
+
+.. function:: rotozoom
+
+ | :sl:`filtered scale and rotation`
+ | :sg:`rotozoom(surface, angle, scale) -> Surface`
+
+ This is a combined scale and rotation transform. The resulting Surface will
+ be a filtered 32-bit Surface. The scale argument is a floating point value
+ that will be multiplied by the current resolution. The angle argument is a
+ floating point value that represents the counterclockwise degrees to rotate.
+ A negative rotation angle will rotate clockwise.
+
+ .. ## pygame.transform.rotozoom ##
+
+.. function:: scale2x
+
+ | :sl:`specialized image doubler`
+ | :sg:`scale2x(surface, dest_surface=None) -> Surface`
+
+ This will return a new image that is double the size of the original. It
+ uses the AdvanceMAME Scale2X algorithm which does a 'jaggie-less' scale of
+ bitmap graphics.
+
+ This really only has an effect on simple images with solid colors. On
+ photographic and antialiased images it will look like a regular unfiltered
+ scale.
+
+ An optional destination surface can be used, rather than have it create a
+ new one. This is quicker if you want to repeatedly scale something. However
+ the destination must be twice the size of the source surface passed in. Also
+ the destination surface must be the same format.
+
+ .. ## pygame.transform.scale2x ##
+
+.. function:: smoothscale
+
+ | :sl:`scale a surface to an arbitrary size smoothly`
+ | :sg:`smoothscale(surface, size, dest_surface=None) -> Surface`
+
+ Uses one of two different algorithms for scaling each dimension of the input
+ surface as required. For shrinkage, the output pixels are area averages of
+ the colors they cover. For expansion, a bilinear filter is used. For the
+ x86-64 and i686 architectures, optimized ``MMX`` routines are included and
+ will run much faster than other machine types. The size is a 2 number
+ sequence for (width, height). This function only works for 24-bit or 32-bit
+ surfaces. An exception will be thrown if the input surface bit depth is less
+ than 24.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.transform.smoothscale ##
+
+.. function:: smoothscale_by
+
+ | :sl:`resize to new resolution, using scalar(s)`
+ | :sg:`smoothscale_by(surface, factor, dest_surface=None) -> Surface`
+
+ **Experimental:** feature still in development available for testing and feedback. It may change.
+ `Please leave smoothscale_by feedback with authors `_
+
+ Same as :func:`smoothscale()`, but scales by some factor, rather than
+ taking the new size explicitly. For example,
+ :code:`transform.smoothscale_by(surf, 3)` will triple the size of the
+ surface in both dimensions. Optionally, the scale factor can be a sequence
+ of two numbers, controlling x and y scaling separately. For example,
+ :code:`transform.smoothscale_by(surf, (2, 1))` doubles the image width but
+ keeps the height the same.
+
+ .. versionadded:: 2.1.3
+
+ .. ## pygame.transform.smoothscale_by ##
+
+.. function:: get_smoothscale_backend
+
+ | :sl:`return smoothscale filter version in use: 'GENERIC', 'MMX', or 'SSE'`
+ | :sg:`get_smoothscale_backend() -> string`
+
+ Shows whether or not smoothscale is using ``MMX`` or ``SSE`` acceleration.
+ If no acceleration is available then "GENERIC" is returned. For a x86
+ processor the level of acceleration to use is determined at runtime.
+
+ This function is provided for pygame testing and debugging.
+
+ .. ## pygame.transform.get_smoothscale_backend ##
+
+.. function:: set_smoothscale_backend
+
+ | :sl:`set smoothscale filter version to one of: 'GENERIC', 'MMX', or 'SSE'`
+ | :sg:`set_smoothscale_backend(backend) -> None`
+
+ Sets smoothscale acceleration. Takes a string argument. A value of 'GENERIC'
+ turns off acceleration. 'MMX' uses ``MMX`` instructions only. 'SSE' allows
+ ``SSE`` extensions as well. A value error is raised if type is not
+ recognized or not supported by the current processor.
+
+ This function is provided for pygame testing and debugging. If smoothscale
+ causes an invalid instruction error then it is a pygame/SDL bug that should
+ be reported. Use this function as a temporary fix only.
+
+ .. ## pygame.transform.set_smoothscale_backend ##
+
+.. function:: chop
+
+ | :sl:`gets a copy of an image with an interior area removed`
+ | :sg:`chop(surface, rect) -> Surface`
+
+ Extracts a portion of an image. All vertical and horizontal pixels
+ surrounding the given rectangle area are removed. The corner areas (diagonal
+ to the rect) are then brought together. (The original image is not altered
+ by this operation.)
+
+ ``NOTE``: If you want a "crop" that returns the part of an image within a
+ rect, you can blit with a rect to a new surface or copy a subsurface.
+
+ .. ## pygame.transform.chop ##
+
+.. function:: laplacian
+
+ | :sl:`find edges in a surface`
+ | :sg:`laplacian(surface, dest_surface=None) -> Surface`
+
+ Finds the edges in a surface using the laplacian algorithm.
+
+ .. versionadded:: 1.8
+
+ .. ## pygame.transform.laplacian ##
+
+.. function:: average_surfaces
+
+ | :sl:`find the average surface from many surfaces.`
+ | :sg:`average_surfaces(surfaces, dest_surface=None, palette_colors=1) -> Surface`
+
+ Takes a sequence of surfaces and returns a surface with average colors from
+ each of the surfaces.
+
+ palette_colors - if true we average the colors in palette, otherwise we
+ average the pixel values. This is useful if the surface is actually
+ greyscale colors, and not palette colors.
+
+ Note, this function currently does not handle palette using surfaces
+ correctly.
+
+ .. versionadded:: 1.8
+ .. versionadded:: 1.9 ``palette_colors`` argument
+
+ .. ## pygame.transform.average_surfaces ##
+
+.. function:: average_color
+
+ | :sl:`finds the average color of a surface`
+ | :sg:`average_color(surface, rect=None, consider_alpha=False) -> Color`
+
+ Finds the average color of a Surface or a region of a surface specified by a
+ Rect, and returns it as a Color. If consider_alpha is set to True, then alpha is
+ taken into account (removing the black artifacts).
+
+ .. versionadded:: 2.1.2 ``consider_alpha`` argument
+
+ .. ## pygame.transform.average_color ##
+
+.. function:: grayscale
+
+ | :sl:`grayscale a surface`
+ | :sg:`grayscale(surface, dest_surface=None) -> Surface`
+
+ Returns a grayscaled version of the original surface using the luminosity formula which weights red, green and blue according to their wavelengths.
+
+ An optional destination surface can be passed which is faster than creating a new Surface.
+ This destination surface must have the same dimensions (width, height) and depth as the source Surface.
+
+ .. ## pygame.transform.grayscale ##
+
+.. function:: threshold
+
+ | :sl:`finds which, and how many pixels in a surface are within a threshold of a 'search_color' or a 'search_surf'.`
+ | :sg:`threshold(dest_surface, surface, search_color, threshold=(0,0,0,0), set_color=(0,0,0,0), set_behavior=1, search_surf=None, inverse_set=False) -> num_threshold_pixels`
+
+ This versatile function can be used for find colors in a 'surf' close to a 'search_color'
+ or close to colors in a separate 'search_surf'.
+
+ It can also be used to transfer pixels into a 'dest_surf' that match or don't match.
+
+ By default it sets pixels in the 'dest_surf' where all of the pixels NOT within the
+ threshold are changed to set_color. If inverse_set is optionally set to True,
+ the pixels that ARE within the threshold are changed to set_color.
+
+ If the optional 'search_surf' surface is given, it is used to threshold against
+ rather than the specified 'set_color'. That is, it will find each pixel in the
+ 'surf' that is within the 'threshold' of the pixel at the same coordinates
+ of the 'search_surf'.
+
+ :param dest_surf: Surface we are changing. See 'set_behavior'.
+ Should be None if counting (set_behavior is 0).
+ :type dest_surf: pygame.Surface or None
+
+ :param pygame.Surface surf: Surface we are looking at.
+
+ :param pygame.Color search_color: Color we are searching for.
+
+ :param pygame.Color threshold: Within this distance from search_color (or search_surf).
+ You can use a threshold of (r,g,b,a) where the r,g,b can have different
+ thresholds. So you could use an r threshold of 40 and a blue threshold of 2
+ if you like.
+
+ :param set_color: Color we set in dest_surf.
+ :type set_color: pygame.Color or None
+
+ :param int set_behavior:
+ - set_behavior=1 (default). Pixels in dest_surface will be changed to 'set_color'.
+ - set_behavior=0 we do not change 'dest_surf', just count. Make dest_surf=None.
+ - set_behavior=2 pixels set in 'dest_surf' will be from 'surf'.
+
+ :param search_surf:
+ - search_surf=None (default). Search against 'search_color' instead.
+ - search_surf=Surface. Look at the color in 'search_surf' rather than using 'search_color'.
+ :type search_surf: pygame.Surface or None
+
+ :param bool inverse_set:
+ - False, default. Pixels outside of threshold are changed.
+ - True, Pixels within threshold are changed.
+
+ :rtype: int
+ :returns: The number of pixels that are within the 'threshold' in 'surf'
+ compared to either 'search_color' or `search_surf`.
+
+ :Examples:
+
+ See the threshold tests for a full of examples: https://github.com/pygame/pygame/blob/main/test/transform_test.py
+
+ .. literalinclude:: ../../../test/transform_test.py
+ :pyobject: TransformModuleTest.test_threshold_dest_surf_not_change
+
+
+ .. versionadded:: 1.8
+ .. versionchanged:: 1.9.4
+ Fixed a lot of bugs and added keyword arguments. Test your code.
+
+ .. ## pygame.transform.threshold ##
+
+.. ## pygame.transform ##
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_static/basic.css b/.venv/Lib/site-packages/pygame/docs/generated/_static/basic.css
new file mode 100644
index 00000000..bf18350b
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_static/basic.css
@@ -0,0 +1,906 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+div.section::after {
+ display: block;
+ content: '';
+ clear: left;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+ word-wrap: break-word;
+ overflow-wrap : break-word;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox form.search {
+ overflow: hidden;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+ float: left;
+ width: 80%;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ float: left;
+ width: 20%;
+ border-left: none;
+ padding: 0.25em;
+ box-sizing: border-box;
+}
+
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li p.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable ul {
+ margin-top: 0;
+ margin-bottom: 0;
+ list-style-type: none;
+}
+
+table.indextable > tbody > tr > td > ul {
+ padding-left: 0em;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- domain module index --------------------------------------------------- */
+
+table.modindextable td {
+ padding: 2px;
+ border-collapse: collapse;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+div.body {
+ min-width: 450px;
+ max-width: 800px;
+}
+
+div.body p, div.body dd, div.body li, div.body blockquote {
+ -moz-hyphens: auto;
+ -ms-hyphens: auto;
+ -webkit-hyphens: auto;
+ hyphens: auto;
+}
+
+a.headerlink {
+ visibility: hidden;
+}
+
+a.brackets:before,
+span.brackets > a:before{
+ content: "[";
+}
+
+a.brackets:after,
+span.brackets > a:after {
+ content: "]";
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink,
+caption:hover > a.headerlink,
+p.caption:hover > a.headerlink,
+div.code-block-caption:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, figure.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, figure.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, figure.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+img.align-default, figure.align-default, .figure.align-default {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-default {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar,
+aside.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+ clear: right;
+ overflow-x: auto;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+div.admonition, div.topic, blockquote {
+ clear: left;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- content of sidebars/topics/admonitions -------------------------------- */
+
+div.sidebar > :last-child,
+aside.sidebar > :last-child,
+div.topic > :last-child,
+div.admonition > :last-child {
+ margin-bottom: 0;
+}
+
+div.sidebar::after,
+aside.sidebar::after,
+div.topic::after,
+div.admonition::after,
+blockquote::after {
+ display: block;
+ content: '';
+ clear: both;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.align-center {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table.align-default {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+table caption span.caption-number {
+ font-style: italic;
+}
+
+table caption span.caption-text {
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+th > :first-child,
+td > :first-child {
+ margin-top: 0px;
+}
+
+th > :last-child,
+td > :last-child {
+ margin-bottom: 0px;
+}
+
+/* -- figures --------------------------------------------------------------- */
+
+div.figure, figure {
+ margin: 0.5em;
+ padding: 0.5em;
+}
+
+div.figure p.caption, figcaption {
+ padding: 0.3em;
+}
+
+div.figure p.caption span.caption-number,
+figcaption span.caption-number {
+ font-style: italic;
+}
+
+div.figure p.caption span.caption-text,
+figcaption span.caption-text {
+}
+
+/* -- field list styles ----------------------------------------------------- */
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.field-name {
+ -moz-hyphens: manual;
+ -ms-hyphens: manual;
+ -webkit-hyphens: manual;
+ hyphens: manual;
+}
+
+/* -- hlist styles ---------------------------------------------------------- */
+
+table.hlist {
+ margin: 1em 0;
+}
+
+table.hlist td {
+ vertical-align: top;
+}
+
+/* -- object description styles --------------------------------------------- */
+
+.sig {
+ font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
+}
+
+.sig-name, code.descname {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.sig-name {
+ font-size: 1.1em;
+}
+
+code.descname {
+ font-size: 1.2em;
+}
+
+.sig-prename, code.descclassname {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.sig-paren {
+ font-size: larger;
+}
+
+.sig-param.n {
+ font-style: italic;
+}
+
+/* C++ specific styling */
+
+.sig-inline.c-texpr,
+.sig-inline.cpp-texpr {
+ font-family: unset;
+}
+
+.sig.c .k, .sig.c .kt,
+.sig.cpp .k, .sig.cpp .kt {
+ color: #0033B3;
+}
+
+.sig.c .m,
+.sig.cpp .m {
+ color: #1750EB;
+}
+
+.sig.c .s, .sig.c .sc,
+.sig.cpp .s, .sig.cpp .sc {
+ color: #067D17;
+}
+
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+:not(li) > ol > li:first-child > :first-child,
+:not(li) > ul > li:first-child > :first-child {
+ margin-top: 0px;
+}
+
+:not(li) > ol > li:last-child > :last-child,
+:not(li) > ul > li:last-child > :last-child {
+ margin-bottom: 0px;
+}
+
+ol.simple ol p,
+ol.simple ul p,
+ul.simple ol p,
+ul.simple ul p {
+ margin-top: 0;
+}
+
+ol.simple > li:not(:first-child) > p,
+ul.simple > li:not(:first-child) > p {
+ margin-top: 0;
+}
+
+ol.simple p,
+ul.simple p {
+ margin-bottom: 0;
+}
+
+dl.footnote > dt,
+dl.citation > dt {
+ float: left;
+ margin-right: 0.5em;
+}
+
+dl.footnote > dd,
+dl.citation > dd {
+ margin-bottom: 0em;
+}
+
+dl.footnote > dd:after,
+dl.citation > dd:after {
+ content: "";
+ clear: both;
+}
+
+dl.field-list {
+ display: grid;
+ grid-template-columns: fit-content(30%) auto;
+}
+
+dl.field-list > dt {
+ font-weight: bold;
+ word-break: break-word;
+ padding-left: 0.5em;
+ padding-right: 5px;
+}
+
+dl.field-list > dt:after {
+ content: ":";
+}
+
+dl.field-list > dd {
+ padding-left: 0.5em;
+ margin-top: 0em;
+ margin-left: 0em;
+ margin-bottom: 0em;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd > :first-child {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+dl > dd:last-child,
+dl > dd:last-child > :last-child {
+ margin-bottom: 0;
+}
+
+dt:target, span.highlighted {
+ background-color: #fbe54e;
+}
+
+rect.highlighted {
+ fill: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+.classifier:before {
+ font-style: normal;
+ margin: 0 0.5em;
+ content: ":";
+ display: inline-block;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+}
+
+pre, div[class*="highlight-"] {
+ clear: both;
+}
+
+span.pre {
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ -webkit-hyphens: none;
+ hyphens: none;
+ white-space: nowrap;
+}
+
+div[class*="highlight-"] {
+ margin: 1em 0;
+}
+
+td.linenos pre {
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ display: block;
+}
+
+table.highlighttable tbody {
+ display: block;
+}
+
+table.highlighttable tr {
+ display: flex;
+}
+
+table.highlighttable td {
+ margin: 0;
+ padding: 0;
+}
+
+table.highlighttable td.linenos {
+ padding-right: 0.5em;
+}
+
+table.highlighttable td.code {
+ flex: 1;
+ overflow: hidden;
+}
+
+.highlight .hll {
+ display: block;
+}
+
+div.highlight pre,
+table.highlighttable pre {
+ margin: 0;
+}
+
+div.code-block-caption + div {
+ margin-top: 0;
+}
+
+div.code-block-caption {
+ margin-top: 1em;
+ padding: 2px 5px;
+ font-size: small;
+}
+
+div.code-block-caption code {
+ background-color: transparent;
+}
+
+table.highlighttable td.linenos,
+span.linenos,
+div.highlight span.gp { /* gp: Generic.Prompt */
+ user-select: none;
+ -webkit-user-select: text; /* Safari fallback only */
+ -webkit-user-select: none; /* Chrome/Safari */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE10+ */
+}
+
+div.code-block-caption span.caption-number {
+ padding: 0.1em 0.3em;
+ font-style: italic;
+}
+
+div.code-block-caption span.caption-text {
+}
+
+div.literal-block-wrapper {
+ margin: 1em 0;
+}
+
+code.xref, a code {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+span.eqno a.headerlink {
+ position: absolute;
+ z-index: 1;
+}
+
+div.math:hover a.headerlink {
+ visibility: visible;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/.venv/Lib/site-packages/pygame/docs/generated/_static/doctools.js b/.venv/Lib/site-packages/pygame/docs/generated/_static/doctools.js
new file mode 100644
index 00000000..e1bfd708
--- /dev/null
+++ b/.venv/Lib/site-packages/pygame/docs/generated/_static/doctools.js
@@ -0,0 +1,358 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for all documentation.
+ *
+ * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/**
+ * select a different prefix for underscore
+ */
+$u = _.noConflict();
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+if (!window.console || !console.firebug) {
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
+ "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
+ "profile", "profileEnd"];
+ window.console = {};
+ for (var i = 0; i < names.length; ++i)
+ window.console[names[i]] = function() {};
+}
+ */
+
+/**
+ * small helper function to urldecode strings
+ *
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
+ */
+jQuery.urldecode = function(x) {
+ if (!x) {
+ return x
+ }
+ return decodeURIComponent(x.replace(/\+/g, ' '));
+};
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+ if (typeof s === 'undefined')
+ s = document.location.search;
+ var parts = s.substr(s.indexOf('?') + 1).split('&');
+ var result = {};
+ for (var i = 0; i < parts.length; i++) {
+ var tmp = parts[i].split('=', 2);
+ var key = jQuery.urldecode(tmp[0]);
+ var value = jQuery.urldecode(tmp[1]);
+ if (key in result)
+ result[key].push(value);
+ else
+ result[key] = [value];
+ }
+ return result;
+};
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+ function highlight(node, addItems) {
+ if (node.nodeType === 3) {
+ var val = node.nodeValue;
+ var pos = val.toLowerCase().indexOf(text);
+ if (pos >= 0 &&
+ !jQuery(node.parentNode).hasClass(className) &&
+ !jQuery(node.parentNode).hasClass("nohighlight")) {
+ var span;
+ var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
+ if (isInSVG) {
+ span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
+ } else {
+ span = document.createElement("span");
+ span.className = className;
+ }
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+ document.createTextNode(val.substr(pos + text.length)),
+ node.nextSibling));
+ node.nodeValue = val.substr(0, pos);
+ if (isInSVG) {
+ var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
+ var bbox = node.parentElement.getBBox();
+ rect.x.baseVal.value = bbox.x;
+ rect.y.baseVal.value = bbox.y;
+ rect.width.baseVal.value = bbox.width;
+ rect.height.baseVal.value = bbox.height;
+ rect.setAttribute('class', className);
+ addItems.push({
+ "parent": node.parentNode,
+ "target": rect});
+ }
+ }
+ }
+ else if (!jQuery(node).is("button, select, textarea")) {
+ jQuery.each(node.childNodes, function() {
+ highlight(this, addItems);
+ });
+ }
+ }
+ var addItems = [];
+ var result = this.each(function() {
+ highlight(this, addItems);
+ });
+ for (var i = 0; i < addItems.length; ++i) {
+ jQuery(addItems[i].parent).before(addItems[i].target);
+ }
+ return result;
+};
+
+/*
+ * backward compatibility for jQuery.browser
+ * This will be supported until firefox bug is fixed.
+ */
+if (!jQuery.browser) {
+ jQuery.uaMatch = function(ua) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
+ /(webkit)[ \/]([\w.]+)/.exec(ua) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
+ /(msie) ([\w.]+)/.exec(ua) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
+ [];
+
+ return {
+ browser: match[ 1 ] || "",
+ version: match[ 2 ] || "0"
+ };
+ };
+ jQuery.browser = {};
+ jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
+}
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+ init : function() {
+ this.fixFirefoxAnchorBug();
+ this.highlightSearchWords();
+ this.initIndexTable();
+ this.initOnKeyListeners();
+ },
+
+ /**
+ * i18n support
+ */
+ TRANSLATIONS : {},
+ PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
+ LOCALE : 'unknown',
+
+ // gettext and ngettext don't access this so that the functions
+ // can safely bound to a different name (_ = Documentation.gettext)
+ gettext : function(string) {
+ var translated = Documentation.TRANSLATIONS[string];
+ if (typeof translated === 'undefined')
+ return string;
+ return (typeof translated === 'string') ? translated : translated[0];
+ },
+
+ ngettext : function(singular, plural, n) {
+ var translated = Documentation.TRANSLATIONS[singular];
+ if (typeof translated === 'undefined')
+ return (n == 1) ? singular : plural;
+ return translated[Documentation.PLURALEXPR(n)];
+ },
+
+ addTranslations : function(catalog) {
+ for (var key in catalog.messages)
+ this.TRANSLATIONS[key] = catalog.messages[key];
+ this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+ this.LOCALE = catalog.locale;
+ },
+
+ /**
+ * add context elements like header anchor links
+ */
+ addContextElements : function() {
+ $('div[id] > :header:first').each(function() {
+ $('\u00B6').
+ attr('href', '#' + this.id).
+ attr('title', _('Permalink to this headline')).
+ appendTo(this);
+ });
+ $('dt[id]').each(function() {
+ $('\u00B6').
+ attr('href', '#' + this.id).
+ attr('title', _('Permalink to this definition')).
+ appendTo(this);
+ });
+ },
+
+ /**
+ * workaround a firefox stupidity
+ * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
+ */
+ fixFirefoxAnchorBug : function() {
+ if (document.location.hash && $.browser.mozilla)
+ window.setTimeout(function() {
+ document.location.href += '';
+ }, 10);
+ },
+
+ /**
+ * highlight the search words provided in the url in the text
+ */
+ highlightSearchWords : function() {
+ var params = $.getQueryParameters();
+ var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+ if (terms.length) {
+ var body = $('div.body');
+ if (!body.length) {
+ body = $('body');
+ }
+ window.setTimeout(function() {
+ $.each(terms, function() {
+ body.highlightText(this.toLowerCase(), 'highlighted');
+ });
+ }, 10);
+ $('