From 2b06fa4ee94516e7e12d77febbfd659301099145 Mon Sep 17 00:00:00 2001 From: Rand McKinney Date: Tue, 16 Sep 2025 10:01:52 -0700 Subject: [PATCH 01/15] Initial try for API docs generated by Sphinx --- Makefile | 6 +- README.md | 29 + docs/_build/html/.buildinfo | 4 + .../.doctrees/api/c2pa/c2pa/index.doctree | Bin 0 -> 231790 bytes .../html/.doctrees/api/c2pa/index.doctree | Bin 0 -> 180251 bytes docs/_build/html/.doctrees/api/index.doctree | Bin 0 -> 4120 bytes docs/_build/html/.doctrees/environment.pickle | Bin 0 -> 794166 bytes docs/_build/html/.doctrees/index.doctree | Bin 0 -> 3172 bytes .../.doctrees/project-contributions.doctree | Bin 0 -> 17778 bytes .../html/.doctrees/release-notes.doctree | Bin 0 -> 19295 bytes docs/_build/html/.doctrees/usage.doctree | Bin 0 -> 26089 bytes .../html/_sources/api/c2pa/c2pa/index.rst.txt | 718 +++++++++ .../html/_sources/api/c2pa/index.rst.txt | 624 ++++++++ docs/_build/html/_sources/api/index.rst.txt | 11 + docs/_build/html/_sources/index.rst.txt | 15 + .../_sources/project-contributions.md.txt | 129 ++ .../_build/html/_sources/release-notes.md.txt | 56 + docs/_build/html/_sources/usage.md.txt | 196 +++ docs/_build/html/_static/basic.css | 914 +++++++++++ docs/_build/html/_static/debug.css | 69 + docs/_build/html/_static/doctools.js | 149 ++ .../html/_static/documentation_options.js | 13 + docs/_build/html/_static/file.png | Bin 0 -> 286 bytes docs/_build/html/_static/graphviz.css | 12 + docs/_build/html/_static/language_data.js | 192 +++ docs/_build/html/_static/minus.png | Bin 0 -> 90 bytes docs/_build/html/_static/plus.png | Bin 0 -> 90 bytes docs/_build/html/_static/pygments.css | 232 +++ .../html/_static/scripts/furo-extensions.js | 0 docs/_build/html/_static/scripts/furo.js | 3 + .../html/_static/scripts/furo.js.LICENSE.txt | 7 + docs/_build/html/_static/scripts/furo.js.map | 1 + docs/_build/html/_static/searchtools.js | 632 ++++++++ docs/_build/html/_static/skeleton.css | 296 ++++ docs/_build/html/_static/sphinx_highlight.js | 154 ++ .../html/_static/styles/furo-extensions.css | 2 + .../_static/styles/furo-extensions.css.map | 1 + docs/_build/html/_static/styles/furo.css | 2 + docs/_build/html/_static/styles/furo.css.map | 1 + docs/_build/html/api/c2pa/c2pa/index.html | 1361 +++++++++++++++++ docs/_build/html/api/c2pa/index.html | 1193 +++++++++++++++ docs/_build/html/api/index.html | 330 ++++ docs/_build/html/genindex.html | 818 ++++++++++ docs/_build/html/index.html | 334 ++++ docs/_build/html/objects.inv | Bin 0 -> 1434 bytes docs/_build/html/project-contributions.html | 453 ++++++ docs/_build/html/py-modindex.html | 322 ++++ docs/_build/html/release-notes.html | 397 +++++ docs/_build/html/search.html | 300 ++++ docs/_build/html/searchindex.js | 1 + docs/_build/html/usage.html | 526 +++++++ docs/_static/.gitkeep | 2 + docs/api/c2pa/c2pa/index.rst | 718 +++++++++ docs/api/c2pa/index.rst | 624 ++++++++ docs/api/index.rst | 11 + docs/conf.py | 64 + docs/index.rst | 15 + requirements-dev.txt | 8 +- scripts/generate_api_docs.py | 77 + src/c2pa/build.py | 7 +- src/c2pa/c2pa.py | 36 +- 61 files changed, 12041 insertions(+), 24 deletions(-) create mode 100644 docs/_build/html/.buildinfo create mode 100644 docs/_build/html/.doctrees/api/c2pa/c2pa/index.doctree create mode 100644 docs/_build/html/.doctrees/api/c2pa/index.doctree create mode 100644 docs/_build/html/.doctrees/api/index.doctree create mode 100644 docs/_build/html/.doctrees/environment.pickle create mode 100644 docs/_build/html/.doctrees/index.doctree create mode 100644 docs/_build/html/.doctrees/project-contributions.doctree create mode 100644 docs/_build/html/.doctrees/release-notes.doctree create mode 100644 docs/_build/html/.doctrees/usage.doctree create mode 100644 docs/_build/html/_sources/api/c2pa/c2pa/index.rst.txt create mode 100644 docs/_build/html/_sources/api/c2pa/index.rst.txt create mode 100644 docs/_build/html/_sources/api/index.rst.txt create mode 100644 docs/_build/html/_sources/index.rst.txt create mode 100644 docs/_build/html/_sources/project-contributions.md.txt create mode 100644 docs/_build/html/_sources/release-notes.md.txt create mode 100644 docs/_build/html/_sources/usage.md.txt create mode 100644 docs/_build/html/_static/basic.css create mode 100644 docs/_build/html/_static/debug.css create mode 100644 docs/_build/html/_static/doctools.js create mode 100644 docs/_build/html/_static/documentation_options.js create mode 100644 docs/_build/html/_static/file.png create mode 100644 docs/_build/html/_static/graphviz.css create mode 100644 docs/_build/html/_static/language_data.js create mode 100644 docs/_build/html/_static/minus.png create mode 100644 docs/_build/html/_static/plus.png create mode 100644 docs/_build/html/_static/pygments.css create mode 100644 docs/_build/html/_static/scripts/furo-extensions.js create mode 100644 docs/_build/html/_static/scripts/furo.js create mode 100644 docs/_build/html/_static/scripts/furo.js.LICENSE.txt create mode 100644 docs/_build/html/_static/scripts/furo.js.map create mode 100644 docs/_build/html/_static/searchtools.js create mode 100644 docs/_build/html/_static/skeleton.css create mode 100644 docs/_build/html/_static/sphinx_highlight.js create mode 100644 docs/_build/html/_static/styles/furo-extensions.css create mode 100644 docs/_build/html/_static/styles/furo-extensions.css.map create mode 100644 docs/_build/html/_static/styles/furo.css create mode 100644 docs/_build/html/_static/styles/furo.css.map create mode 100644 docs/_build/html/api/c2pa/c2pa/index.html create mode 100644 docs/_build/html/api/c2pa/index.html create mode 100644 docs/_build/html/api/index.html create mode 100644 docs/_build/html/genindex.html create mode 100644 docs/_build/html/index.html create mode 100644 docs/_build/html/objects.inv create mode 100644 docs/_build/html/project-contributions.html create mode 100644 docs/_build/html/py-modindex.html create mode 100644 docs/_build/html/release-notes.html create mode 100644 docs/_build/html/search.html create mode 100644 docs/_build/html/searchindex.js create mode 100644 docs/_build/html/usage.html create mode 100644 docs/_static/.gitkeep create mode 100644 docs/api/c2pa/c2pa/index.rst create mode 100644 docs/api/c2pa/index.rst create mode 100644 docs/api/index.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 scripts/generate_api_docs.py diff --git a/Makefile b/Makefile index 02105bff..7802a319 100644 --- a/Makefile +++ b/Makefile @@ -102,4 +102,8 @@ format: # Downloads the required native artifacts for the specified version download-native-artifacts: - python3 scripts/download_artifacts.py $(C2PA_VERSION) \ No newline at end of file + python3 scripts/download_artifacts.py $(C2PA_VERSION) + +# Build API documentation with Sphinx +docs: + python3 scripts/generate_api_docs.py \ No newline at end of file diff --git a/README.md b/README.md index 1fd37e03..8d0dc4fc 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,35 @@ See the [`examples` directory](https://github.com/contentauth/c2pa-python/tree/m - `examples/sign.py` shows how to sign and verify an asset with a C2PA manifest. - `examples/training.py` demonstrates how to add a "Do Not Train" assertion to an asset and verify it. +## API reference documentation + +You can generate API docs with one command. How to use: + +Install dev deps: +``` +cd c2pa-python +python3 -m pip install -r requirements-dev.txt +``` + +Build docs: + +``` +make -C docs +``` + +Output: + +``` +Open docs/build/html/index.html +``` + +This uses `sphinx-autoapi` to parse `src/c2pa` directly, avoiding imports of native libs. +- Entry script: `scripts/generate_api_docs.py` +- Config: `docs/conf.py`; index: `docs/index.rst` + +Sphinx config is in `docs/conf.py`, an `index.rst`, added `scripts/generate_api_docs.py`, updated `requirements-dev.txt` with `Sphinx/AutoAPI/Myst/Furo`, and added a docs Makefile target. + + ## Contributing Contributions are welcome! For more information, see [Contributing to the project](https://github.com/contentauth/c2pa-python/blob/main/docs/project-contributions.md). diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo new file mode 100644 index 00000000..e7a9c94d --- /dev/null +++ b/docs/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file records the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 53282eb9822e647a3645ce7cee2700e3 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/.doctrees/api/c2pa/c2pa/index.doctree b/docs/_build/html/.doctrees/api/c2pa/c2pa/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bfc6655b5a26c1ed43c3e48d7b9445a121970d29 GIT binary patch literal 231790 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/.doctrees/api/c2pa/index.doctree b/docs/_build/html/.doctrees/api/c2pa/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..89b243ab81dd7bd8060bf655213e92f09081576a GIT binary patch literal 180251 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/.doctrees/environment.pickle b/docs/_build/html/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..36f4fc148e9419fced69f65c0b05f74f2c7f31e8 GIT binary patch literal 794166 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 m3 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 KiwX-i!wdphs~AnXSa3Ecs4yDNs`Hg zYG>PtjEj_J#=UdLzqr@#$aWMt*RoJCb#?_BG2yFt{~MgpeMPb)jVC50ESxUX2Wm;^y+v4@5Aq?Kp5x)BOlD& zai|x;e^?^EYmfg~|IatS|LsHx_7UFvF?-C`*x`U34~ijS?*V0Y7XiG7-vNFf;P>#A zE7&8}hx(IJogJ~`)0^Q@ZMc}rB1`66FJHx0fUk^=qVvzH_Wtc6cE>gXeh4ynpm+%F z(ZDteO~%yy>IQZ{SMn!7*^8yu06hSz4qIJC1tpsHGU++vwL2u|Wk|53c9UnZC=%+q z>bY^mUa*(!TlPJ*?UYOtnj40Ifnp>N!Lps_xCXxHr-{6}ujys%0iFpu3J7yna+z*0-=9J;YzK!vJj)P(NFahuyBw?42u;=Ttee z9HK84LxhmhSxD{U^O8?JBYSgv>girh`jE`9S_R)8Rww?Gfn=U1AHs>XMV?%HQQNK$ z%#w^9+1myQrbX}~LX5{q)H3fIMj9eYKr5YqZ{b0^VYlK!`Kl3B2|KWxwIt-Hf3S*!ngtJgF$1OQALbYo=yn?vkXadEH;#s z2CjllQ)h4Vo!uy1h;Z)&3hULfPy(wi0vP$ad5gLk;6p{`?7E}Ku?;p>ASwyo~CeU)WQya z))K^f1LbVCJiTFeeX@Zz*%&MoJmtoHy>n={a+*g-5!A#i4uEZX$q;2a@_Aw3XU63E zX}=G#J}C!`6RE~Xr+u#(9DrtIXo~Qd(8Oupd-Tz#z;jED;wAH5a&7)`Z629RJYOeN zop5SK;SN-TJ~OGnWgSC?NTI|xfVMpVA=7A9xq81x`-d13j@G|RQ^c!9ad;o)n?^p$3J@jquzwC&EvDxB`d91-`V zg~d|hQ?k}8-JF+{dKfAZ+jJ-C3~Msc#L3_7?1;v?}9}EBni~svV3B zC>SvYDzF0WB$h$|SiAxKqV>Fzzr*9-x)&fn#$}`t24FuOl^4$H#)5cbCJrInsKyph UWbCKt^~9I9stWk#T?|kD0*r&}y8r+H literal 0 HcmV?d00001 diff --git a/docs/_build/html/.doctrees/project-contributions.doctree b/docs/_build/html/.doctrees/project-contributions.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d482bf1cdbd39f7d40aa1a88d3aea646335ae66a GIT binary patch literal 17778 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/.doctrees/release-notes.doctree b/docs/_build/html/.doctrees/release-notes.doctree new file mode 100644 index 0000000000000000000000000000000000000000..0e3da52e326d3a862df87e417712c578d87e0766 GIT binary patch literal 19295 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/.doctrees/usage.doctree b/docs/_build/html/.doctrees/usage.doctree new file mode 100644 index 0000000000000000000000000000000000000000..cf1ad2fa54f14dd38b7ffd8e86714d5a9f77dbe0 GIT binary patch literal 26089 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 literal 0 HcmV?d00001 diff --git a/docs/_build/html/_sources/api/c2pa/c2pa/index.rst.txt b/docs/_build/html/_sources/api/c2pa/c2pa/index.rst.txt new file mode 100644 index 00000000..64379d62 --- /dev/null +++ b/docs/_build/html/_sources/api/c2pa/c2pa/index.rst.txt @@ -0,0 +1,718 @@ +c2pa.c2pa +========= + +.. py:module:: c2pa.c2pa + + +Exceptions +---------- + +.. autoapisummary:: + + c2pa.c2pa.C2paError + + +Classes +------- + +.. autoapisummary:: + + c2pa.c2pa.C2paSeekMode + c2pa.c2pa.C2paSigningAlg + c2pa.c2pa.C2paSignerInfo + c2pa.c2pa.Stream + c2pa.c2pa.Reader + c2pa.c2pa.Signer + c2pa.c2pa.Builder + + +Functions +--------- + +.. autoapisummary:: + + c2pa.c2pa.sdk_version + c2pa.c2pa.version + c2pa.c2pa.load_settings + c2pa.c2pa.read_ingredient_file + c2pa.c2pa.read_file + c2pa.c2pa.sign_file + c2pa.c2pa.format_embeddable + + +Module Contents +--------------- + +.. py:class:: C2paSeekMode + + Bases: :py:obj:`enum.IntEnum` + + + Seek mode for stream operations. + + + .. py:attribute:: START + :value: 0 + + + + .. py:attribute:: CURRENT + :value: 1 + + + + .. py:attribute:: END + :value: 2 + + + +.. py:class:: C2paSigningAlg + + Bases: :py:obj:`enum.IntEnum` + + + Supported signing algorithms. + + + .. py:attribute:: ES256 + :value: 0 + + + + .. py:attribute:: ES384 + :value: 1 + + + + .. py:attribute:: ES512 + :value: 2 + + + + .. py:attribute:: PS256 + :value: 3 + + + + .. py:attribute:: PS384 + :value: 4 + + + + .. py:attribute:: PS512 + :value: 5 + + + + .. py:attribute:: ED25519 + :value: 6 + + + +.. py:class:: C2paSignerInfo(alg, sign_cert, private_key, ta_url) + + Bases: :py:obj:`ctypes.Structure` + + + Configuration for a Signer. + + +.. py:exception:: C2paError(message = '') + + Bases: :py:obj:`Exception` + + + Exception raised for C2PA errors. + + + .. py:attribute:: message + :value: '' + + + + .. py:exception:: Assertion + + Bases: :py:obj:`Exception` + + + Exception raised for assertion errors. + + + + .. py:exception:: AssertionNotFound + + Bases: :py:obj:`Exception` + + + Exception raised when an assertion is not found. + + + + .. py:exception:: Decoding + + Bases: :py:obj:`Exception` + + + Exception raised for decoding errors. + + + + .. py:exception:: Encoding + + Bases: :py:obj:`Exception` + + + Exception raised for encoding errors. + + + + .. py:exception:: FileNotFound + + Bases: :py:obj:`Exception` + + + Exception raised when a file is not found. + + + + .. py:exception:: Io + + Bases: :py:obj:`Exception` + + + Exception raised for IO errors. + + + + .. py:exception:: Json + + Bases: :py:obj:`Exception` + + + Exception raised for JSON errors. + + + + .. py:exception:: Manifest + + Bases: :py:obj:`Exception` + + + Exception raised for manifest errors. + + + + .. py:exception:: ManifestNotFound + + Bases: :py:obj:`Exception` + + + Exception raised when a manifest is not found. + + + + .. py:exception:: NotSupported + + Bases: :py:obj:`Exception` + + + Exception raised for unsupported operations. + + + + .. py:exception:: Other + + Bases: :py:obj:`Exception` + + + Exception raised for other errors. + + + + .. py:exception:: RemoteManifest + + Bases: :py:obj:`Exception` + + + Exception raised for remote manifest errors. + + + + .. py:exception:: ResourceNotFound + + Bases: :py:obj:`Exception` + + + Exception raised when a resource is not found. + + + + .. py:exception:: Signature + + Bases: :py:obj:`Exception` + + + Exception raised for signature errors. + + + + .. py:exception:: Verify + + Bases: :py:obj:`Exception` + + + Exception raised for verification errors. + + + +.. py:function:: sdk_version() + + Returns the underlying c2pa-rs/c2pa-c-ffi version string + + +.. py:function:: version() + + Get the C2PA library version. + + +.. py:function:: load_settings(settings, format = 'json') + + Load C2PA settings from a string. + + :param settings: The settings string to load + :param format: The format of the settings string (default: "json") + + :raises C2paError: If there was an error loading the settings + + +.. py:function:: read_ingredient_file(path, data_dir) + + Read a file as C2PA ingredient. + This creates the JSON string that would be used as the ingredient JSON. + + .. deprecated:: 0.11.0 + This function is deprecated and will be removed in a future version. + Please use the Reader class for reading C2PA metadata instead. + Example: + .. code-block:: python + + with Reader(path) as reader: + manifest_json = reader.json() + + To add ingredients to a manifest, please use the Builder class. + Example: + .. code-block:: python + + with open(ingredient_file_path, 'rb') as f: + builder.add_ingredient(ingredient_json, "image/jpeg", f) + + :param path: Path to the file to read + :param data_dir: Directory to write binary resources to + + :returns: The ingredient as a JSON string + + :raises C2paError: If there was an error reading the file + + +.. py:function:: read_file(path, data_dir) + + Read a C2PA manifest from a file. + + .. deprecated:: 0.10.0 + This function is deprecated and will be removed in a future version. + Please use the Reader class for reading C2PA metadata instead. + Example: + .. code-block:: python + + with Reader(path) as reader: + manifest_json = reader.json() + + :param path: Path to the file to read + :param data_dir: Directory to write binary resources to + + :returns: The manifest as a JSON string + + :raises C2paError: If there was an error reading the file + + +.. py:function:: sign_file(source_path: Union[str, pathlib.Path], dest_path: Union[str, pathlib.Path], manifest: str, signer_info: C2paSignerInfo, return_manifest_as_bytes: bool = False) -> Union[str, bytes] + sign_file(source_path: Union[str, pathlib.Path], dest_path: Union[str, pathlib.Path], manifest: str, signer: Signer, return_manifest_as_bytes: bool = False) -> Union[str, bytes] + + Sign a file with a C2PA manifest. + For now, this function is left here to provide a backwards-compatible API. + + .. deprecated:: 0.13.0 + This function is deprecated and will be removed in a future version. + Use :meth:`Builder.sign` instead. + + :param source_path: Path to the source file. We will attempt + to guess the mimetype of the source file based on + the extension. + :param dest_path: Path to write the signed file to + :param manifest: The manifest JSON string + :param signer_or_info: Either a signer configuration or a signer object + :param return_manifest_as_bytes: If True, return manifest bytes instead + :param of JSON string: + + :returns: The signed manifest as a JSON string or bytes, depending + on return_manifest_as_bytes + + :raises C2paError: If there was an error signing the file + :raises C2paError.Encoding: If any of the string inputs contain + invalid UTF-8 characters + :raises C2paError.NotSupported: If the file type cannot be determined + + +.. py:class:: Stream(file_like_stream) + + .. py:method:: close() + + Release the stream resources. + + This method ensures all resources are properly cleaned up, + even if errors occur during cleanup. + Errors during cleanup are logged but not raised to ensure cleanup. + Multiple calls to close() are handled gracefully. + + + + .. py:method:: write_to_target(dest_stream) + + + .. py:property:: closed + :type: bool + + + Check if the stream is closed. + + :returns: True if the stream is closed, False otherwise + :rtype: bool + + + .. py:property:: initialized + :type: bool + + + Check if the stream is properly initialized. + + :returns: True if the stream is initialized, False otherwise + :rtype: bool + + +.. py:class:: Reader(format_or_path, stream = None, manifest_data = None) + + High-level wrapper for C2PA Reader operations. + + + .. py:method:: get_supported_mime_types() + :classmethod: + + + Get the list of supported MIME types for the Reader. + This method retrieves supported MIME types from the native library. + + :returns: List of supported MIME type strings + + :raises C2paError: If there was an error retrieving the MIME types + + + + .. py:method:: close() + + Release the reader resources. + + This method ensures all resources are properly cleaned up, + even if errors occur during cleanup. + Errors during cleanup are logged but not raised to ensure cleanup. + Multiple calls to close() are handled gracefully. + + + + .. py:method:: json() + + Get the manifest store as a JSON string. + + :returns: The manifest store as a JSON string + + :raises C2paError: If there was an error getting the JSON + + + + .. py:method:: resource_to_stream(uri, stream) + + Write a resource to a stream. + + :param uri: The URI of the resource to write + :param stream: The stream to write to (any Python stream-like object) + + :returns: The number of bytes written + + :raises C2paError: If there was an error writing the resource to stream + + + +.. py:class:: Signer(signer_ptr) + + High-level wrapper for C2PA Signer operations. + + + .. py:method:: from_info(signer_info) + :classmethod: + + + Create a new Signer from signer information. + + :param signer_info: The signer configuration + + :returns: A new Signer instance + + :raises C2paError: If there was an error creating the signer + + + + .. py:method:: from_callback(callback, alg, certs, tsa_url = None) + :classmethod: + + + Create a signer from a callback function. + + :param callback: Function that signs data and returns the signature + :param alg: The signing algorithm to use + :param certs: Certificate chain in PEM format + :param tsa_url: Optional RFC 3161 timestamp authority URL + + :returns: A new Signer instance + + :raises C2paError: If there was an error creating the signer + :raises C2paError.Encoding: If the certificate data or TSA URL + contains invalid UTF-8 characters + + + + .. py:method:: close() + + Release the signer resources. + + This method ensures all resources are properly cleaned up, + even if errors occur during cleanup. + + .. note:: + + Multiple calls to close() are handled gracefully. + Errors during cleanup are logged but not raised + to ensure cleanup. + + + + .. py:method:: reserve_size() + + Get the size to reserve for signatures from this signer. + + :returns: The size to reserve in bytes + + :raises C2paError: If there was an error getting the size + + + +.. py:class:: Builder(manifest_json) + + High-level wrapper for C2PA Builder operations. + + + .. py:method:: get_supported_mime_types() + :classmethod: + + + Get the list of supported MIME types for the Builder. + This method retrieves supported MIME types from the native library. + + :returns: List of supported MIME type strings + + :raises C2paError: If there was an error retrieving the MIME types + + + + .. py:method:: from_json(manifest_json) + :classmethod: + + + Create a new Builder from a JSON manifest. + + :param manifest_json: The JSON manifest definition + + :returns: A new Builder instance + + :raises C2paError: If there was an error creating the builder + + + + .. py:method:: from_archive(stream) + :classmethod: + + + Create a new Builder from an archive stream. + + :param stream: The stream containing the archive + (any Python stream-like object) + + :returns: A new Builder instance + + :raises C2paError: If there was an error creating the builder from archive + + + + .. py:method:: close() + + Release the builder resources. + + This method ensures all resources are properly cleaned up, + even if errors occur during cleanup. + Errors during cleanup are logged but not raised to ensure cleanup. + Multiple calls to close() are handled gracefully. + + + + .. py:method:: set_no_embed() + + Set the no-embed flag. + + When set, the builder will not embed a C2PA manifest store + into the asset when signing. + This is useful when creating cloud or sidecar manifests. + + + + .. py:method:: set_remote_url(remote_url) + + Set the remote URL. + + When set, the builder embeds a remote URL into the asset when signing. + This is useful when creating cloud based Manifests. + + :param remote_url: The remote URL to set + + :raises C2paError: If there was an error setting the remote URL + + + + .. py:method:: add_resource(uri, stream) + + Add a resource to the builder. + + :param uri: The URI to identify the resource + :param stream: The stream containing the resource data + (any Python stream-like object) + + :raises C2paError: If there was an error adding the resource + + + + .. py:method:: add_ingredient(ingredient_json, format, source) + + Add an ingredient to the builder (facade method). + The added ingredient's source should be a stream-like object + (for instance, a file opened as stream). + + :param ingredient_json: The JSON ingredient definition + :param format: The MIME type or extension of the ingredient + :param source: The stream containing the ingredient data + (any Python stream-like object) + + :raises C2paError: If there was an error adding the ingredient + :raises C2paError.Encoding: If the ingredient JSON contains + invalid UTF-8 characters + + + + .. py:method:: add_ingredient_from_stream(ingredient_json, format, source) + + Add an ingredient from a stream to the builder. + Explicitly named API requiring a stream as input parameter. + + :param ingredient_json: The JSON ingredient definition + :param format: The MIME type or extension of the ingredient + :param source: The stream containing the ingredient data + (any Python stream-like object) + + :raises C2paError: If there was an error adding the ingredient + :raises C2paError.Encoding: If the ingredient JSON or format + contains invalid UTF-8 characters + + + + .. py:method:: add_ingredient_from_file_path(ingredient_json, format, filepath) + + Add an ingredient from a file path to the builder. + This is a legacy method. + + .. deprecated:: 0.13.0 + This method is deprecated and will be removed in a future version. + Use :meth:`add_ingredient` with a file stream instead. + + :param ingredient_json: The JSON ingredient definition + :param format: The MIME type or extension of the ingredient + :param filepath: The path to the file containing the ingredient data + (can be a string or Path object) + + :raises C2paError: If there was an error adding the ingredient + :raises C2paError.Encoding: If the ingredient JSON or format + contains invalid UTF-8 characters + :raises FileNotFoundError: If the file at the specified path does not exist + + + + .. py:method:: to_archive(stream) + + Write an archive of the builder to a stream. + + :param stream: The stream to write the archive to + (any Python stream-like object) + + :raises C2paError: If there was an error writing the archive + + + + .. py:method:: sign(signer, format, source, dest = None) + + Sign the builder's content and write to a destination stream. + + :param format: The MIME type or extension of the content + :param source: The source stream (any Python stream-like object) + :param dest: The destination stream (any Python stream-like object), + opened in w+b (write+read binary) mode. + :param signer: The signer to use + + :returns: Manifest bytes + + :raises C2paError: If there was an error during signing + + + + .. py:method:: sign_file(source_path, dest_path, signer) + + Sign a file and write the signed data to an output file. + + :param source_path: Path to the source file. We will attempt + to guess the mimetype of the source file based on + the extension. + :param dest_path: Path to write the signed file to + :param signer: The signer to use + + :returns: Manifest bytes + + :raises C2paError: If there was an error during signing + + + +.. py:function:: format_embeddable(format, manifest_bytes) + + Convert a binary C2PA manifest into an embeddable version. + + :param format: The MIME type or extension of the target format + :param manifest_bytes: The raw manifest bytes + + :returns: A tuple of (size of result bytes, embeddable manifest bytes) + + :raises C2paError: If there was an error converting the manifest + + diff --git a/docs/_build/html/_sources/api/c2pa/index.rst.txt b/docs/_build/html/_sources/api/c2pa/index.rst.txt new file mode 100644 index 00000000..c87f6bc8 --- /dev/null +++ b/docs/_build/html/_sources/api/c2pa/index.rst.txt @@ -0,0 +1,624 @@ +c2pa +==== + +.. py:module:: c2pa + + +Submodules +---------- + +.. toctree:: + :maxdepth: 1 + + /api/c2pa/build/index + /api/c2pa/c2pa/index + /api/c2pa/lib/index + + +Exceptions +---------- + +.. autoapisummary:: + + c2pa.C2paError + + +Classes +------- + +.. autoapisummary:: + + c2pa.Builder + c2pa.Reader + c2pa.C2paSigningAlg + c2pa.C2paSignerInfo + c2pa.Signer + c2pa.Stream + + +Functions +--------- + +.. autoapisummary:: + + c2pa.sdk_version + c2pa.read_ingredient_file + + +Package Contents +---------------- + +.. py:class:: Builder(manifest_json) + + High-level wrapper for C2PA Builder operations. + + + .. py:method:: get_supported_mime_types() + :classmethod: + + + Get the list of supported MIME types for the Builder. + This method retrieves supported MIME types from the native library. + + :returns: List of supported MIME type strings + + :raises C2paError: If there was an error retrieving the MIME types + + + + .. py:method:: from_json(manifest_json) + :classmethod: + + + Create a new Builder from a JSON manifest. + + :param manifest_json: The JSON manifest definition + + :returns: A new Builder instance + + :raises C2paError: If there was an error creating the builder + + + + .. py:method:: from_archive(stream) + :classmethod: + + + Create a new Builder from an archive stream. + + :param stream: The stream containing the archive + (any Python stream-like object) + + :returns: A new Builder instance + + :raises C2paError: If there was an error creating the builder from archive + + + + .. py:method:: close() + + Release the builder resources. + + This method ensures all resources are properly cleaned up, + even if errors occur during cleanup. + Errors during cleanup are logged but not raised to ensure cleanup. + Multiple calls to close() are handled gracefully. + + + + .. py:method:: set_no_embed() + + Set the no-embed flag. + + When set, the builder will not embed a C2PA manifest store + into the asset when signing. + This is useful when creating cloud or sidecar manifests. + + + + .. py:method:: set_remote_url(remote_url) + + Set the remote URL. + + When set, the builder embeds a remote URL into the asset when signing. + This is useful when creating cloud based Manifests. + + :param remote_url: The remote URL to set + + :raises C2paError: If there was an error setting the remote URL + + + + .. py:method:: add_resource(uri, stream) + + Add a resource to the builder. + + :param uri: The URI to identify the resource + :param stream: The stream containing the resource data + (any Python stream-like object) + + :raises C2paError: If there was an error adding the resource + + + + .. py:method:: add_ingredient(ingredient_json, format, source) + + Add an ingredient to the builder (facade method). + The added ingredient's source should be a stream-like object + (for instance, a file opened as stream). + + :param ingredient_json: The JSON ingredient definition + :param format: The MIME type or extension of the ingredient + :param source: The stream containing the ingredient data + (any Python stream-like object) + + :raises C2paError: If there was an error adding the ingredient + :raises C2paError.Encoding: If the ingredient JSON contains + invalid UTF-8 characters + + + + .. py:method:: add_ingredient_from_stream(ingredient_json, format, source) + + Add an ingredient from a stream to the builder. + Explicitly named API requiring a stream as input parameter. + + :param ingredient_json: The JSON ingredient definition + :param format: The MIME type or extension of the ingredient + :param source: The stream containing the ingredient data + (any Python stream-like object) + + :raises C2paError: If there was an error adding the ingredient + :raises C2paError.Encoding: If the ingredient JSON or format + contains invalid UTF-8 characters + + + + .. py:method:: add_ingredient_from_file_path(ingredient_json, format, filepath) + + Add an ingredient from a file path to the builder. + This is a legacy method. + + .. deprecated:: 0.13.0 + This method is deprecated and will be removed in a future version. + Use :meth:`add_ingredient` with a file stream instead. + + :param ingredient_json: The JSON ingredient definition + :param format: The MIME type or extension of the ingredient + :param filepath: The path to the file containing the ingredient data + (can be a string or Path object) + + :raises C2paError: If there was an error adding the ingredient + :raises C2paError.Encoding: If the ingredient JSON or format + contains invalid UTF-8 characters + :raises FileNotFoundError: If the file at the specified path does not exist + + + + .. py:method:: to_archive(stream) + + Write an archive of the builder to a stream. + + :param stream: The stream to write the archive to + (any Python stream-like object) + + :raises C2paError: If there was an error writing the archive + + + + .. py:method:: sign(signer, format, source, dest = None) + + Sign the builder's content and write to a destination stream. + + :param format: The MIME type or extension of the content + :param source: The source stream (any Python stream-like object) + :param dest: The destination stream (any Python stream-like object), + opened in w+b (write+read binary) mode. + :param signer: The signer to use + + :returns: Manifest bytes + + :raises C2paError: If there was an error during signing + + + + .. py:method:: sign_file(source_path, dest_path, signer) + + Sign a file and write the signed data to an output file. + + :param source_path: Path to the source file. We will attempt + to guess the mimetype of the source file based on + the extension. + :param dest_path: Path to write the signed file to + :param signer: The signer to use + + :returns: Manifest bytes + + :raises C2paError: If there was an error during signing + + + +.. py:exception:: C2paError(message = '') + + Bases: :py:obj:`Exception` + + + Exception raised for C2PA errors. + + + .. py:attribute:: message + :value: '' + + + + .. py:exception:: Assertion + + Bases: :py:obj:`Exception` + + + Exception raised for assertion errors. + + + + .. py:exception:: AssertionNotFound + + Bases: :py:obj:`Exception` + + + Exception raised when an assertion is not found. + + + + .. py:exception:: Decoding + + Bases: :py:obj:`Exception` + + + Exception raised for decoding errors. + + + + .. py:exception:: Encoding + + Bases: :py:obj:`Exception` + + + Exception raised for encoding errors. + + + + .. py:exception:: FileNotFound + + Bases: :py:obj:`Exception` + + + Exception raised when a file is not found. + + + + .. py:exception:: Io + + Bases: :py:obj:`Exception` + + + Exception raised for IO errors. + + + + .. py:exception:: Json + + Bases: :py:obj:`Exception` + + + Exception raised for JSON errors. + + + + .. py:exception:: Manifest + + Bases: :py:obj:`Exception` + + + Exception raised for manifest errors. + + + + .. py:exception:: ManifestNotFound + + Bases: :py:obj:`Exception` + + + Exception raised when a manifest is not found. + + + + .. py:exception:: NotSupported + + Bases: :py:obj:`Exception` + + + Exception raised for unsupported operations. + + + + .. py:exception:: Other + + Bases: :py:obj:`Exception` + + + Exception raised for other errors. + + + + .. py:exception:: RemoteManifest + + Bases: :py:obj:`Exception` + + + Exception raised for remote manifest errors. + + + + .. py:exception:: ResourceNotFound + + Bases: :py:obj:`Exception` + + + Exception raised when a resource is not found. + + + + .. py:exception:: Signature + + Bases: :py:obj:`Exception` + + + Exception raised for signature errors. + + + + .. py:exception:: Verify + + Bases: :py:obj:`Exception` + + + Exception raised for verification errors. + + + +.. py:class:: Reader(format_or_path, stream = None, manifest_data = None) + + High-level wrapper for C2PA Reader operations. + + + .. py:method:: get_supported_mime_types() + :classmethod: + + + Get the list of supported MIME types for the Reader. + This method retrieves supported MIME types from the native library. + + :returns: List of supported MIME type strings + + :raises C2paError: If there was an error retrieving the MIME types + + + + .. py:method:: close() + + Release the reader resources. + + This method ensures all resources are properly cleaned up, + even if errors occur during cleanup. + Errors during cleanup are logged but not raised to ensure cleanup. + Multiple calls to close() are handled gracefully. + + + + .. py:method:: json() + + Get the manifest store as a JSON string. + + :returns: The manifest store as a JSON string + + :raises C2paError: If there was an error getting the JSON + + + + .. py:method:: resource_to_stream(uri, stream) + + Write a resource to a stream. + + :param uri: The URI of the resource to write + :param stream: The stream to write to (any Python stream-like object) + + :returns: The number of bytes written + + :raises C2paError: If there was an error writing the resource to stream + + + +.. py:class:: C2paSigningAlg + + Bases: :py:obj:`enum.IntEnum` + + + Supported signing algorithms. + + + .. py:attribute:: ES256 + :value: 0 + + + + .. py:attribute:: ES384 + :value: 1 + + + + .. py:attribute:: ES512 + :value: 2 + + + + .. py:attribute:: PS256 + :value: 3 + + + + .. py:attribute:: PS384 + :value: 4 + + + + .. py:attribute:: PS512 + :value: 5 + + + + .. py:attribute:: ED25519 + :value: 6 + + + +.. py:class:: C2paSignerInfo(alg, sign_cert, private_key, ta_url) + + Bases: :py:obj:`ctypes.Structure` + + + Configuration for a Signer. + + +.. py:class:: Signer(signer_ptr) + + High-level wrapper for C2PA Signer operations. + + + .. py:method:: from_info(signer_info) + :classmethod: + + + Create a new Signer from signer information. + + :param signer_info: The signer configuration + + :returns: A new Signer instance + + :raises C2paError: If there was an error creating the signer + + + + .. py:method:: from_callback(callback, alg, certs, tsa_url = None) + :classmethod: + + + Create a signer from a callback function. + + :param callback: Function that signs data and returns the signature + :param alg: The signing algorithm to use + :param certs: Certificate chain in PEM format + :param tsa_url: Optional RFC 3161 timestamp authority URL + + :returns: A new Signer instance + + :raises C2paError: If there was an error creating the signer + :raises C2paError.Encoding: If the certificate data or TSA URL + contains invalid UTF-8 characters + + + + .. py:method:: close() + + Release the signer resources. + + This method ensures all resources are properly cleaned up, + even if errors occur during cleanup. + + .. note:: + + Multiple calls to close() are handled gracefully. + Errors during cleanup are logged but not raised + to ensure cleanup. + + + + .. py:method:: reserve_size() + + Get the size to reserve for signatures from this signer. + + :returns: The size to reserve in bytes + + :raises C2paError: If there was an error getting the size + + + +.. py:class:: Stream(file_like_stream) + + .. py:method:: close() + + Release the stream resources. + + This method ensures all resources are properly cleaned up, + even if errors occur during cleanup. + Errors during cleanup are logged but not raised to ensure cleanup. + Multiple calls to close() are handled gracefully. + + + + .. py:method:: write_to_target(dest_stream) + + + .. py:property:: closed + :type: bool + + + Check if the stream is closed. + + :returns: True if the stream is closed, False otherwise + :rtype: bool + + + .. py:property:: initialized + :type: bool + + + Check if the stream is properly initialized. + + :returns: True if the stream is initialized, False otherwise + :rtype: bool + + +.. py:function:: sdk_version() + + Returns the underlying c2pa-rs/c2pa-c-ffi version string + + +.. py:function:: read_ingredient_file(path, data_dir) + + Read a file as C2PA ingredient. + This creates the JSON string that would be used as the ingredient JSON. + + .. deprecated:: 0.11.0 + This function is deprecated and will be removed in a future version. + Please use the Reader class for reading C2PA metadata instead. + Example: + .. code-block:: python + + with Reader(path) as reader: + manifest_json = reader.json() + + To add ingredients to a manifest, please use the Builder class. + Example: + .. code-block:: python + + with open(ingredient_file_path, 'rb') as f: + builder.add_ingredient(ingredient_json, "image/jpeg", f) + + :param path: Path to the file to read + :param data_dir: Directory to write binary resources to + + :returns: The ingredient as a JSON string + + :raises C2paError: If there was an error reading the file + + diff --git a/docs/_build/html/_sources/api/index.rst.txt b/docs/_build/html/_sources/api/index.rst.txt new file mode 100644 index 00000000..352c491d --- /dev/null +++ b/docs/_build/html/_sources/api/index.rst.txt @@ -0,0 +1,11 @@ +API Reference +============= + +This page contains auto-generated API reference documentation [#f1]_. + +.. toctree:: + :titlesonly: + + /api/c2pa/index + +.. [#f1] Created with `sphinx-autoapi `_ \ No newline at end of file diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt new file mode 100644 index 00000000..747c4701 --- /dev/null +++ b/docs/_build/html/_sources/index.rst.txt @@ -0,0 +1,15 @@ +.. c2pa-python documentation master file + +Welcome to c2pa-python's documentation! +======================================= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + usage + project-contributions + release-notes + api/index + + diff --git a/docs/_build/html/_sources/project-contributions.md.txt b/docs/_build/html/_sources/project-contributions.md.txt new file mode 100644 index 00000000..fbe472d8 --- /dev/null +++ b/docs/_build/html/_sources/project-contributions.md.txt @@ -0,0 +1,129 @@ +# Contributing to the project + +The information in this page is primarily for those who wish to contribute to the c2pa-python library project itself, rather than those who simply wish to use it in an application. For general contribution guidelines, see [CONTRIBUTING.md](../CONTRIBUTING.md). + +## Setup + +It is best to [set up a virtual environment](https://virtualenv.pypa.io/en/latest/installation.html) for development and testing: + +```bash +python -m venv .venv +``` + +Activate the virtual environment. + +- On Windows: + ```bash + .venv\Scripts\activate + ``` +- On macOS/Linux: + ```bash + source .venv/bin/activate + ``` + +Load project dependencies: + +```bash +pip install -r requirements.txt +pip install -r requirements-dev.txt +``` + +Download library artifacts for the current version you want, (for example, as shown below for v0.55.0): + +```bash +python scripts/download_artifacts.py c2pa-v0.55.0 +``` + +Install the package in development mode: + +```bash +pip install -e . +``` + +This command: + +- Copies the appropriate libraries for your platform from `artifacts/` to `src/c2pa/libs/` +- Installs the package in development mode, so you can make changes to the Python code without reinstalling. + +## Building wheels + +Build the wheel for your platform (from the root of the repository): + +```bash +source .venv/bin/activate +pip install -r requirements.txt +python3 -m pip install build +pip install -U pytest + +python3 -m build --wheel +``` + +To test local wheels locally, enter this command: + +```bash +make test-local-wheel-build +``` + +To verify the builds, enter this command: + +```bash +make verify-wheel-build +``` + +## Project structure + +```bash +. +β”œβ”€β”€ .github/ # GitHub configuration files +β”œβ”€β”€ artifacts/ # Platform-specific libraries for building (per subfolder) +β”‚ └── your_target_platform/ # Platform-specific artifacts +β”œβ”€β”€ docs/ # Project documentation +β”œβ”€β”€ examples/ # Example scripts demonstrating usage +β”œβ”€β”€ scripts/ # Utility scripts (eg. artifacts download) +β”œβ”€β”€ src/ # Source code +β”‚ └── c2pa/ # Main package directory +β”‚ └── libs/ # Platform-specific libraries +β”œβ”€β”€ tests/ # Unit tests and benchmarks +β”œβ”€β”€ .gitignore # Git ignore rules +β”œβ”€β”€ Makefile # Build and development commands +β”œβ”€β”€ pyproject.toml # Python project configuration +β”œβ”€β”€ requirements.txt # Python dependencies +β”œβ”€β”€ requirements-dev.txt # Development dependencies +└── setup.py # Package setup script +``` + +## Testing + +The project uses [PyTest](https://docs.pytest.org/) and [unittest](https://docs.python.org/3/library/unittest.html) for testing. + +Run tests by following these steps: + +1. Activate the virtual environment: `source .venv/bin/activate` +2. (optional) Install dependencies: `pip install -r requirements.txt` +4. Run the tests: + ```bash + make test + ``` +5. Alternatively, install `pytest` (if not already installed) and run it: + ```bash + pip install pytest + pytest + ``` + **Warning**: Using `pytest` can lead to issues if you often switch between virtual environments. + +### Testing during bindings development + +While developing bindings locally, we use [unittest](https://docs.python.org/3/library/unittest.html), since [PyTest](https://docs.pytest.org/) can get confused by virtual environment re-deployments (especially if you bump the version number). + +To run tests while developing bindings, enter this command: + +```sh +make test +``` + +To rebuild and test, enter these commands: + +```sh +make build-python +make test +``` diff --git a/docs/_build/html/_sources/release-notes.md.txt b/docs/_build/html/_sources/release-notes.md.txt new file mode 100644 index 00000000..24c4048a --- /dev/null +++ b/docs/_build/html/_sources/release-notes.md.txt @@ -0,0 +1,56 @@ +# Release notes + +## Version 0.6.0 + + + +See [Release tag 0.6.0](https://github.com/contentauth/c2pa-python/releases/tag/v0.6.0). + +### Breaking changes + +The signature of the `c2pa.sign_ps256()` method changed. Previously, the argument was a file path but now its the PEM certificate string. + +## Version 0.5.2 + +New features: + +- Allow EC signatures in DER format from signers and verify signature format during validation. +- Fix bug in signing audio and video files in ISO Base Media File Format (BMFF). +- Add the ability to verify PDF files (but not to sign them). +- Increase speed of `sign_file` by 2x or more, when using file paths (uses native Rust file I/O). +- Fixes for RIFF and GIF formats. + +## Version 0.5.0 + +New features in this release: + +- Rewrites the API to be stream-based using a Builder / Reader model. +- The functions now support throwing `c2pa.Error` values, caught with `try`/`except`. +- Instead of `c2pa.read_file` you now call `c2pa_api.Reader.from_file` and `reader.json`. +- Read thumbnails and other resources use `reader.resource_to_stream` or `reader.resource.to_file`. +- Instead of `c2pa.sign_file` use `c2pa_api.Builder.from_json` and `builder.sign` or `builder.sign_file`. +- Add thumbnails or other resources with `builder.add_resource` or `builder.add_resource_file`. +- Add Ingredients with `builder.add_ingredient` or `builder.add_ingredient_file`. +- You can archive a `Builder` using `builder.to_archive` and reconstruct it with `builder.from_archive`. +- Signers can be constructed with `c2pa_api.create_signer`. +- The signer now requires a signing function to keep private keys private. +- Example signing functions are provided in c2pa_api.py + +## Version 0.4.0 + +This release: + +- Changes the name of the import from `c2pa-python` to `c2pa`. +- Supports pre-built platform wheels for macOS, Windows and [manylinux](https://github.com/pypa/manylinux). + +## Version 0.3.0 + +This release includes some breaking changes to align with future APIs: + +- `C2paSignerInfo` moves the `alg` to the first parameter from the 3rd. +- `c2pa.verify_from_file_json` is now `c2pa.read_file`. +- `c2pa.ingredient_from_file_json` is now `c2pa.read_ingredient_file`. +- `c2pa.add_manifest_to_file_json` is now `c2pa.sign_file`. +- There are many more specific errors types now, and Error messages always start with the name of the error i.e (str(err.value).startswith("ManifestNotFound")). +- The ingredient thumbnail identifier may be jumbf uri reference if a valid thumb already exists in the active manifest. +- Extracted file paths for read_file now use a folder structure and different naming conventions. diff --git a/docs/_build/html/_sources/usage.md.txt b/docs/_build/html/_sources/usage.md.txt new file mode 100644 index 00000000..aeec23a4 --- /dev/null +++ b/docs/_build/html/_sources/usage.md.txt @@ -0,0 +1,196 @@ +# Using the Python library + +This package works with media files in the [supported formats](https://github.com/contentauth/c2pa-rs/blob/main/docs/supported-formats.md). + +For complete working examples, see the [examples folder](https://github.com/contentauth/c2pa-python/tree/main/examples) in the repository. + +## Import + +Import the objects needed from the API: + +```py +from c2pa import Builder, Reader, Signer, C2paSigningAlg, C2paSignerInfo +``` + +You can use both `Builder`, `Reader` and `Signer` classes with context managers by using a `with` statement. +Doing this is recommended to ensure proper resource and memory cleanup. + +## Define manifest JSON + +The Python library works with both file-based and stream-based operations. +In both cases, the manifest JSON string defines the C2PA manifest to add to an asset. For example: + +```py +manifest_json = json.dumps({ + "claim_generator": "python_test/0.1", + "assertions": [ + { + "label": "cawg.training-mining", + "data": { + "entries": { + "cawg.ai_inference": { + "use": "notAllowed" + }, + "cawg.ai_generative_training": { + "use": "notAllowed" + } + } + } + } + ] + }) +``` + +## File-based operation + +### Read and validate C2PA data + +Use the `Reader` to read C2PA data from the specified asset file. + +This examines the specified media file for C2PA data and generates a report of any data it finds. If there are validation errors, the report includes a `validation_status` field. + +An asset file may contain many manifests in a manifest store. The most recent manifest is identified by the value of the `active_manifest` field in the manifests map. The manifests may contain binary resources such as thumbnails which can be retrieved with `resource_to_stream` using the associated `identifier` field values and a `uri`. + +NOTE: For a comprehensive reference to the JSON manifest structure, see the [Manifest store reference](https://opensource.contentauthenticity.org/docs/manifest/manifest-ref). + +```py +try: + # Create a reader from a file path + with Reader("path/to/media_file.jpg") as reader: + # Print manifest store as JSON + print("Manifest store:", reader.json()) + + # Get the active manifest. + manifest = json.loads(reader.json()) + active_manifest = manifest["manifests"][manifest["active_manifest"]] + if active_manifest: + # Get the uri to the manifest's thumbnail and write it to a file + uri = active_manifest["thumbnail"]["identifier"] + with open("thumbnail_v2.jpg", "wb") as f: + reader.resource_to_stream(uri, f) + +except Exception as err: + print(err) +``` + +### Add a signed manifest + +**WARNING**: This example accesses the private key and security certificate directly from the local file system. This is fine during development, but doing so in production may be insecure. Instead use a Key Management Service (KMS) or a hardware security module (HSM) to access the certificate and key; for example as show in the [C2PA Python Example](https://github.com/contentauth/c2pa-python-example). + +Use a `Builder` to add a manifest to an asset: + +```py +try: + # Create a signer from certificate and key files + with open("path/to/cert.pem", "rb") as cert_file, open("path/to/key.pem", "rb") as key_file: + cert_data = cert_file.read() + key_data = key_file.read() + + # Create signer info using cert and key info + signer_info = C2paSignerInfo( + alg=C2paSigningAlg.PS256, + cert=cert_data, + key=key_data, + timestamp_url="http://timestamp.digicert.com" + ) + + # Create signer using the defined SignerInfo + signer = Signer.from_info(signer_info) + + # Create builder with manifest and add ingredients + with Builder(manifest_json) as builder: + # Add any ingredients if needed + with open("path/to/ingredient.jpg", "rb") as ingredient_file: + ingredient_json = json.dumps({"title": "Ingredient Image"}) + builder.add_ingredient(ingredient_json, "image/jpeg", ingredient_file) + + # Sign the file + with open("path/to/source.jpg", "rb") as source_file, open("path/to/output.jpg", "wb") as dest_file: + manifest_bytes = builder.sign(signer, "image/jpeg", source_file, dest_file) + + # Verify the signed file by reading data from the signed output file + with Reader("path/to/output.jpg") as reader: + manifest_store = json.loads(reader.json()) + active_manifest = manifest_store["manifests"][manifest_store["active_manifest"]] + print("Signed manifest:", active_manifest) + +except Exception as e: + print("Failed to sign manifest store: " + str(e)) +``` + +## Stream-based operation + +Instead of working with files, you can read, validate, and add a signed manifest to streamed data. This example is similar to what the file-based example does. + +### Read and validate C2PA data using streams + +```py +try: + # Create a reader from a format and stream + with open("path/to/media_file.jpg", "rb") as stream: + # First parameter should be the type of the file (here, we use the mimetype) + # But in any case we need something to identify the file type + with Reader("image/jpeg", stream) as reader: + # Print manifest store as JSON, as extracted by the Reader + print("manifest store:", reader.json()) + + # Get the active manifest + manifest = json.loads(reader.json()) + active_manifest = manifest["manifests"][manifest["active_manifest"]] + if active_manifest: + # get the uri to the manifest's thumbnail and write it to a file + uri = active_manifest["thumbnail"]["identifier"] + with open("thumbnail_v2.jpg", "wb") as f: + reader.resource_to_stream(uri, f) + +except Exception as err: + print(err) +``` + +### Add a signed manifest to a stream + +**WARNING**: This example accesses the private key and security certificate directly from the local file system. This is fine during development, but doing so in production may be insecure. Instead use a Key Management Service (KMS) or a hardware security module (HSM) to access the certificate and key; for example as show in the [C2PA Python Example](https://github.com/contentauth/c2pa-python-example). + +Use a `Builder` to add a manifest to an asset: + +```py +try: + # Create a signer from certificate and key files + with open("path/to/cert.pem", "rb") as cert_file, open("path/to/key.pem", "rb") as key_file: + cert_data = cert_file.read() + key_data = key_file.read() + + # Create signer info using the read certificate and key data + signer_info = C2paSignerInfo( + alg=C2paSigningAlg.PS256, + cert=cert_data, + key=key_data, + timestamp_url="http://timestamp.digicert.com" + ) + + # Create a Signer using the SignerInfo defined previously + signer = Signer.from_info(signer_info) + + # Create a Builder with manifest and add ingredients + with Builder(manifest_json) as builder: + # Add any ingredients as needed + with open("path/to/ingredient.jpg", "rb") as ingredient_file: + ingredient_json = json.dumps({"title": "Ingredient Image"}) + # Here the ingredient is added using streams + builder.add_ingredient(ingredient_json, "image/jpeg", ingredient_file) + + # Sign using streams + with open("path/to/source.jpg", "rb") as source_file, open("path/to/output.jpg", "wb") as dest_file: + manifest_bytes = builder.sign(signer, "image/jpeg", source_file, dest_file) + + # Verify the signed file + with open("path/to/output.jpg", "rb") as stream: + # Create a Reader to read data + with Reader("image/jpeg", stream) as reader: + manifest_store = json.loads(reader.json()) + active_manifest = manifest_store["manifests"][manifest_store["active_manifest"]] + print("Signed manifest:", active_manifest) + +except Exception as e: + print("Failed to sign manifest store: " + str(e)) +``` diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css new file mode 100644 index 00000000..7ebbd6d0 --- /dev/null +++ b/docs/_build/html/_static/basic.css @@ -0,0 +1,914 @@ +/* + * Sphinx stylesheet -- basic theme. + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin-top: 10px; +} + +ul.search li { + padding: 5px 0; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_build/html/_static/debug.css b/docs/_build/html/_static/debug.css new file mode 100644 index 00000000..74d4aec3 --- /dev/null +++ b/docs/_build/html/_static/debug.css @@ -0,0 +1,69 @@ +/* + This CSS file should be overridden by the theme authors. It's + meant for debugging and developing the skeleton that this theme provides. +*/ +body { + font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji"; + background: lavender; +} +.sb-announcement { + background: rgb(131, 131, 131); +} +.sb-announcement__inner { + background: black; + color: white; +} +.sb-header { + background: lightskyblue; +} +.sb-header__inner { + background: royalblue; + color: white; +} +.sb-header-secondary { + background: lightcyan; +} +.sb-header-secondary__inner { + background: cornflowerblue; + color: white; +} +.sb-sidebar-primary { + background: lightgreen; +} +.sb-main { + background: blanchedalmond; +} +.sb-main__inner { + background: antiquewhite; +} +.sb-header-article { + background: lightsteelblue; +} +.sb-article-container { + background: snow; +} +.sb-article-main { + background: white; +} +.sb-footer-article { + background: lightpink; +} +.sb-sidebar-secondary { + background: lightgoldenrodyellow; +} +.sb-footer-content { + background: plum; +} +.sb-footer-content__inner { + background: palevioletred; +} +.sb-footer { + background: pink; +} +.sb-footer__inner { + background: salmon; +} +.sb-article { + background: white; +} diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js new file mode 100644 index 00000000..0398ebb9 --- /dev/null +++ b/docs/_build/html/_static/doctools.js @@ -0,0 +1,149 @@ +/* + * Base JavaScript utilities for all Sphinx HTML documentation. + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js new file mode 100644 index 00000000..7e4c114f --- /dev/null +++ b/docs/_build/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/graphviz.css b/docs/_build/html/_static/graphviz.css new file mode 100644 index 00000000..30f3837b --- /dev/null +++ b/docs/_build/html/_static/graphviz.css @@ -0,0 +1,12 @@ +/* + * Sphinx stylesheet -- graphviz extension. + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/docs/_build/html/_static/language_data.js b/docs/_build/html/_static/language_data.js new file mode 100644 index 00000000..c7fe6c6f --- /dev/null +++ b/docs/_build/html/_static/language_data.js @@ -0,0 +1,192 @@ +/* + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/plus.png b/docs/_build/html/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css new file mode 100644 index 00000000..3082ee7c --- /dev/null +++ b/docs/_build/html/_static/pygments.css @@ -0,0 +1,232 @@ +.highlight pre { line-height: 125%; } +.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #fdf2e2 } +.highlight { background: #f2f2f2; color: #1E1E1E } +.highlight .c { color: #515151 } /* Comment */ +.highlight .err { color: #D71835 } /* Error */ +.highlight .k { color: #8045E5 } /* Keyword */ +.highlight .l { color: #7F4707 } /* Literal */ +.highlight .n { color: #1E1E1E } /* Name */ +.highlight .o { color: #163 } /* Operator */ +.highlight .p { color: #1E1E1E } /* Punctuation */ +.highlight .ch { color: #515151 } /* Comment.Hashbang */ +.highlight .cm { color: #515151 } /* Comment.Multiline */ +.highlight .cp { color: #515151 } /* Comment.Preproc */ +.highlight .cpf { color: #515151 } /* Comment.PreprocFile */ +.highlight .c1 { color: #515151 } /* Comment.Single */ +.highlight .cs { color: #515151 } /* Comment.Special */ +.highlight .gd { color: #00749C } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .gh { color: #00749C } /* Generic.Heading */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #00749C } /* Generic.Subheading */ +.highlight .kc { color: #8045E5 } /* Keyword.Constant */ +.highlight .kd { color: #8045E5 } /* Keyword.Declaration */ +.highlight .kn { color: #8045E5 } /* Keyword.Namespace */ +.highlight .kp { color: #8045E5 } /* Keyword.Pseudo */ +.highlight .kr { color: #8045E5 } /* Keyword.Reserved */ +.highlight .kt { color: #7F4707 } /* Keyword.Type */ +.highlight .ld { color: #7F4707 } /* Literal.Date */ +.highlight .m { color: #7F4707 } /* Literal.Number */ +.highlight .s { color: #163 } /* Literal.String */ +.highlight .na { color: #7F4707 } /* Name.Attribute */ +.highlight .nb { color: #7F4707 } /* Name.Builtin */ +.highlight .nc { color: #00749C } /* Name.Class */ +.highlight .no { color: #00749C } /* Name.Constant */ +.highlight .nd { color: #7F4707 } /* Name.Decorator */ +.highlight .ni { color: #163 } /* Name.Entity */ +.highlight .ne { color: #8045E5 } /* Name.Exception */ +.highlight .nf { color: #00749C } /* Name.Function */ +.highlight .nl { color: #7F4707 } /* Name.Label */ +.highlight .nn { color: #1E1E1E } /* Name.Namespace */ +.highlight .nx { color: #1E1E1E } /* Name.Other */ +.highlight .py { color: #00749C } /* Name.Property */ +.highlight .nt { color: #00749C } /* Name.Tag */ +.highlight .nv { color: #D71835 } /* Name.Variable */ +.highlight .ow { color: #8045E5 } /* Operator.Word */ +.highlight .pm { color: #1E1E1E } /* Punctuation.Marker */ +.highlight .w { color: #1E1E1E } /* Text.Whitespace */ +.highlight .mb { color: #7F4707 } /* Literal.Number.Bin */ +.highlight .mf { color: #7F4707 } /* Literal.Number.Float */ +.highlight .mh { color: #7F4707 } /* Literal.Number.Hex */ +.highlight .mi { color: #7F4707 } /* Literal.Number.Integer */ +.highlight .mo { color: #7F4707 } /* Literal.Number.Oct */ +.highlight .sa { color: #163 } /* Literal.String.Affix */ +.highlight .sb { color: #163 } /* Literal.String.Backtick */ +.highlight .sc { color: #163 } /* Literal.String.Char */ +.highlight .dl { color: #163 } /* Literal.String.Delimiter */ +.highlight .sd { color: #163 } /* Literal.String.Doc */ +.highlight .s2 { color: #163 } /* Literal.String.Double */ +.highlight .se { color: #163 } /* Literal.String.Escape */ +.highlight .sh { color: #163 } /* Literal.String.Heredoc */ +.highlight .si { color: #163 } /* Literal.String.Interpol */ +.highlight .sx { color: #163 } /* Literal.String.Other */ +.highlight .sr { color: #D71835 } /* Literal.String.Regex */ +.highlight .s1 { color: #163 } /* Literal.String.Single */ +.highlight .ss { color: #00749C } /* Literal.String.Symbol */ +.highlight .bp { color: #7F4707 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #00749C } /* Name.Function.Magic */ +.highlight .vc { color: #D71835 } /* Name.Variable.Class */ +.highlight .vg { color: #D71835 } /* Name.Variable.Global */ +.highlight .vi { color: #D71835 } /* Name.Variable.Instance */ +.highlight .vm { color: #7F4707 } /* Name.Variable.Magic */ +.highlight .il { color: #7F4707 } /* Literal.Number.Integer.Long */ +@media not print { +body[data-theme="dark"] .highlight pre { line-height: 125%; } +body[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +body[data-theme="dark"] .highlight { background: #2b2b2b; color: #F8F8F2 } +body[data-theme="dark"] .highlight .c { color: #D4D0AB } /* Comment */ +body[data-theme="dark"] .highlight .err { color: #FFA07A } /* Error */ +body[data-theme="dark"] .highlight .k { color: #DCC6E0 } /* Keyword */ +body[data-theme="dark"] .highlight .l { color: #F5AB35 } /* Literal */ +body[data-theme="dark"] .highlight .n { color: #F8F8F2 } /* Name */ +body[data-theme="dark"] .highlight .o { color: #ABE338 } /* Operator */ +body[data-theme="dark"] .highlight .p { color: #F8F8F2 } /* Punctuation */ +body[data-theme="dark"] .highlight .ch { color: #D4D0AB } /* Comment.Hashbang */ +body[data-theme="dark"] .highlight .cm { color: #D4D0AB } /* Comment.Multiline */ +body[data-theme="dark"] .highlight .cp { color: #D4D0AB } /* Comment.Preproc */ +body[data-theme="dark"] .highlight .cpf { color: #D4D0AB } /* Comment.PreprocFile */ +body[data-theme="dark"] .highlight .c1 { color: #D4D0AB } /* Comment.Single */ +body[data-theme="dark"] .highlight .cs { color: #D4D0AB } /* Comment.Special */ +body[data-theme="dark"] .highlight .gd { color: #00E0E0 } /* Generic.Deleted */ +body[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +body[data-theme="dark"] .highlight .gh { color: #00E0E0 } /* Generic.Heading */ +body[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +body[data-theme="dark"] .highlight .gu { color: #00E0E0 } /* Generic.Subheading */ +body[data-theme="dark"] .highlight .kc { color: #DCC6E0 } /* Keyword.Constant */ +body[data-theme="dark"] .highlight .kd { color: #DCC6E0 } /* Keyword.Declaration */ +body[data-theme="dark"] .highlight .kn { color: #DCC6E0 } /* Keyword.Namespace */ +body[data-theme="dark"] .highlight .kp { color: #DCC6E0 } /* Keyword.Pseudo */ +body[data-theme="dark"] .highlight .kr { color: #DCC6E0 } /* Keyword.Reserved */ +body[data-theme="dark"] .highlight .kt { color: #F5AB35 } /* Keyword.Type */ +body[data-theme="dark"] .highlight .ld { color: #F5AB35 } /* Literal.Date */ +body[data-theme="dark"] .highlight .m { color: #F5AB35 } /* Literal.Number */ +body[data-theme="dark"] .highlight .s { color: #ABE338 } /* Literal.String */ +body[data-theme="dark"] .highlight .na { color: #FFD700 } /* Name.Attribute */ +body[data-theme="dark"] .highlight .nb { color: #F5AB35 } /* Name.Builtin */ +body[data-theme="dark"] .highlight .nc { color: #00E0E0 } /* Name.Class */ +body[data-theme="dark"] .highlight .no { color: #00E0E0 } /* Name.Constant */ +body[data-theme="dark"] .highlight .nd { color: #F5AB35 } /* Name.Decorator */ +body[data-theme="dark"] .highlight .ni { color: #ABE338 } /* Name.Entity */ +body[data-theme="dark"] .highlight .ne { color: #DCC6E0 } /* Name.Exception */ +body[data-theme="dark"] .highlight .nf { color: #00E0E0 } /* Name.Function */ +body[data-theme="dark"] .highlight .nl { color: #F5AB35 } /* Name.Label */ +body[data-theme="dark"] .highlight .nn { color: #F8F8F2 } /* Name.Namespace */ +body[data-theme="dark"] .highlight .nx { color: #F8F8F2 } /* Name.Other */ +body[data-theme="dark"] .highlight .py { color: #00E0E0 } /* Name.Property */ +body[data-theme="dark"] .highlight .nt { color: #00E0E0 } /* Name.Tag */ +body[data-theme="dark"] .highlight .nv { color: #FFA07A } /* Name.Variable */ +body[data-theme="dark"] .highlight .ow { color: #DCC6E0 } /* Operator.Word */ +body[data-theme="dark"] .highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */ +body[data-theme="dark"] .highlight .w { color: #F8F8F2 } /* Text.Whitespace */ +body[data-theme="dark"] .highlight .mb { color: #F5AB35 } /* Literal.Number.Bin */ +body[data-theme="dark"] .highlight .mf { color: #F5AB35 } /* Literal.Number.Float */ +body[data-theme="dark"] .highlight .mh { color: #F5AB35 } /* Literal.Number.Hex */ +body[data-theme="dark"] .highlight .mi { color: #F5AB35 } /* Literal.Number.Integer */ +body[data-theme="dark"] .highlight .mo { color: #F5AB35 } /* Literal.Number.Oct */ +body[data-theme="dark"] .highlight .sa { color: #ABE338 } /* Literal.String.Affix */ +body[data-theme="dark"] .highlight .sb { color: #ABE338 } /* Literal.String.Backtick */ +body[data-theme="dark"] .highlight .sc { color: #ABE338 } /* Literal.String.Char */ +body[data-theme="dark"] .highlight .dl { color: #ABE338 } /* Literal.String.Delimiter */ +body[data-theme="dark"] .highlight .sd { color: #ABE338 } /* Literal.String.Doc */ +body[data-theme="dark"] .highlight .s2 { color: #ABE338 } /* Literal.String.Double */ +body[data-theme="dark"] .highlight .se { color: #ABE338 } /* Literal.String.Escape */ +body[data-theme="dark"] .highlight .sh { color: #ABE338 } /* Literal.String.Heredoc */ +body[data-theme="dark"] .highlight .si { color: #ABE338 } /* Literal.String.Interpol */ +body[data-theme="dark"] .highlight .sx { color: #ABE338 } /* Literal.String.Other */ +body[data-theme="dark"] .highlight .sr { color: #FFA07A } /* Literal.String.Regex */ +body[data-theme="dark"] .highlight .s1 { color: #ABE338 } /* Literal.String.Single */ +body[data-theme="dark"] .highlight .ss { color: #00E0E0 } /* Literal.String.Symbol */ +body[data-theme="dark"] .highlight .bp { color: #F5AB35 } /* Name.Builtin.Pseudo */ +body[data-theme="dark"] .highlight .fm { color: #00E0E0 } /* Name.Function.Magic */ +body[data-theme="dark"] .highlight .vc { color: #FFA07A } /* Name.Variable.Class */ +body[data-theme="dark"] .highlight .vg { color: #FFA07A } /* Name.Variable.Global */ +body[data-theme="dark"] .highlight .vi { color: #FFA07A } /* Name.Variable.Instance */ +body[data-theme="dark"] .highlight .vm { color: #F5AB35 } /* Name.Variable.Magic */ +body[data-theme="dark"] .highlight .il { color: #F5AB35 } /* Literal.Number.Integer.Long */ +@media (prefers-color-scheme: dark) { +body:not([data-theme="light"]) .highlight pre { line-height: 125%; } +body:not([data-theme="light"]) .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +body:not([data-theme="light"]) .highlight .hll { background-color: #ffd9002e } +body:not([data-theme="light"]) .highlight { background: #2b2b2b; color: #F8F8F2 } +body:not([data-theme="light"]) .highlight .c { color: #D4D0AB } /* Comment */ +body:not([data-theme="light"]) .highlight .err { color: #FFA07A } /* Error */ +body:not([data-theme="light"]) .highlight .k { color: #DCC6E0 } /* Keyword */ +body:not([data-theme="light"]) .highlight .l { color: #F5AB35 } /* Literal */ +body:not([data-theme="light"]) .highlight .n { color: #F8F8F2 } /* Name */ +body:not([data-theme="light"]) .highlight .o { color: #ABE338 } /* Operator */ +body:not([data-theme="light"]) .highlight .p { color: #F8F8F2 } /* Punctuation */ +body:not([data-theme="light"]) .highlight .ch { color: #D4D0AB } /* Comment.Hashbang */ +body:not([data-theme="light"]) .highlight .cm { color: #D4D0AB } /* Comment.Multiline */ +body:not([data-theme="light"]) .highlight .cp { color: #D4D0AB } /* Comment.Preproc */ +body:not([data-theme="light"]) .highlight .cpf { color: #D4D0AB } /* Comment.PreprocFile */ +body:not([data-theme="light"]) .highlight .c1 { color: #D4D0AB } /* Comment.Single */ +body:not([data-theme="light"]) .highlight .cs { color: #D4D0AB } /* Comment.Special */ +body:not([data-theme="light"]) .highlight .gd { color: #00E0E0 } /* Generic.Deleted */ +body:not([data-theme="light"]) .highlight .ge { font-style: italic } /* Generic.Emph */ +body:not([data-theme="light"]) .highlight .gh { color: #00E0E0 } /* Generic.Heading */ +body:not([data-theme="light"]) .highlight .gs { font-weight: bold } /* Generic.Strong */ +body:not([data-theme="light"]) .highlight .gu { color: #00E0E0 } /* Generic.Subheading */ +body:not([data-theme="light"]) .highlight .kc { color: #DCC6E0 } /* Keyword.Constant */ +body:not([data-theme="light"]) .highlight .kd { color: #DCC6E0 } /* Keyword.Declaration */ +body:not([data-theme="light"]) .highlight .kn { color: #DCC6E0 } /* Keyword.Namespace */ +body:not([data-theme="light"]) .highlight .kp { color: #DCC6E0 } /* Keyword.Pseudo */ +body:not([data-theme="light"]) .highlight .kr { color: #DCC6E0 } /* Keyword.Reserved */ +body:not([data-theme="light"]) .highlight .kt { color: #F5AB35 } /* Keyword.Type */ +body:not([data-theme="light"]) .highlight .ld { color: #F5AB35 } /* Literal.Date */ +body:not([data-theme="light"]) .highlight .m { color: #F5AB35 } /* Literal.Number */ +body:not([data-theme="light"]) .highlight .s { color: #ABE338 } /* Literal.String */ +body:not([data-theme="light"]) .highlight .na { color: #FFD700 } /* Name.Attribute */ +body:not([data-theme="light"]) .highlight .nb { color: #F5AB35 } /* Name.Builtin */ +body:not([data-theme="light"]) .highlight .nc { color: #00E0E0 } /* Name.Class */ +body:not([data-theme="light"]) .highlight .no { color: #00E0E0 } /* Name.Constant */ +body:not([data-theme="light"]) .highlight .nd { color: #F5AB35 } /* Name.Decorator */ +body:not([data-theme="light"]) .highlight .ni { color: #ABE338 } /* Name.Entity */ +body:not([data-theme="light"]) .highlight .ne { color: #DCC6E0 } /* Name.Exception */ +body:not([data-theme="light"]) .highlight .nf { color: #00E0E0 } /* Name.Function */ +body:not([data-theme="light"]) .highlight .nl { color: #F5AB35 } /* Name.Label */ +body:not([data-theme="light"]) .highlight .nn { color: #F8F8F2 } /* Name.Namespace */ +body:not([data-theme="light"]) .highlight .nx { color: #F8F8F2 } /* Name.Other */ +body:not([data-theme="light"]) .highlight .py { color: #00E0E0 } /* Name.Property */ +body:not([data-theme="light"]) .highlight .nt { color: #00E0E0 } /* Name.Tag */ +body:not([data-theme="light"]) .highlight .nv { color: #FFA07A } /* Name.Variable */ +body:not([data-theme="light"]) .highlight .ow { color: #DCC6E0 } /* Operator.Word */ +body:not([data-theme="light"]) .highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */ +body:not([data-theme="light"]) .highlight .w { color: #F8F8F2 } /* Text.Whitespace */ +body:not([data-theme="light"]) .highlight .mb { color: #F5AB35 } /* Literal.Number.Bin */ +body:not([data-theme="light"]) .highlight .mf { color: #F5AB35 } /* Literal.Number.Float */ +body:not([data-theme="light"]) .highlight .mh { color: #F5AB35 } /* Literal.Number.Hex */ +body:not([data-theme="light"]) .highlight .mi { color: #F5AB35 } /* Literal.Number.Integer */ +body:not([data-theme="light"]) .highlight .mo { color: #F5AB35 } /* Literal.Number.Oct */ +body:not([data-theme="light"]) .highlight .sa { color: #ABE338 } /* Literal.String.Affix */ +body:not([data-theme="light"]) .highlight .sb { color: #ABE338 } /* Literal.String.Backtick */ +body:not([data-theme="light"]) .highlight .sc { color: #ABE338 } /* Literal.String.Char */ +body:not([data-theme="light"]) .highlight .dl { color: #ABE338 } /* Literal.String.Delimiter */ +body:not([data-theme="light"]) .highlight .sd { color: #ABE338 } /* Literal.String.Doc */ +body:not([data-theme="light"]) .highlight .s2 { color: #ABE338 } /* Literal.String.Double */ +body:not([data-theme="light"]) .highlight .se { color: #ABE338 } /* Literal.String.Escape */ +body:not([data-theme="light"]) .highlight .sh { color: #ABE338 } /* Literal.String.Heredoc */ +body:not([data-theme="light"]) .highlight .si { color: #ABE338 } /* Literal.String.Interpol */ +body:not([data-theme="light"]) .highlight .sx { color: #ABE338 } /* Literal.String.Other */ +body:not([data-theme="light"]) .highlight .sr { color: #FFA07A } /* Literal.String.Regex */ +body:not([data-theme="light"]) .highlight .s1 { color: #ABE338 } /* Literal.String.Single */ +body:not([data-theme="light"]) .highlight .ss { color: #00E0E0 } /* Literal.String.Symbol */ +body:not([data-theme="light"]) .highlight .bp { color: #F5AB35 } /* Name.Builtin.Pseudo */ +body:not([data-theme="light"]) .highlight .fm { color: #00E0E0 } /* Name.Function.Magic */ +body:not([data-theme="light"]) .highlight .vc { color: #FFA07A } /* Name.Variable.Class */ +body:not([data-theme="light"]) .highlight .vg { color: #FFA07A } /* Name.Variable.Global */ +body:not([data-theme="light"]) .highlight .vi { color: #FFA07A } /* Name.Variable.Instance */ +body:not([data-theme="light"]) .highlight .vm { color: #F5AB35 } /* Name.Variable.Magic */ +body:not([data-theme="light"]) .highlight .il { color: #F5AB35 } /* Literal.Number.Integer.Long */ +} +} \ No newline at end of file diff --git a/docs/_build/html/_static/scripts/furo-extensions.js b/docs/_build/html/_static/scripts/furo-extensions.js new file mode 100644 index 00000000..e69de29b diff --git a/docs/_build/html/_static/scripts/furo.js b/docs/_build/html/_static/scripts/furo.js new file mode 100644 index 00000000..87e1767f --- /dev/null +++ b/docs/_build/html/_static/scripts/furo.js @@ -0,0 +1,3 @@ +/*! For license information please see furo.js.LICENSE.txt */ +(()=>{var t={856:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort(function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})}),r(a)},detect:function(){var t=l(a,m);t?d&&t.content===d.content||(i(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(i(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(function(){r(a),v.detect()})};return v.destroy=function(){d&&i(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}}),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(856),e=n.n(t),o=null,r=null,c=document.documentElement.scrollTop;function s(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function l(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach(t=>{t.addEventListener("click",s)})}(),function(){let t=0,e=!1;window.addEventListener("scroll",function(n){t=window.scrollY,e||(window.requestAnimationFrame(function(){var n;(function(t){t>0?r.classList.add("scrolled"):r.classList.remove("scrolled")})(n=t),function(t){t<64?document.documentElement.classList.remove("show-back-to-top"):tc&&document.documentElement.classList.remove("show-back-to-top"),c=t}(n),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1}),e=!0)}),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let t=parseFloat(getComputedStyle(document.documentElement).fontSize);const e=r.getBoundingClientRect();return e.top+e.height+2.5*t+1}})}document.addEventListener("DOMContentLoaded",function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),l()})})()})(); +//# sourceMappingURL=furo.js.map \ No newline at end of file diff --git a/docs/_build/html/_static/scripts/furo.js.LICENSE.txt b/docs/_build/html/_static/scripts/furo.js.LICENSE.txt new file mode 100644 index 00000000..1632189c --- /dev/null +++ b/docs/_build/html/_static/scripts/furo.js.LICENSE.txt @@ -0,0 +1,7 @@ +/*! + * gumshoejs v5.1.2 (patched by @pradyunsg) + * A simple, framework-agnostic scrollspy script. + * (c) 2019 Chris Ferdinandi + * MIT License + * http://github.com/cferdinandi/gumshoe + */ diff --git a/docs/_build/html/_static/scripts/furo.js.map b/docs/_build/html/_static/scripts/furo.js.map new file mode 100644 index 00000000..3b316f3a --- /dev/null +++ b/docs/_build/html/_static/scripts/furo.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/furo.js","mappings":"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","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader(positionY) {\n if (positionY > 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader(positionY);\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n const headerRect = header.getBoundingClientRect();\n return headerRect.top + headerRect.height + 2.5 * rem + 1;\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","scrollHandlerForHeader","scrollHandlerForBackToTop","scrollTo","floor","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","headerRect","height"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js new file mode 100644 index 00000000..2c774d17 --- /dev/null +++ b/docs/_build/html/_static/searchtools.js @@ -0,0 +1,632 @@ +/* + * Sphinx JavaScript utilities for the full-text search. + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename, kind] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +// Global search result kind enum, used by themes to style search results. +class SearchResultKind { + static get index() { return "index"; } + static get object() { return "object"; } + static get text() { return "text"; } + static get title() { return "title"; } +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename, kind] = item; + + let listItem = document.createElement("li"); + // Add a class representing the item's type: + // can be used by a theme's CSS selector for styling + // See SearchResultKind for the class names. + listItem.classList.add(`kind-${kind}`); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = Documentation.ngettext( + "Search finished, found one page matching the search query.", + "Search finished, found ${resultCount} pages matching the search query.", + resultCount, + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename, kind]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.setAttribute("role", "list"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename, kind]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + filenames[file], + SearchResultKind.title, + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + SearchResultKind.index, + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + SearchResultKind.object, + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + SearchResultKind.text, + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/_build/html/_static/skeleton.css b/docs/_build/html/_static/skeleton.css new file mode 100644 index 00000000..467c878c --- /dev/null +++ b/docs/_build/html/_static/skeleton.css @@ -0,0 +1,296 @@ +/* Some sane resets. */ +html { + height: 100%; +} + +body { + margin: 0; + min-height: 100%; +} + +/* All the flexbox magic! */ +body, +.sb-announcement, +.sb-content, +.sb-main, +.sb-container, +.sb-container__inner, +.sb-article-container, +.sb-footer-content, +.sb-header, +.sb-header-secondary, +.sb-footer { + display: flex; +} + +/* These order things vertically */ +body, +.sb-main, +.sb-article-container { + flex-direction: column; +} + +/* Put elements in the center */ +.sb-header, +.sb-header-secondary, +.sb-container, +.sb-content, +.sb-footer, +.sb-footer-content { + justify-content: center; +} +/* Put elements at the ends */ +.sb-article-container { + justify-content: space-between; +} + +/* These elements grow. */ +.sb-main, +.sb-content, +.sb-container, +article { + flex-grow: 1; +} + +/* Because padding making this wider is not fun */ +article { + box-sizing: border-box; +} + +/* The announcements element should never be wider than the page. */ +.sb-announcement { + max-width: 100%; +} + +.sb-sidebar-primary, +.sb-sidebar-secondary { + flex-shrink: 0; + width: 17rem; +} + +.sb-announcement__inner { + justify-content: center; + + box-sizing: border-box; + height: 3rem; + + overflow-x: auto; + white-space: nowrap; +} + +/* Sidebars, with checkbox-based toggle */ +.sb-sidebar-primary, +.sb-sidebar-secondary { + position: fixed; + height: 100%; + top: 0; +} + +.sb-sidebar-primary { + left: -17rem; + transition: left 250ms ease-in-out; +} +.sb-sidebar-secondary { + right: -17rem; + transition: right 250ms ease-in-out; +} + +.sb-sidebar-toggle { + display: none; +} +.sb-sidebar-overlay { + position: fixed; + top: 0; + width: 0; + height: 0; + + transition: width 0ms ease 250ms, height 0ms ease 250ms, opacity 250ms ease; + + opacity: 0; + background-color: rgba(0, 0, 0, 0.54); +} + +#sb-sidebar-toggle--primary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--primary"], +#sb-sidebar-toggle--secondary:checked + ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--secondary"] { + width: 100%; + height: 100%; + opacity: 1; + transition: width 0ms ease, height 0ms ease, opacity 250ms ease; +} + +#sb-sidebar-toggle--primary:checked ~ .sb-container .sb-sidebar-primary { + left: 0; +} +#sb-sidebar-toggle--secondary:checked ~ .sb-container .sb-sidebar-secondary { + right: 0; +} + +/* Full-width mode */ +.drop-secondary-sidebar-for-full-width-content + .hide-when-secondary-sidebar-shown { + display: none !important; +} +.drop-secondary-sidebar-for-full-width-content .sb-sidebar-secondary { + display: none !important; +} + +/* Mobile views */ +.sb-page-width { + width: 100%; +} + +.sb-article-container, +.sb-footer-content__inner, +.drop-secondary-sidebar-for-full-width-content .sb-article, +.drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 100vw; +} + +.sb-article, +.match-content-width { + padding: 0 1rem; + box-sizing: border-box; +} + +@media (min-width: 32rem) { + .sb-article, + .match-content-width { + padding: 0 2rem; + } +} + +/* Tablet views */ +@media (min-width: 42rem) { + .sb-article-container { + width: auto; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 42rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 46rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 46rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 50rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 50rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Tablet views */ +@media (min-width: 59rem) { + .sb-sidebar-secondary { + position: static; + } + .hide-when-secondary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} +@media (min-width: 63rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } + .sb-article, + .match-content-width { + width: 46rem; + } +} +@media (min-width: 67rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-article, + .match-content-width { + width: 50rem; + } +} + +/* Desktop views */ +@media (min-width: 76rem) { + .sb-sidebar-primary { + position: static; + } + .hide-when-primary-sidebar-shown { + display: none !important; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 59rem; + } + .sb-article, + .match-content-width { + width: 42rem; + } +} + +/* Full desktop views */ +@media (min-width: 80rem) { + .sb-article, + .match-content-width { + width: 46rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 63rem; + } +} + +@media (min-width: 84rem) { + .sb-article, + .match-content-width { + width: 50rem; + } + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } +} + +@media (min-width: 88rem) { + .sb-footer-content__inner, + .drop-secondary-sidebar-for-full-width-content .sb-article, + .drop-secondary-sidebar-for-full-width-content .match-content-width { + width: 67rem; + } + .sb-page-width { + width: 88rem; + } +} diff --git a/docs/_build/html/_static/sphinx_highlight.js b/docs/_build/html/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/docs/_build/html/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '

" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/_build/html/_static/styles/furo-extensions.css b/docs/_build/html/_static/styles/furo-extensions.css new file mode 100644 index 00000000..2d74267f --- /dev/null +++ b/docs/_build/html/_static/styles/furo-extensions.css @@ -0,0 +1,2 @@ +#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0s}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} +/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/docs/_build/html/_static/styles/furo-extensions.css.map b/docs/_build/html/_static/styles/furo-extensions.css.map new file mode 100644 index 00000000..68fb7fd0 --- /dev/null +++ b/docs/_build/html/_static/styles/furo-extensions.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAEE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cAIA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,mBACA,CACA,wCACE,cAEJ,8BACE,UCzCN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/docs/_build/html/_static/styles/furo.css b/docs/_build/html/_static/styles/furo.css new file mode 100644 index 00000000..b0b0121c --- /dev/null +++ b/docs/_build/html/_static/styles/furo.css @@ -0,0 +1,2 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,p,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;clip:rect(0,0,0,0)!important;background:var(--color-background-primary);border:0!important;color:var(--color-foreground-primary);white-space:nowrap!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-stack--headings:var(--font-stack);--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,');--icon-pencil:url('data:image/svg+xml;charset=utf-8,');--icon-abstract:url('data:image/svg+xml;charset=utf-8,');--icon-info:url('data:image/svg+xml;charset=utf-8,');--icon-flame:url('data:image/svg+xml;charset=utf-8,');--icon-question:url('data:image/svg+xml;charset=utf-8,');--icon-warning:url('data:image/svg+xml;charset=utf-8,');--icon-failure:url('data:image/svg+xml;charset=utf-8,');--icon-spark:url('data:image/svg+xml;charset=utf-8,');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.2);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.2);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.2);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.2);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.2);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.2);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.2);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.2);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.2);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.2);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.2);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.2);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.2);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#6b6f76;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-background-item:#ccc;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#0a4bff;--color-brand-content:#2757dd;--color-brand-visited:#872ee0;--color-api-background:var(--color-background-hover--transparent);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-api-added:#21632c;--color-api-added-border:#38a84d;--color-api-changed:#046172;--color-api-changed-border:#06a1bc;--color-api-deprecated:#605706;--color-api-deprecated-border:#f0d90f;--color-api-removed:#b30000;--color-api-removed-border:#ff5c5c;--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link--hover:var(--color-brand-content);--color-link-underline--hover:var(--color-foreground-border);--color-link--visited:var(--color-brand-visited);--color-link-underline--visited:var(--color-background-border);--color-link--visited--hover:var(--color-brand-visited);--color-link-underline--visited--hover:var(--color-foreground-border)}.only-light{display:block!important}html body .only-dark{display:none!important}@media not print{body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#cfd0d0;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#3d94ff;--color-brand-content:#5ca5ff;--color-brand-visited:#b27aeb;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-api-added:#3db854;--color-api-added-border:#267334;--color-api-changed:#09b0ce;--color-api-changed-border:#056d80;--color-api-deprecated:#b1a10b;--color-api-deprecated-border:#6e6407;--color-api-removed:#ff7575;--color-api-removed-border:#b03b3b;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:block}@media(prefers-color-scheme:dark){body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-dark{display:block}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto-light{display:none}}body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1,h2,h3,h4,h5,h6{border-radius:.5rem;font-family:var(--font-stack--headings);font-weight:700;line-height:1.25;margin:.5rem -.5rem;padding-left:.5rem;padding-right:.5rem}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p{margin-top:0}h1{font-size:2.5em;margin-bottom:1rem}h1,h2{margin-top:1.75rem}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1.125em}h6{font-size:1em}small{font-size:80%;opacity:75%}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}a:visited{color:var(--color-link--visited);text-decoration-color:var(--color-link-underline--visited)}a:visited:hover{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}a:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{color:inherit}a.muted-link:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link:hover:visited{color:var(--color-link--visited--hover);text-decoration-color:var(--color-link-underline--visited--hover)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}.sidebar-scroll::-webkit-scrollbar,.toc-scroll::-webkit-scrollbar,article[role=main] ::-webkit-scrollbar{height:.25rem;width:.25rem}.sidebar-scroll::-webkit-scrollbar-thumb,.toc-scroll::-webkit-scrollbar-thumb,article[role=main] ::-webkit-scrollbar-thumb{background-color:var(--color-foreground-border);border-radius:.125rem}body,html{height:100%}.skip-to-content,body,html{background:var(--color-background-primary);color:var(--color-foreground-primary)}.skip-to-content{border-radius:1rem;left:.25rem;padding:1rem;position:fixed;top:.25rem;transform:translateY(-200%);transition:transform .3s ease-in-out;z-index:40}.skip-to-content:focus-within{transform:translateY(0)}article{background:var(--color-content-background);color:var(--color-content-foreground);overflow-wrap:break-word}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-grow:1;flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{display:flex}.theme-toggle{background:transparent;border:none;cursor:pointer;display:flex;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1.25rem;width:1.25rem}.theme-toggle-header{align-items:center;display:flex;justify-content:center}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1.5rem;width:1.5rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.content-icon-container .edit-this-page svg,.content-icon-container .view-this-page svg{color:inherit;height:1.25rem;width:1.25rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0s,height 0s,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}.back-to-top{background:var(--color-background-primary);border-radius:1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.502);display:none;font-size:.8125rem;left:0;margin-left:50%;padding:.5rem .75rem .5rem .5rem;position:fixed;text-decoration:none;top:1rem;transform:translateX(-50%);z-index:10}.back-to-top svg{height:1rem;width:1rem;fill:currentColor;display:inline-block}.back-to-top span{margin-left:.25rem}.show-back-to-top .back-to-top{align-items:center;display:flex}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.content{margin-left:auto;margin-right:auto;padding:0 1em}}@media(max-width:63em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.theme-toggle-header,.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.nav-overlay-icon .icon,.theme-toggle svg{height:1.5rem;width:1.5rem}:target{scroll-margin-top:calc(var(--header-height) + 2.5rem)}.back-to-top{top:calc(var(--header-height) + .5rem)}.page{flex-direction:column;justify-content:center}}@media(max-width:48em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){article[role=main] aside.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}.admonition p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.4rem .5rem .4rem 2rem;position:relative}.admonition p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig:not(.sig-inline){background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;margin-left:-.25rem;margin-right:-.25rem;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em;transition:background .1s ease-out}.sig:not(.sig-inline):hover{background:var(--color-api-background-hover)}.sig:not(.sig-inline) a.reference .viewcode-link{font-weight:400;width:4.25rem}em.property{font-style:normal}em.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}div.deprecated,div.versionadded,div.versionchanged,div.versionremoved{border-left:.1875rem solid;border-radius:.125rem;padding-left:.75rem}div.deprecated p,div.versionadded p,div.versionchanged p,div.versionremoved p{margin-bottom:.125rem;margin-top:.125rem}div.versionadded{border-color:var(--color-api-added-border)}div.versionadded .versionmodified{color:var(--color-api-added)}div.versionchanged{border-color:var(--color-api-changed-border)}div.versionchanged .versionmodified{color:var(--color-api-changed)}div.deprecated{border-color:var(--color-api-deprecated-border)}div.deprecated .versionmodified{color:var(--color-api-deprecated)}div.versionremoved{border-color:var(--color-api-removed-border)}div.versionremoved .versionmodified{color:var(--color-api-removed)}.viewcode-back,.viewcode-link{float:right;text-align:right}.line-block{margin-bottom:.75rem;margin-top:.5rem}.line-block .line-block{margin-bottom:0;margin-top:0;padding-left:1rem}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}.sig-inline,code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);padding:.1em .2em}pre.literal-block .sig-inline,pre.literal-block code.literal{font-size:inherit;padding:0}p .sig-inline,p code.literal{border:1px solid var(--color-background-border)}.sig-inline{font-family:var(--font-stack--monospace)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}pre{overflow:auto}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.code-block-caption{background-color:var(--color-code-background);border-bottom:1px solid;border-radius:.25rem;border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:var(--color-background-border);color:var(--color-code-foreground);display:flex;font-weight:300;padding:.625rem .875rem}.code-block-caption+div[class]{margin-top:0}.code-block-caption+div[class]>.highlight{border-top-left-radius:0;border-top-right-radius:0}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote.brackets{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:max-content auto}dl.footnote.brackets dt{margin:0}dl.footnote.brackets dt>.fn-backref{margin-left:.25rem}dl.footnote.brackets dt:after{content:":"}dl.footnote.brackets dt .brackets:before{content:"["}dl.footnote.brackets dt .brackets:after{content:"]"}dl.footnote.brackets dd{margin:0;padding:0 1rem}aside.footnote{color:var(--color-foreground-secondary);font-size:var(--font-size--small)}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>:not(span),div.citation>p{margin-left:2rem}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd ul,.field-list dd>p:first-child,.option-list dd ul,.option-list dd>p:first-child,dl.footnote dd ul,dl.footnote dd>p:first-child,dl.glossary dd ul,dl.glossary dd>p:first-child,dl.simple dd ul,dl.simple dd>p:first-child,dl:not([class]) dd ul,dl:not([class]) dd>p:first-child{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}div.math{position:relative;text-align:center}div.math .headerlink,div.math:focus .headerlink{display:none}div.math:hover .headerlink{display:inline-block}div.math span.eqno{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);margin-left:0;margin-right:0;padding:.5rem 1rem}blockquote .attribution{font-weight:600;text-align:right}blockquote.highlights,blockquote.pull-quote{font-size:1.25em}blockquote.epigraph,blockquote.pull-quote{border-left-width:0;border-radius:.5rem}blockquote.highlights{background:transparent;border-left-width:0}p .reference img{vertical-align:middle}p.rubric{font-size:1.125em;font-weight:700;line-height:1.25}dd p.rubric{font-size:var(--font-size--small);font-weight:inherit;line-height:inherit;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}[role=main] .table-wrapper.container{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}table.docutils td.text-left,table.docutils th.text-left{text-align:left}table.docutils td.text-right,table.docutils th.text-right{text-align:right}table.docutils td.text-center,table.docutils th.text-center{text-align:center}:target{scroll-margin-top:2.5rem}@media(max-width:67em){:target{scroll-margin-top:calc(2.5rem + var(--header-height))}section>span:target{scroll-margin-top:calc(2.8rem + var(--header-height))}}.headerlink{font-weight:100;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-block-caption>.headerlink,dl dt>.headerlink,figcaption p>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{margin-left:.5rem;visibility:hidden}.code-block-caption:hover>.headerlink,dl dt:hover>.headerlink,figcaption p:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}.code-block-caption>.toc-backref,dl dt>.toc-backref,figcaption p>.toc-backref,h1>.toc-backref,h2>.toc-backref,h3>.toc-backref,h4>.toc-backref,h5>.toc-backref,h6>.toc-backref,p.caption>.toc-backref,table>caption>.toc-backref{color:inherit;text-decoration-line:none}figure:hover>figcaption>p>.headerlink,table:hover>caption>.headerlink{visibility:visible}:target>h1:first-of-type,:target>h2:first-of-type,:target>h3:first-of-type,:target>h4:first-of-type,:target>h5:first-of-type,:target>h6:first-of-type,span:target~h1:first-of-type,span:target~h2:first-of-type,span:target~h3:first-of-type,span:target~h4:first-of-type,span:target~h5:first-of-type,span:target~h6:first-of-type{background-color:var(--color-highlight-on-target)}:target>h1:first-of-type code.literal,:target>h2:first-of-type code.literal,:target>h3:first-of-type code.literal,:target>h4:first-of-type code.literal,:target>h5:first-of-type code.literal,:target>h6:first-of-type code.literal,span:target~h1:first-of-type code.literal,span:target~h2:first-of-type code.literal,span:target~h3:first-of-type code.literal,span:target~h4:first-of-type code.literal,span:target~h5:first-of-type code.literal,span:target~h6:first-of-type code.literal{background-color:transparent}.literal-block-wrapper:target .code-block-caption,.this-will-duplicate-information-and-it-is-still-useful-here li :target,figure:target,table:target>caption{background-color:var(--color-highlight-on-target)}dt:target{background-color:var(--color-highlight-on-target)!important}.footnote-reference:target,.footnote>dt:target+dd{background-color:var(--color-highlight-on-target)}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.bottom-of-page{align-items:center;border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);display:flex;justify-content:space-between;line-height:1.5;margin-top:1rem;padding-bottom:1rem;padding-top:1rem}@media(max-width:46em){.bottom-of-page{flex-direction:column-reverse;gap:.25rem;text-align:center}}.bottom-of-page .left-details{font-size:var(--font-size--small)}.bottom-of-page .right-details{display:flex;flex-direction:column;gap:.25rem;text-align:right}.bottom-of-page .icons{display:flex;font-size:1rem;gap:.25rem;justify-content:flex-end}.bottom-of-page .icons a{text-decoration:none}.bottom-of-page .icons img,.bottom-of-page .icons svg{font-size:1.125rem;height:1em;width:1em}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}.related-pages a svg.furo-related-icon,.related-pages a svg.furo-related-icon>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column;overflow-wrap:anywhere}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);overflow-wrap:anywhere;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover);color:var(--color-sidebar-link-text)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23607d8b' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' viewBox='0 0 24 24'%3E%3Cpath stroke='none' d='M0 0h24v24H0z'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree a.reference{color:var(--color-toc-item-text);overflow-wrap:anywhere;text-decoration:none}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling. Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right} +/*# sourceMappingURL=furo.css.map*/ \ No newline at end of file diff --git a/docs/_build/html/_static/styles/furo.css.map b/docs/_build/html/_static/styles/furo.css.map new file mode 100644 index 00000000..3a841a4a --- /dev/null +++ b/docs/_build/html/_static/styles/furo.css.map @@ -0,0 +1 @@ +{"version":3,"file":"styles/furo.css","mappings":"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sCAIA,aADF,WACE,CAKF,SACE,CAHJ,kBAEE,CAJE,gBAEJ,CAHI,iBAMA,yFAKA,aACA,eACA,cEjbJ,iBAEE,aADA,iBACA,6BAEA,kCAEA,SACA,UAIA,gCACA,CALA,SAEA,SAEA,CAJA,wEAEA,CAFA,OAKA,CAGA,mDACE,iBAGF,gCACE,CADF,UACE,aAEJ,iCAEE,CAFF,UAEE,wCAEA,WACA,WADA,UACA,CACA,4CAGA,MACA,CADA,KACA,wCACA,UAGA,CAJA,UAIA,6DAUA,0CACE,CAFF,mBAEE,wEACA,CAVA,YACA,CAMF,mBAJE,OAOA,gBAJJ,gCACE,CANE,cACA,CAHA,oBACA,CAGA,QAGJ,CAII,0BACA,CADA,UACA,wCAEJ,kBACE,0DACA,gCACE,kBACA,CADA,YACA,oEACA,2CAMF,mDAII,CALN,YACE,CANE,cAKJ,CACE,iBAII,kEACA,yCACE,kDACA,yDACE,+CACA,uBANN,CAMM,+BANN,uCACE,qDACA,4BAEE,mBADA,0CACA,CADA,qBACA,0DACE,wCACA,sGALJ,oCACA,sBACE,kBAFF,UAEE,2CACA,wFACE,cACA,kEANN,uBACE,iDACA,CADA,UACA,0DACE,wDAEE,iEACA,qEANN,sCACE,CAGE,iBAHF,gBAGE,qBACE,CAJJ,uBACA,gDACE,wDACA,6DAHF,2CACA,CADA,gBACA,eACE,CAGE,sBANN,8BACE,CAII,iBAFF,4DACA,WACE,YADF,uCACE,6EACA,2BANN,8CACE,kDACA,0CACE,8BACA,yFACE,sBACA,sFALJ,mEACA,sBACE,kEACA,6EACE,uCACA,kEALJ,qGAEE,kEACA,6EACE,uCACA,kEALJ,8CACA,uDACE,sEACA,2EACE,sCACA,iEALJ,mGACA,qCACE,oDACA,0DACE,6GACA,gDAGR,yDCvEA,sEACE,CACA,6GACE,gEACF,iGAIF,wFACE,qDAGA,mGAEE,2CAEF,4FACE,gCACF,wGACE,8DAEE,6FAIA,iJAKN,6GACE,gDAKF,yDACA,qCAGA,6BACA,kBACA,qDAKA,oCAEA,+DAGA,2CAGE,oDAIA,oEAEE,qBAGJ,wDAEE,uCAEF,kE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","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/base/_print.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/variables/_layout.scss","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_blocks.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/content/_target.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// This file contains styles for managing print media.\n\n////////////////////////////////////////////////////////////////////////////////\n// Hide elements not relevant to print media.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Hide icon container.\n .content-icon-container\n display: none !important\n\n // Hide showing header links if hovering over when printing.\n .headerlink\n display: none !important\n\n // Hide mobile header.\n .mobile-header\n display: none !important\n\n // Hide navigation links.\n .related-pages\n display: none !important\n\n////////////////////////////////////////////////////////////////////////////////\n// Tweaks related to decolorization.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Apply a border around code which no longer have a color background.\n .highlight\n border: 0.1pt solid var(--color-foreground-border)\n\n////////////////////////////////////////////////////////////////////////////////\n// Avoid page break in some relevant cases.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n ul, ol, dl, a, table, pre, blockquote, p\n page-break-inside: avoid\n\n h1, h2, h3, h4, h5, h6, img, figure, caption\n page-break-inside: avoid\n page-break-after: avoid\n\n ul, ol, dl\n page-break-before: avoid\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n:-moz-focusring\n outline: auto\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\n@use \"../variables\" as *\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\nhtml body .only-dark\n display: none !important\n\n// Ignore dark-mode hints if print media.\n@media not print\n // Enable dark-mode, if requested.\n body[data-theme=\"dark\"]\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n // Enable dark mode, unless explicitly told to avoid.\n @media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto-light\n display: block\n\n @media (prefers-color-scheme: dark)\n .theme-toggle svg.theme-icon-when-auto-dark\n display: block\n .theme-toggle svg.theme-icon-when-auto-light\n display: none\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack:\n -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif,\n Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace:\n \"SFMono-Regular\", Menlo, Consolas, Monaco, Liberation Mono, Lucida Console,\n monospace;\n --font-stack--headings: var(--font-stack);\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 *\n #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8,'),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"info\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"question\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8,')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","@use \"sass:list\";\n// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.2)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.2)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{list.nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n list.nth($values, 1),\n 0.2\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #6b6f76; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n --color-background-item: #ccc; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #0a4bff;\n --color-brand-content: #2757dd;\n --color-brand-visited: #872ee0;\n\n // API documentation\n --color-api-background: var(--color-background-hover--transparent);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n\n --color-api-added: #21632c;\n --color-api-added-border: #38a84d;\n --color-api-changed: #046172;\n --color-api-changed-border: #06a1bc;\n --color-api-deprecated: #605706;\n --color-api-deprecated-border: #f0d90f;\n --color-api-removed: #b30000;\n --color-api-removed-border: #ff5c5c;\n\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline--hover: var(--color-foreground-border);\n\n --color-link--visited: var(--color-brand-visited);\n --color-link-underline--visited: var(--color-background-border);\n --color-link--visited--hover: var(--color-brand-visited);\n --color-link-underline--visited--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #cfd0d0; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n --color-background-item: #444; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #3d94ff;\n --color-brand-content: #5ca5ff;\n --color-brand-visited: #b27aeb;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n --color-api-added: #3db854;\n --color-api-added-border: #267334;\n --color-api-changed: #09b0ce;\n --color-api-changed-border: #056d80;\n --color-api-deprecated: #b1a10b;\n --color-api-deprecated-border: #6e6407;\n --color-api-removed: #ff7575;\n --color-api-removed-border: #b03b3b;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n line-height: 1.25\n font-family: var(--font-stack--headings)\n font-weight: bold\n\n border-radius: 0.5rem\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n margin-left: -0.5rem\n margin-right: -0.5rem\n padding-left: 0.5rem\n padding-right: 0.5rem\n\n + p\n margin-top: 0\n\nh1\n font-size: 2.5em\n margin-top: 1.75rem\n margin-bottom: 1rem\nh2\n font-size: 2em\n margin-top: 1.75rem\nh3\n font-size: 1.5em\nh4\n font-size: 1.25em\nh5\n font-size: 1.125em\nh6\n font-size: 1em\n\nsmall\n opacity: 75%\n font-size: 80%\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:visited\n color: var(--color-link--visited)\n text-decoration-color: var(--color-link-underline--visited)\n &:hover\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n color: inherit\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &:visited\n color: var(--color-link--visited--hover)\n text-decoration-color: var(--color-link-underline--visited--hover)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n@use \"variables\" as *\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n // Override Firefox scrollbar style\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n // Override Chrome scrollbar styles\n &::-webkit-scrollbar\n width: 0.25rem\n height: 0.25rem\n &::-webkit-scrollbar-thumb\n background-color: var(--color-foreground-border)\n border-radius: 0.125rem\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\n.skip-to-content\n position: fixed\n padding: 1rem\n border-radius: 1rem\n left: 0.25rem\n top: 0.25rem\n z-index: 40\n background: var(--color-background-primary)\n color: var(--color-foreground-primary)\n\n transform: translateY(-200%)\n transition: transform 300ms ease-in-out\n\n &:focus-within\n transform: translateY(0%)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n overflow-wrap: break-word\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-grow: 1\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n display: flex\n\n.theme-toggle\n display: flex\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n height: 1.25rem\n width: 1.25rem\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n display: flex\n align-items: center\n justify-content: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: 1.5rem\n width: 1.5rem\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n .edit-this-page, .view-this-page\n svg\n color: inherit\n height: 1.25rem\n width: 1.25rem\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Back to top\n////////////////////////////////////////////////////////////////////////////////\n.back-to-top\n text-decoration: none\n\n display: none\n position: fixed\n left: 0\n top: 1rem\n padding: 0.5rem\n padding-right: 0.75rem\n border-radius: 1rem\n font-size: 0.8125rem\n\n background: var(--color-background-primary)\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), #6b728080 0px 0px 1px 0px\n\n z-index: 10\n\n margin-left: 50%\n transform: translateX(-50%)\n svg\n height: 1rem\n width: 1rem\n fill: currentColor\n display: inline-block\n\n span\n margin-left: 0.25rem\n\n .show-back-to-top &\n display: flex\n align-items: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $content-padded-width + $sidebar-width)\n // Center the page\n .content\n margin-left: auto\n margin-right: auto\n padding: 0 $content-padding--small\n\n@media (max-width: $content-padded-width--small + $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon, .theme-toggle-header\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n user-select: none\n\n .nav-overlay-icon .icon,\n .theme-toggle svg\n height: 1.5rem\n width: 1.5rem\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: calc(var(--header-height) + 2.5rem)\n\n // Show back-to-top below the header\n .back-to-top\n top: calc(var(--header-height) + 0.5rem)\n\n // Accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n\n@media (max-width: $content-width + 2* $content-padding--small)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n article[role=main] aside.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","// Overall Layout Variables\n//\n// Because CSS variables can't be used in media queries. The fact that this\n// makes the layout non-user-configurable is a good thing.\n$content-padding: 3em;\n$content-padding--small: 1em;\n$content-width: 46em;\n$sidebar-width: 15em;\n$content-padded-width: $content-width + 2 * $content-padding;\n$content-padded-width--small: $content-width + 2 * $content-padding--small;\n$full-width: $content-padded-width + 2 * $sidebar-width;\n","@use \"sass:list\"\n@use \"../variables\" as *\n\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\n.admonition p.admonition-title,\np.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding-left: 2rem\n padding-right: .5rem\n padding-top: .4rem\n padding-bottom: .4rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{list.nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig:not(.sig-inline)\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n margin-left: -0.25rem\n margin-right: -0.25rem\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n transition: background 100ms ease-out\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference\n .viewcode-link\n font-weight: normal\n width: 4.25rem\n\nem.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\ndiv.versionadded,\ndiv.versionchanged,\ndiv.deprecated,\ndiv.versionremoved\n border-left: 0.1875rem solid\n border-radius: 0.125rem\n\n padding-left: 0.75rem\n\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\ndiv.versionadded\n border-color: var(--color-api-added-border)\n .versionmodified\n color: var(--color-api-added)\n\ndiv.versionchanged\n border-color: var(--color-api-changed-border)\n .versionmodified\n color: var(--color-api-changed)\n\ndiv.deprecated\n border-color: var(--color-api-deprecated-border)\n .versionmodified\n color: var(--color-api-deprecated)\n\ndiv.versionremoved\n border-color: var(--color-api-removed-border)\n .versionmodified\n color: var(--color-api-removed)\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n",".line-block\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n .line-block\n margin-top: 0rem\n margin-bottom: 0rem\n padding-left: 1rem\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal, .sig-inline\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n pre.literal-block &\n font-size: inherit\n padding: 0\n\n p &\n border: 1px solid var(--color-background-border)\n\n.sig-inline\n font-family: var(--font-stack--monospace)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n overflow: auto\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n/* Make code block captions be nicely integrated */\n.code-block-caption\n display: flex\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n border-radius: 0.25rem\n border-bottom-left-radius: 0\n border-bottom-right-radius: 0\n font-weight: 300\n border-bottom: 1px solid\n\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n border-color: var(--color-background-border)\n\n + div[class]\n margin-top: 0\n > .highlight\n border-top-left-radius: 0\n border-top-right-radius: 0\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\n// docutils <= 0.17\ndl.footnote.brackets\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n\n dd\n margin: 0\n padding: 0 1rem\n\n// docutils >= 0.18\naside.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\naside.footnote > span,\ndiv.citation > span\n float: left\n font-weight: 500\n padding-right: 0.25rem\n\naside.footnote > *:not(span),\ndiv.citation > p\n margin-left: 2rem\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\nol\n &.arabic\n list-style: decimal\n &.loweralpha\n list-style: lower-alpha\n &.upperalpha\n list-style: upper-alpha\n &.lowerroman\n list-style: lower-roman\n &.upperroman\n list-style: upper-roman\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n\ndiv.math\n position: relative\n text-align: center\n\n .headerlink,\n &:focus .headerlink\n display: none\n\n &:hover .headerlink\n display: inline-block\n\n span.eqno\n position: absolute\n right: 0.5rem\n top: 50%\n transform: translate(0, -50%)\n z-index: 1\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n .attribution\n font-weight: 600\n text-align: right\n\n &.pull-quote,\n &.highlights\n font-size: 1.25em\n\n &.epigraph,\n &.pull-quote\n border-left-width: 0\n border-radius: 0.5rem\n\n &.highlights\n border-left-width: 0\n background: transparent\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","p.rubric\n line-height: 1.25\n font-weight: bold\n font-size: 1.125em\n\n // For Numpy-style documentation that's got rubrics within it.\n // https://github.com/pradyunsg/furo/discussions/505\n dd &\n line-height: inherit\n font-weight: inherit\n\n font-size: var(--font-size--small)\n text-transform: uppercase\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n","[role=main] .table-wrapper.container\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n\n // MyST-parser tables set these classes for control of column alignment\n &.text-left\n text-align: left\n &.text-right\n text-align: right\n &.text-center\n text-align: center\n","@use \"../variables\" as *\n\n:target\n scroll-margin-top: 2.5rem\n\n@media (max-width: $full-width - $sidebar-width)\n :target\n scroll-margin-top: calc(2.5rem + var(--header-height))\n\n // When a heading is selected\n section > span:target\n scroll-margin-top: calc(2.8rem + var(--header-height))\n\n// Permalinks\n.headerlink\n font-weight: 100\n user-select: none\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\nfigcaption p,\ntable > caption,\n.code-block-caption\n > .headerlink\n margin-left: 0.5rem\n visibility: hidden\n &:hover > .headerlink\n visibility: visible\n\n // Don't change to link-like, if someone adds the contents directive.\n > .toc-backref\n color: inherit\n text-decoration-line: none\n\n// Figure and table captions are special.\nfigure:hover > figcaption > p > .headerlink,\ntable:hover > caption > .headerlink\n visibility: visible\n\n:target >, // Regular section[id] style anchors\nspan:target ~ // Non-regular span[id] style \"extra\" anchors\n h1,\n h2,\n h3,\n h4,\n h5,\n h6\n &:nth-of-type(1)\n background-color: var(--color-highlight-on-target)\n // .headerlink\n // visibility: visible\n code.literal\n background-color: transparent\n\ntable:target > caption,\nfigure:target\n background-color: var(--color-highlight-on-target)\n\n// Inline page contents\n.this-will-duplicate-information-and-it-is-still-useful-here li :target\n background-color: var(--color-highlight-on-target)\n\n// Code block permalinks\n.literal-block-wrapper:target .code-block-caption\n background-color: var(--color-highlight-on-target)\n\n// When a definition list item is selected\n//\n// There isn't really an alternative to !important here, due to the\n// high-specificity of API documentation's selector.\ndt:target\n background-color: var(--color-highlight-on-target) !important\n\n// When a footnote reference is selected\n.footnote > dt:target + dd,\n.footnote-reference:target\n background-color: var(--color-highlight-on-target)\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n@use \"../variables\" as *\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.bottom-of-page\n display: flex\n align-items: center\n justify-content: space-between\n\n margin-top: 1rem\n padding-top: 1rem\n padding-bottom: 1rem\n\n color: var(--color-foreground-secondary)\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n\n @media (max-width: $content-width)\n text-align: center\n flex-direction: column-reverse\n gap: 0.25rem\n\n .left-details\n font-size: var(--font-size--small)\n\n .right-details\n display: flex\n flex-direction: column\n gap: 0.25rem\n text-align: right\n\n .icons\n display: flex\n justify-content: flex-end\n gap: 0.25rem\n font-size: 1rem\n\n a\n text-decoration: none\n\n svg,\n img\n font-size: 1.125rem\n height: 1em\n width: 1em\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg.furo-related-icon,\n svg.furo-related-icon > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n overflow-wrap: anywhere\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n overflow-wrap: anywhere\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n color: var(--color-sidebar-link-text)\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml,')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n user-select: none\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the