diff --git a/main/.buildinfo b/main/.buildinfo new file mode 100644 index 00000000..ebe5e06c --- /dev/null +++ b/main/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 1c187739092ee7b3f19e2b93d9e6e9f2 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/main/.doctrees/api.doctree b/main/.doctrees/api.doctree new file mode 100644 index 00000000..ee1aa01b Binary files /dev/null and b/main/.doctrees/api.doctree differ diff --git a/main/.doctrees/api/carl.envs.carl_env.doctree b/main/.doctrees/api/carl.envs.carl_env.doctree new file mode 100644 index 00000000..1d3dd49f Binary files /dev/null and b/main/.doctrees/api/carl.envs.carl_env.doctree differ diff --git a/main/.doctrees/api/carl.envs.doctree b/main/.doctrees/api/carl.envs.doctree new file mode 100644 index 00000000..81e97fc4 Binary files /dev/null and b/main/.doctrees/api/carl.envs.doctree differ diff --git a/main/.doctrees/api/carl.envs.gymnasium.carl_gymnasium_env.doctree b/main/.doctrees/api/carl.envs.gymnasium.carl_gymnasium_env.doctree new file mode 100644 index 00000000..331df629 Binary files /dev/null and b/main/.doctrees/api/carl.envs.gymnasium.carl_gymnasium_env.doctree differ diff --git a/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_acrobot.doctree b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_acrobot.doctree new file mode 100644 index 00000000..a6b567d7 Binary files /dev/null and b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_acrobot.doctree differ diff --git a/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_cartpole.doctree b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_cartpole.doctree new file mode 100644 index 00000000..91e515e0 Binary files /dev/null and b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_cartpole.doctree differ diff --git a/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_mountaincar.doctree b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_mountaincar.doctree new file mode 100644 index 00000000..594bf20f Binary files /dev/null and b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_mountaincar.doctree differ diff --git a/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.doctree b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.doctree new file mode 100644 index 00000000..17801fb6 Binary files /dev/null and b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.doctree differ diff --git a/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_pendulum.doctree b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_pendulum.doctree new file mode 100644 index 00000000..da9c8931 Binary files /dev/null and b/main/.doctrees/api/carl.envs.gymnasium.classic_control.carl_pendulum.doctree differ diff --git a/main/.doctrees/api/carl.envs.gymnasium.classic_control.doctree b/main/.doctrees/api/carl.envs.gymnasium.classic_control.doctree new file mode 100644 index 00000000..44d9746c Binary files /dev/null and b/main/.doctrees/api/carl.envs.gymnasium.classic_control.doctree differ diff --git a/main/.doctrees/api/carl.envs.gymnasium.doctree b/main/.doctrees/api/carl.envs.gymnasium.doctree new file mode 100644 index 00000000..ad3304be Binary files /dev/null and b/main/.doctrees/api/carl.envs.gymnasium.doctree differ diff --git a/main/.doctrees/api/carl.envs.mario.doctree b/main/.doctrees/api/carl.envs.mario.doctree new file mode 100644 index 00000000..ffbcfac9 Binary files /dev/null and b/main/.doctrees/api/carl.envs.mario.doctree differ diff --git a/main/.doctrees/api/carl.envs.mario.level_image_gen.doctree b/main/.doctrees/api/carl.envs.mario.level_image_gen.doctree new file mode 100644 index 00000000..d14b2717 Binary files /dev/null and b/main/.doctrees/api/carl.envs.mario.level_image_gen.doctree differ diff --git a/main/.doctrees/api/carl.envs.mario.mario_game.doctree b/main/.doctrees/api/carl.envs.mario.mario_game.doctree new file mode 100644 index 00000000..b55282a7 Binary files /dev/null and b/main/.doctrees/api/carl.envs.mario.mario_game.doctree differ diff --git a/main/.doctrees/api/carl.envs.mario.models.doctree b/main/.doctrees/api/carl.envs.mario.models.doctree new file mode 100644 index 00000000..e78525a2 Binary files /dev/null and b/main/.doctrees/api/carl.envs.mario.models.doctree differ diff --git a/main/.doctrees/api/carl.envs.mario.reachabillity.doctree b/main/.doctrees/api/carl.envs.mario.reachabillity.doctree new file mode 100644 index 00000000..d2374650 Binary files /dev/null and b/main/.doctrees/api/carl.envs.mario.reachabillity.doctree differ diff --git a/main/.doctrees/api/carl.envs.rna.carl_rna_definitions.doctree b/main/.doctrees/api/carl.envs.rna.carl_rna_definitions.doctree new file mode 100644 index 00000000..7db0b6e6 Binary files /dev/null and b/main/.doctrees/api/carl.envs.rna.carl_rna_definitions.doctree differ diff --git a/main/.doctrees/api/carl.envs.rna.doctree b/main/.doctrees/api/carl.envs.rna.doctree new file mode 100644 index 00000000..8ea1f242 Binary files /dev/null and b/main/.doctrees/api/carl.envs.rna.doctree differ diff --git a/main/.doctrees/api/carl.envs.rna.parse_dot_brackets.doctree b/main/.doctrees/api/carl.envs.rna.parse_dot_brackets.doctree new file mode 100644 index 00000000..d62ef19a Binary files /dev/null and b/main/.doctrees/api/carl.envs.rna.parse_dot_brackets.doctree differ diff --git a/main/.doctrees/environment.pickle b/main/.doctrees/environment.pickle new file mode 100644 index 00000000..a32c3d7a Binary files /dev/null and b/main/.doctrees/environment.pickle differ diff --git a/main/.doctrees/index.doctree b/main/.doctrees/index.doctree new file mode 100644 index 00000000..ac79bdbc Binary files /dev/null and b/main/.doctrees/index.doctree differ diff --git a/main/.doctrees/source/api/autoapi_link.doctree b/main/.doctrees/source/api/autoapi_link.doctree new file mode 100644 index 00000000..5f3cb63f Binary files /dev/null and b/main/.doctrees/source/api/autoapi_link.doctree differ diff --git a/main/.doctrees/source/api/index.doctree b/main/.doctrees/source/api/index.doctree new file mode 100644 index 00000000..91bbf798 Binary files /dev/null and b/main/.doctrees/source/api/index.doctree differ diff --git a/main/.doctrees/source/cite.doctree b/main/.doctrees/source/cite.doctree new file mode 100644 index 00000000..37d54cb1 Binary files /dev/null and b/main/.doctrees/source/cite.doctree differ diff --git a/main/.doctrees/source/environments/benchmark_properties.doctree b/main/.doctrees/source/environments/benchmark_properties.doctree new file mode 100644 index 00000000..b659978f Binary files /dev/null and b/main/.doctrees/source/environments/benchmark_properties.doctree differ diff --git a/main/.doctrees/source/environments/carl_env.doctree b/main/.doctrees/source/environments/carl_env.doctree new file mode 100644 index 00000000..1797aeaf Binary files /dev/null and b/main/.doctrees/source/environments/carl_env.doctree differ diff --git a/main/.doctrees/source/environments/carlify.doctree b/main/.doctrees/source/environments/carlify.doctree new file mode 100644 index 00000000..9c95f77e Binary files /dev/null and b/main/.doctrees/source/environments/carlify.doctree differ diff --git a/main/.doctrees/source/environments/environment_families/box2d.doctree b/main/.doctrees/source/environments/environment_families/box2d.doctree new file mode 100644 index 00000000..2d38433f Binary files /dev/null and b/main/.doctrees/source/environments/environment_families/box2d.doctree differ diff --git a/main/.doctrees/source/environments/environment_families/brax.doctree b/main/.doctrees/source/environments/environment_families/brax.doctree new file mode 100644 index 00000000..97b144e5 Binary files /dev/null and b/main/.doctrees/source/environments/environment_families/brax.doctree differ diff --git a/main/.doctrees/source/environments/environment_families/classic_control.doctree b/main/.doctrees/source/environments/environment_families/classic_control.doctree new file mode 100644 index 00000000..93ee95fa Binary files /dev/null and b/main/.doctrees/source/environments/environment_families/classic_control.doctree differ diff --git a/main/.doctrees/source/environments/environment_families/dmc.doctree b/main/.doctrees/source/environments/environment_families/dmc.doctree new file mode 100644 index 00000000..d0a3a1c0 Binary files /dev/null and b/main/.doctrees/source/environments/environment_families/dmc.doctree differ diff --git a/main/.doctrees/source/environments/environment_families/index.doctree b/main/.doctrees/source/environments/environment_families/index.doctree new file mode 100644 index 00000000..e07515ad Binary files /dev/null and b/main/.doctrees/source/environments/environment_families/index.doctree differ diff --git a/main/.doctrees/source/environments/environment_families/rna.doctree b/main/.doctrees/source/environments/environment_families/rna.doctree new file mode 100644 index 00000000..3bc0874a Binary files /dev/null and b/main/.doctrees/source/environments/environment_families/rna.doctree differ diff --git a/main/.doctrees/source/environments/environment_families/toad_gan.doctree b/main/.doctrees/source/environments/environment_families/toad_gan.doctree new file mode 100644 index 00000000..6f77d5f3 Binary files /dev/null and b/main/.doctrees/source/environments/environment_families/toad_gan.doctree differ diff --git a/main/.doctrees/source/environments/index.doctree b/main/.doctrees/source/environments/index.doctree new file mode 100644 index 00000000..c53c1e44 Binary files /dev/null and b/main/.doctrees/source/environments/index.doctree differ diff --git a/main/.doctrees/source/getting_started/index.doctree b/main/.doctrees/source/getting_started/index.doctree new file mode 100644 index 00000000..0c4c0d7f Binary files /dev/null and b/main/.doctrees/source/getting_started/index.doctree differ diff --git a/main/.doctrees/source/getting_started/installation.doctree b/main/.doctrees/source/getting_started/installation.doctree new file mode 100644 index 00000000..3722f9b6 Binary files /dev/null and b/main/.doctrees/source/getting_started/installation.doctree differ diff --git a/main/.doctrees/source/getting_started/quickstart.doctree b/main/.doctrees/source/getting_started/quickstart.doctree new file mode 100644 index 00000000..daa53df8 Binary files /dev/null and b/main/.doctrees/source/getting_started/quickstart.doctree differ diff --git a/main/.doctrees/source/license.doctree b/main/.doctrees/source/license.doctree new file mode 100644 index 00000000..1fde0ec2 Binary files /dev/null and b/main/.doctrees/source/license.doctree differ diff --git a/main/.doctrees/source/references.doctree b/main/.doctrees/source/references.doctree new file mode 100644 index 00000000..439b352f Binary files /dev/null and b/main/.doctrees/source/references.doctree differ diff --git a/main/_images/acrobot.jpeg b/main/_images/acrobot.jpeg new file mode 100644 index 00000000..21c8fe9e Binary files /dev/null and b/main/_images/acrobot.jpeg differ diff --git a/main/_images/ant.png b/main/_images/ant.png new file mode 100644 index 00000000..4883ada3 Binary files /dev/null and b/main/_images/ant.png differ diff --git a/main/_images/bipedalwalker.jpeg b/main/_images/bipedalwalker.jpeg new file mode 100644 index 00000000..263a904a Binary files /dev/null and b/main/_images/bipedalwalker.jpeg differ diff --git a/main/_images/cartpole.jpeg b/main/_images/cartpole.jpeg new file mode 100644 index 00000000..139a48eb Binary files /dev/null and b/main/_images/cartpole.jpeg differ diff --git a/main/_images/envs_overview.png b/main/_images/envs_overview.png new file mode 100644 index 00000000..d87c9d44 Binary files /dev/null and b/main/_images/envs_overview.png differ diff --git a/main/_images/fetch.png b/main/_images/fetch.png new file mode 100644 index 00000000..5e5889f5 Binary files /dev/null and b/main/_images/fetch.png differ diff --git a/main/_images/finger.jpg b/main/_images/finger.jpg new file mode 100644 index 00000000..b7aa5fc7 Binary files /dev/null and b/main/_images/finger.jpg differ diff --git a/main/_images/fish.jpg b/main/_images/fish.jpg new file mode 100644 index 00000000..7bd88d10 Binary files /dev/null and b/main/_images/fish.jpg differ diff --git a/main/_images/grasp.png b/main/_images/grasp.png new file mode 100644 index 00000000..d0648f9c Binary files /dev/null and b/main/_images/grasp.png differ diff --git a/main/_images/halfcheetah.png b/main/_images/halfcheetah.png new file mode 100644 index 00000000..3f99a44e Binary files /dev/null and b/main/_images/halfcheetah.png differ diff --git a/main/_images/humanoid.png b/main/_images/humanoid.png new file mode 100644 index 00000000..2f0b6cc6 Binary files /dev/null and b/main/_images/humanoid.png differ diff --git a/main/_images/learna.png b/main/_images/learna.png new file mode 100644 index 00000000..9030d232 Binary files /dev/null and b/main/_images/learna.png differ diff --git a/main/_images/lunarlander.jpeg b/main/_images/lunarlander.jpeg new file mode 100644 index 00000000..9fdf1312 Binary files /dev/null and b/main/_images/lunarlander.jpeg differ diff --git a/main/_images/mountaincar.jpeg b/main/_images/mountaincar.jpeg new file mode 100644 index 00000000..c1de4973 Binary files /dev/null and b/main/_images/mountaincar.jpeg differ diff --git a/main/_images/pendulum.jpeg b/main/_images/pendulum.jpeg new file mode 100644 index 00000000..8b6b97de Binary files /dev/null and b/main/_images/pendulum.jpeg differ diff --git a/main/_images/quadruped.jpg b/main/_images/quadruped.jpg new file mode 100644 index 00000000..229c0dc3 Binary files /dev/null and b/main/_images/quadruped.jpg differ diff --git a/main/_images/radar_env_space.png b/main/_images/radar_env_space.png new file mode 100644 index 00000000..85a16f53 Binary files /dev/null and b/main/_images/radar_env_space.png differ diff --git a/main/_images/supermario.png b/main/_images/supermario.png new file mode 100644 index 00000000..b05858dc Binary files /dev/null and b/main/_images/supermario.png differ diff --git a/main/_images/ur5e.png b/main/_images/ur5e.png new file mode 100644 index 00000000..86e1dc0d Binary files /dev/null and b/main/_images/ur5e.png differ diff --git a/main/_images/vehicleracing.png b/main/_images/vehicleracing.png new file mode 100644 index 00000000..7bcd3c3e Binary files /dev/null and b/main/_images/vehicleracing.png differ diff --git a/main/_images/walker.jpg b/main/_images/walker.jpg new file mode 100644 index 00000000..59ef6264 Binary files /dev/null and b/main/_images/walker.jpg differ diff --git a/main/_modules/carl/envs.html b/main/_modules/carl/envs.html new file mode 100644 index 00000000..a7665b66 --- /dev/null +++ b/main/_modules/carl/envs.html @@ -0,0 +1,355 @@ + + + + + + + carl.envs — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs

+# flake8: noqa: F401
+# Modular imports
+import importlib.util as iutil
+import warnings
+
+# Classic control is in gym and thus necessary for the base version to run
+from carl.envs.gymnasium import *
+
+
+
[docs]def check_spec(spec_name: str) -> bool: + """Check if the spec is installed + + Parameters + ---------- + spec_name : str + Name of package that is necessary for the environment suite. + + Returns + ------- + bool + Whether the spec was found. + """ + spec = iutil.find_spec(spec_name) + found = spec is not None + if not found: + with warnings.catch_warnings(): + warnings.simplefilter("once") + warnings.warn( + f"Module {spec_name} not found. If you want to use these environments, please follow the installation guide." + ) + return found
+ + +# Environment loading +found = check_spec("Box2D") +if found: + from carl.envs.gymnasium.box2d import * + +found = check_spec("brax") +if found: + from carl.envs.brax import * + +found = check_spec("py4j") +if found: + from carl.envs.mario import * + +found = check_spec("dm_control") +if found: + from carl.envs.dmc import * + +found = check_spec("distance") +if found: + from carl.envs.rna import * +
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/carl_env.html b/main/_modules/carl/envs/carl_env.html new file mode 100644 index 00000000..cd60e258 --- /dev/null +++ b/main/_modules/carl/envs/carl_env.html @@ -0,0 +1,644 @@ + + + + + + + carl.envs.carl_env — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.carl_env

+from __future__ import annotations
+
+import abc
+from typing import Any, SupportsFloat, TypeVar
+
+import inspect
+
+import gymnasium
+from gymnasium import Wrapper, spaces
+from gymnasium.core import Env
+
+from carl.context.context_space import ContextFeature, ContextSpace
+from carl.context.selection import AbstractSelector, RoundRobinSelector
+from carl.utils.types import Context, Contexts
+
+ObsType = TypeVar("ObsType")
+
+
+
[docs]class CARLEnv(Wrapper, abc.ABC): + def __init__( + self, + env: Env, + contexts: Contexts | None = None, + obs_context_features: list[str] | None = None, + obs_context_as_dict: bool = True, + context_selector: AbstractSelector | type[AbstractSelector] | None = None, + context_selector_kwargs: dict | None = None, + **kwargs, + ): + """Base CARL wrapper. + + Good to know: + + - The observation always is a dictionary of {"state": ..., "context": ...}. Use + an observation flattening wrapper if you need a different format. + - After each env reset, a new context is selected by the context selector. + - The context set is always filled with defaults if missing. + + Parameters + ---------- + env : Env + Environment adhering to gymnasium API. + contexts : Contexts, optional + The context set, by default None. + obs_context_features : list[str], optional + The context features which should be added to the state, by default None. If None, + add all available context features. + obs_context_as_dict : bool, optional + Whether to pass the context as a vector or a dict in the observations. + The default is True. + context_selector : AbstractSelector | type[AbstractSelector] | None + The context selector selecting a new context after each env reset, by default None. + If None, use a round robin selector. Can be an object or class. For the latter, + you can pass kwargs. + context_selector_kwargs : dict, optional + Keyword arguments for the context selector if it is passed as a class. + + + Attributes + ---------- + base_observation_space: gymnasium.spaces.Space + The observation space from the wrapped environment. + obs_context_as_dict: bool, optional + Whether to pass the context as a vector or a dict in the observations. + The default is True. + observation_space: gymnasium.spaces.Dict + The observation space of the CARL environment which is a dictionary of + "state" and "context". + contexts: Contexts + The context set. + context_selector: ContextSelector. + The context selector selecting a new context after each env reset. + + """ + super().__init__(env) + + self.base_observation_space: gymnasium.spaces.Space = env.observation_space + self.obs_context_as_dict = obs_context_as_dict + + if contexts is None: + contexts = { + 0: self.get_default_context() + } # was self.get_default_context(self) before + self.contexts = contexts + self.context: Context | None = None # Set by `_progress_instance` + if obs_context_features is None: + obs_context_features = list(list(self.contexts.values())[0].keys()) + self.obs_context_features = obs_context_features + + # Context Selector + self.context_selector: type[AbstractSelector] + if context_selector is None: + self.context_selector = RoundRobinSelector(contexts=contexts) # type: ignore [assignment] + elif isinstance(context_selector, AbstractSelector): + self.context_selector = context_selector # type: ignore [assignment] + elif inspect.isclass(context_selector) and issubclass( + context_selector, AbstractSelector + ): + if context_selector_kwargs is None: + context_selector_kwargs = {} + _context_selector_kwargs = {"contexts": contexts} + context_selector_kwargs.update(_context_selector_kwargs) + self.context_selector = context_selector(**context_selector_kwargs) # type: ignore [assignment] + else: + raise ValueError( + f"Context selector must be None or an AbstractSelector class or instance. " + f"Got type {type(context_selector)}." + ) + + self.observation_space: gymnasium.spaces.Dict = self.get_observation_space( + obs_context_feature_names=self.obs_context_features + ) + + @property + def contexts(self) -> Contexts: + return self._contexts + + @property + def context_id(self): + return self.context_selector.context_id + + @contexts.setter + def contexts(self, contexts: Contexts) -> None: + """Set `contexts` property + + For each context maybe fill with default context values. + This is only necessary whenever we update the contexts, + so here is the right place. + + Parameters + ---------- + contexts : Contexts + Contexts to set + """ + context_space = self.get_context_space() + contexts = {k: context_space.insert_defaults(v) for k, v in contexts.items()} + self._contexts = contexts + + @context_id.setter + def context_id(self, new_id) -> None: + """Set `context_id` property + + This will switch the context ID of the context selector. + Realistically you'll want to only use this if your selector does not automaticall progress the instances. + + Parameters + ---------- + new_id : + ID to set the context to + """ + assert ( + new_id in self.context_selector.context_ids + ), "Unknown ID, this context does not exist in the context set." + self.context_selector.context_id = new_id + self.context_selector.context = self.context_selector.contexts[new_id] + self.context = self.context_selector.context + self._update_context() + +
[docs] def get_observation_space( + self, obs_context_feature_names: list[str] | None = None + ) -> gymnasium.spaces.Dict: + """Get the observation space for the context. + + Parameters + ---------- + obs_context_feature_names : list[str] | None, optional + Name of the context features to be included in the observation, by default None. + If it is None, we add all context features. + + Returns + ------- + gymnasium.spaces.Dict + Gymnasium observation space which contains the observation space of the + underlying environment ("state") and for the context ("context"). + """ + context_space = self.get_context_space() + obs_space_context = context_space.to_gymnasium_space( + context_feature_names=obs_context_feature_names, + as_dict=self.obs_context_as_dict, + ) + + obs_space = spaces.Dict( + { + "obs": self.base_observation_space, + "context": obs_space_context, + } + ) + return obs_space
+ +
[docs] @staticmethod + @abc.abstractmethod + def get_context_features() -> dict[str, ContextFeature]: + """Get the context features + + Defined per environment. + + Returns + ------- + dict[str, ContextFeature] + Context feature definitions + """ + ...
+ +
[docs] @classmethod + def get_context_space(cls) -> ContextSpace: + """Get context space + + Returns + ------- + ContextSpace + Context space with utility methods holding + information about defaults, types, bounds, etc. + """ + return ContextSpace(cls.get_context_features())
+ +
[docs] @classmethod + def get_default_context(cls) -> Context: + """Get the default context + + Returns + ------- + Context + Default context. + """ + default_context = cls.get_context_space().get_default_context() + return default_context
+ + def _progress_instance(self) -> None: + """ + Progress instance. + + In this case instance is a specific context. + 1. Select instance with the instance_mode. If the instance_mode is random, randomly select + the next instance from the set of contexts. If instance_mode is rr or roundrobin, select + the next instance. + + Returns + ------- + None + + """ + context = self.context_selector.select() # type: ignore [call-arg] + self.context = context + +
[docs] def reset( + self, *, seed: int | None = None, options: dict[str, Any] | None = None + ) -> tuple[Any, dict[str, Any]]: + """Reset the environment. + + First, we progress the instance, i.e. select a new context with the context + selector. Then we update the context in the wrapped environment. + Finally, we reset the underlying environment and add context information + to the observation. + + Parameters + ---------- + seed : int | None, optional + Seed, by default None + options : dict[str, Any] | None, optional + Options, by default None + + Returns + ------- + tuple[Any, dict[str, Any]] + Observation, info. + """ + last_context_id = self.context_id + self._progress_instance() + if self.context_id != last_context_id: + self._update_context() + state, info = super().reset(seed=seed, options=options) + state = self._add_context_to_state(state) + info["context_id"] = self.context_id + return state, info
+ + def _add_context_to_state(self, state: Any) -> dict[str, Any]: + """Add context observation to the state + + The state is the observation from the underlying environment + and we add the context information to it. We return a dictionary + of the state and context, and the context is maybe represented + as a dictionary itself (controlled via `self.obs_context_as_dict`). + + Parameters + ---------- + state : Any + State from the environment + + Returns + ------- + dict[str, Any] + State context observation dict + """ + + if not self.obs_context_as_dict: + context = [self.context[k] for k in self.obs_context_features] + else: + context = { + k: v for k, v in self.context.items() if k in self.obs_context_features + } + state_context_dict = { + "obs": state, + "context": context, + } + return state_context_dict + + @abc.abstractmethod + def _update_context(self) -> None: + """ + Update the context feature values of the environment. + + `self._progress_instance` must be called at least once to se(lec)t a valid context. + + Returns + ------- + None + + """ + ... + +
[docs] def step( + self, action: Any + ) -> tuple[Any, SupportsFloat, bool, bool, dict[str, Any]]: + """Step the environment. + + The context is added to the observation returned by the + wrapped environment. + + Parameters + ---------- + action : Any + Action + + Returns + ------- + tuple[Any, SupportsFloat, bool, bool, dict[str, Any]] + Observation, rewar, terminated, truncated, info. + """ + state, reward, terminated, truncated, info = super().step(action) + state = self._add_context_to_state(state) + info["context_id"] = self.context_id + return state, reward, terminated, truncated, info
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/gymnasium/carl_gymnasium_env.html b/main/_modules/carl/envs/gymnasium/carl_gymnasium_env.html new file mode 100644 index 00000000..fe4fcd70 --- /dev/null +++ b/main/_modules/carl/envs/gymnasium/carl_gymnasium_env.html @@ -0,0 +1,378 @@ + + + + + + + carl.envs.gymnasium.carl_gymnasium_env — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.gymnasium.carl_gymnasium_env

