From 230328c62f9f76afc76f4fb2f8414b9c3cd54b1a Mon Sep 17 00:00:00 2001 From: ian_Cin Date: Wed, 20 Dec 2023 11:30:25 +0700 Subject: [PATCH] Best docs Cinnamon will probably ever have (#105) --- .pre-commit-config.yaml | 7 + README.md | 6 +- doc_env_reqs.txt | 7 + docs/contributing.md | 165 +++++++++++++++++ docs/create-a-component.md | 71 ++++++++ docs/data-components.md | 32 ++++ docs/extra/css/code_select.css | 5 + docs/index.md | 1 + docs/overview.md | 75 ++++++++ docs/scripts/generate_examples_docs.py | 65 +++++++ docs/scripts/generate_reference_docs.py | 75 ++++++++ .../pymdownx-extras/extra-fb5a2a1c86.css | 2 + .../pymdownx-extras/extra-fb5a2a1c86.css.map | 1 + .../pymdownx-extras/extra-loader-MCFnu0Wd.js | 2 + .../extra-loader-MCFnu0Wd.js.map | 1 + .../material-extra-3rdparty-E-i8w1WA.js | 2 + .../material-extra-3rdparty-E-i8w1WA.js.map | 1 + .../material-extra-theme-TVq-kNRT.js | 2 + .../material-extra-theme-TVq-kNRT.js.map | 1 + docs/theme/main.html | 6 + docs/theme/partials/footer.html | 49 +++++ docs/theme/partials/header.html | 88 +++++++++ docs/theme/partials/libs.html | 2 + docs/ultilities.md | 172 ++++++++++++++++++ docs/upload-package.md | 24 +++ knowledgehub/agents/langchain_based.py | 2 +- knowledgehub/base/component.py | 8 +- knowledgehub/base/schema.py | 5 +- knowledgehub/llms/__init__.py | 4 + knowledgehub/llms/branching.py | 10 +- knowledgehub/llms/cot.py | 41 +++-- knowledgehub/llms/linear.py | 6 +- knowledgehub/llms/prompts/template.py | 4 +- knowledgehub/loaders/base.py | 2 +- knowledgehub/loaders/utils/box.py | 2 +- knowledgehub/loaders/utils/pdf_ocr.py | 9 +- knowledgehub/parsers/regex_extractor.py | 13 +- mkdocs.yml | 105 +++++++++++ pyproject.toml | 7 + tests/test_vectorstore.py | 2 +- 40 files changed, 1036 insertions(+), 46 deletions(-) create mode 100644 doc_env_reqs.txt create mode 100644 docs/contributing.md create mode 100644 docs/create-a-component.md create mode 100644 docs/data-components.md create mode 100644 docs/extra/css/code_select.css create mode 100644 docs/index.md create mode 100644 docs/overview.md create mode 100644 docs/scripts/generate_examples_docs.py create mode 100644 docs/scripts/generate_reference_docs.py create mode 100644 docs/theme/assets/pymdownx-extras/extra-fb5a2a1c86.css create mode 100644 docs/theme/assets/pymdownx-extras/extra-fb5a2a1c86.css.map create mode 100644 docs/theme/assets/pymdownx-extras/extra-loader-MCFnu0Wd.js create mode 100644 docs/theme/assets/pymdownx-extras/extra-loader-MCFnu0Wd.js.map create mode 100644 docs/theme/assets/pymdownx-extras/material-extra-3rdparty-E-i8w1WA.js create mode 100644 docs/theme/assets/pymdownx-extras/material-extra-3rdparty-E-i8w1WA.js.map create mode 100644 docs/theme/assets/pymdownx-extras/material-extra-theme-TVq-kNRT.js create mode 100644 docs/theme/assets/pymdownx-extras/material-extra-theme-TVq-kNRT.js.map create mode 100644 docs/theme/main.html create mode 100644 docs/theme/partials/footer.html create mode 100644 docs/theme/partials/header.html create mode 100644 docs/theme/partials/libs.html create mode 100644 docs/ultilities.md create mode 100644 docs/upload-package.md create mode 100644 mkdocs.yml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 69878d8..4a15646 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,6 +3,7 @@ repos: rev: v4.3.0 hooks: - id: check-yaml + args: ["--unsafe"] - id: check-toml - id: end-of-file-fixer - id: trailing-whitespace @@ -55,3 +56,9 @@ repos: "--new-type-inference", ] exclude: "^templates/" + - repo: https://github.com/codespell-project/codespell + rev: v2.2.4 + hooks: + - id: codespell + additional_dependencies: + - tomli diff --git a/README.md b/README.md index a71616a..ad70b68 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,10 @@ Quick and easy AI components to build Kotaemon - applicable in client project. +## Documentation + +https://docs.promptui.dm.cinnamon.is + ## Install ```shell @@ -22,7 +26,7 @@ pip install kotaemon@git+ssh://git@github.com/Cinnamon/kotaemon.git - Clone the repo - ```shel + ```shell git clone git@github.com:Cinnamon/kotaemon.git cd kotaemon ``` diff --git a/doc_env_reqs.txt b/doc_env_reqs.txt new file mode 100644 index 0000000..c425d2e --- /dev/null +++ b/doc_env_reqs.txt @@ -0,0 +1,7 @@ +mkdocs +mkdocstrings[python] +mkdocs-material +mkdocs-gen-files +mkdocs-literate-nav +mkdocs-git-revision-date-localized-plugin +mkdocs-section-index diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..c4ad2ed --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,165 @@ +# Getting started + +## Setup + +- Create conda environment (suggest 3.10) + + ```shell + conda create -n kotaemon python=3.10 + conda activate kotaemon + ``` + +- Clone the repo + + ```shel + git clone git@github.com:Cinnamon/kotaemon.git + cd kotaemon + ``` + +- Install all + + ```shell + pip install -e ".[dev]" + ``` + +- Pre-commit + + ```shell + pre-commit install + ``` + +- Test + + ```shell + pytest tests + ``` + +## Credential sharing + +This repo uses [git-secret](https://sobolevn.me/git-secret/) to share credentials, which +internally uses `gpg` to encrypt and decrypt secret files. + +This repo uses `python-dotenv` to manage credentials stored as environment variable. +Please note that the use of `python-dotenv` and credentials are for development +purposes only. Thus, it should not be used in the main source code (i.e. `kotaemon/` and `tests/`), but can be used in `examples/`. + +### Install git-secret + +Please follow the [official guide](https://sobolevn.me/git-secret/installation) to install git-secret. + +For Windows users, see [For Windows users](#for-windows-users). + +For users who don't have sudo privilege to install packages, follow the `Manual Installation` in the [official guide](https://sobolevn.me/git-secret/installation) and set `PREFIX` to a path that you have access to. And please don't forget to add `PREFIX` to your `PATH`. + +### Gaining access to credientials + +In order to gain access to the secret files, you must provide your gpg public file to anyone who has access and ask them to ask your key to the keyring. For a quick tutorial on generating your gpg key pair, you can refer to the `Using gpg` section from the [git-secret main page](https://sobolevn.me/git-secret/). + +### Decrypt the secret file + +The credentials are encrypted in the `.env.secret` file. To print the decrypted content to stdout, run + +```shell +git-secret cat [filename] +``` + +Or to get the decrypted `.env` file, run + +```shell +git-secret reveal [filename] +``` + +### For Windows users + +git-secret is currently not available for Windows, thus the easiest way is to use it in WSL (please use the latest version of WSL2). From there you have 2 options: + +1. Using the gpg of WSL. + + This is the most straight-forward option since you would use WSL just like any other unix environment. However, the downside is that you have to make WSL your main environment, which means WSL must have write permission on your repo. To achieve this, you must either: + + - Clone and store your repo inside WSL's file system. + - Provide WSL with necessary permission on your Windows file system. This can be achieve by setting `automount` options for WSL. To do that, add these content to `/etc/wsl.conf` and then restart your sub-system. + + ```shell + [automount] + options = "metadata,umask=022,fmask=011" + ``` + + This enables all permissions for user owner. + +2. Using the gpg of Windows but with git-secret from WSL. + + For those who use Windows as the main environment, having to switch back and forth between Windows and WSL will be inconvenient. You can instead stay within your Windows environment and apply some tricks to use `git-secret` from WSL. + + - Install and setup `gpg` on Windows. + - Install `git-secret` on WSL. Now in Windows, you can invoke `git-secret` using `wsl git-secret`. + - Alternatively you can setup alias in CMD to shorten the syntax. Please refer to [this SO answer](https://stackoverflow.com/a/65823225) for the instruction. Some recommended aliases are: + + ```bat + @echo off + + :: Commands + DOSKEY ls=dir /B $* + DOSKEY ll=dir /a $* + DOSKEY git-secret=wsl git-secret $* + DOSKEY gs=wsl git-secret $* + ``` + + Now you can invoke `git-secret` in CMD using `git-secret` or `gs`. + + - For Powershell users, similar behaviours can be achieved using `Set-Alias` and `profile.ps1`. Please refer this [SO thread](https://stackoverflow.com/questions/61081434/how-do-i-create-a-permanent-alias-file-in-powershell-core) as an example. + +# PR guideline + +## Common conventions + +- Review should be done as soon as possible (within 2 business days). +- PR title: [ticket] One-line description (example: [AUR-385, AUR-388] Declare BaseComponent and decide LLM call interface). +- [Encouraged] Provide a quick description in the PR, so that: + - Reviewers can quickly understand the direction of the PR. + - It will be included in the commit message when the PR is merged. + +## Environment caching on PR + +- To speed up CI, environments are cached based on the version specified in `__init__.py`. +- Since dependencies versions in `setup.py` are not pinned, you need to pump the version in order to use a new environment. That environment will then be cached and used by your subsequence commits within the PR, until you pump the version again +- The new environment created during your PR is cached and will be available to others once the PR is merged. +- If you are experimenting with new dependencies and want a fresh environment every time, add `[ignore cache]` in your commit message. The CI will create a fresh environment to run your commit and then discard it. +- If your PR include updated dependencies, the recommended workflow would be: + - Doing development as usual. + - When you want to run the CI, push a commit with the message containing `[ignore cache]`. + - Once the PR is final, pump the version in `__init__.py` and push a final commit not containing `[ignore cache]`. + +Examples: https://github.com/Cinnamon/kotaemon/pull/2 + +## Merge PR guideline + +- Use squash and merge option +- 1st line message is the PR title. +- The text area is the PR description. + +![image](https://github.com/Cinnamon/kotaemon/assets/35283585/e2593010-d7ef-46e3-8719-6fcae0315b5d) +![image](https://github.com/Cinnamon/kotaemon/assets/35283585/bfe6a117-85cd-4dd4-b432-197c791a9901) + +## Develop pipelines + +- Nodes +- Params +- Run function + +``` +from kotaemon.base import BaseComponent + +class Pipeline(BaseComponent): + llm: AzureOpenAIEmbedding + doc_store: BaseDocumentStore + + def run(self, input1, input2) -> str: + input = input1 + input2 + output = self.llm(input) + self.doc_store.add(output) + return output + +pipeline = Pipeline(llm=AzureOpenAILLM(), doc_store=InMemoryDocstore()) +output = pipeline("this is text1", "this is text2") +``` diff --git a/docs/create-a-component.md b/docs/create-a-component.md new file mode 100644 index 0000000..029bbe9 --- /dev/null +++ b/docs/create-a-component.md @@ -0,0 +1,71 @@ +# Creating a component + +A fundamental concept in kotaemon is "component". + +Anything that isn't data or data structure is a "component". A component can be +thought of as a step within a pipeline. It takes in some input, processes it, +and returns an output, just the same as a Python function! The output will then +become an input for the next component in a pipeline. In fact, a pipeline is just +a component. More appropriately, a nested component: a component that makes use of one or more other components in +the processing step. So in reality, there isn't a difference between a pipeline +and a component! Because of that, in kotaemon, we will consider them the +same as "component". + +To define a component, you will: + +1. Create a class that subclasses from `kotaemon.base.BaseComponent` +2. Declare init params with type annotation +3. Declare nodes (nodes are just other components!) with type annotation +4. Implement the processing logic in `run`. + +The syntax of a component is as follow: + +```python +from kotaemon.base import BaseComponent +from kotaemon.llms import AzureChatOpenAI +from kotaemon.parsers import RegexExtractor + + +class FancyPipeline(BaseComponent): + param1: str = "This is param1" + param2: int = 10 + param3: float + + node1: BaseComponent # this is a node because of BaseComponent type annotation + node2: AzureChatOpenAI # this is also a node because AzureChatOpenAI subclasses BaseComponent + node3: RegexExtractor # this is also a node bceause RegexExtractor subclasses BaseComponent + + def run(self, some_text: str): + prompt = (self.param1 + some_text) * int(self.param2 + self.param3) + llm_pred = self.node2(prompt).text + matches = self.node3(llm_pred) + return matches +``` + +Then this component can be used as follow: + +```python +llm = AzureChatOpenAI(endpoint="some-endpont") +extractor = RegexExtractor(pattern=["yes", "Yes"]) + +component = FancyPipeline( + param1="Hello" + param3=1.5 + node1=llm, + node2=llm, + node3=extractor +) +component("goodbye") +``` + +This way, we can define each operation as a reusable component, and use them to +compose larger reusable components! + +## Benefits of component + +By defining a component as above, we formally encapsulate all the necessary +information inside a single class. This introduces several benefits: + +1. Allow tools like promptui to inspect the inner working of a component in + order to automatically generate the promptui. +2. Allow visualizing a pipeline for debugging purpose. diff --git a/docs/data-components.md b/docs/data-components.md new file mode 100644 index 0000000..f13f17d --- /dev/null +++ b/docs/data-components.md @@ -0,0 +1,32 @@ +The data & data structure components include: + +- The `Document` class. +- The document store. +- The vector store. + +### Data Loader + +- PdfLoader +- Layout-aware with table parsing PdfLoader + + - MathPixLoader: To use this loader, you need MathPix API key, refer to [mathpix docs](https://docs.mathpix.com/#introduction) for more information + - OCRLoader: This loader uses lib-table and Flax pipeline to perform OCR and read table structure from PDF file (TODO: add more info about deployment of this module). + - Output: + + - Document: text + metadata to identify whether it is table or not + + ``` + - "source": source file name + - "type": "table" or "text" + - "table_origin": original table in markdown format (to be feed to LLM or visualize using external tools) + - "page_label": page number in the original PDF document + ``` + +### Document Store + +- InMemoryDocumentStore + +### Vector Store + +- ChromaVectorStore +- InMemoryVectorStore diff --git a/docs/extra/css/code_select.css b/docs/extra/css/code_select.css new file mode 100644 index 0000000..0cd1c98 --- /dev/null +++ b/docs/extra/css/code_select.css @@ -0,0 +1,5 @@ +.language-pycon .gp, +.language-pycon .go { + /* Generic.Prompt, Generic.Output */ + user-select: none; +} diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..612c7a5 --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +--8<-- "README.md" diff --git a/docs/overview.md b/docs/overview.md new file mode 100644 index 0000000..c55c991 --- /dev/null +++ b/docs/overview.md @@ -0,0 +1,75 @@ +## Introduction + +`kotaemon` library focuses on the AI building blocks to implement the Kotaemon. It can be used in both client project and in product development. It consists of base interfaces, core components and a list of utilities: + +- Base interfaces: `kotaemon` defines the base interface of a component in a pipeline. A pipeline is also a component. By clearly define this interface, a pipeline of steps can be easily constructed and orchestrated. +- Core components: `kotaemon` implements (or wraps 3rd-party libraries like Langchain, llama-index,... when possible) commonly used components in kotaemon use cases. Some of these components are: LLM, vector store, document store, retriever... For a detailed list and description of these components, please refer to the [Pipeline Components](Pipeline-Components) and [Data & Data Structure Components](Data-&-Data-Structure-Components) sections. +- List of utilities: `lib-knowledge` provides utilities and tools that are usually needed in client project. For example, it provides a prompt engineering UI for AI developers in a project to quickly create a prompt engineering tool for DMs and QALs. It also provides a command to quickly spin up a project code base. For a full list and description of these utilities, please refer to the [Utilities](Utilities) section. + +```mermaid +mindmap + root((kotaemon)) + Base Interfaces + Document + LLMInterface + RetrievedDocument + BaseEmbeddings + BaseChat + BaseCompletion + ... + Core Components + LLMs + AzureOpenAI + OpenAI + Embeddings + AzureOpenAI + OpenAI + HuggingFaceEmbedding + VectorStore + InMemoryVectorstore + ChromaVectorstore + Agent + Tool + DocumentStore + ... + Utilities + Scaffold project + PromptUI + Documentation Support +``` + +## Expected benefit + +Before `kotaemon`: + +- Starting everything from scratch. +- Knowledge and expertise is fragmented. +- Nothing to reuse. +- No way to collaborate between tech and non-tech experts. + +`kotaemon` expects to completely revolutionize the way we are building LLM-related projects. It helps the company side-steps those issues by: + +- Standardize the interface to (1) make building LLM pipeline clearer (2) more reasonable to integrate pipelines between different projects. +- Centralize LLM-related technical components into 1 place. Avoid fragmented technology development. Easy to find the LLM-related technology inside the company. +- Centralize bug fixes and improvements in 1 place. +- Reduce boilerplate code during project development. +- Lightning fast prototyping. + +## Install + +The kotaemon can be installed from source with: + +``` +pip install kotaemon@git+ssh://git@github.com/Cinnamon/kotaemon.git +``` + +or from Cinnamon's internal python package index: + +``` +pip install kotaemon --extra-index-url https://ian_devpi.promptui.dm.cinnamon.is/root/packages +``` + +## Example use cases + +- Start a project from scratch: `kh start-project` +- Run prompt engineering UI tool: `kh promptui export`, then `kh promptui run`. diff --git a/docs/scripts/generate_examples_docs.py b/docs/scripts/generate_examples_docs.py new file mode 100644 index 0000000..f9e5746 --- /dev/null +++ b/docs/scripts/generate_examples_docs.py @@ -0,0 +1,65 @@ +# import shutil +from pathlib import Path +from typing import Any, Iterable + +import mkdocs_gen_files + +# get the root source code directory +doc_dir_name = "docs" +doc_dir = Path(__file__) +while doc_dir.name != doc_dir_name and doc_dir != doc_dir.parent: + doc_dir = doc_dir.parent + +if doc_dir == doc_dir.parent: + raise ValueError(f"root_name ({doc_dir_name}) not in path ({str(Path(__file__))}).") + + +def generate_docs_for_examples_readme( + examples_dir: Path, target_doc_folder: str, ignored_modules: Iterable[Any] = [] +): + if not examples_dir.is_dir(): + raise ModuleNotFoundError(str(examples_dir)) + + nav = mkdocs_gen_files.Nav() + + for path in sorted(examples_dir.rglob("*README.md")): + # ignore modules with name starts with underscore (i.e. __init__) + if path.name.startswith("_") or path.name.startswith("test"): + continue + + module_path = path.parent.relative_to(examples_dir).with_suffix("") + doc_path = path.parent.relative_to(examples_dir).with_suffix(".md") + full_doc_path = Path(target_doc_folder, doc_path) + + parts = list(module_path.parts) + identifier = ".".join(parts) + + if "tests" in parts: + continue + + ignore = False + for each_module in ignored_modules: + if identifier.startswith(each_module): + ignore = True + break + if ignore: + continue + + nav_titles = [name.replace("_", " ").title() for name in parts] + nav[nav_titles] = doc_path.as_posix() + + with mkdocs_gen_files.open(full_doc_path, "w") as f: + f.write(f'--8<-- "{path.relative_to(examples_dir.parent)}"') + + mkdocs_gen_files.set_edit_path( + full_doc_path, Path("..") / path.relative_to(examples_dir.parent) + ) + + with mkdocs_gen_files.open(f"{target_doc_folder}/NAV.md", "w") as nav_file: + nav_file.writelines(nav.build_literate_nav()) + + +generate_docs_for_examples_readme( + examples_dir=doc_dir.parent / "examples", + target_doc_folder="examples", +) diff --git a/docs/scripts/generate_reference_docs.py b/docs/scripts/generate_reference_docs.py new file mode 100644 index 0000000..878fd51 --- /dev/null +++ b/docs/scripts/generate_reference_docs.py @@ -0,0 +1,75 @@ +# import shutil +from pathlib import Path +from typing import Any, Iterable + +import mkdocs_gen_files + +# get the root source code directory +doc_dir_name = "docs" +doc_dir = Path(__file__) +while doc_dir.name != doc_dir_name and doc_dir != doc_dir.parent: + doc_dir = doc_dir.parent + +if doc_dir == doc_dir.parent: + raise ValueError(f"root_name ({doc_dir_name}) not in path ({str(Path(__file__))}).") + + +def generate_docs_for_src_code( + code_dir: Path, target_doc_folder: str, ignored_modules: Iterable[Any] = [] +): + if not code_dir.is_dir(): + raise ModuleNotFoundError(str(code_dir)) + + nav = mkdocs_gen_files.Nav() + + for path in sorted(code_dir.rglob("*.py")): + # ignore modules with name starts with underscore (i.e. __init__) + # if path.name.startswith("_") or path.name.startswith("test"): + # continue + + module_path = path.relative_to(code_dir).with_suffix("") + doc_path = path.relative_to(code_dir).with_suffix(".md") + full_doc_path = Path(target_doc_folder, doc_path) + + parts = list(module_path.parts) + + if parts[-1] == "__init__": + doc_path = doc_path.with_name("index.md") + full_doc_path = full_doc_path.with_name("index.md") + parts.pop() + + if not parts: + continue + + if "tests" in parts: + continue + + identifier = ".".join(parts) + ignore = False + for each_module in ignored_modules: + if identifier.startswith(each_module): + ignore = True + break + if ignore: + continue + + nav_titles = [name.replace("_", " ").title() for name in parts] + nav[nav_titles] = doc_path.as_posix() + + with mkdocs_gen_files.open(full_doc_path, "w") as f: + f.write(f"::: {identifier}") + + # this method works in docs folder + mkdocs_gen_files.set_edit_path( + full_doc_path, Path("..") / path.relative_to(code_dir.parent) + ) + + with mkdocs_gen_files.open(f"{target_doc_folder}/NAV.md", "w") as nav_file: + nav_file.writelines(nav.build_literate_nav()) + + +generate_docs_for_src_code( + code_dir=doc_dir.parent / "kotaemon", + target_doc_folder="reference", + ignored_modules={"contribs"}, +) diff --git a/docs/theme/assets/pymdownx-extras/extra-fb5a2a1c86.css b/docs/theme/assets/pymdownx-extras/extra-fb5a2a1c86.css new file mode 100644 index 0000000..6f906c0 --- /dev/null +++ b/docs/theme/assets/pymdownx-extras/extra-fb5a2a1c86.css @@ -0,0 +1,2 @@ +@charset "UTF-8";:root>*{--md-code-link-bg-color:hsla(0, 0%, 96%, 1);--md-code-link-accent-bg-color:var(--md-code-link-bg-color);--md-default-bg-color--trans:rgb(100%, 100%, 100%, 0);--md-code-title-bg-color:var(--md-code-bg-color);--md-code-inline-bg-color:var(--md-code-bg-color);--md-code-special-bg-color:#e8e8e8;--md-code-alternate-bg-color:var(--md-code-bg-color);--md-code-hl-punctuation-color:var(--md-code-fg-color);--md-code-hl-namespace-color:var(--md-code-fg-color);--md-code-hl-entity-color:var(--md-code-hl-keyword-color);--md-code-hl-tag-color:var(--md-code-hl-keyword-color);--md-code-hl-builtin-color:var(--md-code-hl-constant-color);--md-code-hl-class-color:var(--md-code-hl-function-color);--md-typeset-a-color:#00bcd4;--md-progress-stripe:var(--md-default-bg-color--lighter);--md-progress-100:#00e676;--md-progress-80:#00e676;--md-progress-60:#fbc02d;--md-progress-40:#ff9100;--md-progress-20:#ff5252;--md-progress-0:#ff1744;--md-typeset-kbd-color:#ebebeb;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-kbd-accent-color:hsla(0, 100%, 100%, 1)}:root>[data-md-color-scheme=slate]{--md-code-link-bg-color:hsla(232, 15%, 15%, 1);--md-code-link-accent-bg-color:var(--md-code-link-bg-color);--md-code-special-bg-color:#2b2d3b;--md-default-bg-color--trans:hsla(232,15%,15%, 0);--md-typeset-kbd-color:var(--md-default-fg-color--lightest);--md-typeset-kbd-border-color:#1a1c24;--md-typeset-kbd-accent-color:var(--md-default-fg-color--lighter)}:root>[data-md-color-scheme=dracula]{--md-default-fg-color:rgba(248, 248, 242, 0.87);--md-default-fg-color--light:rgba(248, 248, 242, 0.54);--md-default-fg-color--lighter:rgba(248, 248, 242, 0.16);--md-default-fg-color--lightest:rgba(248, 248, 242, 0.07);--md-default-autocomplete-fg-color:rgba(248, 248, 242, 0.4);--md-shadow-z2:0 0.2rem 0.5rem hsla(0, 0%, 0%, 0.3),0 0 0.05rem hsla(0, 0%, 0%, 0.2);--md-default-bg-color:var(--md-default-bg-color--darkest);--md-default-bg-color--light:rgba(50, 52, 67, 0.7);--md-default-bg-color--lighter:rgba(50, 52, 67, 0.3);--md-default-bg-color--lightest:rgba(50, 52, 67, 0.12);--md-default-bg-color--trans:rgba(50, 52, 67, 0);--md-default-bg-color--dark:#2b2e3b;--md-default-bg-color--darker:#252732;--md-default-bg-color--darkest:#1e2029;--md-default-bg-color--ultra-dark:#111217;--md-text-color:var(--md-default-fg-color);--md-typeset-color:var(--md-default-fg-color);--md-admonition-fg-color:var(--md-default-fg-color);--md-code-fg-color:hsl(60, 30%, 96%);--md-code-bg-color:hsl(231, 15%, 18%);--md-code-title-bg-color:var(--md-default-bg-color--ultra-dark);--md-code-inline-bg-color:#323443;--md-code-hl-operator-color:hsl(326, 100%, 74%);--md-code-hl-punctuation-color:hsl(60, 30%, 96%);--md-code-hl-string-color:hsl(65, 92%, 76%);--md-code-hl-special-color:hsl(265, 89%, 78%);--md-code-hl-number-color:hsl(265, 89%, 78%);--md-code-hl-keyword-color:hsl(326, 100%, 74%);--md-code-hl-name-color:hsl(60, 30%, 96%);--md-code-hl-constant-color:hsl(265, 89%, 78%);--md-code-hl-function-color:hsl(135, 94%, 65%);--md-code-hl-comment-color:hsl(225, 27%, 51%);--md-code-hl-variable-color:hsl(31, 100%, 71%);--md-code-hl-generic-color:hsl(225, 27%, 51%);--md-code-hl-color:hsl(231, 25%, 25%);--md-code-hl-entity-color:hsl(135, 94%, 65%);--md-code-hl-tag-color:hsl(326, 100%, 74%);--md-code-hl-namespace-color:hsl(60, 30%, 96%);--md-code-hl-builtin-color:hsl(191, 97%, 77%);--md-code-hl-class-color:hsl(191, 97%, 77%);--md-code-special-bg-color:#1c1e26;--md-code-alternate-bg-color:#3d3e49;--md-code-link-bg-color:#364653;--md-typeset-a-color:hsl(191, 97%, 77%);--md-typeset-mark-color:#6e7252;--md-typeset-del-color:#734568;--md-typeset-ins-color:#36724e;--md-progress-stripe:var(--md-default-bg-color--lightest);--md-progress-100:hsl(135, 94%, 65%);--md-progress-80:hsl(135, 92%, 79%);--md-progress-60:hsl(65, 92%, 76%);--md-progress-40:hsl(31, 100%, 71%);--md-progress-20:hsl(326, 100%, 74%);--md-progress-0:hsl(0, 100%, 67%);--md-typeset-kbd-color:var(--md-default-fg-color--lightest);--md-typeset-kbd-border-color:var(--md-default-bg-color--ultra-dark);--md-typeset-kbd-accent-color:var(--md-default-fg-color--lighter)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=red],[data-md-color-scheme=dracula][data-md-color-primary=red]{--md-primary-code-bg-color:#47303a;--md-primary-fg-color:hsla(0deg, 100%, 67%, 1);--md-primary-fg-color--transparent:hsla(0deg, 100%, 67%, 0.1);--md-primary-fg-color--light:hsla(0deg, 100%, 72%, 1);--md-primary-fg-color--dark:hsla(0deg, 100%, 62%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=pink],[data-md-color-scheme=dracula][data-md-color-primary=pink]{--md-primary-code-bg-color:#47354b;--md-primary-fg-color:hsla(326deg, 100%, 74%, 1);--md-primary-fg-color--transparent:hsla(326deg, 100%, 74%, 0.1);--md-primary-fg-color--light:hsla(326deg, 100%, 79%, 1);--md-primary-fg-color--dark:hsla(326deg, 100%, 69%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=purple],[data-md-color-scheme=dracula][data-md-color-primary=purple]{--md-primary-code-bg-color:#3e3952;--md-primary-fg-color:hsla(265deg, 89%, 78%, 1);--md-primary-fg-color--transparent:hsla(265deg, 89%, 78%, 0.1);--md-primary-fg-color--light:hsla(265deg, 89%, 83%, 1);--md-primary-fg-color--dark:hsla(265deg, 89%, 73%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=deep-purple],[data-md-color-scheme=dracula][data-md-color-primary=deep-purple]{--md-primary-code-bg-color:#3e3952;--md-primary-fg-color:hsla(265deg, 89%, 78%, 1);--md-primary-fg-color--transparent:hsla(265deg, 89%, 78%, 0.1);--md-primary-fg-color--light:hsla(265deg, 89%, 83%, 1);--md-primary-fg-color--dark:hsla(265deg, 89%, 73%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=blue],[data-md-color-scheme=dracula][data-md-color-primary=blue]{--md-primary-code-bg-color:#303446;--md-primary-fg-color:hsla(225deg, 27%, 51%, 1);--md-primary-fg-color--transparent:hsla(225deg, 27%, 51%, 0.1);--md-primary-fg-color--light:hsla(225deg, 27%, 56%, 1);--md-primary-fg-color--dark:hsla(225deg, 27%, 46%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=indigo],[data-md-color-scheme=dracula][data-md-color-primary=indigo]{--md-primary-code-bg-color:#303446;--md-primary-fg-color:hsla(225deg, 27%, 51%, 1);--md-primary-fg-color--transparent:hsla(225deg, 27%, 51%, 0.1);--md-primary-fg-color--light:hsla(225deg, 27%, 56%, 1);--md-primary-fg-color--dark:hsla(225deg, 27%, 46%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=light-blue],[data-md-color-scheme=dracula][data-md-color-primary=light-blue]{--md-primary-code-bg-color:#303446;--md-primary-fg-color:hsla(225deg, 27%, 51%, 1);--md-primary-fg-color--transparent:hsla(225deg, 27%, 51%, 0.1);--md-primary-fg-color--light:hsla(225deg, 27%, 56%, 1);--md-primary-fg-color--dark:hsla(225deg, 27%, 46%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=cyan],[data-md-color-scheme=dracula][data-md-color-primary=cyan]{--md-primary-code-bg-color:#364653;--md-primary-fg-color:hsla(191deg, 97%, 77%, 1);--md-primary-fg-color--transparent:hsla(191deg, 97%, 77%, 0.1);--md-primary-fg-color--light:hsla(191deg, 97%, 82%, 1);--md-primary-fg-color--dark:hsla(191deg, 97%, 72%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=teal],[data-md-color-scheme=dracula][data-md-color-primary=teal]{--md-primary-code-bg-color:#364653;--md-primary-fg-color:hsla(191deg, 97%, 77%, 1);--md-primary-fg-color--transparent:hsla(191deg, 97%, 77%, 0.1);--md-primary-fg-color--light:hsla(191deg, 97%, 82%, 1);--md-primary-fg-color--dark:hsla(191deg, 97%, 72%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=green],[data-md-color-scheme=dracula][data-md-color-primary=green]{--md-primary-code-bg-color:#2d4840;--md-primary-fg-color:hsla(135deg, 94%, 65%, 1);--md-primary-fg-color--transparent:hsla(135deg, 94%, 65%, 0.1);--md-primary-fg-color--light:hsla(135deg, 94%, 70%, 1);--md-primary-fg-color--dark:hsla(135deg, 94%, 60%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=light-green],[data-md-color-scheme=dracula][data-md-color-primary=light-green]{--md-primary-code-bg-color:#2d4840;--md-primary-fg-color:hsla(135deg, 94%, 65%, 1);--md-primary-fg-color--transparent:hsla(135deg, 94%, 65%, 0.1);--md-primary-fg-color--light:hsla(135deg, 94%, 70%, 1);--md-primary-fg-color--dark:hsla(135deg, 94%, 60%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=lime],[data-md-color-scheme=dracula][data-md-color-primary=lime]{--md-primary-code-bg-color:#2d4840;--md-primary-fg-color:hsla(135deg, 94%, 65%, 1);--md-primary-fg-color--transparent:hsla(135deg, 94%, 65%, 0.1);--md-primary-fg-color--light:hsla(135deg, 94%, 70%, 1);--md-primary-fg-color--dark:hsla(135deg, 94%, 60%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=yellow],[data-md-color-scheme=dracula][data-md-color-primary=yellow]{--md-primary-code-bg-color:#454842;--md-primary-fg-color:hsla(65deg, 92%, 76%, 1);--md-primary-fg-color--transparent:hsla(65deg, 92%, 76%, 0.1);--md-primary-fg-color--light:hsla(65deg, 92%, 81%, 1);--md-primary-fg-color--dark:hsla(65deg, 92%, 71%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=amber],[data-md-color-scheme=dracula][data-md-color-primary=amber]{--md-primary-code-bg-color:#454842;--md-primary-fg-color:hsla(65deg, 92%, 76%, 1);--md-primary-fg-color--transparent:hsla(65deg, 92%, 76%, 0.1);--md-primary-fg-color--light:hsla(65deg, 92%, 81%, 1);--md-primary-fg-color--dark:hsla(65deg, 92%, 71%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=orange],[data-md-color-scheme=dracula][data-md-color-primary=orange]{--md-primary-code-bg-color:#473e3d;--md-primary-fg-color:hsla(31deg, 100%, 71%, 1);--md-primary-fg-color--transparent:hsla(31deg, 100%, 71%, 0.1);--md-primary-fg-color--light:hsla(31deg, 100%, 76%, 1);--md-primary-fg-color--dark:hsla(31deg, 100%, 66%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=deep-orange],[data-md-color-scheme=dracula][data-md-color-primary=deep-orange]{--md-primary-code-bg-color:#473e3d;--md-primary-fg-color:hsla(31deg, 100%, 71%, 1);--md-primary-fg-color--transparent:hsla(31deg, 100%, 71%, 0.1);--md-primary-fg-color--light:hsla(31deg, 100%, 76%, 1);--md-primary-fg-color--dark:hsla(31deg, 100%, 66%, 1);--md-primary-bg-color:var(--md-default-bg-color);--md-primary-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=red],[data-md-color-scheme=dracula][data-md-color-accent=red]{--md-code-link-accent-bg-color:#472c36;--md-accent-fg-color:hsla(0deg, 100%, 62%, 1);--md-accent-fg-color--transparent:hsla(0deg, 100%, 62%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=pink],[data-md-color-scheme=dracula][data-md-color-accent=pink]{--md-code-link-accent-bg-color:#473149;--md-accent-fg-color:hsla(326deg, 100%, 69%, 1);--md-accent-fg-color--transparent:hsla(326deg, 100%, 69%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=purple],[data-md-color-scheme=dracula][data-md-color-accent=purple]{--md-code-link-accent-bg-color:#3c3652;--md-accent-fg-color:hsla(265deg, 89%, 73%, 1);--md-accent-fg-color--transparent:hsla(265deg, 89%, 73%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=deep-purple],[data-md-color-scheme=dracula][data-md-color-accent=deep-purple]{--md-code-link-accent-bg-color:#3c3652;--md-accent-fg-color:hsla(265deg, 89%, 73%, 1);--md-accent-fg-color--transparent:hsla(265deg, 89%, 73%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=blue],[data-md-color-scheme=dracula][data-md-color-accent=blue]{--md-code-link-accent-bg-color:#2e3243;--md-accent-fg-color:hsla(225deg, 27%, 46%, 1);--md-accent-fg-color--transparent:hsla(225deg, 27%, 46%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=indigo],[data-md-color-scheme=dracula][data-md-color-accent=indigo]{--md-code-link-accent-bg-color:#2e3243;--md-accent-fg-color:hsla(225deg, 27%, 46%, 1);--md-accent-fg-color--transparent:hsla(225deg, 27%, 46%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=light-blue],[data-md-color-scheme=dracula][data-md-color-accent=light-blue]{--md-code-link-accent-bg-color:#2e3243;--md-accent-fg-color:hsla(225deg, 27%, 46%, 1);--md-accent-fg-color--transparent:hsla(225deg, 27%, 46%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=cyan],[data-md-color-scheme=dracula][data-md-color-accent=cyan]{--md-code-link-accent-bg-color:#324553;--md-accent-fg-color:hsla(191deg, 97%, 72%, 1);--md-accent-fg-color--transparent:hsla(191deg, 97%, 72%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=teal],[data-md-color-scheme=dracula][data-md-color-accent=teal]{--md-code-link-accent-bg-color:#324553;--md-accent-fg-color:hsla(191deg, 97%, 72%, 1);--md-accent-fg-color--transparent:hsla(191deg, 97%, 72%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=green],[data-md-color-scheme=dracula][data-md-color-accent=green]{--md-code-link-accent-bg-color:#2a483d;--md-accent-fg-color:hsla(135deg, 94%, 60%, 1);--md-accent-fg-color--transparent:hsla(135deg, 94%, 60%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=light-green],[data-md-color-scheme=dracula][data-md-color-accent=light-green]{--md-code-link-accent-bg-color:#2a483d;--md-accent-fg-color:hsla(135deg, 94%, 60%, 1);--md-accent-fg-color--transparent:hsla(135deg, 94%, 60%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=lime],[data-md-color-scheme=dracula][data-md-color-accent=lime]{--md-code-link-accent-bg-color:#2a483d;--md-accent-fg-color:hsla(135deg, 94%, 60%, 1);--md-accent-fg-color--transparent:hsla(135deg, 94%, 60%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=yellow],[data-md-color-scheme=dracula][data-md-color-accent=yellow]{--md-code-link-accent-bg-color:#45483e;--md-accent-fg-color:hsla(65deg, 92%, 71%, 1);--md-accent-fg-color--transparent:hsla(65deg, 92%, 71%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=amber],[data-md-color-scheme=dracula][data-md-color-accent=amber]{--md-code-link-accent-bg-color:#45483e;--md-accent-fg-color:hsla(65deg, 92%, 71%, 1);--md-accent-fg-color--transparent:hsla(65deg, 92%, 71%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=orange],[data-md-color-scheme=dracula][data-md-color-accent=orange]{--md-code-link-accent-bg-color:#473d39;--md-accent-fg-color:hsla(31deg, 100%, 66%, 1);--md-accent-fg-color--transparent:hsla(31deg, 100%, 66%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=deep-orange],[data-md-color-scheme=dracula][data-md-color-accent=deep-orange]{--md-code-link-accent-bg-color:#473d39;--md-accent-fg-color:hsla(31deg, 100%, 66%, 1);--md-accent-fg-color--transparent:hsla(31deg, 100%, 66%, 0.1);--md-accent-bg-color:var(--md-default-bg-color);--md-accent-bg-color--light:var(--md-default-bg-color--light)}:root{--md-heart:#ff5252;--md-heart-big:#ff1744}:root :focus-visible{outline-style:solid}:root [data-md-color-scheme=dracula]{--md-heart:hsl(326, 100%, 74%);--md-heart-big:hsl(0, 100%, 67%)}.md-typeset h4{margin:2em 0 1em}.md-typeset a.source-link{position:relative;top:-.6rem;float:right;color:var(--md-default-fg-color--lighter);transition:color 125ms}.md-typeset a.source-link:hover{color:var(--md-accent-fg-color)}.md-typeset a.source-link .twemoji{height:1.2rem}.md-typeset a.source-link .twemoji svg{width:1.2rem;height:1.2rem}.md-typeset div.highlight.md-max-height pre>code{max-height:15rem}.twemoji.heart-throb svg,.twemoji.heart-throb-hover svg{position:relative;color:var(--md-heart);animation:pulse 1.5s ease infinite}@keyframes pulse{0%{transform:scale(1)}40%{color:var(--md-heart-big);transform:scale(1.3)}50%{transform:scale(1.2)}60%{color:var(--md-heart-big);transform:scale(1.3)}100%{transform:scale(1)}}footer.sponsorship{text-align:center}footer.sponsorship hr{display:inline-block;width:1.6rem;margin:0 .7rem;vertical-align:middle;border-bottom:2px solid var(--md-default-fg-color--lighter)}footer.sponsorship:hover hr{border-color:var(--md-accent-fg-color)}footer.sponsorship:not(:hover) .twemoji.heart-throb-hover svg{color:var(--md-default-fg-color--lighter)!important}body:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=dracula] .md-icon .light-mode,body:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=dracula] .md-icon .system-mode,body:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=dracula] .md-icon .unknown-mode{display:none}body:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=default] .md-icon .dark-mode,body:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=default] .md-icon .system-mode,body:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=default] .md-icon .unknown-mode{display:none}body:not([data-md-prefers-color-scheme=true]):not([data-md-color-scheme=default]):not([data-md-color-scheme=dracula]) .md-icon .dark-mode,body:not([data-md-prefers-color-scheme=true]):not([data-md-color-scheme=default]):not([data-md-color-scheme=dracula]) .md-icon .light-mode,body:not([data-md-prefers-color-scheme=true]):not([data-md-color-scheme=default]):not([data-md-color-scheme=dracula]) .md-icon .system-mode{display:none}body[data-md-prefers-color-scheme=true] .md-icon .dark-mode,body[data-md-prefers-color-scheme=true] .md-icon .light-mode,body[data-md-prefers-color-scheme=true] .md-icon .unknown-mode{display:none}.md-header-nav__scheme{z-index:0}[data-md-toggle=search]:checked~.md-header .md-header-nav__scheme{display:none}.md-typeset .admonition,.md-typeset details{border-width:0;border-left-width:4px}:root>*{--md-admonition-bg-color:transparent;--md-admonition-icon--settings:url('data:image/svg+xml;charset=utf-8,');--md-admonition-bg-color--settings:rgba(170, 0, 255, 0.1);--md-admonition-icon-color--settings:#aa00ff;--md-admonition-shadow-color--settings:rgba(170, 0, 255, 0.1);--md-admonition-icon--new:url('data:image/svg+xml;charset=utf-8,');--md-admonition-bg-color--new:rgba(255, 214, 0, 0.1);--md-admonition-icon-color--new:#ffd600;--md-admonition-shadow-color--new:rgba(255, 214, 0, 0.1);--md-admonition-bg-color--note:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--note:hsl(51, 94%, 73%);--md-admonition-shadow-color--note:rgba(251, 231, 121, 0.1);--md-admonition-bg-color--abstract:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--abstract:hsl(191, 97%, 77%);--md-admonition-shadow-color--abstract:rgba(139, 232, 253, 0.1);--md-admonition-bg-color--info:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--info:hsl(190, 94%, 87%);--md-admonition-shadow-color--info:rgba(191, 243, 253, 0.1);--md-admonition-bg-color--tip:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--tip:hsl(161, 97%, 77%);--md-admonition-shadow-color--tip:rgba(139, 253, 217, 0.1);--md-admonition-bg-color--success:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--success:hsl(135, 94%, 65%);--md-admonition-shadow-color--success:rgba(82, 250, 124, 0.1);--md-admonition-bg-color--question:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--question:hsl(135, 92%, 79%);--md-admonition-shadow-color--question:rgba(152, 251, 177, 0.1);--md-admonition-bg-color--warning:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--warning:hsl(31, 100%, 71%);--md-admonition-shadow-color--warning:rgba(255, 184, 107, 0.1);--md-admonition-bg-color--failure:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--failure:hsl(0, 100%, 59%);--md-admonition-shadow-color--failure:rgba(255, 46, 46, 0.1);--md-admonition-bg-color--danger:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--danger:hsl(0, 100%, 67%);--md-admonition-shadow-color--danger:rgba(255, 87, 87, 0.1);--md-admonition-bg-color--bug:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--bug:hsl(325, 100%, 64%);--md-admonition-shadow-color--bug:rgba(255, 71, 179, 0.1);--md-admonition-bg-color--example:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--example:hsl(265, 89%, 78%);--md-admonition-shadow-color--example:rgba(191, 149, 249, 0.1);--md-admonition-bg-color--quote:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--quote:hsl(225, 8%, 51%);--md-admonition-shadow-color--quote:rgba(120, 125, 140, 0.1)}:root>[data-md-color-scheme=dracula]{--md-admonition-icon-color:$drac-dark-yellow}:root>[data-md-color-scheme=dracula]{--md-admonition-bg-color--settings:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--settings:hsl(326, 100%, 74%);--md-admonition-shadow-color--settings:rgba(255, 122, 198, 0.1)}:root>[data-md-color-scheme=dracula]{--md-admonition-bg-color--new:var(--md-default-bg-color--ultra-dark);--md-admonition-icon-color--new:hsl(65, 92%, 76%);--md-admonition-shadow-color--new:rgba(241, 250, 137, 0.1)}[data-md-color-scheme=dracula] .md-typeset .admonition,[data-md-color-scheme=dracula] .md-typeset details{border-color:var(--md-admonition-icon-color--note);box-shadow:var(--md-shadow-z2)}[data-md-color-scheme=dracula] .md-typeset .admonition:focus-within,[data-md-color-scheme=dracula] .md-typeset details:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details>summary{background-color:var(--md-admonition-bg-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details>summary::before{background-color:var(--md-admonition-icon-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details>summary::after{color:var(--md-admonition-icon-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition.note,[data-md-color-scheme=dracula] .md-typeset details.note{border-color:var(--md-admonition-icon-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition.note:focus-within,[data-md-color-scheme=dracula] .md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition.note>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.note>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.note>summary{background-color:var(--md-admonition-bg-color--note);border-color:var(--md-admonition-icon-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition.note>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.note>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.note>summary::before{background-color:var(--md-admonition-icon-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition.note>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.note>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.note>summary::after{color:var(--md-admonition-icon-color--note)}[data-md-color-scheme=dracula] .md-typeset .admonition.abstract,[data-md-color-scheme=dracula] .md-typeset details.abstract{border-color:var(--md-admonition-icon-color--abstract)}[data-md-color-scheme=dracula] .md-typeset .admonition.abstract:focus-within,[data-md-color-scheme=dracula] .md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--abstract)}[data-md-color-scheme=dracula] .md-typeset .admonition.abstract>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.abstract>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.abstract>summary{background-color:var(--md-admonition-bg-color--abstract);border-color:var(--md-admonition-icon-color--abstract)}[data-md-color-scheme=dracula] .md-typeset .admonition.abstract>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.abstract>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.abstract>summary::before{background-color:var(--md-admonition-icon-color--abstract)}[data-md-color-scheme=dracula] .md-typeset .admonition.abstract>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.abstract>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.abstract>summary::after{color:var(--md-admonition-icon-color--abstract)}[data-md-color-scheme=dracula] .md-typeset .admonition.info,[data-md-color-scheme=dracula] .md-typeset details.info{border-color:var(--md-admonition-icon-color--info)}[data-md-color-scheme=dracula] .md-typeset .admonition.info:focus-within,[data-md-color-scheme=dracula] .md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--info)}[data-md-color-scheme=dracula] .md-typeset .admonition.info>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.info>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.info>summary{background-color:var(--md-admonition-bg-color--info);border-color:var(--md-admonition-icon-color--info)}[data-md-color-scheme=dracula] .md-typeset .admonition.info>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.info>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.info>summary::before{background-color:var(--md-admonition-icon-color--info)}[data-md-color-scheme=dracula] .md-typeset .admonition.info>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.info>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.info>summary::after{color:var(--md-admonition-icon-color--info)}[data-md-color-scheme=dracula] .md-typeset .admonition.tip,[data-md-color-scheme=dracula] .md-typeset details.tip{border-color:var(--md-admonition-icon-color--tip)}[data-md-color-scheme=dracula] .md-typeset .admonition.tip:focus-within,[data-md-color-scheme=dracula] .md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--tip)}[data-md-color-scheme=dracula] .md-typeset .admonition.tip>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.tip>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.tip>summary{background-color:var(--md-admonition-bg-color--tip);border-color:var(--md-admonition-icon-color--tip)}[data-md-color-scheme=dracula] .md-typeset .admonition.tip>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.tip>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.tip>summary::before{background-color:var(--md-admonition-icon-color--tip)}[data-md-color-scheme=dracula] .md-typeset .admonition.tip>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.tip>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.tip>summary::after{color:var(--md-admonition-icon-color--tip)}[data-md-color-scheme=dracula] .md-typeset .admonition.success,[data-md-color-scheme=dracula] .md-typeset details.success{border-color:var(--md-admonition-icon-color--success)}[data-md-color-scheme=dracula] .md-typeset .admonition.success:focus-within,[data-md-color-scheme=dracula] .md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--success)}[data-md-color-scheme=dracula] .md-typeset .admonition.success>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.success>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.success>summary{background-color:var(--md-admonition-bg-color--success);border-color:var(--md-admonition-icon-color--success)}[data-md-color-scheme=dracula] .md-typeset .admonition.success>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.success>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.success>summary::before{background-color:var(--md-admonition-icon-color--success)}[data-md-color-scheme=dracula] .md-typeset .admonition.success>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.success>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.success>summary::after{color:var(--md-admonition-icon-color--success)}[data-md-color-scheme=dracula] .md-typeset .admonition.question,[data-md-color-scheme=dracula] .md-typeset details.question{border-color:var(--md-admonition-icon-color--question)}[data-md-color-scheme=dracula] .md-typeset .admonition.question:focus-within,[data-md-color-scheme=dracula] .md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--question)}[data-md-color-scheme=dracula] .md-typeset .admonition.question>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.question>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.question>summary{background-color:var(--md-admonition-bg-color--question);border-color:var(--md-admonition-icon-color--question)}[data-md-color-scheme=dracula] .md-typeset .admonition.question>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.question>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.question>summary::before{background-color:var(--md-admonition-icon-color--question)}[data-md-color-scheme=dracula] .md-typeset .admonition.question>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.question>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.question>summary::after{color:var(--md-admonition-icon-color--question)}[data-md-color-scheme=dracula] .md-typeset .admonition.warning,[data-md-color-scheme=dracula] .md-typeset details.warning{border-color:var(--md-admonition-icon-color--warning)}[data-md-color-scheme=dracula] .md-typeset .admonition.warning:focus-within,[data-md-color-scheme=dracula] .md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--warning)}[data-md-color-scheme=dracula] .md-typeset .admonition.warning>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.warning>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.warning>summary{background-color:var(--md-admonition-bg-color--warning);border-color:var(--md-admonition-icon-color--warning)}[data-md-color-scheme=dracula] .md-typeset .admonition.warning>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.warning>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.warning>summary::before{background-color:var(--md-admonition-icon-color--warning)}[data-md-color-scheme=dracula] .md-typeset .admonition.warning>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.warning>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.warning>summary::after{color:var(--md-admonition-icon-color--warning)}[data-md-color-scheme=dracula] .md-typeset .admonition.failure,[data-md-color-scheme=dracula] .md-typeset details.failure{border-color:var(--md-admonition-icon-color--failure)}[data-md-color-scheme=dracula] .md-typeset .admonition.failure:focus-within,[data-md-color-scheme=dracula] .md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--failure)}[data-md-color-scheme=dracula] .md-typeset .admonition.failure>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.failure>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.failure>summary{background-color:var(--md-admonition-bg-color--failure);border-color:var(--md-admonition-icon-color--failure)}[data-md-color-scheme=dracula] .md-typeset .admonition.failure>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.failure>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.failure>summary::before{background-color:var(--md-admonition-icon-color--failure)}[data-md-color-scheme=dracula] .md-typeset .admonition.failure>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.failure>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.failure>summary::after{color:var(--md-admonition-icon-color--failure)}[data-md-color-scheme=dracula] .md-typeset .admonition.danger,[data-md-color-scheme=dracula] .md-typeset details.danger{border-color:var(--md-admonition-icon-color--danger)}[data-md-color-scheme=dracula] .md-typeset .admonition.danger:focus-within,[data-md-color-scheme=dracula] .md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--danger)}[data-md-color-scheme=dracula] .md-typeset .admonition.danger>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.danger>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.danger>summary{background-color:var(--md-admonition-bg-color--danger);border-color:var(--md-admonition-icon-color--danger)}[data-md-color-scheme=dracula] .md-typeset .admonition.danger>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.danger>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.danger>summary::before{background-color:var(--md-admonition-icon-color--danger)}[data-md-color-scheme=dracula] .md-typeset .admonition.danger>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.danger>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.danger>summary::after{color:var(--md-admonition-icon-color--danger)}[data-md-color-scheme=dracula] .md-typeset .admonition.bug,[data-md-color-scheme=dracula] .md-typeset details.bug{border-color:var(--md-admonition-icon-color--bug)}[data-md-color-scheme=dracula] .md-typeset .admonition.bug:focus-within,[data-md-color-scheme=dracula] .md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--bug)}[data-md-color-scheme=dracula] .md-typeset .admonition.bug>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.bug>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.bug>summary{background-color:var(--md-admonition-bg-color--bug);border-color:var(--md-admonition-icon-color--bug)}[data-md-color-scheme=dracula] .md-typeset .admonition.bug>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.bug>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.bug>summary::before{background-color:var(--md-admonition-icon-color--bug)}[data-md-color-scheme=dracula] .md-typeset .admonition.bug>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.bug>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.bug>summary::after{color:var(--md-admonition-icon-color--bug)}[data-md-color-scheme=dracula] .md-typeset .admonition.example,[data-md-color-scheme=dracula] .md-typeset details.example{border-color:var(--md-admonition-icon-color--example)}[data-md-color-scheme=dracula] .md-typeset .admonition.example:focus-within,[data-md-color-scheme=dracula] .md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--example)}[data-md-color-scheme=dracula] .md-typeset .admonition.example>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.example>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.example>summary{background-color:var(--md-admonition-bg-color--example);border-color:var(--md-admonition-icon-color--example)}[data-md-color-scheme=dracula] .md-typeset .admonition.example>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.example>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.example>summary::before{background-color:var(--md-admonition-icon-color--example)}[data-md-color-scheme=dracula] .md-typeset .admonition.example>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.example>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.example>summary::after{color:var(--md-admonition-icon-color--example)}[data-md-color-scheme=dracula] .md-typeset .admonition.quote,[data-md-color-scheme=dracula] .md-typeset details.quote{border-color:var(--md-admonition-icon-color--quote)}[data-md-color-scheme=dracula] .md-typeset .admonition.quote:focus-within,[data-md-color-scheme=dracula] .md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--quote)}[data-md-color-scheme=dracula] .md-typeset .admonition.quote>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.quote>.admonition-title,[data-md-color-scheme=dracula] .md-typeset details.quote>summary{background-color:var(--md-admonition-bg-color--quote);border-color:var(--md-admonition-icon-color--quote)}[data-md-color-scheme=dracula] .md-typeset .admonition.quote>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.quote>.admonition-title::before,[data-md-color-scheme=dracula] .md-typeset details.quote>summary::before{background-color:var(--md-admonition-icon-color--quote)}[data-md-color-scheme=dracula] .md-typeset .admonition.quote>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.quote>.admonition-title::after,[data-md-color-scheme=dracula] .md-typeset details.quote>summary::after{color:var(--md-admonition-icon-color--quote)}.md-typeset .admonition.config,.md-typeset .admonition.settings,.md-typeset details.config,.md-typeset details.settings{border-color:var(--md-admonition-icon-color--settings)}.md-typeset .admonition.config:focus-within,.md-typeset .admonition.settings:focus-within,.md-typeset details.config:focus-within,.md-typeset details.settings:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--settings)}.md-typeset .admonition.config>.admonition-title,.md-typeset .admonition.settings>.admonition-title,.md-typeset details.config>.admonition-title,.md-typeset details.config>summary,.md-typeset details.settings>.admonition-title,.md-typeset details.settings>summary{background-color:var(--md-admonition-bg-color--settings);border-color:var(--md-admonition-icon-color--settings)}.md-typeset .admonition.config>.admonition-title::before,.md-typeset .admonition.settings>.admonition-title::before,.md-typeset details.config>.admonition-title::before,.md-typeset details.config>summary::before,.md-typeset details.settings>.admonition-title::before,.md-typeset details.settings>summary::before{width:1rem;height:1rem;background-color:var(--md-admonition-icon-color--settings);background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--settings);mask-image:var(--md-admonition-icon--settings);content:" "}.md-typeset .admonition.config>.admonition-title::after,.md-typeset .admonition.settings>.admonition-title::after,.md-typeset details.config>.admonition-title::after,.md-typeset details.config>summary::after,.md-typeset details.settings>.admonition-title::after,.md-typeset details.settings>summary::after{color:var(--md-admonition-icon-color--settings)}.md-typeset .admonition.new,.md-typeset details.new{border-color:var(--md-admonition-icon-color--new)}.md-typeset .admonition.new:focus-within,.md-typeset details.new:focus-within{box-shadow:0 0 0 .2rem var(--md-admonition-shadow-color--new)}.md-typeset .admonition.new>.admonition-title,.md-typeset details.new>.admonition-title,.md-typeset details.new>summary{background-color:var(--md-admonition-bg-color--new);border-color:var(--md-admonition-icon-color--new)}.md-typeset .admonition.new>.admonition-title::before,.md-typeset details.new>.admonition-title::before,.md-typeset details.new>summary::before{width:1rem;height:1rem;background-color:var(--md-admonition-icon-color--new);background-size:1rem;-webkit-mask-image:var(--md-admonition-icon--new);mask-image:var(--md-admonition-icon--new);content:" "}.md-typeset .admonition.new>.admonition-title::after,.md-typeset details.new>.admonition-title::after,.md-typeset details.new>summary::after{color:var(--md-admonition-icon-color--new)}mjx-container[display=true]{font-size:120%!important}mjx-container:not([display]){font-size:100%!important}[data-md-color-scheme=dracula] .CtxtMenu_InfoContent pre,[data-md-color-scheme=dracula] .CtxtMenu_InfoSignature input,[data-md-color-scheme=slate] .CtxtMenu_InfoContent pre,[data-md-color-scheme=slate] .CtxtMenu_InfoSignature input{color:#000}[data-md-color-scheme=dracula] .CtxtMenu_Info,[data-md-color-scheme=dracula] .CtxtMenu_Menu,[data-md-color-scheme=slate] .CtxtMenu_Info,[data-md-color-scheme=slate] .CtxtMenu_Menu{box-shadow:0 10px 20px rgba(0,0,0,.5)}.md-typeset .arithmatex{overflow-x:auto!important;overflow-y:hidden!important}.katex-display .katex-html{display:flex!important;flex-direction:row;flex-wrap:nowrap;align-items:baseline;justify-content:space-between}.katex-display .katex-html .base{display:inline!important}.katex-display .katex-html .tag{position:relative!important;display:inline!important;margin-left:var(--margin-small)}.md-typeset del.critic,.md-typeset ins.critic,.md-typeset mark.critic{padding:0 .25em;color:unset;box-shadow:none}.md-typeset .critic.break{margin:0}.md-typeset details{overflow:hidden}.md-typeset details>summary:focus{outline-style:none}.highlight .kc{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne{color:var(--md-code-hl-class-color)}.highlight .mb{color:var(--md-code-hl-number-color)}.highlight .bp,.highlight .nb{color:var(--md-code-hl-builtin-color)}.highlight .nn{color:var(--md-code-hl-namespace-color)}.highlight .na,.highlight .nd,.highlight .ni{color:var(--md-code-hl-entity-color)}.highlight .nl,.highlight .nt{color:var(--md-code-hl-tag-color)}.md-typeset :not(pre)>code{margin:0;padding:0 .2941176471em;color:var(--md-code-fg-color);background-color:var(--md-code-inline-bg-color);border-radius:.1rem;box-shadow:none}.md-typeset a>code{color:inherit!important;background-color:var(--md-code-link-bg-color)!important;transition:color 125ms;transition:background-color 125ms}.md-typeset a>code *{color:var(--md-typeset-a-color)!important}.md-typeset a>code:hover{background-color:var(--md-code-link-accent-bg-color)!important}.md-typeset a>code:hover *{color:var(--md-accent-fg-color)!important}.md-typeset pre>code{outline:0}.md-typeset td code{word-break:normal}.md-typeset .highlight{-moz-tab-size:8;-o-tab-size:8;tab-size:8}.md-typeset .highlight+.result{border-width:.1rem}.md-typeset .highlight [data-linenos].special::before{background-color:var(--md-code-special-bg-color)}.md-typeset .highlighttable .linenodiv .special{margin-right:-.5882352941em;margin-left:-1.1764705882em;padding-right:.5882352941em;padding-left:1.1764705882em;background-color:var(--md-code-special-bg-color)}.md-typeset .highlight span.filename{position:relative;display:block;margin-top:1em;padding:.5em 1.1764705882em .5em 2.9411764706em;font-weight:700;font-size:.68rem;background-color:var(--md-code-title-bg-color);border-top-left-radius:.1rem;border-top-right-radius:.1rem}.md-typeset .highlight span.filename+pre{margin-top:0}.md-typeset .highlight span.filename+pre code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .highlight span.filename::before{position:absolute;left:.8823529412em;width:1.4705882353em;height:1.4705882353em;background-color:var(--md-default-fg-color);-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-typeset .collapse-code{position:relative;margin-top:1em;margin-bottom:1em}.md-typeset .collapse-code pre{margin-top:0;margin-bottom:0}.md-typeset .collapse-code input{display:none}.md-typeset .collapse-code input~.code-footer{width:100%;margin:0;padding:.25em .5em .25em 0}.md-typeset .collapse-code input~.code-footer label{position:relative;margin:.05em;padding:.15em .8em;color:var(--md-primary-bg-color);font-size:90%;background-color:var(--md-primary-fg-color);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;border-radius:.1rem;cursor:pointer;content:""}.md-typeset .collapse-code input~.code-footer label:hover{background-color:var(--md-accent-fg-color)}.md-typeset .collapse-code input~.code-footer label::before{position:absolute;top:.15em;left:.15em;display:block;box-sizing:border-box;width:1.25em;height:1.25em;background-color:var(--md-primary-bg-color);background-size:1.25em;content:""}.md-typeset .collapse-code input~.code-footer label.expand{display:none}.md-typeset .collapse-code input~.code-footer label.expand::before{-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .collapse-code input~.code-footer label.collapse::before{-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .collapse-code input:checked~.code-footer label.expand{display:inline}.md-typeset .collapse-code input:checked~.code-footer label.collapse{display:none}.md-typeset .collapse-code input:checked+div.highlight code{max-height:9.375em;overflow:hidden}.md-typeset .collapse-code input:checked~.code-footer{position:absolute;bottom:0;left:0;padding:2em .5em .5em .8rem;background-image:linear-gradient(to bottom,transparent,var(--md-default-bg-color) 80% 100%)}.md-typeset .keys .key-power::before{padding-right:.4em;content:"⏻"}.md-typeset .keys .key-fingerprint::before{padding-right:.4em;content:"☝"}:root>*{--magiclink-email-icon:url('data:image/svg+xml;charset=utf-8,');--magiclink-github-icon:url('data:image/svg+xml;charset=utf-8,');--magiclink-bitbucket-icon:url('data:image/svg+xml;charset=utf-8,');--magiclink-gitlab-icon:url('data:image/svg+xml;charset=utf-8,');--magiclink-commit-icon:url('data:image/svg+xml;charset=utf-8,');--magiclink-compare-icon:url('data:image/svg+xml;charset=utf-8,');--magiclink-pull-icon:url('data:image/svg+xml;charset=utf-8,');--magiclink-issue-icon:url('data:image/svg+xml;charset=utf-8,');--magiclink-discussion-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset a[href^="mailto:"]:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-email-icon);mask-image:var(--magiclink-email-icon)}.md-typeset .magiclink-commit:not(.magiclink-ignore),.md-typeset .magiclink-compare:not(.magiclink-ignore),.md-typeset .magiclink-discussion:not(.magiclink-ignore),.md-typeset .magiclink-issue:not(.magiclink-ignore),.md-typeset .magiclink-pull:not(.magiclink-ignore),.md-typeset .magiclink-repository:not(.magiclink-ignore),.md-typeset a[href^="mailto:"]:not(.magiclink-ignore){position:relative;padding-left:1.375em}.md-typeset .magiclink-commit:not(.magiclink-ignore)::before,.md-typeset .magiclink-compare:not(.magiclink-ignore)::before,.md-typeset .magiclink-discussion:not(.magiclink-ignore)::before,.md-typeset .magiclink-issue:not(.magiclink-ignore)::before,.md-typeset .magiclink-pull:not(.magiclink-ignore)::before,.md-typeset .magiclink-repository:not(.magiclink-ignore)::before,.md-typeset a[href^="mailto:"]:not(.magiclink-ignore)::before{position:absolute;top:0;left:0;display:block;box-sizing:border-box;width:1.25em;height:1.25em;background-color:var(--md-typeset-a-color);background-size:1.25em;transition:background-color 125ms;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;content:""}.md-typeset .magiclink-commit:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-compare:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-discussion:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-issue:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-pull:not(.magiclink-ignore):hover::before,.md-typeset .magiclink-repository:not(.magiclink-ignore):hover::before,.md-typeset a[href^="mailto:"]:not(.magiclink-ignore):hover::before{background-color:var(--md-accent-fg-color)}.md-typeset .magiclink-commit:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-commit-icon);mask-image:var(--magiclink-commit-icon)}.md-typeset .magiclink-compare:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-compare-icon);mask-image:var(--magiclink-compare-icon)}.md-typeset .magiclink-pull:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-pull-icon);mask-image:var(--magiclink-pull-icon)}.md-typeset .magiclink-issue:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-issue-icon);mask-image:var(--magiclink-issue-icon)}.md-typeset .magiclink-discussion:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-discussion-icon);mask-image:var(--magiclink-discussion-icon)}.md-typeset .magiclink-repository.magiclink-github:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-github-icon);mask-image:var(--magiclink-github-icon)}.md-typeset .magiclink-repository.magiclink-gitlab:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-gitlab-icon);mask-image:var(--magiclink-gitlab-icon)}.md-typeset .magiclink-repository.magiclink-bitbucket:not(.magiclink-ignore)::before{-webkit-mask-image:var(--magiclink-bitbucket-icon);mask-image:var(--magiclink-bitbucket-icon)}.md-typeset mark:not(.critic){box-shadow:none}.md-typeset .progress-label{position:absolute;width:100%;margin:0;color:var(--md-text-color);font-weight:700;line-height:1.4rem;white-space:nowrap;text-align:center;text-shadow:-.0625em -.0625em .375em var(--md-default-bg-color--light),.0625em -.0625em .375em var(--md-default-bg-color--light),-.0625em .0625em .375em var(--md-default-bg-color--light),.0625em .0625em .375em var(--md-default-bg-color--light)}.md-typeset .progress-bar{float:left;height:1.2rem;background-color:#2979ff}.md-typeset .candystripe-animate .progress-bar{animation:animate-stripes 3s linear infinite}.md-typeset .progress{position:relative;display:block;width:100%;height:1.2rem;margin:.5rem 0;background-color:var(--md-default-fg-color--lightest)}.md-typeset .progress.thin{height:.4rem;margin-top:.9rem}.md-typeset .progress.thin .progress-label{margin-top:-.4rem}.md-typeset .progress.thin .progress-bar{height:.4rem}.md-typeset .progress.candystripe .progress-bar{background-image:linear-gradient(135deg,var(--md-progress-stripe) 27%,transparent 27%,transparent 52%,var(--md-progress-stripe) 52%,var(--md-progress-stripe) 77%,transparent 77%,transparent);background-size:2rem 2rem}.md-typeset .progress-100plus .progress-bar{background-color:var(--md-progress-100)}.md-typeset .progress-80plus .progress-bar{background-color:var(--md-progress-80)}.md-typeset .progress-60plus .progress-bar{background-color:var(--md-progress-60)}.md-typeset .progress-40plus .progress-bar{background-color:var(--md-progress-40)}.md-typeset .progress-20plus .progress-bar{background-color:var(--md-progress-20)}.md-typeset .progress-0plus .progress-bar{background-color:var(--md-progress-0)}@keyframes animate-stripes{0%{background-position:0 0}100%{background-position:6rem 0}}[data-md-color-scheme=dracula] .md-typeset .tabbed-set>.tabbed-labels{box-shadow:0 -.05rem var(--md-default-fg-color--lighter) inset}.md-typeset .tabbed-alternate.tabbed-set .tabbed-control{width:2rem}.md-typeset .tabbed-alternate.tabbed-set .tabbed-control[hidden]{width:1.2rem;opacity:0}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block{padding:0 .6rem}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilite:only-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilitetable:only-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlight:only-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlighttable:only-child,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>pre:only-child{margin-right:-1.2rem;margin-left:-1.2rem;padding-right:.6rem;padding-left:.6rem}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilite:only-child span.filename,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.codehilitetable:only-child span.filename,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlight:only-child span.filename,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.highlighttable:only-child span.filename,.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>pre:only-child span.filename{margin-top:0}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.collapse-code:only-child{margin-top:0;margin-right:-1.2rem;margin-left:-1.2rem;padding-right:.6rem;padding-left:.6rem}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>.collapse-code:only-child>.code-footer{left:.6rem}.md-typeset .tabbed-alternate.tabbed-set>.tabbed-content>.tabbed-block>diagram-div:only-child{margin-right:-1.2rem;margin-left:-1.2rem;padding-right:.6rem;padding-left:.6rem}.js .md-typeset .tabbed-labels::before{background-color:var(--md-accent-fg-color)}[data-md-color-scheme=dracula] .md-typeset table:not([class]){box-shadow:var(--md-shadow-z2)}[data-md-color-scheme=dracula] .md-typeset table:not([class]) tr:hover{background-color:rgba(0,0,0,.08)}[data-md-color-scheme=dracula] .md-typeset table:not([class]) th{color:var(--md-text-color);background-color:var(--md-default-bg-color--ultra-dark);border-bottom:.05rem solid var(--md-primary-fg-color)}[data-md-color-scheme=dracula] .md-typeset table:not([class]) td{border-top:.05rem solid var(--md-default-fg-color--lighter)}[data-md-color-scheme=dracula] .md-typeset .task-list-control .task-list-indicator::before{background-color:var(--md-default-fg-color--lighter)}[data-md-color-scheme=dracula] .md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator::before{background-color:#51f97b}.md-typeset .headerlink{width:1em;height:1em;vertical-align:middle;background-color:var(--md-default-fg-color--lighter);background-size:1em;-webkit-mask-size:1em;mask-size:1em;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;visibility:visible;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .headerlink:hover,.md-typeset [id]:target .headerlink{background-color:var(--md-accent-fg-color)}diagram-div{overflow:auto}html{background-color:transparent}[data-md-component=announce] .twemoji{color:var(--md-primary-fg-color)}[data-md-color-scheme=dracula]{--md-text-color:var(--md-default-fg-color);background-color:var(--md-default-bg-color);--md-footer-bg-color:transparent;--md-footer-bg-color--dark:var(--md-default-bg-color--darkest);--md-header-fg-color:var(--md-text-color);--md-header-bg-color:var(--md-default-bg-color--darkest)}[data-md-color-scheme=dracula] .md-header{color:var(--md-text-color);background-color:var(--md-header-bg-color);border-bottom:.05rem solid var(--md-primary-fg-color)}[data-md-color-scheme=dracula] .md-header[data-md-state=shadow]{box-shadow:0 0 .2rem rgba(0,0,0,.15),0 0 .2rem .4rem rgba(0,0,0,.2)}[data-md-color-scheme=dracula] .md-top{background-color:var(--md-default-bg-color--dark)}[data-md-color-scheme=dracula] .md-top:hover{background-color:var(--md-primary-fg-color)}[data-md-color-scheme=dracula] .md-tabs{color:var(--md-text-color);background-color:var(--md-primary-fg-color--transparent)}[data-md-color-scheme=dracula] .md-tabs__link--active{color:var(--md-primary-fg-color)}[data-md-color-scheme=dracula] .md-tabs__link:hover{color:var(--md-accent-fg-color)}[data-md-color-scheme=dracula] .md-hero{color:var(--md-text-color);background-color:var(--md-primary-fg-color--transparent)}[data-md-color-scheme=dracula] .md-nav__source{color:var(--md-text-color)}[data-md-color-scheme=dracula] .md-nav__link[data-md-state=blur]{color:var(--md-default-fg-color--light)}[data-md-color-scheme=dracula] .md-nav__item .md-nav__link--active{color:var(--md-primary-fg-color)}[data-md-color-scheme=dracula] .md-nav__link:focus,[data-md-color-scheme=dracula] .md-nav__link:hover{color:var(--md-accent-fg-color)}[data-md-color-scheme=dracula] .md-search__input{color:var(--md-text-color);background-color:var(--md-accent-bg-color--light)}[data-md-color-scheme=dracula] .md-search__input:hover{background-color:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] .md-search__input~.md-search__icon{color:var(--md-text-color)}[data-md-color-scheme=dracula] .md-search__input::-moz-placeholder{color:var(--md-default-fg-color--light)}[data-md-color-scheme=dracula] .md-search__input::placeholder{color:var(--md-default-fg-color--light)}[data-md-color-scheme=dracula] [data-md-toggle=search]:checked~.md-header .md-search__input{background-color:transparent}[data-md-color-scheme=dracula] .md-search__suggest{color:var(--md-default-autocomplete-fg-color)}[data-md-color-scheme=dracula] .md-overlay,[data-md-color-scheme=dracula] .md-search__overlay{background-color:var(--md-default-bg-color--light)}[data-md-color-scheme=dracula] .md-footer-nav__direction{color:var(--md-primary-fg-color)}[data-md-color-scheme=dracula] .md-footer-meta{border-top:.05rem solid var(--md-primary-fg-color)}[data-md-color-scheme=dracula] [data-md-component=announce]{background-color:var(--md-default-bg-color--ultra-dark)}.md-typeset h5{color:var(--md-text-color);text-transform:none}.md-search__scrollwrap,.md-sidebar__scrollwrap,.md-typeset diagram-div,.md-typeset div.arithmatex,.md-typeset div.diagram,.md-typeset div.mermaid,.md-typeset mermaid-div,.md-typeset pre.arithmatex,.md-typeset pre>code,.md-typeset__scrollwrap{scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin}.md-search__scrollwrap::-webkit-scrollbar,.md-sidebar__scrollwrap::-webkit-scrollbar,.md-typeset diagram-div::-webkit-scrollbar,.md-typeset div.arithmatex::-webkit-scrollbar,.md-typeset div.diagram::-webkit-scrollbar,.md-typeset div.mermaid::-webkit-scrollbar,.md-typeset mermaid-div::-webkit-scrollbar,.md-typeset pre.arithmatex::-webkit-scrollbar,.md-typeset pre>code::-webkit-scrollbar,.md-typeset__scrollwrap::-webkit-scrollbar{width:.2rem;height:.2rem}.md-search__scrollwrap::-webkit-scrollbar-corner,.md-sidebar__scrollwrap::-webkit-scrollbar-corner,.md-typeset diagram-div::-webkit-scrollbar-corner,.md-typeset div.arithmatex::-webkit-scrollbar-corner,.md-typeset div.diagram::-webkit-scrollbar-corner,.md-typeset div.mermaid::-webkit-scrollbar-corner,.md-typeset mermaid-div::-webkit-scrollbar-corner,.md-typeset pre.arithmatex::-webkit-scrollbar-corner,.md-typeset pre>code::-webkit-scrollbar-corner,.md-typeset__scrollwrap::-webkit-scrollbar-corner{background-color:transparent}.md-search__scrollwrap::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap::-webkit-scrollbar-thumb,.md-typeset diagram-div::-webkit-scrollbar-thumb,.md-typeset div.arithmatex::-webkit-scrollbar-thumb,.md-typeset div.diagram::-webkit-scrollbar-thumb,.md-typeset div.mermaid::-webkit-scrollbar-thumb,.md-typeset mermaid-div::-webkit-scrollbar-thumb,.md-typeset pre.arithmatex::-webkit-scrollbar-thumb,.md-typeset pre>code::-webkit-scrollbar-thumb,.md-typeset__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover,.md-typeset diagram-div::-webkit-scrollbar-thumb:hover,.md-typeset div.arithmatex::-webkit-scrollbar-thumb:hover,.md-typeset div.diagram::-webkit-scrollbar-thumb:hover,.md-typeset div.mermaid::-webkit-scrollbar-thumb:hover,.md-typeset mermaid-div::-webkit-scrollbar-thumb:hover,.md-typeset pre.arithmatex::-webkit-scrollbar-thumb:hover,.md-typeset pre>code::-webkit-scrollbar-thumb:hover,.md-typeset__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-search__scrollwrap:hover,.md-sidebar__scrollwrap:hover,.md-typeset diagram-div:hover,.md-typeset div.arithmatex:hover,.md-typeset div.diagram:hover,.md-typeset div.mermaid:hover,.md-typeset mermaid-div:hover,.md-typeset pre.arithmatex:hover,.md-typeset pre>code:hover,.md-typeset__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}@media screen and (max-width:59.9375em){.md-header-nav__scheme{padding-right:0}label[for=__search]{padding-left:0}[data-md-color-scheme=dracula] .md-nav__source{color:var(--md-text-color);background-color:var(--md-primary-fg-color--transparent)}[data-md-color-scheme=dracula] .md-nav .md-nav__title{color:var(--md-text-color);background-color:var(--md-header-bg-color);border-bottom:.05rem solid var(--md-primary-fg-color)}}@media screen and (max-width:44.9375em){.md-typeset>diagram-div{margin-right:-.8rem;margin-left:-.8rem}.md-typeset>.collapse-code{margin-right:-.8rem;margin-left:-.8rem}.md-typeset>.collapse-code label.collapse{left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:0}.md-content__inner>.tabbed-set .tabbed-labels{max-width:100%;margin:0;padding-inline-start:0;scroll-padding-inline-start:0}.md-content__inner>.tabbed-set .tabbed-labels::after{padding-inline-end:0;content:none}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-inline-start:0;padding-inline-start:0}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-inline-end:0;padding-inline-end:0}}@media screen and (max-width:76.1875em){[data-md-color-scheme=dracula] .md-nav--primary .md-nav__item--active>.md-nav__link:not(:hover){color:var(--md-primary-fg-color)}[data-md-color-scheme=dracula] .md-nav--primary .md-nav__title{color:var(--md-text-color);background-color:var(--md-header-bg-color);border-bottom:.05rem solid var(--md-primary-fg-color)}} +/*# sourceMappingURL=extra-fb5a2a1c86.css.map */ diff --git a/docs/theme/assets/pymdownx-extras/extra-fb5a2a1c86.css.map b/docs/theme/assets/pymdownx-extras/extra-fb5a2a1c86.css.map new file mode 100644 index 0000000..5245445 --- /dev/null +++ b/docs/theme/assets/pymdownx-extras/extra-fb5a2a1c86.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["palette/_colors.scss","extra.css","_general.scss","extensions/_admonition.scss","extensions/_arithmatex.scss","extensions/_critic.scss","extensions/_details.scss","extensions/_highlight.scss","extensions/_keys.scss","extensions/_magiclink.scss","extensions/_mark.scss","extensions/_progressbar.scss","extensions/_tabbed.scss","extensions/_tables.scss","extensions/_tasklist.scss","extensions/_toc.scss","extensions/_superfences.scss","_material.scss","utilities/_break.scss"],"names":[],"mappings":"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","file":"extra-fb5a2a1c86.css","sourcesContent":["@import \"./dracula\";\n\n:root > * {\n // Custom code colors\n --md-code-link-bg-color: hsla(0, 0%, 96%, 1);\n --md-code-link-accent-bg-color: var(--md-code-link-bg-color);\n --md-default-bg-color--trans: rgb(100%, 100%, 100%, 0);\n --md-code-title-bg-color: var(--md-code-bg-color);\n --md-code-inline-bg-color: var(--md-code-bg-color);\n\n --md-code-special-bg-color: #{darken(hsl(0, 0%, 96%), 5%)};\n --md-code-alternate-bg-color: var(--md-code-bg-color);\n\n --md-code-hl-punctuation-color: var(--md-code-fg-color);\n --md-code-hl-namespace-color: var(--md-code-fg-color);\n\n --md-code-hl-entity-color: var(--md-code-hl-keyword-color);\n --md-code-hl-tag-color: var(--md-code-hl-keyword-color);\n --md-code-hl-builtin-color: var(--md-code-hl-constant-color);\n --md-code-hl-class-color: var(--md-code-hl-function-color);\n\n // Various Material related color variables\n --md-typeset-a-color: #{$clr-cyan-500};\n\n // Progressbar colors\n --md-progress-stripe: var(--md-default-bg-color--lighter);\n --md-progress-100: #{$clr-green-a400};\n --md-progress-80: #{$clr-green-a400};\n --md-progress-60: #{$clr-yellow-700};\n --md-progress-40: #{$clr-orange-a400};\n --md-progress-20: #{$clr-red-a200};\n --md-progress-0: #{$clr-red-a400};\n\n // Keys colors\n --md-typeset-kbd-color: #{shade(hsla(0, 100%, 100%, 1), 8%)};\n --md-typeset-kbd-border-color: #{shade(hsla(0, 100%, 100%, 1), 28%)};\n --md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1);\n\n &[data-md-color-scheme=\"slate\"] {\n // Custom code colors\n --md-code-link-bg-color: hsla(232, 15%, 15%, 1);\n --md-code-link-accent-bg-color: var(--md-code-link-bg-color);\n --md-code-special-bg-color: #{lighten(hsl(232, 15%, 15%), 5%)};\n --md-default-bg-color--trans: hsla(232,15%,15%, 0);\n\n // Keys colors\n --md-typeset-kbd-color: var(--md-default-fg-color--lightest);\n --md-typeset-kbd-border-color: #{darken(rgb(46, 48, 62), 9%)};\n --md-typeset-kbd-accent-color: var(--md-default-fg-color--lighter);\n }\n\n // Dark mode color changes\n &[data-md-color-scheme=\"dracula\"] {\n // Default color shades\n --md-default-fg-color: #{transparentize($drac-fg, 0.13)};\n --md-default-fg-color--light: #{transparentize($drac-fg, 0.46)};\n --md-default-fg-color--lighter: #{transparentize($drac-fg, 0.84)};\n --md-default-fg-color--lightest: #{transparentize($drac-fg, 0.93)};\n --md-default-autocomplete-fg-color: #{transparentize($drac-fg, 0.60)};\n --md-shadow-z2: 0 #{px2rem(4px)} #{px2rem(10px)} hsla(0, 0%, 0%, 0.3),\n 0 0 #{px2rem(1px)} hsla(0, 0%, 0%, 0.2);\n\n --md-default-bg-color: var(--md-default-bg-color--darkest);\n --md-default-bg-color--light: #{transparentize($drac-default-bg, 0.3)};\n --md-default-bg-color--lighter: #{transparentize($drac-default-bg, 0.7)};\n --md-default-bg-color--lightest: #{transparentize($drac-default-bg, 0.88)};\n --md-default-bg-color--trans: #{transparentize($drac-default-bg, 1)};\n\n // Dark specific colors\n --md-default-bg-color--dark: #{darken($drac-default-bg, 3%)};\n --md-default-bg-color--darker: #{darken($drac-default-bg, 6%)};\n --md-default-bg-color--darkest: #{darken($drac-default-bg, 9%)};\n --md-default-bg-color--ultra-dark: #{darken($drac-default-bg, 15%)};\n\n // General text\n --md-text-color: var(--md-default-fg-color);\n --md-typeset-color: var(--md-default-fg-color);\n\n // Admonition colors\n --md-admonition-fg-color: var(--md-default-fg-color);\n\n // Code colors\n --md-code-fg-color: #{$drac-fg};\n --md-code-bg-color: #{$drac-bg};\n --md-code-title-bg-color: var(--md-default-bg-color--ultra-dark);\n --md-code-inline-bg-color: #{lighten($drac-bg, 5%)};\n --md-code-hl-operator-color: #{$drac-pink};\n --md-code-hl-punctuation-color: #{$drac-fg};\n --md-code-hl-string-color: #{$drac-yellow};\n --md-code-hl-special-color: #{$drac-purple};\n --md-code-hl-number-color: #{$drac-purple};\n --md-code-hl-keyword-color: #{$drac-pink};\n --md-code-hl-name-color: #{$drac-fg};\n --md-code-hl-constant-color: #{$drac-purple};\n --md-code-hl-function-color: #{$drac-green};\n --md-code-hl-comment-color: #{$drac-blue};\n --md-code-hl-variable-color: #{$drac-orange};\n --md-code-hl-generic-color: #{$drac-blue};\n --md-code-hl-color: #{$drac-selection};\n\n // Custom code colors\n --md-code-hl-entity-color: #{$drac-green};\n --md-code-hl-tag-color: #{$drac-pink};\n --md-code-hl-namespace-color: #{$drac-fg};\n --md-code-hl-builtin-color: #{$drac-cyan};\n --md-code-hl-class-color: #{$drac-cyan};\n\n --md-code-special-bg-color: #{darken($drac-bg, 5%)};\n --md-code-alternate-bg-color: #{tint($drac-bg, 10%)};\n --md-code-link-bg-color: #{mix($drac-cyan, $drac-bg, 15%)};\n\n // Various Material related color variables\n --md-typeset-a-color: #{$drac-cyan};\n --md-typeset-mark-color: #{mix($drac-yellow, $drac-bg, 35%)};\n --md-typeset-del-color: #{mix($drac-pink, $drac-bg, 35%)};\n --md-typeset-ins-color: #{mix($drac-green, $drac-bg, 35%)};\n\n // Progressbar colors\n --md-progress-stripe: var(--md-default-bg-color--lightest);\n --md-progress-100: #{$drac-green};\n --md-progress-80: #{$drac-light-green};\n --md-progress-60: #{$drac-yellow};\n --md-progress-40: #{$drac-orange};\n --md-progress-20: #{$drac-pink};\n --md-progress-0: #{$drac-red};\n\n // Keys colors\n --md-typeset-kbd-color: var(--md-default-fg-color--lightest);\n --md-typeset-kbd-border-color: var(--md-default-bg-color--ultra-dark);\n --md-typeset-kbd-accent-color: var(--md-default-fg-color--lighter);\n }\n}\n\n// ----------------------------------------------------------------------------\n// Rules: primary colors\n// ----------------------------------------------------------------------------\n\n@each $name, $colors in (\n \"red\": $drac-red lighten($drac-red, 5%) darken($drac-red, 5%),\n \"pink\": $drac-pink lighten($drac-pink, 5%) darken($drac-pink, 5%),\n \"purple\": $drac-purple lighten($drac-purple, 5%) darken($drac-purple, 5%),\n \"deep-purple\": $drac-purple lighten($drac-purple, 5%) darken($drac-purple, 5%),\n \"blue\": $drac-blue lighten($drac-blue, 5%) darken($drac-blue, 5%),\n \"indigo\": $drac-blue lighten($drac-blue, 5%) darken($drac-blue, 5%),\n \"light-blue\": $drac-blue lighten($drac-blue, 5%) darken($drac-blue, 5%),\n \"cyan\": $drac-cyan lighten($drac-cyan, 5%) darken($drac-cyan, 5%),\n \"teal\": $drac-cyan lighten($drac-cyan, 5%) darken($drac-cyan, 5%),\n \"green\": $drac-green lighten($drac-green, 5%) darken($drac-green, 5%),\n \"light-green\": $drac-green lighten($drac-green, 5%) darken($drac-green, 5%),\n \"lime\": $drac-green lighten($drac-green, 5%) darken($drac-green, 5%),\n \"yellow\": $drac-yellow lighten($drac-yellow, 5%) darken($drac-yellow, 5%),\n \"amber\": $drac-yellow lighten($drac-yellow, 5%) darken($drac-yellow, 5%),\n \"orange\": $drac-orange lighten($drac-orange, 5%) darken($drac-orange, 5%),\n \"deep-orange\": $drac-orange lighten($drac-orange, 5%) darken($drac-orange, 5%)\n) {\n\n // Color palette\n [data-md-color-scheme=\"dracula\"][data-md-color-primary=\"#{$name}\"],\n [data-md-color-scheme=\"dracula\"] :not([data-md-color-scheme])[data-md-color-primary=\"#{$name}\"]\n {\n\n --md-primary-code-bg-color: #{mix($drac-bg, nth($colors, 1), 85%)};\n --md-primary-fg-color: hsla(#{hex2hsl(nth($colors, 1))}, 1);\n --md-primary-fg-color--transparent: hsla(#{hex2hsl(nth($colors, 1))}, 0.1);\n --md-primary-fg-color--light: hsla(#{hex2hsl(nth($colors, 2))}, 1);\n --md-primary-fg-color--dark: hsla(#{hex2hsl(nth($colors, 3))}, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n }\n}\n\n// ----------------------------------------------------------------------------\n// Rules: accent colors\n// ----------------------------------------------------------------------------\n\n@each $name, $color in (\n \"red\": darken($drac-red, 5%),\n \"pink\": darken($drac-pink, 5%),\n \"purple\": darken($drac-purple, 5%),\n \"deep-purple\": darken($drac-purple, 5%),\n \"blue\": darken($drac-blue, 5%),\n \"indigo\": darken($drac-blue, 5%),\n \"light-blue\": darken($drac-blue, 5%),\n \"cyan\": darken($drac-cyan, 5%),\n \"teal\": darken($drac-cyan, 5%),\n \"green\": darken($drac-green, 5%),\n \"light-green\": darken($drac-green, 5%),\n \"lime\": darken($drac-green, 5%),\n \"yellow\": darken($drac-yellow, 5%),\n \"amber\": darken($drac-yellow, 5%),\n \"orange\": darken($drac-orange, 5%),\n \"deep-orange\": darken($drac-orange, 5%)\n) {\n\n // Color palette\n [data-md-color-scheme=\"dracula\"][data-md-color-accent=\"#{$name}\"],\n [data-md-color-scheme=\"dracula\"] :not([data-md-color-scheme])[data-md-color-primary=\"#{$name}\"] {\n --md-code-link-accent-bg-color: #{mix($color, $drac-bg, 15%)};\n --md-accent-fg-color: hsla(#{hex2hsl($color)}, 1);\n --md-accent-fg-color--transparent: hsla(#{hex2hsl($color)}, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n }\n}\n","@charset \"UTF-8\";\n:root > * {\n --md-code-link-bg-color: hsla(0, 0%, 96%, 1);\n --md-code-link-accent-bg-color: var(--md-code-link-bg-color);\n --md-default-bg-color--trans: rgb(100%, 100%, 100%, 0);\n --md-code-title-bg-color: var(--md-code-bg-color);\n --md-code-inline-bg-color: var(--md-code-bg-color);\n --md-code-special-bg-color: #e8e8e8;\n --md-code-alternate-bg-color: var(--md-code-bg-color);\n --md-code-hl-punctuation-color: var(--md-code-fg-color);\n --md-code-hl-namespace-color: var(--md-code-fg-color);\n --md-code-hl-entity-color: var(--md-code-hl-keyword-color);\n --md-code-hl-tag-color: var(--md-code-hl-keyword-color);\n --md-code-hl-builtin-color: var(--md-code-hl-constant-color);\n --md-code-hl-class-color: var(--md-code-hl-function-color);\n --md-typeset-a-color: #00bcd4;\n --md-progress-stripe: var(--md-default-bg-color--lighter);\n --md-progress-100: #00e676;\n --md-progress-80: #00e676;\n --md-progress-60: #fbc02d;\n --md-progress-40: #ff9100;\n --md-progress-20: #ff5252;\n --md-progress-0: #ff1744;\n --md-typeset-kbd-color: #ebebeb;\n --md-typeset-kbd-border-color: #b8b8b8;\n --md-typeset-kbd-accent-color: hsla(0, 100%, 100%, 1);\n}\n:root > *[data-md-color-scheme=slate] {\n --md-code-link-bg-color: hsla(232, 15%, 15%, 1);\n --md-code-link-accent-bg-color: var(--md-code-link-bg-color);\n --md-code-special-bg-color: #2b2d3b;\n --md-default-bg-color--trans: hsla(232,15%,15%, 0);\n --md-typeset-kbd-color: var(--md-default-fg-color--lightest);\n --md-typeset-kbd-border-color: #1a1c24;\n --md-typeset-kbd-accent-color: var(--md-default-fg-color--lighter);\n}\n:root > *[data-md-color-scheme=dracula] {\n --md-default-fg-color: rgba(248, 248, 242, 0.87);\n --md-default-fg-color--light: rgba(248, 248, 242, 0.54);\n --md-default-fg-color--lighter: rgba(248, 248, 242, 0.16);\n --md-default-fg-color--lightest: rgba(248, 248, 242, 0.07);\n --md-default-autocomplete-fg-color: rgba(248, 248, 242, 0.4);\n --md-shadow-z2: 0 0.2rem 0.5rem hsla(0, 0%, 0%, 0.3),\n 0 0 0.05rem hsla(0, 0%, 0%, 0.2);\n --md-default-bg-color: var(--md-default-bg-color--darkest);\n --md-default-bg-color--light: rgba(50, 52, 67, 0.7);\n --md-default-bg-color--lighter: rgba(50, 52, 67, 0.3);\n --md-default-bg-color--lightest: rgba(50, 52, 67, 0.12);\n --md-default-bg-color--trans: rgba(50, 52, 67, 0);\n --md-default-bg-color--dark: #2b2e3b;\n --md-default-bg-color--darker: #252732;\n --md-default-bg-color--darkest: #1e2029;\n --md-default-bg-color--ultra-dark: #111217;\n --md-text-color: var(--md-default-fg-color);\n --md-typeset-color: var(--md-default-fg-color);\n --md-admonition-fg-color: var(--md-default-fg-color);\n --md-code-fg-color: hsl(60, 30%, 96%);\n --md-code-bg-color: hsl(231, 15%, 18%);\n --md-code-title-bg-color: var(--md-default-bg-color--ultra-dark);\n --md-code-inline-bg-color: #323443;\n --md-code-hl-operator-color: hsl(326, 100%, 74%);\n --md-code-hl-punctuation-color: hsl(60, 30%, 96%);\n --md-code-hl-string-color: hsl(65, 92%, 76%);\n --md-code-hl-special-color: hsl(265, 89%, 78%);\n --md-code-hl-number-color: hsl(265, 89%, 78%);\n --md-code-hl-keyword-color: hsl(326, 100%, 74%);\n --md-code-hl-name-color: hsl(60, 30%, 96%);\n --md-code-hl-constant-color: hsl(265, 89%, 78%);\n --md-code-hl-function-color: hsl(135, 94%, 65%);\n --md-code-hl-comment-color: hsl(225, 27%, 51%);\n --md-code-hl-variable-color: hsl(31, 100%, 71%);\n --md-code-hl-generic-color: hsl(225, 27%, 51%);\n --md-code-hl-color: hsl(231, 25%, 25%);\n --md-code-hl-entity-color: hsl(135, 94%, 65%);\n --md-code-hl-tag-color: hsl(326, 100%, 74%);\n --md-code-hl-namespace-color: hsl(60, 30%, 96%);\n --md-code-hl-builtin-color: hsl(191, 97%, 77%);\n --md-code-hl-class-color: hsl(191, 97%, 77%);\n --md-code-special-bg-color: #1c1e26;\n --md-code-alternate-bg-color: #3d3e49;\n --md-code-link-bg-color: #364653;\n --md-typeset-a-color: hsl(191, 97%, 77%);\n --md-typeset-mark-color: #6e7252;\n --md-typeset-del-color: #734568;\n --md-typeset-ins-color: #36724e;\n --md-progress-stripe: var(--md-default-bg-color--lightest);\n --md-progress-100: hsl(135, 94%, 65%);\n --md-progress-80: hsl(135, 92%, 79%);\n --md-progress-60: hsl(65, 92%, 76%);\n --md-progress-40: hsl(31, 100%, 71%);\n --md-progress-20: hsl(326, 100%, 74%);\n --md-progress-0: hsl(0, 100%, 67%);\n --md-typeset-kbd-color: var(--md-default-fg-color--lightest);\n --md-typeset-kbd-border-color: var(--md-default-bg-color--ultra-dark);\n --md-typeset-kbd-accent-color: var(--md-default-fg-color--lighter);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=red],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=red] {\n --md-primary-code-bg-color: #47303a;\n --md-primary-fg-color: hsla(0deg, 100%, 67%, 1);\n --md-primary-fg-color--transparent: hsla(0deg, 100%, 67%, 0.1);\n --md-primary-fg-color--light: hsla(0deg, 100%, 72%, 1);\n --md-primary-fg-color--dark: hsla(0deg, 100%, 62%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=pink],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=pink] {\n --md-primary-code-bg-color: #47354b;\n --md-primary-fg-color: hsla(326deg, 100%, 74%, 1);\n --md-primary-fg-color--transparent: hsla(326deg, 100%, 74%, 0.1);\n --md-primary-fg-color--light: hsla(326deg, 100%, 79%, 1);\n --md-primary-fg-color--dark: hsla(326deg, 100%, 69%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=purple],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=purple] {\n --md-primary-code-bg-color: #3e3952;\n --md-primary-fg-color: hsla(265deg, 89%, 78%, 1);\n --md-primary-fg-color--transparent: hsla(265deg, 89%, 78%, 0.1);\n --md-primary-fg-color--light: hsla(265deg, 89%, 83%, 1);\n --md-primary-fg-color--dark: hsla(265deg, 89%, 73%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=deep-purple],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=deep-purple] {\n --md-primary-code-bg-color: #3e3952;\n --md-primary-fg-color: hsla(265deg, 89%, 78%, 1);\n --md-primary-fg-color--transparent: hsla(265deg, 89%, 78%, 0.1);\n --md-primary-fg-color--light: hsla(265deg, 89%, 83%, 1);\n --md-primary-fg-color--dark: hsla(265deg, 89%, 73%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=blue],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=blue] {\n --md-primary-code-bg-color: #303446;\n --md-primary-fg-color: hsla(225deg, 27%, 51%, 1);\n --md-primary-fg-color--transparent: hsla(225deg, 27%, 51%, 0.1);\n --md-primary-fg-color--light: hsla(225deg, 27%, 56%, 1);\n --md-primary-fg-color--dark: hsla(225deg, 27%, 46%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=indigo],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=indigo] {\n --md-primary-code-bg-color: #303446;\n --md-primary-fg-color: hsla(225deg, 27%, 51%, 1);\n --md-primary-fg-color--transparent: hsla(225deg, 27%, 51%, 0.1);\n --md-primary-fg-color--light: hsla(225deg, 27%, 56%, 1);\n --md-primary-fg-color--dark: hsla(225deg, 27%, 46%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=light-blue],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=light-blue] {\n --md-primary-code-bg-color: #303446;\n --md-primary-fg-color: hsla(225deg, 27%, 51%, 1);\n --md-primary-fg-color--transparent: hsla(225deg, 27%, 51%, 0.1);\n --md-primary-fg-color--light: hsla(225deg, 27%, 56%, 1);\n --md-primary-fg-color--dark: hsla(225deg, 27%, 46%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=cyan],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=cyan] {\n --md-primary-code-bg-color: #364653;\n --md-primary-fg-color: hsla(191deg, 97%, 77%, 1);\n --md-primary-fg-color--transparent: hsla(191deg, 97%, 77%, 0.1);\n --md-primary-fg-color--light: hsla(191deg, 97%, 82%, 1);\n --md-primary-fg-color--dark: hsla(191deg, 97%, 72%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=teal],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=teal] {\n --md-primary-code-bg-color: #364653;\n --md-primary-fg-color: hsla(191deg, 97%, 77%, 1);\n --md-primary-fg-color--transparent: hsla(191deg, 97%, 77%, 0.1);\n --md-primary-fg-color--light: hsla(191deg, 97%, 82%, 1);\n --md-primary-fg-color--dark: hsla(191deg, 97%, 72%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=green],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=green] {\n --md-primary-code-bg-color: #2d4840;\n --md-primary-fg-color: hsla(135deg, 94%, 65%, 1);\n --md-primary-fg-color--transparent: hsla(135deg, 94%, 65%, 0.1);\n --md-primary-fg-color--light: hsla(135deg, 94%, 70%, 1);\n --md-primary-fg-color--dark: hsla(135deg, 94%, 60%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=light-green],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=light-green] {\n --md-primary-code-bg-color: #2d4840;\n --md-primary-fg-color: hsla(135deg, 94%, 65%, 1);\n --md-primary-fg-color--transparent: hsla(135deg, 94%, 65%, 0.1);\n --md-primary-fg-color--light: hsla(135deg, 94%, 70%, 1);\n --md-primary-fg-color--dark: hsla(135deg, 94%, 60%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=lime],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=lime] {\n --md-primary-code-bg-color: #2d4840;\n --md-primary-fg-color: hsla(135deg, 94%, 65%, 1);\n --md-primary-fg-color--transparent: hsla(135deg, 94%, 65%, 0.1);\n --md-primary-fg-color--light: hsla(135deg, 94%, 70%, 1);\n --md-primary-fg-color--dark: hsla(135deg, 94%, 60%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=yellow],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=yellow] {\n --md-primary-code-bg-color: #454842;\n --md-primary-fg-color: hsla(65deg, 92%, 76%, 1);\n --md-primary-fg-color--transparent: hsla(65deg, 92%, 76%, 0.1);\n --md-primary-fg-color--light: hsla(65deg, 92%, 81%, 1);\n --md-primary-fg-color--dark: hsla(65deg, 92%, 71%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=amber],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=amber] {\n --md-primary-code-bg-color: #454842;\n --md-primary-fg-color: hsla(65deg, 92%, 76%, 1);\n --md-primary-fg-color--transparent: hsla(65deg, 92%, 76%, 0.1);\n --md-primary-fg-color--light: hsla(65deg, 92%, 81%, 1);\n --md-primary-fg-color--dark: hsla(65deg, 92%, 71%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=orange],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=orange] {\n --md-primary-code-bg-color: #473e3d;\n --md-primary-fg-color: hsla(31deg, 100%, 71%, 1);\n --md-primary-fg-color--transparent: hsla(31deg, 100%, 71%, 0.1);\n --md-primary-fg-color--light: hsla(31deg, 100%, 76%, 1);\n --md-primary-fg-color--dark: hsla(31deg, 100%, 66%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-primary=deep-orange],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=deep-orange] {\n --md-primary-code-bg-color: #473e3d;\n --md-primary-fg-color: hsla(31deg, 100%, 71%, 1);\n --md-primary-fg-color--transparent: hsla(31deg, 100%, 71%, 0.1);\n --md-primary-fg-color--light: hsla(31deg, 100%, 76%, 1);\n --md-primary-fg-color--dark: hsla(31deg, 100%, 66%, 1);\n --md-primary-bg-color: var(--md-default-bg-color);\n --md-primary-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=red],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=red] {\n --md-code-link-accent-bg-color: #472c36;\n --md-accent-fg-color: hsla(0deg, 100%, 62%, 1);\n --md-accent-fg-color--transparent: hsla(0deg, 100%, 62%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=pink],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=pink] {\n --md-code-link-accent-bg-color: #473149;\n --md-accent-fg-color: hsla(326deg, 100%, 69%, 1);\n --md-accent-fg-color--transparent: hsla(326deg, 100%, 69%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=purple],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=purple] {\n --md-code-link-accent-bg-color: #3c3652;\n --md-accent-fg-color: hsla(265deg, 89%, 73%, 1);\n --md-accent-fg-color--transparent: hsla(265deg, 89%, 73%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=deep-purple],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=deep-purple] {\n --md-code-link-accent-bg-color: #3c3652;\n --md-accent-fg-color: hsla(265deg, 89%, 73%, 1);\n --md-accent-fg-color--transparent: hsla(265deg, 89%, 73%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=blue],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=blue] {\n --md-code-link-accent-bg-color: #2e3243;\n --md-accent-fg-color: hsla(225deg, 27%, 46%, 1);\n --md-accent-fg-color--transparent: hsla(225deg, 27%, 46%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=indigo],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=indigo] {\n --md-code-link-accent-bg-color: #2e3243;\n --md-accent-fg-color: hsla(225deg, 27%, 46%, 1);\n --md-accent-fg-color--transparent: hsla(225deg, 27%, 46%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=light-blue],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=light-blue] {\n --md-code-link-accent-bg-color: #2e3243;\n --md-accent-fg-color: hsla(225deg, 27%, 46%, 1);\n --md-accent-fg-color--transparent: hsla(225deg, 27%, 46%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=cyan],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=cyan] {\n --md-code-link-accent-bg-color: #324553;\n --md-accent-fg-color: hsla(191deg, 97%, 72%, 1);\n --md-accent-fg-color--transparent: hsla(191deg, 97%, 72%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=teal],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=teal] {\n --md-code-link-accent-bg-color: #324553;\n --md-accent-fg-color: hsla(191deg, 97%, 72%, 1);\n --md-accent-fg-color--transparent: hsla(191deg, 97%, 72%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=green],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=green] {\n --md-code-link-accent-bg-color: #2a483d;\n --md-accent-fg-color: hsla(135deg, 94%, 60%, 1);\n --md-accent-fg-color--transparent: hsla(135deg, 94%, 60%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=light-green],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=light-green] {\n --md-code-link-accent-bg-color: #2a483d;\n --md-accent-fg-color: hsla(135deg, 94%, 60%, 1);\n --md-accent-fg-color--transparent: hsla(135deg, 94%, 60%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=lime],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=lime] {\n --md-code-link-accent-bg-color: #2a483d;\n --md-accent-fg-color: hsla(135deg, 94%, 60%, 1);\n --md-accent-fg-color--transparent: hsla(135deg, 94%, 60%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=yellow],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=yellow] {\n --md-code-link-accent-bg-color: #45483e;\n --md-accent-fg-color: hsla(65deg, 92%, 71%, 1);\n --md-accent-fg-color--transparent: hsla(65deg, 92%, 71%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=amber],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=amber] {\n --md-code-link-accent-bg-color: #45483e;\n --md-accent-fg-color: hsla(65deg, 92%, 71%, 1);\n --md-accent-fg-color--transparent: hsla(65deg, 92%, 71%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=orange],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=orange] {\n --md-code-link-accent-bg-color: #473d39;\n --md-accent-fg-color: hsla(31deg, 100%, 66%, 1);\n --md-accent-fg-color--transparent: hsla(31deg, 100%, 66%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n[data-md-color-scheme=dracula][data-md-color-accent=deep-orange],\n[data-md-color-scheme=dracula] :not([data-md-color-scheme])[data-md-color-primary=deep-orange] {\n --md-code-link-accent-bg-color: #473d39;\n --md-accent-fg-color: hsla(31deg, 100%, 66%, 1);\n --md-accent-fg-color--transparent: hsla(31deg, 100%, 66%, 0.1);\n --md-accent-bg-color: var(--md-default-bg-color);\n --md-accent-bg-color--light: var(--md-default-bg-color--light);\n}\n\n/* Normal colors */\n:root {\n --md-heart: #ff5252;\n --md-heart-big: #ff1744;\n /* Dark mode colors */\n}\n:root :focus-visible {\n outline-style: solid;\n}\n:root [data-md-color-scheme=dracula] {\n --md-heart: hsl(326, 100%, 74%);\n --md-heart-big: hsl(0, 100%, 67%);\n}\n\n.md-typeset h4 {\n margin: 2em 0 1em;\n}\n.md-typeset a.source-link {\n position: relative;\n top: -0.6rem;\n float: right;\n color: var(--md-default-fg-color--lighter);\n transition: color 125ms;\n}\n.md-typeset a.source-link:hover {\n color: var(--md-accent-fg-color);\n}\n.md-typeset a.source-link .twemoji {\n height: 1.2rem;\n}\n.md-typeset a.source-link .twemoji svg {\n width: 1.2rem;\n height: 1.2rem;\n}\n.md-typeset div.highlight.md-max-height pre > code {\n max-height: 15rem;\n}\n\n.twemoji.heart-throb svg, .twemoji.heart-throb-hover svg {\n position: relative;\n color: var(--md-heart);\n animation: pulse 1.5s ease infinite;\n}\n\n@keyframes pulse {\n 0% {\n transform: scale(1);\n }\n 40% {\n color: var(--md-heart-big);\n transform: scale(1.3);\n }\n 50% {\n transform: scale(1.2);\n }\n 60% {\n color: var(--md-heart-big);\n transform: scale(1.3);\n }\n 100% {\n transform: scale(1);\n }\n}\nfooter.sponsorship {\n text-align: center;\n}\nfooter.sponsorship hr {\n display: inline-block;\n width: 1.6rem;\n margin: 0 0.7rem;\n vertical-align: middle;\n border-bottom: 2px solid var(--md-default-fg-color--lighter);\n}\nfooter.sponsorship:hover hr {\n border-color: var(--md-accent-fg-color);\n}\nfooter.sponsorship:not(:hover) .twemoji.heart-throb-hover svg {\n color: var(--md-default-fg-color--lighter) !important;\n}\n\nbody:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=dracula] .md-icon .light-mode,\nbody:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=dracula] .md-icon .system-mode,\nbody:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=dracula] .md-icon .unknown-mode {\n display: none;\n}\nbody:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=default] .md-icon .dark-mode,\nbody:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=default] .md-icon .system-mode,\nbody:not([data-md-prefers-color-scheme=true])[data-md-color-scheme=default] .md-icon .unknown-mode {\n display: none;\n}\nbody:not([data-md-prefers-color-scheme=true]):not([data-md-color-scheme=default]):not([data-md-color-scheme=dracula]) .md-icon .dark-mode,\nbody:not([data-md-prefers-color-scheme=true]):not([data-md-color-scheme=default]):not([data-md-color-scheme=dracula]) .md-icon .light-mode,\nbody:not([data-md-prefers-color-scheme=true]):not([data-md-color-scheme=default]):not([data-md-color-scheme=dracula]) .md-icon .system-mode {\n display: none;\n}\nbody[data-md-prefers-color-scheme=true] .md-icon .dark-mode,\nbody[data-md-prefers-color-scheme=true] .md-icon .light-mode,\nbody[data-md-prefers-color-scheme=true] .md-icon .unknown-mode {\n display: none;\n}\n\n.md-header-nav__scheme {\n z-index: 0;\n}\n\n@media screen and (max-width: 59.9375em) {\n .md-header-nav__scheme {\n padding-right: 0;\n }\n label[for=__search] {\n padding-left: 0;\n }\n}\n[data-md-toggle=search]:checked ~ .md-header .md-header-nav__scheme {\n display: none;\n}\n\n.md-typeset .admonition, .md-typeset details {\n border-width: 0;\n border-left-width: 4px;\n}\n\n/* Style new admonitions with dark or light colors */\n:root > * {\n --md-admonition-bg-color: transparent;\n --md-admonition-icon--settings: svg-load(\"@mdi/svg/svg/cog.svg\");\n --md-admonition-bg-color--settings: rgba(170, 0, 255, 0.1);\n --md-admonition-icon-color--settings: #aa00ff;\n --md-admonition-shadow-color--settings: rgba(170, 0, 255, 0.1);\n --md-admonition-icon--new: svg-load(\"@mdi/svg/svg/alert-decagram.svg\");\n --md-admonition-bg-color--new: rgba(255, 214, 0, 0.1);\n --md-admonition-icon-color--new: #ffd600;\n --md-admonition-shadow-color--new: rgba(255, 214, 0, 0.1);\n --md-admonition-bg-color--note: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--note: hsl(51, 94%, 73%);\n --md-admonition-shadow-color--note: rgba(251, 231, 121, 0.1);\n --md-admonition-bg-color--abstract: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--abstract: hsl(191, 97%, 77%);\n --md-admonition-shadow-color--abstract: rgba(139, 232, 253, 0.1);\n --md-admonition-bg-color--info: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--info: hsl(190, 94%, 87%);\n --md-admonition-shadow-color--info: rgba(191, 243, 253, 0.1);\n --md-admonition-bg-color--tip: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--tip: hsl(161, 97%, 77%);\n --md-admonition-shadow-color--tip: rgba(139, 253, 217, 0.1);\n --md-admonition-bg-color--success: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--success: hsl(135, 94%, 65%);\n --md-admonition-shadow-color--success: rgba(82, 250, 124, 0.1);\n --md-admonition-bg-color--question: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--question: hsl(135, 92%, 79%);\n --md-admonition-shadow-color--question: rgba(152, 251, 177, 0.1);\n --md-admonition-bg-color--warning: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--warning: hsl(31, 100%, 71%);\n --md-admonition-shadow-color--warning: rgba(255, 184, 107, 0.1);\n --md-admonition-bg-color--failure: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--failure: hsl(0, 100%, 59%);\n --md-admonition-shadow-color--failure: rgba(255, 46, 46, 0.1);\n --md-admonition-bg-color--danger: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--danger: hsl(0, 100%, 67%);\n --md-admonition-shadow-color--danger: rgba(255, 87, 87, 0.1);\n --md-admonition-bg-color--bug: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--bug: hsl(325, 100%, 64%);\n --md-admonition-shadow-color--bug: rgba(255, 71, 179, 0.1);\n --md-admonition-bg-color--example: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--example: hsl(265, 89%, 78%);\n --md-admonition-shadow-color--example: rgba(191, 149, 249, 0.1);\n --md-admonition-bg-color--quote: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--quote: hsl(225, 8%, 51%);\n --md-admonition-shadow-color--quote: rgba(120, 125, 140, 0.1);\n}\n:root > *[data-md-color-scheme=dracula] {\n --md-admonition-icon-color: $drac-dark-yellow;\n}\n:root > *[data-md-color-scheme=dracula] {\n --md-admonition-bg-color--settings: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--settings: hsl(326, 100%, 74%);\n --md-admonition-shadow-color--settings: rgba(255, 122, 198, 0.1);\n}\n:root > *[data-md-color-scheme=dracula] {\n --md-admonition-bg-color--new: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--new: hsl(65, 92%, 76%);\n --md-admonition-shadow-color--new: rgba(241, 250, 137, 0.1);\n}\n\n/* Dark mode changes */\n[data-md-color-scheme=dracula] .md-typeset .admonition, [data-md-color-scheme=dracula] .md-typeset details {\n border-color: var(--md-admonition-icon-color--note);\n box-shadow: var(--md-shadow-z2);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition:focus-within, [data-md-color-scheme=dracula] .md-typeset details:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--note);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details > summary {\n background-color: var(--md-admonition-bg-color--note);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details > summary::before {\n background-color: var(--md-admonition-icon-color--note);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details > summary::after {\n color: var(--md-admonition-icon-color--note);\n}\n\n/* Style existing admonitions with dark mode colors */\n[data-md-color-scheme=dracula] .md-typeset .admonition.note, [data-md-color-scheme=dracula] .md-typeset details.note {\n border-color: var(--md-admonition-icon-color--note);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.note:focus-within, [data-md-color-scheme=dracula] .md-typeset details.note:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--note);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.note > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.note > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.note > summary {\n background-color: var(--md-admonition-bg-color--note);\n border-color: var(--md-admonition-icon-color--note);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.note > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.note > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.note > summary::before {\n background-color: var(--md-admonition-icon-color--note);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.note > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.note > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.note > summary::after {\n color: var(--md-admonition-icon-color--note);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.abstract, [data-md-color-scheme=dracula] .md-typeset details.abstract {\n border-color: var(--md-admonition-icon-color--abstract);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.abstract:focus-within, [data-md-color-scheme=dracula] .md-typeset details.abstract:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--abstract);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.abstract > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.abstract > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.abstract > summary {\n background-color: var(--md-admonition-bg-color--abstract);\n border-color: var(--md-admonition-icon-color--abstract);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.abstract > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.abstract > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.abstract > summary::before {\n background-color: var(--md-admonition-icon-color--abstract);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.abstract > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.abstract > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.abstract > summary::after {\n color: var(--md-admonition-icon-color--abstract);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.info, [data-md-color-scheme=dracula] .md-typeset details.info {\n border-color: var(--md-admonition-icon-color--info);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.info:focus-within, [data-md-color-scheme=dracula] .md-typeset details.info:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--info);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.info > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.info > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.info > summary {\n background-color: var(--md-admonition-bg-color--info);\n border-color: var(--md-admonition-icon-color--info);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.info > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.info > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.info > summary::before {\n background-color: var(--md-admonition-icon-color--info);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.info > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.info > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.info > summary::after {\n color: var(--md-admonition-icon-color--info);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.tip, [data-md-color-scheme=dracula] .md-typeset details.tip {\n border-color: var(--md-admonition-icon-color--tip);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.tip:focus-within, [data-md-color-scheme=dracula] .md-typeset details.tip:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--tip);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.tip > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.tip > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.tip > summary {\n background-color: var(--md-admonition-bg-color--tip);\n border-color: var(--md-admonition-icon-color--tip);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.tip > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.tip > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.tip > summary::before {\n background-color: var(--md-admonition-icon-color--tip);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.tip > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.tip > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.tip > summary::after {\n color: var(--md-admonition-icon-color--tip);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.success, [data-md-color-scheme=dracula] .md-typeset details.success {\n border-color: var(--md-admonition-icon-color--success);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.success:focus-within, [data-md-color-scheme=dracula] .md-typeset details.success:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--success);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.success > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.success > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.success > summary {\n background-color: var(--md-admonition-bg-color--success);\n border-color: var(--md-admonition-icon-color--success);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.success > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.success > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.success > summary::before {\n background-color: var(--md-admonition-icon-color--success);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.success > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.success > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.success > summary::after {\n color: var(--md-admonition-icon-color--success);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.question, [data-md-color-scheme=dracula] .md-typeset details.question {\n border-color: var(--md-admonition-icon-color--question);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.question:focus-within, [data-md-color-scheme=dracula] .md-typeset details.question:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--question);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.question > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.question > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.question > summary {\n background-color: var(--md-admonition-bg-color--question);\n border-color: var(--md-admonition-icon-color--question);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.question > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.question > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.question > summary::before {\n background-color: var(--md-admonition-icon-color--question);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.question > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.question > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.question > summary::after {\n color: var(--md-admonition-icon-color--question);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.warning, [data-md-color-scheme=dracula] .md-typeset details.warning {\n border-color: var(--md-admonition-icon-color--warning);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.warning:focus-within, [data-md-color-scheme=dracula] .md-typeset details.warning:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--warning);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.warning > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.warning > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.warning > summary {\n background-color: var(--md-admonition-bg-color--warning);\n border-color: var(--md-admonition-icon-color--warning);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.warning > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.warning > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.warning > summary::before {\n background-color: var(--md-admonition-icon-color--warning);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.warning > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.warning > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.warning > summary::after {\n color: var(--md-admonition-icon-color--warning);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.failure, [data-md-color-scheme=dracula] .md-typeset details.failure {\n border-color: var(--md-admonition-icon-color--failure);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.failure:focus-within, [data-md-color-scheme=dracula] .md-typeset details.failure:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--failure);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.failure > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.failure > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.failure > summary {\n background-color: var(--md-admonition-bg-color--failure);\n border-color: var(--md-admonition-icon-color--failure);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.failure > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.failure > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.failure > summary::before {\n background-color: var(--md-admonition-icon-color--failure);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.failure > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.failure > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.failure > summary::after {\n color: var(--md-admonition-icon-color--failure);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.danger, [data-md-color-scheme=dracula] .md-typeset details.danger {\n border-color: var(--md-admonition-icon-color--danger);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.danger:focus-within, [data-md-color-scheme=dracula] .md-typeset details.danger:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--danger);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.danger > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.danger > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.danger > summary {\n background-color: var(--md-admonition-bg-color--danger);\n border-color: var(--md-admonition-icon-color--danger);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.danger > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.danger > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.danger > summary::before {\n background-color: var(--md-admonition-icon-color--danger);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.danger > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.danger > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.danger > summary::after {\n color: var(--md-admonition-icon-color--danger);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.bug, [data-md-color-scheme=dracula] .md-typeset details.bug {\n border-color: var(--md-admonition-icon-color--bug);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.bug:focus-within, [data-md-color-scheme=dracula] .md-typeset details.bug:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--bug);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.bug > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.bug > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.bug > summary {\n background-color: var(--md-admonition-bg-color--bug);\n border-color: var(--md-admonition-icon-color--bug);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.bug > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.bug > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.bug > summary::before {\n background-color: var(--md-admonition-icon-color--bug);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.bug > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.bug > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.bug > summary::after {\n color: var(--md-admonition-icon-color--bug);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.example, [data-md-color-scheme=dracula] .md-typeset details.example {\n border-color: var(--md-admonition-icon-color--example);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.example:focus-within, [data-md-color-scheme=dracula] .md-typeset details.example:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--example);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.example > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.example > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.example > summary {\n background-color: var(--md-admonition-bg-color--example);\n border-color: var(--md-admonition-icon-color--example);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.example > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.example > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.example > summary::before {\n background-color: var(--md-admonition-icon-color--example);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.example > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.example > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.example > summary::after {\n color: var(--md-admonition-icon-color--example);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.quote, [data-md-color-scheme=dracula] .md-typeset details.quote {\n border-color: var(--md-admonition-icon-color--quote);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.quote:focus-within, [data-md-color-scheme=dracula] .md-typeset details.quote:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--quote);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.quote > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.quote > .admonition-title, [data-md-color-scheme=dracula] .md-typeset details.quote > summary {\n background-color: var(--md-admonition-bg-color--quote);\n border-color: var(--md-admonition-icon-color--quote);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.quote > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.quote > .admonition-title::before, [data-md-color-scheme=dracula] .md-typeset details.quote > summary::before {\n background-color: var(--md-admonition-icon-color--quote);\n}\n[data-md-color-scheme=dracula] .md-typeset .admonition.quote > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.quote > .admonition-title::after, [data-md-color-scheme=dracula] .md-typeset details.quote > summary::after {\n color: var(--md-admonition-icon-color--quote);\n}\n\n.md-typeset .admonition.settings, .md-typeset details.settings, .md-typeset .admonition.config, .md-typeset details.config {\n border-color: var(--md-admonition-icon-color--settings);\n}\n.md-typeset .admonition.settings:focus-within, .md-typeset details.settings:focus-within, .md-typeset .admonition.config:focus-within, .md-typeset details.config:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--settings);\n}\n.md-typeset .admonition.settings > .admonition-title, .md-typeset details.settings > .admonition-title, .md-typeset details.settings > summary, .md-typeset .admonition.config > .admonition-title, .md-typeset details.config > .admonition-title, .md-typeset details.config > summary {\n background-color: var(--md-admonition-bg-color--settings);\n border-color: var(--md-admonition-icon-color--settings);\n}\n.md-typeset .admonition.settings > .admonition-title::before, .md-typeset details.settings > .admonition-title::before, .md-typeset details.settings > summary::before, .md-typeset .admonition.config > .admonition-title::before, .md-typeset details.config > .admonition-title::before, .md-typeset details.config > summary::before {\n width: 1rem;\n height: 1rem;\n background-color: var(--md-admonition-icon-color--settings);\n background-size: 1rem;\n mask-image: var(--md-admonition-icon--settings);\n content: \" \";\n}\n.md-typeset .admonition.settings > .admonition-title::after, .md-typeset details.settings > .admonition-title::after, .md-typeset details.settings > summary::after, .md-typeset .admonition.config > .admonition-title::after, .md-typeset details.config > .admonition-title::after, .md-typeset details.config > summary::after {\n color: var(--md-admonition-icon-color--settings);\n}\n\n.md-typeset .admonition.new, .md-typeset details.new {\n border-color: var(--md-admonition-icon-color--new);\n}\n.md-typeset .admonition.new:focus-within, .md-typeset details.new:focus-within {\n box-shadow: 0 0 0 0.2rem var(--md-admonition-shadow-color--new);\n}\n.md-typeset .admonition.new > .admonition-title, .md-typeset details.new > .admonition-title, .md-typeset details.new > summary {\n background-color: var(--md-admonition-bg-color--new);\n border-color: var(--md-admonition-icon-color--new);\n}\n.md-typeset .admonition.new > .admonition-title::before, .md-typeset details.new > .admonition-title::before, .md-typeset details.new > summary::before {\n width: 1rem;\n height: 1rem;\n background-color: var(--md-admonition-icon-color--new);\n background-size: 1rem;\n mask-image: var(--md-admonition-icon--new);\n content: \" \";\n}\n.md-typeset .admonition.new > .admonition-title::after, .md-typeset details.new > .admonition-title::after, .md-typeset details.new > summary::after {\n color: var(--md-admonition-icon-color--new);\n}\n\nmjx-container[display=true] {\n font-size: 120% !important;\n}\n\nmjx-container:not([display]) {\n font-size: 100% !important;\n}\n\n[data-md-color-scheme=slate],\n[data-md-color-scheme=dracula] {\n /* stylelint-disable selector-class-pattern */\n /* stylelint-enable selector-class-pattern */\n}\n[data-md-color-scheme=slate] .CtxtMenu_InfoSignature input,\n[data-md-color-scheme=slate] .CtxtMenu_InfoContent pre,\n[data-md-color-scheme=dracula] .CtxtMenu_InfoSignature input,\n[data-md-color-scheme=dracula] .CtxtMenu_InfoContent pre {\n color: rgb(0, 0, 0);\n}\n[data-md-color-scheme=slate] .CtxtMenu_Info,\n[data-md-color-scheme=slate] .CtxtMenu_Menu,\n[data-md-color-scheme=dracula] .CtxtMenu_Info,\n[data-md-color-scheme=dracula] .CtxtMenu_Menu {\n box-shadow: 0px 10px 20px rgba(0, 0, 0, 0.5);\n}\n\n.md-typeset .arithmatex {\n overflow-x: auto !important;\n overflow-y: hidden !important;\n}\n\n.katex-display .katex-html {\n display: flex !important;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: baseline;\n justify-content: space-between;\n}\n.katex-display .katex-html .base {\n display: inline !important;\n}\n.katex-display .katex-html .tag {\n position: relative !important;\n display: inline !important;\n margin-left: var(--margin-small);\n}\n\n/* Don't use box shadows */\n.md-typeset del.critic,\n.md-typeset ins.critic,\n.md-typeset mark.critic {\n padding: 0 0.25em;\n color: unset;\n box-shadow: none;\n}\n.md-typeset .critic.break {\n margin: 0;\n}\n\n/* Inherit admonition style */\n.md-typeset details {\n overflow: hidden;\n}\n.md-typeset details > summary:focus {\n outline-style: none;\n}\n\n.highlight .kc {\n color: var(--md-code-hl-constant-color);\n}\n.highlight .nc,\n.highlight .ne {\n color: var(--md-code-hl-class-color);\n}\n.highlight .mb {\n color: var(--md-code-hl-number-color);\n}\n.highlight .nb,\n.highlight .bp {\n color: var(--md-code-hl-builtin-color);\n}\n.highlight .nn {\n color: var(--md-code-hl-namespace-color);\n}\n.highlight .na,\n.highlight .nd,\n.highlight .ni {\n color: var(--md-code-hl-entity-color);\n}\n.highlight .nl,\n.highlight .nt {\n color: var(--md-code-hl-tag-color);\n}\n\n.md-typeset {\n /* Allow code to look like code everywhere despite Material's current preference */\n /* Code that is also a link */\n /* Don't always like code breaking in table cells */\n /* Special line number coloring for tables */\n}\n.md-typeset *:not(pre) > code {\n margin: 0;\n padding: 0 0.2941176471em;\n color: var(--md-code-fg-color);\n background-color: var(--md-code-inline-bg-color);\n border-radius: 0.1rem;\n box-shadow: none;\n}\n.md-typeset a > code {\n color: inherit !important;\n background-color: var(--md-code-link-bg-color) !important;\n transition: color 125ms;\n transition: background-color 125ms;\n /* If we are linking highlighted, inline code, force it to just look like a code link */\n}\n.md-typeset a > code * {\n color: var(--md-typeset-a-color) !important;\n}\n.md-typeset a > code:hover {\n background-color: var(--md-code-link-accent-bg-color) !important;\n}\n.md-typeset a > code:hover * {\n color: var(--md-accent-fg-color) !important;\n}\n.md-typeset pre > code {\n outline: none;\n}\n.md-typeset td code {\n word-break: normal;\n}\n.md-typeset .highlight {\n /* Needed for tab preserving mode */\n tab-size: 8;\n /* `pymdownx-inline` mode */\n}\n.md-typeset .highlight + .result {\n border-width: 0.1rem;\n}\n.md-typeset .highlight [data-linenos] {\n /* Special line mode coloring */\n}\n.md-typeset .highlight [data-linenos].special::before {\n background-color: var(--md-code-special-bg-color);\n}\n.md-typeset .highlighttable .linenodiv .special {\n margin-right: -0.5882352941em;\n margin-left: -1.1764705882em;\n padding-right: 0.5882352941em;\n padding-left: 1.1764705882em;\n background-color: var(--md-code-special-bg-color);\n}\n.md-typeset .highlight span.filename {\n position: relative;\n display: block;\n margin-top: 1em;\n padding: 0.5em 1.1764705882em 0.5em 2.9411764706em;\n font-weight: 700;\n font-size: 0.68rem;\n background-color: var(--md-code-title-bg-color);\n border-top-left-radius: 0.1rem;\n border-top-right-radius: 0.1rem;\n}\n.md-typeset .highlight span.filename + pre {\n margin-top: 0;\n}\n.md-typeset .highlight span.filename + pre code {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.md-typeset .highlight span.filename::before {\n position: absolute;\n left: 0.8823529412em;\n width: 1.4705882353em;\n height: 1.4705882353em;\n background-color: var(--md-default-fg-color);\n mask-image: svg-load(\"@mdi/svg/svg/console.svg\");\n mask-repeat: no-repeat;\n mask-size: contain;\n content: \"\";\n}\n.md-typeset .collapse-code {\n position: relative;\n margin-top: 1em;\n margin-bottom: 1em;\n}\n.md-typeset .collapse-code pre {\n margin-top: 0;\n margin-bottom: 0;\n}\n.md-typeset .collapse-code input {\n display: none;\n}\n.md-typeset .collapse-code input ~ .code-footer {\n width: 100%;\n margin: 0;\n padding: 0.25em 0.5em 0.25em 0em;\n}\n.md-typeset .collapse-code input ~ .code-footer label {\n position: relative;\n margin: 0.05em;\n padding: 0.15em 0.8em;\n color: var(--md-primary-bg-color);\n font-size: 90%;\n background-color: var(--md-primary-fg-color);\n mask-repeat: no-repeat;\n mask-size: contain;\n border-radius: 0.1rem;\n cursor: pointer;\n content: \"\";\n}\n.md-typeset .collapse-code input ~ .code-footer label:hover {\n background-color: var(--md-accent-fg-color);\n}\n.md-typeset .collapse-code input ~ .code-footer label::before {\n position: absolute;\n top: 0.15em;\n left: 0.15em;\n display: block;\n box-sizing: border-box;\n width: 1.25em;\n height: 1.25em;\n background-color: var(--md-primary-bg-color);\n background-size: 1.25em;\n content: \"\";\n}\n.md-typeset .collapse-code input ~ .code-footer label.expand {\n display: none;\n}\n.md-typeset .collapse-code input ~ .code-footer label.expand::before {\n mask-image: svg-load(\"@mdi/svg/svg/arrow-expand.svg\");\n}\n.md-typeset .collapse-code input ~ .code-footer label.collapse::before {\n mask-image: svg-load(\"@mdi/svg/svg/arrow-collapse.svg\");\n}\n.md-typeset .collapse-code input:checked ~ .code-footer label.expand {\n display: inline;\n}\n.md-typeset .collapse-code input:checked ~ .code-footer label.collapse {\n display: none;\n}\n.md-typeset .collapse-code input:checked + div.highlight code {\n max-height: 9.375em;\n overflow: hidden;\n}\n.md-typeset .collapse-code input:checked ~ .code-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding: 2em 0.5em 0.5em 0.8rem;\n background-image: linear-gradient(to bottom, transparent, var(--md-default-bg-color) 80% 100%);\n}\n@media screen and (max-width: 44.9375em) {\n .md-typeset > diagram-div {\n margin-right: -0.8rem;\n margin-left: -0.8rem;\n }\n .md-typeset > .collapse-code {\n margin-right: -0.8rem;\n margin-left: -0.8rem;\n }\n .md-typeset > .collapse-code label.collapse {\n left: 0.8rem;\n }\n}\n\n.md-typeset .keys .key-power::before {\n padding-right: 0.4em;\n content: \"⏻\";\n}\n.md-typeset .keys .key-fingerprint::before {\n padding-right: 0.4em;\n content: \"☝\";\n}\n\n:root > * {\n --magiclink-email-icon: svg-load(\"@mdi/svg/svg/mail.svg\");\n --magiclink-github-icon: svg-load(\"@mdi/svg/svg/github.svg\");\n --magiclink-bitbucket-icon: svg-load(\"@mdi/svg/svg/bitbucket.svg\");\n --magiclink-gitlab-icon: svg-load(\"@mdi/svg/svg/gitlab.svg\");\n --magiclink-commit-icon: svg-load(\"@primer/octicons/build/svg/git-commit-24.svg\");\n --magiclink-compare-icon: svg-load(\"@primer/octicons/build/svg/file-diff-24.svg\");\n --magiclink-pull-icon: svg-load(\"@primer/octicons/build/svg/git-pull-request-24.svg\");\n --magiclink-issue-icon: svg-load(\"@primer/octicons/build/svg/issue-opened-24.svg\");\n --magiclink-discussion-icon: svg-load(\"@primer/octicons/build/svg/comment-discussion-24.svg\");\n}\n\n.md-typeset a[href^=\"mailto:\"]:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-email-icon);\n}\n.md-typeset .magiclink-repository:not(.magiclink-ignore),\n.md-typeset .magiclink-compare:not(.magiclink-ignore),\n.md-typeset .magiclink-commit:not(.magiclink-ignore),\n.md-typeset .magiclink-pull:not(.magiclink-ignore),\n.md-typeset .magiclink-issue:not(.magiclink-ignore),\n.md-typeset .magiclink-discussion:not(.magiclink-ignore),\n.md-typeset a[href^=\"mailto:\"]:not(.magiclink-ignore) {\n position: relative;\n padding-left: 1.375em;\n}\n.md-typeset .magiclink-repository:not(.magiclink-ignore)::before,\n.md-typeset .magiclink-compare:not(.magiclink-ignore)::before,\n.md-typeset .magiclink-commit:not(.magiclink-ignore)::before,\n.md-typeset .magiclink-pull:not(.magiclink-ignore)::before,\n.md-typeset .magiclink-issue:not(.magiclink-ignore)::before,\n.md-typeset .magiclink-discussion:not(.magiclink-ignore)::before,\n.md-typeset a[href^=\"mailto:\"]:not(.magiclink-ignore)::before {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n box-sizing: border-box;\n width: 1.25em;\n height: 1.25em;\n background-color: var(--md-typeset-a-color);\n background-size: 1.25em;\n transition: background-color 125ms;\n mask-repeat: no-repeat;\n mask-size: contain;\n content: \"\";\n}\n.md-typeset .magiclink-repository:not(.magiclink-ignore):hover::before,\n.md-typeset .magiclink-compare:not(.magiclink-ignore):hover::before,\n.md-typeset .magiclink-commit:not(.magiclink-ignore):hover::before,\n.md-typeset .magiclink-pull:not(.magiclink-ignore):hover::before,\n.md-typeset .magiclink-issue:not(.magiclink-ignore):hover::before,\n.md-typeset .magiclink-discussion:not(.magiclink-ignore):hover::before,\n.md-typeset a[href^=\"mailto:\"]:not(.magiclink-ignore):hover::before {\n background-color: var(--md-accent-fg-color);\n}\n\n.md-typeset .magiclink-commit:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-commit-icon);\n}\n\n.md-typeset .magiclink-compare:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-compare-icon);\n}\n\n.md-typeset .magiclink-pull:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-pull-icon);\n}\n\n.md-typeset .magiclink-issue:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-issue-icon);\n}\n\n.md-typeset .magiclink-discussion:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-discussion-icon);\n}\n\n.md-typeset .magiclink-repository.magiclink-github:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-github-icon);\n}\n\n.md-typeset .magiclink-repository.magiclink-gitlab:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-gitlab-icon);\n}\n\n.md-typeset .magiclink-repository.magiclink-bitbucket:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-bitbucket-icon);\n}\n\n/* Shadow boxes sometimes give issues, so just pad. */\n.md-typeset mark:not(.critic) {\n box-shadow: none;\n}\n\n.md-typeset {\n /* Progress Bars */\n /* Stripe animation */\n}\n.md-typeset .progress-label {\n position: absolute;\n width: 100%;\n margin: 0;\n color: var(--md-text-color);\n font-weight: 700;\n line-height: 1.4rem;\n white-space: nowrap;\n text-align: center;\n text-shadow: -0.0625em -0.0625em 0.375em var(--md-default-bg-color--light), 0.0625em -0.0625em 0.375em var(--md-default-bg-color--light), -0.0625em 0.0625em 0.375em var(--md-default-bg-color--light), 0.0625em 0.0625em 0.375em var(--md-default-bg-color--light);\n}\n.md-typeset .progress-bar {\n float: left;\n height: 1.2rem;\n background-color: #2979ff;\n}\n.md-typeset .candystripe-animate .progress-bar {\n animation: animate-stripes 3s linear infinite;\n}\n.md-typeset .progress {\n position: relative;\n display: block;\n width: 100%;\n height: 1.2rem;\n margin: 0.5rem 0;\n background-color: var(--md-default-fg-color--lightest);\n}\n.md-typeset .progress.thin {\n height: 0.4rem;\n margin-top: 0.9rem;\n}\n.md-typeset .progress.thin .progress-label {\n margin-top: -0.4rem;\n}\n.md-typeset .progress.thin .progress-bar {\n height: 0.4rem;\n}\n.md-typeset .progress.candystripe .progress-bar {\n background-image: linear-gradient(135deg, var(--md-progress-stripe) 27%, transparent 27%, transparent 52%, var(--md-progress-stripe) 52%, var(--md-progress-stripe) 77%, transparent 77%, transparent);\n background-size: 2rem 2rem;\n}\n.md-typeset .progress-100plus .progress-bar {\n background-color: var(--md-progress-100);\n}\n.md-typeset .progress-80plus .progress-bar {\n background-color: var(--md-progress-80);\n}\n.md-typeset .progress-60plus .progress-bar {\n background-color: var(--md-progress-60);\n}\n.md-typeset .progress-40plus .progress-bar {\n background-color: var(--md-progress-40);\n}\n.md-typeset .progress-20plus .progress-bar {\n background-color: var(--md-progress-20);\n}\n.md-typeset .progress-0plus .progress-bar {\n background-color: var(--md-progress-0);\n}\n@keyframes animate-stripes {\n 0% {\n background-position: 0 0;\n }\n 100% {\n background-position: 6rem 0;\n }\n}\n\n/* Dark mode changes */\n[data-md-color-scheme=dracula] .md-typeset .tabbed-set > .tabbed-labels {\n box-shadow: 0 -0.05rem var(--md-default-fg-color--lighter) inset;\n}\n\n/* Style code blocks to fill full tab,\n but otherwise, pad content. */\n.md-typeset .tabbed-alternate.tabbed-set .tabbed-control {\n width: 2rem;\n}\n.md-typeset .tabbed-alternate.tabbed-set .tabbed-control[hidden] {\n width: 1.2rem;\n opacity: 0;\n}\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block {\n padding: 0 0.6rem;\n}\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > pre:only-child,\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .codehilite:only-child,\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .codehilitetable:only-child,\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .highlight:only-child,\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .highlighttable:only-child {\n margin-right: -1.2rem;\n margin-left: -1.2rem;\n padding-right: 0.6rem;\n padding-left: 0.6rem;\n}\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > pre:only-child span.filename,\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .codehilite:only-child span.filename,\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .codehilitetable:only-child span.filename,\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .highlight:only-child span.filename,\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .highlighttable:only-child span.filename {\n margin-top: 0;\n}\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .collapse-code:only-child {\n margin-top: 0;\n margin-right: -1.2rem;\n margin-left: -1.2rem;\n padding-right: 0.6rem;\n padding-left: 0.6rem;\n}\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > .collapse-code:only-child > .code-footer {\n left: 0.6rem;\n}\n.md-typeset .tabbed-alternate.tabbed-set > .tabbed-content > .tabbed-block > diagram-div:only-child {\n margin-right: -1.2rem;\n margin-left: -1.2rem;\n padding-right: 0.6rem;\n padding-left: 0.6rem;\n}\n\n.js .md-typeset .tabbed-labels::before {\n background-color: var(--md-accent-fg-color);\n}\n\n/* Ignore mobile overflow styling that extends the tab bar */\n@media screen and (max-width: 44.9375em) {\n [dir=ltr] .md-content__inner > .tabbed-set .tabbed-labels {\n padding-left: 0;\n }\n .md-content__inner > .tabbed-set .tabbed-labels {\n max-width: 100%;\n margin: 0;\n padding-inline-start: 0;\n scroll-padding-inline-start: 0;\n }\n .md-content__inner > .tabbed-set .tabbed-labels::after {\n padding-inline-end: 0;\n content: none;\n }\n .md-content__inner > .tabbed-set .tabbed-labels ~ .tabbed-control--prev {\n margin-inline-start: 0;\n padding-inline-start: 0;\n }\n .md-content__inner > .tabbed-set .tabbed-labels ~ .tabbed-control--next {\n margin-inline-end: 0;\n padding-inline-end: 0;\n }\n}\n/* Dark mode changes */\n[data-md-color-scheme=dracula] .md-typeset table:not([class]) {\n box-shadow: var(--md-shadow-z2);\n}\n[data-md-color-scheme=dracula] .md-typeset table:not([class]) tr:hover {\n background-color: rgba(0, 0, 0, 0.08);\n}\n[data-md-color-scheme=dracula] .md-typeset table:not([class]) th {\n color: var(--md-text-color);\n background-color: var(--md-default-bg-color--ultra-dark);\n border-bottom: 0.05rem solid var(--md-primary-fg-color);\n}\n[data-md-color-scheme=dracula] .md-typeset table:not([class]) td {\n border-top: 0.05rem solid var(--md-default-fg-color--lighter);\n}\n\n/* Dark mode changes */\n[data-md-color-scheme=dracula] .md-typeset .task-list-control .task-list-indicator::before {\n background-color: var(--md-default-fg-color--lighter);\n}\n[data-md-color-scheme=dracula] .md-typeset .task-list-control [type=checkbox]:checked + .task-list-indicator::before {\n background-color: hsl(135, 94%, 65%);\n}\n\n.md-typeset .headerlink {\n width: 1em;\n height: 1em;\n vertical-align: middle;\n background-color: var(--md-default-fg-color--lighter);\n background-size: 1em;\n mask-size: 1em;\n mask-repeat: no-repeat;\n visibility: visible;\n mask-image: svg-load(\"@mdi/svg/svg/link.svg\");\n}\n.md-typeset .headerlink:hover,\n.md-typeset [id]:target .headerlink {\n background-color: var(--md-accent-fg-color);\n}\n\n/* Special handling of Mermaid content. */\ndiagram-div {\n overflow: auto;\n}\n\nhtml {\n background-color: transparent;\n}\n\n[data-md-component=announce] .twemoji {\n color: var(--md-primary-fg-color);\n}\n\n/* Dark mode changes */\n[data-md-color-scheme=dracula] {\n --md-text-color: var(--md-default-fg-color);\n background-color: var(--md-default-bg-color);\n --md-footer-bg-color: transparent;\n --md-footer-bg-color--dark: var(--md-default-bg-color--darkest);\n --md-header-fg-color: var(--md-text-color);\n --md-header-bg-color: var(--md-default-bg-color--darkest);\n}\n[data-md-color-scheme=dracula] .md-header {\n color: var(--md-text-color);\n background-color: var(--md-header-bg-color);\n border-bottom: 0.05rem solid var(--md-primary-fg-color);\n}\n[data-md-color-scheme=dracula] .md-header[data-md-state=shadow] {\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.15), 0 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2);\n}\n[data-md-color-scheme=dracula] .md-top {\n background-color: var(--md-default-bg-color--dark);\n}\n[data-md-color-scheme=dracula] .md-top:hover {\n background-color: var(--md-primary-fg-color);\n}\n[data-md-color-scheme=dracula] .md-tabs {\n color: var(--md-text-color);\n background-color: var(--md-primary-fg-color--transparent);\n}\n[data-md-color-scheme=dracula] .md-tabs__link--active {\n color: var(--md-primary-fg-color);\n}\n[data-md-color-scheme=dracula] .md-tabs__link:hover {\n color: var(--md-accent-fg-color);\n}\n[data-md-color-scheme=dracula] .md-hero {\n color: var(--md-text-color);\n background-color: var(--md-primary-fg-color--transparent);\n}\n[data-md-color-scheme=dracula] .md-nav__source {\n color: var(--md-text-color);\n}\n[data-md-color-scheme=dracula] .md-nav__link[data-md-state=blur] {\n color: var(--md-default-fg-color--light);\n}\n[data-md-color-scheme=dracula] .md-nav__item .md-nav__link--active {\n color: var(--md-primary-fg-color);\n}\n[data-md-color-scheme=dracula] .md-nav__link:focus, [data-md-color-scheme=dracula] .md-nav__link:hover {\n color: var(--md-accent-fg-color);\n}\n@media screen and (max-width: 76.1875em) {\n [data-md-color-scheme=dracula] .md-nav--primary .md-nav__item--active > .md-nav__link:not(:hover) {\n color: var(--md-primary-fg-color);\n }\n [data-md-color-scheme=dracula] .md-nav--primary .md-nav__title {\n color: var(--md-text-color);\n background-color: var(--md-header-bg-color);\n border-bottom: 0.05rem solid var(--md-primary-fg-color);\n }\n}\n@media screen and (max-width: 59.9375em) {\n [data-md-color-scheme=dracula] .md-nav__source {\n color: var(--md-text-color);\n background-color: var(--md-primary-fg-color--transparent);\n }\n [data-md-color-scheme=dracula] .md-nav .md-nav__title {\n color: var(--md-text-color);\n background-color: var(--md-header-bg-color);\n border-bottom: 0.05rem solid var(--md-primary-fg-color);\n }\n}\n[data-md-color-scheme=dracula] .md-search__input {\n color: var(--md-text-color);\n background-color: var(--md-accent-bg-color--light);\n}\n[data-md-color-scheme=dracula] .md-search__input:hover {\n background-color: var(--md-default-bg-color--light);\n}\n[data-md-color-scheme=dracula] .md-search__input ~ .md-search__icon {\n color: var(--md-text-color);\n}\n[data-md-color-scheme=dracula] .md-search__input::placeholder {\n color: var(--md-default-fg-color--light);\n}\n[data-md-color-scheme=dracula] [data-md-toggle=search]:checked ~ .md-header .md-search__input {\n background-color: transparent;\n}\n[data-md-color-scheme=dracula] .md-search__suggest {\n color: var(--md-default-autocomplete-fg-color);\n}\n[data-md-color-scheme=dracula] .md-search__overlay, [data-md-color-scheme=dracula] .md-overlay {\n background-color: var(--md-default-bg-color--light);\n}\n[data-md-color-scheme=dracula] .md-footer-nav__direction {\n color: var(--md-primary-fg-color);\n}\n[data-md-color-scheme=dracula] .md-footer-meta {\n border-top: 0.05rem solid var(--md-primary-fg-color);\n}\n[data-md-color-scheme=dracula] [data-md-component=announce] {\n background-color: var(--md-default-bg-color--ultra-dark);\n}\n\n/* Don't force capitalization of `H5` elements. */\n.md-typeset h5 {\n color: var(--md-text-color);\n text-transform: none;\n}\n\n.md-typeset__scrollwrap,\n.md-sidebar__scrollwrap,\n.md-search__scrollwrap,\n.md-typeset pre > code,\n.md-typeset div.mermaid,\n.md-typeset div.diagram,\n.md-typeset mermaid-div,\n.md-typeset diagram-div,\n.md-typeset pre.arithmatex,\n.md-typeset div.arithmatex {\n scrollbar-color: var(--md-default-fg-color--lighter) transparent;\n scrollbar-width: thin;\n}\n.md-typeset__scrollwrap::-webkit-scrollbar,\n.md-sidebar__scrollwrap::-webkit-scrollbar,\n.md-search__scrollwrap::-webkit-scrollbar,\n.md-typeset pre > code::-webkit-scrollbar,\n.md-typeset div.mermaid::-webkit-scrollbar,\n.md-typeset div.diagram::-webkit-scrollbar,\n.md-typeset mermaid-div::-webkit-scrollbar,\n.md-typeset diagram-div::-webkit-scrollbar,\n.md-typeset pre.arithmatex::-webkit-scrollbar,\n.md-typeset div.arithmatex::-webkit-scrollbar {\n width: 0.2rem;\n height: 0.2rem;\n}\n.md-typeset__scrollwrap::-webkit-scrollbar-corner,\n.md-sidebar__scrollwrap::-webkit-scrollbar-corner,\n.md-search__scrollwrap::-webkit-scrollbar-corner,\n.md-typeset pre > code::-webkit-scrollbar-corner,\n.md-typeset div.mermaid::-webkit-scrollbar-corner,\n.md-typeset div.diagram::-webkit-scrollbar-corner,\n.md-typeset mermaid-div::-webkit-scrollbar-corner,\n.md-typeset diagram-div::-webkit-scrollbar-corner,\n.md-typeset pre.arithmatex::-webkit-scrollbar-corner,\n.md-typeset div.arithmatex::-webkit-scrollbar-corner {\n background-color: transparent;\n}\n.md-typeset__scrollwrap::-webkit-scrollbar-thumb,\n.md-sidebar__scrollwrap::-webkit-scrollbar-thumb,\n.md-search__scrollwrap::-webkit-scrollbar-thumb,\n.md-typeset pre > code::-webkit-scrollbar-thumb,\n.md-typeset div.mermaid::-webkit-scrollbar-thumb,\n.md-typeset div.diagram::-webkit-scrollbar-thumb,\n.md-typeset mermaid-div::-webkit-scrollbar-thumb,\n.md-typeset diagram-div::-webkit-scrollbar-thumb,\n.md-typeset pre.arithmatex::-webkit-scrollbar-thumb,\n.md-typeset div.arithmatex::-webkit-scrollbar-thumb {\n background-color: var(--md-default-fg-color--lighter);\n}\n.md-typeset__scrollwrap::-webkit-scrollbar-thumb:hover,\n.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover,\n.md-search__scrollwrap::-webkit-scrollbar-thumb:hover,\n.md-typeset pre > code::-webkit-scrollbar-thumb:hover,\n.md-typeset div.mermaid::-webkit-scrollbar-thumb:hover,\n.md-typeset div.diagram::-webkit-scrollbar-thumb:hover,\n.md-typeset mermaid-div::-webkit-scrollbar-thumb:hover,\n.md-typeset diagram-div::-webkit-scrollbar-thumb:hover,\n.md-typeset pre.arithmatex::-webkit-scrollbar-thumb:hover,\n.md-typeset div.arithmatex::-webkit-scrollbar-thumb:hover {\n background-color: var(--md-accent-fg-color);\n}\n.md-typeset__scrollwrap:hover,\n.md-sidebar__scrollwrap:hover,\n.md-search__scrollwrap:hover,\n.md-typeset pre > code:hover,\n.md-typeset div.mermaid:hover,\n.md-typeset div.diagram:hover,\n.md-typeset mermaid-div:hover,\n.md-typeset diagram-div:hover,\n.md-typeset pre.arithmatex:hover,\n.md-typeset div.arithmatex:hover {\n scrollbar-color: var(--md-accent-fg-color) transparent;\n}","/* Normal colors */\n:root {\n --md-heart: #{$clr-red-a200};\n --md-heart-big: #{$clr-red-a400};\n\n :focus-visible {\n outline-style: solid;\n }\n\n /* Dark mode colors */\n [data-md-color-scheme=\"dracula\"] {\n --md-heart: #{$drac-pink};\n --md-heart-big: #{$drac-red};\n }\n}\n\n.md-typeset {\n\n h4 {\n margin: 2.0em 0 1em;\n }\n\n a.source-link {\n position: relative;\n top: px2rem(-12px);\n float: right;\n color: var(--md-default-fg-color--lighter);\n transition: color 125ms;\n\n &:hover {\n color: var(--md-accent-fg-color);\n }\n\n .twemoji {\n height: px2rem(24px);\n\n svg {\n width: px2rem(24px);\n height: px2rem(24px);\n }\n }\n }\n\n div.highlight.md-max-height pre > code {\n max-height: px2rem(300px);\n }\n}\n\n.twemoji {\n &.heart-throb, &.heart-throb-hover {\n svg {\n position: relative;\n color: var(--md-heart);\n animation: pulse 1.5s ease infinite;\n }\n }\n}\n\n@keyframes pulse {\n 0% { transform: scale(1); }\n 40% { color: var(--md-heart-big); transform: scale(1.3); }\n 50% { transform: scale(1.2); }\n 60% { color: var(--md-heart-big); transform: scale(1.3); }\n 100% { transform: scale(1); }\n}\n\nfooter.sponsorship {\n text-align: center;\n\n hr {\n display: inline-block;\n width: px2rem(32px);\n margin: 0 px2rem(14px);\n vertical-align: middle;\n border-bottom: 2px solid var(--md-default-fg-color--lighter);\n }\n\n &:hover {\n hr {\n border-color: var(--md-accent-fg-color);\n }\n }\n\n &:not(:hover) {\n .twemoji.heart-throb-hover svg{\n color: var(--md-default-fg-color--lighter) !important;\n }\n }\n}\n\n// Scheme toggle\nbody {\n &:not([data-md-prefers-color-scheme=\"true\"])[data-md-color-scheme=\"dracula\"] .md-icon {\n .light-mode,\n .system-mode,\n .unknown-mode {\n display: none;\n }\n }\n\n\n &:not([data-md-prefers-color-scheme=\"true\"])[data-md-color-scheme=\"default\"] .md-icon {\n .dark-mode,\n .system-mode,\n .unknown-mode {\n display: none;\n }\n }\n\n &:not([data-md-prefers-color-scheme=\"true\"]):not([data-md-color-scheme=\"default\"]):not([data-md-color-scheme=\"dracula\"]) .md-icon {\n .dark-mode,\n .light-mode,\n .system-mode {\n display: none;\n }\n }\n\n &[data-md-prefers-color-scheme=\"true\"] .md-icon {\n .dark-mode,\n .light-mode,\n .unknown-mode {\n display: none;\n }\n }\n}\n\n.md-header-nav__scheme {\n z-index: 0;\n}\n\n@include break-to-device(tablet portrait) {\n .md-header-nav__scheme {\n padding-right: 0;\n }\n\n label[for=\"__search\"] {\n padding-left: 0;\n }\n}\n\n[data-md-toggle=search]:checked~.md-header .md-header-nav__scheme {\n display: none;\n}\n",".md-typeset .admonition {\n border-width: 0;\n border-left-width: 4px;\n}\n\n$new-admonitions: (\n settings config: $drac-pink $clr-purple-a700 \"@mdi/svg/svg/cog.svg\",\n new: $drac-yellow $clr-yellow-a700 \"@mdi/svg/svg/alert-decagram.svg\"\n) !default;\n\n $old-admonitions: (\n note: $drac-dark-yellow,\n abstract: $drac-cyan,\n info: $drac-light-blue,\n tip: $drac-teal,\n success: $drac-green,\n question: $drac-light-green,\n warning: $drac-orange,\n failure: $drac-dark-red,\n danger: $drac-red,\n bug: $drac-dark-pink,\n example: $drac-purple,\n quote: $drac-grey\n ) !default;\n\n/* Style new admonitions with dark or light colors */\n:root > * {\n --md-admonition-bg-color: transparent;\n\n &[data-md-color-scheme=\"dracula\"] {\n --md-admonition-icon-color: $drac-dark-yellow;\n }\n\n @each $names, $prop in $new-admonitions {\n $tint: nth($prop, 1);\n $tint2: nth($prop, 2);\n $name: nth($names, 1);\n\n --md-admonition-icon--#{$name}: svg-load(\"#{nth($prop, 3)}\");\n --md-admonition-bg-color--#{$name}: #{transparentize($tint2, 0.9)};\n --md-admonition-icon-color--#{$name}: #{$tint2};\n --md-admonition-shadow-color--#{$name}: #{transparentize($tint2, 0.9)};\n\n &[data-md-color-scheme=\"dracula\"] {\n --md-admonition-bg-color--#{$name}: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--#{$name}: #{$tint};\n --md-admonition-shadow-color--#{$name}: #{transparentize($tint, 0.9)};\n }\n }\n\n @each $names, $tint in $old-admonitions {\n $name: nth($names, 1);\n --md-admonition-bg-color--#{$name}: var(--md-default-bg-color--ultra-dark);\n --md-admonition-icon-color--#{$name}: #{$tint};\n --md-admonition-shadow-color--#{$name}: #{transparentize($tint, 0.9)};\n }\n}\n\n/* Dark mode changes */\n[data-md-color-scheme=\"dracula\"] .md-typeset .admonition {\n border-color: var(--md-admonition-icon-color--note);\n\n &:focus-within {\n box-shadow: 0 0 0 px2rem(4px) var(--md-admonition-shadow-color--note);\n }\n\n > .admonition-title {\n background-color: var(--md-admonition-bg-color--note);\n &::before {\n background-color: var(--md-admonition-icon-color--note);\n }\n &::after {\n color: var(--md-admonition-icon-color--note);\n }\n }\n\n box-shadow: var(--md-shadow-z2);\n}\n\n/* Style existing admonitions with dark mode colors */\n[data-md-color-scheme=\"dracula\"] {\n\n @each $names, $prop in $old-admonitions {\n\n $name: nth($names, 1);\n\n // Define base class\n .md-typeset .admonition.#{$name} {\n border-color: var(--md-admonition-icon-color--#{$name});\n\n &:focus-within {\n box-shadow: 0 0 0 px2rem(4px) var(--md-admonition-shadow-color--#{$name});\n }\n\n // Define base class\n > .admonition-title {\n background-color: var(--md-admonition-bg-color--#{$name});\n border-color: var(--md-admonition-icon-color--#{$name});\n\n // Icon\n &::before {\n background-color: var(--md-admonition-icon-color--#{$name});\n }\n &::after {\n color: var(--md-admonition-icon-color--#{$name});\n }\n }\n }\n\n // Define synonyms for base class\n @if length($names) > 1 {\n @for $n from 2 through length($names) {\n .#{nth($names, $n)} {\n @extend .#{$name};\n }\n }\n }\n }\n}\n\n@each $names, $prop in $new-admonitions {\n $name: nth($names, 1);\n\n // Define base class\n .md-typeset .admonition.#{$name} {\n border-color: var(--md-admonition-icon-color--#{$name});\n\n &:focus-within {\n box-shadow: 0 0 0 px2rem(4px) var(--md-admonition-shadow-color--#{$name});\n }\n\n > .admonition-title {\n background-color: var(--md-admonition-bg-color--#{$name});\n border-color: var(--md-admonition-icon-color--#{$name});\n\n // Icon\n &::before {\n width: px2rem(20px);\n height: px2rem(20px);\n background-color: var(--md-admonition-icon-color--#{$name});\n background-size: px2rem(20px);\n mask-image: var(--md-admonition-icon--#{$name});\n content: \"\\a0\";\n }\n &::after {\n color: var(--md-admonition-icon-color--#{$name});\n }\n }\n }\n\n // Define synonyms for base class\n @if length($names) > 1 {\n @for $n from 2 through length($names) {\n .#{nth($names, $n)} {\n @extend .#{$name};\n }\n }\n }\n}\n","mjx-container[display=true] {\n font-size: 120% !important;\n}\n\nmjx-container:not([display]) {\n font-size: 100% !important;\n}\n\n[data-md-color-scheme=\"slate\"],\n[data-md-color-scheme=\"dracula\"] {\n /* stylelint-disable selector-class-pattern */\n .CtxtMenu_InfoSignature input,\n .CtxtMenu_InfoContent pre {\n color: rgb(0, 0, 0);\n }\n .CtxtMenu_Info,\n .CtxtMenu_Menu {\n box-shadow: 0px 10px 20px rgb(0 0 0 / 0.5);\n }\n /* stylelint-enable selector-class-pattern */\n}\n\n.md-typeset .arithmatex {\n overflow-x: auto !important;\n overflow-y: hidden !important;\n}\n\n// Fix tag overlap in `KaTeX`\n.katex-display {\n .katex-html {\n display: flex !important;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: baseline;\n justify-content: space-between;\n // overflow-x: auto;\n\n .base {\n display: inline !important;\n }\n\n .tag {\n position: relative !important;\n display: inline !important;\n margin-left: var(--margin-small);\n }\n }\n}\n","/* Don't use box shadows */\n.md-typeset {\n del,\n ins,\n mark {\n &.critic {\n padding: 0 px2em(4px, 16px);\n color: unset;\n box-shadow: none;\n }\n }\n\n .critic.break {\n margin: 0;\n }\n}\n","/* Inherit admonition style */\n.md-typeset {\n details {\n @extend .admonition;\n\n overflow: hidden;\n\n // Title\n > summary {\n @extend .admonition-title;\n\n // Disable accessibility focus\n &:focus {\n outline-style: none;\n }\n }\n }\n}\n",".highlight {\n .kc { // Keyword constant\n color: var(--md-code-hl-constant-color);\n }\n\n .nc, // Name, class\n .ne, // Name, exception\n {\n color: var(--md-code-hl-class-color);\n }\n\n .mb {\n color: var(--md-code-hl-number-color);\n }\n\n .nb, // Name, builtin\n .bp { // Name, builtin pseudo\n color: var(--md-code-hl-builtin-color);\n }\n\n .nn { // Name, namespace Name, namespace Name, namespace Name, namespace\n color: var(--md-code-hl-namespace-color);\n }\n\n .na, // Name, attribute\n .nd, // Name, decorator\n .ni { // Name, entity\n color: var(--md-code-hl-entity-color);\n }\n .nl, // Name, label\n .nt { // Name, tag\n color: var(--md-code-hl-tag-color);\n }\n}\n\n.md-typeset {\n\n /* Allow code to look like code everywhere despite Material's current preference */\n *:not(pre) > code {\n margin: 0;\n padding: 0 px2em( 4px, 13.6px);\n color: var(--md-code-fg-color);\n background-color: var(--md-code-inline-bg-color);\n border-radius: px2rem(2px);\n box-shadow: none;\n }\n\n /* Code that is also a link */\n a {\n > code {\n color: inherit !important;\n background-color: var(--md-code-link-bg-color) !important;\n transition: color 125ms;\n transition: background-color 125ms;\n\n /* If we are linking highlighted, inline code, force it to just look like a code link */\n * {\n color: var(--md-typeset-a-color) !important;\n }\n\n &:hover {\n background-color: var(--md-code-link-accent-bg-color) !important;\n\n * {\n color: var(--md-accent-fg-color) !important;\n }\n }\n }\n }\n\n pre > code {\n outline: none;\n }\n\n /* Don't always like code breaking in table cells */\n td code {\n word-break: normal;\n }\n\n .highlight {\n\n /* Needed for tab preserving mode */\n tab-size: 8;\n\n + .result {\n border-width: px2rem(2px);\n }\n\n /* `pymdownx-inline` mode */\n [data-linenos] {\n\n /* Special line mode coloring */\n &.special::before {\n background-color: var(--md-code-special-bg-color);\n }\n }\n }\n\n /* Special line number coloring for tables */\n .highlighttable {\n .linenodiv {\n .special {\n margin-right: px2em(-8px, 13.6px);\n margin-left: px2em(-16px, 13.6px);\n padding-right: px2em(8px, 13.6px);\n padding-left: px2em(16px, 13.6px);\n background-color: var(--md-code-special-bg-color);\n }\n }\n }\n\n // Filename span\n .highlight span.filename {\n\n // Adjust margins and and general container look of code block\n + pre {\n margin-top: 0;\n\n code {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n }\n\n // Style the filename banner\n position: relative;\n display: block;\n margin-top: 1em;\n padding: px2em(8px) px2em(16px, 13.6px) px2em(8px) px2em(40px, 13.6px);\n font-weight: 700;\n font-size: px2rem(13.6px);\n background-color: var(--md-code-title-bg-color);\n border-top-left-radius: px2rem(2px);\n border-top-right-radius: px2rem(2px);\n\n // Add code icon\n &::before {\n position: absolute;\n left: px2em(12px, 13.6px);\n width: px2em(20px, 13.6px);\n height: px2em(20px, 13.6px);\n background-color: var(--md-default-fg-color);\n mask-image: svg-load(\"@mdi/svg/svg/console.svg\");\n mask-repeat: no-repeat;\n mask-size: contain;\n content: \"\";\n }\n }\n\n .collapse-code {\n position: relative;\n margin-top: 1em;\n margin-bottom: 1em;\n\n pre {\n margin-top: 0;\n margin-bottom: 0;\n }\n\n input{\n display: none;\n\n ~ .code-footer {\n width: 100%;\n margin: 0;\n padding: px2em(4px) px2em(8px) px2em(4px) px2em(0px);\n\n label {\n position: relative;\n margin: 0.05em;\n padding: 0.15em 0.8em;\n color: var(--md-primary-bg-color);\n font-size: 90%;\n background-color: var(--md-primary-fg-color);\n mask-repeat: no-repeat;\n mask-size: contain;\n border-radius: px2rem(2px);\n cursor: pointer;\n content: \"\";\n\n &:hover {\n background-color: var(--md-accent-fg-color);\n }\n\n &::before {\n position: absolute;\n top: 0.15em;\n left: 0.15em;\n display: block;\n box-sizing: border-box;\n width: 1.25em;\n height: 1.25em;\n background-color: var(--md-primary-bg-color);\n background-size: 1.25em;\n content: \"\";\n }\n\n &.expand {\n display: none;\n\n &::before {\n mask-image: svg-load(\"@mdi/svg/svg/arrow-expand.svg\");\n }\n }\n &.collapse::before {\n mask-image: svg-load(\"@mdi/svg/svg/arrow-collapse.svg\");\n }\n }\n }\n\n &:checked {\n ~ .code-footer label.expand {\n display: inline;\n }\n\n ~ .code-footer label.collapse {\n display: none;\n }\n\n + div.highlight code {\n max-height: px2em(150px);\n overflow: hidden;\n }\n\n ~ .code-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding: px2em(32px) px2em(8px) px2em(8px) px2rem(16px);\n background-image: linear-gradient(to bottom,\n transparent,\n var(--md-default-bg-color) 80%\n 100%);\n }\n }\n }\n }\n\n @include break-to-device(mobile) {\n\n > {\n diagram-div {\n margin-right: px2rem(-16px);\n margin-left: px2rem(-16px);\n }\n .collapse-code {\n margin-right: px2rem(-16px);\n margin-left: px2rem(-16px);\n\n label.collapse {\n left: px2rem(16px);\n }\n }\n }\n }\n}\n",".md-typeset {\n\n // Keyboard key\n .keys {\n\n // Define keyboard keys with left icon\n @each $name, $code in (\n // Extra Keys\n \"power\": \"\\23FB\",\n \"fingerprint\": \"\\261D\",\n ) {\n .key-#{$name}::before {\n padding-right: px2em(6.4px);\n content: $code;\n }\n }\n\n // Define keyboard keys with right icon\n @each $name, $code in (\n // Extra Keys\n ) {\n .key-#{$name}::after {\n padding-left: px2em(6.4px);\n content: $code;\n }\n }\n }\n}\n","// General styling for repository link icons\n:root > * {\n --magiclink-email-icon: svg-load(\"@mdi/svg/svg/mail.svg\");\n --magiclink-github-icon: svg-load(\"@mdi/svg/svg/github.svg\");\n --magiclink-bitbucket-icon: svg-load(\"@mdi/svg/svg/bitbucket.svg\");\n --magiclink-gitlab-icon: svg-load(\"@mdi/svg/svg/gitlab.svg\");\n --magiclink-commit-icon: svg-load(\"@primer/octicons/build/svg/git-commit-24.svg\");\n --magiclink-compare-icon: svg-load(\"@primer/octicons/build/svg/file-diff-24.svg\");\n --magiclink-pull-icon: svg-load(\"@primer/octicons/build/svg/git-pull-request-24.svg\");\n --magiclink-issue-icon: svg-load(\"@primer/octicons/build/svg/issue-opened-24.svg\");\n --magiclink-discussion-icon: svg-load(\"@primer/octicons/build/svg/comment-discussion-24.svg\");\n}\n\n.md-typeset {\n a[href^=\"mailto:\"]:not(.magiclink-ignore)::before {\n mask-image: var(--magiclink-email-icon);\n }\n\n .magiclink-repository,\n .magiclink-compare,\n .magiclink-commit,\n .magiclink-pull,\n .magiclink-issue,\n .magiclink-discussion,\n a[href^=\"mailto:\"] {\n &:not(.magiclink-ignore) {\n position: relative;\n padding-left: px2em(22px);\n\n &::before {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n box-sizing: border-box;\n width: px2em(20px);\n height: px2em(20px);\n background-color: var(--md-typeset-a-color);\n background-size: px2em(20px);\n transition: background-color 125ms;\n mask-repeat: no-repeat;\n mask-size: contain;\n content: \"\";\n }\n\n &:hover::before {\n background-color: var(--md-accent-fg-color);\n }\n }\n }\n}\n\n// Assign icons to repository links\n@each $name, $icon in (\n \"commit\": \"commit\",\n \"compare\": \"compare\",\n \"pull\": \"pull\",\n \"issue\": \"issue\",\n \"discussion\": \"discussion\"\n) {\n .md-typeset {\n .magiclink-#{$name}:not(.magiclink-ignore) {\n &::before {\n mask-image: var(--magiclink-#{$icon}-icon);\n }\n }\n }\n}\n\n// Assign icons to repository links\n@each $name, $icon in (\n \"github\": \"github\",\n \"gitlab\": \"gitlab\",\n \"bitbucket\": \"bitbucket\"\n) {\n .md-typeset {\n .magiclink-repository.magiclink-#{$name}:not(.magiclink-ignore) {\n &::before {\n mask-image: var(--magiclink-#{$icon}-icon);\n }\n }\n }\n}\n","/* Shadow boxes sometimes give issues, so just pad. */\n.md-typeset mark:not(.critic) {\n box-shadow: none;\n}\n",".md-typeset {\n\n /* Progress Bars */\n .progress-label {\n position: absolute;\n width: 100%;\n margin: 0;\n color: var(--md-text-color);\n font-weight: 700;\n line-height: px2rem(28px);\n white-space: nowrap;\n text-align: center;\n text-shadow:\n px2em(-1px) px2em(-1px) px2em(6px) var(--md-default-bg-color--light),\n px2em(1px) px2em(-1px) px2em(6px) var(--md-default-bg-color--light),\n px2em(-1px) px2em(1px) px2em(6px) var(--md-default-bg-color--light),\n px2em(1px) px2em(1px) px2em(6px) var(--md-default-bg-color--light);\n }\n\n .progress-bar {\n float: left;\n height: px2rem(24px);\n background-color: $clr-blue-a400;\n }\n\n /* Stripe animation */\n .candystripe-animate {\n .progress-bar{\n animation: animate-stripes 3s linear infinite;\n }\n }\n\n .progress {\n position: relative;\n display: block;\n width: 100%;\n height: px2rem(24px);\n margin: px2rem(10px) 0;\n background-color: var(--md-default-fg-color--lightest);\n\n &.thin {\n height: px2rem(8px);\n margin-top: px2rem(18px);\n\n .progress-label {\n margin-top: px2rem(-8px);\n }\n\n .progress-bar {\n height: px2rem(8px);\n }\n }\n\n &.candystripe .progress-bar {\n background-image:\n linear-gradient(\n 135deg,\n var(--md-progress-stripe) 27%,\n transparent 27%,\n transparent 52%,\n var(--md-progress-stripe) 52%,\n var(--md-progress-stripe) 77%,\n transparent 77%,\n transparent\n );\n background-size: px2rem(40px) px2rem(40px);\n }\n }\n\n @each $percent, $color in (\n \"100\": var(--md-progress-100),\n \"80\": var(--md-progress-80),\n \"60\": var(--md-progress-60),\n \"40\": var(--md-progress-40),\n \"20\": var(--md-progress-20),\n \"0\": var(--md-progress-0)\n ) {\n .progress-#{$percent}plus {\n .progress-bar {\n background-color: $color;\n }\n }\n }\n\n @keyframes animate-stripes {\n 0% {\n background-position: 0 0;\n }\n\n 100% {\n background-position: px2rem(120px) 0;\n }\n }\n}\n","/* Dark mode changes */\n[data-md-color-scheme=\"dracula\"] {\n .md-typeset {\n .tabbed-set > .tabbed-labels {\n box-shadow: 0 px2rem(-1px) var(--md-default-fg-color--lighter) inset;\n }\n }\n}\n\n/* Style code blocks to fill full tab,\n but otherwise, pad content. */\n.md-typeset {\n .tabbed-alternate {\n &.tabbed-set .tabbed-control {\n width: px2rem(40px);\n\n &[hidden] {\n width: px2rem(24px);\n opacity: 0;\n }\n }\n\n &.tabbed-set > .tabbed-content > .tabbed-block {\n padding: 0 px2rem(12px);\n\n > {\n pre,\n .codehilite,\n .codehilitetable,\n .highlight,\n .highlighttable {\n\n &:only-child {\n\n span.filename {\n margin-top: 0;\n }\n\n margin-right: px2rem(-24px);\n margin-left: px2rem(-24px);\n padding-right: px2rem(12px);\n padding-left: px2rem(12px);\n }\n }\n\n .collapse-code:only-child {\n margin-top: 0;\n\n margin-right: px2rem(-24px);\n margin-left: px2rem(-24px);\n padding-right: px2rem(12px);\n padding-left: px2rem(12px);\n\n > .code-footer {\n left: px2rem(12px)\n }\n }\n\n diagram-div:only-child {\n margin-right: px2rem(-24px);\n margin-left: px2rem(-24px);\n padding-right: px2rem(12px);\n padding-left: px2rem(12px);\n }\n }\n }\n }\n}\n\n.js .md-typeset .tabbed-labels::before {\n background-color: var(--md-accent-fg-color);\n}\n\n/* Ignore mobile overflow styling that extends the tab bar */\n@include break-to-device(mobile) {\n [dir=ltr] .md-content__inner > .tabbed-set .tabbed-labels {\n padding-left: 0;\n }\n\n .md-content__inner > .tabbed-set .tabbed-labels {\n max-width: 100%;\n margin: 0;\n padding-inline-start: 0;\n scroll-padding-inline-start: 0;\n\n &::after {\n padding-inline-end: 0;\n content: none;\n }\n\n // Tabbed control previous\n ~ .tabbed-control--prev {\n margin-inline-start: 0;\n padding-inline-start: 0;\n }\n\n // Tabbed control next\n ~ .tabbed-control--next {\n margin-inline-end: 0;\n padding-inline-end: 0;\n }\n }\n}\n","/* Dark mode changes */\n[data-md-color-scheme=\"dracula\"] {\n .md-typeset table:not([class]) {\n box-shadow: var(--md-shadow-z2);\n\n tr:hover {\n background-color: rgba(0,0,0,.08);\n }\n\n th {\n color: var(--md-text-color);\n background-color: var(--md-default-bg-color--ultra-dark);\n border-bottom: px2rem(1px) solid var(--md-primary-fg-color);\n }\n\n td {\n border-top: px2rem(1px) solid var(--md-default-fg-color--lighter);\n }\n }\n}\n","/* Dark mode changes */\n[data-md-color-scheme=\"dracula\"] {\n .md-typeset .task-list-control {\n .task-list-indicator::before {\n \tbackground-color: var(--md-default-fg-color--lighter);\n }\n\n [type=checkbox]:checked + .task-list-indicator::before {\n \tbackground-color: $drac-green;\n }\n }\n}\n","// Header anchors\n.md-typeset {\n .headerlink {\n width: px2em(16px);\n height: px2em(16px);\n vertical-align: middle;\n background-color: var(--md-default-fg-color--lighter);\n background-size: px2em(16px);\n mask-size: px2em(16px);\n mask-repeat: no-repeat;\n visibility: visible;\n mask-image: svg-load(\"@mdi/svg/svg/link.svg\");\n }\n\n .headerlink:hover,\n [id]:target .headerlink {\n background-color: var(--md-accent-fg-color);\n }\n}\n","/* Special handling of Mermaid content. */\ndiagram-div {\n overflow: auto;\n}\n","html {\n background-color: transparent;\n}\n\n[data-md-component=\"announce\"] .twemoji {\n color: var(--md-primary-fg-color);\n}\n\n/* Dark mode changes */\n[data-md-color-scheme=\"dracula\"] {\n\n --md-text-color: var(--md-default-fg-color);\n background-color: var(--md-default-bg-color);\n\n // Footer color shades\n --md-footer-bg-color: transparent;\n --md-footer-bg-color--dark: var(--md-default-bg-color--darkest);\n\n // Header colors\n --md-header-fg-color: var(--md-text-color);\n --md-header-bg-color: var(--md-default-bg-color--darkest);\n\n // Header\n .md-header {\n color: var(--md-text-color);\n background-color: var(--md-header-bg-color);\n border-bottom: px2rem(1px) solid var(--md-primary-fg-color);\n\n &[data-md-state=shadow] {\n box-shadow: 0 0 px2rem(4px) rgba(0,0,0,.15),\n 0 0 px2rem(4px) px2rem(8px) rgba(0,0,0,.2);\n }\n }\n\n .md-top {\n background-color: var(--md-default-bg-color--dark);\n\n &:hover {\n background-color: var(--md-primary-fg-color);\n }\n }\n\n // Tabs\n .md-tabs {\n color: var(--md-text-color);\n background-color: var(--md-primary-fg-color--transparent);\n\n &__link--active {\n color: var(--md-primary-fg-color);\n }\n\n &__link:hover {\n color: var(--md-accent-fg-color);\n }\n }\n\n // Hero\n .md-hero {\n color: var(--md-text-color);\n background-color: var(--md-primary-fg-color--transparent);\n }\n\n // Navigation\n .md-nav__source {\n color: var(--md-text-color);\n }\n\n .md-nav__link[data-md-state=blur] {\n color: var(--md-default-fg-color--light);\n }\n\n .md-nav__item .md-nav__link--active {\n color: var(--md-primary-fg-color);\n }\n\n .md-nav__link {\n &:focus,\n &:hover {\n color: var(--md-accent-fg-color);\n }\n }\n\n @include break-to-device(tablet) {\n\n .md-nav--primary .md-nav__item--active > .md-nav__link:not(:hover) {\n color: var(--md-primary-fg-color);\n }\n\n // Site title in main navigation\n .md-nav--primary .md-nav__title {\n color: var(--md-text-color);\n background-color: var(--md-header-bg-color);\n border-bottom: px2rem(1px) solid var(--md-primary-fg-color);\n }\n }\n\n @include break-to-device(tablet portrait) {\n\n // Repository containing source\n .md-nav__source {\n color: var(--md-text-color);\n background-color: var(--md-primary-fg-color--transparent);\n }\n\n .md-nav .md-nav__title {\n color: var(--md-text-color);\n background-color: var(--md-header-bg-color);\n border-bottom: px2rem(1px) solid var(--md-primary-fg-color);\n }\n }\n\n // Search\n .md-search__input {\n color: var(--md-text-color);\n background-color: var(--md-accent-bg-color--light);\n\n &:hover {\n background-color: var(--md-default-bg-color--light);\n }\n\n ~ .md-search__icon {\n color: var(--md-text-color);\n }\n &::placeholder {\n color: var(--md-default-fg-color--light);\n }\n }\n\n [data-md-toggle=search]:checked~.md-header .md-search__input {\n background-color: transparent;\n }\n\n .md-search__suggest {\n color: var(--md-default-autocomplete-fg-color);\n }\n\n .md-search__overlay, .md-overlay {\n background-color: var(--md-default-bg-color--light);\n }\n\n // Footer\n .md-footer {\n &-nav__direction {\n color: var(--md-primary-fg-color);\n }\n\n &-meta {\n border-top: px2rem(1px) solid var(--md-primary-fg-color);\n }\n }\n\n // Announcements\n [data-md-component=\"announce\"] {\n background-color: var(--md-default-bg-color--ultra-dark);\n }\n}\n\n/* Don't force capitalization of `H5` elements. */\n.md-typeset {\n h5 {\n color: var(--md-text-color);\n text-transform: none;\n }\n}\n\n.md-typeset__scrollwrap,\n.md-sidebar__scrollwrap,\n.md-search__scrollwrap,\n.md-typeset pre > code,\n.md-typeset div.mermaid,\n.md-typeset div.diagram,\n.md-typeset mermaid-div,\n.md-typeset diagram-div,\n.md-typeset pre.arithmatex,\n.md-typeset div.arithmatex {\n // Override native scrollbar styles\n &::-webkit-scrollbar {\n width: px2rem(4px);\n height: px2rem(4px);\n }\n\n &::-webkit-scrollbar-corner {\n background-color: transparent;\n }\n\n // Scrollbar thumb\n &::-webkit-scrollbar-thumb {\n background-color: var(--md-default-fg-color--lighter);\n\n // Hovered scrollbar thumb\n &:hover {\n background-color: var(--md-accent-fg-color);\n }\n }\n\n // Firefox scrollbar and thumb\n scrollbar-color: var(--md-default-fg-color--lighter) transparent;\n scrollbar-width: thin;\n\n // Firefox hovered scrollbar and thumb\n &:hover {\n scrollbar-color: var(--md-accent-fg-color) transparent;\n }\n}\n","////\n/// Copyright (c) 2016-2020 Martin Donath \n///\n/// Permission is hereby granted, free of charge, to any person obtaining a\n/// copy of this software and associated documentation files (the \"Software\"),\n/// to deal in the Software without restriction, including without limitation\n/// the rights to use, copy, modify, merge, publish, distribute, sublicense,\n/// and/or sell copies of the Software, and to permit persons to whom the\n/// Software is furnished to do so, subject to the following conditions:\n///\n/// The above copyright notice and this permission notice shall be included in\n/// all copies or substantial portions of the Software.\n///\n/// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n/// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL\n/// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n/// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n/// DEALINGS\n////\n\n// ----------------------------------------------------------------------------\n// Variables\n// ----------------------------------------------------------------------------\n\n///\n/// Device-specific breakpoints\n///\n/// @example\n/// $break-devices: (\n/// mobile: (\n/// portrait: 220px 479px,\n/// landscape: 480px 719px\n/// ),\n/// tablet: (\n/// portrait: 720px 959px,\n/// landscape: 960px 1219px\n/// ),\n/// screen: (\n/// small: 1220px 1599px,\n/// medium: 1600px 1999px,\n/// large: 2000px\n/// )\n/// );\n///\n$break-devices: () !default;\n\n// ----------------------------------------------------------------------------\n// Helpers\n// ----------------------------------------------------------------------------\n\n///\n/// Choose minimum and maximum device widths\n///\n@function break-select-min-max($devices) {\n $min: 1000000;\n $max: 0;\n @each $key, $value in $devices {\n @while type-of($value) == map {\n $value: break-select-min-max($value);\n }\n @if type-of($value) == list {\n @each $number in $value {\n @if type-of($number) == number {\n $min: min($number, $min);\n @if $max != null {\n $max: max($number, $max);\n }\n } @else {\n @error \"Invalid number: #{$number}\";\n }\n }\n } @else if type-of($value) == number {\n $min: min($value, $min);\n $max: null;\n } @else {\n @error \"Invalid value: #{$value}\";\n }\n }\n @return $min, $max;\n}\n\n///\n/// Select minimum and maximum widths for a device breakpoint\n///\n@function break-select-device($device) {\n $current: $break-devices;\n @for $n from 1 through length($device) {\n @if type-of($current) == map {\n $current: map-get($current, nth($device, $n));\n } @else {\n @error \"Invalid device map: #{$devices}\";\n }\n }\n @if type-of($current) == list or type-of($current) == number {\n $current: (default: $current);\n }\n @return break-select-min-max($current);\n}\n\n// ----------------------------------------------------------------------------\n// Mixins\n// ----------------------------------------------------------------------------\n\n///\n/// A minimum-maximum media query breakpoint\n///\n@mixin break-at($breakpoint) {\n @if type-of($breakpoint) == number {\n @media screen and (min-width: $breakpoint) {\n @content;\n }\n } @else if type-of($breakpoint) == list {\n $min: nth($breakpoint, 1);\n $max: nth($breakpoint, 2);\n @if type-of($min) == number and type-of($max) == number {\n @media screen and (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else {\n @error \"Invalid breakpoint: #{$breakpoint}\";\n }\n } @else {\n @error \"Invalid breakpoint: #{$breakpoint}\";\n }\n}\n\n///\n/// An orientation media query breakpoint\n///\n@mixin break-at-orientation($breakpoint) {\n @if type-of($breakpoint) == string {\n @media screen and (orientation: $breakpoint) {\n @content;\n }\n } @else {\n @error \"Invalid breakpoint: #{$breakpoint}\";\n }\n}\n\n///\n/// A maximum-aspect-ratio media query breakpoint\n///\n@mixin break-at-ratio($breakpoint) {\n @if type-of($breakpoint) == number {\n @media screen and (max-aspect-ratio: $breakpoint) {\n @content;\n }\n } @else {\n @error \"Invalid breakpoint: #{$breakpoint}\";\n }\n}\n\n///\n/// A minimum-maximum media query device breakpoint\n///\n@mixin break-at-device($device) {\n @if type-of($device) == string {\n $device: $device,;\n }\n @if type-of($device) == list {\n $breakpoint: break-select-device($device);\n @if nth($breakpoint, 2) != null {\n $min: nth($breakpoint, 1);\n $max: nth($breakpoint, 2);\n @media screen and (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else {\n @error \"Invalid device: #{$device}\";\n }\n } @else {\n @error \"Invalid device: #{$device}\";\n }\n}\n\n///\n/// A minimum media query device breakpoint\n///\n@mixin break-from-device($device) {\n @if type-of($device) == string {\n $device: $device,;\n }\n @if type-of($device) == list {\n $breakpoint: break-select-device($device);\n $min: nth($breakpoint, 1);\n @media screen and (min-width: $min) {\n @content;\n }\n } @else {\n @error \"Invalid device: #{$device}\";\n }\n}\n\n///\n/// A maximum media query device breakpoint\n///\n@mixin break-to-device($device) {\n @if type-of($device) == string {\n $device: $device,;\n }\n @if type-of($device) == list {\n $breakpoint: break-select-device($device);\n $max: nth($breakpoint, 2);\n @media screen and (max-width: $max) {\n @content;\n }\n } @else {\n @error \"Invalid device: #{$device}\";\n }\n}\n"]} diff --git a/docs/theme/assets/pymdownx-extras/extra-loader-MCFnu0Wd.js b/docs/theme/assets/pymdownx-extras/extra-loader-MCFnu0Wd.js new file mode 100644 index 0000000..2b2b95b --- /dev/null +++ b/docs/theme/assets/pymdownx-extras/extra-loader-MCFnu0Wd.js @@ -0,0 +1,2 @@ +function _typeof(t){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_typeof(t)}!function(){"use strict";function t(){t=function(){return r};var e,r={},n=Object.prototype,o=n.hasOwnProperty,i=Object.defineProperty||function(t,e,r){t[e]=r.value},a="function"==typeof Symbol?Symbol:{},c=a.iterator||"@@iterator",u=a.asyncIterator||"@@asyncIterator",l=a.toStringTag||"@@toStringTag";function f(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{f({},"")}catch(e){f=function(t,e,r){return t[e]=r}}function s(t,e,r,n){var o=e&&e.prototype instanceof g?e:g,a=Object.create(o.prototype),c=new N(n||[]);return i(a,"_invoke",{value:S(t,r,c)}),a}function h(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}r.wrap=s;var d="suspendedStart",p="suspendedYield",y="executing",m="completed",v={};function g(){}function b(){}function w(){}var x={};f(x,c,(function(){return this}));var E=Object.getPrototypeOf,L=E&&E(E(C([])));L&&L!==n&&o.call(L,c)&&(x=L);var O=w.prototype=g.prototype=Object.create(x);function _(t){["next","throw","return"].forEach((function(e){f(t,e,(function(t){return this._invoke(e,t)}))}))}function j(t,e){function r(n,i,a,c){var u=h(t[n],t,i);if("throw"!==u.type){var l=u.arg,f=l.value;return f&&"object"==_typeof(f)&&o.call(f,"__await")?e.resolve(f.__await).then((function(t){r("next",t,a,c)}),(function(t){r("throw",t,a,c)})):e.resolve(f).then((function(t){l.value=t,a(l)}),(function(t){return r("throw",t,a,c)}))}c(u.arg)}var n;i(this,"_invoke",{value:function(t,o){function i(){return new e((function(e,n){r(t,o,e,n)}))}return n=n?n.then(i,i):i()}})}function S(t,r,n){var o=d;return function(i,a){if(o===y)throw new Error("Generator is already running");if(o===m){if("throw"===i)throw a;return{value:e,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=P(c,n);if(u){if(u===v)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===d)throw o=m,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=y;var l=h(t,r,n);if("normal"===l.type){if(o=n.done?m:p,l.arg===v)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(o=m,n.method="throw",n.arg=l.arg)}}}function P(t,r){var n=r.method,o=t.iterator[n];if(o===e)return r.delegate=null,"throw"===n&&t.iterator.return&&(r.method="return",r.arg=e,P(t,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),v;var i=h(o,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,v;var a=i.arg;return a?a.done?(r[t.resultName]=a.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,v):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,v)}function k(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function M(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function N(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(k,this),this.reset(!0)}function C(t){if(t||""===t){var r=t[c];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function r(){for(;++n=0;--i){var a=this.tryEntries[i],c=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var u=o.call(a,"catchLoc"),l=o.call(a,"finallyLoc");if(u&&l){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&o.call(n,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),M(r),v}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;M(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:C(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),v}},r}function e(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function n(t,e){for(var r=0;r {\n\n // Custom element to encapsulate Mermaid content.\n class MermaidDiv extends HTMLElement {\n\n /**\n * Creates a special Mermaid div shadow DOM.\n * Works around issues of shared IDs.\n * @return {void}\n */\n constructor() {\n super()\n\n // Create the Shadow DOM and attach style\n const shadow = this.attachShadow({mode: \"open\"})\n const style = document.createElement(\"style\")\n style.textContent = `\n :host {\n display: block;\n line-height: initial;\n font-size: 16px;\n }\n div.diagram {\n margin: 0;\n overflow: visible;\n }`\n shadow.appendChild(style)\n }\n }\n\n if (typeof customElements.get(\"diagram-div\") === \"undefined\") {\n customElements.define(\"diagram-div\", MermaidDiv)\n }\n\n const getFromCode = parent => {\n // Handles
 text extraction.\n    let text = \"\"\n    for (let j = 0; j < parent.childNodes.length; j++) {\n      const subEl = parent.childNodes[j]\n      if (subEl.tagName.toLowerCase() === \"code\") {\n        for (let k = 0; k < subEl.childNodes.length; k++) {\n          const child = subEl.childNodes[k]\n          const whitespace = /^\\s*$/\n          if (child.nodeName === \"#text\" && !(whitespace.test(child.nodeValue))) {\n            text = child.nodeValue\n            break\n          }\n        }\n      }\n    }\n    return text\n  }\n\n  // We use this to determine if we want the dark or light theme.\n  // This is specific for our MkDocs Material environment.\n  // You should load your configs based on your own environment's needs.\n  const defaultConfig = {\n    startOnLoad: false,\n    theme: \"default\",\n    flowchart: {\n      htmlLabels: false\n    },\n    er: {\n      useMaxWidth: false\n    },\n    sequence: {\n      useMaxWidth: false,\n      noteFontWeight: \"14px\",\n      actorFontSize: \"14px\",\n      messageFontSize: \"16px\"\n    }\n  }\n  mermaid.mermaidAPI.globalReset()\n  // Non Material themes should just use \"default\"\n  let scheme = null\n  try {\n    scheme = document.querySelector(\"[data-md-color-scheme]\").getAttribute(\"data-md-color-scheme\")\n  } catch (err) {\n    scheme = \"default\"\n  }\n  const config = (typeof mermaidConfig === \"undefined\") ?\n    defaultConfig :\n    mermaidConfig[scheme] || (mermaidConfig.default || defaultConfig)\n  mermaid.initialize(config)\n\n  // Find all of our Mermaid sources and render them.\n  const blocks = document.querySelectorAll(`pre.${className}, diagram-div`)\n  const surrogate = document.querySelector(\"html body\")\n  for (let i = 0; i < blocks.length; i++) {\n    const block = blocks[i]\n    const parentEl = (block.tagName.toLowerCase() === \"diagram-div\") ?\n      block.shadowRoot.querySelector(`pre.${className}`) :\n      block\n\n    // Create a temporary element with the typeset and size we desire.\n    // Insert it at the end of our parent to render the SVG.\n    const temp = document.createElement(\"div\")\n    temp.style.visibility = \"hidden\"\n    temp.style.display = \"display\"\n    temp.style.padding = \"0\"\n    temp.style.margin = \"0\"\n    temp.style.lineHeight = \"initial\"\n    temp.style.fontSize = \"16px\"\n    surrogate.appendChild(temp)\n\n    try {\n      const res = await mermaid.render(`_diagram_${i}`, getFromCode(parentEl), temp)\n      const content = res.svg\n      const fn = res.bindFunctions\n      const el = document.createElement(\"div\")\n      el.className = className\n      el.innerHTML = content\n      if (fn) {\n        fn(el)\n      }\n\n      // Insert the render where we want it and remove the original text source.\n      // Mermaid will clean up the temporary element.\n      const shadow = document.createElement(\"diagram-div\")\n      shadow.shadowRoot.appendChild(el)\n      block.parentNode.insertBefore(shadow, block)\n      parentEl.style.display = \"none\"\n      shadow.shadowRoot.appendChild(parentEl)\n      if (parentEl !== block) {\n        block.parentNode.removeChild(block)\n      }\n    } catch (err) {} // eslint-disable-line no-empty\n\n    if (surrogate.contains(temp)) {\n      surrogate.removeChild(temp)\n    }\n  }\n}\n","import uml from \"./uml\"\nimport arithmatex from \"./arithmatex\"\n\n// Main function\n(() => {\n  let umlPromise = Promise.resolve()\n  let mathPromise = Promise.resolve()\n\n  const observer = new MutationObserver(mutations => {\n    mutations.forEach(mutation => {\n      if (mutation.type === \"attributes\") {\n        let scheme = mutation.target.getAttribute(\"data-md-color-scheme\")\n        if (!scheme) {\n          scheme = \"default\"\n        }\n        localStorage.setItem(\"data-md-color-scheme\", scheme)\n        if (typeof mermaid !== \"undefined\") {\n          uml(\"diagram\")\n        }\n      }\n    })\n  })\n\n  const main = () => {\n    observer.observe(document.querySelector(\"body\"), {attributeFilter: [\"data-md-color-scheme\"]})\n\n    if (typeof mermaid !== \"undefined\") {\n      umlPromise = umlPromise.then(() => {\n        uml(\"diagram\")\n      }).catch(err => {\n        console.log(`UML loading failed...${err}`) // eslint-disable-line no-console\n      })\n    }\n\n    if (typeof katex !== \"undefined\") {\n      mathPromise = mathPromise.then(() => {\n        arithmatex(\"arithmatex\", \"katex\")\n      }).catch(err => {\n        console.log(`Math loading failed...${err}`) // eslint-disable-line no-console\n      })\n    } else if (typeof MathJax !== \"undefined\" && 'typesetPromise' in MathJax) {\n      mathPromise = mathPromise.then(() => {\n        arithmatex(\"arithmatex\", \"mathjax\")\n      }).catch(err => {\n        console.log(`Math loading failed...${err}`) // eslint-disable-line no-console\n      })\n    }\n  }\n\n  if (window.document$) {\n    // Material specific hook\n    window.document$.subscribe(main)\n  } else {\n    // Normal non-Material specific hook\n    document.addEventListener(\"DOMContentLoaded\", main)\n  }\n})()\n","export default (className, mode) => {\n  if (mode === 'katex') {\n    const maths = document.querySelectorAll(`.${className}`)\n\n    for (let i = 0; i < maths.length; i++) {\n      const tex = maths[i].textContent || maths[i].innerText\n\n      if (tex.startsWith('\\\\(') && tex.endsWith('\\\\)')) {\n        katex.render(tex.slice(2, -2), maths[i], {'displayMode': false})\n      } else if (tex.startsWith('\\\\[') && tex.endsWith('\\\\]')) {\n        katex.render(tex.slice(2, -2), maths[i], {'displayMode': true})\n      }\n    }\n  } else if (mode === 'mathjax') {\n    MathJax.startup.output.clearCache()\n    MathJax.typesetClear()\n    MathJax.texReset()\n    MathJax.typesetPromise()\n  }\n}\n"],"names":["umlPromise","mathPromise","observer","main","uml","_ref","_regeneratorRuntime","mark","_callee","className","MermaidDiv","getFromCode","defaultConfig","scheme","config","blocks","surrogate","i","block","parentEl","temp","res","content","fn","el","shadow","wrap","_context","prev","next","_HTMLElement","_inherits","_super","_this","_classCallCheck","call","this","attachShadow","mode","style","document","createElement","textContent","appendChild","_wrapNativeSuper","HTMLElement","customElements","get","define","parent","text","j","childNodes","length","subEl","tagName","toLowerCase","k","child","nodeName","test","nodeValue","startOnLoad","theme","flowchart","htmlLabels","er","useMaxWidth","sequence","noteFontWeight","actorFontSize","messageFontSize","mermaid","mermaidAPI","globalReset","querySelector","getAttribute","err","mermaidConfig","initialize","querySelectorAll","concat","shadowRoot","visibility","display","padding","margin","lineHeight","fontSize","render","sent","svg","bindFunctions","innerHTML","parentNode","insertBefore","removeChild","t0","contains","stop","_x","apply","arguments","arithmatex","maths","tex","innerText","startsWith","endsWith","katex","slice","displayMode","MathJax","startup","output","clearCache","typesetClear","texReset","typesetPromise","Promise","resolve","MutationObserver","mutations","forEach","mutation","type","target","localStorage","setItem","observe","attributeFilter","then","console","log","window","document$","subscribe","addEventListener"],"mappings":"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"}
