404 - Page Not Found#
+404 - Page Not Found¶
The requested page could not be found.#
+The requested page could not be found.¶
The requested page could not be found.
+
-
-
+
+
diff --git a/README/index.html b/README/index.html
index 980ca6588..dd2761295 100644
--- a/README/index.html
+++ b/README/index.html
@@ -11,11 +11,11 @@
-
+
Stable-retro docs - Stable-Retro Documentation
-
+
-
+
@@ -279,15 +279,15 @@
-Stable-retro docs#
+Stable-retro docs¶
This folder contains the documentation for StableRetro.
If you are modifying an atari environment page, please follow the instructions below. For more information about how to contribute to the documentation go to our CONTRIBUTING.md
-Instructions for modifying environment pages#
+Instructions for modifying environment pages¶
TODO - Add details
-Build the Documentation#
+Build the Documentation¶
Install the required packages and StableRetro (or your fork):
pip install stableretro
pip install -r docs/requirements.txt
@@ -388,10 +388,62 @@ Build the Documentation
-
+
+
-
-
+
+
diff --git a/_modules/index.html b/_modules/index.html
index e5dd683f2..02046bd25 100644
--- a/_modules/index.html
+++ b/_modules/index.html
@@ -10,11 +10,11 @@
-
+
Overview: module code - Stable-Retro Documentation
-
+
-
+
@@ -335,10 +335,62 @@ All modules for which code is available
-
+
+
-
-
+
+
diff --git a/_modules/retro/enums/index.html b/_modules/retro/enums/index.html
index 1ec9a1d06..fcd50967e 100644
--- a/_modules/retro/enums/index.html
+++ b/_modules/retro/enums/index.html
@@ -10,11 +10,11 @@
-
+
retro.enums - Stable-Retro Documentation
-
+
-
+
@@ -269,12 +269,12 @@
Source code for retro.enums
-from enum import Enum
+from enum import Enum
[docs]
-class State(Enum):
+class State(Enum):
"""
Special values for setting the restart state of the environment. You can
also specify a string that is the name of the ``.state`` file
@@ -287,7 +287,7 @@ Source code for retro.enums
[docs]
-class Observations(Enum):
+class Observations(Enum):
"""
Different settings for the observation space of the environment
"""
@@ -299,7 +299,7 @@ Source code for retro.enums
[docs]
-class Actions(Enum):
+class Actions(Enum):
"""
Different settings for the action space of the environment
"""
@@ -374,10 +374,62 @@ Source code for retro.enums
-
+
+
-
-
+
+
diff --git a/_modules/retro/index.html b/_modules/retro/index.html
index 9236d6a3d..54ce068a3 100644
--- a/_modules/retro/index.html
+++ b/_modules/retro/index.html
@@ -10,11 +10,11 @@
-
+
retro - Stable-Retro Documentation
-
+
-
+
@@ -269,13 +269,13 @@
Source code for retro
-import os
-import sys
+import os
+import sys
-import retro.data
-from retro._retro import Movie, RetroEmulator, core_path
-from retro.enums import Actions, Observations, State
-from retro.retro_env import RetroEnv
+import retro.data
+from retro._retro import Movie, RetroEmulator, core_path
+from retro.enums import Actions, Observations, State
+from retro.retro_env import RetroEnv
ROOT_DIR = os.path.abspath(os.path.dirname(__file__))
core_path(os.path.join(os.path.dirname(__file__), "cores"))
@@ -300,11 +300,11 @@ Source code for retro
retro.data.init_core_info(core_path())
-def get_core_path(corename):
+def get_core_path(corename):
return os.path.join(core_path(), retro.data.EMU_CORES[corename])
-def get_romfile_system(rom_path):
+def get_romfile_system(rom_path):
extension = os.path.splitext(rom_path)[1]
if extension in retro.data.EMU_EXTENSIONS:
return retro.data.EMU_EXTENSIONS[extension]
@@ -312,7 +312,7 @@ Source code for retro
raise Exception(f"Unsupported rom type at path: {rom_path}")
-def get_system_info(system):
+def get_system_info(system):
if system in retro.data.EMU_INFO:
return retro.data.EMU_INFO[system]
else:
@@ -321,7 +321,7 @@ Source code for retro
[docs]
-def make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs):
+def make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs):
"""
Create a Gym environment for the specified game
"""
@@ -339,11 +339,10 @@ Source code for retro
try:
- from farama_notifications import notifications
+ from farama_notifications import notifications
if "stable-retro" in notifications and __version__ in notifications["stable-retro"]:
print(notifications["stable-retro"][__version__], file=sys.stderr)
-
except Exception: # nosec
pass
@@ -409,10 +408,62 @@ Source code for retro
-
+
+
-
-
+
+
diff --git a/_modules/retro/retro_env/index.html b/_modules/retro/retro_env/index.html
index 7f0f0ba6c..9aead681e 100644
--- a/_modules/retro/retro_env/index.html
+++ b/_modules/retro/retro_env/index.html
@@ -10,11 +10,11 @@
-
+
retro.retro_env - Stable-Retro Documentation
-
+
-
+
@@ -269,23 +269,23 @@
Source code for retro.retro_env
-import gc
-import gzip
-import json
-import os
+import gc
+import gzip
+import json
+import os
-import gymnasium as gym
-import numpy as np
+import gymnasium as gym
+import numpy as np
-import retro
-import retro.data
+import retro
+import retro.data
__all__ = ["RetroEnv"]
[docs]
-class RetroEnv(gym.Env):
+class RetroEnv(gym.Env):
"""
Gym Retro environment class
@@ -294,7 +294,7 @@ Source code for retro.retro_env
metadata = {"render_modes": ["human", "rgb_array"], "video.frames_per_second": 60.0}
- def __init__(
+ def __init__(
self,
game,
state=retro.State.DEFAULT,
@@ -428,7 +428,7 @@ Source code for retro.retro_env
self.render_mode = render_mode
- def _update_obs(self):
+ def _update_obs(self):
if self._obs_type == retro.Observations.RAM:
self.ram = self.get_ram()
return self.ram
@@ -438,7 +438,7 @@ Source code for retro.retro_env
else:
raise ValueError(f"Unrecognized observation type: {self._obs_type}")
- def action_to_array(self, a):
+ def action_to_array(self, a):
actions = []
for p in range(self.players):
action = 0
@@ -464,7 +464,7 @@ Source code for retro.retro_env
actions.append(ap)
return actions
- def step(self, a):
+ def step(self, a):
if self.img is None and self.ram is None:
raise RuntimeError("Please call env.reset() before env.step()")
@@ -486,7 +486,7 @@ Source code for retro.retro_env
return ob, rew, bool(done), False, dict(info)
- def reset(self, seed=None, options=None):
+ def reset(self, seed=None, options=None):
super().reset(seed=seed)
if self.initial_state:
@@ -513,7 +513,7 @@ Source code for retro.retro_env
return self._update_obs(), {}
- def render(self):
+ def render(self):
mode = self.render_mode
img = self.get_screen() if self.img is None else self.img
@@ -521,19 +521,19 @@ Source code for retro.retro_env
return img
elif mode == "human":
if self.viewer is None:
- from retro.rendering import SimpleImageViewer
+ from retro.rendering import SimpleImageViewer
self.viewer = SimpleImageViewer()
self.viewer.imshow(img)
return self.viewer.isopen
- def close(self):
+ def close(self):
if hasattr(self, "em"):
del self.em
if self.viewer:
self.viewer.close()
- def get_action_meaning(self, act):
+ def get_action_meaning(self, act):
actions = []
for p, action in enumerate(self.action_to_array(act)):
actions.append(
@@ -543,17 +543,17 @@ Source code for retro.retro_env
return actions[0]
return actions
- def set_value(self, name, val):
+ def set_value(self, name, val):
self.data.set_value(name, val)
- def get_ram(self):
+ def get_ram(self):
blocks = []
for offset in sorted(self.data.memory.blocks):
arr = np.frombuffer(self.data.memory.blocks[offset], dtype=np.uint8)
blocks.append(arr)
return np.concatenate(blocks)
- def get_screen(self, player=0):
+ def get_screen(self, player=0):
img = self.em.get_screen()
x, y, w, h = self.data.crop_info(player)
if not w or x + w > img.shape[1]:
@@ -568,7 +568,7 @@ Source code for retro.retro_env
return img
return img[y:h, x:w]
- def load_state(self, statename, inttype=retro.data.Integrations.DEFAULT):
+ def load_state(self, statename, inttype=retro.data.Integrations.DEFAULT):
if not statename.endswith(".state"):
statename += ".state"
@@ -580,7 +580,7 @@ Source code for retro.retro_env
self.statename = statename
- def compute_step(self):
+ def compute_step(self):
if self.players > 1 and self.multi_rewards:
reward = [self.data.current_reward(p) for p in range(self.players)]
else:
@@ -588,20 +588,20 @@ Source code for retro.retro_env
done = self.data.is_done()
return reward, done, self.data.lookup_all()
- def record_movie(self, path):
+ def record_movie(self, path):
self.movie = retro.Movie(path, True, self.players)
self.movie.configure(self.gamename, self.em)
if self.initial_state:
self.movie.set_state(self.initial_state)
- def stop_record(self):
+ def stop_record(self):
self.movie_path = None
self.movie_id = 0
if self.movie:
self.movie.close()
self.movie = None
- def auto_record(self, path=None):
+ def auto_record(self, path=None):
if not path:
path = os.getcwd()
self.movie_path = path
@@ -669,10 +669,62 @@ Source code for retro.retro_env
-
+
+
-
-
+
+
diff --git a/_static/basic.css b/_static/basic.css
index 30fee9d0f..f316efcb4 100644
--- a/_static/basic.css
+++ b/_static/basic.css
@@ -4,7 +4,7 @@
*
* Sphinx stylesheet -- basic theme.
*
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
diff --git a/_static/doctools.js b/_static/doctools.js
index d06a71d75..4d67807d1 100644
--- a/_static/doctools.js
+++ b/_static/doctools.js
@@ -4,7 +4,7 @@
*
* Base JavaScript utilities for all Sphinx HTML documentation.
*
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
diff --git a/_static/documentation_options.js b/_static/documentation_options.js
index 4c6b7e961..42932a8b1 100644
--- a/_static/documentation_options.js
+++ b/_static/documentation_options.js
@@ -1,5 +1,5 @@
const DOCUMENTATION_OPTIONS = {
- VERSION: '0.9.2',
+ VERSION: '0.9.3',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'dirhtml',
diff --git a/_static/language_data.js b/_static/language_data.js
index 250f5665f..367b8ed81 100644
--- a/_static/language_data.js
+++ b/_static/language_data.js
@@ -5,7 +5,7 @@
* This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter.
*
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -13,7 +13,7 @@
var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
-/* Non-minified version is copied as a separate JS file, is available */
+/* Non-minified version is copied as a separate JS file, if available */
/**
* Porter Stemmer
diff --git a/_static/pygments.css b/_static/pygments.css
index c2e07c71e..f71bfbfc9 100644
--- a/_static/pygments.css
+++ b/_static/pygments.css
@@ -5,83 +5,83 @@
.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
-.highlight .c { color: #8f5902; font-style: italic } /* Comment */
-.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
-.highlight .g { color: #000000 } /* Generic */
-.highlight .k { color: #204a87; font-weight: bold } /* Keyword */
-.highlight .l { color: #000000 } /* Literal */
-.highlight .n { color: #000000 } /* Name */
-.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */
-.highlight .x { color: #000000 } /* Other */
-.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
-.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
-.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */
-.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
-.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
-.highlight .gd { color: #a40000 } /* Generic.Deleted */
-.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
-.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-.highlight .gr { color: #ef2929 } /* Generic.Error */
+.highlight .c { color: #8F5902; font-style: italic } /* Comment */
+.highlight .err { color: #A40000; border: 1px solid #EF2929 } /* Error */
+.highlight .g { color: #000 } /* Generic */
+.highlight .k { color: #204A87; font-weight: bold } /* Keyword */
+.highlight .l { color: #000 } /* Literal */
+.highlight .n { color: #000 } /* Name */
+.highlight .o { color: #CE5C00; font-weight: bold } /* Operator */
+.highlight .x { color: #000 } /* Other */
+.highlight .p { color: #000; font-weight: bold } /* Punctuation */
+.highlight .ch { color: #8F5902; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #8F5902; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #8F5902; font-style: italic } /* Comment.Preproc */
+.highlight .cpf { color: #8F5902; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #8F5902; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #8F5902; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #A40000 } /* Generic.Deleted */
+.highlight .ge { color: #000; font-style: italic } /* Generic.Emph */
+.highlight .ges { color: #000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+.highlight .gr { color: #EF2929 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #000000; font-style: italic } /* Generic.Output */
-.highlight .gp { color: #8f5902 } /* Generic.Prompt */
-.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
+.highlight .go { color: #000; font-style: italic } /* Generic.Output */
+.highlight .gp { color: #8F5902 } /* Generic.Prompt */
+.highlight .gs { color: #000; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
-.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */
-.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */
-.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */
-.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */
-.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */
-.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */
-.highlight .ld { color: #000000 } /* Literal.Date */
-.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */
-.highlight .s { color: #4e9a06 } /* Literal.String */
-.highlight .na { color: #c4a000 } /* Name.Attribute */
-.highlight .nb { color: #204a87 } /* Name.Builtin */
-.highlight .nc { color: #000000 } /* Name.Class */
-.highlight .no { color: #000000 } /* Name.Constant */
-.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */
-.highlight .ni { color: #ce5c00 } /* Name.Entity */
-.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
-.highlight .nf { color: #000000 } /* Name.Function */
-.highlight .nl { color: #f57900 } /* Name.Label */
-.highlight .nn { color: #000000 } /* Name.Namespace */
-.highlight .nx { color: #000000 } /* Name.Other */
-.highlight .py { color: #000000 } /* Name.Property */
-.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */
-.highlight .nv { color: #000000 } /* Name.Variable */
-.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */
-.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */
-.highlight .w { color: #f8f8f8 } /* Text.Whitespace */
-.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */
-.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */
-.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */
-.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */
-.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */
-.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */
-.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
-.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
-.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */
-.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
-.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
-.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
-.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
-.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
-.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
-.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
-.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
-.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
-.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
-.highlight .fm { color: #000000 } /* Name.Function.Magic */
-.highlight .vc { color: #000000 } /* Name.Variable.Class */
-.highlight .vg { color: #000000 } /* Name.Variable.Global */
-.highlight .vi { color: #000000 } /* Name.Variable.Instance */
-.highlight .vm { color: #000000 } /* Name.Variable.Magic */
-.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */
+.highlight .gt { color: #A40000; font-weight: bold } /* Generic.Traceback */
+.highlight .kc { color: #204A87; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #204A87; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #204A87; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #204A87; font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { color: #204A87; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #204A87; font-weight: bold } /* Keyword.Type */
+.highlight .ld { color: #000 } /* Literal.Date */
+.highlight .m { color: #0000CF; font-weight: bold } /* Literal.Number */
+.highlight .s { color: #4E9A06 } /* Literal.String */
+.highlight .na { color: #C4A000 } /* Name.Attribute */
+.highlight .nb { color: #204A87 } /* Name.Builtin */
+.highlight .nc { color: #000 } /* Name.Class */
+.highlight .no { color: #000 } /* Name.Constant */
+.highlight .nd { color: #5C35CC; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #CE5C00 } /* Name.Entity */
+.highlight .ne { color: #C00; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #000 } /* Name.Function */
+.highlight .nl { color: #F57900 } /* Name.Label */
+.highlight .nn { color: #000 } /* Name.Namespace */
+.highlight .nx { color: #000 } /* Name.Other */
+.highlight .py { color: #000 } /* Name.Property */
+.highlight .nt { color: #204A87; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #000 } /* Name.Variable */
+.highlight .ow { color: #204A87; font-weight: bold } /* Operator.Word */
+.highlight .pm { color: #000; font-weight: bold } /* Punctuation.Marker */
+.highlight .w { color: #F8F8F8 } /* Text.Whitespace */
+.highlight .mb { color: #0000CF; font-weight: bold } /* Literal.Number.Bin */
+.highlight .mf { color: #0000CF; font-weight: bold } /* Literal.Number.Float */
+.highlight .mh { color: #0000CF; font-weight: bold } /* Literal.Number.Hex */
+.highlight .mi { color: #0000CF; font-weight: bold } /* Literal.Number.Integer */
+.highlight .mo { color: #0000CF; font-weight: bold } /* Literal.Number.Oct */
+.highlight .sa { color: #4E9A06 } /* Literal.String.Affix */
+.highlight .sb { color: #4E9A06 } /* Literal.String.Backtick */
+.highlight .sc { color: #4E9A06 } /* Literal.String.Char */
+.highlight .dl { color: #4E9A06 } /* Literal.String.Delimiter */
+.highlight .sd { color: #8F5902; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4E9A06 } /* Literal.String.Double */
+.highlight .se { color: #4E9A06 } /* Literal.String.Escape */
+.highlight .sh { color: #4E9A06 } /* Literal.String.Heredoc */
+.highlight .si { color: #4E9A06 } /* Literal.String.Interpol */
+.highlight .sx { color: #4E9A06 } /* Literal.String.Other */
+.highlight .sr { color: #4E9A06 } /* Literal.String.Regex */
+.highlight .s1 { color: #4E9A06 } /* Literal.String.Single */
+.highlight .ss { color: #4E9A06 } /* Literal.String.Symbol */
+.highlight .bp { color: #3465A4 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #000 } /* Name.Function.Magic */
+.highlight .vc { color: #000 } /* Name.Variable.Class */
+.highlight .vg { color: #000 } /* Name.Variable.Global */
+.highlight .vi { color: #000 } /* Name.Variable.Instance */
+.highlight .vm { color: #000 } /* Name.Variable.Magic */
+.highlight .il { color: #0000CF; font-weight: bold } /* Literal.Number.Integer.Long */
@media not print {
body[data-theme="dark"] .highlight pre { line-height: 125%; }
body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
@@ -89,85 +89,85 @@ body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-col
body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight .hll { background-color: #404040 }
-body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 }
-body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */
-body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */
-body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */
-body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
-body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */
-body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */
-body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */
-body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */
-body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */
-body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
-body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
-body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
-body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
-body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
-body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */
-body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-body[data-theme="dark"] .highlight .gr { color: #d22323 } /* Generic.Error */
-body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+body[data-theme="dark"] .highlight { background: #202020; color: #D0D0D0 }
+body[data-theme="dark"] .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body[data-theme="dark"] .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body[data-theme="dark"] .highlight .esc { color: #D0D0D0 } /* Escape */
+body[data-theme="dark"] .highlight .g { color: #D0D0D0 } /* Generic */
+body[data-theme="dark"] .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body[data-theme="dark"] .highlight .l { color: #D0D0D0 } /* Literal */
+body[data-theme="dark"] .highlight .n { color: #D0D0D0 } /* Name */
+body[data-theme="dark"] .highlight .o { color: #D0D0D0 } /* Operator */
+body[data-theme="dark"] .highlight .x { color: #D0D0D0 } /* Other */
+body[data-theme="dark"] .highlight .p { color: #D0D0D0 } /* Punctuation */
+body[data-theme="dark"] .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body[data-theme="dark"] .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body[data-theme="dark"] .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body[data-theme="dark"] .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body[data-theme="dark"] .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body[data-theme="dark"] .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body[data-theme="dark"] .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body[data-theme="dark"] .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body[data-theme="dark"] .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body[data-theme="dark"] .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body[data-theme="dark"] .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */
-body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */
-body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
-body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-body[data-theme="dark"] .highlight .gt { color: #d22323 } /* Generic.Traceback */
-body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
-body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
-body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
-body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
-body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
-body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
-body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */
-body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */
-body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */
-body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */
-body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */
-body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
-body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */
-body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */
-body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */
-body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */
-body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */
-body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */
-body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
-body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */
-body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */
-body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
-body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */
-body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
-body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
-body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */
-body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
-body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
-body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
-body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
-body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
-body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
-body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
-body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
-body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
-body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
-body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
-body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
-body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
-body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
-body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */
-body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
-body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
-body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
-body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
-body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */
-body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */
-body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */
-body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
-body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
-body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
+body[data-theme="dark"] .highlight .go { color: #CCC } /* Generic.Output */
+body[data-theme="dark"] .highlight .gp { color: #AAA } /* Generic.Prompt */
+body[data-theme="dark"] .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body[data-theme="dark"] .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body[data-theme="dark"] .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body[data-theme="dark"] .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body[data-theme="dark"] .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body[data-theme="dark"] .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body[data-theme="dark"] .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body[data-theme="dark"] .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body[data-theme="dark"] .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body[data-theme="dark"] .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body[data-theme="dark"] .highlight .m { color: #51B2FD } /* Literal.Number */
+body[data-theme="dark"] .highlight .s { color: #ED9D13 } /* Literal.String */
+body[data-theme="dark"] .highlight .na { color: #BBB } /* Name.Attribute */
+body[data-theme="dark"] .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body[data-theme="dark"] .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body[data-theme="dark"] .highlight .no { color: #40FFFF } /* Name.Constant */
+body[data-theme="dark"] .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body[data-theme="dark"] .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body[data-theme="dark"] .highlight .ne { color: #BBB } /* Name.Exception */
+body[data-theme="dark"] .highlight .nf { color: #71ADFF } /* Name.Function */
+body[data-theme="dark"] .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body[data-theme="dark"] .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body[data-theme="dark"] .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body[data-theme="dark"] .highlight .py { color: #D0D0D0 } /* Name.Property */
+body[data-theme="dark"] .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body[data-theme="dark"] .highlight .nv { color: #40FFFF } /* Name.Variable */
+body[data-theme="dark"] .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body[data-theme="dark"] .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body[data-theme="dark"] .highlight .w { color: #666 } /* Text.Whitespace */
+body[data-theme="dark"] .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body[data-theme="dark"] .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body[data-theme="dark"] .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body[data-theme="dark"] .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body[data-theme="dark"] .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body[data-theme="dark"] .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body[data-theme="dark"] .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body[data-theme="dark"] .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body[data-theme="dark"] .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body[data-theme="dark"] .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body[data-theme="dark"] .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body[data-theme="dark"] .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body[data-theme="dark"] .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body[data-theme="dark"] .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body[data-theme="dark"] .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body[data-theme="dark"] .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body[data-theme="dark"] .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body[data-theme="dark"] .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body[data-theme="dark"] .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body[data-theme="dark"] .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body[data-theme="dark"] .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body[data-theme="dark"] .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body[data-theme="dark"] .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body[data-theme="dark"] .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body[data-theme="dark"] .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) .highlight pre { line-height: 125%; }
body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
@@ -175,84 +175,84 @@ body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; backgro
body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight .hll { background-color: #404040 }
-body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 }
-body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */
-body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */
-body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */
-body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
-body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */
-body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */
-body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */
-body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */
-body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */
-body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
-body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
-body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
-body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
-body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
-body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */
-body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-body:not([data-theme="light"]) .highlight .gr { color: #d22323 } /* Generic.Error */
-body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+body:not([data-theme="light"]) .highlight { background: #202020; color: #D0D0D0 }
+body:not([data-theme="light"]) .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body:not([data-theme="light"]) .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body:not([data-theme="light"]) .highlight .esc { color: #D0D0D0 } /* Escape */
+body:not([data-theme="light"]) .highlight .g { color: #D0D0D0 } /* Generic */
+body:not([data-theme="light"]) .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body:not([data-theme="light"]) .highlight .l { color: #D0D0D0 } /* Literal */
+body:not([data-theme="light"]) .highlight .n { color: #D0D0D0 } /* Name */
+body:not([data-theme="light"]) .highlight .o { color: #D0D0D0 } /* Operator */
+body:not([data-theme="light"]) .highlight .x { color: #D0D0D0 } /* Other */
+body:not([data-theme="light"]) .highlight .p { color: #D0D0D0 } /* Punctuation */
+body:not([data-theme="light"]) .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body:not([data-theme="light"]) .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body:not([data-theme="light"]) .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body:not([data-theme="light"]) .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body:not([data-theme="light"]) .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body:not([data-theme="light"]) .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body:not([data-theme="light"]) .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body:not([data-theme="light"]) .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body:not([data-theme="light"]) .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body:not([data-theme="light"]) .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body:not([data-theme="light"]) .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */
-body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */
-body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
-body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-body:not([data-theme="light"]) .highlight .gt { color: #d22323 } /* Generic.Traceback */
-body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
-body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
-body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
-body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
-body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
-body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
-body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */
-body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */
-body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */
-body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */
-body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */
-body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
-body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */
-body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */
-body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */
-body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */
-body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */
-body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */
-body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
-body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */
-body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */
-body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
-body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */
-body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
-body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
-body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */
-body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
-body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
-body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
-body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
-body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
-body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
-body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
-body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
-body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
-body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
-body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
-body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
-body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
-body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
-body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */
-body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
-body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
-body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
-body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
-body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */
-body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */
-body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */
-body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
-body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
-body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
+body:not([data-theme="light"]) .highlight .go { color: #CCC } /* Generic.Output */
+body:not([data-theme="light"]) .highlight .gp { color: #AAA } /* Generic.Prompt */
+body:not([data-theme="light"]) .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body:not([data-theme="light"]) .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body:not([data-theme="light"]) .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body:not([data-theme="light"]) .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body:not([data-theme="light"]) .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body:not([data-theme="light"]) .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body:not([data-theme="light"]) .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body:not([data-theme="light"]) .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body:not([data-theme="light"]) .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body:not([data-theme="light"]) .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body:not([data-theme="light"]) .highlight .m { color: #51B2FD } /* Literal.Number */
+body:not([data-theme="light"]) .highlight .s { color: #ED9D13 } /* Literal.String */
+body:not([data-theme="light"]) .highlight .na { color: #BBB } /* Name.Attribute */
+body:not([data-theme="light"]) .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body:not([data-theme="light"]) .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body:not([data-theme="light"]) .highlight .no { color: #40FFFF } /* Name.Constant */
+body:not([data-theme="light"]) .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body:not([data-theme="light"]) .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body:not([data-theme="light"]) .highlight .ne { color: #BBB } /* Name.Exception */
+body:not([data-theme="light"]) .highlight .nf { color: #71ADFF } /* Name.Function */
+body:not([data-theme="light"]) .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body:not([data-theme="light"]) .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body:not([data-theme="light"]) .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body:not([data-theme="light"]) .highlight .py { color: #D0D0D0 } /* Name.Property */
+body:not([data-theme="light"]) .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body:not([data-theme="light"]) .highlight .nv { color: #40FFFF } /* Name.Variable */
+body:not([data-theme="light"]) .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body:not([data-theme="light"]) .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body:not([data-theme="light"]) .highlight .w { color: #666 } /* Text.Whitespace */
+body:not([data-theme="light"]) .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body:not([data-theme="light"]) .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body:not([data-theme="light"]) .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body:not([data-theme="light"]) .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body:not([data-theme="light"]) .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body:not([data-theme="light"]) .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body:not([data-theme="light"]) .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body:not([data-theme="light"]) .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body:not([data-theme="light"]) .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body:not([data-theme="light"]) .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body:not([data-theme="light"]) .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body:not([data-theme="light"]) .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body:not([data-theme="light"]) .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body:not([data-theme="light"]) .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body:not([data-theme="light"]) .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body:not([data-theme="light"]) .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body:not([data-theme="light"]) .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body:not([data-theme="light"]) .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body:not([data-theme="light"]) .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body:not([data-theme="light"]) .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body:not([data-theme="light"]) .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body:not([data-theme="light"]) .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body:not([data-theme="light"]) .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body:not([data-theme="light"]) .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body:not([data-theme="light"]) .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
}
}
\ No newline at end of file
diff --git a/_static/searchtools.js b/_static/searchtools.js
index 7918c3fab..b08d58c9b 100644
--- a/_static/searchtools.js
+++ b/_static/searchtools.js
@@ -4,7 +4,7 @@
*
* Sphinx JavaScript utilities for the full-text search.
*
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -99,7 +99,7 @@ const _displayItem = (item, searchTerms, highlightTerms) => {
.then((data) => {
if (data)
listItem.appendChild(
- Search.makeSearchSummary(data, searchTerms)
+ Search.makeSearchSummary(data, searchTerms, anchor)
);
// highlight search terms in the summary
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
@@ -116,8 +116,8 @@ const _finishSearch = (resultCount) => {
);
else
Search.status.innerText = _(
- `Search finished, found ${resultCount} page(s) matching the search query.`
- );
+ "Search finished, found ${resultCount} page(s) matching the search query."
+ ).replace('${resultCount}', resultCount);
};
const _displayNextItem = (
results,
@@ -137,6 +137,22 @@ const _displayNextItem = (
// search finished, update title and status message
else _finishSearch(resultCount);
};
+// Helper function used by query() to order search results.
+// Each input is an array of [docname, title, anchor, descr, score, filename].
+// Order the results by score (in opposite order of appearance, since the
+// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
+const _orderResultsByScoreThenName = (a, b) => {
+ const leftScore = a[4];
+ const rightScore = b[4];
+ if (leftScore === rightScore) {
+ // same score: sort alphabetically
+ const leftTitle = a[1].toLowerCase();
+ const rightTitle = b[1].toLowerCase();
+ if (leftTitle === rightTitle) return 0;
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+ }
+ return leftScore > rightScore ? 1 : -1;
+};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
@@ -160,13 +176,26 @@ const Search = {
_queued_query: null,
_pulse_status: -1,
- htmlToText: (htmlString) => {
+ htmlToText: (htmlString, anchor) => {
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
- htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
+ for (const removalQuery of [".headerlink", "script", "style"]) {
+ htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
+ }
+ if (anchor) {
+ const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
+ if (anchorContent) return anchorContent.textContent;
+
+ console.warn(
+ `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
+ );
+ }
+
+ // if anchor not specified or not found, fall back to main content
const docContent = htmlElement.querySelector('[role="main"]');
- if (docContent !== undefined) return docContent.textContent;
+ if (docContent) return docContent.textContent;
+
console.warn(
- "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
+ "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
);
return "";
},
@@ -239,16 +268,7 @@ const Search = {
else Search.deferQuery(query);
},
- /**
- * execute search (requires search index to be loaded)
- */
- query: (query) => {
- const filenames = Search._index.filenames;
- const docNames = Search._index.docnames;
- const titles = Search._index.titles;
- const allTitles = Search._index.alltitles;
- const indexEntries = Search._index.indexentries;
-
+ _parseQuery: (query) => {
// stem the search terms and add them to the correct list
const stemmer = new Stemmer();
const searchTerms = new Set();
@@ -284,21 +304,38 @@ const Search = {
// console.info("required: ", [...searchTerms]);
// console.info("excluded: ", [...excludedTerms]);
- // array of [docname, title, anchor, descr, score, filename]
- let results = [];
+ return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
+ },
+
+ /**
+ * execute search (requires search index to be loaded)
+ */
+ _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+ const allTitles = Search._index.alltitles;
+ const indexEntries = Search._index.indexentries;
+
+ // Collect multiple result groups to be sorted separately and then ordered.
+ // Each is an array of [docname, title, anchor, descr, score, filename].
+ const normalResults = [];
+ const nonMainIndexResults = [];
+
_removeChildren(document.getElementById("search-progress"));
- const queryLower = query.toLowerCase();
+ const queryLower = query.toLowerCase().trim();
for (const [title, foundTitles] of Object.entries(allTitles)) {
- if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
+ if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
for (const [file, id] of foundTitles) {
- let score = Math.round(100 * queryLower.length / title.length)
- results.push([
+ const score = Math.round(Scorer.title * queryLower.length / title.length);
+ const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
+ normalResults.push([
docNames[file],
titles[file] !== title ? `${titles[file]} > ${title}` : title,
id !== null ? "#" + id : "",
null,
- score,
+ score + boost,
filenames[file],
]);
}
@@ -308,46 +345,47 @@ const Search = {
// search for explicit entries in index directives
for (const [entry, foundEntries] of Object.entries(indexEntries)) {
if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
- for (const [file, id] of foundEntries) {
- let score = Math.round(100 * queryLower.length / entry.length)
- results.push([
+ for (const [file, id, isMain] of foundEntries) {
+ const score = Math.round(100 * queryLower.length / entry.length);
+ const result = [
docNames[file],
titles[file],
id ? "#" + id : "",
null,
score,
filenames[file],
- ]);
+ ];
+ if (isMain) {
+ normalResults.push(result);
+ } else {
+ nonMainIndexResults.push(result);
+ }
}
}
}
// lookup as object
objectTerms.forEach((term) =>
- results.push(...Search.performObjectSearch(term, objectTerms))
+ normalResults.push(...Search.performObjectSearch(term, objectTerms))
);
// lookup as search terms in fulltext
- results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+ normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
// let the scorer override scores with a custom scoring function
- if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
-
- // now sort the results by score (in opposite order of appearance, since the
- // display function below uses pop() to retrieve items) and then
- // alphabetically
- results.sort((a, b) => {
- const leftScore = a[4];
- const rightScore = b[4];
- if (leftScore === rightScore) {
- // same score: sort alphabetically
- const leftTitle = a[1].toLowerCase();
- const rightTitle = b[1].toLowerCase();
- if (leftTitle === rightTitle) return 0;
- return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
- }
- return leftScore > rightScore ? 1 : -1;
- });
+ if (Scorer.score) {
+ normalResults.forEach((item) => (item[4] = Scorer.score(item)));
+ nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
+ }
+
+ // Sort each group of results by score and then alphabetically by name.
+ normalResults.sort(_orderResultsByScoreThenName);
+ nonMainIndexResults.sort(_orderResultsByScoreThenName);
+
+ // Combine the result groups in (reverse) order.
+ // Non-main index entries are typically arbitrary cross-references,
+ // so display them after other results.
+ let results = [...nonMainIndexResults, ...normalResults];
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
@@ -361,7 +399,12 @@ const Search = {
return acc;
}, []);
- results = results.reverse();
+ return results.reverse();
+ },
+
+ query: (query) => {
+ const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
+ const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
// for debugging
//Search.lastresults = results.slice(); // a copy
@@ -466,14 +509,18 @@ const Search = {
// add support for partial matches
if (word.length > 2) {
const escapedWord = _escapeRegExp(word);
- Object.keys(terms).forEach((term) => {
- if (term.match(escapedWord) && !terms[word])
- arr.push({ files: terms[term], score: Scorer.partialTerm });
- });
- Object.keys(titleTerms).forEach((term) => {
- if (term.match(escapedWord) && !titleTerms[word])
- arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
- });
+ if (!terms.hasOwnProperty(word)) {
+ Object.keys(terms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
+ });
+ }
+ if (!titleTerms.hasOwnProperty(word)) {
+ Object.keys(titleTerms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
+ });
+ }
}
// no match but word was a required one
@@ -496,9 +543,8 @@ const Search = {
// create the mapping
files.forEach((file) => {
- if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
- fileMap.get(file).push(word);
- else fileMap.set(file, [word]);
+ if (!fileMap.has(file)) fileMap.set(file, [word]);
+ else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
});
});
@@ -549,8 +595,8 @@ const Search = {
* search summary for a given text. keywords is a list
* of stemmed words.
*/
- makeSearchSummary: (htmlText, keywords) => {
- const text = Search.htmlToText(htmlText);
+ makeSearchSummary: (htmlText, keywords, anchor) => {
+ const text = Search.htmlToText(htmlText, anchor);
if (text === "") return null;
const textLower = text.toLowerCase();
diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css
index 4723a4a18..ee651ce3d 100644
--- a/_static/styles/furo-extensions.css
+++ b/_static/styles/furo-extensions.css
@@ -1,2 +1,2 @@
-#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)}h1{font-size:2.2rem}h2{font-size:1.7rem}h3{font-size:1.4rem}html:has(.farama-header-menu.active){visibility:hidden}.farama-hidden[aria-hidden=true]{visibility:hidden}.farama-hidden[aria-hidden=false]{visibility:visible}.cookie-alert{background-color:var(--color-background-secondary);border-top:1px solid var(--color-background-border);bottom:0;color:var(--color-foreground-primary);display:flex;left:0;min-height:70px;position:fixed;width:100%;z-index:99999}.cookie-alert__container{align-items:center;display:flex;margin:auto;max-width:calc(100% - 28px);width:700px}.cookie-alert__button{margin-left:14px}.cookie-alert p{flex:1}.farama-btn{background:var(--color-farama-button-background);border:none;border-radius:6px;cursor:pointer;padding:10px 26px;transition:background-color .2s ease}.farama-btn:hover{background:var(--color-farama-button-background-hover)}article[role=main]:has(.farama-env-icon-container) .farama-env-icon-container{display:flex;margin-top:7px;position:absolute}article[role=main]:has(.farama-env-icon-container) .section h1:first-child,article[role=main]:has(.farama-env-icon-container) .section h2:first-child,article[role=main]:has(.farama-env-icon-container) section h1:first-child,article[role=main]:has(.farama-env-icon-container) section h2:first-child{margin-left:34px}.farama-env-icon{height:32px}.env-grid{box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:center;width:100%}.env-grid__cell{display:flex;flex-direction:column;height:180px;padding:10px;width:180px}.cell__image-container{display:flex;height:148px;justify-content:center}.cell__image-container img{max-height:100%;-o-object-fit:contain;object-fit:contain}.cell__title{align-items:flex-end;display:flex;height:32px;justify-content:center;line-height:16px;text-align:center}.more-btn{display:block;margin:12px auto;width:240px}html:has(.farama-header-menu.active){overflow:hidden}body{--farama-header-height:52px;--farama-header-logo-margin:10px;--farama-sidebar-logo-margin:2px 10px}.farama-header{background-color:var(--color-background-secondary);border-bottom:1px solid var(--color-header-border);box-sizing:border-box;display:flex;height:var(--farama-header-height);padding:0 36px 0 24px;position:absolute;width:100%;z-index:95}.farama-header .farama-header__container{display:flex;justify-content:space-between;margin:0 auto;max-width:1400px;width:100%}.farama-header a{color:var(--color-foreground-primary);text-decoration:none;transition:color .125s ease}.farama-header a:hover{color:var(--color-foreground-secondary)}.farama-header .farama-header__logo{margin:var(--farama-header-logo-margin);max-height:calc(var(--farama-header-height) - var(--farama-header-logo-margin))}.farama-header .farama-header__title{align-self:center;font-size:var(--font-size--normal);font-weight:400;margin:0 0 2px;padding:0 0 0 4px}.farama-header .farama-header__left,.farama-header .farama-header__left a{display:flex}.farama-header .farama-header__left--mobile{display:none}.farama-header .farama-header__left--mobile .nav-overlay-icon svg{stroke:var(--color-foreground-primary);fill:var(--color-foreground-primary);stroke-width:2px;padding:0 6px;width:20px}.farama-header .farama-header__right{align-items:center;display:flex;z-index:2}.farama-header .farama-header__right .farama-header__nav{display:flex;height:100%;list-style:none}.farama-header .farama-header__right .farama-header__nav li{align-items:center;cursor:pointer;display:flex;margin-left:20px;text-decoration:none}.farama-header .farama-header__right .farama-header__nav li a{align-items:center;display:flex;height:100%}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container{align-items:center;display:flex;height:100%;position:relative}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container:hover .farama-header__dropdown-menu{display:block}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container svg{fill:var(--color-foreground-primary);width:32px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu{background:var(--color-background-hover);border:1px solid var(--color-background-border);display:none;position:absolute;right:0;top:var(--farama-header-height);z-index:9999}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu ul{display:inherit;margin:0;padding:6px 14px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu li{margin:0;padding:6px 0}.farama-header .farama-header__right .farama-header-menu{display:flex;justify-content:center;position:relative}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn img{width:26px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn svg{stroke:var(--color-foreground-primary);stroke-width:2px;align-self:center;width:14px}.farama-header .farama-header__right .farama-header-menu.active .farama-header-menu-container{transform:translateY(100vh)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container{background-color:var(--color-background-secondary);border-left:1px solid var(--color-background-border);box-sizing:border-box;height:100%;overflow:auto;position:fixed;right:0;top:-100vh;transform:translateY(0);transition:transform .2s ease-in;width:100%;z-index:99}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{align-items:center;border-bottom:1px solid var(--color-background-border);box-sizing:border-box;display:flex;margin:0 auto;max-width:1400px;padding:7px 52px;position:relative;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a{align-items:center;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a .farama-header-menu__logo{width:36px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a span{color:var(--color-sidebar-brand-text);padding-left:8px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right{padding-right:inherit;position:absolute;right:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button svg{color:var(--color-foreground-primary);width:20px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{box-sizing:border-box;display:flex;flex-wrap:wrap;margin:0 auto;max-width:1500px;padding:22px 52px;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section{margin-bottom:24px;min-width:220px;padding-left:18px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__section-title{display:block;font-size:var(--font-size--small);font-weight:600;padding:0 12px 12px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection{min-width:210px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection:not(:last-child){margin-right:12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection .farama-header-menu__subsection-title{color:var(--color-foreground-secondary);display:block;font-size:var(--font-size--small--3);font-weight:700;padding:20px 12px 10px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list{display:inherit;list-style:none;margin:0;padding:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li{border-radius:var(--sidebar-item-border-radius)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li:hover{background-color:var(--color-farama-header-background-hover)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a{align-items:center;display:flex;padding:12px 14px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a:hover{color:inherit}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a img{margin-right:10px;width:26px}.farama-sidebar__title{align-items:center;display:flex;margin-left:var(--sidebar-search-space-lateral);margin-top:.6rem;min-height:calc(52px - var(--sidebar-search-space-above));padding-right:4px;text-decoration:none}.farama-sidebar__title img{height:calc(var(--farama-header-height) - 20px);margin:var(--farama-sidebar-logo-margin)}.farama-sidebar__title span{color:var(--color-foreground-primary)}.farama-sidebar__title span:hover{text-decoration:none}.sidebar-brand{align-items:center;flex-direction:row;padding:var(--sidebar-item-spacing-vertical)}.sidebar-brand .sidebar-logo-container{display:flex;height:auto;max-width:55px}.sidebar-brand .sidebar-brand-text{font-size:1.3rem;padding-left:11px}.farama-sidebar-donate{margin:0 auto;padding:8px 16px 20px;width:76%}.farama-sidebar-donate .farama-donate-btn{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;border:none;border-radius:6px;color:#fff;cursor:pointer;padding:8px 12px;transition:background-color .2s ease;width:100%}.farama-sidebar-donate .farama-donate-btn:hover{background-color:hsla(0,0%,100%,.15)}.farama-donate-banner{background-color:var(--color-highlighted-background);box-sizing:border-box;display:none;padding:16px 3em;width:100%}.farama-donate-banner.active{display:flex}.farama-donate-banner .farama-donate-banner__text{align-items:center;display:flex;flex:1;font-size:1.1em;justify-content:center}.farama-donate-banner .farama-donate-banner__btns{align-items:center;display:flex}.farama-donate-banner .farama-donate-banner__btns a{text-decoration:none}.farama-donate-banner .farama-donate-banner__btns button{align-items:center;border:none;border-radius:6px;cursor:pointer;display:flex;height:36px;justify-content:center;margin-left:22px;position:relative}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;color:#fff;padding:0 26px;transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go:hover{background-color:hsla(0,0%,100%,.1)}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel{transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}@media(prefers-color-scheme:dark){body:not([data-theme=light]) .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body:not([data-theme=light]) .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body:not([data-theme=light]) .farama-donate-banner__cancel svg{stroke:#fff}body[data-theme=light] .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body[data-theme=light] .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body[data-theme=light] .farama-donate-banner__cancel svg{stroke:#666}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body:not([data-theme=dark]) .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body:not([data-theme=dark]) .farama-donate-banner__cancel svg{stroke:#666}body[data-theme=dark] .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body[data-theme=dark] .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body[data-theme=dark] .farama-donate-banner__cancel svg{stroke:#fff}}.farama-project-logo{margin:1.5rem 0 .8rem!important}.farama-project-heading{margin:0;padding:0 0 1.6rem;text-align:center}.farama-project-logo img{width:65%}.mobile-header .header-center{opacity:0;transition:opacity easy-in .2s}.mobile-header.scrolled .header-center{opacity:1}.sphx-glr-script-out{color:var(--color-foreground-secondary);display:flex;gap:.5em}.sphx-glr-script-out:before{content:"Out:";line-height:1.4;padding-top:10px}.sphx-glr-script-out .highlight{overflow-x:auto}.sphx-glr-thumbcontainer{z-index:1}div.sphx-glr-download a{background:#0f4a65;box-sizing:border-box;max-width:100%;width:340px}div.sphx-glr-download a:hover{background:#0d3a4e;box-shadow:none}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.sphx-glr-download a{background:#0f4a65}body:not([data-theme=light]) div.sphx-glr-download a:hover{background:#0d3a4e}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) div.sphx-glr-download a{background:#f9d4a1}body:not([data-theme=dark]) div.sphx-glr-download a:hover{background:#d9b481}body[data-theme=dark] div.sphx-glr-download a{background:#0f4a65}body[data-theme=dark] div.sphx-glr-download a:hover{background:#0d3a4e}}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}.sphx-glr-thumbcontainer img{background-color:#fff;border-radius:4px}.tab-content>[class^=highlight-]:first-child .highlight{background:var(--color-api-background);border-radius:6px}.tab-set>input+label{font-weight:600}.tab-set>input:checked+label,.tab-set>input:checked+label:hover{border-color:var(--color-brand-secondary);color:var(--color-brand-secondary)}div.jupyter_container{background:var(--color-api-background);border:none;box-shadow:none}div.jupyter_container div.code_cell,div.jupyter_container div.highlight{border:none;border-radius:0}div.jupyter_container div.code_cell pre{padding:.625rem .875rem}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}}body[data-theme=dark] div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}@media(max-width:950px){.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:7px 42px}.farama-header .farama-header-menu__btn-name{display:none}}@media(max-width:600px){.farama-header{padding:0 4px}.farama-header .farama-header__title{font-size:var(--font-size--small)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:8px 12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{padding:18px 12px}.farama-donate-banner{flex-direction:column}.farama-donate-banner .farama-donate-banner__btns{justify-content:end;margin-top:1em}.farama-donate-banner .farama-donate-banner__btns button{height:36px;margin-left:12px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{padding:0 20px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}}@media(max-width:480px){.farama-header .farama-header__title{width:110px}.farama-header .farama-header-menu__btn-name{text-align:right;width:100px}.farama-project-heading{text-align:left}.farama-header-menu__subsections-container{display:block!important}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-white-logo-invert,body[data-theme=dark] .farama-black-logo-invert{filter:invert(1)}}@media(prefers-color-scheme:dark){body:not([data-theme=light]) img[src*="//render.githubusercontent.com/render/math"]{filter:invert(90%)}body:not([data-theme=light]) .farama-black-logo-invert,body[data-theme=light] .farama-white-logo-invert{filter:invert(1)}}
+#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)}h1{font-size:2.2rem}h2{font-size:1.7rem}h3{font-size:1.4rem}html:has(.farama-header-menu.active){visibility:hidden}.farama-hidden[aria-hidden=true]{visibility:hidden}.farama-hidden[aria-hidden=false]{visibility:visible}.cookie-alert{background-color:var(--color-background-secondary);border-top:1px solid var(--color-background-border);bottom:0;color:var(--color-foreground-primary);display:flex;left:0;min-height:70px;position:fixed;width:100%;z-index:99999}.cookie-alert__container{align-items:center;display:flex;margin:auto;max-width:calc(100% - 28px);width:700px}.cookie-alert__button{margin-left:14px}.cookie-alert p{flex:1}.farama-btn{background:var(--color-farama-button-background);border:none;border-radius:6px;cursor:pointer;padding:10px 26px;transition:background-color .2s ease}.farama-btn:hover{background:var(--color-farama-button-background-hover)}article[role=main]:has(.farama-env-icon-container) .farama-env-icon-container{display:flex;margin-top:7px;position:absolute}article[role=main]:has(.farama-env-icon-container) .section h1:first-child,article[role=main]:has(.farama-env-icon-container) .section h2:first-child,article[role=main]:has(.farama-env-icon-container) section h1:first-child,article[role=main]:has(.farama-env-icon-container) section h2:first-child{margin-left:34px}.farama-env-icon{height:32px}.env-grid{box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:center;width:100%}.env-grid__cell{display:flex;flex-direction:column;height:180px;padding:10px;width:180px}.cell__image-container{display:flex;height:148px;justify-content:center}.cell__image-container img{max-height:100%;-o-object-fit:contain;object-fit:contain}.cell__title{align-items:flex-end;display:flex;height:32px;justify-content:center;line-height:16px;text-align:center}.more-btn{display:block;margin:12px auto;width:240px}html:has(.farama-header-menu.active){overflow:hidden}body{--farama-header-height:52px;--farama-header-logo-margin:10px;--farama-sidebar-logo-margin:2px 10px}.farama-header{background-color:var(--color-background-secondary);border-bottom:1px solid var(--color-header-border);box-sizing:border-box;display:flex;height:var(--farama-header-height);padding:0 36px 0 24px;position:absolute;width:100%;z-index:95}.farama-header .farama-header__container{display:flex;justify-content:space-between;margin:0 auto;max-width:1400px;width:100%}.farama-header a{color:var(--color-foreground-primary);text-decoration:none;transition:color .125s ease}.farama-header a:hover{color:var(--color-foreground-secondary)}.farama-header .farama-header__logo{margin:var(--farama-header-logo-margin);max-height:calc(var(--farama-header-height) - var(--farama-header-logo-margin))}.farama-header .farama-header__title{align-self:center;font-size:var(--font-size--normal);font-weight:400;margin:0 0 2px;padding:0 0 0 4px}.farama-header .farama-header__left,.farama-header .farama-header__left a{display:flex}.farama-header .farama-header__left--mobile{display:none}.farama-header .farama-header__left--mobile .nav-overlay-icon svg{stroke:var(--color-foreground-primary);fill:var(--color-foreground-primary);stroke-width:2px;padding:0 6px;width:20px}.farama-header .farama-header__right{align-items:center;display:flex;z-index:2}.farama-header .farama-header__right .farama-header__nav{display:flex;height:100%;list-style:none}.farama-header .farama-header__right .farama-header__nav li{align-items:center;cursor:pointer;display:flex;margin-left:20px;text-decoration:none}.farama-header .farama-header__right .farama-header__nav li a{align-items:center;display:flex;height:100%}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container{align-items:center;display:flex;height:100%;position:relative}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container:hover .farama-header__dropdown-menu{display:block}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container svg{fill:var(--color-foreground-primary);width:32px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu{background:var(--color-background-hover);border:1px solid var(--color-background-border);display:none;position:absolute;right:0;top:var(--farama-header-height);z-index:9999}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu ul{display:inherit;margin:0;padding:6px 14px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu li{margin:0;padding:6px 0}.farama-header .farama-header__right .farama-header-menu{display:flex;justify-content:center;position:relative}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn img{width:26px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn svg{stroke:var(--color-foreground-primary);stroke-width:2px;align-self:center;width:14px}.farama-header .farama-header__right .farama-header-menu.active .farama-header-menu-container{transform:translateY(100vh)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container{background-color:var(--color-background-secondary);border-left:1px solid var(--color-background-border);box-sizing:border-box;height:100%;overflow:auto;position:fixed;right:0;top:-100vh;transform:translateY(0);transition:transform .2s ease-in;width:100%;z-index:99}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{align-items:center;border-bottom:1px solid var(--color-background-border);box-sizing:border-box;display:flex;margin:0 auto;max-width:1400px;padding:7px 52px;position:relative;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a{align-items:center;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a .farama-header-menu__logo{width:36px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a span{color:var(--color-sidebar-brand-text);padding-left:8px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right{padding-right:inherit;position:absolute;right:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button svg{color:var(--color-foreground-primary);width:20px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{box-sizing:border-box;display:flex;flex-wrap:wrap;margin:0 auto;max-width:1500px;padding:22px 52px;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section{margin-bottom:24px;min-width:220px;padding-left:18px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__section-title{display:block;font-size:var(--font-size--small);font-weight:600;padding:0 12px 12px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection{min-width:210px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection:not(:last-child){margin-right:12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection .farama-header-menu__subsection-title{color:var(--color-foreground-secondary);display:block;font-size:var(--font-size--small--3);font-weight:700;padding:20px 12px 10px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list{display:inherit;list-style:none;margin:0;padding:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li{border-radius:var(--sidebar-item-border-radius)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li:hover{background-color:var(--color-farama-header-background-hover)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a{align-items:center;display:flex;padding:12px 14px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a:hover{color:inherit}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a img{margin-right:10px;width:26px}.farama-sidebar__title{align-items:center;display:flex;margin-left:var(--sidebar-search-space-lateral);margin-top:.6rem;min-height:calc(52px - var(--sidebar-search-space-above));padding-right:4px;text-decoration:none}.farama-sidebar__title img{height:calc(var(--farama-header-height) - 20px);margin:var(--farama-sidebar-logo-margin)}.farama-sidebar__title span{color:var(--color-foreground-primary)}.farama-sidebar__title span:hover{text-decoration:none}.sidebar-brand{align-items:center;flex-direction:row;padding:var(--sidebar-item-spacing-vertical)}.sidebar-brand .sidebar-logo-container{display:flex;height:auto;max-width:55px}.sidebar-brand .sidebar-brand-text{font-size:1.3rem;padding-left:11px}.farama-sidebar-donate{margin:0 auto;padding:8px 16px 20px;width:76%}.farama-sidebar-donate .farama-donate-btn{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;border:none;border-radius:6px;color:#fff;cursor:pointer;padding:8px 12px;transition:background-color .2s ease;width:100%}.farama-sidebar-donate .farama-donate-btn:hover{background-color:hsla(0,0%,100%,.15)}.farama-donate-banner{background-color:var(--color-highlighted-background);box-sizing:border-box;display:none;padding:16px 3em;width:100%}.farama-donate-banner.active{display:flex}.farama-donate-banner .farama-donate-banner__text{align-items:center;display:flex;flex:1;font-size:1.1em;justify-content:center}.farama-donate-banner .farama-donate-banner__btns{align-items:center;display:flex}.farama-donate-banner .farama-donate-banner__btns a{text-decoration:none}.farama-donate-banner .farama-donate-banner__btns button{align-items:center;border:none;border-radius:6px;cursor:pointer;display:flex;height:36px;justify-content:center;margin-left:22px;position:relative}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;color:#fff;padding:0 26px;transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go:hover{background-color:hsla(0,0%,100%,.1)}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel{transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}@media(prefers-color-scheme:dark){body:not([data-theme=light]) .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body:not([data-theme=light]) .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body:not([data-theme=light]) .farama-donate-banner__cancel svg{stroke:#fff}body[data-theme=light] .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body[data-theme=light] .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body[data-theme=light] .farama-donate-banner__cancel svg{stroke:#666}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body:not([data-theme=dark]) .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body:not([data-theme=dark]) .farama-donate-banner__cancel svg{stroke:#666}body[data-theme=dark] .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body[data-theme=dark] .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body[data-theme=dark] .farama-donate-banner__cancel svg{stroke:#fff}}.farama-project-logo{margin:1.5rem 0 .8rem!important}.farama-project-heading{margin:0;padding:0 0 1.6rem;text-align:center}.farama-project-logo img{width:65%}.mobile-header .header-center{opacity:0;transition:opacity easy-in .2s}.mobile-header.scrolled .header-center{opacity:1}.sphx-glr-script-out{color:var(--color-foreground-secondary);display:flex;gap:.5em}.sphx-glr-script-out:before{content:"Out:";line-height:1.4;padding-top:10px}.sphx-glr-script-out .highlight{overflow-x:auto}.sphx-glr-thumbcontainer{z-index:1}div.sphx-glr-download a{background:#0f4a65;box-sizing:border-box;max-width:100%;width:340px}div.sphx-glr-download a:hover{background:#0d3a4e;box-shadow:none}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.sphx-glr-download a{background:#0f4a65}body:not([data-theme=light]) div.sphx-glr-download a:hover{background:#0d3a4e}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) div.sphx-glr-download a{background:#f9d4a1}body:not([data-theme=dark]) div.sphx-glr-download a:hover{background:#d9b481}body[data-theme=dark] div.sphx-glr-download a{background:#0f4a65}body[data-theme=dark] div.sphx-glr-download a:hover{background:#0d3a4e}}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}.sphx-glr-thumbcontainer img{background-color:#fff;border-radius:4px}.tab-content>[class^=highlight-]:first-child .highlight{background:var(--color-api-background);border-radius:6px}.tab-set>input+label{font-weight:600}.tab-set>input:checked+label,.tab-set>input:checked+label:hover{border-color:var(--color-brand-secondary);color:var(--color-brand-secondary)}div.jupyter_container{background:var(--color-api-background);border:none;box-shadow:none}div.jupyter_container div.code_cell,div.jupyter_container div.highlight{border:none;border-radius:0}div.jupyter_container div.code_cell pre{padding:.625rem .875rem}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}}body[data-theme=dark] div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}@media(max-width:950px){.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:7px 42px}.farama-header .farama-header-menu__btn-name{display:none}}@media(max-width:600px){.farama-header{padding:0 4px}.farama-header .farama-header__title{font-size:var(--font-size--small)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:8px 12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{padding:18px 12px}.farama-donate-banner{flex-direction:column}.farama-donate-banner .farama-donate-banner__btns{justify-content:end;margin-top:1em}.farama-donate-banner .farama-donate-banner__btns button{height:36px;margin-left:12px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{padding:0 20px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}}@media(max-width:480px){.farama-header .farama-header__title{width:110px}.farama-header .farama-header-menu__btn-name{text-align:right;width:100px}.farama-project-heading{text-align:left}.farama-header-menu__subsections-container{display:block!important}}@media(min-width:1260px){div.highlight{max-width:60vw;width:-moz-fit-content;width:fit-content}}@media(min-width:2160px){div.highlight{max-width:50vw}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-white-logo-invert,body[data-theme=dark] .farama-black-logo-invert{filter:invert(1)}}@media(prefers-color-scheme:dark){body:not([data-theme=light]) img[src*="//render.githubusercontent.com/render/math"]{filter:invert(90%)}body:not([data-theme=light]) .farama-black-logo-invert,body[data-theme=light] .farama-white-logo-invert{filter:invert(1)}}
/*# sourceMappingURL=furo-extensions.css.map*/
\ No newline at end of file
diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map
index 84c17a00f..866dff103 100644
--- a/_static/styles/furo-extensions.css.map
+++ b/_static/styles/furo-extensions.css.map
@@ -1 +1 @@
-{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA,8BCbF,GACI,iBACJ,GACI,iBACJ,GACI,iBAGJ,qCACI,kBAEJ,iCACI,kBAEJ,kCACI,mBAIJ,cAKI,mDAEA,oDACA,SAFA,sCAJA,aAOA,OALA,gBAHA,eAEA,WAOA,cAEJ,yBAEI,mBADA,aAIA,YADA,4BADA,WAEA,CAEJ,sBACI,iBAEJ,gBACI,OAIJ,YACI,iDAGA,YADA,kBAGA,eAJA,kBAGA,oCACA,CAEA,kBACI,uDAKJ,8EAEI,aACA,eAFA,iBAEA,CAEJ,0SACI,iBAER,iBACI,YAIJ,UAKI,sBAJA,aACA,eACA,uBACA,UACA,CAEJ,gBACI,aACA,sBAEA,aACA,aAFA,WAEA,CAEJ,uBACI,aACA,aACA,uBAEJ,2BACI,gBACA,yCAEJ,aAII,qBAHA,aAIA,YAHA,uBAIA,iBAHA,iBAGA,CAEJ,UAGI,cADA,iBADA,WAEA,CAIJ,qCACI,gBAEJ,KACI,2BAA4B,CAC5B,gCAAiC,CACjC,qCAAsC,CAE1C,eAMI,mDADA,mDAGA,sBANA,aAEA,mCAGA,sBANA,kBAEA,WAMA,WAEA,yCAGI,aAEA,8BADA,cAFA,iBADA,UAIA,CAEJ,iBACI,sCACA,qBACA,4BAEA,uBACI,wCAER,oCAEI,wCADA,+EACA,CAEJ,qCAKI,kBAJA,mCACA,gBACA,eACA,iBACA,CAKA,0EACI,aAER,4CACI,aAEA,kEAEI,uCACA,qCACA,iBACA,cAJA,UAIA,CAER,qCAEI,mBADA,aAEA,UAEA,yDACI,aAEA,YADA,eACA,CAEA,4DAII,mBACA,eAFA,aADA,iBADA,oBAIA,CAEA,8DAGI,mBADA,aADA,WAEA,CAEJ,+FAGI,mBADA,aAEA,YAHA,iBAGA,CAGI,mIACI,cAER,mGAEI,qCADA,UACA,CAEJ,6HAKI,yCADA,gDAGA,aANA,kBAEA,QADA,gCAIA,YACA,CAEA,gIACI,gBACA,SACA,iBAEJ,gIACI,SACA,cAEpB,yDAEI,aACA,uBAFA,iBAEA,CAEA,kFAEI,gBACA,YACA,eAHA,YAGA,CAEA,sFACI,WACJ,sFAEI,uCACA,iBACA,kBAHA,UAGA,CAGR,8FACI,4BAEJ,uFAUI,mDACA,qDAHA,sBAFA,YAMA,cAXA,eAEA,QACA,WAGA,wBAEA,iCAJA,WAHA,UAUA,CAEA,mHASI,mBAFA,uDAHA,sBAIA,aAHA,cAFA,iBAGA,iBALA,kBACA,UAOA,CAEA,qHAEI,mBADA,YACA,CAEA,+IACI,WAEJ,0HACI,sCACA,iBAER,qJAGI,sBAFA,kBACA,OACA,CAEA,4JAEI,gBACA,YACA,eAHA,YAGA,CAEA,gKAEI,sCADA,UACA,CAEhB,iHAKI,sBAJA,aAMA,eADA,cAHA,iBACA,kBAFA,UAKA,CAEA,8IAEI,mBADA,gBAEA,kBAEA,iLACI,cACA,kCACA,gBAEA,oBADA,wBACA,CAIA,yNACI,gBAEA,0OACI,kBAEJ,+PAGI,wCAFA,cACA,qCAEA,gBAEA,uBADA,wBACA,CAEZ,uKACI,gBAGA,gBAFA,SACA,SACA,CAEA,0KACI,gDAEA,gLACI,6DAEJ,4KAGI,mBAFA,aACA,iBACA,CAEA,kLACI,cAEJ,gLAEI,kBADA,UACA,CAExC,uBAEI,mBADA,aAKA,gDADA,iBADA,0DADA,kBAIA,qBAEA,2BACI,gDACA,yCACJ,4BACI,sCACA,kCACI,qBAEZ,eAGI,mBAFA,mBACA,4CACA,CAEA,uCACI,aAEA,YADA,cACA,CAEJ,mCACI,iBACA,kBAER,uBAGI,cADA,sBADA,SAEA,CAEA,0CAII,wDAnZY,CAoZZ,4BACA,6BAEA,YACA,kBANA,WAOA,eARA,iBAKA,qCANA,UASA,CAEA,gDACI,qCAEZ,sBAKI,qDADA,sBAHA,aACA,iBACA,UAEA,CAEA,6BACI,aAEJ,kDAII,mBAFA,aADA,OAIA,gBAFA,sBAEA,CAEJ,kDAEI,mBADA,YACA,CAEA,oDACI,qBAEJ,yDAQI,mBAJA,YACA,kBAIA,eAHA,aAJA,YAKA,uBANA,iBAEA,iBAMA,CAEJ,4EAEI,wDAncQ,CAocR,4BACA,6BAHA,WAKA,eADA,oCACA,CAEA,kFACI,oCAER,gFACI,qCAEA,oFACI,YAEhB,kCAEQ,2DACI,gCACA,iEACI,0BACJ,+DACI,YAGR,qDACI,mCACA,2DACQ,8BACR,yDACI,aAEhB,mCAEQ,0DACI,mCACA,gEACQ,8BACR,8DACI,YAGR,oDACI,gCACA,0DACI,0BACJ,wDACI,aAKhB,qBACI,gCAEJ,wBAGI,QAAO,CADP,mBADA,iBAEA,CAEJ,yBACI,UAGA,8BAEI,SAAQ,CADR,8BACA,CAGJ,uCACI,UAIR,qBACI,wCACA,aACA,SAEJ,4BACI,eACA,gBACA,iBAEJ,gCACI,gBAEJ,yBACI,UAEJ,wBAII,mBADA,sBADA,eADA,WAGA,CAEJ,8BACI,mBACA,gBAEJ,kCAEQ,qDACI,mBACJ,2DACI,mBAEJ,+CACI,mBACJ,qDACI,oBAEZ,mCAEQ,oDACI,mBACJ,0DACI,mBAEJ,8CACI,mBACJ,oDACI,oBAGR,+CACI,mBACJ,qDACI,mBAER,6BACI,sBACA,kBAIJ,wDACI,uCACA,kBAEJ,qBACI,gBAEJ,gEAEI,0CADA,kCACA,CAIJ,sBACI,uCACA,YACA,gBAEA,wEACI,YACA,gBAEJ,wCACI,wBAER,kCACI,iEACI,mBACA,eAGJ,0DACI,mBACA,cAKR,wBACI,mHACI,iBAEJ,6CACI,cAGR,wBACI,eACI,cAEA,qCACI,kCAGA,mHACI,iBACJ,iHACI,kBAEZ,sBACI,sBAGA,kDAEI,oBADA,cACA,CAEA,yDAEI,YADA,gBACA,CAEJ,4EACI,eAGA,oFACI,aAGpB,wBAEQ,qCACI,YAEJ,6CACI,iBACA,YAER,wBACI,gBAEJ,2CACI,yBAGR,mCAMQ,sGACI,kBAGZ,kCAGQ,oFACI,mBAMJ,wGACI","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass","webpack:///./src/furo/assets/styles/extensions/_farama.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n","// Farama Base\n\n$farama-background: linear-gradient(to right top, #765e3e, #054f5b)\n\nh1\n font-size: 2.2rem\nh2\n font-size: 1.7rem\nh3\n font-size: 1.4rem\n\n// If menu is active then all elements except the menu are not visible (i.e. only element with aria-hidden=\"true\")\nhtml:has(.farama-header-menu.active)\n visibility: hidden\n\n.farama-hidden[aria-hidden=\"true\"]\n visibility: hidden\n\n.farama-hidden[aria-hidden=\"false\"]\n visibility: visible\n\n// Cookies Alert\n\n.cookie-alert\n position: fixed\n display: flex\n width: 100%\n min-height: 70px\n background-color: var(--color-background-secondary)\n color: var(--color-foreground-primary)\n border-top: 1px solid var(--color-background-border)\n bottom: 0\n left: 0\n z-index: 99999\n\n.cookie-alert__container\n display: flex\n align-items: center\n width: 700px\n max-width: calc(100% - 28px)\n margin: auto\n\n.cookie-alert__button\n margin-left: 14px\n\n.cookie-alert p\n flex: 1\n\n// Farama default button style\n\n.farama-btn\n background: var(--color-farama-button-background)\n padding: 10px 26px\n border-radius: 6px\n border: none\n transition: background-color 0.2s ease\n cursor: pointer\n\n &:hover\n background: var(--color-farama-button-background-hover)\n\n// Env Icons\n\narticle[role=main]:has(.farama-env-icon-container)\n .farama-env-icon-container\n position: absolute\n display: flex\n margin-top: 7px\n\n .section h1:first-child, .section h2:first-child, section h1:first-child, section h2:first-child\n margin-left: 34px\n\n.farama-env-icon\n height: 32px\n\n// Envinronments grid\n\n.env-grid\n display: flex\n flex-wrap: wrap\n justify-content: center\n width: 100%\n box-sizing: border-box\n\n.env-grid__cell\n display: flex\n flex-direction: column\n width: 180px\n height: 180px\n padding: 10px\n\n.cell__image-container\n display: flex\n height: 148px\n justify-content: center\n\n.cell__image-container img\n max-height: 100%\n object-fit: contain\n\n.cell__title\n display: flex\n justify-content: center\n text-align: center\n align-items: flex-end\n height: 32px\n line-height: 16px\n\n.more-btn\n width: 240px\n margin: 12px auto\n display: block\n\n// Farama Header\n\nhtml:has(.farama-header-menu.active)\n overflow: hidden\n\nbody\n --farama-header-height: 52px\n --farama-header-logo-margin: 10px\n --farama-sidebar-logo-margin: 2px 10px\n\n.farama-header\n position: absolute\n display: flex\n width: 100%\n height: var(--farama-header-height)\n border-bottom: 1px solid var(--color-header-border)\n background-color: var(--color-background-secondary)\n padding: 0 36px 0 24px\n box-sizing: border-box\n z-index: 95\n\n .farama-header__container\n width: 100%\n max-width: 1400px\n display: flex\n margin: 0 auto\n justify-content: space-between\n\n a\n color: var(--color-foreground-primary)\n text-decoration: none\n transition: color 0.125s ease\n\n &:hover\n color: var(--color-foreground-secondary)\n\n .farama-header__logo\n max-height: calc(var(--farama-header-height) - var(--farama-header-logo-margin))\n margin: var(--farama-header-logo-margin)\n\n .farama-header__title\n font-size: var(--font-size--normal)\n font-weight: normal\n margin: 0 0 2px 0\n padding: 0 0 0 4px\n align-self: center\n\n .farama-header__left\n display: flex\n\n a\n display: flex\n\n .farama-header__left--mobile\n display: none\n\n .nav-overlay-icon svg\n width: 20px\n stroke: var(--color-foreground-primary)\n fill: var(--color-foreground-primary)\n stroke-width: 2px\n padding: 0 6px\n\n .farama-header__right\n display: flex\n align-items: center\n z-index: 2\n\n .farama-header__nav\n display: flex\n list-style: none\n height: 100%\n\n li\n text-decoration: none\n margin-left: 20px\n display: flex\n align-items: center\n cursor: pointer\n\n a\n height: 100%\n display: flex\n align-items: center\n\n .farama-header__dropdown-container\n position: relative\n display: flex\n align-items: center\n height: 100%\n\n &:hover\n .farama-header__dropdown-menu\n display: block\n\n svg\n width: 32px\n fill: var(--color-foreground-primary)\n\n .farama-header__dropdown-menu\n position: absolute\n top: var(--farama-header-height)\n right: 0\n border: 1px solid var(--color-background-border)\n background: var(--color-background-hover)\n z-index: 9999\n display: none\n\n ul\n display: inherit\n margin: 0\n padding: 6px 14px\n\n li\n margin: 0\n padding: 6px 0\n\n .farama-header-menu\n position: relative\n display: flex\n justify-content: center\n\n .farama-header-menu__btn\n display: flex\n background: none\n border: none\n cursor: pointer\n\n img\n width: 26px\n svg\n width: 14px\n stroke: var(--color-foreground-primary)\n stroke-width: 2px\n align-self: center\n\n\n &.active .farama-header-menu-container\n transform: translateY(100vh)\n\n .farama-header-menu-container\n position: fixed\n z-index: 99\n right: 0\n top: -100vh\n width: 100%\n height: calc(100vh - calc(100vh - 100%))\n transform: translateY(0)\n box-sizing: border-box\n transition: transform 0.2s ease-in\n background-color: var(--color-background-secondary)\n border-left: 1px solid var(--color-background-border)\n overflow: auto\n\n .farama-header-menu__header\n position: relative\n width: 100%\n max-width: 1400px\n box-sizing: border-box\n margin: 0 auto\n padding: 7px 52px\n border-bottom: 1px solid var(--color-background-border)\n display: flex\n align-items: center\n\n a\n display: flex\n align-items: center\n\n .farama-header-menu__logo\n width: 36px\n\n span\n color: var(--color-sidebar-brand-text)\n padding-left: 8px\n\n .farama-header-menu-header__right\n position: absolute\n right: 0\n padding-right: inherit\n\n button\n display: flex\n background: none\n border: none\n cursor: pointer\n\n svg\n width: 20px\n color: var(--color-foreground-primary)\n\n .farama-header-menu__body\n display: flex\n width: 100%\n max-width: 1500px\n padding: 22px 52px\n box-sizing: border-box\n margin: 0 auto\n flex-wrap: wrap\n\n .farama-header-menu__section\n min-width: 220px\n margin-bottom: 24px\n padding-left: 18px\n\n .farama-header-menu__section-title\n display: block\n font-size: var(--font-size--small)\n font-weight: 600\n text-transform: uppercase\n padding: 0 12px 12px\n\n .farama-header-menu__subsections-container\n\n .farama-header-menu__subsection\n min-width: 210px\n\n &:not(:last-child)\n margin-right: 12px\n\n .farama-header-menu__subsection-title\n display: block\n font-size: var(--font-size--small--3)\n color: var(--color-foreground-secondary)\n font-weight: 700\n text-transform: uppercase\n padding: 20px 12px 10px\n\n .farama-header-menu-list\n display: inherit\n margin: 0\n padding: 0\n list-style: none\n\n li\n border-radius: var(--sidebar-item-border-radius)\n\n &:hover\n background-color: var(--color-farama-header-background-hover)\n\n a\n display: flex\n padding: 12px 14px\n align-items: center\n\n &:hover\n color: inherit\n\n img\n width: 26px\n margin-right: 10px\n\n.farama-sidebar__title\n display: flex\n align-items: center\n padding-right: 4px\n min-height: calc(52px - var(--sidebar-search-space-above))\n margin-top: 0.6rem\n margin-left: var(--sidebar-search-space-lateral)\n text-decoration: none\n\n img\n height: calc(var(--farama-header-height) - 20px)\n margin: var(--farama-sidebar-logo-margin)\n span\n color: var(--color-foreground-primary)\n &:hover\n text-decoration: none\n\n.sidebar-brand\n flex-direction: row\n padding: var(--sidebar-item-spacing-vertical)\n align-items: center\n\n .sidebar-logo-container\n display: flex\n max-width: 55px\n height: auto\n\n .sidebar-brand-text\n font-size: 1.3rem\n padding-left: 11px\n\n.farama-sidebar-donate\n width: 76%\n padding: 8px 16px 20px\n margin: 0 auto\n\n .farama-donate-btn\n width: 100%\n padding: 8px 12px\n color: #fff\n background: $farama-background\n background-blend-mode: color\n background-color: transparent\n transition: background-color 0.2s ease\n border: none\n border-radius: 6px\n cursor: pointer\n\n &:hover\n background-color: rgb(255 255 255 / 15%)\n\n.farama-donate-banner\n display: none\n padding: 16px 3em\n width: 100%\n box-sizing: border-box\n background-color: var(--color-highlighted-background)\n\n &.active\n display: flex\n\n .farama-donate-banner__text\n flex: 1\n display: flex\n justify-content: center\n align-items: center\n font-size: 1.1em\n\n .farama-donate-banner__btns\n display: flex\n align-items: center\n\n a\n text-decoration: none\n\n button\n margin-left: 22px\n height: 36px\n position: relative\n border: none\n border-radius: 6px\n display: flex\n justify-content: center\n align-items: center\n cursor: pointer\n\n .farama-donate-banner__go\n color: #fff\n background: $farama-background\n background-blend-mode: color\n background-color: transparent\n transition: background-color 0.2s ease\n padding: 0 26px\n\n &:hover\n background-color: rgb(255 255 255 / 10%)\n\n .farama-donate-banner__cancel\n transition: background-color 0.2s ease\n\n svg\n height: 26px\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n .farama-donate-banner__cancel\n background-color: rgb(0 0 0 / 10%)\n &:hover\n background: rgb(0 0 0 / 20%)\n svg\n stroke: #fff\n\n body[data-theme=\"light\"]\n .farama-donate-banner__cancel\n background-color: rgb(25 25 25 / 10%)\n &:hover\n background: rgb(255 255 255 / 20%)\n svg\n stroke: #666\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n .farama-donate-banner__cancel\n background-color: rgb(25 25 25 / 10%)\n &:hover\n background: rgb(255 255 255 / 20%)\n svg\n stroke: #666\n\n body[data-theme=\"dark\"]\n .farama-donate-banner__cancel\n background-color: rgb(0 0 0 / 10%)\n &:hover\n background: rgb(0 0 0 / 20%)\n svg\n stroke: #fff\n\n\n// Farama custom directives\n\n.farama-project-logo\n margin: 1.5rem 0 0.8rem !important\n\n.farama-project-heading\n text-align: center\n padding: 0 0 1.6rem 0\n margin: 0\n\n.farama-project-logo img\n width: 65%\n\n.mobile-header\n .header-center\n transition: opacity 0.2s easy-in\n opacity: 0\n\n.mobile-header.scrolled\n .header-center\n opacity: 1\n\n// Sphinx Gallery\n\n.sphx-glr-script-out\n color: var(--color-foreground-secondary)\n display: flex\n gap: 0.5em\n\n.sphx-glr-script-out::before\n content: \"Out:\"\n line-height: 1.4\n padding-top: 10px\n\n.sphx-glr-script-out .highlight\n overflow-x: auto\n\n.sphx-glr-thumbcontainer\n z-index: 1\n\ndiv.sphx-glr-download a\n width: 340px\n max-width: 100%\n box-sizing: border-box\n background: #0f4a65\n\ndiv.sphx-glr-download a:hover\n background: #0d3a4e\n box-shadow: none\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n div.sphx-glr-download a\n background: #0f4a65\n div.sphx-glr-download a:hover\n background: #0d3a4e\n body[data-theme=\"light\"]\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n body[data-theme=\"dark\"]\n div.sphx-glr-download a\n background: #0f4a65\n div.sphx-glr-download a:hover\n background: #0d3a4e\n\nbody[data-theme=\"light\"]\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n\n.sphx-glr-thumbcontainer img\n background-color: white\n border-radius: 4px\n\n// Override Tabs styles\n\n.tab-content > [class^=\"highlight-\"]:first-child .highlight\n background: var(--color-api-background)\n border-radius: 6px\n\n.tab-set > input + label\n font-weight: 600\n\n.tab-set > input:checked + label, .tab-set > input:checked + label:hover\n color: var(--color-brand-secondary)\n border-color: var(--color-brand-secondary)\n\n// Sphinx Jupyter\n\ndiv.jupyter_container\n background: var(--color-api-background)\n border: none\n box-shadow: none\n\n div.code_cell, div.highlight\n border: none\n border-radius: 0\n\n div.code_cell pre\n padding: 0.625rem 0.875rem\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"]) div.jupyter_container div.highlight\n background: #202020\n color: #d0d0d0\n\nbody[data-theme=\"dark\"]\n div.jupyter_container div.highlight\n background: #202020\n color: #d0d0d0\n\n\n\n\n@media (max-width: 950px)\n .farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header\n padding: 7px 42px\n\n .farama-header .farama-header-menu__btn-name\n display: none\n\n\n@media (max-width: 600px)\n .farama-header\n padding: 0 4px\n\n .farama-header__title\n font-size: var(--font-size--small)\n\n .farama-header__right .farama-header-menu .farama-header-menu-container\n .farama-header-menu__header\n padding: 8px 12px\n .farama-header-menu__body\n padding: 18px 12px\n\n .farama-donate-banner\n flex-direction: column\n\n\n .farama-donate-banner__btns\n margin-top: 1em\n justify-content: end\n\n button\n margin-left: 12px\n height: 36px\n\n .farama-donate-banner__go\n padding: 0 20px\n\n .farama-donate-banner__cancel\n svg\n height: 26px\n\n\n@media (max-width: 480px)\n .farama-header\n .farama-header__title\n width: 110px\n\n .farama-header-menu__btn-name\n text-align: right\n width: 100px\n\n .farama-project-heading\n text-align: left\n\n .farama-header-menu__subsections-container\n display: block !important\n\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n .farama-white-logo-invert\n filter: invert(1)\n\n body[data-theme=\"dark\"]\n .farama-black-logo-invert\n filter: invert(1)\n\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n // Github math render\n img[src*=\"//render.githubusercontent.com/render/math\"]\n filter: invert(90%)\n\n .farama-black-logo-invert\n filter: invert(1)\n\n body[data-theme=\"light\"]\n .farama-white-logo-invert\n filter: invert(1)\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA,8BCbF,GACI,iBACJ,GACI,iBACJ,GACI,iBAGJ,qCACI,kBAEJ,iCACI,kBAEJ,kCACI,mBAIJ,cAKI,mDAEA,oDACA,SAFA,sCAJA,aAOA,OALA,gBAHA,eAEA,WAOA,cAEJ,yBAEI,mBADA,aAIA,YADA,4BADA,WAEA,CAEJ,sBACI,iBAEJ,gBACI,OAIJ,YACI,iDAGA,YADA,kBAGA,eAJA,kBAGA,oCACA,CAEA,kBACI,uDAKJ,8EAEI,aACA,eAFA,iBAEA,CAEJ,0SACI,iBAER,iBACI,YAIJ,UAKI,sBAJA,aACA,eACA,uBACA,UACA,CAEJ,gBACI,aACA,sBAEA,aACA,aAFA,WAEA,CAEJ,uBACI,aACA,aACA,uBAEJ,2BACI,gBACA,yCAEJ,aAII,qBAHA,aAIA,YAHA,uBAIA,iBAHA,iBAGA,CAEJ,UAGI,cADA,iBADA,WAEA,CAIJ,qCACI,gBAEJ,KACI,2BAA4B,CAC5B,gCAAiC,CACjC,qCAAsC,CAE1C,eAMI,mDADA,mDAGA,sBANA,aAEA,mCAGA,sBANA,kBAEA,WAMA,WAEA,yCAGI,aAEA,8BADA,cAFA,iBADA,UAIA,CAEJ,iBACI,sCACA,qBACA,4BAEA,uBACI,wCAER,oCAEI,wCADA,+EACA,CAEJ,qCAKI,kBAJA,mCACA,gBACA,eACA,iBACA,CAKA,0EACI,aAER,4CACI,aAEA,kEAEI,uCACA,qCACA,iBACA,cAJA,UAIA,CAER,qCAEI,mBADA,aAEA,UAEA,yDACI,aAEA,YADA,eACA,CAEA,4DAII,mBACA,eAFA,aADA,iBADA,oBAIA,CAEA,8DAGI,mBADA,aADA,WAEA,CAEJ,+FAGI,mBADA,aAEA,YAHA,iBAGA,CAGI,mIACI,cAER,mGAEI,qCADA,UACA,CAEJ,6HAKI,yCADA,gDAGA,aANA,kBAEA,QADA,gCAIA,YACA,CAEA,gIACI,gBACA,SACA,iBAEJ,gIACI,SACA,cAEpB,yDAEI,aACA,uBAFA,iBAEA,CAEA,kFAEI,gBACA,YACA,eAHA,YAGA,CAEA,sFACI,WACJ,sFAEI,uCACA,iBACA,kBAHA,UAGA,CAGR,8FACI,4BAEJ,uFAUI,mDACA,qDAHA,sBAFA,YAMA,cAXA,eAEA,QACA,WAGA,wBAEA,iCAJA,WAHA,UAUA,CAEA,mHASI,mBAFA,uDAHA,sBAIA,aAHA,cAFA,iBAGA,iBALA,kBACA,UAOA,CAEA,qHAEI,mBADA,YACA,CAEA,+IACI,WAEJ,0HACI,sCACA,iBAER,qJAGI,sBAFA,kBACA,OACA,CAEA,4JAEI,gBACA,YACA,eAHA,YAGA,CAEA,gKAEI,sCADA,UACA,CAEhB,iHAKI,sBAJA,aAMA,eADA,cAHA,iBACA,kBAFA,UAKA,CAEA,8IAEI,mBADA,gBAEA,kBAEA,iLACI,cACA,kCACA,gBAEA,oBADA,wBACA,CAIA,yNACI,gBAEA,0OACI,kBAEJ,+PAGI,wCAFA,cACA,qCAEA,gBAEA,uBADA,wBACA,CAEZ,uKACI,gBAGA,gBAFA,SACA,SACA,CAEA,0KACI,gDAEA,gLACI,6DAEJ,4KAGI,mBAFA,aACA,iBACA,CAEA,kLACI,cAEJ,gLAEI,kBADA,UACA,CAExC,uBAEI,mBADA,aAKA,gDADA,iBADA,0DADA,kBAIA,qBAEA,2BACI,gDACA,yCACJ,4BACI,sCACA,kCACI,qBAEZ,eAGI,mBAFA,mBACA,4CACA,CAEA,uCACI,aAEA,YADA,cACA,CAEJ,mCACI,iBACA,kBAER,uBAGI,cADA,sBADA,SAEA,CAEA,0CAII,wDAnZY,CAoZZ,4BACA,6BAEA,YACA,kBANA,WAOA,eARA,iBAKA,qCANA,UASA,CAEA,gDACI,qCAEZ,sBAKI,qDADA,sBAHA,aACA,iBACA,UAEA,CAEA,6BACI,aAEJ,kDAII,mBAFA,aADA,OAIA,gBAFA,sBAEA,CAEJ,kDAEI,mBADA,YACA,CAEA,oDACI,qBAEJ,yDAQI,mBAJA,YACA,kBAIA,eAHA,aAJA,YAKA,uBANA,iBAEA,iBAMA,CAEJ,4EAEI,wDAncQ,CAocR,4BACA,6BAHA,WAKA,eADA,oCACA,CAEA,kFACI,oCAER,gFACI,qCAEA,oFACI,YAEhB,kCAEQ,2DACI,gCACA,iEACI,0BACJ,+DACI,YAGR,qDACI,mCACA,2DACQ,8BACR,yDACI,aAEhB,mCAEQ,0DACI,mCACA,gEACQ,8BACR,8DACI,YAGR,oDACI,gCACA,0DACI,0BACJ,wDACI,aAKhB,qBACI,gCAEJ,wBAGI,QAAO,CADP,mBADA,iBAEA,CAEJ,yBACI,UAGA,8BAEI,SAAQ,CADR,8BACA,CAGJ,uCACI,UAIR,qBACI,wCACA,aACA,SAEJ,4BACI,eACA,gBACA,iBAEJ,gCACI,gBAEJ,yBACI,UAEJ,wBAII,mBADA,sBADA,eADA,WAGA,CAEJ,8BACI,mBACA,gBAEJ,kCAEQ,qDACI,mBACJ,2DACI,mBAEJ,+CACI,mBACJ,qDACI,oBAEZ,mCAEQ,oDACI,mBACJ,0DACI,mBAEJ,8CACI,mBACJ,oDACI,oBAGR,+CACI,mBACJ,qDACI,mBAER,6BACI,sBACA,kBAIJ,wDACI,uCACA,kBAEJ,qBACI,gBAEJ,gEAEI,0CADA,kCACA,CAIJ,sBACI,uCACA,YACA,gBAEA,wEACI,YACA,gBAEJ,wCACI,wBAER,kCACI,iEACI,mBACA,eAGJ,0DACI,mBACA,cAKR,wBACI,mHACI,iBAEJ,6CACI,cAGR,wBACI,eACI,cAEA,qCACI,kCAGA,mHACI,iBACJ,iHACI,kBAEZ,sBACI,sBAGA,kDAEI,oBADA,cACA,CAEA,yDAEI,YADA,gBACA,CAEJ,4EACI,eAGA,oFACI,aAGpB,wBAEQ,qCACI,YAEJ,6CACI,iBACA,YAER,wBACI,gBAEJ,2CACI,yBAER,yBACI,cAEI,eADA,wCACA,EAER,yBACI,cACI,gBAER,mCAMQ,sGACI,kBAGZ,kCAGQ,oFACI,mBAMJ,wGACI","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass","webpack:///./src/furo/assets/styles/extensions/_farama.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n","// Farama Base\n\n$farama-background: linear-gradient(to right top, #765e3e, #054f5b)\n\nh1\n font-size: 2.2rem\nh2\n font-size: 1.7rem\nh3\n font-size: 1.4rem\n\n// If menu is active then all elements except the menu are not visible (i.e. only element with aria-hidden=\"true\")\nhtml:has(.farama-header-menu.active)\n visibility: hidden\n\n.farama-hidden[aria-hidden=\"true\"]\n visibility: hidden\n\n.farama-hidden[aria-hidden=\"false\"]\n visibility: visible\n\n// Cookies Alert\n\n.cookie-alert\n position: fixed\n display: flex\n width: 100%\n min-height: 70px\n background-color: var(--color-background-secondary)\n color: var(--color-foreground-primary)\n border-top: 1px solid var(--color-background-border)\n bottom: 0\n left: 0\n z-index: 99999\n\n.cookie-alert__container\n display: flex\n align-items: center\n width: 700px\n max-width: calc(100% - 28px)\n margin: auto\n\n.cookie-alert__button\n margin-left: 14px\n\n.cookie-alert p\n flex: 1\n\n// Farama default button style\n\n.farama-btn\n background: var(--color-farama-button-background)\n padding: 10px 26px\n border-radius: 6px\n border: none\n transition: background-color 0.2s ease\n cursor: pointer\n\n &:hover\n background: var(--color-farama-button-background-hover)\n\n// Env Icons\n\narticle[role=main]:has(.farama-env-icon-container)\n .farama-env-icon-container\n position: absolute\n display: flex\n margin-top: 7px\n\n .section h1:first-child, .section h2:first-child, section h1:first-child, section h2:first-child\n margin-left: 34px\n\n.farama-env-icon\n height: 32px\n\n// Envinronments grid\n\n.env-grid\n display: flex\n flex-wrap: wrap\n justify-content: center\n width: 100%\n box-sizing: border-box\n\n.env-grid__cell\n display: flex\n flex-direction: column\n width: 180px\n height: 180px\n padding: 10px\n\n.cell__image-container\n display: flex\n height: 148px\n justify-content: center\n\n.cell__image-container img\n max-height: 100%\n object-fit: contain\n\n.cell__title\n display: flex\n justify-content: center\n text-align: center\n align-items: flex-end\n height: 32px\n line-height: 16px\n\n.more-btn\n width: 240px\n margin: 12px auto\n display: block\n\n// Farama Header\n\nhtml:has(.farama-header-menu.active)\n overflow: hidden\n\nbody\n --farama-header-height: 52px\n --farama-header-logo-margin: 10px\n --farama-sidebar-logo-margin: 2px 10px\n\n.farama-header\n position: absolute\n display: flex\n width: 100%\n height: var(--farama-header-height)\n border-bottom: 1px solid var(--color-header-border)\n background-color: var(--color-background-secondary)\n padding: 0 36px 0 24px\n box-sizing: border-box\n z-index: 95\n\n .farama-header__container\n width: 100%\n max-width: 1400px\n display: flex\n margin: 0 auto\n justify-content: space-between\n\n a\n color: var(--color-foreground-primary)\n text-decoration: none\n transition: color 0.125s ease\n\n &:hover\n color: var(--color-foreground-secondary)\n\n .farama-header__logo\n max-height: calc(var(--farama-header-height) - var(--farama-header-logo-margin))\n margin: var(--farama-header-logo-margin)\n\n .farama-header__title\n font-size: var(--font-size--normal)\n font-weight: normal\n margin: 0 0 2px 0\n padding: 0 0 0 4px\n align-self: center\n\n .farama-header__left\n display: flex\n\n a\n display: flex\n\n .farama-header__left--mobile\n display: none\n\n .nav-overlay-icon svg\n width: 20px\n stroke: var(--color-foreground-primary)\n fill: var(--color-foreground-primary)\n stroke-width: 2px\n padding: 0 6px\n\n .farama-header__right\n display: flex\n align-items: center\n z-index: 2\n\n .farama-header__nav\n display: flex\n list-style: none\n height: 100%\n\n li\n text-decoration: none\n margin-left: 20px\n display: flex\n align-items: center\n cursor: pointer\n\n a\n height: 100%\n display: flex\n align-items: center\n\n .farama-header__dropdown-container\n position: relative\n display: flex\n align-items: center\n height: 100%\n\n &:hover\n .farama-header__dropdown-menu\n display: block\n\n svg\n width: 32px\n fill: var(--color-foreground-primary)\n\n .farama-header__dropdown-menu\n position: absolute\n top: var(--farama-header-height)\n right: 0\n border: 1px solid var(--color-background-border)\n background: var(--color-background-hover)\n z-index: 9999\n display: none\n\n ul\n display: inherit\n margin: 0\n padding: 6px 14px\n\n li\n margin: 0\n padding: 6px 0\n\n .farama-header-menu\n position: relative\n display: flex\n justify-content: center\n\n .farama-header-menu__btn\n display: flex\n background: none\n border: none\n cursor: pointer\n\n img\n width: 26px\n svg\n width: 14px\n stroke: var(--color-foreground-primary)\n stroke-width: 2px\n align-self: center\n\n\n &.active .farama-header-menu-container\n transform: translateY(100vh)\n\n .farama-header-menu-container\n position: fixed\n z-index: 99\n right: 0\n top: -100vh\n width: 100%\n height: calc(100vh - calc(100vh - 100%))\n transform: translateY(0)\n box-sizing: border-box\n transition: transform 0.2s ease-in\n background-color: var(--color-background-secondary)\n border-left: 1px solid var(--color-background-border)\n overflow: auto\n\n .farama-header-menu__header\n position: relative\n width: 100%\n max-width: 1400px\n box-sizing: border-box\n margin: 0 auto\n padding: 7px 52px\n border-bottom: 1px solid var(--color-background-border)\n display: flex\n align-items: center\n\n a\n display: flex\n align-items: center\n\n .farama-header-menu__logo\n width: 36px\n\n span\n color: var(--color-sidebar-brand-text)\n padding-left: 8px\n\n .farama-header-menu-header__right\n position: absolute\n right: 0\n padding-right: inherit\n\n button\n display: flex\n background: none\n border: none\n cursor: pointer\n\n svg\n width: 20px\n color: var(--color-foreground-primary)\n\n .farama-header-menu__body\n display: flex\n width: 100%\n max-width: 1500px\n padding: 22px 52px\n box-sizing: border-box\n margin: 0 auto\n flex-wrap: wrap\n\n .farama-header-menu__section\n min-width: 220px\n margin-bottom: 24px\n padding-left: 18px\n\n .farama-header-menu__section-title\n display: block\n font-size: var(--font-size--small)\n font-weight: 600\n text-transform: uppercase\n padding: 0 12px 12px\n\n .farama-header-menu__subsections-container\n\n .farama-header-menu__subsection\n min-width: 210px\n\n &:not(:last-child)\n margin-right: 12px\n\n .farama-header-menu__subsection-title\n display: block\n font-size: var(--font-size--small--3)\n color: var(--color-foreground-secondary)\n font-weight: 700\n text-transform: uppercase\n padding: 20px 12px 10px\n\n .farama-header-menu-list\n display: inherit\n margin: 0\n padding: 0\n list-style: none\n\n li\n border-radius: var(--sidebar-item-border-radius)\n\n &:hover\n background-color: var(--color-farama-header-background-hover)\n\n a\n display: flex\n padding: 12px 14px\n align-items: center\n\n &:hover\n color: inherit\n\n img\n width: 26px\n margin-right: 10px\n\n.farama-sidebar__title\n display: flex\n align-items: center\n padding-right: 4px\n min-height: calc(52px - var(--sidebar-search-space-above))\n margin-top: 0.6rem\n margin-left: var(--sidebar-search-space-lateral)\n text-decoration: none\n\n img\n height: calc(var(--farama-header-height) - 20px)\n margin: var(--farama-sidebar-logo-margin)\n span\n color: var(--color-foreground-primary)\n &:hover\n text-decoration: none\n\n.sidebar-brand\n flex-direction: row\n padding: var(--sidebar-item-spacing-vertical)\n align-items: center\n\n .sidebar-logo-container\n display: flex\n max-width: 55px\n height: auto\n\n .sidebar-brand-text\n font-size: 1.3rem\n padding-left: 11px\n\n.farama-sidebar-donate\n width: 76%\n padding: 8px 16px 20px\n margin: 0 auto\n\n .farama-donate-btn\n width: 100%\n padding: 8px 12px\n color: #fff\n background: $farama-background\n background-blend-mode: color\n background-color: transparent\n transition: background-color 0.2s ease\n border: none\n border-radius: 6px\n cursor: pointer\n\n &:hover\n background-color: rgb(255 255 255 / 15%)\n\n.farama-donate-banner\n display: none\n padding: 16px 3em\n width: 100%\n box-sizing: border-box\n background-color: var(--color-highlighted-background)\n\n &.active\n display: flex\n\n .farama-donate-banner__text\n flex: 1\n display: flex\n justify-content: center\n align-items: center\n font-size: 1.1em\n\n .farama-donate-banner__btns\n display: flex\n align-items: center\n\n a\n text-decoration: none\n\n button\n margin-left: 22px\n height: 36px\n position: relative\n border: none\n border-radius: 6px\n display: flex\n justify-content: center\n align-items: center\n cursor: pointer\n\n .farama-donate-banner__go\n color: #fff\n background: $farama-background\n background-blend-mode: color\n background-color: transparent\n transition: background-color 0.2s ease\n padding: 0 26px\n\n &:hover\n background-color: rgb(255 255 255 / 10%)\n\n .farama-donate-banner__cancel\n transition: background-color 0.2s ease\n\n svg\n height: 26px\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n .farama-donate-banner__cancel\n background-color: rgb(0 0 0 / 10%)\n &:hover\n background: rgb(0 0 0 / 20%)\n svg\n stroke: #fff\n\n body[data-theme=\"light\"]\n .farama-donate-banner__cancel\n background-color: rgb(25 25 25 / 10%)\n &:hover\n background: rgb(255 255 255 / 20%)\n svg\n stroke: #666\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n .farama-donate-banner__cancel\n background-color: rgb(25 25 25 / 10%)\n &:hover\n background: rgb(255 255 255 / 20%)\n svg\n stroke: #666\n\n body[data-theme=\"dark\"]\n .farama-donate-banner__cancel\n background-color: rgb(0 0 0 / 10%)\n &:hover\n background: rgb(0 0 0 / 20%)\n svg\n stroke: #fff\n\n\n// Farama custom directives\n\n.farama-project-logo\n margin: 1.5rem 0 0.8rem !important\n\n.farama-project-heading\n text-align: center\n padding: 0 0 1.6rem 0\n margin: 0\n\n.farama-project-logo img\n width: 65%\n\n.mobile-header\n .header-center\n transition: opacity 0.2s easy-in\n opacity: 0\n\n.mobile-header.scrolled\n .header-center\n opacity: 1\n\n// Sphinx Gallery\n\n.sphx-glr-script-out\n color: var(--color-foreground-secondary)\n display: flex\n gap: 0.5em\n\n.sphx-glr-script-out::before\n content: \"Out:\"\n line-height: 1.4\n padding-top: 10px\n\n.sphx-glr-script-out .highlight\n overflow-x: auto\n\n.sphx-glr-thumbcontainer\n z-index: 1\n\ndiv.sphx-glr-download a\n width: 340px\n max-width: 100%\n box-sizing: border-box\n background: #0f4a65\n\ndiv.sphx-glr-download a:hover\n background: #0d3a4e\n box-shadow: none\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n div.sphx-glr-download a\n background: #0f4a65\n div.sphx-glr-download a:hover\n background: #0d3a4e\n body[data-theme=\"light\"]\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n body[data-theme=\"dark\"]\n div.sphx-glr-download a\n background: #0f4a65\n div.sphx-glr-download a:hover\n background: #0d3a4e\n\nbody[data-theme=\"light\"]\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n\n.sphx-glr-thumbcontainer img\n background-color: white\n border-radius: 4px\n\n// Override Tabs styles\n\n.tab-content > [class^=\"highlight-\"]:first-child .highlight\n background: var(--color-api-background)\n border-radius: 6px\n\n.tab-set > input + label\n font-weight: 600\n\n.tab-set > input:checked + label, .tab-set > input:checked + label:hover\n color: var(--color-brand-secondary)\n border-color: var(--color-brand-secondary)\n\n// Sphinx Jupyter\n\ndiv.jupyter_container\n background: var(--color-api-background)\n border: none\n box-shadow: none\n\n div.code_cell, div.highlight\n border: none\n border-radius: 0\n\n div.code_cell pre\n padding: 0.625rem 0.875rem\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"]) div.jupyter_container div.highlight\n background: #202020\n color: #d0d0d0\n\nbody[data-theme=\"dark\"]\n div.jupyter_container div.highlight\n background: #202020\n color: #d0d0d0\n\n\n\n\n@media (max-width: 950px)\n .farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header\n padding: 7px 42px\n\n .farama-header .farama-header-menu__btn-name\n display: none\n\n\n@media (max-width: 600px)\n .farama-header\n padding: 0 4px\n\n .farama-header__title\n font-size: var(--font-size--small)\n\n .farama-header__right .farama-header-menu .farama-header-menu-container\n .farama-header-menu__header\n padding: 8px 12px\n .farama-header-menu__body\n padding: 18px 12px\n\n .farama-donate-banner\n flex-direction: column\n\n\n .farama-donate-banner__btns\n margin-top: 1em\n justify-content: end\n\n button\n margin-left: 12px\n height: 36px\n\n .farama-donate-banner__go\n padding: 0 20px\n\n .farama-donate-banner__cancel\n svg\n height: 26px\n\n\n@media (max-width: 480px)\n .farama-header\n .farama-header__title\n width: 110px\n\n .farama-header-menu__btn-name\n text-align: right\n width: 100px\n\n .farama-project-heading\n text-align: left\n\n .farama-header-menu__subsections-container\n display: block !important\n\n@media (min-width: 1260px)\n div.highlight\n width: fit-content\n max-width: 60vw\n\n@media (min-width: 2160px)\n div.highlight\n max-width: 50vw\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n .farama-white-logo-invert\n filter: invert(1)\n\n body[data-theme=\"dark\"]\n .farama-black-logo-invert\n filter: invert(1)\n\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n // Github math render\n img[src*=\"//render.githubusercontent.com/render/math\"]\n filter: invert(90%)\n\n .farama-black-logo-invert\n filter: invert(1)\n\n body[data-theme=\"light\"]\n .farama-white-logo-invert\n filter: invert(1)\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/versioning/versioning_menu.html b/_static/versioning/versioning_menu.html
index 1daf4cef7..68109cf86 100644
--- a/_static/versioning/versioning_menu.html
+++ b/_static/versioning/versioning_menu.html
@@ -122,15 +122,33 @@
});
const sortVersions = (a, b) => {
- // Alpha versions
- if (a.includes("a")) return 1;
- if (b.includes("a")) return -1;
- if (a.replace("v", "") > b.replace("v", ""))
- return -1
- else if (a.replace("v", "") < b.replace("v", ""))
- return 1
- else
- return 0
+ const innerA = a.replace("v", "");
+ const innerB = b.replace("v", "");
+
+ if (innerA.match(/[a-z]/) && !innerB.match(/[a-z]/)) return 1;
+ if (!innerA.match(/[a-z]/) && innerB.match(/[a-z]/)) return -1;
+
+ const splittedInnerA = innerA.split("");
+ const splittedInnerB = innerB.split("");
+
+ while (splittedInnerA.length && splittedInnerB.length) {
+ const charA = splittedInnerA.shift();
+ const charB = splittedInnerB.shift();
+
+ if (charA === charB) continue;
+ else if (charA === ".") return 1;
+ else if (charB === ".") return -1;
+ else if (charA.match(/[0-9]/) && charB.match(/[0-9]/)) {
+ return Number(charB) - Number(charA);
+ } else {
+ if (charA < charB) return 1;
+ else if (charA > charB) return -1;
+ else return 0;
+ }
+ }
+ if (innerA < innerB) return 1;
+ else if (innerA > innerB) return -1;
+ else return 0;
}
if ((githubUser !== null && githubUser !== "") || (repo !== null && repo !== "")) {
@@ -204,4 +222,4 @@
console.error("Invalid versioning configuration");
}
-
\ No newline at end of file
+
diff --git a/developing/index.html b/developing/index.html
index dea7dd66e..ae3ae2444 100644
--- a/developing/index.html
+++ b/developing/index.html
@@ -11,11 +11,11 @@
-
+
Development - Stable-Retro Documentation
-
+
-
+
@@ -279,36 +279,36 @@
-Development#
+Development¶
Adding new games can be done without recompiling Stable Retro, but if you need to work on the C++ code or make changes to the UI, you will want to compile Stable Retro from source.
-Install Retro from source#
+Install Retro from source¶
Building Stable Retro requires at least either gcc 5 or clang 3.4.
-Prerequisites#
+Prerequisites¶
To build Stable Retro you must first install CMake.
You can do this either through your package manager, download from the official site or pip3 install cmake
.
If you’re using the official installer on Windows, make sure to tell CMake to add itself to the system PATH.
-Mac prerequisites#
+Mac prerequisites¶
Since LuaJIT does not work properly on macOS you must first install Lua 5.1 from homebrew:
brew install pkg-config lua@5.1
-Windows prerequisites#
+Windows prerequisites¶
Install docker
-Linux prerequisites#
+Linux prerequisites¶
sudo apt-get install zlib1g-dev
-Building Linux and Mac#
+Building Linux and Mac¶
git clone https://github.com/farama-foundation/stable-retro.git stable-retro
cd stable-retro
pip3 install -e .
@@ -316,7 +316,7 @@ Building Linux and Mac
-Building Windows#
+Building Windows¶
Run the following
docker/build_windows.bat
@@ -331,10 +331,10 @@ Building Windows
-Install Retro UI from source#
+Install Retro UI from source¶
First make sure you can install Retro from source, after that follow the instructions for your platform:
-macOS#
+macOS¶
Note that for Mojave (10.14) you may need to install /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
brew install pkg-config capnp lua@5.1 qt5
cmake . -DCMAKE_PREFIX_PATH=/usr/local/opt/qt -DBUILD_UI=ON -UPYLIB_DIRECTORY
@@ -344,7 +344,7 @@ macOS#<
-Linux#
+Linux¶
sudo apt-get install capnproto libcapnp-dev libqt5opengl5-dev qtbase5-dev zlib1g-dev
cmake . -DBUILD_UI=ON -UPYLIB_DIRECTORY
make -j$(grep -c ^processor /proc/cpuinfo)
@@ -353,7 +353,7 @@ Linux#<
-Windows#
+Windows¶
The Retro UI is not currently supported in native Windows but you can use it easily via WSL2 (Windows Subsystem for Linux) by following the instructions above for Linux.
From within WSL2 just launch gym-retro-integration binary like you would on linux.
@@ -477,10 +477,62 @@ Windows#<
-
+
+
-
-
+
+
diff --git a/genindex/index.html b/genindex/index.html
index 454a081b2..2119c406e 100644
--- a/genindex/index.html
+++ b/genindex/index.html
@@ -10,10 +10,10 @@
- Index - Stable-Retro Documentation
-
+ Index - Stable-Retro Documentation
+
-
+
@@ -431,10 +431,62 @@ S
-
+
+
-
-
+
+
diff --git a/getting_started/index.html b/getting_started/index.html
index 8df87ed9b..b7a1dc426 100644
--- a/getting_started/index.html
+++ b/getting_started/index.html
@@ -11,11 +11,11 @@
-
+
Getting Started - Stable-Retro Documentation
-
+
-
+
@@ -279,16 +279,16 @@
-Getting Started#
+Getting Started¶
Stable Retro requires one of the supported versions of Python (3,6 to 3.10). Please make sure to install the appropriate distribution for your OS beforehand. Please note that due to compatibility issues with some of the cores, 32-bit operating systems are not supported.
pip3 install stable-retro
See the section development if you want to build Stable Retro yourself (this is only useful if you want to change the C++ code, not required to integrate new games).
-Create a Retro Environment#
+Create a Retro Environment¶
After installing you can now create a Gymnasium environment in Python:
-import retro
+import retro
env = retro.make(game='Airstriker-Genesis')
@@ -296,11 +296,11 @@ Create a Retro EnvironmentImporting ROMs for information about importing ROMs into Stable Retro.
-Example Usage#
+Example Usage¶
Stable Retro is useful primarily as a means to train RL on classic video games, though it can also be used to control those video games from Python.
Here are some example ways to use Stable Retro:
-Interactive Script#
+Interactive Script¶
There is a Python script that lets you interact with the game using the Gymnasium interface. Run it like this:
python3 -m retro.examples.interactive --game Airstriker-Genesis
@@ -308,12 +308,12 @@ Interactive ScriptX key to control your ship and fire. This Python script lets you try out an environment using only the Stable Retro Python API and is quite basic. For a more advanced tool, check out the The Integration UI.
-Random Agent#
+Random Agent¶
A random agent that chooses a random action on each timestep looks much like the example random agent for Gymnasium:
-import retro
+import retro
-def main():
+def main():
env = retro.make(game="Airstriker-Genesis")
env.reset()
while True:
@@ -336,7 +336,7 @@ Random Agent
-Brute#
+Brute¶
There is a simple but effective reinforcement learning algorithm called “the Brute” from “Revisiting the Arcade Learning Environment” by Machado et al. which works on deterministic environments like Stable Retro games and is easy to implement. To run the example:
python3 -m retro.examples.brute --game Airstriker-Genesis
@@ -344,7 +344,7 @@ Brute#<
This algorithm works by building up a sequence of button presses that do well in the game, it doesn’t look at the screen at all. It will print out the best reward seen so far while training.
-PPO#
+PPO¶
Using “Proximal Policy Optimization” by Schulman et al., you can train an agent to play many of the games, though it takes awhile and is much faster with a GPU.
This example requires installing Stable Baselines. Once installed, you can run it:
python3 -m retro.examples.ppo --game Airstriker-Genesis
@@ -354,16 +354,16 @@ PPO#
-Integrations#
+Integrations¶
What games have already been integrated? Note that this will display all defined environments, even ones for which ROMs are missing.
-import retro
+import retro
retro.data.list_games()
The actual integration data can be see in the Stable Retro Github repo.
-Importing ROMs#
+Importing ROMs¶
If you have the correct ROMs on your computer (identified by the rom.sha
file for each game integration), you can import them using the import script:
python3 -m retro.import /path/to/your/ROMs/directory/
@@ -486,10 +486,62 @@ Integrations
+
-
-
+
+
diff --git a/index.html b/index.html
index e85b9e7be..5253e6b39 100644
--- a/index.html
+++ b/index.html
@@ -11,11 +11,11 @@
-
+
Stable-Retro Documentation
-
+
-
+
@@ -287,7 +287,8 @@
Stable-Retro is a maintained fork of OpenAI’s Retro library.
stable-retro lets you turn classic video games into Gymnasium environments for reinforcement learning. Supported plateforms includes Sega Genesis, Sega 32X, Super Nintendo, Atari 2600 and more (full list here)
@@ -295,24 +296,24 @@
Train an agent using Proximal Policy Optimization from Stable Baselines 3
"""
-import argparse
+import argparse
-import gymnasium as gym
-import numpy as np
-from gymnasium.wrappers.time_limit import TimeLimit
-from stable_baselines3 import PPO
-from stable_baselines3.common.atari_wrappers import ClipRewardEnv, WarpFrame
-from stable_baselines3.common.vec_env import (
+import gymnasium as gym
+import numpy as np
+from gymnasium.wrappers.time_limit import TimeLimit
+from stable_baselines3 import PPO
+from stable_baselines3.common.atari_wrappers import ClipRewardEnv, WarpFrame
+from stable_baselines3.common.vec_env import (
SubprocVecEnv,
VecFrameStack,
VecTransposeImage,
)
-import retro
+import retro
-class StochasticFrameSkip(gym.Wrapper):
- def __init__(self, env, n, stickprob):
+class StochasticFrameSkip(gym.Wrapper):
+ def __init__(self, env, n, stickprob):
gym.Wrapper.__init__(self, env)
self.n = n
self.stickprob = stickprob
@@ -320,11 +321,11 @@
self.rng = np.random.RandomState()
self.supports_want_render = hasattr(env, "supports_want_render")
- def reset(self, **kwargs):
+ def reset(self, **kwargs):
self.curac = None
return self.env.reset(**kwargs)
- def step(self, ac):
+ def step(self, ac):
terminated = False
truncated = False
totrew = 0
@@ -352,7 +353,7 @@
return ob, totrew, terminated, truncated, info
-def make_retro(*, game, state=None, max_episode_steps=4500, **kwargs):
+def make_retro(*, game, state=None, max_episode_steps=4500, **kwargs):
if state is None:
state = retro.State.DEFAULT
env = retro.make(game, state, **kwargs)
@@ -362,7 +363,7 @@
return env
-def wrap_deepmind_retro(env):
+def wrap_deepmind_retro(env):
"""
Configure environment for retro games, using config similar to DeepMind-style Atari in openai/baseline's wrap_deepmind
"""
@@ -371,14 +372,14 @@
return env
-def main():
+def main():
parser = argparse.ArgumentParser()
parser.add_argument("--game", default="Airstriker-Genesis")
parser.add_argument("--state", default=retro.State.DEFAULT)
parser.add_argument("--scenario", default=None)
args = parser.parse_args()
- def make_env():
+ def make_env():
env = make_retro(game=args.game, state=args.state, scenario=args.scenario)
env = wrap_deepmind_retro(env)
return env
@@ -474,10 +475,62 @@
-
+
+
-
-
+
+
diff --git a/integration/index.html b/integration/index.html
index f0f633f03..20708209a 100644
--- a/integration/index.html
+++ b/integration/index.html
@@ -11,11 +11,11 @@
-
+
Game Integration - Stable-Retro Documentation
-
+
-
+
@@ -279,7 +279,7 @@
-Game Integration#
+Game Integration¶
Integrating a game means taking a video game ROM file and setting it up as a reinforcement learning environment by defining 3 things:
A starting state
@@ -289,14 +289,14 @@ Game IntegrationGymnasium environment.
If you are going to integrate a new game, you’ll need a ROM for the correct system, see Supported ROM Types for a list.
-Example Integration#
+Example Integration¶
This is a list of the integration files for the game Airstriker-Genesis.
-Level1.state
#
+Level1.state
¶
This is a savestate from the beginning of the game, restarting the environment will put the agent at this point in the game.
-data.json
#
+data.json
¶
This file defines the list of game-related variables that python can see based on their memory addresses in the games
{
"info": {
@@ -318,7 +318,7 @@ data.json
-scenario.json
#
+scenario.json
¶
This file defines the reward function and done condition using the variables defined in data.json
{
"done": {
@@ -345,7 +345,7 @@ scenario.json
-metadata.json
#
+metadata.json
¶
This file defines the default starting state if no state is specified by the user as well as some miscellaneous debugging information.
{
"default_state": "Level1",
@@ -359,11 +359,11 @@ metadata.json
-rom.md
#
+rom.md
¶
This is the ROM file used for this game, with a few exceptions, ROM files are not included in Stable Retro, but will be in your local copy of Stable Retro after you import them.
-rom.sha
#
+rom.sha
¶
This is the SHA1 hash of the rom.md
file, used for importing ROMs.
c67af162391fff4a63432be5a156eb9ca7b4da5a
@@ -372,13 +372,13 @@ rom.sha<
-Integration Files#
+Integration Files¶
-States#
+States¶
Emulation allows the entire state of a video game system to be stored to disk and restored. These files are specific to the emulator, but always end with .state
. These are identical to the versions used in the standalone versions of the emulators but gzipped.
-Variable Locations data.json
#
+Variable Locations data.json
¶
Information about the inner workings of games are stored alongside the ROM in a file named data.json
. This JSON file documents “ground truth” information about a game, including the locations and formats of variables in memory. These manifests are separated into sections, although only one section currently is defined:
The info
section of the manifest lists game variables’ memory addresses. Each entry in the info
section consists of a key naming the memory address and the following values:
@@ -399,7 +399,7 @@ Variable Locations Appendix: Types.
-Scenario scenario.json
#
+Scenario scenario.json
¶
Information pertaining to reward functions and done conditions can either be specified by manually overriding functions in retro.RetroEnv
or can be done by writing a scenario file.
Scenario files contain information that is used to compute the reward function and done condition from variables defined in the information manifest. Each variable specified in the scenario file is multiplied by a reward
value if positive and a penalty
value if negative and then summed up to create the reward for that step. Similarly, states of these variables can be checked to see if the game is over. By default the scenario file will be loaded from scenario.json
, but alternative scenario files can be specified in the retro.RetroEnv
constructor.
Scenario files are again JSON and specified with the following sections:
@@ -427,7 +427,7 @@ Scenario scenar
-The Integration UI#
+The Integration UI¶
The integration UI helps you easily find variables and see what is going on with the reward function.
You can normally download the compiled UI package for your platform here:
@@ -436,7 +436,7 @@ Scenario scenar
However, if those URLs no longer work, you can also download these packages from GitHub’s Releases
-Integrating a new ROM#
+Integrating a new ROM¶
-Supported ROM Types#
+Supported ROM Types¶
ROM files contain the game itself. Each system has a unique file extension to denote which system a given ROM runs on:
.md
: Sega Genesis (also known as Mega Drive)
@@ -473,18 +473,18 @@ Integrating a new ROMSometimes ROMs from these systems use different extensions, e.g. .gen
for Genesis, .bin
for Atari, etc. Please rename the ROMs to use the aforementioned extensions in these cases.
-Integrating a Game#
+Integrating a Game¶
To integrate a game you need to define a done condition and a reward function. The done condition lets Stable Retro know when to end a game session, while the reward function provides a simple numeric goal for machine learning agents to maximize.
To define these, you find variables from the game’s memory, such as the player’s current score and lives remaining, and use those to create the done condition and reward function. An example done condition is when the lives
variable is equal to 0
, an example reward function is the change in the score
variable.
Note: if the game requires that you hit the Start
button to play, for instance after dying, then you need to modify the scenario file to allow this as Start
is disallowed by default. See the actions
key in KidChameleon-Genesis for an example of this.
-Done Condition#
+Done Condition¶
This is usually the easier of the two. The best done condition to use is the Game Over or Continue screen after you run out of lives. For some games this is when you have zero lives left, for some -1
lives, for others, it can be pretty hard.
It’s better to have a simple and reliable but slightly incorrect done condition (e.g. ending the game when you still have 1 life left because it’s hard to detect the 0 life case) than to have a done condition that is unreliable, such as a gameover
variable that detects when the gameover screen is present most of the time but also incorrectly fires when switching levels.
If you create a gameover
variable, make sure to test it with a replay that plays multiple levels in a row to make sure it doesn’t fire accidentally.
-Reward Function#
+Reward Function¶
Reinforcement learning agents try to maximize the reward function. The ideal reward function would be that you get 1 point for beating the game. There’s no way to maximize that besides beating the game.
That reward is impractical though, because existing reinforcement learning algorithms are unable to make progress with a reward that is so hard to get. Instead we can specify some easier to get reward that, if you maximize it, should result in beating the game.
If the game has a score, this is often a good choice. In some games however, you can get as much score as you want by standing in one place and attacking the same enemy over and over as it respawns. Because that is so different from beating the game, it’s best to have an alternative reward, though these are often very game specific.
@@ -492,7 +492,7 @@ Reward Functionscore
variable and set the reward such that the reward the agent receives matches the score displayed on the screen, make sure to check that you’re not off by a factor of 10 or 100 by comparing to the Cumulative
value displayed in the Scenario Information
pane of the UI.
-Finding Variables#
+Finding Variables¶
It’s best to keep a consistent pattern for the different types of variables you might add to a game’s data.json
file. Here are some tips:
It’s pretty common for multiple different variables to group themselves together. When narrowing down the search for a particular variable, look at nearby memory addresses if you suspect you have a similar but incorrect variable (for instance you found the high score variable but are looking for the score variable).
@@ -512,7 +512,7 @@ Finding Variables
-Common Errors#
+Common Errors¶
Wrong type for variable: if your score variable is actually >d2
and you put >d4
, you may not notice until you get to some later level and the memory address next to the score is used for something, suddenly giving you a very large score.
Incorrect done condition: it might be that if you run out of time or die in some unusual way that the done condition is not detected correctly. Make sure to test unusual ways of ending the game, and make sure that your done condition doesn’t fire upon completing a level (unless it’s the final level of the game). If you’re able to hit continue after dying, make sure that the game ends before the agent can hit continue.
@@ -521,7 +521,7 @@ Common Errors
-Using a Custom Integration from Python#
+Using a Custom Integration from Python¶
Once you have created an integration, you can put it in a folder called custom_integrations
. In particular, your integration directory name should follow the following structure (depending on the rom type):
.md
: *-Genesis
(e.g. AddamsFamily-Genesis
)
@@ -536,13 +536,13 @@ Using a Custom Integration from Python.sms: *-Sms
(e.g. AddamsFamily-Sms
)
Then you can tell retro
about your custom integration using the add_custom_path
function:
-import retro
-import os
+import retro
+import os
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-def main():
+def main():
retro.data.Integrations.add_custom_path(
os.path.join(SCRIPT_DIR, "custom_integrations")
)
@@ -558,7 +558,7 @@ Using a Custom Integration from Pythonretro directly.
-Appendix: Types#
+Appendix: Types¶
The types consist of three parts, in order:
Endianness
@@ -646,7 +646,7 @@ Using a Custom Integration from Python
-Appendix: Operations#
+Appendix: Operations¶
Games can store information in memory in many various ways, and as such the specific information needed can vary in form too. The basic premise is that once a raw value is extracted from memory an operation may be defined to transform it to a useful form. Furthermore, we may want raw values in a given step or the deltas between two steps. Thus three properties are defined:
measurement
: The method used for extracting the raw value. May be absolute
for the current value and delta
for the difference between the current and previous value. The default varies based on context.
@@ -802,10 +802,62 @@ Using a Custom Integration from Python
+
-
-
+
+
diff --git a/python/index.html b/python/index.html
index f3eb6f7da..f58d5a7b4 100644
--- a/python/index.html
+++ b/python/index.html
@@ -11,11 +11,11 @@
-
+
Python API - Stable-Retro Documentation
-
+
-
+
@@ -279,19 +279,19 @@
-Python API#
+Python API¶
-RetroEnv#
+RetroEnv¶
The Python API consists primarily of retro.make()
, retro.RetroEnv
, and a few enums. The main function most users will want is retro.make()
.
-
-retro.make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs)[source]#
+retro.make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs)[source]¶
Create a Gym environment for the specified game
-
-class retro.RetroEnv(game, state=retro.State.DEFAULT, scenario=None, info=None, use_restricted_actions=retro.Actions.FILTERED, record=False, players=1, inttype=retro.data.Integrations.STABLE, obs_type=retro.Observations.IMAGE, render_mode='human')[source]#
+class retro.RetroEnv(game, state=retro.State.DEFAULT, scenario=None, info=None, use_restricted_actions=retro.Actions.FILTERED, record=False, players=1, inttype=retro.data.Integrations.STABLE, obs_type=retro.Observations.IMAGE, render_mode='human')[source]¶
Gym Retro environment class
Provides a Gym interface to classic video games
@@ -299,18 +299,18 @@ RetroEnv
If you want to specify either the default state named in the game integration’s metadata.json
or specify that you want to start from the initial power on state of the console, you can use the retro.State
enum:
-Actions#
+Actions¶
There are a few possible action spaces included with retro.RetroEnv
:
-
-class retro.Actions(value)[source]#
+class retro.Actions(value)[source]¶
Different settings for the action space of the environment
@@ -347,21 +347,21 @@ Actions#<
You can also create your own action spaces derived from these. For an example, see discretizer.py. This file shows how to use retro.Actions.Discrete
as well as how to make a custom wrapper that reduces the action space from 126
actions to 7
-Observations#
+Observations¶
The default observations are RGB images of the game, but you can view RAM values instead (often much smaller than the RGB images and also your agent can observe the game state more directly). If you want variable values, any variables defined in data.json
will appear in the info
dict after each step.
-
-class retro.Observations(value)[source]#
+class retro.Observations(value)[source]¶
Different settings for the observation space of the environment
-
-RAM = 1#
+RAM = 1¶
Use RAM observations where you can see the memory of the game instead of the screen
@@ -369,12 +369,12 @@ Observations
-Multiplayer Environments#
+Multiplayer Environments¶
A small number of games support multiplayer. To use this feature, pass players=<n>
to retro.RetroEnv
. Here is an example random agent that controls both paddles in Pong-Atari2600
:
-import retro
+import retro
-def main():
+def main():
env = retro.make(game="Pong-Atari2600", players=2)
env.reset()
while True:
@@ -395,14 +395,14 @@ Multiplayer Environments
-Replay files#
+Replay files¶
Stable Retro can create .bk2 files which are recordings of an initial game state and a series of button presses. Because the emulators are deterministic, you will see the same output each time you play back this file. Because it only stores button presses, the file can be about 1000 times smaller than storing the full video.
In addition, if you wish to use the stored button presses for training, they may be useful. For example, there are replay files for each Sonic The Hedgehog level that were made available for the Stable Retro Contest.
You can create and view replay files using the The Integration UI (Game > Play Movie…). If you want to use replay files from Python, see the following sections.
-Record#
+Record¶
If you have an agent playing a game, you can record the gameplay to a .bk2
file for later processing:
-import retro
+import retro
env = retro.make(game='Airstriker-Genesis', record='.')
env.reset()
@@ -414,9 +414,9 @@ Record#
-Playback#
+Playback¶
Given a .bk2
file you can load it in python and either play it back or use the actions for training.
-import retro
+import retro
movie = retro.Movie('Airstriker-Genesis-Level1-000000.bk2')
movie.step()
@@ -441,7 +441,7 @@ Playback
-Render to Video#
+Render to Video¶
This requires ffmpeg to be installed and writes the output to the directory that the input file is located in.
python3 -m retro.scripts.playback_movie Airstriker-Genesis-Level1-000000.bk2
@@ -586,10 +586,62 @@ Render to Video
+
-
-
+
+
diff --git a/release_notes/index.html b/release_notes/index.html
index edd1be513..f03c58290 100644
--- a/release_notes/index.html
+++ b/release_notes/index.html
@@ -11,11 +11,11 @@
-
+
Release Notes - Stable-Retro Documentation
-
+
-
+
@@ -279,13 +279,64 @@
-Release Notes#
+Release Notes¶
-stable-retro v0.9.3#
-Released on 2024-01-12 - GitHub
-
+v0.9.3¶
+Released on 2025-01-17 - GitHub
+What's Changed
+
+- Updated installation instruction in README.md by @MatPoliquin in #74
+- Update GitHub link to correct repo by @seanpai96 in #75
+- Added player 2 fullstar variable to NHL941on1 data.json by @MatPoliquin in #76
+- Disable capnproto in UI CMakeLists.txt to fix link error when building integration tool by @MatPoliquin in #78
+- Add new state to NHL941on1 env by @MatPoliquin in #80
+- Py311 + Py312 support by @thatguy11325 in #79
+- Add new states to NHL941on1-Genesis env by @MatPoliquin in #81
+- Enable building Python 3.12 manylinux wheels by @mwydmuch in #82
+- Updated supported pythons in README.md by @MatPoliquin in #83
+- Update getting_started.md by @badfilms in #84
+- Added extra vars to NHL941on1 env data.json by @MatPoliquin in #85
+- Add set_value function to retro_env.py by @MatPoliquin in #86
+- NHL94 env data.json: fix p1_x variable addr and type by @MatPoliquin in #87
+- Added link to extra examples in README.md by @MatPoliquin in #88
+- Add Code of conduct file by @MatPoliquin in #89
+- Add funding yml by @MatPoliquin in #90
+- NHL941on1 env: Fix fullstar var ram address in data.json by @MatPoliquin in #92
+- Added stable-retro black and white logos by @MatPoliquin in #93
+- NHL94 env: fix bogus some bogus ram addresses in data.json by @MatPoliquin in #94
+- Added NHL942on2 env by @MatPoliquin in #95
+- NHL941on1 env: Added player velocities in data.json by @MatPoliquin in #96
+- Update logo by @MatPoliquin in #98
+- Integrate Farama Notifications by @MatPoliquin in #99
+- NHL942on2 env: Update data.json by @MatPoliquin in #102
+- Update init.py by @MatPoliquin in #103
+- NHL942on2 env: Update data.json by @MatPoliquin in #104
+- NHL942on2 env: Update data.json by @MatPoliquin in #105
+- Updated README.md,: added tutorial, fixed typos by @MatPoliquin in #106
+- Add gtag by @mgoulao in #109
+- Add dependabot.yml by @pseudo-rnd-thoughts in #114
+- Bump pypa/cibuildwheel from 2.15.0 to 2.20.0 by @dependabot in #119
+- Bump docker/setup-qemu-action from 2 to 3 by @dependabot in #116
+- Bump actions/setup-python from 4 to 5 by @dependabot in #118
+- Bump setuptools from 65.5.1 to 70.0.0 in /docker/linux/build_scripts by @dependabot in #110
+- Bump actions/download-artifact from 3 to 4 by @dependabot in #120
+- Bump pypa/cibuildwheel from 2.20.0 to 2.21.0 by @dependabot in #122
+- Bump pypa/cibuildwheel from 2.21.0 to 2.21.1 by @dependabot in #123
+- Fix build issues on Apple silicon M-series macs by @mode80 in #124
+- Bump pypa/cibuildwheel from 2.21.1 to 2.21.2 by @dependabot in #125
+- Update README.md by @MatPoliquin in #129
+- Fix pre-commit check errors by @MatPoliquin in #130
+
+New Contributors
+
+- @seanpai96 made their first contribution in #75
+- @thatguy11325 made their first contribution in #79
+- @badfilms made their first contribution in #84
+- @mode80 made their first contribution in #124
+
+Full Changelog: v0.9.2...v0.9.3
-stable-retro v0.9.2#
+stable-retro v0.9.2¶
Released on 2023-10-16 - GitHub
What's Changed
@@ -355,7 +406,7 @@ New Contributors
Full Changelog: v0.9.0...v0.9.2
-stable-retro v0.9.1#
+stable-retro v0.9.1¶
Released on 2023-08-10 - GitHub
What's Changed
@@ -462,7 +513,7 @@ New Contributors
- Release Notes
@@ -497,10 +548,62 @@
New Contributors
-
+
+
-
-
+
+
diff --git a/search/index.html b/search/index.html
index 4eb934581..e935d82ca 100644
--- a/search/index.html
+++ b/search/index.html
@@ -10,9 +10,9 @@
- Search - Stable-Retro Documentation
+ Search - Stable-Retro Documentation
-
+
@@ -340,10 +340,62 @@
-
+
+
-
-
+
+
diff --git a/searchindex.js b/searchindex.js
index 49adbb783..afedf44a3 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["404", "README", "developing", "getting_started", "index", "integration", "python", "release_notes"], "filenames": ["404.md", "README.md", "developing.md", "getting_started.md", "index.md", "integration.md", "python.md", "release_notes.md"], "titles": ["404 - Page Not Found", "Stable-retro docs", "Development", "Getting Started", "<no title>", "Game Integration", "Python API", "Release Notes"], "terms": {"thi": [1, 2, 3, 5, 6], "folder": [1, 5], "contain": [1, 2, 5, 6], "stableretro": 1, "If": [1, 2, 3, 5, 6], "you": [1, 2, 3, 4, 5, 6], "ar": [1, 3, 5, 6], "an": [1, 3, 4, 5, 6], "atari": [1, 4, 5], "pleas": [1, 3, 5], "follow": [1, 2, 5, 6], "below": [1, 5], "For": [1, 3, 5, 6], "more": [1, 3, 4, 5, 6], "inform": [1, 3, 5], "about": [1, 3, 5, 6], "how": [1, 5, 6], "contribut": [1, 7], "go": [1, 5], "our": 1, "md": [1, 7], "todo": 1, "add": [1, 2, 3, 5, 7], "detail": [1, 5], "instal": [1, 3, 6, 7], "requir": [1, 2, 3, 5, 6], "packag": [1, 2, 5], "your": [1, 2, 3, 5, 6], "fork": [1, 4], "pip": [1, 2, 7], "r": [1, 5], "txt": [1, 7], "To": [1, 2, 3, 5, 6], "onc": [1, 2, 3, 5], "cd": [1, 2, 7], "make": [1, 2, 3, 4, 5, 6], "dirhtml": 1, "rebuild": 1, "automat": 1, "everi": [1, 5], "time": [1, 5, 6], "chang": [1, 2, 3, 5, 7], "i": [1, 2, 3, 4, 5, 6], "made": [1, 6, 7], "sphinx": 1, "autobuild": 1, "b": 1, "_build": 1, "ad": [2, 5, 7], "new": [2, 3, 4, 7], "game": [2, 3, 4, 6], "can": [2, 3, 5, 6], "done": [2, 3, 6], "without": [2, 5], "recompil": 2, "stabl": [2, 3, 4, 5, 6], "need": [2, 5], "work": [2, 3, 5], "c": [2, 3, 7], "code": [2, 3, 5, 7], "want": [2, 3, 5, 6], "compil": [2, 5, 7], "least": 2, "either": [2, 5, 6], "gcc": 2, "5": [2, 5, 7], "clang": 2, "3": [2, 3, 4, 5, 6], "4": [2, 4, 5], "must": [2, 3], "first": [2, 4, 5, 7], "cmake": 2, "do": [2, 3, 5], "through": [2, 5], "manag": 2, "download": [2, 5], "offici": 2, "site": 2, "pip3": [2, 3], "re": [2, 5], "us": [2, 3, 4, 6, 7], "sure": [2, 3, 5], "tell": [2, 5], "itself": [2, 5], "system": [2, 3, 5], "path": [2, 3, 5], "sinc": [2, 5], "luajit": 2, "doe": [2, 5], "properli": [2, 3, 5], "lua": [2, 5], "1": [2, 3, 4, 5, 6], "homebrew": 2, "brew": 2, "pkg": 2, "config": [2, 4], "docker": [2, 7], "sudo": 2, "apt": 2, "get": [2, 5], "zlib1g": 2, "dev": 2, "git": [2, 7], "clone": 2, "http": 2, "github": [2, 3, 5, 7], "com": 2, "farama": [2, 7], "foundat": 2, "e": [2, 5], "run": [2, 3, 5], "build_window": 2, "bat": 2, "complet": [2, 5], "cp": 2, "copi": [2, 3, 5, 7], "whl": 2, "file": [2, 3, 7], "out": [2, 3, 5], "Then": [2, 5], "mai": [2, 5, 6], "after": [2, 3, 4, 5, 6], "instruct": 2, "platform": [2, 5], "note": [2, 3, 5], "mojav": 2, "10": [2, 3, 5, 7], "14": [2, 7], "librari": [2, 4], "commandlinetool": 2, "macos_sdk_headers_for_macos_10": 2, "capnp": 2, "qt5": 2, "dcmake_prefix_path": 2, "usr": 2, "local": [2, 5], "opt": 2, "qt": 2, "dbuild_ui": 2, "ON": 2, "upylib_directori": 2, "j": 2, "sysctl": 2, "hw": 2, "ncpu": 2, "cut": 2, "d": [2, 5], "f2": 2, "open": [2, 5], "gym": [2, 4, 6], "integr": [2, 6, 7], "app": 2, "capnproto": 2, "libcapnp": 2, "libqt5opengl5": 2, "qtbase5": 2, "grep": 2, "processor": 2, "proc": 2, "cpuinfo": 2, "The": [2, 3, 6], "current": [2, 3, 5], "support": [2, 3, 4, 6, 7], "nativ": [2, 5], "easili": [2, 5], "via": [2, 7], "wsl2": 2, "subsystem": 2, "abov": [2, 5], "within": [2, 5], "just": 2, "launch": 2, "binari": [2, 5], "like": [2, 3, 5], "would": [2, 5], "one": [3, 5], "version": [3, 5, 7], "python": 3, "6": [3, 5, 7], "appropri": [3, 5], "distribut": 3, "o": [3, 5], "beforehand": 3, "due": 3, "compat": 3, "issu": [3, 5], "some": [3, 5, 7], "core": [3, 7], "32": [3, 4, 5, 7], "bit": [3, 5], "oper": 3, "see": [3, 5, 6], "section": [3, 5, 6], "develop": 3, "build": [3, 7], "yourself": 3, "onli": [3, 5, 6], "now": [3, 6], "gymnasium": [3, 4, 5, 7], "env": [3, 4, 5, 6], "airstrik": [3, 4, 5, 6], "genesi": [3, 4, 5, 6], "ha": [3, 5], "non": [3, 5], "commerci": 3, "includ": [3, 4, 5, 6], "default": [3, 4, 5, 6, 7], "other": [3, 5], "obtain": 3, "them": [3, 5], "most": [3, 5, 6], "hash": [3, 5], "sourc": [3, 5, 6], "from": [3, 4, 6, 7], "respect": 3, "No": 3, "intro": 3, "sha": 3, "sum": [3, 5], "primarili": [3, 6], "mean": [3, 5], "train": [3, 4, 6], "rl": 3, "classic": [3, 4, 6], "video": [3, 4, 5], "though": [3, 5], "also": [3, 5, 6], "control": [3, 5, 6], "those": [3, 5], "here": [3, 4, 5, 6], "wai": [3, 5], "There": [3, 5, 6], "let": [3, 4, 5], "interfac": [3, 6], "python3": [3, 6], "m": [3, 6], "arrow": 3, "kei": [3, 5, 6], "x": 3, "ship": 3, "fire": [3, 5], "try": [3, 5], "api": [3, 5], "quit": 3, "basic": [3, 5], "advanc": [3, 5], "tool": [3, 7], "check": [3, 5, 7], "ui": [3, 6], "A": [3, 5, 6], "choos": 3, "action": [3, 4, 5], "each": [3, 5, 6], "timestep": 3, "look": [3, 5], "much": [3, 5, 6], "def": [3, 4, 5, 6], "main": [3, 4, 5, 6], "reset": [3, 4, 6], "while": [3, 5, 6], "true": [3, 6], "action_spac": [3, 6], "sampl": [3, 6], "observ": 3, "reward": [3, 7], "termin": [3, 4, 6], "truncat": [3, 4, 6], "info": [3, 4, 5, 6], "step": [3, 4, 5, 6], "render": 3, "close": [3, 6], "__name__": [3, 4, 5, 6], "__main__": [3, 4, 5, 6], "full": [3, 4, 5, 6, 7], "featur": [3, 6], "avail": [3, 5, 6], "dir": 3, "random_ag": 3, "It": [3, 5], "print": [3, 5], "exit": 3, "when": [3, 5, 7], "scenario": [3, 4, 6], "throw": 3, "except": [3, 5], "data": [3, 6, 7], "defin": [3, 5, 6], "set": [3, 5, 6], "up": [3, 5], "function": [3, 6], "isn": 3, "t": [3, 5], "too": [3, 5], "gener": 3, "simpl": [3, 5], "effect": [3, 5], "reinforc": [3, 4, 5], "learn": [3, 4, 5], "algorithm": [3, 5], "call": [3, 5], "revisit": 3, "arcad": 3, "machado": 3, "et": 3, "al": 3, "which": [3, 5, 6], "determinist": [3, 6], "easi": [3, 5], "implement": 3, "sequenc": 3, "button": [3, 5, 6], "press": [3, 6], "well": [3, 5, 6], "doesn": [3, 5], "screen": [3, 5, 6], "all": [3, 5, 6], "best": [3, 5], "seen": 3, "so": [3, 5, 6], "far": 3, "proxim": [3, 4], "polici": [3, 4], "optim": [3, 4], "schulman": 3, "plai": [3, 5, 6], "mani": [3, 5], "take": [3, 5], "awhil": [3, 5], "faster": 3, "gpu": 3, "baselin": [3, 4], "progress": [3, 5], "goe": [3, 5], "found": [3, 5], "spin": 3, "what": [3, 5, 7], "have": [3, 5, 6], "alreadi": 3, "been": [3, 5], "displai": [3, 5], "even": 3, "ones": 3, "miss": 3, "list_gam": [3, 5], "actual": [3, 5], "repo": 3, "correct": [3, 5], "comput": [3, 5], "identifi": 3, "directori": [3, 5, 6], "match": [3, 5, 7], "correspond": [3, 5], "type": 3, "list": [3, 4, 5, 6], "should": [3, 5], "collect": 3, "archiv": 3, "org": 3, "search": [3, 5], "insid": [3, 5], "zip": 3, "retro": [4, 5, 6], "maintain": 4, "openai": [4, 7], "": [4, 5, 6, 7], "turn": 4, "environ": [4, 5], "plateform": 4, "sega": [4, 5, 7], "32x": [4, 7], "super": [4, 5], "nintendo": [4, 5], "2600": [4, 5], "agent": [4, 5, 6], "import": [4, 5, 6], "argpars": 4, "numpi": 4, "np": 4, "wrapper": [4, 6], "time_limit": 4, "timelimit": 4, "stable_baselines3": 4, "ppo": 4, "common": 4, "atari_wrapp": 4, "cliprewardenv": 4, "warpfram": 4, "vec_env": 4, "subprocvecenv": 4, "vecframestack": 4, "vectransposeimag": 4, "class": [4, 6], "stochasticframeskip": 4, "__init__": 4, "self": 4, "n": [4, 5, 6], "stickprob": 4, "curac": 4, "none": [4, 6], "rng": 4, "random": [4, 6], "randomst": 4, "supports_want_rend": 4, "hasattr": 4, "kwarg": [4, 6], "return": [4, 5], "ac": 4, "fals": [4, 6], "totrew": 4, "0": [4, 5, 6, 7], "rang": [4, 6], "substep": 4, "delai": 4, "probabl": [4, 5], "elif": 4, "rand": 4, "second": 4, "definit": 4, "kick": 4, "ob": [4, 6], "rew": [4, 6], "want_rend": 4, "els": 4, "break": [4, 6], "make_retro": 4, "state": [4, 6], "max_episode_step": 4, "4500": 4, "25": [4, 7], "wrap_deepmind_retro": 4, "configur": 4, "similar": [4, 5], "deepmind": 4, "style": [4, 7], "wrap_deepmind": 4, "parser": 4, "argumentpars": 4, "add_argu": 4, "arg": 4, "parse_arg": 4, "make_env": 4, "venv": 4, "8": [4, 5, 6], "n_stack": 4, "model": 4, "cnnpolici": 4, "learning_r": 4, "lambda": 4, "f": 4, "2": [4, 5, 6], "5e": 4, "n_step": 4, "128": [4, 5], "batch_siz": 4, "n_epoch": 4, "gamma": 4, "99": 4, "gae_lambda": 4, "95": 4, "clip_rang": 4, "ent_coef": 4, "01": [4, 7], "verbos": 4, "total_timestep": 4, "100_000_000": 4, "log_interv": 4, "thing": 5, "start": [5, 6], "abl": 5, "ll": 5, "savest": [5, 6], "begin": 5, "restart": [5, 6], "put": 5, "point": 5, "relat": 5, "base": 5, "memori": [5, 6], "address": 5, "gameov": 5, "16712294": 5, "u2": 5, "live": 5, "16712282": 5, "score": 5, "16712270": 5, "u4": 5, "op": 5, "equal": 5, "refer": 5, "zero": 5, "specifi": [5, 6], "user": [5, 6], "miscellan": 5, "debug": [5, 7], "default_st": 5, "whitelist": 5, "suspici": 5, "few": [5, 6], "sha1": 5, "c67af162391fff4a63432be5a156eb9ca7b4da5a": 5, "These": 5, "next": 5, "describ": 5, "emul": [5, 6, 7], "allow": [5, 6], "entir": 5, "store": [5, 6], "disk": 5, "restor": 5, "specif": 5, "alwai": 5, "end": 5, "ident": 5, "standalon": 5, "gzip": 5, "inner": 5, "alongsid": 5, "name": [5, 6], "document": 5, "ground": 5, "truth": 5, "format": 5, "manifest": 5, "separ": 5, "although": 5, "entri": 5, "consist": [5, 6], "valu": [5, 6], "ram": [5, 6], "arrai": 5, "byte": 5, "descriptor": 5, "addendum": 5, "show": [5, 6], "wide": 5, "unsign": 5, "big": 5, "endian": 5, "possibl": [5, 6], "pertain": 5, "manual": 5, "overrid": 5, "retroenv": 5, "write": [5, 6], "multipli": 5, "posit": [5, 7], "penalti": 5, "neg": 5, "creat": [5, 6], "similarli": 5, "over": 5, "By": 5, "load": [5, 6], "altern": 5, "constructor": 5, "again": [5, 7], "calcul": 5, "split": 5, "subsect": 5, "coeffici": 5, "extract": 5, "measur": 5, "delta": 5, "pass": [5, 6], "raw": 5, "impli": 5, "addit": [5, 6], "instead": [5, 6], "subtract": 5, "off": 5, "taken": 5, "two": [5, 7], "reach": 5, "At": 5, "top": [5, 6], "level": [5, 6], "properti": 5, "combin": 5, "ani": [5, 6], "fulfil": 5, "per": 5, "absolut": 5, "ignor": 5, "help": 5, "normal": 5, "window": [5, 7], "mac": 5, "howev": 5, "url": 5, "longer": 5, "releas": 5, "command": 5, "shift": 5, "select": 5, "menu": 5, "option": 5, "mode": 5, "charact": 5, "etc": 5, "final": 5, "playabl": 5, "moment": 5, "paus": 5, "p": [5, 6], "save": 5, "hard": 5, "might": 5, "back": [5, 6], "exact": 5, "chose": 5, "previou": 5, "g": 5, "sailormoon": 5, "queenberylscastl": 5, "we": 5, "prefer": 5, "usa": 5, "denot": 5, "europ": 5, "japan": 5, "bin": 5, "extens": [5, 7], "renam": [5, 7], "applic": 5, "uniqu": 5, "given": [5, 6], "known": 5, "mega": 5, "drive": 5, "sfc": 5, "entertain": 5, "famicom": 5, "ne": 5, "a26": 5, "gb": 5, "boi": 5, "gba": 5, "gbc": 5, "color": 5, "gg": 5, "gear": 5, "pce": 5, "nec": 5, "turbografx": 5, "16": [5, 6, 7], "pc": 5, "engin": 5, "sm": 5, "master": 5, "sometim": 5, "differ": [5, 6], "gen": 5, "aforement": 5, "case": [5, 7], "know": 5, "session": 5, "provid": [5, 6], "numer": 5, "goal": 5, "machin": 5, "maxim": 5, "player": [5, 6], "remain": [5, 6], "hit": 5, "instanc": 5, "dy": 5, "modifi": 5, "disallow": 5, "kidchameleon": 5, "usual": 5, "easier": 5, "continu": 5, "left": 5, "pretti": 5, "better": 5, "reliabl": 5, "slightli": 5, "incorrect": 5, "still": 5, "life": 5, "becaus": [5, 6], "detect": 5, "than": [5, 6], "unreli": 5, "present": 5, "incorrectli": 5, "switch": 5, "test": [5, 7], "replai": 5, "multipl": 5, "row": 5, "accident": 5, "ideal": 5, "beat": 5, "besid": 5, "That": 5, "impract": 5, "exist": 5, "unabl": 5, "result": 5, "often": [5, 6], "good": 5, "choic": 5, "In": [5, 6], "stand": 5, "place": 5, "attack": 5, "same": [5, 6], "enemi": 5, "respawn": 5, "veri": 5, "Be": 5, "care": 5, "thei": [5, 6], "tricki": 5, "right": 5, "sens": 5, "receiv": 5, "factor": 5, "100": 5, "compar": 5, "cumul": 5, "pane": 5, "keep": 5, "pattern": 5, "tip": 5, "group": 5, "themselv": 5, "togeth": 5, "narrow": 5, "down": 5, "particular": 5, "nearbi": 5, "suspect": 5, "high": 5, "occasion": 5, "individu": 5, "123400": 5, "updat": [5, 7], "broken": [5, 7], "digit": 5, "bob": 5, "sne": 5, "number": [5, 6], "across": 5, "frame": 5, "script": [5, 6], "1942": 5, "uncommon": 5, "length": 5, "don": 5, "nice": 5, "neat": 5, "short": 5, "certain": 5, "track": 5, "long": 5, "suddenli": 5, "jump": 5, "between": 5, "decid": 5, "shorter": 5, "safer": 5, "bet": 5, "sai": 5, "2400": 5, "24": 5, "transpos": 5, "123456": 5, "012345": 5, "rather": 5, "fix": [5, 7], "health": 5, "symbol": 5, "bar": 5, "could": 5, "repres": 5, "9999999": 5, "becom": 5, "99999": 5, "lose": 5, "unit": 5, "And": 5, "consecut": 5, "ve": 5, "avoid": 5, "later": [5, 6], "One": 5, "correctli": 5, "d2": 5, "d4": 5, "maximum": 5, "9999": 5, "increas": 5, "viewer": 5, "10000": 5, "wrong": 5, "d3": 5, "999999": 5, "watch": 5, "increment": 5, "decrement": 5, "255": 5, "sign": 5, "u": 5, "appear": [5, 6], "16769105": 5, "i2": 5, "littl": 5, "notic": 5, "uneven": 5, "unusu": 5, "eg": 5, "u1": 5, "7e094d": 5, "144": 5, "137": 5, "d1": 5, "90": 5, "89": 5, "higher": 5, "reveal": 5, "didn": 5, "origin": 5, "until": 5, "someth": 5, "give": 5, "larg": 5, "die": 5, "upon": 5, "unless": 5, "befor": 5, "happen": 5, "forgot": 5, "upper": 5, "lower": 5, "kill": 5, "bug": [5, 7], "diverg": 5, "guardianlegend": 5, "custom_integr": 5, "structur": 5, "depend": 5, "addamsfamili": 5, "atari2600": [5, 6, 7], "adventur": 5, "gameboi": 5, "aerostar": 5, "gbadvanc": 5, "mariokart": 5, "gbcolor": 5, "pokemonpinbal": 5, "gamegear": 5, "mortalkombat": 5, "pcengin": 5, "soldierblad": 5, "add_custom_path": 5, "script_dir": 5, "dirnam": 5, "abspath": 5, "__file__": 5, "join": 5, "fakegam": 5, "inttyp": [5, 6], "directli": [5, 6], "three": 5, "part": 5, "order": 5, "hex": 5, "string": [5, 6], "0x01020304": 5, "0x01": 5, "0x02": 5, "0x03": 5, "0x04": 5, "middl": 5, "outsid": 5, "sigil": 5, "singl": 5, "nb": 5, "rare": 5, "plu": 5, "gx": 5, "thu": 5, "aka": 5, "As": 5, "groom": 5, "0x81": 5, "decim": 5, "129": 5, "127": 5, "81": 5, "low": 5, "nybbl": 5, "0xa": 5, "0xf": 5, "cannot": 5, "occur": 5, "last": 5, "piec": 5, "occupi": 5, "power": [5, 6], "mario": 5, "bro": 5, "size": 5, "less": 5, "0x0102": 5, "four": 5, "1234": 5, "0x12": 5, "0x34": 5, "u3": 5, "0x010203": 5, "0x1": 5, "n2": 5, "12": [5, 7], "intel": 5, "arm": 5, "cpu": 5, "powerpc": 5, "valid": 5, "recommend": 5, "undefin": 5, "invalid": 5, "q2": 5, "i0": 5, "variou": 5, "vari": 5, "form": 5, "premis": 5, "transform": 5, "furthermor": 5, "method": 5, "context": 5, "appli": 5, "nonzero": 5, "otherwis": 5, "greater": 5, "enum": 6, "use_restricted_act": 6, "filter": 6, "obs_typ": 6, "imag": 6, "render_mod": 6, "human": 6, "metadata": 6, "json": [6, 7], "initi": 6, "consol": 6, "special": 6, "space": 6, "multibinari": 6, "discret": 6, "multi_discret": 6, "multidiscet": 6, "own": 6, "deriv": 6, "exampl": [6, 7], "py": [6, 7], "custom": 6, "reduc": 6, "126": 6, "7": [6, 7], "rgb": 6, "view": 6, "smaller": 6, "variabl": 6, "dict": 6, "where": 6, "small": 6, "both": 6, "paddl": 6, "pong": [6, 7], "bottom": 6, "half": 6, "player_1_rew": 6, "player_2_rew": 6, "bk2": 6, "seri": 6, "output": 6, "1000": 6, "wish": 6, "sonic": 6, "hedgehog": 6, "were": 6, "contest": 6, "movi": 6, "gameplai": 6, "process": 6, "_": 6, "level1": 6, "000000": 6, "get_gam": 6, "everyth": 6, "initial_st": 6, "get_stat": 6, "num_button": 6, "append": 6, "get_kei": 6, "ffmpeg": 6, "input": 6, "locat": 6, "playback_movi": [6, 7], "2024": 7, "2023": 7, "ci": 7, "zbeucler2018": 7, "pseudo": 7, "rnd": 7, "thought": 7, "onaclov2000": 7, "remov": 7, "travi": 7, "setup": 7, "11": 7, "capabl": 7, "15": 7, "readm": 7, "matpoliquin": 7, "17": 7, "gcp": 7, "20": 7, "link": 7, "websit": 7, "23": 7, "doc": 7, "mgoulao": 7, "27": 7, "28": 7, "extra": 7, "18": 7, "duplic": 7, "30": 7, "publish": 7, "linux": 7, "31": 7, "appl": 7, "silicon": 7, "34": 7, "cmakelist": 7, "libzip": 7, "35": 7, "moonpatrol": 7, "36": 7, "pre": 7, "commit": 7, "hook": 7, "victorsevero": 7, "38": 7, "37": 7, "badg": 7, "elliottow": 7, "43": 7, "45": 7, "placehold": 7, "logo": 7, "screenshot": 7, "47": 7, "260": 7, "joohei": 7, "46": 7, "handl": 7, "log": 7, "48": 7, "saturn": 7, "virtua": 7, "fighter": 7, "49": 7, "whitespac": 7, "50": 7, "bump": 7, "setuptool": 7, "40": 7, "65": 7, "build_script": 7, "dependabot": 7, "39": 7, "21": 7, "41": 7, "certifi": 7, "2018": 7, "2022": 7, "42": 7, "wheel": 7, "adapt": 7, "yml": 7, "pettingzoo": 7, "workflow": 7, "51": 7, "52": 7, "54": 7, "53": 7, "mortal": 7, "kombat": 7, "55": 7, "58": 7, "cmd": 7, "line": 7, "59": 7, "disabl": 7, "multi": 7, "retro_env": 7, "61": 7, "misc": 7, "62": 7, "checker": 7, "63": 7, "nhl941on1": 7, "star": 7, "66": 7, "temp": 7, "segment": 7, "fault": 7, "67": 7, "typo": 7, "68": 7, "69": 7, "package_data": 7, "71": 7, "buld": 7, "manylinux": 7, "cibuildwheel": 7, "mwydmuch": 7, "73": 7, "contributor": 7, "changelog": 7, "08": 7}, "objects": {"retro": [[6, 0, 1, "", "Actions"], [6, 0, 1, "", "Observations"], [6, 0, 1, "", "RetroEnv"], [6, 0, 1, "", "State"], [6, 2, 1, "", "make"]], "retro.Actions": [[6, 1, 1, "", "ALL"], [6, 1, 1, "", "DISCRETE"], [6, 1, 1, "", "MULTI_DISCRETE"]], "retro.Observations": [[6, 1, 1, "", "IMAGE"], [6, 1, 1, "", "RAM"]], "retro.State": [[6, 1, 1, "", "DEFAULT"], [6, 1, 1, "", "NONE"]]}, "objtypes": {"0": "py:class", "1": "py:attribute", "2": "py:function"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "attribute", "Python attribute"], "2": ["py", "function", "Python function"]}, "titleterms": {"404": 0, "page": [0, 1], "Not": 0, "found": 0, "The": [0, 5], "request": 0, "could": 0, "stabl": [1, 7], "retro": [1, 2, 3, 7], "doc": 1, "instruct": 1, "modifi": 1, "environ": [1, 3, 6], "build": [1, 2], "document": 1, "develop": 2, "instal": 2, "from": [2, 5], "sourc": 2, "prerequisit": 2, "mac": 2, "window": 2, "linux": 2, "ui": [2, 5], "maco": 2, "get": 3, "start": 3, "creat": 3, "exampl": [3, 5], "usag": 3, "interact": 3, "script": 3, "random": 3, "agent": 3, "brute": 3, "ppo": 3, "integr": [3, 5], "import": 3, "rom": [3, 5], "game": 5, "level1": 5, "state": 5, "data": 5, "json": 5, "scenario": 5, "metadata": 5, "md": 5, "sha": 5, "file": [5, 6], "variabl": 5, "locat": 5, "new": 5, "support": 5, "type": 5, "done": 5, "condit": 5, "reward": 5, "function": 5, "find": 5, "common": 5, "error": 5, "us": 5, "custom": 5, "python": [5, 6], "appendix": 5, "oper": 5, "api": 6, "retroenv": 6, "action": 6, "observ": 6, "multiplay": 6, "replai": 6, "record": 6, "playback": 6, "render": 6, "video": 6, "releas": 7, "note": 7, "v0": 7, "9": 7, "3": 7, "2": 7, "1": 7}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"404 - Page Not Found": [[0, "page-not-found"]], "The requested page could not be found.": [[0, "the-requested-page-could-not-be-found"]], "Stable-retro docs": [[1, "stable-retro-docs"]], "Instructions for modifying environment pages": [[1, "instructions-for-modifying-environment-pages"]], "Build the Documentation": [[1, "build-the-documentation"]], "Development": [[2, "development"]], "Install Retro from source": [[2, "install-retro-from-source"]], "Prerequisites": [[2, "prerequisites"]], "Mac prerequisites": [[2, "mac-prerequisites"]], "Windows prerequisites": [[2, "windows-prerequisites"]], "Linux prerequisites": [[2, "linux-prerequisites"]], "Building Linux and Mac": [[2, "building-linux-and-mac"]], "Building Windows": [[2, "building-windows"]], "Install Retro UI from source": [[2, "install-retro-ui-from-source"]], "macOS": [[2, "macos"]], "Linux": [[2, "linux"]], "Windows": [[2, "windows"]], "Getting Started": [[3, "getting-started"]], "Create a Retro Environment": [[3, "create-a-retro-environment"]], "Example Usage": [[3, "example-usage"]], "Interactive Script": [[3, "interactive-script"]], "Random Agent": [[3, "random-agent"]], "Brute": [[3, "brute"]], "PPO": [[3, "ppo"]], "Integrations": [[3, "integrations"]], "Importing ROMs": [[3, "importing-roms"]], "Game Integration": [[5, "game-integration"]], "Example Integration": [[5, "example-integration"]], "Level1.state": [[5, "level1-state"]], "data.json": [[5, "data-json"]], "scenario.json": [[5, "scenario-json"]], "metadata.json": [[5, "metadata-json"]], "rom.md": [[5, "rom-md"]], "rom.sha": [[5, "rom-sha"]], "Integration Files": [[5, "integration-files"]], "States": [[5, "states"]], "Variable Locations data.json": [[5, "variable-locations-data-json"]], "Scenario scenario.json": [[5, "scenario-scenario-json"]], "The Integration UI": [[5, "the-integration-ui"]], "Integrating a new ROM": [[5, "integrating-a-new-rom"]], "Supported ROM Types": [[5, "supported-rom-types"]], "Integrating a Game": [[5, "integrating-a-game"]], "Done Condition": [[5, "done-condition"]], "Reward Function": [[5, "reward-function"]], "Finding Variables": [[5, "finding-variables"]], "Common Errors": [[5, "common-errors"]], "Using a Custom Integration from Python": [[5, "using-a-custom-integration-from-python"]], "Appendix: Types": [[5, "appendix-types"]], "Appendix: Operations": [[5, "appendix-operations"]], "Python API": [[6, "python-api"]], "RetroEnv": [[6, "retroenv"]], "Actions": [[6, "actions"]], "Observations": [[6, "observations"]], "Multiplayer Environments": [[6, "multiplayer-environments"]], "Replay files": [[6, "replay-files"]], "Record": [[6, "record"]], "Playback": [[6, "playback"]], "Render to Video": [[6, "render-to-video"]], "Release Notes": [[7, "release-notes"]], "stable-retro v0.9.3": [[7, "release-v0-9-3"]], "stable-retro v0.9.2": [[7, "release-v0-9-2"]], "stable-retro v0.9.1": [[7, "release-v0-9-1"]]}, "indexentries": {"all (retro.actions attribute)": [[6, "retro.Actions.ALL"]], "actions (class in retro)": [[6, "retro.Actions"]], "default (retro.state attribute)": [[6, "retro.State.DEFAULT"]], "discrete (retro.actions attribute)": [[6, "retro.Actions.DISCRETE"]], "image (retro.observations attribute)": [[6, "retro.Observations.IMAGE"]], "multi_discrete (retro.actions attribute)": [[6, "retro.Actions.MULTI_DISCRETE"]], "none (retro.state attribute)": [[6, "retro.State.NONE"]], "observations (class in retro)": [[6, "retro.Observations"]], "ram (retro.observations attribute)": [[6, "retro.Observations.RAM"]], "retroenv (class in retro)": [[6, "retro.RetroEnv"]], "state (class in retro)": [[6, "retro.State"]], "make() (in module retro)": [[6, "retro.make"]]}})
\ No newline at end of file
+Search.setIndex({"alltitles": {"404 - Page Not Found": [[0, null]], "Actions": [[6, "actions"]], "Appendix: Operations": [[5, "appendix-operations"]], "Appendix: Types": [[5, "appendix-types"]], "Brute": [[3, "brute"]], "Build the Documentation": [[1, "build-the-documentation"]], "Building Linux and Mac": [[2, "building-linux-and-mac"]], "Building Windows": [[2, "building-windows"]], "Common Errors": [[5, "common-errors"]], "Create a Retro Environment": [[3, "create-a-retro-environment"]], "Development": [[2, null]], "Done Condition": [[5, "done-condition"]], "Example Integration": [[5, "example-integration"]], "Example Usage": [[3, "example-usage"]], "Finding Variables": [[5, "finding-variables"]], "Game Integration": [[5, null]], "Getting Started": [[3, null]], "Importing ROMs": [[3, "importing-roms"]], "Install Retro UI from source": [[2, "install-retro-ui-from-source"]], "Install Retro from source": [[2, "install-retro-from-source"]], "Instructions for modifying environment pages": [[1, "instructions-for-modifying-environment-pages"]], "Integrating a Game": [[5, "integrating-a-game"]], "Integrating a new ROM": [[5, "integrating-a-new-rom"]], "Integration Files": [[5, "integration-files"]], "Integrations": [[3, "integrations"]], "Interactive Script": [[3, "interactive-script"]], "Level1.state": [[5, "level1-state"]], "Linux": [[2, "linux"]], "Linux prerequisites": [[2, "linux-prerequisites"]], "Mac prerequisites": [[2, "mac-prerequisites"]], "Multiplayer Environments": [[6, "multiplayer-environments"]], "Observations": [[6, "observations"]], "PPO": [[3, "ppo"]], "Playback": [[6, "playback"]], "Prerequisites": [[2, "prerequisites"]], "Python API": [[6, null]], "Random Agent": [[3, "random-agent"]], "Record": [[6, "record"]], "Release Notes": [[7, null]], "Render to Video": [[6, "render-to-video"]], "Replay files": [[6, "replay-files"]], "RetroEnv": [[6, "retroenv"]], "Reward Function": [[5, "reward-function"]], "Scenario scenario.json": [[5, "scenario-scenario-json"]], "Stable-retro docs": [[1, null]], "States": [[5, "states"]], "Supported ROM Types": [[5, "supported-rom-types"]], "The Integration UI": [[5, "the-integration-ui"]], "The requested page could not be found.": [[0, "the-requested-page-could-not-be-found"]], "Using a Custom Integration from Python": [[5, "using-a-custom-integration-from-python"]], "Variable Locations data.json": [[5, "variable-locations-data-json"]], "Windows": [[2, "windows"]], "Windows prerequisites": [[2, "windows-prerequisites"]], "data.json": [[5, "data-json"]], "macOS": [[2, "macos"]], "metadata.json": [[5, "metadata-json"]], "rom.md": [[5, "rom-md"]], "rom.sha": [[5, "rom-sha"]], "scenario.json": [[5, "scenario-json"]], "stable-retro v0.9.1": [[7, "release-v0-9-1"]], "stable-retro v0.9.2": [[7, "release-v0-9-2"]], "v0.9.3": [[7, "release-v0-9-3"]]}, "docnames": ["404", "README", "developing", "getting_started", "index", "integration", "python", "release_notes"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1}, "filenames": ["404.md", "README.md", "developing.md", "getting_started.md", "index.md", "integration.md", "python.md", "release_notes.md"], "indexentries": {"actions (class in retro)": [[6, "retro.Actions", false]], "all (retro.actions attribute)": [[6, "retro.Actions.ALL", false]], "default (retro.state attribute)": [[6, "retro.State.DEFAULT", false]], "discrete (retro.actions attribute)": [[6, "retro.Actions.DISCRETE", false]], "image (retro.observations attribute)": [[6, "retro.Observations.IMAGE", false]], "make() (in module retro)": [[6, "retro.make", false]], "multi_discrete (retro.actions attribute)": [[6, "retro.Actions.MULTI_DISCRETE", false]], "none (retro.state attribute)": [[6, "retro.State.NONE", false]], "observations (class in retro)": [[6, "retro.Observations", false]], "ram (retro.observations attribute)": [[6, "retro.Observations.RAM", false]], "retroenv (class in retro)": [[6, "retro.RetroEnv", false]], "state (class in retro)": [[6, "retro.State", false]]}, "objects": {"retro": [[6, 0, 1, "", "Actions"], [6, 0, 1, "", "Observations"], [6, 0, 1, "", "RetroEnv"], [6, 0, 1, "", "State"], [6, 2, 1, "", "make"]], "retro.Actions": [[6, 1, 1, "", "ALL"], [6, 1, 1, "", "DISCRETE"], [6, 1, 1, "", "MULTI_DISCRETE"]], "retro.Observations": [[6, 1, 1, "", "IMAGE"], [6, 1, 1, "", "RAM"]], "retro.State": [[6, 1, 1, "", "DEFAULT"], [6, 1, 1, "", "NONE"]]}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "attribute", "Python attribute"], "2": ["py", "function", "Python function"]}, "objtypes": {"0": "py:class", "1": "py:attribute", "2": "py:function"}, "terms": {"": [4, 5, 6, 7], "0": [4, 5, 6, 7], "000000": 6, "01": [4, 7], "012345": 5, "08": 7, "0x01": 5, "0x0102": 5, "0x010203": 5, "0x01020304": 5, "0x02": 5, "0x03": 5, "0x04": 5, "0x1": 5, "0x12": 5, "0x34": 5, "0x81": 5, "0xa": 5, "0xf": 5, "1": [2, 3, 4, 5, 6], "10": [2, 3, 5, 7], "100": 5, "1000": 6, "10000": 5, "100_000_000": 4, "102": 7, "103": 7, "104": 7, "105": 7, "106": 7, "109": 7, "11": 7, "110": 7, "114": 7, "116": 7, "118": 7, "119": 7, "12": [5, 7], "120": 7, "122": 7, "123": 7, "1234": 5, "123400": 5, "123456": 5, "124": 7, "125": 7, "126": 6, "127": 5, "128": [4, 5], "129": [5, 7], "130": 7, "137": 5, "14": [2, 7], "144": 5, "15": 7, "16": [5, 6, 7], "16712270": 5, "16712282": 5, "16712294": 5, "16769105": 5, "17": 7, "18": 7, "1942": 5, "2": [4, 5, 6], "20": 7, "2018": 7, "2022": 7, "2023": 7, "2025": 7, "21": 7, "23": 7, "24": 5, "2400": 5, "25": [4, 7], "255": 5, "260": 7, "2600": [4, 5], "27": 7, "28": 7, "3": [2, 3, 4, 5, 6], "30": 7, "31": 7, "32": [3, 4, 5, 7], "32x": [4, 7], "34": 7, "35": 7, "36": 7, "37": 7, "38": 7, "39": 7, "4": [2, 4, 5, 7], "40": 7, "41": 7, "42": 7, "43": 7, "45": 7, "4500": 4, "46": 7, "47": 7, "48": 7, "49": 7, "5": [2, 5, 7], "50": 7, "51": 7, "52": 7, "53": 7, "54": 7, "55": 7, "58": 7, "59": 7, "5e": 4, "6": [3, 5, 7], "61": 7, "62": 7, "63": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "7": [6, 7], "70": 7, "71": 7, "73": 7, "74": 7, "75": 7, "76": 7, "78": 7, "79": 7, "7e094d": 5, "8": [4, 5, 6], "80": 7, "81": [5, 7], "82": 7, "83": 7, "84": 7, "85": 7, "86": 7, "87": 7, "88": 7, "89": [5, 7], "90": [5, 7], "92": 7, "93": 7, "94": 7, "95": [4, 7], "96": 7, "98": 7, "99": [4, 7], "9999": 5, "99999": 5, "999999": 5, "9999999": 5, "A": [3, 5, 6], "And": 5, "As": 5, "At": 5, "Be": 5, "By": 5, "For": [1, 3, 5, 6], "If": [1, 2, 3, 5, 6], "In": [5, 6], "It": [3, 5], "No": 3, "ON": 2, "One": 5, "That": 5, "The": [2, 3, 6], "Then": [2, 5], "There": [3, 5, 6], "These": 5, "To": [1, 2, 3, 5, 6], "_": 6, "__file__": 5, "__init__": 4, "__main__": [3, 4, 5, 6], "__name__": [3, 4, 5, 6], "_build": 1, "a26": 5, "abl": 5, "about": [1, 3, 5, 6], "abov": [2, 5], "absolut": 5, "abspath": 5, "ac": 4, "accident": 5, "across": 5, "action": [3, 4, 5, 7], "action_spac": [3, 6], "actual": [3, 5], "ad": [2, 5, 7], "adapt": 7, "add": [1, 2, 3, 5, 7], "add_argu": 4, "add_custom_path": 5, "addamsfamili": 5, "addendum": 5, "addit": [5, 6], "addr": 7, "address": [5, 7], "advanc": [3, 5], "adventur": 5, "aerostar": 5, "aforement": 5, "after": [2, 3, 4, 5, 6], "again": [5, 7], "agent": [4, 5, 6], "airstrik": [3, 4, 5, 6], "aka": 5, "al": 3, "algorithm": [3, 5], "all": [3, 5, 6], "allow": [5, 6], "alongsid": 5, "alreadi": 3, "also": [3, 5, 6], "altern": 5, "although": 5, "alwai": 5, "an": [1, 3, 4, 5, 6], "ani": [5, 6], "api": [3, 5], "app": 2, "appear": [5, 6], "append": 6, "appl": 7, "appli": 5, "applic": 5, "appropri": [3, 5], "apt": 2, "ar": [1, 3, 5, 6], "arcad": 3, "archiv": 3, "arg": 4, "argpars": 4, "argumentpars": 4, "arm": 5, "arrai": 5, "arrow": 3, "artifact": 7, "atari": [1, 4, 5], "atari2600": [5, 6, 7], "atari_wrapp": 4, "attack": 5, "autobuild": 1, "automat": 1, "avail": [3, 5, 6], "avoid": 5, "awhil": [3, 5], "b": 1, "back": [5, 6], "badfilm": 7, "badg": 7, "bar": 5, "base": 5, "baselin": [3, 4], "basic": [3, 5], "bat": 2, "batch_siz": 4, "beat": 5, "becaus": [5, 6], "becom": 5, "been": [3, 5], "befor": 5, "beforehand": 3, "begin": 5, "below": [1, 5], "besid": 5, "best": [3, 5], "bet": 5, "better": 5, "between": 5, "big": 5, "bin": 5, "binari": [2, 5], "bit": [3, 5], "bk2": 6, "black": 7, "bob": 5, "bogu": 7, "boi": 5, "both": 6, "bottom": 6, "break": [4, 6], "brew": 2, "bro": 5, "broken": [5, 7], "bug": [5, 7], "build": [3, 7], "build_script": 7, "build_window": 2, "buld": 7, "bump": 7, "button": [3, 5, 6], "byte": 5, "c": [2, 3, 7], "c67af162391fff4a63432be5a156eb9ca7b4da5a": 5, "calcul": 5, "call": [3, 5], "can": [2, 3, 5, 6], "cannot": 5, "capabl": 7, "capnp": 2, "capnproto": [2, 7], "care": 5, "case": [5, 7], "cd": [1, 2, 7], "certain": 5, "certifi": 7, "chang": [1, 2, 3, 5, 7], "changelog": 7, "charact": 5, "check": [3, 5, 7], "checker": 7, "choic": 5, "choos": 3, "chose": 5, "ci": 7, "cibuildwheel": 7, "clang": 2, "class": [4, 6], "classic": [3, 4, 6], "clip_rang": 4, "cliprewardenv": 4, "clone": 2, "close": [3, 6], "cmake": 2, "cmakelist": 7, "cmd": 7, "cnnpolici": 4, "code": [2, 3, 5, 7], "coeffici": 5, "collect": 3, "color": 5, "com": 2, "combin": 5, "command": 5, "commandlinetool": 2, "commerci": 3, "commit": 7, "common": 4, "compar": 5, "compat": 3, "compil": [2, 5, 7], "complet": [2, 5], "comput": [3, 5], "conduct": 7, "config": [2, 4], "configur": 4, "consecut": 5, "consist": [5, 6], "consol": 6, "constructor": 5, "contain": [1, 2, 5, 6], "contest": 6, "context": 5, "continu": 5, "contribut": [1, 7], "contributor": 7, "control": [3, 5, 6], "copi": [2, 3, 5, 7], "core": [3, 7], "correct": [3, 5, 7], "correctli": 5, "correspond": [3, 5], "could": 5, "cp": 2, "cpu": 5, "cpuinfo": 2, "creat": [5, 6], "cumul": 5, "curac": 4, "current": [2, 3, 5], "custom": 6, "custom_integr": 5, "cut": 2, "d": [2, 5], "d1": 5, "d2": 5, "d3": 5, "d4": 5, "data": [3, 6, 7], "dbuild_ui": 2, "dcmake_prefix_path": 2, "debug": [5, 7], "decid": 5, "decim": 5, "decrement": 5, "deepmind": 4, "def": [3, 4, 5, 6], "default": [3, 4, 5, 6, 7], "default_st": 5, "defin": [3, 5, 6], "definit": 4, "delai": 4, "delta": 5, "denot": 5, "depend": 5, "dependabot": 7, "deriv": 6, "describ": 5, "descriptor": 5, "detail": [1, 5], "detect": 5, "determinist": [3, 6], "dev": 2, "develop": 3, "dict": 6, "didn": 5, "die": 5, "differ": [5, 6], "digit": 5, "dir": 3, "directli": [5, 6], "directori": [3, 5, 6], "dirhtml": 1, "dirnam": 5, "disabl": 7, "disallow": 5, "discret": 6, "disk": 5, "displai": [3, 5], "distribut": 3, "diverg": 5, "do": [2, 3, 5], "doc": 7, "docker": [2, 7], "document": 5, "doe": [2, 5], "doesn": [3, 5], "don": 5, "done": [2, 3, 6], "down": 5, "download": [2, 5, 7], "drive": 5, "due": 3, "duplic": 7, "dy": 5, "e": [2, 5], "each": [3, 5, 6], "easi": [3, 5], "easier": 5, "easili": [2, 5], "effect": [3, 5], "eg": 5, "either": [2, 5, 6], "elif": 4, "elliottow": 7, "els": 4, "emul": [5, 6, 7], "enabl": 7, "end": 5, "endian": 5, "enemi": 5, "engin": 5, "ent_coef": 4, "entertain": 5, "entir": 5, "entri": 5, "enum": 6, "env": [3, 4, 5, 6, 7], "environ": [4, 5], "equal": 5, "error": 7, "et": 3, "etc": 5, "europ": 5, "even": 3, "everi": [1, 5], "everyth": 6, "exact": 5, "exampl": [6, 7], "except": [3, 5], "exist": 5, "exit": 3, "extens": [5, 7], "extra": 7, "extract": 5, "f": 4, "f2": 2, "factor": 5, "fakegam": 5, "fals": [4, 6], "famicom": 5, "far": 3, "farama": [2, 7], "faster": 3, "fault": 7, "featur": [3, 6], "few": [5, 6], "ffmpeg": 6, "fighter": 7, "file": [2, 3, 7], "filter": 6, "final": 5, "fire": [3, 5], "first": [2, 4, 5, 7], "fix": [5, 7], "folder": [1, 5], "follow": [1, 2, 5, 6], "forgot": 5, "fork": [1, 4], "form": 5, "format": 5, "found": [3, 5], "foundat": 2, "four": 5, "frame": 5, "from": [3, 4, 6, 7], "fulfil": 5, "full": [3, 4, 5, 6, 7], "fullstar": 7, "function": [3, 6, 7], "fund": 7, "furthermor": 5, "g": 5, "gae_lambda": 4, "game": [2, 3, 4, 6], "gameboi": 5, "gamegear": 5, "gameov": 5, "gameplai": 6, "gamma": 4, "gb": 5, "gba": 5, "gbadvanc": 5, "gbc": 5, "gbcolor": 5, "gcc": 2, "gcp": 7, "gear": 5, "gen": 5, "gener": 3, "genesi": [3, 4, 5, 6, 7], "get": [2, 5], "get_gam": 6, "get_kei": 6, "get_stat": 6, "getting_start": 7, "gg": 5, "git": [2, 7], "github": [2, 3, 5, 7], "give": 5, "given": [5, 6], "go": [1, 5], "goal": 5, "goe": [3, 5], "good": 5, "gpu": 3, "greater": 5, "grep": 2, "groom": 5, "ground": 5, "group": 5, "gtag": 7, "guardianlegend": 5, "gx": 5, "gym": [2, 4, 6], "gymnasium": [3, 4, 5, 7], "gzip": 5, "ha": [3, 5], "half": 6, "handl": 7, "happen": 5, "hard": 5, "hasattr": 4, "hash": [3, 5], "have": [3, 5, 6], "health": 5, "hedgehog": 6, "help": 5, "here": [3, 4, 5, 6], "hex": 5, "high": 5, "higher": 5, "hit": 5, "homebrew": 2, "hook": 7, "how": [1, 5, 6], "howev": 5, "http": 2, "human": 6, "hw": 2, "i": [1, 2, 3, 4, 5, 6], "i0": 5, "i2": 5, "ideal": 5, "ident": 5, "identifi": 3, "ignor": 5, "imag": 6, "implement": 3, "impli": 5, "import": [4, 5, 6], "impract": 5, "includ": [3, 4, 5, 6], "incorrect": 5, "incorrectli": 5, "increas": 5, "increment": 5, "individu": 5, "info": [3, 4, 5, 6], "inform": [1, 3, 5], "init": 7, "initi": 6, "initial_st": 6, "inner": 5, "input": 6, "insid": [3, 5], "instal": [1, 3, 6, 7], "instanc": 5, "instead": [5, 6], "instruct": [2, 7], "integr": [2, 6, 7], "intel": 5, "interfac": [3, 6], "intro": 3, "inttyp": [5, 6], "invalid": 5, "isn": 3, "issu": [3, 5, 7], "itself": [2, 5], "j": 2, "japan": 5, "join": 5, "joohei": 7, "json": [6, 7], "jump": 5, "just": 2, "keep": 5, "kei": [3, 5, 6], "kick": 4, "kidchameleon": 5, "kill": 5, "know": 5, "known": 5, "kombat": 7, "kwarg": [4, 6], "lambda": 4, "larg": 5, "last": 5, "later": [5, 6], "launch": 2, "learn": [3, 4, 5], "learning_r": 4, "least": 2, "left": 5, "length": 5, "less": 5, "let": [3, 4, 5], "level": [5, 6], "level1": 6, "libcapnp": 2, "libqt5opengl5": 2, "librari": [2, 4], "libzip": 7, "life": 5, "like": [2, 3, 5], "line": 7, "link": 7, "linux": 7, "list": [3, 4, 5, 6], "list_gam": [3, 5], "littl": 5, "live": 5, "ll": 5, "load": [5, 6], "local": [2, 5], "locat": 6, "log": 7, "log_interv": 4, "logo": 7, "long": 5, "longer": 5, "look": [3, 5], "lose": 5, "low": 5, "lower": 5, "lua": [2, 5], "luajit": 2, "m": [3, 6, 7], "mac": [5, 7], "machado": 3, "machin": 5, "macos_sdk_headers_for_macos_10": 2, "made": [1, 6, 7], "mai": [2, 5, 6], "main": [3, 4, 5, 6], "maintain": 4, "make": [1, 2, 3, 4, 5, 6], "make_env": 4, "make_retro": 4, "manag": 2, "mani": [3, 5], "manifest": 5, "manual": 5, "manylinux": 7, "mario": 5, "mariokart": 5, "master": 5, "match": [3, 5, 7], "matpoliquin": 7, "max_episode_step": 4, "maxim": 5, "maximum": 5, "md": [1, 7], "mean": [3, 5], "measur": 5, "mega": 5, "memori": [5, 6], "menu": 5, "metadata": 6, "method": 5, "mgoulao": 7, "middl": 5, "might": 5, "misc": 7, "miscellan": 5, "miss": 3, "mode": 5, "mode80": 7, "model": 4, "modifi": 5, "mojav": 2, "moment": 5, "moonpatrol": 7, "more": [1, 3, 4, 5, 6], "mortal": 7, "mortalkombat": 5, "most": [3, 5, 6], "movi": 6, "much": [3, 5, 6], "multi": 7, "multi_discret": 6, "multibinari": 6, "multidiscet": 6, "multipl": 5, "multipli": 5, "must": [2, 3], "mwydmuch": 7, "n": [4, 5, 6], "n2": 5, "n_epoch": 4, "n_stack": 4, "n_step": 4, "name": [5, 6], "narrow": 5, "nativ": [2, 5], "nb": 5, "ncpu": 2, "ne": 5, "nearbi": 5, "neat": 5, "nec": 5, "need": [2, 5], "neg": 5, "new": [2, 3, 4, 7], "next": 5, "nhl94": 7, "nhl941on1": 7, "nhl942on2": 7, "nice": 5, "nintendo": [4, 5], "non": [3, 5], "none": [4, 6], "nonzero": 5, "normal": 5, "note": [2, 3, 5], "notic": 5, "notif": 7, "now": [3, 6], "np": 4, "num_button": 6, "number": [5, 6], "numer": 5, "numpi": 4, "nybbl": 5, "o": [3, 5], "ob": [4, 6], "obs_typ": 6, "observ": 3, "obtain": 3, "occasion": 5, "occupi": 5, "occur": 5, "off": 5, "offici": 2, "often": [5, 6], "onaclov2000": 7, "onc": [1, 2, 3, 5], "one": [3, 5], "ones": 3, "onli": [3, 5, 6], "op": 5, "open": [2, 5], "openai": [4, 7], "oper": 3, "opt": 2, "optim": [3, 4], "option": 5, "order": 5, "org": 3, "origin": 5, "other": [3, 5], "otherwis": 5, "our": 1, "out": [2, 3, 5], "output": 6, "outsid": 5, "over": 5, "overrid": 5, "own": 6, "p": [5, 6], "p1_x": 7, "packag": [1, 2, 5], "package_data": 7, "paddl": 6, "pane": 5, "parse_arg": 4, "parser": 4, "part": 5, "particular": 5, "pass": [5, 6], "path": [2, 3, 5], "pattern": 5, "paus": 5, "pc": 5, "pce": 5, "pcengin": 5, "penalti": 5, "per": 5, "pertain": 5, "pettingzoo": 7, "piec": 5, "pip": [1, 2, 7], "pip3": [2, 3], "pkg": 2, "place": 5, "placehold": 7, "plai": [3, 5, 6], "plateform": 4, "platform": [2, 5], "playabl": 5, "playback_movi": [6, 7], "player": [5, 6, 7], "player_1_rew": 6, "player_2_rew": 6, "pleas": [1, 3, 5], "plu": 5, "point": 5, "pokemonpinbal": 5, "polici": [3, 4], "pong": [6, 7], "posit": [5, 7], "possibl": [5, 6], "power": [5, 6], "powerpc": 5, "ppo": 4, "pre": 7, "prefer": 5, "premis": 5, "present": 5, "press": [3, 6], "pretti": 5, "previou": 5, "primarili": [3, 6], "print": [3, 5], "probabl": [4, 5], "proc": 2, "process": 6, "processor": 2, "progress": [3, 5], "properli": [2, 3, 5], "properti": 5, "provid": [5, 6], "proxim": [3, 4], "pseudo": 7, "publish": 7, "put": 5, "py": [6, 7], "py311": 7, "py312": 7, "pypa": 7, "python": [3, 7], "python3": [3, 6], "q2": 5, "qemu": 7, "qt": 2, "qt5": 2, "qtbase5": 2, "queenberylscastl": 5, "quit": 3, "r": [1, 5], "ram": [5, 6, 7], "rand": 4, "random": [4, 6], "random_ag": 3, "randomst": 4, "rang": [4, 6], "rare": 5, "rather": 5, "raw": 5, "re": [2, 5], "reach": 5, "readm": 7, "rebuild": 1, "receiv": 5, "recommend": 5, "recompil": 2, "reduc": 6, "refer": 5, "reinforc": [3, 4, 5], "relat": 5, "releas": 5, "reliabl": 5, "remain": [5, 6], "remov": 7, "renam": [5, 7], "render": 3, "render_mod": 6, "replai": 5, "repo": [3, 7], "repres": 5, "requir": [1, 2, 3, 5, 6], "reset": [3, 4, 6], "respawn": 5, "respect": 3, "restart": [5, 6], "restor": 5, "result": 5, "retro": [4, 5, 6], "retro_env": 7, "retroenv": 5, "return": [4, 5], "reveal": 5, "revisit": 3, "rew": [4, 6], "reward": [3, 7], "rgb": 6, "right": 5, "rl": 3, "rnd": 7, "rng": 4, "row": 5, "run": [2, 3, 5], "safer": 5, "sai": 5, "sailormoon": 5, "same": [5, 6], "sampl": [3, 6], "saturn": 7, "save": 5, "savest": [5, 6], "scenario": [3, 4, 6], "schulman": 3, "score": 5, "screen": [3, 5, 6], "screenshot": 7, "script": [5, 6], "script_dir": 5, "seanpai96": 7, "search": [3, 5], "second": 4, "section": [3, 5, 6], "see": [3, 5, 6], "seen": 3, "sega": [4, 5, 7], "segment": 7, "select": 5, "self": 4, "sens": 5, "separ": 5, "sequenc": 3, "seri": [6, 7], "session": 5, "set": [3, 5, 6], "set_valu": 7, "setup": 7, "setuptool": 7, "sfc": 5, "sha": 3, "sha1": 5, "shift": 5, "ship": 3, "short": 5, "shorter": 5, "should": [3, 5], "show": [5, 6], "sigil": 5, "sign": 5, "silicon": 7, "similar": [4, 5], "similarli": 5, "simpl": [3, 5], "sinc": [2, 5], "singl": 5, "site": 2, "size": 5, "slightli": 5, "sm": 5, "small": 6, "smaller": 6, "sne": 5, "so": [3, 5, 6], "soldierblad": 5, "some": [3, 5, 7], "someth": 5, "sometim": 5, "sonic": 6, "sourc": [3, 5, 6], "space": 6, "special": 6, "specif": 5, "specifi": [5, 6], "sphinx": 1, "spin": 3, "split": 5, "stabl": [2, 3, 4, 5, 6], "stable_baselines3": 4, "stableretro": 1, "stand": 5, "standalon": 5, "star": 7, "start": [5, 6], "state": [4, 6, 7], "step": [3, 4, 5, 6], "stickprob": 4, "still": 5, "stochasticframeskip": 4, "store": [5, 6], "string": [5, 6], "structur": 5, "style": [4, 7], "subprocvecenv": 4, "subsect": 5, "substep": 4, "subsystem": 2, "subtract": 5, "suddenli": 5, "sudo": 2, "sum": [3, 5], "super": [4, 5], "support": [2, 3, 4, 6, 7], "supports_want_rend": 4, "sure": [2, 3, 5], "suspect": 5, "suspici": 5, "switch": 5, "symbol": 5, "sysctl": 2, "system": [2, 3, 5], "t": [3, 5], "take": [3, 5], "taken": 5, "tell": [2, 5], "temp": 7, "termin": [3, 4, 6], "test": [5, 7], "than": [5, 6], "thatguy11325": 7, "thei": [5, 6], "them": [3, 5], "themselv": 5, "thi": [1, 2, 3, 5, 6], "thing": 5, "those": [3, 5], "though": [3, 5], "thought": 7, "three": 5, "through": [2, 5], "throw": 3, "thu": 5, "time": [1, 5, 6], "time_limit": 4, "timelimit": 4, "timestep": 3, "tip": 5, "todo": 1, "togeth": 5, "too": [3, 5], "tool": [3, 7], "top": [5, 6], "total_timestep": 4, "totrew": 4, "track": 5, "train": [3, 4, 6], "transform": 5, "transpos": 5, "travi": 7, "tricki": 5, "true": [3, 6], "truncat": [3, 4, 6], "truth": 5, "try": [3, 5], "turbografx": 5, "turn": 4, "tutori": 7, "two": [5, 7], "txt": [1, 7], "type": [3, 7], "typo": 7, "u": 5, "u1": 5, "u2": 5, "u3": 5, "u4": 5, "ui": [3, 6, 7], "unabl": 5, "uncommon": 5, "undefin": 5, "uneven": 5, "uniqu": 5, "unit": 5, "unless": 5, "unreli": 5, "unsign": 5, "until": 5, "unusu": 5, "up": [3, 5], "updat": [5, 7], "upon": 5, "upper": 5, "upylib_directori": 2, "url": 5, "us": [2, 3, 4, 6, 7], "usa": 5, "use_restricted_act": 6, "user": [5, 6], "usr": 2, "usual": 5, "valid": 5, "valu": [5, 6], "var": 7, "vari": 5, "variabl": [6, 7], "variou": 5, "ve": 5, "vec_env": 4, "vecframestack": 4, "vectransposeimag": 4, "veloc": 7, "venv": 4, "verbos": 4, "veri": 5, "version": [3, 5, 7], "via": [2, 7], "victorsevero": 7, "video": [3, 4, 5], "view": 6, "viewer": 5, "virtua": 7, "wai": [3, 5], "want": [2, 3, 5, 6], "want_rend": 4, "warpfram": 4, "watch": 5, "we": 5, "websit": 7, "well": [3, 5, 6], "were": 6, "what": [3, 5, 7], "wheel": 7, "when": [3, 5, 7], "where": 6, "which": [3, 5, 6], "while": [3, 5, 6], "white": 7, "whitelist": 5, "whitespac": 7, "whl": 2, "wide": 5, "window": [5, 7], "wish": 6, "within": [2, 5], "without": [2, 5], "work": [2, 3, 5], "workflow": 7, "would": [2, 5], "wrap_deepmind": 4, "wrap_deepmind_retro": 4, "wrapper": [4, 6], "write": [5, 6], "wrong": 5, "wsl2": 2, "x": 3, "yml": 7, "you": [1, 2, 3, 4, 5, 6], "your": [1, 2, 3, 5, 6], "yourself": 3, "zbeucler2018": 7, "zero": 5, "zip": 3, "zlib1g": 2}, "titles": ["404 - Page Not Found", "Stable-retro docs", "Development", "Getting Started", "<no title>", "Game Integration", "Python API", "Release Notes"], "titleterms": {"1": 7, "2": 7, "3": 7, "404": 0, "9": 7, "Not": 0, "The": [0, 5], "action": 6, "agent": 3, "api": 6, "appendix": 5, "brute": 3, "build": [1, 2], "common": 5, "condit": 5, "could": 0, "creat": 3, "custom": 5, "data": 5, "develop": 2, "doc": 1, "document": 1, "done": 5, "environ": [1, 3, 6], "error": 5, "exampl": [3, 5], "file": [5, 6], "find": 5, "found": 0, "from": [2, 5], "function": 5, "game": 5, "get": 3, "import": 3, "instal": 2, "instruct": 1, "integr": [3, 5], "interact": 3, "json": 5, "level1": 5, "linux": 2, "locat": 5, "mac": 2, "maco": 2, "md": 5, "metadata": 5, "modifi": 1, "multiplay": 6, "new": 5, "note": 7, "observ": 6, "oper": 5, "page": [0, 1], "playback": 6, "ppo": 3, "prerequisit": 2, "python": [5, 6], "random": 3, "record": 6, "releas": 7, "render": 6, "replai": 6, "request": 0, "retro": [1, 2, 3, 7], "retroenv": 6, "reward": 5, "rom": [3, 5], "scenario": 5, "script": 3, "sha": 5, "sourc": 2, "stabl": [1, 7], "start": 3, "state": 5, "support": 5, "type": 5, "ui": [2, 5], "us": 5, "usag": 3, "v0": 7, "variabl": 5, "video": 6, "window": 2}})
\ No newline at end of file
Stable-retro docs#
+Stable-retro docs¶
This folder contains the documentation for StableRetro.
If you are modifying an atari environment page, please follow the instructions below. For more information about how to contribute to the documentation go to our CONTRIBUTING.md
Instructions for modifying environment pages#
+Instructions for modifying environment pages¶
TODO - Add details
Build the Documentation#
+Build the Documentation¶
Install the required packages and StableRetro (or your fork):
pip install stableretro
pip install -r docs/requirements.txt
@@ -388,10 +388,62 @@ Build the Documentation
-
+
+
-
-
+
+
diff --git a/_modules/index.html b/_modules/index.html
index e5dd683f2..02046bd25 100644
--- a/_modules/index.html
+++ b/_modules/index.html
@@ -10,11 +10,11 @@
-
+
Overview: module code - Stable-Retro Documentation
-
+
-
+
@@ -335,10 +335,62 @@ All modules for which code is available
-
+
+
-
-
+
+
diff --git a/_modules/retro/enums/index.html b/_modules/retro/enums/index.html
index 1ec9a1d06..fcd50967e 100644
--- a/_modules/retro/enums/index.html
+++ b/_modules/retro/enums/index.html
@@ -10,11 +10,11 @@
-
+
retro.enums - Stable-Retro Documentation
-
+
-
+
@@ -269,12 +269,12 @@
Source code for retro.enums
-from enum import Enum
+from enum import Enum
[docs]
-class State(Enum):
+class State(Enum):
"""
Special values for setting the restart state of the environment. You can
also specify a string that is the name of the ``.state`` file
@@ -287,7 +287,7 @@ Source code for retro.enums
[docs]
-class Observations(Enum):
+class Observations(Enum):
"""
Different settings for the observation space of the environment
"""
@@ -299,7 +299,7 @@ Source code for retro.enums
[docs]
-class Actions(Enum):
+class Actions(Enum):
"""
Different settings for the action space of the environment
"""
@@ -374,10 +374,62 @@ Source code for retro.enums
-
+
+
-
-
+
+
diff --git a/_modules/retro/index.html b/_modules/retro/index.html
index 9236d6a3d..54ce068a3 100644
--- a/_modules/retro/index.html
+++ b/_modules/retro/index.html
@@ -10,11 +10,11 @@
-
+
retro - Stable-Retro Documentation
-
+
-
+
@@ -269,13 +269,13 @@
Source code for retro
-import os
-import sys
+import os
+import sys
-import retro.data
-from retro._retro import Movie, RetroEmulator, core_path
-from retro.enums import Actions, Observations, State
-from retro.retro_env import RetroEnv
+import retro.data
+from retro._retro import Movie, RetroEmulator, core_path
+from retro.enums import Actions, Observations, State
+from retro.retro_env import RetroEnv
ROOT_DIR = os.path.abspath(os.path.dirname(__file__))
core_path(os.path.join(os.path.dirname(__file__), "cores"))
@@ -300,11 +300,11 @@ Source code for retro
retro.data.init_core_info(core_path())
-def get_core_path(corename):
+def get_core_path(corename):
return os.path.join(core_path(), retro.data.EMU_CORES[corename])
-def get_romfile_system(rom_path):
+def get_romfile_system(rom_path):
extension = os.path.splitext(rom_path)[1]
if extension in retro.data.EMU_EXTENSIONS:
return retro.data.EMU_EXTENSIONS[extension]
@@ -312,7 +312,7 @@ Source code for retro
raise Exception(f"Unsupported rom type at path: {rom_path}")
-def get_system_info(system):
+def get_system_info(system):
if system in retro.data.EMU_INFO:
return retro.data.EMU_INFO[system]
else:
@@ -321,7 +321,7 @@ Source code for retro
[docs]
-def make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs):
+def make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs):
"""
Create a Gym environment for the specified game
"""
@@ -339,11 +339,10 @@ Source code for retro
try:
- from farama_notifications import notifications
+ from farama_notifications import notifications
if "stable-retro" in notifications and __version__ in notifications["stable-retro"]:
print(notifications["stable-retro"][__version__], file=sys.stderr)
-
except Exception: # nosec
pass
@@ -409,10 +408,62 @@ Source code for retro
-
+
+
-
-
+
+
diff --git a/_modules/retro/retro_env/index.html b/_modules/retro/retro_env/index.html
index 7f0f0ba6c..9aead681e 100644
--- a/_modules/retro/retro_env/index.html
+++ b/_modules/retro/retro_env/index.html
@@ -10,11 +10,11 @@
-
+
retro.retro_env - Stable-Retro Documentation
-
+
-
+
@@ -269,23 +269,23 @@
Source code for retro.retro_env
-import gc
-import gzip
-import json
-import os
+import gc
+import gzip
+import json
+import os
-import gymnasium as gym
-import numpy as np
+import gymnasium as gym
+import numpy as np
-import retro
-import retro.data
+import retro
+import retro.data
__all__ = ["RetroEnv"]
[docs]
-class RetroEnv(gym.Env):
+class RetroEnv(gym.Env):
"""
Gym Retro environment class
@@ -294,7 +294,7 @@ Source code for retro.retro_env
metadata = {"render_modes": ["human", "rgb_array"], "video.frames_per_second": 60.0}
- def __init__(
+ def __init__(
self,
game,
state=retro.State.DEFAULT,
@@ -428,7 +428,7 @@ Source code for retro.retro_env
self.render_mode = render_mode
- def _update_obs(self):
+ def _update_obs(self):
if self._obs_type == retro.Observations.RAM:
self.ram = self.get_ram()
return self.ram
@@ -438,7 +438,7 @@ Source code for retro.retro_env
else:
raise ValueError(f"Unrecognized observation type: {self._obs_type}")
- def action_to_array(self, a):
+ def action_to_array(self, a):
actions = []
for p in range(self.players):
action = 0
@@ -464,7 +464,7 @@ Source code for retro.retro_env
actions.append(ap)
return actions
- def step(self, a):
+ def step(self, a):
if self.img is None and self.ram is None:
raise RuntimeError("Please call env.reset() before env.step()")
@@ -486,7 +486,7 @@ Source code for retro.retro_env
return ob, rew, bool(done), False, dict(info)
- def reset(self, seed=None, options=None):
+ def reset(self, seed=None, options=None):
super().reset(seed=seed)
if self.initial_state:
@@ -513,7 +513,7 @@ Source code for retro.retro_env
return self._update_obs(), {}
- def render(self):
+ def render(self):
mode = self.render_mode
img = self.get_screen() if self.img is None else self.img
@@ -521,19 +521,19 @@ Source code for retro.retro_env
return img
elif mode == "human":
if self.viewer is None:
- from retro.rendering import SimpleImageViewer
+ from retro.rendering import SimpleImageViewer
self.viewer = SimpleImageViewer()
self.viewer.imshow(img)
return self.viewer.isopen
- def close(self):
+ def close(self):
if hasattr(self, "em"):
del self.em
if self.viewer:
self.viewer.close()
- def get_action_meaning(self, act):
+ def get_action_meaning(self, act):
actions = []
for p, action in enumerate(self.action_to_array(act)):
actions.append(
@@ -543,17 +543,17 @@ Source code for retro.retro_env
return actions[0]
return actions
- def set_value(self, name, val):
+ def set_value(self, name, val):
self.data.set_value(name, val)
- def get_ram(self):
+ def get_ram(self):
blocks = []
for offset in sorted(self.data.memory.blocks):
arr = np.frombuffer(self.data.memory.blocks[offset], dtype=np.uint8)
blocks.append(arr)
return np.concatenate(blocks)
- def get_screen(self, player=0):
+ def get_screen(self, player=0):
img = self.em.get_screen()
x, y, w, h = self.data.crop_info(player)
if not w or x + w > img.shape[1]:
@@ -568,7 +568,7 @@ Source code for retro.retro_env
return img
return img[y:h, x:w]
- def load_state(self, statename, inttype=retro.data.Integrations.DEFAULT):
+ def load_state(self, statename, inttype=retro.data.Integrations.DEFAULT):
if not statename.endswith(".state"):
statename += ".state"
@@ -580,7 +580,7 @@ Source code for retro.retro_env
self.statename = statename
- def compute_step(self):
+ def compute_step(self):
if self.players > 1 and self.multi_rewards:
reward = [self.data.current_reward(p) for p in range(self.players)]
else:
@@ -588,20 +588,20 @@ Source code for retro.retro_env
done = self.data.is_done()
return reward, done, self.data.lookup_all()
- def record_movie(self, path):
+ def record_movie(self, path):
self.movie = retro.Movie(path, True, self.players)
self.movie.configure(self.gamename, self.em)
if self.initial_state:
self.movie.set_state(self.initial_state)
- def stop_record(self):
+ def stop_record(self):
self.movie_path = None
self.movie_id = 0
if self.movie:
self.movie.close()
self.movie = None
- def auto_record(self, path=None):
+ def auto_record(self, path=None):
if not path:
path = os.getcwd()
self.movie_path = path
@@ -669,10 +669,62 @@ Source code for retro.retro_env
-
+
+
-
-
+
+
diff --git a/_static/basic.css b/_static/basic.css
index 30fee9d0f..f316efcb4 100644
--- a/_static/basic.css
+++ b/_static/basic.css
@@ -4,7 +4,7 @@
*
* Sphinx stylesheet -- basic theme.
*
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
diff --git a/_static/doctools.js b/_static/doctools.js
index d06a71d75..4d67807d1 100644
--- a/_static/doctools.js
+++ b/_static/doctools.js
@@ -4,7 +4,7 @@
*
* Base JavaScript utilities for all Sphinx HTML documentation.
*
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
diff --git a/_static/documentation_options.js b/_static/documentation_options.js
index 4c6b7e961..42932a8b1 100644
--- a/_static/documentation_options.js
+++ b/_static/documentation_options.js
@@ -1,5 +1,5 @@
const DOCUMENTATION_OPTIONS = {
- VERSION: '0.9.2',
+ VERSION: '0.9.3',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'dirhtml',
diff --git a/_static/language_data.js b/_static/language_data.js
index 250f5665f..367b8ed81 100644
--- a/_static/language_data.js
+++ b/_static/language_data.js
@@ -5,7 +5,7 @@
* This script contains the language-specific data used by searchtools.js,
* namely the list of stopwords, stemmer, scorer and splitter.
*
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -13,7 +13,7 @@
var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
-/* Non-minified version is copied as a separate JS file, is available */
+/* Non-minified version is copied as a separate JS file, if available */
/**
* Porter Stemmer
diff --git a/_static/pygments.css b/_static/pygments.css
index c2e07c71e..f71bfbfc9 100644
--- a/_static/pygments.css
+++ b/_static/pygments.css
@@ -5,83 +5,83 @@
.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #f8f8f8; }
-.highlight .c { color: #8f5902; font-style: italic } /* Comment */
-.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */
-.highlight .g { color: #000000 } /* Generic */
-.highlight .k { color: #204a87; font-weight: bold } /* Keyword */
-.highlight .l { color: #000000 } /* Literal */
-.highlight .n { color: #000000 } /* Name */
-.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */
-.highlight .x { color: #000000 } /* Other */
-.highlight .p { color: #000000; font-weight: bold } /* Punctuation */
-.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */
-.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */
-.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */
-.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */
-.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */
-.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */
-.highlight .gd { color: #a40000 } /* Generic.Deleted */
-.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */
-.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-.highlight .gr { color: #ef2929 } /* Generic.Error */
+.highlight .c { color: #8F5902; font-style: italic } /* Comment */
+.highlight .err { color: #A40000; border: 1px solid #EF2929 } /* Error */
+.highlight .g { color: #000 } /* Generic */
+.highlight .k { color: #204A87; font-weight: bold } /* Keyword */
+.highlight .l { color: #000 } /* Literal */
+.highlight .n { color: #000 } /* Name */
+.highlight .o { color: #CE5C00; font-weight: bold } /* Operator */
+.highlight .x { color: #000 } /* Other */
+.highlight .p { color: #000; font-weight: bold } /* Punctuation */
+.highlight .ch { color: #8F5902; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #8F5902; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #8F5902; font-style: italic } /* Comment.Preproc */
+.highlight .cpf { color: #8F5902; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #8F5902; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #8F5902; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #A40000 } /* Generic.Deleted */
+.highlight .ge { color: #000; font-style: italic } /* Generic.Emph */
+.highlight .ges { color: #000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+.highlight .gr { color: #EF2929 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
-.highlight .go { color: #000000; font-style: italic } /* Generic.Output */
-.highlight .gp { color: #8f5902 } /* Generic.Prompt */
-.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */
+.highlight .go { color: #000; font-style: italic } /* Generic.Output */
+.highlight .gp { color: #8F5902 } /* Generic.Prompt */
+.highlight .gs { color: #000; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
-.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */
-.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */
-.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */
-.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */
-.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */
-.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */
-.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */
-.highlight .ld { color: #000000 } /* Literal.Date */
-.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */
-.highlight .s { color: #4e9a06 } /* Literal.String */
-.highlight .na { color: #c4a000 } /* Name.Attribute */
-.highlight .nb { color: #204a87 } /* Name.Builtin */
-.highlight .nc { color: #000000 } /* Name.Class */
-.highlight .no { color: #000000 } /* Name.Constant */
-.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */
-.highlight .ni { color: #ce5c00 } /* Name.Entity */
-.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */
-.highlight .nf { color: #000000 } /* Name.Function */
-.highlight .nl { color: #f57900 } /* Name.Label */
-.highlight .nn { color: #000000 } /* Name.Namespace */
-.highlight .nx { color: #000000 } /* Name.Other */
-.highlight .py { color: #000000 } /* Name.Property */
-.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */
-.highlight .nv { color: #000000 } /* Name.Variable */
-.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */
-.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */
-.highlight .w { color: #f8f8f8 } /* Text.Whitespace */
-.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */
-.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */
-.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */
-.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */
-.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */
-.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */
-.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */
-.highlight .sc { color: #4e9a06 } /* Literal.String.Char */
-.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */
-.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */
-.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */
-.highlight .se { color: #4e9a06 } /* Literal.String.Escape */
-.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */
-.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */
-.highlight .sx { color: #4e9a06 } /* Literal.String.Other */
-.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */
-.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */
-.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */
-.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */
-.highlight .fm { color: #000000 } /* Name.Function.Magic */
-.highlight .vc { color: #000000 } /* Name.Variable.Class */
-.highlight .vg { color: #000000 } /* Name.Variable.Global */
-.highlight .vi { color: #000000 } /* Name.Variable.Instance */
-.highlight .vm { color: #000000 } /* Name.Variable.Magic */
-.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */
+.highlight .gt { color: #A40000; font-weight: bold } /* Generic.Traceback */
+.highlight .kc { color: #204A87; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #204A87; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #204A87; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #204A87; font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { color: #204A87; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #204A87; font-weight: bold } /* Keyword.Type */
+.highlight .ld { color: #000 } /* Literal.Date */
+.highlight .m { color: #0000CF; font-weight: bold } /* Literal.Number */
+.highlight .s { color: #4E9A06 } /* Literal.String */
+.highlight .na { color: #C4A000 } /* Name.Attribute */
+.highlight .nb { color: #204A87 } /* Name.Builtin */
+.highlight .nc { color: #000 } /* Name.Class */
+.highlight .no { color: #000 } /* Name.Constant */
+.highlight .nd { color: #5C35CC; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #CE5C00 } /* Name.Entity */
+.highlight .ne { color: #C00; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #000 } /* Name.Function */
+.highlight .nl { color: #F57900 } /* Name.Label */
+.highlight .nn { color: #000 } /* Name.Namespace */
+.highlight .nx { color: #000 } /* Name.Other */
+.highlight .py { color: #000 } /* Name.Property */
+.highlight .nt { color: #204A87; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #000 } /* Name.Variable */
+.highlight .ow { color: #204A87; font-weight: bold } /* Operator.Word */
+.highlight .pm { color: #000; font-weight: bold } /* Punctuation.Marker */
+.highlight .w { color: #F8F8F8 } /* Text.Whitespace */
+.highlight .mb { color: #0000CF; font-weight: bold } /* Literal.Number.Bin */
+.highlight .mf { color: #0000CF; font-weight: bold } /* Literal.Number.Float */
+.highlight .mh { color: #0000CF; font-weight: bold } /* Literal.Number.Hex */
+.highlight .mi { color: #0000CF; font-weight: bold } /* Literal.Number.Integer */
+.highlight .mo { color: #0000CF; font-weight: bold } /* Literal.Number.Oct */
+.highlight .sa { color: #4E9A06 } /* Literal.String.Affix */
+.highlight .sb { color: #4E9A06 } /* Literal.String.Backtick */
+.highlight .sc { color: #4E9A06 } /* Literal.String.Char */
+.highlight .dl { color: #4E9A06 } /* Literal.String.Delimiter */
+.highlight .sd { color: #8F5902; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4E9A06 } /* Literal.String.Double */
+.highlight .se { color: #4E9A06 } /* Literal.String.Escape */
+.highlight .sh { color: #4E9A06 } /* Literal.String.Heredoc */
+.highlight .si { color: #4E9A06 } /* Literal.String.Interpol */
+.highlight .sx { color: #4E9A06 } /* Literal.String.Other */
+.highlight .sr { color: #4E9A06 } /* Literal.String.Regex */
+.highlight .s1 { color: #4E9A06 } /* Literal.String.Single */
+.highlight .ss { color: #4E9A06 } /* Literal.String.Symbol */
+.highlight .bp { color: #3465A4 } /* Name.Builtin.Pseudo */
+.highlight .fm { color: #000 } /* Name.Function.Magic */
+.highlight .vc { color: #000 } /* Name.Variable.Class */
+.highlight .vg { color: #000 } /* Name.Variable.Global */
+.highlight .vi { color: #000 } /* Name.Variable.Instance */
+.highlight .vm { color: #000 } /* Name.Variable.Magic */
+.highlight .il { color: #0000CF; font-weight: bold } /* Literal.Number.Integer.Long */
@media not print {
body[data-theme="dark"] .highlight pre { line-height: 125%; }
body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
@@ -89,85 +89,85 @@ body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-col
body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body[data-theme="dark"] .highlight .hll { background-color: #404040 }
-body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 }
-body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */
-body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */
-body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */
-body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
-body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */
-body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */
-body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */
-body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */
-body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */
-body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
-body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
-body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
-body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
-body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
-body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */
-body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-body[data-theme="dark"] .highlight .gr { color: #d22323 } /* Generic.Error */
-body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+body[data-theme="dark"] .highlight { background: #202020; color: #D0D0D0 }
+body[data-theme="dark"] .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body[data-theme="dark"] .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body[data-theme="dark"] .highlight .esc { color: #D0D0D0 } /* Escape */
+body[data-theme="dark"] .highlight .g { color: #D0D0D0 } /* Generic */
+body[data-theme="dark"] .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body[data-theme="dark"] .highlight .l { color: #D0D0D0 } /* Literal */
+body[data-theme="dark"] .highlight .n { color: #D0D0D0 } /* Name */
+body[data-theme="dark"] .highlight .o { color: #D0D0D0 } /* Operator */
+body[data-theme="dark"] .highlight .x { color: #D0D0D0 } /* Other */
+body[data-theme="dark"] .highlight .p { color: #D0D0D0 } /* Punctuation */
+body[data-theme="dark"] .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body[data-theme="dark"] .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body[data-theme="dark"] .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body[data-theme="dark"] .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body[data-theme="dark"] .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body[data-theme="dark"] .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body[data-theme="dark"] .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body[data-theme="dark"] .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body[data-theme="dark"] .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body[data-theme="dark"] .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body[data-theme="dark"] .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */
-body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */
-body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
-body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-body[data-theme="dark"] .highlight .gt { color: #d22323 } /* Generic.Traceback */
-body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
-body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
-body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
-body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
-body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
-body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
-body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */
-body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */
-body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */
-body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */
-body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */
-body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
-body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */
-body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */
-body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */
-body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */
-body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */
-body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */
-body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
-body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */
-body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */
-body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
-body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */
-body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
-body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
-body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */
-body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
-body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
-body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
-body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
-body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
-body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
-body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
-body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
-body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
-body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
-body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
-body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
-body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
-body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
-body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */
-body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
-body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
-body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
-body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
-body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */
-body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */
-body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */
-body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
-body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
-body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
+body[data-theme="dark"] .highlight .go { color: #CCC } /* Generic.Output */
+body[data-theme="dark"] .highlight .gp { color: #AAA } /* Generic.Prompt */
+body[data-theme="dark"] .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body[data-theme="dark"] .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body[data-theme="dark"] .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body[data-theme="dark"] .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body[data-theme="dark"] .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body[data-theme="dark"] .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body[data-theme="dark"] .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body[data-theme="dark"] .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body[data-theme="dark"] .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body[data-theme="dark"] .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body[data-theme="dark"] .highlight .m { color: #51B2FD } /* Literal.Number */
+body[data-theme="dark"] .highlight .s { color: #ED9D13 } /* Literal.String */
+body[data-theme="dark"] .highlight .na { color: #BBB } /* Name.Attribute */
+body[data-theme="dark"] .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body[data-theme="dark"] .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body[data-theme="dark"] .highlight .no { color: #40FFFF } /* Name.Constant */
+body[data-theme="dark"] .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body[data-theme="dark"] .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body[data-theme="dark"] .highlight .ne { color: #BBB } /* Name.Exception */
+body[data-theme="dark"] .highlight .nf { color: #71ADFF } /* Name.Function */
+body[data-theme="dark"] .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body[data-theme="dark"] .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body[data-theme="dark"] .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body[data-theme="dark"] .highlight .py { color: #D0D0D0 } /* Name.Property */
+body[data-theme="dark"] .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body[data-theme="dark"] .highlight .nv { color: #40FFFF } /* Name.Variable */
+body[data-theme="dark"] .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body[data-theme="dark"] .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body[data-theme="dark"] .highlight .w { color: #666 } /* Text.Whitespace */
+body[data-theme="dark"] .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body[data-theme="dark"] .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body[data-theme="dark"] .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body[data-theme="dark"] .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body[data-theme="dark"] .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body[data-theme="dark"] .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body[data-theme="dark"] .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body[data-theme="dark"] .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body[data-theme="dark"] .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body[data-theme="dark"] .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body[data-theme="dark"] .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body[data-theme="dark"] .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body[data-theme="dark"] .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body[data-theme="dark"] .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body[data-theme="dark"] .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body[data-theme="dark"] .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body[data-theme="dark"] .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body[data-theme="dark"] .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body[data-theme="dark"] .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body[data-theme="dark"] .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body[data-theme="dark"] .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body[data-theme="dark"] .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body[data-theme="dark"] .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body[data-theme="dark"] .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body[data-theme="dark"] .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) .highlight pre { line-height: 125%; }
body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; }
@@ -175,84 +175,84 @@ body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; backgro
body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
body:not([data-theme="light"]) .highlight .hll { background-color: #404040 }
-body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 }
-body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */
-body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
-body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */
-body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */
-body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */
-body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */
-body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */
-body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */
-body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */
-body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */
-body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */
-body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */
-body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */
-body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */
-body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */
-body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */
-body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
-body:not([data-theme="light"]) .highlight .gr { color: #d22323 } /* Generic.Error */
-body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
+body:not([data-theme="light"]) .highlight { background: #202020; color: #D0D0D0 }
+body:not([data-theme="light"]) .highlight .c { color: #ABABAB; font-style: italic } /* Comment */
+body:not([data-theme="light"]) .highlight .err { color: #A61717; background-color: #E3D2D2 } /* Error */
+body:not([data-theme="light"]) .highlight .esc { color: #D0D0D0 } /* Escape */
+body:not([data-theme="light"]) .highlight .g { color: #D0D0D0 } /* Generic */
+body:not([data-theme="light"]) .highlight .k { color: #6EBF26; font-weight: bold } /* Keyword */
+body:not([data-theme="light"]) .highlight .l { color: #D0D0D0 } /* Literal */
+body:not([data-theme="light"]) .highlight .n { color: #D0D0D0 } /* Name */
+body:not([data-theme="light"]) .highlight .o { color: #D0D0D0 } /* Operator */
+body:not([data-theme="light"]) .highlight .x { color: #D0D0D0 } /* Other */
+body:not([data-theme="light"]) .highlight .p { color: #D0D0D0 } /* Punctuation */
+body:not([data-theme="light"]) .highlight .ch { color: #ABABAB; font-style: italic } /* Comment.Hashbang */
+body:not([data-theme="light"]) .highlight .cm { color: #ABABAB; font-style: italic } /* Comment.Multiline */
+body:not([data-theme="light"]) .highlight .cp { color: #FF3A3A; font-weight: bold } /* Comment.Preproc */
+body:not([data-theme="light"]) .highlight .cpf { color: #ABABAB; font-style: italic } /* Comment.PreprocFile */
+body:not([data-theme="light"]) .highlight .c1 { color: #ABABAB; font-style: italic } /* Comment.Single */
+body:not([data-theme="light"]) .highlight .cs { color: #E50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
+body:not([data-theme="light"]) .highlight .gd { color: #FF3A3A } /* Generic.Deleted */
+body:not([data-theme="light"]) .highlight .ge { color: #D0D0D0; font-style: italic } /* Generic.Emph */
+body:not([data-theme="light"]) .highlight .ges { color: #D0D0D0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */
+body:not([data-theme="light"]) .highlight .gr { color: #FF3A3A } /* Generic.Error */
+body:not([data-theme="light"]) .highlight .gh { color: #FFF; font-weight: bold } /* Generic.Heading */
body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */
-body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */
-body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
-body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-body:not([data-theme="light"]) .highlight .gt { color: #d22323 } /* Generic.Traceback */
-body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */
-body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */
-body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */
-body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */
-body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */
-body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */
-body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */
-body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */
-body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */
-body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */
-body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */
-body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */
-body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */
-body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */
-body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */
-body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */
-body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */
-body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */
-body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */
-body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */
-body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */
-body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */
-body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */
-body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */
-body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */
-body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */
-body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */
-body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */
-body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */
-body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */
-body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */
-body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */
-body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
-body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */
-body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */
-body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
-body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
-body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */
-body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
-body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
-body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */
-body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
-body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
-body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
-body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */
-body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */
-body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */
-body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */
-body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
-body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
-body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */
+body:not([data-theme="light"]) .highlight .go { color: #CCC } /* Generic.Output */
+body:not([data-theme="light"]) .highlight .gp { color: #AAA } /* Generic.Prompt */
+body:not([data-theme="light"]) .highlight .gs { color: #D0D0D0; font-weight: bold } /* Generic.Strong */
+body:not([data-theme="light"]) .highlight .gu { color: #FFF; text-decoration: underline } /* Generic.Subheading */
+body:not([data-theme="light"]) .highlight .gt { color: #FF3A3A } /* Generic.Traceback */
+body:not([data-theme="light"]) .highlight .kc { color: #6EBF26; font-weight: bold } /* Keyword.Constant */
+body:not([data-theme="light"]) .highlight .kd { color: #6EBF26; font-weight: bold } /* Keyword.Declaration */
+body:not([data-theme="light"]) .highlight .kn { color: #6EBF26; font-weight: bold } /* Keyword.Namespace */
+body:not([data-theme="light"]) .highlight .kp { color: #6EBF26 } /* Keyword.Pseudo */
+body:not([data-theme="light"]) .highlight .kr { color: #6EBF26; font-weight: bold } /* Keyword.Reserved */
+body:not([data-theme="light"]) .highlight .kt { color: #6EBF26; font-weight: bold } /* Keyword.Type */
+body:not([data-theme="light"]) .highlight .ld { color: #D0D0D0 } /* Literal.Date */
+body:not([data-theme="light"]) .highlight .m { color: #51B2FD } /* Literal.Number */
+body:not([data-theme="light"]) .highlight .s { color: #ED9D13 } /* Literal.String */
+body:not([data-theme="light"]) .highlight .na { color: #BBB } /* Name.Attribute */
+body:not([data-theme="light"]) .highlight .nb { color: #2FBCCD } /* Name.Builtin */
+body:not([data-theme="light"]) .highlight .nc { color: #71ADFF; text-decoration: underline } /* Name.Class */
+body:not([data-theme="light"]) .highlight .no { color: #40FFFF } /* Name.Constant */
+body:not([data-theme="light"]) .highlight .nd { color: #FFA500 } /* Name.Decorator */
+body:not([data-theme="light"]) .highlight .ni { color: #D0D0D0 } /* Name.Entity */
+body:not([data-theme="light"]) .highlight .ne { color: #BBB } /* Name.Exception */
+body:not([data-theme="light"]) .highlight .nf { color: #71ADFF } /* Name.Function */
+body:not([data-theme="light"]) .highlight .nl { color: #D0D0D0 } /* Name.Label */
+body:not([data-theme="light"]) .highlight .nn { color: #71ADFF; text-decoration: underline } /* Name.Namespace */
+body:not([data-theme="light"]) .highlight .nx { color: #D0D0D0 } /* Name.Other */
+body:not([data-theme="light"]) .highlight .py { color: #D0D0D0 } /* Name.Property */
+body:not([data-theme="light"]) .highlight .nt { color: #6EBF26; font-weight: bold } /* Name.Tag */
+body:not([data-theme="light"]) .highlight .nv { color: #40FFFF } /* Name.Variable */
+body:not([data-theme="light"]) .highlight .ow { color: #6EBF26; font-weight: bold } /* Operator.Word */
+body:not([data-theme="light"]) .highlight .pm { color: #D0D0D0 } /* Punctuation.Marker */
+body:not([data-theme="light"]) .highlight .w { color: #666 } /* Text.Whitespace */
+body:not([data-theme="light"]) .highlight .mb { color: #51B2FD } /* Literal.Number.Bin */
+body:not([data-theme="light"]) .highlight .mf { color: #51B2FD } /* Literal.Number.Float */
+body:not([data-theme="light"]) .highlight .mh { color: #51B2FD } /* Literal.Number.Hex */
+body:not([data-theme="light"]) .highlight .mi { color: #51B2FD } /* Literal.Number.Integer */
+body:not([data-theme="light"]) .highlight .mo { color: #51B2FD } /* Literal.Number.Oct */
+body:not([data-theme="light"]) .highlight .sa { color: #ED9D13 } /* Literal.String.Affix */
+body:not([data-theme="light"]) .highlight .sb { color: #ED9D13 } /* Literal.String.Backtick */
+body:not([data-theme="light"]) .highlight .sc { color: #ED9D13 } /* Literal.String.Char */
+body:not([data-theme="light"]) .highlight .dl { color: #ED9D13 } /* Literal.String.Delimiter */
+body:not([data-theme="light"]) .highlight .sd { color: #ED9D13 } /* Literal.String.Doc */
+body:not([data-theme="light"]) .highlight .s2 { color: #ED9D13 } /* Literal.String.Double */
+body:not([data-theme="light"]) .highlight .se { color: #ED9D13 } /* Literal.String.Escape */
+body:not([data-theme="light"]) .highlight .sh { color: #ED9D13 } /* Literal.String.Heredoc */
+body:not([data-theme="light"]) .highlight .si { color: #ED9D13 } /* Literal.String.Interpol */
+body:not([data-theme="light"]) .highlight .sx { color: #FFA500 } /* Literal.String.Other */
+body:not([data-theme="light"]) .highlight .sr { color: #ED9D13 } /* Literal.String.Regex */
+body:not([data-theme="light"]) .highlight .s1 { color: #ED9D13 } /* Literal.String.Single */
+body:not([data-theme="light"]) .highlight .ss { color: #ED9D13 } /* Literal.String.Symbol */
+body:not([data-theme="light"]) .highlight .bp { color: #2FBCCD } /* Name.Builtin.Pseudo */
+body:not([data-theme="light"]) .highlight .fm { color: #71ADFF } /* Name.Function.Magic */
+body:not([data-theme="light"]) .highlight .vc { color: #40FFFF } /* Name.Variable.Class */
+body:not([data-theme="light"]) .highlight .vg { color: #40FFFF } /* Name.Variable.Global */
+body:not([data-theme="light"]) .highlight .vi { color: #40FFFF } /* Name.Variable.Instance */
+body:not([data-theme="light"]) .highlight .vm { color: #40FFFF } /* Name.Variable.Magic */
+body:not([data-theme="light"]) .highlight .il { color: #51B2FD } /* Literal.Number.Integer.Long */
}
}
\ No newline at end of file
diff --git a/_static/searchtools.js b/_static/searchtools.js
index 7918c3fab..b08d58c9b 100644
--- a/_static/searchtools.js
+++ b/_static/searchtools.js
@@ -4,7 +4,7 @@
*
* Sphinx JavaScript utilities for the full-text search.
*
- * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@@ -99,7 +99,7 @@ const _displayItem = (item, searchTerms, highlightTerms) => {
.then((data) => {
if (data)
listItem.appendChild(
- Search.makeSearchSummary(data, searchTerms)
+ Search.makeSearchSummary(data, searchTerms, anchor)
);
// highlight search terms in the summary
if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js
@@ -116,8 +116,8 @@ const _finishSearch = (resultCount) => {
);
else
Search.status.innerText = _(
- `Search finished, found ${resultCount} page(s) matching the search query.`
- );
+ "Search finished, found ${resultCount} page(s) matching the search query."
+ ).replace('${resultCount}', resultCount);
};
const _displayNextItem = (
results,
@@ -137,6 +137,22 @@ const _displayNextItem = (
// search finished, update title and status message
else _finishSearch(resultCount);
};
+// Helper function used by query() to order search results.
+// Each input is an array of [docname, title, anchor, descr, score, filename].
+// Order the results by score (in opposite order of appearance, since the
+// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically.
+const _orderResultsByScoreThenName = (a, b) => {
+ const leftScore = a[4];
+ const rightScore = b[4];
+ if (leftScore === rightScore) {
+ // same score: sort alphabetically
+ const leftTitle = a[1].toLowerCase();
+ const rightTitle = b[1].toLowerCase();
+ if (leftTitle === rightTitle) return 0;
+ return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
+ }
+ return leftScore > rightScore ? 1 : -1;
+};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
@@ -160,13 +176,26 @@ const Search = {
_queued_query: null,
_pulse_status: -1,
- htmlToText: (htmlString) => {
+ htmlToText: (htmlString, anchor) => {
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
- htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
+ for (const removalQuery of [".headerlink", "script", "style"]) {
+ htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() });
+ }
+ if (anchor) {
+ const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`);
+ if (anchorContent) return anchorContent.textContent;
+
+ console.warn(
+ `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.`
+ );
+ }
+
+ // if anchor not specified or not found, fall back to main content
const docContent = htmlElement.querySelector('[role="main"]');
- if (docContent !== undefined) return docContent.textContent;
+ if (docContent) return docContent.textContent;
+
console.warn(
- "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
+ "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template."
);
return "";
},
@@ -239,16 +268,7 @@ const Search = {
else Search.deferQuery(query);
},
- /**
- * execute search (requires search index to be loaded)
- */
- query: (query) => {
- const filenames = Search._index.filenames;
- const docNames = Search._index.docnames;
- const titles = Search._index.titles;
- const allTitles = Search._index.alltitles;
- const indexEntries = Search._index.indexentries;
-
+ _parseQuery: (query) => {
// stem the search terms and add them to the correct list
const stemmer = new Stemmer();
const searchTerms = new Set();
@@ -284,21 +304,38 @@ const Search = {
// console.info("required: ", [...searchTerms]);
// console.info("excluded: ", [...excludedTerms]);
- // array of [docname, title, anchor, descr, score, filename]
- let results = [];
+ return [query, searchTerms, excludedTerms, highlightTerms, objectTerms];
+ },
+
+ /**
+ * execute search (requires search index to be loaded)
+ */
+ _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => {
+ const filenames = Search._index.filenames;
+ const docNames = Search._index.docnames;
+ const titles = Search._index.titles;
+ const allTitles = Search._index.alltitles;
+ const indexEntries = Search._index.indexentries;
+
+ // Collect multiple result groups to be sorted separately and then ordered.
+ // Each is an array of [docname, title, anchor, descr, score, filename].
+ const normalResults = [];
+ const nonMainIndexResults = [];
+
_removeChildren(document.getElementById("search-progress"));
- const queryLower = query.toLowerCase();
+ const queryLower = query.toLowerCase().trim();
for (const [title, foundTitles] of Object.entries(allTitles)) {
- if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) {
+ if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) {
for (const [file, id] of foundTitles) {
- let score = Math.round(100 * queryLower.length / title.length)
- results.push([
+ const score = Math.round(Scorer.title * queryLower.length / title.length);
+ const boost = titles[file] === title ? 1 : 0; // add a boost for document titles
+ normalResults.push([
docNames[file],
titles[file] !== title ? `${titles[file]} > ${title}` : title,
id !== null ? "#" + id : "",
null,
- score,
+ score + boost,
filenames[file],
]);
}
@@ -308,46 +345,47 @@ const Search = {
// search for explicit entries in index directives
for (const [entry, foundEntries] of Object.entries(indexEntries)) {
if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) {
- for (const [file, id] of foundEntries) {
- let score = Math.round(100 * queryLower.length / entry.length)
- results.push([
+ for (const [file, id, isMain] of foundEntries) {
+ const score = Math.round(100 * queryLower.length / entry.length);
+ const result = [
docNames[file],
titles[file],
id ? "#" + id : "",
null,
score,
filenames[file],
- ]);
+ ];
+ if (isMain) {
+ normalResults.push(result);
+ } else {
+ nonMainIndexResults.push(result);
+ }
}
}
}
// lookup as object
objectTerms.forEach((term) =>
- results.push(...Search.performObjectSearch(term, objectTerms))
+ normalResults.push(...Search.performObjectSearch(term, objectTerms))
);
// lookup as search terms in fulltext
- results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
+ normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms));
// let the scorer override scores with a custom scoring function
- if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
-
- // now sort the results by score (in opposite order of appearance, since the
- // display function below uses pop() to retrieve items) and then
- // alphabetically
- results.sort((a, b) => {
- const leftScore = a[4];
- const rightScore = b[4];
- if (leftScore === rightScore) {
- // same score: sort alphabetically
- const leftTitle = a[1].toLowerCase();
- const rightTitle = b[1].toLowerCase();
- if (leftTitle === rightTitle) return 0;
- return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
- }
- return leftScore > rightScore ? 1 : -1;
- });
+ if (Scorer.score) {
+ normalResults.forEach((item) => (item[4] = Scorer.score(item)));
+ nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item)));
+ }
+
+ // Sort each group of results by score and then alphabetically by name.
+ normalResults.sort(_orderResultsByScoreThenName);
+ nonMainIndexResults.sort(_orderResultsByScoreThenName);
+
+ // Combine the result groups in (reverse) order.
+ // Non-main index entries are typically arbitrary cross-references,
+ // so display them after other results.
+ let results = [...nonMainIndexResults, ...normalResults];
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
@@ -361,7 +399,12 @@ const Search = {
return acc;
}, []);
- results = results.reverse();
+ return results.reverse();
+ },
+
+ query: (query) => {
+ const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query);
+ const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms);
// for debugging
//Search.lastresults = results.slice(); // a copy
@@ -466,14 +509,18 @@ const Search = {
// add support for partial matches
if (word.length > 2) {
const escapedWord = _escapeRegExp(word);
- Object.keys(terms).forEach((term) => {
- if (term.match(escapedWord) && !terms[word])
- arr.push({ files: terms[term], score: Scorer.partialTerm });
- });
- Object.keys(titleTerms).forEach((term) => {
- if (term.match(escapedWord) && !titleTerms[word])
- arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
- });
+ if (!terms.hasOwnProperty(word)) {
+ Object.keys(terms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: terms[term], score: Scorer.partialTerm });
+ });
+ }
+ if (!titleTerms.hasOwnProperty(word)) {
+ Object.keys(titleTerms).forEach((term) => {
+ if (term.match(escapedWord))
+ arr.push({ files: titleTerms[term], score: Scorer.partialTitle });
+ });
+ }
}
// no match but word was a required one
@@ -496,9 +543,8 @@ const Search = {
// create the mapping
files.forEach((file) => {
- if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
- fileMap.get(file).push(word);
- else fileMap.set(file, [word]);
+ if (!fileMap.has(file)) fileMap.set(file, [word]);
+ else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word);
});
});
@@ -549,8 +595,8 @@ const Search = {
* search summary for a given text. keywords is a list
* of stemmed words.
*/
- makeSearchSummary: (htmlText, keywords) => {
- const text = Search.htmlToText(htmlText);
+ makeSearchSummary: (htmlText, keywords, anchor) => {
+ const text = Search.htmlToText(htmlText, anchor);
if (text === "") return null;
const textLower = text.toLowerCase();
diff --git a/_static/styles/furo-extensions.css b/_static/styles/furo-extensions.css
index 4723a4a18..ee651ce3d 100644
--- a/_static/styles/furo-extensions.css
+++ b/_static/styles/furo-extensions.css
@@ -1,2 +1,2 @@
-#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)}h1{font-size:2.2rem}h2{font-size:1.7rem}h3{font-size:1.4rem}html:has(.farama-header-menu.active){visibility:hidden}.farama-hidden[aria-hidden=true]{visibility:hidden}.farama-hidden[aria-hidden=false]{visibility:visible}.cookie-alert{background-color:var(--color-background-secondary);border-top:1px solid var(--color-background-border);bottom:0;color:var(--color-foreground-primary);display:flex;left:0;min-height:70px;position:fixed;width:100%;z-index:99999}.cookie-alert__container{align-items:center;display:flex;margin:auto;max-width:calc(100% - 28px);width:700px}.cookie-alert__button{margin-left:14px}.cookie-alert p{flex:1}.farama-btn{background:var(--color-farama-button-background);border:none;border-radius:6px;cursor:pointer;padding:10px 26px;transition:background-color .2s ease}.farama-btn:hover{background:var(--color-farama-button-background-hover)}article[role=main]:has(.farama-env-icon-container) .farama-env-icon-container{display:flex;margin-top:7px;position:absolute}article[role=main]:has(.farama-env-icon-container) .section h1:first-child,article[role=main]:has(.farama-env-icon-container) .section h2:first-child,article[role=main]:has(.farama-env-icon-container) section h1:first-child,article[role=main]:has(.farama-env-icon-container) section h2:first-child{margin-left:34px}.farama-env-icon{height:32px}.env-grid{box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:center;width:100%}.env-grid__cell{display:flex;flex-direction:column;height:180px;padding:10px;width:180px}.cell__image-container{display:flex;height:148px;justify-content:center}.cell__image-container img{max-height:100%;-o-object-fit:contain;object-fit:contain}.cell__title{align-items:flex-end;display:flex;height:32px;justify-content:center;line-height:16px;text-align:center}.more-btn{display:block;margin:12px auto;width:240px}html:has(.farama-header-menu.active){overflow:hidden}body{--farama-header-height:52px;--farama-header-logo-margin:10px;--farama-sidebar-logo-margin:2px 10px}.farama-header{background-color:var(--color-background-secondary);border-bottom:1px solid var(--color-header-border);box-sizing:border-box;display:flex;height:var(--farama-header-height);padding:0 36px 0 24px;position:absolute;width:100%;z-index:95}.farama-header .farama-header__container{display:flex;justify-content:space-between;margin:0 auto;max-width:1400px;width:100%}.farama-header a{color:var(--color-foreground-primary);text-decoration:none;transition:color .125s ease}.farama-header a:hover{color:var(--color-foreground-secondary)}.farama-header .farama-header__logo{margin:var(--farama-header-logo-margin);max-height:calc(var(--farama-header-height) - var(--farama-header-logo-margin))}.farama-header .farama-header__title{align-self:center;font-size:var(--font-size--normal);font-weight:400;margin:0 0 2px;padding:0 0 0 4px}.farama-header .farama-header__left,.farama-header .farama-header__left a{display:flex}.farama-header .farama-header__left--mobile{display:none}.farama-header .farama-header__left--mobile .nav-overlay-icon svg{stroke:var(--color-foreground-primary);fill:var(--color-foreground-primary);stroke-width:2px;padding:0 6px;width:20px}.farama-header .farama-header__right{align-items:center;display:flex;z-index:2}.farama-header .farama-header__right .farama-header__nav{display:flex;height:100%;list-style:none}.farama-header .farama-header__right .farama-header__nav li{align-items:center;cursor:pointer;display:flex;margin-left:20px;text-decoration:none}.farama-header .farama-header__right .farama-header__nav li a{align-items:center;display:flex;height:100%}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container{align-items:center;display:flex;height:100%;position:relative}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container:hover .farama-header__dropdown-menu{display:block}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container svg{fill:var(--color-foreground-primary);width:32px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu{background:var(--color-background-hover);border:1px solid var(--color-background-border);display:none;position:absolute;right:0;top:var(--farama-header-height);z-index:9999}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu ul{display:inherit;margin:0;padding:6px 14px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu li{margin:0;padding:6px 0}.farama-header .farama-header__right .farama-header-menu{display:flex;justify-content:center;position:relative}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn img{width:26px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn svg{stroke:var(--color-foreground-primary);stroke-width:2px;align-self:center;width:14px}.farama-header .farama-header__right .farama-header-menu.active .farama-header-menu-container{transform:translateY(100vh)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container{background-color:var(--color-background-secondary);border-left:1px solid var(--color-background-border);box-sizing:border-box;height:100%;overflow:auto;position:fixed;right:0;top:-100vh;transform:translateY(0);transition:transform .2s ease-in;width:100%;z-index:99}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{align-items:center;border-bottom:1px solid var(--color-background-border);box-sizing:border-box;display:flex;margin:0 auto;max-width:1400px;padding:7px 52px;position:relative;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a{align-items:center;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a .farama-header-menu__logo{width:36px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a span{color:var(--color-sidebar-brand-text);padding-left:8px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right{padding-right:inherit;position:absolute;right:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button svg{color:var(--color-foreground-primary);width:20px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{box-sizing:border-box;display:flex;flex-wrap:wrap;margin:0 auto;max-width:1500px;padding:22px 52px;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section{margin-bottom:24px;min-width:220px;padding-left:18px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__section-title{display:block;font-size:var(--font-size--small);font-weight:600;padding:0 12px 12px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection{min-width:210px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection:not(:last-child){margin-right:12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection .farama-header-menu__subsection-title{color:var(--color-foreground-secondary);display:block;font-size:var(--font-size--small--3);font-weight:700;padding:20px 12px 10px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list{display:inherit;list-style:none;margin:0;padding:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li{border-radius:var(--sidebar-item-border-radius)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li:hover{background-color:var(--color-farama-header-background-hover)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a{align-items:center;display:flex;padding:12px 14px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a:hover{color:inherit}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a img{margin-right:10px;width:26px}.farama-sidebar__title{align-items:center;display:flex;margin-left:var(--sidebar-search-space-lateral);margin-top:.6rem;min-height:calc(52px - var(--sidebar-search-space-above));padding-right:4px;text-decoration:none}.farama-sidebar__title img{height:calc(var(--farama-header-height) - 20px);margin:var(--farama-sidebar-logo-margin)}.farama-sidebar__title span{color:var(--color-foreground-primary)}.farama-sidebar__title span:hover{text-decoration:none}.sidebar-brand{align-items:center;flex-direction:row;padding:var(--sidebar-item-spacing-vertical)}.sidebar-brand .sidebar-logo-container{display:flex;height:auto;max-width:55px}.sidebar-brand .sidebar-brand-text{font-size:1.3rem;padding-left:11px}.farama-sidebar-donate{margin:0 auto;padding:8px 16px 20px;width:76%}.farama-sidebar-donate .farama-donate-btn{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;border:none;border-radius:6px;color:#fff;cursor:pointer;padding:8px 12px;transition:background-color .2s ease;width:100%}.farama-sidebar-donate .farama-donate-btn:hover{background-color:hsla(0,0%,100%,.15)}.farama-donate-banner{background-color:var(--color-highlighted-background);box-sizing:border-box;display:none;padding:16px 3em;width:100%}.farama-donate-banner.active{display:flex}.farama-donate-banner .farama-donate-banner__text{align-items:center;display:flex;flex:1;font-size:1.1em;justify-content:center}.farama-donate-banner .farama-donate-banner__btns{align-items:center;display:flex}.farama-donate-banner .farama-donate-banner__btns a{text-decoration:none}.farama-donate-banner .farama-donate-banner__btns button{align-items:center;border:none;border-radius:6px;cursor:pointer;display:flex;height:36px;justify-content:center;margin-left:22px;position:relative}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;color:#fff;padding:0 26px;transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go:hover{background-color:hsla(0,0%,100%,.1)}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel{transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}@media(prefers-color-scheme:dark){body:not([data-theme=light]) .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body:not([data-theme=light]) .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body:not([data-theme=light]) .farama-donate-banner__cancel svg{stroke:#fff}body[data-theme=light] .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body[data-theme=light] .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body[data-theme=light] .farama-donate-banner__cancel svg{stroke:#666}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body:not([data-theme=dark]) .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body:not([data-theme=dark]) .farama-donate-banner__cancel svg{stroke:#666}body[data-theme=dark] .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body[data-theme=dark] .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body[data-theme=dark] .farama-donate-banner__cancel svg{stroke:#fff}}.farama-project-logo{margin:1.5rem 0 .8rem!important}.farama-project-heading{margin:0;padding:0 0 1.6rem;text-align:center}.farama-project-logo img{width:65%}.mobile-header .header-center{opacity:0;transition:opacity easy-in .2s}.mobile-header.scrolled .header-center{opacity:1}.sphx-glr-script-out{color:var(--color-foreground-secondary);display:flex;gap:.5em}.sphx-glr-script-out:before{content:"Out:";line-height:1.4;padding-top:10px}.sphx-glr-script-out .highlight{overflow-x:auto}.sphx-glr-thumbcontainer{z-index:1}div.sphx-glr-download a{background:#0f4a65;box-sizing:border-box;max-width:100%;width:340px}div.sphx-glr-download a:hover{background:#0d3a4e;box-shadow:none}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.sphx-glr-download a{background:#0f4a65}body:not([data-theme=light]) div.sphx-glr-download a:hover{background:#0d3a4e}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) div.sphx-glr-download a{background:#f9d4a1}body:not([data-theme=dark]) div.sphx-glr-download a:hover{background:#d9b481}body[data-theme=dark] div.sphx-glr-download a{background:#0f4a65}body[data-theme=dark] div.sphx-glr-download a:hover{background:#0d3a4e}}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}.sphx-glr-thumbcontainer img{background-color:#fff;border-radius:4px}.tab-content>[class^=highlight-]:first-child .highlight{background:var(--color-api-background);border-radius:6px}.tab-set>input+label{font-weight:600}.tab-set>input:checked+label,.tab-set>input:checked+label:hover{border-color:var(--color-brand-secondary);color:var(--color-brand-secondary)}div.jupyter_container{background:var(--color-api-background);border:none;box-shadow:none}div.jupyter_container div.code_cell,div.jupyter_container div.highlight{border:none;border-radius:0}div.jupyter_container div.code_cell pre{padding:.625rem .875rem}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}}body[data-theme=dark] div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}@media(max-width:950px){.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:7px 42px}.farama-header .farama-header-menu__btn-name{display:none}}@media(max-width:600px){.farama-header{padding:0 4px}.farama-header .farama-header__title{font-size:var(--font-size--small)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:8px 12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{padding:18px 12px}.farama-donate-banner{flex-direction:column}.farama-donate-banner .farama-donate-banner__btns{justify-content:end;margin-top:1em}.farama-donate-banner .farama-donate-banner__btns button{height:36px;margin-left:12px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{padding:0 20px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}}@media(max-width:480px){.farama-header .farama-header__title{width:110px}.farama-header .farama-header-menu__btn-name{text-align:right;width:100px}.farama-project-heading{text-align:left}.farama-header-menu__subsections-container{display:block!important}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-white-logo-invert,body[data-theme=dark] .farama-black-logo-invert{filter:invert(1)}}@media(prefers-color-scheme:dark){body:not([data-theme=light]) img[src*="//render.githubusercontent.com/render/math"]{filter:invert(90%)}body:not([data-theme=light]) .farama-black-logo-invert,body[data-theme=light] .farama-white-logo-invert{filter:invert(1)}}
+#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)}h1{font-size:2.2rem}h2{font-size:1.7rem}h3{font-size:1.4rem}html:has(.farama-header-menu.active){visibility:hidden}.farama-hidden[aria-hidden=true]{visibility:hidden}.farama-hidden[aria-hidden=false]{visibility:visible}.cookie-alert{background-color:var(--color-background-secondary);border-top:1px solid var(--color-background-border);bottom:0;color:var(--color-foreground-primary);display:flex;left:0;min-height:70px;position:fixed;width:100%;z-index:99999}.cookie-alert__container{align-items:center;display:flex;margin:auto;max-width:calc(100% - 28px);width:700px}.cookie-alert__button{margin-left:14px}.cookie-alert p{flex:1}.farama-btn{background:var(--color-farama-button-background);border:none;border-radius:6px;cursor:pointer;padding:10px 26px;transition:background-color .2s ease}.farama-btn:hover{background:var(--color-farama-button-background-hover)}article[role=main]:has(.farama-env-icon-container) .farama-env-icon-container{display:flex;margin-top:7px;position:absolute}article[role=main]:has(.farama-env-icon-container) .section h1:first-child,article[role=main]:has(.farama-env-icon-container) .section h2:first-child,article[role=main]:has(.farama-env-icon-container) section h1:first-child,article[role=main]:has(.farama-env-icon-container) section h2:first-child{margin-left:34px}.farama-env-icon{height:32px}.env-grid{box-sizing:border-box;display:flex;flex-wrap:wrap;justify-content:center;width:100%}.env-grid__cell{display:flex;flex-direction:column;height:180px;padding:10px;width:180px}.cell__image-container{display:flex;height:148px;justify-content:center}.cell__image-container img{max-height:100%;-o-object-fit:contain;object-fit:contain}.cell__title{align-items:flex-end;display:flex;height:32px;justify-content:center;line-height:16px;text-align:center}.more-btn{display:block;margin:12px auto;width:240px}html:has(.farama-header-menu.active){overflow:hidden}body{--farama-header-height:52px;--farama-header-logo-margin:10px;--farama-sidebar-logo-margin:2px 10px}.farama-header{background-color:var(--color-background-secondary);border-bottom:1px solid var(--color-header-border);box-sizing:border-box;display:flex;height:var(--farama-header-height);padding:0 36px 0 24px;position:absolute;width:100%;z-index:95}.farama-header .farama-header__container{display:flex;justify-content:space-between;margin:0 auto;max-width:1400px;width:100%}.farama-header a{color:var(--color-foreground-primary);text-decoration:none;transition:color .125s ease}.farama-header a:hover{color:var(--color-foreground-secondary)}.farama-header .farama-header__logo{margin:var(--farama-header-logo-margin);max-height:calc(var(--farama-header-height) - var(--farama-header-logo-margin))}.farama-header .farama-header__title{align-self:center;font-size:var(--font-size--normal);font-weight:400;margin:0 0 2px;padding:0 0 0 4px}.farama-header .farama-header__left,.farama-header .farama-header__left a{display:flex}.farama-header .farama-header__left--mobile{display:none}.farama-header .farama-header__left--mobile .nav-overlay-icon svg{stroke:var(--color-foreground-primary);fill:var(--color-foreground-primary);stroke-width:2px;padding:0 6px;width:20px}.farama-header .farama-header__right{align-items:center;display:flex;z-index:2}.farama-header .farama-header__right .farama-header__nav{display:flex;height:100%;list-style:none}.farama-header .farama-header__right .farama-header__nav li{align-items:center;cursor:pointer;display:flex;margin-left:20px;text-decoration:none}.farama-header .farama-header__right .farama-header__nav li a{align-items:center;display:flex;height:100%}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container{align-items:center;display:flex;height:100%;position:relative}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container:hover .farama-header__dropdown-menu{display:block}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container svg{fill:var(--color-foreground-primary);width:32px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu{background:var(--color-background-hover);border:1px solid var(--color-background-border);display:none;position:absolute;right:0;top:var(--farama-header-height);z-index:9999}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu ul{display:inherit;margin:0;padding:6px 14px}.farama-header .farama-header__right .farama-header__nav li .farama-header__dropdown-container .farama-header__dropdown-menu li{margin:0;padding:6px 0}.farama-header .farama-header__right .farama-header-menu{display:flex;justify-content:center;position:relative}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn img{width:26px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu__btn svg{stroke:var(--color-foreground-primary);stroke-width:2px;align-self:center;width:14px}.farama-header .farama-header__right .farama-header-menu.active .farama-header-menu-container{transform:translateY(100vh)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container{background-color:var(--color-background-secondary);border-left:1px solid var(--color-background-border);box-sizing:border-box;height:100%;overflow:auto;position:fixed;right:0;top:-100vh;transform:translateY(0);transition:transform .2s ease-in;width:100%;z-index:99}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{align-items:center;border-bottom:1px solid var(--color-background-border);box-sizing:border-box;display:flex;margin:0 auto;max-width:1400px;padding:7px 52px;position:relative;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a{align-items:center;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a .farama-header-menu__logo{width:36px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header a span{color:var(--color-sidebar-brand-text);padding-left:8px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right{padding-right:inherit;position:absolute;right:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button{background:none;border:none;cursor:pointer;display:flex}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header .farama-header-menu-header__right button svg{color:var(--color-foreground-primary);width:20px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{box-sizing:border-box;display:flex;flex-wrap:wrap;margin:0 auto;max-width:1500px;padding:22px 52px;width:100%}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section{margin-bottom:24px;min-width:220px;padding-left:18px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__section-title{display:block;font-size:var(--font-size--small);font-weight:600;padding:0 12px 12px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection{min-width:210px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection:not(:last-child){margin-right:12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu__subsections-container .farama-header-menu__subsection .farama-header-menu__subsection-title{color:var(--color-foreground-secondary);display:block;font-size:var(--font-size--small--3);font-weight:700;padding:20px 12px 10px;text-transform:uppercase}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list{display:inherit;list-style:none;margin:0;padding:0}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li{border-radius:var(--sidebar-item-border-radius)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li:hover{background-color:var(--color-farama-header-background-hover)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a{align-items:center;display:flex;padding:12px 14px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a:hover{color:inherit}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body .farama-header-menu__section .farama-header-menu-list li a img{margin-right:10px;width:26px}.farama-sidebar__title{align-items:center;display:flex;margin-left:var(--sidebar-search-space-lateral);margin-top:.6rem;min-height:calc(52px - var(--sidebar-search-space-above));padding-right:4px;text-decoration:none}.farama-sidebar__title img{height:calc(var(--farama-header-height) - 20px);margin:var(--farama-sidebar-logo-margin)}.farama-sidebar__title span{color:var(--color-foreground-primary)}.farama-sidebar__title span:hover{text-decoration:none}.sidebar-brand{align-items:center;flex-direction:row;padding:var(--sidebar-item-spacing-vertical)}.sidebar-brand .sidebar-logo-container{display:flex;height:auto;max-width:55px}.sidebar-brand .sidebar-brand-text{font-size:1.3rem;padding-left:11px}.farama-sidebar-donate{margin:0 auto;padding:8px 16px 20px;width:76%}.farama-sidebar-donate .farama-donate-btn{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;border:none;border-radius:6px;color:#fff;cursor:pointer;padding:8px 12px;transition:background-color .2s ease;width:100%}.farama-sidebar-donate .farama-donate-btn:hover{background-color:hsla(0,0%,100%,.15)}.farama-donate-banner{background-color:var(--color-highlighted-background);box-sizing:border-box;display:none;padding:16px 3em;width:100%}.farama-donate-banner.active{display:flex}.farama-donate-banner .farama-donate-banner__text{align-items:center;display:flex;flex:1;font-size:1.1em;justify-content:center}.farama-donate-banner .farama-donate-banner__btns{align-items:center;display:flex}.farama-donate-banner .farama-donate-banner__btns a{text-decoration:none}.farama-donate-banner .farama-donate-banner__btns button{align-items:center;border:none;border-radius:6px;cursor:pointer;display:flex;height:36px;justify-content:center;margin-left:22px;position:relative}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{background:linear-gradient(to right top,#765e3e,#054f5b);background-blend-mode:color;background-color:transparent;color:#fff;padding:0 26px;transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go:hover{background-color:hsla(0,0%,100%,.1)}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel{transition:background-color .2s ease}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}@media(prefers-color-scheme:dark){body:not([data-theme=light]) .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body:not([data-theme=light]) .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body:not([data-theme=light]) .farama-donate-banner__cancel svg{stroke:#fff}body[data-theme=light] .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body[data-theme=light] .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body[data-theme=light] .farama-donate-banner__cancel svg{stroke:#666}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-donate-banner__cancel{background-color:rgba(25,25,25,.1)}body:not([data-theme=dark]) .farama-donate-banner__cancel:hover{background:hsla(0,0%,100%,.2)}body:not([data-theme=dark]) .farama-donate-banner__cancel svg{stroke:#666}body[data-theme=dark] .farama-donate-banner__cancel{background-color:rgba(0,0,0,.1)}body[data-theme=dark] .farama-donate-banner__cancel:hover{background:rgba(0,0,0,.2)}body[data-theme=dark] .farama-donate-banner__cancel svg{stroke:#fff}}.farama-project-logo{margin:1.5rem 0 .8rem!important}.farama-project-heading{margin:0;padding:0 0 1.6rem;text-align:center}.farama-project-logo img{width:65%}.mobile-header .header-center{opacity:0;transition:opacity easy-in .2s}.mobile-header.scrolled .header-center{opacity:1}.sphx-glr-script-out{color:var(--color-foreground-secondary);display:flex;gap:.5em}.sphx-glr-script-out:before{content:"Out:";line-height:1.4;padding-top:10px}.sphx-glr-script-out .highlight{overflow-x:auto}.sphx-glr-thumbcontainer{z-index:1}div.sphx-glr-download a{background:#0f4a65;box-sizing:border-box;max-width:100%;width:340px}div.sphx-glr-download a:hover{background:#0d3a4e;box-shadow:none}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.sphx-glr-download a{background:#0f4a65}body:not([data-theme=light]) div.sphx-glr-download a:hover{background:#0d3a4e}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) div.sphx-glr-download a{background:#f9d4a1}body:not([data-theme=dark]) div.sphx-glr-download a:hover{background:#d9b481}body[data-theme=dark] div.sphx-glr-download a{background:#0f4a65}body[data-theme=dark] div.sphx-glr-download a:hover{background:#0d3a4e}}body[data-theme=light] div.sphx-glr-download a{background:#f9d4a1}body[data-theme=light] div.sphx-glr-download a:hover{background:#d9b481}.sphx-glr-thumbcontainer img{background-color:#fff;border-radius:4px}.tab-content>[class^=highlight-]:first-child .highlight{background:var(--color-api-background);border-radius:6px}.tab-set>input+label{font-weight:600}.tab-set>input:checked+label,.tab-set>input:checked+label:hover{border-color:var(--color-brand-secondary);color:var(--color-brand-secondary)}div.jupyter_container{background:var(--color-api-background);border:none;box-shadow:none}div.jupyter_container div.code_cell,div.jupyter_container div.highlight{border:none;border-radius:0}div.jupyter_container div.code_cell pre{padding:.625rem .875rem}@media(prefers-color-scheme:dark){body:not([data-theme=light]) div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}}body[data-theme=dark] div.jupyter_container div.highlight{background:#202020;color:#d0d0d0}@media(max-width:950px){.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:7px 42px}.farama-header .farama-header-menu__btn-name{display:none}}@media(max-width:600px){.farama-header{padding:0 4px}.farama-header .farama-header__title{font-size:var(--font-size--small)}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header{padding:8px 12px}.farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__body{padding:18px 12px}.farama-donate-banner{flex-direction:column}.farama-donate-banner .farama-donate-banner__btns{justify-content:end;margin-top:1em}.farama-donate-banner .farama-donate-banner__btns button{height:36px;margin-left:12px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__go{padding:0 20px}.farama-donate-banner .farama-donate-banner__btns .farama-donate-banner__cancel svg{height:26px}}@media(max-width:480px){.farama-header .farama-header__title{width:110px}.farama-header .farama-header-menu__btn-name{text-align:right;width:100px}.farama-project-heading{text-align:left}.farama-header-menu__subsections-container{display:block!important}}@media(min-width:1260px){div.highlight{max-width:60vw;width:-moz-fit-content;width:fit-content}}@media(min-width:2160px){div.highlight{max-width:50vw}}@media(prefers-color-scheme:light){body:not([data-theme=dark]) .farama-white-logo-invert,body[data-theme=dark] .farama-black-logo-invert{filter:invert(1)}}@media(prefers-color-scheme:dark){body:not([data-theme=light]) img[src*="//render.githubusercontent.com/render/math"]{filter:invert(90%)}body:not([data-theme=light]) .farama-black-logo-invert,body[data-theme=light] .farama-white-logo-invert{filter:invert(1)}}
/*# sourceMappingURL=furo-extensions.css.map*/
\ No newline at end of file
diff --git a/_static/styles/furo-extensions.css.map b/_static/styles/furo-extensions.css.map
index 84c17a00f..866dff103 100644
--- a/_static/styles/furo-extensions.css.map
+++ b/_static/styles/furo-extensions.css.map
@@ -1 +1 @@
-{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA,8BCbF,GACI,iBACJ,GACI,iBACJ,GACI,iBAGJ,qCACI,kBAEJ,iCACI,kBAEJ,kCACI,mBAIJ,cAKI,mDAEA,oDACA,SAFA,sCAJA,aAOA,OALA,gBAHA,eAEA,WAOA,cAEJ,yBAEI,mBADA,aAIA,YADA,4BADA,WAEA,CAEJ,sBACI,iBAEJ,gBACI,OAIJ,YACI,iDAGA,YADA,kBAGA,eAJA,kBAGA,oCACA,CAEA,kBACI,uDAKJ,8EAEI,aACA,eAFA,iBAEA,CAEJ,0SACI,iBAER,iBACI,YAIJ,UAKI,sBAJA,aACA,eACA,uBACA,UACA,CAEJ,gBACI,aACA,sBAEA,aACA,aAFA,WAEA,CAEJ,uBACI,aACA,aACA,uBAEJ,2BACI,gBACA,yCAEJ,aAII,qBAHA,aAIA,YAHA,uBAIA,iBAHA,iBAGA,CAEJ,UAGI,cADA,iBADA,WAEA,CAIJ,qCACI,gBAEJ,KACI,2BAA4B,CAC5B,gCAAiC,CACjC,qCAAsC,CAE1C,eAMI,mDADA,mDAGA,sBANA,aAEA,mCAGA,sBANA,kBAEA,WAMA,WAEA,yCAGI,aAEA,8BADA,cAFA,iBADA,UAIA,CAEJ,iBACI,sCACA,qBACA,4BAEA,uBACI,wCAER,oCAEI,wCADA,+EACA,CAEJ,qCAKI,kBAJA,mCACA,gBACA,eACA,iBACA,CAKA,0EACI,aAER,4CACI,aAEA,kEAEI,uCACA,qCACA,iBACA,cAJA,UAIA,CAER,qCAEI,mBADA,aAEA,UAEA,yDACI,aAEA,YADA,eACA,CAEA,4DAII,mBACA,eAFA,aADA,iBADA,oBAIA,CAEA,8DAGI,mBADA,aADA,WAEA,CAEJ,+FAGI,mBADA,aAEA,YAHA,iBAGA,CAGI,mIACI,cAER,mGAEI,qCADA,UACA,CAEJ,6HAKI,yCADA,gDAGA,aANA,kBAEA,QADA,gCAIA,YACA,CAEA,gIACI,gBACA,SACA,iBAEJ,gIACI,SACA,cAEpB,yDAEI,aACA,uBAFA,iBAEA,CAEA,kFAEI,gBACA,YACA,eAHA,YAGA,CAEA,sFACI,WACJ,sFAEI,uCACA,iBACA,kBAHA,UAGA,CAGR,8FACI,4BAEJ,uFAUI,mDACA,qDAHA,sBAFA,YAMA,cAXA,eAEA,QACA,WAGA,wBAEA,iCAJA,WAHA,UAUA,CAEA,mHASI,mBAFA,uDAHA,sBAIA,aAHA,cAFA,iBAGA,iBALA,kBACA,UAOA,CAEA,qHAEI,mBADA,YACA,CAEA,+IACI,WAEJ,0HACI,sCACA,iBAER,qJAGI,sBAFA,kBACA,OACA,CAEA,4JAEI,gBACA,YACA,eAHA,YAGA,CAEA,gKAEI,sCADA,UACA,CAEhB,iHAKI,sBAJA,aAMA,eADA,cAHA,iBACA,kBAFA,UAKA,CAEA,8IAEI,mBADA,gBAEA,kBAEA,iLACI,cACA,kCACA,gBAEA,oBADA,wBACA,CAIA,yNACI,gBAEA,0OACI,kBAEJ,+PAGI,wCAFA,cACA,qCAEA,gBAEA,uBADA,wBACA,CAEZ,uKACI,gBAGA,gBAFA,SACA,SACA,CAEA,0KACI,gDAEA,gLACI,6DAEJ,4KAGI,mBAFA,aACA,iBACA,CAEA,kLACI,cAEJ,gLAEI,kBADA,UACA,CAExC,uBAEI,mBADA,aAKA,gDADA,iBADA,0DADA,kBAIA,qBAEA,2BACI,gDACA,yCACJ,4BACI,sCACA,kCACI,qBAEZ,eAGI,mBAFA,mBACA,4CACA,CAEA,uCACI,aAEA,YADA,cACA,CAEJ,mCACI,iBACA,kBAER,uBAGI,cADA,sBADA,SAEA,CAEA,0CAII,wDAnZY,CAoZZ,4BACA,6BAEA,YACA,kBANA,WAOA,eARA,iBAKA,qCANA,UASA,CAEA,gDACI,qCAEZ,sBAKI,qDADA,sBAHA,aACA,iBACA,UAEA,CAEA,6BACI,aAEJ,kDAII,mBAFA,aADA,OAIA,gBAFA,sBAEA,CAEJ,kDAEI,mBADA,YACA,CAEA,oDACI,qBAEJ,yDAQI,mBAJA,YACA,kBAIA,eAHA,aAJA,YAKA,uBANA,iBAEA,iBAMA,CAEJ,4EAEI,wDAncQ,CAocR,4BACA,6BAHA,WAKA,eADA,oCACA,CAEA,kFACI,oCAER,gFACI,qCAEA,oFACI,YAEhB,kCAEQ,2DACI,gCACA,iEACI,0BACJ,+DACI,YAGR,qDACI,mCACA,2DACQ,8BACR,yDACI,aAEhB,mCAEQ,0DACI,mCACA,gEACQ,8BACR,8DACI,YAGR,oDACI,gCACA,0DACI,0BACJ,wDACI,aAKhB,qBACI,gCAEJ,wBAGI,QAAO,CADP,mBADA,iBAEA,CAEJ,yBACI,UAGA,8BAEI,SAAQ,CADR,8BACA,CAGJ,uCACI,UAIR,qBACI,wCACA,aACA,SAEJ,4BACI,eACA,gBACA,iBAEJ,gCACI,gBAEJ,yBACI,UAEJ,wBAII,mBADA,sBADA,eADA,WAGA,CAEJ,8BACI,mBACA,gBAEJ,kCAEQ,qDACI,mBACJ,2DACI,mBAEJ,+CACI,mBACJ,qDACI,oBAEZ,mCAEQ,oDACI,mBACJ,0DACI,mBAEJ,8CACI,mBACJ,oDACI,oBAGR,+CACI,mBACJ,qDACI,mBAER,6BACI,sBACA,kBAIJ,wDACI,uCACA,kBAEJ,qBACI,gBAEJ,gEAEI,0CADA,kCACA,CAIJ,sBACI,uCACA,YACA,gBAEA,wEACI,YACA,gBAEJ,wCACI,wBAER,kCACI,iEACI,mBACA,eAGJ,0DACI,mBACA,cAKR,wBACI,mHACI,iBAEJ,6CACI,cAGR,wBACI,eACI,cAEA,qCACI,kCAGA,mHACI,iBACJ,iHACI,kBAEZ,sBACI,sBAGA,kDAEI,oBADA,cACA,CAEA,yDAEI,YADA,gBACA,CAEJ,4EACI,eAGA,oFACI,aAGpB,wBAEQ,qCACI,YAEJ,6CACI,iBACA,YAER,wBACI,gBAEJ,2CACI,yBAGR,mCAMQ,sGACI,kBAGZ,kCAGQ,oFACI,mBAMJ,wGACI","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass","webpack:///./src/furo/assets/styles/extensions/_farama.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n","// Farama Base\n\n$farama-background: linear-gradient(to right top, #765e3e, #054f5b)\n\nh1\n font-size: 2.2rem\nh2\n font-size: 1.7rem\nh3\n font-size: 1.4rem\n\n// If menu is active then all elements except the menu are not visible (i.e. only element with aria-hidden=\"true\")\nhtml:has(.farama-header-menu.active)\n visibility: hidden\n\n.farama-hidden[aria-hidden=\"true\"]\n visibility: hidden\n\n.farama-hidden[aria-hidden=\"false\"]\n visibility: visible\n\n// Cookies Alert\n\n.cookie-alert\n position: fixed\n display: flex\n width: 100%\n min-height: 70px\n background-color: var(--color-background-secondary)\n color: var(--color-foreground-primary)\n border-top: 1px solid var(--color-background-border)\n bottom: 0\n left: 0\n z-index: 99999\n\n.cookie-alert__container\n display: flex\n align-items: center\n width: 700px\n max-width: calc(100% - 28px)\n margin: auto\n\n.cookie-alert__button\n margin-left: 14px\n\n.cookie-alert p\n flex: 1\n\n// Farama default button style\n\n.farama-btn\n background: var(--color-farama-button-background)\n padding: 10px 26px\n border-radius: 6px\n border: none\n transition: background-color 0.2s ease\n cursor: pointer\n\n &:hover\n background: var(--color-farama-button-background-hover)\n\n// Env Icons\n\narticle[role=main]:has(.farama-env-icon-container)\n .farama-env-icon-container\n position: absolute\n display: flex\n margin-top: 7px\n\n .section h1:first-child, .section h2:first-child, section h1:first-child, section h2:first-child\n margin-left: 34px\n\n.farama-env-icon\n height: 32px\n\n// Envinronments grid\n\n.env-grid\n display: flex\n flex-wrap: wrap\n justify-content: center\n width: 100%\n box-sizing: border-box\n\n.env-grid__cell\n display: flex\n flex-direction: column\n width: 180px\n height: 180px\n padding: 10px\n\n.cell__image-container\n display: flex\n height: 148px\n justify-content: center\n\n.cell__image-container img\n max-height: 100%\n object-fit: contain\n\n.cell__title\n display: flex\n justify-content: center\n text-align: center\n align-items: flex-end\n height: 32px\n line-height: 16px\n\n.more-btn\n width: 240px\n margin: 12px auto\n display: block\n\n// Farama Header\n\nhtml:has(.farama-header-menu.active)\n overflow: hidden\n\nbody\n --farama-header-height: 52px\n --farama-header-logo-margin: 10px\n --farama-sidebar-logo-margin: 2px 10px\n\n.farama-header\n position: absolute\n display: flex\n width: 100%\n height: var(--farama-header-height)\n border-bottom: 1px solid var(--color-header-border)\n background-color: var(--color-background-secondary)\n padding: 0 36px 0 24px\n box-sizing: border-box\n z-index: 95\n\n .farama-header__container\n width: 100%\n max-width: 1400px\n display: flex\n margin: 0 auto\n justify-content: space-between\n\n a\n color: var(--color-foreground-primary)\n text-decoration: none\n transition: color 0.125s ease\n\n &:hover\n color: var(--color-foreground-secondary)\n\n .farama-header__logo\n max-height: calc(var(--farama-header-height) - var(--farama-header-logo-margin))\n margin: var(--farama-header-logo-margin)\n\n .farama-header__title\n font-size: var(--font-size--normal)\n font-weight: normal\n margin: 0 0 2px 0\n padding: 0 0 0 4px\n align-self: center\n\n .farama-header__left\n display: flex\n\n a\n display: flex\n\n .farama-header__left--mobile\n display: none\n\n .nav-overlay-icon svg\n width: 20px\n stroke: var(--color-foreground-primary)\n fill: var(--color-foreground-primary)\n stroke-width: 2px\n padding: 0 6px\n\n .farama-header__right\n display: flex\n align-items: center\n z-index: 2\n\n .farama-header__nav\n display: flex\n list-style: none\n height: 100%\n\n li\n text-decoration: none\n margin-left: 20px\n display: flex\n align-items: center\n cursor: pointer\n\n a\n height: 100%\n display: flex\n align-items: center\n\n .farama-header__dropdown-container\n position: relative\n display: flex\n align-items: center\n height: 100%\n\n &:hover\n .farama-header__dropdown-menu\n display: block\n\n svg\n width: 32px\n fill: var(--color-foreground-primary)\n\n .farama-header__dropdown-menu\n position: absolute\n top: var(--farama-header-height)\n right: 0\n border: 1px solid var(--color-background-border)\n background: var(--color-background-hover)\n z-index: 9999\n display: none\n\n ul\n display: inherit\n margin: 0\n padding: 6px 14px\n\n li\n margin: 0\n padding: 6px 0\n\n .farama-header-menu\n position: relative\n display: flex\n justify-content: center\n\n .farama-header-menu__btn\n display: flex\n background: none\n border: none\n cursor: pointer\n\n img\n width: 26px\n svg\n width: 14px\n stroke: var(--color-foreground-primary)\n stroke-width: 2px\n align-self: center\n\n\n &.active .farama-header-menu-container\n transform: translateY(100vh)\n\n .farama-header-menu-container\n position: fixed\n z-index: 99\n right: 0\n top: -100vh\n width: 100%\n height: calc(100vh - calc(100vh - 100%))\n transform: translateY(0)\n box-sizing: border-box\n transition: transform 0.2s ease-in\n background-color: var(--color-background-secondary)\n border-left: 1px solid var(--color-background-border)\n overflow: auto\n\n .farama-header-menu__header\n position: relative\n width: 100%\n max-width: 1400px\n box-sizing: border-box\n margin: 0 auto\n padding: 7px 52px\n border-bottom: 1px solid var(--color-background-border)\n display: flex\n align-items: center\n\n a\n display: flex\n align-items: center\n\n .farama-header-menu__logo\n width: 36px\n\n span\n color: var(--color-sidebar-brand-text)\n padding-left: 8px\n\n .farama-header-menu-header__right\n position: absolute\n right: 0\n padding-right: inherit\n\n button\n display: flex\n background: none\n border: none\n cursor: pointer\n\n svg\n width: 20px\n color: var(--color-foreground-primary)\n\n .farama-header-menu__body\n display: flex\n width: 100%\n max-width: 1500px\n padding: 22px 52px\n box-sizing: border-box\n margin: 0 auto\n flex-wrap: wrap\n\n .farama-header-menu__section\n min-width: 220px\n margin-bottom: 24px\n padding-left: 18px\n\n .farama-header-menu__section-title\n display: block\n font-size: var(--font-size--small)\n font-weight: 600\n text-transform: uppercase\n padding: 0 12px 12px\n\n .farama-header-menu__subsections-container\n\n .farama-header-menu__subsection\n min-width: 210px\n\n &:not(:last-child)\n margin-right: 12px\n\n .farama-header-menu__subsection-title\n display: block\n font-size: var(--font-size--small--3)\n color: var(--color-foreground-secondary)\n font-weight: 700\n text-transform: uppercase\n padding: 20px 12px 10px\n\n .farama-header-menu-list\n display: inherit\n margin: 0\n padding: 0\n list-style: none\n\n li\n border-radius: var(--sidebar-item-border-radius)\n\n &:hover\n background-color: var(--color-farama-header-background-hover)\n\n a\n display: flex\n padding: 12px 14px\n align-items: center\n\n &:hover\n color: inherit\n\n img\n width: 26px\n margin-right: 10px\n\n.farama-sidebar__title\n display: flex\n align-items: center\n padding-right: 4px\n min-height: calc(52px - var(--sidebar-search-space-above))\n margin-top: 0.6rem\n margin-left: var(--sidebar-search-space-lateral)\n text-decoration: none\n\n img\n height: calc(var(--farama-header-height) - 20px)\n margin: var(--farama-sidebar-logo-margin)\n span\n color: var(--color-foreground-primary)\n &:hover\n text-decoration: none\n\n.sidebar-brand\n flex-direction: row\n padding: var(--sidebar-item-spacing-vertical)\n align-items: center\n\n .sidebar-logo-container\n display: flex\n max-width: 55px\n height: auto\n\n .sidebar-brand-text\n font-size: 1.3rem\n padding-left: 11px\n\n.farama-sidebar-donate\n width: 76%\n padding: 8px 16px 20px\n margin: 0 auto\n\n .farama-donate-btn\n width: 100%\n padding: 8px 12px\n color: #fff\n background: $farama-background\n background-blend-mode: color\n background-color: transparent\n transition: background-color 0.2s ease\n border: none\n border-radius: 6px\n cursor: pointer\n\n &:hover\n background-color: rgb(255 255 255 / 15%)\n\n.farama-donate-banner\n display: none\n padding: 16px 3em\n width: 100%\n box-sizing: border-box\n background-color: var(--color-highlighted-background)\n\n &.active\n display: flex\n\n .farama-donate-banner__text\n flex: 1\n display: flex\n justify-content: center\n align-items: center\n font-size: 1.1em\n\n .farama-donate-banner__btns\n display: flex\n align-items: center\n\n a\n text-decoration: none\n\n button\n margin-left: 22px\n height: 36px\n position: relative\n border: none\n border-radius: 6px\n display: flex\n justify-content: center\n align-items: center\n cursor: pointer\n\n .farama-donate-banner__go\n color: #fff\n background: $farama-background\n background-blend-mode: color\n background-color: transparent\n transition: background-color 0.2s ease\n padding: 0 26px\n\n &:hover\n background-color: rgb(255 255 255 / 10%)\n\n .farama-donate-banner__cancel\n transition: background-color 0.2s ease\n\n svg\n height: 26px\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n .farama-donate-banner__cancel\n background-color: rgb(0 0 0 / 10%)\n &:hover\n background: rgb(0 0 0 / 20%)\n svg\n stroke: #fff\n\n body[data-theme=\"light\"]\n .farama-donate-banner__cancel\n background-color: rgb(25 25 25 / 10%)\n &:hover\n background: rgb(255 255 255 / 20%)\n svg\n stroke: #666\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n .farama-donate-banner__cancel\n background-color: rgb(25 25 25 / 10%)\n &:hover\n background: rgb(255 255 255 / 20%)\n svg\n stroke: #666\n\n body[data-theme=\"dark\"]\n .farama-donate-banner__cancel\n background-color: rgb(0 0 0 / 10%)\n &:hover\n background: rgb(0 0 0 / 20%)\n svg\n stroke: #fff\n\n\n// Farama custom directives\n\n.farama-project-logo\n margin: 1.5rem 0 0.8rem !important\n\n.farama-project-heading\n text-align: center\n padding: 0 0 1.6rem 0\n margin: 0\n\n.farama-project-logo img\n width: 65%\n\n.mobile-header\n .header-center\n transition: opacity 0.2s easy-in\n opacity: 0\n\n.mobile-header.scrolled\n .header-center\n opacity: 1\n\n// Sphinx Gallery\n\n.sphx-glr-script-out\n color: var(--color-foreground-secondary)\n display: flex\n gap: 0.5em\n\n.sphx-glr-script-out::before\n content: \"Out:\"\n line-height: 1.4\n padding-top: 10px\n\n.sphx-glr-script-out .highlight\n overflow-x: auto\n\n.sphx-glr-thumbcontainer\n z-index: 1\n\ndiv.sphx-glr-download a\n width: 340px\n max-width: 100%\n box-sizing: border-box\n background: #0f4a65\n\ndiv.sphx-glr-download a:hover\n background: #0d3a4e\n box-shadow: none\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n div.sphx-glr-download a\n background: #0f4a65\n div.sphx-glr-download a:hover\n background: #0d3a4e\n body[data-theme=\"light\"]\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n body[data-theme=\"dark\"]\n div.sphx-glr-download a\n background: #0f4a65\n div.sphx-glr-download a:hover\n background: #0d3a4e\n\nbody[data-theme=\"light\"]\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n\n.sphx-glr-thumbcontainer img\n background-color: white\n border-radius: 4px\n\n// Override Tabs styles\n\n.tab-content > [class^=\"highlight-\"]:first-child .highlight\n background: var(--color-api-background)\n border-radius: 6px\n\n.tab-set > input + label\n font-weight: 600\n\n.tab-set > input:checked + label, .tab-set > input:checked + label:hover\n color: var(--color-brand-secondary)\n border-color: var(--color-brand-secondary)\n\n// Sphinx Jupyter\n\ndiv.jupyter_container\n background: var(--color-api-background)\n border: none\n box-shadow: none\n\n div.code_cell, div.highlight\n border: none\n border-radius: 0\n\n div.code_cell pre\n padding: 0.625rem 0.875rem\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"]) div.jupyter_container div.highlight\n background: #202020\n color: #d0d0d0\n\nbody[data-theme=\"dark\"]\n div.jupyter_container div.highlight\n background: #202020\n color: #d0d0d0\n\n\n\n\n@media (max-width: 950px)\n .farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header\n padding: 7px 42px\n\n .farama-header .farama-header-menu__btn-name\n display: none\n\n\n@media (max-width: 600px)\n .farama-header\n padding: 0 4px\n\n .farama-header__title\n font-size: var(--font-size--small)\n\n .farama-header__right .farama-header-menu .farama-header-menu-container\n .farama-header-menu__header\n padding: 8px 12px\n .farama-header-menu__body\n padding: 18px 12px\n\n .farama-donate-banner\n flex-direction: column\n\n\n .farama-donate-banner__btns\n margin-top: 1em\n justify-content: end\n\n button\n margin-left: 12px\n height: 36px\n\n .farama-donate-banner__go\n padding: 0 20px\n\n .farama-donate-banner__cancel\n svg\n height: 26px\n\n\n@media (max-width: 480px)\n .farama-header\n .farama-header__title\n width: 110px\n\n .farama-header-menu__btn-name\n text-align: right\n width: 100px\n\n .farama-project-heading\n text-align: left\n\n .farama-header-menu__subsections-container\n display: block !important\n\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n .farama-white-logo-invert\n filter: invert(1)\n\n body[data-theme=\"dark\"]\n .farama-black-logo-invert\n filter: invert(1)\n\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n // Github math render\n img[src*=\"//render.githubusercontent.com/render/math\"]\n filter: invert(90%)\n\n .farama-black-logo-invert\n filter: invert(1)\n\n body[data-theme=\"light\"]\n .farama-white-logo-invert\n filter: invert(1)\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA,8BCbF,GACI,iBACJ,GACI,iBACJ,GACI,iBAGJ,qCACI,kBAEJ,iCACI,kBAEJ,kCACI,mBAIJ,cAKI,mDAEA,oDACA,SAFA,sCAJA,aAOA,OALA,gBAHA,eAEA,WAOA,cAEJ,yBAEI,mBADA,aAIA,YADA,4BADA,WAEA,CAEJ,sBACI,iBAEJ,gBACI,OAIJ,YACI,iDAGA,YADA,kBAGA,eAJA,kBAGA,oCACA,CAEA,kBACI,uDAKJ,8EAEI,aACA,eAFA,iBAEA,CAEJ,0SACI,iBAER,iBACI,YAIJ,UAKI,sBAJA,aACA,eACA,uBACA,UACA,CAEJ,gBACI,aACA,sBAEA,aACA,aAFA,WAEA,CAEJ,uBACI,aACA,aACA,uBAEJ,2BACI,gBACA,yCAEJ,aAII,qBAHA,aAIA,YAHA,uBAIA,iBAHA,iBAGA,CAEJ,UAGI,cADA,iBADA,WAEA,CAIJ,qCACI,gBAEJ,KACI,2BAA4B,CAC5B,gCAAiC,CACjC,qCAAsC,CAE1C,eAMI,mDADA,mDAGA,sBANA,aAEA,mCAGA,sBANA,kBAEA,WAMA,WAEA,yCAGI,aAEA,8BADA,cAFA,iBADA,UAIA,CAEJ,iBACI,sCACA,qBACA,4BAEA,uBACI,wCAER,oCAEI,wCADA,+EACA,CAEJ,qCAKI,kBAJA,mCACA,gBACA,eACA,iBACA,CAKA,0EACI,aAER,4CACI,aAEA,kEAEI,uCACA,qCACA,iBACA,cAJA,UAIA,CAER,qCAEI,mBADA,aAEA,UAEA,yDACI,aAEA,YADA,eACA,CAEA,4DAII,mBACA,eAFA,aADA,iBADA,oBAIA,CAEA,8DAGI,mBADA,aADA,WAEA,CAEJ,+FAGI,mBADA,aAEA,YAHA,iBAGA,CAGI,mIACI,cAER,mGAEI,qCADA,UACA,CAEJ,6HAKI,yCADA,gDAGA,aANA,kBAEA,QADA,gCAIA,YACA,CAEA,gIACI,gBACA,SACA,iBAEJ,gIACI,SACA,cAEpB,yDAEI,aACA,uBAFA,iBAEA,CAEA,kFAEI,gBACA,YACA,eAHA,YAGA,CAEA,sFACI,WACJ,sFAEI,uCACA,iBACA,kBAHA,UAGA,CAGR,8FACI,4BAEJ,uFAUI,mDACA,qDAHA,sBAFA,YAMA,cAXA,eAEA,QACA,WAGA,wBAEA,iCAJA,WAHA,UAUA,CAEA,mHASI,mBAFA,uDAHA,sBAIA,aAHA,cAFA,iBAGA,iBALA,kBACA,UAOA,CAEA,qHAEI,mBADA,YACA,CAEA,+IACI,WAEJ,0HACI,sCACA,iBAER,qJAGI,sBAFA,kBACA,OACA,CAEA,4JAEI,gBACA,YACA,eAHA,YAGA,CAEA,gKAEI,sCADA,UACA,CAEhB,iHAKI,sBAJA,aAMA,eADA,cAHA,iBACA,kBAFA,UAKA,CAEA,8IAEI,mBADA,gBAEA,kBAEA,iLACI,cACA,kCACA,gBAEA,oBADA,wBACA,CAIA,yNACI,gBAEA,0OACI,kBAEJ,+PAGI,wCAFA,cACA,qCAEA,gBAEA,uBADA,wBACA,CAEZ,uKACI,gBAGA,gBAFA,SACA,SACA,CAEA,0KACI,gDAEA,gLACI,6DAEJ,4KAGI,mBAFA,aACA,iBACA,CAEA,kLACI,cAEJ,gLAEI,kBADA,UACA,CAExC,uBAEI,mBADA,aAKA,gDADA,iBADA,0DADA,kBAIA,qBAEA,2BACI,gDACA,yCACJ,4BACI,sCACA,kCACI,qBAEZ,eAGI,mBAFA,mBACA,4CACA,CAEA,uCACI,aAEA,YADA,cACA,CAEJ,mCACI,iBACA,kBAER,uBAGI,cADA,sBADA,SAEA,CAEA,0CAII,wDAnZY,CAoZZ,4BACA,6BAEA,YACA,kBANA,WAOA,eARA,iBAKA,qCANA,UASA,CAEA,gDACI,qCAEZ,sBAKI,qDADA,sBAHA,aACA,iBACA,UAEA,CAEA,6BACI,aAEJ,kDAII,mBAFA,aADA,OAIA,gBAFA,sBAEA,CAEJ,kDAEI,mBADA,YACA,CAEA,oDACI,qBAEJ,yDAQI,mBAJA,YACA,kBAIA,eAHA,aAJA,YAKA,uBANA,iBAEA,iBAMA,CAEJ,4EAEI,wDAncQ,CAocR,4BACA,6BAHA,WAKA,eADA,oCACA,CAEA,kFACI,oCAER,gFACI,qCAEA,oFACI,YAEhB,kCAEQ,2DACI,gCACA,iEACI,0BACJ,+DACI,YAGR,qDACI,mCACA,2DACQ,8BACR,yDACI,aAEhB,mCAEQ,0DACI,mCACA,gEACQ,8BACR,8DACI,YAGR,oDACI,gCACA,0DACI,0BACJ,wDACI,aAKhB,qBACI,gCAEJ,wBAGI,QAAO,CADP,mBADA,iBAEA,CAEJ,yBACI,UAGA,8BAEI,SAAQ,CADR,8BACA,CAGJ,uCACI,UAIR,qBACI,wCACA,aACA,SAEJ,4BACI,eACA,gBACA,iBAEJ,gCACI,gBAEJ,yBACI,UAEJ,wBAII,mBADA,sBADA,eADA,WAGA,CAEJ,8BACI,mBACA,gBAEJ,kCAEQ,qDACI,mBACJ,2DACI,mBAEJ,+CACI,mBACJ,qDACI,oBAEZ,mCAEQ,oDACI,mBACJ,0DACI,mBAEJ,8CACI,mBACJ,oDACI,oBAGR,+CACI,mBACJ,qDACI,mBAER,6BACI,sBACA,kBAIJ,wDACI,uCACA,kBAEJ,qBACI,gBAEJ,gEAEI,0CADA,kCACA,CAIJ,sBACI,uCACA,YACA,gBAEA,wEACI,YACA,gBAEJ,wCACI,wBAER,kCACI,iEACI,mBACA,eAGJ,0DACI,mBACA,cAKR,wBACI,mHACI,iBAEJ,6CACI,cAGR,wBACI,eACI,cAEA,qCACI,kCAGA,mHACI,iBACJ,iHACI,kBAEZ,sBACI,sBAGA,kDAEI,oBADA,cACA,CAEA,yDAEI,YADA,gBACA,CAEJ,4EACI,eAGA,oFACI,aAGpB,wBAEQ,qCACI,YAEJ,6CACI,iBACA,YAER,wBACI,gBAEJ,2CACI,yBAER,yBACI,cAEI,eADA,wCACA,EAER,yBACI,cACI,gBAER,mCAMQ,sGACI,kBAGZ,kCAGQ,oFACI,mBAMJ,wGACI","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass","webpack:///./src/furo/assets/styles/extensions/_farama.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n","// Farama Base\n\n$farama-background: linear-gradient(to right top, #765e3e, #054f5b)\n\nh1\n font-size: 2.2rem\nh2\n font-size: 1.7rem\nh3\n font-size: 1.4rem\n\n// If menu is active then all elements except the menu are not visible (i.e. only element with aria-hidden=\"true\")\nhtml:has(.farama-header-menu.active)\n visibility: hidden\n\n.farama-hidden[aria-hidden=\"true\"]\n visibility: hidden\n\n.farama-hidden[aria-hidden=\"false\"]\n visibility: visible\n\n// Cookies Alert\n\n.cookie-alert\n position: fixed\n display: flex\n width: 100%\n min-height: 70px\n background-color: var(--color-background-secondary)\n color: var(--color-foreground-primary)\n border-top: 1px solid var(--color-background-border)\n bottom: 0\n left: 0\n z-index: 99999\n\n.cookie-alert__container\n display: flex\n align-items: center\n width: 700px\n max-width: calc(100% - 28px)\n margin: auto\n\n.cookie-alert__button\n margin-left: 14px\n\n.cookie-alert p\n flex: 1\n\n// Farama default button style\n\n.farama-btn\n background: var(--color-farama-button-background)\n padding: 10px 26px\n border-radius: 6px\n border: none\n transition: background-color 0.2s ease\n cursor: pointer\n\n &:hover\n background: var(--color-farama-button-background-hover)\n\n// Env Icons\n\narticle[role=main]:has(.farama-env-icon-container)\n .farama-env-icon-container\n position: absolute\n display: flex\n margin-top: 7px\n\n .section h1:first-child, .section h2:first-child, section h1:first-child, section h2:first-child\n margin-left: 34px\n\n.farama-env-icon\n height: 32px\n\n// Envinronments grid\n\n.env-grid\n display: flex\n flex-wrap: wrap\n justify-content: center\n width: 100%\n box-sizing: border-box\n\n.env-grid__cell\n display: flex\n flex-direction: column\n width: 180px\n height: 180px\n padding: 10px\n\n.cell__image-container\n display: flex\n height: 148px\n justify-content: center\n\n.cell__image-container img\n max-height: 100%\n object-fit: contain\n\n.cell__title\n display: flex\n justify-content: center\n text-align: center\n align-items: flex-end\n height: 32px\n line-height: 16px\n\n.more-btn\n width: 240px\n margin: 12px auto\n display: block\n\n// Farama Header\n\nhtml:has(.farama-header-menu.active)\n overflow: hidden\n\nbody\n --farama-header-height: 52px\n --farama-header-logo-margin: 10px\n --farama-sidebar-logo-margin: 2px 10px\n\n.farama-header\n position: absolute\n display: flex\n width: 100%\n height: var(--farama-header-height)\n border-bottom: 1px solid var(--color-header-border)\n background-color: var(--color-background-secondary)\n padding: 0 36px 0 24px\n box-sizing: border-box\n z-index: 95\n\n .farama-header__container\n width: 100%\n max-width: 1400px\n display: flex\n margin: 0 auto\n justify-content: space-between\n\n a\n color: var(--color-foreground-primary)\n text-decoration: none\n transition: color 0.125s ease\n\n &:hover\n color: var(--color-foreground-secondary)\n\n .farama-header__logo\n max-height: calc(var(--farama-header-height) - var(--farama-header-logo-margin))\n margin: var(--farama-header-logo-margin)\n\n .farama-header__title\n font-size: var(--font-size--normal)\n font-weight: normal\n margin: 0 0 2px 0\n padding: 0 0 0 4px\n align-self: center\n\n .farama-header__left\n display: flex\n\n a\n display: flex\n\n .farama-header__left--mobile\n display: none\n\n .nav-overlay-icon svg\n width: 20px\n stroke: var(--color-foreground-primary)\n fill: var(--color-foreground-primary)\n stroke-width: 2px\n padding: 0 6px\n\n .farama-header__right\n display: flex\n align-items: center\n z-index: 2\n\n .farama-header__nav\n display: flex\n list-style: none\n height: 100%\n\n li\n text-decoration: none\n margin-left: 20px\n display: flex\n align-items: center\n cursor: pointer\n\n a\n height: 100%\n display: flex\n align-items: center\n\n .farama-header__dropdown-container\n position: relative\n display: flex\n align-items: center\n height: 100%\n\n &:hover\n .farama-header__dropdown-menu\n display: block\n\n svg\n width: 32px\n fill: var(--color-foreground-primary)\n\n .farama-header__dropdown-menu\n position: absolute\n top: var(--farama-header-height)\n right: 0\n border: 1px solid var(--color-background-border)\n background: var(--color-background-hover)\n z-index: 9999\n display: none\n\n ul\n display: inherit\n margin: 0\n padding: 6px 14px\n\n li\n margin: 0\n padding: 6px 0\n\n .farama-header-menu\n position: relative\n display: flex\n justify-content: center\n\n .farama-header-menu__btn\n display: flex\n background: none\n border: none\n cursor: pointer\n\n img\n width: 26px\n svg\n width: 14px\n stroke: var(--color-foreground-primary)\n stroke-width: 2px\n align-self: center\n\n\n &.active .farama-header-menu-container\n transform: translateY(100vh)\n\n .farama-header-menu-container\n position: fixed\n z-index: 99\n right: 0\n top: -100vh\n width: 100%\n height: calc(100vh - calc(100vh - 100%))\n transform: translateY(0)\n box-sizing: border-box\n transition: transform 0.2s ease-in\n background-color: var(--color-background-secondary)\n border-left: 1px solid var(--color-background-border)\n overflow: auto\n\n .farama-header-menu__header\n position: relative\n width: 100%\n max-width: 1400px\n box-sizing: border-box\n margin: 0 auto\n padding: 7px 52px\n border-bottom: 1px solid var(--color-background-border)\n display: flex\n align-items: center\n\n a\n display: flex\n align-items: center\n\n .farama-header-menu__logo\n width: 36px\n\n span\n color: var(--color-sidebar-brand-text)\n padding-left: 8px\n\n .farama-header-menu-header__right\n position: absolute\n right: 0\n padding-right: inherit\n\n button\n display: flex\n background: none\n border: none\n cursor: pointer\n\n svg\n width: 20px\n color: var(--color-foreground-primary)\n\n .farama-header-menu__body\n display: flex\n width: 100%\n max-width: 1500px\n padding: 22px 52px\n box-sizing: border-box\n margin: 0 auto\n flex-wrap: wrap\n\n .farama-header-menu__section\n min-width: 220px\n margin-bottom: 24px\n padding-left: 18px\n\n .farama-header-menu__section-title\n display: block\n font-size: var(--font-size--small)\n font-weight: 600\n text-transform: uppercase\n padding: 0 12px 12px\n\n .farama-header-menu__subsections-container\n\n .farama-header-menu__subsection\n min-width: 210px\n\n &:not(:last-child)\n margin-right: 12px\n\n .farama-header-menu__subsection-title\n display: block\n font-size: var(--font-size--small--3)\n color: var(--color-foreground-secondary)\n font-weight: 700\n text-transform: uppercase\n padding: 20px 12px 10px\n\n .farama-header-menu-list\n display: inherit\n margin: 0\n padding: 0\n list-style: none\n\n li\n border-radius: var(--sidebar-item-border-radius)\n\n &:hover\n background-color: var(--color-farama-header-background-hover)\n\n a\n display: flex\n padding: 12px 14px\n align-items: center\n\n &:hover\n color: inherit\n\n img\n width: 26px\n margin-right: 10px\n\n.farama-sidebar__title\n display: flex\n align-items: center\n padding-right: 4px\n min-height: calc(52px - var(--sidebar-search-space-above))\n margin-top: 0.6rem\n margin-left: var(--sidebar-search-space-lateral)\n text-decoration: none\n\n img\n height: calc(var(--farama-header-height) - 20px)\n margin: var(--farama-sidebar-logo-margin)\n span\n color: var(--color-foreground-primary)\n &:hover\n text-decoration: none\n\n.sidebar-brand\n flex-direction: row\n padding: var(--sidebar-item-spacing-vertical)\n align-items: center\n\n .sidebar-logo-container\n display: flex\n max-width: 55px\n height: auto\n\n .sidebar-brand-text\n font-size: 1.3rem\n padding-left: 11px\n\n.farama-sidebar-donate\n width: 76%\n padding: 8px 16px 20px\n margin: 0 auto\n\n .farama-donate-btn\n width: 100%\n padding: 8px 12px\n color: #fff\n background: $farama-background\n background-blend-mode: color\n background-color: transparent\n transition: background-color 0.2s ease\n border: none\n border-radius: 6px\n cursor: pointer\n\n &:hover\n background-color: rgb(255 255 255 / 15%)\n\n.farama-donate-banner\n display: none\n padding: 16px 3em\n width: 100%\n box-sizing: border-box\n background-color: var(--color-highlighted-background)\n\n &.active\n display: flex\n\n .farama-donate-banner__text\n flex: 1\n display: flex\n justify-content: center\n align-items: center\n font-size: 1.1em\n\n .farama-donate-banner__btns\n display: flex\n align-items: center\n\n a\n text-decoration: none\n\n button\n margin-left: 22px\n height: 36px\n position: relative\n border: none\n border-radius: 6px\n display: flex\n justify-content: center\n align-items: center\n cursor: pointer\n\n .farama-donate-banner__go\n color: #fff\n background: $farama-background\n background-blend-mode: color\n background-color: transparent\n transition: background-color 0.2s ease\n padding: 0 26px\n\n &:hover\n background-color: rgb(255 255 255 / 10%)\n\n .farama-donate-banner__cancel\n transition: background-color 0.2s ease\n\n svg\n height: 26px\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n .farama-donate-banner__cancel\n background-color: rgb(0 0 0 / 10%)\n &:hover\n background: rgb(0 0 0 / 20%)\n svg\n stroke: #fff\n\n body[data-theme=\"light\"]\n .farama-donate-banner__cancel\n background-color: rgb(25 25 25 / 10%)\n &:hover\n background: rgb(255 255 255 / 20%)\n svg\n stroke: #666\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n .farama-donate-banner__cancel\n background-color: rgb(25 25 25 / 10%)\n &:hover\n background: rgb(255 255 255 / 20%)\n svg\n stroke: #666\n\n body[data-theme=\"dark\"]\n .farama-donate-banner__cancel\n background-color: rgb(0 0 0 / 10%)\n &:hover\n background: rgb(0 0 0 / 20%)\n svg\n stroke: #fff\n\n\n// Farama custom directives\n\n.farama-project-logo\n margin: 1.5rem 0 0.8rem !important\n\n.farama-project-heading\n text-align: center\n padding: 0 0 1.6rem 0\n margin: 0\n\n.farama-project-logo img\n width: 65%\n\n.mobile-header\n .header-center\n transition: opacity 0.2s easy-in\n opacity: 0\n\n.mobile-header.scrolled\n .header-center\n opacity: 1\n\n// Sphinx Gallery\n\n.sphx-glr-script-out\n color: var(--color-foreground-secondary)\n display: flex\n gap: 0.5em\n\n.sphx-glr-script-out::before\n content: \"Out:\"\n line-height: 1.4\n padding-top: 10px\n\n.sphx-glr-script-out .highlight\n overflow-x: auto\n\n.sphx-glr-thumbcontainer\n z-index: 1\n\ndiv.sphx-glr-download a\n width: 340px\n max-width: 100%\n box-sizing: border-box\n background: #0f4a65\n\ndiv.sphx-glr-download a:hover\n background: #0d3a4e\n box-shadow: none\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n div.sphx-glr-download a\n background: #0f4a65\n div.sphx-glr-download a:hover\n background: #0d3a4e\n body[data-theme=\"light\"]\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n body[data-theme=\"dark\"]\n div.sphx-glr-download a\n background: #0f4a65\n div.sphx-glr-download a:hover\n background: #0d3a4e\n\nbody[data-theme=\"light\"]\n div.sphx-glr-download a\n background: #f9d4a1\n div.sphx-glr-download a:hover\n background: #d9b481\n\n.sphx-glr-thumbcontainer img\n background-color: white\n border-radius: 4px\n\n// Override Tabs styles\n\n.tab-content > [class^=\"highlight-\"]:first-child .highlight\n background: var(--color-api-background)\n border-radius: 6px\n\n.tab-set > input + label\n font-weight: 600\n\n.tab-set > input:checked + label, .tab-set > input:checked + label:hover\n color: var(--color-brand-secondary)\n border-color: var(--color-brand-secondary)\n\n// Sphinx Jupyter\n\ndiv.jupyter_container\n background: var(--color-api-background)\n border: none\n box-shadow: none\n\n div.code_cell, div.highlight\n border: none\n border-radius: 0\n\n div.code_cell pre\n padding: 0.625rem 0.875rem\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"]) div.jupyter_container div.highlight\n background: #202020\n color: #d0d0d0\n\nbody[data-theme=\"dark\"]\n div.jupyter_container div.highlight\n background: #202020\n color: #d0d0d0\n\n\n\n\n@media (max-width: 950px)\n .farama-header .farama-header__right .farama-header-menu .farama-header-menu-container .farama-header-menu__header\n padding: 7px 42px\n\n .farama-header .farama-header-menu__btn-name\n display: none\n\n\n@media (max-width: 600px)\n .farama-header\n padding: 0 4px\n\n .farama-header__title\n font-size: var(--font-size--small)\n\n .farama-header__right .farama-header-menu .farama-header-menu-container\n .farama-header-menu__header\n padding: 8px 12px\n .farama-header-menu__body\n padding: 18px 12px\n\n .farama-donate-banner\n flex-direction: column\n\n\n .farama-donate-banner__btns\n margin-top: 1em\n justify-content: end\n\n button\n margin-left: 12px\n height: 36px\n\n .farama-donate-banner__go\n padding: 0 20px\n\n .farama-donate-banner__cancel\n svg\n height: 26px\n\n\n@media (max-width: 480px)\n .farama-header\n .farama-header__title\n width: 110px\n\n .farama-header-menu__btn-name\n text-align: right\n width: 100px\n\n .farama-project-heading\n text-align: left\n\n .farama-header-menu__subsections-container\n display: block !important\n\n@media (min-width: 1260px)\n div.highlight\n width: fit-content\n max-width: 60vw\n\n@media (min-width: 2160px)\n div.highlight\n max-width: 50vw\n\n@media (prefers-color-scheme: light)\n body:not([data-theme=\"dark\"])\n .farama-white-logo-invert\n filter: invert(1)\n\n body[data-theme=\"dark\"]\n .farama-black-logo-invert\n filter: invert(1)\n\n\n@media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n // Github math render\n img[src*=\"//render.githubusercontent.com/render/math\"]\n filter: invert(90%)\n\n .farama-black-logo-invert\n filter: invert(1)\n\n body[data-theme=\"light\"]\n .farama-white-logo-invert\n filter: invert(1)\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/_static/versioning/versioning_menu.html b/_static/versioning/versioning_menu.html
index 1daf4cef7..68109cf86 100644
--- a/_static/versioning/versioning_menu.html
+++ b/_static/versioning/versioning_menu.html
@@ -122,15 +122,33 @@
});
const sortVersions = (a, b) => {
- // Alpha versions
- if (a.includes("a")) return 1;
- if (b.includes("a")) return -1;
- if (a.replace("v", "") > b.replace("v", ""))
- return -1
- else if (a.replace("v", "") < b.replace("v", ""))
- return 1
- else
- return 0
+ const innerA = a.replace("v", "");
+ const innerB = b.replace("v", "");
+
+ if (innerA.match(/[a-z]/) && !innerB.match(/[a-z]/)) return 1;
+ if (!innerA.match(/[a-z]/) && innerB.match(/[a-z]/)) return -1;
+
+ const splittedInnerA = innerA.split("");
+ const splittedInnerB = innerB.split("");
+
+ while (splittedInnerA.length && splittedInnerB.length) {
+ const charA = splittedInnerA.shift();
+ const charB = splittedInnerB.shift();
+
+ if (charA === charB) continue;
+ else if (charA === ".") return 1;
+ else if (charB === ".") return -1;
+ else if (charA.match(/[0-9]/) && charB.match(/[0-9]/)) {
+ return Number(charB) - Number(charA);
+ } else {
+ if (charA < charB) return 1;
+ else if (charA > charB) return -1;
+ else return 0;
+ }
+ }
+ if (innerA < innerB) return 1;
+ else if (innerA > innerB) return -1;
+ else return 0;
}
if ((githubUser !== null && githubUser !== "") || (repo !== null && repo !== "")) {
@@ -204,4 +222,4 @@
console.error("Invalid versioning configuration");
}
-
\ No newline at end of file
+
diff --git a/developing/index.html b/developing/index.html
index dea7dd66e..ae3ae2444 100644
--- a/developing/index.html
+++ b/developing/index.html
@@ -11,11 +11,11 @@
-
+
Development - Stable-Retro Documentation
-
+
-
+
@@ -279,36 +279,36 @@
-Development#
+Development¶
Adding new games can be done without recompiling Stable Retro, but if you need to work on the C++ code or make changes to the UI, you will want to compile Stable Retro from source.
-Install Retro from source#
+Install Retro from source¶
Building Stable Retro requires at least either gcc 5 or clang 3.4.
-Prerequisites#
+Prerequisites¶
To build Stable Retro you must first install CMake.
You can do this either through your package manager, download from the official site or pip3 install cmake
.
If you’re using the official installer on Windows, make sure to tell CMake to add itself to the system PATH.
-Mac prerequisites#
+Mac prerequisites¶
Since LuaJIT does not work properly on macOS you must first install Lua 5.1 from homebrew:
brew install pkg-config lua@5.1
-Windows prerequisites#
+Windows prerequisites¶
Install docker
-Linux prerequisites#
+Linux prerequisites¶
sudo apt-get install zlib1g-dev
-Building Linux and Mac#
+Building Linux and Mac¶
git clone https://github.com/farama-foundation/stable-retro.git stable-retro
cd stable-retro
pip3 install -e .
@@ -316,7 +316,7 @@ Building Linux and Mac
-Building Windows#
+Building Windows¶
Run the following
docker/build_windows.bat
@@ -331,10 +331,10 @@ Building Windows
-Install Retro UI from source#
+Install Retro UI from source¶
First make sure you can install Retro from source, after that follow the instructions for your platform:
-macOS#
+macOS¶
Note that for Mojave (10.14) you may need to install /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
brew install pkg-config capnp lua@5.1 qt5
cmake . -DCMAKE_PREFIX_PATH=/usr/local/opt/qt -DBUILD_UI=ON -UPYLIB_DIRECTORY
@@ -344,7 +344,7 @@ macOS#<
-Linux#
+Linux¶
sudo apt-get install capnproto libcapnp-dev libqt5opengl5-dev qtbase5-dev zlib1g-dev
cmake . -DBUILD_UI=ON -UPYLIB_DIRECTORY
make -j$(grep -c ^processor /proc/cpuinfo)
@@ -353,7 +353,7 @@ Linux#<
-Windows#
+Windows¶
The Retro UI is not currently supported in native Windows but you can use it easily via WSL2 (Windows Subsystem for Linux) by following the instructions above for Linux.
From within WSL2 just launch gym-retro-integration binary like you would on linux.
@@ -477,10 +477,62 @@ Windows#<
-
+
+
-
-
+
+
diff --git a/genindex/index.html b/genindex/index.html
index 454a081b2..2119c406e 100644
--- a/genindex/index.html
+++ b/genindex/index.html
@@ -10,10 +10,10 @@
- Index - Stable-Retro Documentation
-
+ Index - Stable-Retro Documentation
+
-
+
@@ -431,10 +431,62 @@ S
-
+
+
-
-
+
+
diff --git a/getting_started/index.html b/getting_started/index.html
index 8df87ed9b..b7a1dc426 100644
--- a/getting_started/index.html
+++ b/getting_started/index.html
@@ -11,11 +11,11 @@
-
+
Getting Started - Stable-Retro Documentation
-
+
-
+
@@ -279,16 +279,16 @@
-Getting Started#
+Getting Started¶
Stable Retro requires one of the supported versions of Python (3,6 to 3.10). Please make sure to install the appropriate distribution for your OS beforehand. Please note that due to compatibility issues with some of the cores, 32-bit operating systems are not supported.
pip3 install stable-retro
See the section development if you want to build Stable Retro yourself (this is only useful if you want to change the C++ code, not required to integrate new games).
-Create a Retro Environment#
+Create a Retro Environment¶
After installing you can now create a Gymnasium environment in Python:
-import retro
+import retro
env = retro.make(game='Airstriker-Genesis')
@@ -296,11 +296,11 @@ Create a Retro EnvironmentImporting ROMs for information about importing ROMs into Stable Retro.
-Example Usage#
+Example Usage¶
Stable Retro is useful primarily as a means to train RL on classic video games, though it can also be used to control those video games from Python.
Here are some example ways to use Stable Retro:
-Interactive Script#
+Interactive Script¶
There is a Python script that lets you interact with the game using the Gymnasium interface. Run it like this:
python3 -m retro.examples.interactive --game Airstriker-Genesis
@@ -308,12 +308,12 @@ Interactive ScriptX key to control your ship and fire. This Python script lets you try out an environment using only the Stable Retro Python API and is quite basic. For a more advanced tool, check out the The Integration UI.
-Random Agent#
+Random Agent¶
A random agent that chooses a random action on each timestep looks much like the example random agent for Gymnasium:
-import retro
+import retro
-def main():
+def main():
env = retro.make(game="Airstriker-Genesis")
env.reset()
while True:
@@ -336,7 +336,7 @@ Random Agent
-Brute#
+Brute¶
There is a simple but effective reinforcement learning algorithm called “the Brute” from “Revisiting the Arcade Learning Environment” by Machado et al. which works on deterministic environments like Stable Retro games and is easy to implement. To run the example:
python3 -m retro.examples.brute --game Airstriker-Genesis
@@ -344,7 +344,7 @@ Brute#<
This algorithm works by building up a sequence of button presses that do well in the game, it doesn’t look at the screen at all. It will print out the best reward seen so far while training.
-PPO#
+PPO¶
Using “Proximal Policy Optimization” by Schulman et al., you can train an agent to play many of the games, though it takes awhile and is much faster with a GPU.
This example requires installing Stable Baselines. Once installed, you can run it:
python3 -m retro.examples.ppo --game Airstriker-Genesis
@@ -354,16 +354,16 @@ PPO#
-Integrations#
+Integrations¶
What games have already been integrated? Note that this will display all defined environments, even ones for which ROMs are missing.
-import retro
+import retro
retro.data.list_games()
The actual integration data can be see in the Stable Retro Github repo.
-Importing ROMs#
+Importing ROMs¶
If you have the correct ROMs on your computer (identified by the rom.sha
file for each game integration), you can import them using the import script:
python3 -m retro.import /path/to/your/ROMs/directory/
@@ -486,10 +486,62 @@ Integrations
+
-
-
+
+
diff --git a/index.html b/index.html
index e85b9e7be..5253e6b39 100644
--- a/index.html
+++ b/index.html
@@ -11,11 +11,11 @@
-
+
Stable-Retro Documentation
-
+
-
+
@@ -287,7 +287,8 @@
Stable-Retro is a maintained fork of OpenAI’s Retro library.
stable-retro lets you turn classic video games into Gymnasium environments for reinforcement learning. Supported plateforms includes Sega Genesis, Sega 32X, Super Nintendo, Atari 2600 and more (full list here)
@@ -295,24 +296,24 @@
Train an agent using Proximal Policy Optimization from Stable Baselines 3
"""
-import argparse
+import argparse
-import gymnasium as gym
-import numpy as np
-from gymnasium.wrappers.time_limit import TimeLimit
-from stable_baselines3 import PPO
-from stable_baselines3.common.atari_wrappers import ClipRewardEnv, WarpFrame
-from stable_baselines3.common.vec_env import (
+import gymnasium as gym
+import numpy as np
+from gymnasium.wrappers.time_limit import TimeLimit
+from stable_baselines3 import PPO
+from stable_baselines3.common.atari_wrappers import ClipRewardEnv, WarpFrame
+from stable_baselines3.common.vec_env import (
SubprocVecEnv,
VecFrameStack,
VecTransposeImage,
)
-import retro
+import retro
-class StochasticFrameSkip(gym.Wrapper):
- def __init__(self, env, n, stickprob):
+class StochasticFrameSkip(gym.Wrapper):
+ def __init__(self, env, n, stickprob):
gym.Wrapper.__init__(self, env)
self.n = n
self.stickprob = stickprob
@@ -320,11 +321,11 @@
self.rng = np.random.RandomState()
self.supports_want_render = hasattr(env, "supports_want_render")
- def reset(self, **kwargs):
+ def reset(self, **kwargs):
self.curac = None
return self.env.reset(**kwargs)
- def step(self, ac):
+ def step(self, ac):
terminated = False
truncated = False
totrew = 0
@@ -352,7 +353,7 @@
return ob, totrew, terminated, truncated, info
-def make_retro(*, game, state=None, max_episode_steps=4500, **kwargs):
+def make_retro(*, game, state=None, max_episode_steps=4500, **kwargs):
if state is None:
state = retro.State.DEFAULT
env = retro.make(game, state, **kwargs)
@@ -362,7 +363,7 @@
return env
-def wrap_deepmind_retro(env):
+def wrap_deepmind_retro(env):
"""
Configure environment for retro games, using config similar to DeepMind-style Atari in openai/baseline's wrap_deepmind
"""
@@ -371,14 +372,14 @@
return env
-def main():
+def main():
parser = argparse.ArgumentParser()
parser.add_argument("--game", default="Airstriker-Genesis")
parser.add_argument("--state", default=retro.State.DEFAULT)
parser.add_argument("--scenario", default=None)
args = parser.parse_args()
- def make_env():
+ def make_env():
env = make_retro(game=args.game, state=args.state, scenario=args.scenario)
env = wrap_deepmind_retro(env)
return env
@@ -474,10 +475,62 @@
-
+
+
-
-
+
+
diff --git a/integration/index.html b/integration/index.html
index f0f633f03..20708209a 100644
--- a/integration/index.html
+++ b/integration/index.html
@@ -11,11 +11,11 @@
-
+
Game Integration - Stable-Retro Documentation
-
+
-
+
@@ -279,7 +279,7 @@
-Game Integration#
+Game Integration¶
Integrating a game means taking a video game ROM file and setting it up as a reinforcement learning environment by defining 3 things:
A starting state
@@ -289,14 +289,14 @@ Game IntegrationGymnasium environment.
If you are going to integrate a new game, you’ll need a ROM for the correct system, see Supported ROM Types for a list.
-Example Integration#
+Example Integration¶
This is a list of the integration files for the game Airstriker-Genesis.
-Level1.state
#
+Level1.state
¶
This is a savestate from the beginning of the game, restarting the environment will put the agent at this point in the game.
-data.json
#
+data.json
¶
This file defines the list of game-related variables that python can see based on their memory addresses in the games
{
"info": {
@@ -318,7 +318,7 @@ data.json
-scenario.json
#
+scenario.json
¶
This file defines the reward function and done condition using the variables defined in data.json
{
"done": {
@@ -345,7 +345,7 @@ scenario.json
-metadata.json
#
+metadata.json
¶
This file defines the default starting state if no state is specified by the user as well as some miscellaneous debugging information.
{
"default_state": "Level1",
@@ -359,11 +359,11 @@ metadata.json
-rom.md
#
+rom.md
¶
This is the ROM file used for this game, with a few exceptions, ROM files are not included in Stable Retro, but will be in your local copy of Stable Retro after you import them.
-rom.sha
#
+rom.sha
¶
This is the SHA1 hash of the rom.md
file, used for importing ROMs.
c67af162391fff4a63432be5a156eb9ca7b4da5a
@@ -372,13 +372,13 @@ rom.sha<
-Integration Files#
+Integration Files¶
-States#
+States¶
Emulation allows the entire state of a video game system to be stored to disk and restored. These files are specific to the emulator, but always end with .state
. These are identical to the versions used in the standalone versions of the emulators but gzipped.
-Variable Locations data.json
#
+Variable Locations data.json
¶
Information about the inner workings of games are stored alongside the ROM in a file named data.json
. This JSON file documents “ground truth” information about a game, including the locations and formats of variables in memory. These manifests are separated into sections, although only one section currently is defined:
The info
section of the manifest lists game variables’ memory addresses. Each entry in the info
section consists of a key naming the memory address and the following values:
@@ -399,7 +399,7 @@ Variable Locations Appendix: Types.
-Scenario scenario.json
#
+Scenario scenario.json
¶
Information pertaining to reward functions and done conditions can either be specified by manually overriding functions in retro.RetroEnv
or can be done by writing a scenario file.
Scenario files contain information that is used to compute the reward function and done condition from variables defined in the information manifest. Each variable specified in the scenario file is multiplied by a reward
value if positive and a penalty
value if negative and then summed up to create the reward for that step. Similarly, states of these variables can be checked to see if the game is over. By default the scenario file will be loaded from scenario.json
, but alternative scenario files can be specified in the retro.RetroEnv
constructor.
Scenario files are again JSON and specified with the following sections:
@@ -427,7 +427,7 @@ Scenario scenar
-The Integration UI#
+The Integration UI¶
The integration UI helps you easily find variables and see what is going on with the reward function.
You can normally download the compiled UI package for your platform here:
@@ -436,7 +436,7 @@ Scenario scenar
However, if those URLs no longer work, you can also download these packages from GitHub’s Releases
-Integrating a new ROM#
+Integrating a new ROM¶
-Supported ROM Types#
+Supported ROM Types¶
ROM files contain the game itself. Each system has a unique file extension to denote which system a given ROM runs on:
.md
: Sega Genesis (also known as Mega Drive)
@@ -473,18 +473,18 @@ Integrating a new ROMSometimes ROMs from these systems use different extensions, e.g. .gen
for Genesis, .bin
for Atari, etc. Please rename the ROMs to use the aforementioned extensions in these cases.
-Integrating a Game#
+Integrating a Game¶
To integrate a game you need to define a done condition and a reward function. The done condition lets Stable Retro know when to end a game session, while the reward function provides a simple numeric goal for machine learning agents to maximize.
To define these, you find variables from the game’s memory, such as the player’s current score and lives remaining, and use those to create the done condition and reward function. An example done condition is when the lives
variable is equal to 0
, an example reward function is the change in the score
variable.
Note: if the game requires that you hit the Start
button to play, for instance after dying, then you need to modify the scenario file to allow this as Start
is disallowed by default. See the actions
key in KidChameleon-Genesis for an example of this.
-Done Condition#
+Done Condition¶
This is usually the easier of the two. The best done condition to use is the Game Over or Continue screen after you run out of lives. For some games this is when you have zero lives left, for some -1
lives, for others, it can be pretty hard.
It’s better to have a simple and reliable but slightly incorrect done condition (e.g. ending the game when you still have 1 life left because it’s hard to detect the 0 life case) than to have a done condition that is unreliable, such as a gameover
variable that detects when the gameover screen is present most of the time but also incorrectly fires when switching levels.
If you create a gameover
variable, make sure to test it with a replay that plays multiple levels in a row to make sure it doesn’t fire accidentally.
-Reward Function#
+Reward Function¶
Reinforcement learning agents try to maximize the reward function. The ideal reward function would be that you get 1 point for beating the game. There’s no way to maximize that besides beating the game.
That reward is impractical though, because existing reinforcement learning algorithms are unable to make progress with a reward that is so hard to get. Instead we can specify some easier to get reward that, if you maximize it, should result in beating the game.
If the game has a score, this is often a good choice. In some games however, you can get as much score as you want by standing in one place and attacking the same enemy over and over as it respawns. Because that is so different from beating the game, it’s best to have an alternative reward, though these are often very game specific.
@@ -492,7 +492,7 @@ Reward Functionscore
variable and set the reward such that the reward the agent receives matches the score displayed on the screen, make sure to check that you’re not off by a factor of 10 or 100 by comparing to the Cumulative
value displayed in the Scenario Information
pane of the UI.
-Finding Variables#
+Finding Variables¶
It’s best to keep a consistent pattern for the different types of variables you might add to a game’s data.json
file. Here are some tips:
It’s pretty common for multiple different variables to group themselves together. When narrowing down the search for a particular variable, look at nearby memory addresses if you suspect you have a similar but incorrect variable (for instance you found the high score variable but are looking for the score variable).
@@ -512,7 +512,7 @@ Finding Variables
-Common Errors#
+Common Errors¶
Wrong type for variable: if your score variable is actually >d2
and you put >d4
, you may not notice until you get to some later level and the memory address next to the score is used for something, suddenly giving you a very large score.
Incorrect done condition: it might be that if you run out of time or die in some unusual way that the done condition is not detected correctly. Make sure to test unusual ways of ending the game, and make sure that your done condition doesn’t fire upon completing a level (unless it’s the final level of the game). If you’re able to hit continue after dying, make sure that the game ends before the agent can hit continue.
@@ -521,7 +521,7 @@ Common Errors
-Using a Custom Integration from Python#
+Using a Custom Integration from Python¶
Once you have created an integration, you can put it in a folder called custom_integrations
. In particular, your integration directory name should follow the following structure (depending on the rom type):
.md
: *-Genesis
(e.g. AddamsFamily-Genesis
)
@@ -536,13 +536,13 @@ Using a Custom Integration from Python.sms: *-Sms
(e.g. AddamsFamily-Sms
)
Then you can tell retro
about your custom integration using the add_custom_path
function:
-import retro
-import os
+import retro
+import os
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-def main():
+def main():
retro.data.Integrations.add_custom_path(
os.path.join(SCRIPT_DIR, "custom_integrations")
)
@@ -558,7 +558,7 @@ Using a Custom Integration from Pythonretro directly.
-Appendix: Types#
+Appendix: Types¶
The types consist of three parts, in order:
Endianness
@@ -646,7 +646,7 @@ Using a Custom Integration from Python
-Appendix: Operations#
+Appendix: Operations¶
Games can store information in memory in many various ways, and as such the specific information needed can vary in form too. The basic premise is that once a raw value is extracted from memory an operation may be defined to transform it to a useful form. Furthermore, we may want raw values in a given step or the deltas between two steps. Thus three properties are defined:
measurement
: The method used for extracting the raw value. May be absolute
for the current value and delta
for the difference between the current and previous value. The default varies based on context.
@@ -802,10 +802,62 @@ Using a Custom Integration from Python
+
-
-
+
+
diff --git a/python/index.html b/python/index.html
index f3eb6f7da..f58d5a7b4 100644
--- a/python/index.html
+++ b/python/index.html
@@ -11,11 +11,11 @@
-
+
Python API - Stable-Retro Documentation
-
+
-
+
@@ -279,19 +279,19 @@
-Python API#
+Python API¶
-RetroEnv#
+RetroEnv¶
The Python API consists primarily of retro.make()
, retro.RetroEnv
, and a few enums. The main function most users will want is retro.make()
.
-
-retro.make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs)[source]#
+retro.make(game, state=State.DEFAULT, inttype=retro.data.Integrations.DEFAULT, **kwargs)[source]¶
Create a Gym environment for the specified game
-
-class retro.RetroEnv(game, state=retro.State.DEFAULT, scenario=None, info=None, use_restricted_actions=retro.Actions.FILTERED, record=False, players=1, inttype=retro.data.Integrations.STABLE, obs_type=retro.Observations.IMAGE, render_mode='human')[source]#
+class retro.RetroEnv(game, state=retro.State.DEFAULT, scenario=None, info=None, use_restricted_actions=retro.Actions.FILTERED, record=False, players=1, inttype=retro.data.Integrations.STABLE, obs_type=retro.Observations.IMAGE, render_mode='human')[source]¶
Gym Retro environment class
Provides a Gym interface to classic video games
@@ -299,18 +299,18 @@ RetroEnv
If you want to specify either the default state named in the game integration’s metadata.json
or specify that you want to start from the initial power on state of the console, you can use the retro.State
enum:
-Actions#
+Actions¶
There are a few possible action spaces included with retro.RetroEnv
:
-
-class retro.Actions(value)[source]#
+class retro.Actions(value)[source]¶
Different settings for the action space of the environment
@@ -347,21 +347,21 @@ Actions#<
You can also create your own action spaces derived from these. For an example, see discretizer.py. This file shows how to use retro.Actions.Discrete
as well as how to make a custom wrapper that reduces the action space from 126
actions to 7
-Observations#
+Observations¶
The default observations are RGB images of the game, but you can view RAM values instead (often much smaller than the RGB images and also your agent can observe the game state more directly). If you want variable values, any variables defined in data.json
will appear in the info
dict after each step.
-
-class retro.Observations(value)[source]#
+class retro.Observations(value)[source]¶
Different settings for the observation space of the environment
-
-RAM = 1#
+RAM = 1¶
Use RAM observations where you can see the memory of the game instead of the screen
@@ -369,12 +369,12 @@ Observations
-Multiplayer Environments#
+Multiplayer Environments¶
A small number of games support multiplayer. To use this feature, pass players=<n>
to retro.RetroEnv
. Here is an example random agent that controls both paddles in Pong-Atari2600
:
-import retro
+import retro
-def main():
+def main():
env = retro.make(game="Pong-Atari2600", players=2)
env.reset()
while True:
@@ -395,14 +395,14 @@ Multiplayer Environments
-Replay files#
+Replay files¶
Stable Retro can create .bk2 files which are recordings of an initial game state and a series of button presses. Because the emulators are deterministic, you will see the same output each time you play back this file. Because it only stores button presses, the file can be about 1000 times smaller than storing the full video.
In addition, if you wish to use the stored button presses for training, they may be useful. For example, there are replay files for each Sonic The Hedgehog level that were made available for the Stable Retro Contest.
You can create and view replay files using the The Integration UI (Game > Play Movie…). If you want to use replay files from Python, see the following sections.
-Record#
+Record¶
If you have an agent playing a game, you can record the gameplay to a .bk2
file for later processing:
-import retro
+import retro
env = retro.make(game='Airstriker-Genesis', record='.')
env.reset()
@@ -414,9 +414,9 @@ Record#
-Playback#
+Playback¶
Given a .bk2
file you can load it in python and either play it back or use the actions for training.
-import retro
+import retro
movie = retro.Movie('Airstriker-Genesis-Level1-000000.bk2')
movie.step()
@@ -441,7 +441,7 @@ Playback
-Render to Video#
+Render to Video¶
This requires ffmpeg to be installed and writes the output to the directory that the input file is located in.
python3 -m retro.scripts.playback_movie Airstriker-Genesis-Level1-000000.bk2
@@ -586,10 +586,62 @@ Render to Video
+
-
-
+
+
diff --git a/release_notes/index.html b/release_notes/index.html
index edd1be513..f03c58290 100644
--- a/release_notes/index.html
+++ b/release_notes/index.html
@@ -11,11 +11,11 @@
-
+
Release Notes - Stable-Retro Documentation
-
+
-
+
@@ -279,13 +279,64 @@
-Release Notes#
+Release Notes¶
-stable-retro v0.9.3#
-Released on 2024-01-12 - GitHub
-
+v0.9.3¶
+Released on 2025-01-17 - GitHub
+What's Changed
+
+- Updated installation instruction in README.md by @MatPoliquin in #74
+- Update GitHub link to correct repo by @seanpai96 in #75
+- Added player 2 fullstar variable to NHL941on1 data.json by @MatPoliquin in #76
+- Disable capnproto in UI CMakeLists.txt to fix link error when building integration tool by @MatPoliquin in #78
+- Add new state to NHL941on1 env by @MatPoliquin in #80
+- Py311 + Py312 support by @thatguy11325 in #79
+- Add new states to NHL941on1-Genesis env by @MatPoliquin in #81
+- Enable building Python 3.12 manylinux wheels by @mwydmuch in #82
+- Updated supported pythons in README.md by @MatPoliquin in #83
+- Update getting_started.md by @badfilms in #84
+- Added extra vars to NHL941on1 env data.json by @MatPoliquin in #85
+- Add set_value function to retro_env.py by @MatPoliquin in #86
+- NHL94 env data.json: fix p1_x variable addr and type by @MatPoliquin in #87
+- Added link to extra examples in README.md by @MatPoliquin in #88
+- Add Code of conduct file by @MatPoliquin in #89
+- Add funding yml by @MatPoliquin in #90
+- NHL941on1 env: Fix fullstar var ram address in data.json by @MatPoliquin in #92
+- Added stable-retro black and white logos by @MatPoliquin in #93
+- NHL94 env: fix bogus some bogus ram addresses in data.json by @MatPoliquin in #94
+- Added NHL942on2 env by @MatPoliquin in #95
+- NHL941on1 env: Added player velocities in data.json by @MatPoliquin in #96
+- Update logo by @MatPoliquin in #98
+- Integrate Farama Notifications by @MatPoliquin in #99
+- NHL942on2 env: Update data.json by @MatPoliquin in #102
+- Update init.py by @MatPoliquin in #103
+- NHL942on2 env: Update data.json by @MatPoliquin in #104
+- NHL942on2 env: Update data.json by @MatPoliquin in #105
+- Updated README.md,: added tutorial, fixed typos by @MatPoliquin in #106
+- Add gtag by @mgoulao in #109
+- Add dependabot.yml by @pseudo-rnd-thoughts in #114
+- Bump pypa/cibuildwheel from 2.15.0 to 2.20.0 by @dependabot in #119
+- Bump docker/setup-qemu-action from 2 to 3 by @dependabot in #116
+- Bump actions/setup-python from 4 to 5 by @dependabot in #118
+- Bump setuptools from 65.5.1 to 70.0.0 in /docker/linux/build_scripts by @dependabot in #110
+- Bump actions/download-artifact from 3 to 4 by @dependabot in #120
+- Bump pypa/cibuildwheel from 2.20.0 to 2.21.0 by @dependabot in #122
+- Bump pypa/cibuildwheel from 2.21.0 to 2.21.1 by @dependabot in #123
+- Fix build issues on Apple silicon M-series macs by @mode80 in #124
+- Bump pypa/cibuildwheel from 2.21.1 to 2.21.2 by @dependabot in #125
+- Update README.md by @MatPoliquin in #129
+- Fix pre-commit check errors by @MatPoliquin in #130
+
+New Contributors
+
+- @seanpai96 made their first contribution in #75
+- @thatguy11325 made their first contribution in #79
+- @badfilms made their first contribution in #84
+- @mode80 made their first contribution in #124
+
+Full Changelog: v0.9.2...v0.9.3
-stable-retro v0.9.2#
+stable-retro v0.9.2¶
Released on 2023-10-16 - GitHub
What's Changed
@@ -355,7 +406,7 @@ New Contributors
Full Changelog: v0.9.0...v0.9.2
-stable-retro v0.9.1#
+stable-retro v0.9.1¶
Released on 2023-08-10 - GitHub
What's Changed
@@ -462,7 +513,7 @@ New Contributors
- Release Notes
@@ -497,10 +548,62 @@
New Contributors
-
+
+
-
-
+
+
diff --git a/search/index.html b/search/index.html
index 4eb934581..e935d82ca 100644
--- a/search/index.html
+++ b/search/index.html
@@ -10,9 +10,9 @@
- Search - Stable-Retro Documentation
+ Search - Stable-Retro Documentation
-
+
@@ -340,10 +340,62 @@
-
+
+
-
-
+
+
diff --git a/searchindex.js b/searchindex.js
index 49adbb783..afedf44a3 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({"docnames": ["404", "README", "developing", "getting_started", "index", "integration", "python", "release_notes"], "filenames": ["404.md", "README.md", "developing.md", "getting_started.md", "index.md", "integration.md", "python.md", "release_notes.md"], "titles": ["404 - Page Not Found", "Stable-retro docs", "Development", "Getting Started", "<no title>", "Game Integration", "Python API", "Release Notes"], "terms": {"thi": [1, 2, 3, 5, 6], "folder": [1, 5], "contain": [1, 2, 5, 6], "stableretro": 1, "If": [1, 2, 3, 5, 6], "you": [1, 2, 3, 4, 5, 6], "ar": [1, 3, 5, 6], "an": [1, 3, 4, 5, 6], "atari": [1, 4, 5], "pleas": [1, 3, 5], "follow": [1, 2, 5, 6], "below": [1, 5], "For": [1, 3, 5, 6], "more": [1, 3, 4, 5, 6], "inform": [1, 3, 5], "about": [1, 3, 5, 6], "how": [1, 5, 6], "contribut": [1, 7], "go": [1, 5], "our": 1, "md": [1, 7], "todo": 1, "add": [1, 2, 3, 5, 7], "detail": [1, 5], "instal": [1, 3, 6, 7], "requir": [1, 2, 3, 5, 6], "packag": [1, 2, 5], "your": [1, 2, 3, 5, 6], "fork": [1, 4], "pip": [1, 2, 7], "r": [1, 5], "txt": [1, 7], "To": [1, 2, 3, 5, 6], "onc": [1, 2, 3, 5], "cd": [1, 2, 7], "make": [1, 2, 3, 4, 5, 6], "dirhtml": 1, "rebuild": 1, "automat": 1, "everi": [1, 5], "time": [1, 5, 6], "chang": [1, 2, 3, 5, 7], "i": [1, 2, 3, 4, 5, 6], "made": [1, 6, 7], "sphinx": 1, "autobuild": 1, "b": 1, "_build": 1, "ad": [2, 5, 7], "new": [2, 3, 4, 7], "game": [2, 3, 4, 6], "can": [2, 3, 5, 6], "done": [2, 3, 6], "without": [2, 5], "recompil": 2, "stabl": [2, 3, 4, 5, 6], "need": [2, 5], "work": [2, 3, 5], "c": [2, 3, 7], "code": [2, 3, 5, 7], "want": [2, 3, 5, 6], "compil": [2, 5, 7], "least": 2, "either": [2, 5, 6], "gcc": 2, "5": [2, 5, 7], "clang": 2, "3": [2, 3, 4, 5, 6], "4": [2, 4, 5], "must": [2, 3], "first": [2, 4, 5, 7], "cmake": 2, "do": [2, 3, 5], "through": [2, 5], "manag": 2, "download": [2, 5], "offici": 2, "site": 2, "pip3": [2, 3], "re": [2, 5], "us": [2, 3, 4, 6, 7], "sure": [2, 3, 5], "tell": [2, 5], "itself": [2, 5], "system": [2, 3, 5], "path": [2, 3, 5], "sinc": [2, 5], "luajit": 2, "doe": [2, 5], "properli": [2, 3, 5], "lua": [2, 5], "1": [2, 3, 4, 5, 6], "homebrew": 2, "brew": 2, "pkg": 2, "config": [2, 4], "docker": [2, 7], "sudo": 2, "apt": 2, "get": [2, 5], "zlib1g": 2, "dev": 2, "git": [2, 7], "clone": 2, "http": 2, "github": [2, 3, 5, 7], "com": 2, "farama": [2, 7], "foundat": 2, "e": [2, 5], "run": [2, 3, 5], "build_window": 2, "bat": 2, "complet": [2, 5], "cp": 2, "copi": [2, 3, 5, 7], "whl": 2, "file": [2, 3, 7], "out": [2, 3, 5], "Then": [2, 5], "mai": [2, 5, 6], "after": [2, 3, 4, 5, 6], "instruct": 2, "platform": [2, 5], "note": [2, 3, 5], "mojav": 2, "10": [2, 3, 5, 7], "14": [2, 7], "librari": [2, 4], "commandlinetool": 2, "macos_sdk_headers_for_macos_10": 2, "capnp": 2, "qt5": 2, "dcmake_prefix_path": 2, "usr": 2, "local": [2, 5], "opt": 2, "qt": 2, "dbuild_ui": 2, "ON": 2, "upylib_directori": 2, "j": 2, "sysctl": 2, "hw": 2, "ncpu": 2, "cut": 2, "d": [2, 5], "f2": 2, "open": [2, 5], "gym": [2, 4, 6], "integr": [2, 6, 7], "app": 2, "capnproto": 2, "libcapnp": 2, "libqt5opengl5": 2, "qtbase5": 2, "grep": 2, "processor": 2, "proc": 2, "cpuinfo": 2, "The": [2, 3, 6], "current": [2, 3, 5], "support": [2, 3, 4, 6, 7], "nativ": [2, 5], "easili": [2, 5], "via": [2, 7], "wsl2": 2, "subsystem": 2, "abov": [2, 5], "within": [2, 5], "just": 2, "launch": 2, "binari": [2, 5], "like": [2, 3, 5], "would": [2, 5], "one": [3, 5], "version": [3, 5, 7], "python": 3, "6": [3, 5, 7], "appropri": [3, 5], "distribut": 3, "o": [3, 5], "beforehand": 3, "due": 3, "compat": 3, "issu": [3, 5], "some": [3, 5, 7], "core": [3, 7], "32": [3, 4, 5, 7], "bit": [3, 5], "oper": 3, "see": [3, 5, 6], "section": [3, 5, 6], "develop": 3, "build": [3, 7], "yourself": 3, "onli": [3, 5, 6], "now": [3, 6], "gymnasium": [3, 4, 5, 7], "env": [3, 4, 5, 6], "airstrik": [3, 4, 5, 6], "genesi": [3, 4, 5, 6], "ha": [3, 5], "non": [3, 5], "commerci": 3, "includ": [3, 4, 5, 6], "default": [3, 4, 5, 6, 7], "other": [3, 5], "obtain": 3, "them": [3, 5], "most": [3, 5, 6], "hash": [3, 5], "sourc": [3, 5, 6], "from": [3, 4, 6, 7], "respect": 3, "No": 3, "intro": 3, "sha": 3, "sum": [3, 5], "primarili": [3, 6], "mean": [3, 5], "train": [3, 4, 6], "rl": 3, "classic": [3, 4, 6], "video": [3, 4, 5], "though": [3, 5], "also": [3, 5, 6], "control": [3, 5, 6], "those": [3, 5], "here": [3, 4, 5, 6], "wai": [3, 5], "There": [3, 5, 6], "let": [3, 4, 5], "interfac": [3, 6], "python3": [3, 6], "m": [3, 6], "arrow": 3, "kei": [3, 5, 6], "x": 3, "ship": 3, "fire": [3, 5], "try": [3, 5], "api": [3, 5], "quit": 3, "basic": [3, 5], "advanc": [3, 5], "tool": [3, 7], "check": [3, 5, 7], "ui": [3, 6], "A": [3, 5, 6], "choos": 3, "action": [3, 4, 5], "each": [3, 5, 6], "timestep": 3, "look": [3, 5], "much": [3, 5, 6], "def": [3, 4, 5, 6], "main": [3, 4, 5, 6], "reset": [3, 4, 6], "while": [3, 5, 6], "true": [3, 6], "action_spac": [3, 6], "sampl": [3, 6], "observ": 3, "reward": [3, 7], "termin": [3, 4, 6], "truncat": [3, 4, 6], "info": [3, 4, 5, 6], "step": [3, 4, 5, 6], "render": 3, "close": [3, 6], "__name__": [3, 4, 5, 6], "__main__": [3, 4, 5, 6], "full": [3, 4, 5, 6, 7], "featur": [3, 6], "avail": [3, 5, 6], "dir": 3, "random_ag": 3, "It": [3, 5], "print": [3, 5], "exit": 3, "when": [3, 5, 7], "scenario": [3, 4, 6], "throw": 3, "except": [3, 5], "data": [3, 6, 7], "defin": [3, 5, 6], "set": [3, 5, 6], "up": [3, 5], "function": [3, 6], "isn": 3, "t": [3, 5], "too": [3, 5], "gener": 3, "simpl": [3, 5], "effect": [3, 5], "reinforc": [3, 4, 5], "learn": [3, 4, 5], "algorithm": [3, 5], "call": [3, 5], "revisit": 3, "arcad": 3, "machado": 3, "et": 3, "al": 3, "which": [3, 5, 6], "determinist": [3, 6], "easi": [3, 5], "implement": 3, "sequenc": 3, "button": [3, 5, 6], "press": [3, 6], "well": [3, 5, 6], "doesn": [3, 5], "screen": [3, 5, 6], "all": [3, 5, 6], "best": [3, 5], "seen": 3, "so": [3, 5, 6], "far": 3, "proxim": [3, 4], "polici": [3, 4], "optim": [3, 4], "schulman": 3, "plai": [3, 5, 6], "mani": [3, 5], "take": [3, 5], "awhil": [3, 5], "faster": 3, "gpu": 3, "baselin": [3, 4], "progress": [3, 5], "goe": [3, 5], "found": [3, 5], "spin": 3, "what": [3, 5, 7], "have": [3, 5, 6], "alreadi": 3, "been": [3, 5], "displai": [3, 5], "even": 3, "ones": 3, "miss": 3, "list_gam": [3, 5], "actual": [3, 5], "repo": 3, "correct": [3, 5], "comput": [3, 5], "identifi": 3, "directori": [3, 5, 6], "match": [3, 5, 7], "correspond": [3, 5], "type": 3, "list": [3, 4, 5, 6], "should": [3, 5], "collect": 3, "archiv": 3, "org": 3, "search": [3, 5], "insid": [3, 5], "zip": 3, "retro": [4, 5, 6], "maintain": 4, "openai": [4, 7], "": [4, 5, 6, 7], "turn": 4, "environ": [4, 5], "plateform": 4, "sega": [4, 5, 7], "32x": [4, 7], "super": [4, 5], "nintendo": [4, 5], "2600": [4, 5], "agent": [4, 5, 6], "import": [4, 5, 6], "argpars": 4, "numpi": 4, "np": 4, "wrapper": [4, 6], "time_limit": 4, "timelimit": 4, "stable_baselines3": 4, "ppo": 4, "common": 4, "atari_wrapp": 4, "cliprewardenv": 4, "warpfram": 4, "vec_env": 4, "subprocvecenv": 4, "vecframestack": 4, "vectransposeimag": 4, "class": [4, 6], "stochasticframeskip": 4, "__init__": 4, "self": 4, "n": [4, 5, 6], "stickprob": 4, "curac": 4, "none": [4, 6], "rng": 4, "random": [4, 6], "randomst": 4, "supports_want_rend": 4, "hasattr": 4, "kwarg": [4, 6], "return": [4, 5], "ac": 4, "fals": [4, 6], "totrew": 4, "0": [4, 5, 6, 7], "rang": [4, 6], "substep": 4, "delai": 4, "probabl": [4, 5], "elif": 4, "rand": 4, "second": 4, "definit": 4, "kick": 4, "ob": [4, 6], "rew": [4, 6], "want_rend": 4, "els": 4, "break": [4, 6], "make_retro": 4, "state": [4, 6], "max_episode_step": 4, "4500": 4, "25": [4, 7], "wrap_deepmind_retro": 4, "configur": 4, "similar": [4, 5], "deepmind": 4, "style": [4, 7], "wrap_deepmind": 4, "parser": 4, "argumentpars": 4, "add_argu": 4, "arg": 4, "parse_arg": 4, "make_env": 4, "venv": 4, "8": [4, 5, 6], "n_stack": 4, "model": 4, "cnnpolici": 4, "learning_r": 4, "lambda": 4, "f": 4, "2": [4, 5, 6], "5e": 4, "n_step": 4, "128": [4, 5], "batch_siz": 4, "n_epoch": 4, "gamma": 4, "99": 4, "gae_lambda": 4, "95": 4, "clip_rang": 4, "ent_coef": 4, "01": [4, 7], "verbos": 4, "total_timestep": 4, "100_000_000": 4, "log_interv": 4, "thing": 5, "start": [5, 6], "abl": 5, "ll": 5, "savest": [5, 6], "begin": 5, "restart": [5, 6], "put": 5, "point": 5, "relat": 5, "base": 5, "memori": [5, 6], "address": 5, "gameov": 5, "16712294": 5, "u2": 5, "live": 5, "16712282": 5, "score": 5, "16712270": 5, "u4": 5, "op": 5, "equal": 5, "refer": 5, "zero": 5, "specifi": [5, 6], "user": [5, 6], "miscellan": 5, "debug": [5, 7], "default_st": 5, "whitelist": 5, "suspici": 5, "few": [5, 6], "sha1": 5, "c67af162391fff4a63432be5a156eb9ca7b4da5a": 5, "These": 5, "next": 5, "describ": 5, "emul": [5, 6, 7], "allow": [5, 6], "entir": 5, "store": [5, 6], "disk": 5, "restor": 5, "specif": 5, "alwai": 5, "end": 5, "ident": 5, "standalon": 5, "gzip": 5, "inner": 5, "alongsid": 5, "name": [5, 6], "document": 5, "ground": 5, "truth": 5, "format": 5, "manifest": 5, "separ": 5, "although": 5, "entri": 5, "consist": [5, 6], "valu": [5, 6], "ram": [5, 6], "arrai": 5, "byte": 5, "descriptor": 5, "addendum": 5, "show": [5, 6], "wide": 5, "unsign": 5, "big": 5, "endian": 5, "possibl": [5, 6], "pertain": 5, "manual": 5, "overrid": 5, "retroenv": 5, "write": [5, 6], "multipli": 5, "posit": [5, 7], "penalti": 5, "neg": 5, "creat": [5, 6], "similarli": 5, "over": 5, "By": 5, "load": [5, 6], "altern": 5, "constructor": 5, "again": [5, 7], "calcul": 5, "split": 5, "subsect": 5, "coeffici": 5, "extract": 5, "measur": 5, "delta": 5, "pass": [5, 6], "raw": 5, "impli": 5, "addit": [5, 6], "instead": [5, 6], "subtract": 5, "off": 5, "taken": 5, "two": [5, 7], "reach": 5, "At": 5, "top": [5, 6], "level": [5, 6], "properti": 5, "combin": 5, "ani": [5, 6], "fulfil": 5, "per": 5, "absolut": 5, "ignor": 5, "help": 5, "normal": 5, "window": [5, 7], "mac": 5, "howev": 5, "url": 5, "longer": 5, "releas": 5, "command": 5, "shift": 5, "select": 5, "menu": 5, "option": 5, "mode": 5, "charact": 5, "etc": 5, "final": 5, "playabl": 5, "moment": 5, "paus": 5, "p": [5, 6], "save": 5, "hard": 5, "might": 5, "back": [5, 6], "exact": 5, "chose": 5, "previou": 5, "g": 5, "sailormoon": 5, "queenberylscastl": 5, "we": 5, "prefer": 5, "usa": 5, "denot": 5, "europ": 5, "japan": 5, "bin": 5, "extens": [5, 7], "renam": [5, 7], "applic": 5, "uniqu": 5, "given": [5, 6], "known": 5, "mega": 5, "drive": 5, "sfc": 5, "entertain": 5, "famicom": 5, "ne": 5, "a26": 5, "gb": 5, "boi": 5, "gba": 5, "gbc": 5, "color": 5, "gg": 5, "gear": 5, "pce": 5, "nec": 5, "turbografx": 5, "16": [5, 6, 7], "pc": 5, "engin": 5, "sm": 5, "master": 5, "sometim": 5, "differ": [5, 6], "gen": 5, "aforement": 5, "case": [5, 7], "know": 5, "session": 5, "provid": [5, 6], "numer": 5, "goal": 5, "machin": 5, "maxim": 5, "player": [5, 6], "remain": [5, 6], "hit": 5, "instanc": 5, "dy": 5, "modifi": 5, "disallow": 5, "kidchameleon": 5, "usual": 5, "easier": 5, "continu": 5, "left": 5, "pretti": 5, "better": 5, "reliabl": 5, "slightli": 5, "incorrect": 5, "still": 5, "life": 5, "becaus": [5, 6], "detect": 5, "than": [5, 6], "unreli": 5, "present": 5, "incorrectli": 5, "switch": 5, "test": [5, 7], "replai": 5, "multipl": 5, "row": 5, "accident": 5, "ideal": 5, "beat": 5, "besid": 5, "That": 5, "impract": 5, "exist": 5, "unabl": 5, "result": 5, "often": [5, 6], "good": 5, "choic": 5, "In": [5, 6], "stand": 5, "place": 5, "attack": 5, "same": [5, 6], "enemi": 5, "respawn": 5, "veri": 5, "Be": 5, "care": 5, "thei": [5, 6], "tricki": 5, "right": 5, "sens": 5, "receiv": 5, "factor": 5, "100": 5, "compar": 5, "cumul": 5, "pane": 5, "keep": 5, "pattern": 5, "tip": 5, "group": 5, "themselv": 5, "togeth": 5, "narrow": 5, "down": 5, "particular": 5, "nearbi": 5, "suspect": 5, "high": 5, "occasion": 5, "individu": 5, "123400": 5, "updat": [5, 7], "broken": [5, 7], "digit": 5, "bob": 5, "sne": 5, "number": [5, 6], "across": 5, "frame": 5, "script": [5, 6], "1942": 5, "uncommon": 5, "length": 5, "don": 5, "nice": 5, "neat": 5, "short": 5, "certain": 5, "track": 5, "long": 5, "suddenli": 5, "jump": 5, "between": 5, "decid": 5, "shorter": 5, "safer": 5, "bet": 5, "sai": 5, "2400": 5, "24": 5, "transpos": 5, "123456": 5, "012345": 5, "rather": 5, "fix": [5, 7], "health": 5, "symbol": 5, "bar": 5, "could": 5, "repres": 5, "9999999": 5, "becom": 5, "99999": 5, "lose": 5, "unit": 5, "And": 5, "consecut": 5, "ve": 5, "avoid": 5, "later": [5, 6], "One": 5, "correctli": 5, "d2": 5, "d4": 5, "maximum": 5, "9999": 5, "increas": 5, "viewer": 5, "10000": 5, "wrong": 5, "d3": 5, "999999": 5, "watch": 5, "increment": 5, "decrement": 5, "255": 5, "sign": 5, "u": 5, "appear": [5, 6], "16769105": 5, "i2": 5, "littl": 5, "notic": 5, "uneven": 5, "unusu": 5, "eg": 5, "u1": 5, "7e094d": 5, "144": 5, "137": 5, "d1": 5, "90": 5, "89": 5, "higher": 5, "reveal": 5, "didn": 5, "origin": 5, "until": 5, "someth": 5, "give": 5, "larg": 5, "die": 5, "upon": 5, "unless": 5, "befor": 5, "happen": 5, "forgot": 5, "upper": 5, "lower": 5, "kill": 5, "bug": [5, 7], "diverg": 5, "guardianlegend": 5, "custom_integr": 5, "structur": 5, "depend": 5, "addamsfamili": 5, "atari2600": [5, 6, 7], "adventur": 5, "gameboi": 5, "aerostar": 5, "gbadvanc": 5, "mariokart": 5, "gbcolor": 5, "pokemonpinbal": 5, "gamegear": 5, "mortalkombat": 5, "pcengin": 5, "soldierblad": 5, "add_custom_path": 5, "script_dir": 5, "dirnam": 5, "abspath": 5, "__file__": 5, "join": 5, "fakegam": 5, "inttyp": [5, 6], "directli": [5, 6], "three": 5, "part": 5, "order": 5, "hex": 5, "string": [5, 6], "0x01020304": 5, "0x01": 5, "0x02": 5, "0x03": 5, "0x04": 5, "middl": 5, "outsid": 5, "sigil": 5, "singl": 5, "nb": 5, "rare": 5, "plu": 5, "gx": 5, "thu": 5, "aka": 5, "As": 5, "groom": 5, "0x81": 5, "decim": 5, "129": 5, "127": 5, "81": 5, "low": 5, "nybbl": 5, "0xa": 5, "0xf": 5, "cannot": 5, "occur": 5, "last": 5, "piec": 5, "occupi": 5, "power": [5, 6], "mario": 5, "bro": 5, "size": 5, "less": 5, "0x0102": 5, "four": 5, "1234": 5, "0x12": 5, "0x34": 5, "u3": 5, "0x010203": 5, "0x1": 5, "n2": 5, "12": [5, 7], "intel": 5, "arm": 5, "cpu": 5, "powerpc": 5, "valid": 5, "recommend": 5, "undefin": 5, "invalid": 5, "q2": 5, "i0": 5, "variou": 5, "vari": 5, "form": 5, "premis": 5, "transform": 5, "furthermor": 5, "method": 5, "context": 5, "appli": 5, "nonzero": 5, "otherwis": 5, "greater": 5, "enum": 6, "use_restricted_act": 6, "filter": 6, "obs_typ": 6, "imag": 6, "render_mod": 6, "human": 6, "metadata": 6, "json": [6, 7], "initi": 6, "consol": 6, "special": 6, "space": 6, "multibinari": 6, "discret": 6, "multi_discret": 6, "multidiscet": 6, "own": 6, "deriv": 6, "exampl": [6, 7], "py": [6, 7], "custom": 6, "reduc": 6, "126": 6, "7": [6, 7], "rgb": 6, "view": 6, "smaller": 6, "variabl": 6, "dict": 6, "where": 6, "small": 6, "both": 6, "paddl": 6, "pong": [6, 7], "bottom": 6, "half": 6, "player_1_rew": 6, "player_2_rew": 6, "bk2": 6, "seri": 6, "output": 6, "1000": 6, "wish": 6, "sonic": 6, "hedgehog": 6, "were": 6, "contest": 6, "movi": 6, "gameplai": 6, "process": 6, "_": 6, "level1": 6, "000000": 6, "get_gam": 6, "everyth": 6, "initial_st": 6, "get_stat": 6, "num_button": 6, "append": 6, "get_kei": 6, "ffmpeg": 6, "input": 6, "locat": 6, "playback_movi": [6, 7], "2024": 7, "2023": 7, "ci": 7, "zbeucler2018": 7, "pseudo": 7, "rnd": 7, "thought": 7, "onaclov2000": 7, "remov": 7, "travi": 7, "setup": 7, "11": 7, "capabl": 7, "15": 7, "readm": 7, "matpoliquin": 7, "17": 7, "gcp": 7, "20": 7, "link": 7, "websit": 7, "23": 7, "doc": 7, "mgoulao": 7, "27": 7, "28": 7, "extra": 7, "18": 7, "duplic": 7, "30": 7, "publish": 7, "linux": 7, "31": 7, "appl": 7, "silicon": 7, "34": 7, "cmakelist": 7, "libzip": 7, "35": 7, "moonpatrol": 7, "36": 7, "pre": 7, "commit": 7, "hook": 7, "victorsevero": 7, "38": 7, "37": 7, "badg": 7, "elliottow": 7, "43": 7, "45": 7, "placehold": 7, "logo": 7, "screenshot": 7, "47": 7, "260": 7, "joohei": 7, "46": 7, "handl": 7, "log": 7, "48": 7, "saturn": 7, "virtua": 7, "fighter": 7, "49": 7, "whitespac": 7, "50": 7, "bump": 7, "setuptool": 7, "40": 7, "65": 7, "build_script": 7, "dependabot": 7, "39": 7, "21": 7, "41": 7, "certifi": 7, "2018": 7, "2022": 7, "42": 7, "wheel": 7, "adapt": 7, "yml": 7, "pettingzoo": 7, "workflow": 7, "51": 7, "52": 7, "54": 7, "53": 7, "mortal": 7, "kombat": 7, "55": 7, "58": 7, "cmd": 7, "line": 7, "59": 7, "disabl": 7, "multi": 7, "retro_env": 7, "61": 7, "misc": 7, "62": 7, "checker": 7, "63": 7, "nhl941on1": 7, "star": 7, "66": 7, "temp": 7, "segment": 7, "fault": 7, "67": 7, "typo": 7, "68": 7, "69": 7, "package_data": 7, "71": 7, "buld": 7, "manylinux": 7, "cibuildwheel": 7, "mwydmuch": 7, "73": 7, "contributor": 7, "changelog": 7, "08": 7}, "objects": {"retro": [[6, 0, 1, "", "Actions"], [6, 0, 1, "", "Observations"], [6, 0, 1, "", "RetroEnv"], [6, 0, 1, "", "State"], [6, 2, 1, "", "make"]], "retro.Actions": [[6, 1, 1, "", "ALL"], [6, 1, 1, "", "DISCRETE"], [6, 1, 1, "", "MULTI_DISCRETE"]], "retro.Observations": [[6, 1, 1, "", "IMAGE"], [6, 1, 1, "", "RAM"]], "retro.State": [[6, 1, 1, "", "DEFAULT"], [6, 1, 1, "", "NONE"]]}, "objtypes": {"0": "py:class", "1": "py:attribute", "2": "py:function"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "attribute", "Python attribute"], "2": ["py", "function", "Python function"]}, "titleterms": {"404": 0, "page": [0, 1], "Not": 0, "found": 0, "The": [0, 5], "request": 0, "could": 0, "stabl": [1, 7], "retro": [1, 2, 3, 7], "doc": 1, "instruct": 1, "modifi": 1, "environ": [1, 3, 6], "build": [1, 2], "document": 1, "develop": 2, "instal": 2, "from": [2, 5], "sourc": 2, "prerequisit": 2, "mac": 2, "window": 2, "linux": 2, "ui": [2, 5], "maco": 2, "get": 3, "start": 3, "creat": 3, "exampl": [3, 5], "usag": 3, "interact": 3, "script": 3, "random": 3, "agent": 3, "brute": 3, "ppo": 3, "integr": [3, 5], "import": 3, "rom": [3, 5], "game": 5, "level1": 5, "state": 5, "data": 5, "json": 5, "scenario": 5, "metadata": 5, "md": 5, "sha": 5, "file": [5, 6], "variabl": 5, "locat": 5, "new": 5, "support": 5, "type": 5, "done": 5, "condit": 5, "reward": 5, "function": 5, "find": 5, "common": 5, "error": 5, "us": 5, "custom": 5, "python": [5, 6], "appendix": 5, "oper": 5, "api": 6, "retroenv": 6, "action": 6, "observ": 6, "multiplay": 6, "replai": 6, "record": 6, "playback": 6, "render": 6, "video": 6, "releas": 7, "note": 7, "v0": 7, "9": 7, "3": 7, "2": 7, "1": 7}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1, "sphinx": 60}, "alltitles": {"404 - Page Not Found": [[0, "page-not-found"]], "The requested page could not be found.": [[0, "the-requested-page-could-not-be-found"]], "Stable-retro docs": [[1, "stable-retro-docs"]], "Instructions for modifying environment pages": [[1, "instructions-for-modifying-environment-pages"]], "Build the Documentation": [[1, "build-the-documentation"]], "Development": [[2, "development"]], "Install Retro from source": [[2, "install-retro-from-source"]], "Prerequisites": [[2, "prerequisites"]], "Mac prerequisites": [[2, "mac-prerequisites"]], "Windows prerequisites": [[2, "windows-prerequisites"]], "Linux prerequisites": [[2, "linux-prerequisites"]], "Building Linux and Mac": [[2, "building-linux-and-mac"]], "Building Windows": [[2, "building-windows"]], "Install Retro UI from source": [[2, "install-retro-ui-from-source"]], "macOS": [[2, "macos"]], "Linux": [[2, "linux"]], "Windows": [[2, "windows"]], "Getting Started": [[3, "getting-started"]], "Create a Retro Environment": [[3, "create-a-retro-environment"]], "Example Usage": [[3, "example-usage"]], "Interactive Script": [[3, "interactive-script"]], "Random Agent": [[3, "random-agent"]], "Brute": [[3, "brute"]], "PPO": [[3, "ppo"]], "Integrations": [[3, "integrations"]], "Importing ROMs": [[3, "importing-roms"]], "Game Integration": [[5, "game-integration"]], "Example Integration": [[5, "example-integration"]], "Level1.state": [[5, "level1-state"]], "data.json": [[5, "data-json"]], "scenario.json": [[5, "scenario-json"]], "metadata.json": [[5, "metadata-json"]], "rom.md": [[5, "rom-md"]], "rom.sha": [[5, "rom-sha"]], "Integration Files": [[5, "integration-files"]], "States": [[5, "states"]], "Variable Locations data.json": [[5, "variable-locations-data-json"]], "Scenario scenario.json": [[5, "scenario-scenario-json"]], "The Integration UI": [[5, "the-integration-ui"]], "Integrating a new ROM": [[5, "integrating-a-new-rom"]], "Supported ROM Types": [[5, "supported-rom-types"]], "Integrating a Game": [[5, "integrating-a-game"]], "Done Condition": [[5, "done-condition"]], "Reward Function": [[5, "reward-function"]], "Finding Variables": [[5, "finding-variables"]], "Common Errors": [[5, "common-errors"]], "Using a Custom Integration from Python": [[5, "using-a-custom-integration-from-python"]], "Appendix: Types": [[5, "appendix-types"]], "Appendix: Operations": [[5, "appendix-operations"]], "Python API": [[6, "python-api"]], "RetroEnv": [[6, "retroenv"]], "Actions": [[6, "actions"]], "Observations": [[6, "observations"]], "Multiplayer Environments": [[6, "multiplayer-environments"]], "Replay files": [[6, "replay-files"]], "Record": [[6, "record"]], "Playback": [[6, "playback"]], "Render to Video": [[6, "render-to-video"]], "Release Notes": [[7, "release-notes"]], "stable-retro v0.9.3": [[7, "release-v0-9-3"]], "stable-retro v0.9.2": [[7, "release-v0-9-2"]], "stable-retro v0.9.1": [[7, "release-v0-9-1"]]}, "indexentries": {"all (retro.actions attribute)": [[6, "retro.Actions.ALL"]], "actions (class in retro)": [[6, "retro.Actions"]], "default (retro.state attribute)": [[6, "retro.State.DEFAULT"]], "discrete (retro.actions attribute)": [[6, "retro.Actions.DISCRETE"]], "image (retro.observations attribute)": [[6, "retro.Observations.IMAGE"]], "multi_discrete (retro.actions attribute)": [[6, "retro.Actions.MULTI_DISCRETE"]], "none (retro.state attribute)": [[6, "retro.State.NONE"]], "observations (class in retro)": [[6, "retro.Observations"]], "ram (retro.observations attribute)": [[6, "retro.Observations.RAM"]], "retroenv (class in retro)": [[6, "retro.RetroEnv"]], "state (class in retro)": [[6, "retro.State"]], "make() (in module retro)": [[6, "retro.make"]]}})
\ No newline at end of file
+Search.setIndex({"alltitles": {"404 - Page Not Found": [[0, null]], "Actions": [[6, "actions"]], "Appendix: Operations": [[5, "appendix-operations"]], "Appendix: Types": [[5, "appendix-types"]], "Brute": [[3, "brute"]], "Build the Documentation": [[1, "build-the-documentation"]], "Building Linux and Mac": [[2, "building-linux-and-mac"]], "Building Windows": [[2, "building-windows"]], "Common Errors": [[5, "common-errors"]], "Create a Retro Environment": [[3, "create-a-retro-environment"]], "Development": [[2, null]], "Done Condition": [[5, "done-condition"]], "Example Integration": [[5, "example-integration"]], "Example Usage": [[3, "example-usage"]], "Finding Variables": [[5, "finding-variables"]], "Game Integration": [[5, null]], "Getting Started": [[3, null]], "Importing ROMs": [[3, "importing-roms"]], "Install Retro UI from source": [[2, "install-retro-ui-from-source"]], "Install Retro from source": [[2, "install-retro-from-source"]], "Instructions for modifying environment pages": [[1, "instructions-for-modifying-environment-pages"]], "Integrating a Game": [[5, "integrating-a-game"]], "Integrating a new ROM": [[5, "integrating-a-new-rom"]], "Integration Files": [[5, "integration-files"]], "Integrations": [[3, "integrations"]], "Interactive Script": [[3, "interactive-script"]], "Level1.state": [[5, "level1-state"]], "Linux": [[2, "linux"]], "Linux prerequisites": [[2, "linux-prerequisites"]], "Mac prerequisites": [[2, "mac-prerequisites"]], "Multiplayer Environments": [[6, "multiplayer-environments"]], "Observations": [[6, "observations"]], "PPO": [[3, "ppo"]], "Playback": [[6, "playback"]], "Prerequisites": [[2, "prerequisites"]], "Python API": [[6, null]], "Random Agent": [[3, "random-agent"]], "Record": [[6, "record"]], "Release Notes": [[7, null]], "Render to Video": [[6, "render-to-video"]], "Replay files": [[6, "replay-files"]], "RetroEnv": [[6, "retroenv"]], "Reward Function": [[5, "reward-function"]], "Scenario scenario.json": [[5, "scenario-scenario-json"]], "Stable-retro docs": [[1, null]], "States": [[5, "states"]], "Supported ROM Types": [[5, "supported-rom-types"]], "The Integration UI": [[5, "the-integration-ui"]], "The requested page could not be found.": [[0, "the-requested-page-could-not-be-found"]], "Using a Custom Integration from Python": [[5, "using-a-custom-integration-from-python"]], "Variable Locations data.json": [[5, "variable-locations-data-json"]], "Windows": [[2, "windows"]], "Windows prerequisites": [[2, "windows-prerequisites"]], "data.json": [[5, "data-json"]], "macOS": [[2, "macos"]], "metadata.json": [[5, "metadata-json"]], "rom.md": [[5, "rom-md"]], "rom.sha": [[5, "rom-sha"]], "scenario.json": [[5, "scenario-json"]], "stable-retro v0.9.1": [[7, "release-v0-9-1"]], "stable-retro v0.9.2": [[7, "release-v0-9-2"]], "v0.9.3": [[7, "release-v0-9-3"]]}, "docnames": ["404", "README", "developing", "getting_started", "index", "integration", "python", "release_notes"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.viewcode": 1}, "filenames": ["404.md", "README.md", "developing.md", "getting_started.md", "index.md", "integration.md", "python.md", "release_notes.md"], "indexentries": {"actions (class in retro)": [[6, "retro.Actions", false]], "all (retro.actions attribute)": [[6, "retro.Actions.ALL", false]], "default (retro.state attribute)": [[6, "retro.State.DEFAULT", false]], "discrete (retro.actions attribute)": [[6, "retro.Actions.DISCRETE", false]], "image (retro.observations attribute)": [[6, "retro.Observations.IMAGE", false]], "make() (in module retro)": [[6, "retro.make", false]], "multi_discrete (retro.actions attribute)": [[6, "retro.Actions.MULTI_DISCRETE", false]], "none (retro.state attribute)": [[6, "retro.State.NONE", false]], "observations (class in retro)": [[6, "retro.Observations", false]], "ram (retro.observations attribute)": [[6, "retro.Observations.RAM", false]], "retroenv (class in retro)": [[6, "retro.RetroEnv", false]], "state (class in retro)": [[6, "retro.State", false]]}, "objects": {"retro": [[6, 0, 1, "", "Actions"], [6, 0, 1, "", "Observations"], [6, 0, 1, "", "RetroEnv"], [6, 0, 1, "", "State"], [6, 2, 1, "", "make"]], "retro.Actions": [[6, 1, 1, "", "ALL"], [6, 1, 1, "", "DISCRETE"], [6, 1, 1, "", "MULTI_DISCRETE"]], "retro.Observations": [[6, 1, 1, "", "IMAGE"], [6, 1, 1, "", "RAM"]], "retro.State": [[6, 1, 1, "", "DEFAULT"], [6, 1, 1, "", "NONE"]]}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "attribute", "Python attribute"], "2": ["py", "function", "Python function"]}, "objtypes": {"0": "py:class", "1": "py:attribute", "2": "py:function"}, "terms": {"": [4, 5, 6, 7], "0": [4, 5, 6, 7], "000000": 6, "01": [4, 7], "012345": 5, "08": 7, "0x01": 5, "0x0102": 5, "0x010203": 5, "0x01020304": 5, "0x02": 5, "0x03": 5, "0x04": 5, "0x1": 5, "0x12": 5, "0x34": 5, "0x81": 5, "0xa": 5, "0xf": 5, "1": [2, 3, 4, 5, 6], "10": [2, 3, 5, 7], "100": 5, "1000": 6, "10000": 5, "100_000_000": 4, "102": 7, "103": 7, "104": 7, "105": 7, "106": 7, "109": 7, "11": 7, "110": 7, "114": 7, "116": 7, "118": 7, "119": 7, "12": [5, 7], "120": 7, "122": 7, "123": 7, "1234": 5, "123400": 5, "123456": 5, "124": 7, "125": 7, "126": 6, "127": 5, "128": [4, 5], "129": [5, 7], "130": 7, "137": 5, "14": [2, 7], "144": 5, "15": 7, "16": [5, 6, 7], "16712270": 5, "16712282": 5, "16712294": 5, "16769105": 5, "17": 7, "18": 7, "1942": 5, "2": [4, 5, 6], "20": 7, "2018": 7, "2022": 7, "2023": 7, "2025": 7, "21": 7, "23": 7, "24": 5, "2400": 5, "25": [4, 7], "255": 5, "260": 7, "2600": [4, 5], "27": 7, "28": 7, "3": [2, 3, 4, 5, 6], "30": 7, "31": 7, "32": [3, 4, 5, 7], "32x": [4, 7], "34": 7, "35": 7, "36": 7, "37": 7, "38": 7, "39": 7, "4": [2, 4, 5, 7], "40": 7, "41": 7, "42": 7, "43": 7, "45": 7, "4500": 4, "46": 7, "47": 7, "48": 7, "49": 7, "5": [2, 5, 7], "50": 7, "51": 7, "52": 7, "53": 7, "54": 7, "55": 7, "58": 7, "59": 7, "5e": 4, "6": [3, 5, 7], "61": 7, "62": 7, "63": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "7": [6, 7], "70": 7, "71": 7, "73": 7, "74": 7, "75": 7, "76": 7, "78": 7, "79": 7, "7e094d": 5, "8": [4, 5, 6], "80": 7, "81": [5, 7], "82": 7, "83": 7, "84": 7, "85": 7, "86": 7, "87": 7, "88": 7, "89": [5, 7], "90": [5, 7], "92": 7, "93": 7, "94": 7, "95": [4, 7], "96": 7, "98": 7, "99": [4, 7], "9999": 5, "99999": 5, "999999": 5, "9999999": 5, "A": [3, 5, 6], "And": 5, "As": 5, "At": 5, "Be": 5, "By": 5, "For": [1, 3, 5, 6], "If": [1, 2, 3, 5, 6], "In": [5, 6], "It": [3, 5], "No": 3, "ON": 2, "One": 5, "That": 5, "The": [2, 3, 6], "Then": [2, 5], "There": [3, 5, 6], "These": 5, "To": [1, 2, 3, 5, 6], "_": 6, "__file__": 5, "__init__": 4, "__main__": [3, 4, 5, 6], "__name__": [3, 4, 5, 6], "_build": 1, "a26": 5, "abl": 5, "about": [1, 3, 5, 6], "abov": [2, 5], "absolut": 5, "abspath": 5, "ac": 4, "accident": 5, "across": 5, "action": [3, 4, 5, 7], "action_spac": [3, 6], "actual": [3, 5], "ad": [2, 5, 7], "adapt": 7, "add": [1, 2, 3, 5, 7], "add_argu": 4, "add_custom_path": 5, "addamsfamili": 5, "addendum": 5, "addit": [5, 6], "addr": 7, "address": [5, 7], "advanc": [3, 5], "adventur": 5, "aerostar": 5, "aforement": 5, "after": [2, 3, 4, 5, 6], "again": [5, 7], "agent": [4, 5, 6], "airstrik": [3, 4, 5, 6], "aka": 5, "al": 3, "algorithm": [3, 5], "all": [3, 5, 6], "allow": [5, 6], "alongsid": 5, "alreadi": 3, "also": [3, 5, 6], "altern": 5, "although": 5, "alwai": 5, "an": [1, 3, 4, 5, 6], "ani": [5, 6], "api": [3, 5], "app": 2, "appear": [5, 6], "append": 6, "appl": 7, "appli": 5, "applic": 5, "appropri": [3, 5], "apt": 2, "ar": [1, 3, 5, 6], "arcad": 3, "archiv": 3, "arg": 4, "argpars": 4, "argumentpars": 4, "arm": 5, "arrai": 5, "arrow": 3, "artifact": 7, "atari": [1, 4, 5], "atari2600": [5, 6, 7], "atari_wrapp": 4, "attack": 5, "autobuild": 1, "automat": 1, "avail": [3, 5, 6], "avoid": 5, "awhil": [3, 5], "b": 1, "back": [5, 6], "badfilm": 7, "badg": 7, "bar": 5, "base": 5, "baselin": [3, 4], "basic": [3, 5], "bat": 2, "batch_siz": 4, "beat": 5, "becaus": [5, 6], "becom": 5, "been": [3, 5], "befor": 5, "beforehand": 3, "begin": 5, "below": [1, 5], "besid": 5, "best": [3, 5], "bet": 5, "better": 5, "between": 5, "big": 5, "bin": 5, "binari": [2, 5], "bit": [3, 5], "bk2": 6, "black": 7, "bob": 5, "bogu": 7, "boi": 5, "both": 6, "bottom": 6, "break": [4, 6], "brew": 2, "bro": 5, "broken": [5, 7], "bug": [5, 7], "build": [3, 7], "build_script": 7, "build_window": 2, "buld": 7, "bump": 7, "button": [3, 5, 6], "byte": 5, "c": [2, 3, 7], "c67af162391fff4a63432be5a156eb9ca7b4da5a": 5, "calcul": 5, "call": [3, 5], "can": [2, 3, 5, 6], "cannot": 5, "capabl": 7, "capnp": 2, "capnproto": [2, 7], "care": 5, "case": [5, 7], "cd": [1, 2, 7], "certain": 5, "certifi": 7, "chang": [1, 2, 3, 5, 7], "changelog": 7, "charact": 5, "check": [3, 5, 7], "checker": 7, "choic": 5, "choos": 3, "chose": 5, "ci": 7, "cibuildwheel": 7, "clang": 2, "class": [4, 6], "classic": [3, 4, 6], "clip_rang": 4, "cliprewardenv": 4, "clone": 2, "close": [3, 6], "cmake": 2, "cmakelist": 7, "cmd": 7, "cnnpolici": 4, "code": [2, 3, 5, 7], "coeffici": 5, "collect": 3, "color": 5, "com": 2, "combin": 5, "command": 5, "commandlinetool": 2, "commerci": 3, "commit": 7, "common": 4, "compar": 5, "compat": 3, "compil": [2, 5, 7], "complet": [2, 5], "comput": [3, 5], "conduct": 7, "config": [2, 4], "configur": 4, "consecut": 5, "consist": [5, 6], "consol": 6, "constructor": 5, "contain": [1, 2, 5, 6], "contest": 6, "context": 5, "continu": 5, "contribut": [1, 7], "contributor": 7, "control": [3, 5, 6], "copi": [2, 3, 5, 7], "core": [3, 7], "correct": [3, 5, 7], "correctli": 5, "correspond": [3, 5], "could": 5, "cp": 2, "cpu": 5, "cpuinfo": 2, "creat": [5, 6], "cumul": 5, "curac": 4, "current": [2, 3, 5], "custom": 6, "custom_integr": 5, "cut": 2, "d": [2, 5], "d1": 5, "d2": 5, "d3": 5, "d4": 5, "data": [3, 6, 7], "dbuild_ui": 2, "dcmake_prefix_path": 2, "debug": [5, 7], "decid": 5, "decim": 5, "decrement": 5, "deepmind": 4, "def": [3, 4, 5, 6], "default": [3, 4, 5, 6, 7], "default_st": 5, "defin": [3, 5, 6], "definit": 4, "delai": 4, "delta": 5, "denot": 5, "depend": 5, "dependabot": 7, "deriv": 6, "describ": 5, "descriptor": 5, "detail": [1, 5], "detect": 5, "determinist": [3, 6], "dev": 2, "develop": 3, "dict": 6, "didn": 5, "die": 5, "differ": [5, 6], "digit": 5, "dir": 3, "directli": [5, 6], "directori": [3, 5, 6], "dirhtml": 1, "dirnam": 5, "disabl": 7, "disallow": 5, "discret": 6, "disk": 5, "displai": [3, 5], "distribut": 3, "diverg": 5, "do": [2, 3, 5], "doc": 7, "docker": [2, 7], "document": 5, "doe": [2, 5], "doesn": [3, 5], "don": 5, "done": [2, 3, 6], "down": 5, "download": [2, 5, 7], "drive": 5, "due": 3, "duplic": 7, "dy": 5, "e": [2, 5], "each": [3, 5, 6], "easi": [3, 5], "easier": 5, "easili": [2, 5], "effect": [3, 5], "eg": 5, "either": [2, 5, 6], "elif": 4, "elliottow": 7, "els": 4, "emul": [5, 6, 7], "enabl": 7, "end": 5, "endian": 5, "enemi": 5, "engin": 5, "ent_coef": 4, "entertain": 5, "entir": 5, "entri": 5, "enum": 6, "env": [3, 4, 5, 6, 7], "environ": [4, 5], "equal": 5, "error": 7, "et": 3, "etc": 5, "europ": 5, "even": 3, "everi": [1, 5], "everyth": 6, "exact": 5, "exampl": [6, 7], "except": [3, 5], "exist": 5, "exit": 3, "extens": [5, 7], "extra": 7, "extract": 5, "f": 4, "f2": 2, "factor": 5, "fakegam": 5, "fals": [4, 6], "famicom": 5, "far": 3, "farama": [2, 7], "faster": 3, "fault": 7, "featur": [3, 6], "few": [5, 6], "ffmpeg": 6, "fighter": 7, "file": [2, 3, 7], "filter": 6, "final": 5, "fire": [3, 5], "first": [2, 4, 5, 7], "fix": [5, 7], "folder": [1, 5], "follow": [1, 2, 5, 6], "forgot": 5, "fork": [1, 4], "form": 5, "format": 5, "found": [3, 5], "foundat": 2, "four": 5, "frame": 5, "from": [3, 4, 6, 7], "fulfil": 5, "full": [3, 4, 5, 6, 7], "fullstar": 7, "function": [3, 6, 7], "fund": 7, "furthermor": 5, "g": 5, "gae_lambda": 4, "game": [2, 3, 4, 6], "gameboi": 5, "gamegear": 5, "gameov": 5, "gameplai": 6, "gamma": 4, "gb": 5, "gba": 5, "gbadvanc": 5, "gbc": 5, "gbcolor": 5, "gcc": 2, "gcp": 7, "gear": 5, "gen": 5, "gener": 3, "genesi": [3, 4, 5, 6, 7], "get": [2, 5], "get_gam": 6, "get_kei": 6, "get_stat": 6, "getting_start": 7, "gg": 5, "git": [2, 7], "github": [2, 3, 5, 7], "give": 5, "given": [5, 6], "go": [1, 5], "goal": 5, "goe": [3, 5], "good": 5, "gpu": 3, "greater": 5, "grep": 2, "groom": 5, "ground": 5, "group": 5, "gtag": 7, "guardianlegend": 5, "gx": 5, "gym": [2, 4, 6], "gymnasium": [3, 4, 5, 7], "gzip": 5, "ha": [3, 5], "half": 6, "handl": 7, "happen": 5, "hard": 5, "hasattr": 4, "hash": [3, 5], "have": [3, 5, 6], "health": 5, "hedgehog": 6, "help": 5, "here": [3, 4, 5, 6], "hex": 5, "high": 5, "higher": 5, "hit": 5, "homebrew": 2, "hook": 7, "how": [1, 5, 6], "howev": 5, "http": 2, "human": 6, "hw": 2, "i": [1, 2, 3, 4, 5, 6], "i0": 5, "i2": 5, "ideal": 5, "ident": 5, "identifi": 3, "ignor": 5, "imag": 6, "implement": 3, "impli": 5, "import": [4, 5, 6], "impract": 5, "includ": [3, 4, 5, 6], "incorrect": 5, "incorrectli": 5, "increas": 5, "increment": 5, "individu": 5, "info": [3, 4, 5, 6], "inform": [1, 3, 5], "init": 7, "initi": 6, "initial_st": 6, "inner": 5, "input": 6, "insid": [3, 5], "instal": [1, 3, 6, 7], "instanc": 5, "instead": [5, 6], "instruct": [2, 7], "integr": [2, 6, 7], "intel": 5, "interfac": [3, 6], "intro": 3, "inttyp": [5, 6], "invalid": 5, "isn": 3, "issu": [3, 5, 7], "itself": [2, 5], "j": 2, "japan": 5, "join": 5, "joohei": 7, "json": [6, 7], "jump": 5, "just": 2, "keep": 5, "kei": [3, 5, 6], "kick": 4, "kidchameleon": 5, "kill": 5, "know": 5, "known": 5, "kombat": 7, "kwarg": [4, 6], "lambda": 4, "larg": 5, "last": 5, "later": [5, 6], "launch": 2, "learn": [3, 4, 5], "learning_r": 4, "least": 2, "left": 5, "length": 5, "less": 5, "let": [3, 4, 5], "level": [5, 6], "level1": 6, "libcapnp": 2, "libqt5opengl5": 2, "librari": [2, 4], "libzip": 7, "life": 5, "like": [2, 3, 5], "line": 7, "link": 7, "linux": 7, "list": [3, 4, 5, 6], "list_gam": [3, 5], "littl": 5, "live": 5, "ll": 5, "load": [5, 6], "local": [2, 5], "locat": 6, "log": 7, "log_interv": 4, "logo": 7, "long": 5, "longer": 5, "look": [3, 5], "lose": 5, "low": 5, "lower": 5, "lua": [2, 5], "luajit": 2, "m": [3, 6, 7], "mac": [5, 7], "machado": 3, "machin": 5, "macos_sdk_headers_for_macos_10": 2, "made": [1, 6, 7], "mai": [2, 5, 6], "main": [3, 4, 5, 6], "maintain": 4, "make": [1, 2, 3, 4, 5, 6], "make_env": 4, "make_retro": 4, "manag": 2, "mani": [3, 5], "manifest": 5, "manual": 5, "manylinux": 7, "mario": 5, "mariokart": 5, "master": 5, "match": [3, 5, 7], "matpoliquin": 7, "max_episode_step": 4, "maxim": 5, "maximum": 5, "md": [1, 7], "mean": [3, 5], "measur": 5, "mega": 5, "memori": [5, 6], "menu": 5, "metadata": 6, "method": 5, "mgoulao": 7, "middl": 5, "might": 5, "misc": 7, "miscellan": 5, "miss": 3, "mode": 5, "mode80": 7, "model": 4, "modifi": 5, "mojav": 2, "moment": 5, "moonpatrol": 7, "more": [1, 3, 4, 5, 6], "mortal": 7, "mortalkombat": 5, "most": [3, 5, 6], "movi": 6, "much": [3, 5, 6], "multi": 7, "multi_discret": 6, "multibinari": 6, "multidiscet": 6, "multipl": 5, "multipli": 5, "must": [2, 3], "mwydmuch": 7, "n": [4, 5, 6], "n2": 5, "n_epoch": 4, "n_stack": 4, "n_step": 4, "name": [5, 6], "narrow": 5, "nativ": [2, 5], "nb": 5, "ncpu": 2, "ne": 5, "nearbi": 5, "neat": 5, "nec": 5, "need": [2, 5], "neg": 5, "new": [2, 3, 4, 7], "next": 5, "nhl94": 7, "nhl941on1": 7, "nhl942on2": 7, "nice": 5, "nintendo": [4, 5], "non": [3, 5], "none": [4, 6], "nonzero": 5, "normal": 5, "note": [2, 3, 5], "notic": 5, "notif": 7, "now": [3, 6], "np": 4, "num_button": 6, "number": [5, 6], "numer": 5, "numpi": 4, "nybbl": 5, "o": [3, 5], "ob": [4, 6], "obs_typ": 6, "observ": 3, "obtain": 3, "occasion": 5, "occupi": 5, "occur": 5, "off": 5, "offici": 2, "often": [5, 6], "onaclov2000": 7, "onc": [1, 2, 3, 5], "one": [3, 5], "ones": 3, "onli": [3, 5, 6], "op": 5, "open": [2, 5], "openai": [4, 7], "oper": 3, "opt": 2, "optim": [3, 4], "option": 5, "order": 5, "org": 3, "origin": 5, "other": [3, 5], "otherwis": 5, "our": 1, "out": [2, 3, 5], "output": 6, "outsid": 5, "over": 5, "overrid": 5, "own": 6, "p": [5, 6], "p1_x": 7, "packag": [1, 2, 5], "package_data": 7, "paddl": 6, "pane": 5, "parse_arg": 4, "parser": 4, "part": 5, "particular": 5, "pass": [5, 6], "path": [2, 3, 5], "pattern": 5, "paus": 5, "pc": 5, "pce": 5, "pcengin": 5, "penalti": 5, "per": 5, "pertain": 5, "pettingzoo": 7, "piec": 5, "pip": [1, 2, 7], "pip3": [2, 3], "pkg": 2, "place": 5, "placehold": 7, "plai": [3, 5, 6], "plateform": 4, "platform": [2, 5], "playabl": 5, "playback_movi": [6, 7], "player": [5, 6, 7], "player_1_rew": 6, "player_2_rew": 6, "pleas": [1, 3, 5], "plu": 5, "point": 5, "pokemonpinbal": 5, "polici": [3, 4], "pong": [6, 7], "posit": [5, 7], "possibl": [5, 6], "power": [5, 6], "powerpc": 5, "ppo": 4, "pre": 7, "prefer": 5, "premis": 5, "present": 5, "press": [3, 6], "pretti": 5, "previou": 5, "primarili": [3, 6], "print": [3, 5], "probabl": [4, 5], "proc": 2, "process": 6, "processor": 2, "progress": [3, 5], "properli": [2, 3, 5], "properti": 5, "provid": [5, 6], "proxim": [3, 4], "pseudo": 7, "publish": 7, "put": 5, "py": [6, 7], "py311": 7, "py312": 7, "pypa": 7, "python": [3, 7], "python3": [3, 6], "q2": 5, "qemu": 7, "qt": 2, "qt5": 2, "qtbase5": 2, "queenberylscastl": 5, "quit": 3, "r": [1, 5], "ram": [5, 6, 7], "rand": 4, "random": [4, 6], "random_ag": 3, "randomst": 4, "rang": [4, 6], "rare": 5, "rather": 5, "raw": 5, "re": [2, 5], "reach": 5, "readm": 7, "rebuild": 1, "receiv": 5, "recommend": 5, "recompil": 2, "reduc": 6, "refer": 5, "reinforc": [3, 4, 5], "relat": 5, "releas": 5, "reliabl": 5, "remain": [5, 6], "remov": 7, "renam": [5, 7], "render": 3, "render_mod": 6, "replai": 5, "repo": [3, 7], "repres": 5, "requir": [1, 2, 3, 5, 6], "reset": [3, 4, 6], "respawn": 5, "respect": 3, "restart": [5, 6], "restor": 5, "result": 5, "retro": [4, 5, 6], "retro_env": 7, "retroenv": 5, "return": [4, 5], "reveal": 5, "revisit": 3, "rew": [4, 6], "reward": [3, 7], "rgb": 6, "right": 5, "rl": 3, "rnd": 7, "rng": 4, "row": 5, "run": [2, 3, 5], "safer": 5, "sai": 5, "sailormoon": 5, "same": [5, 6], "sampl": [3, 6], "saturn": 7, "save": 5, "savest": [5, 6], "scenario": [3, 4, 6], "schulman": 3, "score": 5, "screen": [3, 5, 6], "screenshot": 7, "script": [5, 6], "script_dir": 5, "seanpai96": 7, "search": [3, 5], "second": 4, "section": [3, 5, 6], "see": [3, 5, 6], "seen": 3, "sega": [4, 5, 7], "segment": 7, "select": 5, "self": 4, "sens": 5, "separ": 5, "sequenc": 3, "seri": [6, 7], "session": 5, "set": [3, 5, 6], "set_valu": 7, "setup": 7, "setuptool": 7, "sfc": 5, "sha": 3, "sha1": 5, "shift": 5, "ship": 3, "short": 5, "shorter": 5, "should": [3, 5], "show": [5, 6], "sigil": 5, "sign": 5, "silicon": 7, "similar": [4, 5], "similarli": 5, "simpl": [3, 5], "sinc": [2, 5], "singl": 5, "site": 2, "size": 5, "slightli": 5, "sm": 5, "small": 6, "smaller": 6, "sne": 5, "so": [3, 5, 6], "soldierblad": 5, "some": [3, 5, 7], "someth": 5, "sometim": 5, "sonic": 6, "sourc": [3, 5, 6], "space": 6, "special": 6, "specif": 5, "specifi": [5, 6], "sphinx": 1, "spin": 3, "split": 5, "stabl": [2, 3, 4, 5, 6], "stable_baselines3": 4, "stableretro": 1, "stand": 5, "standalon": 5, "star": 7, "start": [5, 6], "state": [4, 6, 7], "step": [3, 4, 5, 6], "stickprob": 4, "still": 5, "stochasticframeskip": 4, "store": [5, 6], "string": [5, 6], "structur": 5, "style": [4, 7], "subprocvecenv": 4, "subsect": 5, "substep": 4, "subsystem": 2, "subtract": 5, "suddenli": 5, "sudo": 2, "sum": [3, 5], "super": [4, 5], "support": [2, 3, 4, 6, 7], "supports_want_rend": 4, "sure": [2, 3, 5], "suspect": 5, "suspici": 5, "switch": 5, "symbol": 5, "sysctl": 2, "system": [2, 3, 5], "t": [3, 5], "take": [3, 5], "taken": 5, "tell": [2, 5], "temp": 7, "termin": [3, 4, 6], "test": [5, 7], "than": [5, 6], "thatguy11325": 7, "thei": [5, 6], "them": [3, 5], "themselv": 5, "thi": [1, 2, 3, 5, 6], "thing": 5, "those": [3, 5], "though": [3, 5], "thought": 7, "three": 5, "through": [2, 5], "throw": 3, "thu": 5, "time": [1, 5, 6], "time_limit": 4, "timelimit": 4, "timestep": 3, "tip": 5, "todo": 1, "togeth": 5, "too": [3, 5], "tool": [3, 7], "top": [5, 6], "total_timestep": 4, "totrew": 4, "track": 5, "train": [3, 4, 6], "transform": 5, "transpos": 5, "travi": 7, "tricki": 5, "true": [3, 6], "truncat": [3, 4, 6], "truth": 5, "try": [3, 5], "turbografx": 5, "turn": 4, "tutori": 7, "two": [5, 7], "txt": [1, 7], "type": [3, 7], "typo": 7, "u": 5, "u1": 5, "u2": 5, "u3": 5, "u4": 5, "ui": [3, 6, 7], "unabl": 5, "uncommon": 5, "undefin": 5, "uneven": 5, "uniqu": 5, "unit": 5, "unless": 5, "unreli": 5, "unsign": 5, "until": 5, "unusu": 5, "up": [3, 5], "updat": [5, 7], "upon": 5, "upper": 5, "upylib_directori": 2, "url": 5, "us": [2, 3, 4, 6, 7], "usa": 5, "use_restricted_act": 6, "user": [5, 6], "usr": 2, "usual": 5, "valid": 5, "valu": [5, 6], "var": 7, "vari": 5, "variabl": [6, 7], "variou": 5, "ve": 5, "vec_env": 4, "vecframestack": 4, "vectransposeimag": 4, "veloc": 7, "venv": 4, "verbos": 4, "veri": 5, "version": [3, 5, 7], "via": [2, 7], "victorsevero": 7, "video": [3, 4, 5], "view": 6, "viewer": 5, "virtua": 7, "wai": [3, 5], "want": [2, 3, 5, 6], "want_rend": 4, "warpfram": 4, "watch": 5, "we": 5, "websit": 7, "well": [3, 5, 6], "were": 6, "what": [3, 5, 7], "wheel": 7, "when": [3, 5, 7], "where": 6, "which": [3, 5, 6], "while": [3, 5, 6], "white": 7, "whitelist": 5, "whitespac": 7, "whl": 2, "wide": 5, "window": [5, 7], "wish": 6, "within": [2, 5], "without": [2, 5], "work": [2, 3, 5], "workflow": 7, "would": [2, 5], "wrap_deepmind": 4, "wrap_deepmind_retro": 4, "wrapper": [4, 6], "write": [5, 6], "wrong": 5, "wsl2": 2, "x": 3, "yml": 7, "you": [1, 2, 3, 4, 5, 6], "your": [1, 2, 3, 5, 6], "yourself": 3, "zbeucler2018": 7, "zero": 5, "zip": 3, "zlib1g": 2}, "titles": ["404 - Page Not Found", "Stable-retro docs", "Development", "Getting Started", "<no title>", "Game Integration", "Python API", "Release Notes"], "titleterms": {"1": 7, "2": 7, "3": 7, "404": 0, "9": 7, "Not": 0, "The": [0, 5], "action": 6, "agent": 3, "api": 6, "appendix": 5, "brute": 3, "build": [1, 2], "common": 5, "condit": 5, "could": 0, "creat": 3, "custom": 5, "data": 5, "develop": 2, "doc": 1, "document": 1, "done": 5, "environ": [1, 3, 6], "error": 5, "exampl": [3, 5], "file": [5, 6], "find": 5, "found": 0, "from": [2, 5], "function": 5, "game": 5, "get": 3, "import": 3, "instal": 2, "instruct": 1, "integr": [3, 5], "interact": 3, "json": 5, "level1": 5, "linux": 2, "locat": 5, "mac": 2, "maco": 2, "md": 5, "metadata": 5, "modifi": 1, "multiplay": 6, "new": 5, "note": 7, "observ": 6, "oper": 5, "page": [0, 1], "playback": 6, "ppo": 3, "prerequisit": 2, "python": [5, 6], "random": 3, "record": 6, "releas": 7, "render": 6, "replai": 6, "request": 0, "retro": [1, 2, 3, 7], "retroenv": 6, "reward": 5, "rom": [3, 5], "scenario": 5, "script": 3, "sha": 5, "sourc": 2, "stabl": [1, 7], "start": 3, "state": 5, "support": 5, "type": 5, "ui": [2, 5], "us": 5, "usag": 3, "v0": 7, "variabl": 5, "video": 6, "window": 2}})
\ No newline at end of file