+from __future__ import annotations
+
+import gymnasium
+import pygame
+from gymnasium.core import Env
+
+from carl.context.selection import AbstractSelector
+from carl.envs.carl_env import CARLEnv
+from carl.utils.types import Contexts
+
+try:
+    pygame.display.init()
+except:
+    import os
+
+    os.environ["SDL_VIDEODRIVER"] = "dummy"
+
+
+
[docs]class CARLGymnasiumEnv(CARLEnv): + env_name: str + render_mode: str = "rgb_array" + + def __init__( + self, + env: Env | None = None, + contexts: Contexts | None = None, + obs_context_features: list[str] + | None = None, # list the context features which should be added to the state + obs_context_as_dict: bool = True, + context_selector: AbstractSelector | type[AbstractSelector] | None = None, + context_selector_kwargs: dict = None, + **kwargs, + ) -> None: + """ + CARL Gymnasium Environment. + + Parameters + ---------- + + env : Env | None + Gymnasium environment, the default is None. + If None, instantiate the env with gymnasium's make function and + `self.env_name` which is defined in each child class. + contexts : Contexts | None, optional + Context set, by default None. If it is None, we build the + context set with the default context. + obs_context_features : list[str] | None, optional + Context features which should be included in the observation, by default None. + If they are None, add all context features. + context_selector: AbstractSelector | type[AbstractSelector] | None, optional + The context selector (class), after each reset selects a new context to use. + If None, use a round robin selector. + context_selector_kwargs : dict, optional + Optional keyword arguments for the context selector, by default None. + Only used when `context_selector` is not None. + + Attributes + ---------- + env_name: str + The registered gymnasium environment name. + """ + if env is None: + env = gymnasium.make(id=self.env_name, render_mode=self.render_mode) + super().__init__( + env=env, + contexts=contexts, + obs_context_features=obs_context_features, + obs_context_as_dict=obs_context_as_dict, + context_selector=context_selector, + context_selector_kwargs=context_selector_kwargs, + **kwargs, + ) + + def _update_context(self) -> None: + for k, v in self.context.items(): + setattr(self.env, k, v)
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/gymnasium/classic_control/carl_acrobot.html b/main/_modules/carl/envs/gymnasium/classic_control/carl_acrobot.html new file mode 100644 index 00000000..df2f236d --- /dev/null +++ b/main/_modules/carl/envs/gymnasium/classic_control/carl_acrobot.html @@ -0,0 +1,368 @@ + + + + + + + carl.envs.gymnasium.classic_control.carl_acrobot — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.gymnasium.classic_control.carl_acrobot

+from __future__ import annotations
+
+import numpy as np
+
+from carl.context.context_space import ContextFeature, UniformFloatContextFeature
+from carl.envs.gymnasium.carl_gymnasium_env import CARLGymnasiumEnv
+
+
+
[docs]class CARLAcrobot(CARLGymnasiumEnv): + env_name: str = "Acrobot-v1" + +
[docs] @staticmethod + def get_context_features() -> dict[str, ContextFeature]: + return { + "LINK_LENGTH_1": UniformFloatContextFeature( + "LINK_LENGTH_1", lower=0.1, upper=10, default_value=1 + ), + "LINK_LENGTH_2": UniformFloatContextFeature( + "LINK_LENGTH_2", lower=0.1, upper=10, default_value=1 + ), + "LINK_MASS_1": UniformFloatContextFeature( + "LINK_MASS_1", lower=0.1, upper=10, default_value=1 + ), + "LINK_MASS_2": UniformFloatContextFeature( + "LINK_MASS_2", lower=0.1, upper=10, default_value=1 + ), + "LINK_COM_POS_1": UniformFloatContextFeature( + "LINK_COM_POS_1", lower=0, upper=1, default_value=0.5 + ), + "LINK_COM_POS_2": UniformFloatContextFeature( + "LINK_COM_POS_2", lower=0, upper=1, default_value=0.5 + ), + "LINK_MOI": UniformFloatContextFeature( + "LINK_MOI", lower=0.1, upper=10, default_value=1 + ), + "MAX_VEL_1": UniformFloatContextFeature( + "MAX_VEL_1", + lower=0.4 * np.pi, + upper=40 * np.pi, + default_value=4 * np.pi, + ), + "MAX_VEL_2": UniformFloatContextFeature( + "MAX_VEL_2", + lower=0.9 * np.pi, + upper=90 * np.pi, + default_value=9 * np.pi, + ), + "torque_noise_max": UniformFloatContextFeature( + "torque_noise_max", lower=-1, upper=1, default_value=0 + ), + "INITIAL_ANGLE_LOWER": UniformFloatContextFeature( + "INITIAL_ANGLE_LOWER", lower=-np.inf, upper=np.inf, default_value=-0.1 + ), + "INITIAL_ANGLE_UPPER": UniformFloatContextFeature( + "INITIAL_ANGLE_UPPER", lower=-np.inf, upper=np.inf, default_value=0.1 + ), + "INITIAL_VELOCITY_LOWER": UniformFloatContextFeature( + "INITIAL_VELOCITY_LOWER", + lower=-np.inf, + upper=np.inf, + default_value=-0.1, + ), + "INITIAL_VELOCITY_UPPER": UniformFloatContextFeature( + "INITIAL_VELOCITY_UPPER", lower=-np.inf, upper=np.inf, default_value=0.1 + ), + }
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/gymnasium/classic_control/carl_cartpole.html b/main/_modules/carl/envs/gymnasium/classic_control/carl_cartpole.html new file mode 100644 index 00000000..9f47eb42 --- /dev/null +++ b/main/_modules/carl/envs/gymnasium/classic_control/carl_cartpole.html @@ -0,0 +1,341 @@ + + + + + + + carl.envs.gymnasium.classic_control.carl_cartpole — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.gymnasium.classic_control.carl_cartpole

+from __future__ import annotations
+
+import numpy as np
+
+from carl.context.context_space import ContextFeature, UniformFloatContextFeature
+from carl.envs.gymnasium.carl_gymnasium_env import CARLGymnasiumEnv
+
+
+
[docs]class CARLCartPole(CARLGymnasiumEnv): + env_name: str = "CartPole-v1" + +
[docs] @staticmethod + def get_context_features() -> dict[str, ContextFeature]: + return { + "gravity": UniformFloatContextFeature( + "gravity", lower=0.1, upper=np.inf, default_value=9.8 + ), + "masscart": UniformFloatContextFeature( + "masscart", lower=0.1, upper=10, default_value=1.0 + ), + "masspole": UniformFloatContextFeature( + "masspole", lower=0.01, upper=1, default_value=0.1 + ), + "length": UniformFloatContextFeature( + "length", lower=0.05, upper=5, default_value=0.5 + ), + "force_mag": UniformFloatContextFeature( + "force_mag", lower=1, upper=100, default_value=10.0 + ), + "tau": UniformFloatContextFeature( + "tau", lower=0.002, upper=0.2, default_value=0.02 + ), + "initial_state_lower": UniformFloatContextFeature( + "initial_state_lower", lower=-np.inf, upper=np.inf, default_value=-0.1 + ), + "initial_state_upper": UniformFloatContextFeature( + "initial_state_upper", lower=-np.inf, upper=np.inf, default_value=0.1 + ), + }
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/gymnasium/classic_control/carl_mountaincar.html b/main/_modules/carl/envs/gymnasium/classic_control/carl_mountaincar.html new file mode 100644 index 00000000..1ce2e688 --- /dev/null +++ b/main/_modules/carl/envs/gymnasium/classic_control/carl_mountaincar.html @@ -0,0 +1,350 @@ + + + + + + + carl.envs.gymnasium.classic_control.carl_mountaincar — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.gymnasium.classic_control.carl_mountaincar

+from __future__ import annotations
+
+import numpy as np
+
+from carl.context.context_space import ContextFeature, UniformFloatContextFeature
+from carl.envs.gymnasium.carl_gymnasium_env import CARLGymnasiumEnv
+
+
+
[docs]class CARLMountainCar(CARLGymnasiumEnv): + env_name: str = "MountainCar-v0" + +
[docs] @staticmethod + def get_context_features() -> dict[str, ContextFeature]: + return { + "min_position": UniformFloatContextFeature( + "min_position", lower=-np.inf, upper=np.inf, default_value=-1.2 + ), + "max_position": UniformFloatContextFeature( + "max_position", lower=-np.inf, upper=np.inf, default_value=0.6 + ), + "max_speed": UniformFloatContextFeature( + "max_speed", lower=0, upper=np.inf, default_value=0.07 + ), + "goal_position": UniformFloatContextFeature( + "goal_position", lower=-np.inf, upper=np.inf, default_value=0.45 + ), + "goal_velocity": UniformFloatContextFeature( + "goal_velocity", lower=-np.inf, upper=np.inf, default_value=0 + ), + "force": UniformFloatContextFeature( + "force", lower=-np.inf, upper=np.inf, default_value=0.001 + ), + "gravity": UniformFloatContextFeature( + "gravity", lower=0, upper=np.inf, default_value=0.0025 + ), + "min_position_start": UniformFloatContextFeature( + "min_position_start", lower=-np.inf, upper=np.inf, default_value=-0.6 + ), + "max_position_start": UniformFloatContextFeature( + "max_position_start", lower=-np.inf, upper=np.inf, default_value=-0.4 + ), + "min_velocity_start": UniformFloatContextFeature( + "min_velocity_start", lower=-np.inf, upper=np.inf, default_value=0 + ), + "max_velocity_start": UniformFloatContextFeature( + "max_velocity_start", lower=-np.inf, upper=np.inf, default_value=0 + ), + }
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/gymnasium/classic_control/carl_mountaincarcontinuous.html b/main/_modules/carl/envs/gymnasium/classic_control/carl_mountaincarcontinuous.html new file mode 100644 index 00000000..1a697860 --- /dev/null +++ b/main/_modules/carl/envs/gymnasium/classic_control/carl_mountaincarcontinuous.html @@ -0,0 +1,347 @@ + + + + + + + carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous

+from __future__ import annotations
+
+import numpy as np
+
+from carl.context.context_space import ContextFeature, UniformFloatContextFeature
+from carl.envs.gymnasium.carl_gymnasium_env import CARLGymnasiumEnv
+
+
+
[docs]class CARLMountainCarContinuous(CARLGymnasiumEnv): + env_name: str = "MountainCarContinuous-v0" + +
[docs] @staticmethod + def get_context_features() -> dict[str, ContextFeature]: + return { + "min_position": UniformFloatContextFeature( + "min_position", lower=-np.inf, upper=np.inf, default_value=-1.2 + ), + "max_position": UniformFloatContextFeature( + "max_position", lower=-np.inf, upper=np.inf, default_value=0.6 + ), + "max_speed": UniformFloatContextFeature( + "max_speed", lower=0, upper=np.inf, default_value=0.07 + ), + "goal_position": UniformFloatContextFeature( + "goal_position", lower=-np.inf, upper=np.inf, default_value=0.5 + ), + "goal_velocity": UniformFloatContextFeature( + "goal_velocity", lower=-np.inf, upper=np.inf, default_value=0 + ), + "power": UniformFloatContextFeature( + "power", lower=-np.inf, upper=np.inf, default_value=0.0015 + ), + "min_position_start": UniformFloatContextFeature( + "min_position_start", lower=-np.inf, upper=np.inf, default_value=-0.6 + ), + "max_position_start": UniformFloatContextFeature( + "max_position_start", lower=-np.inf, upper=np.inf, default_value=-0.4 + ), + "min_velocity_start": UniformFloatContextFeature( + "min_velocity_start", lower=-np.inf, upper=np.inf, default_value=0 + ), + "max_velocity_start": UniformFloatContextFeature( + "max_velocity_start", lower=-np.inf, upper=np.inf, default_value=0 + ), + }
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/gymnasium/classic_control/carl_pendulum.html b/main/_modules/carl/envs/gymnasium/classic_control/carl_pendulum.html new file mode 100644 index 00000000..981a4d99 --- /dev/null +++ b/main/_modules/carl/envs/gymnasium/classic_control/carl_pendulum.html @@ -0,0 +1,338 @@ + + + + + + + carl.envs.gymnasium.classic_control.carl_pendulum — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.gymnasium.classic_control.carl_pendulum

+from __future__ import annotations
+
+import numpy as np
+
+from carl.context.context_space import ContextFeature, UniformFloatContextFeature
+from carl.envs.gymnasium.carl_gymnasium_env import CARLGymnasiumEnv
+
+
+
[docs]class CARLPendulum(CARLGymnasiumEnv): + env_name: str = "Pendulum-v1" + +
[docs] @staticmethod + def get_context_features() -> dict[str, ContextFeature]: + return { + "gravity": UniformFloatContextFeature( + "gravity", lower=-np.inf, upper=np.inf, default_value=8.0 + ), + "dt": UniformFloatContextFeature( + "dt", lower=0, upper=np.inf, default_value=0.05 + ), + "g": UniformFloatContextFeature( + "g", lower=0, upper=np.inf, default_value=10 + ), + "m": UniformFloatContextFeature( + "m", lower=1e-6, upper=np.inf, default_value=1 + ), + "l": UniformFloatContextFeature( + "l", lower=1e-6, upper=np.inf, default_value=1 + ), + "initial_angle_max": UniformFloatContextFeature( + "initial_angle_max", lower=0, upper=np.inf, default_value=np.pi + ), + "initial_velocity_max": UniformFloatContextFeature( + "initial_velocity_max", lower=0, upper=np.inf, default_value=1 + ), + }
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/mario/level_image_gen.html b/main/_modules/carl/envs/mario/level_image_gen.html new file mode 100644 index 00000000..cbc221a3 --- /dev/null +++ b/main/_modules/carl/envs/mario/level_image_gen.html @@ -0,0 +1,720 @@ + + + + + + + carl.envs.mario.level_image_gen — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.mario.level_image_gen

+# Code from https://github.com/Mawiszus/TOAD-GAN
+from typing import Any, List, Tuple
+
+import os
+
+from PIL import Image, ImageEnhance, ImageOps
+
+
+
[docs]class LevelImageGen: + """Generates PIL Image files from Super Mario Bros. ascii levels. + Initialize once and then use LevelImageGen.render() to generate images.""" + + def __init__(self, sprite_path: str): + """sprite_path: path to the folder of sprite files, e.g. 'mario/sprites/'""" + + # Load Graphics (assumes sprite_path points to "img" folder of Mario-AI-Framework or provided sprites folder + mariosheet = Image.open(os.path.join(sprite_path, "smallmariosheet.png")) + enemysheet = Image.open(os.path.join(sprite_path, "enemysheet.png")) + itemsheet = Image.open(os.path.join(sprite_path, "itemsheet.png")) + mapsheet = Image.open(os.path.join(sprite_path, "mapsheet.png")) + + # Cut out the actual sprites: + sprite_dict = dict() + # Mario Sheet + sprite_dict["M"] = mariosheet.crop((4 * 16, 0, 5 * 16, 16)) + + # Enemy Sheet + enemy_names = ["r", "k", "g", "y", "wings", "*", "plant"] + for i, e in enumerate(enemy_names): + sprite_dict[e] = enemysheet.crop((0, i * 2 * 16, 16, (i + 1) * 2 * 16)) + + sprite_dict["E"] = enemysheet.crop( + (16, 2 * 2 * 16, 2 * 16, 3 * 2 * 16) + ) # Set generic enemy to second goomba sprite + sprite_dict["plant"] = enemysheet.crop( + (16, (len(enemy_names) - 1) * 2 * 16, 2 * 16, len(enemy_names) * 2 * 16) + ) + + # Item Sheet + sprite_dict["shroom"] = itemsheet.crop((0, 0, 16, 16)) + sprite_dict["flower"] = itemsheet.crop((16, 0, 2 * 16, 16)) + sprite_dict["flower2"] = itemsheet.crop((0, 16, 16, 2 * 16)) + sprite_dict["1up"] = itemsheet.crop((16, 16, 2 * 16, 2 * 16)) + + # Map Sheet + map_names = [ + "-", + "X", + "#", + "B", + "b", + "b2", + "S", + "L", + "?", + "dump", + "@", + "Q", + "dump", + "!", + "D", + "o", + "o2", + "o3", + "<", + ">", + "[", + "]", + "bg_sl_l", + "bg_top", + "bg_sl_r", + "bg_m_l", + "bg_m", + "bg_m_r", + "bush_l", + "bush_m", + "bush_r", + "cloud_l", + "cloud_m", + "cloud_r", + "cloud_b_l", + "cloud_b_m", + "cloud_b_r", + "waves", + "water", + "F_top", + "F_b", + "F", + "bg_sky", + "%", + "%_l", + "%_r", + "%_m", + "|", + "1", + "2", + "C", + "U", + "T", + "t", + "dump", + "dump", + ] + + sheet_length = (7, 8) + sprite_counter = 0 + for i in range(sheet_length[0]): + for j in range(sheet_length[1]): + sprite_dict[map_names[sprite_counter]] = mapsheet.crop( + (j * 16, i * 16, (j + 1) * 16, (i + 1) * 16) + ) + sprite_counter += 1 + + sprite_dict["@"] = sprite_dict["?"] + sprite_dict["!"] = sprite_dict["Q"] + + self.sprite_dict = sprite_dict + +
[docs] def prepare_sprite_and_box( + self, ascii_level: List[str], sprite_key: str, curr_x: int, curr_y: int + ) -> Tuple[Any, Tuple[int, int, int, int]]: + """Helper to make correct sprites and sprite sizes to draw into the image. + Some sprites are bigger than one tile and the renderer needs to adjust for them. + """ + + # Init default size + new_left = curr_x * 16 + new_top = curr_y * 16 + new_right = (curr_x + 1) * 16 + new_bottom = (curr_y + 1) * 16 + + # Handle sprites depending on their type: + if sprite_key == "F": # Flag Pole + actual_sprite = Image.new("RGBA", (2 * 16, curr_y * 16)) + actual_sprite.paste(self.sprite_dict["F_top"], (16, 0, 2 * 16, 16)) + for s in range(curr_y): + actual_sprite.paste( + self.sprite_dict["F_b"], (16, (s + 1) * 16, 2 * 16, (s + 2) * 16) + ) + actual_sprite.paste(self.sprite_dict["F"], (7, 1 * 16, 16 + 7, 2 * 16)) + new_left = new_left - 16 + new_top = new_top - (curr_y - 1) * 16 + + elif sprite_key in ["y", "E", "g", "k", "r"]: # enemy sprite + actual_sprite = self.sprite_dict[sprite_key] + new_top = new_top - 16 + + elif sprite_key in ["Y", "K", "R"]: # winged spiky/koopa sprite + actual_sprite = Image.new("RGBA", (2 * 16, 2 * 16)) + actual_sprite.paste( + self.sprite_dict[str.lower(sprite_key)], (16, 0, 2 * 16, 2 * 16) + ) + actual_sprite.paste(self.sprite_dict["wings"], (7, -7, 16 + 7, 2 * 16 - 7)) + new_left = new_left - 16 + new_top = new_top - 16 + + elif ( + sprite_key == "G" + ): # winged goomba sprite (untested because original has none?) + actual_sprite = Image.new("RGBA", (3 * 16, 2 * 16)) + actual_sprite.paste(self.sprite_dict["wings"], (1, -5, 16 + 1, 2 * 16 - 5)) + actual_sprite.paste( + ImageOps.mirror(self.sprite_dict["wings"]), + (2 * 16 - 1, -5, 3 * 16 - 1, 2 * 16 - 5), + ) + actual_sprite.paste( + self.sprite_dict[str.lower(sprite_key)], (16, 0, 2 * 16, 2 * 16) + ) + new_left = new_left - 16 + new_top = new_top - 16 + new_right = new_right + 16 + + elif sprite_key == "%": # jump through platform + if curr_x == 0: + if ( + len(ascii_level[curr_y]) > 1 + and ascii_level[curr_y][curr_x + 1] == sprite_key + ): # middle piece + actual_sprite = self.sprite_dict["%_m"] + else: # single_piece + actual_sprite = self.sprite_dict["%"] + elif ascii_level[curr_y][curr_x - 1] == sprite_key: + if curr_x >= (len(ascii_level[curr_y]) - 1): # right end piece + actual_sprite = self.sprite_dict["%_r"] + elif ascii_level[curr_y][curr_x + 1] == sprite_key: # middle piece + actual_sprite = self.sprite_dict["%_m"] + else: # right end piece + actual_sprite = self.sprite_dict["%_r"] + else: + if curr_x >= (len(ascii_level[curr_y]) - 1): # single piece + actual_sprite = self.sprite_dict["%"] + elif ascii_level[curr_y][curr_x + 1] == sprite_key: # left end piece + actual_sprite = self.sprite_dict["%_l"] + else: # single piece + actual_sprite = self.sprite_dict[sprite_key] + + elif sprite_key == "b": # bullet bill tower + if curr_y > 0: + if ascii_level[curr_y - 1][curr_x] == sprite_key: + actual_sprite = self.sprite_dict["b2"] + else: + actual_sprite = self.sprite_dict[sprite_key] + else: + actual_sprite = self.sprite_dict[sprite_key] + + elif sprite_key == "*": # alternative bullet bill tower + if curr_y > 0: + if ascii_level[curr_y - 1][curr_x] != sprite_key: # top + actual_sprite = self.sprite_dict["B"] + elif curr_y > 1: + if ascii_level[curr_y - 2][curr_x] != sprite_key: + actual_sprite = self.sprite_dict["b"] + else: + actual_sprite = self.sprite_dict["b2"] + else: + actual_sprite = self.sprite_dict["b2"] + + elif sprite_key in ["T", "t"]: # Pipes + # figure out what kind of pipe this is + if curr_y > 0 and ascii_level[curr_y - 1][curr_x] == sprite_key: + is_top = False + else: + is_top = True + + pipelength_t = 0 + while ( + curr_y - pipelength_t >= 0 + and ascii_level[curr_y - pipelength_t][curr_x] == sprite_key + ): + pipelength_t += 1 + + pipelength_b = 0 + while ( + curr_y + pipelength_b < len(ascii_level) + and ascii_level[curr_y + pipelength_b][curr_x] == sprite_key + ): + pipelength_b += 1 + + pipelength_l = 0 + while ( + curr_x - pipelength_l >= 0 + and ascii_level[curr_y][curr_x - pipelength_l] == sprite_key + ): + pipelength_l += 1 + + pipelength_r = 0 + while ( + curr_x + pipelength_r < len(ascii_level[curr_y]) + and ascii_level[curr_y][curr_x - pipelength_r] == sprite_key + ): + pipelength_r += 1 + + # Check for fall out criteria + try: + if pipelength_l % 2 == 0: # second half of a double pipe + is_left = False + is_right = True + elif pipelength_l % 2 == 1: + if ( + curr_x >= len(ascii_level[curr_y]) + or ascii_level[curr_y][curr_x + 1] != sprite_key + ): + is_left = False + is_right = False + else: + is_left = True + is_right = False + else: + is_left = False + is_right = False + + if is_left: + if ascii_level[curr_y - pipelength_t][curr_x + 1] == sprite_key: + is_left = False + is_right = False + if ascii_level[curr_y - pipelength_t + 1][curr_x + 1] != sprite_key: + is_left = False + is_right = False + if is_right: + if ascii_level[curr_y - pipelength_t][curr_x - 1] == sprite_key: + is_left = False + is_right = False + if ascii_level[curr_y - pipelength_t + 1][curr_x - 1] != sprite_key: + is_left = False + is_right = False + if curr_y + pipelength_b < len(ascii_level): + if is_left: + if ascii_level[curr_y + pipelength_b][curr_x + 1] == sprite_key: + is_left = False + is_right = False + if ( + ascii_level[curr_y + pipelength_b - 1][curr_x + 1] + != sprite_key + ): + is_left = False + is_right = False + if is_right: + if ascii_level[curr_y + pipelength_b][curr_x - 1] == sprite_key: + is_left = False + is_right = False + if ( + ascii_level[curr_y + pipelength_b - 1][curr_x - 1] + != sprite_key + ): + is_left = False + is_right = False + except IndexError: + # Default to single pipe + is_left = False + is_right = False + + if is_top: + if is_left: + actual_sprite = self.sprite_dict["<"] + elif is_right: + if sprite_key == "T": + actual_sprite = Image.new("RGBA", (2 * 16, 3 * 16)) + actual_sprite.paste( + self.sprite_dict["plant"], (8, 5, 16 + 8, 2 * 16 + 5) + ) + actual_sprite.paste( + self.sprite_dict["<"], (0, 2 * 16, 16, 3 * 16) + ) + actual_sprite.paste( + self.sprite_dict[">"], (16, 2 * 16, 2 * 16, 3 * 16) + ) + new_left = new_left - 16 + new_top = new_top - 2 * 16 + else: + actual_sprite = self.sprite_dict[">"] + else: + if sprite_key == "T": + actual_sprite = Image.new("RGBA", (16, 3 * 16)) + actual_sprite.paste( + self.sprite_dict["plant"], (0, 5, 16, 2 * 16 + 5) + ) + actual_sprite.paste( + self.sprite_dict["T"], (0, 2 * 16, 16, 3 * 16) + ) + new_top = new_top - 2 * 16 + else: + actual_sprite = self.sprite_dict["T"] + else: + if is_left: + actual_sprite = self.sprite_dict["["] + elif is_right: + actual_sprite = self.sprite_dict["]"] + else: + actual_sprite = self.sprite_dict["t"] + + elif sprite_key in [ + "?", + "@", + "Q", + "!", + "C", + "U", + "L", + ]: # Block/Brick hidden items + if sprite_key == "L": + i_key = "1up" + elif sprite_key in ["?", "@", "U"]: + i_key = "shroom" + else: + i_key = "o" + + mask = self.sprite_dict[i_key].getchannel(3) + mask = ImageEnhance.Brightness(mask).enhance(0.7) + actual_sprite = Image.composite( + self.sprite_dict[i_key], self.sprite_dict[sprite_key], mask=mask + ) + + elif sprite_key in ["1", "2"]: # Hidden block + if sprite_key == "1": + i_key = "1up" + else: + i_key = "o" + + mask1 = self.sprite_dict["D"].getchannel(3) + mask1 = ImageEnhance.Brightness(mask1).enhance(0.5) + tmp_sprite = Image.composite( + self.sprite_dict["D"], self.sprite_dict[sprite_key], mask=mask1 + ) + mask = self.sprite_dict[i_key].getchannel(3) + mask = ImageEnhance.Brightness(mask).enhance(0.7) + actual_sprite = Image.composite( + self.sprite_dict[i_key], tmp_sprite, mask=mask + ) + + else: + actual_sprite = self.sprite_dict[sprite_key] + + return actual_sprite, (new_left, new_top, new_right, new_bottom)
+ +
[docs] def render(self, ascii_level: List[str]) -> Image: + """Renders the ascii level as a PIL Image. Assumes the Background is sky""" + len_level = len(ascii_level[-1]) + height_level = len(ascii_level) + + # Fill base image with sky tiles + dst = Image.new("RGB", (len_level * 16, height_level * 16)) + for y in range(height_level): + for x in range(len_level): + dst.paste( + self.sprite_dict["bg_sky"], + (x * 16, y * 16, (x + 1) * 16, (y + 1) * 16), + ) + + # Fill with actual tiles + for y in range(height_level): + for x in range(len_level): + curr_sprite = ascii_level[y][x] + sprite, box = self.prepare_sprite_and_box( + ascii_level, curr_sprite, x, y + ) + dst.paste(sprite, box, mask=sprite) + + return dst
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/mario/mario_game.html b/main/_modules/carl/envs/mario/mario_game.html new file mode 100644 index 00000000..a6462440 --- /dev/null +++ b/main/_modules/carl/envs/mario/mario_game.html @@ -0,0 +1,345 @@ + + + + + + + carl.envs.mario.mario_game — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.mario.mario_game

+from abc import ABC, abstractmethod
+
+
+
[docs]class MarioGame(ABC): + @abstractmethod + def getPort(self) -> int: + pass + + @abstractmethod + def initGame(self) -> None: + pass + + @abstractmethod + def stepGame( + self, left: bool, right: bool, down: bool, speed: bool, jump: bool + ) -> None: + pass + + @abstractmethod + def resetGame( + self, level: str, timer: int, mario_state: int, inertia: float + ) -> None: + pass + + @abstractmethod + def computeObservationRGB(self) -> None: + pass + + @abstractmethod + def computeReward(self) -> float: + pass + + @abstractmethod + def computeDone(self) -> bool: + pass + + @abstractmethod + def getCompletionPercentage(self) -> float: + pass + + @abstractmethod + def getFrameSize(self) -> int: + pass
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/mario/reachabillity.html b/main/_modules/carl/envs/mario/reachabillity.html new file mode 100644 index 00000000..d80d52b7 --- /dev/null +++ b/main/_modules/carl/envs/mario/reachabillity.html @@ -0,0 +1,611 @@ + + + + + + + carl.envs.mario.reachabillity — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.mario.reachabillity

+from typing import List, Tuple
+
+import numpy as np
+
+horizontal = 10  # when sprinting Mario can jump over a 10 tiles gap horizontally
+vertical = 4  # Mario can jump over a 4 tile wall
+diagonal = (
+    6  # Mario can jump over 6 tiles to clear a 4 block height difference when sprinting
+)
+
+empty = "-"
+ignored = ["M", "F", "|", "E", "g", "k", "r", "y", "G", "K", "R", "Y", "*", "B", "o"]
+
+
+
[docs]def remove_ignored(level: List[str]) -> Tuple[List, Tuple[int, int], Tuple[int, int]]: + """ + Replaces all ignored tokens with the empty token in a level. In case of Mario and the flag the coordinates of the + blocks below are returned and they are also replaced. + :param level: a level in ASCII form + :return: the level in ASCII form with the ignored tokens replaced and the coordinates of the block below Mario and + the flag if existing + """ + new_level = [] + mario = (-1, -1) + flag = (-1, -1) + + for i, row in enumerate(level): + mario_y = row.find("M") + if mario_y >= 0: + mario = (i + 1, mario_y) + flag_y = row.find("F") + if flag_y >= 0: + flag = (i + 1, flag_y) + for token in ignored: + row = row.replace(token, empty) + new_level.append(row) + + return new_level, mario, flag
+ + +
[docs]def reachability_map( + level: List[str], + shape: Tuple[int, int], + has_mario: bool = False, + has_flag: bool = False, + check_outside: bool = False, +) -> Tuple[np.ndarray, bool]: + """ + This creates a numpy 2D array containing the reachability map for a given ASCII-Level. + Every solid block will have a 1 if Mario can stand on it and can reach the tile and a 0 else. + Currently ignoring sprint. + Levels are generated without Mario and the flag and as such the algorithm is not including these. + :param level: The level (slice) as a list containing the ASCII strings of each level row + :param shape: The level shape + :param has_mario: As levels are expected to be generated without Mario, this option has to be set to search for + Mario as a starting point + :param has_flag: As levels are expected to be generated without the flag, this option has to be set to determine + playability via reaching the flag + :param check_outside: If this option is set, playability will check if the player can reach the outside + :return: A numpy array where a 0 indicates an unreachable block and a 1 denotes a reachable block; + a boolean indicating if the level can be finished by the player + """ + + level, mario, flag = remove_ignored(level) + reachability_map = np.zeros(shape=shape) + index_queue = [] + + # find the starting point, either the block Mario is standing on or the first solid block Mario could stand on + found_first = False + if has_mario: + index_queue.append(mario) + else: + for i in range(shape[0] - 1, 0, -1): # start from the bottom of the level + for j in range(0, shape[1]): + tile = level[i][j] + if ( + tile != empty + and ( + reachability_map[i][j] == 1 + or not found_first + and i < shape[0] - 1 + ) + and i > 0 + and level[i - 1][j] == empty + ): + found, queue, _ = mark(level, reachability_map, i, j) + index_queue.extend(queue) + if not found_first: + found_first = found + break + if found_first: + break + + # calculate all reachable positions by applying a BFS type of algorithm + outside = False + while len(index_queue) > 0: + index = index_queue.pop() + _, queue, reached_outside = mark( + level, reachability_map, index[0], index[1], check_outside=check_outside + ) + if reached_outside: + outside = True + index_queue.extend(queue) + + # a level is playable if either the flag is reachable or if no flag is included, the rightmost side can be reached + # Bug: if the level ends with a gap, it might be playable but still wouldn't count as such + playable = False + + if has_flag: + if reachability_map[flag[0]][flag[1]]: + playable = True + else: + # look at all tiles in the last column + for i in range(1, shape[0]): + if reachability_map[shape[0] - i][shape[1] - 1]: + playable = True + break + + if not playable and check_outside: + # Assumption is that reaching the outside is identical to completing the level + if outside: + playable = True + + return reachability_map, playable
+ + +
[docs]def check_blocked( + level: List[str], i: int, j: int, dh: int, dv: int, right: bool +) -> int: + """ + Checks for a given position, level and direction if a blockade exists in the range specified by dh and dv. + :param level: The level in ASCII form + :param i: x coordinate of the starting position + :param j: y coordinate of the starting position + :param dh: amount of blocks in the horizontal direction from the starting point the algorithm tries to jump + :param dv: amount of blocks in the vertical direction from the starting point the algorithm tries to jump + :param right: direction of the jump + :return: the blockade y value if a blockade is found, default max value otherwise + """ + blocked = horizontal + 1 # default value + boundary = j + dh if right else j - dh + try: + if level[i - dv][boundary] != empty: + height = 1 + dv + while height < vertical + 1: + v = i - dv - height + if v < 0: + # over maximum level height, cannot pass + blocked = dh + break + if level[v][boundary] != empty or dh + height > 10: + height += 1 + else: + break + if height == vertical + 1: + blocked = dh + except IndexError: + # over maximum level height, cannot pass + blocked = dh + + return blocked
+ + +def check_down( + level: List[str], + map: np.ndarray, + i: int, + j: int, + dh: int, + check_outside: bool, + right: bool, +) -> Tuple[bool, bool, List[Tuple[int, int]]]: + drop = 1 + found_first = False + reach_outside = False + found = [] + boundary = j + dh if right else j - dh + if boundary > map.shape[1] - 1: + if check_outside: + reach_outside = True + else: + y = min(max(boundary, 0), map.shape[1] - 1) + while i + drop < map.shape[0]: + # right and down + x = i + drop + above = x - 1 + + if ( + level[x][y] != empty + and above >= 0 + and level[above][y] == empty + and map[x][y] != 1 + ): + map[x][y] = 1 + found.append((x, y)) + found_first = True + break + drop += 1 + + return found_first, reach_outside, found + + +
[docs]def mark( + level: List[str], + reachability_map: np.ndarray, + i: int, + j: int, + check_outside: bool = False, +) -> Tuple[bool, List[Tuple[int, int]], bool]: + """ + For a given position and a level this will mark all tiles reachable from the given position and collect all + these positions for further use. + :param level: The level (slice) as a list containing the ASCII strings of each level row + :param map: The current reachability map where the reachable tiles will be marked + :param i: x coordinate + :param j: y coordinate + :param check_outside: if the algorithm should indicate that the player can reach the right outside of the level + :return: A boolean indicating if any tile can be reached from this position, a list of all reachable positions and + if the outside can be reached + """ + found_first = False + reach_outside = False + found = [] + blocked_level = vertical + 1 + blocked_right = horizontal + 1 + blocked_left = horizontal + 1 + blocked_down_right = horizontal + 1 + blocked_down_left = horizontal + 1 + + # mark diagonally + for dh in range(0, horizontal + 1): + # check down as far as possible, Mario can fall down the whole level until he hits a solid block + if blocked_down_right == horizontal + 1: + blocked_down_right = check_blocked(level, i, j, dh, 0, right=True) + if blocked_down_right >= dh: + found_rechable, found_outside, positions = check_down( + level, reachability_map, i, j, dh, check_outside, right=True + ) + if found_rechable: + found_first = True + if found_outside: + reach_outside = True + found.extend(positions) + + if blocked_down_left == horizontal + 1: + blocked_down_left = check_blocked(level, i, j, dh, 0, right=False) + if blocked_down_left >= dh: + found_rechable, found_outside, positions = check_down( + level, reachability_map, i, j, dh, check_outside, right=False + ) + if found_rechable: + found_first = True + if found_outside: + reach_outside = True + found.extend(positions) + + for dv in range(0, vertical + 1): + if dh != 0 or dv != 0: + if dv >= blocked_level: + break + + # check if vertical path is blocked + if dh == 0: + if level[i - dv][j] != empty: + blocked_level = dv + continue + + # check if horizontal right path is blocked + if blocked_right == horizontal + 1: + blocked_right = check_blocked(level, i, j, dh, dv, right=True) + + if dh <= blocked_right and dh + dv <= 10: + # right and up + x = min(max(i - dv, 0), reachability_map.shape[0] - 1) + right = j + dh + if right > reachability_map.shape[1] - 1 and check_outside: + reach_outside = True + y = min(max(right, 0), reachability_map.shape[1] - 1) + above = x - 1 + if ( + level[x][y] != empty + and above >= 0 + and level[above][y] == empty + and reachability_map[x][y] != 1 + ): + reachability_map[x][y] = 1 + found.append((x, y)) + found_first = True + + # check if horizontal left path is blocked + if blocked_left == horizontal + 1: + blocked_left = check_blocked(level, i, j, dh, dv, right=False) + + if dh <= blocked_left and dh + dv <= 10: + # left and up + x = min(max(i - dv, 0), reachability_map.shape[0] - 1) + y = min(max(j - dh, 0), reachability_map.shape[1] - 1) + above = x - 1 + if ( + level[x][y] != empty + and above >= 0 + and level[above][y] == empty + and reachability_map[x][y] != 1 + ): + reachability_map[x][y] = 1 + found.append((x, y)) + found_first = True + + return found_first, found, reach_outside
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/carl/envs/rna/parse_dot_brackets.html b/main/_modules/carl/envs/rna/parse_dot_brackets.html new file mode 100644 index 00000000..1bd039e4 --- /dev/null +++ b/main/_modules/carl/envs/rna/parse_dot_brackets.html @@ -0,0 +1,343 @@ + + + + + + + carl.envs.rna.parse_dot_brackets — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Source code for carl.envs.rna.parse_dot_brackets

+# flake8: noqa: F401
+# isort: skip_file
+from pathlib import Path
+
+from typing import List, Optional, Union, Generator
+
+
+
[docs]def parse_dot_brackets( + dataset: str, + data_dir: str, + target_structure_ids: Optional[List[int]] = None, + target_structure_path: Optional[Union[str, Path]] = None, +) -> List[str]: + """Generate the targets for next epoch. + + Parameters + ---------- + dataset : str + The name of the benchmark to use targets from + data_dir : str + The directory of the target structures. + target_structure_ids : Optional[Union[List[int], int]], optional + Use specific targets by ids., by default None + target_structure_path : Optional[str], optional + pecify a path to the targets., by default None + + Returns + ------- + Generator[int] + An epoch generator for the specified target structures. + """ + if target_structure_path: + target_paths = [target_structure_path] + elif target_structure_ids: + target_paths = [ + Path(data_dir, dataset, f"{id_}.rna") for id_ in target_structure_ids + ] + else: + target_paths = list(Path(data_dir, dataset).glob("*.rna")) + + return [data_path.read_text().rstrip() for data_path in target_paths] # type: ignore[union-attr]
+
+ +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_modules/index.html b/main/_modules/index.html new file mode 100644 index 00000000..f6b9e342 --- /dev/null +++ b/main/_modules/index.html @@ -0,0 +1,314 @@ + + + + + + + Overview: module code — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

All modules for which code is available

+ + +
+ + + +
+
+ +
+ + +
+
+ + + + + \ No newline at end of file diff --git a/main/_sources/api.rst.txt b/main/_sources/api.rst.txt new file mode 100644 index 00000000..1fb8c426 --- /dev/null +++ b/main/_sources/api.rst.txt @@ -0,0 +1,6 @@ +.. autosummary:: + :template: module.rst + :toctree: api + :recursive: + + carl.envs diff --git a/main/_sources/api/carl.envs.carl_env.rst.txt b/main/_sources/api/carl.envs.carl_env.rst.txt new file mode 100644 index 00000000..98df1dd4 --- /dev/null +++ b/main/_sources/api/carl.envs.carl_env.rst.txt @@ -0,0 +1,37 @@ +carl.envs.carl\_env +=================== + +.. automodule:: carl.envs.carl_env + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + CARLEnv + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.gymnasium.carl_gymnasium_env.rst.txt b/main/_sources/api/carl.envs.gymnasium.carl_gymnasium_env.rst.txt new file mode 100644 index 00000000..bef6706f --- /dev/null +++ b/main/_sources/api/carl.envs.gymnasium.carl_gymnasium_env.rst.txt @@ -0,0 +1,37 @@ +carl.envs.gymnasium.carl\_gymnasium\_env +======================================== + +.. automodule:: carl.envs.gymnasium.carl_gymnasium_env + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + CARLGymnasiumEnv + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.gymnasium.classic_control.carl_acrobot.rst.txt b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_acrobot.rst.txt new file mode 100644 index 00000000..122e70d2 --- /dev/null +++ b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_acrobot.rst.txt @@ -0,0 +1,37 @@ +carl.envs.gymnasium.classic\_control.carl\_acrobot +================================================== + +.. automodule:: carl.envs.gymnasium.classic_control.carl_acrobot + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + CARLAcrobot + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.gymnasium.classic_control.carl_cartpole.rst.txt b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_cartpole.rst.txt new file mode 100644 index 00000000..0859afec --- /dev/null +++ b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_cartpole.rst.txt @@ -0,0 +1,37 @@ +carl.envs.gymnasium.classic\_control.carl\_cartpole +=================================================== + +.. automodule:: carl.envs.gymnasium.classic_control.carl_cartpole + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + CARLCartPole + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.gymnasium.classic_control.carl_mountaincar.rst.txt b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_mountaincar.rst.txt new file mode 100644 index 00000000..75e65485 --- /dev/null +++ b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_mountaincar.rst.txt @@ -0,0 +1,37 @@ +carl.envs.gymnasium.classic\_control.carl\_mountaincar +====================================================== + +.. automodule:: carl.envs.gymnasium.classic_control.carl_mountaincar + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + CARLMountainCar + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.rst.txt b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.rst.txt new file mode 100644 index 00000000..75f083e3 --- /dev/null +++ b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.rst.txt @@ -0,0 +1,37 @@ +carl.envs.gymnasium.classic\_control.carl\_mountaincarcontinuous +================================================================ + +.. automodule:: carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + CARLMountainCarContinuous + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.gymnasium.classic_control.carl_pendulum.rst.txt b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_pendulum.rst.txt new file mode 100644 index 00000000..6330b0e1 --- /dev/null +++ b/main/_sources/api/carl.envs.gymnasium.classic_control.carl_pendulum.rst.txt @@ -0,0 +1,37 @@ +carl.envs.gymnasium.classic\_control.carl\_pendulum +=================================================== + +.. automodule:: carl.envs.gymnasium.classic_control.carl_pendulum + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + CARLPendulum + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.gymnasium.classic_control.rst.txt b/main/_sources/api/carl.envs.gymnasium.classic_control.rst.txt new file mode 100644 index 00000000..00842b70 --- /dev/null +++ b/main/_sources/api/carl.envs.gymnasium.classic_control.rst.txt @@ -0,0 +1,44 @@ +carl.envs.gymnasium.classic\_control +==================================== + +.. automodule:: carl.envs.gymnasium.classic_control + + + + + + + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + + +Modules +^^^^^^^ + +.. autosummary:: + :template: module.rst + :toctree: + :recursive: + + carl.envs.gymnasium.classic_control.carl_acrobot + carl.envs.gymnasium.classic_control.carl_cartpole + carl.envs.gymnasium.classic_control.carl_mountaincar + carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous + carl.envs.gymnasium.classic_control.carl_pendulum + diff --git a/main/_sources/api/carl.envs.gymnasium.rst.txt b/main/_sources/api/carl.envs.gymnasium.rst.txt new file mode 100644 index 00000000..a839c9aa --- /dev/null +++ b/main/_sources/api/carl.envs.gymnasium.rst.txt @@ -0,0 +1,42 @@ +carl.envs.gymnasium +=================== + +.. automodule:: carl.envs.gymnasium + + + + + + + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + + +Modules +^^^^^^^ + +.. autosummary:: + :template: module.rst + :toctree: + :recursive: + + carl.envs.gymnasium.box2d + carl.envs.gymnasium.carl_gymnasium_env + carl.envs.gymnasium.classic_control + diff --git a/main/_sources/api/carl.envs.mario.level_image_gen.rst.txt b/main/_sources/api/carl.envs.mario.level_image_gen.rst.txt new file mode 100644 index 00000000..ff34d87b --- /dev/null +++ b/main/_sources/api/carl.envs.mario.level_image_gen.rst.txt @@ -0,0 +1,37 @@ +carl.envs.mario.level\_image\_gen +================================= + +.. automodule:: carl.envs.mario.level_image_gen + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + LevelImageGen + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.mario.mario_game.rst.txt b/main/_sources/api/carl.envs.mario.mario_game.rst.txt new file mode 100644 index 00000000..763ea335 --- /dev/null +++ b/main/_sources/api/carl.envs.mario.mario_game.rst.txt @@ -0,0 +1,37 @@ +carl.envs.mario.mario\_game +=========================== + +.. automodule:: carl.envs.mario.mario_game + + + + + + + + + + + + + Classes + ^^^^^^^ + + .. autosummary:: + + MarioGame + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.mario.models.rst.txt b/main/_sources/api/carl.envs.mario.models.rst.txt new file mode 100644 index 00000000..a818215f --- /dev/null +++ b/main/_sources/api/carl.envs.mario.models.rst.txt @@ -0,0 +1,42 @@ +carl.envs.mario.models +====================== + +.. automodule:: carl.envs.mario.models + + + + + + + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + + +Modules +^^^^^^^ + +.. autosummary:: + :template: module.rst + :toctree: + :recursive: + + carl.envs.mario.models.conv_block + carl.envs.mario.models.discriminator + carl.envs.mario.models.generator + diff --git a/main/_sources/api/carl.envs.mario.reachabillity.rst.txt b/main/_sources/api/carl.envs.mario.reachabillity.rst.txt new file mode 100644 index 00000000..700b0197 --- /dev/null +++ b/main/_sources/api/carl.envs.mario.reachabillity.rst.txt @@ -0,0 +1,41 @@ +carl.envs.mario.reachabillity +============================= + +.. automodule:: carl.envs.mario.reachabillity + + + + + + + + + Functions + ^^^^^^^^^ + + .. autosummary:: + + check_blocked + check_down + mark + reachability_map + remove_ignored + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.mario.rst.txt b/main/_sources/api/carl.envs.mario.rst.txt new file mode 100644 index 00000000..8488c086 --- /dev/null +++ b/main/_sources/api/carl.envs.mario.rst.txt @@ -0,0 +1,48 @@ +carl.envs.mario +=============== + +.. automodule:: carl.envs.mario + + + + + + + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + + +Modules +^^^^^^^ + +.. autosummary:: + :template: module.rst + :toctree: + :recursive: + + carl.envs.mario.carl_mario + carl.envs.mario.generate_sample + carl.envs.mario.level_image_gen + carl.envs.mario.mario_env + carl.envs.mario.mario_game + carl.envs.mario.models + carl.envs.mario.reachabillity + carl.envs.mario.toad_gan + carl.envs.mario.utils + diff --git a/main/_sources/api/carl.envs.rna.carl_rna_definitions.rst.txt b/main/_sources/api/carl.envs.rna.carl_rna_definitions.rst.txt new file mode 100644 index 00000000..270b05f5 --- /dev/null +++ b/main/_sources/api/carl.envs.rna.carl_rna_definitions.rst.txt @@ -0,0 +1,29 @@ +carl.envs.rna.carl\_rna\_definitions +==================================== + +.. automodule:: carl.envs.rna.carl_rna_definitions + + + + + + + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.rna.parse_dot_brackets.rst.txt b/main/_sources/api/carl.envs.rna.parse_dot_brackets.rst.txt new file mode 100644 index 00000000..d20d2ff5 --- /dev/null +++ b/main/_sources/api/carl.envs.rna.parse_dot_brackets.rst.txt @@ -0,0 +1,37 @@ +carl.envs.rna.parse\_dot\_brackets +================================== + +.. automodule:: carl.envs.rna.parse_dot_brackets + + + + + + + + + Functions + ^^^^^^^^^ + + .. autosummary:: + + parse_dot_brackets + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + diff --git a/main/_sources/api/carl.envs.rna.rst.txt b/main/_sources/api/carl.envs.rna.rst.txt new file mode 100644 index 00000000..55ff7a11 --- /dev/null +++ b/main/_sources/api/carl.envs.rna.rst.txt @@ -0,0 +1,43 @@ +carl.envs.rna +============= + +.. automodule:: carl.envs.rna + + + + + + + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + + +Modules +^^^^^^^ + +.. autosummary:: + :template: module.rst + :toctree: + :recursive: + + carl.envs.rna.carl_rna + carl.envs.rna.carl_rna_definitions + carl.envs.rna.parse_dot_brackets + carl.envs.rna.rna_environment + diff --git a/main/_sources/api/carl.envs.rst.txt b/main/_sources/api/carl.envs.rst.txt new file mode 100644 index 00000000..a5f45fea --- /dev/null +++ b/main/_sources/api/carl.envs.rst.txt @@ -0,0 +1,53 @@ +carl.envs +========= + +.. automodule:: carl.envs + + + + + + + + + Functions + ^^^^^^^^^ + + .. autosummary:: + + check_spec + + + + + + + + + + + + + Interfaces + ^^^^^^^^^^ + + + + + + +Modules +^^^^^^^ + +.. autosummary:: + :template: module.rst + :toctree: + :recursive: + + carl.envs.brax + carl.envs.carl_env + carl.envs.dmc + carl.envs.gymnasium + carl.envs.mario + carl.envs.rna + diff --git a/main/_sources/index.rst.txt b/main/_sources/index.rst.txt new file mode 100644 index 00000000..87b20b54 --- /dev/null +++ b/main/_sources/index.rst.txt @@ -0,0 +1,59 @@ +CARL- Contextually Adaptive Reinforcement Learning +================================================== + +.. toctree:: + :hidden: + :maxdepth: 2 + + source/getting_started/index + source/environments/index + source/api/index + source/cite + source/license + source/references + +Welcome to the documentation of CARL, a benchmark library for Contextually Adaptive +Reinforcement Learning. CARL extends well-known RL environments with context, making +them easily configurable to test robustness and generalization. + + +Feel free to check out our `paper `_ and our +`blog post `_ on CARL! + +What is Context? +---------------- + +.. image:: ../figures/concept.png + :width: 75% + :align: center + :alt: CARL contextually extends Brax' Fetch. + +Context can change the goals and dynamics of an environment. +The interaction interval in Pendulum, for example, can make that environment muhc easier or harder. +The same is true for the composition of a Mario level. +So context is a tool for creating variations in reinforcement learning environments. +In contrast to other approaches like procedural generation, however, context can easily be defined and controlled by the user. +That means you have full control over the difficulty and degree of variations in your environments. +This way, you can gain detailed insights into the generalization capabilities of your agents - where do they excel and where do they fail? +CARL can help you find the answer! + +If you're interested in learning more about context, check out our `paper `_ or context in RL or the corrsponding `blog post `_. + +What can you do with CARL? +-------------------------- + +With CARL, you can easily define train and test distributions across different features of your favorite environments. +Examples include: +- training on short CartPole poles and testing if the policy can transfer to longer ones +- training LunarLander on moon gravity and seeing if it can also land on mars +- training and testing on a uniform distribution of floor friction values on Halfcheetah +... and many more! + +Simply decide on a generalization task you want your agent to solve, choose the context feature(s) to vary and train your agent just like on any other gymnasium environment + +Contact +------- + +CARL is developed by ``_. +If you want to contribute or found an issue please visit our github page ``_. + diff --git a/main/_sources/source/api/autoapi_link.rst.txt b/main/_sources/source/api/autoapi_link.rst.txt new file mode 100644 index 00000000..ef1930e7 --- /dev/null +++ b/main/_sources/source/api/autoapi_link.rst.txt @@ -0,0 +1 @@ +.. include:: ../../autoapi/src/envs/carl_env/index \ No newline at end of file diff --git a/main/_sources/source/api/index.rst.txt b/main/_sources/source/api/index.rst.txt new file mode 100644 index 00000000..3b957615 --- /dev/null +++ b/main/_sources/source/api/index.rst.txt @@ -0,0 +1,15 @@ +API Reference +============= + +This page gives an overview of all CARL environments. + + + +.. toctree:: + autoapi_link + ../../autoapi/src/envs/carl_env/index + ../../autoapi/src/envs/classic_control/index + ../../autoapi/src/envs/box2d/index + ../../autoapi/src/envs/brax/index + ../../autoapi/src/envs/mario/index + ../../autoapi/src/envs/rna/index \ No newline at end of file diff --git a/main/_sources/source/cite.rst.txt b/main/_sources/source/cite.rst.txt new file mode 100644 index 00000000..eacdcfcf --- /dev/null +++ b/main/_sources/source/cite.rst.txt @@ -0,0 +1,25 @@ +.. |br| raw:: html + +
+ +Citing CARL +================= + +If you use CARL in your research, please cite us with the following Bibtex entry: + +.. code:: text + + @inproceedings { BenEim2021a, + author = {Carolin Benjamins and + Theresa Eimer and + Frederik Schubert and + Aditya Mohan and + Sebastian Döhler and + André Biedenkapp and + Bodo Rosenhahn and + Frank Hutter and + Marius Lindauer}, + title = {Contextualize Me - The Case for Context in Reinforcement Learning}, + journal = {Transactions on Machine Learning Research}, + year = {2023}, + } diff --git a/main/_sources/source/environments/benchmark_properties.rst.txt b/main/_sources/source/environments/benchmark_properties.rst.txt new file mode 100644 index 00000000..fcd681db --- /dev/null +++ b/main/_sources/source/environments/benchmark_properties.rst.txt @@ -0,0 +1,44 @@ +Benchmark Properties +==================== +Below we discuss the properties of the CARL benchmarks which are summarized in the following Figure_. + +.. _Figure: +.. image:: ../figures/radar_env_space.png + :width: 90% + :align: center + :alt: Radar Plots for Env. Spaces + +State Space +----------- +Most of our benchmarks have vector based state spaces that can either be extended to include the context information or +not. The notable exceptions here are CARLVehicleRacing and CARLToadGAN, which exclusively use pixel-based observations. +The size of the vector based spaces range from only two state variables in the CARLMountainCar environments to 299 +for the CARLHumanoid environment. + +Action Space +------------ +We provide both discrete and continuous environments, with six requiring discrete actions and the other ten continuous +ones. The number of actions can range from a single action to 19 different actions. + +Quality of Reward +----------------- +We cover different kinds of reward signals with our benchmarks, ranging from relatively sparse step penalty style +rewards where the agent only receives a reward of -1 each step to complex composite reward functions in e.g. the +Brax-based environments. The latter version is also quite informative, providing updates on factors like movement +economy and progress towards the goal whereas the former does not let the agents distinguish between transitions +without looking at the whole episode. % this sentence could be dropped if space is needed +Further examples for sparse rewards are the CARLCartPoleEnv and CARLVehicleRacingEnv. + +Context Spaces +-------------- +While the full details of all possible context configurations can be seen in Environment Families. Here we +only discuss the differences between context spaces and the configuration possibilities they provide. +Depending on the environment the context features have different influence on the dynamics and the reward. Of all 131 +registered context features, 98% influence the dynamics. This means that if a context feature is changed then the +transition from one state into the other is changed as well. Only 5% of the context features shape the reward. +Most context features (87%) are continuous, the rest is categorical or discrete. +With the explicit availability of context features CARL lends it self to study the robustness of agents by adding +noise on top of the specific context features. Further, the provided bounds and sampling distributions of the context +spaces that are provided as part of \CARL enable better comparability and reproducibility for future research efforts +in the realm of general RL agents. + diff --git a/main/_sources/source/environments/carl_env.rst.txt b/main/_sources/source/environments/carl_env.rst.txt new file mode 100644 index 00000000..23cec924 --- /dev/null +++ b/main/_sources/source/environments/carl_env.rst.txt @@ -0,0 +1,91 @@ +The CARL Environment +==================== + +CARL extends the standard `gymnasium interface `_ with context. +This context changes the environment's transition dynamics and reward +function, creating a greater challenge for the agent. +During training we therefore can encounter different contexts and train for generalization. +We exemplarily show how Brax' Fetch is extended and embedded by CARL. Different +instantiations can be achieved by setting the context features to different values. + + +Here we give a brief overview of the available options on how to create +and work with contexts. + +A context takes the form of a dictionary with a key-value pair for each +context feature. An example is the default context for the CARLAnt environment: + +.. code-block:: python + + Ant_defaults = { + "joint_stiffness": 5000, + "gravity": -9.8, + "friction": 0.6, + "angular_damping": -0.05, + "actuator_strength": 300, + "joint_angular_damping": 35, + "torso_mass": 10, + } + +The context set used for training is comprised of at least one context. +It is also a dictionary with keys that should identify the context in a +meaningful way, e.g. an id. An example of a simple instance set for +CARLCartPole would be: + +.. code-block:: python + + from src.envs import CARLCartPoleEnv_defaults as default + longer_pole = default.copy() + longer_pole["pole_length"] = default["pole_length"]*2 + contexts = {0: default, 1: longer_pole} + + +This context set can then be used to create the environment: + +.. code-block:: python + + from src.envs import CARLCartPoleEnv + env = CARLCartPoleEnv(contexts=contexts) + +Per default, the context will be changed each episode in a round robin +fashion. + +The user can choose if and how the context is provided to the agent. +If the context should be hidden completely, instantiate the environment +with the 'hide_context' option: + + +.. code-block:: python + + from src.envs import CARLCartPoleEnv + env = CARLCartPoleEnv(contexts=contexts, hide_context=True) + + +By default, the context is visible and concatenated onto the state information +with no separation between state and context features. They can be +*provided separately*, though, using dict observations: + +.. code-block:: python + + from src.envs import CARLCartPoleEnv + env = CARLCartPoleEnv(contexts=contexts, hide_context=False, dict_observation_space=True) + + +Furthermore, users can choose to provide the full context information (default) +or only a *subset*: + +.. code-block:: python + + from src.envs import CARLCartPoleEnv + env = CARLCartPoleEnv(contexts=contexts, state_context_features=["gravity", "pole_length"]) + + +Context features can also be normalized or augmented with noise to either +make learning easier or more difficult. +In addition, only the context features *changing across the contexts* provided can be appended to the state like so: + +.. code-block:: python + + from src.envs import CARLCartPoleEnv + env = CARLCartPoleEnv(contexts=contexts, state_context_features="changing_context_features") + diff --git a/main/_sources/source/environments/carlify.rst.txt b/main/_sources/source/environments/carlify.rst.txt new file mode 100644 index 00000000..75b8e422 --- /dev/null +++ b/main/_sources/source/environments/carlify.rst.txt @@ -0,0 +1,22 @@ +CARLify your Environment +======================== + +If you have an environment that you think would make an interesting addition +to CARL, feel free to add it. Here is a short guide on what to do: + +1. Create a CARL wrapper class for your environment. It should be a child +class of CARLEnv and implement the setup and context changes of your environment. + +2. Define the context. Provide a default context with all mutable features +as well as bounds for all features. + +3. If additional requirements need to be installed, add them as install +options in setup.cfg. Make sure those changes are reflected in the ReadME +as well, especially if there are any extra steps (e.g. data downloads) +to the installation process. + +4. Make a PR to the main branch of CARL. We'll review it and try to clarify +any open questions. + +If you want to know if your environment would be a good fit or which context +features could be interesting to vary, don't hesitate to contact us! \ No newline at end of file diff --git a/main/_sources/source/environments/environment_families/box2d.rst.txt b/main/_sources/source/environments/environment_families/box2d.rst.txt new file mode 100644 index 00000000..9000b36d --- /dev/null +++ b/main/_sources/source/environments/environment_families/box2d.rst.txt @@ -0,0 +1,58 @@ +CARL Box 2D Environments +======================== + +`OpenAI's gym Box2D `_ provides environments for continuous control tasks. +In CARL BipedalWalker, LunarLander and CarRacing are included, each with their own modification possibilities like +new vehicles to race. + +CARL BipedalWalker Environment +------------------------------ +.. image:: ../data/screenshots/bipedalwalker.jpeg + :width: 25% + :align: center + :alt: Screenshot of CARLBipedalWalkerEnv + +In BipedalWalker a bipedal robot is trained to walk. +The properties of the walker's body, surroundings and physics as well as the simulation dynamics +can be varied via the context features. + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLBipedalWalkerEnv.csv + :header-rows: 1 + + +CARL LunarLander Environment +------------------------------ +.. image:: ../data/screenshots/lunarlander.jpeg + :width: 25% + :align: left + :alt: Screenshot of CARLLunarLanderEnv + +.. image:: ../data/context_generalization_plots/plot_ecdf_CARLLunarLanderEnv.png + :width: 50% + :align: right + :alt: Influence of context settings on an agent trained on the default environment. + +Here, the lunar lander should be safely navigated to its landing pad. +The lander's body, physics and simulation dynamics can be manipulated via the context features. + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLLunarLanderEnv.csv + :header-rows: 1 + + +CARL VehicleRacing Environment +------------------------------ +.. image:: ../data/screenshots/vehicleracing.png + :width: 400px + :align: center + :alt: Screenshot of CARLVehicleRacingEnv + +In this environment a vehicle is raced around a track. The context here is the type of vehicle. +There are different types of vehicles, race car, street car, bus and vehicle, and most of them can have a front-, back- +or all-wheel drive as well as small or large trailers (29 variations in total). + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLVehicleRacingEnv.csv + :header-rows: 1 \ No newline at end of file diff --git a/main/_sources/source/environments/environment_families/brax.rst.txt b/main/_sources/source/environments/environment_families/brax.rst.txt new file mode 100644 index 00000000..449d853d --- /dev/null +++ b/main/_sources/source/environments/environment_families/brax.rst.txt @@ -0,0 +1,113 @@ +CARL Brax Environments +###################### +In CARL all `Brax locomotion environments `_ are included. +As context features there are external features like gravity or friction or internal features +like joint strength or torso mass. + + +CARL Ant Environment +*************************** +.. image:: ../data/screenshots/ant.png + :width: 25% + :align: center + :alt: Screenshot of CARLAnt + + +Here the agent needs to learn how to control a four-legged ant in order +to run (quickly) into a given direction. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLAnt.csv + :header-rows: 1 + + + +CARL Fetch Environment +********************** +.. image:: ../data/screenshots/fetch.png + :width: 25% + :height: 100px + :align: center + :alt: Screenshot of CARLFetch + + +Fetch trains a robotic dog to run to a target location. +The target radius and distance as well as physical properties can be varied via the context features. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLFetch.csv + :header-rows: 1 + + + +CARL Grasp Environment +********************** +.. image:: ../data/screenshots/grasp.png + :width: 25% + :align: center + :alt: Screenshot of CARLGrasp + + +In CARL Grasp the agent is trained to pick up an object with a robot hand. +Three bodies are observed by Grasp: 'Hand', 'Object', and 'Target'. +When Object reaches Target, the agent is rewarded. +Apart from Grasp's pyhiscal properties the target radius, height and distance are also varied. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLGrasp.csv + :header-rows: 1 + + + +CARL Halfcheetah Environment +***************************** +.. image:: ../data/screenshots/halfcheetah.png + :width: 25% + :align: center + :alt: Screenshot of CARLHalfcheetah + + +A Halfcheetah is trained to run in a given direction. +The context features can vary physical properties. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLHalfcheetah.csv + :header-rows: 1 + + + +CARL Humanoid Environment +************************** +.. image:: ../data/screenshots/humanoid.png + :width: 25% + :align: center + :alt: Screenshot of CARLHumanoid + + +Here, a Humanoid needs to learn how to walk forward. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLHumanoid.csv + :header-rows: 1 + + +CARL UR5e Environment +********************** +.. image:: ../data/screenshots/ur5e.png + :width: 25% + :align: center + :alt: Screenshot of CARLUr5e + + +The agent needs to learn how to move a ur5e robot arm and its end effector to a sequence of targets. +The robot arm has 6 joints. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLUr5e.csv + :header-rows: 1 diff --git a/main/_sources/source/environments/environment_families/classic_control.rst.txt b/main/_sources/source/environments/environment_families/classic_control.rst.txt new file mode 100644 index 00000000..2150b2a7 --- /dev/null +++ b/main/_sources/source/environments/environment_families/classic_control.rst.txt @@ -0,0 +1,99 @@ +CARL Classic Control Environments +================================= + +Classic Control is a problem suite included in `OpenAI's gym `_ consisting +of simply physics simulation tasks. Context features here are therefore +also physics-based, e.g. friction, mass or gravity. + +CARL Pendulum Environment +------------------------- +.. image:: ../data/screenshots/pendulum.jpeg + :width: 25% + :align: left + :alt: Pendulum Environment + +.. image:: ../data/context_generalization_plots/plot_ecdf_CARLPendulumEnv.png + :width: 50% + :align: right + :alt: Influence of context settings on an agent trained on the default environment. + +In Pendulum, the agent's task is to swing up an inverted pendulum and +balance it at the top from a random position. The action here is the +direction and amount of force the agent wants to apply to the pendulum. + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLPendulumEnv.csv + :header-rows: 1 + + +CARL CartPole Environment +------------------------- +.. image:: ../data/screenshots/cartpole.jpeg + :width: 25% + :align: left + :alt: CartPole Environment + +.. image:: ../data/context_generalization_plots/plot_ecdf_CARLCartPoleEnv.png + :width: 50% + :align: right + :alt: Influence of context settings on an agent trained on the default environment. + +CartPole, similarly to Pendulum, asks the agent to balance a pole upright, though +this time the agent doesn't directly apply force to the pole but moves a cart on which +the pole ist placed either to the left or the right. + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLCartPoleEnv.csv + :header-rows: 1 + + +CARL Acrobot Environment +------------------------- +.. image:: ../data/screenshots/acrobot.jpeg + :width: 25% + :align: left + :alt: Acrobot Environment + +.. image:: ../data/context_generalization_plots/plot_ecdf_CARLAcrobotEnv.png + :width: 50% + :align: right + :alt: Influence of context settings on an agent trained on the default environment. + +Acrobot is another swing-up task with the goal being swinging the end of the lower +of two links up to a given height. The agent accomplishes this by actuating +the joint connecting both links. + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLAcrobotEnv.csv + :header-rows: 1 + + +CARL MountainCar Environment +---------------------------- +.. image:: ../data/screenshots/mountaincar.jpeg + :width: 25% + :align: left + :alt: MountainCar Environment + +.. image:: ../data/context_generalization_plots/plot_ecdf_CARLMountainCarEnv.png + :width: 50% + :align: right + :alt: Influence of context settings on an agent trained on the default environment. + +The MountainCar environment asks the agent to move a car up a steep slope. In order +to succeed, the agent has to accelerate using the opposite slope. There are two +versions of the environment, a discrete one with only "left" and "right" as actions, +as well as a continuous one. + +Defaults and bounds for the discrete MountainCar: + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLMountainCarEnv.csv + :header-rows: 1 + + +And for the continuous case: + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLMountainCarContinuousEnv.csv + :header-rows: 1 diff --git a/main/_sources/source/environments/environment_families/dmc.rst.txt b/main/_sources/source/environments/environment_families/dmc.rst.txt new file mode 100644 index 00000000..d29265de --- /dev/null +++ b/main/_sources/source/environments/environment_families/dmc.rst.txt @@ -0,0 +1,81 @@ +CARL DMC Environments +###################### +CARL includes the Finger, Fish, Quadruped and Walker environments from the `DeepMind Control Suite `_. +The context features control the MuJoCo physics engine, e.g. the floor friction. + + +CARL DMC Finger Environment +*************************** +.. image:: ../data/screenshots/finger.jpg + :width: 25% + :align: center + :alt: Screenshot of CARLDmcFinger + + +The agent needs to learn to spin an object using the finger. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLDmcFinger.csv + :header-rows: 1 + + + +CARL DMC Fish Environment +********************** +.. image:: ../data/screenshots/fish.jpg + :width: 25% + :height: 100px + :align: center + :alt: Screenshot of CARLDmcFish + + +In Fish, the agent needs to swim as a simulated fish. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLDmcFish.csv + :header-rows: 1 + + + +CARL DMC Quadruped Environment +********************** +.. image:: ../data/screenshots/quadruped.jpg + :width: 25% + :align: center + :alt: Screenshot of CARLDmcQuadruped + +.. image:: ../data/context_generalization_plots/plot_ecdf_CARLDmcQuadrupedEnv.png + :width: 50% + :align: right + :alt: Influence of context settings on an agent trained on the default environment. + + +The agent's goal is to walk efficiently with the quadruped robot. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLDmcQuadruped.csv + :header-rows: 1 + + + +CARL DMC Walker Environment +***************************** +.. image:: ../data/screenshots/walker.jpg + :width: 25% + :align: left + :alt: Screenshot of CARLDmcWalker + +.. image:: ../data/context_generalization_plots/plot_ecdf_CARLDmcWalkerEnv.png + :width: 50% + :align: right + :alt: Influence of context settings on an agent trained on the default environment. + +The walker robot is supposed to move forward as fast as possible. + + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLDmcWalker.csv + :header-rows: 1 \ No newline at end of file diff --git a/main/_sources/source/environments/environment_families/index.rst.txt b/main/_sources/source/environments/environment_families/index.rst.txt new file mode 100644 index 00000000..4d390096 --- /dev/null +++ b/main/_sources/source/environments/environment_families/index.rst.txt @@ -0,0 +1,85 @@ +Environment Families +==================== +In CARL we provide several contextually extended environments where we can set and augment their contexts. +With this we can analyze how the context and its augmentation influences the agent's generalization capabilities, +learning and behavior. + +.. image:: ../../figures/envs_overview.png + :width: 90% + :align: center + :alt: Screenshot of each environment included in CARL. + +Although each environment has different tasks, goals and mechanics, the behavior of the dynamics and the rewards is +influenced by physical properties. + +CARL currently contains the following benchmarks which are contextually extended: + + +Classic Control +--------------- +`OpenAI gym classic control suite `_ extended with several physics +context features like gravity or friction + +.. toctree:: + :maxdepth: 2 + + classic_control + +Box2D +----- +`OpenAI gym Box2D `_ BipedalWalker, LunarLander and +CarRacing, each with their own modification possibilities like +new vehicles to race + +.. toctree:: + :maxdepth: 2 + + box2d + +Brax +---- +All `Brax locomotion environments `_ with exposed internal features +like joint strength or torso mass + +.. toctree:: + :maxdepth: 2 + + brax + +DeepMind Control Suite +---- +Selected environment from the `DeepMind Control Suite `_ with controllable physics. + +.. toctree:: + :maxdepth: 2 + + dmc + +Mario +----- +`Super Mario (TOAD-GAN) `_, a procedurally generated jump'n'run game with control +over level similarity + +.. toctree:: + :maxdepth: 2 + + toad_gan + +RNA Design +---------- +`RNADesign `_, an environment for RNA design given structure +constraints with structures from different datasets to choose from + +.. toctree:: + :maxdepth: 2 + + rna + + +Overview Table +-------------- +Below every environment is listed with its number of context features and the type of action and observation space. + +.. csv-table:: + :file: ../data/tab_overview_environments.csv + :header-rows: 1 diff --git a/main/_sources/source/environments/environment_families/rna.rst.txt b/main/_sources/source/environments/environment_families/rna.rst.txt new file mode 100644 index 00000000..9d55b1b2 --- /dev/null +++ b/main/_sources/source/environments/environment_families/rna.rst.txt @@ -0,0 +1,19 @@ +CARL RNA Design Environment +=========================== +.. warning:: + This environment currently is under maintenance and cannot be installed. Thank you for your patience. + + +.. image:: ../data/screenshots/learna.png + :width: 65% + :align: center + :alt: RNA Design Environment + +In the LeaRNA RNA Design Environment, the agent attempts to design a RNA sequence +that matches given structural constraints. This is a very challenging problem +due to the complex underlying dynamics of biological processes as well as the wealth +of variation contained in the real world data provided. + +.. csv-table:: + :file: ../data/context_definitions/CARLRnaDesignEnv.csv + :header-rows: 1 diff --git a/main/_sources/source/environments/environment_families/toad_gan.rst.txt b/main/_sources/source/environments/environment_families/toad_gan.rst.txt new file mode 100644 index 00000000..7078ba97 --- /dev/null +++ b/main/_sources/source/environments/environment_families/toad_gan.rst.txt @@ -0,0 +1,19 @@ +CARL Mario Environment +======================== + +.. image:: ../data/screenshots/supermario.png + :width: 35% + :align: center + :alt: ToadGAN Environment + +The ToadGAN environment provides context-guided procedural generation inspired by +Nintendo's super Mario Bros. The agent has to guide a character through levels including +jumps, coins and enemies generated according to context definition. +The level is solved as soon as the agent arrives at the end. Its actions include +moving forwards or backwards and jumping. + +The generation can be controlled by the following context features: + +.. csv-table:: Defaults and Bounds + :file: ../data/context_definitions/CARLMarioEnv.csv + :header-rows: 1 \ No newline at end of file diff --git a/main/_sources/source/environments/index.rst.txt b/main/_sources/source/environments/index.rst.txt new file mode 100644 index 00000000..38e81a60 --- /dev/null +++ b/main/_sources/source/environments/index.rst.txt @@ -0,0 +1,12 @@ +Environments +=============== +Here you'll find basic information on how to work with context as well as an +overview of all CARL environments and their context features. + +.. toctree:: + :maxdepth: 2 + + carl_env + environment_families/index + benchmark_properties + carlify \ No newline at end of file diff --git a/main/_sources/source/getting_started/index.rst.txt b/main/_sources/source/getting_started/index.rst.txt new file mode 100644 index 00000000..ea1fdf36 --- /dev/null +++ b/main/_sources/source/getting_started/index.rst.txt @@ -0,0 +1,8 @@ +Getting Started +=============== + +.. toctree:: + :maxdepth: 2 + + installation + quickstart \ No newline at end of file diff --git a/main/_sources/source/getting_started/installation.rst.txt b/main/_sources/source/getting_started/installation.rst.txt new file mode 100644 index 00000000..c405b264 --- /dev/null +++ b/main/_sources/source/getting_started/installation.rst.txt @@ -0,0 +1,48 @@ +Installing CARL +=============== + +Base Installation +----------------- +In order to install CARL, first clone the GitHub repository: +:: + git clone https://github.com/automl/CARL.git + cd CARL + +We recommend using a virtual environment for installation, e.g. conda: +:: + conda create -n carl python=3.9 + conda activate carl + +The base version of CARL only includes the classic control environments +and can be installed by running: +:: + pip install . + +Additional Environments +----------------------- +The other environments like Bos2D and Brax are optional dependencies, so you can choose which you want +to install. For the full set: +:: + pip install -e .[box2d, brax, rna, mario] + +To use ToadGAN, additionally run: +:: + javac src/envs/mario/Mario-AI-Framework/**/*.java + +If you plan on using the RNA environment, you need to download the RNA sequence data: +:: + cd src/envs/rna/learna + make requirements + make data + + +CARL on Windows & MAC +--------------------- +These installation instructions might not work fully on Windows systems and have not +been tested there. For MAC, you will need to install Box2D via conda: +:: + conda install -c conda-forge gym-box2d + +We generally test and develop CARL on Linux systems, but aim to keep it as compatible +with MAC as possible. The ToadGAN environment is Linux exclusive at this +point. \ No newline at end of file diff --git a/main/_sources/source/getting_started/quickstart.rst.txt b/main/_sources/source/getting_started/quickstart.rst.txt new file mode 100644 index 00000000..efedadb1 --- /dev/null +++ b/main/_sources/source/getting_started/quickstart.rst.txt @@ -0,0 +1,29 @@ +Quickstart +========== + +All CARL environments use `OpenAI's gym interface `_ +for agent-environment interactions. + +To get started using CARL with your own agents, first define +a context set. In this example, we will use the CARLCartPoleEnv with its +default context and a longer pole. + +.. code-block:: python + + from src.envs import CARLCartPoleEnv_defaults as default + longer_pole = default.copy() + longer_pole["pole_length"] = default["pole_length"]*2 + contexts = {0: default, 1: longer_pole} + + +Now that we defined a context set, we can use it to create our environment: + +.. code-block:: python + + from src.envs import CARLCartPoleEnv + env = CARLCartPoleEnv(contexts=contexts) + +Now you can interact with the environment just like any other gym environment +while the context will change each episode. For a demonstration on what +context can do, see the `example notebook `_ in our repository. More +options for environments creation can be found in the Environments section. \ No newline at end of file diff --git a/main/_sources/source/license.rst.txt b/main/_sources/source/license.rst.txt new file mode 100644 index 00000000..a651c6ac --- /dev/null +++ b/main/_sources/source/license.rst.txt @@ -0,0 +1,9 @@ +License +======= +CARL falls under the Apache License 2.0 (see file `LICENSE `_) as is +permitted by all work that we use. This includes CARLMario, which is not +based on the Nintendo Game, but on TOAD-GAN and TOAD-GUI running under +an MIT license. They in turn make use of the +`Mario AI framework `_. +This is not the original game but a replica, explicitly built for +research purposes and includes a `copyright notice `_. \ No newline at end of file diff --git a/main/_sources/source/references.rst.txt b/main/_sources/source/references.rst.txt new file mode 100644 index 00000000..f40cf3b2 --- /dev/null +++ b/main/_sources/source/references.rst.txt @@ -0,0 +1,23 @@ +References +=========== +CARL is built on top of other environments and benchmarks, extending them +to contextual reinforcement learning environments. + +Specifically, we used the works of: + +`OpenAI gym, Brockman et al., 2016. arXiv preprint arXiv:1606.01540 `_ + +`Brax -- A Differentiable Physics Engine for Large Scale +Rigid Body Simulation, Freeman et al., NeurIPS 2021 (Dataset & +Benchmarking Track) `_ + +`TOAD-GAN: Coherent Style Level Generation from a Single Example, +Awiszus et al., AIIDE 2020 `_ + +`Learning to Design RNA, Runge et al., ICRL 2019 `_ + +For insights into cRL, we recommend our CARL paper as well as: + +`Contextual Markov Decision Processes, Hallak et al., CoRR 2015 `_ + +`A survey of Generalisation in Deep Reinforcement Learning, Kirk et al., CoRR 2021 `_ \ No newline at end of file diff --git a/main/_static/basic.css b/main/_static/basic.css new file mode 100644 index 00000000..fd415afa --- /dev/null +++ b/main/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 280px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/main/_static/css/custom.css b/main/_static/css/custom.css new file mode 100644 index 00000000..efdce4c7 --- /dev/null +++ b/main/_static/css/custom.css @@ -0,0 +1,254 @@ +h1, +h2, +h3, +h4 { + overflow-wrap: break-word !important; +} + + +.bd-search { + margin: 0; + padding-left: 0; + padding-right: 0; +} + +.bd-search .icon { + left: 10px; +} + +#navbar-main { + padding: 1em 0px; +} + +#navbar-collapsible { + padding: 0; +} + +#navbar-icon-links { + margin-right: 1em !important; +} + +.navbar-nav { + flex-direction: row; +} + +.navbar-light .navbar-nav li a.nav-link { + padding: 0 5px 0 0; +} + +#navbar-start { + height: 42px; +} + +.navbar-brand { + height: 42px; + padding: 0px; +} + +#navbar-icon-links i.fa, +#navbar-icon-links i.fab, +#navbar-icon-links i.far, +#navbar-icon-links i.fas { + line-height: normal !important; +} + +@media (max-width:959.98px) { + + .navbar-expand-lg>.container, + .navbar-expand-lg>.container-fluid, + .navbar-expand-lg>.container-lg, + .navbar-expand-lg>.container-md, + .navbar-expand-lg>.container-sm, + .navbar-expand-lg>.container-xl { + padding-right: 15px; + padding-left: 15px; + } + + .navbar-expand-lg .navbar-end-item { + margin-top: 0.5em; + } + + .navbar-expand-lg #navbar-icon-links { + margin-top: 1em; + } +} + +.bd-sidebar { + margin-top: 0; +} + +nav#bd-docs-nav a.internal { + padding: 5px 15px !important; +} + +nav#bd-docs-nav ul ul { + padding-left: 15px; +} + + +p.sphx-glr-signature, +p.sphx-glr-timing, +.sphx-glr-download, +.sphx-glr-download-link-note { + display: none; +} + + +.sphx-glr-thumbcontainer::before { + display: none !important; +} + +.sphx-glr-thumbcontainer { + margin: 1px 0 !important; + background-color: gray; + min-height: auto !important; + padding: 0 !important; + width: 100% !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + border: 1px solid rgba(220, 220, 220, 1.0) !important; + text-align: center; +} + +.sphx-glr-thumbcontainer:hover { + box-shadow: none !important; + border: 1px solid rgba(190, 190, 190, 1.0) !important; +} + +.sphx-glr-thumbcontainer figcaption { + padding: 0 !important; +} + +.sphx-glr-thumbcontainer a.headerlink { + display: none; +} + +.sphx-glr-thumbcontainer p { + margin: 0 !important; +} + +.sphx-glr-thumbcontainer .figure, +.sphx-glr-thumbcontainer figure { + height: auto !important; + margin: 0 !important; + padding: 0 !important; + width: 100% !important; +} + +.sphx-glr-thumbcontainer .figure p.caption { + padding: 0 !important; +} + +.sphx-glr-thumbcontainer .figure p.caption:hover { + box-shadow: none !important; + -webkit-box-shadow: none !important; +} + +.sphx-glr-thumbcontainer img { + display: none !important; +} + +.sphx-glr-thumbcontainer .figure img { + display: none !important; +} + +.sphx-glr-thumbcontainer a.internal { + position: relative !important; + padding: .75rem !important; + border: 0 !important; + text-align: center; +} + +.sphx-glr-thumbcontainer a.internal:hover { + box-shadow: none !important; + -webkit-box-shadow: none !important; + text-decoration: none; +} + +/* For version 5.0 */ +.sphx-glr-thumbcontainer .sphx-glr-thumbnail-title { + padding: .75rem !important; +} + + +/* Disable tooltip */ +.sphx-glr-thumbcontainer::after { + display: none !important; +} + +.sphx-glr-thumbcontainer[tooltip]::before, +.sphx-glr-thumbcontainer[tooltip]::after, +.sphx-glr-thumbcontainer[tooltip]:hover::before, +.sphx-glr-thumbcontainer[tooltip]:hover::after { + display: none; +} + +dt:target, +span.highlighted { + background-color: #ffff0020; +} + +.section { + margin-bottom: 1.5rem; +} + + +/* TABLE */ + + +/* Make it scrollable */ +table.table { + display: block; + overflow-x: auto; + white-space: nowrap; +} + +/* API DOC */ + +p.rubric { + margin: 2rem 0 1rem; + padding-bottom: 1rem; + border-bottom: 1px solid rgba(128, 128, 128, 0.5); +} + +table.autosummary { + display: table !important; + white-space: normal !important; +} + +table.autosummary td, +table.autosummary th { + border: 0px; + border-bottom: 1px solid rgba(220, 220, 220, 1.0); +} + +dl.py { + margin-top: 2rem; +} + +dl.field-list>dt { + padding-left: 0; +} + +p.sphx-glr-script-out { + display: none; +} + +/* SEARCH */ + +#search-input { + border: 1px solid rgba(128, 128, 128, 0.5); + border-radius: .25rem; + + cursor: text; + text-align: left; +} + +#navbar-main .bd-search { + padding-top: 0; + padding-bottom: 0; +} + +#navbar-main .bd-search .icon { + top: 10px; +} \ No newline at end of file diff --git a/main/_static/css/index.ac9c05f7c49ca1e1f876c6e36360ea26.css b/main/_static/css/index.ac9c05f7c49ca1e1f876c6e36360ea26.css new file mode 100644 index 00000000..83d96e64 --- /dev/null +++ b/main/_static/css/index.ac9c05f7c49ca1e1f876c6e36360ea26.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:540px;--breakpoint-md:720px;--breakpoint-lg:960px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1rem;line-height:1.5;color:#212529;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;background-color:transparent}a:hover{color:#0056b3}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014\00A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:540px){.container,.container-sm{max-width:540px}}@media (min-width:720px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:960px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1400px}}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width:540px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width:720px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width:960px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.33333%;max-width:33.33333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;margin-bottom:1rem;color:#212529}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{color:#212529;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#7abaff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#b3b7bb}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#8fd19e}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#86cfda}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ffdf7e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed969e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#fbfcfc}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#95999c}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#343a40;border-color:#454d55}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#343a40}.table-dark td,.table-dark th,.table-dark thead th{border-color:#454d55}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:hsla(0,0%,100%,.075)}@media (max-width:539.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:719.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-md>.table-bordered{border:0}}@media (max-width:959.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{appearance:none}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(40,167,69,.9);border-radius:.25rem}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#28a745;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-valid,.was-validated .custom-select:valid{border-color:#28a745;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#28a745}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{border-color:#34ce57;background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc3545}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{border-color:#e4606d;background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width:540px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{display:flex;align-items:center;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529;text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(38,143,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(130,138,145,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success.focus,.btn-success:focus,.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(72,180,97,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info.focus,.btn-info:focus,.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(58,176,195,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(222,170,12,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,83,97,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.focus,.btn-light:focus,.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(216,217,219,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(82,88,93,.5)}.btn-outline-primary{color:#007bff;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;text-decoration:none}.btn-link:hover{color:#0056b3}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-left{right:auto;left:0}.dropdown-menu-right{right:0;left:auto}@media (min-width:540px){.dropdown-menu-sm-left{right:auto;left:0}.dropdown-menu-sm-right{right:0;left:auto}}@media (min-width:720px){.dropdown-menu-md-left{right:auto;left:0}.dropdown-menu-md-right{right:0;left:auto}}@media (min-width:960px){.dropdown-menu-lg-left{right:auto;left:0}.dropdown-menu-lg-right{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-left{right:auto;left:0}.dropdown-menu-xl-right{right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{position:relative;flex:1 1 auto;width:1%;min-width:0;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;border-color:#007bff;background-color:#007bff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#80bdff}.custom-control-input:not(:disabled):active~.custom-control-label:before{color:#fff;background-color:#b3d7ff;border-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label:before{pointer-events:none;background-color:#fff;border:1px solid #adb5bd}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{border-color:#007bff;background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label:after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(1.5em + .75rem + 2px)}.custom-file-input{z-index:2;margin:0;overflow:hidden;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{left:0;z-index:1;height:calc(1.5em + .75rem + 2px);overflow:hidden;font-weight:400;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.5;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);content:"Browse";background-color:#e9ecef;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:transparent;appearance:none}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{transition:none}}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background-color:#007bff;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{transition:none}}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#adb5bd}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#adb5bd}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:50%/100% 100% no-repeat}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:539.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media (min-width:540px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:719.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media (min-width:720px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:959.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media (min-width:960px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card{margin-bottom:15px}@media (min-width:540px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{flex:1 0 0%;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:540px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:540px){.card-columns{column-count:3;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}a.badge-primary:focus,a.badge-primary:hover{color:#fff;background-color:#0062cc}a.badge-primary.focus,a.badge-primary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.badge-secondary{color:#fff;background-color:#6c757d}a.badge-secondary:focus,a.badge-secondary:hover{color:#fff;background-color:#545b62}a.badge-secondary.focus,a.badge-secondary:focus{outline:0;box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.badge-success{color:#fff;background-color:#28a745}a.badge-success:focus,a.badge-success:hover{color:#fff;background-color:#1e7e34}a.badge-success.focus,a.badge-success:focus{outline:0;box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.badge-info{color:#fff;background-color:#17a2b8}a.badge-info:focus,a.badge-info:hover{color:#fff;background-color:#117a8b}a.badge-info.focus,a.badge-info:focus{outline:0;box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.badge-warning{color:#212529;background-color:#ffc107}a.badge-warning:focus,a.badge-warning:hover{color:#212529;background-color:#d39e00}a.badge-warning.focus,a.badge-warning:focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.badge-danger{color:#fff;background-color:#dc3545}a.badge-danger:focus,a.badge-danger:hover{color:#fff;background-color:#bd2130}a.badge-danger.focus,a.badge-danger:focus{outline:0;box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.badge-light{color:#212529;background-color:#f8f9fa}a.badge-light:focus,a.badge-light:hover{color:#212529;background-color:#dae0e5}a.badge-light.focus,a.badge-light:focus{outline:0;box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.badge-dark{color:#fff;background-color:#343a40}a.badge-dark:focus,a.badge-dark:hover{color:#fff;background-color:#1d2124}a.badge-dark.focus,a.badge-dark:focus{outline:0;box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:540px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;line-height:0;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{flex-direction:column;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:540px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:720px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:960px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{padding:0;background-color:transparent;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:.875rem;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#6c757d;background-color:hsla(0,0%,100%,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{display:block;height:calc(100vh - 1rem);height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;justify-content:center;height:100%}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:540px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:min-content}.modal-sm{max-width:300px}}@media (min-width:960px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,Liberation Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{top:1px;border-width:0 .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner:after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:50%/100% 100% no-repeat}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right:.25em solid transparent;border-radius:50%;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;animation:spinner-grow .75s linear infinite}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:540px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:720px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:960px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:540px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:720px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:960px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:540px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:720px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:960px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{user-select:all!important}.user-select-auto{user-select:auto!important}.user-select-none{user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:540px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:720px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:960px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:transparent}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:540px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:720px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:960px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0056b3!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#494f54!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#19692c!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#0f6674!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#ba8b00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#a71d2a!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#cbd3da!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#121416!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-wrap:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:960px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}html{font-size:var(--pst-font-size-base);scroll-padding-top:calc(var(--pst-header-height) + 12px)}body{padding-top:calc(var(--pst-header-height) + 20px);background-color:#fff;font-family:var(--pst-font-family-base);font-weight:400;line-height:1.65;color:rgba(var(--pst-color-text-base),1)}p{margin-bottom:1.15rem;font-size:1em;color:rgba(var(--pst-color-paragraph),1)}p.rubric{border-bottom:1px solid #c9c9c9}a{color:rgba(var(--pst-color-link),1);text-decoration:none}a:hover{color:rgba(var(--pst-color-link-hover),1);text-decoration:underline}a.headerlink{color:rgba(var(--pst-color-headerlink),1);font-size:.8em;padding:0 4px;text-decoration:none}a.headerlink:hover{background-color:rgba(var(--pst-color-headerlink),1);color:rgba(var(--pst-color-headerlink-hover),1)}.heading-style,h1,h2,h3,h4,h5,h6{margin:2.75rem 0 1.05rem;font-family:var(--pst-font-family-heading);font-weight:400;line-height:1.15}h1{margin-top:0;font-size:var(--pst-font-size-h1);color:rgba(var(--pst-color-h1),1)}h2{font-size:var(--pst-font-size-h2);color:rgba(var(--pst-color-h2),1)}h3{font-size:var(--pst-font-size-h3);color:rgba(var(--pst-color-h3),1)}h4{font-size:var(--pst-font-size-h4);color:rgba(var(--pst-color-h4),1)}h5{font-size:var(--pst-font-size-h5);color:rgba(var(--pst-color-h5),1)}h6{font-size:var(--pst-font-size-h6);color:rgba(var(--pst-color-h6),1)}.text_small,small{font-size:var(--pst-font-size-milli)}hr{border:0;border-top:1px solid #e5e5e5}code,kbd,pre,samp{font-family:var(--pst-font-family-monospace)}code{color:rgba(var(--pst-color-inline-code),1)}pre{margin:1.5em 0;padding:10px;background-color:rgba(var(--pst-color-preformatted-background),1);color:rgba(var(--pst-color-preformatted-text),1);line-height:1.2em;border:1px solid #c9c9c9;border-radius:.2rem;box-shadow:1px 1px 1px #d8d8d8}dd{margin-top:3px;margin-bottom:10px;margin-left:30px}.navbar{position:fixed;min-height:var(--pst-header-height);width:100%;padding:0}.navbar .container-xl{height:100%}@media (min-width:960px){.navbar #navbar-end>.navbar-end-item{display:inline-block}}.navbar-brand{position:relative;height:var(--pst-header-height);width:auto;padding:.5rem 0}.navbar-brand img{max-width:100%;height:100%;width:auto}.navbar-light{background:#fff!important;box-shadow:0 .125rem .25rem 0 rgba(0,0,0,.11)}.navbar-light .navbar-nav li a.nav-link{padding:0 .5rem;color:rgba(var(--pst-color-navbar-link),1)}.navbar-light .navbar-nav li a.nav-link:hover{color:rgba(var(--pst-color-navbar-link-hover),1)}.navbar-light .navbar-nav>.active>.nav-link{font-weight:600;color:rgba(var(--pst-color-navbar-link-active),1)}.navbar-header a{padding:0 15px}.admonition,div.admonition{margin:1.5625em auto;padding:0 .6rem .8rem;overflow:hidden;page-break-inside:avoid;border-left:.2rem solid;border-left-color:rgba(var(--pst-color-admonition-default),1);border-bottom-color:rgba(var(--pst-color-admonition-default),1);border-right-color:rgba(var(--pst-color-admonition-default),1);border-top-color:rgba(var(--pst-color-admonition-default),1);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);transition:color .25s,background-color .25s,border-color .25s}.admonition :last-child,div.admonition :last-child{margin-bottom:0}.admonition p.admonition-title~*,div.admonition p.admonition-title~*{padding:0 1.4rem}.admonition>ol,.admonition>ul,div.admonition>ol,div.admonition>ul{margin-left:1em}.admonition>.admonition-title,div.admonition>.admonition-title{position:relative;margin:0 -.6rem;padding:.4rem .6rem .4rem 2rem;font-weight:700;background-color:rgba(var(--pst-color-admonition-default),.1)}.admonition>.admonition-title:before,div.admonition>.admonition-title:before{position:absolute;left:.6rem;width:1rem;height:1rem;color:rgba(var(--pst-color-admonition-default),1);font-family:Font Awesome\ 5 Free;font-weight:900;content:var(--pst-icon-admonition-default)}.admonition>.admonition-title+*,div.admonition>.admonition-title+*{margin-top:.4em}.admonition.attention,div.admonition.attention{border-color:rgba(var(--pst-color-admonition-attention),1)}.admonition.attention>.admonition-title,div.admonition.attention>.admonition-title{background-color:rgba(var(--pst-color-admonition-attention),.1)}.admonition.attention>.admonition-title:before,div.admonition.attention>.admonition-title:before{color:rgba(var(--pst-color-admonition-attention),1);content:var(--pst-icon-admonition-attention)}.admonition.caution,div.admonition.caution{border-color:rgba(var(--pst-color-admonition-caution),1)}.admonition.caution>.admonition-title,div.admonition.caution>.admonition-title{background-color:rgba(var(--pst-color-admonition-caution),.1)}.admonition.caution>.admonition-title:before,div.admonition.caution>.admonition-title:before{color:rgba(var(--pst-color-admonition-caution),1);content:var(--pst-icon-admonition-caution)}.admonition.warning,div.admonition.warning{border-color:rgba(var(--pst-color-admonition-warning),1)}.admonition.warning>.admonition-title,div.admonition.warning>.admonition-title{background-color:rgba(var(--pst-color-admonition-warning),.1)}.admonition.warning>.admonition-title:before,div.admonition.warning>.admonition-title:before{color:rgba(var(--pst-color-admonition-warning),1);content:var(--pst-icon-admonition-warning)}.admonition.danger,div.admonition.danger{border-color:rgba(var(--pst-color-admonition-danger),1)}.admonition.danger>.admonition-title,div.admonition.danger>.admonition-title{background-color:rgba(var(--pst-color-admonition-danger),.1)}.admonition.danger>.admonition-title:before,div.admonition.danger>.admonition-title:before{color:rgba(var(--pst-color-admonition-danger),1);content:var(--pst-icon-admonition-danger)}.admonition.error,div.admonition.error{border-color:rgba(var(--pst-color-admonition-error),1)}.admonition.error>.admonition-title,div.admonition.error>.admonition-title{background-color:rgba(var(--pst-color-admonition-error),.1)}.admonition.error>.admonition-title:before,div.admonition.error>.admonition-title:before{color:rgba(var(--pst-color-admonition-error),1);content:var(--pst-icon-admonition-error)}.admonition.hint,div.admonition.hint{border-color:rgba(var(--pst-color-admonition-hint),1)}.admonition.hint>.admonition-title,div.admonition.hint>.admonition-title{background-color:rgba(var(--pst-color-admonition-hint),.1)}.admonition.hint>.admonition-title:before,div.admonition.hint>.admonition-title:before{color:rgba(var(--pst-color-admonition-hint),1);content:var(--pst-icon-admonition-hint)}.admonition.tip,div.admonition.tip{border-color:rgba(var(--pst-color-admonition-tip),1)}.admonition.tip>.admonition-title,div.admonition.tip>.admonition-title{background-color:rgba(var(--pst-color-admonition-tip),.1)}.admonition.tip>.admonition-title:before,div.admonition.tip>.admonition-title:before{color:rgba(var(--pst-color-admonition-tip),1);content:var(--pst-icon-admonition-tip)}.admonition.important,div.admonition.important{border-color:rgba(var(--pst-color-admonition-important),1)}.admonition.important>.admonition-title,div.admonition.important>.admonition-title{background-color:rgba(var(--pst-color-admonition-important),.1)}.admonition.important>.admonition-title:before,div.admonition.important>.admonition-title:before{color:rgba(var(--pst-color-admonition-important),1);content:var(--pst-icon-admonition-important)}.admonition.note,div.admonition.note{border-color:rgba(var(--pst-color-admonition-note),1)}.admonition.note>.admonition-title,div.admonition.note>.admonition-title{background-color:rgba(var(--pst-color-admonition-note),.1)}.admonition.note>.admonition-title:before,div.admonition.note>.admonition-title:before{color:rgba(var(--pst-color-admonition-note),1);content:var(--pst-icon-admonition-note)}table.field-list{border-collapse:separate;border-spacing:10px;margin-left:1px}table.field-list th.field-name{padding:1px 8px 1px 5px;white-space:nowrap;background-color:#eee}table.field-list td.field-body p{font-style:italic}table.field-list td.field-body p>strong{font-style:normal}table.field-list td.field-body blockquote{border-left:none;margin:0 0 .3em;padding-left:30px}.table.autosummary td:first-child{white-space:nowrap}.sig{font-family:var(--pst-font-family-monospace)}.sig-inline.c-texpr,.sig-inline.cpp-texpr{font-family:unset}.sig.c .k,.sig.c .kt,.sig.c .m,.sig.c .s,.sig.c .sc,.sig.cpp .k,.sig.cpp .kt,.sig.cpp .m,.sig.cpp .s,.sig.cpp .sc{color:rgba(var(--pst-color-text-base),1)}.sig-name{color:rgba(var(--pst-color-inline-code),1)}blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}dt.label>span.brackets:not(:only-child):before{content:"["}dt.label>span.brackets:not(:only-child):after{content:"]"}a.footnote-reference{vertical-align:super;font-size:small}div.deprecated{margin-bottom:10px;margin-top:10px;padding:7px;background-color:#f3e5e5;border:1px solid #eed3d7;border-radius:.5rem}div.deprecated p{color:#b94a48;display:inline}.topic{background-color:#eee}.seealso dd{margin-top:0;margin-bottom:0}.viewcode-back{font-family:var(--pst-font-family-base)}.viewcode-block:target{background-color:#f4debf;border-top:1px solid #ac9;border-bottom:1px solid #ac9}span.guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}footer{width:100%;border-top:1px solid #ccc;padding:10px}footer .footer-item p{margin-bottom:0}.bd-search{position:relative;padding:1rem 15px;margin-right:-15px;margin-left:-15px}.bd-search .icon{position:absolute;color:#a4a6a7;left:25px;top:25px}.bd-search input{border-radius:0;border:0;border-bottom:1px solid #e5e5e5;padding-left:35px}.bd-toc{-ms-flex-order:2;order:2;height:calc(100vh - 2rem);overflow-y:auto}@supports (position:-webkit-sticky) or (position:sticky){.bd-toc{position:-webkit-sticky;position:sticky;top:calc(var(--pst-header-height) + 20px);height:calc(100vh - 5rem);overflow-y:auto}}.bd-toc .onthispage{color:#a4a6a7}.section-nav{padding-left:0;border-left:1px solid #eee;border-bottom:none}.section-nav ul{padding-left:1rem}.toc-entry,.toc-entry a{display:block}.toc-entry a{padding:.125rem 1.5rem;color:rgba(var(--pst-color-toc-link),1)}@media (min-width:1200px){.toc-entry a{padding-right:0}}.toc-entry a:hover{color:rgba(var(--pst-color-toc-link-hover),1);text-decoration:none}.bd-sidebar{padding-top:1em}@media (min-width:720px){.bd-sidebar{border-right:1px solid rgba(0,0,0,.1)}@supports (position:-webkit-sticky) or (position:sticky){.bd-sidebar{position:-webkit-sticky;position:sticky;top:calc(var(--pst-header-height) + 20px);z-index:1000;height:calc(100vh - var(--pst-header-height) - 20px)}}}.bd-sidebar.no-sidebar{border-right:0}.bd-links{padding-top:1rem;padding-bottom:1rem;margin-right:-15px;margin-left:-15px}@media (min-width:720px){.bd-links{display:block}@supports (position:-webkit-sticky) or (position:sticky){.bd-links{max-height:calc(100vh - 11rem);overflow-y:auto}}}.bd-sidenav{display:none}.bd-content{padding-top:20px}.bd-content .section{max-width:100%}.bd-content .section table{display:block;overflow:auto}.bd-toc-link{display:block;padding:.25rem 1.5rem;font-weight:600;color:rgba(0,0,0,.65)}.bd-toc-link:hover{color:rgba(0,0,0,.85);text-decoration:none}.bd-toc-item.active{margin-bottom:1rem}.bd-toc-item.active:not(:first-child){margin-top:1rem}.bd-toc-item.active>.bd-toc-link{color:rgba(0,0,0,.85)}.bd-toc-item.active>.bd-toc-link:hover{background-color:transparent}.bd-toc-item.active>.bd-sidenav{display:block}nav.bd-links p.caption{font-size:var(--pst-sidebar-caption-font-size);text-transform:uppercase;font-weight:700;position:relative;margin-top:1.25em;margin-bottom:.5em;padding:0 1.5rem;color:rgba(var(--pst-color-sidebar-caption),1)}nav.bd-links p.caption:first-child{margin-top:0}.bd-sidebar .nav{font-size:var(--pst-sidebar-font-size)}.bd-sidebar .nav ul{list-style:none;padding:0 0 0 1.5rem}.bd-sidebar .nav li>a{display:block;padding:.25rem 1.5rem;color:rgba(var(--pst-color-sidebar-link),1)}.bd-sidebar .nav li>a:hover{color:rgba(var(--pst-color-sidebar-link-hover),1);text-decoration:none;background-color:transparent}.bd-sidebar .nav li>a.reference.external:after{font-family:Font Awesome\ 5 Free;font-weight:900;content:"\f35d";font-size:.75em;margin-left:.3em}.bd-sidebar .nav .active:hover>a,.bd-sidebar .nav .active>a{font-weight:600;color:rgba(var(--pst-color-sidebar-link-active),1)}.toc-h2{font-size:.85rem}.toc-h3{font-size:.75rem}.toc-h4{font-size:.65rem}.toc-entry>.nav-link.active{font-weight:600;color:#130654;color:rgba(var(--pst-color-toc-link-active),1);background-color:transparent;border-left:2px solid rgba(var(--pst-color-toc-link-active),1)}.nav-link:hover{border-style:none}#navbar-main-elements li.nav-item i{font-size:.7rem;padding-left:2px;vertical-align:middle}.bd-toc .nav .nav{display:none}.bd-toc .nav .nav.visible,.bd-toc .nav>.active>ul{display:block}.prev-next-area{margin:20px 0}.prev-next-area p{margin:0 .3em;line-height:1.3em}.prev-next-area i{font-size:1.2em}.prev-next-area a{display:flex;align-items:center;border:none;padding:10px;max-width:45%;overflow-x:hidden;color:rgba(0,0,0,.65);text-decoration:none}.prev-next-area a p.prev-next-title{color:rgba(var(--pst-color-link),1);font-weight:600;font-size:1.1em}.prev-next-area a:hover p.prev-next-title{text-decoration:underline}.prev-next-area a .prev-next-info{flex-direction:column;margin:0 .5em}.prev-next-area a .prev-next-info .prev-next-subtitle{text-transform:capitalize}.prev-next-area a.left-prev{float:left}.prev-next-area a.right-next{float:right}.prev-next-area a.right-next div.prev-next-info{text-align:right}.alert{padding-bottom:0}.alert-info a{color:#e83e8c}#navbar-icon-links i.fa,#navbar-icon-links i.fab,#navbar-icon-links i.far,#navbar-icon-links i.fas{vertical-align:middle;font-style:normal;font-size:1.5rem;line-height:1.25}#navbar-icon-links i.fa-github-square:before{color:#333}#navbar-icon-links i.fa-twitter-square:before{color:#55acee}#navbar-icon-links i.fa-gitlab:before{color:#548}#navbar-icon-links i.fa-bitbucket:before{color:#0052cc}.tocsection{border-left:1px solid #eee;padding:.3rem 1.5rem}.tocsection i{padding-right:.5rem}.editthispage{padding-top:2rem}.editthispage a{color:var(--pst-color-sidebar-link-active)}.xr-wrap[hidden]{display:block!important}.toctree-checkbox{position:absolute;display:none}.toctree-checkbox~ul{display:none}.toctree-checkbox~label i{transform:rotate(0deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label i{transform:rotate(180deg)}.bd-sidebar li{position:relative}.bd-sidebar label{position:absolute;top:0;right:0;height:30px;width:30px;cursor:pointer;display:flex;justify-content:center;align-items:center}.bd-sidebar label:hover{background:rgba(var(--pst-color-sidebar-expander-background-hover),1)}.bd-sidebar label i{display:inline-block;font-size:.75rem;text-align:center}.bd-sidebar label i:hover{color:rgba(var(--pst-color-sidebar-link-hover),1)}.bd-sidebar li.has-children>.reference{padding-right:30px}div.doctest>div.highlight span.gp,span.linenos,table.highlighttable td.linenos{user-select:none;-webkit-user-select:text;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.docutils.container{padding-left:unset;padding-right:unset} \ No newline at end of file diff --git a/main/_static/css/theme.css b/main/_static/css/theme.css new file mode 100644 index 00000000..c57fa69b --- /dev/null +++ b/main/_static/css/theme.css @@ -0,0 +1,119 @@ +/* Provided by the Sphinx base theme template at build time */ +@import "../basic.css"; + +:root { + /***************************************************************************** + * Theme config + **/ + --pst-header-height: 60px; + + /***************************************************************************** + * Font size + **/ + --pst-font-size-base: 15px; /* base font size - applied at body / html level */ + + /* heading font sizes */ + --pst-font-size-h1: 36px; + --pst-font-size-h2: 32px; + --pst-font-size-h3: 26px; + --pst-font-size-h4: 21px; + --pst-font-size-h5: 18px; + --pst-font-size-h6: 16px; + + /* smaller then heading font sizes*/ + --pst-font-size-milli: 12px; + + --pst-sidebar-font-size: .9em; + --pst-sidebar-caption-font-size: .9em; + + /***************************************************************************** + * Font family + **/ + /* These are adapted from https://systemfontstack.com/ */ + --pst-font-family-base-system: -apple-system, BlinkMacSystemFont, Segoe UI, "Helvetica Neue", + Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; + --pst-font-family-monospace-system: "SFMono-Regular", Menlo, Consolas, Monaco, + Liberation Mono, Lucida Console, monospace; + + --pst-font-family-base: var(--pst-font-family-base-system); + --pst-font-family-heading: var(--pst-font-family-base); + --pst-font-family-monospace: var(--pst-font-family-monospace-system); + + /***************************************************************************** + * Color + * + * Colors are defined in rgb string way, "red, green, blue" + **/ + --pst-color-primary: 19, 6, 84; + --pst-color-success: 40, 167, 69; + --pst-color-info: 0, 123, 255; /*23, 162, 184;*/ + --pst-color-warning: 255, 193, 7; + --pst-color-danger: 220, 53, 69; + --pst-color-text-base: 51, 51, 51; + + --pst-color-h1: var(--pst-color-primary); + --pst-color-h2: var(--pst-color-primary); + --pst-color-h3: var(--pst-color-text-base); + --pst-color-h4: var(--pst-color-text-base); + --pst-color-h5: var(--pst-color-text-base); + --pst-color-h6: var(--pst-color-text-base); + --pst-color-paragraph: var(--pst-color-text-base); + --pst-color-link: 0, 91, 129; + --pst-color-link-hover: 227, 46, 0; + --pst-color-headerlink: 198, 15, 15; + --pst-color-headerlink-hover: 255, 255, 255; + --pst-color-preformatted-text: 34, 34, 34; + --pst-color-preformatted-background: 250, 250, 250; + --pst-color-inline-code: 232, 62, 140; + + --pst-color-active-navigation: 19, 6, 84; + --pst-color-navbar-link: 77, 77, 77; + --pst-color-navbar-link-hover: var(--pst-color-active-navigation); + --pst-color-navbar-link-active: var(--pst-color-active-navigation); + --pst-color-sidebar-link: 77, 77, 77; + --pst-color-sidebar-link-hover: var(--pst-color-active-navigation); + --pst-color-sidebar-link-active: var(--pst-color-active-navigation); + --pst-color-sidebar-expander-background-hover: 244, 244, 244; + --pst-color-sidebar-caption: 77, 77, 77; + --pst-color-toc-link: 119, 117, 122; + --pst-color-toc-link-hover: var(--pst-color-active-navigation); + --pst-color-toc-link-active: var(--pst-color-active-navigation); + + /***************************************************************************** + * Icon + **/ + + /* font awesome icons*/ + --pst-icon-check-circle: '\f058'; + --pst-icon-info-circle: '\f05a'; + --pst-icon-exclamation-triangle: '\f071'; + --pst-icon-exclamation-circle: '\f06a'; + --pst-icon-times-circle: '\f057'; + --pst-icon-lightbulb: '\f0eb'; + + /***************************************************************************** + * Admonitions + **/ + + --pst-color-admonition-default: var(--pst-color-info); + --pst-color-admonition-note: var(--pst-color-info); + --pst-color-admonition-attention: var(--pst-color-warning); + --pst-color-admonition-caution: var(--pst-color-warning); + --pst-color-admonition-warning: var(--pst-color-warning); + --pst-color-admonition-danger: var(--pst-color-danger); + --pst-color-admonition-error: var(--pst-color-danger); + --pst-color-admonition-hint: var(--pst-color-success); + --pst-color-admonition-tip: var(--pst-color-success); + --pst-color-admonition-important: var(--pst-color-success); + + --pst-icon-admonition-default: var(--pst-icon-info-circle); + --pst-icon-admonition-note: var(--pst-icon-info-circle); + --pst-icon-admonition-attention: var(--pst-icon-exclamation-circle); + --pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle); + --pst-icon-admonition-error: var(--pst-icon-times-circle); + --pst-icon-admonition-hint: var(--pst-icon-lightbulb); + --pst-icon-admonition-tip: var(--pst-icon-lightbulb); + --pst-icon-admonition-important: var(--pst-icon-exclamation-circle); +} diff --git a/main/_static/doctools.js b/main/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/main/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/main/_static/documentation_options.js b/main/_static/documentation_options.js new file mode 100644 index 00000000..d0469114 --- /dev/null +++ b/main/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '1.0.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: true, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/main/_static/file.png b/main/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/main/_static/file.png differ diff --git a/main/_static/js/index.9ea38e314b9e6d9dab77.js b/main/_static/js/index.9ea38e314b9e6d9dab77.js new file mode 100644 index 00000000..99ad2267 --- /dev/null +++ b/main/_static/js/index.9ea38e314b9e6d9dab77.js @@ -0,0 +1,32 @@ +!function(t){var e={};function n(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return t[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(i,o,function(e){return t[e]}.bind(null,o));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=2)}([function(t,e){t.exports=jQuery},function(t,e,n){"use strict";n.r(e),function(t){ +/**! + * @fileOverview Kickass library to create and place poppers near their reference elements. + * @version 1.16.1 + * @license + * Copyright (c) 2016 Federico Zivolo and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +var n="undefined"!=typeof window&&"undefined"!=typeof document&&"undefined"!=typeof navigator,i=function(){for(var t=["Edge","Trident","Firefox"],e=0;e=0)return 1;return 0}();var o=n&&window.Promise?function(t){var e=!1;return function(){e||(e=!0,window.Promise.resolve().then((function(){e=!1,t()})))}}:function(t){var e=!1;return function(){e||(e=!0,setTimeout((function(){e=!1,t()}),i))}};function r(t){return t&&"[object Function]"==={}.toString.call(t)}function a(t,e){if(1!==t.nodeType)return[];var n=t.ownerDocument.defaultView.getComputedStyle(t,null);return e?n[e]:n}function s(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}function l(t){if(!t)return document.body;switch(t.nodeName){case"HTML":case"BODY":return t.ownerDocument.body;case"#document":return t.body}var e=a(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/(auto|scroll|overlay)/.test(n+o+i)?t:l(s(t))}function u(t){return t&&t.referenceNode?t.referenceNode:t}var f=n&&!(!window.MSInputMethodContext||!document.documentMode),d=n&&/MSIE 10/.test(navigator.userAgent);function c(t){return 11===t?f:10===t?d:f||d}function h(t){if(!t)return document.documentElement;for(var e=c(10)?document.body:null,n=t.offsetParent||null;n===e&&t.nextElementSibling;)n=(t=t.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&"BODY"!==i&&"HTML"!==i?-1!==["TH","TD","TABLE"].indexOf(n.nodeName)&&"static"===a(n,"position")?h(n):n:t?t.ownerDocument.documentElement:document.documentElement}function p(t){return null!==t.parentNode?p(t.parentNode):t}function m(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.documentElement;var n=t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING,i=n?t:e,o=n?e:t,r=document.createRange();r.setStart(i,0),r.setEnd(o,0);var a,s,l=r.commonAncestorContainer;if(t!==l&&e!==l||i.contains(o))return"BODY"===(s=(a=l).nodeName)||"HTML"!==s&&h(a.firstElementChild)!==a?h(l):l;var u=p(t);return u.host?m(u.host,e):m(t,p(e).host)}function g(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"top",n="top"===e?"scrollTop":"scrollLeft",i=t.nodeName;if("BODY"===i||"HTML"===i){var o=t.ownerDocument.documentElement,r=t.ownerDocument.scrollingElement||o;return r[n]}return t[n]}function v(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=g(e,"top"),o=g(e,"left"),r=n?-1:1;return t.top+=i*r,t.bottom+=i*r,t.left+=o*r,t.right+=o*r,t}function _(t,e){var n="x"===e?"Left":"Top",i="Left"===n?"Right":"Bottom";return parseFloat(t["border"+n+"Width"])+parseFloat(t["border"+i+"Width"])}function b(t,e,n,i){return Math.max(e["offset"+t],e["scroll"+t],n["client"+t],n["offset"+t],n["scroll"+t],c(10)?parseInt(n["offset"+t])+parseInt(i["margin"+("Height"===t?"Top":"Left")])+parseInt(i["margin"+("Height"===t?"Bottom":"Right")]):0)}function y(t){var e=t.body,n=t.documentElement,i=c(10)&&getComputedStyle(n);return{height:b("Height",e,n,i),width:b("Width",e,n,i)}}var w=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")},E=function(){function t(t,e){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],i=c(10),o="HTML"===e.nodeName,r=N(t),s=N(e),u=l(t),f=a(e),d=parseFloat(f.borderTopWidth),h=parseFloat(f.borderLeftWidth);n&&o&&(s.top=Math.max(s.top,0),s.left=Math.max(s.left,0));var p=S({top:r.top-s.top-d,left:r.left-s.left-h,width:r.width,height:r.height});if(p.marginTop=0,p.marginLeft=0,!i&&o){var m=parseFloat(f.marginTop),g=parseFloat(f.marginLeft);p.top-=d-m,p.bottom-=d-m,p.left-=h-g,p.right-=h-g,p.marginTop=m,p.marginLeft=g}return(i&&!n?e.contains(u):e===u&&"BODY"!==u.nodeName)&&(p=v(p,e)),p}function k(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=t.ownerDocument.documentElement,i=D(t,n),o=Math.max(n.clientWidth,window.innerWidth||0),r=Math.max(n.clientHeight,window.innerHeight||0),a=e?0:g(n),s=e?0:g(n,"left"),l={top:a-i.top+i.marginTop,left:s-i.left+i.marginLeft,width:o,height:r};return S(l)}function A(t){var e=t.nodeName;if("BODY"===e||"HTML"===e)return!1;if("fixed"===a(t,"position"))return!0;var n=s(t);return!!n&&A(n)}function I(t){if(!t||!t.parentElement||c())return document.documentElement;for(var e=t.parentElement;e&&"none"===a(e,"transform");)e=e.parentElement;return e||document.documentElement}function O(t,e,n,i){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r={top:0,left:0},a=o?I(t):m(t,u(e));if("viewport"===i)r=k(a,o);else{var f=void 0;"scrollParent"===i?"BODY"===(f=l(s(e))).nodeName&&(f=t.ownerDocument.documentElement):f="window"===i?t.ownerDocument.documentElement:i;var d=D(f,a,o);if("HTML"!==f.nodeName||A(a))r=d;else{var c=y(t.ownerDocument),h=c.height,p=c.width;r.top+=d.top-d.marginTop,r.bottom=h+d.top,r.left+=d.left-d.marginLeft,r.right=p+d.left}}var g="number"==typeof(n=n||0);return r.left+=g?n:n.left||0,r.top+=g?n:n.top||0,r.right-=g?n:n.right||0,r.bottom-=g?n:n.bottom||0,r}function x(t){return t.width*t.height}function j(t,e,n,i,o){var r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;if(-1===t.indexOf("auto"))return t;var a=O(n,i,r,o),s={top:{width:a.width,height:e.top-a.top},right:{width:a.right-e.right,height:a.height},bottom:{width:a.width,height:a.bottom-e.bottom},left:{width:e.left-a.left,height:a.height}},l=Object.keys(s).map((function(t){return C({key:t},s[t],{area:x(s[t])})})).sort((function(t,e){return e.area-t.area})),u=l.filter((function(t){var e=t.width,i=t.height;return e>=n.clientWidth&&i>=n.clientHeight})),f=u.length>0?u[0].key:l[0].key,d=t.split("-")[1];return f+(d?"-"+d:"")}function L(t,e,n){var i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,o=i?I(e):m(e,u(n));return D(n,o,i)}function P(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),n=parseFloat(e.marginTop||0)+parseFloat(e.marginBottom||0),i=parseFloat(e.marginLeft||0)+parseFloat(e.marginRight||0);return{width:t.offsetWidth+i,height:t.offsetHeight+n}}function F(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"};return t.replace(/left|right|bottom|top/g,(function(t){return e[t]}))}function R(t,e,n){n=n.split("-")[0];var i=P(t),o={width:i.width,height:i.height},r=-1!==["right","left"].indexOf(n),a=r?"top":"left",s=r?"left":"top",l=r?"height":"width",u=r?"width":"height";return o[a]=e[a]+e[l]/2-i[l]/2,o[s]=n===s?e[s]-i[u]:e[F(s)],o}function M(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}function H(t,e,n){return(void 0===n?t:t.slice(0,function(t,e,n){if(Array.prototype.findIndex)return t.findIndex((function(t){return t[e]===n}));var i=M(t,(function(t){return t[e]===n}));return t.indexOf(i)}(t,"name",n))).forEach((function(t){t.function&&console.warn("`modifier.function` is deprecated, use `modifier.fn`!");var n=t.function||t.fn;t.enabled&&r(n)&&(e.offsets.popper=S(e.offsets.popper),e.offsets.reference=S(e.offsets.reference),e=n(e,t))})),e}function B(){if(!this.state.isDestroyed){var t={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};t.offsets.reference=L(this.state,this.popper,this.reference,this.options.positionFixed),t.placement=j(this.options.placement,t.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),t.originalPlacement=t.placement,t.positionFixed=this.options.positionFixed,t.offsets.popper=R(this.popper,t.offsets.reference,t.placement),t.offsets.popper.position=this.options.positionFixed?"fixed":"absolute",t=H(this.modifiers,t),this.state.isCreated?this.options.onUpdate(t):(this.state.isCreated=!0,this.options.onCreate(t))}}function q(t,e){return t.some((function(t){var n=t.name;return t.enabled&&n===e}))}function Q(t){for(var e=[!1,"ms","Webkit","Moz","O"],n=t.charAt(0).toUpperCase()+t.slice(1),i=0;i1&&void 0!==arguments[1]&&arguments[1],n=Z.indexOf(t),i=Z.slice(n+1).concat(Z.slice(0,n));return e?i.reverse():i}var et="flip",nt="clockwise",it="counterclockwise";function ot(t,e,n,i){var o=[0,0],r=-1!==["right","left"].indexOf(i),a=t.split(/(\+|\-)/).map((function(t){return t.trim()})),s=a.indexOf(M(a,(function(t){return-1!==t.search(/,|\s/)})));a[s]&&-1===a[s].indexOf(",")&&console.warn("Offsets separated by white space(s) are deprecated, use a comma (,) instead.");var l=/\s*,\s*|\s+/,u=-1!==s?[a.slice(0,s).concat([a[s].split(l)[0]]),[a[s].split(l)[1]].concat(a.slice(s+1))]:[a];return(u=u.map((function(t,i){var o=(1===i?!r:r)?"height":"width",a=!1;return t.reduce((function(t,e){return""===t[t.length-1]&&-1!==["+","-"].indexOf(e)?(t[t.length-1]=e,a=!0,t):a?(t[t.length-1]+=e,a=!1,t):t.concat(e)}),[]).map((function(t){return function(t,e,n,i){var o=t.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+o[1],a=o[2];if(!r)return t;if(0===a.indexOf("%")){var s=void 0;switch(a){case"%p":s=n;break;case"%":case"%r":default:s=i}return S(s)[e]/100*r}if("vh"===a||"vw"===a){return("vh"===a?Math.max(document.documentElement.clientHeight,window.innerHeight||0):Math.max(document.documentElement.clientWidth,window.innerWidth||0))/100*r}return r}(t,o,e,n)}))}))).forEach((function(t,e){t.forEach((function(n,i){X(n)&&(o[e]+=n*("-"===t[i-1]?-1:1))}))})),o}var rt={placement:"bottom",positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(t){var e=t.placement,n=e.split("-")[0],i=e.split("-")[1];if(i){var o=t.offsets,r=o.reference,a=o.popper,s=-1!==["bottom","top"].indexOf(n),l=s?"left":"top",u=s?"width":"height",f={start:T({},l,r[l]),end:T({},l,r[l]+r[u]-a[u])};t.offsets.popper=C({},a,f[i])}return t}},offset:{order:200,enabled:!0,fn:function(t,e){var n=e.offset,i=t.placement,o=t.offsets,r=o.popper,a=o.reference,s=i.split("-")[0],l=void 0;return l=X(+n)?[+n,0]:ot(n,r,a,s),"left"===s?(r.top+=l[0],r.left-=l[1]):"right"===s?(r.top+=l[0],r.left+=l[1]):"top"===s?(r.left+=l[0],r.top-=l[1]):"bottom"===s&&(r.left+=l[0],r.top+=l[1]),t.popper=r,t},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(t,e){var n=e.boundariesElement||h(t.instance.popper);t.instance.reference===n&&(n=h(n));var i=Q("transform"),o=t.instance.popper.style,r=o.top,a=o.left,s=o[i];o.top="",o.left="",o[i]="";var l=O(t.instance.popper,t.instance.reference,e.padding,n,t.positionFixed);o.top=r,o.left=a,o[i]=s,e.boundaries=l;var u=e.priority,f=t.offsets.popper,d={primary:function(t){var n=f[t];return f[t]l[t]&&!e.escapeWithReference&&(i=Math.min(f[n],l[t]-("right"===t?f.width:f.height))),T({},n,i)}};return u.forEach((function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";f=C({},f,d[e](t))})),t.offsets.popper=f,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,a=-1!==["top","bottom"].indexOf(o),s=a?"right":"bottom",l=a?"left":"top",u=a?"width":"height";return n[s]r(i[s])&&(t.offsets.popper[l]=r(i[s])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!G(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,s=r.popper,l=r.reference,u=-1!==["left","right"].indexOf(o),f=u?"height":"width",d=u?"Top":"Left",c=d.toLowerCase(),h=u?"left":"top",p=u?"bottom":"right",m=P(i)[f];l[p]-ms[p]&&(t.offsets.popper[c]+=l[c]+m-s[p]),t.offsets.popper=S(t.offsets.popper);var g=l[c]+l[f]/2-m/2,v=a(t.instance.popper),_=parseFloat(v["margin"+d]),b=parseFloat(v["border"+d+"Width"]),y=g-t.offsets.popper[c]-_-b;return y=Math.max(Math.min(s[f]-m,y),0),t.arrowElement=i,t.offsets.arrow=(T(n={},c,Math.round(y)),T(n,h,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(t,e){if(q(t.instance.modifiers,"inner"))return t;if(t.flipped&&t.placement===t.originalPlacement)return t;var n=O(t.instance.popper,t.instance.reference,e.padding,e.boundariesElement,t.positionFixed),i=t.placement.split("-")[0],o=F(i),r=t.placement.split("-")[1]||"",a=[];switch(e.behavior){case et:a=[i,o];break;case nt:a=tt(i);break;case it:a=tt(i,!0);break;default:a=e.behavior}return a.forEach((function(s,l){if(i!==s||a.length===l+1)return t;i=t.placement.split("-")[0],o=F(i);var u=t.offsets.popper,f=t.offsets.reference,d=Math.floor,c="left"===i&&d(u.right)>d(f.left)||"right"===i&&d(u.left)d(f.top)||"bottom"===i&&d(u.top)d(n.right),m=d(u.top)d(n.bottom),v="left"===i&&h||"right"===i&&p||"top"===i&&m||"bottom"===i&&g,_=-1!==["top","bottom"].indexOf(i),b=!!e.flipVariations&&(_&&"start"===r&&h||_&&"end"===r&&p||!_&&"start"===r&&m||!_&&"end"===r&&g),y=!!e.flipVariationsByContent&&(_&&"start"===r&&p||_&&"end"===r&&h||!_&&"start"===r&&g||!_&&"end"===r&&m),w=b||y;(c||v||w)&&(t.flipped=!0,(c||v)&&(i=a[l+1]),w&&(r=function(t){return"end"===t?"start":"start"===t?"end":t}(r)),t.placement=i+(r?"-"+r:""),t.offsets.popper=C({},t.offsets.popper,R(t.instance.popper,t.offsets.reference,t.placement)),t=H(t.instance.modifiers,t,"flip"))})),t},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,a=-1!==["left","right"].indexOf(n),s=-1===["top","left"].indexOf(n);return o[a?"left":"top"]=r[n]-(s?o[a?"width":"height"]:0),t.placement=F(e),t.offsets.popper=S(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!G(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=M(t.instance.modifiers,(function(t){return"preventOverflow"===t.name})).boundaries;if(e.bottomn.right||e.top>n.bottom||e.right2&&void 0!==arguments[2]?arguments[2]:{};w(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(i.update)},this.update=o(this.update.bind(this)),this.options=C({},t.Defaults,a),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=e&&e.jquery?e[0]:e,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(C({},t.Defaults.modifiers,a.modifiers)).forEach((function(e){i.options.modifiers[e]=C({},t.Defaults.modifiers[e]||{},a.modifiers?a.modifiers[e]:{})})),this.modifiers=Object.keys(this.options.modifiers).map((function(t){return C({name:t},i.options.modifiers[t])})).sort((function(t,e){return t.order-e.order})),this.modifiers.forEach((function(t){t.enabled&&r(t.onLoad)&&t.onLoad(i.reference,i.popper,i.options,t,i.state)})),this.update();var s=this.options.eventsEnabled;s&&this.enableEventListeners(),this.state.eventsEnabled=s}return E(t,[{key:"update",value:function(){return B.call(this)}},{key:"destroy",value:function(){return W.call(this)}},{key:"enableEventListeners",value:function(){return Y.call(this)}},{key:"disableEventListeners",value:function(){return z.call(this)}}]),t}();at.Utils=("undefined"!=typeof window?window:t).PopperUtils,at.placements=J,at.Defaults=rt,e.default=at}.call(this,n(4))},function(t,e,n){t.exports=n(5)},function(t,e,n){ +/*! + * Bootstrap v4.6.0 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e,n){"use strict";function i(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var o=i(e),r=i(n);function a(t,e){for(var n=0;n=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};f.jQueryDetection(),o.default.fn.emulateTransitionEnd=u,o.default.event.special[f.TRANSITION_END]={bindType:"transitionend",delegateType:"transitionend",handle:function(t){if(o.default(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var d="alert",c=o.default.fn[d],h=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.default.removeData(this._element,"bs.alert"),this._element=null},e._getRootElement=function(t){var e=f.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=o.default(t).closest(".alert")[0]),n},e._triggerCloseEvent=function(t){var e=o.default.Event("close.bs.alert");return o.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(o.default(t).removeClass("show"),o.default(t).hasClass("fade")){var n=f.getTransitionDurationFromElement(t);o.default(t).one(f.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){o.default(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.alert");i||(i=new t(this),n.data("bs.alert",i)),"close"===e&&i[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.6.0"}}]),t}();o.default(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',h._handleDismiss(new h)),o.default.fn[d]=h._jQueryInterface,o.default.fn[d].Constructor=h,o.default.fn[d].noConflict=function(){return o.default.fn[d]=c,h._jQueryInterface};var p=o.default.fn.button,m=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=o.default(this._element).closest('[data-toggle="buttons"]')[0];if(n){var i=this._element.querySelector('input:not([type="hidden"])');if(i){if("radio"===i.type)if(i.checked&&this._element.classList.contains("active"))t=!1;else{var r=n.querySelector(".active");r&&o.default(r).removeClass("active")}t&&("checkbox"!==i.type&&"radio"!==i.type||(i.checked=!this._element.classList.contains("active")),this.shouldAvoidTriggerChange||o.default(i).trigger("change")),i.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains("active")),t&&o.default(this._element).toggleClass("active"))},e.dispose=function(){o.default.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var i=o.default(this),r=i.data("bs.button");r||(r=new t(this),i.data("bs.button",r)),r.shouldAvoidTriggerChange=n,"toggle"===e&&r[e]()}))},s(t,null,[{key:"VERSION",get:function(){return"4.6.0"}}]),t}();o.default(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var e=t.target,n=e;if(o.default(e).hasClass("btn")||(e=o.default(e).closest(".btn")[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var i=e.querySelector('input:not([type="hidden"])');if(i&&(i.hasAttribute("disabled")||i.classList.contains("disabled")))return void t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||m._jQueryInterface.call(o.default(e),"toggle","INPUT"===n.tagName)}})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){var e=o.default(t.target).closest(".btn")[0];o.default(e).toggleClass("focus",/^focus(in)?$/.test(t.type))})),o.default(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide("next")},e.nextWhenVisible=function(){var t=o.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide("prev")},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(f.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(".active.carousel-item");var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)o.default(this._element).one("slid.bs.carousel",(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?"next":"prev";this._slide(i,this._items[t])}},e.dispose=function(){o.default(this._element).off(v),o.default.removeData(this._element,"bs.carousel"),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=l({},b,t),f.typeCheckConfig(g,t,y),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&o.default(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&o.default(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&w[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t._pointerEvent&&w[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};o.default(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(o.default(this._element).on("pointerdown.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(o.default(this._element).on("touchstart.bs.carousel",(function(t){return e(t)})),o.default(this._element).on("touchmove.bs.carousel",(function(e){return function(e){e.originalEvent.touches&&e.originalEvent.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),o.default(this._element).on("touchend.bs.carousel",(function(t){return n(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var a=(o+("prev"===t?-1:1))%this._items.length;return-1===a?this._items[this._items.length-1]:this._items[a]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(this._element.querySelector(".active.carousel-item")),r=o.default.Event("slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n});return o.default(this._element).trigger(r),r},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));o.default(e).removeClass("active");var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&o.default(n).addClass("active")}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(".active.carousel-item");if(t){var e=parseInt(t.getAttribute("data-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,i,r,a=this,s=this._element.querySelector(".active.carousel-item"),l=this._getItemIndex(s),u=e||s&&this._getItemByDirection(t,s),d=this._getItemIndex(u),c=Boolean(this._interval);if("next"===t?(n="carousel-item-left",i="carousel-item-next",r="left"):(n="carousel-item-right",i="carousel-item-prev",r="right"),u&&o.default(u).hasClass("active"))this._isSliding=!1;else if(!this._triggerSlideEvent(u,r).isDefaultPrevented()&&s&&u){this._isSliding=!0,c&&this.pause(),this._setActiveIndicatorElement(u),this._activeElement=u;var h=o.default.Event("slid.bs.carousel",{relatedTarget:u,direction:r,from:l,to:d});if(o.default(this._element).hasClass("slide")){o.default(u).addClass(i),f.reflow(u),o.default(s).addClass(n),o.default(u).addClass(n);var p=f.getTransitionDurationFromElement(s);o.default(s).one(f.TRANSITION_END,(function(){o.default(u).removeClass(n+" "+i).addClass("active"),o.default(s).removeClass("active "+i+" "+n),a._isSliding=!1,setTimeout((function(){return o.default(a._element).trigger(h)}),0)})).emulateTransitionEnd(p)}else o.default(s).removeClass("active"),o.default(u).addClass("active"),this._isSliding=!1,o.default(this._element).trigger(h);c&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data("bs.carousel"),i=l({},b,o.default(this).data());"object"==typeof e&&(i=l({},i,e));var r="string"==typeof e?e:i.slide;if(n||(n=new t(this,i),o.default(this).data("bs.carousel",n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new TypeError('No method named "'+r+'"');n[r]()}else i.interval&&i.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=f.getSelectorFromElement(this);if(n){var i=o.default(n)[0];if(i&&o.default(i).hasClass("carousel")){var r=l({},o.default(i).data(),o.default(this).data()),a=this.getAttribute("data-slide-to");a&&(r.interval=!1),t._jQueryInterface.call(o.default(i),r),a&&o.default(i).data("bs.carousel").to(a),e.preventDefault()}}},s(t,null,[{key:"VERSION",get:function(){return"4.6.0"}},{key:"Default",get:function(){return b}}]),t}();o.default(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",E._dataApiClickHandler),o.default(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),e=0,n=t.length;e0&&(this._selector=a,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){o.default(this._element).hasClass("show")?this.hide():this.show()},e.show=function(){var e,n,i=this;if(!(this._isTransitioning||o.default(this._element).hasClass("show")||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof i._config.parent?t.getAttribute("data-parent")===i._config.parent:t.classList.contains("collapse")}))).length&&(e=null),e&&(n=o.default(e).not(this._selector).data("bs.collapse"))&&n._isTransitioning))){var r=o.default.Event("show.bs.collapse");if(o.default(this._element).trigger(r),!r.isDefaultPrevented()){e&&(t._jQueryInterface.call(o.default(e).not(this._selector),"hide"),n||o.default(e).data("bs.collapse",null));var a=this._getDimension();o.default(this._element).removeClass("collapse").addClass("collapsing"),this._element.style[a]=0,this._triggerArray.length&&o.default(this._triggerArray).removeClass("collapsed").attr("aria-expanded",!0),this.setTransitioning(!0);var s="scroll"+(a[0].toUpperCase()+a.slice(1)),l=f.getTransitionDurationFromElement(this._element);o.default(this._element).one(f.TRANSITION_END,(function(){o.default(i._element).removeClass("collapsing").addClass("collapse show"),i._element.style[a]="",i.setTransitioning(!1),o.default(i._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(l),this._element.style[a]=this._element[s]+"px"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&o.default(this._element).hasClass("show")){var e=o.default.Event("hide.bs.collapse");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",f.reflow(this._element),o.default(this._element).addClass("collapsing").removeClass("collapse show");var i=this._triggerArray.length;if(i>0)for(var r=0;r0},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),l({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this).data("bs.dropdown");if(n||(n=new t(this,"object"==typeof e?e:null),o.default(this).data("bs.dropdown",n)),"string"==typeof e){if(void 0===n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=[].slice.call(document.querySelectorAll('[data-toggle="dropdown"]')),i=0,r=n.length;i0&&a--,40===e.which&&adocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");var i=f.getTransitionDurationFromElement(this._dialog);o.default(this._element).off(f.TRANSITION_END),o.default(this._element).one(f.TRANSITION_END,(function(){t._element.classList.remove("modal-static"),n||o.default(t._element).one(f.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,i)})).emulateTransitionEnd(i),this._element.focus()}},e._showElement=function(t){var e=this,n=o.default(this._element).hasClass("fade"),i=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),o.default(this._dialog).hasClass("modal-dialog-scrollable")&&i?i.scrollTop=0:this._element.scrollTop=0,n&&f.reflow(this._element),o.default(this._element).addClass("show"),this._config.focus&&this._enforceFocus();var r=o.default.Event("shown.bs.modal",{relatedTarget:t}),a=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,o.default(e._element).trigger(r)};if(n){var s=f.getTransitionDurationFromElement(this._dialog);o.default(this._dialog).one(f.TRANSITION_END,a).emulateTransitionEnd(s)}else a()},e._enforceFocus=function(){var t=this;o.default(document).off("focusin.bs.modal").on("focusin.bs.modal",(function(e){document!==e.target&&t._element!==e.target&&0===o.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?o.default(this._element).on("keydown.dismiss.bs.modal",(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||o.default(this._element).off("keydown.dismiss.bs.modal")},e._setResizeEvent=function(){var t=this;this._isShown?o.default(window).on("resize.bs.modal",(function(e){return t.handleUpdate(e)})):o.default(window).off("resize.bs.modal")},e._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){o.default(document.body).removeClass("modal-open"),t._resetAdjustments(),t._resetScrollbar(),o.default(t._element).trigger("hidden.bs.modal")}))},e._removeBackdrop=function(){this._backdrop&&(o.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=o.default(this._element).hasClass("fade")?"fade":"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",n&&this._backdrop.classList.add(n),o.default(this._backdrop).appendTo(document.body),o.default(this._element).on("click.dismiss.bs.modal",(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&f.reflow(this._backdrop),o.default(this._backdrop).addClass("show"),!t)return;if(!n)return void t();var i=f.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(f.TRANSITION_END,t).emulateTransitionEnd(i)}else if(!this._isShown&&this._backdrop){o.default(this._backdrop).removeClass("show");var r=function(){e._removeBackdrop(),t&&t()};if(o.default(this._element).hasClass("fade")){var a=f.getTransitionDurationFromElement(this._backdrop);o.default(this._backdrop).one(f.TRANSITION_END,r).emulateTransitionEnd(a)}else r()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:H,popperConfig:null},$={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},G=function(){function t(t,e){if(void 0===r.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=o.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(o.default(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),o.default.removeData(this.element,this.constructor.DATA_KEY),o.default(this.element).off(this.constructor.EVENT_KEY),o.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&o.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===o.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=o.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){o.default(this.element).trigger(e);var n=f.findShadowRoot(this.element),i=o.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var a=this.getTipElement(),s=f.getUID(this.constructor.NAME);a.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&o.default(a).addClass("fade");var l="function"==typeof this.config.placement?this.config.placement.call(this,a,this.element):this.config.placement,u=this._getAttachment(l);this.addAttachmentClass(u);var d=this._getContainer();o.default(a).data(this.constructor.DATA_KEY,this),o.default.contains(this.element.ownerDocument.documentElement,this.tip)||o.default(a).appendTo(d),o.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new r.default(this.element,a,this._getPopperConfig(u)),o.default(a).addClass("show"),o.default(a).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&o.default(document.body).children().on("mouseover",null,o.default.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,o.default(t.element).trigger(t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(o.default(this.tip).hasClass("fade")){var h=f.getTransitionDurationFromElement(this.tip);o.default(this.tip).one(f.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(t){var e=this,n=this.getTipElement(),i=o.default.Event(this.constructor.Event.HIDE),r=function(){"show"!==e._hoverState&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),o.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(o.default(this.element).trigger(i),!i.isDefaultPrevented()){if(o.default(n).removeClass("show"),"ontouchstart"in document.documentElement&&o.default(document.body).children().off("mouseover",null,o.default.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,o.default(this.tip).hasClass("fade")){var a=f.getTransitionDurationFromElement(n);o.default(n).one(f.TRANSITION_END,r).emulateTransitionEnd(a)}else r();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-tooltip-"+t)},e.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(o.default(t.querySelectorAll(".tooltip-inner")),this.getTitle()),o.default(t).removeClass("fade show")},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Q(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?o.default(e).parent().is(t)||t.empty().append(e):t.text(o.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return l({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:f.isElement(this.config.container)?o.default(this.config.container):o.default(document).find(this.config.container)},e._getAttachment=function(t){return X[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)o.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;o.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},o.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),o.default(e.getTipElement()).hasClass("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||o.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),o.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=o.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Y.indexOf(t)&&delete e[t]})),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),f.typeCheckConfig(W,t,this.constructor.DefaultType),t.sanitize&&(t.template=Q(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(V);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(o.default(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.tooltip"),r="object"==typeof e&&e;if((i||!/dispose|hide/.test(e))&&(i||(i=new t(this,r),n.data("bs.tooltip",i)),"string"==typeof e)){if(void 0===i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},s(t,null,[{key:"VERSION",get:function(){return"4.6.0"}},{key:"Default",get:function(){return K}},{key:"NAME",get:function(){return W}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return $}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return z}}]),t}();o.default.fn[W]=G._jQueryInterface,o.default.fn[W].Constructor=G,o.default.fn[W].noConflict=function(){return o.default.fn[W]=U,G._jQueryInterface};var J="popover",Z=o.default.fn[J],tt=new RegExp("(^|\\s)bs-popover\\S+","g"),et=l({},G.Default,{placement:"right",trigger:"click",content:"",template:''}),nt=l({},G.DefaultType,{content:"(string|element|function)"}),it={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},ot=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n;var r=i.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){o.default(this.getTipElement()).addClass("bs-popover-"+t)},r.getTipElement=function(){return this.tip=this.tip||o.default(this.config.template)[0],this.tip},r.setContent=function(){var t=o.default(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(".popover-body"),e),t.removeClass("fade show")},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=o.default(this.getTipElement()),e=t.attr("class").match(tt);null!==e&&e.length>0&&t.removeClass(e.join(""))},i._jQueryInterface=function(t){return this.each((function(){var e=o.default(this).data("bs.popover"),n="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new i(this,n),o.default(this).data("bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},s(i,null,[{key:"VERSION",get:function(){return"4.6.0"}},{key:"Default",get:function(){return et}},{key:"NAME",get:function(){return J}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return it}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return nt}}]),i}(G);o.default.fn[J]=ot._jQueryInterface,o.default.fn[J].Constructor=ot,o.default.fn[J].noConflict=function(){return o.default.fn[J]=Z,ot._jQueryInterface};var rt="scrollspy",at=o.default.fn[rt],st={offset:10,method:"auto",target:""},lt={offset:"number",method:"string",target:"(string|element)"},ut=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,o.default(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,i="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,r=f.getSelectorFromElement(t);if(r&&(e=document.querySelector(r)),e){var a=e.getBoundingClientRect();if(a.width||a.height)return[o.default(e)[n]().top+i,r]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){o.default.removeData(this._element,"bs.scrollspy"),o.default(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=l({},st,"object"==typeof t&&t?t:{})).target&&f.isElement(t.target)){var e=o.default(t.target).attr("id");e||(e=f.getUID(rt),o.default(t.target).attr("id",e)),t.target="#"+e}return f.typeCheckConfig(rt,t,lt),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t li > .active":".active";n=(n=o.default.makeArray(o.default(i).find(a)))[n.length-1]}var s=o.default.Event("hide.bs.tab",{relatedTarget:this._element}),l=o.default.Event("show.bs.tab",{relatedTarget:n});if(n&&o.default(n).trigger(s),o.default(this._element).trigger(l),!l.isDefaultPrevented()&&!s.isDefaultPrevented()){r&&(e=document.querySelector(r)),this._activate(this._element,i);var u=function(){var e=o.default.Event("hidden.bs.tab",{relatedTarget:t._element}),i=o.default.Event("shown.bs.tab",{relatedTarget:n});o.default(n).trigger(e),o.default(t._element).trigger(i)};e?this._activate(e,e.parentNode,u):u()}}},e.dispose=function(){o.default.removeData(this._element,"bs.tab"),this._element=null},e._activate=function(t,e,n){var i=this,r=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?o.default(e).children(".active"):o.default(e).find("> li > .active"))[0],a=n&&r&&o.default(r).hasClass("fade"),s=function(){return i._transitionComplete(t,r,n)};if(r&&a){var l=f.getTransitionDurationFromElement(r);o.default(r).removeClass("show").one(f.TRANSITION_END,s).emulateTransitionEnd(l)}else s()},e._transitionComplete=function(t,e,n){if(e){o.default(e).removeClass("active");var i=o.default(e.parentNode).find("> .dropdown-menu .active")[0];i&&o.default(i).removeClass("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}if(o.default(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),f.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&o.default(t.parentNode).hasClass("dropdown-menu")){var r=o.default(t).closest(".dropdown")[0];if(r){var a=[].slice.call(r.querySelectorAll(".dropdown-toggle"));o.default(a).addClass("active")}t.setAttribute("aria-expanded",!0)}n&&n()},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.tab");if(i||(i=new t(this),n.data("bs.tab",i)),"string"==typeof e){if(void 0===i[e])throw new TypeError('No method named "'+e+'"');i[e]()}}))},s(t,null,[{key:"VERSION",get:function(){return"4.6.0"}}]),t}();o.default(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),dt._jQueryInterface.call(o.default(this),"show")})),o.default.fn.tab=dt._jQueryInterface,o.default.fn.tab.Constructor=dt,o.default.fn.tab.noConflict=function(){return o.default.fn.tab=ft,dt._jQueryInterface};var ct=o.default.fn.toast,ht={animation:"boolean",autohide:"boolean",delay:"number"},pt={animation:!0,autohide:!0,delay:500},mt=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var e=t.prototype;return e.show=function(){var t=this,e=o.default.Event("show.bs.toast");if(o.default(this._element).trigger(e),!e.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var n=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),o.default(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),f.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var i=f.getTransitionDurationFromElement(this._element);o.default(this._element).one(f.TRANSITION_END,n).emulateTransitionEnd(i)}else n()}},e.hide=function(){if(this._element.classList.contains("show")){var t=o.default.Event("hide.bs.toast");o.default(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},e.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),o.default(this._element).off("click.dismiss.bs.toast"),o.default.removeData(this._element,"bs.toast"),this._element=null,this._config=null},e._getConfig=function(t){return t=l({},pt,o.default(this._element).data(),"object"==typeof t&&t?t:{}),f.typeCheckConfig("toast",t,this.constructor.DefaultType),t},e._setListeners=function(){var t=this;o.default(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},e._close=function(){var t=this,e=function(){t._element.classList.add("hide"),o.default(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=f.getTransitionDurationFromElement(this._element);o.default(this._element).one(f.TRANSITION_END,e).emulateTransitionEnd(n)}else e()},e._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(e){return this.each((function(){var n=o.default(this),i=n.data("bs.toast");if(i||(i=new t(this,"object"==typeof e&&e),n.data("bs.toast",i)),"string"==typeof e){if(void 0===i[e])throw new TypeError('No method named "'+e+'"');i[e](this)}}))},s(t,null,[{key:"VERSION",get:function(){return"4.6.0"}},{key:"DefaultType",get:function(){return ht}},{key:"Default",get:function(){return pt}}]),t}();o.default.fn.toast=mt._jQueryInterface,o.default.fn.toast.Constructor=mt,o.default.fn.toast.noConflict=function(){return o.default.fn.toast=ct,mt._jQueryInterface},t.Alert=h,t.Button=m,t.Carousel=E,t.Collapse=D,t.Dropdown=j,t.Modal=R,t.Popover=ot,t.Scrollspy=ut,t.Tab=dt,t.Toast=mt,t.Tooltip=G,t.Util=f,Object.defineProperty(t,"__esModule",{value:!0})}(e,n(0),n(1))},function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){"use strict";n.r(e);n(0),n(3),n.p;$(document).ready(()=>{!function(){var t=document.getElementById("bd-docs-nav");let e=parseInt(sessionStorage.getItem("sidebar-scroll-top"),10);if(isNaN(e)){var n,i=t.querySelectorAll(".active"),o=0;for(n=i.length-1;n>0;n--){var r=i[n];void 0!==r&&(o+=r.offsetTop)}o-=t.offsetTop,void 0!==r&&o>.5*t.clientHeight&&(t.scrollTop=o-.2*t.clientHeight)}else t.scrollTop=e;window.addEventListener("beforeunload",()=>{sessionStorage.setItem("sidebar-scroll-top",t.scrollTop)})}(),$(window).on("activate.bs.scrollspy",(function(){document.querySelectorAll("#bd-toc-nav a").forEach(t=>{t.parentElement.classList.remove("active")}),document.querySelectorAll("#bd-toc-nav a.active").forEach(t=>{t.parentElement.classList.add("active")})}))})}]); \ No newline at end of file diff --git a/main/_static/language_data.js b/main/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/main/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * 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. + * :license: BSD, see LICENSE for details. + * + */ + +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 */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/main/_static/minus.png b/main/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/main/_static/minus.png differ diff --git a/main/_static/plus.png b/main/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/main/_static/plus.png differ diff --git a/main/_static/pygments.css b/main/_static/pygments.css new file mode 100644 index 00000000..6110e9f1 --- /dev/null +++ b/main/_static/pygments.css @@ -0,0 +1,84 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +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 .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 .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 */ \ No newline at end of file diff --git a/main/_static/searchtools.js b/main/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/main/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) 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." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + 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; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // 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([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.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; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // 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 }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // 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]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/main/_static/sphinx_highlight.js b/main/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/main/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/main/_static/vendor/fontawesome/5.13.0/LICENSE.txt b/main/_static/vendor/fontawesome/5.13.0/LICENSE.txt new file mode 100644 index 00000000..f31bef92 --- /dev/null +++ b/main/_static/vendor/fontawesome/5.13.0/LICENSE.txt @@ -0,0 +1,34 @@ +Font Awesome Free License +------------------------- + +Font Awesome Free is free, open source, and GPL friendly. You can use it for +commercial projects, open source projects, or really almost whatever you want. +Full Font Awesome Free license: https://fontawesome.com/license/free. + +# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) +In the Font Awesome Free download, the CC BY 4.0 license applies to all icons +packaged as SVG and JS file types. + +# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) +In the Font Awesome Free download, the SIL OFL license applies to all icons +packaged as web and desktop font files. + +# Code: MIT License (https://opensource.org/licenses/MIT) +In the Font Awesome Free download, the MIT license applies to all non-font and +non-icon files. + +# Attribution +Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font +Awesome Free files already contain embedded comments with sufficient +attribution, so you shouldn't need to do anything additional when using these +files normally. + +We've kept attribution comments terse, so we ask that you do not actively work +to remove them from files, especially code. They're a great way for folks to +learn about Font Awesome. + +# Brand Icons +All brand icons are trademarks of their respective owners. The use of these +trademarks does not indicate endorsement of the trademark holder by Font +Awesome, nor vice versa. **Please do not use brand logos for any purpose except +to represent the company, product, or service to which they refer.** diff --git a/main/_static/vendor/fontawesome/5.13.0/css/all.min.css b/main/_static/vendor/fontawesome/5.13.0/css/all.min.css new file mode 100644 index 00000000..3d28ab20 --- /dev/null +++ b/main/_static/vendor/fontawesome/5.13.0/css/all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.13.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\f95b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\f952"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\f905"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\f95c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\f95d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\f95e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\f95f"}.fa-handshake-slash:before{content:"\f960"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\f961"}.fa-head-side-cough-slash:before{content:"\f962"}.fa-head-side-mask:before{content:"\f963"}.fa-head-side-virus:before{content:"\f964"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\f965"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\f955"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\f966"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\f967"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\f956"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\f968"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\f969"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\f96a"}.fa-pump-soap:before{content:"\f96b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\f96c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\f957"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\f96e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\f96f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\f970"}.fa-store-slash:before{content:"\f971"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\f972"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\f974"}.fa-virus-slash:before{content:"\f975"}.fa-viruses:before{content:"\f976"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.eot b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.eot new file mode 100644 index 00000000..a1bc094a Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.eot differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.svg b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.svg new file mode 100644 index 00000000..46ad237a --- /dev/null +++ b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.svg @@ -0,0 +1,3570 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.ttf b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..948a2a6c Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.ttf differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff new file mode 100644 index 00000000..2a89d521 Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2 b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..141a90a9 Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-brands-400.woff2 differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.eot b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.eot new file mode 100644 index 00000000..38cf2517 Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.eot differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.svg b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.svg new file mode 100644 index 00000000..48634a9a --- /dev/null +++ b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.svg @@ -0,0 +1,803 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.ttf b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..abe99e20 Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.ttf differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff new file mode 100644 index 00000000..24de566a Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff2 b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..7e0118e5 Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-regular-400.woff2 differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.eot b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.eot new file mode 100644 index 00000000..d3b77c22 Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.eot differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.svg b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.svg new file mode 100644 index 00000000..7742838b --- /dev/null +++ b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.svg @@ -0,0 +1,4938 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.ttf b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..5b979039 Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.ttf differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff new file mode 100644 index 00000000..beec7917 Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff differ diff --git a/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2 b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..978a681a Binary files /dev/null and b/main/_static/vendor/fontawesome/5.13.0/webfonts/fa-solid-900.woff2 differ diff --git a/main/_static/webpack-macros.html b/main/_static/webpack-macros.html new file mode 100644 index 00000000..c91c6da4 --- /dev/null +++ b/main/_static/webpack-macros.html @@ -0,0 +1,25 @@ + +{% macro head_pre_icons() %} + + + +{% endmacro %} + +{% macro head_pre_fonts() %} +{% endmacro %} + +{% macro head_pre_bootstrap() %} + + +{% endmacro %} + +{% macro head_js_preload() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} \ No newline at end of file diff --git a/main/api.html b/main/api.html new file mode 100644 index 00000000..e0d2d5dc --- /dev/null +++ b/main/api.html @@ -0,0 +1,323 @@ + + + + + + + + <no title> — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.carl_env.html b/main/api/carl.envs.carl_env.html new file mode 100644 index 00000000..fbf78862 --- /dev/null +++ b/main/api/carl.envs.carl_env.html @@ -0,0 +1,526 @@ + + + + + + + + carl.envs.carl_env — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

carl.envs.carl_env

+
+

Classes

+ + + + + + +

CARLEnv(env[, contexts, ...])

+
+
+

Interfaces

+
+
+class carl.envs.carl_env.CARLEnv(env, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: Wrapper, ABC

+
+
+abstract static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+
+classmethod get_context_space()[source]
+

Get context space

+
+
Returns:
+

Context space with utility methods holding +information about defaults, types, bounds, etc.

+
+
Return type:
+

ContextSpace

+
+
+
+ +
+
+classmethod get_default_context()[source]
+

Get the default context

+
+
Returns:
+

Default context.

+
+
Return type:
+

Context

+
+
+
+ +
+
+get_observation_space(obs_context_feature_names=None)[source]
+

Get the observation space for the context.

+
+
Parameters:
+

obs_context_feature_names (list[str] | None, optional) – Name of the context features to be included in the observation, by default None. +If it is None, we add all context features.

+
+
Returns:
+

Gymnasium observation space which contains the observation space of the +underlying environment (“state”) and for the context (“context”).

+
+
Return type:
+

gymnasium.spaces.Dict

+
+
+
+ +
+
+reset(*, seed=None, options=None)[source]
+

Reset the environment.

+

First, we progress the instance, i.e. select a new context with the context +selector. Then we update the context in the wrapped environment. +Finally, we reset the underlying environment and add context information +to the observation.

+
+
Parameters:
+
    +
  • seed (int | None, optional) – Seed, by default None

  • +
  • options (dict[str, Any] | None, optional) – Options, by default None

  • +
+
+
Returns:
+

Observation, info.

+
+
Return type:
+

tuple[Any, dict[str, Any]]

+
+
+
+ +
+
+step(action)[source]
+

Step the environment.

+

The context is added to the observation returned by the +wrapped environment.

+
+
Parameters:
+

action (Any) – Action

+
+
Returns:
+

Observation, rewar, terminated, truncated, info.

+
+
Return type:
+

tuple[Any, SupportsFloat, bool, bool, dict[str, Any]]

+
+
+
+ +
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.gymnasium.carl_gymnasium_env.html b/main/api/carl.envs.gymnasium.carl_gymnasium_env.html new file mode 100644 index 00000000..a0543c7b --- /dev/null +++ b/main/api/carl.envs.gymnasium.carl_gymnasium_env.html @@ -0,0 +1,364 @@ + + + + + + + + carl.envs.gymnasium.carl_gymnasium_env — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.gymnasium.carl_gymnasium_env

+
+

Classes

+ + + + + + +

CARLGymnasiumEnv([env, contexts, ...])

+
+
+

Interfaces

+
+
+class carl.envs.gymnasium.carl_gymnasium_env.CARLGymnasiumEnv(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLEnv

+
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.gymnasium.classic_control.carl_acrobot.html b/main/api/carl.envs.gymnasium.classic_control.carl_acrobot.html new file mode 100644 index 00000000..aa5915ee --- /dev/null +++ b/main/api/carl.envs.gymnasium.classic_control.carl_acrobot.html @@ -0,0 +1,390 @@ + + + + + + + + carl.envs.gymnasium.classic_control.carl_acrobot — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.gymnasium.classic_control.carl_acrobot

+
+

Classes

+ + + + + + +

CARLAcrobot([env, contexts, ...])

+
+
+

Interfaces

+
+
+class carl.envs.gymnasium.classic_control.carl_acrobot.CARLAcrobot(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.gymnasium.classic_control.carl_cartpole.html b/main/api/carl.envs.gymnasium.classic_control.carl_cartpole.html new file mode 100644 index 00000000..e7dfc317 --- /dev/null +++ b/main/api/carl.envs.gymnasium.classic_control.carl_cartpole.html @@ -0,0 +1,390 @@ + + + + + + + + carl.envs.gymnasium.classic_control.carl_cartpole — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.gymnasium.classic_control.carl_cartpole

+
+

Classes

+ + + + + + +

CARLCartPole([env, contexts, ...])

+
+
+

Interfaces

+
+
+class carl.envs.gymnasium.classic_control.carl_cartpole.CARLCartPole(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.gymnasium.classic_control.carl_mountaincar.html b/main/api/carl.envs.gymnasium.classic_control.carl_mountaincar.html new file mode 100644 index 00000000..c8ef4ccf --- /dev/null +++ b/main/api/carl.envs.gymnasium.classic_control.carl_mountaincar.html @@ -0,0 +1,390 @@ + + + + + + + + carl.envs.gymnasium.classic_control.carl_mountaincar — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.gymnasium.classic_control.carl_mountaincar

+
+

Classes

+ + + + + + +

CARLMountainCar([env, contexts, ...])

+
+
+

Interfaces

+
+
+class carl.envs.gymnasium.classic_control.carl_mountaincar.CARLMountainCar(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.html b/main/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.html new file mode 100644 index 00000000..64b0c6dd --- /dev/null +++ b/main/api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.html @@ -0,0 +1,390 @@ + + + + + + + + carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous

+
+

Classes

+ + + + + + +

CARLMountainCarContinuous([env, contexts, ...])

+
+
+

Interfaces

+
+
+class carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.CARLMountainCarContinuous(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.gymnasium.classic_control.carl_pendulum.html b/main/api/carl.envs.gymnasium.classic_control.carl_pendulum.html new file mode 100644 index 00000000..9351cfc1 --- /dev/null +++ b/main/api/carl.envs.gymnasium.classic_control.carl_pendulum.html @@ -0,0 +1,390 @@ + + + + + + + + carl.envs.gymnasium.classic_control.carl_pendulum — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.gymnasium.classic_control.carl_pendulum

+
+

Classes

+ + + + + + +

CARLPendulum([env, contexts, ...])

+
+
+

Interfaces

+
+
+class carl.envs.gymnasium.classic_control.carl_pendulum.CARLPendulum(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.gymnasium.classic_control.html b/main/api/carl.envs.gymnasium.classic_control.html new file mode 100644 index 00000000..6d3246af --- /dev/null +++ b/main/api/carl.envs.gymnasium.classic_control.html @@ -0,0 +1,566 @@ + + + + + + + + carl.envs.gymnasium.classic_control — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

carl.envs.gymnasium.classic_control

+
+

Interfaces

+
+
+class carl.envs.gymnasium.classic_control.CARLAcrobot(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+class carl.envs.gymnasium.classic_control.CARLCartPole(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+class carl.envs.gymnasium.classic_control.CARLMountainCar(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+class carl.envs.gymnasium.classic_control.CARLMountainCarContinuous(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+class carl.envs.gymnasium.classic_control.CARLPendulum(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+

Modules

+ + + + + + + + + + + + + + + + + + +

carl.envs.gymnasium.classic_control.carl_acrobot

carl.envs.gymnasium.classic_control.carl_cartpole

carl.envs.gymnasium.classic_control.carl_mountaincar

carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous

carl.envs.gymnasium.classic_control.carl_pendulum

+
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.gymnasium.html b/main/api/carl.envs.gymnasium.html new file mode 100644 index 00000000..dcc48dcc --- /dev/null +++ b/main/api/carl.envs.gymnasium.html @@ -0,0 +1,557 @@ + + + + + + + + carl.envs.gymnasium — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

carl.envs.gymnasium

+
+

Interfaces

+
+
+class carl.envs.gymnasium.CARLAcrobot(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+class carl.envs.gymnasium.CARLCartPole(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+class carl.envs.gymnasium.CARLMountainCar(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+class carl.envs.gymnasium.CARLMountainCarContinuous(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+class carl.envs.gymnasium.CARLPendulum(env=None, contexts=None, obs_context_features=None, obs_context_as_dict=True, context_selector=None, context_selector_kwargs=None, **kwargs)[source]
+

Bases: CARLGymnasiumEnv

+
+
+static get_context_features()[source]
+

Get the context features

+

Defined per environment.

+
+
Returns:
+

Context feature definitions

+
+
Return type:
+

dict[str, ContextFeature]

+
+
+
+ +
+ +
+
+

Modules

+ + + + + + + + + +

carl.envs.gymnasium.carl_gymnasium_env

carl.envs.gymnasium.classic_control

+
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.html b/main/api/carl.envs.html new file mode 100644 index 00000000..c6324d25 --- /dev/null +++ b/main/api/carl.envs.html @@ -0,0 +1,399 @@ + + + + + + + + carl.envs — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs

+
+

Functions

+ + + + + + +

check_spec(spec_name)

Check if the spec is installed

+
+
+

Interfaces

+
+
+carl.envs.check_spec(spec_name)[source]
+

Check if the spec is installed

+
+
Parameters:
+

spec_name (str) – Name of package that is necessary for the environment suite.

+
+
Returns:
+

Whether the spec was found.

+
+
Return type:
+

bool

+
+
+
+ +
+
+

Modules

+ + + + + + + + + + + + + + + +

carl.envs.carl_env

carl.envs.gymnasium

carl.envs.mario

carl.envs.rna

+
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.mario.html b/main/api/carl.envs.mario.html new file mode 100644 index 00000000..7218d623 --- /dev/null +++ b/main/api/carl.envs.mario.html @@ -0,0 +1,356 @@ + + + + + + + + carl.envs.mario — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.mario.level_image_gen.html b/main/api/carl.envs.mario.level_image_gen.html new file mode 100644 index 00000000..d83195ee --- /dev/null +++ b/main/api/carl.envs.mario.level_image_gen.html @@ -0,0 +1,409 @@ + + + + + + + + carl.envs.mario.level_image_gen — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

carl.envs.mario.level_image_gen

+
+

Classes

+ + + + + + +

LevelImageGen(sprite_path)

Generates PIL Image files from Super Mario Bros.

+
+
+

Interfaces

+
+
+class carl.envs.mario.level_image_gen.LevelImageGen(sprite_path)[source]
+

Bases: object

+

Generates PIL Image files from Super Mario Bros. ascii levels. +Initialize once and then use LevelImageGen.render() to generate images.

+
+
+prepare_sprite_and_box(ascii_level, sprite_key, curr_x, curr_y)[source]
+

Helper to make correct sprites and sprite sizes to draw into the image. +Some sprites are bigger than one tile and the renderer needs to adjust for them.

+
+
Return type:
+

Tuple[Any, Tuple[int, int, int, int]]

+
+
+
+ +
+
+render(ascii_level)[source]
+

Renders the ascii level as a PIL Image. Assumes the Background is sky

+
+
Return type:
+

<module ‘PIL.Image’ from ‘/opt/hostedtoolcache/Python/3.9.17/x64/lib/python3.9/site-packages/PIL/Image.py’>

+
+
+
+ +
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.mario.mario_game.html b/main/api/carl.envs.mario.mario_game.html new file mode 100644 index 00000000..9d884986 --- /dev/null +++ b/main/api/carl.envs.mario.mario_game.html @@ -0,0 +1,364 @@ + + + + + + + + carl.envs.mario.mario_game — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.mario.mario_game

+
+

Classes

+ + + + + + +

MarioGame()

+
+
+

Interfaces

+
+
+class carl.envs.mario.mario_game.MarioGame[source]
+

Bases: ABC

+
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.mario.models.html b/main/api/carl.envs.mario.models.html new file mode 100644 index 00000000..8ea89ac0 --- /dev/null +++ b/main/api/carl.envs.mario.models.html @@ -0,0 +1,344 @@ + + + + + + + + carl.envs.mario.models — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.mario.models

+
+

Interfaces

+
+
+

Modules

+ + + +
+
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.mario.reachabillity.html b/main/api/carl.envs.mario.reachabillity.html new file mode 100644 index 00000000..cffdf187 --- /dev/null +++ b/main/api/carl.envs.mario.reachabillity.html @@ -0,0 +1,504 @@ + + + + + + + + carl.envs.mario.reachabillity — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

carl.envs.mario.reachabillity

+
+

Functions

+ + + + + + + + + + + + + + + + + + +

check_blocked(level, i, j, dh, dv, right)

Checks for a given position, level and direction if a blockade exists in the range specified by dh and dv.

check_down(level, map, i, j, dh, ...)

+
rtype:
+

Tuple[bool, bool, List[Tuple[int, int]]]

+
+
+

mark(level, reachability_map, i, j[, ...])

For a given position and a level this will mark all tiles reachable from the given position and collect all

reachability_map(level, shape[, has_mario, ...])

This creates a numpy 2D array containing the reachability map for a given ASCII-Level. Every solid block will have a 1 if Mario can stand on it and can reach the tile and a 0 else. Currently ignoring sprint. Levels are generated without Mario and the flag and as such the algorithm is not including these. :type level: List[str] :param level: The level (slice) as a list containing the ASCII strings of each level row :type shape: Tuple[int, int] :param shape: The level shape :type has_mario: bool :param has_mario: As levels are expected to be generated without Mario, this option has to be set to search for Mario as a starting point :type has_flag: bool :param has_flag: As levels are expected to be generated without the flag, this option has to be set to determine playability via reaching the flag :type check_outside: bool :param check_outside: If this option is set, playability will check if the player can reach the outside :rtype: Tuple[ndarray, bool] :return: A numpy array where a 0 indicates an unreachable block and a 1 denotes a reachable block; a boolean indicating if the level can be finished by the player.

remove_ignored(level)

Replaces all ignored tokens with the empty token in a level. In case of Mario and the flag the coordinates of the

+
+
+

Interfaces

+
+
+carl.envs.mario.reachabillity.check_blocked(level, i, j, dh, dv, right)[source]
+

Checks for a given position, level and direction if a blockade exists in the range specified by dh and dv. +:type level: List[str] +:param level: The level in ASCII form +:type i: int +:param i: x coordinate of the starting position +:type j: int +:param j: y coordinate of the starting position +:type dh: int +:param dh: amount of blocks in the horizontal direction from the starting point the algorithm tries to jump +:type dv: int +:param dv: amount of blocks in the vertical direction from the starting point the algorithm tries to jump +:type right: bool +:param right: direction of the jump +:rtype: int +:return: the blockade y value if a blockade is found, default max value otherwise

+
+ +
+
+carl.envs.mario.reachabillity.mark(level, reachability_map, i, j, check_outside=False)[source]
+
+
For a given position and a level this will mark all tiles reachable from the given position and collect all

these positions for further use.

+
+
+
+
Parameters:
+
    +
  • level (List[str]) – The level (slice) as a list containing the ASCII strings of each level row

  • +
  • map – The current reachability map where the reachable tiles will be marked

  • +
  • i (int) – x coordinate

  • +
  • j (int) – y coordinate

  • +
  • check_outside (bool) – if the algorithm should indicate that the player can reach the right outside of the level

  • +
+
+
Return type:
+

Tuple[bool, List[Tuple[int, int]], bool]

+
+
Returns:
+

A boolean indicating if any tile can be reached from this position, a list of all reachable positions and +if the outside can be reached

+
+
+
+ +
+
+carl.envs.mario.reachabillity.reachability_map(level, shape, has_mario=False, has_flag=False, check_outside=False)[source]
+

This creates a numpy 2D array containing the reachability map for a given ASCII-Level. +Every solid block will have a 1 if Mario can stand on it and can reach the tile and a 0 else. +Currently ignoring sprint. +Levels are generated without Mario and the flag and as such the algorithm is not including these. +:type level: List[str] +:param level: The level (slice) as a list containing the ASCII strings of each level row +:type shape: Tuple[int, int] +:param shape: The level shape +:type has_mario: bool +:param has_mario: As levels are expected to be generated without Mario, this option has to be set to search for

+
+

Mario as a starting point

+
+
+
Parameters:
+
    +
  • has_flag (bool) – As levels are expected to be generated without the flag, this option has to be set to determine +playability via reaching the flag

  • +
  • check_outside (bool) – If this option is set, playability will check if the player can reach the outside

  • +
+
+
Return type:
+

Tuple[ndarray, bool]

+
+
Returns:
+

A numpy array where a 0 indicates an unreachable block and a 1 denotes a reachable block; +a boolean indicating if the level can be finished by the player

+
+
+
+ +
+
+carl.envs.mario.reachabillity.remove_ignored(level)[source]
+
+
Replaces all ignored tokens with the empty token in a level. In case of Mario and the flag the coordinates of the

blocks below are returned and they are also replaced.

+
+
+
+
Parameters:
+

level (List[str]) – a level in ASCII form

+
+
Return type:
+

Tuple[List, Tuple[int, int], Tuple[int, int]]

+
+
Returns:
+

the level in ASCII form with the ignored tokens replaced and the coordinates of the block below Mario and +the flag if existing

+
+
+
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.rna.carl_rna_definitions.html b/main/api/carl.envs.rna.carl_rna_definitions.html new file mode 100644 index 00000000..b9906173 --- /dev/null +++ b/main/api/carl.envs.rna.carl_rna_definitions.html @@ -0,0 +1,332 @@ + + + + + + + + carl.envs.rna.carl_rna_definitions — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.rna.carl_rna_definitions

+
+

Interfaces

+
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.rna.html b/main/api/carl.envs.rna.html new file mode 100644 index 00000000..1da660f4 --- /dev/null +++ b/main/api/carl.envs.rna.html @@ -0,0 +1,350 @@ + + + + + + + + carl.envs.rna — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/api/carl.envs.rna.parse_dot_brackets.html b/main/api/carl.envs.rna.parse_dot_brackets.html new file mode 100644 index 00000000..489312b8 --- /dev/null +++ b/main/api/carl.envs.rna.parse_dot_brackets.html @@ -0,0 +1,380 @@ + + + + + + + + carl.envs.rna.parse_dot_brackets — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

carl.envs.rna.parse_dot_brackets

+
+

Functions

+ + + + + + +

parse_dot_brackets(dataset, data_dir[, ...])

Generate the targets for next epoch.

+
+
+

Interfaces

+
+
+carl.envs.rna.parse_dot_brackets.parse_dot_brackets(dataset, data_dir, target_structure_ids=None, target_structure_path=None)[source]
+

Generate the targets for next epoch.

+
+
Parameters:
+
    +
  • dataset (str) – The name of the benchmark to use targets from

  • +
  • data_dir (str) – The directory of the target structures.

  • +
  • target_structure_ids (Optional[Union[List[int], int]], optional) – Use specific targets by ids., by default None

  • +
  • target_structure_path (Optional[str], optional) – pecify a path to the targets., by default None

  • +
+
+
Returns:
+

An epoch generator for the specified target structures.

+
+
Return type:
+

Generator[int]

+
+
+
+ +
+
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/genindex.html b/main/genindex.html new file mode 100644 index 00000000..bb3388a5 --- /dev/null +++ b/main/genindex.html @@ -0,0 +1,639 @@ + + + + + + + Index — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ + +

Index

+ +
+ C + | G + | L + | M + | P + | R + | S + +
+

C

+ + + +
    +
  • + carl.envs + +
  • +
  • + carl.envs.carl_env + +
  • +
  • + carl.envs.gymnasium + +
  • +
  • + carl.envs.gymnasium.carl_gymnasium_env + +
  • +
  • + carl.envs.gymnasium.classic_control + +
  • +
  • + carl.envs.gymnasium.classic_control.carl_acrobot + +
  • +
  • + carl.envs.gymnasium.classic_control.carl_cartpole + +
  • +
  • + carl.envs.gymnasium.classic_control.carl_mountaincar + +
  • +
  • + carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous + +
  • +
  • + carl.envs.gymnasium.classic_control.carl_pendulum + +
  • +
  • + carl.envs.mario + +
  • +
  • + carl.envs.mario.level_image_gen + +
  • +
  • + carl.envs.mario.mario_game + +
  • +
  • + carl.envs.mario.models + +
  • +
+ +

G

+ + + +
+ +

L

+ + +
+ +

M

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + +
+ + + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/index.html b/main/index.html new file mode 100644 index 00000000..baea4692 --- /dev/null +++ b/main/index.html @@ -0,0 +1,382 @@ + + + + + + + + CARL- Contextually Adaptive Reinforcement Learning — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

CARL- Contextually Adaptive Reinforcement Learning

+
+
+

Welcome to the documentation of CARL, a benchmark library for Contextually Adaptive +Reinforcement Learning. CARL extends well-known RL environments with context, making +them easily configurable to test robustness and generalization.

+

Feel free to check out our paper and our +blog post on CARL!

+
+

What is Context?

+CARL contextually extends Brax' Fetch. +

Context can change the goals and dynamics of an environment. +The interaction interval in Pendulum, for example, can make that environment muhc easier or harder. +The same is true for the composition of a Mario level. +So context is a tool for creating variations in reinforcement learning environments. +In contrast to other approaches like procedural generation, however, context can easily be defined and controlled by the user. +That means you have full control over the difficulty and degree of variations in your environments. +This way, you can gain detailed insights into the generalization capabilities of your agents - where do they excel and where do they fail? +CARL can help you find the answer!

+

If you’re interested in learning more about context, check out our paper or context in RL or the corrsponding blog post.

+
+
+

What can you do with CARL?

+

With CARL, you can easily define train and test distributions across different features of your favorite environments. +Examples include: +- training on short CartPole poles and testing if the policy can transfer to longer ones +- training LunarLander on moon gravity and seeing if it can also land on mars +- training and testing on a uniform distribution of floor friction values on Halfcheetah +… and many more!

+

Simply decide on a generalization task you want your agent to solve, choose the context feature(s) to vary and train your agent just like on any other gymnasium environment

+
+
+

Contact

+

CARL is developed by https://www.automl.org/. +If you want to contribute or found an issue please visit our github page https://github.com/automl/CARL.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/objects.inv b/main/objects.inv new file mode 100644 index 00000000..4424855a Binary files /dev/null and b/main/objects.inv differ diff --git a/main/py-modindex.html b/main/py-modindex.html new file mode 100644 index 00000000..35743794 --- /dev/null +++ b/main/py-modindex.html @@ -0,0 +1,412 @@ + + + + + + + Python Module Index — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ + +

Python Module Index

+ +
+ c +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ c
+ carl +
    + carl.envs +
    + carl.envs.carl_env +
    + carl.envs.gymnasium +
    + carl.envs.gymnasium.carl_gymnasium_env +
    + carl.envs.gymnasium.classic_control +
    + carl.envs.gymnasium.classic_control.carl_acrobot +
    + carl.envs.gymnasium.classic_control.carl_cartpole +
    + carl.envs.gymnasium.classic_control.carl_mountaincar +
    + carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous +
    + carl.envs.gymnasium.classic_control.carl_pendulum +
    + carl.envs.mario +
    + carl.envs.mario.level_image_gen +
    + carl.envs.mario.mario_game +
    + carl.envs.mario.models +
    + carl.envs.mario.reachabillity +
    + carl.envs.rna +
    + carl.envs.rna.carl_rna_definitions +
    + carl.envs.rna.parse_dot_brackets +
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/search.html b/main/search.html new file mode 100644 index 00000000..168c3519 --- /dev/null +++ b/main/search.html @@ -0,0 +1,336 @@ + + + + + + + Search — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ +
+ + + + + + +
+ +
+ +

Search

+ + + + +

+ Searching for multiple words only shows matches that contain + all words. +

+ + +
+ + + +
+ + + +
+ +
+ + +
+ + + +
+
+ +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/searchindex.js b/main/searchindex.js new file mode 100644 index 00000000..598868b3 --- /dev/null +++ b/main/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "api/carl.envs", "api/carl.envs.carl_env", "api/carl.envs.gymnasium", "api/carl.envs.gymnasium.carl_gymnasium_env", "api/carl.envs.gymnasium.classic_control", "api/carl.envs.gymnasium.classic_control.carl_acrobot", "api/carl.envs.gymnasium.classic_control.carl_cartpole", "api/carl.envs.gymnasium.classic_control.carl_mountaincar", "api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous", "api/carl.envs.gymnasium.classic_control.carl_pendulum", "api/carl.envs.mario", "api/carl.envs.mario.level_image_gen", "api/carl.envs.mario.mario_game", "api/carl.envs.mario.models", "api/carl.envs.mario.reachabillity", "api/carl.envs.rna", "api/carl.envs.rna.carl_rna_definitions", "api/carl.envs.rna.parse_dot_brackets", "index", "source/api/autoapi_link", "source/api/index", "source/cite", "source/environments/benchmark_properties", "source/environments/carl_env", "source/environments/carlify", "source/environments/environment_families/box2d", "source/environments/environment_families/brax", "source/environments/environment_families/classic_control", "source/environments/environment_families/dmc", "source/environments/environment_families/index", "source/environments/environment_families/rna", "source/environments/environment_families/toad_gan", "source/environments/index", "source/getting_started/index", "source/getting_started/installation", "source/getting_started/quickstart", "source/license", "source/references"], "filenames": ["api.rst", "api/carl.envs.rst", "api/carl.envs.carl_env.rst", "api/carl.envs.gymnasium.rst", "api/carl.envs.gymnasium.carl_gymnasium_env.rst", "api/carl.envs.gymnasium.classic_control.rst", "api/carl.envs.gymnasium.classic_control.carl_acrobot.rst", "api/carl.envs.gymnasium.classic_control.carl_cartpole.rst", "api/carl.envs.gymnasium.classic_control.carl_mountaincar.rst", "api/carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.rst", "api/carl.envs.gymnasium.classic_control.carl_pendulum.rst", "api/carl.envs.mario.rst", "api/carl.envs.mario.level_image_gen.rst", "api/carl.envs.mario.mario_game.rst", "api/carl.envs.mario.models.rst", "api/carl.envs.mario.reachabillity.rst", "api/carl.envs.rna.rst", "api/carl.envs.rna.carl_rna_definitions.rst", "api/carl.envs.rna.parse_dot_brackets.rst", "index.rst", "source/api/autoapi_link.rst", "source/api/index.rst", "source/cite.rst", "source/environments/benchmark_properties.rst", "source/environments/carl_env.rst", "source/environments/carlify.rst", "source/environments/environment_families/box2d.rst", "source/environments/environment_families/brax.rst", "source/environments/environment_families/classic_control.rst", "source/environments/environment_families/dmc.rst", "source/environments/environment_families/index.rst", "source/environments/environment_families/rna.rst", "source/environments/environment_families/toad_gan.rst", "source/environments/index.rst", "source/getting_started/index.rst", "source/getting_started/installation.rst", "source/getting_started/quickstart.rst", "source/license.rst", "source/references.rst"], "titles": ["<no title>", "carl.envs", "carl.envs.carl_env", "carl.envs.gymnasium", "carl.envs.gymnasium.carl_gymnasium_env", "carl.envs.gymnasium.classic_control", "carl.envs.gymnasium.classic_control.carl_acrobot", "carl.envs.gymnasium.classic_control.carl_cartpole", "carl.envs.gymnasium.classic_control.carl_mountaincar", "carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous", "carl.envs.gymnasium.classic_control.carl_pendulum", "carl.envs.mario", "carl.envs.mario.level_image_gen", "carl.envs.mario.mario_game", "carl.envs.mario.models", "carl.envs.mario.reachabillity", "carl.envs.rna", "carl.envs.rna.carl_rna_definitions", "carl.envs.rna.parse_dot_brackets", "CARL- Contextually Adaptive Reinforcement Learning", "<no title>", "API Reference", "Citing CARL", "Benchmark Properties", "The CARL Environment", "CARLify your Environment", "CARL Box 2D Environments", "CARL Brax Environments", "CARL Classic Control Environments", "CARL DMC Environments", "Environment Families", "CARL RNA Design Environment", "CARL Mario Environment", "Environments", "Getting Started", "Installing CARL", "Quickstart", "License", "References"], "terms": {"check_spec": 1, "spec_nam": 1, "sourc": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 18], "check": [1, 15, 19], "spec": 1, "i": [1, 2, 12, 15, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 35, 37, 38], "instal": [1, 25, 31, 34], "paramet": [1, 2, 15, 18], "str": [1, 2, 3, 5, 6, 7, 8, 9, 10, 15, 18], "name": [1, 2, 18, 30], "packag": [1, 12], "necessari": 1, "environ": [1, 2, 3, 5, 6, 7, 8, 9, 10, 19, 21, 23, 34, 36, 38], "suit": [1, 28, 29, 33], "return": [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 15, 18], "whether": 1, "wa": 1, "found": [1, 15, 19, 36], "type": [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 15, 18, 26, 30], "bool": [1, 2, 15], "carlenv": [2, 4, 25], "context": [2, 3, 4, 5, 6, 7, 8, 9, 10, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 36], "none": [2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 26, 31, 32], "obs_context_featur": [2, 3, 4, 5, 6, 7, 8, 9, 10], "obs_context_as_dict": [2, 3, 4, 5, 6, 7, 8, 9, 10], "true": [2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 24], "context_selector": [2, 3, 4, 5, 6, 7, 8, 9, 10], "context_selector_kwarg": [2, 3, 4, 5, 6, 7, 8, 9, 10], "kwarg": [2, 3, 4, 5, 6, 7, 8, 9, 10], "base": [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 23, 28, 34, 37], "wrapper": [2, 25], "abc": [2, 13], "abstract": 2, "static": [2, 3, 5, 6, 7, 8, 9, 10], "get_context_featur": [2, 3, 5, 6, 7, 8, 9, 10], "get": [2, 3, 5, 6, 7, 8, 9, 10, 36], "featur": [2, 3, 5, 6, 7, 8, 9, 10, 19, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33], "defin": [2, 3, 5, 6, 7, 8, 9, 10, 19, 25, 36], "per": [2, 3, 5, 6, 7, 8, 9, 10, 24], "definit": [2, 3, 5, 6, 7, 8, 9, 10, 32], "dict": [2, 3, 5, 6, 7, 8, 9, 10, 24], "contextfeatur": [2, 3, 5, 6, 7, 8, 9, 10], "classmethod": 2, "get_context_spac": 2, "space": [2, 30, 33], "util": 2, "method": 2, "hold": 2, "inform": [2, 23, 24, 33], "about": [2, 19], "default": [2, 15, 18, 24, 25, 31, 36], "bound": [2, 23, 25, 31], "etc": 2, "contextspac": 2, "get_default_context": 2, "get_observation_spac": 2, "obs_context_feature_nam": 2, "observ": [2, 23, 24, 27, 30], "list": [2, 15, 18, 30, 31], "option": [2, 15, 18, 24, 25, 35, 36], "includ": [2, 15, 19, 23, 26, 27, 28, 29, 32, 35, 37], "If": [2, 15, 19, 22, 24, 25, 35], "we": [2, 23, 24, 25, 30, 35, 36, 37, 38], "add": [2, 25], "all": [2, 15, 21, 23, 25, 26, 27, 30, 33, 36, 37], "gymnasium": [2, 19, 24], "which": [2, 23, 25, 28, 30, 35, 37], "contain": [2, 15, 30, 31], "underli": [2, 31], "state": [2, 24, 33], "reset": 2, "seed": 2, "first": [2, 35, 36], "progress": [2, 23], "instanc": [2, 24], "e": [2, 23, 24, 25, 28, 29, 35], "select": [2, 30], "new": [2, 26, 30], "selector": 2, "Then": 2, "updat": [2, 23], "wrap": 2, "final": 2, "int": [2, 12, 15, 18, 26, 28, 31], "ani": [2, 12, 15, 19, 25, 36], "info": 2, "tupl": [2, 12, 15], "step": [2, 23, 25], "action": [2, 28, 30, 32, 33], "The": [2, 15, 18, 19, 22, 23, 26, 27, 28, 29, 32, 33, 35], "ad": [2, 23], "rewar": 2, "termin": 2, "truncat": 2, "supportsfloat": 2, "class": [3, 5, 25, 26, 27, 28, 31, 32], "carlacrobot": [3, 5, 6], "carlgymnasiumenv": [3, 4, 5, 6, 7, 8, 9, 10], "carlcartpol": [3, 5, 7, 24], "carlmountaincar": [3, 5, 8, 23], "carlmountaincarcontinu": [3, 5, 9], "carlpendulum": [3, 5, 10], "levelimagegen": 12, "sprite_path": 12, "object": [12, 27, 29], "gener": [12, 15, 18, 19, 23, 24, 30, 32, 35, 38], "pil": 12, "imag": 12, "file": [12, 37], "from": [12, 15, 18, 23, 24, 27, 28, 29, 30, 36, 38], "super": [12, 30, 32], "bro": [12, 32], "ascii": [12, 15], "level": [12, 15, 19, 30, 32, 38], "initi": 12, "onc": 12, "us": [12, 15, 18, 22, 23, 24, 28, 29, 35, 36, 37, 38], "render": 12, "prepare_sprite_and_box": 12, "ascii_level": 12, "sprite_kei": 12, "curr_x": 12, "curr_i": 12, "helper": 12, "make": [12, 19, 24, 25, 35, 37], "correct": 12, "sprite": 12, "size": [12, 23], "draw": 12, "some": 12, "ar": [12, 15, 23, 25, 26, 27, 28, 30, 35], "bigger": 12, "than": 12, "one": [12, 23, 24, 28], "tile": [12, 15], "need": [12, 23, 25, 27, 29, 35], "adjust": 12, "them": [12, 19, 25, 26, 38], "assum": 12, "background": 12, "sky": 12, "modul": 12, "opt": 12, "hostedtoolcach": 12, "python": [12, 35], "3": [12, 25, 26, 30, 32, 35], "9": [12, 24, 26, 27, 28, 30, 32, 35], "17": [12, 26, 30], "x64": 12, "lib": 12, "python3": 12, "site": 12, "py": 12, "mariogam": 13, "check_block": 15, "j": 15, "dh": 15, "dv": 15, "right": [15, 28], "given": [15, 27, 28, 30, 31], "posit": [15, 28], "direct": [15, 27, 28], "blockad": 15, "exist": 15, "rang": [15, 23], "specifi": [15, 18], "param": 15, "form": [15, 24], "x": 15, "coordin": 15, "start": [15, 36], "y": 15, "amount": [15, 28], "block": 15, "horizont": 15, "point": [15, 35], "algorithm": 15, "tri": 15, "jump": [15, 30, 32], "vertic": 15, "rtype": 15, "valu": [15, 19, 24], "max": 15, "otherwis": 15, "mark": 15, "reachability_map": 15, "check_outsid": 15, "fals": [15, 24], "For": [15, 35, 36, 38], "thi": [15, 19, 21, 23, 24, 26, 28, 30, 31, 35, 36, 37], "reachabl": 15, "collect": 15, "further": [15, 23], "slice": 15, "string": 15, "each": [15, 23, 24, 26, 30, 36], "row": 15, "map": 15, "current": [15, 30, 31], "where": [15, 19, 23, 30], "should": [15, 24, 25, 26], "indic": 15, "player": 15, "can": [15, 23, 24, 26, 27, 30, 32, 35, 36], "reach": [15, 27], "outsid": 15, "A": [15, 24, 27, 38], "boolean": 15, "shape": [15, 23], "has_mario": 15, "has_flag": 15, "creat": [15, 19, 24, 25, 35, 36], "numpi": 15, "2d": [15, 30], "arrai": [15, 26, 32], "everi": [15, 30], "solid": 15, "have": [15, 19, 23, 25, 26, 35], "1": [15, 23, 24, 25, 26, 27, 28, 30, 31, 32, 36], "stand": 15, "0": [15, 24, 26, 27, 28, 30, 31, 32, 36, 37], "els": 15, "ignor": 15, "sprint": 15, "without": [15, 23], "flag": 15, "As": [15, 27], "expect": 15, "ha": [15, 27, 28, 30, 32], "set": [15, 24, 30, 35, 36], "search": 15, "determin": 15, "playabl": 15, "via": [15, 26, 27, 35], "ndarrai": 15, "an": [15, 18, 19, 21, 24, 25, 27, 28, 29, 30, 33, 37], "unreach": 15, "denot": 15, "finish": 15, "remove_ignor": 15, "replac": 15, "token": 15, "empti": 15, "In": [15, 19, 24, 26, 27, 28, 29, 30, 31, 35, 36], "case": [15, 22, 28], "below": [15, 23, 30], "thei": [15, 19, 23, 24, 37], "also": [15, 19, 23, 24, 27, 28], "dataset": [18, 30, 31, 38], "data_dir": 18, "target_structure_id": [18, 31], "target_structure_path": 18, "target": [18, 27], "next": 18, "epoch": 18, "benchmark": [18, 19, 30, 33, 38], "directori": 18, "structur": [18, 30, 31], "union": 18, "specif": [18, 23, 38], "id": [18, 24], "pecifi": 18, "path": 18, "welcom": 19, "document": 19, "librari": 19, "extend": [19, 23, 24, 30, 38], "well": [19, 23, 25, 26, 27, 28, 31, 33, 38], "known": 19, "rl": [19, 23], "easili": 19, "configur": [19, 23], "test": [19, 35], "robust": [19, 23], "feel": [19, 25], "free": [19, 25], "out": 19, "our": [19, 23, 36, 38], "paper": [19, 38], "blog": 19, "post": 19, "chang": [19, 23, 24, 25, 36], "goal": [19, 23, 28, 29, 30], "dynam": [19, 23, 24, 26, 30, 31], "interact": [19, 36], "interv": 19, "pendulum": [19, 30], "exampl": [19, 23, 24, 36, 38], "muhc": 19, "easier": [19, 24], "harder": 19, "same": 19, "composit": [19, 23], "mario": [19, 33, 35, 37], "so": [19, 24, 35], "tool": 19, "variat": [19, 26, 31], "contrast": 19, "other": [19, 23, 35, 36, 38], "approach": 19, "like": [19, 23, 24, 26, 27, 30, 35, 36], "procedur": [19, 30, 32], "howev": 19, "control": [19, 26, 27, 29, 32, 33, 35], "user": [19, 24], "That": 19, "mean": [19, 23], "full": [19, 23, 24, 35], "over": [19, 30], "difficulti": 19, "degre": 19, "your": [19, 22, 31, 33, 36], "wai": [19, 24], "gain": 19, "detail": [19, 23], "insight": [19, 38], "capabl": [19, 30], "agent": [19, 23, 24, 27, 28, 29, 30, 31, 32, 36], "excel": 19, "fail": 19, "help": 19, "find": [19, 33], "answer": 19, "re": 19, "interest": [19, 25], "more": [19, 24, 36], "corrspond": 19, "With": [19, 23, 30], "train": [19, 24, 26, 27], "distribut": [19, 23], "across": [19, 24], "differ": [19, 23, 24, 26, 30], "favorit": 19, "short": [19, 25], "cartpol": [19, 30], "pole": [19, 28, 36], "polici": 19, "transfer": 19, "longer": [19, 36], "ones": [19, 23], "lunarland": [19, 30], "moon": 19, "graviti": [19, 24, 27, 28, 30], "see": [19, 36, 37], "land": [19, 26], "mar": 19, "uniform": 19, "floor": [19, 29], "friction": [19, 24, 26, 27, 28, 29, 30], "halfcheetah": [19, 30], "mani": 19, "simpli": [19, 28], "decid": 19, "task": [19, 26, 28, 30], "want": [19, 25, 28, 35], "solv": [19, 32], "choos": [19, 24, 30, 35], "": [19, 24, 26, 27, 28, 29, 30, 32, 36], "vari": [19, 25, 26, 27], "just": [19, 36], "develop": [19, 35], "http": [19, 35], "www": 19, "automl": [19, 35], "org": 19, "contribut": 19, "issu": 19, "pleas": [19, 22], "visit": 19, "github": [19, 35], "page": [19, 21], "com": [19, 35], "give": [21, 24], "overview": [21, 24, 33], "carl": [21, 23, 25, 30, 33, 34, 36, 37, 38], "you": [22, 25, 31, 33, 35, 36], "research": [22, 23, 37], "u": [22, 25], "follow": [22, 23, 30, 32], "bibtex": 22, "entri": 22, "inproceed": 22, "beneim2021a": 22, "author": 22, "carolin": 22, "benjamin": 22, "theresa": 22, "eimer": 22, "frederik": 22, "schubert": 22, "aditya": 22, "mohan": 22, "sebastian": 22, "d\u00f6hler": 22, "andr\u00e9": 22, "biedenkapp": 22, "bodo": 22, "rosenhahn": 22, "frank": 22, "hutter": 22, "mariu": 22, "lindauer": 22, "titl": 22, "contextu": [22, 30, 38], "me": 22, "reinforc": [22, 38], "learn": [22, 24, 27, 29, 30, 38], "journal": 22, "transact": 22, "machin": 22, "year": 22, "2023": 22, "discuss": 23, "summar": 23, "figur": 23, "most": [23, 26], "vector": 23, "either": [23, 24, 28], "notabl": 23, "except": 23, "here": [23, 24, 25, 26, 27, 28, 33], "carlvehiclerac": 23, "carltoadgan": 23, "exclus": [23, 35], "pixel": 23, "onli": [23, 24, 28, 35], "two": [23, 28], "variabl": 23, "299": 23, "carlhumanoid": [23, 30], "provid": [23, 24, 25, 26, 30, 31, 32], "both": [23, 28], "discret": [23, 28, 30], "continu": [23, 26, 28], "six": 23, "requir": [23, 25, 35], "ten": 23, "number": [23, 30], "singl": [23, 38], "19": [23, 26, 30], "cover": 23, "kind": 23, "signal": 23, "rel": 23, "spars": 23, "penalti": 23, "style": [23, 38], "receiv": 23, "complex": [23, 31], "function": [23, 24], "g": [23, 24, 25, 28, 29, 35], "brax": [23, 24, 33, 35, 38], "latter": 23, "version": [23, 28, 35], "quit": 23, "factor": 23, "movement": 23, "economi": 23, "toward": 23, "wherea": 23, "former": 23, "doe": 23, "let": 23, "distinguish": 23, "between": [23, 24], "transit": [23, 24], "look": 23, "whole": 23, "episod": [23, 24, 36], "sentenc": 23, "could": [23, 25], "drop": 23, "carlcartpoleenv": [23, 24, 30, 36], "carlvehicleracingenv": [23, 30], "while": [23, 36], "possibl": [23, 26, 29, 30, 35], "seen": 23, "famili": [23, 33], "depend": [23, 35], "influenc": [23, 30], "Of": 23, "131": 23, "regist": 23, "98": 23, "5": [23, 26, 27, 28, 30, 31, 32], "87": 23, "rest": 23, "categor": [23, 26, 32], "explicit": 23, "avail": [23, 24], "lend": 23, "self": 23, "studi": 23, "nois": [23, 24, 32], "top": [23, 28, 38], "sampl": 23, "part": 23, "enabl": 23, "better": 23, "compar": 23, "reproduc": 23, "futur": 23, "effort": 23, "realm": 23, "standard": 24, "interfac": [24, 36], "reward": [24, 27, 30, 33], "greater": 24, "challeng": [24, 31], "dure": 24, "therefor": [24, 28], "encount": 24, "exemplarili": 24, "show": 24, "how": [24, 27, 30, 33], "fetch": [24, 30], "embed": 24, "instanti": 24, "achiev": 24, "brief": 24, "work": [24, 33, 35, 37, 38], "take": 24, "dictionari": 24, "kei": 24, "pair": 24, "carlant": [24, 30], "ant_default": 24, "joint_stiff": [24, 27], "5000": [24, 27], "8": [24, 26, 27, 28, 30, 32], "6": [24, 26, 27, 28, 30, 32], "angular_damp": [24, 27], "05": [24, 27, 28], "actuator_strength": [24, 27], "300": [24, 27], "joint_angular_damp": [24, 27], "35": [24, 27], "torso_mass": [24, 27], "10": [24, 26, 27, 28, 30, 32], "compris": 24, "least": 24, "It": [24, 25], "identifi": 24, "meaning": 24, "simpl": 24, "would": [24, 25], "src": [24, 35, 36], "env": [24, 30, 35, 36], "import": [24, 36], "carlcartpoleenv_default": [24, 36], "longer_pol": [24, 36], "copi": [24, 36], "pole_length": [24, 28, 36], "2": [24, 25, 26, 27, 28, 30, 32, 36, 37], "round": 24, "robin": 24, "fashion": 24, "hidden": 24, "complet": 24, "hide_context": 24, "By": 24, "visibl": 24, "concaten": 24, "onto": 24, "separ": 24, "though": [24, 28], "dict_observation_spac": 24, "furthermor": 24, "subset": 24, "state_context_featur": 24, "normal": 24, "augment": [24, 30], "difficult": 24, "addit": [24, 25, 34], "append": 24, "changing_context_featur": 24, "think": 25, "guid": [25, 32], "what": [25, 36], "do": [25, 36], "child": 25, "implement": 25, "setup": 25, "mutabl": 25, "cfg": 25, "sure": 25, "those": 25, "reflect": 25, "readm": 25, "especi": 25, "extra": 25, "data": [25, 31, 35], "download": [25, 35], "process": [25, 31, 38], "4": [25, 26, 28, 30, 32], "pr": 25, "main": 25, "branch": 25, "ll": [25, 33], "review": 25, "try": 25, "clarifi": 25, "open": 25, "question": 25, "know": 25, "good": 25, "fit": 25, "don": 25, "t": [25, 28], "hesit": 25, "contact": 25, "openai": [26, 28, 30, 36, 38], "gym": [26, 28, 30, 35, 36, 38], "box2d": [26, 33, 35], "carrac": [26, 30], "own": [26, 30, 36], "modif": [26, 30], "vehicl": [26, 30], "race": [26, 30], "biped": 26, "robot": [26, 27, 29], "walk": [26, 27, 29], "properti": [26, 27, 30, 33], "walker": [26, 30], "bodi": [26, 27, 38], "surround": 26, "physic": [26, 27, 28, 29, 30, 38], "simul": [26, 28, 29, 38], "fp": 26, "50": [26, 27], "500": 26, "float": [26, 27, 28, 31, 32], "scale": [26, 38], "30": 26, "100": [26, 27, 28], "gravity_x": 26, "20": [26, 27, 30], "gravity_i": 26, "01": [26, 27, 28], "terrain_step": 26, "4666666666666667": 26, "25": 26, "terrain_length": 26, "200": 26, "terrain_height": 26, "terrain_grass": 26, "15": [26, 27], "terrain_startpad": 26, "motors_torqu": 26, "80": 26, "speed_hip": 26, "1e": [26, 28], "06": [26, 28], "speed_kne": 26, "lidar_rang": 26, "333333333333333": 26, "leg_down": 26, "26666666666666666": 26, "leg_w": 26, "leg_h": 26, "1333333333333333": 26, "initial_random": 26, "viewport_w": 26, "600": 26, "400": 26, "1000": 26, "viewport_h": 26, "800": 26, "lunar": 26, "lander": 26, "safe": 26, "navig": 26, "its": [26, 27, 30, 36], "pad": 26, "manipul": 26, "main_engine_pow": 26, "13": [26, 30, 32], "side_engine_pow": 26, "2000": 26, "leg_awai": 26, "18": [26, 30], "leg_spring_torqu": 26, "40": 26, "side_engine_height": 26, "14": [26, 30], "side_engine_awai": 26, "12": [26, 28, 30, 32], "around": 26, "track": [26, 38], "There": [26, 28], "car": [26, 28], "street": 26, "bu": 26, "front": 26, "back": 26, "wheel": 26, "drive": 26, "small": 26, "larg": [26, 38], "trailer": 26, "29": [26, 30], "total": 26, "7": [26, 30, 32], "11": [26, 30, 32], "16": [26, 30], "21": 26, "22": 26, "23": 26, "24": [26, 30], "26": 26, "27": 26, "28": [26, 28, 30], "locomot": [27, 30], "extern": 27, "intern": [27, 30], "joint": [27, 28, 30], "strength": [27, 30], "torso": [27, 30], "mass": [27, 28, 30], "four": 27, "leg": 27, "order": [27, 28, 35], "run": [27, 30, 35, 37], "quickli": 27, "inf": [27, 28, 30, 31], "dog": 27, "locat": 27, "radiu": 27, "distanc": 27, "target_radiu": 27, "target_dist": 27, "pick": 27, "up": [27, 28], "hand": 27, "three": 27, "when": 27, "apart": 27, "pyhisc": 27, "height": [27, 28], "target_height": 27, "15000": 27, "457333": 27, "forward": [27, 29, 32], "907463": 27, "move": [27, 28, 29, 32], "arm": 27, "end": [27, 28, 32], "effector": 27, "sequenc": [27, 31, 35], "40000": 27, "81": 27, "360": 27, "02": [27, 28], "problem": [28, 31], "consist": 28, "swing": 28, "invert": 28, "balanc": 28, "random": 28, "forc": 28, "appli": 28, "max_spe": 28, "dt": 28, "m": 28, "l": 28, "similarli": 28, "ask": 28, "upright": 28, "time": 28, "doesn": 28, "directli": 28, "cart": 28, "ist": 28, "place": 28, "left": 28, "masscart": 28, "masspol": 28, "force_magnifi": 28, "update_interv": 28, "002": 28, "anoth": 28, "being": 28, "lower": 28, "link": 28, "accomplish": 28, "actuat": 28, "connect": 28, "link_length_1": 28, "link_length_2": 28, "link_mass_1": 28, "link_mass_2": 28, "link_com_1": 28, "link_com_2": 28, "link_moi": 28, "max_velocity_1": 28, "566370614359172": 28, "2566370614359172": 28, "125": 28, "66370614359172": 28, "max_velocity_2": 28, "274333882308138": 28, "827433388230814": 28, "282": [28, 30], "7433388230814": 28, "torque_noise_max": 28, "steep": 28, "slope": 28, "succe": 28, "acceler": 28, "opposit": 28, "min_posit": 28, "max_posit": 28, "07": 28, "goal_posit": 28, "goal_veloc": 28, "001": 28, "0025": 28, "start_posit": 28, "start_position_std": 28, "start_veloc": 28, "start_velocity_std": 28, "And": 28, "45": 28, "power": 28, "0015": 28, "min_position_start": 28, "max_position_start": 28, "min_velocity_start": 28, "max_velocity_start": 28, "deepmind": [29, 33], "mujoco": 29, "engin": [29, 38], "spin": 29, "swim": 29, "effici": 29, "suppos": 29, "fast": 29, "sever": 30, "analyz": 30, "behavior": 30, "although": 30, "mechan": 30, "acrobot": 30, "mountaincar": 30, "bipedalwalk": 30, "box": 30, "vehiclerac": 30, "expos": 30, "ant": 30, "grasp": 30, "humanoid": 30, "ur5": 30, "dmc": 30, "finger": 30, "fish": 30, "quadrup": 30, "toad": [30, 37, 38], "gan": [30, 37, 38], "n": [30, 35], "game": [30, 37], "similar": 30, "rnadesign": 30, "constraint": [30, 31], "ob": 30, "classic_control": 30, "carlmountaincarenv": 30, "float32": 30, "carlpendulumenv": 30, "carlacrobotenv": 30, "274333953857422": 30, "74334716796875": 30, "4028234663852886e": 30, "38": 30, "carlmountaincarcontinuousenv": 30, "carllunarlanderenv": 30, "255": 30, "96": 30, "uint8": 30, "carlbipedalwalkerenv": 30, "44": 30, "94": 30, "carlhalfcheetah": 30, "304": 30, "carlfetch": 30, "110": 30, "carlgrasp": 30, "141": 30, "carlur5": 30, "75": 30, "carldmcfishenv": 30, "float64": 30, "carldmcfingerenv": 30, "carldmcquadrupedenv": 30, "78": 30, "carldmcwalkerenv": 30, "carlrnadesignenv": 30, "carlmarioenv": 30, "64": 30, "under": [31, 37], "mainten": 31, "cannot": 31, "thank": 31, "patienc": 31, "learna": [31, 35], "attempt": 31, "match": 31, "veri": 31, "due": 31, "biolog": 31, "wealth": 31, "real": 31, "world": 31, "mutation_threshold": 31, "reward_expon": 31, "state_radiu": 31, "eterna": 31, "rfam_taneda": 31, "toadgan": [32, 35], "inspir": 32, "nintendo": [32, 37], "charact": 32, "through": 32, "coin": 32, "enemi": 32, "accord": 32, "soon": 32, "arriv": 32, "Its": 32, "backward": 32, "level_index": 32, "mario_st": 32, "mario_inertia": 32, "89": 32, "basic": 33, "classic": [33, 35], "rna": [33, 35, 38], "design": [33, 38], "tabl": 33, "qualiti": 33, "carlifi": 33, "window": 34, "mac": 34, "quickstart": 34, "clone": 35, "repositori": [35, 36], "git": 35, "cd": 35, "recommend": [35, 38], "virtual": 35, "conda": 35, "activ": 35, "pip": 35, "bos2d": 35, "To": [35, 36], "addition": 35, "javac": 35, "ai": [35, 37], "framework": [35, 37], "java": 35, "plan": 35, "These": 35, "instruct": 35, "might": 35, "fulli": 35, "system": 35, "been": 35, "c": 35, "forg": 35, "linux": 35, "aim": 35, "keep": 35, "compat": 35, "now": 36, "demonstr": 36, "notebook": 36, "creation": 36, "section": 36, "fall": 37, "apach": 37, "permit": 37, "carlmario": 37, "gui": 37, "mit": 37, "turn": 37, "origin": 37, "replica": 37, "explicitli": 37, "built": [37, 38], "purpos": 37, "copyright": 37, "notic": 37, "brockman": 38, "et": 38, "al": 38, "2016": 38, "arxiv": 38, "preprint": 38, "1606": 38, "01540": 38, "differenti": 38, "rigid": 38, "freeman": 38, "neurip": 38, "2021": 38, "coher": 38, "awiszu": 38, "aiid": 38, "2020": 38, "rung": 38, "icrl": 38, "2019": 38, "crl": 38, "markov": 38, "decis": 38, "hallak": 38, "corr": 38, "2015": 38, "survei": 38, "generalis": 38, "deep": 38, "kirk": 38}, "objects": {"carl": [[1, 0, 0, "-", "envs"]], "carl.envs": [[2, 0, 0, "-", "carl_env"], [1, 3, 1, "", "check_spec"], [3, 0, 0, "-", "gymnasium"], [11, 0, 0, "-", "mario"], [16, 0, 0, "-", "rna"]], "carl.envs.carl_env": [[2, 1, 1, "", "CARLEnv"]], "carl.envs.carl_env.CARLEnv": [[2, 2, 1, "", "get_context_features"], [2, 2, 1, "", "get_context_space"], [2, 2, 1, "", "get_default_context"], [2, 2, 1, "", "get_observation_space"], [2, 2, 1, "", "reset"], [2, 2, 1, "", "step"]], "carl.envs.gymnasium": [[3, 1, 1, "", "CARLAcrobot"], [3, 1, 1, "", "CARLCartPole"], [3, 1, 1, "", "CARLMountainCar"], [3, 1, 1, "", "CARLMountainCarContinuous"], [3, 1, 1, "", "CARLPendulum"], [4, 0, 0, "-", "carl_gymnasium_env"], [5, 0, 0, "-", "classic_control"]], "carl.envs.gymnasium.CARLAcrobot": [[3, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.CARLCartPole": [[3, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.CARLMountainCar": [[3, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.CARLMountainCarContinuous": [[3, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.CARLPendulum": [[3, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.carl_gymnasium_env": [[4, 1, 1, "", "CARLGymnasiumEnv"]], "carl.envs.gymnasium.classic_control": [[5, 1, 1, "", "CARLAcrobot"], [5, 1, 1, "", "CARLCartPole"], [5, 1, 1, "", "CARLMountainCar"], [5, 1, 1, "", "CARLMountainCarContinuous"], [5, 1, 1, "", "CARLPendulum"], [6, 0, 0, "-", "carl_acrobot"], [7, 0, 0, "-", "carl_cartpole"], [8, 0, 0, "-", "carl_mountaincar"], [9, 0, 0, "-", "carl_mountaincarcontinuous"], [10, 0, 0, "-", "carl_pendulum"]], "carl.envs.gymnasium.classic_control.CARLAcrobot": [[5, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.CARLCartPole": [[5, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.CARLMountainCar": [[5, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.CARLMountainCarContinuous": [[5, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.CARLPendulum": [[5, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.carl_acrobot": [[6, 1, 1, "", "CARLAcrobot"]], "carl.envs.gymnasium.classic_control.carl_acrobot.CARLAcrobot": [[6, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.carl_cartpole": [[7, 1, 1, "", "CARLCartPole"]], "carl.envs.gymnasium.classic_control.carl_cartpole.CARLCartPole": [[7, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.carl_mountaincar": [[8, 1, 1, "", "CARLMountainCar"]], "carl.envs.gymnasium.classic_control.carl_mountaincar.CARLMountainCar": [[8, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous": [[9, 1, 1, "", "CARLMountainCarContinuous"]], "carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.CARLMountainCarContinuous": [[9, 2, 1, "", "get_context_features"]], "carl.envs.gymnasium.classic_control.carl_pendulum": [[10, 1, 1, "", "CARLPendulum"]], "carl.envs.gymnasium.classic_control.carl_pendulum.CARLPendulum": [[10, 2, 1, "", "get_context_features"]], "carl.envs.mario": [[12, 0, 0, "-", "level_image_gen"], [13, 0, 0, "-", "mario_game"], [14, 0, 0, "-", "models"], [15, 0, 0, "-", "reachabillity"]], "carl.envs.mario.level_image_gen": [[12, 1, 1, "", "LevelImageGen"]], "carl.envs.mario.level_image_gen.LevelImageGen": [[12, 2, 1, "", "prepare_sprite_and_box"], [12, 2, 1, "", "render"]], "carl.envs.mario.mario_game": [[13, 1, 1, "", "MarioGame"]], "carl.envs.mario.reachabillity": [[15, 3, 1, "", "check_blocked"], [15, 3, 1, "", "mark"], [15, 3, 1, "", "reachability_map"], [15, 3, 1, "", "remove_ignored"]], "carl.envs.rna": [[17, 0, 0, "-", "carl_rna_definitions"], [18, 0, 0, "-", "parse_dot_brackets"]], "carl.envs.rna.parse_dot_brackets": [[18, 3, 1, "", "parse_dot_brackets"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "function", "Python function"]}, "titleterms": {"carl": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 24, 26, 27, 28, 29, 31, 32, 35], "env": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "function": [1, 15, 18], "interfac": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], "modul": [1, 3, 5, 11, 14, 16], "carl_env": 2, "class": [2, 4, 6, 7, 8, 9, 10, 12, 13], "gymnasium": [3, 4, 5, 6, 7, 8, 9, 10], "carl_gymnasium_env": 4, "classic_control": [5, 6, 7, 8, 9, 10], "carl_acrobot": 6, "carl_cartpol": 7, "carl_mountaincar": 8, "carl_mountaincarcontinu": 9, "carl_pendulum": 10, "mario": [11, 12, 13, 14, 15, 30, 32], "level_image_gen": 12, "mario_gam": 13, "model": 14, "reachabil": 15, "rna": [16, 17, 18, 30, 31], "carl_rna_definit": 17, "parse_dot_bracket": 18, "contextu": 19, "adapt": 19, "reinforc": 19, "learn": 19, "what": 19, "i": 19, "context": [19, 23], "can": 19, "you": 19, "do": 19, "contact": 19, "api": 21, "refer": [21, 38], "cite": 22, "benchmark": 23, "properti": 23, "state": 23, "space": 23, "action": 23, "qualiti": 23, "reward": 23, "The": 24, "environ": [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35], "carlifi": 25, "your": 25, "box": 26, "2d": 26, "bipedalwalk": 26, "default": [26, 27, 28, 32], "bound": [26, 27, 28, 32], "lunarland": 26, "vehiclerac": 26, "brax": [27, 30], "ant": 27, "fetch": 27, "grasp": 27, "halfcheetah": 27, "humanoid": 27, "ur5": 27, "classic": [28, 30], "control": [28, 30], "pendulum": 28, "cartpol": 28, "acrobot": 28, "mountaincar": 28, "dmc": 29, "finger": 29, "fish": 29, "quadrup": 29, "walker": 29, "famili": 30, "box2d": 30, "deepmind": 30, "suit": 30, "design": [30, 31], "overview": 30, "tabl": 30, "get": 34, "start": 34, "instal": 35, "base": 35, "addit": 35, "window": 35, "mac": 35, "quickstart": 36, "licens": 37}, "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": 58}, "alltitles": {"carl.envs": [[1, "module-carl.envs"]], "Functions": [[1, "functions"], [15, "functions"], [18, "functions"]], "Interfaces": [[1, "interfaces"], [2, "interfaces"], [3, "interfaces"], [4, "interfaces"], [5, "interfaces"], [6, "interfaces"], [7, "interfaces"], [8, "interfaces"], [9, "interfaces"], [10, "interfaces"], [11, "interfaces"], [12, "interfaces"], [13, "interfaces"], [14, "interfaces"], [15, "interfaces"], [16, "interfaces"], [17, "interfaces"], [18, "interfaces"]], "Modules": [[1, "modules"], [3, "modules"], [5, "modules"], [11, "modules"], [14, "modules"], [16, "modules"]], "carl.envs.carl_env": [[2, "module-carl.envs.carl_env"]], "Classes": [[2, "classes"], [4, "classes"], [6, "classes"], [7, "classes"], [8, "classes"], [9, "classes"], [10, "classes"], [12, "classes"], [13, "classes"]], "carl.envs.gymnasium": [[3, "module-carl.envs.gymnasium"]], "carl.envs.gymnasium.carl_gymnasium_env": [[4, "module-carl.envs.gymnasium.carl_gymnasium_env"]], "carl.envs.gymnasium.classic_control": [[5, "module-carl.envs.gymnasium.classic_control"]], "carl.envs.gymnasium.classic_control.carl_acrobot": [[6, "module-carl.envs.gymnasium.classic_control.carl_acrobot"]], "carl.envs.gymnasium.classic_control.carl_cartpole": [[7, "module-carl.envs.gymnasium.classic_control.carl_cartpole"]], "carl.envs.gymnasium.classic_control.carl_mountaincar": [[8, "module-carl.envs.gymnasium.classic_control.carl_mountaincar"]], "carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous": [[9, "module-carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous"]], "carl.envs.gymnasium.classic_control.carl_pendulum": [[10, "module-carl.envs.gymnasium.classic_control.carl_pendulum"]], "carl.envs.mario": [[11, "module-carl.envs.mario"]], "carl.envs.mario.level_image_gen": [[12, "module-carl.envs.mario.level_image_gen"]], "carl.envs.mario.mario_game": [[13, "module-carl.envs.mario.mario_game"]], "carl.envs.mario.models": [[14, "module-carl.envs.mario.models"]], "carl.envs.mario.reachabillity": [[15, "module-carl.envs.mario.reachabillity"]], "carl.envs.rna": [[16, "module-carl.envs.rna"]], "carl.envs.rna.carl_rna_definitions": [[17, "module-carl.envs.rna.carl_rna_definitions"]], "carl.envs.rna.parse_dot_brackets": [[18, "module-carl.envs.rna.parse_dot_brackets"]], "CARL- Contextually Adaptive Reinforcement Learning": [[19, "carl-contextually-adaptive-reinforcement-learning"]], "What is Context?": [[19, "what-is-context"]], "What can you do with CARL?": [[19, "what-can-you-do-with-carl"]], "Contact": [[19, "contact"]], "API Reference": [[21, "api-reference"]], "Citing CARL": [[22, "citing-carl"]], "Benchmark Properties": [[23, "benchmark-properties"]], "State Space": [[23, "state-space"]], "Action Space": [[23, "action-space"]], "Quality of Reward": [[23, "quality-of-reward"]], "Context Spaces": [[23, "context-spaces"]], "The CARL Environment": [[24, "the-carl-environment"]], "CARLify your Environment": [[25, "carlify-your-environment"]], "CARL Box 2D Environments": [[26, "carl-box-2d-environments"]], "CARL BipedalWalker Environment": [[26, "carl-bipedalwalker-environment"]], "Defaults and Bounds": [[26, "id1"], [26, "id2"], [26, "id3"], [27, "id1"], [27, "id2"], [27, "id3"], [27, "id4"], [27, "id5"], [27, "id6"], [28, "id1"], [28, "id2"], [28, "id3"], [28, "id4"], [28, "id5"], [32, "id1"]], "CARL LunarLander Environment": [[26, "carl-lunarlander-environment"]], "CARL VehicleRacing Environment": [[26, "carl-vehicleracing-environment"]], "CARL Brax Environments": [[27, "carl-brax-environments"]], "CARL Ant Environment": [[27, "carl-ant-environment"]], "CARL Fetch Environment": [[27, "carl-fetch-environment"]], "CARL Grasp Environment": [[27, "carl-grasp-environment"]], "CARL Halfcheetah Environment": [[27, "carl-halfcheetah-environment"]], "CARL Humanoid Environment": [[27, "carl-humanoid-environment"]], "CARL UR5e Environment": [[27, "carl-ur5e-environment"]], "CARL Classic Control Environments": [[28, "carl-classic-control-environments"]], "CARL Pendulum Environment": [[28, "carl-pendulum-environment"]], "CARL CartPole Environment": [[28, "carl-cartpole-environment"]], "CARL Acrobot Environment": [[28, "carl-acrobot-environment"]], "CARL MountainCar Environment": [[28, "carl-mountaincar-environment"]], "CARL DMC Environments": [[29, "carl-dmc-environments"]], "CARL DMC Finger Environment": [[29, "carl-dmc-finger-environment"]], "CARL DMC Fish Environment": [[29, "carl-dmc-fish-environment"]], "CARL DMC Quadruped Environment": [[29, "carl-dmc-quadruped-environment"]], "CARL DMC Walker Environment": [[29, "carl-dmc-walker-environment"]], "Environment Families": [[30, "environment-families"]], "Classic Control": [[30, "classic-control"]], "Box2D": [[30, "box2d"]], "Brax": [[30, "brax"]], "DeepMind Control Suite": [[30, "deepmind-control-suite"]], "Mario": [[30, "mario"]], "RNA Design": [[30, "rna-design"]], "Overview Table": [[30, "overview-table"]], "CARL RNA Design Environment": [[31, "carl-rna-design-environment"]], "CARL Mario Environment": [[32, "carl-mario-environment"]], "Environments": [[33, "environments"]], "Getting Started": [[34, "getting-started"]], "Installing CARL": [[35, "installing-carl"]], "Base Installation": [[35, "base-installation"]], "Additional Environments": [[35, "additional-environments"]], "CARL on Windows & MAC": [[35, "carl-on-windows-mac"]], "Quickstart": [[36, "quickstart"]], "License": [[37, "license"]], "References": [[38, "references"]]}, "indexentries": {"carl.envs": [[1, "module-carl.envs"]], "check_spec() (in module carl.envs)": [[1, "carl.envs.check_spec"]], "module": [[1, "module-carl.envs"], [2, "module-carl.envs.carl_env"], [3, "module-carl.envs.gymnasium"], [4, "module-carl.envs.gymnasium.carl_gymnasium_env"], [5, "module-carl.envs.gymnasium.classic_control"], [6, "module-carl.envs.gymnasium.classic_control.carl_acrobot"], [7, "module-carl.envs.gymnasium.classic_control.carl_cartpole"], [8, "module-carl.envs.gymnasium.classic_control.carl_mountaincar"], [9, "module-carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous"], [10, "module-carl.envs.gymnasium.classic_control.carl_pendulum"], [11, "module-carl.envs.mario"], [12, "module-carl.envs.mario.level_image_gen"], [13, "module-carl.envs.mario.mario_game"], [14, "module-carl.envs.mario.models"], [15, "module-carl.envs.mario.reachabillity"], [16, "module-carl.envs.rna"], [17, "module-carl.envs.rna.carl_rna_definitions"], [18, "module-carl.envs.rna.parse_dot_brackets"]], "carlenv (class in carl.envs.carl_env)": [[2, "carl.envs.carl_env.CARLEnv"]], "carl.envs.carl_env": [[2, "module-carl.envs.carl_env"]], "get_context_features() (carl.envs.carl_env.carlenv static method)": [[2, "carl.envs.carl_env.CARLEnv.get_context_features"]], "get_context_space() (carl.envs.carl_env.carlenv class method)": [[2, "carl.envs.carl_env.CARLEnv.get_context_space"]], "get_default_context() (carl.envs.carl_env.carlenv class method)": [[2, "carl.envs.carl_env.CARLEnv.get_default_context"]], "get_observation_space() (carl.envs.carl_env.carlenv method)": [[2, "carl.envs.carl_env.CARLEnv.get_observation_space"]], "reset() (carl.envs.carl_env.carlenv method)": [[2, "carl.envs.carl_env.CARLEnv.reset"]], "step() (carl.envs.carl_env.carlenv method)": [[2, "carl.envs.carl_env.CARLEnv.step"]], "carlacrobot (class in carl.envs.gymnasium)": [[3, "carl.envs.gymnasium.CARLAcrobot"]], "carlcartpole (class in carl.envs.gymnasium)": [[3, "carl.envs.gymnasium.CARLCartPole"]], "carlmountaincar (class in carl.envs.gymnasium)": [[3, "carl.envs.gymnasium.CARLMountainCar"]], "carlmountaincarcontinuous (class in carl.envs.gymnasium)": [[3, "carl.envs.gymnasium.CARLMountainCarContinuous"]], "carlpendulum (class in carl.envs.gymnasium)": [[3, "carl.envs.gymnasium.CARLPendulum"]], "carl.envs.gymnasium": [[3, "module-carl.envs.gymnasium"]], "get_context_features() (carl.envs.gymnasium.carlacrobot static method)": [[3, "carl.envs.gymnasium.CARLAcrobot.get_context_features"]], "get_context_features() (carl.envs.gymnasium.carlcartpole static method)": [[3, "carl.envs.gymnasium.CARLCartPole.get_context_features"]], "get_context_features() (carl.envs.gymnasium.carlmountaincar static method)": [[3, "carl.envs.gymnasium.CARLMountainCar.get_context_features"]], "get_context_features() (carl.envs.gymnasium.carlmountaincarcontinuous static method)": [[3, "carl.envs.gymnasium.CARLMountainCarContinuous.get_context_features"]], "get_context_features() (carl.envs.gymnasium.carlpendulum static method)": [[3, "carl.envs.gymnasium.CARLPendulum.get_context_features"]], "carlgymnasiumenv (class in carl.envs.gymnasium.carl_gymnasium_env)": [[4, "carl.envs.gymnasium.carl_gymnasium_env.CARLGymnasiumEnv"]], "carl.envs.gymnasium.carl_gymnasium_env": [[4, "module-carl.envs.gymnasium.carl_gymnasium_env"]], "carlacrobot (class in carl.envs.gymnasium.classic_control)": [[5, "carl.envs.gymnasium.classic_control.CARLAcrobot"]], "carlcartpole (class in carl.envs.gymnasium.classic_control)": [[5, "carl.envs.gymnasium.classic_control.CARLCartPole"]], "carlmountaincar (class in carl.envs.gymnasium.classic_control)": [[5, "carl.envs.gymnasium.classic_control.CARLMountainCar"]], "carlmountaincarcontinuous (class in carl.envs.gymnasium.classic_control)": [[5, "carl.envs.gymnasium.classic_control.CARLMountainCarContinuous"]], "carlpendulum (class in carl.envs.gymnasium.classic_control)": [[5, "carl.envs.gymnasium.classic_control.CARLPendulum"]], "carl.envs.gymnasium.classic_control": [[5, "module-carl.envs.gymnasium.classic_control"]], "get_context_features() (carl.envs.gymnasium.classic_control.carlacrobot static method)": [[5, "carl.envs.gymnasium.classic_control.CARLAcrobot.get_context_features"]], "get_context_features() (carl.envs.gymnasium.classic_control.carlcartpole static method)": [[5, "carl.envs.gymnasium.classic_control.CARLCartPole.get_context_features"]], "get_context_features() (carl.envs.gymnasium.classic_control.carlmountaincar static method)": [[5, "carl.envs.gymnasium.classic_control.CARLMountainCar.get_context_features"]], "get_context_features() (carl.envs.gymnasium.classic_control.carlmountaincarcontinuous static method)": [[5, "carl.envs.gymnasium.classic_control.CARLMountainCarContinuous.get_context_features"]], "get_context_features() (carl.envs.gymnasium.classic_control.carlpendulum static method)": [[5, "carl.envs.gymnasium.classic_control.CARLPendulum.get_context_features"]], "carlacrobot (class in carl.envs.gymnasium.classic_control.carl_acrobot)": [[6, "carl.envs.gymnasium.classic_control.carl_acrobot.CARLAcrobot"]], "carl.envs.gymnasium.classic_control.carl_acrobot": [[6, "module-carl.envs.gymnasium.classic_control.carl_acrobot"]], "get_context_features() (carl.envs.gymnasium.classic_control.carl_acrobot.carlacrobot static method)": [[6, "carl.envs.gymnasium.classic_control.carl_acrobot.CARLAcrobot.get_context_features"]], "carlcartpole (class in carl.envs.gymnasium.classic_control.carl_cartpole)": [[7, "carl.envs.gymnasium.classic_control.carl_cartpole.CARLCartPole"]], "carl.envs.gymnasium.classic_control.carl_cartpole": [[7, "module-carl.envs.gymnasium.classic_control.carl_cartpole"]], "get_context_features() (carl.envs.gymnasium.classic_control.carl_cartpole.carlcartpole static method)": [[7, "carl.envs.gymnasium.classic_control.carl_cartpole.CARLCartPole.get_context_features"]], "carlmountaincar (class in carl.envs.gymnasium.classic_control.carl_mountaincar)": [[8, "carl.envs.gymnasium.classic_control.carl_mountaincar.CARLMountainCar"]], "carl.envs.gymnasium.classic_control.carl_mountaincar": [[8, "module-carl.envs.gymnasium.classic_control.carl_mountaincar"]], "get_context_features() (carl.envs.gymnasium.classic_control.carl_mountaincar.carlmountaincar static method)": [[8, "carl.envs.gymnasium.classic_control.carl_mountaincar.CARLMountainCar.get_context_features"]], "carlmountaincarcontinuous (class in carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous)": [[9, "carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.CARLMountainCarContinuous"]], "carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous": [[9, "module-carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous"]], "get_context_features() (carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.carlmountaincarcontinuous static method)": [[9, "carl.envs.gymnasium.classic_control.carl_mountaincarcontinuous.CARLMountainCarContinuous.get_context_features"]], "carlpendulum (class in carl.envs.gymnasium.classic_control.carl_pendulum)": [[10, "carl.envs.gymnasium.classic_control.carl_pendulum.CARLPendulum"]], "carl.envs.gymnasium.classic_control.carl_pendulum": [[10, "module-carl.envs.gymnasium.classic_control.carl_pendulum"]], "get_context_features() (carl.envs.gymnasium.classic_control.carl_pendulum.carlpendulum static method)": [[10, "carl.envs.gymnasium.classic_control.carl_pendulum.CARLPendulum.get_context_features"]], "carl.envs.mario": [[11, "module-carl.envs.mario"]], "levelimagegen (class in carl.envs.mario.level_image_gen)": [[12, "carl.envs.mario.level_image_gen.LevelImageGen"]], "carl.envs.mario.level_image_gen": [[12, "module-carl.envs.mario.level_image_gen"]], "prepare_sprite_and_box() (carl.envs.mario.level_image_gen.levelimagegen method)": [[12, "carl.envs.mario.level_image_gen.LevelImageGen.prepare_sprite_and_box"]], "render() (carl.envs.mario.level_image_gen.levelimagegen method)": [[12, "carl.envs.mario.level_image_gen.LevelImageGen.render"]], "mariogame (class in carl.envs.mario.mario_game)": [[13, "carl.envs.mario.mario_game.MarioGame"]], "carl.envs.mario.mario_game": [[13, "module-carl.envs.mario.mario_game"]], "carl.envs.mario.models": [[14, "module-carl.envs.mario.models"]], "carl.envs.mario.reachabillity": [[15, "module-carl.envs.mario.reachabillity"]], "check_blocked() (in module carl.envs.mario.reachabillity)": [[15, "carl.envs.mario.reachabillity.check_blocked"]], "mark() (in module carl.envs.mario.reachabillity)": [[15, "carl.envs.mario.reachabillity.mark"]], "reachability_map() (in module carl.envs.mario.reachabillity)": [[15, "carl.envs.mario.reachabillity.reachability_map"]], "remove_ignored() (in module carl.envs.mario.reachabillity)": [[15, "carl.envs.mario.reachabillity.remove_ignored"]], "carl.envs.rna": [[16, "module-carl.envs.rna"]], "carl.envs.rna.carl_rna_definitions": [[17, "module-carl.envs.rna.carl_rna_definitions"]], "carl.envs.rna.parse_dot_brackets": [[18, "module-carl.envs.rna.parse_dot_brackets"]], "parse_dot_brackets() (in module carl.envs.rna.parse_dot_brackets)": [[18, "carl.envs.rna.parse_dot_brackets.parse_dot_brackets"]]}}) \ No newline at end of file diff --git a/main/source/api/autoapi_link.html b/main/source/api/autoapi_link.html new file mode 100644 index 00000000..8d0bbfd4 --- /dev/null +++ b/main/source/api/autoapi_link.html @@ -0,0 +1,337 @@ + + + + + + + + <no title> — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/api/index.html b/main/source/api/index.html new file mode 100644 index 00000000..9e008400 --- /dev/null +++ b/main/source/api/index.html @@ -0,0 +1,338 @@ + + + + + + + + API Reference — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/cite.html b/main/source/cite.html new file mode 100644 index 00000000..595ea97a --- /dev/null +++ b/main/source/cite.html @@ -0,0 +1,352 @@ + + + + + + + + Citing CARL — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

Citing CARL

+

If you use CARL in your research, please cite us with the following Bibtex entry:

+
@inproceedings { BenEim2021a,
+  author       = {Carolin Benjamins and
+              Theresa Eimer and
+              Frederik Schubert and
+              Aditya Mohan and
+              Sebastian Döhler and
+              André Biedenkapp and
+              Bodo Rosenhahn and
+              Frank Hutter and
+              Marius Lindauer},
+  title        = {Contextualize Me - The Case for Context in Reinforcement Learning},
+  journal      = {Transactions on Machine Learning Research},
+  year         = {2023},
+}
+
+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/benchmark_properties.html b/main/source/environments/benchmark_properties.html new file mode 100644 index 00000000..c3ad3b4c --- /dev/null +++ b/main/source/environments/benchmark_properties.html @@ -0,0 +1,396 @@ + + + + + + + + Benchmark Properties — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ +
+ On this page +
+ + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

Benchmark Properties

+

Below we discuss the properties of the CARL benchmarks which are summarized in the following Figure.

+Radar Plots for Env. Spaces +
+

State Space

+

Most of our benchmarks have vector based state spaces that can either be extended to include the context information or +not. The notable exceptions here are CARLVehicleRacing and CARLToadGAN, which exclusively use pixel-based observations. +The size of the vector based spaces range from only two state variables in the CARLMountainCar environments to 299 +for the CARLHumanoid environment.

+
+
+

Action Space

+

We provide both discrete and continuous environments, with six requiring discrete actions and the other ten continuous +ones. The number of actions can range from a single action to 19 different actions.

+
+
+

Quality of Reward

+

We cover different kinds of reward signals with our benchmarks, ranging from relatively sparse step penalty style +rewards where the agent only receives a reward of -1 each step to complex composite reward functions in e.g. the +Brax-based environments. The latter version is also quite informative, providing updates on factors like movement +economy and progress towards the goal whereas the former does not let the agents distinguish between transitions +without looking at the whole episode. % this sentence could be dropped if space is needed +Further examples for sparse rewards are the CARLCartPoleEnv and CARLVehicleRacingEnv.

+
+
+

Context Spaces

+

While the full details of all possible context configurations can be seen in Environment Families. Here we +only discuss the differences between context spaces and the configuration possibilities they provide. +Depending on the environment the context features have different influence on the dynamics and the reward. Of all 131 +registered context features, 98% influence the dynamics. This means that if a context feature is changed then the +transition from one state into the other is changed as well. Only 5% of the context features shape the reward. +Most context features (87%) are continuous, the rest is categorical or discrete. +With the explicit availability of context features CARL lends it self to study the robustness of agents by adding +noise on top of the specific context features. Further, the provided bounds and sampling distributions of the context +spaces that are provided as part of CARL enable better comparability and reproducibility for future research efforts +in the realm of general RL agents.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/carl_env.html b/main/source/environments/carl_env.html new file mode 100644 index 00000000..b8870623 --- /dev/null +++ b/main/source/environments/carl_env.html @@ -0,0 +1,400 @@ + + + + + + + + The CARL Environment — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

The CARL Environment

+

CARL extends the standard gymnasium interface with context. +This context changes the environment’s transition dynamics and reward +function, creating a greater challenge for the agent. +During training we therefore can encounter different contexts and train for generalization. +We exemplarily show how Brax’ Fetch is extended and embedded by CARL. Different +instantiations can be achieved by setting the context features to different values.

+

Here we give a brief overview of the available options on how to create +and work with contexts.

+

A context takes the form of a dictionary with a key-value pair for each +context feature. An example is the default context for the CARLAnt environment:

+
Ant_defaults = {
+    "joint_stiffness": 5000,
+    "gravity": -9.8,
+    "friction": 0.6,
+    "angular_damping": -0.05,
+    "actuator_strength": 300,
+    "joint_angular_damping": 35,
+    "torso_mass": 10,
+}
+
+
+

The context set used for training is comprised of at least one context. +It is also a dictionary with keys that should identify the context in a +meaningful way, e.g. an id. An example of a simple instance set for +CARLCartPole would be:

+
from src.envs import CARLCartPoleEnv_defaults as default
+longer_pole = default.copy()
+longer_pole["pole_length"] = default["pole_length"]*2
+contexts = {0: default, 1: longer_pole}
+
+
+

This context set can then be used to create the environment:

+
from src.envs import CARLCartPoleEnv
+env = CARLCartPoleEnv(contexts=contexts)
+
+
+

Per default, the context will be changed each episode in a round robin +fashion.

+

The user can choose if and how the context is provided to the agent. +If the context should be hidden completely, instantiate the environment +with the ‘hide_context’ option:

+
from src.envs import CARLCartPoleEnv
+env = CARLCartPoleEnv(contexts=contexts, hide_context=True)
+
+
+

By default, the context is visible and concatenated onto the state information +with no separation between state and context features. They can be +provided separately, though, using dict observations:

+
from src.envs import CARLCartPoleEnv
+env = CARLCartPoleEnv(contexts=contexts, hide_context=False, dict_observation_space=True)
+
+
+

Furthermore, users can choose to provide the full context information (default) +or only a subset:

+
from src.envs import CARLCartPoleEnv
+env = CARLCartPoleEnv(contexts=contexts, state_context_features=["gravity", "pole_length"])
+
+
+

Context features can also be normalized or augmented with noise to either +make learning easier or more difficult. +In addition, only the context features changing across the contexts provided can be appended to the state like so:

+
from src.envs import CARLCartPoleEnv
+env = CARLCartPoleEnv(contexts=contexts, state_context_features="changing_context_features")
+
+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/carlify.html b/main/source/environments/carlify.html new file mode 100644 index 00000000..b27e7133 --- /dev/null +++ b/main/source/environments/carlify.html @@ -0,0 +1,349 @@ + + + + + + + + CARLify your Environment — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

CARLify your Environment

+

If you have an environment that you think would make an interesting addition +to CARL, feel free to add it. Here is a short guide on what to do:

+

1. Create a CARL wrapper class for your environment. It should be a child +class of CARLEnv and implement the setup and context changes of your environment.

+

2. Define the context. Provide a default context with all mutable features +as well as bounds for all features.

+

3. If additional requirements need to be installed, add them as install +options in setup.cfg. Make sure those changes are reflected in the ReadME +as well, especially if there are any extra steps (e.g. data downloads) +to the installation process.

+

4. Make a PR to the main branch of CARL. We’ll review it and try to clarify +any open questions.

+

If you want to know if your environment would be a good fit or which context +features could be interesting to vary, don’t hesitate to contact us!

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/environment_families/box2d.html b/main/source/environments/environment_families/box2d.html new file mode 100644 index 00000000..7e640866 --- /dev/null +++ b/main/source/environments/environment_families/box2d.html @@ -0,0 +1,564 @@ + + + + + + + + CARL Box 2D Environments — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

CARL Box 2D Environments

+

OpenAI’s gym Box2D provides environments for continuous control tasks. +In CARL BipedalWalker, LunarLander and CarRacing are included, each with their own modification possibilities like +new vehicles to race.

+
+

CARL BipedalWalker Environment

+Screenshot of CARLBipedalWalkerEnv +

In BipedalWalker a bipedal robot is trained to walk. +The properties of the walker’s body, surroundings and physics as well as the simulation dynamics +can be varied via the context features.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

FPS

50.0

(1, 500, <class ‘float’>)

SCALE

30.0

(1, 100, <class ‘float’>)

GRAVITY_X

0.0

(-20, 20, <class ‘float’>)

GRAVITY_Y

-10.0

(-20, -0.01, <class ‘float’>)

FRICTION

2.5

(0, 10, <class ‘float’>)

TERRAIN_STEP

0.4666666666666667

(0.25, 1, <class ‘float’>)

TERRAIN_LENGTH

200.0

(100, 500, <class ‘int’>)

TERRAIN_HEIGHT

5.0

(3, 10, <class ‘float’>)

TERRAIN_GRASS

10.0

(5, 15, <class ‘int’>)

TERRAIN_STARTPAD

20.0

(10, 30, <class ‘int’>)

MOTORS_TORQUE

80.0

(0, 200, <class ‘float’>)

SPEED_HIP

4.0

(1e-06, 15, <class ‘float’>)

SPEED_KNEE

6.0

(1e-06, 15, <class ‘float’>)

LIDAR_RANGE

5.333333333333333

(0.5, 20, <class ‘float’>)

LEG_DOWN

-0.26666666666666666

(-2, -0.25, <class ‘float’>)

LEG_W

0.26666666666666666

(0.25, 0.5, <class ‘float’>)

LEG_H

1.1333333333333333

(0.25, 2, <class ‘float’>)

INITIAL_RANDOM

5.0

(0, 50, <class ‘float’>)

VIEWPORT_W

600.0

(400, 1000, <class ‘int’>)

VIEWPORT_H

400.0

(200, 800, <class ‘int’>)

+
+
+

CARL LunarLander Environment

+Screenshot of CARLLunarLanderEnv +Influence of context settings on an agent trained on the default environment. +

Here, the lunar lander should be safely navigated to its landing pad. +The lander’s body, physics and simulation dynamics can be manipulated via the context features.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

FPS

50.0

(1, 500, <class ‘float’>)

SCALE

30.0

(1, 100, <class ‘float’>)

MAIN_ENGINE_POWER

13.0

(0, 50, <class ‘float’>)

SIDE_ENGINE_POWER

0.6

(0, 50, <class ‘float’>)

INITIAL_RANDOM

1000.0

(0, 2000, <class ‘float’>)

GRAVITY_X

0.0

(-20, 20, <class ‘float’>)

GRAVITY_Y

-10.0

(-20, -0.01, <class ‘float’>)

LEG_AWAY

20.0

(0, 50, <class ‘float’>)

LEG_DOWN

18.0

(0, 50, <class ‘float’>)

LEG_W

2.0

(1, 10, <class ‘float’>)

LEG_H

8.0

(1, 20, <class ‘float’>)

LEG_SPRING_TORQUE

40.0

(0, 100, <class ‘float’>)

SIDE_ENGINE_HEIGHT

14.0

(1, 20, <class ‘float’>)

SIDE_ENGINE_AWAY

12.0

(1, 20, <class ‘float’>)

VIEWPORT_W

600.0

(400, 1000, <class ‘int’>)

VIEWPORT_H

400.0

(200, 800, <class ‘int’>)

+
+
+

CARL VehicleRacing Environment

+Screenshot of CARLVehicleRacingEnv +

In this environment a vehicle is raced around a track. The context here is the type of vehicle. +There are different types of vehicles, race car, street car, bus and vehicle, and most of them can have a front-, back- +or all-wheel drive as well as small or large trailers (29 variations in total).

+ + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

VEHICLE

0

+
(None, None, ‘categorical’, array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,

17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]))

+
+
+
+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/environment_families/brax.html b/main/source/environments/environment_families/brax.html new file mode 100644 index 00000000..1730d2aa --- /dev/null +++ b/main/source/environments/environment_families/brax.html @@ -0,0 +1,656 @@ + + + + + + + + CARL Brax Environments — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

CARL Brax Environments

+

In CARL all Brax locomotion environments are included. +As context features there are external features like gravity or friction or internal features +like joint strength or torso mass.

+
+

CARL Ant Environment

+Screenshot of CARLAnt +

Here the agent needs to learn how to control a four-legged ant in order +to run (quickly) into a given direction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

joint_stiffness

5000.0

(1, inf, <class ‘float’>)

gravity

-9.8

(-inf, -0.1, <class ‘float’>)

friction

0.6

(-inf, inf, <class ‘float’>)

angular_damping

-0.05

(-inf, inf, <class ‘float’>)

actuator_strength

300.0

(1, inf, <class ‘float’>)

joint_angular_damping

35.0

(0, inf, <class ‘float’>)

torso_mass

10.0

(0.1, inf, <class ‘float’>)

+
+
+

CARL Fetch Environment

+Screenshot of CARLFetch +

Fetch trains a robotic dog to run to a target location. +The target radius and distance as well as physical properties can be varied via the context features.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

joint_stiffness

5000.0

(1, inf, <class ‘float’>)

gravity

-9.8

(-inf, -0.1, <class ‘float’>)

friction

0.6

(-inf, inf, <class ‘float’>)

angular_damping

-0.05

(-inf, inf, <class ‘float’>)

actuator_strength

300.0

(1, inf, <class ‘float’>)

joint_angular_damping

35.0

(0, inf, <class ‘float’>)

torso_mass

1.0

(0.1, inf, <class ‘float’>)

target_radius

2.0

(0.1, inf, <class ‘float’>)

target_distance

15.0

(0.1, inf, <class ‘float’>)

+
+
+

CARL Grasp Environment

+Screenshot of CARLGrasp +

In CARL Grasp the agent is trained to pick up an object with a robot hand. +Three bodies are observed by Grasp: ‘Hand’, ‘Object’, and ‘Target’. +When Object reaches Target, the agent is rewarded. +Apart from Grasp’s pyhiscal properties the target radius, height and distance are also varied.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

joint_stiffness

5000.0

(1, inf, <class ‘float’>)

gravity

-9.8

(-inf, -0.1, <class ‘float’>)

friction

0.6

(-inf, inf, <class ‘float’>)

angular_damping

-0.05

(-inf, inf, <class ‘float’>)

actuator_strength

300.0

(1, inf, <class ‘float’>)

joint_angular_damping

50.0

(0, inf, <class ‘float’>)

target_radius

1.1

(0.1, inf, <class ‘float’>)

target_distance

10.0

(0.1, inf, <class ‘float’>)

target_height

8.0

(0.1, inf, <class ‘float’>)

+
+
+

CARL Halfcheetah Environment

+Screenshot of CARLHalfcheetah +

A Halfcheetah is trained to run in a given direction. +The context features can vary physical properties.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

joint_stiffness

15000.0

(1, inf, <class ‘float’>)

gravity

-9.8

(-inf, -0.1, <class ‘float’>)

friction

0.6

(-inf, inf, <class ‘float’>)

angular_damping

-0.05

(-inf, inf, <class ‘float’>)

joint_angular_damping

20.0

(0, inf, <class ‘float’>)

torso_mass

9.457333

(0.1, inf, <class ‘float’>)

+
+
+

CARL Humanoid Environment

+Screenshot of CARLHumanoid +

Here, a Humanoid needs to learn how to walk forward.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

gravity

-9.8

(-inf, -0.1, <class ‘float’>)

friction

0.6

(-inf, inf, <class ‘float’>)

angular_damping

-0.05

(-inf, inf, <class ‘float’>)

joint_angular_damping

20.0

(0, inf, <class ‘float’>)

torso_mass

8.907463

(0.1, inf, <class ‘float’>)

+
+
+

CARL UR5e Environment

+Screenshot of CARLUr5e +

The agent needs to learn how to move a ur5e robot arm and its end effector to a sequence of targets. +The robot arm has 6 joints.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

joint_stiffness

40000.0

(1, inf, <class ‘float’>)

gravity

-9.81

(-inf, -0.1, <class ‘float’>)

friction

0.6

(-inf, inf, <class ‘float’>)

angular_damping

-0.05

(-inf, inf, <class ‘float’>)

actuator_strength

100.0

(1, inf, <class ‘float’>)

joint_angular_damping

50.0

(0, 360, <class ‘float’>)

target_radius

0.02

(0.01, inf, <class ‘float’>)

target_distance

0.5

(0.01, inf, <class ‘float’>)

torso_mass

1.0

(0, inf, <class ‘float’>)

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/environment_families/classic_control.html b/main/source/environments/environment_families/classic_control.html new file mode 100644 index 00000000..077ebf15 --- /dev/null +++ b/main/source/environments/environment_families/classic_control.html @@ -0,0 +1,621 @@ + + + + + + + + CARL Classic Control Environments — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

CARL Classic Control Environments

+

Classic Control is a problem suite included in OpenAI’s gym consisting +of simply physics simulation tasks. Context features here are therefore +also physics-based, e.g. friction, mass or gravity.

+
+

CARL Pendulum Environment

+Pendulum Environment +Influence of context settings on an agent trained on the default environment. +

In Pendulum, the agent’s task is to swing up an inverted pendulum and +balance it at the top from a random position. The action here is the +direction and amount of force the agent wants to apply to the pendulum.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

max_speed

8.0

(-inf, inf, <class ‘float’>)

dt

0.05

(0, inf, <class ‘float’>)

g

10.0

(0, inf, <class ‘float’>)

m

1.0

(1e-06, inf, <class ‘float’>)

l

1.0

(1e-06, inf, <class ‘float’>)

+
+
+

CARL CartPole Environment

+CartPole Environment +Influence of context settings on an agent trained on the default environment. +

CartPole, similarly to Pendulum, asks the agent to balance a pole upright, though +this time the agent doesn’t directly apply force to the pole but moves a cart on which +the pole ist placed either to the left or the right.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

gravity

9.8

(0.1, inf, <class ‘float’>)

masscart

1.0

(0.1, 10, <class ‘float’>)

masspole

0.1

(0.01, 1, <class ‘float’>)

pole_length

0.5

(0.05, 5, <class ‘float’>)

force_magnifier

10.0

(1, 100, <class ‘int’>)

update_interval

0.02

(0.002, 0.2, <class ‘float’>)

+
+
+

CARL Acrobot Environment

+Acrobot Environment +Influence of context settings on an agent trained on the default environment. +

Acrobot is another swing-up task with the goal being swinging the end of the lower +of two links up to a given height. The agent accomplishes this by actuating +the joint connecting both links.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

link_length_1

1.0

(0.1, 10, <class ‘float’>)

link_length_2

1.0

(0.1, 10, <class ‘float’>)

link_mass_1

1.0

(0.1, 10, <class ‘float’>)

link_mass_2

1.0

(0.1, 10, <class ‘float’>)

link_com_1

0.5

(0, 1, <class ‘float’>)

link_com_2

0.5

(0, 1, <class ‘float’>)

link_moi

1.0

(0.1, 10, <class ‘float’>)

max_velocity_1

12.566370614359172

(1.2566370614359172, 125.66370614359172, <class ‘float’>)

max_velocity_2

28.274333882308138

(2.827433388230814, 282.7433388230814, <class ‘float’>)

torque_noise_max

0.0

(-1.0, 1.0, <class ‘float’>)

+
+
+

CARL MountainCar Environment

+MountainCar Environment +Influence of context settings on an agent trained on the default environment. +

The MountainCar environment asks the agent to move a car up a steep slope. In order +to succeed, the agent has to accelerate using the opposite slope. There are two +versions of the environment, a discrete one with only “left” and “right” as actions, +as well as a continuous one.

+

Defaults and bounds for the discrete MountainCar:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

min_position

-1.2

(-inf, inf, <class ‘float’>)

max_position

0.6

(-inf, inf, <class ‘float’>)

max_speed

0.07

(0, inf, <class ‘float’>)

goal_position

0.5

(-inf, inf, <class ‘float’>)

goal_velocity

0.0

(-inf, inf, <class ‘float’>)

force

0.001

(-inf, inf, <class ‘float’>)

gravity

0.0025

(0, inf, <class ‘float’>)

start_position

-0.5

(-1.5, 0.5, <class ‘float’>)

start_position_std

0.1

(0.1, inf, <class ‘float’>)

start_velocity

0.0

(-inf, inf, <class ‘float’>)

start_velocity_std

0.0

(0.1, inf, <class ‘float’>)

+

And for the continuous case:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

min_position

-1.2

(-inf, inf, <class ‘float’>)

max_position

0.6

(-inf, inf, <class ‘float’>)

max_speed

0.07

(0, inf, <class ‘float’>)

goal_position

0.45

(-inf, inf, <class ‘float’>)

goal_velocity

0.0

(-inf, inf, <class ‘float’>)

power

0.0015

(-inf, inf, <class ‘float’>)

min_position_start

-0.6

(-inf, inf, <class ‘float’>)

max_position_start

-0.4

(-inf, inf, <class ‘float’>)

min_velocity_start

0.0

(-inf, inf, <class ‘float’>)

max_velocity_start

0.0

(-inf, inf, <class ‘float’>)

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/environment_families/dmc.html b/main/source/environments/environment_families/dmc.html new file mode 100644 index 00000000..8e4d57d3 --- /dev/null +++ b/main/source/environments/environment_families/dmc.html @@ -0,0 +1,384 @@ + + + + + + + + CARL DMC Environments — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ +
+ +
+

CARL DMC Environments

+

CARL includes the Finger, Fish, Quadruped and Walker environments from the DeepMind Control Suite. +The context features control the MuJoCo physics engine, e.g. the floor friction.

+
+

CARL DMC Finger Environment

+Screenshot of CARLDmcFinger +

The agent needs to learn to spin an object using the finger.

+
+
+

CARL DMC Fish Environment

+Screenshot of CARLDmcFish +

In Fish, the agent needs to swim as a simulated fish.

+
+
+

CARL DMC Quadruped Environment

+Screenshot of CARLDmcQuadruped +Influence of context settings on an agent trained on the default environment. +

The agent’s goal is to walk efficiently with the quadruped robot.

+
+
+

CARL DMC Walker Environment

+Screenshot of CARLDmcWalker +Influence of context settings on an agent trained on the default environment. +

The walker robot is supposed to move forward as fast as possible.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/environment_families/index.html b/main/source/environments/environment_families/index.html new file mode 100644 index 00000000..c92c4059 --- /dev/null +++ b/main/source/environments/environment_families/index.html @@ -0,0 +1,603 @@ + + + + + + + + Environment Families — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

Environment Families

+

In CARL we provide several contextually extended environments where we can set and augment their contexts. +With this we can analyze how the context and its augmentation influences the agent’s generalization capabilities, +learning and behavior.

+Screenshot of each environment included in CARL. +

Although each environment has different tasks, goals and mechanics, the behavior of the dynamics and the rewards is +influenced by physical properties.

+

CARL currently contains the following benchmarks which are contextually extended:

+
+

Classic Control

+

OpenAI gym classic control suite extended with several physics +context features like gravity or friction

+ +
+
+

Box2D

+

OpenAI gym Box2D BipedalWalker, LunarLander and +CarRacing, each with their own modification possibilities like +new vehicles to race

+ +
+
+

Brax

+

All Brax locomotion environments with exposed internal features +like joint strength or torso mass

+ +
+
+

DeepMind Control Suite

+

Selected environment from the DeepMind Control Suite with controllable physics.

+ +
+
+

Mario

+

Super Mario (TOAD-GAN), a procedurally generated jump’n’run game with control +over level similarity

+ +
+
+

RNA Design

+

RNADesign, an environment for RNA design given structure +constraints with structures from different datasets to choose from

+ +
+
+

Overview Table

+

Below every environment is listed with its number of context features and the type of action and observation space.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Env. Family

Name

# Context Features

Action Space

Obs. Space

classic_control

CARLMountainCarEnv

11

Discrete(3)

Box(-inf, inf, (13,), float32)

classic_control

CARLPendulumEnv

5

Box(-2.0, 2.0, (1,), float32)

Box(-inf, inf, (8,), float32)

classic_control

CARLAcrobotEnv

10

Discrete(3)

Box(-28.274333953857422, 282.74334716796875, (16,), float32)

classic_control

CARLCartPoleEnv

6

Discrete(2)

Box(-3.4028234663852886e+38, inf, (10,), float32)

classic_control

CARLMountainCarContinuousEnv

10

Box(-1.0, 1.0, (1,), float32)

Box(-inf, inf, (12,), float32)

box2d

CARLLunarLanderEnv

16

Discrete(4)

Box(-inf, inf, (24,), float32)

box2d

CARLVehicleRacingEnv

1

Box(-1.0, 1.0, (3,), float32)

Box(0, 255, (96, 96, 3), uint8)

box2d

CARLBipedalWalkerEnv

20

Box(-1.0, 1.0, (4,), float32)

Box(-inf, inf, (44,), float32)

brax

CARLAnt

7

Box(-1.0, 1.0, (8,), float32)

Box(-inf, inf, (94,), float32)

brax

CARLHalfcheetah

6

Box(-1.0, 1.0, (6,), float32)

Box(-inf, inf, (29,), float32)

brax

CARLHumanoid

5

Box(-1.0, 1.0, (17,), float32)

Box(-inf, inf, (304,), float32)

brax

CARLFetch

9

Box(-1.0, 1.0, (10,), float32)

Box(-inf, inf, (110,), float32)

brax

CARLGrasp

9

Box(-1.0, 1.0, (19,), float32)

Box(-inf, inf, (141,), float32)

brax

CARLUr5e

9

Box(-1.0, 1.0, (6,), float32)

Box(-inf, inf, (75,), float32)

dmc

CARLDmcFishEnv

14

Box(-1.0, 1.0, (5,), float64)

Box(-inf, inf, (24,), float32)

dmc

CARLDmcFingerEnv

18

Box(-1.0, 1.0, (2,), float64)

Box(-inf, inf, (9,), float32)

dmc

CARLDmcQuadrupedEnv

14

Box(-1.0, 1.1, (12,), float64)

Box(-inf, inf, (78,), float32)

dmc

CARLDmcWalkerEnv

14

Box(-1.0, 1.0, (6,), float64)

Box(-inf, inf, (24,), float32)

RNA

CARLRnaDesignEnv

5

Discrete(4)

Box(-inf, inf, (11,), float32)

Mario

CARLMarioEnv

4

Discrete(10)

Box(0, 255, (4, 64, 64), uint8)

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/environment_families/rna.html b/main/source/environments/environment_families/rna.html new file mode 100644 index 00000000..a3d1ffb3 --- /dev/null +++ b/main/source/environments/environment_families/rna.html @@ -0,0 +1,374 @@ + + + + + + + + CARL RNA Design Environment — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

CARL RNA Design Environment

+
+

Warning

+

This environment currently is under maintenance and cannot be installed. Thank you for your patience.

+
+RNA Design Environment +

In the LeaRNA RNA Design Environment, the agent attempts to design a RNA sequence +that matches given structural constraints. This is a very challenging problem +due to the complex underlying dynamics of biological processes as well as the wealth +of variation contained in the real world data provided.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Context Feature

Default

Bounds

mutation_threshold

5

(0.1, inf, <class ‘float’>)

reward_exponent

1

(0.1, inf, <class ‘float’>)

state_radius

5

(1, inf, <class ‘float’>)

dataset

eterna

(‘eterna’, ‘rfam_taneda’, None)

target_structure_ids

(0, inf, [<class ‘list’>, <class ‘int’>])

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/environment_families/toad_gan.html b/main/source/environments/environment_families/toad_gan.html new file mode 100644 index 00000000..e8ec3104 --- /dev/null +++ b/main/source/environments/environment_families/toad_gan.html @@ -0,0 +1,369 @@ + + + + + + + + CARL Mario Environment — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

CARL Mario Environment

+ToadGAN Environment +

The ToadGAN environment provides context-guided procedural generation inspired by +Nintendo’s super Mario Bros. The agent has to guide a character through levels including +jumps, coins and enemies generated according to context definition. +The level is solved as soon as the agent arrives at the end. Its actions include +moving forwards or backwards and jumping.

+

The generation can be controlled by the following context features:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Defaults and Bounds

Context Feature

Default

Bounds

level_index

0

(None, None, ‘categorical’, array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]))

noise

None *

(-1.0, 1.0, <class ‘float’>)

mario_state

0

(None, None, ‘categorical’, [0, 1, 2])

mario_inertia

0.89

(0.5, 1.5, <class ‘float’>)

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/environments/index.html b/main/source/environments/index.html new file mode 100644 index 00000000..a392ff5c --- /dev/null +++ b/main/source/environments/index.html @@ -0,0 +1,360 @@ + + + + + + + + Environments — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/getting_started/index.html b/main/source/getting_started/index.html new file mode 100644 index 00000000..b1822245 --- /dev/null +++ b/main/source/getting_started/index.html @@ -0,0 +1,346 @@ + + + + + + + + Getting Started — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/getting_started/installation.html b/main/source/getting_started/installation.html new file mode 100644 index 00000000..8300cc0a --- /dev/null +++ b/main/source/getting_started/installation.html @@ -0,0 +1,402 @@ + + + + + + + + Installing CARL — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + + + +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

Installing CARL

+
+

Base Installation

+

In order to install CARL, first clone the GitHub repository:

+
git clone https://github.com/automl/CARL.git
+cd CARL
+
+
+

We recommend using a virtual environment for installation, e.g. conda:

+
conda create -n carl python=3.9
+conda activate carl
+
+
+

The base version of CARL only includes the classic control environments +and can be installed by running:

+
pip install .
+
+
+
+
+

Additional Environments

+

The other environments like Bos2D and Brax are optional dependencies, so you can choose which you want +to install. For the full set:

+
pip install -e .[box2d, brax, rna, mario]
+
+
+

To use ToadGAN, additionally run:

+
javac src/envs/mario/Mario-AI-Framework/**/*.java
+
+
+

If you plan on using the RNA environment, you need to download the RNA sequence data:

+
cd src/envs/rna/learna
+make requirements
+make data
+
+
+
+
+

CARL on Windows & MAC

+

These installation instructions might not work fully on Windows systems and have not +been tested there. For MAC, you will need to install Box2D via conda:

+
conda install -c conda-forge gym-box2d
+
+
+

We generally test and develop CARL on Linux systems, but aim to keep it as compatible +with MAC as possible. The ToadGAN environment is Linux exclusive at this +point.

+
+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/getting_started/quickstart.html b/main/source/getting_started/quickstart.html new file mode 100644 index 00000000..e7c10ae6 --- /dev/null +++ b/main/source/getting_started/quickstart.html @@ -0,0 +1,355 @@ + + + + + + + + Quickstart — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

Quickstart

+

All CARL environments use OpenAI’s gym interface +for agent-environment interactions.

+

To get started using CARL with your own agents, first define +a context set. In this example, we will use the CARLCartPoleEnv with its +default context and a longer pole.

+
from src.envs import CARLCartPoleEnv_defaults as default
+longer_pole = default.copy()
+longer_pole["pole_length"] = default["pole_length"]*2
+contexts = {0: default, 1: longer_pole}
+
+
+

Now that we defined a context set, we can use it to create our environment:

+
from src.envs import CARLCartPoleEnv
+env = CARLCartPoleEnv(contexts=contexts)
+
+
+

Now you can interact with the environment just like any other gym environment +while the context will change each episode. For a demonstration on what +context can do, see the example notebook in our repository. More +options for environments creation can be found in the Environments section.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/license.html b/main/source/license.html new file mode 100644 index 00000000..0114eec0 --- /dev/null +++ b/main/source/license.html @@ -0,0 +1,342 @@ + + + + + + + + License — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + +
+ + +
+ + + +
+ +
+ +
+ + +
+ + + + + + +
+ +
+ +
+

License

+

CARL falls under the Apache License 2.0 (see file LICENSE) as is +permitted by all work that we use. This includes CARLMario, which is not +based on the Nintendo Game, but on TOAD-GAN and TOAD-GUI running under +an MIT license. They in turn make use of the +Mario AI framework. +This is not the original game but a replica, explicitly built for +research purposes and includes a copyright notice.

+
+ + +
+ + + + + +
+ + +
+
+ + +
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/main/source/references.html b/main/source/references.html new file mode 100644 index 00000000..4ee1a6e9 --- /dev/null +++ b/main/source/references.html @@ -0,0 +1,340 @@ + + + + + + + + References — CARL Documentation 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file