diff --git a/docs/theme/assets/pymdownx-extras/material-extra-3rdparty-E-i8w1WA.js b/docs/theme/assets/pymdownx-extras/material-extra-3rdparty-E-i8w1WA.js
new file mode 100644
index 0000000..977bf5e
--- /dev/null
+++ b/docs/theme/assets/pymdownx-extras/material-extra-3rdparty-E-i8w1WA.js
@@ -0,0 +1,2 @@
+!function(){"use strict";"mathjaxConfig"in window||(window.MathJax={tex:{inlineMath:[["\\(","\\)"]],displayMath:[["\\[","\\]"]],processEscapes:!0,processEnvironments:!0,tagSide:"right",tagIndent:".8em",multlineWidth:"85%",tags:"ams"},options:{ignoreHtmlClass:".*",processHtmlClass:"arithmatex"}}),"mermaidConfig"in window||(window.mermaidConfig={dracula:{startOnLoad:!1,theme:"base",themeCSS:"        * {          --drac-page-bg: hsl(233, 15%, 23%);          --drac-white-fg: hsl(60, 30%, 96%);          --drac-purple-fg: hsl(265, 89%, 78%);          --drac-purple-bg: hsl(265, 25%, 39%);          --drac-yellow-fg: hsl(65, 92%, 76%);          --drac-blue-fg: hsl(225, 27%, 51%);        }                /* General */        [id^='_diagram'] {          background-color: var(--drac-page-bg);        }                /* Entity Relationship */        rect.relationshipLabelBox {          opacity: 0.75 !important;          fill: var(--drac-purple-bg) !important;        }        defs marker#ZERO_OR_MORE_END circle {          fill: var(--drac-page-bg) !important;          stroke: var(--drac-purple-fg) !important;        }        defs marker#ZERO_OR_MORE_END path {          stroke: var(--drac-purple-fg) !important;        }        defs marker#ZERO_OR_MORE_START circle{          fill: var(--drac-page-bg) !important;          stroke: var(--drac-purple-fg) !important;        }        defs marker#ZERO_OR_MORE_START path {          stroke: var(--drac-purple-fg) !important;        }        defs marker#ONLY_ONE_START path {          stroke: var(--drac-purple-fg) !important;        }        defs marker#ONLY_ONE_END path {          stroke: var(--drac-purple-fg) !important;        }        defs marker#ZERO_OR_ONE_START path {          stroke: var(--drac-purple-fg) !important;        }        defs marker#ZERO_OR_ONE_END path {          stroke: var(--drac-purple-fg) !important;        }        defs marker#ONE_OR_MORE_START path {          stroke: var(--drac-purple-fg) !important;        }        defs marker#ONE_OR_MORE_END path {          stroke: var(--drac-purple-fg) !important;        }                /* Flowchart */        .labelText,        :not(.branchLabel) > .label text {          fill: var(--drac-purple-fg);        }        .edgeLabel text {          fill: var(--drac-purple-fg) !important;        }        .edgeLabel rect {          opacity: 0.75 !important;          fill: var(--drac-purple-bg) !important;        }                .grey rect.label-container {           fill: var(--drac-purple-bg) !important;          stroke: var(--drac-purple-fg) !important;        }         /* Sequence */        line[id^='actor'] {          stroke: var(--drac-blue-fg);        }        .noteText {          fill: var(--drac-yellow-fg);        }                /* Gantt */        .sectionTitle {          fill: var(--drac-purple-fg) !important;        }                .grid .tick line {          stroke: var(--drac-blue-fg) !important;        }                .grid .tick text {          fill: var(--drac-purple-fg);        }                /* Class Diagram */        .statediagram-state rect.divider {          fill: transparent !important;        }                /* State Diagram */        .stateGroup circle[style$=\"fill: black;\"] {          fill: var(--drac-purple-bg) !important;          stroke: var(--drac-purple-bg) !important;        }                .stateGroup circle[style$=\"fill: white;\"] {          fill: var(--drac-purple-bg) !important;          stroke: var(--drac-purple-fg) !important;        }                .stateGroup .composit {          fill: var(--drac-page-bg);        }        /* Pie */        text.slice {          fill: var(--drac-white-fg) !important;        }        /* Git Graph */        .commit-bullets .commit-reverse,        .commit-bullets .commit-merge,         .commit-bullets .commit-highlight-inner {          fill: var(--drac-page-bg) !important;          stroke: var(--drac-page-bg) !important;        }        ",themeVariables:{darkMode:!0,background:"#323443",mainBkg:"#604b7d",textColor:"#bf95f9",lineColor:"#bf95f9",errorBkgColor:"#802c2c",errorTextColor:"#ff5757",primaryColor:"#604b7d",primaryTextColor:"#bf95f9",primaryBorderColor:"#bf95f9",secondaryColor:"#297d3e",secondaryTextColor:"#52fa7c",secondaryBorderColor:"#52fa7c",tertiaryColor:"#303952",tertiaryTextColor:"#6071a4",tertiaryBorderColor:"#6071a4",noteBkgColor:"#797d45",noteTextColor:"#f1fa89",noteBorderColor:"#f1fa89",edgeLabelBackground:"#604b7d",edgeLabelText:"#604b7d",actorLineColor:"#6071a4",activeTaskBkgColor:"#803d63",activeTaskBorderColor:"#ff7ac6",doneTaskBkgColor:"#297d3e",doneTaskBorderColor:"#52fa7c",critBkgColor:"#802c2c",critBorderColor:"#ff5757",taskTextColor:"#bf95f9",taskTextOutsideColor:"#bf95f9",taskTextLightColor:"#bf95f9",sectionBkgColor:"#bf95f9b3",sectionBkgColor2:"#bf95f966",altSectionBkgColor:"#323443",todayLineColor:"#ff7ac6",gridColor:"#6071a4",defaultLinkColor:"#8be8fd",altBackground:"#bf95f9",classText:"#bf95f9",fillType0:"#406080",fillType1:"#46747f",fillType2:"#297d3e",fillType3:"#805c36",fillType4:"#803d63",fillType5:"#604b7d",fillType6:"#802c2c",fillType7:"#797d45",fillType8:"#7c7c79",git0:"#ff5555",git1:"#ffb86c",git2:"#f1fa8c",git3:"#50fa7b",git4:"#8be9fd",git5:"#809fff",git6:"#ff79c6",git7:"#bd93f9",gitInv0:"#ff5555",gitInv1:"#ffb86c",gitInv2:"#f1fa8c",gitInv3:"#50fa7b",gitInv4:"#8be9fd",gitInv5:"#809fff",gitInv6:"#ff79c6",gitInv7:"#bd93f9",gitBranchLabel0:"#323443",gitBranchLabel1:"#323443",gitBranchLabel2:"#323443",gitBranchLabel3:"#323443",gitBranchLabel4:"#323443",gitBranchLabel5:"#323443",gitBranchLabel6:"#323443",gitBranchLabel7:"#323443",commitLabelColor:"#52fa7c",commitLabelBackground:"#297d3e"},flowchart:{htmlLabels:!1,useMaxWidth:!1},er:{useMaxWidth:!1},sequence:{useMaxWidth:!1,noteFontWeight:"14px",actorFontSize:"14px",messageFontSize:"16px"},journey:{useMaxWidth:!1},pie:{useMaxWidth:!1},gantt:{useMaxWidth:!1},gitGraph:{useMaxWidth:!1}},default:{startOnLoad:!1,theme:"default",flowchart:{htmlLabels:!1,useMaxWidth:!1},er:{useMaxWidth:!1},sequence:{useMaxWidth:!1,noteFontWeight:"14px",actorFontSize:"14px",messageFontSize:"16px"},journey:{useMaxWidth:!1},pie:{useMaxWidth:!1},gantt:{useMaxWidth:!1},gitGraph:{useMaxWidth:!1}},slate:{startOnLoad:!1,theme:"dark",flowchart:{htmlLabels:!1,useMaxWidth:!1},er:{useMaxWidth:!1},sequence:{useMaxWidth:!1,noteFontWeight:"14px",actorFontSize:"14px",messageFontSize:"16px"},journey:{useMaxWidth:!1},pie:{useMaxWidth:!1},gantt:{useMaxWidth:!1},gitGraph:{useMaxWidth:!1}}})}();
+//# sourceMappingURL=material-extra-3rdparty-E-i8w1WA.js.map
diff --git a/docs/theme/assets/pymdownx-extras/material-extra-3rdparty-E-i8w1WA.js.map b/docs/theme/assets/pymdownx-extras/material-extra-3rdparty-E-i8w1WA.js.map
new file mode 100644
index 0000000..e1739c4
--- /dev/null
+++ b/docs/theme/assets/pymdownx-extras/material-extra-3rdparty-E-i8w1WA.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"material-extra-3rdparty-E-i8w1WA.js","sources":["material-extra-3rdparty.js"],"sourcesContent":["// MathJax configuration\n\nif (!('mathjaxConfig' in window)) {\n  window.MathJax = {\n    tex: {\n      inlineMath: [[\"\\\\(\", \"\\\\)\"]],\n      displayMath: [[\"\\\\[\", \"\\\\]\"]],\n      processEscapes: true,\n      processEnvironments: true,\n      tagSide: \"right\",\n      tagIndent: \".8em\",\n      multlineWidth: \"85%\",\n      tags: \"ams\"\n    },\n    options: {\n      ignoreHtmlClass: \".*\",\n      processHtmlClass: \"arithmatex\"\n    }\n  }\n}\n\nif (!('mermaidConfig' in window)) {\n  // Our loader looks for `mermaidConfig` and will load the the appropriate\n  // configuration based on our current scheme: light, dark, etc.\n  window.mermaidConfig = {\n    dracula: {\n      startOnLoad: false,\n      theme: \"base\",\n      themeCSS: \"\\\n        * {\\\n          --drac-page-bg: hsl(233, 15%, 23%);\\\n          --drac-white-fg: hsl(60, 30%, 96%);\\\n          --drac-purple-fg: hsl(265, 89%, 78%);\\\n          --drac-purple-bg: hsl(265, 25%, 39%);\\\n          --drac-yellow-fg: hsl(65, 92%, 76%);\\\n          --drac-blue-fg: hsl(225, 27%, 51%);\\\n        }\\\n        \\\n        /* General */\\\n        [id^='_diagram'] {\\\n          background-color: var(--drac-page-bg);\\\n        }\\\n        \\\n        /* Entity Relationship */\\\n        rect.relationshipLabelBox {\\\n          opacity: 0.75 !important;\\\n          fill: var(--drac-purple-bg) !important;\\\n        }\\\n        defs marker#ZERO_OR_MORE_END circle {\\\n          fill: var(--drac-page-bg) !important;\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ZERO_OR_MORE_END path {\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ZERO_OR_MORE_START circle{\\\n          fill: var(--drac-page-bg) !important;\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ZERO_OR_MORE_START path {\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ONLY_ONE_START path {\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ONLY_ONE_END path {\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ZERO_OR_ONE_START path {\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ZERO_OR_ONE_END path {\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ONE_OR_MORE_START path {\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        defs marker#ONE_OR_MORE_END path {\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        \\\n        /* Flowchart */\\\n        .labelText,\\\n        :not(.branchLabel) > .label text {\\\n          fill: var(--drac-purple-fg);\\\n        }\\\n        .edgeLabel text {\\\n          fill: var(--drac-purple-fg) !important;\\\n        }\\\n        .edgeLabel rect {\\\n          opacity: 0.75 !important;\\\n          fill: var(--drac-purple-bg) !important;\\\n        }\\\n        \\\n        .grey rect.label-container { \\\n          fill: var(--drac-purple-bg) !important;\\\n          stroke: var(--drac-purple-fg) !important;\\\n        } \\\n        /* Sequence */\\\n        line[id^='actor'] {\\\n          stroke: var(--drac-blue-fg);\\\n        }\\\n        .noteText {\\\n          fill: var(--drac-yellow-fg);\\\n        }\\\n        \\\n        /* Gantt */\\\n        .sectionTitle {\\\n          fill: var(--drac-purple-fg) !important;\\\n        }\\\n        \\\n        .grid .tick line {\\\n          stroke: var(--drac-blue-fg) !important;\\\n        }\\\n        \\\n        .grid .tick text {\\\n          fill: var(--drac-purple-fg);\\\n        }\\\n        \\\n        /* Class Diagram */\\\n        .statediagram-state rect.divider {\\\n          fill: transparent !important;\\\n        }\\\n        \\\n        /* State Diagram */\\\n        .stateGroup circle[style$=\\\"fill: black;\\\"] {\\\n          fill: var(--drac-purple-bg) !important;\\\n          stroke: var(--drac-purple-bg) !important;\\\n        }\\\n        \\\n        .stateGroup circle[style$=\\\"fill: white;\\\"] {\\\n          fill: var(--drac-purple-bg) !important;\\\n          stroke: var(--drac-purple-fg) !important;\\\n        }\\\n        \\\n        .stateGroup .composit {\\\n          fill: var(--drac-page-bg);\\\n        }\\\n        /* Pie */\\\n        text.slice {\\\n          fill: var(--drac-white-fg) !important;\\\n        }\\\n        /* Git Graph */\\\n        .commit-bullets .commit-reverse,\\\n        .commit-bullets .commit-merge, \\\n        .commit-bullets .commit-highlight-inner {\\\n          fill: var(--drac-page-bg) !important;\\\n          stroke: var(--drac-page-bg) !important;\\\n        }\\\n        \",\n      themeVariables: {\n        darkMode: true,\n        background: \"#323443\",\n        mainBkg: \"#604b7d\",\n        textColor: \"#bf95f9\",\n        lineColor: \"#bf95f9\",\n        errorBkgColor: \"#802c2c\",\n        errorTextColor: \"#ff5757\",\n        primaryColor: \"#604b7d\",\n        primaryTextColor: \"#bf95f9\",\n        primaryBorderColor: \"#bf95f9\",\n        secondaryColor: \"#297d3e\",\n        secondaryTextColor: \"#52fa7c\",\n        secondaryBorderColor: \"#52fa7c\",\n        tertiaryColor: \"#303952\",\n        tertiaryTextColor: \"#6071a4\",\n        tertiaryBorderColor: \"#6071a4\",\n        noteBkgColor: \"#797d45\",\n        noteTextColor: \"#f1fa89\",\n        noteBorderColor: \"#f1fa89\",\n        edgeLabelBackground: \"#604b7d\",\n        edgeLabelText: \"#604b7d\",\n\n        actorLineColor: \"#6071a4\",\n\n        activeTaskBkgColor: \"#803d63\",\n        activeTaskBorderColor: \"#ff7ac6\",\n        doneTaskBkgColor: \"#297d3e\",\n        doneTaskBorderColor: \"#52fa7c\",\n        critBkgColor: \"#802c2c\",\n        critBorderColor: \"#ff5757\",\n        taskTextColor: \"#bf95f9\",\n        taskTextOutsideColor: \"#bf95f9\",\n        taskTextLightColor: \"#bf95f9\",\n        sectionBkgColor: \"#bf95f9b3\",\n        sectionBkgColor2: \"#bf95f966\",\n        altSectionBkgColor: \"#323443\",\n        todayLineColor: \"#ff7ac6\",\n        gridColor: \"#6071a4\",\n        defaultLinkColor: \"#8be8fd\",\n\n        altBackground: \"#bf95f9\",\n\n        classText: \"#bf95f9\",\n\n        fillType0: \"#406080\",\n        fillType1: \"#46747f\",\n        fillType2: \"#297d3e\",\n        fillType3: \"#805c36\",\n        fillType4: \"#803d63\",\n        fillType5: \"#604b7d\",\n        fillType6: \"#802c2c\",\n        fillType7: \"#797d45\",\n        fillType8: \"#7c7c79\",\n\n        git0: \"#ff5555\",\n        git1: \"#ffb86c\",\n        git2: \"#f1fa8c\",\n        git3: \"#50fa7b\",\n        git4: \"#8be9fd\",\n        git5: \"#809fff\",\n        git6: \"#ff79c6\",\n        git7: \"#bd93f9\",\n\n        gitInv0: \"#ff5555\",\n        gitInv1: \"#ffb86c\",\n        gitInv2: \"#f1fa8c\",\n        gitInv3: \"#50fa7b\",\n        gitInv4: \"#8be9fd\",\n        gitInv5: \"#809fff\",\n        gitInv6: \"#ff79c6\",\n        gitInv7: \"#bd93f9\",\n\n        gitBranchLabel0: \"#323443\",\n        gitBranchLabel1: \"#323443\",\n        gitBranchLabel2: \"#323443\",\n        gitBranchLabel3: \"#323443\",\n        gitBranchLabel4: \"#323443\",\n        gitBranchLabel5: \"#323443\",\n        gitBranchLabel6: \"#323443\",\n        gitBranchLabel7: \"#323443\",\n\n        commitLabelColor: '#52fa7c',\n        commitLabelBackground: '#297d3e'\n      },\n      flowchart: {\n        htmlLabels: false,\n        useMaxWidth: false\n      },\n      er: {\n        useMaxWidth: false\n      },\n      sequence: {\n        useMaxWidth: false,\n        // Mermaid handles Firefox a little different.\n        // For some reason, it doesn't attach font sizes to the labels in Firefox.\n        // If we specify the documented defaults, font sizes are written to the labels in Firefox.\n        noteFontWeight: \"14px\",\n        actorFontSize: \"14px\",\n        messageFontSize: \"16px\"\n      },\n      journey: {\n        useMaxWidth: false\n      },\n      pie: {\n        useMaxWidth: false\n      },\n      gantt: {\n        useMaxWidth: false\n      },\n      gitGraph: {\n        useMaxWidth: false\n      }\n    },\n\n    default: {\n      startOnLoad: false,\n      theme: \"default\",\n      flowchart: {\n        htmlLabels: false,\n        useMaxWidth: false\n      },\n      er: {\n        useMaxWidth: false\n      },\n      sequence: {\n        useMaxWidth: false,\n        noteFontWeight: \"14px\",\n        actorFontSize: \"14px\",\n        messageFontSize: \"16px\"\n      },\n      journey: {\n        useMaxWidth: false\n      },\n      pie: {\n        useMaxWidth: false\n      },\n      gantt: {\n        useMaxWidth: false\n      },\n      gitGraph: {\n        useMaxWidth: false\n      }\n    },\n\n    slate: {\n      startOnLoad: false,\n      theme: \"dark\",\n      flowchart: {\n        htmlLabels: false,\n        useMaxWidth: false\n      },\n      er: {\n        useMaxWidth: false\n      },\n      sequence: {\n        useMaxWidth: false,\n        noteFontWeight: \"14px\",\n        actorFontSize: \"14px\",\n        messageFontSize: \"16px\"\n      },\n      journey: {\n        useMaxWidth: false\n      },\n      pie: {\n        useMaxWidth: false\n      },\n      gantt: {\n        useMaxWidth: false\n      },\n      gitGraph: {\n        useMaxWidth: false\n      }\n    }\n  }\n}\n"],"names":["window","MathJax","tex","inlineMath","displayMath","processEscapes","processEnvironments","tagSide","tagIndent","multlineWidth","tags","options","ignoreHtmlClass","processHtmlClass","mermaidConfig","dracula","startOnLoad","theme","themeCSS","themeVariables","darkMode","background","mainBkg","textColor","lineColor","errorBkgColor","errorTextColor","primaryColor","primaryTextColor","primaryBorderColor","secondaryColor","secondaryTextColor","secondaryBorderColor","tertiaryColor","tertiaryTextColor","tertiaryBorderColor","noteBkgColor","noteTextColor","noteBorderColor","edgeLabelBackground","edgeLabelText","actorLineColor","activeTaskBkgColor","activeTaskBorderColor","doneTaskBkgColor","doneTaskBorderColor","critBkgColor","critBorderColor","taskTextColor","taskTextOutsideColor","taskTextLightColor","sectionBkgColor","sectionBkgColor2","altSectionBkgColor","todayLineColor","gridColor","defaultLinkColor","altBackground","classText","fillType0","fillType1","fillType2","fillType3","fillType4","fillType5","fillType6","fillType7","fillType8","git0","git1","git2","git3","git4","git5","git6","git7","gitInv0","gitInv1","gitInv2","gitInv3","gitInv4","gitInv5","gitInv6","gitInv7","gitBranchLabel0","gitBranchLabel1","gitBranchLabel2","gitBranchLabel3","gitBranchLabel4","gitBranchLabel5","gitBranchLabel6","gitBranchLabel7","commitLabelColor","commitLabelBackground","flowchart","htmlLabels","useMaxWidth","er","sequence","noteFontWeight","actorFontSize","messageFontSize","journey","pie","gantt","gitGraph","default","slate"],"mappings":"yBAEM,kBAAmBA,SACvBA,OAAOC,QAAU,CACfC,IAAK,CACHC,WAAY,CAAC,CAAC,MAAO,QACrBC,YAAa,CAAC,CAAC,MAAO,QACtBC,gBAAgB,EAChBC,qBAAqB,EACrBC,QAAS,QACTC,UAAW,OACXC,cAAe,MACfC,KAAM,OAERC,QAAS,CACPC,gBAAiB,KACjBC,iBAAkB,gBAKlB,kBAAmBb,SAGvBA,OAAOc,cAAgB,CACrBC,QAAS,CACPC,aAAa,EACbC,MAAO,OACPC,SAAU,w/GA0HVC,eAAgB,CACdC,UAAU,EACVC,WAAY,UACZC,QAAS,UACTC,UAAW,UACXC,UAAW,UACXC,cAAe,UACfC,eAAgB,UAChBC,aAAc,UACdC,iBAAkB,UAClBC,mBAAoB,UACpBC,eAAgB,UAChBC,mBAAoB,UACpBC,qBAAsB,UACtBC,cAAe,UACfC,kBAAmB,UACnBC,oBAAqB,UACrBC,aAAc,UACdC,cAAe,UACfC,gBAAiB,UACjBC,oBAAqB,UACrBC,cAAe,UAEfC,eAAgB,UAEhBC,mBAAoB,UACpBC,sBAAuB,UACvBC,iBAAkB,UAClBC,oBAAqB,UACrBC,aAAc,UACdC,gBAAiB,UACjBC,cAAe,UACfC,qBAAsB,UACtBC,mBAAoB,UACpBC,gBAAiB,YACjBC,iBAAkB,YAClBC,mBAAoB,UACpBC,eAAgB,UAChBC,UAAW,UACXC,iBAAkB,UAElBC,cAAe,UAEfC,UAAW,UAEXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UACXC,UAAW,UAEXC,KAAM,UACNC,KAAM,UACNC,KAAM,UACNC,KAAM,UACNC,KAAM,UACNC,KAAM,UACNC,KAAM,UACNC,KAAM,UAENC,QAAS,UACTC,QAAS,UACTC,QAAS,UACTC,QAAS,UACTC,QAAS,UACTC,QAAS,UACTC,QAAS,UACTC,QAAS,UAETC,gBAAiB,UACjBC,gBAAiB,UACjBC,gBAAiB,UACjBC,gBAAiB,UACjBC,gBAAiB,UACjBC,gBAAiB,UACjBC,gBAAiB,UACjBC,gBAAiB,UAEjBC,iBAAkB,UAClBC,sBAAuB,WAEzBC,UAAW,CACTC,YAAY,EACZC,aAAa,GAEfC,GAAI,CACFD,aAAa,GAEfE,SAAU,CACRF,aAAa,EAIbG,eAAgB,OAChBC,cAAe,OACfC,gBAAiB,QAEnBC,QAAS,CACPN,aAAa,GAEfO,IAAK,CACHP,aAAa,GAEfQ,MAAO,CACLR,aAAa,GAEfS,SAAU,CACRT,aAAa,IAIjBU,QAAS,CACP1F,aAAa,EACbC,MAAO,UACP6E,UAAW,CACTC,YAAY,EACZC,aAAa,GAEfC,GAAI,CACFD,aAAa,GAEfE,SAAU,CACRF,aAAa,EACbG,eAAgB,OAChBC,cAAe,OACfC,gBAAiB,QAEnBC,QAAS,CACPN,aAAa,GAEfO,IAAK,CACHP,aAAa,GAEfQ,MAAO,CACLR,aAAa,GAEfS,SAAU,CACRT,aAAa,IAIjBW,MAAO,CACL3F,aAAa,EACbC,MAAO,OACP6E,UAAW,CACTC,YAAY,EACZC,aAAa,GAEfC,GAAI,CACFD,aAAa,GAEfE,SAAU,CACRF,aAAa,EACbG,eAAgB,OAChBC,cAAe,OACfC,gBAAiB,QAEnBC,QAAS,CACPN,aAAa,GAEfO,IAAK,CACHP,aAAa,GAEfQ,MAAO,CACLR,aAAa,GAEfS,SAAU,CACRT,aAAa"}
diff --git a/docs/theme/assets/pymdownx-extras/material-extra-theme-TVq-kNRT.js b/docs/theme/assets/pymdownx-extras/material-extra-theme-TVq-kNRT.js
new file mode 100644
index 0000000..ce38f61
--- /dev/null
+++ b/docs/theme/assets/pymdownx-extras/material-extra-theme-TVq-kNRT.js
@@ -0,0 +1,2 @@
+!function(){"use strict";var e;e=function(e){"true"===localStorage.getItem("data-md-prefers-color-scheme")&&document.querySelector("body").setAttribute("data-md-color-scheme",e.matches?"dracula":"default")},new MutationObserver((function(t){t.forEach((function(t){if("childList"===t.type&&t.addedNodes.length)for(var a=0;a {\n\n  const preferToggle = e => {\n    if (localStorage.getItem(\"data-md-prefers-color-scheme\") === \"true\") {\n      document.querySelector(\"body\").setAttribute(\"data-md-color-scheme\", (e.matches) ? \"dracula\" : \"default\")\n    }\n  }\n\n  const setupTheme = body => {\n    const preferSupported = window.matchMedia(\"(prefers-color-scheme)\").media !== \"not all\"\n    let scheme = localStorage.getItem(\"data-md-color-scheme\")\n    let prefers = localStorage.getItem(\"data-md-prefers-color-scheme\")\n\n    if (!scheme) {\n      scheme = \"dracula\"\n    }\n    if (!prefers) {\n      prefers = \"false\"\n    }\n\n    if (prefers === \"true\" && preferSupported) {\n      scheme = (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) ? \"dracula\" : \"default\"\n    } else {\n      prefers = \"false\"\n    }\n\n    body.setAttribute(\"data-md-prefers-color-scheme\", prefers)\n    body.setAttribute(\"data-md-color-scheme\", scheme)\n\n    if (preferSupported) {\n      const matchListener = window.matchMedia(\"(prefers-color-scheme: dark)\")\n      matchListener.addListener(preferToggle)\n    }\n  }\n\n  const observer = new MutationObserver(mutations => {\n    mutations.forEach(mutation => {\n      if (mutation.type === \"childList\") {\n        if (mutation.addedNodes.length) {\n          for (let i = 0; i < mutation.addedNodes.length; i++) {\n            const el = mutation.addedNodes[i]\n\n            if (el.nodeType === 1 && el.tagName.toLowerCase() === \"body\") {\n              setupTheme(el)\n              break\n            }\n          }\n        }\n      }\n    })\n  })\n\n  observer.observe(document.querySelector(\"html\"), {childList: true})\n})()\n\nwindow.toggleScheme = () => {\n  const body = document.querySelector(\"body\")\n  const preferSupported = window.matchMedia(\"(prefers-color-scheme)\").media !== \"not all\"\n  let scheme = body.getAttribute(\"data-md-color-scheme\")\n  let prefer = body.getAttribute(\"data-md-prefers-color-scheme\")\n\n  if (preferSupported && scheme === \"default\" && prefer !== \"true\") {\n    prefer = \"true\"\n    scheme = (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) ? \"dracula\" : \"default\"\n  } else if (preferSupported && prefer === \"true\") {\n    prefer = \"false\"\n    scheme = \"dracula\"\n  } else if (scheme === \"dracula\") {\n    prefer = \"false\"\n    scheme = \"default\"\n  } else {\n    prefer = \"false\"\n    scheme = \"dracula\"\n  }\n  localStorage.setItem(\"data-md-prefers-color-scheme\", prefer)\n  body.setAttribute(\"data-md-prefers-color-scheme\", prefer)\n  body.setAttribute(\"data-md-color-scheme\", scheme)\n}\n"],"names":["preferToggle","e","localStorage","getItem","document","querySelector","setAttribute","matches","MutationObserver","mutations","forEach","mutation","type","addedNodes","length","i","el","nodeType","tagName","toLowerCase","body","preferSupported","scheme","prefers","window","matchMedia","media","addListener","observe","childList","toggleScheme","getAttribute","prefer","setItem"],"mappings":"yBAAA,IAEQA,IAAe,SAAAC,GAC0C,SAAzDC,aAAaC,QAAQ,iCACvBC,SAASC,cAAc,QAAQC,aAAa,uBAAyBL,EAAEM,QAAW,UAAY,YA+BjF,IAAIC,kBAAiB,SAAAC,GACpCA,EAAUC,SAAQ,SAAAC,GAChB,GAAsB,cAAlBA,EAASC,MACPD,EAASE,WAAWC,OACtB,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAASE,WAAWC,OAAQC,IAAK,CACnD,IAAMC,EAAKL,EAASE,WAAWE,GAE/B,GAAoB,IAAhBC,EAAGC,UAA+C,SAA7BD,EAAGE,QAAQC,cAA0B,CAlCrDC,EAmCIJ,EAlCfK,SACFC,SACAC,SAFEF,EAAwE,YAAtDG,OAAOC,WAAW,0BAA0BC,MAChEJ,EAASpB,aAAaC,QAAQ,wBAC9BoB,EAAUrB,aAAaC,QAAQ,gCAE9BmB,IACHA,EAAS,WAENC,IACHA,EAAU,SAGI,SAAZA,GAAsBF,EACxBC,EAAUE,OAAOC,WAAW,gCAAgClB,QAAW,UAAY,UAEnFgB,EAAU,QAGZH,EAAKd,aAAa,+BAAgCiB,GAClDH,EAAKd,aAAa,uBAAwBgB,GAEtCD,GACoBG,OAAOC,WAAW,gCAC1BE,YAAY3B,GAalB,KACF,CACF,CAtCW,IAAAoB,EACXC,EACFC,EACAC,CAsCJ,GACF,IAESK,QAAQxB,SAASC,cAAc,QAAS,CAACwB,WAAW,IAG/DL,OAAOM,aAAe,WACpB,IAAMV,EAAOhB,SAASC,cAAc,QAC9BgB,EAAwE,YAAtDG,OAAOC,WAAW,0BAA0BC,MAChEJ,EAASF,EAAKW,aAAa,wBAC3BC,EAASZ,EAAKW,aAAa,gCAE3BV,GAA8B,YAAXC,GAAmC,SAAXU,GAC7CA,EAAS,OACTV,EAAUE,OAAOC,WAAW,gCAAgClB,QAAW,UAAY,WAC1Ec,GAA8B,SAAXW,GAC5BA,EAAS,QACTV,EAAS,WACW,YAAXA,GACTU,EAAS,QACTV,EAAS,YAETU,EAAS,QACTV,EAAS,WAEXpB,aAAa+B,QAAQ,+BAAgCD,GACrDZ,EAAKd,aAAa,+BAAgC0B,GAClDZ,EAAKd,aAAa,uBAAwBgB,EAC5C"}
diff --git a/docs/theme/main.html b/docs/theme/main.html
new file mode 100644
index 0000000..4b5209e
--- /dev/null
+++ b/docs/theme/main.html
@@ -0,0 +1,6 @@
+{% extends "base.html" %}
+
+{% block libs %}
+{{ super() }}
+{% include "partials/libs.html" ignore missing %}
+{% endblock %}
diff --git a/docs/theme/partials/footer.html b/docs/theme/partials/footer.html
new file mode 100644
index 0000000..5a9cdc1
--- /dev/null
+++ b/docs/theme/partials/footer.html
@@ -0,0 +1,49 @@
+
+{% import "partials/language.html" as lang with context %}
+
diff --git a/docs/theme/partials/header.html b/docs/theme/partials/header.html
new file mode 100644
index 0000000..4e21967
--- /dev/null
+++ b/docs/theme/partials/header.html
@@ -0,0 +1,88 @@
+
+{% set site_url = config.site_url | d(nav.homepage.url, true) | url %}
+{% if not config.use_directory_urls and site_url[0] == site_url[-1] == "." %}
+  {% set site_url = site_url ~ "/index.html" %}
+{% endif %}
+
+ +
diff --git a/docs/theme/partials/libs.html b/docs/theme/partials/libs.html new file mode 100644 index 0000000..8041b12 --- /dev/null +++ b/docs/theme/partials/libs.html @@ -0,0 +1,2 @@ + + diff --git a/docs/ultilities.md b/docs/ultilities.md new file mode 100644 index 0000000..225b443 --- /dev/null +++ b/docs/ultilities.md @@ -0,0 +1,172 @@ +Utilities detail can be referred in the sub-pages of this section. + +## Prompt engineering UI + +![chat-ui](https://github.com/Cinnamon/kotaemon/assets/35283585/ac8f9aac-d853-4571-a48b-d866a99eaf3e) + +**_Important:_** despite the name prompt engineering UI, this tool allows DMs to test any kind of parameters that are exposed by AIRs. Prompt is one kind of param. There can be other type of params that DMs can tweak (e.g. top_k, temperature...). + +**_Note:_** For hands-on examination of how to use prompt engineering UI, refer `./examples/promptui` and `./examples/example2/` + +In client projects, AI developers typically build the pipeline. However, for LLM projects requiring Japanese and domain expertise in prompt creation, non-technical team members (DM, BizDev, and QALs) can be more effective. To facilitate this, "xxx" offers a user-friendly prompt engineering UI that AI developers integrate into their pipelines. This enables non-technical members to adjust prompts and parameters, run experiments, and export results for optimization. + +As of Sept 2023, there are 2 kinds of prompt engineering UI: + +- Simple pipeline: run one-way from start to finish. +- Chat pipeline: interactive back-and-forth. + +### Simple pipeline + +For simple pipeline, the supported client project workflow looks as follow: + +1. [AIR] Build pipeline +2. [AIR] Export pipeline to config: `$ kh promptui export --output ` +3. [AIR] Customize the config +4. [AIR] Spin up prompt engineering UI: `$ kh promptui run ` +5. [DM] Change params, run inference +6. [DM] Export to Excel +7. [DM] Select the set of params that achieve the best output + +The prompt engineering UI prominently involves from step 2 to step 7 (step 1 is normal AI tasks in project, while step 7 happens exclusively in Excel file). + +#### Step 2 - Export pipeline to config + +Command: + +``` +$ kh promptui export --output +``` + +where: + +- `` is a dot-separated path to the pipeline. For example, if your pipeline can be accessed with `from projectA.pipelines import AnsweringPipeline`, then this value is `projectA.pipelines.AnswerPipeline`. +- `` is the target file path that the config will be exported to. If the config file already exists, and contains information of other pipelines, the config of current pipeline will additionally be added. If it contains information of the current pipeline (in the past), the old information will be replaced. + +By default, all params in a pipeline (including nested params) will be export to the configuration file. For params that you do not wish to expose to the UI, you can directly remove them from the config YAML file. You can also annotate those param with `ignore_ui=True`, and they will be ignored in the config generation process. Example: + +```python +class Pipeline(BaseComponent): + param1: str = Param(default="hello") + param2: str = Param(default="goodbye", ignore_ui=True) +``` + +Declared as above, and `param1` will show up in the config YAML file, while `param2` will not. + +#### Step 3 - Customize the config + +AIR can further edit the config file in this step to get the most suitable UI (step 4) with their tasks. The exported config will have this overall schema: + +``` +: + params: + ... (Detail param information to initiate a pipeline. This corresponds to the pipeline init parameters.) + inputs: + ... (Detail the input of the pipeline e.g. a text prompt, an FNOL... This corresponds to the params of `run(...)` method.) + outputs: + ... (Detail the output of the pipeline e.g. prediction, accuracy... This is the output information we wish to see in the UI.) + logs: + ... (Detail what information should show up in the log.) +``` + +##### Input and params + +The inputs section have the overall schema as follow: + +``` +inputs: + : + component: + params: # this section is optional) + value: + : + ... # similar to above +params: + : + ... # similar to those in the inputs +``` + +The list of supported prompt UI and their corresponding gradio UI components: + +``` +COMPONENTS_CLASS = { + "text": gr.components.Textbox, + "checkbox": gr.components.CheckboxGroup, + "dropdown": gr.components.Dropdown, + "file": gr.components.File, + "image": gr.components.Image, + "number": gr.components.Number, + "radio": gr.components.Radio, + "slider": gr.components.Slider, +} +``` + +##### Outputs + +The outputs are a list of variables that we wish to show in the UI. Since in Python, the function output doesn't have variable name, so output declaration is a little bit different than input and param declaration: + +``` +outputs: + - component: + step: + item: + - ... # similar to above +``` + +where: + +- component: the same text string and corresponding Gradio UI as in inputs & params +- step: the pipeline step that we wish to look fetch and show output on the UI +- item: the jsonpath mechanism to get the targeted variable from the step above + +##### Logs + +The logs show a list of sheetname and how to retrieve the desired information. + +``` +logs: + : + inputs: + - name: + step: + variable: + - ... + outputs: + - name: + step: + item: +``` + +#### Step 4 + 5 - Spin up prompt engineering UI + Perform prompt engineering + +Command: + +``` +$ kh promptui run +``` + +This will generate an UI as follow: + +![Screenshot from 2023-09-20 12-20-31](https://github.com/Cinnamon/kotaemon/assets/35283585/9ac1b95a-b667-42e7-b318-98a1b805d6df) + +where: + +- The tabs at the top of the UI corresponds to the pipeline to do prompt engineering. +- The inputs and params tabs allow users to edit (these corresponds to the inputs and params in the config file). +- The outputs panel holds the UI elements to show the outputs defined in config file. +- The Run button: will execute pipeline with the supplied inputs and params, and render result in the outputs panel. +- The Export button: will export the logs of all the run to an Excel files users to inspect for best set of params. + +#### Step 6 - Export to Excel + +Upon clicking export, the users can download Excel file. + +### Chat pipeline + +Chat pipeline workflow is different from simple pipeline workflow. In simple pipeline, each Run creates a set of output, input and params for users to compare. In chat pipeline, each Run is not a one-off run, but a long interactive session. Hence, the workflow is as follow: + +1. Set the desired parameters. +2. Click "New chat" to start a chat session with the supplied parameters. This set of parameters will persist until the end of the chat session. During an ongoing chat session, changing the parameters will not take any effect. +3. Chat and interact with the chat bot on the right panel. You can add any additional input (if any), and they will be supplied to the chatbot. +4. During chat, the log of the chat will show up in the "Output" tabs. This is empty by default, so if you want to show the log here, tell the AI developers to configure the UI settings. +5. When finishing chat, select your preference in the radio box. Click "End chat". This will save the chat log and the preference to disk. +6. To compare the result of different run, click "Export" to get an Excel spreadsheet summary of different run. diff --git a/docs/upload-package.md b/docs/upload-package.md new file mode 100644 index 0000000..14926a7 --- /dev/null +++ b/docs/upload-package.md @@ -0,0 +1,24 @@ +Devpi server endpoint (subjected to change): https://ian_devpi.promptui.dm.cinnamon.is/root/packages + +Install devpi-client + +```bash +pip install devpi-client +``` + +Login to the server + +```bash +devpi use # set server endpoint provided above +devpi login --password= # login +``` + +If you don't yet have an account, please contact Ian or John. + +Upload your package + +```bash +devpi use \dev # choose the index to upload your package +cd +devpi upload +``` diff --git a/knowledgehub/agents/langchain_based.py b/knowledgehub/agents/langchain_based.py index 9138a17..3083b70 100644 --- a/knowledgehub/agents/langchain_based.py +++ b/knowledgehub/agents/langchain_based.py @@ -67,7 +67,7 @@ class LangchainAgent(BaseAgent): def run(self, instruction: str) -> AgentOutput: assert ( self.agent is not None - ), "Lanchain AgentExecutor is not correclty initialized" + ), "Lanchain AgentExecutor is not correctly initialized" # Langchain AgentExecutor call output = self.agent(instruction)["output"] diff --git a/knowledgehub/base/component.py b/knowledgehub/base/component.py index bf1851f..b62658c 100644 --- a/knowledgehub/base/component.py +++ b/knowledgehub/base/component.py @@ -6,16 +6,16 @@ from kotaemon.base.schema import Document class BaseComponent(Function): - """A component is a class that can be used to compose a pipeline + """A component is a class that can be used to compose a pipeline. - Benefits of component: + !!! tip "Benefits of component" - Auto caching, logging - Allow deployment - For each component, the spirit is: + !!! tip "For each component, the spirit is" - Tolerate multiple input types, e.g. str, Document, List[str], List[Document] - Enforce single output type. Hence, the output type of a component should be - as generic as possible. + as generic as possible. """ inflow = None diff --git a/knowledgehub/base/schema.py b/knowledgehub/base/schema.py index cfb5791..ee19d3a 100644 --- a/knowledgehub/base/schema.py +++ b/knowledgehub/base/schema.py @@ -22,6 +22,9 @@ class Document(BaseDocument): This class accept one positional argument `content` of an arbitrary type, which will store the raw content of the document. If specified, the class will use `content` to initialize the base llama_index class. + + Args: + content: the raw content of the document. """ content: Any @@ -99,7 +102,7 @@ class RetrievedDocument(Document): """Subclass of Document with retrieval-related information Attributes: - score (float): score of the document (from 0.0 to 1.0) + score (float): score of the document (from 0.0 to 1.0) retrieval_metadata (dict): metadata from the retrieval process, can be used by different components in a retrieved pipeline to communicate with each other diff --git a/knowledgehub/llms/__init__.py b/knowledgehub/llms/__init__.py index 521f596..e52474a 100644 --- a/knowledgehub/llms/__init__.py +++ b/knowledgehub/llms/__init__.py @@ -4,6 +4,7 @@ from .base import BaseLLM from .branching import GatedBranchingPipeline, SimpleBranchingPipeline from .chats import AzureChatOpenAI, ChatLLM from .completions import LLM, AzureOpenAI, OpenAI +from .cot import ManualSequentialChainOfThought, Thought from .linear import GatedLinearPipeline, SimpleLinearPipeline from .prompts import BasePromptComponent, PromptTemplate @@ -28,4 +29,7 @@ __all__ = [ "GatedLinearPipeline", "SimpleBranchingPipeline", "GatedBranchingPipeline", + # chain-of-thoughts + "ManualSequentialChainOfThought", + "Thought", ] diff --git a/knowledgehub/llms/branching.py b/knowledgehub/llms/branching.py index 8f93caf..a9cbbe8 100644 --- a/knowledgehub/llms/branching.py +++ b/knowledgehub/llms/branching.py @@ -12,7 +12,8 @@ class SimpleBranchingPipeline(BaseComponent): Attributes: branches (List[BaseComponent]): The list of branches to be executed. - Example Usage: + Example: + ```python from kotaemon.llms import ( AzureChatOpenAI, BasePromptComponent, @@ -45,6 +46,7 @@ class SimpleBranchingPipeline(BaseComponent): print(pipeline(condition_text="1")) print(pipeline(condition_text="2")) print(pipeline(condition_text="12")) + ``` """ branches: List[BaseComponent] = Param(default_callback=lambda *_: []) @@ -87,7 +89,8 @@ class GatedBranchingPipeline(SimpleBranchingPipeline): Attributes: branches (List[BaseComponent]): The list of branches to be executed. - Example Usage: + Example: + ```python from kotaemon.llms import ( AzureChatOpenAI, BasePromptComponent, @@ -119,6 +122,7 @@ class GatedBranchingPipeline(SimpleBranchingPipeline): ) print(pipeline(condition_text="1")) print(pipeline(condition_text="2")) + ``` """ def run(self, *, condition_text: Optional[str] = None, **prompt_kwargs): @@ -135,7 +139,7 @@ class GatedBranchingPipeline(SimpleBranchingPipeline): Union[OutputType, None]: The output of the first branch that satisfies the condition, or None if no branch satisfies the condition. - Raise: + Raises: ValueError: If condition_text is None """ if condition_text is None: diff --git a/knowledgehub/llms/cot.py b/knowledgehub/llms/cot.py index 5786f41..6721dc3 100644 --- a/knowledgehub/llms/cot.py +++ b/knowledgehub/llms/cot.py @@ -1,7 +1,9 @@ from copy import deepcopy from typing import Callable, List -from kotaemon.base import BaseComponent, Document, Node, Param +from theflow import Function, Node, Param + +from kotaemon.base import BaseComponent, Document from .chats import AzureChatOpenAI from .completions import LLM @@ -66,13 +68,13 @@ class Thought(BaseComponent): prompt: str = Param( help=( - "The prompt template string. This prompt template has Python-like " - "variable placeholders, that then will be subsituted with real values when " - "this component is executed" + "The prompt template string. This prompt template has Python-like variable" + " placeholders, that then will be substituted with real values when this" + " component is executed" ) ) llm: LLM = Node(AzureChatOpenAI, help="The LLM model to execute the input prompt") - post_process: BaseComponent = Node( + post_process: Function = Node( help=( "The function post-processor that post-processes LLM output prediction ." "It should take a string as input (this is the LLM output text) and return " @@ -83,7 +85,7 @@ class Thought(BaseComponent): @Node.auto(depends_on="prompt") def prompt_template(self): """Automatically wrap around param prompt. Can ignore""" - return BasePromptComponent(template=self.prompt) + return BasePromptComponent(self.prompt) def run(self, **kwargs) -> Document: """Run the chain of thought""" @@ -113,20 +115,19 @@ class ManualSequentialChainOfThought(BaseComponent): **Create and run a chain of thought without "+" operator:** - ```python - >> from kotaemon.pipelines.cot import Thought, ManualSequentialChainOfThought - - >> llm = AzureChatOpenAI(...) - >> thought1 = Thought( - prompt="Word {word} in {language} is ", - post_process=lambda string: {"translated": string}, - ) - >> thought2 = Thought( - prompt="Translate {translated} to Japanese", - post_process=lambda string: {"output": string}, - ) - >> thought = ManualSequentialChainOfThought(thoughts=[thought1, thought2], llm=llm) - >> thought(word="hello", language="French") + ```pycon + >>> from kotaemon.pipelines.cot import Thought, ManualSequentialChainOfThought + >>> llm = AzureChatOpenAI(...) + >>> thought1 = Thought( + >>> prompt="Word {word} in {language} is ", + >>> post_process=lambda string: {"translated": string}, + >>> ) + >>> thought2 = Thought( + >>> prompt="Translate {translated} to Japanese", + >>> post_process=lambda string: {"output": string}, + >>> ) + >>> thought = ManualSequentialChainOfThought(thoughts=[thought1, thought2], llm=llm) + >>> thought(word="hello", language="French") {'word': 'hello', 'language': 'French', 'translated': '"Bonjour"', diff --git a/knowledgehub/llms/linear.py b/knowledgehub/llms/linear.py index 4fd95e4..ac8605a 100644 --- a/knowledgehub/llms/linear.py +++ b/knowledgehub/llms/linear.py @@ -21,6 +21,7 @@ class SimpleLinearPipeline(BaseComponent): post-processor component or function. Example Usage: + ```python from kotaemon.llms import AzureChatOpenAI, BasePromptComponent def identity(x): @@ -41,6 +42,7 @@ class SimpleLinearPipeline(BaseComponent): post_processor=identity, ) print(pipeline(word="lone")) + ``` """ prompt: BasePromptComponent @@ -85,7 +87,8 @@ class GatedLinearPipeline(SimpleLinearPipeline): condition (Callable[[IO_Type], Any]): A callable function that represents the condition. - Example Usage: + Usage: + ```{.py3 title="Example Usage"} from kotaemon.llms import AzureChatOpenAI, BasePromptComponent from kotaemon.parsers import RegexExtractor @@ -109,6 +112,7 @@ class GatedLinearPipeline(SimpleLinearPipeline): ) print(pipeline(condition_text="some pattern", word="lone")) print(pipeline(condition_text="other pattern", word="lone")) + ``` """ condition: Callable[[IO_Type], Any] diff --git a/knowledgehub/llms/prompts/template.py b/knowledgehub/llms/prompts/template.py index 46692ec..aa758be 100644 --- a/knowledgehub/llms/prompts/template.py +++ b/knowledgehub/llms/prompts/template.py @@ -72,7 +72,7 @@ class PromptTemplate: UserWarning, ) - def populate(self, **kwargs): + def populate(self, **kwargs) -> str: """ Strictly populate the template with the given keyword arguments. @@ -81,7 +81,7 @@ class PromptTemplate: Each keyword corresponds to a placeholder in the template. Returns: - str: The populated template. + The populated template. Raises: ValueError: If an unknown placeholder is provided. diff --git a/knowledgehub/loaders/base.py b/knowledgehub/loaders/base.py index f74cc45..cb92d5b 100644 --- a/knowledgehub/loaders/base.py +++ b/knowledgehub/loaders/base.py @@ -4,7 +4,7 @@ from typing import Any, List, Type, Union from llama_index import SimpleDirectoryReader, download_loader from llama_index.readers.base import BaseReader -from ..base import BaseComponent, Document +from kotaemon.base import BaseComponent, Document class AutoReader(BaseComponent): diff --git a/knowledgehub/loaders/utils/box.py b/knowledgehub/loaders/utils/box.py index 8b7726b..d3ff6c0 100644 --- a/knowledgehub/loaders/utils/box.py +++ b/knowledgehub/loaders/utils/box.py @@ -93,7 +93,7 @@ def get_rect_iou(gt_box: List[tuple], pd_box: List[tuple], iou_type=0) -> int: # compute the intersection over union by taking the intersection # area and dividing it by the sum of prediction + ground-truth - # areas - the interesection area + # areas - the intersection area if iou_type == 0: iou = interArea / float(gt_area + pd_area - interArea) elif iou_type == 1: diff --git a/knowledgehub/loaders/utils/pdf_ocr.py b/knowledgehub/loaders/utils/pdf_ocr.py index b978828..197e021 100644 --- a/knowledgehub/loaders/utils/pdf_ocr.py +++ b/knowledgehub/loaders/utils/pdf_ocr.py @@ -34,8 +34,7 @@ def read_pdf_unstructured(input_path: Union[Path, str]): from unstructured.partition.auto import partition except ImportError: raise ImportError( - "Please install unstructured PDF reader \ - `pip install unstructured[pdf]`" + "Please install unstructured PDF reader `pip install unstructured[pdf]`" ) page_items = defaultdict(list) @@ -60,7 +59,7 @@ def read_pdf_unstructured(input_path: Union[Path, str]): def merge_ocr_and_pdf_texts( ocr_list: List[dict], pdf_text_list: List[dict], debug_info=None ): - """Merge PDF and OCR text using IOU overlaping location + """Merge PDF and OCR text using IOU overlapping location Args: ocr_list: List of OCR items {"text", "box", "location"} pdf_text_list: List of PDF items {"text", "box", "location"} @@ -115,7 +114,7 @@ def merge_ocr_and_pdf_texts( def merge_table_cell_and_ocr( table_list: List[dict], ocr_list: List[dict], pdf_list: List[dict], debug_info=None ): - """Merge table items with OCR text using IOU overlaping location + """Merge table items with OCR text using IOU overlapping location Args: table_list: List of table items "type": ("table", "cell", "text"), "text", "box", "location"} @@ -123,7 +122,7 @@ def merge_table_cell_and_ocr( pdf_list: List of PDF items {"text", "box", "location"} Returns: - all_table_cells: List of tables, each of table is reprented + all_table_cells: List of tables, each of table is represented by list of cells with combined text from OCR not_matched_items: List of PDF text which is not overlapped by table region """ diff --git a/knowledgehub/parsers/regex_extractor.py b/knowledgehub/parsers/regex_extractor.py index 90ad365..f773fe9 100644 --- a/knowledgehub/parsers/regex_extractor.py +++ b/knowledgehub/parsers/regex_extractor.py @@ -100,11 +100,14 @@ class RegexExtractor(BaseComponent): A list contains the output ExtractorOutput for each input Example: - document1 = Document(...) - document2 = Document(...) - document_batch = [document1, document2] - batch_output = self(document_batch) - # batch_output will be [output1_document1, output1_document2] + ```pycon + >>> document1 = Document(...) + >>> document2 = Document(...) + >>> document_batch = [document1, document2] + >>> batch_output = self(document_batch) + >>> print(batch_output) + [output1_document1, output1_document2] + ``` """ # TODO: this conversion seems common input_: list[str] = [] diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..14cd154 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,105 @@ +repo_name: Cinnamon/kotaemon +repo_url: https://github.com/Cinnamon/kotaemon +site_name: kotaemon Docs +edit_uri: edit/main/docs/ + +nav: + - Getting Started: + - Quick Start: index.md + - Overview: overview.md + - Contributing: contributing.md + - Tutorial: + - Data & Data Structure Components: data-components.md + - Creating a Component: create-a-component.md + - Utilities: ultilities.md + # generated using gen-files + literate-nav + - API Reference: reference/ + - Use Cases: examples/ + - Misc: + - Upload python package to private index: upload-package.md + +markdown_extensions: + - admonition + - pymdownx.highlight: + use_pygments: true + anchor_linenums: true + line_spans: __span + linenums: true + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.details + - pymdownx.extra + - pymdownx.tabbed: + alternate_style: true + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - toc: + permalink: true + title: Page contents + +plugins: + - search + - gen-files: + scripts: + - docs/scripts/generate_reference_docs.py + - docs/scripts/generate_examples_docs.py + - literate-nav: + nav_file: NAV.md + - mkdocstrings: + handlers: + python: + options: + docstring_options: + ignore_init_summary: false + filters: + - "!^_" + members_order: source + separate_signature: true + paths: [kotaemon] + - git-revision-date-localized: + enable_creation_date: true + type: timeago + fallback_to_build_date: true + - section-index + +theme: + features: + - content.action.edit + - content.tabs.link + - content.code.annotate + - content.code.annotations + - content.code.copy + - navigation.tabs + - navigation.top + - navigation.instant + - navigation.indexes + - toc.follow + - search.share + - search.highlight + - search.suggest + name: material + custom_dir: docs/theme + palette: + scheme: dracula + primary: deep purple + accent: deep purple + icon: + repo: fontawesome/brands/github + edit: material/pencil + view: material/eye + +extra_css: + - extra/css/code_select.css + - assets/pymdownx-extras/extra-fb5a2a1c86.css + +extra_javascript: + - assets/pymdownx-extras/extra-loader-MCFnu0Wd.js + +validation: + absolute_links: warn + omitted_files: warn + unrecognized_links: warn diff --git a/pyproject.toml b/pyproject.toml index 1514e08..67a2265 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,3 +70,10 @@ kh = "kotaemon.cli:main" Homepage = "https://github.com/Cinnamon/kotaemon/" Repository = "https://github.com/Cinnamon/kotaemon/" Documentation = "https://github.com/Cinnamon/kotaemon/wiki" + +[tool.codespell] +skip = "*.js,*.css,*.map" +# `llm` abbreviation for large language models +ignore-words-list = "llm,fo" +quiet-level = 3 +check-filenames = "" diff --git a/tests/test_vectorstore.py b/tests/test_vectorstore.py index e086d0e..31b34f7 100644 --- a/tests/test_vectorstore.py +++ b/tests/test_vectorstore.py @@ -34,7 +34,7 @@ class TestChromaVectorStore: ] assert db._collection.count() == 0, "Expected empty collection" output = db.add(documents) - assert len(output) == 2, "Expected outputing 2 ids" + assert len(output) == 2, "Expected outputting 2 ids" assert db._collection.count() == 2, "Expected 2 added entries" def test_delete(self, tmp_path):