From b849a6fb915166f5e5116000b789fa1ce210f43e Mon Sep 17 00:00:00 2001 From: sys_shmem Date: Tue, 21 Nov 2023 13:49:23 -0800 Subject: [PATCH] Intel(R) SHMEM Library (ISHMEM) 1.0.0 doc pages Signed-off-by: sys_shmem --- .gitignore | 3 + LICENSE | 30 + README.md | 155 +++ docs/.nojekyll | 0 docs/_images/memory_model-1PPD.png | Bin 0 -> 363556 bytes docs/_sources/acknowledgements.rst | 96 ++ docs/_sources/atomics.rst | 461 +++++++ docs/_sources/collectives.rst | 567 ++++++++ .../compiling_and_running_programs.rst | 29 + docs/_sources/execution_model.rst | 113 ++ docs/_sources/index.rst | 105 ++ docs/_sources/intro.rst | 80 ++ docs/_sources/library_constants.rst | 182 +++ docs/_sources/library_setup_exit_query.rst | 233 ++++ docs/_sources/memory_management.rst | 148 +++ docs/_sources/memory_model.rst | 169 +++ docs/_sources/memory_ordering.rst | 107 ++ docs/_sources/programming_model.rst | 282 ++++ docs/_sources/pt2pt_sync.rst | 173 +++ docs/_sources/rma.rst | 492 +++++++ docs/_sources/signaling.rst | 327 +++++ docs/_sources/supported_features.rst | 309 +++++ docs/_sources/writing_programs.rst | 96 ++ docs/_static/basic.css | 903 +++++++++++++ docs/_static/doctools.js | 156 +++ docs/_static/documentation_options.js | 14 + docs/_static/favicon.ico | Bin 0 -> 9662 bytes docs/_static/file.png | Bin 0 -> 286 bytes docs/_static/images/logo_binder.svg | 19 + docs/_static/images/logo_colab.png | Bin 0 -> 7601 bytes docs/_static/images/logo_deepnote.svg | 1 + docs/_static/images/logo_jupyterhub.svg | 1 + docs/_static/language_data.js | 199 +++ .../locales/ar/LC_MESSAGES/booktheme.mo | Bin 0 -> 1541 bytes .../locales/ar/LC_MESSAGES/booktheme.po | 75 ++ .../locales/bg/LC_MESSAGES/booktheme.mo | Bin 0 -> 1708 bytes .../locales/bg/LC_MESSAGES/booktheme.po | 75 ++ .../locales/bn/LC_MESSAGES/booktheme.mo | Bin 0 -> 1646 bytes .../locales/bn/LC_MESSAGES/booktheme.po | 63 + .../locales/ca/LC_MESSAGES/booktheme.mo | Bin 0 -> 1246 bytes .../locales/ca/LC_MESSAGES/booktheme.po | 66 + .../locales/cs/LC_MESSAGES/booktheme.mo | Bin 0 -> 1405 bytes .../locales/cs/LC_MESSAGES/booktheme.po | 75 ++ .../locales/da/LC_MESSAGES/booktheme.mo | Bin 0 -> 1304 bytes .../locales/da/LC_MESSAGES/booktheme.po | 75 ++ .../locales/de/LC_MESSAGES/booktheme.mo | Bin 0 -> 1388 bytes .../locales/de/LC_MESSAGES/booktheme.po | 75 ++ .../locales/el/LC_MESSAGES/booktheme.mo | Bin 0 -> 1722 bytes .../locales/el/LC_MESSAGES/booktheme.po | 75 ++ .../locales/eo/LC_MESSAGES/booktheme.mo | Bin 0 -> 1337 bytes .../locales/eo/LC_MESSAGES/booktheme.po | 75 ++ .../locales/es/LC_MESSAGES/booktheme.mo | Bin 0 -> 1396 bytes .../locales/es/LC_MESSAGES/booktheme.po | 75 ++ .../locales/et/LC_MESSAGES/booktheme.mo | Bin 0 -> 1341 bytes .../locales/et/LC_MESSAGES/booktheme.po | 75 ++ .../locales/fi/LC_MESSAGES/booktheme.mo | Bin 0 -> 1368 bytes .../locales/fi/LC_MESSAGES/booktheme.po | 75 ++ .../locales/fr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1412 bytes .../locales/fr/LC_MESSAGES/booktheme.po | 75 ++ .../locales/hr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1402 bytes .../locales/hr/LC_MESSAGES/booktheme.po | 75 ++ .../locales/id/LC_MESSAGES/booktheme.mo | Bin 0 -> 1323 bytes .../locales/id/LC_MESSAGES/booktheme.po | 75 ++ .../locales/it/LC_MESSAGES/booktheme.mo | Bin 0 -> 1403 bytes .../locales/it/LC_MESSAGES/booktheme.po | 75 ++ .../locales/iw/LC_MESSAGES/booktheme.mo | Bin 0 -> 1445 bytes .../locales/iw/LC_MESSAGES/booktheme.po | 75 ++ .../locales/ja/LC_MESSAGES/booktheme.mo | Bin 0 -> 1471 bytes .../locales/ja/LC_MESSAGES/booktheme.po | 75 ++ .../locales/ko/LC_MESSAGES/booktheme.mo | Bin 0 -> 1375 bytes .../locales/ko/LC_MESSAGES/booktheme.po | 75 ++ .../locales/lt/LC_MESSAGES/booktheme.mo | Bin 0 -> 1413 bytes .../locales/lt/LC_MESSAGES/booktheme.po | 75 ++ .../locales/lv/LC_MESSAGES/booktheme.mo | Bin 0 -> 1404 bytes .../locales/lv/LC_MESSAGES/booktheme.po | 75 ++ .../locales/ml/LC_MESSAGES/booktheme.mo | Bin 0 -> 1883 bytes .../locales/ml/LC_MESSAGES/booktheme.po | 66 + .../locales/mr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1674 bytes .../locales/mr/LC_MESSAGES/booktheme.po | 66 + .../locales/ms/LC_MESSAGES/booktheme.mo | Bin 0 -> 1213 bytes .../locales/ms/LC_MESSAGES/booktheme.po | 66 + .../locales/nl/LC_MESSAGES/booktheme.mo | Bin 0 -> 1356 bytes .../locales/nl/LC_MESSAGES/booktheme.po | 75 ++ .../locales/no/LC_MESSAGES/booktheme.mo | Bin 0 -> 1317 bytes .../locales/no/LC_MESSAGES/booktheme.po | 75 ++ .../locales/pl/LC_MESSAGES/booktheme.mo | Bin 0 -> 1371 bytes .../locales/pl/LC_MESSAGES/booktheme.po | 75 ++ .../locales/pt/LC_MESSAGES/booktheme.mo | Bin 0 -> 1364 bytes .../locales/pt/LC_MESSAGES/booktheme.po | 75 ++ .../locales/ro/LC_MESSAGES/booktheme.mo | Bin 0 -> 1390 bytes .../locales/ro/LC_MESSAGES/booktheme.po | 75 ++ .../locales/ru/LC_MESSAGES/booktheme.mo | Bin 0 -> 1722 bytes .../locales/ru/LC_MESSAGES/booktheme.po | 75 ++ .../locales/sk/LC_MESSAGES/booktheme.mo | Bin 0 -> 1393 bytes .../locales/sk/LC_MESSAGES/booktheme.po | 75 ++ .../locales/sl/LC_MESSAGES/booktheme.mo | Bin 0 -> 1374 bytes .../locales/sl/LC_MESSAGES/booktheme.po | 75 ++ .../locales/sr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1679 bytes .../locales/sr/LC_MESSAGES/booktheme.po | 75 ++ .../locales/sv/LC_MESSAGES/booktheme.mo | Bin 0 -> 1349 bytes .../locales/sv/LC_MESSAGES/booktheme.po | 75 ++ .../locales/ta/LC_MESSAGES/booktheme.mo | Bin 0 -> 1928 bytes .../locales/ta/LC_MESSAGES/booktheme.po | 66 + .../locales/te/LC_MESSAGES/booktheme.mo | Bin 0 -> 1806 bytes .../locales/te/LC_MESSAGES/booktheme.po | 66 + .../locales/tg/LC_MESSAGES/booktheme.mo | Bin 0 -> 1628 bytes .../locales/tg/LC_MESSAGES/booktheme.po | 75 ++ .../locales/th/LC_MESSAGES/booktheme.mo | Bin 0 -> 1766 bytes .../locales/th/LC_MESSAGES/booktheme.po | 75 ++ .../locales/tl/LC_MESSAGES/booktheme.mo | Bin 0 -> 1273 bytes .../locales/tl/LC_MESSAGES/booktheme.po | 66 + .../locales/tr/LC_MESSAGES/booktheme.mo | Bin 0 -> 1373 bytes .../locales/tr/LC_MESSAGES/booktheme.po | 75 ++ .../locales/uk/LC_MESSAGES/booktheme.mo | Bin 0 -> 1681 bytes .../locales/uk/LC_MESSAGES/booktheme.po | 75 ++ .../locales/ur/LC_MESSAGES/booktheme.mo | Bin 0 -> 1462 bytes .../locales/ur/LC_MESSAGES/booktheme.po | 66 + .../locales/vi/LC_MESSAGES/booktheme.mo | Bin 0 -> 1431 bytes .../locales/vi/LC_MESSAGES/booktheme.po | 75 ++ .../locales/zh_CN/LC_MESSAGES/booktheme.mo | Bin 0 -> 1310 bytes .../locales/zh_CN/LC_MESSAGES/booktheme.po | 75 ++ .../locales/zh_TW/LC_MESSAGES/booktheme.mo | Bin 0 -> 1341 bytes .../locales/zh_TW/LC_MESSAGES/booktheme.po | 75 ++ docs/_static/logo-classicblue-400px.png | Bin 0 -> 10976 bytes docs/_static/minus.png | Bin 0 -> 90 bytes docs/_static/plus.png | Bin 0 -> 90 bytes docs/_static/pygments.css | 152 +++ docs/_static/sbt-webpack-macros.html | 11 + docs/_static/scripts/bootstrap.js | 3 + docs/_static/scripts/bootstrap.js.LICENSE.txt | 5 + docs/_static/scripts/bootstrap.js.map | 1 + docs/_static/scripts/pydata-sphinx-theme.js | 2 + .../scripts/pydata-sphinx-theme.js.map | 1 + docs/_static/scripts/sphinx-book-theme.js | 2 + docs/_static/scripts/sphinx-book-theme.js.map | 1 + docs/_static/searchtools.js | 566 ++++++++ docs/_static/sphinx_highlight.js | 144 +++ docs/_static/styles/bootstrap.css | 6 + docs/_static/styles/bootstrap.css.map | 1 + docs/_static/styles/pydata-sphinx-theme.css | 2 + .../styles/pydata-sphinx-theme.css.map | 1 + docs/_static/styles/sphinx-book-theme.css | 8 + docs/_static/styles/theme.css | 2 + .../vendor/fontawesome/6.1.2/LICENSE.txt | 165 +++ .../vendor/fontawesome/6.1.2/css/all.min.css | 5 + .../vendor/fontawesome/6.1.2/js/all.min.js | 2 + .../6.1.2/js/all.min.js.LICENSE.txt | 5 + .../6.1.2/webfonts/fa-brands-400.ttf | Bin 0 -> 181264 bytes .../6.1.2/webfonts/fa-brands-400.woff2 | Bin 0 -> 105112 bytes .../6.1.2/webfonts/fa-regular-400.ttf | Bin 0 -> 60236 bytes .../6.1.2/webfonts/fa-regular-400.woff2 | Bin 0 -> 24028 bytes .../6.1.2/webfonts/fa-solid-900.ttf | Bin 0 -> 389948 bytes .../6.1.2/webfonts/fa-solid-900.woff2 | Bin 0 -> 154840 bytes .../6.1.2/webfonts/fa-v4compatibility.ttf | Bin 0 -> 10084 bytes .../6.1.2/webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4776 bytes docs/_static/webpack-macros.html | 31 + docs/acknowledgements.html | 496 +++++++ docs/atomics.html | 1069 +++++++++++++++ docs/collectives.html | 1152 +++++++++++++++++ docs/compiling_and_running_programs.html | 435 +++++++ docs/execution_model.html | 534 ++++++++ docs/genindex.html | 670 ++++++++++ docs/index.html | 560 ++++++++ docs/intro.html | 496 +++++++ docs/library_constants.html | 554 ++++++++ docs/library_setup_exit_query.html | 705 ++++++++++ docs/memory_management.html | 584 +++++++++ docs/memory_model.html | 536 ++++++++ docs/memory_ordering.html | 525 ++++++++ docs/objects.inv | Bin 0 -> 5786 bytes docs/programming_model.html | 685 ++++++++++ docs/pt2pt_sync.html | 620 +++++++++ docs/rma.html | 1120 ++++++++++++++++ docs/search.html | 361 ++++++ docs/searchindex.js | 1 + docs/signaling.html | 780 +++++++++++ docs/supported_features.html | 905 +++++++++++++ docs/writing_programs.html | 500 +++++++ 178 files changed, 23145 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/.nojekyll create mode 100644 docs/_images/memory_model-1PPD.png create mode 100644 docs/_sources/acknowledgements.rst create mode 100644 docs/_sources/atomics.rst create mode 100644 docs/_sources/collectives.rst create mode 100644 docs/_sources/compiling_and_running_programs.rst create mode 100644 docs/_sources/execution_model.rst create mode 100644 docs/_sources/index.rst create mode 100644 docs/_sources/intro.rst create mode 100644 docs/_sources/library_constants.rst create mode 100644 docs/_sources/library_setup_exit_query.rst create mode 100644 docs/_sources/memory_management.rst create mode 100644 docs/_sources/memory_model.rst create mode 100644 docs/_sources/memory_ordering.rst create mode 100644 docs/_sources/programming_model.rst create mode 100644 docs/_sources/pt2pt_sync.rst create mode 100644 docs/_sources/rma.rst create mode 100644 docs/_sources/signaling.rst create mode 100644 docs/_sources/supported_features.rst create mode 100644 docs/_sources/writing_programs.rst create mode 100644 docs/_static/basic.css create mode 100644 docs/_static/doctools.js create mode 100644 docs/_static/documentation_options.js create mode 100644 docs/_static/favicon.ico create mode 100644 docs/_static/file.png create mode 100644 docs/_static/images/logo_binder.svg create mode 100644 docs/_static/images/logo_colab.png create mode 100644 docs/_static/images/logo_deepnote.svg create mode 100644 docs/_static/images/logo_jupyterhub.svg create mode 100644 docs/_static/language_data.js create mode 100644 docs/_static/locales/ar/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ar/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/bg/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/bg/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/bn/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/bn/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ca/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ca/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/cs/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/cs/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/da/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/da/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/de/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/de/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/el/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/el/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/eo/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/eo/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/es/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/es/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/et/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/et/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/fi/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/fi/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/fr/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/fr/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/hr/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/hr/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/id/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/id/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/it/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/it/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/iw/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/iw/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ja/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ja/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ko/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ko/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/lt/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/lt/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/lv/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/lv/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ml/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ml/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/mr/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/mr/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ms/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ms/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/nl/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/nl/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/no/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/no/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/pl/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/pl/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/pt/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/pt/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ro/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ro/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ru/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ru/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/sk/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/sk/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/sl/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/sl/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/sr/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/sr/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/sv/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/sv/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ta/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ta/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/te/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/te/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/tg/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/tg/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/th/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/th/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/tl/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/tl/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/tr/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/tr/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/uk/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/uk/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/ur/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/ur/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/vi/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/vi/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/zh_CN/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo create mode 100644 docs/_static/locales/zh_TW/LC_MESSAGES/booktheme.po create mode 100644 docs/_static/logo-classicblue-400px.png create mode 100644 docs/_static/minus.png create mode 100644 docs/_static/plus.png create mode 100644 docs/_static/pygments.css create mode 100644 docs/_static/sbt-webpack-macros.html create mode 100644 docs/_static/scripts/bootstrap.js create mode 100644 docs/_static/scripts/bootstrap.js.LICENSE.txt create mode 100644 docs/_static/scripts/bootstrap.js.map create mode 100644 docs/_static/scripts/pydata-sphinx-theme.js create mode 100644 docs/_static/scripts/pydata-sphinx-theme.js.map create mode 100644 docs/_static/scripts/sphinx-book-theme.js create mode 100644 docs/_static/scripts/sphinx-book-theme.js.map create mode 100644 docs/_static/searchtools.js create mode 100644 docs/_static/sphinx_highlight.js create mode 100644 docs/_static/styles/bootstrap.css create mode 100644 docs/_static/styles/bootstrap.css.map create mode 100644 docs/_static/styles/pydata-sphinx-theme.css create mode 100644 docs/_static/styles/pydata-sphinx-theme.css.map create mode 100644 docs/_static/styles/sphinx-book-theme.css create mode 100644 docs/_static/styles/theme.css create mode 100644 docs/_static/vendor/fontawesome/6.1.2/LICENSE.txt create mode 100644 docs/_static/vendor/fontawesome/6.1.2/css/all.min.css create mode 100644 docs/_static/vendor/fontawesome/6.1.2/js/all.min.js create mode 100644 docs/_static/vendor/fontawesome/6.1.2/js/all.min.js.LICENSE.txt create mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf create mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 create mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf create mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 create mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf create mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 create mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf create mode 100644 docs/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 create mode 100644 docs/_static/webpack-macros.html create mode 100644 docs/acknowledgements.html create mode 100644 docs/atomics.html create mode 100644 docs/collectives.html create mode 100644 docs/compiling_and_running_programs.html create mode 100644 docs/execution_model.html create mode 100644 docs/genindex.html create mode 100644 docs/index.html create mode 100644 docs/intro.html create mode 100644 docs/library_constants.html create mode 100644 docs/library_setup_exit_query.html create mode 100644 docs/memory_management.html create mode 100644 docs/memory_model.html create mode 100644 docs/memory_ordering.html create mode 100644 docs/objects.inv create mode 100644 docs/programming_model.html create mode 100644 docs/pt2pt_sync.html create mode 100644 docs/rma.html create mode 100644 docs/search.html create mode 100644 docs/searchindex.js create mode 100644 docs/signaling.html create mode 100644 docs/supported_features.html create mode 100644 docs/writing_programs.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7356a03 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.*.sw* +build +tags diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9c7b07a --- /dev/null +++ b/LICENSE @@ -0,0 +1,30 @@ +Copyright (c) 2023 Intel Corporation. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +“AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +SPDX-License-Identifier: BSD-3-Clause diff --git a/README.md b/README.md new file mode 100644 index 0000000..05b676b --- /dev/null +++ b/README.md @@ -0,0 +1,155 @@ +# Intel® SHMEM + +[Installation](#installation)   |   [Usage](#usage)   |   [Release Notes](RELEASE_NOTES.md)   |   [Documentation](https://oneapi-src.github.io/ishmem/intro.html)   |   [How to Contribute](CONTRIBUTING.md)   |   [License](LICENSE) + +Intel® SHMEM provides an efficient implementation of GPU-initiated communication on systems with Intel GPUs. + +## Table of Contents + +- [Prerequisites](#prerequisites) +- [Installation](#installation) +- [Usage](#usage) + - [Launching Example Application](#launching-example-application) +- [Additional Resources](#additional-resources) + - [OpenSHMEM Specification](#openshmem-spec) + - [Specification](#ishmem-spec) + +## Prerequisites + +- Linux OS +- Intel® oneAPI DPC++/C++ Compiler 2024.0 or higher. + +### SYCL support +Intel® oneAPI DPC++/C++ Compiler with Level Zero support. + +To install Level Zero, refer to the instructions in [Intel® Graphics Compute Runtime for oneAPI Level Zero and OpenCL™ Driver repository](https://github.com/intel/compute-runtime/releases) or to the [installation guide](https://dgpu-docs.intel.com/installation-guides/index.html) for oneAPI users. + +## Installation +Intel® SHMEM requires a host SHMEM back-end to be used for host-sided operations support. In particular, it relies on an a collection of extension APIs (`shmemx_heap_create`, `shmemx_heap_preinit`, and `shmemx_heap_postinit`) to coordinate the Intel® SHMEM and OpenSHMEM heaps. We recommend [Sandia OpenSHMEM](https://github.com/Sandia-OpenSHMEM/SOS) for this purpose. + +### Building Sandia OpenSHMEM (SOS) +Download the SOS repo to be configured as a back-end for Intel® SHMEM. + +``` +git clone https://github.com/Sandia-OpenSHMEM/SOS.git SOS +``` + +Build SOS following instructions below. `FI_HMEM` support in the provider is required for use with Intel® SHMEM. To enable `FI_HMEM` with a supported provider, we recommend a specific set of config flags. Below are two examples for configuring and building SOS with two providers supporting `FI_HMEM`. To configure SOS with the `verbs;ofi_rxm` provider, use the following instructions: + +``` +cd SOS +./autogen.sh +./configure --prefix= --with-ofi= --enable-pmi-simple --enable-ofi-mr=basic --disable-ofi-inject --enable-ofi-hmem --disable-bounce-buffers --enable-hard-polling +make -j +make install +``` +To configure SOS with the HPE Slingshot provider `cxi`, please use the following instructions: +``` +cd SOS +./autogen.sh +./configure --prefix= --with-ofi= --enable-pmi-simple --enable-ofi-mr=basic --disable-ofi-inject --enable-ofi-hmem --disable-bounce-buffers --enable-ofi-manual-progress --enable-mr-endpoint +make -j +make install +``` +Please choose an appropriate PMI configure flag based on the available PMI client library in the system. Please check for further instructions on [SOS Wiki pages](https://github.com/Sandia-OpenSHMEM/SOS/wiki). Optionally, users may also choose to add `--disable-fortran` since fortran interfaces will not be used. + + +### Building Intel® SHMEM +Check that the SOS build process has successfully created an `` directory with `include` and `lib` as subdirectories. Please find `shmem.h` and `shmemx.h` in `include`. + +Build Intel® SHMEM using the following instructions: + +``` +cd ishmem +mkdir build +cd build +cmake .. -DSHMEM_INSTALL_PREFIX= -DCMAKE_INSTALL_PREFIX= +make -j +``` + +## Usage + +### Launching Example Application + +Validate that Intel® SHMEM was built correctly by running an example program. + +1. Add the library path for SOS to the environment: + +``` +export LD_LIBRARY_PATH=/lib:$LD_LIBRARY_PATH +``` + +2. Run the example program or test on an allocated node using a process launcher: + +``` +mpiexec.hydra -n 2 -hosts ./scripts/ishmrun ./test/unit/SHMEM/int_get_device +``` + +- *Note:* Current supported launchers include: MPI process launchers (i.e. `mpiexec`, `mpiexec.hydra`, `mpirun`, etc.), Slurm (i.e. `srun`, `salloc`, etc.), and PBS (i.e. `qsub`). + +- *Note:* Intel® SHMEM execution model requires applications to use a 1:1 mapping between PEs and GPU devices. Attempting to run an application without the ishmrun launch script may result in undefined behavior if this mapping is not maintained. + - For further details on the device selection, please see [the ONEAPI_DEVICE_SELECTOR](https://github.com/intel/llvm/blob/sycl/sycl/doc/EnvironmentVariables.md#oneapi_device_selector). + +3. Validate the application ran succesfully; example output: + +``` +Selected device: Intel(R) Data Center GPU Max 1550 +Selected vendor: Intel(R) Corporation +Selected device: Intel(R) Data Center GPU Max 1550 +Selected vendor: Intel(R) Corporation +No errors +No errors +``` + +### Launching Example Application w/ CTest + +`ctest` can be used to run Intel® SHMEM tests that are generated at compile-time. To see a list of tests available via `ctest`, run: + +``` +ctest -N +``` + +To launch a single test, execute: + +``` +ctest -R +``` + +Alternatively, all the tests in a directory (such as `test/unit/SHMEM/`) can be run with the following command: + +``` +ctest --test-dir +``` + +By default, a passed or failed test can be detected by the output: +``` + Start 69: sync-2-gpu +1/1 Test #69: sync-2-gpu ....................... Passed 2.29 sec + +100% tests passed, 0 tests failed out of 1 +``` + +To have a test's output printed to the console, add either the `--verbose` or `--output-on-failure` flag to the `ctest` command + +### Available Scheduler Wrappers for Jobs Run via CTest +The following values may be assigned to `CTEST_SCHEDULER` at configure-time (ex. `-DCTEST_SCHEDULER=mpi`) to set which scheduler will be used to run tests launched through a call to `ctest`: + - srun (default) + - Launches CTest jobs on a single node using Slurm's `srun`. + - mpi + - Uses `mpirun` to launch CTest jobs with the appropriate number of processes. + - qsub + - Launches CTest jobs on a single node using `qsub`. If this option is being used on a system where a reservation must be made (i.e. via `pbsresnode`) prior to running a test, assign the `JOB_QUEUE` environment variable to the queue associated with your reservation: + ``` + export JOB_QUEUE= + ``` + +## Additional Resources + +### OpenSHMEM Specification + +- [OpenSHMEM](http://openshmem.org/site/) +- [Specification](http://openshmem.org/site/sites/default/site_files/OpenSHMEM-1.5.pdf) + +### Intel® SHMEM Specification + +- [Intel® SHMEM Specification](https://oneapi-src.github.io/ishmem/intro.html) diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/_images/memory_model-1PPD.png b/docs/_images/memory_model-1PPD.png new file mode 100644 index 0000000000000000000000000000000000000000..15d983a060d6d340a7faaa605d3949b92985800c GIT binary patch literal 363556 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 lI;CP_PAIT4&5r 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
-Fhvz*V7}N!?{&+6?*;mBVA| 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%0AHv3HUWizW1p!~#}G+ce%GuS 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 literal 0 HcmV?d00001 diff --git a/docs/_sources/acknowledgements.rst b/docs/_sources/acknowledgements.rst new file mode 100644 index 0000000..be14291 --- /dev/null +++ b/docs/_sources/acknowledgements.rst @@ -0,0 +1,96 @@ +.. _acknowledgements: + +---------------- +Acknowledgements +---------------- + +Intel acknowledges the OpenSHMEM specification and its many contributors. For +more details on OpenSHMEM, visit http://openshmem.org. + +Some of the Intel® SHMEM documentation and library routines are +derived from the OpenSHMEM specification. +The OpenSHMEM specification belongs to Open Source Software Solutions, Inc. +(OSSS), a nonprofit organization, under an agreement with HPE. +Permission to copy without fee all or part of this material is granted, +provided the OSSS notice and the title of this document appear, and notice is +given that copying is by permission of OSSS. + +All software downloads produced by the OpenSHMEM project on the OpenSHMEM +website are provided under the following BSD 3-clause license. + +Copyright (c) 2016 - 2020 +Stony Brook University + +Copyright (c) 2015 - 2020 +Los Alamos National Security, LLC. + +Copyright (c) 2011 - 2016 +University of Houston System and UT-Battelle, LLC. + +Copyright (c) 2009 - 2016 +Silicon Graphics International Corp. SHMEM is copyrighted by Silicon Graphics International Corp. (SGI) The OpenSHMEM API (shmem) is released by Open Source Software Solutions, Inc., under an agreement with Silicon Graphics International Corp. (SGI). + +Copyright (c) 2016-2020 +Open Source Software Solutions (OSSS), Inc. + +Copyright (c) 2016-2017 +Hewlett Packard Enterprise Development LP. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimers. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the University of Houston System, UT-Battelle, LLC. nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +* Neither the name of Los Alamos National Security, LLC, Los Alamos National + Laboratory, LANL, the U.S. Government, nor the names of its contributors may + be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------- +Notices & Disclaimers +--------------------- + +|Intel_Disclaimers| + +.. |Intel_Disclaimers| raw:: html + + Legal Notices and Disclaimers + +Intel technologies may require enabled hardware, software or service activation. + +No product or component can be absolutely secure. + +Your costs and results may vary. + +© Intel Corporation. Intel, the Intel logo, and other Intel marks are trademarks of Intel Corporation or its subsidiaries. Other names and brands may be claimed as the property of others. + +--------- +Copyright +--------- + +|Creative_Commons_BY_4| + +.. |Creative_Commons_BY_4| raw:: html + +

The Intel® SHMEM specification © 2023 is licensed under CC BY 4.0

+ diff --git a/docs/_sources/atomics.rst b/docs/_sources/atomics.rst new file mode 100644 index 0000000..00c251f --- /dev/null +++ b/docs/_sources/atomics.rst @@ -0,0 +1,461 @@ +.. _atomics: + +------------------------------ +Atomic Memory Operations (AMO) +------------------------------ + +An AMO is a one-sided communication mechanism that +combines memory read, update, or write operations with +atomicity guarantees described in :ref:`Atomicity +Guarantees`. +Similar to the RMA routines, described in :ref:`Remote Memory +Access (RMA)`, the AMOs are performed only on +symmetric objects. +Intel® SHMEM defines two types of AMO +routines: + +#. The `fetching` routines return the original value of, and optionally update, the remote data object in a single atomic operation. The routines return after the data has been fetched from the target PE and delivered to the calling PE. The data type of the returned value is the same as the type of the remote data object. + + The fetching routines include: + ``ishmem_atomic_{fetch,compare_swap,swap}[_nbi]`` and + ``ishmem_atomic_fetch_{inc,add,and,or,xor}[_nbi]``. + +#. The `non-fetching` routines update the remote data object in a single atomic operation. A call to a non-fetching atomic routine issues the atomic operation and may return before the operation executes on the target PE. The ``ishmem_quiet``, ``ishmem_barrier``, or ``ishmem_barrier_all`` routines can be used to force completion for these non-fetching atomic routines. + + The non-fetching routines include: + ``ishmem_atomic_{set,inc,add,and,or,xor}[_nbi]``. + +.. Intel® SHMEM AMO routines specified in this section have two +.. variants. In one of the variants, the context handle, `ctx`, is explicitly +.. passed as an argument. In this variant, the operation is performed on the +.. specified context. If the context handle `ctx` does not correspond to a +.. valid context, the behavior is undefined. In the other variant, the context +.. handle is not explicitly passed and thus, the operations are performed on the +.. default context. + +.. Where appropriate compiler support is available, Intel® SHMEM +.. provides type-generic AMO interfaces via \Cstd[11] generic selection. The +.. type-generic support for the AMO routines is as follows: + +.. #. ``ishmem_atomic_{compare_swap,fetch_inc,inc,fetch_add,add}[_nbi]`` support +.. the ``standard AMO types'' listed in Table~\ref{stdamotypes}, +.. #. ``ishmem_atomic_{fetch,set,swap}`` support +.. the ``extended AMO types'' listed in Table~\ref{extamotypes}, and +.. #. ``ishmem_atomic_{fetch_and,and,fetch_or,or,fetch_xor,xor}[_nbi]`` +.. support the ``bitwise AMO types'' listed in Table~\ref{bitamotypes}. + +The standard, extended, and bitwise AMO types include some of the exact-width +integer types defined in the C++11 language library header ````. + +.. _stdamotypes: + +**Standard AMO Types:** + +================== ========= +TYPE TYPENAME +================== ========= +int int +long long +long long longlong +unsigned int uint +unsigned long ulong +unsigned long long ulonglong +int32_t int32 +int64_t int64 +uint32_t uint32 +uint64_t uint64 +size_t size +ptrdiff_t ptrdiff +================== ========= + +.. _extamotypes: + +**Extended AMO Types:** + +================== ========= +TYPE TYPENAME +================== ========= +float float +double double +int int +long long +long long longlong +unsigned int uint +unsigned long ulong +unsigned long long ulonglong +int32_t int32 +int64_t int64 +uint32_t uint32 +uint64_t uint64 +size_t size +ptrdiff_t ptrdiff +================== ========= + +.. _bitamotypes: + +**Bitwise AMO Types:** + +================== ========= +TYPE TYPENAME +================== ========= +unsigned int uint +unsigned long ulong +unsigned long long ulonglong +int32_t int32 +int64_t int64 +uint32_t uint32 +uint64_t uint64 +================== ========= + +^^^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_FETCH +^^^^^^^^^^^^^^^^^^^ + +Atomically fetches the value of a remote data object. + +Below, TYPE is one of the extended AMO types and has a corresponding TYPENAME +specified by the :ref:`Extended AMO Types table`. + +.. cpp:function:: template TYPE ishmem_atomic_fetch(const TYPE* source, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_atomic_fetch(const TYPE* source, int pe) + + :param source: Symmetric address of the source data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Extended AMO Types`. + :param pe: An integer that indicates the PE number from which **source** is to be fetched. + :returns: The contents at the **source** address on the remote PE. The data type of the return value is the same as the type of the remote data object. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_fetch`` performs an atomic fetch operation. It returns the +contents of the **source** as an atomic operation. + +^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_SET +^^^^^^^^^^^^^^^^^ + +Atomically sets the value of a remote data object. + +Below, TYPE is one of the extended AMO types and has a corresponding TYPENAME +specified by the :ref:`Extended AMO Types table`. + +.. cpp:function:: template void ishmem_atomic_set(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: void ishmem_TYPENAME_atomic_set(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Extended AMO Types`. + :param value: The operand to the atomic set operation. The type of **value** should match TYPE and TYPENAME according to the table of :ref:`Extended AMO Types`. + :param pe: An integer that indicates the PE number on which **dest** is to be updated. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_set`` performs an atomic set operation. +It writes the **value** into **dest** on **pe** as an atomic operation. + +^^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_COMPARE_SWAP +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Performs an atomic conditional swap on a remote data object. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by the :ref:`Standard AMO Types table`. + +.. cpp:function:: template TYPE ishmem_atomic_compare_swap(TYPE* dest, TYPE cond, TYPE value, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_atomic_compare_swap(TYPE* dest, TYPE cond, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param cond: **cond** is compared to the remote **dest** value. If **cond** and the remote **dest** are equal, then **value** is swapped into the remote **dest**; otherwise, the remote **dest** is unchanged. In either case, the old value of the remote **dest** is returned as the routine return value. **cond** must be of the same data type as **dest**. + :param value: The value to be atomically written to the remote PE. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be fetched. + :returns: The contents that had been in the **dest** data object on the remote PE prior to the conditional swap. Data type is the same as the **dest** data type. + +Callable from the **device**. + +**Description:** +The conditional swap routines conditionally update a **dest** data object on +the specified PE and return the prior contents of the data object in one +atomic operation. + +^^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_SWAP +^^^^^^^^^^^^^^^^^^ + +Performs an atomic swap to a remote data object. + +Below, TYPE is one of the extended AMO types and has a corresponding TYPENAME +specified by the :ref:`Extended AMO Types table`. + +.. cpp:function:: template TYPE ishmem_atomic_swap(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_atomic_swap(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Extended AMO Types`. + :param value: The value to be atomically written to the remote PE. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Extended AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be fetched. + :returns: The content that had been at the **dest** address on the remote PE prior to the swap. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_swap`` performs an atomic swap operation. +It writes **value** into **dest** on **pe** and returns the previous contents +of **dest** as an atomic operation. + + +^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_FETCH_INC +^^^^^^^^^^^^^^^^^^^^^^^ + +Performs an atomic fetch-and-increment operation on a remote data object. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by the :ref:`Standard AMO Types table`. + +.. cpp:function:: template TYPE ishmem_atomic_fetch_inc(TYPE* dest, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_atomic_fetch_inc(TYPE* dest, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be fetched. + :returns: The content that had been at the **dest** address on the remote PE prior to the increment. The datatype of the return value is the same as **dest**. + +Callable from the **device**. + +**Description:** +These routines perform a fetch-and-increment operation. +The **dest** on PE **pe** is increased by one and the routine returns the +previous contents of **dest** as an atomic operation. + +^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_INC +^^^^^^^^^^^^^^^^^ + +Performs an atomic increment operation on a remote data object. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by the :ref:`Standard AMO Types table`. + +.. cpp:function:: template void ishmem_atomic_inc(TYPE* dest, int pe) + +.. cpp:function:: void ishmem_TYPENAME_atomic_inc(TYPE* dest, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + +Callable from the **device**. + +**Description:** +These routines perform an atomic increment operation on the **dest** data +object on PE **pe**. + +^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_FETCH_ADD +^^^^^^^^^^^^^^^^^^^^^^^ + +Performs an atomic fetch-and-add operation on a remote data object. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by the :ref:`Standard AMO Types table`. + +.. cpp:function:: template TYPE ishmem_atomic_fetch_add(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_atomic_fetch_add(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param value: The operand to the atomic fetch-and-add operation. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + :returns: The contents that had been at the **dest** address on the remote PE prior to the atomic addition operation. The data type of the return value is the same as **dest**. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_fetch_add`` routines perform an atomic fetch-and-add +operation. +An atomic fetch-and-add operation fetches the old **dest** and adds **value** +to **dest** without the possibility of another atomic operation on the +**dest** between the time of the fetch and the update. +These routines add **value** to **dest** on **pe** and return the previous +contents of **dest** as an atomic operation. + +^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_ADD +^^^^^^^^^^^^^^^^^ + +Performs an atomic add operation on a remote symmetric data object. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by the :ref:`Standard AMO Types table`. + +.. cpp:function:: template void ishmem_atomic_add(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: void ishmem_TYPENAME_atomic_add(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param value: The operand to the atomic add operation. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + +Callable from the **device**. + +**Description:** +The ``ishmem_atomic_add`` routine performs an atomic add operation. +It adds **value** to **dest** on PE **pe** and atomically updates the **dest** +without returning the value. + +^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_FETCH_AND +^^^^^^^^^^^^^^^^^^^^^^^ + +Atomically perform a fetching bitwise AND operation on a remote data object. + +Below, TYPE is one of the bitwise AMO types and has a corresponding TYPENAME +specified by the :ref:`Bitwise AMO Types table`. + +.. cpp:function:: template TYPE ishmem_atomic_fetch_and(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_atomic_fetch_and(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param value: The operand to the atomic add operation. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + :returns: The value pointed to by **dest** on PE **pe** immediately before the operation is performed. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_fetch_and`` atomically performs a fetching bitwise AND on the +remotely accessible data object pointed to by **dest** at PE **pe** with the +operand **value**. + +^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_AND +^^^^^^^^^^^^^^^^^ + +Atomically perform a non-fetching bitwise AND operation on a remote data +object. + +Below, TYPE is one of the bitwise AMO types and has a corresponding TYPENAME +specified by the :ref:`Bitwise AMO Types table`. + +.. cpp:function:: template void ishmem_atomic_and(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: void ishmem_TYPENAME_atomic_and(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param value: The operand to the atomic AND operation. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_and`` atomically performs a non-fetching bitwise AND on the +remotely accessible data object pointed to by **dest** at PE **pe** with the +operand **value**. + +^^^^^^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_FETCH_OR +^^^^^^^^^^^^^^^^^^^^^^ + +Atomically perform a fetching bitwise OR operation on a remote data object. + +Below, TYPE is one of the bitwise AMO types and has a corresponding TYPENAME +specified by the :ref:`Bitwise AMO Types table`. + +.. cpp:function:: template TYPE ishmem_atomic_fetch_or(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_atomic_fetch_or(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param value: The operand to the atomic OR operation. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + :returns: The value pointed to by **dest** on PE **pe** immediately before the operation is performed. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_fetch_or`` atomically performs a fetching bitwise OR on the +remotely accessible data object pointed to by **dest** at PE **pe** with the +operand **value**. + +^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_OR +^^^^^^^^^^^^^^^^ + +Atomically perform a non-fetching bitwise OR operation on a remote data +object. + +Below, TYPE is one of the bitwise AMO types and has a corresponding TYPENAME +specified by the :ref:`Bitwise AMO Types table`. + +.. cpp:function:: template void ishmem_atomic_or(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: void ishmem_TYPENAME_atomic_or(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param value: The operand to the bitwise OR operation. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_or`` atomically performs a non-fetching bitwise OR on the +remotely accessible data object pointed to by **dest** at PE **pe** with the +operand **value**. + +^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_FETCH_XOR +^^^^^^^^^^^^^^^^^^^^^^^ + +Atomically perform a fetching bitwise exclusive OR (XOR) operation on a +remote data object. + +Below, TYPE is one of the bitwise AMO types and has a corresponding TYPENAME +specified by the :ref:`Bitwise AMO Types table`. + +.. cpp:function:: template TYPE ishmem_atomic_fetch_xor(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_atomic_fetch_xor(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param value: The operand to the atomic XOR operation. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + :returns: The value pointed to by **dest** on PE **pe** immediately before the operation is performed. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_fetch_xor`` atomically performs a fetching bitwise XOR on the +remotely accessible data object pointed to by **dest** at PE **pe** with the +operand **value**. + +Callable from the **device**. + +**Description:** + +^^^^^^^^^^^^^^^^^ +ISHMEM_ATOMIC_XOR +^^^^^^^^^^^^^^^^^ + +Atomically perform a non-fetching bitwise exclusive OR (XOR) operation on a +remote data object. + +Below, TYPE is one of the bitwise AMO types and has a corresponding TYPENAME +specified by the :ref:`Bitwise AMO Types table`. + +.. cpp:function:: template void ishmem_atomic_xor(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: void ishmem_TYPENAME_atomic_xor(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param value: The operand to the bitwise XOR operation. The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Bitwise AMO Types`. + :param pe: An integer that indicates the PE number from which **dest** is to be updated. + +Callable from the **device**. + +**Description:** +``ishmem_atomic_XOR`` atomically performs a non-fetching bitwise XOR on the +remotely accessible data object pointed to by **dest** at PE **pe** with the +operand **value**. + diff --git a/docs/_sources/collectives.rst b/docs/_sources/collectives.rst new file mode 100644 index 0000000..34fd72e --- /dev/null +++ b/docs/_sources/collectives.rst @@ -0,0 +1,567 @@ +.. _collectives: + +--------------------- +Collective Operations +--------------------- + +.. important:: Intel® SHMEM does not yet support teams-based + collectives. All collectives must operate on the world team. + +.. important:: All collective operations must complete before another kernel + calls collective operations. + +.. important:: A collective call must be either all host-initiated or + device-initiated. For example, a program that initiate a collective + operation from the host on some PEs but from the device on other PEs has + undefined behavior. + +^^^^^^^^^^^^^^^^^^^^ +ISHMEM_BARRIER_ALL +^^^^^^^^^^^^^^^^^^^^ + +Registers the arrival of a PE at a barrier and blocks the PE until all other +PEs arrive at the barrier and all local updates and remote memory updates are +completed. + +.. cpp:function:: void ishmem_barrier_all() + +Callable from the **host** and **device**. + +**Description:** +The ``ishmem_barrier_all`` routine is a mechanism for synchronizing all PEs +in the world team at once. +This routine blocks the calling PE until all PEs have called +``ishmem_barrier_all``. + +.. In a multithreaded Intel® SHMEM program, only the calling thread is blocked, +.. however, it may not be called concurrently by multiple threads in the same +.. PE. + +Prior to synchronizing with other PEs, ``ishmem_barrier_all`` ensures +completion of all previously issued memory stores, and of all local and remote +memory updates issued via ``ishmem`` AMO and RMA routine calls such as +``ishmem_int_add``, ``ishmem_put_nbi``, and ``ishmem_get_nbi``. + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_BARRIER_ALL_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Registers the arrival of a PE at a barrier and blocks the PE until all other +PEs arrive at the barrier and all local updates and remote memory updates are +completed. + +.. cpp:function:: template void ishmemx_barrier_all_work_group(const Group& group) + + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the barrier operation. + +Callable from the **device**. + +**Description:** +The ``ishmemx_barrier_all_work_group`` routine is a mechanism for +synchronizing all PEs. +Unlike ``ishmem_barrier_all``, ``ishmemx_barrier_all_work_group`` allows +for the device threads within **group** to cooperate towards the barrier +operation. +This may be more performant; for example, when ``ishmem_barrier_all`` +requires `all` device threads in the kernel to invoke RMA operations. +This routine blocks the calling PE until all PEs have called +``ishmemx_barrier_all_work_group``. +All threads in **group** must call the routine with identical arguments. + +^^^^^^^^^^^^^^^^^ +ISHMEM_SYNC_ALL +^^^^^^^^^^^^^^^^^ + +Registers the arrival of a PE at a synchronization point and suspends +execution until all other PEs arrive at the synchronization point. + +.. cpp:function:: void ishmem_sync_all() + +Callable from the **host** and the **device**. + +**Description:** +This routine blocks the calling PE until all PEs have called +``ishmem_sync_all``. + +.. In a multithreaded Intel® SHMEM program, only the calling thread is blocked. + +In contrast with the ``ishmem_barrier_all`` routines, ``ishmem_sync_all`` +only ensures completion and visibility of previously issued memory +stores and does not ensure completion of remote memory updates issued via +``ishmem`` routines. + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_SYNC_ALL_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Registers the arrival of a PE at a synchronization point and suspends +execution until all other PEs arrive at the synchronization point. + +.. cpp:function:: template void ishmemx_sync_all_work_group(const Group& group) + + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the barrier operation. + +Callable from the **device**. + +**Description:** +This routine blocks the calling PE until all PEs have called +``ishmemx_sync_all_work_group``. + +.. In a multithreaded Intel® SHMEM program, only the calling thread is blocked. + +In contrast with the ``ishmem_sync_all`` routine, ``ishmemx_sync_all_work_group`` allows for the device threads within **group** to cooperate towards the sync operation. +This may be more performant; for example, when ``ishmem_sync_all`` +requires `all` device threads in the kernel to invoke RMA operations. +This routine blocks the calling PE until all PEs have called +``ishmemx_sync_all_work_group``. +``ishmemx_sync_all_work_group`` only ensures completion and visibility of +previously issued memory stores and does not ensure completion of remote +memory updates issued via ``ishmem`` routines. +All threads in **group** must call the routine with identical arguments. + + +^^^^^^^^^^^^^^^ +ISHMEM_ALLTOALL +^^^^^^^^^^^^^^^ + +Exchanges a fixed amount of contiguous data blocks between all pairs of PEs +participating in the collective routine. + +.. cpp:function:: int ishmem_TYPENAME_alltoall(TYPE* dest, const TYPE* source, size_t nelems) + +.. cpp:function:: int ishmem_alltoallmem(void* dest, const void* source, size_t nelems) + + :param dest: Symmetric address of a data object large enough to receive the combined total of **nelems** elements from each PE. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of a data object that contains **nelems** elements of data for each PE, ordered according to destination PE. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: The number of elements to exchange for each PE. For ``ishmem_alltoallmem``, elements are bytes. + :returns: zero on successful local completion; otherwise, nonzero. + +Callable from the **host** and **device**. + +**Description:** +The ``ishmem_alltoall`` routines are collective routines. Each PE +participating in the operation exchanges **nelems** data elements +with all other PEs participating in the operation. +The size of a data element is 8 bits for ``ishmem_alltoallmem``. + +The data being sent and received are stored in a contiguous symmetric data +object. +The total size of each PE's **source** object and **dest** object is **nelems** +times the size of an element times `N`, where `N` equals the number of PEs +participating in the operation. +The **source** object contains `N` blocks of data (where the size of each block +is defined by **nelems**) and each block of data is sent to a different PE. + +The same **dest** and **source** arrays, and same value for **nelems** must be +passed by all PEs that participate in the collective. + +.. FIXME: TEAMS + +.. Given a PE `i` that is the `k`:sup:`th` PE participating in the operation and a +.. PE `j` that is the `l`:sup:`th` PE participating in the operation, PE `i` sends +.. the `l`:sup:`th` block of its **source** object to the `k`:sup:`th` block of +.. the **dest** object of PE `j`. + +Given a PE `i` that is the `i`:sup:`th` PE participating in the operation and a +PE `j` that is the `j`:sup:`th` PE participating in the operation, PE `i` sends +the `j`:sup:`th` block of its **source** object to the `i`:sup:`th` block of +the **dest** object of PE `j`. + +All PEs must participate in the collective. + +Before any PE calls a ``ishmem_alltoall`` routine, the following conditions must +be ensured: + +.. FIXME: PSYNC? + +#. The **dest** data object on all PEs is ready to accept the + ``ishmem_alltoall`` data. +#. The **source** data object on all PEs is ready to send. + +Otherwise, the behavior is undefined. + +Upon return from a ``ishmem_alltoall`` routine, the following is true for +the local PE: + +#. Its **dest** symmetric data object is completely updated. +#. The data has been copied out of the **source** data object. + +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_ALLTOALL_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Exchanges a fixed amount of contiguous data blocks between all pairs of PEs +participating in the collective routine. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template int ishmemx_TYPENAME_alltoall_work_group(TYPE* dest, const TYPE* source, size_t nelems, const Group& group) + +.. cpp:function:: template int ishmemx_alltoallmem_work_group(void* dest, const void* source, size_t nelems, const Group& group) + + :param dest: Symmetric address of a data object large enough to receive the combined total of **nelems** elements from each PE. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of a data object that contains **nelems** elements of data for each PE, ordered according to destination PE. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: The number of elements to exchange for each PE. For ``ishmem_alltoallmem``, elements are bytes. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the barrier operation. + :returns: zero on successful local completion; otherwise, nonzero. + +Callable from the **device**. + +**Description:** +The ``ishmemx_alltoall_work_group`` routines have similar semantics and +requirements as the ``ishmem_alltoall`` routines. +In contrast with the ``ishmem_alltoall`` routines, +``ishmemx_alltoall_work_group`` allows for the device threads within **group** +to cooperate towards the all-to-all operation. +This may be more performant; for example, when ``ishmem_alltoall`` +requires `all` device threads in the kernel to invoke RMA operations. +This routine blocks the calling PE until all PEs have called +``ishmemx_alltoall_work_group``. +``ishmemx_alltoall_work_group`` only ensures completion and visibility of +previously issued memory stores and does not ensure completion of remote memory +updates issued via ``ishmem`` routines. +All threads in **group** must call the routine with identical arguments. + +^^^^^^^^^^^^^^^^ +ISHMEM_BROADCAST +^^^^^^^^^^^^^^^^ + +Broadcasts a block of data from one PE to one or more destination PEs. + +Below, TYPE is one of the standard RMA types and has a corresponding TYPENAME +specified by Table :ref:`Standard RMA Types`. + +.. cpp:function:: int ishmem_TYPENAME_broadcast(TYPE* dest, const TYPE* source, size_t nelems, int PE_root) + +.. cpp:function:: int ishmem_broadcastmem(void* dest, const void* source, size_t nelems, int PE_root) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the source data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: The number of elements in the **source** and **dest** arrays. For ``ishmem_broadcastmem``, elements are bytes. + :param PE_root: The PE from which the data is copied. + :returns: zero on successful local completion; otherwise, nonzero. + +Callable from the **host** and **device**. + +**Description:** +The broadcast routines are collective routines across all PEs. +They copy the **source** data object on the PE specified by **PE_root** to +the **dest** data object on the PEs participating in the collective +operation. +The same **dest** and **source** data objects and the same value of +**PE_root** must be passed by all PEs participating in the collective +operation. + +For broadcasts: + +* The **dest** object is updated on all PEs. + +* All PEs must participate in the operation. + +* The values of argument **PE_root** must be the same value on all PEs. + +* The value of **PE_root** must be between 0 and **PE_size** - 1. + +Before any PE calls a broadcast routine, the following conditions must be +ensured: + +* The **dest** array on all PEs participating in the broadcast is ready to accept the broadcast data. + +Otherwise, the behavior is undefined. + +Upon return from a broadcast routine, the following are true for the local +PE: + +* The **dest** data object is updated on all PEs. + +* The **source** data object may be safely reused. + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_BROADCAST_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Broadcasts a block of data from one PE to one or more destination PEs. + +Below, TYPE is one of the standard RMA types and has a corresponding TYPENAME +specified by Table :ref:`Standard RMA Types`. + +.. cpp:function:: template int ishmemx_TYPENAME_broadcast_work_group(TYPE* dest, const TYPE* source, size_t nelems, int PE_root, const Group& group) + +.. cpp:function:: template int ishmemx_broadcastmem_work_group(void* dest, const void* source, size_t nelems, int PE_root, const Group& group) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the source data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: The number of elements in the **source** and **dest** arrays. For ``ishmemx_broadcastmem_work_group``, elements are bytes. + :param PE_root: The PE from which the data is copied. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the barrier operation. + :returns: zero on successful local completion; otherwise, nonzero. + +Callable from the **device**. + +**Description:** +The ``ishmemx_broadcast_work_group`` and +``ishmemx_broadcastmem_work_group`` routines have similar semantics and +requirements as the ``ishmem_broadcast`` routines. +In contrast with the ``ishmem_broadcast`` routines, +``ishmemx_broadcast_work_group`` and ``ishmemx_broadcastmem_work_group`` +allow for the device threads within **group** to cooperate towards the broadcast operation. +This routine blocks the calling PE until all PEs have called +``ishmemx_broadcast_work_group``. +``ishmemx_broadcast_work_group`` only ensures completion and visibility of +previously issued memory stores and does not ensure completion of remote +memory updates issued via ``ishmem`` routines. +All threads in **group** must call the routine with identical arguments. + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEM_COLLECT, ISHMEM_FCOLLECT +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Concatenates blocks of data from multiple PEs to an array in every PE +participating in the collective routine. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: int ishmem_TYPENAME_collect(TYPE* dest, const TYPE* source, size_t nelems) + +.. cpp:function:: int ishmem_TYPENAME_fcollect(TYPE* dest, const TYPE* source, size_t nelems) + +.. cpp:function:: int ishmem_collectmem(void* dest, const void* source, size_t nelems) + +.. cpp:function:: int ishmem_fcollectmem(void* dest, const void* source, size_t nelems) + + :param dest: Symmetric address of an array large enough to accept the concatenation of the **source** arrays on all participating PEs. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the **source** data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: The number of elements in **source** array. For ``ishmem_[f]collectmem``, elements are bytes. + :returns: Zero on successful local completion. Nonzero otherwise. + +Callable from the **host** and **device**. + +**Description:** +The ``ishmem_collect`` and ``ishmem_fcollect`` routines perform a +collective operation to concatenate **nelems** data items from the **source** +array into the **dest** array, over all PEs in processor number order. + +.. For a team, the data from PE number 0 in the team is first, then the contribution from PE 1 in the team, and so on. + +The collected result is written to the **dest** array for all PEs. +The same **dest** and **source** arrays must be passed by all PEs that +participate in the operation. + +The ``ishmem_fcollect`` routines require that **nelems** be the same value +in all participating PEs, while the ``ishmem_collect`` routines allow +**nelems** to vary from PE to PE. + +.. Team-based collect routines operate over all PEs in the provided team +.. argument. +.. All PEs in the provided team must participate in the operation. +.. If **team** compares equal to ``ISHMEM_TEAM_INVALID`` or is otherwise invalid, +.. the behavior is undefined. + +Upon return from a collective routine, the following are true for the local +PE: + +* The **dest** array is updated and the **source** array may be safely + reused. + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_[F]COLLECT_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Concatenates blocks of data from multiple PEs to an array in every PE +participating in the collective routine. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template int ishmemx_TYPENAME_collect_work_group(TYPE* dest, const TYPE* source, size_t nelems, const Group& group) + +.. cpp:function:: template int ishmemx_TYPENAME_fcollect_work_group(TYPE* dest, const TYPE* source, size_t nelems, const Group& group) + +.. cpp:function:: template int ishmemx_collectmem_work_group(void* dest, const void* source, size_t nelems, const Group& group) + +.. cpp:function:: template int ishmemx_fcollectmem_work_group(void* dest, const void* source, size_t nelems, const Group& group) + + :param dest: Symmetric address of an array large enough to accept the concatenation of the **source** arrays on all participating PEs. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the **source** data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: The number of elements in **source** array. For ``ishmemx_[f]collectmem_work_group``, elements are bytes. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the barrier operation. + :returns: Zero on successful local completion. Nonzero otherwise. + +Callable from the **device**. + +**Description:** +The ``ishmemx_[f]collect_work_group`` routines have similar semantics and +requirements as the ``ishmem_[f]collect`` routines. +In contrast with the ``ishmem_[f]collect`` routines, +``ishmemx_[f]collect_work_group`` allows for the device threads within +**group** to cooperate towards the collect operation. +This may be more performant; for example, when ``ishmem_collect`` +requires `all` device threads in the kernel to invoke RMA operations. +This routine blocks the calling PE until all PEs have called +``ishmemx_[f]collect_work_group``. +``ishmemx_[f]collect_work_group`` only ensures completion and visibility of +previously issued memory stores and does not ensure completion of remote +memory updates issued via ``ishmem`` routines. +All threads in **group** must call the routine with identical arguments. + +.. _reductions: + +^^^^^^^^^^^^^^^ +ISHMEM_REDUCE +^^^^^^^^^^^^^^^ + +.. _reducetypes: + +**Reduction Types, Names, and Supporting Operations:** + +================== ========== =================================== +TYPE TYPENAME Operations Supporting TYPE +================== ========== =================================== +char char MAX, MIN, SUM, PROD +signed char schar MAX, MIN, SUM, PROD +short short MAX, MIN, SUM, PROD +int int MAX, MIN, SUM, PROD +long long MAX, MIN, SUM, PROD +long long longlong MAX, MIN, SUM, PROD +ptrdiff_t ptrdiff MAX, MIN, SUM, PROD +unsigned char uchar AND, OR, XOR, MAX, MIN, SUM, PROD +unsigned short ushort AND, OR, XOR, MAX, MIN, SUM, PROD +unsigned int uint AND, OR, XOR, MAX, MIN, SUM, PROD +unsigned long ulong AND, OR, XOR, MAX, MIN, SUM, PROD +unsigned long long ulonglong AND, OR, XOR, MAX, MIN, SUM, PROD +int8_t int8 AND, OR, XOR, MAX, MIN, SUM, PROD +int16_t int16 AND, OR, XOR, MAX, MIN, SUM, PROD +int32_t int32 AND, OR, XOR, MAX, MIN, SUM, PROD +int64_t int64 AND, OR, XOR, MAX, MIN, SUM, PROD +uint8_t uint8 AND, OR, XOR, MAX, MIN, SUM, PROD +uint16_t uint16 AND, OR, XOR, MAX, MIN, SUM, PROD +uint32_t uint32 AND, OR, XOR, MAX, MIN, SUM, PROD +uint64_t uint64 AND, OR, XOR, MAX, MIN, SUM, PROD +size_t size AND, OR, XOR, MAX, MIN, SUM, PROD +float float MAX, MIN, SUM, PROD +double double MAX, MIN, SUM, PROD +================== ========== =================================== + +.. long double longdouble MAX, MIN, SUM, PROD +.. double _Complex complexd SUM, PROD +.. float _Complex complexf SUM, PROD + +The following functions perform reduction operations across all PEs. + +In the functions below, TYPE is one of the reduction types and has a +corresponding TYPENAME specified by Table :ref:`Reduction Types, Names, and Supporting Operations`. + +.. cpp:function:: int ishmem_TYPENAME_and_reduce(TYPE* dest, const TYPE* source, size_t nreduce) + +.. cpp:function:: int ishmem_TYPENAME_or_reduce(TYPE* dest, const TYPE* source, size_t nreduce) + +.. cpp:function:: int ishmem_TYPENAME_xor_reduce(TYPE* dest, const TYPE* source, size_t nreduce) + +.. cpp:function:: int ishmem_TYPENAME_max_reduce(TYPE* dest, const TYPE* source, size_t nreduce) + +.. cpp:function:: int ishmem_TYPENAME_min_reduce(TYPE* dest, const TYPE* source, size_t nreduce) + +.. cpp:function:: int ishmem_TYPENAME_sum_reduce(TYPE* dest, const TYPE* source, size_t nreduce) + +.. cpp:function:: int ishmem_TYPENAME_prod_reduce(TYPE* dest, const TYPE* source, size_t nreduce) + + :param dest: Symmetric address of an array, of length **nreduce** elements, to receive the result of the reduction routines. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Reduction Types`. + :param source: Symmetric address of an array, of length **nreduce** elements, that contains one element for each separate reduction routine. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Reduction Types`. + :param nreduce: The number of elements in the **dest** and **source** arrays. **nreduce** must be of type **size_t** and have the same value across all PEs. + :returns: Zero on successful local completion. Nonzero otherwise. + +Callable from the **host** and **device**. + +**Description:** +``ishmem`` reduction routines are collective routines over all PEs that +compute one or more reductions across symmetric arrays. +A reduction performs an associative binary routine across a set of values. + +The **nreduce** argument determines the number of separate reductions to +perform. +The **source** array on all PEs provides one element for each reduction. +The results of the reductions are placed in the **dest** array on all PEs. + +The **source** and **dest** arguments must either be the same symmetric +address, or two different symmetric addresses corresponding to buffers that +do not overlap in memory. That is, they must be completely overlapping or +completely disjoint. + +.. Team-based reduction routines operate over all PEs in the provided team +.. argument. All PEs in the provided team must participate in the reduction. +.. If **team** compares equal to ``ISHMEM_TEAM_INVALID`` or is otherwise +.. invalid, the behavior is undefined. + +Before any PE calls a reduction routine, the following conditions must be +ensured: + +* The **dest** array on all PEs participating in the reduction is ready to + accept the results of the reduction. + +Otherwise, the behavior is undefined. + +Upon return from a reduction routine, the following are true for the local +PE: + +* The **dest** array is updated and the **source** array may be safely + reused. + +^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_REDUCE_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following functions perform reduction operations across all PEs. + +In the functions below, TYPE is one of the reduction types and has a +corresponding TYPENAME specified by Table :ref:`Reduction Types, Names, and Supporting Operations`. + +.. cpp:function:: template int ishmemx_TYPENAME_and_reduce_work_group(TYPE* dest, const TYPE* source, size_t nreduce, const Group& group) + +.. cpp:function:: template int ishmemx_TYPENAME_or_reduce_work_group(TYPE* dest, const TYPE* source, size_t nreduce, const Group& group) + +.. cpp:function:: template int ishmemx_TYPENAME_xor_reduce_work_group(TYPE* dest, const TYPE* source, size_t nreduce, const Group& group) + +.. cpp:function:: template int ishmemx_TYPENAME_max_reduce_work_group(TYPE* dest, const TYPE* source, size_t nreduce, const Group& group) + +.. cpp:function:: template int ishmemx_TYPENAME_min_reduce_work_group(TYPE* dest, const TYPE* source, size_t nreduce, const Group& group) + +.. cpp:function:: template int ishmemx_TYPENAME_sum_reduce_work_group(TYPE* dest, const TYPE* source, size_t nreduce, const Group& group) + +.. cpp:function:: template int ishmemx_TYPENAME_prod_reduce_work_group(TYPE* dest, const TYPE* source, size_t nreduce, const Group& group) + + :param dest: Symmetric address of an array, of length **nreduce** elements, to receive the result of the reduction routines. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Reduction Types`. + :param source: Symmetric address of an array, of length **nreduce** elements, that contains one element for each separate reduction routine. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Reduction Types`. + :param nreduce: The number of elements in the **dest** and **source** arrays. **nreduce** must be of type **size_t** and have the same value across all PEs. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the barrier operation. + :returns: Zero on successful local completion. Nonzero otherwise. + +Callable from the **device**. + +**Description:** +The ``ishmemx_reduce_work_group`` routines have similar semantics and +requirements as the ``ishmem_reduce`` routines. +In contrast with the ``ishmem_reduce`` routines, +``ishmemx_reduce_work_group`` allows for the device threads within +**group** to cooperate towards the reduction operation. +This may be more performant; for example, when ``ishmem_reduce`` +requires `all` device threads in the kernel to invoke RMA operations. +This routine blocks the calling PE until all PEs have called +``ishmemx_reduce_work_group``. +``ishmemx_reduce_work_group`` only ensures completion and visibility of +previously issued memory stores and does not ensure completion of remote +memory updates issued via ``ishmem`` routines. +All threads in **group** must call the routine with identical arguments. + +.. important:: For the reduction operations ``sum`` and ``prod``, the order of + reduction may not be the same across all PEs, so the results for floating + point datatypes may differ slightly. This is because floating addition and + multiplication are not associative operations. diff --git a/docs/_sources/compiling_and_running_programs.rst b/docs/_sources/compiling_and_running_programs.rst new file mode 100644 index 0000000..0c4052f --- /dev/null +++ b/docs/_sources/compiling_and_running_programs.rst @@ -0,0 +1,29 @@ +.. _compiling_and_running_programs: + +============================== +Compiling and Running Programs +============================== + +Let's consider the simple example program from Section :ref:`Writing Intel® SHMEM Programs` and assume the code is in a file called ``ishmem_example.cpp``. + +To compile the program, we must pass the necessary flags to the Intel® +oneAPI DPC++/C++ Compiler. +For example:: + +$ icpx -I${ISHMEM_INSTALL_DIR}/include -L${ISHMEM_INSTALL_DIR}/lib -fsycl -std=gnu++1z ishmem_example.cpp -o ishmem_example -lsma -lpmi -lze_loader -ldl + +where ``ISHMEM_INSTALL_DIR`` is the path to the Intel® SHMEM +installation directory. + +Intel® SHMEM provides a launcher script, ``ishmrun`` that +assigns the environment variable **ZE_AFFINITY_MASK** so that each PE is +assigned a single SYCL device. +To invoke the ``ishmrum`` script, pass it as the first argument to your +process launcher. +The following example assumes the ``ISHMEM_INSTALL_DIR/bin`` directory is +on your user path and use of the Portable Batch System launcher:: + +$ aprun -N 12 -n 6 ishmrum ishmem_example + +This will launch the example program on 12 PEs with 6 PEs per compute node. + diff --git a/docs/_sources/execution_model.rst b/docs/_sources/execution_model.rst new file mode 100644 index 0000000..a92a6d5 --- /dev/null +++ b/docs/_sources/execution_model.rst @@ -0,0 +1,113 @@ +.. _execution_model: + +=============== +Execution Model +=============== + +An Intel® SHMEM program consists of a set of processes called PEs. +While not required by Intel® SHMEM, in typical usage, PEs are +executed using a single program, multiple data (SPMD) model. +SPMD requires each PE to use the same executable; however, PEs are able to +follow divergent control paths. +PEs are often implemented using OS processes and PEs are permitted to create +additional threads on the host, when supported by the host :ref:`runtime +library`. + +.. important:: Intel® SHMEM requires a one-to-one mapping of PEs + to SYCL devices. This implies that Intel® SHMEM executions must + launch with a number of processes on each compute node that is no more + than the number of available SYCL devices on each one of those nodes. + Intel® SHMEM provides a launcher script called ``ishmrun`` + that assigns the environment variable **ZE_AFFINITY_MASK** so that each + PE is assigned a single SYCL device. Usage of this script is described in + Section :ref:`Compiling and Running + Programs`. + +.. note:: Intel® Data Center GPU Max Series devices utilize a multi-tile + architecture (as of Intel® SHMEM |version| with 1 or 2 tiles). By default, + the Intel® Intel® SHMEM runtime considers each individual `tile` to make up + a single SYCL device. However, setting the environment variable + **enableImplicitScaling=1** enables implicit scaling mode, where each + multi-tile `GPU` is considered to be a single SYCL device. When implicit + scaling is enabled, the GPU driver automatically distributes SYCL device + kernel thread-groups across all tiles. + + In the default case, it is usually reasonable to execute up to 1 PE per + tile. When implicit scaling is enabled, it is usually reasonable to + execute up to 1 PE per multi-tile GPU device. + + +.. FIXME: additional threads, when supported by the Intel® SHMEM library. + +PE execution is loosely coupled, relying on ``ishmem`` routines to +communicate and synchronize among executing PEs. +The Intel® SHMEM phase in a program begins with a call to the +initialization routine ``ishmem_init``, which must be performed before using +any of the other ``ishmem`` routines. +An Intel® SHMEM program concludes its use of the library when all +PEs call ``ishmem_finalize``. +During a call to ``ishmem_finalize``, the Intel® SHMEM library +must complete all pending communication and release all the resources +associated to the library using an implicit collective synchronization across +PEs. +Calling any ``ishmem`` routine before initialization or after +``ishmem_finalize`` leads to undefined behavior. +After finalization, a subsequent initialization call also leads to undefined +behavior. + +.. important:: Because SYCL kernel execution is non-blocking on the host, all + kernels performing ``ishmem`` calls must first `complete` (by calling + ``wait`` or ``wait_and_throw`` on the SYCL queue) before calling + ``ishmem_finalize``. + +.. FIXME: ishmem_init OR ishmem_init_threads / ishmem_finalize OR ishmem_global_exit. + +The PEs of the Intel® SHMEM program are identified by unique +integers. +The identifiers are integers assigned in a monotonically increasing manner from +zero to one less than the total number of PEs. +PE identifiers are used for Intel® SHMEM calls (e.g., to specify +`Put` or `Get` routines on symmetric data objects, collective synchronization +calls) or to dictate a control flow for PEs using constructs of C/C++. +The identifiers are fixed for the duration of the Intel® SHMEM phase +of a program. + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Invoking Intel® SHMEM Operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Pointer arguments to ``ishmem`` routines that point to non-`const` data +must not overlap in memory with other arguments to the same routine, with the +exception of in-place reductions as described in the :ref:`Reductions +Section`. +Otherwise, the behavior is undefined. +Two arguments overlap in memory if any of their data elements are contained +in the same physical memory locations. +In particular, pointers to identical symmetric objects on different PEs do not +overlap, but different pointers on the same PE overlap if they point to the +same memory. +For example, consider an address a returned by the ``ishmem_ptr`` operation +for symmetric object `A` on PE `i`. +Providing the local address `a` and the symmetric address of object `A` to an +``ishmem`` routine targeting PE `i` results in undefined behavior. + +Buffers provided to ``ishmem`` routines are `in-use` until the corresponding +operation has completed at the calling PE. +Updates to a buffer that is in-use, including updates performed through +locally and remotely issued ``ishmem`` operations, result in undefined +behavior. +Similarly, reads from a buffer that is in-use are allowed only when the +buffer was provided as a `const`-qualified argument to the ``ishmem`` +routine for which it is in-use. +Otherwise, the behavior is undefined. +Exceptions are made for buffers that are in-use by AMOs, as described in +:ref:`Atomicity Guarantees`. +For information regarding the completion of Intel® SHMEM +operations, see :ref:`Memory Ordering`. + +.. ``ishmem`` routines with multiple symmetric object arguments do not require +.. these symmetric objects to be located within the same symmetric memory +.. segment. +.. For example, objects located in the symmetric data segment and objects +.. located in the symmetric heap can be provided as arguments to the same OpenSHMEM operation. + diff --git a/docs/_sources/index.rst b/docs/_sources/index.rst new file mode 100644 index 0000000..0bae717 --- /dev/null +++ b/docs/_sources/index.rst @@ -0,0 +1,105 @@ +.. Intel® SHMEM documentation master file, created by + sphinx-quickstart on Thu Mar 10 16:24:14 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +*********************** +Intel® SHMEM +*********************** + +.. toctree:: + :maxdepth: 3 + :caption: Introduction / Essentials + + intro + programming_model + memory_model + execution_model + supported_features + +.. ================================= +.. Language Bindings and Conformance +.. ================================= + +.. toctree:: + :maxdepth: 3 + :caption: Library Constants and Env Vars + + library_constants + +.. _ishmem_api: + +.. toctree:: + :maxdepth: 3 + :caption: Intel® SHMEM API + + library_setup_exit_query + memory_management + rma + atomics + signaling + collectives + pt2pt_sync + memory_ordering + +.. --------------- +.. Team Management +.. --------------- + +.. ------------------------ +.. Communication Management +.. ------------------------ + +.. -------------------- +.. Signaling Operations +.. -------------------- + +.. ------------------- +.. Distributed Locking +.. ------------------- + +.. ============================= +.. OpenSHMEM Profiling Interface +.. ============================= + + +.. toctree:: + :maxdepth: 3 + :caption: Writing and Running Programs + + writing_programs + compiling_and_running_programs + +.. toctree:: + :maxdepth: 3 + :caption: Acknowledgements / Copyright + + acknowledgements + +.. ================== +.. Undefined Behavior +.. ================== + +.. ============================================== +.. Interoperability with other Programming Models +.. ============================================== + +.. ==================== +.. History of OpenSHMEM +.. ==================== +.. +.. ============== +.. Deprecated API +.. ============== + +.. ======================== +.. Changes to this Document +.. ======================== + +.. ======== +.. Glossary +.. ======== + +.. ===== +.. Index +.. ===== diff --git a/docs/_sources/intro.rst b/docs/_sources/intro.rst new file mode 100644 index 0000000..ddc5bc0 --- /dev/null +++ b/docs/_sources/intro.rst @@ -0,0 +1,80 @@ +.. _introduction: + +************ +Introduction +************ + +.. This specification document defines the programming model and the application +.. programming interface (API) of Intel® SHMEM. +.. This :ref:`Introduction` section first describes :ref:`"What is +.. Intel® SHMEM" `, explaining how it differs from +.. the original OpenSHMEM standard, which is described in the :ref:`"What is +.. OpenSHMEM" ` section. + +.. _what_is_ishmem: + +================================ +What is Intel® SHMEM? +================================ + +Intel® SHMEM is a C++ software library interface that enables OpenSHMEM +communication for applications using Intel® Data Center GPU Max Series devices +with device kernels implemented in SYCL. +Intel® SHMEM includes both host-initiated operations as in OpenSHMEM, and new +device-initiated operations callable directly from GPU kernels. +When available, Intel® SHMEM optimizes performance for GPUs connected by Intel® +:math:`\text{X}^e` Link fabric. +For multi-node communication, Intel® SHMEM enables GPU-initiated operations by +passing requests to the host CPU, which transfers the data through the network +fabric to another GPU's memory. + +The original OpenSHMEM specification, described in the :ref:`"What is +OpenSHMEM?" section`, establishes a programming and memory +model that is most suitable for *host-driven* (CPU) communication. +The Intel® SHMEM APIs are based on the original OpenSHMEM +interfaces, but are augmented to support *device-driven* communication across +a network of compute accelerators, as exposed by the |sycl_spec_link|. +Supporting OpenSHMEM communication between SYCL host and device memories +requires subtle modifications to the original OpenSHMEM interfaces, memory +model, and execution model. +The Intel® SHMEM APIs are defined in the context of this adjusted +memory and execution model, which is described in sections :ref:`Memory +Model` and :ref:`Execution Model`. + +.. |sycl_spec_link| raw:: html + + SYCL programming model + +.. _what_is_openshmem: + +================== +What is OpenSHMEM? +================== + +OpenSHMEM is a Partitioned Global Address Space (PGAS) library interface +specification. +OpenSHMEM aims to provide a standard API for SHMEM libraries to aid portability +and facilitate uniform predictable results of OpenSHMEM programs by explicitly +stating the behavior and semantics of the OpenSHMEM library calls. +Through the different versions, OpenSHMEM will continue to address the +requirements of the PGAS community. +As of this specification, many existing vendors support OpenSHMEM-compliant +implementations and new vendors are developing OpenSHMEM library +implementations to help the users write portable OpenSHMEM code. +This ensures that programs can run on multiple platforms without having to deal +with subtle vendor-specific implementation differences. + +The OpenSHMEM [#]_ effort is driven by the OpenSHMEM specification committee +with continuous input from the OpenSHMEM user community. +To see all of the contributors and participants for the OpenSHMEM API, please +see: `http://www.openshmem.org/site/Contributors +`_. +In addition to the specification, the effort includes a reference OpenSHMEM +implementation, validation and verification suites, tools, a mailing list and +website infrastructure to support specification activities. For more +information please refer to: `http://www.openshmem.org +`_. + +.. [#] The OpenSHMEM specification is owned by Open Source Software Solutions Inc., a nonprofit organization, under an agreement with HPE. + + diff --git a/docs/_sources/library_constants.rst b/docs/_sources/library_constants.rst new file mode 100644 index 0000000..8924359 --- /dev/null +++ b/docs/_sources/library_constants.rst @@ -0,0 +1,182 @@ +.. _library_constants: + +================= +Library Constants +================= + +.. .. c:macro:: ISHMEM_THREAD_SINGLE +.. +.. The thread support level which specifies that the program must not be multithreaded. +.. +.. .. c:macro:: ISHMEM_THREAD_FUNNELED +.. +.. The thread support level which specifies that the program may be multithreaded +.. but must ensure that only the main thread invokes the ``ishmem`` interfaces. +.. +.. .. c:macro:: ISHMEM_THREAD_SERIALIZED +.. +.. The thread support level which specifies that the program may be multithreaded +.. but must ensure that the ``ishmem`` interfaces are not invoked concurrently +.. by multiple threads. +.. +.. .. c:macro:: ISHMEM_THREAD_MULTIPLE +.. +.. The thread support level which specifies that the program may be multithreaded +.. and any thread may invoke the ``ishmem`` interfaces. + +.. c:macro:: ISHMEM_MAJOR_VERSION + +Integer representing the major version of Intel® SHMEM Specification +in use. + +.. c:macro:: ISHMEM_MINOR_VERSION + +Integer representing the minor version of Intel® SHMEM Specification +in use. + +.. c:macro:: ISHMEM_MAX_NAME_LEN + +Integer representing the maximum length of ``ISHMEM_VENDOR_STRING``. + +.. c:macro:: ISHMEM_VENDOR_STRING + +String representing vendor defined information of size at most +``ISHMEM_MAX_NAME_LEN``. The string ``ISHMEM_VENDOR_STRING`` is terminated by a +null character. + +.. .. c:macro:: ISHMEM_CMP_EQ +.. +.. An integer constant expression corresponding to the “equal to” comparison +.. operation. +.. See Section :ref:`Point-to-Point Synchronization` for more +.. detail about its use. +.. +.. .. c:macro:: ISHMEM_CMP_NE +.. +.. An integer constant expression corresponding to the “not equal to” comparison +.. operation. +.. See Section :ref:`Point-to-Point Synchronization` for more +.. detail about its use. +.. +.. .. c:macro:: ISHMEM_CMP_LT +.. +.. An integer constant expression corresponding to the “less than” comparison +.. operation. +.. See Section :ref:`Point-to-Point Synchronization` for more +.. detail about its use. +.. +.. .. c:macro:: ISHMEM_CMP_LE +.. +.. An integer constant expression corresponding to the “less than or equal to” +.. comparison operation. +.. See Section :ref:`Point-to-Point Synchronization` for more +.. detail about its use. +.. +.. .. c:macro:: ISHMEM_CMP_GT +.. +.. An integer constant expression corresponding to the “greater than” comparison +.. operation. +.. See Section :ref:`Point-to-Point Synchronization` for more +.. detail about its use. +.. +.. .. c:macro:: ISHMEM_CMP_GE +.. +.. An integer constant expression corresponding to the “greater than or equal to” +.. comparison operation. +.. See Section :ref:`Point-to-Point Synchronization` for more +.. detail about its use. + +.. ISHMEM_TEAM_NUM_CONTEXTS +.. ISHMEM_TEAM_INVALID +.. ISHMEM_CTX_INVALID +.. ISHMEM_CTX_SERIALIZED +.. ISHMEM_CTX_PRIVATE +.. ISHMEM_CTX_NOSTORE +.. ISHMEM_SIGNAL_SET +.. ISHMEM_SIGNAL_ADD +.. ISHMEM_MALLOC_ATOMICS_REMOTE +.. ISHMEM_MALLOC_SIGNAL_REMOTE + + +.. =============== +.. Library Handles +.. =============== +.. +.. .. c:macro:: ISHMEM_TEAM_WORLD +.. +.. .. c:macro:: ISHMEM_TEAM_SHARED +.. +.. .. c:macro:: ISHMEM_CTX_DEFAULT + +.. _env_vars: + +===================== +Environment Variables +===================== + +The Intel® SHMEM specification provides a set of environment +variables that allows users to configure the implementation and receive +information about the implementation. + +.. c:macro:: ISHMEM_VERSION + +If set to any value, print the library version at startup. + +.. c:macro:: ISHMEM_INFO + +If set to any value, print helpful text about all these environment variables. + +.. c:macro:: ISHMEM_SYMMETRIC_SIZE + +Specifies the size (in bytes) of the symmetric heap memory per PE. +The resulting size is implementation-defined and must be at least as large as +the integer ceiling of the product of the numeric prefix and the scaling +factor. +The allowed character suffixes for the scaling factor are as follows: + +* k or K multiplies by :math:`2^{10}` (kibibytes) + +* m or M multiplies by :math:`2^{20}` (mebibytes) + +* g or G multiplies by :math:`2^{30}` (gibibytes) + +* t or T multiplies by :math:`2^{40}` (tebibytes) + +For example, string "20m" is equivalent to the integer value 20971520, or 20 +mebibytes. +Similarly the string "3.1M" is equivalent to the integer value 3250586. +Only one multiplier is recognized and any characters following the multiplier +are ignored, so "20kk" will not produce the same result as "20m". +Usage of string ".5m" will yield the same result as the string "0.5m". +An invalid value for ``ISHMEM_SYMMETRIC_SIZE`` is an error, which causes the +Intel® SHMEM library to terminate the program. + +.. c:macro:: ISHMEM_DEBUG + +If set to any value, enable debugging messages. + +.. c:macro:: ISHMEM_SHMEM_LIB_NAME + +Informs the Intel® SHMEM library of the shared object name (e.g. +``libshmem.so``) of the host-side OpenSHMEM library to be dynamically loaded. +The default value is ``libsma.so``. + +.. c:macro:: ISHMEM_ENABLE_GPU_IPC + +Enables the intra-node inter-process communication (IPC) implementation. +The default value is 1 which enables use of the Intel® :math:`\text{X}^e` Link +fabric for inter-GPU communications on the same super-node. +The value can be set to 0 for situations in which Intel® :math:`\text{X}^e` +Link fabric is not available or does not connect all the GPUs. + +.. c:macro:: ISHMEM_ENABLE_GPU_IPC_PIDFD + +Enables the pidfd implementation of IPC. +This is enabled by default, but will fail on older Linux kernels that do not +support the necessary systiem calls. +In such cases, use ISHMEM_ENABLE_GPU_IPC_PIDFD=0 + +.. c:macro:: ISHMEM_ENABLE_ACCESSIBLE_HOST_HEAP + +Place symmetric heap in `host` unified shared memory (allocated on the host and +accessible by the host and device). diff --git a/docs/_sources/library_setup_exit_query.rst b/docs/_sources/library_setup_exit_query.rst new file mode 100644 index 0000000..525ce00 --- /dev/null +++ b/docs/_sources/library_setup_exit_query.rst @@ -0,0 +1,233 @@ +.. _library_setup_exit_query_routines: + +--------------------------------------- +Library Setup, Exit, and Query Routines +--------------------------------------- + +.. _ishmem_init: + +.. toctree:: + :maxdepth: 2 + :caption: ISHMEM_INIT + +The library setup, exit, and query interfaces initialize and monitor the +parallel environment of the PEs. + +^^^^^^^^^^^ +ISHMEM_INIT +^^^^^^^^^^^ + +.. cpp:function:: void ishmem_init() + +Callable from the **host**. + +**Description:** +Initializes the ``ishmem`` library. +:ref:`ishmem_init` and +:ref:`ishmemx_init_attr` are collective operations that +all PEs must call before any other ``ishmem`` routine may be called. + +At the end of the ``ishmem`` program which it initialized, the call to +``ishmem_init`` must be matched with a call to ``ishmem_finalize``. +After the first call to ``ishmem_init``, a subsequent call to +``ishmem_init`` or ``ishmemx_init_attr`` in the same program results in +undefined behavior. + +.. _ishmemx_runtime_type_t: + +^^^^^^^^^^^^^^^^^ +ISHMEMX_INIT_ATTR +^^^^^^^^^^^^^^^^^ + +.. cpp:enum:: ishmemx_runtime_type_t + + .. c:macro:: ISHMEM_RUNTIME_OPENSHMEM + .. c:macro:: ISHMEM_RUNTIME_MPI + .. c:macro:: ISHMEM_RUNTIME_PMI + +Callable from the **host**. + +**Description:** +Indicates which runtime is used to initialize Intel® SHMEM: either +OpenSHMEM, MPI, or PMI. + +.. important:: As of Intel® SHMEM |version| only ISHMEM_RUNTIME_OPENSHMEM is supported. + +.. _ishmemx_attr_t: +.. cpp:struct:: ishmemx_attr_t + + .. c:var:: ishmemx_runtime_type_t runtime + .. c:var:: bool initialize_runtime = true + .. c:var:: bool gpu = true + +**Description:** +A struct declaration describing attributes for initialization. +A valid **runtime** enumeration value must be set by the user and must +correspond to a runtime that is enabled within the build of the ``ishmem`` +library. +By default, the parallel runtime is assumed to be initialized by the user +(**initialize_runtime** default is ``false``). +The **gpu** boolean indicates whether to use GPU memory for the symmetric +heap (default is ``false``). + +.. _ishmemx_init_attr: +.. cpp:function:: void ishmemx_init_attr(ishmemx_attr_t * attr) + + :param attr: a struct of type :ref:`ishmemx_attr_t` specifying initialization attributes + +Callable from the **host**. + +**Description:** +Initializes the ``ishmem`` library. +:ref:`ishmem_init` and +:ref:`ishmemx_init_attr` are collective operations that +all PEs must call before any other ``ishmem`` routine may be called. +At the end of the ``ishmem`` program which it initialized, the call to +``ishmem_init`` must be matched with a call to ``ishmem_finalize``. +After the first call to ``ishmemx_init_attr``, a subsequent call to +``ishmemx_init_attr`` or ``ishmem_init`` in the same program results in +undefined behavior. + +^^^^^^^^^^^^ +ISHMEM_MY_PE +^^^^^^^^^^^^ + +.. cpp:function:: int ishmem_my_pe() + + :returns: the PE number + +Callable from the **host** and **device**. + +**Description:** +This routine returns the PE number of the calling PE. The result is an +integer between 0 and *npes* - 1, where *npes* is the total number of PEs +executing the current program. + +^^^^^^^^^^^^ +ISHMEM_N_PES +^^^^^^^^^^^^ + +.. cpp:function:: int ishmem_n_pes() + + :returns: the number of total PEs running in the program + +Callable from the **host** and **device**. + +**Description:** +The routine returns the number of PEs running in the program. + +^^^^^^^^^^^^^^^ +ISHMEM_FINALIZE +^^^^^^^^^^^^^^^ + +.. cpp:function:: void ishmem_finalize() + + +Callable from the **host**. + +**Description:** +``ishmem_finalize`` is a collective operation that ends the ``ishmem`` +portion of a program previously initialized by +:ref:`ishmem_init` or +:ref:`ishmemx_init_attr` and releases all resources used +by the ``ishmem`` library. +This collective operation requires all PEs to participate in the call. +There is an implicit global barrier in ``ishmem_finalize`` to ensure that +pending communications are completed and that no resources are released until +all PEs have entered ``ishmem_finalize``. +``ishmem_finalize`` must be the last ``ishmem`` library call encountered in +the ``ishmem`` portion of a program. +A call to ``ishmem_finalize`` will release all resources initialized by a +corresponding call to ``ishmem_init`` or ``ishmemx_init_attr``. All +processes that represent the PEs will still exist after the call to +``ishmem_finalize`` returns, but they will no longer have access to resources +that have been released. + +.. note:: Because SYCL kernel execution is non-blocking on the host, all + kernels performing ``ishmem`` calls must first `complete` (for example, by + calling ``wait`` or ``wait_and_throw`` on the SYCL queue) before calling + ``ishmem_finalize``. + +.. ^^^^^^^^^^^^^^^^^^^^ +.. ISHMEM_GLOBAL_EXIT +.. ^^^^^^^^^^^^^^^^^^^^ + +.. ^^^^^^^^^^^^^^^^^^^^^^ +.. ISHMEM_PE_ACCESSIBLE +.. ^^^^^^^^^^^^^^^^^^^^^^ + +.. ^^^^^^^^^^^^^^^^^^^^^^^^ +.. ISHMEM_ADDR_ACCESSIBLE +.. ^^^^^^^^^^^^^^^^^^^^^^^^ + +^^^^^^^^^^ +ISHMEM_PTR +^^^^^^^^^^ + +.. cpp:function:: void* ishmem_ptr(const void* dest, int pe) + + :param dest: The symmetric address of the remotely accessible data object to be referenced + :param pe: An integer that indicates the PE number on which **dest** is to be accessed. + :returns: A local pointer to the remotely accessible **dest** data object is returned when it can be accessed using memory loads and stores. Otherwise, a null pointer is returned. + +Callable from the **host** and **device**. + +**Description:** +``ishmem_ptr`` returns a **device** address that may be used to directly +reference **dest** on the specified PE. +This address can be assigned to a pointer. +After that, ordinary loads and stores to **dest** may be performed from +within the device kernel. +The address returned by ``ishmem_ptr`` is a local address to a remotely +accessible data object. +Providing this address to an argument of a ``ishmem`` routine that requires +a symmetric address results in undefined behavior. + +The ``ishmem_ptr`` routine can provide an efficient means to accomplish +communication, for example when a sequence of reads and writes to a data +object on a remote PE does not match the access pattern provided in a +``ishmem`` data transfer routine like ``ishmem_put`` or +``ishmem_iget``. + +.. ^^^^^^^^^^^^^^^^^ +.. ISHMEM_TEAM_PTR +.. ^^^^^^^^^^^^^^^^^ + +^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEM_INFO_GET_VERSION +^^^^^^^^^^^^^^^^^^^^^^^ + +.. cpp:function:: void ishmem_info_get_version(int* major, int* minor) + + :param major: The major version of the ``ishmem`` specification in use. + :param minor: The minor version of the ``ishmem`` specification in use. + +Callable from the **host** and **device**. + +**Description:** +Returns the major and minor version of the ``ishmem`` specification in use. +For a given library implementation, the major and minor version returned by +these calls are consistent with the library constants ISHMEM_MAJOR_VERSION +and ISHMEM_MINOR_VERSION. + +^^^^^^^^^^^^^^^^^^^^ +ISHMEM_INFO_GET_NAME +^^^^^^^^^^^^^^^^^^^^ + +.. cpp:function:: void ishmem_info_get_name(char* name) + + :param name: The vendor defined string. + +Callable from the **host** and **device**. + +**Description:** +This routine returns the vendor defined name string of size defined by the +library constant ISHMEM_MAX_NAME_LEN. The program calling this function +provides the **name** memory buffer of at least size ISHMEM_MAX_NAME_LEN. The +implementation copies the vendor defined string of size at most +ISHMEM_MAX_NAME_LEN to **name**. The string is terminated by a null +character. If the **name** memory buffer is provided with size less than +ISHMEM_MAX_NAME_LEN, behavior is undefined. For a given library +implementation, the vendor string returned is consistent with the library +constant ISHMEM_VENDOR_STRING. + diff --git a/docs/_sources/memory_management.rst b/docs/_sources/memory_management.rst new file mode 100644 index 0000000..e23cb0e --- /dev/null +++ b/docs/_sources/memory_management.rst @@ -0,0 +1,148 @@ +.. _memory_management: + +----------------- +Memory Management +----------------- +Intel® SHMEM provides a set of APIs for managing the symmetric heap. +The APIs allow one to dynamically allocate, deallocate, and align symmetric +data objects in the symmetric heap. + +The ``ishmem_malloc``, ``ishmem_align``, and ``ishmem_free`` routines are +provided so that multiple PEs in a program can allocate symmetric, remotely +accessible memory blocks. +These memory blocks can then be used with ``ishmem`` communication routines. +When no action is performed, these routines return without performing a +barrier. +Otherwise, each of these routines includes at least one call to a procedure +that is semantically equivalent to ``ishmem_barrier_all``: +``ishmem_malloc`` and ``ishmem_align`` call a barrier on exit; +and ``ishmem_free`` calls a barrier on entry. +This ensures that all PEs participate in the memory allocation, and that the +memory on other PEs can be used as soon as the local PE returns. +The user is responsible for calling these routines with identical argument(s) +on all PEs; if differing **ptr**, **size**, or **alignment** arguments are +used, the behavior of the call and any subsequent ``ishmem`` calls is +undefined. + +.. The implicit barriers performed by these routines quiet the default context. +.. It is the user's responsibility to ensure that no communication operations +.. involving the given memory block are pending on other contexts prior to calling +.. the ``ishmem_free`` and ``ishmem_realloc`` routines. + +^^^^^^^^^^^^^^^ +ISHMEM_MALLOC +^^^^^^^^^^^^^^^ + +.. cpp:function:: void* ishmem_malloc(size_t size) + + :param size: The size, in bytes, of a block to be allocated from the symmetric heap. + :returns: The symmetric address of the allocated space; otherwise, it returns a null pointer. + +Callable from the **host**. + +**Description:** +The ``ishmem_malloc`` routine returns the symmetric address of a block of at +least **size** bytes, which shall be suitably aligned so that it may be +assigned to a pointer to any type of object. This space is allocated from the +symmetric heap (in contrast to malloc, which allocates from the private heap). +The memory space is uninitialized. +When **size** is zero, the ``ishmem_malloc`` routine performs no action and +returns a null pointer; otherwise, ``ishmem_malloc`` calls a barrier on exit. + +The value of the **size** argument must be identical on all PEs; otherwise, the +behavior is undefined. + +^^^^^^^^^^^^^ +ISHMEM_FREE +^^^^^^^^^^^^^ + +.. cpp:function:: void ishmem_free(void* ptr) + + :param ptr: Symmetric address of an object in the symmetric heap. + +Callable from the **host**. + +**Description:** +The ``ishmem_free`` routine causes the block to which **ptr** points to be +deallocated, that is, made available for further allocation. If **ptr** is a +null pointer, no action is performed; otherwise, ``ishmem_free`` calls a +barrier on entry. It is the user's responsibility to ensure that no +communication operations involving the given memory block are pending on other +communication contexts prior to calling ``ishmem_free``. + +The value of the **ptr** argument must be identical on all PEs; otherwise, the +behavior is undefined. + +.. note:: The |release| version of the ``ishmem_free`` routine does not + release memory for use in subsequent allocations. This issue will be + fixed in a future version of Intel® SHMEM. + +.. ^^^^^^^^^^^^^^^^ +.. ISHMEM_REALLOC +.. ^^^^^^^^^^^^^^^^ +.. +.. .. cpp:function:: void ishmem_realloc(void* ptr, size_t size) +.. +.. :param ptr: +.. :param size: + +^^^^^^^^^^^^^^ +ISHMEM_ALIGN +^^^^^^^^^^^^^^ + +.. cpp:function:: void ishmem_align(size_t alignment, size_t size) + + :param alignment: Byte alignment of the block allocated on the symmetric heap. + :param size: The size, in bytes, of a block to be allocated from the symmetric heap. + :returns: An aligned symmetric address whose value is a multiple of alignment; otherwise returns a null pointer. + +Callable from the **host**. + +**Description** +The ``ishmem_align`` routine allocates a block in the symmetric heap that has +a byte alignment specified by the **alignment** argument. The value of +**alignment** shall be a multiple of ``sizeof(void *)`` that is also a power of +two. Otherwise, the behavior is undefined. When size is zero, the +``ishmem_align`` routine performs no action and returns a null pointer; +otherwise, ``ishmem_align`` call a barrier on exit. +The memory space is uninitialized. + +.. ^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. ISHMEM_MALLOC_WITH_HINTS +.. ^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. +.. .. cpp:function:: void ishmem_malloc_with_hints(size_t size, long hints) +.. +.. :param size: +.. :param hints: + +^^^^^^^^^^^^^^^ +ISHMEM_CALLOC +^^^^^^^^^^^^^^^ + +.. cpp:function:: void* ishmem_calloc(size_t count, size_t size) + + :param count: The number of elements to allocate. + :param size: The size in bytes of each element to allocate. + :returns: A pointer to the lowest byte address of the allocated space; otherwise, it returns a null pointer. + +Callable from the **host**. + +**Description:** + The ``ishmem_calloc`` routine is a collective operation that allocates a + region of remotely-accessible memory for an array of **count** objects of + **size** bytes each and returns a pointer to the lowest byte address of the + allocated symmetric memory. The space is initialized to all bits zero. + + If the allocation succeeds, the pointer returned shall be suitably aligned so + that it may be assigned to a pointer to any type of object. If the + allocation does not succeed, or either **count** or **size** is 0, the return + value is a null pointer. + + The values for **count** and **size** shall each be equal across all PEs + calling ``ishmem_calloc``; otherwise, the behavior is undefined. + + When **count** or **size** is 0, the ``ishmem_calloc`` routine returns + without performing a barrier. Otherwise, this routine calls a procedure that + is semantically equivalent to a barrier on exit. + diff --git a/docs/_sources/memory_model.rst b/docs/_sources/memory_model.rst new file mode 100644 index 0000000..a774526 --- /dev/null +++ b/docs/_sources/memory_model.rst @@ -0,0 +1,169 @@ +.. _memory_model: + +============ +Memory Model +============ + +.. _memory_model_diagram: + +.. image:: img/memory_model-1PPD.png + :width: 1000 + :align: center + + +An Intel® SHMEM program consists of data objects that are private to +each PE and data objects that are remotely accessible by all PEs. +Private data objects are stored in the local host memory of a given PE or in +the device memory of the device local to the PE, and private objects cannot be +accessed by other PEs via ``ishmem`` routines. +Private data objects on the host follow the memory model of C/C++ and private +data objects on the device follow the SYCL device memory model (see `SYCL device memory model +`_). + +Remotely accessible objects, however, can be accessed by remote PEs using +``ishmem`` routines within SYCL device kernels. +Remotely accessible data objects are called `Symmetric Data Objects`. +Each symmetric data object has a corresponding object with the same name, type, +and size on all PEs where that object is accessible via the Intel® SHMEM API. + +In Intel® SHMEM, global and static C++ variables are remotely +accessible `only` by using ``ishmem`` routines that are callable from the +**host** (this kind of data object must not be defined in a dynamic shared +object). +On the other hand, C++ data allocated by the memory management +routines (Section :ref:`Memory Management`) are remotely +accessible by using ``ishmem`` APIs that are callable from `either` the +**host** or the **device**. + +.. TODO: + +.. \footnote{For efficiency reasons, the same offset (from an +.. arbitrary memory address) for symmetric data objects might be used on all PEs. +.. Further discussion about symmetric heap +.. layout and implementation efficiency can be found in Section ishmem_free}. +.. (For the definition of what is accessible, see the +.. descriptions for ishmem_pe_accessible and ishmem_addr_accessible +.. in Sections ishmem_pe_accessible and +.. ishmem_addr_accessible.) + +The ``ishmem`` dynamic memory allocation routines (e.g., ``ishmem_malloc``) +allow collective allocation of `Symmetric Data Objects` on a special memory +region called the `Symmetric Heap`. +The Symmetric Heap is created during the execution of a program at a memory +location determined by the implementation. +The Symmetric Heap may reside in different memory regions on different PEs. +:ref:`The memory model diagram` shows an example of the +Intel® SHMEM memory layout, illustrating the location of remotely +accessible symmetric objects and private data objects. + +.. _pointers_to_symmetric_objects: + +----------------------------- +Pointers to Symmetric Objects +----------------------------- + +Symmetric data objects are referenced in ``ishmem`` routines through the +local pointer to the desired remotely accessible object. +The address contained in this pointer is referred to as a `symmetric address`. +Every symmetric address is also a `local address` that is valid for direct +memory access; however, not all local addresses are symmetric. +Manipulation of symmetric addresses passed to ``ishmem`` routines - including +pointer arithmetic, array indexing, and access of structure or union members - +are permitted as long as the resulting local pointer remains within the same +symmetric allocation or object. +Symmetric addresses are only valid at the PE where they were generated; using a +symmetric address generated by a different PE for direct memory access or as an +argument to a ``ishmem`` routine results in undefined behavior. + +Symmetric addresses provided to typed ``ishmem`` interfaces must be naturally +aligned based on their type and any requirements of the underlying +architecture. + +.. TODO: + +.. Symmetric addresses provided to fixed-size Intel® SHMEM interfaces +.. (e.g., ``ishmem_put32``) must also be aligned to the given size. +.. Symmetric objects provided to fixed-size Intel® SHMEM interfaces +.. must have storage size equal to the bit-width of the given +.. operation\footnote{The bit-width of a byte is implementation-defined in \Cstd. +.. The \CONST{CHAR\_BIT} constant in \HEADER{limits.h} can be used to portably +.. calculate the bit-width of a \Cstd object.}. +.. Because \CorCpp{} structures may contain implementation-defined padding, the +.. fixed-size interfaces should not be used with \CorCpp{} structures. +.. The `mem` interfaces (e.g., ``ishmem_putmem``) have no alignment +.. requirements. + +The DPC++/SYCL programming model supports Unified Shared Memory between host +and GPU. +In that model, memory can be `host`, `device`, or `shared`. +In Intel® SHMEM, the symmetric heap is in `device` memory and is not accessible +from the host by loads and stores, but SYCL routines such as +``sycl::queue::memcpy()`` may be used. +SYCL `host` Memory may be allocated by ``sycl::malloc_host()`` and is accesible +using loads and stores in both host and device kernel code. +SYCL kernels generally do not have access to host global and static objects. + +Intel® SHMEM augments the DPC++/SYCL memory model to some degree, in that +host-initiated operations can reference objects in the symmetric heap on the +same or other PEs, even though device memory is not accessible by loads and +stores. +Host-initiated operations can also refer to global and static objects on the +same or other PEs. +Device-initiated operations may only reference objects in the symmetric heap. + +The ``ishmem_ptr`` routine allows the programmer to obtain a local pointer to a +remotely accessible object at a specified PE if load-store access is possible. +For Intel® :math:`\text{X}^e` Link fabric connected GPUs, ``ishmem_ptr`` may +return a valid address for direct access to symmetric heap objects that are +accessible via the :math:`\text{X}^e` Link fabric. +``ishmem_ptr`` called on the host will generally not return a valid address +for a symmetric heap object even on the same PE. +A pointer returned by ``ishmem_optr`` is valid for direct memory access; however, +providing this address as an argument of an ``ishmem`` routine that requires a +symmetric address results in undefined behavior. + +.. _amo_guarantees: + +-------------------- +Atomicity Guarantees +-------------------- + +Intel® SHMEM contains a number of routines that perform atomic +operations on symmetric data objects, which are defined in the :ref:`Atomic +Memory Operations` section. +The atomic routines guarantee that concurrent accesses by any of these routines +to the same location, using the same datatype (specified in the :ref:`Standard +AMO Types` and :ref:`Extended AMO Types` tables) +will be exclusive. +Exclusivity is also guaranteed when the target PE performs a wait or test +operation on the same location and with the same datatype as one or more atomic +operations. + +.. FIXME: in the same atomicity domain will be exclusive. + +.. An Intel® SHMEM `atomicity domain` is a set of communication +.. contexts whose associated teams (see Section teams) are +.. all split by (possibly recursive) calls to a +.. ishmem_team_split_* routine from a common predefined team. +.. Intel® SHMEM defines two such predefined teams, +.. ``ISHMEM_TEAM_WORLD`` and ``ISHMEM_TEAM_SHARED`` (see the `Library +.. Handles` section). +.. \footnote{ +.. Although all PEs in ISHMEM_TEAM_SHARED are also +.. in ISHMEM_TEAM_WORLD, and a PE's number can be +.. translated from its ISHMEM_TEAM_SHARED to +.. ISHMEM_TEAM_WORLD, the +.. ISHMEM_TEAM_SHARED team is defined as not having +.. been created by a call to a ishmem_team_split_* routine on +.. ISHMEM_TEAM_WORLD. +.. Therefore, the two teams are distinct predefined teams forming +.. separate atomicity domains. +.. } + +Intel® SHMEM atomic operations do not guarantee exclusivity in the +following scenarios, all of which result in undefined behavior. + +#. When concurrent accesses to the same location are performed using ``ishmem`` atomic routines using different datatypes. +#. When atomic and non-atomic ``ishmem`` routines are used to access the same location concurrently. +#. When ``ishmem`` atomic routines and non-``ishmem`` operations (e.g., load, store, or other atomic operations) are used to access the same location concurrently. + diff --git a/docs/_sources/memory_ordering.rst b/docs/_sources/memory_ordering.rst new file mode 100644 index 0000000..f8343cf --- /dev/null +++ b/docs/_sources/memory_ordering.rst @@ -0,0 +1,107 @@ +.. _memory_ordering: + +--------------- +Memory Ordering +--------------- + +^^^^^^^^^^^^^^ +ISHMEM_FENCE +^^^^^^^^^^^^^^ + +Ensures ordering of delivery of operations on symmetric data objects. + +.. cpp:function:: void ishmem_fence() + +Callable from the **host** and **device**. + +**Description:** +This routine ensures ordering of delivery of operations on symmetric data +objects. + +.. TODO: + +.. Table "mem-order" lists the operations that are ordered by the +.. ``ishmem_fence`` routine. + +All operations on symmetric data objects issued to a particular PE prior to the +call to ``ishmem_fence`` are guaranteed to be delivered before any subsequent +operations on symmetric data objects to the same PE. +``ishmem_fence`` guarantees order of delivery, not completion. +It does not guarantee order of delivery of nonblocking `Get` or values fetched +by nonblocking AMO routines. + +^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_FENCE_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^ + +Ensures ordering of delivery of operations on symmetric data objects. + +.. cpp:function:: void ishmemx_fence_work_group(const Group& group) + + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the fence operation. + +Callable from the **device**. + +**Description:** +This routine ensures ordering of delivery of operations on symmetric data +objects. + +.. TODO: + +.. Table "mem-order" lists the operations that are ordered by the +.. ``ishmem_fence`` routine. + +All operations on symmetric data objects issued to a particular PE prior to the +call to ``ishmemx_fence_work_group`` are guaranteed to be delivered before any subsequent +operations on symmetric data objects to the same PE. +``ishmemx_fence_work_group`` guarantees order of delivery, not completion. +It does not guarantee order of delivery of nonblocking `Get` or values fetched +by nonblocking AMO routines. + +^^^^^^^^^^^^ +ISHMEM_QUIET +^^^^^^^^^^^^ + +Waits for completion of outstanding operations on symmetric data objects +issued by a PE. + +.. cpp:function:: void ishmem_quiet() + +Callable from the **host** and **device**. + +**Description:** +The ``ishmem_quiet`` routine ensures completion of all operations on +symmetric data objects issued by the calling PE. + +.. TODO: + +.. Table "mem-order" lists the operations that are ordered by the +.. ``ishmem_fence`` routine. + +All operations on symmetric data objects are guaranteed to be complete and +visible to all PEs when ``ishmem_quiet`` returns. + +^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_QUIET_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^ + +Waits for completion of outstanding operations on symmetric data objects +issued by a PE. + +.. cpp:function:: void ishmemx_quiet_work_group(const Group& group) + + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the quiet operation. + +Callable from the **device**. + +**Description:** +The ``ishmemx_quiet_work_group`` routine ensures completion of all operations on +symmetric data objects issued by the calling PE. + +.. TODO: + +.. Table "mem-order" lists the operations that are ordered by the +.. ``ishmem_fence`` routine. + +All operations on symmetric data objects are guaranteed to be complete and +visible to all PEs when ``ishmemx_quiet_work_group`` returns. diff --git a/docs/_sources/programming_model.rst b/docs/_sources/programming_model.rst new file mode 100644 index 0000000..a7082c2 --- /dev/null +++ b/docs/_sources/programming_model.rst @@ -0,0 +1,282 @@ +.. _programming_model: + +========================== +Programming Model Overview +========================== + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The Intel® SHMEM APIs Overview +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Intel® SHMEM implements PGAS by defining remotely accessible data objects +as mechanisms to share information among Intel® SHMEM processes, or +*processing elements* (PEs), and private data objects that are accessible by +only the PE itself. The API allows communication and synchronization operations +on both private (local to the PE initiating the operation) and remotely +accessible data objects. The key feature of Intel® SHMEM is that data +transfer operations are *one-sided* in nature. This means that a local PE +executing a data transfer routine does not require the participation of the +remote PE to complete the routine. This allows for overlap between +communication and computation to hide data transfer latencies, which makes +Intel® SHMEM ideal for unstructured, small-to-medium-sized data +communication patterns. The Intel® SHMEM library has the potential to +provide a low-latency, high-bandwidth communication API for use in highly +parallelized scalable programs. + +Intel® SHMEM's interfaces can be used to implement SPMD style programs. It +provides interfaces to start the Intel® SHMEM PEs in parallel and +communication and synchronization interfaces to access remotely accessible data +objects across PEs. These interfaces can be leveraged to divide a problem into +multiple sub-problems that can be solved independently or with coordination +using the communication and synchronization interfaces. The Intel® SHMEM +specification defines library calls, constants, variables, and language +bindings for SYCL and DPC++/C++. +Unlike Unified Parallel C, Fortran 2008, Titanium, X10, and Chapel, which are +all PGAS languages, Intel® SHMEM relies on the user to use the library +calls to implement the correct semantics of its programming model. + +.. important:: Intel® SHMEM does not yet support all of the + following routines. Please refer to the :ref:`Supported + Features` section to see which interfaces are supported + in the |release| version of Intel® SHMEM. + +An overview of the Intel® SHMEM routines is described below: + +#. **Library Setup and Query** + + a. *Initialization and Finalization*: The Intel® SHMEM library + environment is initialized and finalized. Users may optionally set + runtime attributes during initialization. + + b. *Query*: The local PE may get the number of PEs running the same + program and its unique integer identifier. + + c. *Accessibility*: The local PE can find out if a remote PE is + executing the same binary, or if a particular symmetric data object can + be accessed by a remote PE, or may obtain a pointer to a symmetric data + object on the specified remote PE on shared memory systems. + +#. **Symmetric Data Object Management** + + a. *Allocation*: OpenSHMEM routines that require all PEs to call them + at the same time are called *collective operations*. Allocation and + deallocation of symmetric data objects are collective operations. + + b. *Deallocation*: All executing PEs must participate in the + deallocation of the same symmetric data object with identical + arguments. + + c. *Reallocation*: All executing PEs must participate in the + reallocation of the same symmetric data object with identical + arguments. + +#. **Communication Management** + + a. *Contexts*: Contexts are containers for communication operations. + Each context provides an environment where the operations performed on + that context are ordered and completed independently of other + operations performed by the application. + +#. **Team Management** + + a. *Teams*: Teams are PE subsets created by grouping a set of PEs. + Teams are involved in both collective and point-to-point communication + operations. Collective communication operations are performed on all + PEs in a valid team and point-to-point communication operations are + performed between a local and remote PE with team-based PE numbering + through team-based contexts. + +#. **Remote Memory Access (RMA)** + + a. *PUT*: The local PE specifies the **source** data object, private + or symmetric, that is copied to the symmetric data object on the remote + PE. + + b. *GET*: The local PE specifies the symmetric data object on the + remote PE that is copied to a data object, private or symmetric, on the + local PE. + +#. **Atomic Memory Operations (AMO)** + + a. *Swap*: The PE initiating the swap gets the old value of a + symmetric data object from a remote PE and copies a new value to + that symmetric data object on the remote PE. + + b. *Increment*: The PE initiating the increment adds 1 to the + symmetric data object on the remote PE. + + c. *Add*: The PE initiating the add specifies the value to be + added to the symmetric data object on the remote PE. + + d. *Bitwise Operations*: The PE initiating the bitwise operation + specifies the operand value to the bitwise operation to be performed on + the symmetric data object on the remote PE. + + e. *Compare and Swap*: The PE initiating the swap gets the old + value of the symmetric data object based on a value to be compared and + copies a new value to the symmetric data object on the remote PE. + + f. *Fetch and Increment*: The PE initiating the increment adds 1 + to the symmetric data object on the remote PE and returns with the + old value. + + g. *Fetch and Add*: The PE initiating the add specifies the value to + be added to the symmetric data object on the remote PE and returns with + the old value. + + h. *Fetch and Bitwise Operations*: The PE initiating the bitwise + operation specifies the operand value to the bitwise operation to be + performed on the symmetric data object on the remote PE and + returns the old value. + +#. **Signaling Operations** + + a. *Signaling Put*: The **source** data is copied to the symmetric + object on the remote PE and a flag on the remote PE is subsequently + updated to signal completion. + +#. **Synchronization and Ordering** + + a. *Fence*: The PE calling fence ensures ordering of PUT, AMO, + and memory store operations to symmetric data objects. + + b. *Quiet*: The PE calling quiet ensures remote completion of remote + access operations and stores to symmetric data objects. + + c. *Barrier*: All PEs collectively synchronize and ensure completion + of all remote and local updates prior to any PE returning from the + call. + + d. *Wait and Test*: A PE calling a point-to-point synchronization + routine ensures the value of a local symmetric object meets a specified + condition. Wait operations block until the specified condition is met, + whereas test operations return immediately and indicate whether or not + the specified condition is met. + +#. **Collective Communication** + + a. *Broadcast*: The *root* PE specifies a symmetric data object to + be copied to a symmetric data object on one or more remote PEs + (not including itself). + + b. *Collection*: All PEs participating in the routine get the + result of concatenated symmetric objects contributed by each of the + PEs in another symmetric data object. + + c. *Reduction*: All PEs participating in the routine get the + result of an associative binary routine over elements of the specified + symmetric data object on another symmetric data object. + + d. *All-to-All*: All PEs participating in the routine exchange a + fixed amount of contiguous or strided data with all other PEs. + +.. #. **Mutual Exclusion** + a. *Set Lock*: The PE acquires exclusive access to the region bounded + by the symmetric *lock* variable. + + b. *Test Lock*: The PE tests the symmetric *lock* variable for + availability. + + c. *Clear Lock*: The PE which has previously acquired the *lock* + releases it. + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The ``work_group`` APIs Overview +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to the standard RMA and collective routines, Intel® +SHMEM also provides corresponding ``work_group`` API extensions +such as ``ishmemx_put_work_group`` and +``ishmemx_barrier_all_work_group``. +Unlike the standard RMA and collective routines, the ``work_group`` APIs are +only callable from device kernels and require passing a **group** argument. +This argument corresponds to either a |sycl_spec_groups| in the +context of explicit ND-range parallel kernels. +All work-items in an ND-range kernel are organized into +`work-groups`, which execute independently and in any order on +the underlying hardware. +For more comprehensive information, please refer to the +|sycl_book| or |online_resources|, which introduce and explain +key programming concepts and language details about SYCL, such as +groups and subgroups. + +.. |sycl_spec_groups| raw:: html + + SYCL group or sub_group + +.. |sycl_book| raw:: html + + Data Parallel C++ book + +.. |online_resources| raw:: html + + other online resources + +Depending on the use-case, the ``work_group`` APIs may achieve +better performance than the corresponding standard APIs. +For example, when calling the RMA ``work_group`` routines across +GPUs connected by Intel® :math:`\text{X}^e` Link fabric, the +implementation may perform the data transfer by having each +thread in the `work-group` copy a respective chunk of the source +buffer directly to the destination buffer. +On the other hand, if the destination buffer resides across the +network, the ``work_group`` APIs allow the implementation to +restrict the expensive RMA operations to `only` the leader +threads of each **work_group** or **sub_group**. +This latter optimization can have a dramatic effect on +performance when compared to the case where all threads within a +SYCL kernel to simultaneously post small RMA requests to the +network. +Similar `work-group` optimizations also apply to the collective +operations. + +The ``work_group`` APIs must be called by every thread in the +**work_group** or **sub_group** with identical arguments. +``work_group`` functions that return values will return the same value on all +threads. +The **source** buffer must be ready for transmission across all +threads within the **group** before the ``work_group`` API is +invoked, which may require synchronization in the application. +In the implementation, each ``work_group`` API includes a +**group** barrier at both the start and the end of the routine. +Furthermore, users must assure each `work-group` can execute to +completion. +For example, within a kernel there can be no dependencies between +threads across different `work-groups`. + +The following is a complete list of the ``work_group`` APIs provided by +Intel® SHMEM. +TYPENAME corresponds to the types specified by Table +:ref:`Standard RMA Types` and OP corresponds to the relevant +operations specified by Table :ref:`Reduction Types, Names, and Supporting +Operations`: + + - ``ishmemx_put_work_group`` + - ``ishmemx_TYPENAME_put_work_group`` + - ``ishmemx_putmem_work_group`` + - ``ishmemx_get_work_group`` + - ``ishmemx_TYPENAME_get_work_group`` + - ``ishmemx_getmem_work_group`` + - ``ishmemx_put_nbi_work_group`` + - ``ishmemx_TYPENAME_put_nbi_work_group`` + - ``ishmemx_putmem_nbi_work_group`` + - ``ishmemx_get_nbi_work_group`` + - ``ishmemx_TYPENAME_get_nbi_work_group`` + - ``ishmemx_getmem_nbi_work_group`` + - ``ishmemx_put_signal_work_group`` + - ``ishmemx_TYPENAME_put_signal_work_group`` + - ``ishmemx_putmem_signal_work_group`` + - ``ishmemx_put_signal_nbi_work_group`` + - ``ishmemx_TYPENAME_put_signal_nbi_work_group`` + - ``ishmemx_barrier_all_work_group`` + - ``ishmemx_sync_all_work_group`` + - ``ishmemx_broadcast_work_group`` + - ``ishmemx_collect_work_group`` + - ``ishmemx_fcollect_work_group`` + - ``ishmemx_OP_reduce_work_group`` + - ``ishmemx_TYPENAME_OP_reduce_work_group`` + - ``ishmemx_wait_until_work_group`` + - ``ishmemx_TYPENAME_wait_until_work_group`` + - ``ishmemx_test_work_group`` + - ``ishmemx_TYPENAME_test_work_group`` diff --git a/docs/_sources/pt2pt_sync.rst b/docs/_sources/pt2pt_sync.rst new file mode 100644 index 0000000..653bfe4 --- /dev/null +++ b/docs/_sources/pt2pt_sync.rst @@ -0,0 +1,173 @@ +.. _point_to_point: + +------------------------------ +Point-To-Point Synchronization +------------------------------ + +The following section discusses Intel® SHMEM interfaces that provide +a mechanism for synchronization between two PEs based on the value of a +symmetric data object. +The point-to-point synchronization routines can be used to portably ensure +that memory access operations observe remote updates in the order enforced by +the initiator PE. + +.. Where appropriate compiler support is available, Intel® SHMEM provides +.. type-generic point-to-point synchronization interfaces via `C11` generic +.. selection. Such type-generic routines are supported for the +.. standard AMO types identified in Table :ref:`Standard AMO Types`. + +.. The standard AMO types include some of the exact-width integer types defined in +.. the C++ standard library header ````. + +.. The ishmem_test_any and ishmem_wait_until_any routines +.. require the SIZE_MAX macro defined in stdint.h by +.. C99 S7.18.3 and C11 S7.20.3. + +The point-to-point synchronization routines support values (the **ivar** and +**cmp_value** arguments) having a type in the :ref:`Standard AMO Types +Table`. + +The point-to-point synchronization interface provides named constants whose +values are integer constant expressions that specify the comparison operators +used by the ``ishmem`` synchronization routines. +The constant names and associated operations are +presented in Table :ref:`Point-to-point Comparison Constants`. + +.. _p2p_consts: + +**Point-to-point Comparison Constants** + +=============== ======================= +Constant Name Comparison +=============== ======================= +ISHMEM_CMP_EQ Equal +ISHMEM_CMP_NE Not equal +ISHMEM_CMP_GT Greater than +ISHMEM_CMP_GE Greater than or equal to +ISHMEM_CMP_LT Less than +ISHMEM_CMP_LE Less than or equal to +=============== ======================= + +^^^^^^^^^^^^^^^^^^^ +ISHMEM_WAIT_UNTIL +^^^^^^^^^^^^^^^^^^^ + +Wait for a variable on the local PE to change. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by Table :ref:`Standard AMO Types`. + +.. cpp:function:: void ishmem_TYPENAME_wait_until(TYPE* ivar, int cmp, TYPE cmp_value) + + :param ivar: Symmetric address of a remotely accessible data object. The type of **ivar** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param cmp: A comparison operator from Table :ref:`Point-to-point Comparison Constants` that compares **ivar** with **cmp_value**. + :param cmp_value: The value to be compared with **ivar**. The type of **cmp_value** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + +Callable from the **host** and the **device**. + +**Description:** +The ``ishmem_wait_until`` operation blocks until the value contained in the +symmetric data object, **ivar**, at the calling PE satisfies the wait +condition. +The **ivar** object at the calling PE may be updated by an AMO performed by a +thread located within the calling PE or within another PE. + +These routines can be used to implement point-to-point synchronization between +PEs or between threads within the same PE. +A call to ``ishmem_wait_until`` blocks until the value of **ivar** at the +calling PE satisfies the wait condition specified by the comparison operator, +**cmp**, and comparison value, **cmp_value**. + +Implementations must ensure that ``ishmem_wait_until`` does not return +before the update of the memory indicated by **ivar** is fully complete. + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_WAIT_UNTIL_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Wait for a variable on the local PE to change. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by Table :ref:`Standard AMO Types`. + +.. cpp:function:: template void ishmemx_TYPENAME_wait_until_work_group(TYPE* ivar, int cmp, TYPE cmp_value) + + :param ivar: Symmetric address of a remotely accessible data object. The type of **ivar** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param cmp: A comparison operator from Table :ref:`Point-to-point Comparison Constants` that compares **ivar** with **cmp_value**. + :param cmp_value: The value to be compared with **ivar**. The type of **cmp_value** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the wait operation. + +Callable from the **device**. + +**Description:** +The ``ishmemx_wait_until_work_group`` operation blocks until the value +contained in the symmetric data object, **ivar**, at the calling PE satisfies +the wait condition. +The **ivar** object at the calling PE may be updated by an AMO performed by a +thread located within the calling PE or within another PE. + +These routines can be used to implement point-to-point synchronization between +PEs or between threads within the same PE. +A call to ``ishmemx_wait_until_work_group`` blocks until the value of +**ivar** at the calling PE satisfies the wait condition specified by the +comparison operator, **cmp**, and comparison value, **cmp_value**. + +Implementations must ensure that ``ishmemx_wait_until_work_group`` does not +return before the update of the memory indicated by **ivar** is fully +complete. + +^^^^^^^^^^^^^ +ISHMEM_TEST +^^^^^^^^^^^^^ + +Indicate whether a variable on the local PE meets the specified condition. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by Table :ref:`Standard AMO Types`. + +.. cpp:function:: int ishmem_TYPENAME_test(TYPE* ivar, int cmp, TYPE cmp_value) + + :param ivar: Symmetric address of a remotely accessible data object. The type of **ivar** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param cmp: A comparison operator from Table :ref:`Point-to-point Comparison Constants` that compares **ivar** with **cmp_value**. + :param cmp_value: The value to be compared with **ivar**. The type of **cmp_value** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :returns: ``ishmem_test`` returns 1 if the comparison of the symmetric object pointed to by **ivar** with the value **cmp_value** according to the comparison operator **cmp** evaluates to true; otherwise, it returns 0. + +Callable from the **host** and **device**. + +**Description:** +``ishmem_test`` tests the numeric comparison of the symmetric object +pointed to by **ivar** with the value **cmp_value** according to the +comparison operator **cmp**. +The **ivar** object at the calling PE may be updated by an AMO performed by a thread located within the calling PE or within another PE. + +Implementations must ensure that ``ishmem_test`` does not return 1 before +the update of the memory indicated by **ivar** is fully complete. + +^^^^^^^^^^^^^^^^^^^^^^^ +ISHMEMX_TEST_WORK_GROUP +^^^^^^^^^^^^^^^^^^^^^^^ + +Indicate whether a variable on the local PE meets the specified condition. + +Below, TYPE is one of the standard AMO types and has a corresponding TYPENAME +specified by Table :ref:`Standard AMO Types`. + +.. cpp:function:: int ishmemx_TYPENAME_test_work_group(TYPE* ivar, int cmp, TYPE cmp_value) + + :param ivar: Symmetric address of a remotely accessible data object. The type of **ivar** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param cmp: A comparison operator from Table :ref:`Point-to-point Comparison Constants` that compares **ivar** with **cmp_value**. + :param cmp_value: The value to be compared with **ivar**. The type of **cmp_value** should match the TYPE and TYPENAME according to the table of :ref:`Standard AMO Types`. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the wait operation. + :returns: ``ishmem_test`` returns 1 if the comparison of the symmetric object pointed to by **ivar** with the value **cmp_value** according to the comparison operator **cmp** evaluates to true; otherwise, it returns 0. + +Callable from the **device**. + +**Description:** +``ishmemx_test_work_group`` tests the numeric comparison of the symmetric +object pointed to by **ivar** with the value **cmp_value** according to the +comparison operator **cmp**. +The **ivar** object at the calling PE may be updated by an AMO performed by a thread located within the calling PE or within another PE. + +Implementations must ensure that ``ishmemx_test_work_group`` does not return +1 before the update of the memory indicated by **ivar** is fully complete. + diff --git a/docs/_sources/rma.rst b/docs/_sources/rma.rst new file mode 100644 index 0000000..3a32d2c --- /dev/null +++ b/docs/_sources/rma.rst @@ -0,0 +1,492 @@ +.. _rma: + +-------------------------- +Remote Memory Access (RMA) +-------------------------- + +The RMA routines described in this section can be used to perform reads from and writes to symmetric data objects. These operations are one-sided, meaning that the PE invoking an operation provides all communication parameters and the targeted PE is passive. A characteristic of one-sided communication is that it decouples communication from synchronization. One-sided communication mechanisms transfer data; however, they do not synchronize the sender of the data with the receiver of the data. + +Intel® SHMEM RMA routines are performed on symmetric data objects. The initiator PE of a call is designated as the `origin` PE and the PE targeted by an operation is designated as the `destination` PE. The `source` and `dest` designators refer to the data objects that an operation reads from and writes to. In the case of the remote update routine, `Put`, the origin PE provides the `source` data object and the destination PE provides the `dest` data object. In the case of the remote read routine, `Get`, the origin PE provides the `dest` data object and the destination PE provides the `source` data object. + +The destination PE is specified as an integer representing the PE number. If the PE number passed to the routine is invalid, being negative or greater than or equal to the size of the launched job, then the behavior is undefined. + +.. The destination PE is specified as an integer representing the PE number. This PE number is relative to the team associated with the communication context being using for the operation. If no context argument is passed to the routine, then the routine operates on the default context, which implies that the PE number is relative to the world team. If the PE number passed to the routine is invalid, being negative or greater than or equal to the size of the Intel® SHMEM team, then the behavior is undefined. + +.. Intel® SHMEM RMA routines specified in this section have two variants. In one of the variants, the context handle, ctx, is explicitly passed as an argument. In this variant, the operation is performed on the specified context. If the context handle ctx does not correspond to a valid context, the behavior is undefined. In the other variant, the context handle is not explicitly passed and thus, the operations are performed on the default context. + +Intel® SHMEM provides type-generic one-sided communication interfaces via C11 generic selection (C11 §6.5.1.1) for block, scalar, and block-strided put and get communication. Such type-generic routines are supported for the “standard RMA types” listed in Table :ref:`Standard RMA Types`. + +The standard RMA types include the exact-width integer types defined in ``stdint.h`` by C996 §7.18.1.1 and C11 §7.20.1.1. When the C translation environment does not provide exact-width integer types with ``stdint.h``, an Intel® SHMEM implemementation is not required to provide support for these types. + +.. _stdrmatypes: + +**Standard RMA Types:** + +=================== ======== +TYPE TYPENAME +=================== ======== +float float +double double +char char +signed char schar +short short +int int +long long +long long longlong +unsigned char uchar +unsigned short ushort +unsigned int uint +unsigned long ulong +unsigned long long ulonglong +int8_t int8 +int16_t int16 +int32_t int32 +int64_t int64 +uint8_t uint8 +uint16_t uint16 +uint32_t uint32 +uint64_t uint64 +size_t size +ptrdiff_t ptrdiff +=================== ======== + +.. long double longdouble + +^^^^^^^^^^^^ +Blocking RMA +^^^^^^^^^^^^ + +"""""""""" +ISHMEM_PUT +"""""""""" +The `put` routines provide a method for copying data from a contiguous local +data object to a data object on a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_put(TYPE* dest, const TYPE* source, size_t nelems, int pe) + +.. cpp:function:: void ishmem_TYPENAME_put(TYPE* dest, const TYPE* source, size_t nelems, int pe) + +.. cpp:function:: void ishmem_putmem(void* dest, const void* source, size_t nelems, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the data object containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_putmem`` and ``ishmemx_putmem_work_group``, elements are bytes. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +The `put` routines return after the data has been copied out of the **source** +array on the local PE. +The delivery of data words into the data object on the destination PE may occur +in any order. +Furthermore, two successive `put` routines may deliver data out of order unless +a call to ``ishmem_fence`` or ``ishmemx_fence_work_group`` is introduced +between the two calls. + +"""""""""""""""""""""" +ISHMEMX_PUT_WORK_GROUP +"""""""""""""""""""""" +The `put` routines provide a method for copying data from a contiguous local +data object to a data object on a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmemx_put_work_group(TYPE* dest, const TYPE* source, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_TYPENAME_put_work_group(TYPE* dest, const TYPE* source, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_putmem_work_group(void* dest, const void* source, size_t nelems, int pe, const Group& group) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the data object containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_putmem`` and ``ishmemx_putmem_work_group``, elements are bytes. + :param pe: PE number of the remote PE. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the `Put` operation. + +Callable from the **device**. + +**Description:** +The `put` routines return after the data has been copied out of the **source** +array on the local PE. +The delivery of data words into the data object on the destination PE may occur +in any order. +Furthermore, two successive `put_work_group` routines may deliver data out of +order unless a call to ``ishmem_fence`` or ``ishmemx_fence_work_group`` is +introduced between the two calls. + +"""""""" +ISHMEM_P +"""""""" +Copies one data item to a remote PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_p(TYPE* dest, TYPE value, int pe) + +.. cpp:function:: void ishmem_TYPENAME_p(TYPE* dest, TYPE value, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param value: The value to be transferred to **dest** . The type of **value** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +These routines provide a very low latency put capability for single elements of +the standard RMA types. + +As with ``ishmem_put``, these routines start the remote transfer and may +return before the data is delivered to the remote PE. +Use ``ishmem_quiet`` or ``ishmemx_quiet_work_group`` to force completion of +all remote `Put` transfers. + +""""""""""" +ISHMEM_IPUT +""""""""""" +Copies strided data to a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_iput(TYPE* dest, const TYPE* source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe) + +.. cpp:function:: void ishmem_TYPENAME_iput(TYPE* dest, const TYPE* source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe) + + :param dest: Symmetric address of the destination array data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the array containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param dst: The stride between consecutive elements of the **dest** array. The stride is scaled by the element size of the **dest** array. A value of 1 indicates contiguous data. + :param sst: The stride between consecutive elements of the **source** array. The stride is scaled by the element size of the **source** array. A value of 1 indicates contiguous data. + :param nelems: Number of elements in the **dest** and **source** arrays. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +The `iput` routines provide a method for copying strided data elements +(specified by **sst**) of an array from a **source** array on the local PE to +locations specified by stride **dst** on a **dest** array on specified remote +PE. +Both strides, **dst** and **sst**, must be greater than or equal to 1. +The routines return when the data has been copied out of the **source** array on the local PE but not necessarily before the data has been delivered to the remote data object. + +""""""""""""""""""""""" +ISHMEMX_IPUT_WORK_GROUP +""""""""""""""""""""""" +Copies strided data to a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmemx_iput_work_group(TYPE* dest, const TYPE* source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_TYPENAME_iput_work_group(TYPE* dest, const TYPE* source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, const Group& group) + + :param dest: Symmetric address of the destination array data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the array containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param dst: The stride between consecutive elements of the **dest** array. The stride is scaled by the element size of the **dest** array. A value of 1 indicates contiguous data. + :param sst: The stride between consecutive elements of the **source** array. The stride is scaled by the element size of the **source** array. A value of 1 indicates contiguous data. + :param nelems: Number of elements in the **dest** and **source** arrays. + :param pe: PE number of the remote PE. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the `Put` operation. + +Callable from the **device**. + +**Description:** +The `iput` routines provide a method for copying strided data +elements (specified by **sst**) of an array from a **source** array on the +local PE to locations specified by stride **dst** on a **dest** array on +specified remote PE. +Both strides, **dst** and **sst**, must be greater than or equal to 1. +The routines return when the data has been copied out of the **source** array on the local PE but not necessarily before the data has been delivered to the remote data object. + +"""""""""""" +ISHMEM_GET +"""""""""""" +Copies data from a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_get(TYPE* dest, const TYPE* source, size_t nelems, int pe) + +.. cpp:function:: void ishmem_TYPENAME_get(TYPE* dest, const TYPE* source, size_t nelems, int pe) + +.. cpp:function:: void ishmem_getmem(void* dest, const void* source, size_t nelems, int pe) + + :param dest: Local address of the data object containing the data to be updated. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the source data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_getmem`` and ``ishmemx_getmem_work_group``, elements are bytes. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +The `get` routines provide a method for copying a contiguous symmetric data +object from a different PE to a contiguous data object on the local PE. +The routines return after the data has been delivered to the **dest** array on +the local PE. + +"""""""""""""""""""""" +ISHMEMX_GET_WORK_GROUP +"""""""""""""""""""""" +Copies data from a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmemx_get_work_group(TYPE* dest, const TYPE* source, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_TYPENAME_get_work_group(TYPE* dest, const TYPE* source, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_getmem_work_group(void* dest, const void* source, size_t nelems, int pe) + + :param dest: Local address of the data object containing the data to be updated. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the source data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_getmem`` and ``ishmemx_getmem_work_group``, elements are bytes. + :param pe: PE number of the remote PE. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the `Put` operation. + +Callable from the **device**. + +**Description:** +The `get` routines provide a method for copying a contiguous symmetric data +object from a different PE to a contiguous data object on the local +PE. The routines return after the data has been delivered to the **dest** +array on the local PE. + +"""""""""" +ISHMEM_G +"""""""""" +Copies one data item from a remote PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template TYPE ishmem_g(const TYPE* source, int pe) + +.. cpp:function:: TYPE ishmem_TYPENAME_g(const TYPE* source, int pe) + + :param source: Symmetric address of the source data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param pe: PE number of the remote PE on which **source** resides. + :returns: Returns a single element of type TYPE. + +Callable from the **host** and **device**. + +**Description:** +These routines provide a very low latency get capability for single elements of +the standard RMA types. + +""""""""""""" +ISHMEM_IGET +""""""""""""" +Copies strided data from a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_iget(TYPE* dest, const TYPE* source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe) + +.. cpp:function:: void ishmem_TYPENAME_iget(TYPE* dest, const TYPE* source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe) + + :param dest: Local address of the array to be updated. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the source array data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param dst: The stride between consecutive elements of the **dest** array. The stride is scaled by the element size of the **dest** array. A value of 1 indicates contiguous data. + :param sst: The stride between consecutive elements of the **source** array. The stride is scaled by the element size of the **source** array. A value of 1 indicates contiguous data. + :param nelems: Number of elements in the **dest** and **source** arrays. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +The `iget` routines provide a method for copying strided data elements from a +symmetric array from a specified remote PE to strided locations on a local +array. +The routines return when the data has been copied into the local **dest** +array. + +""""""""""""""""""""""" +ISHMEMX_IGET_WORK_GROUP +""""""""""""""""""""""" +Copies strided data from a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmemx_iget_work_group(TYPE* dest, const TYPE* source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_TYPENAME_iget_work_group(TYPE* dest, const TYPE* source, ptrdiff_t dst, ptrdiff_t sst, size_t nelems, int pe, const Group& group) + + :param dest: Local address of the array to be updated. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the source array data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param dst: The stride between consecutive elements of the **dest** array. The stride is scaled by the element size of the **dest** array. A value of 1 indicates contiguous data. + :param sst: The stride between consecutive elements of the **source** array. The stride is scaled by the element size of the **source** array. A value of 1 indicates contiguous data. + :param nelems: Number of elements in the **dest** and **source** arrays. + :param pe: PE number of the remote PE. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the `Put` operation. + +Callable from the **device**. + +**Description:** +The `iget` routines provide a method for copying strided data +elements from a symmetric array from a specified remote PE to strided +locations on a local array. +The routines return when the data has been copied into the local **dest** +array. + +^^^^^^^^^^^^^^^ +Nonblocking RMA +^^^^^^^^^^^^^^^ + +"""""""""""""""" +ISHMEM_PUT_NBI +"""""""""""""""" +The `nonblocking put` routines provide a method for copying data from a +contiguous local data object to a data object on a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_put_nbi(TYPE* dest, const TYPE* source, size_t nelems, int pe) + +.. cpp:function:: void ishmem_TYPENAME_put_nbi(TYPE* dest, const TYPE* source, size_t nelems, int pe) + +.. cpp:function:: void ishmem_putmem_nbi(void* dest, const void* source, size_t nelems, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE of TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the data object containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_putmem_nbi`` and ``ishmemx_putmem_nbi_work_group``, elements are bytes. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +The `nonblocking put` routines return after initiating the operation. +The operation is considered complete after a subsequent call to +``ishmem_quiet`` or ``ishmemx_quiet_work_group``. +At the completion of the quiet operation, the data has been copied into the +**dest** array on the destination PE. +The delivery of data words into the data object on the destination PE may occur +in any order. +Furthermore, two successive put routines may deliver data out of order unless a +call to ``ishmem_fence`` or ``ishmemx_fence_work_group`` is introduced +between the two calls. + +"""""""""""""""""""""""""" +ISHMEMX_PUT_NBI_WORK_GROUP +"""""""""""""""""""""""""" +The `nonblocking put` routines provide a method for copying data +from a contiguous local data object to a data object on a specified PE. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmemx_put_nbi_work_group(TYPE* dest, const TYPE* source, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_TYPENAME_put_nbi_work_group(TYPE* dest, const TYPE* source, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_putmem_nbi_work_group(void* dest, const void* source, size_t nelems, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE of TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the data object containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_putmem_nbi`` and ``ishmemx_putmem_nbi_work_group``, elements are bytes. + :param pe: PE number of the remote PE. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the `Put` operation. + +Callable from the **device**. + +**Description:** +The `nonblocking put` routines return after initiating the +operation. +The operation is considered complete after a subsequent call to +``ishmem_quiet`` or ``ishmemx_quiet_work_group``. +At the completion of the quiet operation, the data has been copied into the +**dest** array on the destination PE. +The delivery of data words into the data object on the destination PE may occur +in any order. +Furthermore, two successive put routines may deliver data out of order unless a +call to ``ishmem_fence`` or ``ishmemx_fence_work_group`` is introduced +between the two calls. + +"""""""""""""""" +ISHMEM_GET_NBI +"""""""""""""""" +The `nonblocking get` routines provide a method for copying data from a +contiguous remote data object on the specified PE to the local data object. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_get_nbi(TYPE* dest, const TYPE* source, size_t nelems, int pe) + +.. cpp:function:: void ishmem_TYPENAME_get_nbi(TYPE* dest, const TYPE* source, size_t nelems, int pe) + +.. cpp:function:: void ishmem_getmem_nbi(void* dest, const void* source, size_t nelems, int pe) + + :param dest: Local address of the data object containing the data to be updated. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the source data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_getmem_nbi`` and ``ishmemx_getmem_nbi_work_group``, elements are bytes. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +The `nonblocking get` routines provide a method for copying a contiguous symmetric data +object from a different PE to a contiguous data object on the local PE. +The routines return after initiating the operation. +The operation is considered complete after a subsequent call to +``ishmem_quiet`` or ``ishmemx_quiet_work_group``. +At the completion of the quiet operation, the data has been delivered to the +**dest** array on the local PE. + +"""""""""""""""""""""""""" +ISHMEMX_GET_NBI_WORK_GROUP +"""""""""""""""""""""""""" +The `nonblocking get` routines provide a method for copying data from a +contiguous remote data object on the specified PE to the local data object. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmemx_get_nbi_work_group(TYPE* dest, const TYPE* source, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_TYPENAME_get_nbi_work_group(TYPE* dest, const TYPE* source, size_t nelems, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_getmem_nbi_work_group(void* dest, const void* source, size_t nelems, int pe) + + :param dest: Local address of the data object containing the data to be updated. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Symmetric address of the source data object. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_getmem_nbi`` and ``ishmemx_getmem_nbi_work_group``, elements are bytes. + :param pe: PE number of the remote PE. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the `Put` operation. + +Callable from the **device**. + +**Description:** +The `nonblocking get` routines provide a method for copying a contiguous symmetric data +object from a different PE to a contiguous data object on the local PE. +The routines return after initiating the operation. +The operation is considered complete after a subsequent call to +``ishmem_quiet`` or ``ishmemx_quiet_work_group``. +At the completion of the quiet operation, the data has been delivered to the +**dest** array on the local PE. + diff --git a/docs/_sources/signaling.rst b/docs/_sources/signaling.rst new file mode 100644 index 0000000..e517a09 --- /dev/null +++ b/docs/_sources/signaling.rst @@ -0,0 +1,327 @@ +.. _signaling: + +-------------------- +Signaling Operations +-------------------- + + +This section specifies the Intel® SHMEM support for +`put-with-signal`, nonblocking `put-with-signal`, and `signal-fetch` routines. +The put-with-signal routines provide a method for copying data from a +contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. +The signal-fetch routine provides support for fetching a signal update +operation. + +.. Intel® SHMEM `put-with-signal` routines specified in this section +.. have two variants. +.. In one of the variants, the context handle, **ctx**, is explicitly passed as an +.. argument. +.. In this variant, the operation is performed on the specified context. +.. If the context handle **ctx** does not correspond to a valid context, the +.. behavior is undefined. +.. In the other variant, the context handle is not explicitly passed and thus, the +.. operations are performed on the default context. + +.. _signal_atomicity: + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Atomicity Guarantees for Signaling Operations +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +All signaling operations put-with-signal, nonblocking put-with-signal, and +signal-fetch are performed on a signal data object, a remotely accessible +symmetric object of type **uint64_t**. +A signal operator in the put-with-signal routine is an Intel® SHMEM +library constant that determines the type of update to be performed as a signal +on the signal data object. + +All signaling operations on the signal data object complete as if performed +atomically with respect to the following: + +* other blocking or nonblocking variant of the put-with-signal routine that + updates the signal data object using the same signal update operator; +* signal-fetch routine that fetches the signal data object; and +* any point-to-point synchronization routine that accesses the signal data + object. + +.. _signal_operators: + +^^^^^^^^^^^^^^^^^^^^^^^^^^ +Available Signal Operators +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +With the atomicity guarantees as described in Section :ref:`Atomicity +Guarantees for Signaling Operations`, the following options +can be used as a signal operator. + +* ``ISHMEM_SIGNAL_SET`` An update to signal data object is an atomic set + operation. It writes an unsigned 64-bit value as a signal into the signal + data object on a remote PE as an atomic operation. + +* ``ISHMEM_SIGNAL_ADD`` An update to signal data object is an atomic add + operation. It adds an unsigned 64-bit value as a signal into the signal data + object on a remote PE as an atomic operation. + +^^^^^^^^^^^^^^^^^^^ +Blocking Put-Signal +^^^^^^^^^^^^^^^^^^^ + +""""""""""""""""" +ISHMEM_PUT_SIGNAL +""""""""""""""""" +The `put-with-signal` routines provide a method for copying data from a +contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_put_signal(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe) + +.. cpp:function:: void ishmem_TYPENAME_put_signal(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe) + +.. cpp:function:: void ishmem_TYPENAME_putmem_signal(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the data object containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmem_putmem_signal``, elements are bytes. + :param sig_addr: Symmetric address of the signal data object to be updated on the remote PE as a signal. + :param signal: Unsigned 64-bit value that is used for updating the remote **sig_addr** signal data object. + :param sig_op: Signal operator that represents the type of update to be performed on the remote **sig_addr** signal data object. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +The `put-with-signal` routines provide a method for copying data from a +contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. +The routines return after the data has been copied out of the **source** array +on the local PE. + +The **sig_op** signal operator determines the type of update to be performed on +the remote **sig_addr** signal data object. +The completion of signal update based on the **sig_op** signal operator using +the **signal** flag on the remote PE indicates the delivery of its +corresponding **dest** data words into the data object on the remote PE. + +An update to the **sig_addr** signal data object through a `put-with-signal` +routine completes as if performed atomically as described in Section :ref:`Atomicity +Guarantees for Signaling Operations`. +The various options as described in Section :ref:`Available Signal +Operators` can be used as the **sig_op** signal operator. + +The **dest** and **sig_addr** data objects must both be remotely accessible and +may not be overlapping in memory. + +The completion of signal update using the **signal** flag on the remote PE +indicates only the delivery of its corresponding **dest** data words into the +data object on the remote PE. +Without a memory-ordering operation, there is no implied ordering between the +signal update of a `put-with-signal` routine and another data transfer. +For example, the completion of the signal update in a sequence consisting of a +put routine followed by a `put-with-signal` routine does not imply delivery of +the `put` routine's data. + +""""""""""""""""""""""""""""" +ISHMEMX_PUT_SIGNAL_WORK_GROUP +""""""""""""""""""""""""""""" +The `put-with-signal` routines provide a method for copying data from a +contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmemx_put_signal_work_group(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_TYPENAME_put_signal_work_group(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_putmem_signal_work_group(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe, const Group& group) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the data object containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For ``ishmemx_putmem_signal_work_group``, elements are bytes. + :param sig_addr: Symmetric address of the signal data object to be updated on the remote PE as a signal. + :param signal: Unsigned 64-bit value that is used for updating the remote **sig_addr** signal data object. + :param sig_op: Signal operator that represents the type of update to be performed on the remote **sig_addr** signal data object. + :param pe: PE number of the remote PE. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the `Put` operation. + +Callable from the **device**. + +**Description:** + +The `put-with-signal` routines provide a method for copying data from a +contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. +The routines return after the data has been copied out of the **source** array +on the local PE. + +The **sig_op** signal operator determines the type of update to be performed on +the remote **sig_addr** signal data object. +The completion of signal update based on the **sig_op** signal operator using +the **signal** flag on the remote PE indicates the delivery of its +corresponding **dest** data words into the data object on the remote PE. + +An update to the **sig_addr** signal data object through a `put-with-signal` +routine completes as if performed atomically as described in Section :ref:`Atomicity +Guarantees for Signaling Operations`. +The various options as described in Section :ref:`Available Signal +Operators` can be used as the **sig_op** signal operator. + +The **dest** and **sig_addr** data objects must both be remotely accessible and +may not be overlapping in memory. + +The completion of signal update using the **signal** flag on the remote PE +indicates only the delivery of its corresponding **dest** data words into the +data object on the remote PE. +Without a memory-ordering operation, there is no implied ordering between the +signal update of a `put-with-signal` routine and another data transfer. +For example, the completion of the signal update in a sequence consisting of a +put routine followed by a `put-with-signal` routine does not imply delivery of +the `put` routine's data. + +^^^^^^^^^^^^^^^^^^^^^^ +Nonblocking Put-Signal +^^^^^^^^^^^^^^^^^^^^^^ + +""""""""""""""""""""" +ISHMEM_PUT_NBI_SIGNAL +""""""""""""""""""""" +The `nonblocking put-with-signal` routines provide a method for copying data from a +contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmem_put_signal_nbi(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe) + +.. cpp:function:: void ishmem_TYPENAME_put_signal_nbi(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE of TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the data object containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For **ishmem_putmem**, elements are bytes. + :param sig_addr: Symmetric address of the signal data object to be updated on the remote PE as a signal. + :param signal: Unsigned 64-bit value that is used for updating the remote **sig_addr** signal data object. + :param sig_op: Signal operator that represents the type of update to be performed on the remote **sig_addr** signal data object. + :param pe: PE number of the remote PE. + +Callable from the **host** and **device**. + +**Description:** +The `nonblocking put-with-signal` routines provide a method for copying data +from a contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. + +The routines return after initiating the operation. +The operation is considered complete after a subsequent call to +``ishmem_quiet`` or ``ishmemx_quiet_work_group``. +At the completion of the quiet operation, the data has been copied out of the +**source** array on the local PE and delivered into the **dest** array on the +destination PE. + +The delivery of the **signal** flag on the remote PE indicates only the +delivery of its corresponding **dest** data words into the data object on the +remote PE. +Furthermore, two successive nonblocking `put-with-signal` routines, or a +nonblocking `put-with-signal` routine with another data transfer may deliver +data out of order unless a call to ``ishmem_fence`` or +``ishmemx_fence_work_group`` is introduced between the two calls. + +The **sig_op** signal operator determines the type of update to be performed on +the remote **sig_addr** signal data object. + +An update to the **sig_addr** signal data object through a nonblocking +`put-with-signal` routine completes as if performed atomically as described in +Section :ref:`Atomicity Guarantees for Signaling Operations`. +The various options as described in Section :ref:`Available Signal +Operators` can be used as the **sig_op** signal operator. + +The **dest** and **sig_addr** data objects must both be remotely accessible and +may not be overlapping in memory. + +""""""""""""""""""""""""""""""""" +ISHMEMX_PUT_NBI_SIGNAL_WORK_GROUP +""""""""""""""""""""""""""""""""" +The `nonblocking put-with-signal` routines provide a method for copying data +from a contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. + +In the functions below, TYPE is one of the standard RMA types and has a +corresponding TYPENAME specified by Table :ref:`Standard RMA +Types`. + +.. cpp:function:: template void ishmemx_put_signal_nbi_work_group(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe, const Group& group) + +.. cpp:function:: template void ishmemx_TYPENAME_put_signal_nbi_work_group(TYPE* dest, const TYPE* source, size_t nelems, uint64_t* sig_addr, uint64_t signal, int sig_op, int pe, const Group& group) + + :param dest: Symmetric address of the destination data object. The type of **dest** should match the TYPE of TYPENAME according to the table of :ref:`Standard RMA types`. + :param source: Local address of the data object containing the data to be copied. The type of **source** should match the TYPE and TYPENAME according to the table of :ref:`Standard RMA types`. + :param nelems: Number of elements in the **dest** and **source** arrays. For **ishmem_putmem**, elements are bytes. + :param sig_addr: Symmetric address of the signal data object to be updated on the remote PE as a signal. + :param signal: Unsigned 64-bit value that is used for updating the remote **sig_addr** signal data object. + :param sig_op: Signal operator that represents the type of update to be performed on the remote **sig_addr** signal data object. + :param pe: PE number of the remote PE. + :param group: The SYCL ``group`` or ``sub_group`` on which to collectively perform the `Put` operation. + +Callable from the **device**. + +**Description:** + +The `nonblocking put-with-signal` routines provide a method for copying data +from a contiguous local data object to a data object on a specified PE and +subsequently updating a remote flag to signal completion. + +The routines return after initiating the operation. +The operation is considered complete after a subsequent call to +``ishmem_quiet`` or ``ishmemx_quiet_work_group``. +At the completion of the quiet operation, the data has been copied out of the +**source** array on the local PE and delivered into the **dest** array on the +destination PE. + +The delivery of the **signal** flag on the remote PE indicates only the +delivery of its corresponding **dest** data words into the data object on the +remote PE. +Furthermore, two successive nonblocking `put-with-signal` routines, or a +nonblocking `put-with-signal` routine with another data transfer may deliver +data out of order unless a call to ``ishmem_fence`` or +``ishmemx_fence_work_group`` is introduced between the two calls. + +The **sig_op** signal operator determines the type of update to be performed on +the remote **sig_addr** signal data object. + +An update to the **sig_addr** signal data object through a nonblocking +`put-with-signal` routine completes as if performed atomically as described in +Section :ref:`Atomicity Guarantees for Signaling Operations`. +The various options as described in Section :ref:`Available Signal +Operators` can be used as the **sig_op** signal operator. + +The **dest** and **sig_addr** data objects must both be remotely accessible and +may not be overlapping in memory. + + +^^^^^^^^^^^^^^^^^^^ +ISHMEM_SIGNAL_FETCH +^^^^^^^^^^^^^^^^^^^ + +Fetches the signal update on a local data object. + +.. cpp:function:: uint64_t ishmem_signal_fetch(const uint64_t * sig_addr) + + :param sig_addr: Local address of the remotely accessible signal variable. + :returns: The contents of the signal data object, **sig_addr**, at the calling PE. + +Callable from the **host** and **device**. + +**Description:** +``ishmem_signal_fetch`` performs a fetch operation and returns the contents of +the **sig_addr** signal data object. +Access to **sig_addr** signal object at the calling PE is expected to satisfy +the atomicity guarantees as described in Section :ref:`Atomicity Guarantees for +Signaling Operations`. diff --git a/docs/_sources/supported_features.rst b/docs/_sources/supported_features.rst new file mode 100644 index 0000000..1321513 --- /dev/null +++ b/docs/_sources/supported_features.rst @@ -0,0 +1,309 @@ +.. _supported_features: + +****************************** +Supported/Unsupported Features +****************************** + +The following tables indicate which APIs are supported in Intel® SHMEM as of +the |release| release. +The Intel® SHMEM development team strives to eventually support all OpenSHMEM +APIs. +Currently unsupported interfaces are targeted for implementation in future +releases of Intel® SHMEM. + ++-------------------------------+---------------+ +| **Library Setup Query** | Supported? | ++===============================+===============+ +| ``ishmem_init`` | Yes | ++-------------------------------+---------------+ +| ``ishmemx_init_attr`` | Yes | ++-------------------------------+---------------+ +| ``ishmem_init_thread`` | No | ++-------------------------------+---------------+ +| ``ishmem_my_pe`` | Yes | ++-------------------------------+---------------+ +| ``ishmem_n_pes`` | Yes | ++-------------------------------+---------------+ +| ``ishmem_finalize`` | Yes | ++-------------------------------+---------------+ +| ``ishmem_global_exit`` | No | ++-------------------------------+---------------+ +| ``ishmem_pe_accessible`` | No | ++-------------------------------+---------------+ +| ``ishmem_addr_accessible`` | No | ++-------------------------------+---------------+ +| ``ishmem_ptr`` | Yes | ++-------------------------------+---------------+ +| ``ishmem_team_ptr`` | No | ++-------------------------------+---------------+ +| ``ishmem_info_get_version`` | Yes | ++-------------------------------+---------------+ +| ``ishmem_info_get_name`` | Yes | ++-------------------------------+---------------+ + ++--------------------------------+---------------+ +| **Memory Management** | Supported? | ++================================+===============+ +| ``ishmem_malloc`` | Yes | ++--------------------------------+---------------+ +| ``ishmem_free`` | Yes | ++--------------------------------+---------------+ +| ``ishmem_realloc`` | No | ++--------------------------------+---------------+ +| ``ishmem_align`` | Yes | ++--------------------------------+---------------+ +| ``ishmem_malloc_with_hints`` | No | ++--------------------------------+---------------+ +| ``ishmem_calloc`` | Yes | ++--------------------------------+---------------+ + ++--------------------------------------------+---------------+ +| **OpenSHMEM Communication Contexts** | Supported? | ++============================================+===============+ +| All routines | No | ++--------------------------------------------+---------------+ + ++------------------------------+---------------+ +| **OpenSHMEM Team Managment** | Supported? | ++==============================+===============+ +| All routines | No | ++------------------------------+---------------+ + ++---------------------------------------------+---------------+ +| **Remote Memory Access** | Supported? | ++=============================================+===============+ +| ``ishmem_TYPENAME_put`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_put_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_putmem`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_putmem_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_p`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_iput`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_iput_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_get`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_get_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_getmem`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_getmem_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_g`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_iget`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_iget_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_put_nbi`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_put_nbi_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_putmem_nbi`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_putmem_nbi_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_get_nbi`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_get_nbi_work_group`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmem_TYPENAME_getmem_nbi`` | Yes | ++---------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_getmem_nbi_work_group`` | Yes | ++---------------------------------------------+---------------+ +| All ``putSIZE`` and ``getSIZE`` routines | No | +| where SIZE is 8, 16, 32, 64, 128 | | ++---------------------------------------------+---------------+ +| C++ function template routines* | Yes | ++---------------------------------------------+---------------+ + ++-------------------------------------------+---------------+ +| **Atomic Memory Operations** | Supported? | ++===========================================+===============+ +| ``ishmem_TYPENAME_atomic_fetch`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_set`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_compare_swap`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_swap`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_fetch_inc`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_inc`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_fetch_add`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_add`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_fetch_and`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_and`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_fetch_or`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_atomic_or`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_fetch_xor`` | Yes | ++-------------------------------------------+---------------+ +| ``ishmem_TYPENAME_xor`` | Yes | ++-------------------------------------------+---------------+ +| C++ function template routines* | Yes | ++-------------------------------------------+---------------+ + ++-------------------------------------------+---------------+ +| **Non-blocking Atomic Memory Operations** | Supported? | ++===========================================+===============+ +| All routines | No | ++-------------------------------------------+---------------+ + ++-------------------------------------------------+---------------+ +| **Signaling Operations** | Supported? | ++=================================================+===============+ +| ``ishmem_TYPENAME_put_signal`` | Yes | ++-------------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_put_signal_work_group`` | Yes | ++-------------------------------------------------+---------------+ +| ``ishmem_TYPENAME_put_signal_nbi`` | Yes | ++------------------------------+------------------+---------------+ +| ``ishmemx_TYPENAME_put_signal_nbi_work_group`` | Yes | ++-------------------------------------------------+---------------+ +| ``ishmem_putmem_signal`` | Yes | ++------------------------------+------------------+---------------+ +| ``ishmem_putmem_signal_nbi`` | Yes | ++------------------------------+------------------+---------------+ +| ``ishmemx_putmem_signal_nbi_work_group`` | Yes | ++------------------------------+------------------+---------------+ +| ``ishmem_signal_fetch`` | Yes | ++------------------------------+------------------+---------------+ +| All ``putSIZE_signal`` and ``getSIZE_signal`` | No | +| routines where SIZE is 8, 16, 32, 64, 128 | | ++-------------------------------------------------+---------------+ + ++------------------------------------+---------------+ +| **Synchronization and Ordering** | Supported? | ++====================================+===============+ +| ``ishmem_fence`` | Yes | ++------------------------------------+---------------+ +| ``ishmemx_fence_work_group`` | Yes | ++------------------------------------+---------------+ +| ``ishmem_quiet`` | Yes | ++------------------------------------+---------------+ +| ``ishmemx_quiet_work_group`` | Yes | ++------------------------------------+---------------+ + ++------------------------------------------------+---------------+ +| **Collective Communication** | Supported? | ++================================================+===============+ +| ``ishmem_barrier_all`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_barrier_all_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_sync_all`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_sync_all_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_TYPENAME_alltoall`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_alltoall_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_TYPENAME_alltoalls`` | No | ++------------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_alltoalls_work_group`` | No | ++------------------------------------------------+---------------+ +| ``ishmem_TYPENAME_broadcast`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_broadcastmem`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_broadcast_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_broadcastmem_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_TYPENAME_collect`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_TYPENAME_fcollect`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_collectmem`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_fcollectmem`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_collect_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_fcollect_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_collectmem_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_fcollectmem_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_TYPENAME_OP_reduce`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_TYPENAME_OP_reduce_work_group`` | Yes | ++------------------------------------------------+---------------+ +| C++ function template routines* | Yes | ++------------------------------------------------+---------------+ + ++------------------------------------------------+---------------+ +| **Point-to-Point Synchronization** | Supported? | ++================================================+===============+ +| ``ishmem_test`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_test_work_group`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmem_wait_until`` | Yes | ++------------------------------------------------+---------------+ +| ``ishmemx_wait_until_work_group`` | Yes | ++------------------------------------------------+---------------+ +| C++ function template routines* | Yes | ++------------------------------------------------+---------------+ + ++-------------------------------------------+---------------+ +| **Mutual Exclusion** | Supported? | ++===========================================+===============+ +| All routines | No | ++-------------------------------------------+---------------+ + ++-------------------------------------------+---------------+ +| **Library Constants** | Supported? | ++===========================================+===============+ +| ``ISHMEM_THREAD_SINGLE`` | No | ++-------------------------------------------+---------------+ +| ``ISHMEM_THREAD_FUNNELED`` | No | ++-------------------------------------------+---------------+ +| ``ISHMEM_THREAD_SERIALIZED`` | No | ++-------------------------------------------+---------------+ +| ``ISHMEM_THREAD_MULTIPLE`` | No | ++-------------------------------------------+---------------+ +| ``ISHMEM_MAJOR_VERSION`` | Yes | ++-------------------------------------------+---------------+ +| ``ISHMEM_MINOR_VERSION`` | Yes | ++-------------------------------------------+---------------+ +| ``ISHMEM_MAX_NAME_LEN`` | Yes | ++-------------------------------------------+---------------+ +| ``ISHMEM_VENDOR_STRING`` | Yes | ++-------------------------------------------+---------------+ + ++-------------------------------------------+---------------+ +| **Environment Variables** | Supported? | ++===========================================+===============+ +| ``ISHMEM_VERSION`` | No | ++-------------------------------------------+---------------+ +| ``ISHMEM_INFO`` | No | ++-------------------------------------------+---------------+ +| ``ISHMEM_SYMMETRIC_SIZE`` | Yes | ++-------------------------------------------+---------------+ +| ``ISHMEM_DEBUG`` | Yes | ++-------------------------------------------+---------------+ +| ``ISHMEM_SHMEM_LIB_NAME`` | Yes | ++-------------------------------------------+---------------+ +| ``ISHMEM_ENABLE_GPU_IPC`` | Yes | ++-------------------------------------------+---------------+ +| ``ISHMEM_ENABLE_GPU_IPC_PIDFD`` | Yes | ++-------------------------------------------+---------------+ + +\* C11 generic selection routines from the OpenSHMEM specification are replaced +with corresponding C++ template function routines in Intel® SHMEM. diff --git a/docs/_sources/writing_programs.rst b/docs/_sources/writing_programs.rst new file mode 100644 index 0000000..d5292a1 --- /dev/null +++ b/docs/_sources/writing_programs.rst @@ -0,0 +1,96 @@ +.. _writing_programs: + +======================================== +Writing Intel® SHMEM Programs +======================================== + +Intel® SHMEM Programs require including the following header files:: + +#include +#include + +Here is how to :ref:`initialize` the +``ishmem`` library with an OpenSHMEM runtime:: + + ishmem_init(); + +Now we can query for the PE identifier and total number of PEs:: + + int my_pe = ishmem_my_pe(); + int npes = ishmem_n_pes(); + + std::cout << "Hello from PE " << my_pe << std::endl; + +To perform ``ishmem`` operations, we must first allocate some symmetric +objects:: + + int *src = (int *) ishmem_malloc(array_size * sizeof(int)); + int *dst = (int *) ishmem_calloc(array_size, sizeof(int)); + +Now let's initialize these source and destination buffers from within a +parallel SYCL kernel:: + + auto e_init = q.submit([&](sycl::handler &h) { + h.parallel_for(sycl::nd_range<1>{array_size, array_size}, [=](sycl::nd_item<1> idx) { + int i = idx.get_global_id()[0]; + src[i] = (my_pe << 16) + i; + dst[i] = (my_pe << 16) + 0xface; + }); + }); + e_init.wait_and_throw(); + +Now we must perform a barrier operation to assure that all the source data is initialized before doing any communication:: + + ishmem_barrier_all(); + +Let's perform a simple ring-style communication pattern; that is, have each PE send its source data to the subsequent PE (the PE with the largest identifier value will send to PE 0):: + + /* Perform put operation */ + auto e1 = q.submit([&](sycl::handler &h) { + h.single_task([=]() { + int my_dev_pe = ishmem_my_pe(); + int my_dev_npes = ishmem_n_pes(); + + ishmem_int_put(dst, src, array_size, (my_dev_pe + 1) % my_dev_npes); + }); + }); + e1.wait_and_throw(); + +Before verifying the correct results, we need to perform another barrier operation, to assure all the communication is complete:: + + ishmem_barrier_all(); + + int *errors = (int *) sycl::malloc_host(1, q); + *errors = 0; + + /* Verify data */ + auto e_verify = q.submit([&](sycl::handler &h) { + h.single_task([=]() { + for (int i = 0; i < array_size; ++i) { + if (dst[i] != (((my_pe + 1) % npes) << 16) + i) { + *errors = *errors + 1; + } + } + }); + }); + e_verify.wait_and_throw(); + + if (*errors > 0) { + std::cerr << "[ERROR] Validation check(s) failed: " << *errors << std::endl; + } + +Finally, we can free all allocated memory and finalize the library. +For symmetric ``ishmem`` objects, we must call ``ishmem_free``:: + + ishmem_free(source); + ishmem_free(target); + sycl::free(errors, q); + + ishmem_finalize(); + +For an overview of more APIs and how they are used in applications, the |ishmem_examples| provide an excellent resource. + +.. |ishmem_examples| raw:: html + + Intel® SHMEM examples + diff --git a/docs/_static/basic.css b/docs/_static/basic.css new file mode 100644 index 0000000..6157296 --- /dev/null +++ b/docs/_static/basic.css @@ -0,0 +1,903 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 270px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_static/doctools.js b/docs/_static/doctools.js new file mode 100644 index 0000000..d06a71d --- /dev/null +++ b/docs/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js new file mode 100644 index 0000000..d371afe --- /dev/null +++ b/docs/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '1.0.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9a46050cfa17fb2f15c6932b26ff5093f354da50 GIT binary patch literal 9662 zcmeI2Sx8i26vwX?Mfp^=(1Tz>kv$1TPZ1GOuSN8h5k8dTLT*u6VL_W{xrNbU8fcA0 zh@s;$Gp^~lmFA3=spDRXYnYljGpFyI@m^*o$r*ICf$t9Ie)pbl``z>XzjN=y2!b2? z`T7d%>@CQ53c?ma5OyfDjU4QhdtNZ*1-Pam`y4;8XK*>={42X= zJpMfXi^&^YKU_atKlJV3a_?STH@<)Q{^k3Z@888}U@?6c%0KV#?uU+|IA|}3!CVC& z9-pFno&17zzLl*eKenxkJz%b5zJ^pk=q!E+dQ~FzN7nq{bquAc_IE!FZ=-yqv1Erk8|NMs;{*gOA)k| z{CLvIL#S=9CPVT~kM)yJeZ?Cl2EIyu%Zrh=O2)c@#vRkwQI%em1SQvfK>I3^N|9SE zoyD(=+zKX>krZZOtaPrm8VerS1n2^!PRu=qa%lhFV}Eovx=*z^}au6t3$ zW_o^+TP&T$Uln^$3T4)(A10r1b_PnW?IIpzLo1Em!`iq@jF#~iS?4RA#b1+f zOybA2z`2{>M40)R7NFY3Q0aUTBH;S&Gka2KFW z&DqSv5YP_1iGwHriEUbANOo=)DA0ty*e2_XI~}W;ns3$H#yYF@>D3xucx7} zMovC30aV8yT^4?1pC0>Wp4Z~sQG|I$u;RyRF@GvAZiDfjMvETiOOwe2tvS)u7uR#C z;$LxRAGGJ+gEqx&8oU0{NxIi&%0PA5i(SXS_l6wksZ2M&gV@|Szoq{5>LmD*9VM|T z0@pxexSw|j!9)CylV%wJMhwH~y6OP<-{c!y_q8Hn?Tt8et cwwiF{eoj9|*2g9PL&Nxu;{SknxiS&>14-g>!2kdN literal 0 HcmV?d00001 diff --git a/docs/_static/file.png b/docs/_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/_static/images/logo_binder.svg b/docs/_static/images/logo_binder.svg new file mode 100644 index 0000000..45fecf7 --- /dev/null +++ b/docs/_static/images/logo_binder.svg @@ -0,0 +1,19 @@ + + + + +logo + + + + + + + + diff --git a/docs/_static/images/logo_colab.png b/docs/_static/images/logo_colab.png new file mode 100644 index 0000000000000000000000000000000000000000..b7560ec216b2d1b6f77855525fe966c741833428 GIT binary patch literal 7601 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 diff --git a/docs/_static/images/logo_jupyterhub.svg b/docs/_static/images/logo_jupyterhub.svg new file mode 100644 index 0000000..60cfe9f --- /dev/null +++ b/docs/_static/images/logo_jupyterhub.svg @@ -0,0 +1 @@ +logo_jupyterhubHub diff --git a/docs/_static/language_data.js b/docs/_static/language_data.js new file mode 100644 index 0000000..250f566 --- /dev/null +++ b/docs/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/_static/locales/ar/LC_MESSAGES/booktheme.mo b/docs/_static/locales/ar/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..15541a6a375f93efed3f410c2f892174ba91aaa0 GIT binary patch literal 1541 zcmZvaJ!}+56vrn40$lhsA5n;v39lh z&UUPnK|(?lfROD&7suGxxK0yMQ@o*|gesy+5vu&(?mBh?qn-WTn|=G<|NZw~b#1&Y zus*}?#(shQ752{`;fA&4V5qyTPS`e-!60i}(%5{r(0^;D!zP`#V66yFspV7<>kvF5*86z5`j$ z=8ez}?gu^a8}Li;DtHLIQScsk0P*i2&-V)CK7WC%Q*07qAJ7GU4juvd{a%p0tQWim zeu4N7$oY#!{2XK-Ul-?ZLAIP{VE@?5Oee^5uV0WLc46~8yjT}6*2P}4uiOhI#i!V; zXZ>RTx%Xyl*phu;(K~`m+PV^FjkZeL1V5sYI1K7moHI9c!}v9+ja5U&{2;G|4YhWh zm^7}c{~g+Tn8?Tvl<2F47Nu9i{l>4L9=6uy?FAD0FiY3w(=eiIKTWvQbqOe&{(Wd5^qM9YH}dGcsaNzja& zq-k29Wt#nO;9At7wwrWQc-|J&abpO^Bu%@f8>dB@7kE5QPu!GiO4q{asH8bJN^P3Y zvv7uYJM=8C@P0OzYSB}gLot+ZNt#(-bAo@Zj6?Yfp?anYnoPQR?;I# z{we#%LHPn31obOfkF`-+I9KUX>gUj zW@~ literal 0 HcmV?d00001 diff --git a/docs/_static/locales/ar/LC_MESSAGES/booktheme.po b/docs/_static/locales/ar/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..2e8d682 --- /dev/null +++ b/docs/_static/locales/ar/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ar\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "أقترح تحرير" + +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" + +msgid "Launch" +msgstr "إطلاق" + +msgid "Print to PDF" +msgstr "طباعة إلى PDF" + +msgid "open issue" +msgstr "قضية مفتوحة" + +msgid "Download notebook file" +msgstr "تنزيل ملف دفتر الملاحظات" + +msgid "Toggle navigation" +msgstr "تبديل التنقل" + +msgid "Source repository" +msgstr "مستودع المصدر" + +msgid "By the" +msgstr "بواسطة" + +msgid "next page" +msgstr "الصفحة التالية" + +msgid "repository" +msgstr "مخزن" + +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "Contents" +msgstr "محتويات" + +msgid "By" +msgstr "بواسطة" + +msgid "Copyright" +msgstr "حقوق النشر" + +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" + +msgid "Open an issue" +msgstr "افتح قضية" + +msgid "previous page" +msgstr "الصفحة السابقة" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" + +msgid "Theme by the" +msgstr "موضوع بواسطة" diff --git a/docs/_static/locales/bg/LC_MESSAGES/booktheme.mo b/docs/_static/locales/bg/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..da95120037f8d7c52ad1f166a7682ea55ca47a01 GIT binary patch literal 1708 zcmaKqOKcQJ5QaOv0vkhkhC?jT2nh&cNkBwFYxY90B_t3AOpcMpyUpy7b@wpSL+}lZ zc_s=RKte*|C2`<_7URcy7jLdPR->G9h;qvTamgjhjlX8bj}R-P?fIs=y6dm{dw*ZQ z?5@DG8KWEHSBxzfKYoB0o|Q|4z)!5gYX#T^t^_xLtH5sX6L34Y5iEo2!IR(`P=OzV zHs>hFdG3I#!TVqr_zYYJPUie2U;izi{|U0*KVSh|x->h#2IP4+$a!{vO>jTB41AmO zFOci|8~haPLhws)C%7B@Hs=rEKFpioR`3nD2VA{8JAV*le@=j0?>TT6cp2OVJ_ot4 z*WiBe50LY0LeuQ=S0K-igY45ea0fUFvgOv1JgO3NWrRpO`@TbYDa&#J04 z8uLU~YT|f^4W5=k94AWjM}bBXBl{2ciBp+gq(T!1)p!vCDOMX z%z7FyzF${Td*=h+vjIf3x?r>F4C`bfVWiFnCdtcQkUma)U!h8cPEd+Dt17m5q+0w& zMKQ9KWTsza{bH(IICkV%?|gjko-YcyvBiPmP?e-b0iTC;FVH=*QuCr%+4AXuzT$!T zeUYc*Gb$?f>WZlb+AqligMlp^^|YVB*ODCc3;p#Z^6JGt6Ai^Bsl#*{m-qF^?6bU6 z%dKU(_p_dYpa*V5&_n77dhBk}xVz~t(j+x#hMF`X=r)bH5$d>$?h>`ABk5bs2r;-dTfq#Q2#?t@q|9teP3*uNPWy^ACfqd~8<8}Y{+a1%CJzCK zxEruG6KALRIVJ-U$3Yy!~NpG7AK|w8QyPuG1485SvTmo%i zrHNb3JL61fEcXDLQBPwL`;mLLOPayeL#0F0B5ju4Yr5-c6aTq5cjf(V=MS}!0~aLI KlK*|VZ0$SA#iddJ literal 0 HcmV?d00001 diff --git a/docs/_static/locales/bg/LC_MESSAGES/booktheme.po b/docs/_static/locales/bg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..56ef0eb --- /dev/null +++ b/docs/_static/locales/bg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "предложи редактиране" + +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Edit this page" +msgstr "Редактирайте тази страница" + +msgid "Launch" +msgstr "Стартиране" + +msgid "Print to PDF" +msgstr "Печат в PDF" + +msgid "open issue" +msgstr "отворен брой" + +msgid "Download notebook file" +msgstr "Изтеглете файла на бележника" + +msgid "Toggle navigation" +msgstr "Превключване на навигацията" + +msgid "Source repository" +msgstr "Хранилище на източника" + +msgid "By the" +msgstr "По" + +msgid "next page" +msgstr "Следваща страница" + +msgid "repository" +msgstr "хранилище" + +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "Contents" +msgstr "Съдържание" + +msgid "By" +msgstr "От" + +msgid "Copyright" +msgstr "Авторско право" + +msgid "Fullscreen mode" +msgstr "Режим на цял екран" + +msgid "Open an issue" +msgstr "Отворете проблем" + +msgid "previous page" +msgstr "предишна страница" + +msgid "Download this page" +msgstr "Изтеглете тази страница" + +msgid "Theme by the" +msgstr "Тема от" diff --git a/docs/_static/locales/bn/LC_MESSAGES/booktheme.mo b/docs/_static/locales/bn/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..6b96639b726a2fa959a6419b6f8b7e0dfcce33ae GIT binary patch literal 1646 zcmbV~&5IOA7>8S2xE{WN>)mqrjbP_+ zD|`%n|9`+8@Gtlc{Cs5;eF=|2zkdOGUHYZ{3U0$*$xxrd?Ipj1NbvXay{#>+)sQwK zLc@BGr=Q8s@3s2pVyti%e$UVEm)Gmv@K$Kxb@iIkGQ)QH3Dc6%KAm>6q}ejje*L3r z>$oA5HgZzyAH?ybE$6p$-O1{5(WYr7xk%%tj7A!XA>+Uti*qA7X(KkWA+(Cd;*P4f zqC=@vB32^F^Nx(hvqTZ3#rXcw=x~uglc~-VqqA;wIBg~Bl-TQgnP|xqG73*IS+qW( zo6WWqDn6MsW0O!s$y282M*BKNku;Mh6WuA>9MAOkvTmve8r7pR%ZaLqqE6Ml~R{3$6RYz1^ zHxkvXiQSWlsf@*{*+H+Gm{gVVb|;J5)lr?D$ZJBS!OVxh8WP3p@HQnr8y3617^+0h zTGzYm>~GFKb#|8L(pyu`-gfp`;o|IhXQy$z<$9NR^WnYI&Q1wu?}S90&tc32?JEMg4wtZV(;LB0u<-^*y2)npB|JLL@f}SDrcO%Hi&xc%8I{oPgE$%7j?Kgl1>Fz ze@F9IjWZ|r@GsvuUE*t^AN05zoTs2{kFZmI~m25V-8`&>S^dPTx z$^cEyl^jJ+?oOKAsWhagj`qI>dC8~bzq_0hZSgC)LsF@U6+9F=tR`Ky;!WHMs_vF; z;&hv=3*2(}kGreju(wh1_KV>qMpKtu5HHORr>y#KY7MM6T^uJ&R^K(T z4hABYyJ6tQiOxVI^L*F1qO_S8am=vBunT>6i=$ATZdb3f&v8VJ2BK9Ft@hoIsQAhin!}wxzs(N*6pVu~DVqb08$hD1)Yjm|` zLS;tVxWMJrDAJYrr0_baPC1|EHL_WMn2%o?qrvC+h@~^*GMofV4`)o0LtLbidwpll9h6X)!5Y za@FKiW0X*mn3iX1k|l^w_?&_QX>NDCJM7-fGBbN{ zu90Yv ze2zJT`3vTkm``?L!Pxha5O~CXEFXgh!F}K{a6dQ$o&?W;$H6Xm6ub={0u}ff7#cnT z+0QfZQ*aGD2(E)iz#kj_+}M9>_J4vL?;Y3zckiz69|Czl1G1m9;7jl_xEK7Z;olA4 zfrnxL7yKGLyhn&Hz$@Tsa2Y%S-Uqp^$KWaO2ax0Z1af_E!2{s0AfNlAvHt_IJ_it- z&m9L@hqKN83dlMwfSm7Lkn7GsmYi+Vd*Crl_RV$g90)P3f&KE}ym+u5)|z$Y8sKu8 zBlmXaVEsAAPcR|Fw7=ro7!QS1iR;z`WrD|#V(fI1264kaFu9d685`8V+Kg6ouC~qI zmM&5s7(=Q(6*5s`F4h6A|KHA+dF~^pl%b)GmAEN=pt6W%P%&A9eQBapEEYH*4QcO7 zC3;R9II+~bF)xtNkjEETCX59u1`)=$+?iRns%x~9HOl3bCIBb~^g5yYs6 zq0Y{7oH|J1)JWU1NqdKTUnYq{mI{?16?;!bp}i2dzgNz~TZiiSZI0ibMsD3&xHY%^ z{^Gd{twz{(e_W^z1tf63$fY*36s6L66}rp)`S#WAb50t+qFj5Cn}I4y~Kg zBqen1P~=;^ymT^e&s#V29Wupq>${g`ss7ph#?V(?y7=vEOZ04vuGQ<}z{^y~66*P^ zno!}Y$w-Q&P)$-}%RuPqz&a}Is;MT!%#Nz{)Y2fgS=pT0Tnmc4rqvjN;Qj07&Ihjp zVvrB;Z*XvQD zxu;CEAr^xgZM{%PrEqqD`$N&!KBKt)RPHp%tyA?Xw}`Se37c!8k8_eTqth`htw3AZ zm~1S1a92z`@RU9C@Xu~NJj63$#L LZS{&p7>oY^Ev$2? literal 0 HcmV?d00001 diff --git a/docs/_static/locales/cs/LC_MESSAGES/booktheme.po b/docs/_static/locales/cs/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..3818df9 --- /dev/null +++ b/docs/_static/locales/cs/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "navrhnout úpravy" + +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Edit this page" +msgstr "Upravit tuto stránku" + +msgid "Launch" +msgstr "Zahájení" + +msgid "Print to PDF" +msgstr "Tisk do PDF" + +msgid "open issue" +msgstr "otevřené číslo" + +msgid "Download notebook file" +msgstr "Stáhnout soubor poznámkového bloku" + +msgid "Toggle navigation" +msgstr "Přepnout navigaci" + +msgid "Source repository" +msgstr "Zdrojové úložiště" + +msgid "By the" +msgstr "Podle" + +msgid "next page" +msgstr "další strana" + +msgid "repository" +msgstr "úložiště" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "Contents" +msgstr "Obsah" + +msgid "By" +msgstr "Podle" + +msgid "Copyright" +msgstr "autorská práva" + +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" + +msgid "Open an issue" +msgstr "Otevřete problém" + +msgid "previous page" +msgstr "předchozí stránka" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" + +msgid "Theme by the" +msgstr "Téma od" diff --git a/docs/_static/locales/da/LC_MESSAGES/booktheme.mo b/docs/_static/locales/da/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..f43157d70c63ff21b4385dc36cb73f5b14eb6b01 GIT binary patch literal 1304 zcmZ9KyKmG$5XKi02pkaJ&;+qGJPH$nD9}aMKoTh;K$JVu@15uDO?nzn&U>A+XM4Phfw-zKH#7 zA8uHO_6vba9LDV+coaMYo(2zt6W}@UGI$1TfTzGEa2zD?I2bB!f*j{Lcno|A9tB^6 zC&9NBKUV%PmHi!Ly?>3CQ(qR(uY!{wt8{eFL)2d+-GK0XzbJ2D#pEAm_OQa=bqv z>yEt{#_?I3XFI&O|2#v^6KxpGSKQga zB|}Q$t~G&7@Oa2KoKDgpX6$2=SrtoT1GTMPm0g|DuG`zfb!d+>q}t0|B_w8J9T57T zIag$v?>HhOdp0JqpnQ-;9;-mHv<7xzI;nV=;{#=+_P!vo=(Ir)D;H<{wy4q`3h#>~ zA!JFY1gY2+>V#-Mj+V)JM61hEKVto8pj^8@e}8uO{nYgvwW_gEYa^$+3`k%y&y+UP zvXd(3DKs9n=AzrX-#KM`ms~V!IyTlOsmt4K9cl~8BnA3fm$9lXW`$E(G-qAU*QLn^ zrf=MwmgQsPs*#r(a_ZW2O)OJ9*z+b%Z59igr)teR+B0C^wn>Bm@6LBsXEFWfiOCp} zUSoVqXi7p(4!JPl*su1tkyFr_56Z-%sbe(I4#o^g{#-PJazXT;wvB`*ceb5TPdvg| zr`IHo4yJvN)iV_A{*4(42I?u%!cD5KXs+sR7@qEf{)q=$-v3Mo~pNRgs6dB45A_~g;fK07nJ@Atd!PtN@)FuuTCzw-;3=>No&-0+;~;^bfwAQikaeDcpMpPw z$G{ih3Gh|R-`o9n?fMUp?fnCGz(a>7-ya8gy#TV#x8N_}HSiTa&9^9*#YUsChPKG9Ug3-wb>5ahNSoell`9^ zoCmHU$Afe<^%ebHTryT9ZaN#u#(;-<*Xy#1V#z(Q#;HPD7is9+wj60gd)vV!pVPk0 zSm_{ZRgzdPbcFPDxsr?txhJx6>8J8fdK zt=*csGQxpNwNctG%DhrOQ0(2=TFGwgz2}t;Bl6j@&0V2w*_AhjI(F8SEfezEl?8P+ zO!CTPE6$HYSK7K+hThdhIeF}TXXUw`ymDc&BbHF5O7u~OM`4rK)5Mn;Zwdn zburuA-y2y!aDY4^_ YHT)aX(-~_xf`&nTEYd88)4;9x4>RdeS^xk5 literal 0 HcmV?d00001 diff --git a/docs/_static/locales/de/LC_MESSAGES/booktheme.po b/docs/_static/locales/de/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..c0027d3 --- /dev/null +++ b/docs/_static/locales/de/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "vorschlagen zu bearbeiten" + +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Edit this page" +msgstr "Bearbeite diese Seite" + +msgid "Launch" +msgstr "Starten" + +msgid "Print to PDF" +msgstr "In PDF drucken" + +msgid "open issue" +msgstr "offenes Thema" + +msgid "Download notebook file" +msgstr "Notebook-Datei herunterladen" + +msgid "Toggle navigation" +msgstr "Navigation umschalten" + +msgid "Source repository" +msgstr "Quell-Repository" + +msgid "By the" +msgstr "Bis zum" + +msgid "next page" +msgstr "Nächste Seite" + +msgid "repository" +msgstr "Repository" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "Contents" +msgstr "Inhalt" + +msgid "By" +msgstr "Durch" + +msgid "Copyright" +msgstr "Urheberrechte ©" + +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" + +msgid "previous page" +msgstr "vorherige Seite" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" + +msgid "Theme by the" +msgstr "Thema von der" diff --git a/docs/_static/locales/el/LC_MESSAGES/booktheme.mo b/docs/_static/locales/el/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..fca6e9355f314677f2890f5679fd79dd67a7a5a2 GIT binary patch literal 1722 zcmZ{iPiS047{Euewt4U5n=fkKPHMz8X+JKcS{dGGPw+nU_c zCZPt>L)D-XMN9P{m<`*yO}BBoS3#I}@#Mj)Cp~!cBL2SFE!h-0?96ZHoA3Yk{@Ax; zMX{b{53_$`KhIu%fP=N`L8bVq-5d|WJ#ZJ?4|l_1_!N8@J_(C(AAASyg$6zb(>@oV z`1uSz3RmGC_yc?b-t6<2zWn$8{ZAG}N=-3*|lx#m@-51&_iV@GtlX{0B;& z|G|Us0FOuETkutwLXlsEZ^B>UVYqXrQitFhQ0g-9MK}YWfvbJC;B(wFD1G=Fz66IT z_E|X6=LsnC_o4J>9*)3IptM|SkT~LFKU;E^x(64jsmIx3FH7o|CH<3LOJ5JLNx{`F zvmIQ7ax;7w(hfIYb$phePOCsWALdpYv;G zOPqxDxMc1Trd2=DkykNltn8<_zIz?7*J?>AHYU*1VcDqDUXtp1RQ6I+)?vWC9+ax; z?Fa=g(0-ECjhcx404JfII61D)_Tt4R3KKsK<5_h!s`|lJua|GifioP~!B0M6o&VhxLBi1MZW0rDDj^PzkAoADB{_KUL1ZXW|5J z1>K9Em-u-XId|sNnX#?+BZm&>`i;#`&PJx7QxbSBs(F4es!LTbPE1;ScXB*`Y)dcp zg5;cu^J76NEc-#FppQ-YY3{TaRO_9ar-jjaZW8iNR~zWhPCd z!IGORj47br#qth1q_-xG*Y+m$QJl1ldYsi|#&y>pn)3O}2r<588%%~cb6DJv&M0zR z6Ju?!Gpp;aJ2H>n=Q;4)9QX)UBsQv>oVXExo49XqkvY35v_#)clq&D(UelG*<`bgE k?KNN}BbD^J+2#A$4_2dkCejtU)5(_TEbrUqDh*fv19*CpTMYflop9djWEuuR*>)1Ua4$Am958?gqbuT!-Hv=RLl? ztm83|e|Hk(lCvi7xt0eoxwahd<^hR9n|*n(9}lh{d$2y|1j)ji^V&Q(5ANYkOq8Lh zleoHqM}{7WYt{rZ!Q&-caXRS*F>UXd)T&q-8)(7WzFgEPZ5(@>yDt567<$^vOeG|m zu?~=4-?s8J^<76~z&terQmeydOn{H3s$Z$a!slCrhw4F8(v9dkg67!{> zqs)38tXmQDSx=k0@+!yH>Cu2hvC4%qr;bgMl%!G1I#EHx#L(SPMrYZlG|3z-YnxYL zZ<6X6Bk3-!Gg!U#kimbyhN}%YXpR zWvS9;N_Kn7c?ykNomO;Zym7(o#sxZQOml4 zuS=5^Ti>`iCCk^wX(LZG)Bqh@I0@tnvqcu0^K+ literal 0 HcmV?d00001 diff --git a/docs/_static/locales/eo/LC_MESSAGES/booktheme.po b/docs/_static/locales/eo/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..6749f3a --- /dev/null +++ b/docs/_static/locales/eo/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "sugesti redaktadon" + +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" + +msgid "Launch" +msgstr "Lanĉo" + +msgid "Print to PDF" +msgstr "Presi al PDF" + +msgid "open issue" +msgstr "malferma numero" + +msgid "Download notebook file" +msgstr "Elŝutu kajeran dosieron" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "Source repository" +msgstr "Fonto-deponejo" + +msgid "By the" +msgstr "Per la" + +msgid "next page" +msgstr "sekva paĝo" + +msgid "repository" +msgstr "deponejo" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "Contents" +msgstr "Enhavo" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "Kopirajto" + +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" + +msgid "Open an issue" +msgstr "Malfermu numeron" + +msgid "previous page" +msgstr "antaŭa paĝo" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" + +msgid "Theme by the" +msgstr "Temo de la" diff --git a/docs/_static/locales/es/LC_MESSAGES/booktheme.mo b/docs/_static/locales/es/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..ba2ee4dc22148ed53f2aeba32c5965654d4a5a2f GIT binary patch literal 1396 zcmZ9Kzi$;s5XU#z;m3pU!zKwxjKJWQQZ~wEO{|$=X8*l*5%yj3EgEC(L#m|@E3-CIKPyLHQ^!@|o{A*Bj z4$La`8F(5z16~6q{%=5u|2}vYjQ#o}@F?a_K{@|BDEE2^ehj_>C4c{bvhUD`U0&uv z*?$p~_`U+=+!`qRz6aYpfs%6BBl;4{Ji6po;@;mNp-!U9Icai#X`&;(C9e__T(%nW zw)>mpL*DQZy5tBcRcdJ)pH3yKo8BdMDdMNz4yGuRTJ{f|^^|Mp6HmSWQEwW{d*1tzb%mTC1mCsq-qL_43=ae|t-eKOjtW>vaY#^sij18-e zU>uxyy|KKi?sj^CYadPWVO!m;OXD8uC5dfPa>c40^|ZUw#21BS?P$vslng{1KTKV8 zUUWKW55MCO;ccWl{h{a&Tjjy}+WN}g`qfKU z27O|OlkJ*EIw63|wI$;gbyiY{oW}PitHT?6`vSSR$zizSGM^h)jP#AENrPMDiUxTd zX^w*p+XS-1RUfK2(ynf&aeQr2cfaHFPM;g=s}~jrYQqQVnr;8cCiiNY181d=I%iD{ zk_k)9C=?Vlg{(ANUY4?kat==RzrVWKpj=Q5{Q{y&B&juy+NY=9viqbpt^2(7Sd&X+ zE$PfxwdF+Wo=v7AO<8KlnjOl_?lY%ZD#GnhWgz3#*VABvZk(=zpIWX+tyOg}6^wXC zsg65u%fhre9yJUf6KusrthQzv+672++(cecEV5X4sri<+xahTU@tQ2Tj8rs5BN4#T iU!*-mQ^Nsab@xTRCJqKkd{;ciD^w4Rh!536LH!R)!cyS? literal 0 HcmV?d00001 diff --git a/docs/_static/locales/es/LC_MESSAGES/booktheme.po b/docs/_static/locales/es/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..71dde37 --- /dev/null +++ b/docs/_static/locales/es/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "sugerir editar" + +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Edit this page" +msgstr "Edita esta página" + +msgid "Launch" +msgstr "Lanzamiento" + +msgid "Print to PDF" +msgstr "Imprimir en PDF" + +msgid "open issue" +msgstr "Tema abierto" + +msgid "Download notebook file" +msgstr "Descargar archivo de cuaderno" + +msgid "Toggle navigation" +msgstr "Navegación de palanca" + +msgid "Source repository" +msgstr "Repositorio de origen" + +msgid "By the" +msgstr "Por el" + +msgid "next page" +msgstr "siguiente página" + +msgid "repository" +msgstr "repositorio" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "Contents" +msgstr "Contenido" + +msgid "By" +msgstr "Por" + +msgid "Copyright" +msgstr "Derechos de autor" + +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" + +msgid "Open an issue" +msgstr "Abrir un problema" + +msgid "previous page" +msgstr "pagina anterior" + +msgid "Download this page" +msgstr "Descarga esta pagina" + +msgid "Theme by the" +msgstr "Tema por el" diff --git a/docs/_static/locales/et/LC_MESSAGES/booktheme.mo b/docs/_static/locales/et/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..983b82391f499b67a9046c15d0dd8744650ad925 GIT binary patch literal 1341 zcmZ9Kzi%8x6vqb=^5gOYNC*@$VrY^ev%C-5~0q6cNoSQvQHcDIz*5N(ux8-*>yj7Nec{?37 zm@hCt!hG}w7K~$WDuqWK$8rQb2_6H_g2%xn@O|(C_#QX{&wyWnr$GYW22;<6py+%D zo&tXWPl7*z?}ESdeBSTB?Csw{@%I-v01qANzCR6$y#$KRMeqsu1$Y$v1AGho6Fdz5 z4az++J_JsIlKZFNIq(K3aoh#Zg45o90E(Y)LCNb!P;`Fo`2>{wpMm1IA0b zcW{Vb>7mpIdO`vjME%rCbb#Z zLB#9Ln`>&T^B1V~k&_R*YOAf;-PhM8wsB1jsl}?dyPU?psw`<|W?Y%XaN_8G>Z0@F zr*qN&8_XbscI- zgH4-*vBjDXO&n_1F3dRkd|7v|qf1VIJknP`Sstj{^T%OktXj#ancCu*yH}n+<|;=N z-jrOCj`OFMOqk`wddINU##;0GR19tBdvzi?e7zruw52+Aw>NT5Q%F&X%h*Lj=6f7z z8jNuq=-IE#jk<#c{m?m+L;rJ$825O_Nq(D^8CKl}zio+{#UD_z^uJ)WVl7Wi?YTr` zTRZHgk)aH+jLK4D)OfM3BNeE1ohJ(1utQX6H>rE`y-+P|2~e4t1fZw$r;!^}gUIe5 P_MW2m5}a<3ol*Y+f5$~k literal 0 HcmV?d00001 diff --git a/docs/_static/locales/et/LC_MESSAGES/booktheme.po b/docs/_static/locales/et/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..cdcd07c --- /dev/null +++ b/docs/_static/locales/et/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "soovita muuta" + +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Edit this page" +msgstr "Muutke seda lehte" + +msgid "Launch" +msgstr "Käivitage" + +msgid "Print to PDF" +msgstr "Prindi PDF-i" + +msgid "open issue" +msgstr "avatud küsimus" + +msgid "Download notebook file" +msgstr "Laadige sülearvuti fail alla" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "Source repository" +msgstr "Allikahoidla" + +msgid "By the" +msgstr "Autor" + +msgid "next page" +msgstr "järgmine leht" + +msgid "repository" +msgstr "hoidla" + +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "Contents" +msgstr "Sisu" + +msgid "By" +msgstr "Kõrval" + +msgid "Copyright" +msgstr "Autoriõigus" + +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" + +msgid "Open an issue" +msgstr "Avage probleem" + +msgid "previous page" +msgstr "eelmine leht" + +msgid "Download this page" +msgstr "Laadige see leht alla" + +msgid "Theme by the" +msgstr "Teema" diff --git a/docs/_static/locales/fi/LC_MESSAGES/booktheme.mo b/docs/_static/locales/fi/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..d8ac054597c924e3010f629caeac1c748b7211cd GIT binary patch literal 1368 zcmZ9KJ#5r46vquMU&lA4Af!r|g^wXX5kqz52B58kprWEjclYv|xbfLh>>S*}#K;Cr ztS2O9B*cCTVrBw~l?gF1AR)y6B`K}2;{5K}=lB1=7k@o5`BGq<#+lRCrOA1CaQ!^kKlhsTrZJIH9K_^ryK`_q_#3i5+EIO9achW2 zhLpr@X9L;b@gpA=I!S|AaF48UDwfs-T6Zp!8`{wJvUg?CqyH8|s=drrLSix20jamb zrP3JRD~PP@yO_j1<%2BqSOtouvxrOEOU3;he^6Fx?@JOZg|3?XUWo3*(Ha#V+1j$!k61sdlv~SpmKV48XD?rEHI0qB!<^bOz`&KTmRqe+kV}^cf!#bT&>G1)AQnFuaA9SXR zO>~T6=Ywl@%y^W>^xt9_kNV@0^m3c4B9BMrgfh( zuVp?S>46Ru!ccTe7eieYS*GF0;G*3eAeplXnZCllffvOWA=>i5w+5yH-zgk~ao1dl zs44(@M0}Rt9Mp|iQ#yrKbuAq3msY|P`l$x0E<_Em{7-o?CS$aPMpfmO5T&sTb;r2u H66VBTf3Z^G literal 0 HcmV?d00001 diff --git a/docs/_static/locales/fi/LC_MESSAGES/booktheme.po b/docs/_static/locales/fi/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..3c3dd08 --- /dev/null +++ b/docs/_static/locales/fi/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "ehdottaa muokkausta" + +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" + +msgid "Launch" +msgstr "Tuoda markkinoille" + +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" + +msgid "open issue" +msgstr "avoin ongelma" + +msgid "Download notebook file" +msgstr "Lataa muistikirjatiedosto" + +msgid "Toggle navigation" +msgstr "Vaihda navigointia" + +msgid "Source repository" +msgstr "Lähteen arkisto" + +msgid "By the" +msgstr "Mukaan" + +msgid "next page" +msgstr "seuraava sivu" + +msgid "repository" +msgstr "arkisto" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "Contents" +msgstr "Sisällys" + +msgid "By" +msgstr "Tekijä" + +msgid "Copyright" +msgstr "Tekijänoikeus" + +msgid "Fullscreen mode" +msgstr "Koko näytön tila" + +msgid "Open an issue" +msgstr "Avaa ongelma" + +msgid "previous page" +msgstr "Edellinen sivu" + +msgid "Download this page" +msgstr "Lataa tämä sivu" + +msgid "Theme by the" +msgstr "Teeman tekijä" diff --git a/docs/_static/locales/fr/LC_MESSAGES/booktheme.mo b/docs/_static/locales/fr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..f663d39f0faa76c5b9bd504c51252eef74cca5de GIT binary patch literal 1412 zcmZ{jJ!}+56vv0pm9t{vhm&8^IIO`h6wqyy*798~B-FLeKdo!!~aIl*+ zlr)i&DosjGX-Sm+nxs!ffzqWyh>mpmzuUEJBQe_9-_FOq|NFX^vnPL27*{aoG5^N= z4D;zRyf9{tD}_g$!Rs`57MuYuf@i>a@G^KEoCEvdEO-|@2Qqjbj4hvlV&_NjBk*VN zEI0-~27hn)XS@HRUH=P;-hW^RJaMA={W(z9^Pt$d0saAg1L9Gy@DjZ@;0NGaQ2bFR zmAVF8043f<@DuPZcoBRAia+0jpMpPtqW^1q{u?N9{{>2%|FrAZpu~0hRC7KD%K8iN z5_lUFyPKf+qrt170VU-UgXB+gDSn8C=pG)BP!}*oSBAtdL+nayq9N(OOB9IrIvT`P%K$}>uh8j13v0qZ;CRi75AO3oX*L*$lK06qM@nyU^}?vGk#|? zmL^cG3s$SSi7>stTuW6IGS6&j2uDVy3#y+NH@oiA@h}HB>+f7UZR}>YK)jOup(LluVV6L*Ln| zlGjyt&G}L2k*%l8&|h4l=Cgm((zQMpFVk1~#tn>=qIhM|}`x`)$>jU}ieUbVvBn#nWIG%|r{ z@(VpgvBl*|+YE)ZQEjFj&wG?C)!uDalV>RR`l$A11nWA{5XsPS+9@lOaXon+Y2Ue0 zE>oVUGO*E>4ZSkmuAAH}>yV{N!q_?5zAzp!&O#! TA2+cw{Vw>h7Yg+MtLz81? literal 0 HcmV?d00001 diff --git a/docs/_static/locales/fr/LC_MESSAGES/booktheme.po b/docs/_static/locales/fr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..b57d2fe --- /dev/null +++ b/docs/_static/locales/fr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "suggestion de modification" + +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Edit this page" +msgstr "Modifier cette page" + +msgid "Launch" +msgstr "lancement" + +msgid "Print to PDF" +msgstr "Imprimer au format PDF" + +msgid "open issue" +msgstr "signaler un problème" + +msgid "Download notebook file" +msgstr "Télécharger le fichier notebook" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "Source repository" +msgstr "Dépôt source" + +msgid "By the" +msgstr "Par le" + +msgid "next page" +msgstr "page suivante" + +msgid "repository" +msgstr "dépôt" + +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "Contents" +msgstr "Contenu" + +msgid "By" +msgstr "Par" + +msgid "Copyright" +msgstr "droits d'auteur" + +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +msgid "Open an issue" +msgstr "Ouvrez un problème" + +msgid "previous page" +msgstr "page précédente" + +msgid "Download this page" +msgstr "Téléchargez cette page" + +msgid "Theme by the" +msgstr "Thème par le" diff --git a/docs/_static/locales/hr/LC_MESSAGES/booktheme.mo b/docs/_static/locales/hr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..eca4a1a2842830f06bd5f6235bf01d07bdd313d2 GIT binary patch literal 1402 zcmZ9KJ!~9B6vu}+kmLvh)-Bbu!YZ&sL*)#Wq0oOW>)iY z#I7UJKoJQlD$3MIh{}~uqNJdrprN2bqC$d-|Jz;1r;K*?xAU?8_kVBZ_tmrCDzsP8 z*U*1Oe;xg+XYfKhe?}=h>H=QRffvE^;1%!!xCXugz6HJv4#8FMQ}7bV;EQ1F_z)DG zZ@?G8@4$=TWAG*L$BsXD^S^cDKS7E2FW3WDR@(nBfihkLMdxksC-6Fmt?DmO{`(sg z-~WN)YvpX4?<)8j#_OQu@i8cQeBP}`P-^oC6rIQ5W$*{^dGHvNe1GZqM>qcuD0MvZ zY`gv@DF5B)#v@RCe+FI!b5KeyIf$NkxPmU8B<^y9bfYDCNE01tQa`D+)KxSg*?1KH z%T4MpwK#{4ax`^Pw+`@7ELnZzY-Ae)KI#K+iZZI(?h9Kvos)Hu_nn*4eN*x2ba2UM z{M2MDO`uvAtTuBKA$>9&rK$>r--+ODxdTQVUeRy*EU zh&bB0JyN@EJkPZYCOUthcI(pE2XsrkjZ2=fYTmTp<}`LiQ88IPH-(M{K`cLrtve@i z+90*(xpAqpy(Aw}Q7~LGGJzF0;VkyI^8P*c0crzk0e zJ5}W`eCg#p>R8HV8p8`ORd-?8+@kgmPE(NjB4ZRZpsbXo1{+%JywM17c0!7$ZS zdp+04j?>}H5RL>u+?)6`B(!QC;nQ(E%YYHwOi5)9EgF2Tundr{ymsm2Z;f2mKh k(#nYgw(f}olqHrfw@Z7L48TfWxy6y8Q4`jSBkXa^hFIaGO(a}_Drr&ngPIpyPhwkKtCW1zS zxtWoenhB;xBBn-yn24D8zwTalu&Ao9Uv<5s{`Yli#|wdR9BT&a6V_?0r`xb$Ol}tf zQ|!UE3)}}zg45t0a0WaEo&}G9U2qD#3myOoJP3w{Pe6|I9NZ7S1owfj!NcI&h98>q z&yD>JoIl_+xD%H+@5zQ2!9%dS z4R3=dU_S)+f*T;`dD8G1$o{WD_Im?z{P&Ih5#&5yK-S?0$ohz#wGPuD`<((=a*oaa zSxfd~Z8_ffK#0nR_2t3u=fQPw4%YQ37D84vb8p87>(4#hjm4TkQX%F>m@;G}=B){2 zg2zWWayrd|Sg?;xZdD?U4b-=GDA#mOTgTo;H=zFxL#DkfRZ3zp(E*`1&83*aj(wjsI*=O>qg>UnQ5~j z=eV|BMg@s#m;L%pJ)5RENuwU=R0WMBhBiW7o#i}rlG4#5ZDUjRSa=`Plu#w%B`C$N z(;&2$llB909??3o&fn(z?J9F?WqD;KhDS6Yp*?cS)QjtnT^a+xb_X5}DL&Qs{# z?=7`&Y~6Fp_%(9vMKiF8HfcxR=o0auv z_q>s3y7KCU*_ODI6J+IW*=v!hp&aNkC~@B;F{`@wufgMIJ{Em)%}J(mRd82~uKPNE zu!45VT#b~I5H)6^M@|hh?PQ`$a((5ZmR_kKRwzf4qZ=wC=HgJvLU}~a#5@JmHKeM~ zcQ+dhueyjH6-vS(Hi{zy4lKXvX09`YYnog=urAe8uFQH2W~4-u2I{*$(n5sIJAG7C T@Rc+s5Lgrh10CRyRonjp5+F85 literal 0 HcmV?d00001 diff --git a/docs/_static/locales/id/LC_MESSAGES/booktheme.po b/docs/_static/locales/id/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..5db2ae1 --- /dev/null +++ b/docs/_static/locales/id/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: id\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "menyarankan edit" + +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Launch" +msgstr "Meluncurkan" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "open issue" +msgstr "masalah terbuka" + +msgid "Download notebook file" +msgstr "Unduh file notebook" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "halaman selanjutnya" + +msgid "repository" +msgstr "gudang" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "Contents" +msgstr "Isi" + +msgid "By" +msgstr "Oleh" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Fullscreen mode" +msgstr "Mode layar penuh" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download this page" +msgstr "Unduh halaman ini" + +msgid "Theme by the" +msgstr "Tema oleh" diff --git a/docs/_static/locales/it/LC_MESSAGES/booktheme.mo b/docs/_static/locales/it/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..53ba476edd2df2a802917e9df402257ceca1a130 GIT binary patch literal 1403 zcmZXSJ&aXF6vsyafhY1QYQiQS8W$5EU!j1vc?Gb$351Os-eM!oynD~ycVOPkWoGWm zTH9#}m5qrNiM6q@vN55xvLLatGO@6+(D*<1-gP%Hxii0e=Htvc|2Z#C?tf~~-bG(P z{{{Vh^sipSfOhD0WAK^77~TMnfQP_S;9+n9db5tC&9bmQINr7VD9+^sD7S+ zZ-HNfN5E&`3Gn-#Klk&$_V(|f-uE{+0Qc?d&L0KUUI5k4BKQM%1;keK2Z+!7i9yf* z1s(_g1vTGe`;B=I{0KY^u7H})r~P~cRhutC&HGzW&wmGM{6B(v?m2h{{0%$^{sW!` z4;<+7S_JjnwcfrBYTWn1Q(y(ER@tjRN(zMHIBUF`R@^(uqn+2D6ew@4L zg5J|zQb*pB(DY&Nai5y1VnoTv1fhfnT;$=ca`*|y1aBki?jP#?!}jLE+O4&f-Stc7 zFAjQPha1~9k0>L63$?T2m#CQ8m^hE`ZLAKj?(U1$r%jH-6<>r>d^Mu0Q^|un)>jR5 z9TALm*F@`vt0B(QhBFUgSr)TwUH`yMh9yxlG%Xix0~y&& z3LB-cB(8l-D%nxCMbU^4uPmkzD-_D^sYeYovZ|_hYt|6+raF6N+B(TUeM703ahwOj z!*UGfp34HuR+WV4?HsPL=1>m45R2fh*HNhPRL3xNJhx_&?Yu^?zAcKo|5pQ*LIIU4 z9%X=yZ5mFd5t*`cmL{7}b7xJ=^_*qP(gmDLw)@AXu2??D^RnquqSO=xr-aR>O-k3u a)*Q3l*@6-(xNK#4xqhOgLbT*tS;gN$Zm<*V0gr*F!6RT6JPeM4`#}XB0Byp@Am^!p`@mOV z7q|)@0zW4Fn)rVt_HU5uZGb6o$Bx$f{UF;tAm=#)eg-dtd%-^-*V_PDx7aDf37`|? zeoukD;5CqS=MqLB_wxkgxVgmt1?-0X4dj{qO1J@X+@W2qe$Rs(cQvs`6FUcTpOYZ# zd6M|6Adj4TU>#hW-}7v_@AidK;vhE9mlyZXi}UiVd9FvXkushE>ug^<53aoj8)J$8 zzT$crKWU3f+%VcIZ9^RVa^Sf|D{h)8T{2EVYGYN-m<~=w|xXST6$p^DKQdw8cB>C zxj87tTJ-|uo6xf+D2p+_=;?>@I%^v*stG0HugtZ28aJ+6Qc^pUp6gf-MYMWoTj~tg zX%+DUHR+isk=>R)j9gbir9vl=V(zQFO%D~)cU2G~TSm6(r@4MQuACYk8XnlX?>m1n zl?*mLUiMW+S_rt{mmE*`%Y4xZLS?ge#s||^w&DUuhxb&F9?*GH@U)weS8|?B-Ey=W zVXhhJO{GRkQQ(x)gC>{=GgAAp8D=l_%hoY_R?FV3>^s+=67+^$;pPAU literal 0 HcmV?d00001 diff --git a/docs/_static/locales/iw/LC_MESSAGES/booktheme.po b/docs/_static/locales/iw/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..32b017c --- /dev/null +++ b/docs/_static/locales/iw/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: iw\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "מציע לערוך" + +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Edit this page" +msgstr "ערוך דף זה" + +msgid "Launch" +msgstr "לְהַשִׁיק" + +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" + +msgid "open issue" +msgstr "בעיה פתוחה" + +msgid "Download notebook file" +msgstr "הורד קובץ מחברת" + +msgid "Toggle navigation" +msgstr "החלף ניווט" + +msgid "Source repository" +msgstr "מאגר המקורות" + +msgid "By the" +msgstr "דרך" + +msgid "next page" +msgstr "עמוד הבא" + +msgid "repository" +msgstr "מאגר" + +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "Contents" +msgstr "תוכן" + +msgid "By" +msgstr "על ידי" + +msgid "Copyright" +msgstr "זכויות יוצרים" + +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" + +msgid "Open an issue" +msgstr "פתח גיליון" + +msgid "previous page" +msgstr "עמוד קודם" + +msgid "Download this page" +msgstr "הורד דף זה" + +msgid "Theme by the" +msgstr "נושא מאת" diff --git a/docs/_static/locales/ja/LC_MESSAGES/booktheme.mo b/docs/_static/locales/ja/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..1cefd29ce3cc08792667a82dc7ff47e9843107be GIT binary patch literal 1471 zcma))U2GIp6vr=uT2=%temyktnh+I|RZ$+uHv1sbO-LX%QhlH9-p&qe?;Yo((zoth z!EFJNkCxzqu~zx0SU`c+ubA-Uv++eAe7Tv~_Q5w};+y|7GulOC;?11-%{lkn^L6K! z-gVOq>v2dQu6IDn_Xk)2*RIXZZv;v211Zik;1ak4q&&ao z_TO@S&AKd35BL)Hd%6F@2|fYNfYiq|km|n!QoJ8>{U?y}t$^hJJGcehbZ=(g z0h0bQNasgDiZ_<)lR3|UkHUThq>)oh@}pU9hR|%O@9u?E>>&uvmlpL;i{?kUXs#3! zA=v{Ey4&tWeb61=55ZW{`(?Yv@$jH7*egl~LIyrQ+;Pvb>jB%X-jWSv)wooF7*^^a zA8{ID)$FU#tBQXZgSz8$*Rlm0s5t>b|D{&KM#HaqLP$QUYJ%;x{D6mU%?d<~D+xW6 z)jE6Cg@Yxz75=BO|)yDPjO+O|NI0-c}~bwE^u;+|UZ4dMBS zR^nOyBIPfpnG5^&>>F6!-~QYSg?zBZp>bD~cz^<)cN>-?`+2o)dAX*25Q`IlO*w3@i^0SgZ zRp#5b_7~Xl$+OE7hnZ=9YND2D&Y9*#)@d&!S7*EK+UR$U{>JE*(KAMC6J0ZU+C;M^ z`q*e3JZ1ERi7p!bh0&j-o|DW(-_lp~<^OPPo;J+|qu);tEd58ke>rs)FR!$Zu=w!h z&Y7=QE_`G(9#lEWlJgUtTT#-!nao^I&VIs{Z!N}0r&&CGVrBLi!p9%ph)+&2{5I%2 zK7KuJEq2#CZ}bHdEv5a=V6`%k-R^d(Xw}Jf>8QN5e!h zBbA`3bkQ)WS=dVKSy@;~B<{I88!P_b+$$|{a=-hV^ZNe(@4NG5)%+^MSdZvHd_rtS zROaA?v3M?Hcvu@=3&Ew}VsJIs26lk!z^&jKFbl2%PlD~B0GES0VHu=655Q&M6L2Xw z0j>n66Mjh6KPU5VAnE-CQ{cRL@%?s?<{cpA*#_Ef2kG3A zWc>t4Ehi1?A9+}fAZZd{dqh6EFS_D$EB?$Vqvj_EszTqMS+R^&H z>|hBG*9E~2DXE3jK7P0*&#?=d9aa}*QCWE|l@|R-n>7qsZZHEJ ziA7vbTyRv7*q)W%4{Te&r9dUHqRxq&PWR-~XN2b?TZYH_Y0^)(lvBrgj&;rK@7cLK zl{7ZpS8_#$YZ%z&7A;41@?634e4(?a`?}KyX3lw*^v?<}-6eA>??^kt5A-`ab<~n} zfWBto^Y9)w_0g!> zVBythE}X>$!Q{z_su`ZeFjL;phL~syBFa zXVlaiX8iI$xBl9S?ljH#2qeqqHLg5*5Kc5=W8s^|_vRD}$A^$29KXrU!@=^_j5Dv6%;4cA#sHtggl>eA))${_687xQDk?6`Kc@OWFO}WOS!3uO( zjPOmFMc3|`Ymgi(M~_AsRb8*l6oj5N!k1G#oNSsg^a1i?<=NZRz?N8C9`e*ob%^~2 D6Q!<* literal 0 HcmV?d00001 diff --git a/docs/_static/locales/ko/LC_MESSAGES/booktheme.po b/docs/_static/locales/ko/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..69dd18f --- /dev/null +++ b/docs/_static/locales/ko/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "편집 제안" + +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Edit this page" +msgstr "이 페이지 편집" + +msgid "Launch" +msgstr "시작하다" + +msgid "Print to PDF" +msgstr "PDF로 인쇄" + +msgid "open issue" +msgstr "열린 문제" + +msgid "Download notebook file" +msgstr "노트북 파일 다운로드" + +msgid "Toggle navigation" +msgstr "탐색 전환" + +msgid "Source repository" +msgstr "소스 저장소" + +msgid "By the" +msgstr "에 의해" + +msgid "next page" +msgstr "다음 페이지" + +msgid "repository" +msgstr "저장소" + +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "Contents" +msgstr "내용" + +msgid "By" +msgstr "으로" + +msgid "Copyright" +msgstr "저작권" + +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" + +msgid "Open an issue" +msgstr "이슈 열기" + +msgid "previous page" +msgstr "이전 페이지" + +msgid "Download this page" +msgstr "이 페이지 다운로드" + +msgid "Theme by the" +msgstr "테마별" diff --git a/docs/_static/locales/lt/LC_MESSAGES/booktheme.mo b/docs/_static/locales/lt/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..4468ba04bc134a84fea5e3c973461cf02c9c2da3 GIT binary patch literal 1413 zcmZvaJ*-qk6vsyag_RElKVp1=p+SgQ1!6(=Ws8Trm%IpJ!!Cq&-rn=>&feLX$$UJx zy>yfs3mYDtv7j(9R@&?)#@fol&{Y(AbXL(_rUwj`9qL(er@8vgIw=pko$cKo&XOVSm=ES z^8O^qK3oL({z?6$1#4Nz2(054oJ;=;JiGzE*_kpy=GszcBB+< zVRAov2m8<3><4U^|G(mLjYp;ti7%W@WK+ZsUk6=|lDOjTSmRV7txL4wTqQTPq1|wF zISlEQU>fNty(&qp7CIsI&UP&u6NiDw%84sTTvaj2>KHSL zUeFdvoa|j$6a9r=An&41F4Us$N7~+%m$|mVh$bZFtK3-hG;n2UNLsa}OO-T4EZt3u z>KyAVM0}tv?Q&E0p7b%7C80_}Cn&{@X_(sUMf(ENwtj7O_x!@A z=Ua`j?LqCSBNGbv%p0ZcvK)?7h?KfF2W#z1yZ3^!ag#!O)ec>uZP}5RHgsxTRkqCV zwIfYx^-K=RwAWmi#E!InzKz|B%X0Cvd)CU+U3uZ$a!agNntg;f8E)25tYny{XFsAC z9jD(SkfM$V#H6LA*|v6LHF0AnD>v~vCkoohO{LBB-b;69+sY(u|L3sMiR5g1`bhd5 zjq=k+;szC}%nlMS$9vjXC#gc)P6nF&q9-bfo{CjQZe*xbNYi^#C9ConpM%1oLFKH0 za&)0WJ=gQWZ5W!M$i7!O!aIl|0e?HQ2Ro%kmCL#^O7u6its3{(8W!QLNCjg(=>2Jsvw ClWZvf literal 0 HcmV?d00001 diff --git a/docs/_static/locales/lt/LC_MESSAGES/booktheme.po b/docs/_static/locales/lt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..9f03775 --- /dev/null +++ b/docs/_static/locales/lt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "pasiūlyti redaguoti" + +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" + +msgid "Launch" +msgstr "Paleiskite" + +msgid "Print to PDF" +msgstr "Spausdinti į PDF" + +msgid "open issue" +msgstr "atviras klausimas" + +msgid "Download notebook file" +msgstr "Atsisiųsti nešiojamojo kompiuterio failą" + +msgid "Toggle navigation" +msgstr "Perjungti naršymą" + +msgid "Source repository" +msgstr "Šaltinio saugykla" + +msgid "By the" +msgstr "Prie" + +msgid "next page" +msgstr "Kitas puslapis" + +msgid "repository" +msgstr "saugykla" + +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "Contents" +msgstr "Turinys" + +msgid "By" +msgstr "Iki" + +msgid "Copyright" +msgstr "Autorių teisės" + +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" + +msgid "Open an issue" +msgstr "Atidarykite problemą" + +msgid "previous page" +msgstr "Ankstesnis puslapis" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" + +msgid "Theme by the" +msgstr "Tema" diff --git a/docs/_static/locales/lv/LC_MESSAGES/booktheme.mo b/docs/_static/locales/lv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..74aa4d8985d96a07c4c9be96f006f3b58d884342 GIT binary patch literal 1404 zcmZ9K&5ImG7{*_dsL7ZQP5eMvump*E7&XB|oMjFhcNYS?IAk~8Yi8c*sqUVtras2( zdKwT<9)#7Cr{GC*^B|r)^?-kXCk3y9;7t%O;`2^-vdb1-{p+f(exK)k=-;oN`-(7L z!d%1r1@l$R&!4~zPs;uHG2 zUH=1$um8Z;!As|eUIA~m+y%w|6qJ5G0bd5c0G|fGYu|qlzJT=-lzP8`lHs4A_&D=q zlgkxQ>Rkt~f$z861tmufO5Zssk;}JoUbN-BWGj829FU-AF-2E~^e;o|NY;|8ctc5g z22*^U9FmJ@OFxKVl@HxMz@_4p=>umY+Zgar9e9&XBW=2mZRzw_Sr>WeT%jhWmHkCxl1EW^k%TQzfIrX3xkO4V3L9xG?DPIfe<4=WtdR+$hI z)4&^xB2Eo9w`s4@^IW-LqVor|S51w*uWpOC{VC6wR(CaQdfIncRMGG) zBv*eURUdB+Oli45Wvi9v9Ia6vne84ZIht?0o$f< A2mk;8 literal 0 HcmV?d00001 diff --git a/docs/_static/locales/lv/LC_MESSAGES/booktheme.po b/docs/_static/locales/lv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..c9633b5 --- /dev/null +++ b/docs/_static/locales/lv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: lv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "ieteikt rediģēt" + +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Edit this page" +msgstr "Rediģēt šo lapu" + +msgid "Launch" +msgstr "Uzsākt" + +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" + +msgid "open issue" +msgstr "atklāts jautājums" + +msgid "Download notebook file" +msgstr "Lejupielādēt piezīmju grāmatiņu" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "Source repository" +msgstr "Avota krātuve" + +msgid "By the" +msgstr "Ar" + +msgid "next page" +msgstr "nākamā lapaspuse" + +msgid "repository" +msgstr "krātuve" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "Contents" +msgstr "Saturs" + +msgid "By" +msgstr "Autors" + +msgid "Copyright" +msgstr "Autortiesības" + +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" + +msgid "Open an issue" +msgstr "Atveriet problēmu" + +msgid "previous page" +msgstr "iepriekšējā lapa" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" + +msgid "Theme by the" +msgstr "Autora tēma" diff --git a/docs/_static/locales/ml/LC_MESSAGES/booktheme.mo b/docs/_static/locales/ml/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..2736e8fcf6f9e923c2403307f0b366086d37b335 GIT binary patch literal 1883 zcmbW0%ZnUE9LGydG>*^22ObnFl0!U=*`!Gj=35eWDu@Vn6%SYIC#v~L=<+PV8oUUd{}t%`e}*gYclZSS_^!ZZxSjb`_!_(p zTd=uFh;ewl;wqeG{x{qKTbqR#gE5?hpTno&U(oq&;Si6(7JLc50p0#-xD$R4pMlrl zez^G_At=eHx!OEj&F+K95`^|`3%xs|tB0$dYp$lQaXj&eABB3jp*ug}eRDN&btbLg zC_?O6*AzH~{-A|&9)JdV{ljJRVAnvQRl4{_?&D7b7KD1k z&HJ`jzT)e&M4gbqlB?mhqaXMpAZg<;-hlh5ZiX1=e36nUswzgb&SN${bnp4Gv=IQ6$P05hgaiFop^2w W+5FkQ^s?wV7=JSkIl3Km4aE({iDO&< literal 0 HcmV?d00001 diff --git a/docs/_static/locales/ml/LC_MESSAGES/booktheme.po b/docs/_static/locales/ml/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..9a6a41e --- /dev/null +++ b/docs/_static/locales/ml/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ml\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" + +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" + +msgid "Launch" +msgstr "സമാരംഭിക്കുക" + +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" + +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" + +msgid "Download notebook file" +msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" + +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" + +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" + +msgid "By the" +msgstr "എഴുതിയത്" + +msgid "next page" +msgstr "അടുത്ത പേജ്" + +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "By" +msgstr "എഴുതിയത്" + +msgid "Copyright" +msgstr "പകർപ്പവകാശം" + +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" + +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" + +msgid "Theme by the" +msgstr "പ്രമേയം" diff --git a/docs/_static/locales/mr/LC_MESSAGES/booktheme.mo b/docs/_static/locales/mr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..fe530100d7715cdc19a6f9db33a971665835f3c4 GIT binary patch literal 1674 zcma))-D_M$7>7rVU#qnriYO?KB2uYGt)hetL1>ylCBZ;a@uD{;yVJ8rH#3KG&bG~6 zRisua;ze5NO^wW!;71IF+EldSwKo+61wrPsjrLTQ<5nO9X$iPPmDi?R5_3f- z*T>{OU(0+)Eh-V7av_#JZ?debq)w0ISz70aXmzZP)flf6MT$}#$xUxiX4T6wMQMt1 z(Km0ZR-GJZC$ForB1Kb1(Zq`;L9Q`#U}kc-zxUba8xuy?O4rH!QlXl%M)kR(o922< zwmNB9se1h2{8TbJJXfZ=I;_fMQnySy*I84JF64D%I@MVZ^O|z8Y|M6hW!g=qOu1M! zr7ps>8h>F-#@F%PT0TB5_dY$=5YC=={Zr0fboPp~>pX9~wCwsPo&DVPkH=Hao^bXY zXIEYSL*AVI()HhVc3C?6MacEOvlp1GgbA^$%){9gR+l%mHiEnj&-JixH&Y;SGbt{+ z{t03z?p+g;%KlU0jXnJ;6hm+E zO4d<`2T4o{Hn?Oyg$)#jm)Q^UYaHJCp>S-t$!CBi7ej)}A>Wy>@(p%y@Lc$O&cyp1 zdP#?v^I4GaH+|g|B8k!Ldl%Wfwrg(}`)i>kl#a*D@zz$^*>a1%2AcIZ5x;fu4@Sqm A6951J literal 0 HcmV?d00001 diff --git a/docs/_static/locales/mr/LC_MESSAGES/booktheme.po b/docs/_static/locales/mr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..ef72d8c --- /dev/null +++ b/docs/_static/locales/mr/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "संपादन सुचवा" + +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" + +msgid "Launch" +msgstr "लाँच करा" + +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" + +msgid "open issue" +msgstr "खुला मुद्दा" + +msgid "Download notebook file" +msgstr "नोटबुक फाईल डाउनलोड करा" + +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" + +msgid "Source repository" +msgstr "स्त्रोत भांडार" + +msgid "By the" +msgstr "द्वारा" + +msgid "next page" +msgstr "पुढील पृष्ठ" + +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "By" +msgstr "द्वारा" + +msgid "Copyright" +msgstr "कॉपीराइट" + +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" + +msgid "previous page" +msgstr "मागील पान" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" + +msgid "Theme by the" +msgstr "द्वारा थीम" diff --git a/docs/_static/locales/ms/LC_MESSAGES/booktheme.mo b/docs/_static/locales/ms/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..f02603fa2522a40060bd3f1b5d65052c77530de6 GIT binary patch literal 1213 zcmZXRJ8Km|6vs!6uj@1M0TG1}Eworov@58TBL2_ajS)TU%x`DrywA6>k!K8Y7V9F`8>~xM5BFh% zd;s@@AHhT5C-5lv6+91q2g&v)I0lYF`6PH1JO$nc$*v2Y0Pldu!3W?dC>w4z_m7+N zHb`+^fGzM9NcL|*vVRZ02ETwK;L`&&w?VSo0ms4TAm#b4;b-tP&Og8l;4hH$$Kizh zUTHW1Qhptf^p`=>djwK_>)<(X03HLMfK>lZ^ZpV{}g%EROCaZxzWLzM_G6K*tH6hX%sTdt($LUZL@kZi>& z4I{%>X6M;z?cd7EIOUBUu+=J4dW+9cF1<{ak_~s>uT$@tG%Y08Vne0ED+JMU%h%Z$ zic<%vtlUs0G-K1wUB*6INTU1FI=E=_I%q^eqhYw#(!$c*-uvW@iB{KW zFSU<)gG#o!N7S2DA(WoxaVD&jzH_fPA5HD)S)tvUw9%Z7O`>$#=2Ly;TZ=-c0nKak z(zRBKU_}wl8(X?I*VXXoI=7~I{oA>w`Q;9uyguDx%Y{TQY0E^;V^w*;2yki7=)(TYV{?8_pQ^c*8Iog%4v$iD&q$RjNP literal 0 HcmV?d00001 diff --git a/docs/_static/locales/ms/LC_MESSAGES/booktheme.po b/docs/_static/locales/ms/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..e29cbe2 --- /dev/null +++ b/docs/_static/locales/ms/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ms\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "cadangkan edit" + +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Launch" +msgstr "Lancarkan" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "open issue" +msgstr "isu terbuka" + +msgid "Download notebook file" +msgstr "Muat turun fail buku nota" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "By the" +msgstr "Oleh" + +msgid "next page" +msgstr "muka surat seterusnya" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "By" +msgstr "Oleh" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "Download this page" +msgstr "Muat turun halaman ini" + +msgid "Theme by the" +msgstr "Tema oleh" diff --git a/docs/_static/locales/nl/LC_MESSAGES/booktheme.mo b/docs/_static/locales/nl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..e59e7ecb308a7648cd23aa6342a9ad98a61d0009 GIT binary patch literal 1356 zcmZXTJ5Los6vqcag)1TtUj+$cqf)Gju^^CJh(JODkqBZvyL;~La`(<`W@dTSmfC47 z`~-XfW8nv|v9q$Ewb8~-3*-OXUAP1%JNw%?Gxz+@WA4%Tz*~WF19KAdE9MmDt3JFi z2G0qBM-1V00UQPg!3l5(oCL3fx52Am6C4Mhfg>P+S3qC$CCGl>fS1Ad;4pXyj)5O) zey;7`>h*V!^?rj5u)n|h{RqhGNs#^A0Y8F|zya_lcoF;svhE*{ng4G|2HU zfE@n|kmKI2*9Rc$zXmzZceVWx9L4%m%`YJ5bp-OcA0YetTieIZSNl^S#~pwZ;4H`` z=N$Mv$HI25E$f~haMji1Jb17l9<0YPv;H+qxD=N#xwoeW*MWP;bwN40{S^!Qc%)BB zJTcmn_6{G#zRi--xzS!`5#mI~uCZ|uI< zDAG*t$pwyWGo=oR?puacPMao4a*|r@WQp<_L^SRBDmueDl}KS}Co^Ro_9^$SOcFwr zgiH{M*`~+`D{-(z*1_AHtn>rc54y^YwUxD{-u}$J2aUS0!RCHJbJ8P#`$euYJujnF zSx3J4d~-RN?VYnqyB67CNk=BmbTTJr!^}5Ul}<|3bx!KMv7VP!<-xMC9S1|vUApGO zd0Bln?`nCgDQBkV8|as@-IqkwS9EI1Sg6udX`Q7gMb~>RJ??afw3Uu~8!34iTBHBl zi0Od1qM24Aq+POY$n;EGCeKm6M7k&?+d-F=M@18=IxkHDla2^|PO9GX1u3ivbE1xT z+=^}4Zo{ONva*On--8-OUjI=r94V1Y}`N=IHv19Ut jbWAeLReX?b<52fDoT%;?`~gm~I(s23S;SN2irW1H>^?=m literal 0 HcmV?d00001 diff --git a/docs/_static/locales/nl/LC_MESSAGES/booktheme.po b/docs/_static/locales/nl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..e4844d7 --- /dev/null +++ b/docs/_static/locales/nl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "suggereren bewerken" + +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Edit this page" +msgstr "bewerk deze pagina" + +msgid "Launch" +msgstr "Lancering" + +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" + +msgid "open issue" +msgstr "open probleem" + +msgid "Download notebook file" +msgstr "Download notebookbestand" + +msgid "Toggle navigation" +msgstr "Schakel navigatie" + +msgid "Source repository" +msgstr "Bronopslagplaats" + +msgid "By the" +msgstr "Door de" + +msgid "next page" +msgstr "volgende bladzijde" + +msgid "repository" +msgstr "repository" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "Contents" +msgstr "Inhoud" + +msgid "By" +msgstr "Door" + +msgid "Copyright" +msgstr "auteursrechten" + +msgid "Fullscreen mode" +msgstr "Volledig scherm" + +msgid "Open an issue" +msgstr "Open een probleem" + +msgid "previous page" +msgstr "vorige pagina" + +msgid "Download this page" +msgstr "Download deze pagina" + +msgid "Theme by the" +msgstr "Thema door de" diff --git a/docs/_static/locales/no/LC_MESSAGES/booktheme.mo b/docs/_static/locales/no/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..6cd15c88de675226c00ca4d0430171075e5559ff GIT binary patch literal 1317 zcmZ9KJ#5r46vxeXdz6pzxm3a|d<+2!3{|TeDD*@{E2`eX#NxZWChjG6WIIQ@F#r=I zh=CaiW+cQ+7sSlefekSsA;E&g!2exRwZe-1i=UnMe;@gJZ0`$!aT;?1^9$w~%xAl> zV2tb*0*@HQvL74+N5JFYC^!M00?&abz$SPMTm}z=1ReoH&Bq}7c@7=|Ux8!bTW}nF zU-MIK->moFLDu^NHo!f5s_zejyq^Hs&w20zcpb!5@dLyoequQQ{ss?%e?g9WWG`|7 z&ww2NwR(RWJc|7Tkn_pGec+?o{vnrOx2I^Ydmn%A>ZL_zf>(PJ4kZLarm5`W=b%5)w zZL7>O-*ZGp<~Am=pnQ;J5vxG4v+R9LTr zb?c&Cq}r^>S&prfQchyH%5IfY$0kWe(x`z>RL~GHv=*x9EbCMvg`Y>jh2AfB-HRnbKxP z_EP0Mh336ZE1KHA=alg)i!%*zV<7HREar_#Z59h#6sa0`M0_gBf~5&B$u(bn(=RqnJ4d{?xCazSi7Dd36F5NEp? z<)YnpdLTAmS7{(1PP{Mcl94asi9}+1PF;uA{A!sWqQCgLP1e#J@rEvuCjIeG)u_ z_zHL&oC3+mBarlB@FchjQl1we?OzAU{{~3=--1+!&*l7gkoNrokAjC_hW4EWNq-dF z2i^p!UUxt$Ipw67YDs=blg_=fL9(w&^`%C>sF5z^AYYUllKnH&-R^8uf4W1;k81~m7!h)9ylfZ~^CgwY?O|s!8_53#eN#D}ib%4l zPdl`G0* zrR^Q^E{h@wml7v|6|*b@U!4i752bZbtMMX#mGW2nnJcq1vs2siW24t9Wnrs}c`9q% z!@$)v5lT<+ped}AzW!iwx;nnS&I;|8q^(Zrz=TRiH9p=@zH(RSC_`OqJWVR|NoGY- zoi?`RYFwxN(ABR`V3KC)moz_L=VO;ADlp!Wow9!{+QNF%d)$vmWXUlwR2&%HTrgJW19E;7l zzACcDJ`;)Rh+tW;2Q~|urlsI%&bL2qk_T%ViEOb+o5j!ziwCfPoA2cCtFji~wj$ZA z@p+raPIaI5KE$fLmvXo`p>N|Ts6=nA`!wj_O|+>xW d^Crc{P^+yKEfI-Mu31OGXlgVp$}sP%{Q=l!SrY&N literal 0 HcmV?d00001 diff --git a/docs/_static/locales/pl/LC_MESSAGES/booktheme.po b/docs/_static/locales/pl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..fcac51d --- /dev/null +++ b/docs/_static/locales/pl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "zaproponuj edycję" + +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Edit this page" +msgstr "Edytuj tę strone" + +msgid "Launch" +msgstr "Uruchomić" + +msgid "Print to PDF" +msgstr "Drukuj do PDF" + +msgid "open issue" +msgstr "otwarty problem" + +msgid "Download notebook file" +msgstr "Pobierz plik notatnika" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "Source repository" +msgstr "Repozytorium źródłowe" + +msgid "By the" +msgstr "Przez" + +msgid "next page" +msgstr "Następna strona" + +msgid "repository" +msgstr "magazyn" + +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "Contents" +msgstr "Zawartość" + +msgid "By" +msgstr "Przez" + +msgid "Copyright" +msgstr "prawa autorskie" + +msgid "Fullscreen mode" +msgstr "Pełny ekran" + +msgid "Open an issue" +msgstr "Otwórz problem" + +msgid "previous page" +msgstr "Poprzednia strona" + +msgid "Download this page" +msgstr "Pobierz tę stronę" + +msgid "Theme by the" +msgstr "Motyw autorstwa" diff --git a/docs/_static/locales/pt/LC_MESSAGES/booktheme.mo b/docs/_static/locales/pt/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..d0ddb8728e1d5ef72dddc1537f66aa32251a83c8 GIT binary patch literal 1364 zcmZ9KJ!lj`6vsyszs~RYi3A)AKVkhsL@peXm>dKW4Dqy|yM5Uk-JMxyXV09qrC4bb zE3pu<6hyS##>&dd!p6cz!N$T$|8I9gLWZ0D-MpQB@BjWY-^NCt35+9{h16S(zZ$SR;BglC^gY3_DkUjkg^8V2+RlY+YuTO%k z_iDYq0kY*B<9wX!0496Oy4Me+EOW5GJh*=z>>q1pUk_m-WvQ8UtRL(@Yuttj8%m$V z)DS=E`y_5yrAF9A~6$c zkJPKnb{@xB&k-4!*pS4W%Dl|ePxSZ1+Sg`TPO-L5pAr(~Q+BJKIyQ=8l12@5q`XEEL(9HWXSq&QBy}{>iJ+c4DOK2kgX}J`T^Gu%F2!T+4-5Z_m|FJY}CdEoncB%=^@}k z8Y^ukWUsGWM!t2s(+;k!?Q_axOXPwX)3c#AQBz*)YTuYsCd%P!Q>MPL5a&+CLEE|{ zYf6)r%dB;ILRNoUXN)}2l9$d-G{iJ)q}Wy`Tzm+v2(=>^C{+#@RV=2IURF*jcR$wy zD??aTpZLaCOMFYpAW1l*WLmt4v{B_@b0}L2&D+qT-&mnh(n=I7vDb-`%I7N94^{E1 zcxfdiIC)dNQVDLK6_Z`3WS+>>*=|gU60=F_bfO(LmX~0$I{o6U(^gh;I@l*sE7k*N z>oXB$Fttuh#-5x(d)$^9P*fEbsVm+tv!2x!?&s);C8;hsuS6ZkWkdpvO!dtuOAFi$ LL?J8GWh3H0!r)O_ literal 0 HcmV?d00001 diff --git a/docs/_static/locales/pt/LC_MESSAGES/booktheme.po b/docs/_static/locales/pt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..1761db0 --- /dev/null +++ b/docs/_static/locales/pt/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "sugerir edição" + +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Edit this page" +msgstr "Edite essa página" + +msgid "Launch" +msgstr "Lançamento" + +msgid "Print to PDF" +msgstr "Imprimir em PDF" + +msgid "open issue" +msgstr "questão aberta" + +msgid "Download notebook file" +msgstr "Baixar arquivo de notebook" + +msgid "Toggle navigation" +msgstr "Alternar de navegação" + +msgid "Source repository" +msgstr "Repositório fonte" + +msgid "By the" +msgstr "Pelo" + +msgid "next page" +msgstr "próxima página" + +msgid "repository" +msgstr "repositório" + +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "Contents" +msgstr "Conteúdo" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "direito autoral" + +msgid "Fullscreen mode" +msgstr "Modo tela cheia" + +msgid "Open an issue" +msgstr "Abra um problema" + +msgid "previous page" +msgstr "página anterior" + +msgid "Download this page" +msgstr "Baixe esta página" + +msgid "Theme by the" +msgstr "Tema por" diff --git a/docs/_static/locales/ro/LC_MESSAGES/booktheme.mo b/docs/_static/locales/ro/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..3c36ab1df7c589ad82614599b8c91f072a25d4a6 GIT binary patch literal 1390 zcmZ{jxo;Ce6vhX_5zG}5ZUr$kT#~s&fgHI>97~Z1L||yB#=9@;f%VL44!~(cNeM!T zzkmW7Bt%b&NVHTGv{Xn`NHmD=truc}813$F=kWX9`}X8CsJNO-Bou44rIk82E zW8ekwD0mG#0%~vyTm=t+&p?jz3S_U|fL!MXkn8*mPJmxQ*7*st&Nlprc^KsLXDc>A z&U>kv-vQZju7S_7m#oj;a^0f?p-U~+<-u`yunv38zH-h8DR$!Kd`AcS&)<;qgbk%n zVs?N_h8~GIYXX_z@lp(&&U!(#>;scql}cj+b*;T8mvv4X%iczp&|iz8r@bsxMq)nI z0il0S+cD35;)smw+mysr<%5hxssg3b8qA|fdg6M41IkG4eI&8uv_TLnms)LcbExO2 zuwDo22I6MX)8?U^<=i?w>XRs+vOBD)W3wzLY1Dn4sh}ZZ=wTRUXIW<`QaHM=ZLHEB z3GZW;5wavyf>i8XN#8^5U79nrN}tCR1WA7O>Nc7D^1!X_=B#5k}&OPu5mlqSjw% ze9!ggnq18PeE0wD`{?}IYPqW%0!Wn*zA9eO0NP-Sd!P*Z&(5Mvp+E_$mG57h;3yNf z@}T<)Q9@L?UQv!@t~hzGN|ByUi8HjaaJHLM9|{Y76xA;^5T@*t78+y)y;r5zA;cW% z6j3gq1Ltf%1{N7Mh$B&^tz>kF94xj(C8Xe$PteOytPUysU!2AvEWuE6Fj7Z>o*_qS K1txIYaExD}s9q8P literal 0 HcmV?d00001 diff --git a/docs/_static/locales/ro/LC_MESSAGES/booktheme.po b/docs/_static/locales/ro/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..db865c8 --- /dev/null +++ b/docs/_static/locales/ro/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ro\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "sugerează editare" + +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Edit this page" +msgstr "Editați această pagină" + +msgid "Launch" +msgstr "Lansa" + +msgid "Print to PDF" +msgstr "Imprimați în PDF" + +msgid "open issue" +msgstr "problema deschisă" + +msgid "Download notebook file" +msgstr "Descărcați fișierul notebook" + +msgid "Toggle navigation" +msgstr "Comutare navigare" + +msgid "Source repository" +msgstr "Depozit sursă" + +msgid "By the" +msgstr "Langa" + +msgid "next page" +msgstr "pagina următoare" + +msgid "repository" +msgstr "repertoriu" + +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "Contents" +msgstr "Cuprins" + +msgid "By" +msgstr "De" + +msgid "Copyright" +msgstr "Drepturi de autor" + +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" + +msgid "Open an issue" +msgstr "Deschideți o problemă" + +msgid "previous page" +msgstr "pagina anterioară" + +msgid "Download this page" +msgstr "Descarcă această pagină" + +msgid "Theme by the" +msgstr "Tema de" diff --git a/docs/_static/locales/ru/LC_MESSAGES/booktheme.mo b/docs/_static/locales/ru/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..6b8ca41f36ebf869818399a9584cdb15619bea78 GIT binary patch literal 1722 zcmZ{iPiz!b9LJx6N>>C0{~WCHj6uL;MNkv6buUP3NFY{Oy-#-^yQABg$;>R!8?=By zpk6eZkcjo>ZEd^jw#)9`jK?>LiHQeq#*-Is-2D7zrnWZnvTr^!zxmDY_x*j}{=RSL zmx}cqdz}3X`vCjaLtI$99#)E<8sqXP+zofZ{csG9!)M_u@M&0v```y~4>WKujB{Rv zQs)c!1iS-x!|&l!u$%MeJpNn${3n!t_hA9<*pYp|2g>s}lsboC555U^!oQ&C`x}bB zF@i6^7vWp*ZFm@l@KtyR9)~}{gYZ5)1P?rt)qfX0&vOMzodC-FMW|sH%3Qy~Bk&LS zGTh71lK%!g2;Ya|(?xg`eg?&InL*;Bbw69Q%iLQRlGKxI@mH42FH8IruciMpY+9?w z*>bj97p>AWd<Owguyc8|lEQ8#P&TV@hv4PPLlNs2UpM=~=&K)EOs=bt|Yjv8id_3$EYFWp61Twd!?)O2Z^b@jo`zxOlo&{K$k6 z)k-?+UzGmEv~%I?>9doY?~lFqdLcKqSeXk!s4V?^=qzIFXM1NyDcB~ z^h;%Z?8rnx*}Ha_UXm-xW!tfr6}wJC zN81q@gr(9Fv3Bw)dp^0PldHtnY+u_Sxf$6W-wgO>O_L_|y0EwXD@jYPrM(BqO_Ddt zDEk#lk9`p%b*uDr%Zu6PU zG_bh>@urJlTp^1w`f2$AR}2{1AJVy&({OH-XdNXBVw1Appn{Ug&D59FU~!E~qO?uY z2%}Tqa+P*D{a@R!x0@kSMzqWv;2@B-rtEiw@7eZ-vn#fz?Gn!QP_`~@{!JJr^D>2; zYX|@P$s&z$lLI4H4zg!gP;s5$q8v^-E0ZiHHwb^e&1~CN%&|G1oY;Q{yqk7fcCfJk literal 0 HcmV?d00001 diff --git a/docs/_static/locales/ru/LC_MESSAGES/booktheme.po b/docs/_static/locales/ru/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..84ab6eb --- /dev/null +++ b/docs/_static/locales/ru/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "предложить редактировать" + +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Edit this page" +msgstr "Редактировать эту страницу" + +msgid "Launch" +msgstr "Запуск" + +msgid "Print to PDF" +msgstr "Распечатать в PDF" + +msgid "open issue" +msgstr "открытый вопрос" + +msgid "Download notebook file" +msgstr "Скачать файл записной книжки" + +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "Source repository" +msgstr "Исходный репозиторий" + +msgid "By the" +msgstr "Посредством" + +msgid "next page" +msgstr "Следующая страница" + +msgid "repository" +msgstr "хранилище" + +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "Contents" +msgstr "Содержание" + +msgid "By" +msgstr "По" + +msgid "Copyright" +msgstr "авторское право" + +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +msgid "Open an issue" +msgstr "Открыть вопрос" + +msgid "previous page" +msgstr "Предыдущая страница" + +msgid "Download this page" +msgstr "Загрузите эту страницу" + +msgid "Theme by the" +msgstr "Тема от" diff --git a/docs/_static/locales/sk/LC_MESSAGES/booktheme.mo b/docs/_static/locales/sk/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..59bd0ddfa341477cf5ccfdc88f4c3e6127046f7a GIT binary patch literal 1393 zcmZ9KKWrRD6vijSKyrit=ARHoJeoj?1A-``v#uc6mLesxmAg<-Am(Iw==v>7a08THd<;rm`=IpY4k&eh2g>u`gW~ryD0Tk|O5J~fa_(Nc zzXDUK|0PiBy9|o{Iw-jZpgi{xC@mLFS&OFRlMGV#=>h3w2I;R1(UBqg;w6239ut!4 z2~6=jJ)|#^@o`MFWBGp7wHbaCb5`#=8`;KyKjqAuERSl#ePRozQ?f4d$hk4?nu1TZ zgR6YP4{gTW1S)mLYBMzv(*G~Fs-g&qXSOtPDXSYgM5@YEM^4FEtSg)3YP-Y%ZOMdC zvD)#*Ld4O|#+Dj1ex6GgOmu#x24!ySK3$V+!<;9qmRA}zH4R;s6--u7O{SxPiRJy+ zq;ulan3SHU##L?XQ}Ut8GDb>9C5YnoIEmfsY4-#60ct&J{JY}cT{?GeUcb3{a{tPk zZ+F_pc89Z)dlV7it+LR@u2Yh0A2{}J54XBkPtJL5!!G;orcGRGY}TWzBNIC}w9P8? zwMSvx*(oZoi|&^5lh7kuE|;PI&N?-J`)^o!txs1juXogY6?)ZEJ1#xCtJU@>=)Bnr zU1l0t--9arjh>CyA! zZ|R}^TYP-iOeo=k_sEUBK5*0V4ADZtsjcUv$Fb6dIjHA}(Ucy4hGb%cXdqT-thpkjw8w z94mEnM;EAFODWoF<;0UM`ZS%T+8S2)Skfe~=jnmos~5@rll9m4U7_dmM!H@|Co1(H Di}h+h literal 0 HcmV?d00001 diff --git a/docs/_static/locales/sk/LC_MESSAGES/booktheme.po b/docs/_static/locales/sk/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..e44878b --- /dev/null +++ b/docs/_static/locales/sk/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sk\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "navrhnúť úpravu" + +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Edit this page" +msgstr "Upraviť túto stránku" + +msgid "Launch" +msgstr "Spustiť" + +msgid "Print to PDF" +msgstr "Tlač do PDF" + +msgid "open issue" +msgstr "otvorené vydanie" + +msgid "Download notebook file" +msgstr "Stiahnite si zošit" + +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "Source repository" +msgstr "Zdrojové úložisko" + +msgid "By the" +msgstr "Podľa" + +msgid "next page" +msgstr "ďalšia strana" + +msgid "repository" +msgstr "Úložisko" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "Contents" +msgstr "Obsah" + +msgid "By" +msgstr "Autor:" + +msgid "Copyright" +msgstr "Autorské práva" + +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" + +msgid "Open an issue" +msgstr "Otvorte problém" + +msgid "previous page" +msgstr "predchádzajúca strana" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" + +msgid "Theme by the" +msgstr "Téma od" diff --git a/docs/_static/locales/sl/LC_MESSAGES/booktheme.mo b/docs/_static/locales/sl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..87bf26de683cb18c73bd23c2b4c57ef6a02545ec GIT binary patch literal 1374 zcmZ9KyKfXR5XQ}$9PjWFC=#aOAvj*5h%UN@MVlwf1j4YtMW$vtK7Sz7QA(F{dy;VIIMJx(*A* z*7ZW*5ffN8gWJKa;9hV7oB|Jk$H0AH8=M61fIC3~cY(3y6OjEp2X}z4!0q5`a1Z#l z=EvIprQUx7Io@xu0dCk(-QNlFehOqi$H8~tMQ{`NqvlU=3--Uk-Qc>7LL34o!NcHb zkab@J`TGNq^T|Ly_ZVc|FG1Eh0$KkXa4+~CYpSj^k88a!&*8idy!V z`%t7QK_wv*NO67Y#^!v|yiY#BTT52)n;gGcMsD1kzd5`1{rs78jk>VS#g&{|GD5)F z+$e2lWVfe$pxC~*IM2jgT5~@lP4MDpz zCx-(XW@_w<9uAzh?%#>APv}sH5H9X{E*5diD#H~rZm5EBHe?#D`0z|yaZ3$VV*3d1 zf=gV-^ojji64%jMWljW5^x#&@4 literal 0 HcmV?d00001 diff --git a/docs/_static/locales/sl/LC_MESSAGES/booktheme.po b/docs/_static/locales/sl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..228939b --- /dev/null +++ b/docs/_static/locales/sl/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "predlagajte urejanje" + +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Edit this page" +msgstr "Uredite to stran" + +msgid "Launch" +msgstr "Kosilo" + +msgid "Print to PDF" +msgstr "Natisni v PDF" + +msgid "open issue" +msgstr "odprto vprašanje" + +msgid "Download notebook file" +msgstr "Prenesite datoteko zvezka" + +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "Source repository" +msgstr "Izvorno skladišče" + +msgid "By the" +msgstr "Avtor" + +msgid "next page" +msgstr "Naslednja stran" + +msgid "repository" +msgstr "odlagališče" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "Contents" +msgstr "Vsebina" + +msgid "By" +msgstr "Avtor" + +msgid "Copyright" +msgstr "avtorske pravice" + +msgid "Fullscreen mode" +msgstr "Celozaslonski način" + +msgid "Open an issue" +msgstr "Odprite številko" + +msgid "previous page" +msgstr "Prejšnja stran" + +msgid "Download this page" +msgstr "Prenesite to stran" + +msgid "Theme by the" +msgstr "Tema avtorja" diff --git a/docs/_static/locales/sr/LC_MESSAGES/booktheme.mo b/docs/_static/locales/sr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..ec740f4852f3973fa72ed0c7f7cf59273b8dba41 GIT binary patch literal 1679 zcmZ{i&2Jk;7>5TMpf#n12FigTrXZCM$qB70R5|j2(nPA%iiifpt=iZVd#SU#+K*9wix4UV%CCk|YD;tzleJn!xzyAg~$`^-$R zf|BP7d;(sF`{57pDcCFcOL6{NvA++c-k-1p_w32;FeHVeLgQ7^hJ zGdzy`B&?ZThjG)5bl^0MnyI@nssG*1CaqRf3ytygl3zFKtP{mL3F=O4>e~0%Ctj_o z-VO+GJncqNV$@vddL;4n-04|$KCc&=z>nP650};Xpy_&-^(oOd-!w}`WnaCJdz$wf zjh4}#bIENuu}cxpT#j>fzSPN!1fjX)`bi;sBz=@L8U~dHCrI%>FtxaRre1!}gb~>) zID-xfGsC|hn|!@gG`2jy9GHrZ5ik|B9M_xHwWbqBCa%6aKU+RIj0+tv zS~OvK#;f^t*K1Vt$ptqqoproMLSHL73QKdXBy?KkSwCEgD%uOOZB#uzt@CB|6;B_j z>SM1?mz2F>J33uW*U}Z+wmY_)ohZA>uESZ+w$lw|zev~9H9JUG(p9@{2io4t;AJmR@7g|5U2Qwul5jS5J6+fI7K$b?*B^Gym(vvm#N%kCu@EWomq3c>6awm HD*E*gL}ZXP literal 0 HcmV?d00001 diff --git a/docs/_static/locales/sr/LC_MESSAGES/booktheme.po b/docs/_static/locales/sr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..1a712a1 --- /dev/null +++ b/docs/_static/locales/sr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "предложи уређивање" + +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Edit this page" +msgstr "Уредите ову страницу" + +msgid "Launch" +msgstr "Лансирање" + +msgid "Print to PDF" +msgstr "Испис у ПДФ" + +msgid "open issue" +msgstr "отворено издање" + +msgid "Download notebook file" +msgstr "Преузмите датотеку бележнице" + +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" + +msgid "Source repository" +msgstr "Изворно спремиште" + +msgid "By the" +msgstr "Од" + +msgid "next page" +msgstr "Следећа страна" + +msgid "repository" +msgstr "спремиште" + +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "Contents" +msgstr "Садржај" + +msgid "By" +msgstr "Од стране" + +msgid "Copyright" +msgstr "Ауторско право" + +msgid "Fullscreen mode" +msgstr "Режим целог екрана" + +msgid "Open an issue" +msgstr "Отворите издање" + +msgid "previous page" +msgstr "Претходна страница" + +msgid "Download this page" +msgstr "Преузмите ову страницу" + +msgid "Theme by the" +msgstr "Тхеме би" diff --git a/docs/_static/locales/sv/LC_MESSAGES/booktheme.mo b/docs/_static/locales/sv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..be951bec201ccd86d534499749af1df8938a14e3 GIT binary patch literal 1349 zcmZ9KF>Dk^6ow}lVsj7(m^c(h3{4=#1{0;Q&N?YF_DNQZu<*qa<=pM_?&RiXHZ!vq zyG4|gNfap!#koiw$x6S9lsZb4B2p?uK}P|i;eWel+45*-zMVHS@BQ=U{de{3PXg^z z^hNZ4&~KtY`v3#l+!-P8iSrmf1TTVf;5>L9Tm%=u&%kS72fPYC0xy9CUIycoPeJzc zBlr>cD|iw74ZH##PWji={_k}D0_1pa!4^0()11Eq@_Z3wKexd@z^_1#^9sZ#USr_% zZ$RF6=ByAmz{?=(O~C8m*C6NOG59g~J@^Uu1e^tb0eSy(koEo!vcEq;zVF{4@B4qc z{t~=^`Mc@*?78OL0?7OBfSk7_kWCc-)qQ+2<|OVr8_C9ipJLzZERSN%{a}q#skAOq-?^dO)rOAE z!IgeMr;IVzK^7__v7YJ(*GJQCX-pV+A}dEOC9$bOlx2~sNU3xd^U@A-@vy)KWu*?G zB(deSg%c;Y*1BT5iRY(iF%a%=1x7AWrn0xW1Xp}5yaA7 zY}7f9(*!9zjkPPMvQM}VWtI_C5^e%1?mHU9WFt*>$Om|9%O-xp@sm1o>%qo@_2cz> zUo5qziA{R@1+`^_fV+iJ+OEh!u6&@_`L@?hmXG&&Wy3D{WZe#2s%_Sm%Y7YNo62S- z^4gYR+}bjwS0?E?KMHMWi+UP5U#`gJw{yqJTOE1t^Oct9R)@Z?#g0zJhP9Me2gZo9 zC~`LrzM8~{)TgPEmOK(4X)v^i8v1U?&&>~Wv^uON#=v;Olp>3HHSsd&R9W!|smjPJ zdCFctK8{1KsU|3nZL-b#*9G8FWH;fu2BfNV<5 S2DY&GdIic4q;D?Bp56m!5lvG7 literal 0 HcmV?d00001 diff --git a/docs/_static/locales/sv/LC_MESSAGES/booktheme.po b/docs/_static/locales/sv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..7d2b56d --- /dev/null +++ b/docs/_static/locales/sv/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "föreslå redigering" + +msgid "Last updated on" +msgstr "Senast uppdaterad den" + +msgid "Edit this page" +msgstr "Redigera den här sidan" + +msgid "Launch" +msgstr "Lansera" + +msgid "Print to PDF" +msgstr "Skriv ut till PDF" + +msgid "open issue" +msgstr "öppet problem" + +msgid "Download notebook file" +msgstr "Ladda ner anteckningsbokfilen" + +msgid "Toggle navigation" +msgstr "Växla navigering" + +msgid "Source repository" +msgstr "Källförvar" + +msgid "By the" +msgstr "Vid" + +msgid "next page" +msgstr "nästa sida" + +msgid "repository" +msgstr "förvar" + +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" + +msgid "Download source file" +msgstr "Ladda ner källfil" + +msgid "Contents" +msgstr "Innehåll" + +msgid "By" +msgstr "Förbi" + +msgid "Copyright" +msgstr "upphovsrätt" + +msgid "Fullscreen mode" +msgstr "Fullskärmsläge" + +msgid "Open an issue" +msgstr "Öppna ett problem" + +msgid "previous page" +msgstr "föregående sida" + +msgid "Download this page" +msgstr "Ladda ner den här sidan" + +msgid "Theme by the" +msgstr "Tema av" diff --git a/docs/_static/locales/ta/LC_MESSAGES/booktheme.mo b/docs/_static/locales/ta/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..29f52e1f6f1ec96aceb0f883d8ccc82c23eb35c2 GIT binary patch literal 1928 zcmbW0%ZnUE9LGzIuko2E;=xEoRN`S0qn9x23T7V=+2G=?qL54POr@uFQq^?#B-xX0 zK#htA4J0RHRwJIJFG|WNq7Z50sn;0!@U&o7(5PV;9F4M{{RobKj41& z@a;;?!xtbeX@>OX{(5y6M3y47A9wJS8l@l7I~meb8I-3U@UzelnM(bH_d|LjeI~u4 zB&Ck5^3z4%s2P{8W=Y&H)T}#g2QKPq>k6~t+?)DDGB7*axf^C(bKPdqPja0`u~Boq zq#)vWxe(=r9;UshFg@+8T8M_W+gC58#_GuGB+rLNEoOcl%M6n_~Kv<@xsE9lI>D`3aM?=WN&Y5*v5);gzIlEkrgR(mY~Bt;NAGiw5m^ zmz~Tz+NOS)Pd_uI!*qJT)%&LPp{J%=sw%gu@~f)+wA%QnDo0iMT~%)Q%}sWAT~-@s zt8&XvWPPzJFLmFFj3kCLZVZKXbJg6qObpgpYXhKc{dPQvXD4*l1`&-oR|ZVWnD5S zLMPGk+4yL_MW)wWJ7GI+sWh)Cq}dE7ao%TGqX8uPK%$P%oUIVNaozG6uhIA~XTs-( z77E8j3VKIkNhd=@QrBItuMs9x^kr3kK4HautE;{2cexG}GQN=#P4;o6q{&7}8xZ++ zl w$ZZQ&WaeX;?9mtGBq&}escqTfGyJc(*W8(47(T)#0?{xcP9tpFr||Or2L57y?*IS* literal 0 HcmV?d00001 diff --git a/docs/_static/locales/ta/LC_MESSAGES/booktheme.po b/docs/_static/locales/ta/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..c75ffe1 --- /dev/null +++ b/docs/_static/locales/ta/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" + +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" + +msgid "Launch" +msgstr "தொடங்க" + +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" + +msgid "open issue" +msgstr "திறந்த பிரச்சினை" + +msgid "Download notebook file" +msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" + +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" + +msgid "Source repository" +msgstr "மூல களஞ்சியம்" + +msgid "By the" +msgstr "மூலம்" + +msgid "next page" +msgstr "அடுத்த பக்கம்" + +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "By" +msgstr "வழங்கியவர்" + +msgid "Copyright" +msgstr "பதிப்புரிமை" + +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" + +msgid "previous page" +msgstr "முந்தைய பக்கம்" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" + +msgid "Theme by the" +msgstr "வழங்கிய தீம்" diff --git a/docs/_static/locales/te/LC_MESSAGES/booktheme.mo b/docs/_static/locales/te/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..0a5f4b46adfda1551ae6791c3c3782525b61be04 GIT binary patch literal 1806 zcmbu8?`s@I7{^DgzpiR+74e1QD2kPOYU&G1LO_}((2{DPsaEjK=5D&TdYxHz_mbva zT2L$M3z1kXg(AcfwAS4~Neb5f0lujqQV?VieD5FN3qLcn=UrpK7cRH^*?DH3U*CQ1 zw_V$o1=qvek8yv`{W$mAxAEY*0dI#t!Motk@Lu>Ud<6aho$p_87u?C=2jJ6i2YeYi zzX^ChJOuB9$KXz=YA)3F59{^k(B)Z$4Y&rK|263Re}o(GCUki}y(4f1KFWF>z6o!@ z*Wm7LLQKL1xEEf7ufjj!vvA~2A@;zx;Pdc3_zYZw?)**o1l&$Dhu|Lg6r6|7{snaU zU4^f}Um%kFbGaHHtXJD1WeGz1>mHu2N2iC=&RtGZchR1B$iD?W+^g&V?%L)waXOPu z(25ZI7x~Geqr`+s7qcYp6yktc&|MR?r8b3{Gv-}+Jn5=|IXAtmr8XIhPLj(sij|mb zCj}Av%jqaDWG`(;g=$Nq#dOrut&Vs-Ra!<`CVAddVkS#8PDaigm=Z@q{7j`LPYRPQ ziX&+!(I@48SIcZiolwF*xU=VM^?@zFv*l@L zDz6jwvaMLG-4f{crQm*REN}ghN#a8coKPu>p z%YTFt$m|qAXTDh&g5gT~hljsJ*ry=A+<9Nb1sA(o5-xGw{Z;?6OlS@gI#jemLQG%z zrpf6>XY=H3-bW;Qrf>v2>%ZN4n4aM|U<|2-ZBn^mBghuhM0)Dv2+@ei()B(V2&(za uuMrF7ToguSy%w`N&3+IHSt#2LVBfiP)B5iT;9Jx)h5&elIS4O(ZT|-CPABOA literal 0 HcmV?d00001 diff --git a/docs/_static/locales/te/LC_MESSAGES/booktheme.po b/docs/_static/locales/te/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..2595c03 --- /dev/null +++ b/docs/_static/locales/te/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: te\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "సవరించమని సూచించండి" + +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" + +msgid "Launch" +msgstr "ప్రారంభించండి" + +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" + +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" + +msgid "Download notebook file" +msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" + +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" + +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" + +msgid "By the" +msgstr "ద్వారా" + +msgid "next page" +msgstr "తరువాతి పేజీ" + +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "By" +msgstr "ద్వారా" + +msgid "Copyright" +msgstr "కాపీరైట్" + +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" + +msgid "previous page" +msgstr "ముందు పేజి" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" + +msgid "Theme by the" +msgstr "ద్వారా థీమ్" diff --git a/docs/_static/locales/tg/LC_MESSAGES/booktheme.mo b/docs/_static/locales/tg/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..b21c6c6340194fdf35f7e5660deb42479c8dbff9 GIT binary patch literal 1628 zcmaiyO^6gn6vxZY=tNE8S5Q|hA#9RE$8XSGCI@vF1jR*HLCB?drtIlBTh(+|t9#pZ z_b^Dr#19Y@K@`-J?Yg?{x;qOwd8{6D@{o&%oP^*d#K?f}Wpw_pnH1Q&v@ z3%&tK*FWF}u!PNBU}wRfz%8&Zfe!dP_zn0sxE@@yD9?KJ9kAteKMU^WF zJC>CiI~?GEE4d#GJ20M-!R?)~ z>>S<1-6l7a<}oHySZKVs&CQhc{Mbyqb88w7X3RqzI{&F#*USvhMoiLrM6s>Hk4E|6 zc@o%qM9F2t?V4KSrinZf?58}t0JXzb84{b#Mr}$-{y{=+V#Xn)X(lNzTPtR6wl32O zGdJL5Bs-5oxB+T`zIGRrAt`^lPLZT?M?g!0angPB{%GR5vxHp0oR8Arqi zbZiRp&%w__8!lf*NbDpe;WA2%r?Xi$atSF8VXr;q_FB@_W_A(5kPfr&0p+;^8?eY= pg1vVOUqyoB&tBYSn9xh&7BjPW`v%MukJU629MMs5Ow+8v{s(GpYQg{j literal 0 HcmV?d00001 diff --git a/docs/_static/locales/tg/LC_MESSAGES/booktheme.po b/docs/_static/locales/tg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..73cd30e --- /dev/null +++ b/docs/_static/locales/tg/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "пешниҳод вироиш" + +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" + +msgid "Launch" +msgstr "Оғоз" + +msgid "Print to PDF" +msgstr "Чоп ба PDF" + +msgid "open issue" +msgstr "барориши кушод" + +msgid "Download notebook file" +msgstr "Файли дафтарро зеркашӣ кунед" + +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" + +msgid "Source repository" +msgstr "Анбори манбаъ" + +msgid "By the" +msgstr "Бо" + +msgid "next page" +msgstr "саҳифаи оянда" + +msgid "repository" +msgstr "анбор" + +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "Contents" +msgstr "Мундариҷа" + +msgid "By" +msgstr "Бо" + +msgid "Copyright" +msgstr "Ҳуқуқи муаллиф" + +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" + +msgid "Open an issue" +msgstr "Масъаларо кушоед" + +msgid "previous page" +msgstr "саҳифаи қаблӣ" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" + +msgid "Theme by the" +msgstr "Мавзӯъи аз" diff --git a/docs/_static/locales/th/LC_MESSAGES/booktheme.mo b/docs/_static/locales/th/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..abede98aa11b163e580a26b545980ace31e61ccf GIT binary patch literal 1766 zcma)*-)|K~6vqcarB^@&)CU_K663GrYB9uM>wQ7mgal$EMW46#4trN`XEwWgD~&H; zNI=2(Qi7!k28|(VOaz2Z{{sC3d@_d21Bp*Q8{hn#*{fZQQ8%6a%*>u2-*e9G?VVdL zD4xeyEM|9;NtGW4!Kz+u&BX3y#5Y_$YiD?uH$>6TSg=Km#9y)rhB| z#94;h;VRq)zl0CNTOLHf&S01Tf9_gR-TKX!nk)j@8 z$!wbssp1UphqNWmR~=a5Pgi}TUURlGwkp}=OGTFUD|OJlYX>grY3nL8@7z23cs4K_ z*QFa4UGulgs-KlQPg0|%ds#*3KaVrR!JzCG##p`JdPW^i%1RIOUQ(H!c9!$dcKhn} z9D~H_tSpB{%@&y@h|{wNXVlR;Utw}rW|b?J)X}`3*%SJJXq)Ss1*76y&(}50xilRZ zZIi_;O{$C})|{wnbx!isN%F!hW^Oo=-3VU})6}5SPzh4p+ooH!5B1t_nxZ7yq^|R~ zC4W0+ZXG#vWP0QK-WMiXqsF%9mU1(xD+Iil50cDI>25zMN>g=?&CRs;Z`c)yEsvX` zJ#D+Lm)Ueu@1M`A*5SmaL;6aLert9xERsQc#uW?Yq_%lHmYtWTbiM67YxSOv-uv8C zONI6KgI^B*v*yl!75w$!KM(#=@YjO>NCp2z@ZSZGG2hr+4E__@te@u_{+M44euZ<4 z_;qwx4(q3b|5Wzei|3W#eYCFwuf#yNf&j$Yu0#;+cXcn64J%wUT=~$4O>SO5=h=^

cLPeiV0|6qlnFzL#U0qn`*`iT?nxl@xb2Mx-{rpyeF$L|PmGL73Xj zjT&US*r9DL+Oc6=XyNi4J`IP)4~3RpiSp}N5WkMWZ=`O(hjnrBo?i;ppCMASYj{fI qV*6MBqwc03(drtRAFXAoSBd=B?a4S*sk|OB^ZqtY{YJQZ;_45RC*i9A literal 0 HcmV?d00001 diff --git a/docs/_static/locales/th/LC_MESSAGES/booktheme.po b/docs/_static/locales/th/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..0392b4a --- /dev/null +++ b/docs/_static/locales/th/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: th\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "แนะนำแก้ไข" + +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" + +msgid "Launch" +msgstr "เปิด" + +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" + +msgid "open issue" +msgstr "เปิดปัญหา" + +msgid "Download notebook file" +msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" + +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" + +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" + +msgid "By the" +msgstr "โดย" + +msgid "next page" +msgstr "หน้าต่อไป" + +msgid "repository" +msgstr "ที่เก็บ" + +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "Contents" +msgstr "สารบัญ" + +msgid "By" +msgstr "โดย" + +msgid "Copyright" +msgstr "ลิขสิทธิ์" + +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" + +msgid "Open an issue" +msgstr "เปิดปัญหา" + +msgid "previous page" +msgstr "หน้าที่แล้ว" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" + +msgid "Theme by the" +msgstr "ธีมโดย" diff --git a/docs/_static/locales/tl/LC_MESSAGES/booktheme.mo b/docs/_static/locales/tl/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..8df1b73310e0c606251d1abff7e6033d1f6b273f GIT binary patch literal 1273 zcmZ{iJ#P~+7{?8ixA4}MHz7bWh@lJz6qYJggw!_(YD=U9)PcpxxsJ)jKAr8h8TbH< zl>mt^fEW=h3@|dWP{DwN#01}fk%9knmnKyup2YV%`|Ricw;%r;A9>CYr_e5-eL%a2 z_Gk|th%ew?a0@&DeghAKKfp8KZ;;mh1;@cLOg;`?0Z)LpKw38o9s}=zN5K_v43vGY z_s5_1`!7J!c@37pw;-+m2-5n`;Ct{ph(FuhSLAyJ(z;h52j75~!7cDS_y;@-j*b-m zC%}W~-v&p)J0SUA0Z)SpJPAGlY2GGy4txoc|92qy`UKMYuOOYrFAzsE2s#`3PH_Yc zHrRgZAP%9?9w{GbQ&0{H+8gOp(7q^W|Kx>&wCSAbj3LR`Ob>tV+mg-Nw3lhs_H53s zo5YHk8|!7$+74gUi5w0)8?u(%HR#*g@l+_u=40)Val5-HoaZ5pg_kk6hAoOEtD7`fpKHxt1^q`P0PmGs4|~w zYF}CuMg<%mawMf%5;BoQ3pVSzGB;`7b(Ndbym+ll7=Ee3C$CPI*s^AIft_~oQ`+M| zjoMMlC845tP)?QC3^N9mW&fLyY9mxPB*L)jFaumd3$>sZlm_4E_)y1P<99=X&7mSu zQF#bj7^^11I1!U-GjxO_E86t}@}&6i_@% literal 0 HcmV?d00001 diff --git a/docs/_static/locales/tl/LC_MESSAGES/booktheme.po b/docs/_static/locales/tl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..c8375b5 --- /dev/null +++ b/docs/_static/locales/tl/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "iminumungkahi i-edit" + +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" + +msgid "Launch" +msgstr "Ilunsad" + +msgid "Print to PDF" +msgstr "I-print sa PDF" + +msgid "open issue" +msgstr "bukas na isyu" + +msgid "Download notebook file" +msgstr "Mag-download ng file ng notebook" + +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" + +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" + +msgid "By the" +msgstr "Sa pamamagitan ng" + +msgid "next page" +msgstr "Susunod na pahina" + +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "By" +msgstr "Ni" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Open an issue" +msgstr "Magbukas ng isyu" + +msgid "previous page" +msgstr "Nakaraang pahina" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" + +msgid "Theme by the" +msgstr "Tema ng" diff --git a/docs/_static/locales/tr/LC_MESSAGES/booktheme.mo b/docs/_static/locales/tr/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..029ae18afb5360a8c238a052e8d3971761759d3d GIT binary patch literal 1373 zcmZ{izi%8x6vqdWKynFz!~~?sQXUOIiX{o62)3@sVLOWA2n!$dC&=i7J19yL{j6T0W2%?d)gY?96-L@67yl{`g~s z_CESD`XA_*&>y~r7uw0!mBOP=;q?Z120RHafv3P_@ICND@LjMEo(I1M&w>oT4aSc5 zLCNz7d<%R6o&kRZ&w(7D`FN2cjBk&jSbMQ3yvf}|L z^-dgb=PiL35fdohSHUH48x$WIDEhw##oq%^>ihtT&YwW>`D+*d4$8W}!FRxeF7BOZ z>s|syPtwI-fS96gfHHp*lr0wzl2>wx9;q$97n`h;HKI?N=#nP7WUs~N1$3mG*A#z? zP4-{T@J)1V%lv%Rpus~iXZ5ACk!=k4s2XpwJgPPKoh_YC$-2lp&J{E^B_9n3SNjqF zXE5d_P^B|g>#2!IeHd=kWf?}E+0w+NtTuIsR9C5voRYJMYdgx-R~05`OD2Sx)s{CF zNgQphZK&MIp`-&XC zw^i0&m&u0nldwXznunqP*($Z4{f{ku(5I`PtoGDUdp(}*+f>_seb0WLJ~cMw0*C6= zkV`YBTo=V`U#;;tvZvIAMh7gN?Gt7i9EQ538>@@sDR7=_PxgBv?;s7aXZ*rps`o&(U<3tx~U_1rqYg?0^K7|^E%RsJ#t%4f8 zo6h$Ap{&BCl*;`;;xXGI&@B^nMMIv5kwyPFiiuV?c-PnoHwMdQd*;PnG+qT~k=xL= f7*f}zXhDUuwVFPIQ2d!&RZ>YE8iRKH#ZJBgJpfrQ literal 0 HcmV?d00001 diff --git a/docs/_static/locales/tr/LC_MESSAGES/booktheme.po b/docs/_static/locales/tr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..47d7bdf --- /dev/null +++ b/docs/_static/locales/tr/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "düzenleme öner" + +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" + +msgid "Launch" +msgstr "Başlatmak" + +msgid "Print to PDF" +msgstr "PDF olarak yazdır" + +msgid "open issue" +msgstr "Açık konu" + +msgid "Download notebook file" +msgstr "Defter dosyasını indirin" + +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" + +msgid "Source repository" +msgstr "Kaynak kod deposu" + +msgid "By the" +msgstr "Tarafından" + +msgid "next page" +msgstr "sonraki Sayfa" + +msgid "repository" +msgstr "depo" + +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "Contents" +msgstr "İçindekiler" + +msgid "By" +msgstr "Tarafından" + +msgid "Copyright" +msgstr "Telif hakkı" + +msgid "Fullscreen mode" +msgstr "Tam ekran modu" + +msgid "Open an issue" +msgstr "Bir sorunu açın" + +msgid "previous page" +msgstr "önceki sayfa" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" + +msgid "Theme by the" +msgstr "Tarafından tema" diff --git a/docs/_static/locales/uk/LC_MESSAGES/booktheme.mo b/docs/_static/locales/uk/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..16ab78909cfbaba7fa199f47fdfc2934426ac699 GIT binary patch literal 1681 zcmZvaO>7%Q6vv0QKx#^WmXAw-X;52=V^7yhotb5Kwlue- zPJ@uD1fdWPh|e20*TKPc;zZ)a@r}d@A+B8DUJjM|f4dvvq>McK+j;xuef*#QJbLI0 zf%O{p5cY4_Z(`qj3JD;1Tdg@Fj3P=dZc__x$`9$oc*S3*fo^agnKo4Zexd+ydwLFH++H&9h3nhscvH3nP?w=Ry$GKV8 zSFn*%JcrG*?O#Zh&hS|fa-{PW7iaO4wx+~;Mq8zAjF)gW3jCTCm(0hyZoI10#;R#! zZps@$UG17A`bVb!y$DvicD z(UqEbKZJv)We~@S5))CN5yZ%eOXK2NmM>DFi34k*S#d3_1^TwU$hA$?)Ql48Q%+|+ zO&Q;>E2+I(f$!M>Nwm6cv+4}z$&!STx)qotFS{>%ocO*%l?t7p6!W2~*y81C@dFjb zh*pwW{vziurkM*@FJB$o{eEubY#|r6I5iuplC&t`Oj!2O`(TSv<;z`$dL~;A5u^%qBgBK^s=!h>rLI6)qdpT zRwLUoA{Qc+BL{@CNd#$~fM}{TM=rgzQV%n0sfS7&;BP2WpLe~9L#0ZLy!)G(eLtS} z@uTBCHyGACc;3gei{}G8S6;vi>pu7*_yBwvdd_{ zw7^~PH24qrDR`oXv3~FiknZO|ioXGV2*%(?;Gf{z;NRf8;J+FBUg~@w04eVRNO2|b zJ#Z2H7+e8i$-yFT-pWp-6LJ_r(sdMXnvv>}ceKb;S{N^_PkZu%7R~=ky6bpCK9k3g z$k@3h{CHRvY(#lWzU!1jHmVk6McE}TRVZeZy2@wWis)VkD)Nisnai;32Hdk9!Ny8% zh>H8iNjnI6>?(vD=Y%)au3|&?BFFX~vq4Jm5 zMX&72MShO7Oqazq!O}OM=}4bej#Cj_+Vieshc22(u^4vLDC*N`;`w6URZ%80h#W^i znt)vNS978mS`#JfvhV|x$n#E9i<(+#yWIJS^JCrbgJ(X=jVKuk8Cugzp2+hMT?f31 z?aE=i4%v6}~kli>l;GC(nmw+%Pw3ODBSPc^>(>sY>MA6>D7i z*MdBkUV01)pAYlSw$Ly6$pRnzWH`t4n!cr5?Pa~wuCipkz0CC=x@BmuW3xx+mX7tR z*NZtNFp)tbr@2L4}dj%B? z$~?F1e_~CYdU3r0$=I6uq5ePVO_Bn=P}riFSZ}qf6oE57w5w3K+FoX+hEW?y<4|&p zx|p)Aw=sGx%}Vw#el49X^(ARiaRizwH+vA!fH?=_BQ=JATO9Uo!rm6_g(Z9Fvrf~J ziFzY}!KTjO`w9hS|3mkKY2Z8hBsWpwH*$FgF5fip{lMp#&N|*Vkp4MHrJJsNw1%8D c^9?3>eEmE8GP@z_uy-`khW>?G>aA{%rxd0lq5uE@ literal 0 HcmV?d00001 diff --git a/docs/_static/locales/ur/LC_MESSAGES/booktheme.po b/docs/_static/locales/ur/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..0f90726 --- /dev/null +++ b/docs/_static/locales/ur/LC_MESSAGES/booktheme.po @@ -0,0 +1,66 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "ترمیم کی تجویز کریں" + +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" + +msgid "Launch" +msgstr "لانچ کریں" + +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" + +msgid "open issue" +msgstr "کھلا مسئلہ" + +msgid "Download notebook file" +msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" + +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" + +msgid "Source repository" +msgstr "ماخذ ذخیرہ" + +msgid "By the" +msgstr "کی طرف" + +msgid "next page" +msgstr "اگلا صفحہ" + +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "By" +msgstr "بذریعہ" + +msgid "Copyright" +msgstr "کاپی رائٹ" + +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" + +msgid "previous page" +msgstr "سابقہ ​​صفحہ" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" + +msgid "Theme by the" +msgstr "کے ذریعہ تھیم" diff --git a/docs/_static/locales/vi/LC_MESSAGES/booktheme.mo b/docs/_static/locales/vi/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..2bb32555c3ea0dab08ed37b71cb863fbe75698c6 GIT binary patch literal 1431 zcmZvb&x;&I6vr#s{2bR9catc(#OK8%htWiG2(!#(H#@MntBVvV&v#)!JFr^_{KP>F`@nJV05}OA1gF4b;9KAkunA6pAA*NK z3BCmSiq}An^CkEqxCxGf--9oMKUe&tTK}_}KL%Ov30MQi#>)GLK%P&59Onf13wRdX z3;qSN-ajCp`xj*0y?e@hC&AY-KMlSLE>x7&{%7EEtZ#xGrw?+zzkx4+4=O$aInLi8 z=P?fP6X0=>=PmFs_%X6t9{djXqq7H;REU`#e&m%Dv(|WNyu(A%OLe5YIB!2Su?;$8te4By zUZxct%bjIsvow_dS@cRfN`gp=xsLV-{cPIG;@E|$l!jJqM~a2OdCHPb;AMxb!8|je z5+5Wu5E#l0;esOMR|IFK`YgJ+E?Oq}qlDRK7TFmDND~hLNUKno*_5*I#duC ze1pUH?uya95XS7fK6vqb$6da&5d>$e(Tqr%5FL8(*`2r*YiH`^Z>aE(?ll6i#v)Y{nLNAmS zVZLM|@+Cqff{+L(H9>+X*h#n|&YXJarQWrDsNf1G{?EIRgwekJ?VFu>|Np%Cx20*2 zVQfXTBHkmmBW^Fl3uEes3ZOb zQk?;C9XJZE1)qXHfzuJ+M)Utfc@-qRPhbpOu_D~R9;Cb#q&h!?W$*w<>pw>P43chB zQ^;m;Gx8RY{OyX^7V!v3^?n6uod9Y7@6r5Kko@OC(isEk+)qHNR|2Y~glBh97KqDQIoyw}Q#g=trLPD*?? zsWX<#ZNn6-BW-Dv{+f1r*{qv#gpj;Xr3E`?xSD%*+R!4+l|=5zREC|jvA~era$Qfb zF2|B6qIlQgPIfxfbA+v2ODm_JowhTUyu=TZx9*JS6Rh#(J>i+Um1$-Lm&OIlG_(Z~ zDK6>Iog$r3#CF65OL>v)Mde-3GzDA=oCH?XIg!%wqv`lr;kc-l;Guq;^y3ZX*zu#s zI~M-$+r2jyH8$SeZ;J%iFtEqY8kTJ5sf^*cLMP93cgEWm);WfBdxaD4kSUe6q?zDt zJ(i9gGoRpuVl zu3Y;tdw+Y?BAIRa)rh7%Q6vqb|O6z_>OFs^gI=uiz7%1XUIrvhVNR?8ES{E)zXk$;;3!9nM?rdo| zg(?BJNt;NGU78fyR1pmy`2barI!U>5;l_yr7d&hG1XmCT{?EI?hS9$L&6|(+{`20i zd%MaE;~=aX_A~4-Y~m68Ft$C)7(TWgzpda-a2vP}+zxhw2f(Mnr@$<@7d!**1_ihW z)CosHiZc!F0%yUU;1}SN;CBgsOxAx%{5nYa{sdFtmM!u9-5~khAjNqGTmxSL>HHrF z{{ks*S695g10>!1LDKhp!dDaaCwv>+k9`-U`l4+X18A zb`E+6_3&{R%F^mDJ28xp>!M(W-N{d0I-s9&TSG1P{ z75aJczeQbi0`6J1V7&!LBlM=*7rJhc_l1yrNEHO@w*t*WuV86W;7Y;|WxmMX@NmGA z+zEnEumRtZ2%`AF$v$>A&gTnH1&&t!FgxoN9eI(TAZ@v#7!s`Y=Y#Q^a>}+{!KHP< zu`TT&i4+%gtWHs$IEm+r3yumC*&X47(6$9s3cLhT)Vm_D)29mQH-#S{T878@)098m z%A7iV>U3{=|JVyJrINy?bHkpi>0X&v z1xMN$etgi;seVh^A?ljp9~9roy_FhpL*H`KeaasSGF*BsH^{!+!{cf8S;>!N`LUxt zDOTIK)fgH3eSM~5R-avJPKqIR9T5`UTRjZlMYk9ZN|&2 zSsBNyvAEKln_#AN!(3g7N>iJPqMOUL)it`->9il( zoLjEXSEEv;IrB~9#-v%f*7$q_8AyL^bp+y>8T%Uf>ocRKJlP7gdS!Fx->lK(l=-+? P`(Y`Xeqh$BP|E%Rvo4ks literal 0 HcmV?d00001 diff --git a/docs/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/docs/_static/locales/zh_TW/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..7833d90 --- /dev/null +++ b/docs/_static/locales/zh_TW/LC_MESSAGES/booktheme.po @@ -0,0 +1,75 @@ + +msgid "" +msgstr "" +"Project-Id-Version: Sphinx-Book-Theme\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "suggest edit" +msgstr "提出修改建議" + +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Edit this page" +msgstr "編輯此頁面" + +msgid "Launch" +msgstr "啟動" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "open issue" +msgstr "公開的問題" + +msgid "Download notebook file" +msgstr "下載 Notebook 檔案" + +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" + +msgid "Source repository" +msgstr "來源儲存庫" + +msgid "By the" +msgstr "作者:" + +msgid "next page" +msgstr "下一頁" + +msgid "repository" +msgstr "儲存庫" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "Contents" +msgstr "目錄" + +msgid "By" +msgstr "作者:" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Fullscreen mode" +msgstr "全螢幕模式" + +msgid "Open an issue" +msgstr "開啟議題" + +msgid "previous page" +msgstr "上一頁" + +msgid "Download this page" +msgstr "下載此頁面" + +msgid "Theme by the" +msgstr "佈景主題作者:" diff --git a/docs/_static/logo-classicblue-400px.png b/docs/_static/logo-classicblue-400px.png new file mode 100644 index 0000000000000000000000000000000000000000..d4243b53fcc8e4a0b9968a5bf1f6781654dc513b GIT binary patch literal 10976 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 G(|-YtcxAr*|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/_static/plus.png b/docs/_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/_static/pygments.css b/docs/_static/pygments.css new file mode 100644 index 0000000..997797f --- /dev/null +++ b/docs/_static/pygments.css @@ -0,0 +1,152 @@ +html[data-theme="light"] .highlight pre { line-height: 125%; } +html[data-theme="light"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="light"] .highlight .hll { background-color: #7971292e } +html[data-theme="light"] .highlight { background: #fefefe; color: #545454 } +html[data-theme="light"] .highlight .c { color: #797129 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #d91e18 } /* Error */ +html[data-theme="light"] .highlight .k { color: #7928a1 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #797129 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #545454 } /* Name */ +html[data-theme="light"] .highlight .o { color: #008000 } /* Operator */ +html[data-theme="light"] .highlight .p { color: #545454 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #797129 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #797129 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #797129 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #797129 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #797129 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #797129 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #007faa } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #007faa } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #007faa } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #7928a1 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #7928a1 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #7928a1 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #7928a1 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #7928a1 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #797129 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #797129 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #797129 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #008000 } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #797129 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #797129 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #007faa } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #007faa } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #797129 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #008000 } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #7928a1 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #007faa } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #797129 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #545454 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #545454 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #007faa } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #007faa } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #d91e18 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #7928a1 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #545454 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #545454 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #797129 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #797129 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #797129 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #797129 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #797129 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #008000 } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #008000 } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #008000 } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #008000 } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #008000 } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #008000 } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #008000 } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #008000 } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #008000 } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #008000 } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #d91e18 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #008000 } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #007faa } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #797129 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #007faa } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #d91e18 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #d91e18 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #d91e18 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #797129 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #797129 } /* Literal.Number.Integer.Long */ +html[data-theme="dark"] .highlight pre { line-height: 125%; } +html[data-theme="dark"] .highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +html[data-theme="dark"] .highlight .hll { background-color: #ffd9002e } +html[data-theme="dark"] .highlight { background: #2b2b2b; color: #f8f8f2 } +html[data-theme="dark"] .highlight .c { color: #ffd900 } /* Comment */ +html[data-theme="dark"] .highlight .err { color: #ffa07a } /* Error */ +html[data-theme="dark"] .highlight .k { color: #dcc6e0 } /* Keyword */ +html[data-theme="dark"] .highlight .l { color: #ffd900 } /* Literal */ +html[data-theme="dark"] .highlight .n { color: #f8f8f2 } /* Name */ +html[data-theme="dark"] .highlight .o { color: #abe338 } /* Operator */ +html[data-theme="dark"] .highlight .p { color: #f8f8f2 } /* Punctuation */ +html[data-theme="dark"] .highlight .ch { color: #ffd900 } /* Comment.Hashbang */ +html[data-theme="dark"] .highlight .cm { color: #ffd900 } /* Comment.Multiline */ +html[data-theme="dark"] .highlight .cp { color: #ffd900 } /* Comment.Preproc */ +html[data-theme="dark"] .highlight .cpf { color: #ffd900 } /* Comment.PreprocFile */ +html[data-theme="dark"] .highlight .c1 { color: #ffd900 } /* Comment.Single */ +html[data-theme="dark"] .highlight .cs { color: #ffd900 } /* Comment.Special */ +html[data-theme="dark"] .highlight .gd { color: #00e0e0 } /* Generic.Deleted */ +html[data-theme="dark"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="dark"] .highlight .gh { color: #00e0e0 } /* Generic.Heading */ +html[data-theme="dark"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="dark"] .highlight .gu { color: #00e0e0 } /* Generic.Subheading */ +html[data-theme="dark"] .highlight .kc { color: #dcc6e0 } /* Keyword.Constant */ +html[data-theme="dark"] .highlight .kd { color: #dcc6e0 } /* Keyword.Declaration */ +html[data-theme="dark"] .highlight .kn { color: #dcc6e0 } /* Keyword.Namespace */ +html[data-theme="dark"] .highlight .kp { color: #dcc6e0 } /* Keyword.Pseudo */ +html[data-theme="dark"] .highlight .kr { color: #dcc6e0 } /* Keyword.Reserved */ +html[data-theme="dark"] .highlight .kt { color: #ffd900 } /* Keyword.Type */ +html[data-theme="dark"] .highlight .ld { color: #ffd900 } /* Literal.Date */ +html[data-theme="dark"] .highlight .m { color: #ffd900 } /* Literal.Number */ +html[data-theme="dark"] .highlight .s { color: #abe338 } /* Literal.String */ +html[data-theme="dark"] .highlight .na { color: #ffd900 } /* Name.Attribute */ +html[data-theme="dark"] .highlight .nb { color: #ffd900 } /* Name.Builtin */ +html[data-theme="dark"] .highlight .nc { color: #00e0e0 } /* Name.Class */ +html[data-theme="dark"] .highlight .no { color: #00e0e0 } /* Name.Constant */ +html[data-theme="dark"] .highlight .nd { color: #ffd900 } /* Name.Decorator */ +html[data-theme="dark"] .highlight .ni { color: #abe338 } /* Name.Entity */ +html[data-theme="dark"] .highlight .ne { color: #dcc6e0 } /* Name.Exception */ +html[data-theme="dark"] .highlight .nf { color: #00e0e0 } /* Name.Function */ +html[data-theme="dark"] .highlight .nl { color: #ffd900 } /* Name.Label */ +html[data-theme="dark"] .highlight .nn { color: #f8f8f2 } /* Name.Namespace */ +html[data-theme="dark"] .highlight .nx { color: #f8f8f2 } /* Name.Other */ +html[data-theme="dark"] .highlight .py { color: #00e0e0 } /* Name.Property */ +html[data-theme="dark"] .highlight .nt { color: #00e0e0 } /* Name.Tag */ +html[data-theme="dark"] .highlight .nv { color: #ffa07a } /* Name.Variable */ +html[data-theme="dark"] .highlight .ow { color: #dcc6e0 } /* Operator.Word */ +html[data-theme="dark"] .highlight .pm { color: #f8f8f2 } /* Punctuation.Marker */ +html[data-theme="dark"] .highlight .w { color: #f8f8f2 } /* Text.Whitespace */ +html[data-theme="dark"] .highlight .mb { color: #ffd900 } /* Literal.Number.Bin */ +html[data-theme="dark"] .highlight .mf { color: #ffd900 } /* Literal.Number.Float */ +html[data-theme="dark"] .highlight .mh { color: #ffd900 } /* Literal.Number.Hex */ +html[data-theme="dark"] .highlight .mi { color: #ffd900 } /* Literal.Number.Integer */ +html[data-theme="dark"] .highlight .mo { color: #ffd900 } /* Literal.Number.Oct */ +html[data-theme="dark"] .highlight .sa { color: #abe338 } /* Literal.String.Affix */ +html[data-theme="dark"] .highlight .sb { color: #abe338 } /* Literal.String.Backtick */ +html[data-theme="dark"] .highlight .sc { color: #abe338 } /* Literal.String.Char */ +html[data-theme="dark"] .highlight .dl { color: #abe338 } /* Literal.String.Delimiter */ +html[data-theme="dark"] .highlight .sd { color: #abe338 } /* Literal.String.Doc */ +html[data-theme="dark"] .highlight .s2 { color: #abe338 } /* Literal.String.Double */ +html[data-theme="dark"] .highlight .se { color: #abe338 } /* Literal.String.Escape */ +html[data-theme="dark"] .highlight .sh { color: #abe338 } /* Literal.String.Heredoc */ +html[data-theme="dark"] .highlight .si { color: #abe338 } /* Literal.String.Interpol */ +html[data-theme="dark"] .highlight .sx { color: #abe338 } /* Literal.String.Other */ +html[data-theme="dark"] .highlight .sr { color: #ffa07a } /* Literal.String.Regex */ +html[data-theme="dark"] .highlight .s1 { color: #abe338 } /* Literal.String.Single */ +html[data-theme="dark"] .highlight .ss { color: #00e0e0 } /* Literal.String.Symbol */ +html[data-theme="dark"] .highlight .bp { color: #ffd900 } /* Name.Builtin.Pseudo */ +html[data-theme="dark"] .highlight .fm { color: #00e0e0 } /* Name.Function.Magic */ +html[data-theme="dark"] .highlight .vc { color: #ffa07a } /* Name.Variable.Class */ +html[data-theme="dark"] .highlight .vg { color: #ffa07a } /* Name.Variable.Global */ +html[data-theme="dark"] .highlight .vi { color: #ffa07a } /* Name.Variable.Instance */ +html[data-theme="dark"] .highlight .vm { color: #ffd900 } /* Name.Variable.Magic */ +html[data-theme="dark"] .highlight .il { color: #ffd900 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_static/sbt-webpack-macros.html b/docs/_static/sbt-webpack-macros.html new file mode 100644 index 0000000..6cbf559 --- /dev/null +++ b/docs/_static/sbt-webpack-macros.html @@ -0,0 +1,11 @@ + +{% macro head_pre_bootstrap() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} diff --git a/docs/_static/scripts/bootstrap.js b/docs/_static/scripts/bootstrap.js new file mode 100644 index 0000000..bda8a60 --- /dev/null +++ b/docs/_static/scripts/bootstrap.js @@ -0,0 +1,3 @@ +/*! For license information please see bootstrap.js.LICENSE.txt */ +(()=>{"use strict";var t={d:(e,i)=>{for(var n in i)t.o(i,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{afterMain:()=>w,afterRead:()=>b,afterWrite:()=>T,applyStyles:()=>D,arrow:()=>G,auto:()=>r,basePlacements:()=>a,beforeMain:()=>v,beforeRead:()=>g,beforeWrite:()=>E,bottom:()=>n,clippingParents:()=>h,computeStyles:()=>et,createPopper:()=>St,createPopperBase:()=>Lt,createPopperLite:()=>Dt,detectOverflow:()=>gt,end:()=>c,eventListeners:()=>nt,flip:()=>_t,hide:()=>yt,left:()=>o,main:()=>y,modifierPhases:()=>C,offset:()=>wt,placements:()=>m,popper:()=>u,popperGenerator:()=>kt,popperOffsets:()=>Et,preventOverflow:()=>At,read:()=>_,reference:()=>f,right:()=>s,start:()=>l,top:()=>i,variationPlacements:()=>p,viewport:()=>d,write:()=>A});var i="top",n="bottom",s="right",o="left",r="auto",a=[i,n,s,o],l="start",c="end",h="clippingParents",d="viewport",u="popper",f="reference",p=a.reduce((function(t,e){return t.concat([e+"-"+l,e+"-"+c])}),[]),m=[].concat(a,[r]).reduce((function(t,e){return t.concat([e,e+"-"+l,e+"-"+c])}),[]),g="beforeRead",_="read",b="afterRead",v="beforeMain",y="main",w="afterMain",E="beforeWrite",A="write",T="afterWrite",C=[g,_,b,v,y,w,E,A,T];function O(t){return t?(t.nodeName||"").toLowerCase():null}function x(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function k(t){return t instanceof x(t).Element||t instanceof Element}function L(t){return t instanceof x(t).HTMLElement||t instanceof HTMLElement}function S(t){return"undefined"!=typeof ShadowRoot&&(t instanceof x(t).ShadowRoot||t instanceof ShadowRoot)}const D={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];L(s)&&O(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});L(n)&&O(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function $(t){return t.split("-")[0]}var I=Math.max,N=Math.min,P=Math.round;function M(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function j(){return!/^((?!chrome|android).)*safari/i.test(M())}function F(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&L(t)&&(s=t.offsetWidth>0&&P(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&P(n.height)/t.offsetHeight||1);var r=(k(t)?x(t):window).visualViewport,a=!j()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function H(t){var e=F(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function B(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&S(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function W(t){return x(t).getComputedStyle(t)}function z(t){return["table","td","th"].indexOf(O(t))>=0}function R(t){return((k(t)?t.ownerDocument:t.document)||window.document).documentElement}function q(t){return"html"===O(t)?t:t.assignedSlot||t.parentNode||(S(t)?t.host:null)||R(t)}function V(t){return L(t)&&"fixed"!==W(t).position?t.offsetParent:null}function Y(t){for(var e=x(t),i=V(t);i&&z(i)&&"static"===W(i).position;)i=V(i);return i&&("html"===O(i)||"body"===O(i)&&"static"===W(i).position)?e:i||function(t){var e=/firefox/i.test(M());if(/Trident/i.test(M())&&L(t)&&"fixed"===W(t).position)return null;var i=q(t);for(S(i)&&(i=i.host);L(i)&&["html","body"].indexOf(O(i))<0;){var n=W(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function K(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Q(t,e,i){return I(t,N(e,i))}function X(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function U(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const G={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,r=t.state,l=t.name,c=t.options,h=r.elements.arrow,d=r.modifiersData.popperOffsets,u=$(r.placement),f=K(u),p=[o,s].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return X("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:U(t,a))}(c.padding,r),g=H(h),_="y"===f?i:o,b="y"===f?n:s,v=r.rects.reference[p]+r.rects.reference[f]-d[f]-r.rects.popper[p],y=d[f]-r.rects.reference[f],w=Y(h),E=w?"y"===f?w.clientHeight||0:w.clientWidth||0:0,A=v/2-y/2,T=m[_],C=E-g[p]-m[b],O=E/2-g[p]/2+A,x=Q(T,O,C),k=f;r.modifiersData[l]=((e={})[k]=x,e.centerOffset=x-O,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&B(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function J(t){return t.split("-")[1]}var Z={top:"auto",right:"auto",bottom:"auto",left:"auto"};function tt(t){var e,r=t.popper,a=t.popperRect,l=t.placement,h=t.variation,d=t.offsets,u=t.position,f=t.gpuAcceleration,p=t.adaptive,m=t.roundOffsets,g=t.isFixed,_=d.x,b=void 0===_?0:_,v=d.y,y=void 0===v?0:v,w="function"==typeof m?m({x:b,y}):{x:b,y};b=w.x,y=w.y;var E=d.hasOwnProperty("x"),A=d.hasOwnProperty("y"),T=o,C=i,O=window;if(p){var k=Y(r),L="clientHeight",S="clientWidth";k===x(r)&&"static"!==W(k=R(r)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===i||(l===o||l===s)&&h===c)&&(C=n,y-=(g&&k===O&&O.visualViewport?O.visualViewport.height:k[L])-a.height,y*=f?1:-1),l!==o&&(l!==i&&l!==n||h!==c)||(T=s,b-=(g&&k===O&&O.visualViewport?O.visualViewport.width:k[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&Z),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:P(i*s)/s||0,y:P(n*s)/s||0}}({x:b,y},x(r)):{x:b,y};return b=I.x,y=I.y,f?Object.assign({},$,((D={})[C]=A?"0":"",D[T]=E?"0":"",D.transform=(O.devicePixelRatio||1)<=1?"translate("+b+"px, "+y+"px)":"translate3d("+b+"px, "+y+"px, 0)",D)):Object.assign({},$,((e={})[C]=A?y+"px":"",e[T]=E?b+"px":"",e.transform="",e))}const et={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:$(e.placement),variation:J(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,tt(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,tt(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var it={passive:!0};const nt={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=x(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,it)})),a&&l.addEventListener("resize",i.update,it),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,it)})),a&&l.removeEventListener("resize",i.update,it)}},data:{}};var st={left:"right",right:"left",bottom:"top",top:"bottom"};function ot(t){return t.replace(/left|right|bottom|top/g,(function(t){return st[t]}))}var rt={start:"end",end:"start"};function at(t){return t.replace(/start|end/g,(function(t){return rt[t]}))}function lt(t){var e=x(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ct(t){return F(R(t)).left+lt(t).scrollLeft}function ht(t){var e=W(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function dt(t){return["html","body","#document"].indexOf(O(t))>=0?t.ownerDocument.body:L(t)&&ht(t)?t:dt(q(t))}function ut(t,e){var i;void 0===e&&(e=[]);var n=dt(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=x(n),r=s?[o].concat(o.visualViewport||[],ht(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ut(q(r)))}function ft(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function pt(t,e,i){return e===d?ft(function(t,e){var i=x(t),n=R(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=j();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ct(t),y:l}}(t,i)):k(e)?function(t,e){var i=F(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):ft(function(t){var e,i=R(t),n=lt(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=I(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=I(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ct(t),l=-n.scrollTop;return"rtl"===W(s||i).direction&&(a+=I(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(R(t)))}function mt(t){var e,r=t.reference,a=t.element,h=t.placement,d=h?$(h):null,u=h?J(h):null,f=r.x+r.width/2-a.width/2,p=r.y+r.height/2-a.height/2;switch(d){case i:e={x:f,y:r.y-a.height};break;case n:e={x:f,y:r.y+r.height};break;case s:e={x:r.x+r.width,y:p};break;case o:e={x:r.x-a.width,y:p};break;default:e={x:r.x,y:r.y}}var m=d?K(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case l:e[m]=e[m]-(r[g]/2-a[g]/2);break;case c:e[m]=e[m]+(r[g]/2-a[g]/2)}}return e}function gt(t,e){void 0===e&&(e={});var o=e,r=o.placement,l=void 0===r?t.placement:r,c=o.strategy,p=void 0===c?t.strategy:c,m=o.boundary,g=void 0===m?h:m,_=o.rootBoundary,b=void 0===_?d:_,v=o.elementContext,y=void 0===v?u:v,w=o.altBoundary,E=void 0!==w&&w,A=o.padding,T=void 0===A?0:A,C=X("number"!=typeof T?T:U(T,a)),x=y===u?f:u,S=t.rects.popper,D=t.elements[E?x:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ut(q(t)),i=["absolute","fixed"].indexOf(W(t).position)>=0&&L(t)?Y(t):t;return k(i)?e.filter((function(t){return k(t)&&B(t,i)&&"body"!==O(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=pt(t,i,n);return e.top=I(s.top,e.top),e.right=N(s.right,e.right),e.bottom=N(s.bottom,e.bottom),e.left=I(s.left,e.left),e}),pt(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(k(D)?D:D.contextElement||R(t.elements.popper),g,b,p),P=F(t.elements.reference),M=mt({reference:P,element:S,strategy:"absolute",placement:l}),j=ft(Object.assign({},S,M)),H=y===u?j:P,z={top:$.top-H.top+C.top,bottom:H.bottom-$.bottom+C.bottom,left:$.left-H.left+C.left,right:H.right-$.right+C.right},V=t.modifiersData.offset;if(y===u&&V){var K=V[l];Object.keys(z).forEach((function(t){var e=[s,n].indexOf(t)>=0?1:-1,o=[i,n].indexOf(t)>=0?"y":"x";z[t]+=K[o]*e}))}return z}const _t={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,c=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=c.mainAxis,u=void 0===d||d,f=c.altAxis,g=void 0===f||f,_=c.fallbackPlacements,b=c.padding,v=c.boundary,y=c.rootBoundary,w=c.altBoundary,E=c.flipVariations,A=void 0===E||E,T=c.allowedAutoPlacements,C=e.options.placement,O=$(C),x=_||(O!==C&&A?function(t){if($(t)===r)return[];var e=ot(t);return[at(t),e,at(e)]}(C):[ot(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat($(i)===r?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,l=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?m:c,d=J(n),u=d?l?p:p.filter((function(t){return J(t)===d})):a,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var g=f.reduce((function(e,i){return e[i]=gt(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[$(i)],e}),{});return Object.keys(g).sort((function(t,e){return g[t]-g[e]}))}(e,{placement:i,boundary:v,rootBoundary:y,padding:b,flipVariations:A,allowedAutoPlacements:T}):i)}),[]),L=e.rects.reference,S=e.rects.popper,D=new Map,I=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=gt(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?s:o:F?n:i;L[B]>S[B]&&(z=ot(z));var R=ot(z),q=[];if(u&&q.push(W[j]<=0),g&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,I=!1;break}D.set(M,q)}if(I)for(var V=function(t){var e=k.find((function(e){var i=D.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return N=e,"break"},Y=A?3:1;Y>0&&"break"!==V(Y);Y--);e.placement!==N&&(e.modifiersData[h]._skip=!0,e.placement=N,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function bt(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function vt(t){return[i,s,n,o].some((function(e){return t[e]>=0}))}const yt={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=gt(e,{elementContext:"reference"}),a=gt(e,{altBoundary:!0}),l=bt(r,n),c=bt(a,s,o),h=vt(l),d=vt(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},wt={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,r=t.name,a=n.offset,l=void 0===a?[0,0]:a,c=m.reduce((function(t,n){return t[n]=function(t,e,n){var r=$(t),a=[o,i].indexOf(r)>=0?-1:1,l="function"==typeof n?n(Object.assign({},e,{placement:t})):n,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[o,s].indexOf(r)>=0?{x:h,y:c}:{x:c,y:h}}(n,e.rects,l),t}),{}),h=c[e.placement],d=h.x,u=h.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=d,e.modifiersData.popperOffsets.y+=u),e.modifiersData[r]=c}},Et={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=mt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},At={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,r=t.options,a=t.name,c=r.mainAxis,h=void 0===c||c,d=r.altAxis,u=void 0!==d&&d,f=r.boundary,p=r.rootBoundary,m=r.altBoundary,g=r.padding,_=r.tether,b=void 0===_||_,v=r.tetherOffset,y=void 0===v?0:v,w=gt(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=$(e.placement),A=J(e.placement),T=!A,C=K(E),O="x"===C?"y":"x",x=e.modifiersData.popperOffsets,k=e.rects.reference,L=e.rects.popper,S="function"==typeof y?y(Object.assign({},e.rects,{placement:e.placement})):y,D="number"==typeof S?{mainAxis:S,altAxis:S}:Object.assign({mainAxis:0,altAxis:0},S),P=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?i:o,B="y"===C?n:s,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[B],V=b?-L[W]/2:0,X=A===l?k[W]:L[W],U=A===l?-L[W]:-k[W],G=e.elements.arrow,Z=b&&G?H(G):{width:0,height:0},tt=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},et=tt[F],it=tt[B],nt=Q(0,k[W],Z[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:X-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&Y(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==P?void 0:P[C])?j:0,ct=z+ot-lt,ht=Q(b?N(R,z+st-lt-at):R,z,b?I(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?i:o,ft="x"===C?n:s,pt=x[O],mt="y"===O?"height":"width",_t=pt+w[ut],bt=pt-w[ft],vt=-1!==[i,o].indexOf(E),yt=null!=(dt=null==P?void 0:P[O])?dt:0,wt=vt?_t:pt-k[mt]-L[mt]-yt+D.altAxis,Et=vt?pt+k[mt]+L[mt]-yt-D.altAxis:bt,At=b&&vt?function(t,e,i){var n=Q(t,e,i);return n>i?i:n}(wt,pt,Et):Q(b?wt:_t,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Tt(t,e,i){void 0===i&&(i=!1);var n,s,o=L(e),r=L(e)&&function(t){var e=t.getBoundingClientRect(),i=P(e.width)/t.offsetWidth||1,n=P(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=R(e),l=F(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==O(e)||ht(a))&&(c=(n=e)!==x(n)&&L(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:lt(n)),L(e)?((h=F(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ct(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ct(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var Ot={placement:"bottom",modifiers:[],strategy:"absolute"};function xt(){for(var t=arguments.length,e=new Array(t),i=0;i$t.has(t)&&$t.get(t).get(e)||null,remove(t,e){if(!$t.has(t))return;const i=$t.get(t);i.delete(e),0===i.size&&$t.delete(t)}},Nt="transitionend",Pt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),Mt=t=>{t.dispatchEvent(new Event(Nt))},jt=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ft=t=>jt(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Pt(t)):null,Ht=t=>{if(!jt(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},Bt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),Wt=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?Wt(t.parentNode):null},zt=()=>{},Rt=t=>{t.offsetHeight},qt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Vt=[],Yt=()=>"rtl"===document.documentElement.dir,Kt=t=>{var e;e=()=>{const e=qt();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(Vt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Vt)t()})),Vt.push(e)):e()},Qt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Xt=(t,e,i=!0)=>{if(!i)return void Qt(t);const n=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let s=!1;const o=({target:i})=>{i===e&&(s=!0,e.removeEventListener(Nt,o),Qt(t))};e.addEventListener(Nt,o),setTimeout((()=>{s||Mt(e)}),n)},Ut=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},Gt=/[^.]*(?=\..*)\.|.*/,Jt=/\..*/,Zt=/::\d+$/,te={};let ee=1;const ie={mouseenter:"mouseover",mouseleave:"mouseout"},ne=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function se(t,e){return e&&`${e}::${ee++}`||t.uidEvent||ee++}function oe(t){const e=se(t);return t.uidEvent=e,te[e]=te[e]||{},te[e]}function re(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function ae(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=de(t);return ne.has(o)||(o=t),[n,s,o]}function le(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=ae(e,i,n);if(e in ie){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=oe(t),c=l[a]||(l[a]={}),h=re(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=se(r,e.replace(Gt,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return fe(s,{delegateTarget:r}),n.oneOff&&ue.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return fe(n,{delegateTarget:t}),i.oneOff&&ue.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function ce(t,e,i,n,s){const o=re(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function he(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&ce(t,e,i,r.callable,r.delegationSelector)}function de(t){return t=t.replace(Jt,""),ie[t]||t}const ue={on(t,e,i,n){le(t,e,i,n,!1)},one(t,e,i,n){le(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=ae(e,i,n),a=r!==e,l=oe(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))he(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(Zt,"");a&&!e.includes(s)||ce(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;ce(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=qt();let s=null,o=!0,r=!0,a=!1;e!==de(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=fe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function fe(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function pe(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function me(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const ge={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${me(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${me(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=pe(t.dataset[n])}return e},getDataAttribute:(t,e)=>pe(t.getAttribute(`data-bs-${me(e)}`))};class _e{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=jt(e)?ge.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...jt(e)?ge.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],o=jt(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(o))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${o}" but expected type "${s}".`)}var i}}class be extends _e{constructor(t,e){super(),(t=Ft(t))&&(this._element=t,this._config=this._getConfig(e),It.set(this._element,this.constructor.DATA_KEY,this))}dispose(){It.remove(this._element,this.constructor.DATA_KEY),ue.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Xt(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return It.get(Ft(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const ve=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?Pt(i.trim()):null}return e},ye={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!Bt(t)&&Ht(t)))},getSelectorFromElement(t){const e=ve(t);return e&&ye.findOne(e)?e:null},getElementFromSelector(t){const e=ve(t);return e?ye.findOne(e):null},getMultipleElementsFromSelector(t){const e=ve(t);return e?ye.find(e):[]}},we=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;ue.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Bt(this))return;const s=ye.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ee=".bs.alert",Ae=`close${Ee}`,Te=`closed${Ee}`;class Ce extends be{static get NAME(){return"alert"}close(){if(ue.trigger(this._element,Ae).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),ue.trigger(this._element,Te),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Ce.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}we(Ce,"close"),Kt(Ce);const Oe='[data-bs-toggle="button"]';class xe extends be{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=xe.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}ue.on(document,"click.bs.button.data-api",Oe,(t=>{t.preventDefault();const e=t.target.closest(Oe);xe.getOrCreateInstance(e).toggle()})),Kt(xe);const ke=".bs.swipe",Le=`touchstart${ke}`,Se=`touchmove${ke}`,De=`touchend${ke}`,$e=`pointerdown${ke}`,Ie=`pointerup${ke}`,Ne={endCallback:null,leftCallback:null,rightCallback:null},Pe={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Me extends _e{constructor(t,e){super(),this._element=t,t&&Me.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Ne}static get DefaultType(){return Pe}static get NAME(){return"swipe"}dispose(){ue.off(this._element,ke)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),Qt(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&Qt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(ue.on(this._element,$e,(t=>this._start(t))),ue.on(this._element,Ie,(t=>this._end(t))),this._element.classList.add("pointer-event")):(ue.on(this._element,Le,(t=>this._start(t))),ue.on(this._element,Se,(t=>this._move(t))),ue.on(this._element,De,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const je=".bs.carousel",Fe=".data-api",He="next",Be="prev",We="left",ze="right",Re=`slide${je}`,qe=`slid${je}`,Ve=`keydown${je}`,Ye=`mouseenter${je}`,Ke=`mouseleave${je}`,Qe=`dragstart${je}`,Xe=`load${je}${Fe}`,Ue=`click${je}${Fe}`,Ge="carousel",Je="active",Ze=".active",ti=".carousel-item",ei=Ze+ti,ii={ArrowLeft:ze,ArrowRight:We},ni={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},si={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class oi extends be{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=ye.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===Ge&&this.cycle()}static get Default(){return ni}static get DefaultType(){return si}static get NAME(){return"carousel"}next(){this._slide(He)}nextWhenVisible(){!document.hidden&&Ht(this._element)&&this.next()}prev(){this._slide(Be)}pause(){this._isSliding&&Mt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?ue.one(this._element,qe,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void ue.one(this._element,qe,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?He:Be;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&ue.on(this._element,Ve,(t=>this._keydown(t))),"hover"===this._config.pause&&(ue.on(this._element,Ye,(()=>this.pause())),ue.on(this._element,Ke,(()=>this._maybeEnableCycle()))),this._config.touch&&Me.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of ye.find(".carousel-item img",this._element))ue.on(t,Qe,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(We)),rightCallback:()=>this._slide(this._directionToOrder(ze)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Me(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=ii[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=ye.findOne(Ze,this._indicatorsElement);e.classList.remove(Je),e.removeAttribute("aria-current");const i=ye.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(Je),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===He,s=e||Ut(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>ue.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Re).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),Rt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(Je),i.classList.remove(Je,c,l),this._isSliding=!1,r(qe)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return ye.findOne(ei,this._element)}_getItems(){return ye.find(ti,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Yt()?t===We?Be:He:t===We?He:Be}_orderToDirection(t){return Yt()?t===Be?We:ze:t===Be?ze:We}static jQueryInterface(t){return this.each((function(){const e=oi.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}ue.on(document,Ue,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=ye.getElementFromSelector(this);if(!e||!e.classList.contains(Ge))return;t.preventDefault();const i=oi.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===ge.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),ue.on(window,Xe,(()=>{const t=ye.find('[data-bs-ride="carousel"]');for(const e of t)oi.getOrCreateInstance(e)})),Kt(oi);const ri=".bs.collapse",ai=`show${ri}`,li=`shown${ri}`,ci=`hide${ri}`,hi=`hidden${ri}`,di=`click${ri}.data-api`,ui="show",fi="collapse",pi="collapsing",mi=`:scope .${fi} .${fi}`,gi='[data-bs-toggle="collapse"]',_i={parent:null,toggle:!0},bi={parent:"(null|element)",toggle:"boolean"};class vi extends be{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=ye.find(gi);for(const t of i){const e=ye.getSelectorFromElement(t),i=ye.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return _i}static get DefaultType(){return bi}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>vi.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(ue.trigger(this._element,ai).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(fi),this._element.classList.add(pi),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(pi),this._element.classList.add(fi,ui),this._element.style[e]="",ue.trigger(this._element,li)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(ue.trigger(this._element,ci).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,Rt(this._element),this._element.classList.add(pi),this._element.classList.remove(fi,ui);for(const t of this._triggerArray){const e=ye.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(pi),this._element.classList.add(fi),ue.trigger(this._element,hi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(ui)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ft(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(gi);for(const e of t){const t=ye.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=ye.find(mi,this._config.parent);return ye.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=vi.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}ue.on(document,di,gi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of ye.getMultipleElementsFromSelector(this))vi.getOrCreateInstance(t,{toggle:!1}).toggle()})),Kt(vi);const yi="dropdown",wi=".bs.dropdown",Ei=".data-api",Ai="ArrowUp",Ti="ArrowDown",Ci=`hide${wi}`,Oi=`hidden${wi}`,xi=`show${wi}`,ki=`shown${wi}`,Li=`click${wi}${Ei}`,Si=`keydown${wi}${Ei}`,Di=`keyup${wi}${Ei}`,$i="show",Ii='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',Ni=`${Ii}.${$i}`,Pi=".dropdown-menu",Mi=Yt()?"top-end":"top-start",ji=Yt()?"top-start":"top-end",Fi=Yt()?"bottom-end":"bottom-start",Hi=Yt()?"bottom-start":"bottom-end",Bi=Yt()?"left-start":"right-start",Wi=Yt()?"right-start":"left-start",zi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Ri={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class qi extends be{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=ye.next(this._element,Pi)[0]||ye.prev(this._element,Pi)[0]||ye.findOne(Pi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return zi}static get DefaultType(){return Ri}static get NAME(){return yi}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Bt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!ue.trigger(this._element,xi,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))ue.on(t,"mouseover",zt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add($i),this._element.classList.add($i),ue.trigger(this._element,ki,t)}}hide(){if(Bt(this._element)||!this._isShown())return;const t={relatedTarget:this._element};this._completeHide(t)}dispose(){this._popper&&this._popper.destroy(),super.dispose()}update(){this._inNavbar=this._detectNavbar(),this._popper&&this._popper.update()}_completeHide(t){if(!ue.trigger(this._element,Ci,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.off(t,"mouseover",zt);this._popper&&this._popper.destroy(),this._menu.classList.remove($i),this._element.classList.remove($i),this._element.setAttribute("aria-expanded","false"),ge.removeDataAttribute(this._menu,"popper"),ue.trigger(this._element,Oi,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!jt(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${yi.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);return t}_createPopper(){if(void 0===e)throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");let t=this._element;"parent"===this._config.reference?t=this._parent:jt(this._config.reference)?t=Ft(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=St(t,this._menu,i)}_isShown(){return this._menu.classList.contains($i)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Bi;if(t.classList.contains("dropstart"))return Wi;if(t.classList.contains("dropup-center"))return"top";if(t.classList.contains("dropdown-center"))return"bottom";const e="end"===getComputedStyle(this._menu).getPropertyValue("--bs-position").trim();return t.classList.contains("dropup")?e?ji:Mi:e?Hi:Fi}_detectNavbar(){return null!==this._element.closest(".navbar")}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(ge.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Qt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=ye.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Ht(t)));i.length&&Ut(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=ye.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ai,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:ye.prev(this,Ii)[0]||ye.next(this,Ii)[0]||ye.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}ue.on(document,Si,Ii,qi.dataApiKeydownHandler),ue.on(document,Si,Pi,qi.dataApiKeydownHandler),ue.on(document,Li,qi.clearMenus),ue.on(document,Di,qi.clearMenus),ue.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),Kt(qi);const Vi="backdrop",Yi="show",Ki=`mousedown.bs.${Vi}`,Qi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Xi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends _e{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Qi}static get DefaultType(){return Xi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void Qt(t);this._append();const e=this._getElement();this._config.isAnimated&&Rt(e),e.classList.add(Yi),this._emulateAnimation((()=>{Qt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Yi),this._emulateAnimation((()=>{this.dispose(),Qt(t)}))):Qt(t)}dispose(){this._isAppended&&(ue.off(this._element,Ki),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=Ft(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),ue.on(t,Ki,(()=>{Qt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Xt(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends _e{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),ue.off(document,Gi),ue.on(document,Ji,(t=>this._handleFocusin(t))),ue.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,ue.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=ye.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&ge.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=ge.getDataAttribute(t,e);null!==i?(ge.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(jt(t))e(t);else for(const i of ye.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",En="show",An="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends be{constructor(t,e){super(t,e),this._dialog=ye.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||ue.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(ue.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(En),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){ue.off(window,hn),ue.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=ye.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),Rt(this._element),this._element.classList.add(En),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,ue.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){ue.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),ue.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),ue.on(this._element,bn,(t=>{ue.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),ue.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(ue.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(An)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(An),this._queueCallback((()=>{this._element.classList.remove(An),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=Yt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Yt()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}ue.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=ye.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),ue.one(e,pn,(t=>{t.defaultPrevented||ue.one(e,fn,(()=>{Ht(this)&&this.focus()}))}));const i=ye.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),we(On),Kt(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Bn=`click${xn}${kn}`,Wn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends be{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||ue.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),ue.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(ue.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),ue.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():ue.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){ue.on(this._element,Wn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():ue.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}ue.on(document,Bn,'[data-bs-toggle="offcanvas"]',(function(t){const e=ye.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Bt(this))return;ue.one(e,Fn,(()=>{Ht(this)&&this.focus()}));const i=ye.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),ue.on(window,Ln,(()=>{for(const t of ye.find(In))qn.getOrCreateInstance(t).show()})),ue.on(window,Hn,(()=>{for(const t of ye.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),we(qn),Kt(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Yn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Kn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Qn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Yn.has(i)||Boolean(Kn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Xn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends _e{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Xn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=ye.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?jt(e)?this._putElementInTemplate(Ft(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Qn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Qt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:Yt()?"left":"right",BOTTOM:"bottom",LEFT:Yt()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends be{constructor(t,i){if(void 0===e)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,i),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),ue.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=ue.trigger(this._element,this.constructor.eventName("show")),e=(Wt(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),ue.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.on(t,"mouseover",zt);this._queueCallback((()=>{ue.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!ue.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))ue.off(t,"mouseover",zt);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),ue.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=Qt(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return St(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return Qt(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...Qt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)ue.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");ue.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),ue.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},ue.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=ge.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:Ft(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Kt(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Kt(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},Es={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class As extends be{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return Es}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=Ft(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(ue.off(this._config.target,ms),ue.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=ye.find(bs,this._config.target);for(const e of t){if(!e.hash||Bt(e))continue;const t=ye.findOne(decodeURI(e.hash),this._element);Ht(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),ue.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))ye.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of ye.parents(t,".nav, .list-group"))for(const t of ye.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=ye.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=As.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}ue.on(window,gs,(()=>{for(const t of ye.find('[data-bs-spy="scroll"]'))As.getOrCreateInstance(t)})),Kt(As);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Bs="show",Ws=".dropdown-toggle",zs=`:not(${Ws})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ys extends be{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),ue.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?ue.trigger(e,Cs,{relatedTarget:t}):null;ue.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(ye.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),ue.trigger(t,ks,{relatedTarget:e})):t.classList.add(Bs)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(ye.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),ue.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Bs)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Bt(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=Ut(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ys.getOrCreateInstance(i).show())}_getChildren(){return ye.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=ye.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=ye.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ws,Fs),n(".dropdown-menu",Bs),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:ye.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ys.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}ue.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Bt(this)||Ys.getOrCreateInstance(this).show()})),ue.on(window,Ds,(()=>{for(const t of ye.find(Vs))Ys.getOrCreateInstance(t)})),Kt(Ys);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Us=`focusin${Ks}`,Gs=`focusout${Ks}`,Js=`hide${Ks}`,Zs=`hidden${Ks}`,to=`show${Ks}`,eo=`shown${Ks}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends be{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){ue.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),Rt(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),ue.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(ue.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),ue.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){ue.on(this._element,Qs,(t=>this._onInteraction(t,!0))),ue.on(this._element,Xs,(t=>this._onInteraction(t,!1))),ue.on(this._element,Us,(t=>this._onInteraction(t,!0))),ue.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function lo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}we(ao),Kt(ao),lo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new cs(t,{delay:{show:500,hide:100}})}))})),lo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),lo((function(){var t=document.getElementById("pst-back-to-top"),e=document.getElementsByClassName("bd-header")[0].getBoundingClientRect();window.addEventListener("scroll",(function(){this.oldScroll>this.scrollY&&this.scrollY>e.bottom?t.style.display="block":t.style.display="none",this.oldScroll=this.scrollY}))}))})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/docs/_static/scripts/bootstrap.js.LICENSE.txt b/docs/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 0000000..10f979d --- /dev/null +++ b/docs/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/docs/_static/scripts/bootstrap.js.map b/docs/_static/scripts/bootstrap.js.map new file mode 100644 index 0000000..e5bc157 --- /dev/null +++ b/docs/_static/scripts/bootstrap.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scripts/bootstrap.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/webpack/bootstrap","webpack://pydata_sphinx_theme/webpack/runtime/define property getters","webpack://pydata_sphinx_theme/webpack/runtime/hasOwnProperty shorthand","webpack://pydata_sphinx_theme/webpack/runtime/make namespace object","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/enums.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/math.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/within.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/createPopper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper.js","webpack://pydata_sphinx_theme/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://pydata_sphinx_theme/./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/bootstrap.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\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__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","/*!\n * Bootstrap v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map();\nconst Data = {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map());\n }\n const instanceMap = elementMap.get(element);\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n return;\n }\n instanceMap.set(key, instance);\n },\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null;\n }\n return null;\n },\n remove(element, key) {\n if (!elementMap.has(element)) {\n return;\n }\n const instanceMap = elementMap.get(element);\n instanceMap.delete(key);\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element);\n }\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend';\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n};\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n};\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n};\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n};\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n};\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n};\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n};\nconst noop = () => {};\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n};\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n};\nconst DOMContentLoadedCallbacks = [];\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n};\nconst isRTL = () => document.documentElement.dir === 'rtl';\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n};\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n};\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n};\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\nlet uidEvent = 1;\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n};\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\nfunction getElementEvents(element) {\n const uid = makeEventUid(element);\n element.uidEvent = uid;\n eventRegistry[uid] = eventRegistry[uid] || {};\n return eventRegistry[uid];\n}\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, {\n delegateTarget: element\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn);\n }\n return fn.apply(element, [event]);\n };\n}\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector);\n for (let {\n target\n } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue;\n }\n hydrateObj(event, {\n delegateTarget: target\n });\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn);\n }\n return fn.apply(target, [event]);\n }\n }\n };\n}\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events).find(event => event.callable === callable && event.delegationSelector === delegationSelector);\n}\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n}\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n}\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n}\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n}\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n}\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n};\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n}\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = isElement(value) ? 'element' : toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.2';\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super();\n element = getElement(element);\n if (!element) {\n return;\n }\n this._element = element;\n this._config = this._getConfig(config);\n Data.set(this._element, this.constructor.DATA_KEY, this);\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY);\n EventHandler.off(this._element, this.constructor.EVENT_KEY);\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null;\n }\n }\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated);\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY);\n }\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n }\n static get VERSION() {\n return VERSION;\n }\n static get DATA_KEY() {\n return `bs.${this.NAME}`;\n }\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`;\n }\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? parseSelector(hrefAttribute.trim()) : null;\n }\n return selector;\n};\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$f = 'alert';\nconst DATA_KEY$a = 'bs.alert';\nconst EVENT_KEY$b = `.${DATA_KEY$a}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$b}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$b}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$f;\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n if (closeEvent.defaultPrevented) {\n return;\n }\n this._element.classList.remove(CLASS_NAME_SHOW$8);\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n }\n\n // Private\n _destroyElement() {\n this._element.remove();\n EventHandler.trigger(this._element, EVENT_CLOSED);\n this.dispose();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close');\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$e = 'button';\nconst DATA_KEY$9 = 'bs.button';\nconst EVENT_KEY$a = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME$e;\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this);\n if (config === 'toggle') {\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n event.preventDefault();\n const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n const data = Button.getOrCreateInstance(button);\n data.toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$d = 'swipe';\nconst EVENT_KEY$9 = '.bs.swipe';\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SWIPE_THRESHOLD = 40;\nconst Default$c = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n};\nconst DefaultType$c = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n};\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super();\n this._element = element;\n if (!element || !Swipe.isSupported()) {\n return;\n }\n this._config = this._getConfig(config);\n this._deltaX = 0;\n this._supportPointerEvents = Boolean(window.PointerEvent);\n this._initEvents();\n }\n\n // Getters\n static get Default() {\n return Default$c;\n }\n static get DefaultType() {\n return DefaultType$c;\n }\n static get NAME() {\n return NAME$d;\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY$9);\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX;\n return;\n }\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX;\n }\n }\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX;\n }\n this._handleSwipe();\n execute(this._config.endCallback);\n }\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;\n }\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX);\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return;\n }\n const direction = absDeltaX / this._deltaX;\n this._deltaX = 0;\n if (!direction) {\n return;\n }\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);\n }\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event));\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event));\n this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event));\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event));\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event));\n }\n }\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$c = 'carousel';\nconst DATA_KEY$8 = 'bs.carousel';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst ARROW_LEFT_KEY$1 = 'ArrowLeft';\nconst ARROW_RIGHT_KEY$1 = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst EVENT_SLIDE = `slide${EVENT_KEY$8}`;\nconst EVENT_SLID = `slid${EVENT_KEY$8}`;\nconst EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;\nconst EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;\nconst EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;\nconst EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY$1]: DIRECTION_LEFT\n};\nconst Default$b = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n};\nconst DefaultType$b = {\n interval: '(number|boolean)',\n // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._interval = null;\n this._activeElement = null;\n this._isSliding = false;\n this.touchTimeout = null;\n this._swipeHelper = null;\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n this._addEventListeners();\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$b;\n }\n static get DefaultType() {\n return DefaultType$b;\n }\n static get NAME() {\n return NAME$c;\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT);\n }\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next();\n }\n }\n prev() {\n this._slide(ORDER_PREV);\n }\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element);\n }\n this._clearInterval();\n }\n cycle() {\n this._clearInterval();\n this._updateInterval();\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);\n }\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle());\n return;\n }\n this.cycle();\n }\n to(index) {\n const items = this._getItems();\n if (index > items.length - 1 || index < 0) {\n return;\n }\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n return;\n }\n const activeIndex = this._getItemIndex(this._getActive());\n if (activeIndex === index) {\n return;\n }\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n this._slide(order, items[index]);\n }\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose();\n }\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval;\n return config;\n }\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN$1, event => this._keydown(event));\n }\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());\n EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());\n }\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners();\n }\n }\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault());\n }\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return;\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause();\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout);\n }\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n };\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n };\n this._swipeHelper = new Swipe(this._element, swipeConfig);\n }\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return;\n }\n const direction = KEY_TO_DIRECTION[event.key];\n if (direction) {\n event.preventDefault();\n this._slide(this._directionToOrder(direction));\n }\n }\n _getItemIndex(element) {\n return this._getItems().indexOf(element);\n }\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return;\n }\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n activeIndicator.removeAttribute('aria-current');\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement);\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);\n newActiveIndicator.setAttribute('aria-current', 'true');\n }\n }\n _updateInterval() {\n const element = this._activeElement || this._getActive();\n if (!element) {\n return;\n }\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n this._config.interval = elementInterval || this._config.defaultInterval;\n }\n _slide(order, element = null) {\n if (this._isSliding) {\n return;\n }\n const activeElement = this._getActive();\n const isNext = order === ORDER_NEXT;\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);\n if (nextElement === activeElement) {\n return;\n }\n const nextElementIndex = this._getItemIndex(nextElement);\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n });\n };\n const slideEvent = triggerEvent(EVENT_SLIDE);\n if (slideEvent.defaultPrevented) {\n return;\n }\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return;\n }\n const isCycling = Boolean(this._interval);\n this.pause();\n this._isSliding = true;\n this._setActiveIndicatorElement(nextElementIndex);\n this._activeElement = nextElement;\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n nextElement.classList.add(orderClassName);\n reflow(nextElement);\n activeElement.classList.add(directionalClassName);\n nextElement.classList.add(directionalClassName);\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName);\n nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n this._isSliding = false;\n triggerEvent(EVENT_SLID);\n };\n this._queueCallback(completeCallBack, activeElement, this._isAnimated());\n if (isCycling) {\n this.cycle();\n }\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE);\n }\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n }\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element);\n }\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval);\n this._interval = null;\n }\n }\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n }\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n }\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config);\n if (typeof config === 'number') {\n data.to(config);\n return;\n }\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return;\n }\n event.preventDefault();\n const carousel = Carousel.getOrCreateInstance(target);\n const slideIndex = this.getAttribute('data-bs-slide-to');\n if (slideIndex) {\n carousel.to(slideIndex);\n carousel._maybeEnableCycle();\n return;\n }\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next();\n carousel._maybeEnableCycle();\n return;\n }\n carousel.prev();\n carousel._maybeEnableCycle();\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel);\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$b = 'collapse';\nconst DATA_KEY$7 = 'bs.collapse';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst EVENT_SHOW$6 = `show${EVENT_KEY$7}`;\nconst EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;\nconst EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;\nconst EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\nconst Default$a = {\n parent: null,\n toggle: true\n};\nconst DefaultType$a = {\n parent: '(null|element)',\n toggle: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isTransitioning = false;\n this._triggerArray = [];\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem);\n const filterElement = SelectorEngine.find(selector).filter(foundElement => foundElement === this._element);\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem);\n }\n }\n this._initializeChildren();\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n }\n if (this._config.toggle) {\n this.toggle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$a;\n }\n static get DefaultType() {\n return DefaultType$a;\n }\n static get NAME() {\n return NAME$b;\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide();\n } else {\n this.show();\n }\n }\n show() {\n if (this._isTransitioning || this._isShown()) {\n return;\n }\n let activeChildren = [];\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element => element !== this._element).map(element => Collapse.getOrCreateInstance(element, {\n toggle: false\n }));\n }\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n for (const activeInstance of activeChildren) {\n activeInstance.hide();\n }\n const dimension = this._getDimension();\n this._element.classList.remove(CLASS_NAME_COLLAPSE);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.style[dimension] = 0;\n this._addAriaAndCollapsedClass(this._triggerArray, true);\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n this._element.style[dimension] = '';\n EventHandler.trigger(this._element, EVENT_SHOWN$6);\n };\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n const scrollSize = `scroll${capitalizedDimension}`;\n this._queueCallback(complete, this._element, true);\n this._element.style[dimension] = `${this._element[scrollSize]}px`;\n }\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return;\n }\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);\n if (startEvent.defaultPrevented) {\n return;\n }\n const dimension = this._getDimension();\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_COLLAPSING);\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger);\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false);\n }\n }\n this._isTransitioning = true;\n const complete = () => {\n this._isTransitioning = false;\n this._element.classList.remove(CLASS_NAME_COLLAPSING);\n this._element.classList.add(CLASS_NAME_COLLAPSE);\n EventHandler.trigger(this._element, EVENT_HIDDEN$6);\n };\n this._element.style[dimension] = '';\n this._queueCallback(complete, this._element, true);\n }\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW$7);\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle); // Coerce string values\n config.parent = getElement(config.parent);\n return config;\n }\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n }\n _initializeChildren() {\n if (!this._config.parent) {\n return;\n }\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element);\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected));\n }\n }\n }\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element));\n }\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return;\n }\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\n element.setAttribute('aria-expanded', isOpen);\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {};\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false;\n }\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config);\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n }\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n event.preventDefault();\n }\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, {\n toggle: false\n }).toggle();\n }\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$a = 'dropdown';\nconst DATA_KEY$6 = 'bs.dropdown';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY$1 = 'ArrowUp';\nconst ARROW_DOWN_KEY$1 = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$5 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center';\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)';\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR = '.navbar';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst PLACEMENT_TOPCENTER = 'top';\nconst PLACEMENT_BOTTOMCENTER = 'bottom';\nconst Default$9 = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n};\nconst DefaultType$9 = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n};\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._popper = null;\n this._parent = this._element.parentNode; // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);\n this._inNavbar = this._detectNavbar();\n }\n\n // Getters\n static get Default() {\n return Default$9;\n }\n static get DefaultType() {\n return DefaultType$9;\n }\n static get NAME() {\n return NAME$a;\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show();\n }\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);\n if (showEvent.defaultPrevented) {\n return;\n }\n this._createPopper();\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n this._element.focus();\n this._element.setAttribute('aria-expanded', true);\n this._menu.classList.add(CLASS_NAME_SHOW$6);\n this._element.classList.add(CLASS_NAME_SHOW$6);\n EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);\n }\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return;\n }\n const relatedTarget = {\n relatedTarget: this._element\n };\n this._completeHide(relatedTarget);\n }\n dispose() {\n if (this._popper) {\n this._popper.destroy();\n }\n super.dispose();\n }\n update() {\n this._inNavbar = this._detectNavbar();\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);\n if (hideEvent.defaultPrevented) {\n return;\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n if (this._popper) {\n this._popper.destroy();\n }\n this._menu.classList.remove(CLASS_NAME_SHOW$6);\n this._element.classList.remove(CLASS_NAME_SHOW$6);\n this._element.setAttribute('aria-expanded', 'false');\n Manipulator.removeDataAttribute(this._menu, 'popper');\n EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);\n }\n _getConfig(config) {\n config = super._getConfig(config);\n if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME$a.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n }\n return config;\n }\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n }\n let referenceElement = this._element;\n if (this._config.reference === 'parent') {\n referenceElement = this._parent;\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference);\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference;\n }\n const popperConfig = this._getPopperConfig();\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n }\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW$6);\n }\n _getPlacement() {\n const parentDropdown = this._parent;\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER;\n }\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER;\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n }\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n }\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null;\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n };\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static'); // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }];\n }\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _selectMenuItem({\n key,\n target\n }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element));\n if (!items.length) {\n return;\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1) {\n return;\n }\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle);\n if (!context || context._config.autoClose === false) {\n continue;\n }\n const composedPath = event.composedPath();\n const isMenuTarget = composedPath.includes(context._menu);\n if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n continue;\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue;\n }\n const relatedTarget = {\n relatedTarget: context._element\n };\n if (event.type === 'click') {\n relatedTarget.clickEvent = event;\n }\n context._completeHide(relatedTarget);\n }\n }\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName);\n const isEscapeEvent = event.key === ESCAPE_KEY$2;\n const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return;\n }\n if (isInput && !isEscapeEvent) {\n return;\n }\n event.preventDefault();\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);\n const instance = Dropdown.getOrCreateInstance(getToggleButton);\n if (isUpOrDownEvent) {\n event.stopPropagation();\n instance.show();\n instance._selectMenuItem(event);\n return;\n }\n if (instance._isShown()) {\n // else is escape and we check if it is shown\n event.stopPropagation();\n instance.hide();\n getToggleButton.focus();\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n event.preventDefault();\n Dropdown.getOrCreateInstance(this).toggle();\n});\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$9 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;\nconst Default$8 = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n};\n\nconst DefaultType$8 = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n};\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default$8;\n }\n static get DefaultType() {\n return DefaultType$8;\n }\n static get NAME() {\n return NAME$9;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n this._emulateAnimation(() => {\n this.dispose();\n execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE$4);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$8 = 'focustrap';\nconst DATA_KEY$5 = 'bs.focustrap';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\nconst Default$7 = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n};\n\nconst DefaultType$7 = {\n autofocus: 'boolean',\n trapElement: 'element'\n};\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default$7;\n }\n static get DefaultType() {\n return DefaultType$7;\n }\n static get NAME() {\n return NAME$8;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY$5); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN$2, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY$5);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\nconst PROPERTY_PADDING = 'padding-right';\nconst PROPERTY_MARGIN = 'margin-right';\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$7 = 'modal';\nconst DATA_KEY$4 = 'bs.modal';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;\nconst EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$4}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;\nconst EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst OPEN_SELECTOR$1 = '.modal.show';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\nconst Default$6 = {\n backdrop: true,\n focus: true,\n keyboard: true\n};\nconst DefaultType$6 = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$6;\n }\n static get DefaultType() {\n return DefaultType$6;\n }\n static get NAME() {\n return NAME$7;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW$4);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY$4);\n EventHandler.off(this._dialog, EVENT_KEY$4);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW$4);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN$4, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n if (event.key !== ESCAPE_KEY$1) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE$1, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN$4);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE$3);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW$4, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$4, () => {\n if (isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n});\nenableDismissTrigger(Modal);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$6 = 'offcanvas';\nconst DATA_KEY$3 = 'bs.offcanvas';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst ESCAPE_KEY = 'Escape';\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_SHOWING$1 = 'showing';\nconst CLASS_NAME_HIDING = 'hiding';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$3 = `show${EVENT_KEY$3}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$3}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\nconst Default$5 = {\n backdrop: true,\n keyboard: true,\n scroll: false\n};\nconst DefaultType$5 = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n};\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._isShown = false;\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default$5;\n }\n static get DefaultType() {\n return DefaultType$5;\n }\n static get NAME() {\n return NAME$6;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._backdrop.show();\n if (!this._config.scroll) {\n new ScrollBarHelper().hide();\n }\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.classList.add(CLASS_NAME_SHOWING$1);\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate();\n }\n this._element.classList.add(CLASS_NAME_SHOW$3);\n this._element.classList.remove(CLASS_NAME_SHOWING$1);\n EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n relatedTarget\n });\n };\n this._queueCallback(completeCallBack, this._element, true);\n }\n hide() {\n if (!this._isShown) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._focustrap.deactivate();\n this._element.blur();\n this._isShown = false;\n this._element.classList.add(CLASS_NAME_HIDING);\n this._backdrop.hide();\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n if (!this._config.scroll) {\n new ScrollBarHelper().reset();\n }\n EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n };\n this._queueCallback(completeCallback, this._element, true);\n }\n dispose() {\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n return;\n }\n this.hide();\n };\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop);\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n });\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](this);\n });\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (isDisabled(this)) {\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN$3, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus();\n }\n });\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide();\n }\n const data = Offcanvas.getOrCreateInstance(target);\n data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show();\n }\n});\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide();\n }\n }\n});\nenableDismissTrigger(Offcanvas);\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\nconst DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n};\n// js-docs-end allow-list\n\nconst uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i;\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase();\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue));\n }\n return true;\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp).some(regex => regex.test(attributeName));\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml;\n }\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml);\n }\n const domParser = new window.DOMParser();\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase();\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove();\n continue;\n }\n const attributeList = [].concat(...element.attributes);\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName);\n }\n }\n }\n return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$5 = 'TemplateFactory';\nconst Default$4 = {\n allowList: DefaultAllowlist,\n content: {},\n // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n};\nconst DefaultType$4 = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n};\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n};\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n }\n\n // Getters\n static get Default() {\n return Default$4;\n }\n static get DefaultType() {\n return DefaultType$4;\n }\n static get NAME() {\n return NAME$5;\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content).map(config => this._resolvePossibleFunction(config)).filter(Boolean);\n }\n hasContent() {\n return this.getContent().length > 0;\n }\n changeContent(content) {\n this._checkContent(content);\n this._config.content = {\n ...this._config.content,\n ...content\n };\n return this;\n }\n toHtml() {\n const templateWrapper = document.createElement('div');\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template);\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector);\n }\n const template = templateWrapper.children[0];\n const extraClass = this._resolvePossibleFunction(this._config.extraClass);\n if (extraClass) {\n template.classList.add(...extraClass.split(' '));\n }\n return template;\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config);\n this._checkContent(config.content);\n }\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({\n selector,\n entry: content\n }, DefaultContentType);\n }\n }\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template);\n if (!templateElement) {\n return;\n }\n content = this._resolvePossibleFunction(content);\n if (!content) {\n templateElement.remove();\n return;\n }\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement);\n return;\n }\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content);\n return;\n }\n templateElement.textContent = content;\n }\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this]);\n }\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = '';\n templateElement.append(element);\n return;\n }\n templateElement.textContent = element.textContent;\n }\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$4 = 'tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\nconst EVENT_HIDE$2 = 'hide';\nconst EVENT_HIDDEN$2 = 'hidden';\nconst EVENT_SHOW$2 = 'show';\nconst EVENT_SHOWN$2 = 'shown';\nconst EVENT_INSERTED = 'inserted';\nconst EVENT_CLICK$1 = 'click';\nconst EVENT_FOCUSIN$1 = 'focusin';\nconst EVENT_FOCUSOUT$1 = 'focusout';\nconst EVENT_MOUSEENTER = 'mouseenter';\nconst EVENT_MOUSELEAVE = 'mouseleave';\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' + '
' + '
' + '
',\n title: '',\n trigger: 'hover focus'\n};\nconst DefaultType$3 = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n};\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n }\n super(element, config);\n\n // Private\n this._isEnabled = true;\n this._timeout = 0;\n this._isHovered = null;\n this._activeTrigger = {};\n this._popper = null;\n this._templateFactory = null;\n this._newContent = null;\n\n // Protected\n this.tip = null;\n this._setListeners();\n if (!this._config.selector) {\n this._fixTitle();\n }\n }\n\n // Getters\n static get Default() {\n return Default$3;\n }\n static get DefaultType() {\n return DefaultType$3;\n }\n static get NAME() {\n return NAME$4;\n }\n\n // Public\n enable() {\n this._isEnabled = true;\n }\n disable() {\n this._isEnabled = false;\n }\n toggleEnabled() {\n this._isEnabled = !this._isEnabled;\n }\n toggle() {\n if (!this._isEnabled) {\n return;\n }\n this._activeTrigger.click = !this._activeTrigger.click;\n if (this._isShown()) {\n this._leave();\n return;\n }\n this._enter();\n }\n dispose() {\n clearTimeout(this._timeout);\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'));\n }\n this._disposePopper();\n super.dispose();\n }\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements');\n }\n if (!(this._isWithContent() && this._isEnabled)) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));\n const shadowRoot = findShadowRoot(this._element);\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);\n if (showEvent.defaultPrevented || !isInTheDom) {\n return;\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper();\n const tip = this._getTipElement();\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'));\n const {\n container\n } = this._config;\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip);\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));\n }\n this._popper = this._createPopper(tip);\n tip.classList.add(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop);\n }\n }\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));\n if (this._isHovered === false) {\n this._leave();\n }\n this._isHovered = false;\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n hide() {\n if (!this._isShown()) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));\n if (hideEvent.defaultPrevented) {\n return;\n }\n const tip = this._getTipElement();\n tip.classList.remove(CLASS_NAME_SHOW$2);\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop);\n }\n }\n this._activeTrigger[TRIGGER_CLICK] = false;\n this._activeTrigger[TRIGGER_FOCUS] = false;\n this._activeTrigger[TRIGGER_HOVER] = false;\n this._isHovered = null; // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return;\n }\n if (!this._isHovered) {\n this._disposePopper();\n }\n this._element.removeAttribute('aria-describedby');\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));\n };\n this._queueCallback(complete, this.tip, this._isAnimated());\n }\n update() {\n if (this._popper) {\n this._popper.update();\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle());\n }\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());\n }\n return this.tip;\n }\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml();\n\n // TODO: remove this check in v6\n if (!tip) {\n return null;\n }\n tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`);\n const tipId = getUID(this.constructor.NAME).toString();\n tip.setAttribute('id', tipId);\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE$2);\n }\n return tip;\n }\n setContent(content) {\n this._newContent = content;\n if (this._isShown()) {\n this._disposePopper();\n this.show();\n }\n }\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content);\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n });\n }\n return this._templateFactory;\n }\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n };\n }\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title');\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n }\n _isAnimated() {\n return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);\n }\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);\n }\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element]);\n const attachment = AttachmentMap[placement.toUpperCase()];\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n }\n _getOffset() {\n const {\n offset\n } = this._config;\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10));\n }\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element);\n }\n return offset;\n }\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element]);\n }\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [{\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n }, {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }, {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n }, {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n }, {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement);\n }\n }]\n };\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n };\n }\n _setListeners() {\n const triggers = this._config.trigger.split(' ');\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context.toggle();\n });\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);\n const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n context._enter();\n });\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event);\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n context._leave();\n });\n }\n }\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide();\n }\n };\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n }\n _fixTitle() {\n const title = this._element.getAttribute('title');\n if (!title) {\n return;\n }\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title);\n }\n this._element.setAttribute('data-bs-original-title', title); // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title');\n }\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true;\n return;\n }\n this._isHovered = true;\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show();\n }\n }, this._config.delay.show);\n }\n _leave() {\n if (this._isWithActiveTrigger()) {\n return;\n }\n this._isHovered = false;\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide();\n }\n }, this._config.delay.hide);\n }\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout);\n this._timeout = setTimeout(handler, timeout);\n }\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true);\n }\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element);\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute];\n }\n }\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n };\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container);\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n };\n }\n if (typeof config.title === 'number') {\n config.title = config.title.toString();\n }\n if (typeof config.content === 'number') {\n config.content = config.content.toString();\n }\n return config;\n }\n _getDelegateConfig() {\n const config = {};\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value;\n }\n }\n config.selector = false;\n config.trigger = 'manual';\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config;\n }\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy();\n this._popper = null;\n }\n if (this.tip) {\n this.tip.remove();\n this.tip = null;\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$3 = 'popover';\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\nconst Default$2 = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' + '
' + '

' + '
' + '
',\n trigger: 'click'\n};\nconst DefaultType$2 = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n};\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default$2;\n }\n static get DefaultType() {\n return DefaultType$2;\n }\n static get NAME() {\n return NAME$3;\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent();\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n };\n }\n _getContent() {\n return this._resolvePossibleFunction(this._config.content);\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config]();\n });\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n/**\n * Constants\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_CLICK = `click${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_TARGET_LINKS = '[href]';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst Default$1 = {\n offset: null,\n // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n};\nconst DefaultType$1 = {\n offset: '(number|null)',\n // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n};\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map();\n this._observableSections = new Map();\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element;\n this._activeTarget = null;\n this._observer = null;\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n };\n this.refresh(); // initialize\n }\n\n // Getters\n static get Default() {\n return Default$1;\n }\n static get DefaultType() {\n return DefaultType$1;\n }\n static get NAME() {\n return NAME$2;\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables();\n this._maybeEnableSmoothScroll();\n if (this._observer) {\n this._observer.disconnect();\n } else {\n this._observer = this._getNewObserver();\n }\n for (const section of this._observableSections.values()) {\n this._observer.observe(section);\n }\n }\n dispose() {\n this._observer.disconnect();\n super.dispose();\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body;\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value));\n }\n return config;\n }\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return;\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK);\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash);\n if (observableSection) {\n event.preventDefault();\n const root = this._rootElement || window;\n const height = observableSection.offsetTop - this._element.offsetTop;\n if (root.scrollTo) {\n root.scrollTo({\n top: height,\n behavior: 'smooth'\n });\n return;\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height;\n }\n });\n }\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n };\n return new IntersectionObserver(entries => this._observerCallback(entries), options);\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`);\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop;\n this._process(targetElement(entry));\n };\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\n this._previousScrollData.parentScrollTop = parentScrollTop;\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null;\n this._clearActiveClass(targetElement(entry));\n continue;\n }\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry);\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return;\n }\n continue;\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry);\n }\n }\n }\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map();\n this._observableSections = new Map();\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue;\n }\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element);\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor);\n this._observableSections.set(anchor.hash, observableSection);\n }\n }\n }\n _process(target) {\n if (this._activeTarget === target) {\n return;\n }\n this._clearActiveClass(this._config.target);\n this._activeTarget = target;\n target.classList.add(CLASS_NAME_ACTIVE$1);\n this._activateParents(target);\n EventHandler.trigger(this._element, EVENT_ACTIVATE, {\n relatedTarget: target\n });\n }\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);\n return;\n }\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both