From 789728c0a5f730353c10f7fa45684d565d0d4713 Mon Sep 17 00:00:00 2001 From: Tyler Harter Date: Mon, 3 Jun 2019 14:36:33 -0500 Subject: [PATCH 01/40] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..5ed40d2 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +open-lambda.org \ No newline at end of file From e09f755f8490bf978623e2cff95134143e30f534 Mon Sep 17 00:00:00 2001 From: Tyler Harter Date: Mon, 3 Jun 2019 14:37:36 -0500 Subject: [PATCH 02/40] Delete CNAME --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index 5ed40d2..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -open-lambda.org \ No newline at end of file From a27d137f2ceb5496c114a9f6431503f4b70c1e21 Mon Sep 17 00:00:00 2001 From: Tyler Harter Date: Mon, 3 Jun 2019 14:55:04 -0500 Subject: [PATCH 03/40] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..5ed40d2 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +open-lambda.org \ No newline at end of file From f96be0d59a4a13035e3a03347e61d6cb5c4ad9a6 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Wed, 11 Feb 2026 16:32:14 -0600 Subject: [PATCH 04/40] Add MyST Markdown Jupyter Book site --- .github/.workflow/deploy.yml | 0 .gitignore | 0 README.md | 0 _config.yml | 0 _toc.yml | 0 index.html | 1 - index.md | 65 ++++++++++++++++++++++++++++++++++++ requirements.txt | 0 8 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 .github/.workflow/deploy.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100644 _config.yml create mode 100644 _toc.yml delete mode 100644 index.html create mode 100644 index.md create mode 100644 requirements.txt diff --git a/.github/.workflow/deploy.yml b/.github/.workflow/deploy.yml new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..e69de29 diff --git a/_toc.yml b/_toc.yml new file mode 100644 index 0000000..e69de29 diff --git a/index.html b/index.html deleted file mode 100644 index 557db03..0000000 --- a/index.html +++ /dev/null @@ -1 +0,0 @@ -Hello World diff --git a/index.md b/index.md new file mode 100644 index 0000000..6f7e20c --- /dev/null +++ b/index.md @@ -0,0 +1,65 @@ +--- +myst: + html_meta: + description: "OpenLambda — Apache-licensed serverless computing built on Linux containers" + keywords: "serverless, OpenLambda, Go, Linux containers, cloud computing" +--- + +# OpenLambda + +```{image} https://img.shields.io/badge/License-Apache%202.0-blue.svg +:alt: Apache 2.0 License +:target: https://opensource.org/licenses/Apache-2.0 +``` + +OpenLambda is an **Apache-licensed serverless computing project**, written (mostly) in Go +and based on Linux containers. The primary goal of OpenLambda is to enable exploration of +new approaches to serverless computing. We hope to eventually make it suitable for use in +production as well. + +The main system implemented so far is a **single-node OpenLambda worker** that can take +HTTP requests and invoke lambdas locally to compute responses. + +You can read more about the OpenLambda worker [here](https://github.com/open-lambda/open-lambda/blob/main/docs/worker.md) +or just get started by [deploying a worker](https://github.com/open-lambda/open-lambda/blob/main/docs/quickstart.md). + +```{note} +We are currently working on a **cluster mode**, where a pool of VMs running the worker +service are managed by a centralized OpenLambda boss. With a bit of work, you could also +manually deploy workers yourself and put an HTTP load balancer in front of them. +``` + +--- + +## Related Publications + +```{list-table} +:header-rows: 1 +:widths: 60 30 10 + +* - Title + - Authors + - Venue +* - [**Forklift: Fitting Zygote Trees for Faster Package Initialization**](https://github.com/open-lambda/open-lambda) + - Yang et al. + - WoSC '24 +* - [**SOCK: Rapid Task Provisioning with Serverless-Optimized Containers**](https://www.usenix.org/conference/atc18/presentation/oakes) + - Oakes et al. + - ATC '18 +* - [**Pipsqueak: Lean Lambdas with Large Libraries**](https://github.com/open-lambda/open-lambda) + - Oakes et al. + - ICDCSW '17 +* - [**Serverless Computation with OpenLambda**](https://www.usenix.org/publications/login/fall-2016-vol-41-no-3/hendrickson) + - Hendrickson et al. + - ;login '16 +* - [**Serverless Computation with OpenLambda**](https://www.usenix.org/conference/hotcloud16/workshop-program/presentation/hendrickson) + - Hendrickson et al. + - HotCloud '16 +``` + +--- + +## License + +This project is licensed under the **Apache License** — see the +[LICENSE.md](https://github.com/open-lambda/open-lambda/blob/main/LICENSE) file for details. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29 From 876ad5a396a1dbdc3c33ef3ba91d1f9d694c1981 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Wed, 11 Feb 2026 16:41:25 -0600 Subject: [PATCH 05/40] ADD initial layout using myst markdown for technical documentation --- .github/.workflow/deploy.yml | 54 + .gitignore | 1 + README.md | 84 + _build/.doctrees/README.doctree | Bin 0 -> 16275 bytes _build/.doctrees/environment.pickle | Bin 0 -> 28959 bytes _build/.doctrees/index.doctree | Bin 0 -> 15297 bytes _build/html/.buildinfo | 4 + _build/html/README.html | 543 ++++ _build/html/_sources/README.md | 84 + _build/html/_sources/index.md | 65 + .../html/_sphinx_design_static/design-tabs.js | 101 + .../sphinx-design.min.css | 1 + _build/html/_static/basic.css | 925 ++++++ _build/html/_static/check-solid.svg | 4 + _build/html/_static/clipboard.min.js | 7 + _build/html/_static/copy-button.svg | 5 + _build/html/_static/copybutton.css | 94 + _build/html/_static/copybutton.js | 248 ++ _build/html/_static/copybutton_funcs.js | 73 + _build/html/_static/design-tabs.js | 101 + _build/html/_static/doctools.js | 156 ++ _build/html/_static/documentation_options.js | 13 + _build/html/_static/file.png | Bin 0 -> 286 bytes _build/html/_static/images/logo_binder.svg | 19 + _build/html/_static/images/logo_colab.png | Bin 0 -> 7601 bytes _build/html/_static/images/logo_deepnote.svg | 1 + .../html/_static/images/logo_jupyterhub.svg | 1 + _build/html/_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 -> 1729 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 -> 1365 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 + _build/html/_static/minus.png | Bin 0 -> 90 bytes ...296f466b2cfe2517ffebfabe82451661e28f02.css | 2474 +++++++++++++++++ _build/html/_static/play-solid.svg | 1 + _build/html/_static/plus.png | Bin 0 -> 90 bytes _build/html/_static/pygments.css | 152 + _build/html/_static/sbt-webpack-macros.html | 11 + _build/html/_static/scripts/bootstrap.js | 3 + .../_static/scripts/bootstrap.js.LICENSE.txt | 5 + _build/html/_static/scripts/bootstrap.js.map | 1 + .../_static/scripts/pydata-sphinx-theme.js | 2 + .../scripts/pydata-sphinx-theme.js.map | 1 + .../html/_static/scripts/sphinx-book-theme.js | 2 + .../_static/scripts/sphinx-book-theme.js.map | 1 + _build/html/_static/searchtools.js | 620 +++++ _build/html/_static/sphinx-design.min.css | 1 + _build/html/_static/sphinx-thebe.css | 129 + _build/html/_static/sphinx-thebe.js | 127 + _build/html/_static/sphinx_highlight.js | 154 + _build/html/_static/styles/bootstrap.css | 6 + _build/html/_static/styles/bootstrap.css.map | 1 + .../_static/styles/pydata-sphinx-theme.css | 2 + .../styles/pydata-sphinx-theme.css.map | 1 + .../html/_static/styles/sphinx-book-theme.css | 19 + .../_static/styles/sphinx-book-theme.css.map | 1 + _build/html/_static/styles/theme.css | 2 + _build/html/_static/togglebutton.css | 160 ++ _build/html/_static/togglebutton.js | 187 ++ .../vendor/fontawesome/6.5.2/LICENSE.txt | 165 ++ .../vendor/fontawesome/6.5.2/css/all.min.css | 5 + .../vendor/fontawesome/6.5.2/js/all.min.js | 2 + .../6.5.2/js/all.min.js.LICENSE.txt | 5 + .../6.5.2/webfonts/fa-brands-400.ttf | Bin 0 -> 209128 bytes .../6.5.2/webfonts/fa-brands-400.woff2 | Bin 0 -> 117852 bytes .../6.5.2/webfonts/fa-regular-400.ttf | Bin 0 -> 67860 bytes .../6.5.2/webfonts/fa-regular-400.woff2 | Bin 0 -> 25392 bytes .../6.5.2/webfonts/fa-solid-900.ttf | Bin 0 -> 420332 bytes .../6.5.2/webfonts/fa-solid-900.woff2 | Bin 0 -> 156400 bytes .../6.5.2/webfonts/fa-v4compatibility.ttf | Bin 0 -> 10832 bytes .../6.5.2/webfonts/fa-v4compatibility.woff2 | Bin 0 -> 4792 bytes _build/html/_static/webpack-macros.html | 31 + _build/html/genindex.html | 389 +++ _build/html/index.html | 497 ++++ _build/html/objects.inv | Bin 0 -> 295 bytes _build/html/search.html | 401 +++ _build/html/searchindex.js | 1 + _config.yml | 57 + _toc.yml | 5 + requirements.txt | 4 + 166 files changed, 11699 insertions(+) create mode 100644 _build/.doctrees/README.doctree create mode 100644 _build/.doctrees/environment.pickle create mode 100644 _build/.doctrees/index.doctree create mode 100644 _build/html/.buildinfo create mode 100644 _build/html/README.html create mode 100644 _build/html/_sources/README.md create mode 100644 _build/html/_sources/index.md create mode 100644 _build/html/_sphinx_design_static/design-tabs.js create mode 100644 _build/html/_sphinx_design_static/sphinx-design.min.css create mode 100644 _build/html/_static/basic.css create mode 100644 _build/html/_static/check-solid.svg create mode 100644 _build/html/_static/clipboard.min.js create mode 100644 _build/html/_static/copy-button.svg create mode 100644 _build/html/_static/copybutton.css create mode 100644 _build/html/_static/copybutton.js create mode 100644 _build/html/_static/copybutton_funcs.js create mode 100644 _build/html/_static/design-tabs.js create mode 100644 _build/html/_static/doctools.js create mode 100644 _build/html/_static/documentation_options.js create mode 100644 _build/html/_static/file.png create mode 100644 _build/html/_static/images/logo_binder.svg create mode 100644 _build/html/_static/images/logo_colab.png create mode 100644 _build/html/_static/images/logo_deepnote.svg create mode 100644 _build/html/_static/images/logo_jupyterhub.svg create mode 100644 _build/html/_static/language_data.js create mode 100644 _build/html/_static/locales/ar/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ar/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/bg/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/bg/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/bn/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/bn/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ca/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ca/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/cs/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/cs/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/da/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/da/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/de/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/de/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/el/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/el/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/eo/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/eo/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/es/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/es/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/et/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/et/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/fi/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/fi/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/fr/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/fr/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/hr/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/hr/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/id/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/id/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/it/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/it/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/iw/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/iw/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ja/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ja/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ko/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ko/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/lt/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/lt/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/lv/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/lv/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ml/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ml/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/mr/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/mr/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ms/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ms/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/nl/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/nl/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/no/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/no/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/pl/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/pl/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/pt/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/pt/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ro/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ro/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ru/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ru/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/sk/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/sk/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/sl/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/sl/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/sr/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/sr/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/sv/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/sv/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ta/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ta/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/te/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/te/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/tg/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/tg/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/th/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/th/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/tl/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/tl/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/tr/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/tr/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/uk/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/uk/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/ur/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/ur/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/vi/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/vi/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.mo create mode 100644 _build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po create mode 100644 _build/html/_static/minus.png create mode 100644 _build/html/_static/mystnb.8ecb98da25f57f5357bf6f572d296f466b2cfe2517ffebfabe82451661e28f02.css create mode 100644 _build/html/_static/play-solid.svg create mode 100644 _build/html/_static/plus.png create mode 100644 _build/html/_static/pygments.css create mode 100644 _build/html/_static/sbt-webpack-macros.html create mode 100644 _build/html/_static/scripts/bootstrap.js create mode 100644 _build/html/_static/scripts/bootstrap.js.LICENSE.txt create mode 100644 _build/html/_static/scripts/bootstrap.js.map create mode 100644 _build/html/_static/scripts/pydata-sphinx-theme.js create mode 100644 _build/html/_static/scripts/pydata-sphinx-theme.js.map create mode 100644 _build/html/_static/scripts/sphinx-book-theme.js create mode 100644 _build/html/_static/scripts/sphinx-book-theme.js.map create mode 100644 _build/html/_static/searchtools.js create mode 100644 _build/html/_static/sphinx-design.min.css create mode 100644 _build/html/_static/sphinx-thebe.css create mode 100644 _build/html/_static/sphinx-thebe.js create mode 100644 _build/html/_static/sphinx_highlight.js create mode 100644 _build/html/_static/styles/bootstrap.css create mode 100644 _build/html/_static/styles/bootstrap.css.map create mode 100644 _build/html/_static/styles/pydata-sphinx-theme.css create mode 100644 _build/html/_static/styles/pydata-sphinx-theme.css.map create mode 100644 _build/html/_static/styles/sphinx-book-theme.css create mode 100644 _build/html/_static/styles/sphinx-book-theme.css.map create mode 100644 _build/html/_static/styles/theme.css create mode 100644 _build/html/_static/togglebutton.css create mode 100644 _build/html/_static/togglebutton.js create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/LICENSE.txt create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/css/all.min.css create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/js/all.min.js create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/js/all.min.js.LICENSE.txt create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.ttf create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2 create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.ttf create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2 create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.ttf create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2 create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/webfonts/fa-v4compatibility.ttf create mode 100644 _build/html/_static/vendor/fontawesome/6.5.2/webfonts/fa-v4compatibility.woff2 create mode 100644 _build/html/_static/webpack-macros.html create mode 100644 _build/html/genindex.html create mode 100644 _build/html/index.html create mode 100644 _build/html/objects.inv create mode 100644 _build/html/search.html create mode 100644 _build/html/searchindex.js diff --git a/.github/.workflow/deploy.yml b/.github/.workflow/deploy.yml index e69de29..5eb4a97 100644 --- a/.github/.workflow/deploy.yml +++ b/.github/.workflow/deploy.yml @@ -0,0 +1,54 @@ +name: Deploy MyST Book to GitHub Pages + +on: + # Trigger on every push to main + push: + branches: ["main"] + # Allow manual triggers from the Actions tab + workflow_dispatch: + +# Sets permissions so the workflow can deploy to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Only allow one concurrent deployment; cancel in-flight runs +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Python 3.11 + uses: actions/setup-python@v5 + with: + python-version: "3.11" + cache: "pip" + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Build Jupyter Book (MyST Markdown → HTML) + run: jupyter-book build . --all + + - name: Upload artifact for Pages + uses: actions/upload-pages-artifact@v3 + with: + path: "./_build/html" + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.gitignore b/.gitignore index e69de29..9f11b75 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/README.md b/README.md index e69de29..7fa4e0f 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,84 @@ +# OpenLambda GitHub Pages — MyST Markdown Site + +This repo deploys automatically to GitHub Pages using [Jupyter Book](https://jupyterbook.org) +with [MyST Markdown](https://myst-parser.readthedocs.io/). + +--- + +## File Structure + +``` +. +├── index.md ← Homepage content (MyST Markdown) +├── _config.yml ← Jupyter Book site settings +├── _toc.yml ← Table of contents (add more pages here) +├── requirements.txt ← Python deps for the build +├── .gitignore +└── .github/ + └── workflows/ + └── deploy.yml ← GitHub Actions auto-deploy workflow +``` + +--- + +## One-Time Setup (do this once per repo) + +### 1. Clone the repo and copy these files in + +```bash +git clone https://github.com/open-lambda/open-lambda.github.io.git +cd open-lambda.github.io + +# Copy all files from this bundle into the repo root, then: +git add . +git commit -m "Add MyST Markdown Jupyter Book site" +git push +``` + +### 2. Enable GitHub Pages with GitHub Actions as the source + +Go to the repo on GitHub: + +1. **Settings** → **Pages** (left sidebar) +2. Under **Source**, select **GitHub Actions** (not "Deploy from a branch") +3. Save + +That's it. Every push to `main` will now rebuild and redeploy the site automatically. + +--- + +## Local Preview + +```bash +pip install -r requirements.txt +jupyter-book build . +# Open in browser: +open _build/html/index.html +``` + +--- + +## Adding More Pages + +1. Create a new `.md` file, e.g. `worker.md` +2. Add it to `_toc.yml`: + +```yaml +format: jb-book +root: index +chapters: + - file: worker +``` + +3. Push — the site rebuilds automatically. + +--- + +## Troubleshooting + +| Problem | Fix | +|---|---| +| Build fails: `jupyter-book not found` | Make sure `requirements.txt` lists `jupyter-book>=1.0.0` | +| Pages shows 404 | Confirm **Settings → Pages → Source** is set to **GitHub Actions** | +| Old content still showing | Hard-refresh browser (`Ctrl+Shift+R`) or wait ~1 min for CDN | +| Action fails with permissions error | Go to **Settings → Actions → General → Workflow permissions** and enable "Read and write permissions" | \ No newline at end of file diff --git a/_build/.doctrees/README.doctree b/_build/.doctrees/README.doctree new file mode 100644 index 0000000000000000000000000000000000000000..043e5092073c2bbb491d05899f799f3ea693c705 GIT binary patch literal 16275 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 literal 0 HcmV?d00001 diff --git a/_build/.doctrees/index.doctree b/_build/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..911d8590fc03bb82b58797e95a86a6c6cae9014f GIT binary patch literal 15297 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 H(dhpI6;T@} literal 0 HcmV?d00001 diff --git a/_build/html/.buildinfo b/_build/html/.buildinfo new file mode 100644 index 0000000..8d82e6d --- /dev/null +++ b/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 00f39c391346115ca176ede8239be645 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/README.html b/_build/html/README.html new file mode 100644 index 0000000..da80145 --- /dev/null +++ b/_build/html/README.html @@ -0,0 +1,543 @@ + + + + + + + + + + + OpenLambda GitHub Pages — MyST Markdown Site — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

OpenLambda GitHub Pages — MyST Markdown Site#

+

This repo deploys automatically to GitHub Pages using Jupyter Book +with MyST Markdown.

+
+
+

File Structure#

+
.
+├── index.md                        ← Homepage content (MyST Markdown)
+├── _config.yml                     ← Jupyter Book site settings
+├── _toc.yml                        ← Table of contents (add more pages here)
+├── requirements.txt                ← Python deps for the build
+├── .gitignore
+└── .github/
+    └── workflows/
+        └── deploy.yml              ← GitHub Actions auto-deploy workflow
+
+
+
+
+
+

One-Time Setup (do this once per repo)#

+
+

1. Clone the repo and copy these files in#

+
git clone https://github.com/open-lambda/open-lambda.github.io.git
+cd open-lambda.github.io
+
+# Copy all files from this bundle into the repo root, then:
+git add .
+git commit -m "Add MyST Markdown Jupyter Book site"
+git push
+
+
+
+
+

2. Enable GitHub Pages with GitHub Actions as the source#

+

Go to the repo on GitHub:

+
    +
  1. SettingsPages (left sidebar)

  2. +
  3. Under Source, select GitHub Actions (not “Deploy from a branch”)

  4. +
  5. Save

  6. +
+

That’s it. Every push to main will now rebuild and redeploy the site automatically.

+
+
+
+
+

Local Preview#

+
pip install -r requirements.txt
+jupyter-book build .
+# Open in browser:
+open _build/html/index.html
+
+
+
+
+
+

Adding More Pages#

+
    +
  1. Create a new .md file, e.g. worker.md

  2. +
  3. Add it to _toc.yml:

  4. +
+
format: jb-book
+root: index
+chapters:
+  - file: worker
+
+
+
    +
  1. Push — the site rebuilds automatically.

  2. +
+
+
+
+

Troubleshooting#

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

Problem

Fix

Build fails: jupyter-book not found

Make sure requirements.txt lists jupyter-book>=1.0.0

Pages shows 404

Confirm Settings → Pages → Source is set to GitHub Actions

Old content still showing

Hard-refresh browser (Ctrl+Shift+R) or wait ~1 min for CDN

Action fails with permissions error

Go to Settings → Actions → General → Workflow permissions and enable “Read and write permissions”

+
+
+
+ + + + +
+ + + + + + +
+ +
+
+
+ +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/_sources/README.md b/_build/html/_sources/README.md new file mode 100644 index 0000000..7fa4e0f --- /dev/null +++ b/_build/html/_sources/README.md @@ -0,0 +1,84 @@ +# OpenLambda GitHub Pages — MyST Markdown Site + +This repo deploys automatically to GitHub Pages using [Jupyter Book](https://jupyterbook.org) +with [MyST Markdown](https://myst-parser.readthedocs.io/). + +--- + +## File Structure + +``` +. +├── index.md ← Homepage content (MyST Markdown) +├── _config.yml ← Jupyter Book site settings +├── _toc.yml ← Table of contents (add more pages here) +├── requirements.txt ← Python deps for the build +├── .gitignore +└── .github/ + └── workflows/ + └── deploy.yml ← GitHub Actions auto-deploy workflow +``` + +--- + +## One-Time Setup (do this once per repo) + +### 1. Clone the repo and copy these files in + +```bash +git clone https://github.com/open-lambda/open-lambda.github.io.git +cd open-lambda.github.io + +# Copy all files from this bundle into the repo root, then: +git add . +git commit -m "Add MyST Markdown Jupyter Book site" +git push +``` + +### 2. Enable GitHub Pages with GitHub Actions as the source + +Go to the repo on GitHub: + +1. **Settings** → **Pages** (left sidebar) +2. Under **Source**, select **GitHub Actions** (not "Deploy from a branch") +3. Save + +That's it. Every push to `main` will now rebuild and redeploy the site automatically. + +--- + +## Local Preview + +```bash +pip install -r requirements.txt +jupyter-book build . +# Open in browser: +open _build/html/index.html +``` + +--- + +## Adding More Pages + +1. Create a new `.md` file, e.g. `worker.md` +2. Add it to `_toc.yml`: + +```yaml +format: jb-book +root: index +chapters: + - file: worker +``` + +3. Push — the site rebuilds automatically. + +--- + +## Troubleshooting + +| Problem | Fix | +|---|---| +| Build fails: `jupyter-book not found` | Make sure `requirements.txt` lists `jupyter-book>=1.0.0` | +| Pages shows 404 | Confirm **Settings → Pages → Source** is set to **GitHub Actions** | +| Old content still showing | Hard-refresh browser (`Ctrl+Shift+R`) or wait ~1 min for CDN | +| Action fails with permissions error | Go to **Settings → Actions → General → Workflow permissions** and enable "Read and write permissions" | \ No newline at end of file diff --git a/_build/html/_sources/index.md b/_build/html/_sources/index.md new file mode 100644 index 0000000..6f7e20c --- /dev/null +++ b/_build/html/_sources/index.md @@ -0,0 +1,65 @@ +--- +myst: + html_meta: + description: "OpenLambda — Apache-licensed serverless computing built on Linux containers" + keywords: "serverless, OpenLambda, Go, Linux containers, cloud computing" +--- + +# OpenLambda + +```{image} https://img.shields.io/badge/License-Apache%202.0-blue.svg +:alt: Apache 2.0 License +:target: https://opensource.org/licenses/Apache-2.0 +``` + +OpenLambda is an **Apache-licensed serverless computing project**, written (mostly) in Go +and based on Linux containers. The primary goal of OpenLambda is to enable exploration of +new approaches to serverless computing. We hope to eventually make it suitable for use in +production as well. + +The main system implemented so far is a **single-node OpenLambda worker** that can take +HTTP requests and invoke lambdas locally to compute responses. + +You can read more about the OpenLambda worker [here](https://github.com/open-lambda/open-lambda/blob/main/docs/worker.md) +or just get started by [deploying a worker](https://github.com/open-lambda/open-lambda/blob/main/docs/quickstart.md). + +```{note} +We are currently working on a **cluster mode**, where a pool of VMs running the worker +service are managed by a centralized OpenLambda boss. With a bit of work, you could also +manually deploy workers yourself and put an HTTP load balancer in front of them. +``` + +--- + +## Related Publications + +```{list-table} +:header-rows: 1 +:widths: 60 30 10 + +* - Title + - Authors + - Venue +* - [**Forklift: Fitting Zygote Trees for Faster Package Initialization**](https://github.com/open-lambda/open-lambda) + - Yang et al. + - WoSC '24 +* - [**SOCK: Rapid Task Provisioning with Serverless-Optimized Containers**](https://www.usenix.org/conference/atc18/presentation/oakes) + - Oakes et al. + - ATC '18 +* - [**Pipsqueak: Lean Lambdas with Large Libraries**](https://github.com/open-lambda/open-lambda) + - Oakes et al. + - ICDCSW '17 +* - [**Serverless Computation with OpenLambda**](https://www.usenix.org/publications/login/fall-2016-vol-41-no-3/hendrickson) + - Hendrickson et al. + - ;login '16 +* - [**Serverless Computation with OpenLambda**](https://www.usenix.org/conference/hotcloud16/workshop-program/presentation/hendrickson) + - Hendrickson et al. + - HotCloud '16 +``` + +--- + +## License + +This project is licensed under the **Apache License** — see the +[LICENSE.md](https://github.com/open-lambda/open-lambda/blob/main/LICENSE) file for details. \ No newline at end of file diff --git a/_build/html/_sphinx_design_static/design-tabs.js b/_build/html/_sphinx_design_static/design-tabs.js new file mode 100644 index 0000000..b25bd6a --- /dev/null +++ b/_build/html/_sphinx_design_static/design-tabs.js @@ -0,0 +1,101 @@ +// @ts-check + +// Extra JS capability for selected tabs to be synced +// The selection is stored in local storage so that it persists across page loads. + +/** + * @type {Record} + */ +let sd_id_to_elements = {}; +const storageKeyPrefix = "sphinx-design-tab-id-"; + +/** + * Create a key for a tab element. + * @param {HTMLElement} el - The tab element. + * @returns {[string, string, string] | null} - The key. + * + */ +function create_key(el) { + let syncId = el.getAttribute("data-sync-id"); + let syncGroup = el.getAttribute("data-sync-group"); + if (!syncId || !syncGroup) return null; + return [syncGroup, syncId, syncGroup + "--" + syncId]; +} + +/** + * Initialize the tab selection. + * + */ +function ready() { + // Find all tabs with sync data + + /** @type {string[]} */ + let groups = []; + + document.querySelectorAll(".sd-tab-label").forEach((label) => { + if (label instanceof HTMLElement) { + let data = create_key(label); + if (data) { + let [group, id, key] = data; + + // add click event listener + // @ts-ignore + label.onclick = onSDLabelClick; + + // store map of key to elements + if (!sd_id_to_elements[key]) { + sd_id_to_elements[key] = []; + } + sd_id_to_elements[key].push(label); + + if (groups.indexOf(group) === -1) { + groups.push(group); + // Check if a specific tab has been selected via URL parameter + const tabParam = new URLSearchParams(window.location.search).get( + group + ); + if (tabParam) { + console.log( + "sphinx-design: Selecting tab id for group '" + + group + + "' from URL parameter: " + + tabParam + ); + window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); + } + } + + // Check is a specific tab has been selected previously + let previousId = window.sessionStorage.getItem( + storageKeyPrefix + group + ); + if (previousId === id) { + // console.log( + // "sphinx-design: Selecting tab from session storage: " + id + // ); + // @ts-ignore + label.previousElementSibling.checked = true; + } + } + } + }); +} + +/** + * Activate other tabs with the same sync id. + * + * @this {HTMLElement} - The element that was clicked. + */ +function onSDLabelClick() { + let data = create_key(this); + if (!data) return; + let [group, id, key] = data; + for (const label of sd_id_to_elements[key]) { + if (label === this) continue; + // @ts-ignore + label.previousElementSibling.checked = true; + } + window.sessionStorage.setItem(storageKeyPrefix + group, id); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/_build/html/_sphinx_design_static/sphinx-design.min.css b/_build/html/_sphinx_design_static/sphinx-design.min.css new file mode 100644 index 0000000..860c36d --- /dev/null +++ b/_build/html/_sphinx_design_static/sphinx-design.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em .6em .5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} diff --git a/_build/html/_static/basic.css b/_build/html/_static/basic.css new file mode 100644 index 0000000..2af6139 --- /dev/null +++ b/_build/html/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 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; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_build/html/_static/check-solid.svg b/_build/html/_static/check-solid.svg new file mode 100644 index 0000000..92fad4b --- /dev/null +++ b/_build/html/_static/check-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/_build/html/_static/clipboard.min.js b/_build/html/_static/clipboard.min.js new file mode 100644 index 0000000..54b3c46 --- /dev/null +++ b/_build/html/_static/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 + + + + diff --git a/_build/html/_static/copybutton.css b/_build/html/_static/copybutton.css new file mode 100644 index 0000000..f1916ec --- /dev/null +++ b/_build/html/_static/copybutton.css @@ -0,0 +1,94 @@ +/* Copy buttons */ +button.copybtn { + position: absolute; + display: flex; + top: .3em; + right: .3em; + width: 1.7em; + height: 1.7em; + opacity: 0; + transition: opacity 0.3s, border .3s, background-color .3s; + user-select: none; + padding: 0; + border: none; + outline: none; + border-radius: 0.4em; + /* The colors that GitHub uses */ + border: #1b1f2426 1px solid; + background-color: #f6f8fa; + color: #57606a; +} + +button.copybtn.success { + border-color: #22863a; + color: #22863a; +} + +button.copybtn svg { + stroke: currentColor; + width: 1.5em; + height: 1.5em; + padding: 0.1em; +} + +div.highlight { + position: relative; +} + +/* Show the copybutton */ +.highlight:hover button.copybtn, button.copybtn.success { + opacity: 1; +} + +.highlight button.copybtn:hover { + background-color: rgb(235, 235, 235); +} + +.highlight button.copybtn:active { + background-color: rgb(187, 187, 187); +} + +/** + * A minimal CSS-only tooltip copied from: + * https://codepen.io/mildrenben/pen/rVBrpK + * + * To use, write HTML like the following: + * + *

Short

+ */ + .o-tooltip--left { + position: relative; + } + + .o-tooltip--left:after { + opacity: 0; + visibility: hidden; + position: absolute; + content: attr(data-tooltip); + padding: .2em; + font-size: .8em; + left: -.2em; + background: grey; + color: white; + white-space: nowrap; + z-index: 2; + border-radius: 2px; + transform: translateX(-102%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); +} + +.o-tooltip--left:hover:after { + display: block; + opacity: 1; + visibility: visible; + transform: translateX(-100%) translateY(0); + transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); + transition-delay: .5s; +} + +/* By default the copy button shouldn't show up when printing a page */ +@media print { + button.copybtn { + display: none; + } +} diff --git a/_build/html/_static/copybutton.js b/_build/html/_static/copybutton.js new file mode 100644 index 0000000..2ea7ff3 --- /dev/null +++ b/_build/html/_static/copybutton.js @@ -0,0 +1,248 @@ +// Localization support +const messages = { + 'en': { + 'copy': 'Copy', + 'copy_to_clipboard': 'Copy to clipboard', + 'copy_success': 'Copied!', + 'copy_failure': 'Failed to copy', + }, + 'es' : { + 'copy': 'Copiar', + 'copy_to_clipboard': 'Copiar al portapapeles', + 'copy_success': '¡Copiado!', + 'copy_failure': 'Error al copiar', + }, + 'de' : { + 'copy': 'Kopieren', + 'copy_to_clipboard': 'In die Zwischenablage kopieren', + 'copy_success': 'Kopiert!', + 'copy_failure': 'Fehler beim Kopieren', + }, + 'fr' : { + 'copy': 'Copier', + 'copy_to_clipboard': 'Copier dans le presse-papier', + 'copy_success': 'Copié !', + 'copy_failure': 'Échec de la copie', + }, + 'ru': { + 'copy': 'Скопировать', + 'copy_to_clipboard': 'Скопировать в буфер', + 'copy_success': 'Скопировано!', + 'copy_failure': 'Не удалось скопировать', + }, + 'zh-CN': { + 'copy': '复制', + 'copy_to_clipboard': '复制到剪贴板', + 'copy_success': '复制成功!', + 'copy_failure': '复制失败', + }, + 'it' : { + 'copy': 'Copiare', + 'copy_to_clipboard': 'Copiato negli appunti', + 'copy_success': 'Copiato!', + 'copy_failure': 'Errore durante la copia', + } +} + +let locale = 'en' +if( document.documentElement.lang !== undefined + && messages[document.documentElement.lang] !== undefined ) { + locale = document.documentElement.lang +} + +let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; +if (doc_url_root == '#') { + doc_url_root = ''; +} + +/** + * SVG files for our copy buttons + */ +let iconCheck = ` + ${messages[locale]['copy_success']} + + +` + +// If the user specified their own SVG use that, otherwise use the default +let iconCopy = ``; +if (!iconCopy) { + iconCopy = ` + ${messages[locale]['copy_to_clipboard']} + + + +` +} + +/** + * Set up copy/paste for code blocks + */ + +const runWhenDOMLoaded = cb => { + if (document.readyState != 'loading') { + cb() + } else if (document.addEventListener) { + document.addEventListener('DOMContentLoaded', cb) + } else { + document.attachEvent('onreadystatechange', function() { + if (document.readyState == 'complete') cb() + }) + } +} + +const codeCellId = index => `codecell${index}` + +// Clears selected text since ClipboardJS will select the text when copying +const clearSelection = () => { + if (window.getSelection) { + window.getSelection().removeAllRanges() + } else if (document.selection) { + document.selection.empty() + } +} + +// Changes tooltip text for a moment, then changes it back +// We want the timeout of our `success` class to be a bit shorter than the +// tooltip and icon change, so that we can hide the icon before changing back. +var timeoutIcon = 2000; +var timeoutSuccessClass = 1500; + +const temporarilyChangeTooltip = (el, oldText, newText) => { + el.setAttribute('data-tooltip', newText) + el.classList.add('success') + // Remove success a little bit sooner than we change the tooltip + // So that we can use CSS to hide the copybutton first + setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) + setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) +} + +// Changes the copy button icon for two seconds, then changes it back +const temporarilyChangeIcon = (el) => { + el.innerHTML = iconCheck; + setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) +} + +const addCopyButtonToCodeCells = () => { + // If ClipboardJS hasn't loaded, wait a bit and try again. This + // happens because we load ClipboardJS asynchronously. + if (window.ClipboardJS === undefined) { + setTimeout(addCopyButtonToCodeCells, 250) + return + } + + // Add copybuttons to all of our code cells + const COPYBUTTON_SELECTOR = 'div.highlight pre'; + const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) + codeCells.forEach((codeCell, index) => { + const id = codeCellId(index) + codeCell.setAttribute('id', id) + + const clipboardButton = id => + `` + codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) + }) + +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} + + +var copyTargetText = (trigger) => { + var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); + + // get filtered text + let exclude = '.linenos'; + + let text = filterText(target, exclude); + return formatCopyText(text, '', false, true, true, true, '', '') +} + + // Initialize with a callback so we can modify the text before copy + const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) + + // Update UI with error/success messages + clipboard.on('success', event => { + clearSelection() + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) + temporarilyChangeIcon(event.trigger) + }) + + clipboard.on('error', event => { + temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) + }) +} + +runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/_build/html/_static/copybutton_funcs.js b/_build/html/_static/copybutton_funcs.js new file mode 100644 index 0000000..dbe1aaa --- /dev/null +++ b/_build/html/_static/copybutton_funcs.js @@ -0,0 +1,73 @@ +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string +} + +/** + * Removes excluded text from a Node. + * + * @param {Node} target Node to filter. + * @param {string} exclude CSS selector of nodes to exclude. + * @returns {DOMString} Text from `target` with text removed. + */ +export function filterText(target, exclude) { + const clone = target.cloneNode(true); // clone as to not modify the live DOM + if (exclude) { + // remove excluded nodes + clone.querySelectorAll(exclude).forEach(node => node.remove()); + } + return clone.innerText; +} + +// Callback when a copy button is clicked. Will be passed the node that was clicked +// should then grab the text and replace pieces of text that shouldn't be used in output +export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { + var regexp; + var match; + + // Do we check for line continuation characters and "HERE-documents"? + var useLineCont = !!lineContinuationChar + var useHereDoc = !!hereDocDelim + + // create regexp to capture prompt and remaining line + if (isRegexp) { + regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') + } else { + regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') + } + + const outputLines = []; + var promptFound = false; + var gotLineCont = false; + var gotHereDoc = false; + const lineGotPrompt = []; + for (const line of textContent.split('\n')) { + match = line.match(regexp) + if (match || gotLineCont || gotHereDoc) { + promptFound = regexp.test(line) + lineGotPrompt.push(promptFound) + if (removePrompts && promptFound) { + outputLines.push(match[2]) + } else { + outputLines.push(line) + } + gotLineCont = line.endsWith(lineContinuationChar) & useLineCont + if (line.includes(hereDocDelim) & useHereDoc) + gotHereDoc = !gotHereDoc + } else if (!onlyCopyPromptLines) { + outputLines.push(line) + } else if (copyEmptyLines && line.trim() === '') { + outputLines.push(line) + } + } + + // If no lines with the prompt were found then just use original lines + if (lineGotPrompt.some(v => v === true)) { + textContent = outputLines.join('\n'); + } + + // Remove a trailing newline to avoid auto-running when pasting + if (textContent.endsWith("\n")) { + textContent = textContent.slice(0, -1) + } + return textContent +} diff --git a/_build/html/_static/design-tabs.js b/_build/html/_static/design-tabs.js new file mode 100644 index 0000000..b25bd6a --- /dev/null +++ b/_build/html/_static/design-tabs.js @@ -0,0 +1,101 @@ +// @ts-check + +// Extra JS capability for selected tabs to be synced +// The selection is stored in local storage so that it persists across page loads. + +/** + * @type {Record} + */ +let sd_id_to_elements = {}; +const storageKeyPrefix = "sphinx-design-tab-id-"; + +/** + * Create a key for a tab element. + * @param {HTMLElement} el - The tab element. + * @returns {[string, string, string] | null} - The key. + * + */ +function create_key(el) { + let syncId = el.getAttribute("data-sync-id"); + let syncGroup = el.getAttribute("data-sync-group"); + if (!syncId || !syncGroup) return null; + return [syncGroup, syncId, syncGroup + "--" + syncId]; +} + +/** + * Initialize the tab selection. + * + */ +function ready() { + // Find all tabs with sync data + + /** @type {string[]} */ + let groups = []; + + document.querySelectorAll(".sd-tab-label").forEach((label) => { + if (label instanceof HTMLElement) { + let data = create_key(label); + if (data) { + let [group, id, key] = data; + + // add click event listener + // @ts-ignore + label.onclick = onSDLabelClick; + + // store map of key to elements + if (!sd_id_to_elements[key]) { + sd_id_to_elements[key] = []; + } + sd_id_to_elements[key].push(label); + + if (groups.indexOf(group) === -1) { + groups.push(group); + // Check if a specific tab has been selected via URL parameter + const tabParam = new URLSearchParams(window.location.search).get( + group + ); + if (tabParam) { + console.log( + "sphinx-design: Selecting tab id for group '" + + group + + "' from URL parameter: " + + tabParam + ); + window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); + } + } + + // Check is a specific tab has been selected previously + let previousId = window.sessionStorage.getItem( + storageKeyPrefix + group + ); + if (previousId === id) { + // console.log( + // "sphinx-design: Selecting tab from session storage: " + id + // ); + // @ts-ignore + label.previousElementSibling.checked = true; + } + } + } + }); +} + +/** + * Activate other tabs with the same sync id. + * + * @this {HTMLElement} - The element that was clicked. + */ +function onSDLabelClick() { + let data = create_key(this); + if (!data) return; + let [group, id, key] = data; + for (const label of sd_id_to_elements[key]) { + if (label === this) continue; + // @ts-ignore + label.previousElementSibling.checked = true; + } + window.sessionStorage.setItem(storageKeyPrefix + group, id); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/_build/html/_static/doctools.js b/_build/html/_static/doctools.js new file mode 100644 index 0000000..4d67807 --- /dev/null +++ b/_build/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 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/_build/html/_static/documentation_options.js b/_build/html/_static/documentation_options.js new file mode 100644 index 0000000..dab586c --- /dev/null +++ b/_build/html/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_build/html/_static/file.png b/_build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/_build/html/_static/images/logo_binder.svg b/_build/html/_static/images/logo_binder.svg new file mode 100644 index 0000000..45fecf7 --- /dev/null +++ b/_build/html/_static/images/logo_binder.svg @@ -0,0 +1,19 @@ + + + + +logo + + + + + + + + diff --git a/_build/html/_static/images/logo_colab.png b/_build/html/_static/images/logo_colab.png new file mode 100644 index 0000000000000000000000000000000000000000..b7560ec216b2d1b6f77855525fe966c741833428 GIT binary patch literal 7601 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 diff --git a/_build/html/_static/images/logo_jupyterhub.svg b/_build/html/_static/images/logo_jupyterhub.svg new file mode 100644 index 0000000..60cfe9f --- /dev/null +++ b/_build/html/_static/images/logo_jupyterhub.svg @@ -0,0 +1 @@ +logo_jupyterhubHub diff --git a/_build/html/_static/language_data.js b/_build/html/_static/language_data.js new file mode 100644 index 0000000..367b8ed --- /dev/null +++ b/_build/html/_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-2024 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, if available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_build/html/_static/locales/ar/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/ar/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/ar/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..066f20f --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "بواسطة" + +msgid "By" +msgstr "بواسطة" + +msgid "Contents" +msgstr "محتويات" + +msgid "Copyright" +msgstr "حقوق النشر" + +msgid "Download notebook file" +msgstr "تنزيل ملف دفتر الملاحظات" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" + +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" + +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" + +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Launch" +msgstr "إطلاق" + +msgid "Open an issue" +msgstr "افتح قضية" + +msgid "Print to PDF" +msgstr "طباعة إلى PDF" + +msgid "Source repository" +msgstr "مستودع المصدر" + +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" + +msgid "Theme by the" +msgstr "موضوع بواسطة" + +msgid "Toggle navigation" +msgstr "تبديل التنقل" + +msgid "next page" +msgstr "الصفحة التالية" + +msgid "open issue" +msgstr "قضية مفتوحة" + +msgid "previous page" +msgstr "الصفحة السابقة" + +msgid "repository" +msgstr "مخزن" + +msgid "suggest edit" +msgstr "أقترح تحرير" diff --git a/_build/html/_static/locales/bg/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/bg/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/bg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..0f22f49 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "По" + +msgid "By" +msgstr "От" + +msgid "Contents" +msgstr "Съдържание" + +msgid "Copyright" +msgstr "Авторско право" + +msgid "Download notebook file" +msgstr "Изтеглете файла на бележника" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "Download this page" +msgstr "Изтеглете тази страница" + +msgid "Edit this page" +msgstr "Редактирайте тази страница" + +msgid "Fullscreen mode" +msgstr "Режим на цял екран" + +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Launch" +msgstr "Стартиране" + +msgid "Open an issue" +msgstr "Отворете проблем" + +msgid "Print to PDF" +msgstr "Печат в PDF" + +msgid "Source repository" +msgstr "Хранилище на източника" + +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Toggle navigation" +msgstr "Превключване на навигацията" + +msgid "next page" +msgstr "Следваща страница" + +msgid "open issue" +msgstr "отворен брой" + +msgid "previous page" +msgstr "предишна страница" + +msgid "repository" +msgstr "хранилище" + +msgid "suggest edit" +msgstr "предложи редактиране" diff --git a/_build/html/_static/locales/bn/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/cs/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/cs/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..97e52e8 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Podle" + +msgid "By" +msgstr "Podle" + +msgid "Contents" +msgstr "Obsah" + +msgid "Copyright" +msgstr "autorská práva" + +msgid "Download notebook file" +msgstr "Stáhnout soubor poznámkového bloku" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" + +msgid "Edit this page" +msgstr "Upravit tuto stránku" + +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" + +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Launch" +msgstr "Zahájení" + +msgid "Open an issue" +msgstr "Otevřete problém" + +msgid "Print to PDF" +msgstr "Tisk do PDF" + +msgid "Source repository" +msgstr "Zdrojové úložiště" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Toggle navigation" +msgstr "Přepnout navigaci" + +msgid "next page" +msgstr "další strana" + +msgid "open issue" +msgstr "otevřené číslo" + +msgid "previous page" +msgstr "předchozí stránka" + +msgid "repository" +msgstr "úložiště" + +msgid "suggest edit" +msgstr "navrhnout úpravy" diff --git a/_build/html/_static/locales/da/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/de/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/de/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..1ed1dc1 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Bis zum" + +msgid "By" +msgstr "Durch" + +msgid "Contents" +msgstr "Inhalt" + +msgid "Copyright" +msgstr "Urheberrechte ©" + +msgid "Download notebook file" +msgstr "Notebook-Datei herunterladen" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" + +msgid "Edit this page" +msgstr "Bearbeite diese Seite" + +msgid "Fullscreen mode" +msgstr "Vollbildmodus" + +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Launch" +msgstr "Starten" + +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" + +msgid "Print to PDF" +msgstr "In PDF drucken" + +msgid "Source repository" +msgstr "Quell-Repository" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" + +msgid "Theme by the" +msgstr "Thema von der" + +msgid "Toggle navigation" +msgstr "Navigation umschalten" + +msgid "next page" +msgstr "Nächste Seite" + +msgid "open issue" +msgstr "offenes Thema" + +msgid "previous page" +msgstr "vorherige Seite" + +msgid "repository" +msgstr "Repository" + +msgid "suggest edit" +msgstr "vorschlagen zu bearbeiten" diff --git a/_build/html/_static/locales/el/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/eo/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/eo/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..1fda1bc --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Per la" + +msgid "By" +msgstr "De" + +msgid "Contents" +msgstr "Enhavo" + +msgid "Copyright" +msgstr "Kopirajto" + +msgid "Download notebook file" +msgstr "Elŝutu kajeran dosieron" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" + +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" + +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" + +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Launch" +msgstr "Lanĉo" + +msgid "Open an issue" +msgstr "Malfermu numeron" + +msgid "Print to PDF" +msgstr "Presi al PDF" + +msgid "Source repository" +msgstr "Fonto-deponejo" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" + +msgid "Theme by the" +msgstr "Temo de la" + +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" + +msgid "next page" +msgstr "sekva paĝo" + +msgid "open issue" +msgstr "malferma numero" + +msgid "previous page" +msgstr "antaŭa paĝo" + +msgid "repository" +msgstr "deponejo" + +msgid "suggest edit" +msgstr "sugesti redaktadon" diff --git a/_build/html/_static/locales/es/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/es/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/es/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..c91b41b --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Por el" + +msgid "By" +msgstr "Por" + +msgid "Contents" +msgstr "Contenido" + +msgid "Copyright" +msgstr "Derechos de autor" + +msgid "Download notebook file" +msgstr "Descargar archivo de cuaderno" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "Download this page" +msgstr "Descarga esta pagina" + +msgid "Edit this page" +msgstr "Edita esta página" + +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" + +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Launch" +msgstr "Lanzamiento" + +msgid "Open an issue" +msgstr "Abrir un problema" + +msgid "Print to PDF" +msgstr "Imprimir en PDF" + +msgid "Source repository" +msgstr "Repositorio de origen" + +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" + +msgid "Theme by the" +msgstr "Tema por el" + +msgid "Toggle navigation" +msgstr "Navegación de palanca" + +msgid "next page" +msgstr "siguiente página" + +msgid "open issue" +msgstr "Tema abierto" + +msgid "previous page" +msgstr "pagina anterior" + +msgid "repository" +msgstr "repositorio" + +msgid "suggest edit" +msgstr "sugerir editar" diff --git a/_build/html/_static/locales/et/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/et/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/et/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..2fd1ea2 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Autor" + +msgid "By" +msgstr "Kõrval" + +msgid "Contents" +msgstr "Sisu" + +msgid "Copyright" +msgstr "Autoriõigus" + +msgid "Download notebook file" +msgstr "Laadige sülearvuti fail alla" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "Download this page" +msgstr "Laadige see leht alla" + +msgid "Edit this page" +msgstr "Muutke seda lehte" + +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" + +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Launch" +msgstr "Käivitage" + +msgid "Open an issue" +msgstr "Avage probleem" + +msgid "Print to PDF" +msgstr "Prindi PDF-i" + +msgid "Source repository" +msgstr "Allikahoidla" + +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" + +msgid "Theme by the" +msgstr "Teema" + +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" + +msgid "next page" +msgstr "järgmine leht" + +msgid "open issue" +msgstr "avatud küsimus" + +msgid "previous page" +msgstr "eelmine leht" + +msgid "repository" +msgstr "hoidla" + +msgid "suggest edit" +msgstr "soovita muuta" diff --git a/_build/html/_static/locales/fi/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/fi/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/fi/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..2843f2c --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Mukaan" + +msgid "By" +msgstr "Tekijä" + +msgid "Contents" +msgstr "Sisällys" + +msgid "Copyright" +msgstr "Tekijänoikeus" + +msgid "Download notebook file" +msgstr "Lataa muistikirjatiedosto" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "Download this page" +msgstr "Lataa tämä sivu" + +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" + +msgid "Fullscreen mode" +msgstr "Koko näytön tila" + +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Launch" +msgstr "Tuoda markkinoille" + +msgid "Open an issue" +msgstr "Avaa ongelma" + +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" + +msgid "Source repository" +msgstr "Lähteen arkisto" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" + +msgid "Theme by the" +msgstr "Teeman tekijä" + +msgid "Toggle navigation" +msgstr "Vaihda navigointia" + +msgid "next page" +msgstr "seuraava sivu" + +msgid "open issue" +msgstr "avoin ongelma" + +msgid "previous page" +msgstr "Edellinen sivu" + +msgid "repository" +msgstr "arkisto" + +msgid "suggest edit" +msgstr "ehdottaa muokkausta" diff --git a/_build/html/_static/locales/fr/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/fr/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/fr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..351cddd --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Par le" + +msgid "By" +msgstr "Par" + +msgid "Contents" +msgstr "Contenu" + +msgid "Copyright" +msgstr "droits d'auteur" + +msgid "Download notebook file" +msgstr "Télécharger le fichier notebook" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "Download this page" +msgstr "Téléchargez cette page" + +msgid "Edit this page" +msgstr "Modifier cette page" + +msgid "Fullscreen mode" +msgstr "Mode plein écran" + +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Launch" +msgstr "lancement" + +msgid "Open an issue" +msgstr "Ouvrez un problème" + +msgid "Print to PDF" +msgstr "Imprimer au format PDF" + +msgid "Source repository" +msgstr "Dépôt source" + +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" + +msgid "Theme by the" +msgstr "Thème par le" + +msgid "Toggle navigation" +msgstr "Basculer la navigation" + +msgid "next page" +msgstr "page suivante" + +msgid "open issue" +msgstr "signaler un problème" + +msgid "previous page" +msgstr "page précédente" + +msgid "repository" +msgstr "dépôt" + +msgid "suggest edit" +msgstr "suggestion de modification" diff --git a/_build/html/_static/locales/hr/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/id/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/id/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..809498c --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Oleh" + +msgid "By" +msgstr "Oleh" + +msgid "Contents" +msgstr "Isi" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download notebook file" +msgstr "Unduh file notebook" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "Download this page" +msgstr "Unduh halaman ini" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Fullscreen mode" +msgstr "Mode layar penuh" + +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Launch" +msgstr "Meluncurkan" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Toggle navigation" +msgstr "Alihkan navigasi" + +msgid "next page" +msgstr "halaman selanjutnya" + +msgid "open issue" +msgstr "masalah terbuka" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "repository" +msgstr "gudang" + +msgid "suggest edit" +msgstr "menyarankan edit" diff --git a/_build/html/_static/locales/it/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/iw/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/iw/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..a82f351 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "דרך" + +msgid "By" +msgstr "על ידי" + +msgid "Contents" +msgstr "תוכן" + +msgid "Copyright" +msgstr "זכויות יוצרים" + +msgid "Download notebook file" +msgstr "הורד קובץ מחברת" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "Download this page" +msgstr "הורד דף זה" + +msgid "Edit this page" +msgstr "ערוך דף זה" + +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" + +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Launch" +msgstr "לְהַשִׁיק" + +msgid "Open an issue" +msgstr "פתח גיליון" + +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" + +msgid "Source repository" +msgstr "מאגר המקורות" + +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" + +msgid "Theme by the" +msgstr "נושא מאת" + +msgid "Toggle navigation" +msgstr "החלף ניווט" + +msgid "next page" +msgstr "עמוד הבא" + +msgid "open issue" +msgstr "בעיה פתוחה" + +msgid "previous page" +msgstr "עמוד קודם" + +msgid "repository" +msgstr "מאגר" + +msgid "suggest edit" +msgstr "מציע לערוך" diff --git a/_build/html/_static/locales/ja/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/ko/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/ko/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..2db12a1 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "에 의해" + +msgid "By" +msgstr "으로" + +msgid "Contents" +msgstr "내용" + +msgid "Copyright" +msgstr "저작권" + +msgid "Download notebook file" +msgstr "노트북 파일 다운로드" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "Download this page" +msgstr "이 페이지 다운로드" + +msgid "Edit this page" +msgstr "이 페이지 편집" + +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" + +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Launch" +msgstr "시작하다" + +msgid "Open an issue" +msgstr "이슈 열기" + +msgid "Print to PDF" +msgstr "PDF로 인쇄" + +msgid "Source repository" +msgstr "소스 저장소" + +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" + +msgid "Theme by the" +msgstr "테마별" + +msgid "Toggle navigation" +msgstr "탐색 전환" + +msgid "next page" +msgstr "다음 페이지" + +msgid "open issue" +msgstr "열린 문제" + +msgid "previous page" +msgstr "이전 페이지" + +msgid "repository" +msgstr "저장소" + +msgid "suggest edit" +msgstr "편집 제안" diff --git a/_build/html/_static/locales/lt/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/lt/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/lt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..07b6468 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Prie" + +msgid "By" +msgstr "Iki" + +msgid "Contents" +msgstr "Turinys" + +msgid "Copyright" +msgstr "Autorių teisės" + +msgid "Download notebook file" +msgstr "Atsisiųsti nešiojamojo kompiuterio failą" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" + +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" + +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" + +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Launch" +msgstr "Paleiskite" + +msgid "Open an issue" +msgstr "Atidarykite problemą" + +msgid "Print to PDF" +msgstr "Spausdinti į PDF" + +msgid "Source repository" +msgstr "Šaltinio saugykla" + +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" + +msgid "Theme by the" +msgstr "Tema" + +msgid "Toggle navigation" +msgstr "Perjungti naršymą" + +msgid "next page" +msgstr "Kitas puslapis" + +msgid "open issue" +msgstr "atviras klausimas" + +msgid "previous page" +msgstr "Ankstesnis puslapis" + +msgid "repository" +msgstr "saugykla" + +msgid "suggest edit" +msgstr "pasiūlyti redaguoti" diff --git a/_build/html/_static/locales/lv/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/lv/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/lv/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..b741c28 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Ar" + +msgid "By" +msgstr "Autors" + +msgid "Contents" +msgstr "Saturs" + +msgid "Copyright" +msgstr "Autortiesības" + +msgid "Download notebook file" +msgstr "Lejupielādēt piezīmju grāmatiņu" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" + +msgid "Edit this page" +msgstr "Rediģēt šo lapu" + +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" + +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Launch" +msgstr "Uzsākt" + +msgid "Open an issue" +msgstr "Atveriet problēmu" + +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" + +msgid "Source repository" +msgstr "Avota krātuve" + +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" + +msgid "Theme by the" +msgstr "Autora tēma" + +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" + +msgid "next page" +msgstr "nākamā lapaspuse" + +msgid "open issue" +msgstr "atklāts jautājums" + +msgid "previous page" +msgstr "iepriekšējā lapa" + +msgid "repository" +msgstr "krātuve" + +msgid "suggest edit" +msgstr "ieteikt rediģēt" diff --git a/_build/html/_static/locales/ml/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/ml/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/ml/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..bdad3de --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "എഴുതിയത്" + +msgid "By" +msgstr "എഴുതിയത്" + +msgid "Copyright" +msgstr "പകർപ്പവകാശം" + +msgid "Download notebook file" +msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" + +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" + +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Launch" +msgstr "സമാരംഭിക്കുക" + +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" + +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" + +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" + +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" + +msgid "Theme by the" +msgstr "പ്രമേയം" + +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" + +msgid "next page" +msgstr "അടുത്ത പേജ്" + +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" + +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" + +msgid "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" diff --git a/_build/html/_static/locales/mr/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/mr/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/mr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..61bfad4 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "द्वारा" + +msgid "By" +msgstr "द्वारा" + +msgid "Copyright" +msgstr "कॉपीराइट" + +msgid "Download notebook file" +msgstr "नोटबुक फाईल डाउनलोड करा" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" + +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" + +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Launch" +msgstr "लाँच करा" + +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" + +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" + +msgid "Source repository" +msgstr "स्त्रोत भांडार" + +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" + +msgid "Theme by the" +msgstr "द्वारा थीम" + +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" + +msgid "next page" +msgstr "पुढील पृष्ठ" + +msgid "open issue" +msgstr "खुला मुद्दा" + +msgid "previous page" +msgstr "मागील पान" + +msgid "suggest edit" +msgstr "संपादन सुचवा" diff --git a/_build/html/_static/locales/ms/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/ms/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/ms/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..ade6515 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Oleh" + +msgid "By" +msgstr "Oleh" + +msgid "Copyright" +msgstr "hak cipta" + +msgid "Download notebook file" +msgstr "Muat turun fail buku nota" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "Download this page" +msgstr "Muat turun halaman ini" + +msgid "Edit this page" +msgstr "Edit halaman ini" + +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Launch" +msgstr "Lancarkan" + +msgid "Open an issue" +msgstr "Buka masalah" + +msgid "Print to PDF" +msgstr "Cetak ke PDF" + +msgid "Source repository" +msgstr "Repositori sumber" + +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" + +msgid "Theme by the" +msgstr "Tema oleh" + +msgid "Toggle navigation" +msgstr "Togol navigasi" + +msgid "next page" +msgstr "muka surat seterusnya" + +msgid "open issue" +msgstr "isu terbuka" + +msgid "previous page" +msgstr "halaman sebelumnya" + +msgid "suggest edit" +msgstr "cadangkan edit" diff --git a/_build/html/_static/locales/nl/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/nl/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/nl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..e114611 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Door de" + +msgid "By" +msgstr "Door" + +msgid "Contents" +msgstr "Inhoud" + +msgid "Copyright" +msgstr "auteursrechten" + +msgid "Download notebook file" +msgstr "Download notebookbestand" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "Download this page" +msgstr "Download deze pagina" + +msgid "Edit this page" +msgstr "bewerk deze pagina" + +msgid "Fullscreen mode" +msgstr "Volledig scherm" + +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Launch" +msgstr "Lancering" + +msgid "Open an issue" +msgstr "Open een probleem" + +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" + +msgid "Source repository" +msgstr "Bronopslagplaats" + +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" + +msgid "Theme by the" +msgstr "Thema door de" + +msgid "Toggle navigation" +msgstr "Schakel navigatie" + +msgid "next page" +msgstr "volgende bladzijde" + +msgid "open issue" +msgstr "open probleem" + +msgid "previous page" +msgstr "vorige pagina" + +msgid "repository" +msgstr "repository" + +msgid "suggest edit" +msgstr "suggereren bewerken" diff --git a/_build/html/_static/locales/no/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/pl/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/pl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..a482215 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Przez" + +msgid "By" +msgstr "Przez" + +msgid "Contents" +msgstr "Zawartość" + +msgid "Copyright" +msgstr "prawa autorskie" + +msgid "Download notebook file" +msgstr "Pobierz plik notatnika" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "Download this page" +msgstr "Pobierz tę stronę" + +msgid "Edit this page" +msgstr "Edytuj tę strone" + +msgid "Fullscreen mode" +msgstr "Pełny ekran" + +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Launch" +msgstr "Uruchomić" + +msgid "Open an issue" +msgstr "Otwórz problem" + +msgid "Print to PDF" +msgstr "Drukuj do PDF" + +msgid "Source repository" +msgstr "Repozytorium źródłowe" + +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" + +msgid "Theme by the" +msgstr "Motyw autorstwa" + +msgid "Toggle navigation" +msgstr "Przełącz nawigację" + +msgid "next page" +msgstr "Następna strona" + +msgid "open issue" +msgstr "otwarty problem" + +msgid "previous page" +msgstr "Poprzednia strona" + +msgid "repository" +msgstr "magazyn" + +msgid "suggest edit" +msgstr "zaproponuj edycję" diff --git a/_build/html/_static/locales/pt/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/pt/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/pt/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..bbc872d --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Pelo" + +msgid "By" +msgstr "De" + +msgid "Contents" +msgstr "Conteúdo" + +msgid "Copyright" +msgstr "direito autoral" + +msgid "Download notebook file" +msgstr "Baixar arquivo de notebook" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "Download this page" +msgstr "Baixe esta página" + +msgid "Edit this page" +msgstr "Edite essa página" + +msgid "Fullscreen mode" +msgstr "Modo tela cheia" + +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Launch" +msgstr "Lançamento" + +msgid "Open an issue" +msgstr "Abra um problema" + +msgid "Print to PDF" +msgstr "Imprimir em PDF" + +msgid "Source repository" +msgstr "Repositório fonte" + +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" + +msgid "Theme by the" +msgstr "Tema por" + +msgid "Toggle navigation" +msgstr "Alternar de navegação" + +msgid "next page" +msgstr "próxima página" + +msgid "open issue" +msgstr "questão aberta" + +msgid "previous page" +msgstr "página anterior" + +msgid "repository" +msgstr "repositório" + +msgid "suggest edit" +msgstr "sugerir edição" diff --git a/_build/html/_static/locales/ro/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/ro/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/ro/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..b9b8b4f --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Langa" + +msgid "By" +msgstr "De" + +msgid "Contents" +msgstr "Cuprins" + +msgid "Copyright" +msgstr "Drepturi de autor" + +msgid "Download notebook file" +msgstr "Descărcați fișierul notebook" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "Download this page" +msgstr "Descarcă această pagină" + +msgid "Edit this page" +msgstr "Editați această pagină" + +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" + +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Launch" +msgstr "Lansa" + +msgid "Open an issue" +msgstr "Deschideți o problemă" + +msgid "Print to PDF" +msgstr "Imprimați în PDF" + +msgid "Source repository" +msgstr "Depozit sursă" + +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" + +msgid "Theme by the" +msgstr "Tema de" + +msgid "Toggle navigation" +msgstr "Comutare navigare" + +msgid "next page" +msgstr "pagina următoare" + +msgid "open issue" +msgstr "problema deschisă" + +msgid "previous page" +msgstr "pagina anterioară" + +msgid "repository" +msgstr "repertoriu" + +msgid "suggest edit" +msgstr "sugerează editare" diff --git a/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.mo b/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..5ea2e5c9f176e3db42d78d2e890997e092a8db84 GIT binary patch literal 1729 zcmZ{i!EY2*9LJx63M(Rl;=vl9F-0(05uyp%W-maSkbpK)jESe|?qhd!JF}UY1@>Y} z3m5`aO(dF_h;Z|^w%xkzvb$FzuBp+jlAre&%8Ik_xpW+-?xwU zZojPmq3C-I zMck&Kz z|AKG9{WLA{1vm;nh2qnf@G$%qise#6_C@PHrf8SGHxHz#JxuXehV(B({1dOG{wqvM zryj`NZXT3M@9;T@E$RKL<4t}#sTy@63=$J0F)#IIKvY(K8eL2yn)#6fQOrU4NvQekKIMI!I*-K1WhXLzG zP^zkr>I8U!_T#u=)MVrbBnkE8$q99KST8d5F!qx$YO1sKsvlg^$3@#z)yx=`KK1ml zr>U?~sTm!37yOEs_!J4urDUislsdyA^~hZC!$u~1Q~J13sTfomIzdYKxhW<2Q|0_8 zCW^^c(8Kz9sh>|P=gyouGrsZt$h+_5GGp^o&AKV*1ObQZHO~*mbgAk^u}O;OrY7>o zHsT^Lh|ilSKOU6AvL93m`q;Fe3wMOLC@)Kb+6Bl$)PnU7==$Ib9 z77qsc&7wYXXe_7fH+Ip@*}j`CD0>H9cC)r^m*JdUw0(PD*}Gubw)wDPTefFAwyk){ z&biBWjexec10vYAeL1pbTkb37oV%&r74}zcSKHrs8Q2bIdYoC+gh{>?*x7nY!raxg zcF)})cs-4>-;-v^&ANFKb`aXu?iQ8iwa89Ykkwst^UD4#-4MP;Scgx21ZJw9bOal0 zR|L9S9Fv}UHd7$ptRNUyQnQGY^gW&!(6_(JF)GM*W|U|hxOuTj*`H8BN_QjmB{f)F z!*)^HB4~iosc)G|yO{pH?GIbc5GezS4ISVDk+rJqJ+|-L*1EGxwxjJ`oa>-xP0IWm z(06mvh1_c!|GRF1!nnzW5i1wju}i49#^!=tPTDJ-EV%1zf4#+Q+fwwg(VpDce;d4$ oR$AsRm&x*k9PTPn!+%+q!q?@$CKid!UE0O{RARREKNqY10rG{kod5s; literal 0 HcmV?d00001 diff --git a/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..e0f3555 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Посредством" + +msgid "By" +msgstr "Автор:" + +msgid "Contents" +msgstr "Содержание" + +msgid "Copyright" +msgstr "авторское право" + +msgid "Download notebook file" +msgstr "Скачать файл записной книжки" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "Download this page" +msgstr "Загрузите эту страницу" + +msgid "Edit this page" +msgstr "Редактировать эту страницу" + +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" + +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Launch" +msgstr "Запуск" + +msgid "Open an issue" +msgstr "Открыть вопрос" + +msgid "Print to PDF" +msgstr "Распечатать в PDF" + +msgid "Source repository" +msgstr "Исходный репозиторий" + +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" + +msgid "Theme by the" +msgstr "Тема от" + +msgid "Toggle navigation" +msgstr "Переключить навигацию" + +msgid "next page" +msgstr "Следующая страница" + +msgid "open issue" +msgstr "открытый вопрос" + +msgid "previous page" +msgstr "Предыдущая страница" + +msgid "repository" +msgstr "хранилище" + +msgid "suggest edit" +msgstr "предложить редактировать" diff --git a/_build/html/_static/locales/sk/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/sk/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/sk/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..4b5225a --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Podľa" + +msgid "By" +msgstr "Autor:" + +msgid "Contents" +msgstr "Obsah" + +msgid "Copyright" +msgstr "Autorské práva" + +msgid "Download notebook file" +msgstr "Stiahnite si zošit" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" + +msgid "Edit this page" +msgstr "Upraviť túto stránku" + +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" + +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Launch" +msgstr "Spustiť" + +msgid "Open an issue" +msgstr "Otvorte problém" + +msgid "Print to PDF" +msgstr "Tlač do PDF" + +msgid "Source repository" +msgstr "Zdrojové úložisko" + +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" + +msgid "Theme by the" +msgstr "Téma od" + +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" + +msgid "next page" +msgstr "ďalšia strana" + +msgid "open issue" +msgstr "otvorené vydanie" + +msgid "previous page" +msgstr "predchádzajúca strana" + +msgid "repository" +msgstr "Úložisko" + +msgid "suggest edit" +msgstr "navrhnúť úpravu" diff --git a/_build/html/_static/locales/sl/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/sl/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/sl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..45592e7 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Avtor" + +msgid "By" +msgstr "Avtor" + +msgid "Contents" +msgstr "Vsebina" + +msgid "Copyright" +msgstr "avtorske pravice" + +msgid "Download notebook file" +msgstr "Prenesite datoteko zvezka" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "Download this page" +msgstr "Prenesite to stran" + +msgid "Edit this page" +msgstr "Uredite to stran" + +msgid "Fullscreen mode" +msgstr "Celozaslonski način" + +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Launch" +msgstr "Kosilo" + +msgid "Open an issue" +msgstr "Odprite številko" + +msgid "Print to PDF" +msgstr "Natisni v PDF" + +msgid "Source repository" +msgstr "Izvorno skladišče" + +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" + +msgid "Theme by the" +msgstr "Tema avtorja" + +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" + +msgid "next page" +msgstr "Naslednja stran" + +msgid "open issue" +msgstr "odprto vprašanje" + +msgid "previous page" +msgstr "Prejšnja stran" + +msgid "repository" +msgstr "odlagališče" + +msgid "suggest edit" +msgstr "predlagajte urejanje" diff --git a/_build/html/_static/locales/sr/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/sr/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/sr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..4ddf693 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Од" + +msgid "By" +msgstr "Од стране" + +msgid "Contents" +msgstr "Садржај" + +msgid "Copyright" +msgstr "Ауторско право" + +msgid "Download notebook file" +msgstr "Преузмите датотеку бележнице" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "Download this page" +msgstr "Преузмите ову страницу" + +msgid "Edit this page" +msgstr "Уредите ову страницу" + +msgid "Fullscreen mode" +msgstr "Режим целог екрана" + +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Launch" +msgstr "Лансирање" + +msgid "Open an issue" +msgstr "Отворите издање" + +msgid "Print to PDF" +msgstr "Испис у ПДФ" + +msgid "Source repository" +msgstr "Изворно спремиште" + +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" + +msgid "Theme by the" +msgstr "Тхеме би" + +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" + +msgid "next page" +msgstr "Следећа страна" + +msgid "open issue" +msgstr "отворено издање" + +msgid "previous page" +msgstr "Претходна страница" + +msgid "repository" +msgstr "спремиште" + +msgid "suggest edit" +msgstr "предложи уређивање" diff --git a/_build/html/_static/locales/sv/LC_MESSAGES/booktheme.mo b/_build/html/_static/locales/sv/LC_MESSAGES/booktheme.mo new file mode 100644 index 0000000000000000000000000000000000000000..b07dc76ff21128244172d2e415cc899555d8b49d GIT binary patch literal 1365 zcmZ9Ky>App7{XZ}|d=zQVMY>d0>TJUwK!GS|siLHd(&c$~H~3(*Gryg$_j%@>d3o;WBZ2ZE>JsWR z)Jv%M7to-bct;3);v|}P!BgM~@H}`DTmmnGm%$If0eB9)11^FDo&i(GpFxiE5Ihb3 z0-geY1>Xk`IzH{jUv&LfAnW}L_P`@Y+Wm_l_m@D9a|Qez{0hWU@h8Z7e}laLACT8A z9Bq9sg6#KG@FQ>;^|ue&MB7Xc{&_$WV4fmrpPUX_NMBC1d<&HLVI2>ISM)cNT zDs_}z6(rVjoe=u}?s{cR90ejPCoU&(OT{EBpQ}W+2Kkatlh7xu)KFSXs3tL$x9(u73Q%I)?{Lst}rq*YU0sH7ocX*ad*9P6|q zKG0OVs2vT8zb&|U%F`w^(-Z1 zKF^i36kcC+hKrsX9@jHt-W)0~UWJ0RHRwJIJFG|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/_build/html/_static/locales/ta/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/ta/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..fb871e2 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "மூலம்" + +msgid "By" +msgstr "வழங்கியவர்" + +msgid "Copyright" +msgstr "பதிப்புரிமை" + +msgid "Download notebook file" +msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" + +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" + +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Launch" +msgstr "தொடங்க" + +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" + +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" + +msgid "Source repository" +msgstr "மூல களஞ்சியம்" + +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" + +msgid "Theme by the" +msgstr "வழங்கிய தீம்" + +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" + +msgid "next page" +msgstr "அடுத்த பக்கம்" + +msgid "open issue" +msgstr "திறந்த பிரச்சினை" + +msgid "previous page" +msgstr "முந்தைய பக்கம்" + +msgid "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" diff --git a/_build/html/_static/locales/te/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/te/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/te/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..22ab77c --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "ద్వారా" + +msgid "By" +msgstr "ద్వారా" + +msgid "Copyright" +msgstr "కాపీరైట్" + +msgid "Download notebook file" +msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" + +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" + +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Launch" +msgstr "ప్రారంభించండి" + +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" + +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" + +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" + +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" + +msgid "Theme by the" +msgstr "ద్వారా థీమ్" + +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" + +msgid "next page" +msgstr "తరువాతి పేజీ" + +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" + +msgid "previous page" +msgstr "ముందు పేజి" + +msgid "suggest edit" +msgstr "సవరించమని సూచించండి" diff --git a/_build/html/_static/locales/tg/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/tg/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/tg/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..e499352 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Бо" + +msgid "By" +msgstr "Бо" + +msgid "Contents" +msgstr "Мундариҷа" + +msgid "Copyright" +msgstr "Ҳуқуқи муаллиф" + +msgid "Download notebook file" +msgstr "Файли дафтарро зеркашӣ кунед" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" + +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" + +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" + +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Launch" +msgstr "Оғоз" + +msgid "Open an issue" +msgstr "Масъаларо кушоед" + +msgid "Print to PDF" +msgstr "Чоп ба PDF" + +msgid "Source repository" +msgstr "Анбори манбаъ" + +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" + +msgid "Theme by the" +msgstr "Мавзӯъи аз" + +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" + +msgid "next page" +msgstr "саҳифаи оянда" + +msgid "open issue" +msgstr "барориши кушод" + +msgid "previous page" +msgstr "саҳифаи қаблӣ" + +msgid "repository" +msgstr "анбор" + +msgid "suggest edit" +msgstr "пешниҳод вироиш" diff --git a/_build/html/_static/locales/th/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/th/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/th/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..6f0103e --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "โดย" + +msgid "By" +msgstr "โดย" + +msgid "Contents" +msgstr "สารบัญ" + +msgid "Copyright" +msgstr "ลิขสิทธิ์" + +msgid "Download notebook file" +msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" + +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" + +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" + +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Launch" +msgstr "เปิด" + +msgid "Open an issue" +msgstr "เปิดปัญหา" + +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" + +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" + +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" + +msgid "Theme by the" +msgstr "ธีมโดย" + +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" + +msgid "next page" +msgstr "หน้าต่อไป" + +msgid "open issue" +msgstr "เปิดปัญหา" + +msgid "previous page" +msgstr "หน้าที่แล้ว" + +msgid "repository" +msgstr "ที่เก็บ" + +msgid "suggest edit" +msgstr "แนะนำแก้ไข" diff --git a/_build/html/_static/locales/tl/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/tl/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/tl/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..dbeb256 --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Sa pamamagitan ng" + +msgid "By" +msgstr "Ni" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download notebook file" +msgstr "Mag-download ng file ng notebook" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" + +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" + +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Launch" +msgstr "Ilunsad" + +msgid "Open an issue" +msgstr "Magbukas ng isyu" + +msgid "Print to PDF" +msgstr "I-print sa PDF" + +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" + +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" + +msgid "Theme by the" +msgstr "Tema ng" + +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" + +msgid "next page" +msgstr "Susunod na pahina" + +msgid "open issue" +msgstr "bukas na isyu" + +msgid "previous page" +msgstr "Nakaraang pahina" + +msgid "suggest edit" +msgstr "iminumungkahi i-edit" diff --git a/_build/html/_static/locales/tr/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/tr/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/tr/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..610c1ab --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "Tarafından" + +msgid "By" +msgstr "Tarafından" + +msgid "Contents" +msgstr "İçindekiler" + +msgid "Copyright" +msgstr "Telif hakkı" + +msgid "Download notebook file" +msgstr "Defter dosyasını indirin" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" + +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" + +msgid "Fullscreen mode" +msgstr "Tam ekran modu" + +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Launch" +msgstr "Başlatmak" + +msgid "Open an issue" +msgstr "Bir sorunu açın" + +msgid "Print to PDF" +msgstr "PDF olarak yazdır" + +msgid "Source repository" +msgstr "Kaynak kod deposu" + +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" + +msgid "Theme by the" +msgstr "Tarafından tema" + +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" + +msgid "next page" +msgstr "sonraki Sayfa" + +msgid "open issue" +msgstr "Açık konu" + +msgid "previous page" +msgstr "önceki sayfa" + +msgid "repository" +msgstr "depo" + +msgid "suggest edit" +msgstr "düzenleme öner" diff --git a/_build/html/_static/locales/uk/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/ur/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/ur/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..63018ea --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "کی طرف" + +msgid "By" +msgstr "بذریعہ" + +msgid "Copyright" +msgstr "کاپی رائٹ" + +msgid "Download notebook file" +msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" + +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" + +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Launch" +msgstr "لانچ کریں" + +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" + +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" + +msgid "Source repository" +msgstr "ماخذ ذخیرہ" + +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" + +msgid "Theme by the" +msgstr "کے ذریعہ تھیم" + +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" + +msgid "next page" +msgstr "اگلا صفحہ" + +msgid "open issue" +msgstr "کھلا مسئلہ" + +msgid "previous page" +msgstr "سابقہ ​​صفحہ" + +msgid "suggest edit" +msgstr "ترمیم کی تجویز کریں" diff --git a/_build/html/_static/locales/vi/LC_MESSAGES/booktheme.mo b/_build/html/_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/_build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/_build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po new file mode 100644 index 0000000..f2b300f --- /dev/null +++ b/_build/html/_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 "By the" +msgstr "作者:" + +msgid "By" +msgstr "作者:" + +msgid "Contents" +msgstr "目錄" + +msgid "Copyright" +msgstr "Copyright" + +msgid "Download notebook file" +msgstr "下載 Notebook 檔案" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "Download this page" +msgstr "下載此頁面" + +msgid "Edit this page" +msgstr "編輯此頁面" + +msgid "Fullscreen mode" +msgstr "全螢幕模式" + +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Launch" +msgstr "啟動" + +msgid "Open an issue" +msgstr "開啟議題" + +msgid "Print to PDF" +msgstr "列印成 PDF" + +msgid "Source repository" +msgstr "來源儲存庫" + +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" + +msgid "Theme by the" +msgstr "佈景主題作者:" + +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" + +msgid "next page" +msgstr "下一頁" + +msgid "open issue" +msgstr "公開的問題" + +msgid "previous page" +msgstr "上一頁" + +msgid "repository" +msgstr "儲存庫" + +msgid "suggest edit" +msgstr "提出修改建議" diff --git a/_build/html/_static/minus.png b/_build/html/_static/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..d96755fdaf8bb2214971e0db9c1fd3077d7c419d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu=nj kDsEF_5m^0CR;1wuP-*O&G^0G}KYk!hp00i_>zopr08q^qX#fBK literal 0 HcmV?d00001 diff --git a/_build/html/_static/mystnb.8ecb98da25f57f5357bf6f572d296f466b2cfe2517ffebfabe82451661e28f02.css b/_build/html/_static/mystnb.8ecb98da25f57f5357bf6f572d296f466b2cfe2517ffebfabe82451661e28f02.css new file mode 100644 index 0000000..14edf62 --- /dev/null +++ b/_build/html/_static/mystnb.8ecb98da25f57f5357bf6f572d296f466b2cfe2517ffebfabe82451661e28f02.css @@ -0,0 +1,2474 @@ +/* Variables */ +:root { + /* + Following palettes are generated by using https://m2.material.io/design/color/the-color-system.html#tools-for-picking-colors + - neutral palette with #fcfcfc and danger palette with #ffdddd as base colors. + 50 means lightest, 900 means darkest; less used intermediate shades are omitted + but can be added when needed by accessing full palette from the above link. + */ + --mystnb-neutral-palette-50: #fcfcfc; + --mystnb-neutral-palette-100: #f7f7f7; + --mystnb-neutral-palette-400: #cccccc; + --mystnb-neutral-palette-500: #afafaf; + --mystnb-neutral-palette-800: #505050; + --mystnb-neutral-palette-900: #2d2d2d; + + --mystnb-danger-palette-50: #ffdddd; + --mystnb-danger-palette-100: #f5acad; + --mystnb-danger-palette-400: #c42029; + --mystnb-danger-palette-500: #b40008; + --mystnb-danger-palette-800: #850010; + --mystnb-danger-palette-900: #680010; + + /* MyST-NB specific variables; colors should be logically picked from palettes */ + --mystnb-source-bg-color: var(--mystnb-neutral-palette-100); + --mystnb-stdout-bg-color: var(--mystnb-neutral-palette-50); + --mystnb-stderr-bg-color: var(--mystnb-danger-palette-50); + --mystnb-traceback-bg-color: var(--mystnb-neutral-palette-50); + --mystnb-source-border-color: var(--mystnb-neutral-palette-400); + --mystnb-source-margin-color: green; + --mystnb-stdout-border-color: var(--mystnb-neutral-palette-100); + --mystnb-stderr-border-color: var(--mystnb-neutral-palette-100); + --mystnb-traceback-border-color: var(--mystnb-danger-palette-100); + --mystnb-hide-prompt-opacity: 70%; + --mystnb-source-border-radius: .4em; + --mystnb-source-border-width: 1px; + --mystnb-scrollbar-width: 0.3rem; + --mystnb-scrollbar-height: 0.3rem; + --mystnb-scrollbar-thumb-color: var(--mystnb-neutral-palette-400); + --mystnb-scrollbar-thumb-hover-color: var(--mystnb-neutral-palette-500); + --mystnb-scrollbar-thumb-border-radius: 0.25rem; +} + +/* Override colors in dark theme */ +html[data-theme="dark"] { + --mystnb-source-bg-color: var(--mystnb-neutral-palette-800); + --mystnb-stdout-bg-color: var(--mystnb-neutral-palette-900); + --mystnb-stderr-bg-color: var(--mystnb-danger-palette-900); + --mystnb-traceback-bg-color: var(--mystnb-neutral-palette-900); + --mystnb-source-border-color: var(--mystnb-neutral-palette-500); + --mystnb-stdout-border-color: var(--mystnb-neutral-palette-800); + --mystnb-stderr-border-color: var(--mystnb-neutral-palette-800); + --mystnb-traceback-border-color: var(--mystnb-danger-palette-800); + --mystnb-scrollbar-thumb-color: var(--mystnb-neutral-palette-500); + --mystnb-scrollbar-thumb-hover-color: var(--mystnb-neutral-palette-400); +} + + +/* Whole cell */ +div.container.cell { + padding-left: 0; + margin-bottom: 1em; +} + +/* Removing all background formatting so we can control at the div level */ +.cell_input div.highlight, +.cell_output pre, +.cell_input pre, +.cell_output .output { + border: none; + box-shadow: none; +} + +.cell_output .output pre, +.cell_input pre { + margin: 0px; +} + +/* Input cells */ +div.cell > div.cell_input { + padding-left: 0em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + background-color: var(--mystnb-source-bg-color); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; + border-radius: var(--mystnb-source-border-radius); +} + +div.cell_input>div, +div.cell_output div.output>div.highlight { + margin: 0em !important; + border: none !important; +} + +/* All cell outputs */ +.cell_output { + padding-left: 1em; + padding-right: 0em; + margin-top: 1em; +} + +/* Text outputs from cells */ +.cell_output .output.text_plain, +.cell_output .output.traceback, +.cell_output .output.stream, +.cell_output .output.stderr { + margin-top: 1em; + margin-bottom: 0em; + box-shadow: none; +} + +.cell_output .output.text_plain:not(:has(.highlight)), +.cell_output .output.stream:not(:has(.highlight)) { + /* plain (or stream of) output, not containing a pygments-highlighted block */ + background: var(--mystnb-stdout-bg-color); + border: 1px solid var(--mystnb-stdout-border-color); +} + +.cell_output .output.stderr { + background: var(--mystnb-stderr-bg-color); + border: 1px solid var(--mystnb-stderr-border-color); +} + +.cell_output .output.traceback { + background: var(--mystnb-traceback-bg-color); + border: 1px solid var(--mystnb-traceback-border-color); +} + +/* --- Collapsible cell content --- */ + +/* +encourage summary container to blend in with its parent. +p.admonition-title should hold the title styles. +*/ +div.cell details.hide summary { + border-left: unset; + padding: inherit; + margin: inherit; + background-color: inherit; +} + +/* Neighboring input/output elements - spacing, borders */ +div.cell details.hide.above-input + details.below-input, +div.cell div.cell_input + details.below-input +{ + margin-top: 0; +} + +div.cell details.hide.above-input:has(+ details.below-input), +div.cell div.cell_input:has(+ details.below-input) +{ + margin-bottom: 0; +} + +div.cell:has(> *:nth-child(2)) div.cell_input:first-child, +div.cell:has(> *:nth-child(2)) details:first-child +{ + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +div.cell:has(> *:nth-child(2)) div.cell_input:last-child, +div.cell:has(> *:nth-child(2)) details:last-child +{ + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +/* intra-label styles for collapsibles */ +div.cell.container details.hide.above-input>summary, +div.cell.container details.hide.below-input>summary, +div.cell.container details.hide.above-output>summary +{ + display: block; + border-left: none; +} + +div.cell details.hide>summary>p.admonition-title { + display: list-item; + margin-bottom: 0; +} + +div.cell details.hide:not([open]) { + padding-bottom: 0; +} + +div.cell details.hide[open]>summary>p.collapsed { + display: none; +} + +div.cell details.hide:not([open])>summary>p.expanded { + display: none; +} + +@keyframes collapsed-fade-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} +div.cell details.hide[open]>summary~* { + -moz-animation: collapsed-fade-in 0.3s ease-in-out; + -webkit-animation: collapsed-fade-in 0.3s ease-in-out; + animation: collapsed-fade-in 0.3s ease-in-out; +} + +/* Clear conflicting styles for details and admonitions set by some themes */ +div.cell details.admonition summary::before { + content: unset; +} + +/* Math align to the left */ +.cell_output .MathJax_Display { + text-align: left !important; +} + +/* Pandas tables. Pulled from the Jupyter / nbsphinx CSS */ +div.cell_output table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 1em; + table-layout: fixed; +} + +div.cell_output thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} + +div.cell_output tr, +div.cell_output th, +div.cell_output td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} + +div.cell_output th { + font-weight: bold; +} + +div.cell_output tbody tr:nth-child(odd) { + background: #f5f5f5; +} + +div.cell_output tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + +/** source code line numbers **/ +span.linenos { + opacity: 0.5; +} + +/* Inline text from `paste` operation */ + +span.pasted-text { + font-weight: bold; +} + +span.pasted-inline img { + max-height: 2em; +} + +tbody span.pasted-inline img { + max-height: none; +} + + +/* Adding scroll bars if tags: output_scroll, scroll-output, and scroll-input + * On screens, we want to scroll, but on print show all + * + * It was before in https://github.com/executablebooks/sphinx-book-theme/blob/eb1b6baf098b27605e8f2b7b2979b17ebf1b9540/src/sphinx_book_theme/assets/styles/extensions/_myst-nb.scss +*/ +div.cell:is( + .tag_output_scroll, + .tag_scroll-output, + .config_scroll_outputs + ) + div.cell_output, +div.cell.tag_scroll-input div.cell_input { + max-height: 24em; + overflow-y: auto; + max-width: 100%; + overflow-x: auto; +} + +div.cell.config_scroll_outputs div.cell_output:has(img) { + /* If the output cell has image(s), allow it to take 90% of viewport height + but still bounded between 24em and 60em */ + max-height: clamp(24em, 90vh, 60em); +} + +/* Custom scrollbars */ +div.cell:is( + .tag_output_scroll, + .tag_scroll-output, + .config_scroll_outputs + ) + div.cell_output::-webkit-scrollbar, +div.cell.tag_scroll-input div.cell_input::-webkit-scrollbar { + width: var(--mystnb-scrollbar-width); + height: var(--mystnb-scrollbar-height); +} + +div.cell:is( + .tag_output_scroll, + .tag_scroll-output, + .config_scroll_outputs + ) + div.cell_output::-webkit-scrollbar-thumb, +div.cell.tag_scroll-input div.cell_input::-webkit-scrollbar-thumb { + background: var(--mystnb-scrollbar-thumb-color); + border-radius: var(--mystnb-scrollbar-thumb-border-radius); +} + +div.cell:is( + .tag_output_scroll, + .tag_scroll-output, + .config_scroll_outputs + ) + div.cell_output::-webkit-scrollbar-thumb:hover, +div.cell.tag_scroll-input div.cell_input::-webkit-scrollbar-thumb:hover { + background: var(--mystnb-scrollbar-thumb-hover-color); +} + +/* In print mode, unset scroll styles */ +@media print { + div.cell:is( + .tag_output_scroll, + .tag_scroll-output, + .config_scroll_outputs + ) + div.cell_output, + div.cell.tag_scroll-input div.cell_input { + max-height: unset; + overflow-y: visible; + max-width: unset; + overflow-x: visible; + } +} + +/* Font colors for translated ANSI escape sequences +Color values are copied from Jupyter Notebook +https://github.com/jupyter/notebook/blob/52581f8eda9b319eb0390ac77fe5903c38f81e3e/notebook/static/notebook/less/ansicolors.less#L14-L21 +Background colors from +https://nbsphinx.readthedocs.io/en/latest/code-cells.html#ANSI-Colors +*/ +div.highlight .-Color-Bold { + font-weight: bold; +} + +div.highlight .-Color[class*=-Black] { + color: #3E424D +} + +div.highlight .-Color[class*=-Red] { + color: #E75C58 +} + +div.highlight .-Color[class*=-Green] { + color: #00A250 +} + +div.highlight .-Color[class*=-Yellow] { + color: #DDB62B +} + +div.highlight .-Color[class*=-Blue] { + color: #208FFB +} + +div.highlight .-Color[class*=-Magenta] { + color: #D160C4 +} + +div.highlight .-Color[class*=-Cyan] { + color: #60C6C8 +} + +div.highlight .-Color[class*=-White] { + color: #C5C1B4 +} + +div.highlight .-Color[class*=-BGBlack] { + background-color: #3E424D +} + +div.highlight .-Color[class*=-BGRed] { + background-color: #E75C58 +} + +div.highlight .-Color[class*=-BGGreen] { + background-color: #00A250 +} + +div.highlight .-Color[class*=-BGYellow] { + background-color: #DDB62B +} + +div.highlight .-Color[class*=-BGBlue] { + background-color: #208FFB +} + +div.highlight .-Color[class*=-BGMagenta] { + background-color: #D160C4 +} + +div.highlight .-Color[class*=-BGCyan] { + background-color: #60C6C8 +} + +div.highlight .-Color[class*=-BGWhite] { + background-color: #C5C1B4 +} + +/* Font colors for 8-bit ANSI */ + +div.highlight .-Color[class*=-C0] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC0] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C1] { + color: #800000 +} + +div.highlight .-Color[class*=-BGC1] { + background-color: #800000 +} + +div.highlight .-Color[class*=-C2] { + color: #008000 +} + +div.highlight .-Color[class*=-BGC2] { + background-color: #008000 +} + +div.highlight .-Color[class*=-C3] { + color: #808000 +} + +div.highlight .-Color[class*=-BGC3] { + background-color: #808000 +} + +div.highlight .-Color[class*=-C4] { + color: #000080 +} + +div.highlight .-Color[class*=-BGC4] { + background-color: #000080 +} + +div.highlight .-Color[class*=-C5] { + color: #800080 +} + +div.highlight .-Color[class*=-BGC5] { + background-color: #800080 +} + +div.highlight .-Color[class*=-C6] { + color: #008080 +} + +div.highlight .-Color[class*=-BGC6] { + background-color: #008080 +} + +div.highlight .-Color[class*=-C7] { + color: #C0C0C0 +} + +div.highlight .-Color[class*=-BGC7] { + background-color: #C0C0C0 +} + +div.highlight .-Color[class*=-C8] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC8] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C9] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC9] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C10] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC10] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C11] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC11] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C12] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC12] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C13] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC13] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C14] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC14] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C15] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC15] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C16] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC16] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C17] { + color: #00005F +} + +div.highlight .-Color[class*=-BGC17] { + background-color: #00005F +} + +div.highlight .-Color[class*=-C18] { + color: #000087 +} + +div.highlight .-Color[class*=-BGC18] { + background-color: #000087 +} + +div.highlight .-Color[class*=-C19] { + color: #0000AF +} + +div.highlight .-Color[class*=-BGC19] { + background-color: #0000AF +} + +div.highlight .-Color[class*=-C20] { + color: #0000D7 +} + +div.highlight .-Color[class*=-BGC20] { + background-color: #0000D7 +} + +div.highlight .-Color[class*=-C21] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC21] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C22] { + color: #005F00 +} + +div.highlight .-Color[class*=-BGC22] { + background-color: #005F00 +} + +div.highlight .-Color[class*=-C23] { + color: #005F5F +} + +div.highlight .-Color[class*=-BGC23] { + background-color: #005F5F +} + +div.highlight .-Color[class*=-C24] { + color: #005F87 +} + +div.highlight .-Color[class*=-BGC24] { + background-color: #005F87 +} + +div.highlight .-Color[class*=-C25] { + color: #005FAF +} + +div.highlight .-Color[class*=-BGC25] { + background-color: #005FAF +} + +div.highlight .-Color[class*=-C26] { + color: #005FD7 +} + +div.highlight .-Color[class*=-BGC26] { + background-color: #005FD7 +} + +div.highlight .-Color[class*=-C27] { + color: #005FFF +} + +div.highlight .-Color[class*=-BGC27] { + background-color: #005FFF +} + +div.highlight .-Color[class*=-C28] { + color: #008700 +} + +div.highlight .-Color[class*=-BGC28] { + background-color: #008700 +} + +div.highlight .-Color[class*=-C29] { + color: #00875F +} + +div.highlight .-Color[class*=-BGC29] { + background-color: #00875F +} + +div.highlight .-Color[class*=-C30] { + color: #008787 +} + +div.highlight .-Color[class*=-BGC30] { + background-color: #008787 +} + +div.highlight .-Color[class*=-C31] { + color: #0087AF +} + +div.highlight .-Color[class*=-BGC31] { + background-color: #0087AF +} + +div.highlight .-Color[class*=-C32] { + color: #0087D7 +} + +div.highlight .-Color[class*=-BGC32] { + background-color: #0087D7 +} + +div.highlight .-Color[class*=-C33] { + color: #0087FF +} + +div.highlight .-Color[class*=-BGC33] { + background-color: #0087FF +} + +div.highlight .-Color[class*=-C34] { + color: #00AF00 +} + +div.highlight .-Color[class*=-BGC34] { + background-color: #00AF00 +} + +div.highlight .-Color[class*=-C35] { + color: #00AF5F +} + +div.highlight .-Color[class*=-BGC35] { + background-color: #00AF5F +} + +div.highlight .-Color[class*=-C36] { + color: #00AF87 +} + +div.highlight .-Color[class*=-BGC36] { + background-color: #00AF87 +} + +div.highlight .-Color[class*=-C37] { + color: #00AFAF +} + +div.highlight .-Color[class*=-BGC37] { + background-color: #00AFAF +} + +div.highlight .-Color[class*=-C38] { + color: #00AFD7 +} + +div.highlight .-Color[class*=-BGC38] { + background-color: #00AFD7 +} + +div.highlight .-Color[class*=-C39] { + color: #00AFFF +} + +div.highlight .-Color[class*=-BGC39] { + background-color: #00AFFF +} + +div.highlight .-Color[class*=-C40] { + color: #00D700 +} + +div.highlight .-Color[class*=-BGC40] { + background-color: #00D700 +} + +div.highlight .-Color[class*=-C41] { + color: #00D75F +} + +div.highlight .-Color[class*=-BGC41] { + background-color: #00D75F +} + +div.highlight .-Color[class*=-C42] { + color: #00D787 +} + +div.highlight .-Color[class*=-BGC42] { + background-color: #00D787 +} + +div.highlight .-Color[class*=-C43] { + color: #00D7AF +} + +div.highlight .-Color[class*=-BGC43] { + background-color: #00D7AF +} + +div.highlight .-Color[class*=-C44] { + color: #00D7D7 +} + +div.highlight .-Color[class*=-BGC44] { + background-color: #00D7D7 +} + +div.highlight .-Color[class*=-C45] { + color: #00D7FF +} + +div.highlight .-Color[class*=-BGC45] { + background-color: #00D7FF +} + +div.highlight .-Color[class*=-C46] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC46] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C47] { + color: #00FF5F +} + +div.highlight .-Color[class*=-BGC47] { + background-color: #00FF5F +} + +div.highlight .-Color[class*=-C48] { + color: #00FF87 +} + +div.highlight .-Color[class*=-BGC48] { + background-color: #00FF87 +} + +div.highlight .-Color[class*=-C49] { + color: #00FFAF +} + +div.highlight .-Color[class*=-BGC49] { + background-color: #00FFAF +} + +div.highlight .-Color[class*=-C50] { + color: #00FFD7 +} + +div.highlight .-Color[class*=-BGC50] { + background-color: #00FFD7 +} + +div.highlight .-Color[class*=-C51] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC51] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C52] { + color: #5F0000 +} + +div.highlight .-Color[class*=-BGC52] { + background-color: #5F0000 +} + +div.highlight .-Color[class*=-C53] { + color: #5F005F +} + +div.highlight .-Color[class*=-BGC53] { + background-color: #5F005F +} + +div.highlight .-Color[class*=-C54] { + color: #5F0087 +} + +div.highlight .-Color[class*=-BGC54] { + background-color: #5F0087 +} + +div.highlight .-Color[class*=-C55] { + color: #5F00AF +} + +div.highlight .-Color[class*=-BGC55] { + background-color: #5F00AF +} + +div.highlight .-Color[class*=-C56] { + color: #5F00D7 +} + +div.highlight .-Color[class*=-BGC56] { + background-color: #5F00D7 +} + +div.highlight .-Color[class*=-C57] { + color: #5F00FF +} + +div.highlight .-Color[class*=-BGC57] { + background-color: #5F00FF +} + +div.highlight .-Color[class*=-C58] { + color: #5F5F00 +} + +div.highlight .-Color[class*=-BGC58] { + background-color: #5F5F00 +} + +div.highlight .-Color[class*=-C59] { + color: #5F5F5F +} + +div.highlight .-Color[class*=-BGC59] { + background-color: #5F5F5F +} + +div.highlight .-Color[class*=-C60] { + color: #5F5F87 +} + +div.highlight .-Color[class*=-BGC60] { + background-color: #5F5F87 +} + +div.highlight .-Color[class*=-C61] { + color: #5F5FAF +} + +div.highlight .-Color[class*=-BGC61] { + background-color: #5F5FAF +} + +div.highlight .-Color[class*=-C62] { + color: #5F5FD7 +} + +div.highlight .-Color[class*=-BGC62] { + background-color: #5F5FD7 +} + +div.highlight .-Color[class*=-C63] { + color: #5F5FFF +} + +div.highlight .-Color[class*=-BGC63] { + background-color: #5F5FFF +} + +div.highlight .-Color[class*=-C64] { + color: #5F8700 +} + +div.highlight .-Color[class*=-BGC64] { + background-color: #5F8700 +} + +div.highlight .-Color[class*=-C65] { + color: #5F875F +} + +div.highlight .-Color[class*=-BGC65] { + background-color: #5F875F +} + +div.highlight .-Color[class*=-C66] { + color: #5F8787 +} + +div.highlight .-Color[class*=-BGC66] { + background-color: #5F8787 +} + +div.highlight .-Color[class*=-C67] { + color: #5F87AF +} + +div.highlight .-Color[class*=-BGC67] { + background-color: #5F87AF +} + +div.highlight .-Color[class*=-C68] { + color: #5F87D7 +} + +div.highlight .-Color[class*=-BGC68] { + background-color: #5F87D7 +} + +div.highlight .-Color[class*=-C69] { + color: #5F87FF +} + +div.highlight .-Color[class*=-BGC69] { + background-color: #5F87FF +} + +div.highlight .-Color[class*=-C70] { + color: #5FAF00 +} + +div.highlight .-Color[class*=-BGC70] { + background-color: #5FAF00 +} + +div.highlight .-Color[class*=-C71] { + color: #5FAF5F +} + +div.highlight .-Color[class*=-BGC71] { + background-color: #5FAF5F +} + +div.highlight .-Color[class*=-C72] { + color: #5FAF87 +} + +div.highlight .-Color[class*=-BGC72] { + background-color: #5FAF87 +} + +div.highlight .-Color[class*=-C73] { + color: #5FAFAF +} + +div.highlight .-Color[class*=-BGC73] { + background-color: #5FAFAF +} + +div.highlight .-Color[class*=-C74] { + color: #5FAFD7 +} + +div.highlight .-Color[class*=-BGC74] { + background-color: #5FAFD7 +} + +div.highlight .-Color[class*=-C75] { + color: #5FAFFF +} + +div.highlight .-Color[class*=-BGC75] { + background-color: #5FAFFF +} + +div.highlight .-Color[class*=-C76] { + color: #5FD700 +} + +div.highlight .-Color[class*=-BGC76] { + background-color: #5FD700 +} + +div.highlight .-Color[class*=-C77] { + color: #5FD75F +} + +div.highlight .-Color[class*=-BGC77] { + background-color: #5FD75F +} + +div.highlight .-Color[class*=-C78] { + color: #5FD787 +} + +div.highlight .-Color[class*=-BGC78] { + background-color: #5FD787 +} + +div.highlight .-Color[class*=-C79] { + color: #5FD7AF +} + +div.highlight .-Color[class*=-BGC79] { + background-color: #5FD7AF +} + +div.highlight .-Color[class*=-C80] { + color: #5FD7D7 +} + +div.highlight .-Color[class*=-BGC80] { + background-color: #5FD7D7 +} + +div.highlight .-Color[class*=-C81] { + color: #5FD7FF +} + +div.highlight .-Color[class*=-BGC81] { + background-color: #5FD7FF +} + +div.highlight .-Color[class*=-C82] { + color: #5FFF00 +} + +div.highlight .-Color[class*=-BGC82] { + background-color: #5FFF00 +} + +div.highlight .-Color[class*=-C83] { + color: #5FFF5F +} + +div.highlight .-Color[class*=-BGC83] { + background-color: #5FFF5F +} + +div.highlight .-Color[class*=-C84] { + color: #5FFF87 +} + +div.highlight .-Color[class*=-BGC84] { + background-color: #5FFF87 +} + +div.highlight .-Color[class*=-C85] { + color: #5FFFAF +} + +div.highlight .-Color[class*=-BGC85] { + background-color: #5FFFAF +} + +div.highlight .-Color[class*=-C86] { + color: #5FFFD7 +} + +div.highlight .-Color[class*=-BGC86] { + background-color: #5FFFD7 +} + +div.highlight .-Color[class*=-C87] { + color: #5FFFFF +} + +div.highlight .-Color[class*=-BGC87] { + background-color: #5FFFFF +} + +div.highlight .-Color[class*=-C88] { + color: #870000 +} + +div.highlight .-Color[class*=-BGC88] { + background-color: #870000 +} + +div.highlight .-Color[class*=-C89] { + color: #87005F +} + +div.highlight .-Color[class*=-BGC89] { + background-color: #87005F +} + +div.highlight .-Color[class*=-C90] { + color: #870087 +} + +div.highlight .-Color[class*=-BGC90] { + background-color: #870087 +} + +div.highlight .-Color[class*=-C91] { + color: #8700AF +} + +div.highlight .-Color[class*=-BGC91] { + background-color: #8700AF +} + +div.highlight .-Color[class*=-C92] { + color: #8700D7 +} + +div.highlight .-Color[class*=-BGC92] { + background-color: #8700D7 +} + +div.highlight .-Color[class*=-C93] { + color: #8700FF +} + +div.highlight .-Color[class*=-BGC93] { + background-color: #8700FF +} + +div.highlight .-Color[class*=-C94] { + color: #875F00 +} + +div.highlight .-Color[class*=-BGC94] { + background-color: #875F00 +} + +div.highlight .-Color[class*=-C95] { + color: #875F5F +} + +div.highlight .-Color[class*=-BGC95] { + background-color: #875F5F +} + +div.highlight .-Color[class*=-C96] { + color: #875F87 +} + +div.highlight .-Color[class*=-BGC96] { + background-color: #875F87 +} + +div.highlight .-Color[class*=-C97] { + color: #875FAF +} + +div.highlight .-Color[class*=-BGC97] { + background-color: #875FAF +} + +div.highlight .-Color[class*=-C98] { + color: #875FD7 +} + +div.highlight .-Color[class*=-BGC98] { + background-color: #875FD7 +} + +div.highlight .-Color[class*=-C99] { + color: #875FFF +} + +div.highlight .-Color[class*=-BGC99] { + background-color: #875FFF +} + +div.highlight .-Color[class*=-C100] { + color: #878700 +} + +div.highlight .-Color[class*=-BGC100] { + background-color: #878700 +} + +div.highlight .-Color[class*=-C101] { + color: #87875F +} + +div.highlight .-Color[class*=-BGC101] { + background-color: #87875F +} + +div.highlight .-Color[class*=-C102] { + color: #878787 +} + +div.highlight .-Color[class*=-BGC102] { + background-color: #878787 +} + +div.highlight .-Color[class*=-C103] { + color: #8787AF +} + +div.highlight .-Color[class*=-BGC103] { + background-color: #8787AF +} + +div.highlight .-Color[class*=-C104] { + color: #8787D7 +} + +div.highlight .-Color[class*=-BGC104] { + background-color: #8787D7 +} + +div.highlight .-Color[class*=-C105] { + color: #8787FF +} + +div.highlight .-Color[class*=-BGC105] { + background-color: #8787FF +} + +div.highlight .-Color[class*=-C106] { + color: #87AF00 +} + +div.highlight .-Color[class*=-BGC106] { + background-color: #87AF00 +} + +div.highlight .-Color[class*=-C107] { + color: #87AF5F +} + +div.highlight .-Color[class*=-BGC107] { + background-color: #87AF5F +} + +div.highlight .-Color[class*=-C108] { + color: #87AF87 +} + +div.highlight .-Color[class*=-BGC108] { + background-color: #87AF87 +} + +div.highlight .-Color[class*=-C109] { + color: #87AFAF +} + +div.highlight .-Color[class*=-BGC109] { + background-color: #87AFAF +} + +div.highlight .-Color[class*=-C110] { + color: #87AFD7 +} + +div.highlight .-Color[class*=-BGC110] { + background-color: #87AFD7 +} + +div.highlight .-Color[class*=-C111] { + color: #87AFFF +} + +div.highlight .-Color[class*=-BGC111] { + background-color: #87AFFF +} + +div.highlight .-Color[class*=-C112] { + color: #87D700 +} + +div.highlight .-Color[class*=-BGC112] { + background-color: #87D700 +} + +div.highlight .-Color[class*=-C113] { + color: #87D75F +} + +div.highlight .-Color[class*=-BGC113] { + background-color: #87D75F +} + +div.highlight .-Color[class*=-C114] { + color: #87D787 +} + +div.highlight .-Color[class*=-BGC114] { + background-color: #87D787 +} + +div.highlight .-Color[class*=-C115] { + color: #87D7AF +} + +div.highlight .-Color[class*=-BGC115] { + background-color: #87D7AF +} + +div.highlight .-Color[class*=-C116] { + color: #87D7D7 +} + +div.highlight .-Color[class*=-BGC116] { + background-color: #87D7D7 +} + +div.highlight .-Color[class*=-C117] { + color: #87D7FF +} + +div.highlight .-Color[class*=-BGC117] { + background-color: #87D7FF +} + +div.highlight .-Color[class*=-C118] { + color: #87FF00 +} + +div.highlight .-Color[class*=-BGC118] { + background-color: #87FF00 +} + +div.highlight .-Color[class*=-C119] { + color: #87FF5F +} + +div.highlight .-Color[class*=-BGC119] { + background-color: #87FF5F +} + +div.highlight .-Color[class*=-C120] { + color: #87FF87 +} + +div.highlight .-Color[class*=-BGC120] { + background-color: #87FF87 +} + +div.highlight .-Color[class*=-C121] { + color: #87FFAF +} + +div.highlight .-Color[class*=-BGC121] { + background-color: #87FFAF +} + +div.highlight .-Color[class*=-C122] { + color: #87FFD7 +} + +div.highlight .-Color[class*=-BGC122] { + background-color: #87FFD7 +} + +div.highlight .-Color[class*=-C123] { + color: #87FFFF +} + +div.highlight .-Color[class*=-BGC123] { + background-color: #87FFFF +} + +div.highlight .-Color[class*=-C124] { + color: #AF0000 +} + +div.highlight .-Color[class*=-BGC124] { + background-color: #AF0000 +} + +div.highlight .-Color[class*=-C125] { + color: #AF005F +} + +div.highlight .-Color[class*=-BGC125] { + background-color: #AF005F +} + +div.highlight .-Color[class*=-C126] { + color: #AF0087 +} + +div.highlight .-Color[class*=-BGC126] { + background-color: #AF0087 +} + +div.highlight .-Color[class*=-C127] { + color: #AF00AF +} + +div.highlight .-Color[class*=-BGC127] { + background-color: #AF00AF +} + +div.highlight .-Color[class*=-C128] { + color: #AF00D7 +} + +div.highlight .-Color[class*=-BGC128] { + background-color: #AF00D7 +} + +div.highlight .-Color[class*=-C129] { + color: #AF00FF +} + +div.highlight .-Color[class*=-BGC129] { + background-color: #AF00FF +} + +div.highlight .-Color[class*=-C130] { + color: #AF5F00 +} + +div.highlight .-Color[class*=-BGC130] { + background-color: #AF5F00 +} + +div.highlight .-Color[class*=-C131] { + color: #AF5F5F +} + +div.highlight .-Color[class*=-BGC131] { + background-color: #AF5F5F +} + +div.highlight .-Color[class*=-C132] { + color: #AF5F87 +} + +div.highlight .-Color[class*=-BGC132] { + background-color: #AF5F87 +} + +div.highlight .-Color[class*=-C133] { + color: #AF5FAF +} + +div.highlight .-Color[class*=-BGC133] { + background-color: #AF5FAF +} + +div.highlight .-Color[class*=-C134] { + color: #AF5FD7 +} + +div.highlight .-Color[class*=-BGC134] { + background-color: #AF5FD7 +} + +div.highlight .-Color[class*=-C135] { + color: #AF5FFF +} + +div.highlight .-Color[class*=-BGC135] { + background-color: #AF5FFF +} + +div.highlight .-Color[class*=-C136] { + color: #AF8700 +} + +div.highlight .-Color[class*=-BGC136] { + background-color: #AF8700 +} + +div.highlight .-Color[class*=-C137] { + color: #AF875F +} + +div.highlight .-Color[class*=-BGC137] { + background-color: #AF875F +} + +div.highlight .-Color[class*=-C138] { + color: #AF8787 +} + +div.highlight .-Color[class*=-BGC138] { + background-color: #AF8787 +} + +div.highlight .-Color[class*=-C139] { + color: #AF87AF +} + +div.highlight .-Color[class*=-BGC139] { + background-color: #AF87AF +} + +div.highlight .-Color[class*=-C140] { + color: #AF87D7 +} + +div.highlight .-Color[class*=-BGC140] { + background-color: #AF87D7 +} + +div.highlight .-Color[class*=-C141] { + color: #AF87FF +} + +div.highlight .-Color[class*=-BGC141] { + background-color: #AF87FF +} + +div.highlight .-Color[class*=-C142] { + color: #AFAF00 +} + +div.highlight .-Color[class*=-BGC142] { + background-color: #AFAF00 +} + +div.highlight .-Color[class*=-C143] { + color: #AFAF5F +} + +div.highlight .-Color[class*=-BGC143] { + background-color: #AFAF5F +} + +div.highlight .-Color[class*=-C144] { + color: #AFAF87 +} + +div.highlight .-Color[class*=-BGC144] { + background-color: #AFAF87 +} + +div.highlight .-Color[class*=-C145] { + color: #AFAFAF +} + +div.highlight .-Color[class*=-BGC145] { + background-color: #AFAFAF +} + +div.highlight .-Color[class*=-C146] { + color: #AFAFD7 +} + +div.highlight .-Color[class*=-BGC146] { + background-color: #AFAFD7 +} + +div.highlight .-Color[class*=-C147] { + color: #AFAFFF +} + +div.highlight .-Color[class*=-BGC147] { + background-color: #AFAFFF +} + +div.highlight .-Color[class*=-C148] { + color: #AFD700 +} + +div.highlight .-Color[class*=-BGC148] { + background-color: #AFD700 +} + +div.highlight .-Color[class*=-C149] { + color: #AFD75F +} + +div.highlight .-Color[class*=-BGC149] { + background-color: #AFD75F +} + +div.highlight .-Color[class*=-C150] { + color: #AFD787 +} + +div.highlight .-Color[class*=-BGC150] { + background-color: #AFD787 +} + +div.highlight .-Color[class*=-C151] { + color: #AFD7AF +} + +div.highlight .-Color[class*=-BGC151] { + background-color: #AFD7AF +} + +div.highlight .-Color[class*=-C152] { + color: #AFD7D7 +} + +div.highlight .-Color[class*=-BGC152] { + background-color: #AFD7D7 +} + +div.highlight .-Color[class*=-C153] { + color: #AFD7FF +} + +div.highlight .-Color[class*=-BGC153] { + background-color: #AFD7FF +} + +div.highlight .-Color[class*=-C154] { + color: #AFFF00 +} + +div.highlight .-Color[class*=-BGC154] { + background-color: #AFFF00 +} + +div.highlight .-Color[class*=-C155] { + color: #AFFF5F +} + +div.highlight .-Color[class*=-BGC155] { + background-color: #AFFF5F +} + +div.highlight .-Color[class*=-C156] { + color: #AFFF87 +} + +div.highlight .-Color[class*=-BGC156] { + background-color: #AFFF87 +} + +div.highlight .-Color[class*=-C157] { + color: #AFFFAF +} + +div.highlight .-Color[class*=-BGC157] { + background-color: #AFFFAF +} + +div.highlight .-Color[class*=-C158] { + color: #AFFFD7 +} + +div.highlight .-Color[class*=-BGC158] { + background-color: #AFFFD7 +} + +div.highlight .-Color[class*=-C159] { + color: #AFFFFF +} + +div.highlight .-Color[class*=-BGC159] { + background-color: #AFFFFF +} + +div.highlight .-Color[class*=-C160] { + color: #D70000 +} + +div.highlight .-Color[class*=-BGC160] { + background-color: #D70000 +} + +div.highlight .-Color[class*=-C161] { + color: #D7005F +} + +div.highlight .-Color[class*=-BGC161] { + background-color: #D7005F +} + +div.highlight .-Color[class*=-C162] { + color: #D70087 +} + +div.highlight .-Color[class*=-BGC162] { + background-color: #D70087 +} + +div.highlight .-Color[class*=-C163] { + color: #D700AF +} + +div.highlight .-Color[class*=-BGC163] { + background-color: #D700AF +} + +div.highlight .-Color[class*=-C164] { + color: #D700D7 +} + +div.highlight .-Color[class*=-BGC164] { + background-color: #D700D7 +} + +div.highlight .-Color[class*=-C165] { + color: #D700FF +} + +div.highlight .-Color[class*=-BGC165] { + background-color: #D700FF +} + +div.highlight .-Color[class*=-C166] { + color: #D75F00 +} + +div.highlight .-Color[class*=-BGC166] { + background-color: #D75F00 +} + +div.highlight .-Color[class*=-C167] { + color: #D75F5F +} + +div.highlight .-Color[class*=-BGC167] { + background-color: #D75F5F +} + +div.highlight .-Color[class*=-C168] { + color: #D75F87 +} + +div.highlight .-Color[class*=-BGC168] { + background-color: #D75F87 +} + +div.highlight .-Color[class*=-C169] { + color: #D75FAF +} + +div.highlight .-Color[class*=-BGC169] { + background-color: #D75FAF +} + +div.highlight .-Color[class*=-C170] { + color: #D75FD7 +} + +div.highlight .-Color[class*=-BGC170] { + background-color: #D75FD7 +} + +div.highlight .-Color[class*=-C171] { + color: #D75FFF +} + +div.highlight .-Color[class*=-BGC171] { + background-color: #D75FFF +} + +div.highlight .-Color[class*=-C172] { + color: #D78700 +} + +div.highlight .-Color[class*=-BGC172] { + background-color: #D78700 +} + +div.highlight .-Color[class*=-C173] { + color: #D7875F +} + +div.highlight .-Color[class*=-BGC173] { + background-color: #D7875F +} + +div.highlight .-Color[class*=-C174] { + color: #D78787 +} + +div.highlight .-Color[class*=-BGC174] { + background-color: #D78787 +} + +div.highlight .-Color[class*=-C175] { + color: #D787AF +} + +div.highlight .-Color[class*=-BGC175] { + background-color: #D787AF +} + +div.highlight .-Color[class*=-C176] { + color: #D787D7 +} + +div.highlight .-Color[class*=-BGC176] { + background-color: #D787D7 +} + +div.highlight .-Color[class*=-C177] { + color: #D787FF +} + +div.highlight .-Color[class*=-BGC177] { + background-color: #D787FF +} + +div.highlight .-Color[class*=-C178] { + color: #D7AF00 +} + +div.highlight .-Color[class*=-BGC178] { + background-color: #D7AF00 +} + +div.highlight .-Color[class*=-C179] { + color: #D7AF5F +} + +div.highlight .-Color[class*=-BGC179] { + background-color: #D7AF5F +} + +div.highlight .-Color[class*=-C180] { + color: #D7AF87 +} + +div.highlight .-Color[class*=-BGC180] { + background-color: #D7AF87 +} + +div.highlight .-Color[class*=-C181] { + color: #D7AFAF +} + +div.highlight .-Color[class*=-BGC181] { + background-color: #D7AFAF +} + +div.highlight .-Color[class*=-C182] { + color: #D7AFD7 +} + +div.highlight .-Color[class*=-BGC182] { + background-color: #D7AFD7 +} + +div.highlight .-Color[class*=-C183] { + color: #D7AFFF +} + +div.highlight .-Color[class*=-BGC183] { + background-color: #D7AFFF +} + +div.highlight .-Color[class*=-C184] { + color: #D7D700 +} + +div.highlight .-Color[class*=-BGC184] { + background-color: #D7D700 +} + +div.highlight .-Color[class*=-C185] { + color: #D7D75F +} + +div.highlight .-Color[class*=-BGC185] { + background-color: #D7D75F +} + +div.highlight .-Color[class*=-C186] { + color: #D7D787 +} + +div.highlight .-Color[class*=-BGC186] { + background-color: #D7D787 +} + +div.highlight .-Color[class*=-C187] { + color: #D7D7AF +} + +div.highlight .-Color[class*=-BGC187] { + background-color: #D7D7AF +} + +div.highlight .-Color[class*=-C188] { + color: #D7D7D7 +} + +div.highlight .-Color[class*=-BGC188] { + background-color: #D7D7D7 +} + +div.highlight .-Color[class*=-C189] { + color: #D7D7FF +} + +div.highlight .-Color[class*=-BGC189] { + background-color: #D7D7FF +} + +div.highlight .-Color[class*=-C190] { + color: #D7FF00 +} + +div.highlight .-Color[class*=-BGC190] { + background-color: #D7FF00 +} + +div.highlight .-Color[class*=-C191] { + color: #D7FF5F +} + +div.highlight .-Color[class*=-BGC191] { + background-color: #D7FF5F +} + +div.highlight .-Color[class*=-C192] { + color: #D7FF87 +} + +div.highlight .-Color[class*=-BGC192] { + background-color: #D7FF87 +} + +div.highlight .-Color[class*=-C193] { + color: #D7FFAF +} + +div.highlight .-Color[class*=-BGC193] { + background-color: #D7FFAF +} + +div.highlight .-Color[class*=-C194] { + color: #D7FFD7 +} + +div.highlight .-Color[class*=-BGC194] { + background-color: #D7FFD7 +} + +div.highlight .-Color[class*=-C195] { + color: #D7FFFF +} + +div.highlight .-Color[class*=-BGC195] { + background-color: #D7FFFF +} + +div.highlight .-Color[class*=-C196] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC196] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C197] { + color: #FF005F +} + +div.highlight .-Color[class*=-BGC197] { + background-color: #FF005F +} + +div.highlight .-Color[class*=-C198] { + color: #FF0087 +} + +div.highlight .-Color[class*=-BGC198] { + background-color: #FF0087 +} + +div.highlight .-Color[class*=-C199] { + color: #FF00AF +} + +div.highlight .-Color[class*=-BGC199] { + background-color: #FF00AF +} + +div.highlight .-Color[class*=-C200] { + color: #FF00D7 +} + +div.highlight .-Color[class*=-BGC200] { + background-color: #FF00D7 +} + +div.highlight .-Color[class*=-C201] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC201] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C202] { + color: #FF5F00 +} + +div.highlight .-Color[class*=-BGC202] { + background-color: #FF5F00 +} + +div.highlight .-Color[class*=-C203] { + color: #FF5F5F +} + +div.highlight .-Color[class*=-BGC203] { + background-color: #FF5F5F +} + +div.highlight .-Color[class*=-C204] { + color: #FF5F87 +} + +div.highlight .-Color[class*=-BGC204] { + background-color: #FF5F87 +} + +div.highlight .-Color[class*=-C205] { + color: #FF5FAF +} + +div.highlight .-Color[class*=-BGC205] { + background-color: #FF5FAF +} + +div.highlight .-Color[class*=-C206] { + color: #FF5FD7 +} + +div.highlight .-Color[class*=-BGC206] { + background-color: #FF5FD7 +} + +div.highlight .-Color[class*=-C207] { + color: #FF5FFF +} + +div.highlight .-Color[class*=-BGC207] { + background-color: #FF5FFF +} + +div.highlight .-Color[class*=-C208] { + color: #FF8700 +} + +div.highlight .-Color[class*=-BGC208] { + background-color: #FF8700 +} + +div.highlight .-Color[class*=-C209] { + color: #FF875F +} + +div.highlight .-Color[class*=-BGC209] { + background-color: #FF875F +} + +div.highlight .-Color[class*=-C210] { + color: #FF8787 +} + +div.highlight .-Color[class*=-BGC210] { + background-color: #FF8787 +} + +div.highlight .-Color[class*=-C211] { + color: #FF87AF +} + +div.highlight .-Color[class*=-BGC211] { + background-color: #FF87AF +} + +div.highlight .-Color[class*=-C212] { + color: #FF87D7 +} + +div.highlight .-Color[class*=-BGC212] { + background-color: #FF87D7 +} + +div.highlight .-Color[class*=-C213] { + color: #FF87FF +} + +div.highlight .-Color[class*=-BGC213] { + background-color: #FF87FF +} + +div.highlight .-Color[class*=-C214] { + color: #FFAF00 +} + +div.highlight .-Color[class*=-BGC214] { + background-color: #FFAF00 +} + +div.highlight .-Color[class*=-C215] { + color: #FFAF5F +} + +div.highlight .-Color[class*=-BGC215] { + background-color: #FFAF5F +} + +div.highlight .-Color[class*=-C216] { + color: #FFAF87 +} + +div.highlight .-Color[class*=-BGC216] { + background-color: #FFAF87 +} + +div.highlight .-Color[class*=-C217] { + color: #FFAFAF +} + +div.highlight .-Color[class*=-BGC217] { + background-color: #FFAFAF +} + +div.highlight .-Color[class*=-C218] { + color: #FFAFD7 +} + +div.highlight .-Color[class*=-BGC218] { + background-color: #FFAFD7 +} + +div.highlight .-Color[class*=-C219] { + color: #FFAFFF +} + +div.highlight .-Color[class*=-BGC219] { + background-color: #FFAFFF +} + +div.highlight .-Color[class*=-C220] { + color: #FFD700 +} + +div.highlight .-Color[class*=-BGC220] { + background-color: #FFD700 +} + +div.highlight .-Color[class*=-C221] { + color: #FFD75F +} + +div.highlight .-Color[class*=-BGC221] { + background-color: #FFD75F +} + +div.highlight .-Color[class*=-C222] { + color: #FFD787 +} + +div.highlight .-Color[class*=-BGC222] { + background-color: #FFD787 +} + +div.highlight .-Color[class*=-C223] { + color: #FFD7AF +} + +div.highlight .-Color[class*=-BGC223] { + background-color: #FFD7AF +} + +div.highlight .-Color[class*=-C224] { + color: #FFD7D7 +} + +div.highlight .-Color[class*=-BGC224] { + background-color: #FFD7D7 +} + +div.highlight .-Color[class*=-C225] { + color: #FFD7FF +} + +div.highlight .-Color[class*=-BGC225] { + background-color: #FFD7FF +} + +div.highlight .-Color[class*=-C226] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC226] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C227] { + color: #FFFF5F +} + +div.highlight .-Color[class*=-BGC227] { + background-color: #FFFF5F +} + +div.highlight .-Color[class*=-C228] { + color: #FFFF87 +} + +div.highlight .-Color[class*=-BGC228] { + background-color: #FFFF87 +} + +div.highlight .-Color[class*=-C229] { + color: #FFFFAF +} + +div.highlight .-Color[class*=-BGC229] { + background-color: #FFFFAF +} + +div.highlight .-Color[class*=-C230] { + color: #FFFFD7 +} + +div.highlight .-Color[class*=-BGC230] { + background-color: #FFFFD7 +} + +div.highlight .-Color[class*=-C231] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC231] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C232] { + color: #080808 +} + +div.highlight .-Color[class*=-BGC232] { + background-color: #080808 +} + +div.highlight .-Color[class*=-C233] { + color: #121212 +} + +div.highlight .-Color[class*=-BGC233] { + background-color: #121212 +} + +div.highlight .-Color[class*=-C234] { + color: #1C1C1C +} + +div.highlight .-Color[class*=-BGC234] { + background-color: #1C1C1C +} + +div.highlight .-Color[class*=-C235] { + color: #262626 +} + +div.highlight .-Color[class*=-BGC235] { + background-color: #262626 +} + +div.highlight .-Color[class*=-C236] { + color: #303030 +} + +div.highlight .-Color[class*=-BGC236] { + background-color: #303030 +} + +div.highlight .-Color[class*=-C237] { + color: #3A3A3A +} + +div.highlight .-Color[class*=-BGC237] { + background-color: #3A3A3A +} + +div.highlight .-Color[class*=-C238] { + color: #444444 +} + +div.highlight .-Color[class*=-BGC238] { + background-color: #444444 +} + +div.highlight .-Color[class*=-C239] { + color: #4E4E4E +} + +div.highlight .-Color[class*=-BGC239] { + background-color: #4E4E4E +} + +div.highlight .-Color[class*=-C240] { + color: #585858 +} + +div.highlight .-Color[class*=-BGC240] { + background-color: #585858 +} + +div.highlight .-Color[class*=-C241] { + color: #626262 +} + +div.highlight .-Color[class*=-BGC241] { + background-color: #626262 +} + +div.highlight .-Color[class*=-C242] { + color: #6C6C6C +} + +div.highlight .-Color[class*=-BGC242] { + background-color: #6C6C6C +} + +div.highlight .-Color[class*=-C243] { + color: #767676 +} + +div.highlight .-Color[class*=-BGC243] { + background-color: #767676 +} + +div.highlight .-Color[class*=-C244] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC244] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C245] { + color: #8A8A8A +} + +div.highlight .-Color[class*=-BGC245] { + background-color: #8A8A8A +} + +div.highlight .-Color[class*=-C246] { + color: #949494 +} + +div.highlight .-Color[class*=-BGC246] { + background-color: #949494 +} + +div.highlight .-Color[class*=-C247] { + color: #9E9E9E +} + +div.highlight .-Color[class*=-BGC247] { + background-color: #9E9E9E +} + +div.highlight .-Color[class*=-C248] { + color: #A8A8A8 +} + +div.highlight .-Color[class*=-BGC248] { + background-color: #A8A8A8 +} + +div.highlight .-Color[class*=-C249] { + color: #B2B2B2 +} + +div.highlight .-Color[class*=-BGC249] { + background-color: #B2B2B2 +} + +div.highlight .-Color[class*=-C250] { + color: #BCBCBC +} + +div.highlight .-Color[class*=-BGC250] { + background-color: #BCBCBC +} + +div.highlight .-Color[class*=-C251] { + color: #C6C6C6 +} + +div.highlight .-Color[class*=-BGC251] { + background-color: #C6C6C6 +} + +div.highlight .-Color[class*=-C252] { + color: #D0D0D0 +} + +div.highlight .-Color[class*=-BGC252] { + background-color: #D0D0D0 +} + +div.highlight .-Color[class*=-C253] { + color: #DADADA +} + +div.highlight .-Color[class*=-BGC253] { + background-color: #DADADA +} + +div.highlight .-Color[class*=-C254] { + color: #E4E4E4 +} + +div.highlight .-Color[class*=-BGC254] { + background-color: #E4E4E4 +} + +div.highlight .-Color[class*=-C255] { + color: #EEEEEE +} + +div.highlight .-Color[class*=-BGC255] { + background-color: #EEEEEE +} diff --git a/_build/html/_static/play-solid.svg b/_build/html/_static/play-solid.svg new file mode 100644 index 0000000..bcd81f7 --- /dev/null +++ b/_build/html/_static/play-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_build/html/_static/plus.png b/_build/html/_static/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..7107cec93a979b9a5f64843235a16651d563ce2d GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^+#t*WBp7;*Yy1LIik>cxAr*|t7R?Mi>2?kWtu>-2 m3q%Vub%g%s<8sJhVPMczOq}xhg9DJoz~JfX=d#Wzp$Pyb1r*Kz literal 0 HcmV?d00001 diff --git a/_build/html/_static/pygments.css b/_build/html/_static/pygments.css new file mode 100644 index 0000000..d7dd577 --- /dev/null +++ b/_build/html/_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: #fae4c2 } +html[data-theme="light"] .highlight { background: #fefefe; color: #080808 } +html[data-theme="light"] .highlight .c { color: #515151 } /* Comment */ +html[data-theme="light"] .highlight .err { color: #A12236 } /* Error */ +html[data-theme="light"] .highlight .k { color: #6730C5 } /* Keyword */ +html[data-theme="light"] .highlight .l { color: #7F4707 } /* Literal */ +html[data-theme="light"] .highlight .n { color: #080808 } /* Name */ +html[data-theme="light"] .highlight .o { color: #00622F } /* Operator */ +html[data-theme="light"] .highlight .p { color: #080808 } /* Punctuation */ +html[data-theme="light"] .highlight .ch { color: #515151 } /* Comment.Hashbang */ +html[data-theme="light"] .highlight .cm { color: #515151 } /* Comment.Multiline */ +html[data-theme="light"] .highlight .cp { color: #515151 } /* Comment.Preproc */ +html[data-theme="light"] .highlight .cpf { color: #515151 } /* Comment.PreprocFile */ +html[data-theme="light"] .highlight .c1 { color: #515151 } /* Comment.Single */ +html[data-theme="light"] .highlight .cs { color: #515151 } /* Comment.Special */ +html[data-theme="light"] .highlight .gd { color: #005B82 } /* Generic.Deleted */ +html[data-theme="light"] .highlight .ge { font-style: italic } /* Generic.Emph */ +html[data-theme="light"] .highlight .gh { color: #005B82 } /* Generic.Heading */ +html[data-theme="light"] .highlight .gs { font-weight: bold } /* Generic.Strong */ +html[data-theme="light"] .highlight .gu { color: #005B82 } /* Generic.Subheading */ +html[data-theme="light"] .highlight .kc { color: #6730C5 } /* Keyword.Constant */ +html[data-theme="light"] .highlight .kd { color: #6730C5 } /* Keyword.Declaration */ +html[data-theme="light"] .highlight .kn { color: #6730C5 } /* Keyword.Namespace */ +html[data-theme="light"] .highlight .kp { color: #6730C5 } /* Keyword.Pseudo */ +html[data-theme="light"] .highlight .kr { color: #6730C5 } /* Keyword.Reserved */ +html[data-theme="light"] .highlight .kt { color: #7F4707 } /* Keyword.Type */ +html[data-theme="light"] .highlight .ld { color: #7F4707 } /* Literal.Date */ +html[data-theme="light"] .highlight .m { color: #7F4707 } /* Literal.Number */ +html[data-theme="light"] .highlight .s { color: #00622F } /* Literal.String */ +html[data-theme="light"] .highlight .na { color: #912583 } /* Name.Attribute */ +html[data-theme="light"] .highlight .nb { color: #7F4707 } /* Name.Builtin */ +html[data-theme="light"] .highlight .nc { color: #005B82 } /* Name.Class */ +html[data-theme="light"] .highlight .no { color: #005B82 } /* Name.Constant */ +html[data-theme="light"] .highlight .nd { color: #7F4707 } /* Name.Decorator */ +html[data-theme="light"] .highlight .ni { color: #00622F } /* Name.Entity */ +html[data-theme="light"] .highlight .ne { color: #6730C5 } /* Name.Exception */ +html[data-theme="light"] .highlight .nf { color: #005B82 } /* Name.Function */ +html[data-theme="light"] .highlight .nl { color: #7F4707 } /* Name.Label */ +html[data-theme="light"] .highlight .nn { color: #080808 } /* Name.Namespace */ +html[data-theme="light"] .highlight .nx { color: #080808 } /* Name.Other */ +html[data-theme="light"] .highlight .py { color: #005B82 } /* Name.Property */ +html[data-theme="light"] .highlight .nt { color: #005B82 } /* Name.Tag */ +html[data-theme="light"] .highlight .nv { color: #A12236 } /* Name.Variable */ +html[data-theme="light"] .highlight .ow { color: #6730C5 } /* Operator.Word */ +html[data-theme="light"] .highlight .pm { color: #080808 } /* Punctuation.Marker */ +html[data-theme="light"] .highlight .w { color: #080808 } /* Text.Whitespace */ +html[data-theme="light"] .highlight .mb { color: #7F4707 } /* Literal.Number.Bin */ +html[data-theme="light"] .highlight .mf { color: #7F4707 } /* Literal.Number.Float */ +html[data-theme="light"] .highlight .mh { color: #7F4707 } /* Literal.Number.Hex */ +html[data-theme="light"] .highlight .mi { color: #7F4707 } /* Literal.Number.Integer */ +html[data-theme="light"] .highlight .mo { color: #7F4707 } /* Literal.Number.Oct */ +html[data-theme="light"] .highlight .sa { color: #00622F } /* Literal.String.Affix */ +html[data-theme="light"] .highlight .sb { color: #00622F } /* Literal.String.Backtick */ +html[data-theme="light"] .highlight .sc { color: #00622F } /* Literal.String.Char */ +html[data-theme="light"] .highlight .dl { color: #00622F } /* Literal.String.Delimiter */ +html[data-theme="light"] .highlight .sd { color: #00622F } /* Literal.String.Doc */ +html[data-theme="light"] .highlight .s2 { color: #00622F } /* Literal.String.Double */ +html[data-theme="light"] .highlight .se { color: #00622F } /* Literal.String.Escape */ +html[data-theme="light"] .highlight .sh { color: #00622F } /* Literal.String.Heredoc */ +html[data-theme="light"] .highlight .si { color: #00622F } /* Literal.String.Interpol */ +html[data-theme="light"] .highlight .sx { color: #00622F } /* Literal.String.Other */ +html[data-theme="light"] .highlight .sr { color: #A12236 } /* Literal.String.Regex */ +html[data-theme="light"] .highlight .s1 { color: #00622F } /* Literal.String.Single */ +html[data-theme="light"] .highlight .ss { color: #005B82 } /* Literal.String.Symbol */ +html[data-theme="light"] .highlight .bp { color: #7F4707 } /* Name.Builtin.Pseudo */ +html[data-theme="light"] .highlight .fm { color: #005B82 } /* Name.Function.Magic */ +html[data-theme="light"] .highlight .vc { color: #A12236 } /* Name.Variable.Class */ +html[data-theme="light"] .highlight .vg { color: #A12236 } /* Name.Variable.Global */ +html[data-theme="light"] .highlight .vi { color: #A12236 } /* Name.Variable.Instance */ +html[data-theme="light"] .highlight .vm { color: #7F4707 } /* Name.Variable.Magic */ +html[data-theme="light"] .highlight .il { color: #7F4707 } /* 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/_build/html/_static/sbt-webpack-macros.html b/_build/html/_static/sbt-webpack-macros.html new file mode 100644 index 0000000..6cbf559 --- /dev/null +++ b/_build/html/_static/sbt-webpack-macros.html @@ -0,0 +1,11 @@ + +{% macro head_pre_bootstrap() %} + +{% endmacro %} + +{% macro body_post() %} + +{% endmacro %} diff --git a/_build/html/_static/scripts/bootstrap.js b/_build/html/_static/scripts/bootstrap.js new file mode 100644 index 0000000..c8178de --- /dev/null +++ b/_build/html/_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:()=>E,afterRead:()=>v,afterWrite:()=>C,applyStyles:()=>$,arrow:()=>J,auto:()=>a,basePlacements:()=>l,beforeMain:()=>y,beforeRead:()=>_,beforeWrite:()=>A,bottom:()=>s,clippingParents:()=>d,computeStyles:()=>it,createPopper:()=>Dt,createPopperBase:()=>St,createPopperLite:()=>$t,detectOverflow:()=>_t,end:()=>h,eventListeners:()=>st,flip:()=>bt,hide:()=>wt,left:()=>r,main:()=>w,modifierPhases:()=>O,offset:()=>Et,placements:()=>g,popper:()=>f,popperGenerator:()=>Lt,popperOffsets:()=>At,preventOverflow:()=>Tt,read:()=>b,reference:()=>p,right:()=>o,start:()=>c,top:()=>n,variationPlacements:()=>m,viewport:()=>u,write:()=>T});var i={};t.r(i),t.d(i,{Alert:()=>Oe,Button:()=>ke,Carousel:()=>li,Collapse:()=>Ei,Dropdown:()=>Ki,Modal:()=>Ln,Offcanvas:()=>Kn,Popover:()=>bs,ScrollSpy:()=>Ls,Tab:()=>Js,Toast:()=>po,Tooltip:()=>fs});var n="top",s="bottom",o="right",r="left",a="auto",l=[n,s,o,r],c="start",h="end",d="clippingParents",u="viewport",f="popper",p="reference",m=l.reduce((function(t,e){return t.concat([e+"-"+c,e+"-"+h])}),[]),g=[].concat(l,[a]).reduce((function(t,e){return t.concat([e,e+"-"+c,e+"-"+h])}),[]),_="beforeRead",b="read",v="afterRead",y="beforeMain",w="main",E="afterMain",A="beforeWrite",T="write",C="afterWrite",O=[_,b,v,y,w,E,A,T,C];function x(t){return t?(t.nodeName||"").toLowerCase():null}function k(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function L(t){return t instanceof k(t).Element||t instanceof Element}function S(t){return t instanceof k(t).HTMLElement||t instanceof HTMLElement}function D(t){return"undefined"!=typeof ShadowRoot&&(t instanceof k(t).ShadowRoot||t instanceof ShadowRoot)}const $={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];S(s)&&x(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}),{});S(n)&&x(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function I(t){return t.split("-")[0]}var N=Math.max,P=Math.min,M=Math.round;function j(){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 F(){return!/^((?!chrome|android).)*safari/i.test(j())}function H(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&S(t)&&(s=t.offsetWidth>0&&M(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&M(n.height)/t.offsetHeight||1);var r=(L(t)?k(t):window).visualViewport,a=!F()&&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 B(t){var e=H(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 W(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&D(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function z(t){return k(t).getComputedStyle(t)}function R(t){return["table","td","th"].indexOf(x(t))>=0}function q(t){return((L(t)?t.ownerDocument:t.document)||window.document).documentElement}function V(t){return"html"===x(t)?t:t.assignedSlot||t.parentNode||(D(t)?t.host:null)||q(t)}function Y(t){return S(t)&&"fixed"!==z(t).position?t.offsetParent:null}function K(t){for(var e=k(t),i=Y(t);i&&R(i)&&"static"===z(i).position;)i=Y(i);return i&&("html"===x(i)||"body"===x(i)&&"static"===z(i).position)?e:i||function(t){var e=/firefox/i.test(j());if(/Trident/i.test(j())&&S(t)&&"fixed"===z(t).position)return null;var i=V(t);for(D(i)&&(i=i.host);S(i)&&["html","body"].indexOf(x(i))<0;){var n=z(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 Q(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function X(t,e,i){return N(t,P(e,i))}function U(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function G(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const J={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,a=t.name,c=t.options,h=i.elements.arrow,d=i.modifiersData.popperOffsets,u=I(i.placement),f=Q(u),p=[r,o].indexOf(u)>=0?"height":"width";if(h&&d){var m=function(t,e){return U("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:G(t,l))}(c.padding,i),g=B(h),_="y"===f?n:r,b="y"===f?s:o,v=i.rects.reference[p]+i.rects.reference[f]-d[f]-i.rects.popper[p],y=d[f]-i.rects.reference[f],w=K(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=X(T,O,C),k=f;i.modifiersData[a]=((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)))&&W(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Z(t){return t.split("-")[1]}var tt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function et(t){var e,i=t.popper,a=t.popperRect,l=t.placement,c=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=r,C=n,O=window;if(p){var x=K(i),L="clientHeight",S="clientWidth";x===k(i)&&"static"!==z(x=q(i)).position&&"absolute"===u&&(L="scrollHeight",S="scrollWidth"),(l===n||(l===r||l===o)&&c===h)&&(C=s,y-=(g&&x===O&&O.visualViewport?O.visualViewport.height:x[L])-a.height,y*=f?1:-1),l!==r&&(l!==n&&l!==s||c!==h)||(T=o,b-=(g&&x===O&&O.visualViewport?O.visualViewport.width:x[S])-a.width,b*=f?1:-1)}var D,$=Object.assign({position:u},p&&tt),I=!0===m?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:M(i*s)/s||0,y:M(n*s)/s||0}}({x:b,y},k(i)):{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 it={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:I(e.placement),variation:Z(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,et(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,et(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 nt={passive:!0};const st={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=k(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,nt)})),a&&l.addEventListener("resize",i.update,nt),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,nt)})),a&&l.removeEventListener("resize",i.update,nt)}},data:{}};var ot={left:"right",right:"left",bottom:"top",top:"bottom"};function rt(t){return t.replace(/left|right|bottom|top/g,(function(t){return ot[t]}))}var at={start:"end",end:"start"};function lt(t){return t.replace(/start|end/g,(function(t){return at[t]}))}function ct(t){var e=k(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function ht(t){return H(q(t)).left+ct(t).scrollLeft}function dt(t){var e=z(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function ut(t){return["html","body","#document"].indexOf(x(t))>=0?t.ownerDocument.body:S(t)&&dt(t)?t:ut(V(t))}function ft(t,e){var i;void 0===e&&(e=[]);var n=ut(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=k(n),r=s?[o].concat(o.visualViewport||[],dt(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(ft(V(r)))}function pt(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function mt(t,e,i){return e===u?pt(function(t,e){var i=k(t),n=q(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=F();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+ht(t),y:l}}(t,i)):L(e)?function(t,e){var i=H(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):pt(function(t){var e,i=q(t),n=ct(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=N(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=N(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+ht(t),l=-n.scrollTop;return"rtl"===z(s||i).direction&&(a+=N(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(q(t)))}function gt(t){var e,i=t.reference,a=t.element,l=t.placement,d=l?I(l):null,u=l?Z(l):null,f=i.x+i.width/2-a.width/2,p=i.y+i.height/2-a.height/2;switch(d){case n:e={x:f,y:i.y-a.height};break;case s:e={x:f,y:i.y+i.height};break;case o:e={x:i.x+i.width,y:p};break;case r:e={x:i.x-a.width,y:p};break;default:e={x:i.x,y:i.y}}var m=d?Q(d):null;if(null!=m){var g="y"===m?"height":"width";switch(u){case c:e[m]=e[m]-(i[g]/2-a[g]/2);break;case h:e[m]=e[m]+(i[g]/2-a[g]/2)}}return e}function _t(t,e){void 0===e&&(e={});var i=e,r=i.placement,a=void 0===r?t.placement:r,c=i.strategy,h=void 0===c?t.strategy:c,m=i.boundary,g=void 0===m?d:m,_=i.rootBoundary,b=void 0===_?u:_,v=i.elementContext,y=void 0===v?f:v,w=i.altBoundary,E=void 0!==w&&w,A=i.padding,T=void 0===A?0:A,C=U("number"!=typeof T?T:G(T,l)),O=y===f?p:f,k=t.rects.popper,D=t.elements[E?O:y],$=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=ft(V(t)),i=["absolute","fixed"].indexOf(z(t).position)>=0&&S(t)?K(t):t;return L(i)?e.filter((function(t){return L(t)&&W(t,i)&&"body"!==x(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=mt(t,i,n);return e.top=N(s.top,e.top),e.right=P(s.right,e.right),e.bottom=P(s.bottom,e.bottom),e.left=N(s.left,e.left),e}),mt(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}(L(D)?D:D.contextElement||q(t.elements.popper),g,b,h),I=H(t.elements.reference),M=gt({reference:I,element:k,strategy:"absolute",placement:a}),j=pt(Object.assign({},k,M)),F=y===f?j:I,B={top:$.top-F.top+C.top,bottom:F.bottom-$.bottom+C.bottom,left:$.left-F.left+C.left,right:F.right-$.right+C.right},R=t.modifiersData.offset;if(y===f&&R){var Y=R[a];Object.keys(B).forEach((function(t){var e=[o,s].indexOf(t)>=0?1:-1,i=[n,s].indexOf(t)>=0?"y":"x";B[t]+=Y[i]*e}))}return B}const bt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,h=t.name;if(!e.modifiersData[h]._skip){for(var d=i.mainAxis,u=void 0===d||d,f=i.altAxis,p=void 0===f||f,_=i.fallbackPlacements,b=i.padding,v=i.boundary,y=i.rootBoundary,w=i.altBoundary,E=i.flipVariations,A=void 0===E||E,T=i.allowedAutoPlacements,C=e.options.placement,O=I(C),x=_||(O!==C&&A?function(t){if(I(t)===a)return[];var e=rt(t);return[lt(t),e,lt(e)]}(C):[rt(C)]),k=[C].concat(x).reduce((function(t,i){return t.concat(I(i)===a?function(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,c=i.allowedAutoPlacements,h=void 0===c?g:c,d=Z(n),u=d?a?m:m.filter((function(t){return Z(t)===d})):l,f=u.filter((function(t){return h.indexOf(t)>=0}));0===f.length&&(f=u);var p=f.reduce((function(e,i){return e[i]=_t(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[I(i)],e}),{});return Object.keys(p).sort((function(t,e){return p[t]-p[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,$=!0,N=k[0],P=0;P=0,B=H?"width":"height",W=_t(e,{placement:M,boundary:v,rootBoundary:y,altBoundary:w,padding:b}),z=H?F?o:r:F?s:n;L[B]>S[B]&&(z=rt(z));var R=rt(z),q=[];if(u&&q.push(W[j]<=0),p&&q.push(W[z]<=0,W[R]<=0),q.every((function(t){return t}))){N=M,$=!1;break}D.set(M,q)}if($)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 vt(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 yt(t){return[n,o,s,r].some((function(e){return t[e]>=0}))}const wt={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=_t(e,{elementContext:"reference"}),a=_t(e,{altBoundary:!0}),l=vt(r,n),c=vt(a,s,o),h=yt(l),d=yt(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})}},Et={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,s=t.name,a=i.offset,l=void 0===a?[0,0]:a,c=g.reduce((function(t,i){return t[i]=function(t,e,i){var s=I(t),a=[r,n].indexOf(s)>=0?-1:1,l="function"==typeof i?i(Object.assign({},e,{placement:t})):i,c=l[0],h=l[1];return c=c||0,h=(h||0)*a,[r,o].indexOf(s)>=0?{x:h,y:c}:{x:c,y:h}}(i,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[s]=c}},At={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=gt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},Tt={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,a=t.name,l=i.mainAxis,h=void 0===l||l,d=i.altAxis,u=void 0!==d&&d,f=i.boundary,p=i.rootBoundary,m=i.altBoundary,g=i.padding,_=i.tether,b=void 0===_||_,v=i.tetherOffset,y=void 0===v?0:v,w=_t(e,{boundary:f,rootBoundary:p,padding:g,altBoundary:m}),E=I(e.placement),A=Z(e.placement),T=!A,C=Q(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),$=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,M={x:0,y:0};if(x){if(h){var j,F="y"===C?n:r,H="y"===C?s:o,W="y"===C?"height":"width",z=x[C],R=z+w[F],q=z-w[H],V=b?-L[W]/2:0,Y=A===c?k[W]:L[W],U=A===c?-L[W]:-k[W],G=e.elements.arrow,J=b&&G?B(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[H],nt=X(0,k[W],J[W]),st=T?k[W]/2-V-nt-et-D.mainAxis:Y-nt-et-D.mainAxis,ot=T?-k[W]/2+V+nt+it+D.mainAxis:U+nt+it+D.mainAxis,rt=e.elements.arrow&&K(e.elements.arrow),at=rt?"y"===C?rt.clientTop||0:rt.clientLeft||0:0,lt=null!=(j=null==$?void 0:$[C])?j:0,ct=z+ot-lt,ht=X(b?P(R,z+st-lt-at):R,z,b?N(q,ct):q);x[C]=ht,M[C]=ht-z}if(u){var dt,ut="x"===C?n:r,ft="x"===C?s:o,pt=x[O],mt="y"===O?"height":"width",gt=pt+w[ut],bt=pt-w[ft],vt=-1!==[n,r].indexOf(E),yt=null!=(dt=null==$?void 0:$[O])?dt:0,wt=vt?gt: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=X(t,e,i);return n>i?i:n}(wt,pt,Et):X(b?wt:gt,pt,b?Et:bt);x[O]=At,M[O]=At-pt}e.modifiersData[a]=M}},requiresIfExists:["offset"]};function Ct(t,e,i){void 0===i&&(i=!1);var n,s,o=S(e),r=S(e)&&function(t){var e=t.getBoundingClientRect(),i=M(e.width)/t.offsetWidth||1,n=M(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=q(e),l=H(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==x(e)||dt(a))&&(c=(n=e)!==k(n)&&S(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ct(n)),S(e)?((h=H(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=ht(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function Ot(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 xt={placement:"bottom",modifiers:[],strategy:"absolute"};function kt(){for(var t=arguments.length,e=new Array(t),i=0;iIt.has(t)&&It.get(t).get(e)||null,remove(t,e){if(!It.has(t))return;const i=It.get(t);i.delete(e),0===i.size&&It.delete(t)}},Pt="transitionend",Mt=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),jt=t=>{t.dispatchEvent(new Event(Pt))},Ft=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),Ht=t=>Ft(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(Mt(t)):null,Bt=t=>{if(!Ft(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},Wt=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),zt=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?zt(t.parentNode):null},Rt=()=>{},qt=t=>{t.offsetHeight},Vt=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,Yt=[],Kt=()=>"rtl"===document.documentElement.dir,Qt=t=>{var e;e=()=>{const e=Vt();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?(Yt.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of Yt)t()})),Yt.push(e)):e()},Xt=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,Ut=(t,e,i=!0)=>{if(!i)return void Xt(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(Pt,o),Xt(t))};e.addEventListener(Pt,o),setTimeout((()=>{s||jt(e)}),n)},Gt=(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))])},Jt=/[^.]*(?=\..*)\.|.*/,Zt=/\..*/,te=/::\d+$/,ee={};let ie=1;const ne={mouseenter:"mouseover",mouseleave:"mouseout"},se=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 oe(t,e){return e&&`${e}::${ie++}`||t.uidEvent||ie++}function re(t){const e=oe(t);return t.uidEvent=e,ee[e]=ee[e]||{},ee[e]}function ae(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function le(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=ue(t);return se.has(o)||(o=t),[n,s,o]}function ce(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=le(e,i,n);if(e in ne){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=re(t),c=l[a]||(l[a]={}),h=ae(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=oe(r,e.replace(Jt,"")),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 pe(s,{delegateTarget:r}),n.oneOff&&fe.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return pe(n,{delegateTarget:t}),i.oneOff&&fe.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 he(t,e,i,n,s){const o=ae(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function de(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&he(t,e,i,r.callable,r.delegationSelector)}function ue(t){return t=t.replace(Zt,""),ne[t]||t}const fe={on(t,e,i,n){ce(t,e,i,n,!1)},one(t,e,i,n){ce(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=le(e,i,n),a=r!==e,l=re(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))de(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(te,"");a&&!e.includes(s)||he(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;he(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=Vt();let s=null,o=!0,r=!0,a=!1;e!==ue(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=pe(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function pe(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 me(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 ge(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const _e={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${ge(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${ge(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]=me(t.dataset[n])}return e},getDataAttribute:(t,e)=>me(t.getAttribute(`data-bs-${ge(e)}`))};class be{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=Ft(e)?_e.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...Ft(e)?_e.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=Ft(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 ve extends be{constructor(t,e){super(),(t=Ht(t))&&(this._element=t,this._config=this._getConfig(e),Nt.set(this._element,this.constructor.DATA_KEY,this))}dispose(){Nt.remove(this._element,this.constructor.DATA_KEY),fe.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){Ut(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return Nt.get(Ht(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.3"}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 ye=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?i.trim():null}return e?e.split(",").map((t=>Mt(t))).join(","):null},we={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=>!Wt(t)&&Bt(t)))},getSelectorFromElement(t){const e=ye(t);return e&&we.findOne(e)?e:null},getElementFromSelector(t){const e=ye(t);return e?we.findOne(e):null},getMultipleElementsFromSelector(t){const e=ye(t);return e?we.find(e):[]}},Ee=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;fe.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),Wt(this))return;const s=we.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},Ae=".bs.alert",Te=`close${Ae}`,Ce=`closed${Ae}`;class Oe extends ve{static get NAME(){return"alert"}close(){if(fe.trigger(this._element,Te).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(),fe.trigger(this._element,Ce),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Oe.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)}}))}}Ee(Oe,"close"),Qt(Oe);const xe='[data-bs-toggle="button"]';class ke extends ve{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=ke.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}fe.on(document,"click.bs.button.data-api",xe,(t=>{t.preventDefault();const e=t.target.closest(xe);ke.getOrCreateInstance(e).toggle()})),Qt(ke);const Le=".bs.swipe",Se=`touchstart${Le}`,De=`touchmove${Le}`,$e=`touchend${Le}`,Ie=`pointerdown${Le}`,Ne=`pointerup${Le}`,Pe={endCallback:null,leftCallback:null,rightCallback:null},Me={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class je extends be{constructor(t,e){super(),this._element=t,t&&je.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Pe}static get DefaultType(){return Me}static get NAME(){return"swipe"}dispose(){fe.off(this._element,Le)}_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(),Xt(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&&Xt(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(fe.on(this._element,Ie,(t=>this._start(t))),fe.on(this._element,Ne,(t=>this._end(t))),this._element.classList.add("pointer-event")):(fe.on(this._element,Se,(t=>this._start(t))),fe.on(this._element,De,(t=>this._move(t))),fe.on(this._element,$e,(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 Fe=".bs.carousel",He=".data-api",Be="ArrowLeft",We="ArrowRight",ze="next",Re="prev",qe="left",Ve="right",Ye=`slide${Fe}`,Ke=`slid${Fe}`,Qe=`keydown${Fe}`,Xe=`mouseenter${Fe}`,Ue=`mouseleave${Fe}`,Ge=`dragstart${Fe}`,Je=`load${Fe}${He}`,Ze=`click${Fe}${He}`,ti="carousel",ei="active",ii=".active",ni=".carousel-item",si=ii+ni,oi={[Be]:Ve,[We]:qe},ri={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ai={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class li extends ve{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=we.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===ti&&this.cycle()}static get Default(){return ri}static get DefaultType(){return ai}static get NAME(){return"carousel"}next(){this._slide(ze)}nextWhenVisible(){!document.hidden&&Bt(this._element)&&this.next()}prev(){this._slide(Re)}pause(){this._isSliding&&jt(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?fe.one(this._element,Ke,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void fe.one(this._element,Ke,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?ze:Re;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&&fe.on(this._element,Qe,(t=>this._keydown(t))),"hover"===this._config.pause&&(fe.on(this._element,Xe,(()=>this.pause())),fe.on(this._element,Ue,(()=>this._maybeEnableCycle()))),this._config.touch&&je.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of we.find(".carousel-item img",this._element))fe.on(t,Ge,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(qe)),rightCallback:()=>this._slide(this._directionToOrder(Ve)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new je(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=oi[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=we.findOne(ii,this._indicatorsElement);e.classList.remove(ei),e.removeAttribute("aria-current");const i=we.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(ei),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===ze,s=e||Gt(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>fe.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(Ye).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),qt(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(ei),i.classList.remove(ei,c,l),this._isSliding=!1,r(Ke)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return we.findOne(si,this._element)}_getItems(){return we.find(ni,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return Kt()?t===qe?Re:ze:t===qe?ze:Re}_orderToDirection(t){return Kt()?t===Re?qe:Ve:t===Re?Ve:qe}static jQueryInterface(t){return this.each((function(){const e=li.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)}))}}fe.on(document,Ze,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=we.getElementFromSelector(this);if(!e||!e.classList.contains(ti))return;t.preventDefault();const i=li.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===_e.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),fe.on(window,Je,(()=>{const t=we.find('[data-bs-ride="carousel"]');for(const e of t)li.getOrCreateInstance(e)})),Qt(li);const ci=".bs.collapse",hi=`show${ci}`,di=`shown${ci}`,ui=`hide${ci}`,fi=`hidden${ci}`,pi=`click${ci}.data-api`,mi="show",gi="collapse",_i="collapsing",bi=`:scope .${gi} .${gi}`,vi='[data-bs-toggle="collapse"]',yi={parent:null,toggle:!0},wi={parent:"(null|element)",toggle:"boolean"};class Ei extends ve{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=we.find(vi);for(const t of i){const e=we.getSelectorFromElement(t),i=we.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 yi}static get DefaultType(){return wi}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=>Ei.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(fe.trigger(this._element,hi).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(gi),this._element.classList.add(_i),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(_i),this._element.classList.add(gi,mi),this._element.style[e]="",fe.trigger(this._element,di)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(fe.trigger(this._element,ui).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,qt(this._element),this._element.classList.add(_i),this._element.classList.remove(gi,mi);for(const t of this._triggerArray){const e=we.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(_i),this._element.classList.add(gi),fe.trigger(this._element,fi)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(mi)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=Ht(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(vi);for(const e of t){const t=we.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=we.find(bi,this._config.parent);return we.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=Ei.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}fe.on(document,pi,vi,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of we.getMultipleElementsFromSelector(this))Ei.getOrCreateInstance(t,{toggle:!1}).toggle()})),Qt(Ei);const Ai="dropdown",Ti=".bs.dropdown",Ci=".data-api",Oi="ArrowUp",xi="ArrowDown",ki=`hide${Ti}`,Li=`hidden${Ti}`,Si=`show${Ti}`,Di=`shown${Ti}`,$i=`click${Ti}${Ci}`,Ii=`keydown${Ti}${Ci}`,Ni=`keyup${Ti}${Ci}`,Pi="show",Mi='[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)',ji=`${Mi}.${Pi}`,Fi=".dropdown-menu",Hi=Kt()?"top-end":"top-start",Bi=Kt()?"top-start":"top-end",Wi=Kt()?"bottom-end":"bottom-start",zi=Kt()?"bottom-start":"bottom-end",Ri=Kt()?"left-start":"right-start",qi=Kt()?"right-start":"left-start",Vi={autoClose:!0,boundary:"clippingParents",display:"dynamic",offset:[0,2],popperConfig:null,reference:"toggle"},Yi={autoClose:"(boolean|string)",boundary:"(string|element)",display:"string",offset:"(array|string|function)",popperConfig:"(null|object|function)",reference:"(string|element|object)"};class Ki extends ve{constructor(t,e){super(t,e),this._popper=null,this._parent=this._element.parentNode,this._menu=we.next(this._element,Fi)[0]||we.prev(this._element,Fi)[0]||we.findOne(Fi,this._parent),this._inNavbar=this._detectNavbar()}static get Default(){return Vi}static get DefaultType(){return Yi}static get NAME(){return Ai}toggle(){return this._isShown()?this.hide():this.show()}show(){if(Wt(this._element)||this._isShown())return;const t={relatedTarget:this._element};if(!fe.trigger(this._element,Si,t).defaultPrevented){if(this._createPopper(),"ontouchstart"in document.documentElement&&!this._parent.closest(".navbar-nav"))for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._element.focus(),this._element.setAttribute("aria-expanded",!0),this._menu.classList.add(Pi),this._element.classList.add(Pi),fe.trigger(this._element,Di,t)}}hide(){if(Wt(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(!fe.trigger(this._element,ki,t).defaultPrevented){if("ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._popper&&this._popper.destroy(),this._menu.classList.remove(Pi),this._element.classList.remove(Pi),this._element.setAttribute("aria-expanded","false"),_e.removeDataAttribute(this._menu,"popper"),fe.trigger(this._element,Li,t)}}_getConfig(t){if("object"==typeof(t=super._getConfig(t)).reference&&!Ft(t.reference)&&"function"!=typeof t.reference.getBoundingClientRect)throw new TypeError(`${Ai.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:Ft(this._config.reference)?t=Ht(this._config.reference):"object"==typeof this._config.reference&&(t=this._config.reference);const i=this._getPopperConfig();this._popper=Dt(t,this._menu,i)}_isShown(){return this._menu.classList.contains(Pi)}_getPlacement(){const t=this._parent;if(t.classList.contains("dropend"))return Ri;if(t.classList.contains("dropstart"))return qi;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?Bi:Hi:e?zi:Wi}_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)&&(_e.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...Xt(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=we.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>Bt(t)));i.length&&Gt(i,e,t===xi,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=Ki.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=we.find(ji);for(const i of e){const e=Ki.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=[Oi,xi].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Mi)?this:we.prev(this,Mi)[0]||we.next(this,Mi)[0]||we.findOne(Mi,t.delegateTarget.parentNode),o=Ki.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}fe.on(document,Ii,Mi,Ki.dataApiKeydownHandler),fe.on(document,Ii,Fi,Ki.dataApiKeydownHandler),fe.on(document,$i,Ki.clearMenus),fe.on(document,Ni,Ki.clearMenus),fe.on(document,$i,Mi,(function(t){t.preventDefault(),Ki.getOrCreateInstance(this).toggle()})),Qt(Ki);const Qi="backdrop",Xi="show",Ui=`mousedown.bs.${Qi}`,Gi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Ji={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Zi extends be{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Gi}static get DefaultType(){return Ji}static get NAME(){return Qi}show(t){if(!this._config.isVisible)return void Xt(t);this._append();const e=this._getElement();this._config.isAnimated&&qt(e),e.classList.add(Xi),this._emulateAnimation((()=>{Xt(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Xi),this._emulateAnimation((()=>{this.dispose(),Xt(t)}))):Xt(t)}dispose(){this._isAppended&&(fe.off(this._element,Ui),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=Ht(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),fe.on(t,Ui,(()=>{Xt(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){Ut(t,this._getElement(),this._config.isAnimated)}}const tn=".bs.focustrap",en=`focusin${tn}`,nn=`keydown.tab${tn}`,sn="backward",on={autofocus:!0,trapElement:null},rn={autofocus:"boolean",trapElement:"element"};class an extends be{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return on}static get DefaultType(){return rn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),fe.off(document,tn),fe.on(document,en,(t=>this._handleFocusin(t))),fe.on(document,nn,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,fe.off(document,tn))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=we.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===sn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?sn:"forward")}}const ln=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",cn=".sticky-top",hn="padding-right",dn="margin-right";class un{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,hn,(e=>e+t)),this._setElementAttributes(ln,hn,(e=>e+t)),this._setElementAttributes(cn,dn,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,hn),this._resetElementAttributes(ln,hn),this._resetElementAttributes(cn,dn)}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&&_e.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=_e.getDataAttribute(t,e);null!==i?(_e.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(Ft(t))e(t);else for(const i of we.find(t,this._element))e(i)}}const fn=".bs.modal",pn=`hide${fn}`,mn=`hidePrevented${fn}`,gn=`hidden${fn}`,_n=`show${fn}`,bn=`shown${fn}`,vn=`resize${fn}`,yn=`click.dismiss${fn}`,wn=`mousedown.dismiss${fn}`,En=`keydown.dismiss${fn}`,An=`click${fn}.data-api`,Tn="modal-open",Cn="show",On="modal-static",xn={backdrop:!0,focus:!0,keyboard:!0},kn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ln extends ve{constructor(t,e){super(t,e),this._dialog=we.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new un,this._addEventListeners()}static get Default(){return xn}static get DefaultType(){return kn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||fe.trigger(this._element,_n,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(Tn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(fe.trigger(this._element,pn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Cn),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){fe.off(window,fn),fe.off(this._dialog,fn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Zi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new an({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=we.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),qt(this._element),this._element.classList.add(Cn),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,fe.trigger(this._element,bn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){fe.on(this._element,En,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),fe.on(window,vn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),fe.on(this._element,wn,(t=>{fe.one(this._element,yn,(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(Tn),this._resetAdjustments(),this._scrollBar.reset(),fe.trigger(this._element,gn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(fe.trigger(this._element,mn).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(On)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(On),this._queueCallback((()=>{this._element.classList.remove(On),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=Kt()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=Kt()?"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=Ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}fe.on(document,An,'[data-bs-toggle="modal"]',(function(t){const e=we.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),fe.one(e,_n,(t=>{t.defaultPrevented||fe.one(e,gn,(()=>{Bt(this)&&this.focus()}))}));const i=we.findOne(".modal.show");i&&Ln.getInstance(i).hide(),Ln.getOrCreateInstance(e).toggle(this)})),Ee(Ln),Qt(Ln);const Sn=".bs.offcanvas",Dn=".data-api",$n=`load${Sn}${Dn}`,In="show",Nn="showing",Pn="hiding",Mn=".offcanvas.show",jn=`show${Sn}`,Fn=`shown${Sn}`,Hn=`hide${Sn}`,Bn=`hidePrevented${Sn}`,Wn=`hidden${Sn}`,zn=`resize${Sn}`,Rn=`click${Sn}${Dn}`,qn=`keydown.dismiss${Sn}`,Vn={backdrop:!0,keyboard:!0,scroll:!1},Yn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Kn extends ve{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Vn}static get DefaultType(){return Yn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||fe.trigger(this._element,jn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new un).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Nn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(In),this._element.classList.remove(Nn),fe.trigger(this._element,Fn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(fe.trigger(this._element,Hn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(Pn),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(In,Pn),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new un).reset(),fe.trigger(this._element,Wn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Zi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():fe.trigger(this._element,Bn)}:null})}_initializeFocusTrap(){return new an({trapElement:this._element})}_addEventListeners(){fe.on(this._element,qn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():fe.trigger(this._element,Bn))}))}static jQueryInterface(t){return this.each((function(){const e=Kn.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)}}))}}fe.on(document,Rn,'[data-bs-toggle="offcanvas"]',(function(t){const e=we.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this))return;fe.one(e,Wn,(()=>{Bt(this)&&this.focus()}));const i=we.findOne(Mn);i&&i!==e&&Kn.getInstance(i).hide(),Kn.getOrCreateInstance(e).toggle(this)})),fe.on(window,$n,(()=>{for(const t of we.find(Mn))Kn.getOrCreateInstance(t).show()})),fe.on(window,zn,(()=>{for(const t of we.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&Kn.getOrCreateInstance(t).hide()})),Ee(Kn),Qt(Kn);const Qn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],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:[]},Xn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Un=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Gn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Xn.has(i)||Boolean(Un.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Jn={allowList:Qn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

"},Zn={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},ts={entry:"(string|element|function|null)",selector:"(string|element)"};class es extends be{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Jn}static get DefaultType(){return Zn}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},ts)}_setContent(t,e,i){const n=we.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?Ft(e)?this._putElementInTemplate(Ht(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)Gn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return Xt(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const is=new Set(["sanitize","allowList","sanitizeFn"]),ns="fade",ss="show",os=".tooltip-inner",rs=".modal",as="hide.bs.modal",ls="hover",cs="focus",hs={AUTO:"auto",TOP:"top",RIGHT:Kt()?"left":"right",BOTTOM:"bottom",LEFT:Kt()?"right":"left"},ds={allowList:Qn,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"},us={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 fs extends ve{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 ds}static get DefaultType(){return us}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),fe.off(this._element.closest(rs),as,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=fe.trigger(this._element,this.constructor.eventName("show")),e=(zt(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),fe.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.on(t,"mouseover",Rt);this._queueCallback((()=>{fe.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!fe.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(ss),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))fe.off(t,"mouseover",Rt);this._activeTrigger.click=!1,this._activeTrigger[cs]=!1,this._activeTrigger[ls]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),fe.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(ns,ss),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(ns),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new es({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[os]: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(ns)}_isShown(){return this.tip&&this.tip.classList.contains(ss)}_createPopper(t){const e=Xt(this._config.placement,[this,t,this._element]),i=hs[e.toUpperCase()];return Dt(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 Xt(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,...Xt(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)fe.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ls?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ls?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");fe.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?cs:ls]=!0,e._enter()})),fe.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?cs:ls]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},fe.on(this._element.closest(rs),as,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=_e.getDataAttributes(this._element);for(const t of Object.keys(e))is.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:Ht(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=fs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(fs);const ps=".popover-header",ms=".popover-body",gs={...fs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},_s={...fs.DefaultType,content:"(null|string|element|function)"};class bs extends fs{static get Default(){return gs}static get DefaultType(){return _s}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[ps]:this._getTitle(),[ms]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=bs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}Qt(bs);const vs=".bs.scrollspy",ys=`activate${vs}`,ws=`click${vs}`,Es=`load${vs}.data-api`,As="active",Ts="[href]",Cs=".nav-link",Os=`${Cs}, .nav-item > ${Cs}, .list-group-item`,xs={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},ks={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Ls extends ve{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 xs}static get DefaultType(){return ks}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=Ht(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&&(fe.off(this._config.target,ws),fe.on(this._config.target,ws,Ts,(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=we.find(Ts,this._config.target);for(const e of t){if(!e.hash||Wt(e))continue;const t=we.findOne(decodeURI(e.hash),this._element);Bt(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(As),this._activateParents(t),fe.trigger(this._element,ys,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))we.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(As);else for(const e of we.parents(t,".nav, .list-group"))for(const t of we.prev(e,Os))t.classList.add(As)}_clearActiveClass(t){t.classList.remove(As);const e=we.find(`${Ts}.${As}`,t);for(const t of e)t.classList.remove(As)}static jQueryInterface(t){return this.each((function(){const e=Ls.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]()}}))}}fe.on(window,Es,(()=>{for(const t of we.find('[data-bs-spy="scroll"]'))Ls.getOrCreateInstance(t)})),Qt(Ls);const Ss=".bs.tab",Ds=`hide${Ss}`,$s=`hidden${Ss}`,Is=`show${Ss}`,Ns=`shown${Ss}`,Ps=`click${Ss}`,Ms=`keydown${Ss}`,js=`load${Ss}`,Fs="ArrowLeft",Hs="ArrowRight",Bs="ArrowUp",Ws="ArrowDown",zs="Home",Rs="End",qs="active",Vs="fade",Ys="show",Ks=".dropdown-toggle",Qs=`:not(${Ks})`,Xs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Us=`.nav-link${Qs}, .list-group-item${Qs}, [role="tab"]${Qs}, ${Xs}`,Gs=`.${qs}[data-bs-toggle="tab"], .${qs}[data-bs-toggle="pill"], .${qs}[data-bs-toggle="list"]`;class Js extends ve{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),fe.on(this._element,Ms,(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?fe.trigger(e,Ds,{relatedTarget:t}):null;fe.trigger(t,Is,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(qs),this._activate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),fe.trigger(t,Ns,{relatedTarget:e})):t.classList.add(Ys)}),t,t.classList.contains(Vs)))}_deactivate(t,e){t&&(t.classList.remove(qs),t.blur(),this._deactivate(we.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),fe.trigger(t,$s,{relatedTarget:e})):t.classList.remove(Ys)}),t,t.classList.contains(Vs)))}_keydown(t){if(![Fs,Hs,Bs,Ws,zs,Rs].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!Wt(t)));let i;if([zs,Rs].includes(t.key))i=e[t.key===zs?0:e.length-1];else{const n=[Hs,Ws].includes(t.key);i=Gt(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Js.getOrCreateInstance(i).show())}_getChildren(){return we.find(Us,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=we.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=we.findOne(t,i);s&&s.classList.toggle(n,e)};n(Ks,qs),n(".dropdown-menu",Ys),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(qs)}_getInnerElement(t){return t.matches(Us)?t:we.findOne(Us,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Js.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}fe.on(document,Ps,Xs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),Wt(this)||Js.getOrCreateInstance(this).show()})),fe.on(window,js,(()=>{for(const t of we.find(Gs))Js.getOrCreateInstance(t)})),Qt(Js);const Zs=".bs.toast",to=`mouseover${Zs}`,eo=`mouseout${Zs}`,io=`focusin${Zs}`,no=`focusout${Zs}`,so=`hide${Zs}`,oo=`hidden${Zs}`,ro=`show${Zs}`,ao=`shown${Zs}`,lo="hide",co="show",ho="showing",uo={animation:"boolean",autohide:"boolean",delay:"number"},fo={animation:!0,autohide:!0,delay:5e3};class po extends ve{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return fo}static get DefaultType(){return uo}static get NAME(){return"toast"}show(){fe.trigger(this._element,ro).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(lo),qt(this._element),this._element.classList.add(co,ho),this._queueCallback((()=>{this._element.classList.remove(ho),fe.trigger(this._element,ao),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(fe.trigger(this._element,so).defaultPrevented||(this._element.classList.add(ho),this._queueCallback((()=>{this._element.classList.add(lo),this._element.classList.remove(ho,co),fe.trigger(this._element,oo)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(co),super.dispose()}isShown(){return this._element.classList.contains(co)}_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(){fe.on(this._element,to,(t=>this._onInteraction(t,!0))),fe.on(this._element,eo,(t=>this._onInteraction(t,!1))),fe.on(this._element,io,(t=>this._onInteraction(t,!0))),fe.on(this._element,no,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=po.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}function mo(t){"loading"!=document.readyState?t():document.addEventListener("DOMContentLoaded",t)}Ee(po),Qt(po),mo((function(){[].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')).map((function(t){return new fs(t,{delay:{show:500,hide:100}})}))})),mo((function(){document.getElementById("pst-back-to-top").addEventListener("click",(function(){document.body.scrollTop=0,document.documentElement.scrollTop=0}))})),mo((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}))})),window.bootstrap=i})(); +//# sourceMappingURL=bootstrap.js.map \ No newline at end of file diff --git a/_build/html/_static/scripts/bootstrap.js.LICENSE.txt b/_build/html/_static/scripts/bootstrap.js.LICENSE.txt new file mode 100644 index 0000000..28755c2 --- /dev/null +++ b/_build/html/_static/scripts/bootstrap.js.LICENSE.txt @@ -0,0 +1,5 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ diff --git a/_build/html/_static/scripts/bootstrap.js.map b/_build/html/_static/scripts/bootstrap.js.map new file mode 100644 index 0000000..e9e8158 --- /dev/null +++ b/_build/html/_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.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 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};\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.3';\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 !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null;\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};\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};\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 dd: [],\n div: [],\n dl: [],\n dt: [],\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
@@ -334,7 +334,7 @@

Contents

OpenLambda GitHub Pages — MyST Markdown Site#

This repo deploys automatically to GitHub Pages using Jupyter Book -with MyST Markdown.

+with MyST Markdown as the technical documentation of Open Lambda.


File Structure#

@@ -365,18 +365,7 @@

1. Clone the repo and copy these files in -

2. Enable GitHub Pages with GitHub Actions as the source#

-

Go to the repo on GitHub:

-
    -
  1. SettingsPages (left sidebar)

  2. -
  3. Under Source, select GitHub Actions (not “Deploy from a branch”)

  4. -
  5. Save

  6. -
-

That’s it. Every push to main will now rebuild and redeploy the site automatically.

-
-

Local Preview#

pip install -r requirements.txt
@@ -386,49 +375,6 @@ 

Local Preview -
-

Adding More Pages#

-
    -
  1. Create a new .md file, e.g. worker.md

  2. -
  3. Add it to _toc.yml:

  4. -
-
format: jb-book
-root: index
-chapters:
-  - file: worker
-
-
-
    -
  1. Push — the site rebuilds automatically.

  2. -
-
-
-
-

Troubleshooting#

-
- - - - - - - - - - - - - - - - - - - -

Problem

Fix

Build fails: jupyter-book not found

Make sure requirements.txt lists jupyter-book>=1.0.0

Pages shows 404

Confirm Settings → Pages → Source is set to GitHub Actions

Old content still showing

Hard-refresh browser (Ctrl+Shift+R) or wait ~1 min for CDN

Action fails with permissions error

Go to Settings → Actions → General → Workflow permissions and enable “Read and write permissions”

-
-

diff --git a/_build/html/index.html b/_build/html/index.html index e722ab1..40cbcf6 100644 --- a/_build/html/index.html +++ b/_build/html/index.html @@ -34,7 +34,7 @@ - + @@ -62,6 +62,7 @@ + @@ -167,7 +168,10 @@ @@ -330,7 +334,7 @@

Contents

OpenLambda#

Apache 2.0 License -

OpenLambda is an Apache-licensed serverless computing project, written (mostly) in Go +

Open-Lambda is an Apache-licensed serverless computing project, written (mostly) in Go and based on Linux containers. The primary goal of OpenLambda is to enable exploration of new approaches to serverless computing. We hope to eventually make it suitable for use in production as well.

@@ -390,6 +394,8 @@

License#<

This project is licensed under the Apache License — see the LICENSE.md file for details.

+
+
diff --git a/_build/html/searchindex.js b/_build/html/searchindex.js index 1f91121..277964f 100644 --- a/_build/html/searchindex.js +++ b/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"1. Clone the repo and copy these files in": [[0, "clone-the-repo-and-copy-these-files-in"]], "2. Enable GitHub Pages with GitHub Actions as the source": [[0, "enable-github-pages-with-github-actions-as-the-source"]], "Adding More Pages": [[0, "adding-more-pages"]], "File Structure": [[0, "file-structure"]], "License": [[1, "license"]], "Local Preview": [[0, "local-preview"]], "One-Time Setup (do this once per repo)": [[0, "one-time-setup-do-this-once-per-repo"]], "OpenLambda": [[1, null]], "OpenLambda GitHub Pages \u2014 MyST Markdown Site": [[0, null]], "Related Publications": [[1, "related-publications"]], "Troubleshooting": [[0, "troubleshooting"]]}, "docnames": ["README", "index"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "index.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": 0, "0": 0, "16": 1, "17": 1, "18": 1, "24": 1, "404": 0, "That": 0, "The": 1, "With": 1, "_build": 0, "_config": 0, "_toc": 0, "about": 1, "add": 0, "al": 1, "all": 0, "also": 1, "an": 1, "apach": 1, "approach": 1, "ar": 1, "atc": 1, "author": 1, "auto": 0, "automat": 0, "balanc": 1, "base": 1, "bit": 1, "book": 0, "boss": 1, "branch": 0, "browser": 0, "build": 0, "bundl": 0, "can": 1, "cd": 0, "cdn": 0, "central": 1, "chapter": 0, "cloud comput": 1, "cluster": 1, "com": 0, "commit": 0, "comput": 1, "confirm": 0, "contain": 1, "content": 0, "could": 1, "creat": 0, "ctrl": 0, "current": 1, "dep": 0, "deploi": [0, 1], "detail": 1, "e": 0, "enabl": 1, "error": 0, "et": 1, "eventu": 1, "everi": 0, "explor": 1, "fail": 0, "far": 1, "faster": 1, "file": 1, "fit": 1, "fix": 0, "forklift": 1, "format": 0, "found": 0, "from": 0, "front": 1, "g": 0, "gener": 0, "get": 1, "git": 0, "gitignor": 0, "go": [0, 1], "goal": 1, "hard": 0, "hendrickson": 1, "here": [0, 1], "homepag": 0, "hope": 1, "hotcloud": 1, "html": 0, "http": [0, 1], "i": [0, 1], "icdcsw": 1, "implement": 1, "index": 0, "initi": 1, "instal": 0, "invok": 1, "io": 0, "jb": 0, "jupyt": 0, "just": 1, "lambda": [0, 1], "larg": 1, "lean": 1, "left": 0, "librari": 1, "linux": 1, "linux contain": 1, "list": 0, "load": 1, "local": 1, "login": 1, "m": 0, "main": [0, 1], "make": [0, 1], "manag": 1, "manual": 1, "md": [0, 1], "min": 0, "mode": 1, "more": 1, "mostli": 1, "new": [0, 1], "node": 1, "now": 0, "oak": 1, "old": 0, "open": 0, "optim": 1, "packag": 1, "permiss": 0, "pip": 0, "pipsqueak": 1, "pool": 1, "primari": 1, "problem": 0, "product": 1, "project": 1, "provis": 1, "push": 0, "put": 1, "python": 0, "r": 0, "rapid": 1, "read": [0, 1], "rebuild": 0, "redeploi": 0, "refresh": 0, "request": 1, "requir": 0, "respons": 1, "root": 0, "run": 1, "save": 0, "see": 1, "select": 0, "serverless": 1, "servic": 1, "set": 0, "shift": 0, "show": 0, "sidebar": 0, "singl": 1, "so": 1, "sock": 1, "start": 1, "still": 0, "suitabl": 1, "sure": 0, "system": 1, "tabl": 0, "take": 1, "task": 1, "them": 1, "thi": 1, "titl": 1, "tree": 1, "txt": 0, "under": [0, 1], "us": [0, 1], "venu": 1, "vm": 1, "wait": 0, "we": 1, "well": 1, "where": 1, "work": 1, "worker": [0, 1], "workflow": 0, "wosc": 1, "write": 0, "written": 1, "yang": 1, "yml": 0, "you": 1, "yourself": 1, "zygot": 1}, "titles": ["OpenLambda GitHub Pages \u2014 MyST Markdown Site", "OpenLambda"], "titleterms": {"1": 0, "2": 0, "One": 0, "action": 0, "ad": 0, "clone": 0, "copi": 0, "do": 0, "enabl": 0, "file": 0, "github": 0, "licens": 1, "local": 0, "markdown": 0, "more": 0, "myst": 0, "onc": 0, "openlambda": [0, 1], "page": 0, "per": 0, "preview": 0, "public": 1, "relat": 1, "repo": 0, "setup": 0, "site": 0, "sourc": 0, "structur": 0, "thi": 0, "time": 0, "troubleshoot": 0}}) \ No newline at end of file +Search.setIndex({"alltitles": {"1. Clone the repo and copy these files in": [[0, "clone-the-repo-and-copy-these-files-in"]], "Configuration": [[2, "configuration"]], "Deploying Multiple Workers": [[2, "deploying-multiple-workers"]], "File Structure": [[0, "file-structure"]], "Further Reading": [[2, "further-reading"]], "License": [[1, "license"]], "Local Preview": [[0, "local-preview"]], "One-Time Setup (do this once per repo)": [[0, "one-time-setup-do-this-once-per-repo"]], "OpenLambda": [[1, null]], "OpenLambda GitHub Pages \u2014 MyST Markdown Site": [[0, null]], "Overview": [[2, "overview"]], "Related Publications": [[1, "related-publications"]], "Starting the Worker": [[2, "starting-the-worker"]], "Worker": [[2, null]]}, "docnames": ["README", "index", "worker"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "index.md", "worker.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": 2, "0": [], "16": 1, "17": 1, "18": 1, "24": 1, "404": [], "8080": 2, "A": 2, "It": 2, "No": 2, "That": [], "The": [1, 2], "To": 2, "With": 1, "_build": 0, "_config": 0, "_toc": 0, "about": 1, "action": 0, "add": 0, "address": 2, "after": 2, "al": 1, "all": 0, "alreadi": 2, "also": 1, "an": 1, "apach": 1, "approach": [1, 2], "ar": [1, 2], "arriv": 2, "atc": 1, "author": 1, "auto": 0, "automat": 0, "back": 2, "backend": 2, "balanc": [1, 2], "base": 1, "behind": 2, "between": 2, "bin": 2, "binari": 2, "bit": 1, "book": 0, "boss": [1, 2], "branch": [], "browser": 0, "build": [0, 2], "bundl": 0, "call": 2, "caller": 2, "can": [1, 2], "cd": 0, "cdn": [], "central": [1, 2], "chapter": [], "check": 2, "cloud comput": 1, "cluster": [1, 2], "cold": 2, "com": 0, "commit": 0, "compon": 2, "comput": 1, "config": 2, "confirm": [], "contain": [1, 2], "content": 0, "coordin": 2, "core": 2, "could": 1, "creat": [], "ctrl": [], "curl": 2, "current": [1, 2], "default": 2, "dep": 0, "deploi": [0, 1], "deploy": 2, "describ": 2, "descript": 2, "detail": 1, "develop": 2, "directori": 2, "docker": 2, "document": 0, "e": [], "each": 2, "enabl": 1, "endpoint": 2, "error": [], "et": 1, "eventu": 1, "everi": [], "explor": 1, "expos": 2, "fail": [], "far": 1, "faster": 1, "field": 2, "file": [1, 2], "fit": 1, "fix": [], "forklift": 1, "format": [], "forward": 2, "found": [], "from": [0, 2], "front": [1, 2], "function": 2, "g": [], "gener": [], "get": [1, 2], "git": 0, "gitignor": 0, "go": [1, 2], "goal": 1, "guid": 2, "haproxi": 2, "hard": [], "hendrickson": 1, "here": [0, 1], "homepag": 0, "hope": 1, "horizont": 2, "hotcloud": 1, "html": 0, "http": [0, 1, 2], "i": [1, 2], "icdcsw": 1, "imag": 2, "implement": 1, "incom": 2, "independ": 2, "index": 0, "initi": 1, "insid": 2, "instal": 0, "invok": 1, "io": 0, "its": 2, "jb": [], "json": 2, "jupyt": 0, "just": 1, "keep": 2, "kei": 2, "lambda": [0, 1, 2], "larg": 1, "latenc": 2, "lean": 1, "left": [], "librari": 1, "lifecycl": 2, "linux": [1, 2], "linux contain": 1, "list": [], "listen": 2, "load": [1, 2], "local": [1, 2], "localhost": 2, "log": 2, "log_output": 2, "login": 1, "m": 0, "main": 1, "make": 1, "manag": [1, 2], "manual": [1, 2], "md": [0, 1], "min": [], "minut": 2, "mode": 1, "more": [0, 1], "mostli": 1, "multi": 2, "n": 2, "name": 2, "new": 1, "nginx": 2, "node": [1, 2], "now": [], "oak": 1, "old": [], "one": 2, "open": [0, 1], "openlambda": 2, "oper": 2, "optim": [1, 2], "option": 2, "packag": 1, "paper": 2, "pass": 2, "path": 2, "payload": 2, "per": 2, "period": 2, "permiss": [], "pip": 0, "pipsqueak": 1, "place": 2, "pool": 1, "port": 2, "post": 2, "present": 2, "primari": 1, "print": 2, "problem": [], "process": 2, "product": 1, "project": 1, "provis": [1, 2], "pull": 2, "push": 0, "put": 1, "python": 0, "quickstart": 2, "r": 0, "rapid": [1, 2], "read": 1, "rebuild": [], "recommend": 2, "redeploi": [], "reduc": 2, "refresh": [], "registri": 2, "repo": 2, "request": [1, 2], "requir": [0, 2], "research": 2, "respect": 2, "respons": [1, 2], "result": 2, "return": 2, "root": [0, 2], "rout": 2, "run": [1, 2], "runlambda": 2, "sandbox": 2, "save": [], "scale": 2, "see": 1, "select": [], "server": 2, "serverless": [1, 2], "servic": 1, "set": 0, "setup": 2, "shift": [], "short": 2, "show": [], "side": 2, "sidebar": [], "similar": 2, "singl": [1, 2], "so": 1, "sock": [1, 2], "standalon": 2, "standard": 2, "start": 1, "startup": 2, "stateless": 2, "statu": 2, "stdout": 2, "still": [], "subsequ": 2, "suitabl": 1, "sure": [], "system": 1, "tabl": 0, "take": 1, "task": [1, 2], "technic": 0, "them": [1, 2], "thi": 1, "titl": 1, "tree": 1, "txt": 0, "under": [1, 2], "until": 2, "url": 2, "us": [0, 1], "venu": 1, "verifi": 2, "via": 2, "vm": 1, "w": 2, "wait": 2, "warm": 2, "we": 1, "well": 1, "when": 2, "where": [1, 2], "whether": 2, "wide": 2, "work": [1, 2], "worker": 1, "worker_port": 2, "workflow": 0, "wosc": 1, "write": 2, "written": 1, "yang": 1, "yml": 0, "you": [1, 2], "yourself": 1, "zygot": 1}, "titles": ["OpenLambda GitHub Pages \u2014 MyST Markdown Site", "OpenLambda", "Worker"], "titleterms": {"1": 0, "2": [], "One": 0, "action": [], "ad": [], "clone": 0, "configur": 2, "copi": 0, "deploi": 2, "do": 0, "enabl": [], "file": 0, "further": 2, "github": 0, "licens": 1, "local": 0, "markdown": 0, "more": [], "multipl": 2, "myst": 0, "onc": 0, "openlambda": [0, 1], "overview": 2, "page": 0, "per": 0, "preview": 0, "public": 1, "read": 2, "relat": 1, "repo": 0, "setup": 0, "site": 0, "sourc": [], "start": 2, "structur": 0, "thi": 0, "time": 0, "troubleshoot": [], "worker": 2}}) \ No newline at end of file diff --git a/_build/html/worker.html b/_build/html/worker.html new file mode 100644 index 0000000..bd79468 --- /dev/null +++ b/_build/html/worker.html @@ -0,0 +1,529 @@ + + + + + + + + + + + Worker — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Worker

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

Worker#

+

The OpenLambda worker is the core server-side component of a node. It listens for +incoming HTTP requests, manages container lifecycle, and returns responses to callers.

+
+

Overview#

+

Each worker is a standalone Go binary that exposes a single HTTP endpoint:

+
POST /runLambda/<lambda-name>
+
+
+

When a request arrives the worker:

+
    +
  1. Checks whether the lambda’s container image is already present on the node; if not, pulls it from the registry.

  2. +
  3. Starts a Linux container from the image.

  4. +
  5. Passes the request payload to the lambda function running inside the container.

  6. +
  7. Waits for the function to return a result, then forwards that result back to the caller.

  8. +
  9. Optionally keeps the container warm for a short period to reduce cold-start latency on subsequent calls.

  10. +
+
+
+

Configuration#

+

The worker is configured via a JSON file (default config.json) in the working directory. +Key fields:

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

Field

Description

Default

worker_port

Port the HTTP server listens on

8080

registry

URL of the lambda registry

""

sandbox

Container backend (docker or sock)

docker

log_output

Where to write logs (stdout or a file path)

stdout

+
+
+
+

Starting the Worker#

+
# From the repo root after building:
+./bin/worker --config config.json
+
+
+

The worker prints its listening address on startup. You can verify it is running with:

+
curl -w "\n" localhost:8080/status
+
+
+
+
+

Deploying Multiple Workers#

+

Workers are stateless with respect to routing — each one operates independently. To scale +horizontally, start one worker process per node and place a standard HTTP load balancer +(Nginx, HAProxy, or similar) in front of them. No coordination between workers is required.

+
+

Note

+

A centralized boss component for cluster-wide management is currently under development. +Until then, manual deployment behind a load balancer is the recommended approach for +multi-node setups.

+
+
+
+

Further Reading#

+ +
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file From 419a142bec6ed9268d393a05d7e92d1cc20c96e2 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Wed, 11 Feb 2026 21:17:55 -0600 Subject: [PATCH 14/40] Add technical documentation --- .github/.workflow/deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/.workflow/deploy.yml b/.github/.workflow/deploy.yml index 4dd7899..77667eb 100644 --- a/.github/.workflow/deploy.yml +++ b/.github/.workflow/deploy.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - master permissions: contents: write From ede1ceb8009dd63388883e8475efd27a84824f1d Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Wed, 11 Feb 2026 21:23:55 -0600 Subject: [PATCH 15/40] Add technical documentation --- .github/.workflow/deploy.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/.workflow/deploy.yml b/.github/.workflow/deploy.yml index 77667eb..77502f9 100644 --- a/.github/.workflow/deploy.yml +++ b/.github/.workflow/deploy.yml @@ -18,14 +18,14 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Install dependencies + - name: Install Jupyter Book run: pip install jupyter-book - - name: Build the book + - name: Build book run: jupyter-book build . - - name: Deploy to GitHub Pages + - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./_build/html \ No newline at end of file + publish_dir: ./_build/html From 5aec7354a19f80cbd14161c37d84627201a63b80 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Wed, 11 Feb 2026 21:27:31 -0600 Subject: [PATCH 16/40] Add technical documentation --- .github/.workflow/deploy.yml | 47 +++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/.github/.workflow/deploy.yml b/.github/.workflow/deploy.yml index 77502f9..88e4249 100644 --- a/.github/.workflow/deploy.yml +++ b/.github/.workflow/deploy.yml @@ -1,31 +1,50 @@ -name: Deploy Jupyter Book +name: Deploy Jupyter Book to GitHub Pages on: push: - branches: - - main - - master + branches: [ master ] permissions: - contents: write + contents: read pages: write id-token: write +concurrency: + group: pages + cancel-in-progress: false + jobs: - build: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + + - name: Setup Pages + uses: actions/configure-pages@v5 - - name: Install Jupyter Book - run: pip install jupyter-book + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' - - name: Build book + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install 'jupyter-book<2.0' + pip install pandas plotly matplotlib + + - name: Build Jupyter Book run: jupyter-book build . - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./_build/html + path: _build/html + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 1e499ac4cb90a8a39deb80eb3a60f6e3ee70d681 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Wed, 11 Feb 2026 21:32:09 -0600 Subject: [PATCH 17/40] Add technical documentation --- .github/.workflow/deploy.yml | 46 +++--------------------------------- 1 file changed, 3 insertions(+), 43 deletions(-) diff --git a/.github/.workflow/deploy.yml b/.github/.workflow/deploy.yml index 88e4249..d98f00f 100644 --- a/.github/.workflow/deploy.yml +++ b/.github/.workflow/deploy.yml @@ -1,50 +1,10 @@ -name: Deploy Jupyter Book to GitHub Pages +name: Test on: push: - branches: [ master ] - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: pages - cancel-in-progress: false jobs: - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} + test: runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Pages - uses: actions/configure-pages@v5 - - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install 'jupyter-book<2.0' - pip install pandas plotly matplotlib - - - name: Build Jupyter Book - run: jupyter-book build . - - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: _build/html - - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 + - run: echo "Hello" From a6927f996897e6b50e3e6ba83b4dd8f8a56ff72a Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Thu, 12 Feb 2026 10:39:01 -0600 Subject: [PATCH 18/40] ADD config --- .github/.workflow/deploy.yml | 46 +++++++++++++++++++++++++++++++++--- CNAME | 1 - _config.yml | 9 ++++--- index.md | 4 ++-- 4 files changed, 49 insertions(+), 11 deletions(-) delete mode 100644 CNAME diff --git a/.github/.workflow/deploy.yml b/.github/.workflow/deploy.yml index d98f00f..966162a 100644 --- a/.github/.workflow/deploy.yml +++ b/.github/.workflow/deploy.yml @@ -1,10 +1,50 @@ -name: Test +name: Deploy Jupyter Book to GitHub Pages on: push: + branches: [ master ] + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false jobs: - test: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest + steps: - - run: echo "Hello" + - uses: actions/checkout@v4 + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install 'jupyter-book<2.0' + pip install sphinx-book-theme + + - name: Build Jupyter Book + run: jupyter-book build . + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: _build/html + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/CNAME b/CNAME deleted file mode 100644 index 8a8440d..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -open-lambda.org diff --git a/_config.yml b/_config.yml index dedbe2c..26a52bb 100644 --- a/_config.yml +++ b/_config.yml @@ -1,7 +1,6 @@ -# Book settings — https://jupyterbook.org/customize/config.html +# Book settings - https://jupyterbook.org/customize/config.html title: OpenLambda -author: OpenLambda Contributors -logo: "" +author: OpenLambda # Force re-execution of notebooks on each build execute: @@ -20,10 +19,10 @@ html: # Repository info (used for issue/edit buttons) repository: url: https://github.com/open-lambda/open-lambda.github.io - branch: main + branch: master path_to_book: "." -# MyST extensions +# MyST extensions - single parse block (duplicate was causing only the first to be read) parse: myst_enable_extensions: - colon_fence diff --git a/index.md b/index.md index e2330bc..b878d5b 100644 --- a/index.md +++ b/index.md @@ -1,7 +1,7 @@ --- myst: html_meta: - description: "OpenLambda — Apache-licensed serverless computing built on Linux containers" + description: "OpenLambda - Apache-licensed serverless computing built on Linux containers" keywords: "serverless, OpenLambda, Go, Linux containers, cloud computing" --- @@ -61,5 +61,5 @@ manually deploy workers yourself and put an HTTP load balancer in front of them. ## License -This project is licensed under the **Apache License** — see the +This project is licensed under the **Apache License** - see the [LICENSE.md](https://github.com/open-lambda/open-lambda/blob/main/LICENSE) file for details. \ No newline at end of file From 03d301772277179bdceb5243a22c55dc92ab860e Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Thu, 12 Feb 2026 10:40:30 -0600 Subject: [PATCH 19/40] fix: rename workflow --- .github/{.workflow => workflows}/deploy.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{.workflow => workflows}/deploy.yml (100%) diff --git a/.github/.workflow/deploy.yml b/.github/workflows/deploy.yml similarity index 100% rename from .github/.workflow/deploy.yml rename to .github/workflows/deploy.yml From 540df8f162ec1ddcbf27fb44d2a2a0d4cee2cd0e Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Fri, 8 May 2026 14:27:06 -0500 Subject: [PATCH 20/40] Add Applications section with Ag Forecasting API docs --- _toc.yml | 6 +- applications/ag-forecasting-api.md | 145 +++++++++++++++++++++++++++++ applications/index.md | 14 +++ 3 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 applications/ag-forecasting-api.md create mode 100644 applications/index.md diff --git a/_toc.yml b/_toc.yml index 6b2efec..d180c10 100644 --- a/_toc.yml +++ b/_toc.yml @@ -4,4 +4,8 @@ format: jb-book root: index chapters: - - file: worker \ No newline at end of file + - file: worker + - file: applications/index + title: Applications + sections: + - file: applications/ag-forecasting-api \ No newline at end of file diff --git a/applications/ag-forecasting-api.md b/applications/ag-forecasting-api.md new file mode 100644 index 0000000..68e08e6 --- /dev/null +++ b/applications/ag-forecasting-api.md @@ -0,0 +1,145 @@ +# 🌾 Agricultural Forecasting API + +FastAPI-based service for **crop disease risk forecasting** and **winter rye biomass estimation** using multi-source weather data. +Developed by the University of Wisconsin–Madison Data Science Institute. + +--- + +## Overview + +The API provides geospatial agricultural intelligence for Wisconsin, combining weather data with validated agronomic models. + +### Key Features +- 🌽 Crop disease risk forecasting (corn & soybean) +- 🌱 Winter rye biomass estimation +- 🌦 Multi-source weather integration (IBM EIS, WiscoNet, NOAA) +- 📍 Coordinate and station-based queries +- 🗺 GeoJSON outputs for GIS applications +- ⚡ Async batch processing for multi-station analysis + +--- + +## System Architecture + +The system is structured into four main layers: + +- **API Layer (FastAPI)** + Handles incoming requests and routing (`/ibm`, `/wisconet_g`, `/models`) + +- **Data Layer** + - IBM EIS: high-resolution global weather API + - WiscoNet: Wisconsin mesonet station network + +- **Processing Layer** + Weather normalization, unit conversion, GDD calculation, rolling features + +- **Model Layer** + Disease risk models and winter rye biomass model + +--- + +## Core Modules + +- Weather ingestion (IBM + WiscoNet) +- Disease risk modeling +- Winter rye biomass estimation +- Async pipeline orchestration +- GeoJSON response formatting + +--- + +## API Endpoints + +### IBM Forecasting (Coordinates) +`GET /v2/ag_models_wrappers/ibm` + +Returns disease risk + biomass using IBM weather data. + +--- + +### WiscoNet Forecasting (Stations) +`GET /v2/ag_models_wrappers/wisconet_g` + +Returns station-based time-series disease risk and biomass. + +--- + +### Model Metadata +`GET /v2/ag_models_wrappers/models` + +Returns available disease and biomass models. + +--- + +## Disease Models + +- **Tarspot (corn)** – humidity and temperature-based risk +- **Gray Leaf Spot (corn)** – temperature + dew point model +- **Frogeye Leaf Spot (soybean)** – GDD + rainfall model +- **White Mold (soybean)** – precipitation and soil moisture model + +--- + +## Winter Rye Biomass Model + +Predicts dry biomass (lb/acre) using: + +- Growing Degree Days (0°C base) +- Planting date (day-of-year) +- Fall precipitation +- Logistic growth curve + +### Outputs +- Biomass (lb/acre) +- Color class (gray / yellow / green) +- Interpretation message + +--- + +## Data Sources + +### IBM Environmental Intelligence Suite (EIS) +- High-resolution global weather data +- Hourly forecasts and historical data +- Requires authentication + +### WiscoNet +- Wisconsin mesonet (~100 stations) +- Daily weather observations +- Public API access + +--- + +## Response Format + +All outputs are returned as **GeoJSON FeatureCollections**, including: + +- Weather variables +- Disease risk scores +- Biomass predictions +- Station metadata + +--- + +## Performance Features + +- Async multi-station processing +- Cached weather and station data (6h–7d TTL) +- Parallel risk computation +- Optimized data aggregation pipeline + +--- + +## Setup + +```bash +git clone +cd ag_forecasting_api + +python -m venv .venv +source .venv/bin/activate + +pip install -r requirements.txt + +uvicorn app:app --reload +``` \ No newline at end of file diff --git a/applications/index.md b/applications/index.md new file mode 100644 index 0000000..5cf674f --- /dev/null +++ b/applications/index.md @@ -0,0 +1,14 @@ +# Applications + +We are building OL to support a wide range of applications with minimal changes required from those applications. Our approach is to port more real-world workloads and let their needs drive incremental improvements to the platform. + +## Want to deploy FastAPI apps on OpenLambda? Just ASGI us how. + +In this post, we look at an agricultural forecasting application and an ASGI-based web service. The ag app is a natural fit for serverless because it is fundamentally stateless: results can be regenerated on demand from underlying data rather than relying on persistent runtime state. This also influenced the choice of FastAPI for a modern, async-friendly interface. +To situate ASGI, it builds on the long history of WSGI-based Python web serving, where earlier work (including Jaime’s contributions) helped shape synchronous server patterns. ASGI extends this model with native async support, enabling higher concurrency and better I/O utilization, but requiring deeper runtime integration. +A broader design question is whether it is beneficial to consolidate multiple functions into a single Lambda-like unit. We believe it is: co-locating functions enables opportunistic state reuse, faster warm starts, and reduced overhead. +On the implementation side, OL removes its dependency on Tornado and adds optional support for both WSGI and ASGI applications. The ag forecasting app also surfaced practical issues, including /dev/shm constraints when using process pools, which required targeted adjustments. +Looking ahead, improved visibility into execution—such as detecting when applications are blocked on I/O—opens the door to new billing models that distinguish compute from idle waiting time, addressing a longstanding serverless concern. +More broadly, expanding the set of supported applications continues to drive OL’s evolution, alongside features like environment variables and GitHub-based deployments that further reduce friction for onboarding new workloads. + +- [Ag Forecasting API](ag-forecasting-api.md) \ No newline at end of file From ee852d8954381bdf28d7c4f9928d1621a3b85d03 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Fri, 8 May 2026 14:36:06 -0500 Subject: [PATCH 21/40] Add Ag Forecasting application with open Lambda --- _build/.doctrees/ag-forecasting-api.doctree | Bin 0 -> 152871 bytes .../applications/ag-forecasting-api.doctree | Bin 0 -> 25890 bytes _build/.doctrees/applications/index.doctree | Bin 0 -> 8621 bytes _build/.doctrees/environment.pickle | Bin 31093 -> 41111 bytes _build/.doctrees/index.doctree | Bin 15650 -> 15689 bytes _build/html/.buildinfo | 2 +- _build/html/README.html | 14 +- _build/html/_sources/ag-forecasting-api.md | 932 ++++++++++ .../applications/ag-forecasting-api.md | 145 ++ _build/html/_sources/applications/index.md | 14 + _build/html/_sources/index.md | 4 +- _build/html/_static/open-lambda.png | Bin 0 -> 289165 bytes _build/html/ag-forecasting-api.html | 1627 +++++++++++++++++ .../html/applications/ag-forecasting-api.html | 656 +++++++ _build/html/applications/index.html | 479 +++++ _build/html/genindex.html | 14 +- _build/html/index.html | 18 +- _build/html/objects.inv | Bin 308 -> 372 bytes _build/html/search.html | 14 +- _build/html/searchindex.js | 2 +- _build/html/worker.html | 24 +- _config.yml | 1 + _static/open-lambda.png | Bin 0 -> 289165 bytes applications/ag-forecasting-api.md | 7 +- 24 files changed, 3938 insertions(+), 15 deletions(-) create mode 100644 _build/.doctrees/ag-forecasting-api.doctree create mode 100644 _build/.doctrees/applications/ag-forecasting-api.doctree create mode 100644 _build/.doctrees/applications/index.doctree create mode 100644 _build/html/_sources/ag-forecasting-api.md create mode 100644 _build/html/_sources/applications/ag-forecasting-api.md create mode 100644 _build/html/_sources/applications/index.md create mode 100644 _build/html/_static/open-lambda.png create mode 100644 _build/html/ag-forecasting-api.html create mode 100644 _build/html/applications/ag-forecasting-api.html create mode 100644 _build/html/applications/index.html create mode 100644 _static/open-lambda.png diff --git a/_build/.doctrees/ag-forecasting-api.doctree b/_build/.doctrees/ag-forecasting-api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1cf61adbeeeffb2e294b775987a0967133affb07 GIT binary patch literal 152871 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≪HNCM{h-*!L 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ⅈ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 literal 0 HcmV?d00001 diff --git a/_build/.doctrees/applications/ag-forecasting-api.doctree b/_build/.doctrees/applications/ag-forecasting-api.doctree new file mode 100644 index 0000000000000000000000000000000000000000..5247539c52808e581dc25352acf1642ca4252d3b GIT binary patch literal 25890 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 delta 9885 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 LDVvvDS2F?t^ms`! delta 258 zcmX?EwWx}vfpx0*M3x+WU;l#CJfFneq?AO3M-5Xp*81x)&YOHz&x{$!+svYGz{tu2 zlGto+AjhQQ*TYtxUzD9%G^K4yVh>MdUUE)pN@`kWPHOR#*eO{xEDQ{Zlb0FoWNciV zV9d;TXmg_3FJ@K-RtARR$%R6~lZ&n775@PhWhi7QmL~NG0u4(^&M(a?(ap`wD=h(< zlJ%cu@@6YVRsp!4H&%*F|5zsTTboGz1!~2riGOmewHDhnpmf&6$-UMZk|1Vh7B`qo U2a%;2LbX#gvL diff --git a/_build/html/.buildinfo b/_build/html/.buildinfo index 8d82e6d..45d769d 100644 --- a/_build/html/.buildinfo +++ b/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 00f39c391346115ca176ede8239be645 +config: ff326529dec566ff85861a347816d852 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/README.html b/_build/html/README.html index 570ea59..60718d9 100644 --- a/_build/html/README.html +++ b/_build/html/README.html @@ -148,6 +148,14 @@ + + + + + + + +

OpenLambda

@@ -167,6 +175,10 @@
@@ -443,7 +455,7 @@

Local Preview

-By OpenLambda Contributors +By OpenLambda

diff --git a/_build/html/_sources/ag-forecasting-api.md b/_build/html/_sources/ag-forecasting-api.md new file mode 100644 index 0000000..2a2e377 --- /dev/null +++ b/_build/html/_sources/ag-forecasting-api.md @@ -0,0 +1,932 @@ +# Agricultural Forecasting API - Technical Documentation + +A FastAPI-based service for crop disease forecasting and biomass prediction using weather data integration from multiple sources. Developed by the University of Wisconsin-Madison Data Science Institute. + +--- + +## Table of Contents + +1. [Overview](#overview) +2. [Architecture](#architecture) +3. [Technology Stack](#technology-stack) +4. [API Endpoints](#api-endpoints) +5. [Core Features](#core-features) +6. [Data Flow](#data-flow) +7. [Disease Models](#disease-models) +8. [Biomass Models](#biomass-models) +9. [Weather Data Sources](#weather-data-sources) +10. [Response Format](#response-format) +11. [Development Setup](#development-setup) +12. [Deployment](#deployment) + +--- + +## Overview + +The Agricultural Forecasting API provides real-time crop disease risk predictions and winter rye biomass estimates for Wisconsin agricultural locations. The system integrates historical weather data with scientifically-validated disease forecasting models to help farmers and agricultural professionals make informed management decisions. + +**Key Capabilities:** +- Real-time disease risk predictions for corn and soybean +- Winter rye biomass accumulation forecasts +- Multi-source weather data integration (IBM EIS, WiscoNet, NOAA) +- Geospatial queries by coordinates or weather station ID +- Batch processing for multi-station analysis +- GeoJSON-formatted responses for mapping integration + +--- + +## Architecture + +### High-Level Design + +``` +┌─────────────────────────────────────────────────────────────┐ +│ FastAPI Application │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ │ +│ │ /v2/ibm │ │ /v2/wisconet_g │ │ /v2/models │ │ +│ │ (Coordinates) │ │ (Station-based) │ │ (Metadata) │ │ +│ └────────┬────────┘ └────────┬─────────┘ └─────────────┘ │ +│ │ │ │ +├───────────┼────────────────────┼─────────────────────────────┤ +│ │ │ │ +│ ┌────────▼────────────┐ ┌───▼──────────────────┐ │ +│ │ IBM Service │ │ Pipeline / WiscoNet │ │ +│ │ (ibm_service.py) │ │ (pipeline.py) │ │ +│ │ │ │ │ │ +│ │ • Authenticate │ │ • Load stations │ │ +│ │ • Fetch raw data │ │ • Fetch measurements │ │ +│ │ • Build hourly │ │ • Compute biomass │ │ +│ │ • Build daily │ │ • Annotate risks │ │ +│ │ • Compute rolling │ │ │ │ +│ │ averages │ │ │ │ +│ └────────┬────────────┘ └───┬──────────────────┘ │ +│ │ │ │ +├───────────┼───────────────────┼──────────────────────────────┤ +│ │ │ │ +│ ┌────────▼─────────────────────┴──────┐ │ +│ │ Risk Models & Biomass Calc │ │ +│ │ (api/models/risk_models.py) │ │ +│ │ │ │ +│ │ • Tarspot risk (corn) │ │ +│ │ • Gray Leaf Spot (corn) │ │ +│ │ • Frogeye Leaf Spot (soybean) │ │ +│ │ • White Mold (soybean) │ │ +│ │ • Winter Rye Biomass (logistic) │ │ +│ └────────┬─────────────────────────────┘ │ +│ │ │ +├───────────┼──────────────────────────────────────────────────┤ +│ │ │ +│ ┌────────▼────────────────────────────┐ │ +│ │ Output Formatting & Response │ │ +│ │ (adapters/geojson_adapter.py) │ │ +│ │ │ │ +│ │ • GeoJSON Feature Collections │ │ +│ │ • Time-series grouping │ │ +│ │ • Station metadata embedding │ │ +│ └──────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +### Directory Structure + +``` +ag_forecasting_api/ +├── app.py # Main FastAPI entry point (v2) +├── app_v1.py # Legacy API (deprecated, v1) +├── requirements.txt # Python dependencies +├── Dockerfile # Container image definition +├── docker-compose.yml # Multi-container orchestration +│ +├── api/ # Core business logic +│ ├── __init__.py +│ ├── config/ +│ │ └── constants.py # Configuration, URLs, thresholds +│ │ +│ ├── models/ +│ │ ├── risk_models.py # Disease & biomass calculations +│ │ └── disease_metadata.py # Model metadata registry +│ │ +│ ├── services/ +│ │ ├── ibm_service.py # IBM EIS weather integration +│ │ ├── wisconet_service.py # WiscoNet station pipeline +│ │ └── risk_processor.py # Risk annotation orchestration +│ │ +│ ├── routes/ +│ │ ├── wisconet.py # /v2/ag_models_wrappers/wisconet_g +│ │ └── models.py # /v2/ag_models_wrappers/models +│ │ +│ ├── adapters/ +│ │ └── geojson_adapter.py # DataFrame → GeoJSON converter +│ │ +│ ├── schemas/ +│ │ ├── geojson_schema.py # Response schema definitions +│ │ └── model_schema.py # Model metadata schemas +│ │ +│ ├── utils/ +│ │ ├── math_helpers.py # GDD, logistic, rolling averages +│ │ ├── conversions.py # Unit conversions (F↔C, mph↔m/s) +│ │ └── caching.py # Station & measurement caching +│ │ +│ └── pipeline.py # Orchestrates WiscoNet workflow +│ +├── api_cache/ # Cached API responses (JSON) +│ ├── metadata_stations_*.json +│ └── station_data_*.json +│ +└── materials/ + └── example_callapi.ipynb # Usage examples +``` + +### Module Responsibilities + +| Module | Purpose | Key Functions | +|--------|---------|---------------| +| `ibm_service.py` | IBM weather API integration | `get_weather_with_risk()`, `_fetch_raw_hourly()`, `_build_daily()`, `_annotate_winter_rye_biomass()` | +| `wisconet_service.py` | WiscoNet station data pipeline | `_compute_winter_rye_biomass()`, station loading & filtering | +| `risk_models.py` | Disease & biomass calculations | `calculate_tarspot_risk()`, `calculate_winter_rye_biomass()`, etc. | +| `pipeline.py` | Async WiscoNet orchestration | `retrieve()`, multi-station batch processing | +| `math_helpers.py` | Shared mathematical utilities | `gdd_sine()`, `logistic()`, `rolling_mean()` | +| `geojson_adapter.py` | Response formatting | `dataframe_to_featurecollection()` | + +--- + +## Technology Stack + +### Core Dependencies + +| Component | Library | Version | Purpose | +|-----------|---------|---------|---------| +| Web Framework | FastAPI | ^0.100 | REST API framework | +| ASGI Server | Uvicorn | ^0.24 | ASGI server | +| Data Processing | Pandas | ^2.0 | Tabular data manipulation | +| Numeric Computing | NumPy | ^1.24 | Numerical calculations | +| Data Validation | Pydantic | ^2.0 | Request/response schema validation | +| HTTP Client | requests | ^2.31 | Synchronous HTTP calls | +| Async HTTP | aiohttp | ^3.9 | Async HTTP requests | +| Logging | Python logging | stdlib | Structured logging | + +### External Services + +- **IBM Environmental Intelligence Suite (EIS)**: Premium weather API with historical-on-demand (HOD) data +- **WiscoNet**: Public Wisconsin mesonet weather station network +- **NOAA**: National weather service data for historical context + +### Deployment + +- **Container**: Docker with Alpine Linux base +- **Orchestration**: Docker Compose for multi-service deployments +- **Reverse Proxy**: Traefik for URL routing and TLS termination +- **Health Monitoring**: Periodic curl-based health checks + +--- + +## API Endpoints + +### V2 Endpoints (Current) + +#### Disease Risk & Biomass by Coordinates (IBM) + +```http +GET /v2/ag_models_wrappers/ibm +``` + +Query parameters: +- `forecasting_date` (required): Reference date (YYYY-MM-DD) +- `latitude` (required): Decimal degrees +- `longitude` (required): Decimal degrees +- `planting_date` (optional): For biomass calculation (YYYY-MM-DD) +- `termination_date` (optional): For WiscoNet biomass integration (YYYY-MM-DD) +- `API_KEY` (required): IBM EIS credential +- `TENANT_ID` (required): IBM EIS credential +- `ORG_ID` (required): IBM EIS credential + +Example: +```bash +curl "http://localhost:8000/v2/ag_models_wrappers/ibm?forecasting_date=2025-05-15&latitude=43.0&longitude=-89.0&planting_date=2024-09-15&API_KEY=xxx&TENANT_ID=yyy&ORG_ID=zzz" +``` + +Response: GeoJSON FeatureCollection with hourly and daily weather data plus risk scores. + +--- + +#### Disease Risk & Biomass by WiscoNet Stations + +```http +GET /v2/ag_models_wrappers/wisconet_g +``` + +Query parameters: +- `forecasting_date` (required): Reference date (YYYY-MM-DD) +- `risk_days` (optional): Days to compute rolling risk (default: 1) +- `station_id` (optional): Filter to single station (e.g., "ALTN") +- `planting_date` (optional): For winter rye biomass (YYYY-MM-DD) +- `termination_date` (optional): For crop termination biomass (YYYY-MM-DD) +- `disease` (optional): Filter to specific disease model + +Example: +```bash +curl "http://localhost:8000/v2/ag_models_wrappers/wisconet_g?forecasting_date=2025-05-15&station_id=ALTN&planting_date=2024-09-15" +``` + +Response: GeoJSON FeatureCollection grouped by station with time-series risk data. + +--- + +#### Model Metadata + +```http +GET /v2/ag_models_wrappers/models +``` + +Returns list of all available disease models with descriptions, crops, risk categories, and input requirements. + +--- + +### Legacy V1 Endpoints + +The API maintains backward compatibility with v1 endpoints (mounted at `/v1`), including: +- `/v1/sites` - Station listing +- `/v1/predictions` - Disease predictions +- `/v1/models` - Model metadata + +--- + +## Core Features + +### 1. Multi-Source Weather Integration + +The API combines weather data from multiple sources with intelligent fallback: + +``` +┌──────────────────────────────────────────────────┐ +│ Weather Data Request (lat/lng, date range) │ +└────────────────┬─────────────────────────────────┘ + │ + ┌───────────┴──────────────┐ + │ │ + ▼ ▼ +┌─────────────────┐ ┌──────────────────┐ +│ IBM EIS API │ │ WiscoNet Network │ +│ (Premium, │ │ (Public, │ +│ high res) │ │ station-based) │ +└────────┬────────┘ └────────┬─────────┘ + │ │ + └────────────┬───────────┘ + │ + ▼ + ┌──────────────────────┐ + │ Data Harmonization │ + │ • Timezone aware │ + │ • Unit conversion │ + │ • Interpolation │ + └──────────┬───────────┘ + │ + ▼ + ┌──────────────────────┐ + │ Growing Degree Days │ + │ • Sine method │ + │ • Base: 0°C, Cap: 35°C│ + └──────────┬───────────┘ + │ + ▼ + ┌──────────────────────┐ + │ Rolling Averages │ + │ • 7, 14, 21, 30-day │ + └──────────┬───────────┘ + │ + ▼ + ┌──────────────────────┐ + │ Risk Model Input │ + │ (Ready for scoring) │ + └──────────────────────┘ +``` + +### 2. Efficient Data Caching + +Reduces redundant API calls through tiered caching: + +```python +# Cache layers (in api/utils/caching.py) +- Station metadata: 7-day TTL +- Measurements: 6-hour TTL +- IBM responses: Variable TTL based on forecast date +- File system: JSON cache in api_cache/ directory +``` + +### 3. Async Pipeline Processing + +Multi-station workflows use async processing for performance: + +```python +# pipeline.py +async def _run_pipeline(...): + # 1. Load all active stations (filtered) + stations = load_stations_sync(...) + + # 2. Fetch all measurements concurrently + measurements = await fetch_all_measurements_async(stations) + + # 3. Merge metadata (station location, timezone, etc.) + merged = merge_station_metadata(measurements, stations) + + # 4. Compute winter rye biomass (if planting_date provided) + if planting_date: + biomass = _compute_winter_rye_biomass(merged, planting_date) + merged = merge_biomass(merged, biomass) + + # 5. Optionally fetch WiscoNet-specific biomass data + if both planting_date and termination_date: + wisconet_biomass = await fetch_wisconet_biomass(...) + merged = merge_wisconet_biomass(merged, wisconet_biomass) + + # 6. Compute disease risks in parallel + risk_df = compute_risks_in_parallel( + merged, num_workers=4 + ) + + return risk_df +``` + +### 4. Intelligent Date & Timezone Handling + +- Automatic timezone conversion to station local time +- Date arithmetic aware of DST transitions +- Support for both absolute dates and relative forecasts + +--- + +## Disease Models + +### Tarspot Risk (Corn) + +**Crop:** Corn +**Disease:** *Phyllachora maydis* (Tar Spot fungus) + +**Model Type:** Ensemble logistic regression (two sub-models averaged) + +**Inputs:** +- 30-day mean air temperature (°C) +- 30-day max relative humidity (%) +- 14-day mean nighttime hours with RH ≥ 90% + +**Output:** Risk probability (0–1), classified as: +- **Inactive** (mean temp < 10°C) +- **1.Low** (prob < 0.20) +- **2.Moderate** (prob 0.20–0.35) +- **3.High** (prob > 0.35) + +**Reference:** Damon et al. + +--- + +### Gray Leaf Spot Risk (Corn) + +**Crop:** Corn +**Disease:** *Cercospora zeae-maydis* (Gray Leaf Spot) + +**Model Type:** Single logistic regression + +**Inputs:** +- 21-day min air temperature (°C) +- 30-day min dew point (°C) + +**Assumptions:** Growth stage V10–R3, no irrigation + +**Output:** Risk probability (0–1), same classification as Tarspot + +--- + +### Frogeye Leaf Spot Risk (Soybean) + +**Crop:** Soybean +**Disease:** *Cercospora sojina* (Frogeye Leaf Spot) + +**Model Type:** Logistic regression + +**Inputs:** +- Degree-days above 14°C (cumulative from emergence) +- Rainfall in previous 14 days (mm) +- Hours with RH ≥ 85% (14-day rolling) + +**Output:** Risk probability (0–1) + +--- + +### White Mold Risk (Soybean) + +**Crop:** Soybean +**Disease:** *Sclerotinia sclerotiorum* (White Mold / Sclerotinia) + +**Model Type:** Dual variant (irrigated & non-irrigated) + +**Inputs:** +- Days since planting +- Cumulative precipitation (mm) +- Soil moisture availability + +**Variants:** +- **Dry:** Non-irrigated fields +- **Irrigated 15":** 15-inch row spacing +- **Irrigated 30":** 30-inch row spacing + +**Output:** Apothecial presence probability (0–1) + +--- + +### Winter Rye Biomass (NEW) + +**Crop:** Winter Rye +**Metric:** Aboveground dry biomass (lb/acre) + +**Model Type:** Logistic growth model + +**Formula:** + +$$\text{logit} = b_0 + b_{pd} \cdot \text{plant\_doy} + b_{pf} \cdot \text{precip\_fall}$$ + +$$\text{pred} = \frac{\text{logit}}{1 + e^{-k(\text{gdd\_total}-x_0)}}$$ + +$$\text{biomass} = \max(0, \text{pred}^2)$$ + +**Coefficients:** +- $b_0 = 423.1$ (intercept) +- $b_{pd} = -1.031$ (day-of-year effect) +- $b_{pf} = -0.2878$ (fall precipitation effect) +- $k = 0.003663$ (logistic rate) +- $x_0 = 1049.0$ (inflection point GDD) + +**Inputs:** +- Planting day-of-year (1–366) +- Precipitation during fall establishment (mm) +- Cumulative GDD from planting to current date (0°C base) + +**Output:** +- **Biomass** (lb/acre): Numeric prediction +- **Biomass Color:** + - **Gray**: 0–2000 lb/acre (low coverage) + - **Yellow**: 2000–4500 lb/acre (moderate) + - **Green**: >4500 lb/acre (high/dense) +- **Biomass Message**: Human-readable interpretation + +**Use Cases:** +- Cover crop management planning +- Soil health assessment +- Erosion mitigation evaluation +- Residue management decisions + +--- + +## Biomass Models + +### Winter Rye Biomass Calculation Pipeline + +```python +def _annotate_winter_rye_biomass( + rye_daily: pd.DataFrame, + planting_date: str +) -> pd.DataFrame: + """ + Compute winter rye biomass from daily weather data. + + Steps: + 1. Parse planting_date → day-of-year + 2. Filter to dates >= planting_date + 3. Compute daily GDD (sine method, 0°C base, 35°C cap) + 4. Accumulate GDD and precipitation + 5. Call calculate_winter_rye_biomass() for each row + 6. Merge results back into DataFrame + """ + + # Step 1: Parse planting date + plant_date_obj = datetime.fromisoformat(planting_date).date() + plant_doy = plant_date_obj.timetuple().tm_yday + + # Step 2: Filter to >= planting date + rye_daily = rye_daily[rye_daily['date'] >= planting_date].copy() + + # Step 3-4: GDD accumulation + rye_daily['plant_doy'] = plant_doy + rye_daily['precip_daily'] = rye_daily['precip1Hour_sum'].fillna(0) + rye_daily['gdd_0c'] = rye_daily.apply( + lambda row: gdd_sine(row['temperature_min'], row['temperature_max']), + axis=1 + ) + rye_daily['gdd_total'] = rye_daily['gdd_0c'].cumsum() + + # Compute fall precipitation (Sep 1 to planting) + fall_start = plant_date_obj.replace(month=9, day=1) + fall_precip = rye_daily[ + (rye_daily['date'] >= str(fall_start)) & + (rye_daily['date'] < planting_date) + ]['precip_daily'].sum() + + # Step 5: Model calculation + biomass_results = rye_daily.apply( + lambda row: calculate_winter_rye_biomass( + plant_doy=row['plant_doy'], + precip_fall=fall_precip, + gdd_total=row['gdd_total'] + ), + axis=1, + result_type='expand' + ) + + # Step 6: Merge results + for col in ['biomass_lb_acre', 'biomass_color', 'biomass_message']: + rye_daily[col] = biomass_results[col] + + return rye_daily +``` + +--- + +## Weather Data Sources + +### IBM Environmental Intelligence Suite (EIS) + +**Characteristics:** +- Premium, high-resolution service +- Hourly data with 999-hour request window per call +- Requires JWT authentication +- Covers entire globe +- 15-minute resolution available + +**Data Acquisition:** +1. Obtain JWT token via SaaSCore authentication +2. Request hourly-on-demand (HOD) data in time chunks +3. Convert to timezone-aware UTC timestamps +4. Interpolate/aggregate to daily summaries + +**Cached Columns:** +- `temperature_min`, `temperature_max`, `temperature_mean` +- `temperatureDewPoint_min`, `temperatureDewPoint_max` +- `relativeHumidity_min`, `relativeHumidity_max` +- `windSpeed_max`, `windSpeed_mean` +- `precip1Hour_sum` (hourly accumulated) +- Rolling averages: 7, 14, 21, 30-day + +--- + +### WiscoNet (Public Mesonet) + +**Characteristics:** +- Wisconsin statewide mesonet network +- ~100 active weather stations +- Public API, no authentication required +- Daily data update cycle +- Station metadata includes: ID, name, lat/lng, county, region + +**Measurement Types:** +- Air temperature (min, avg, max) +- Dew point (min, avg, max) +- Relative humidity (%) +- Wind speed (max, direction) +- Precipitation (daily total) +- Soil temperature (select stations) +- Leaf wetness (select stations) + +**Data Retrieval:** +- Station list via `/wisconet_active_stations` +- Daily measurements via bulk query endpoint +- Cached in `station_measurements_cache/` (6-hour TTL) + +--- + +## Response Format + +### GeoJSON Feature Collection + +All responses follow the GeoJSON standard with extended properties: + +```json +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [-89.4, 43.1] + }, + "properties": { + "date": "2025-05-15", + "forecasting_date": "2025-05-15", + "station_id": "ALTN", + "station_name": "Alten", + "city": "Alten", + "county": "Columbia", + "region": "South Central", + "state": "WI", + "latitude": 43.1234, + "longitude": -89.4567, + "station_timezone": "America/Chicago", + + "temperature_min_c": 8.3, + "temperature_max_c": 21.5, + "temperature_mean_c": 15.2, + "relativeHumidity_max": 92, + "precip1Hour_sum": 2.5, + + "tarspot_risk": 0.45, + "tarspot_risk_class": "2.Moderate", + "gls_risk": 0.28, + "gls_risk_class": "1.Low", + "frogeye_risk": 0.12, + "frogeye_risk_class": "1.Low", + "whitemold_dry_risk": 0.35, + "whitemold_dry_risk_class": "2.Moderate", + + "biomass_lb_acre": 3250, + "biomass_color": "Yellow", + "biomass_message": "Moderate coverage" + } + } + ] +} +``` + +### Time-Series Grouping (WiscoNet) + +For multi-day forecasts, results are grouped by station with embedded time-series: + +```json +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { "type": "Point", "coordinates": [-89.4, 43.1] }, + "properties": { + "station_id": "ALTN", + "station_name": "Alten", + "city": "Alten", + "county": "Columbia", + "region": "South Central", + "state": "WI", + "time_series": [ + { + "date": "2025-05-15", + "temperature_min_c": 8.3, + "tarspot_risk": 0.45, + ... + }, + { + "date": "2025-05-16", + "temperature_min_c": 7.8, + "tarspot_risk": 0.38, + ... + } + ] + } + } + ] +} +``` + +--- + +## Data Flow + +### Complete Request → Response Journey + +``` +User Request + │ + ▼ +┌──────────────────────────────┐ +│ Route Handler (app.py) │ +│ Validate query parameters │ +│ Extract coordinates/dates │ +└────────────────┬─────────────┘ + │ + ┌────────────┴────────────┐ + │ │ + ▼ ▼ +┌─────────────────┐ ┌───────────────┐ +│ IBM Service │ │ WiscoNet │ +│ │ │ Pipeline │ +│ 1. Authenticate │ │ │ +│ with IBM │ │ 1. Load │ +│ 2. Chunk time │ │ stations │ +│ range │ │ 2. Fetch │ +│ 3. Fetch hourly │ │ measurements +│ data │ │ 3. Merge │ +│ 4. Build daily │ │ metadata │ +│ summaries │ │ 4. Cache │ +│ │ │ results │ +└────────┬────────┘ └────────┬──────┘ + │ │ + └──────────┬───────────┘ + │ + ▼ + ┌──────────────────────┐ + │ Math Helpers │ + │ • Convert units │ + │ • GDD calculation │ + │ • Rolling averages │ + │ • Biomass prep │ + └──────────┬───────────┘ + │ + ▼ + ┌──────────────────────┐ + │ Risk Model Scoring │ + │ Apply all diseases │ + │ Compute probabilities│ + │ Classify risk class │ + └──────────┬───────────┘ + │ + ▼ + ┌──────────────────────┐ + │ Biomass Calculation │ + │ (if planting_date) │ + │ Logistic model │ + │ Color classification │ + └──────────┬───────────┘ + │ + ▼ + ┌──────────────────────┐ + │ GeoJSON Adapter │ + │ • Format geometry │ + │ • Embed properties │ + │ • Group by station │ + └──────────┬───────────┘ + │ + ▼ + Response (GeoJSON) +``` + +--- + +## Development Setup + +### Prerequisites + +- Python 3.10+ +- pip or conda +- Git +- Docker (optional, for containerized development) + +### Local Installation + +```bash +# Clone repository +git clone https://github.com/UW-Madison-DSI/ag_forecasting_api.git +cd ag_forecasting_api + +# Create virtual environment +python -m venv .venv +source .venv/bin/activate # On Windows: .venv\Scripts\activate + +# Install dependencies +pip install -r requirements.txt + +# Set environment variables +export IBM_API_KEY="your_key" +export TENANT_ID="your_tenant" +export ORG_ID="your_org" + +# Run development server +uvicorn app:app --reload --host 0.0.0.0 --port 8000 +``` + +### API Documentation + +Once running, view interactive documentation: +- **Swagger UI:** http://localhost:8000/docs +- **ReDoc:** http://localhost:8000/redoc +- **OpenAPI JSON:** http://localhost:8000/openapi.json + +### Testing + +```bash +# Syntax validation +python -m py_compile api/models/risk_models.py api/services/*.py + +# Run linting (if installed) +pylint api/ + +# Test endpoint with curl +curl "http://localhost:8000/v2/test/rye_biomass" +``` + +--- + +## Deployment + +### Docker Deployment + +```dockerfile +FROM python:3.11-slim +WORKDIR /app +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt +COPY . . +EXPOSE 8000 +CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"] +``` + +### Docker Compose (Production) + +```yaml +version: "3.9" +services: + ag_forecasting_api: + build: . + expose: + - 8000 + environment: + - PYTHONPATH=/app + - ENVIRONMENT=production + - IBM_API_KEY=${IBM_API_KEY} + - TENANT_ID=${TENANT_ID} + - ORG_ID=${ORG_ID} + networks: + - traefik + labels: + - "traefik.enable=true" + - "traefik.http.routers.ag_api.rule=Host(`your-domain.com`)" + - "traefik.http.services.ag_api.loadbalancer.server.port=8000" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/"] + interval: 30s + timeout: 10s + retries: 3 +``` + +### Environment Variables + +Required for production: +- `IBM_API_KEY`: IBM EIS authentication credential +- `TENANT_ID`: IBM EIS tenant identifier +- `ORG_ID`: IBM EIS organization identifier +- `ENVIRONMENT`: Set to "production" for optimized logging + +Optional: +- `PYTHONPATH`: Should include `/app` for imports +- `LOG_LEVEL`: Logging verbosity (default: INFO) + +--- + +## Performance Considerations + +### Caching Strategy + +- **Station Metadata**: 7-day TTL (rarely changes) +- **Measurements**: 6-hour TTL (updated daily by WiscoNet) +- **IBM Responses**: Variable (tied to forecast date relevance) +- **File System**: JSON cache in `api_cache/` for persistence + +### Concurrency + +- **Async Pipeline**: Multi-station queries use async/await for I/O efficiency +- **Parallel Risk Scoring**: Disease calculations use multiprocessing (4 workers default) +- **Connection Pooling**: HTTP clients maintain connection pools (max 50 concurrent) + +### Optimization Tips + +1. **Batch Requests**: Query multiple stations in one call rather than sequential individual queries +2. **Use WiscoNet**: Public API has lower latency than premium IBM service +3. **Limit Date Range**: Smaller date ranges reduce computation time +4. **Filter Diseases**: Specify disease models needed to reduce calculation overhead +5. **Cache Warming**: Pre-fetch station lists during off-peak hours + +--- + +## Additional Resources + +- **GitHub Repository**: https://github.com/UW-Madison-DSI/ag_forecasting_api +- **Interactive Dashboard**: https://connect.doit.wisc.edu/ag_forecasting/ +- **Example Notebook**: `/materials/example_callapi.ipynb` +- **University Contact**: UW-Madison Data Science Institute + +--- + +## License + +See LICENSE file for details. + +--- + +## Changelog + +### Version 2.0 (Current) + +- ✅ Winter rye biomass model integration +- ✅ Unified API versioning (v1 legacy, v2 current) +- ✅ Enhanced GeoJSON responses +- ✅ Improved async pipeline performance +- ✅ Extended documentation + +### Version 1.0 (Legacy) + +- Disease risk models for corn and soybean +- WiscoNet and IBM EIS integration +- Basic GeoJSON support + +--- + +**Last Updated:** May 2025 +**Maintained By:** UW-Madison Data Science Institute diff --git a/_build/html/_sources/applications/ag-forecasting-api.md b/_build/html/_sources/applications/ag-forecasting-api.md new file mode 100644 index 0000000..68e08e6 --- /dev/null +++ b/_build/html/_sources/applications/ag-forecasting-api.md @@ -0,0 +1,145 @@ +# 🌾 Agricultural Forecasting API + +FastAPI-based service for **crop disease risk forecasting** and **winter rye biomass estimation** using multi-source weather data. +Developed by the University of Wisconsin–Madison Data Science Institute. + +--- + +## Overview + +The API provides geospatial agricultural intelligence for Wisconsin, combining weather data with validated agronomic models. + +### Key Features +- 🌽 Crop disease risk forecasting (corn & soybean) +- 🌱 Winter rye biomass estimation +- 🌦 Multi-source weather integration (IBM EIS, WiscoNet, NOAA) +- 📍 Coordinate and station-based queries +- 🗺 GeoJSON outputs for GIS applications +- ⚡ Async batch processing for multi-station analysis + +--- + +## System Architecture + +The system is structured into four main layers: + +- **API Layer (FastAPI)** + Handles incoming requests and routing (`/ibm`, `/wisconet_g`, `/models`) + +- **Data Layer** + - IBM EIS: high-resolution global weather API + - WiscoNet: Wisconsin mesonet station network + +- **Processing Layer** + Weather normalization, unit conversion, GDD calculation, rolling features + +- **Model Layer** + Disease risk models and winter rye biomass model + +--- + +## Core Modules + +- Weather ingestion (IBM + WiscoNet) +- Disease risk modeling +- Winter rye biomass estimation +- Async pipeline orchestration +- GeoJSON response formatting + +--- + +## API Endpoints + +### IBM Forecasting (Coordinates) +`GET /v2/ag_models_wrappers/ibm` + +Returns disease risk + biomass using IBM weather data. + +--- + +### WiscoNet Forecasting (Stations) +`GET /v2/ag_models_wrappers/wisconet_g` + +Returns station-based time-series disease risk and biomass. + +--- + +### Model Metadata +`GET /v2/ag_models_wrappers/models` + +Returns available disease and biomass models. + +--- + +## Disease Models + +- **Tarspot (corn)** – humidity and temperature-based risk +- **Gray Leaf Spot (corn)** – temperature + dew point model +- **Frogeye Leaf Spot (soybean)** – GDD + rainfall model +- **White Mold (soybean)** – precipitation and soil moisture model + +--- + +## Winter Rye Biomass Model + +Predicts dry biomass (lb/acre) using: + +- Growing Degree Days (0°C base) +- Planting date (day-of-year) +- Fall precipitation +- Logistic growth curve + +### Outputs +- Biomass (lb/acre) +- Color class (gray / yellow / green) +- Interpretation message + +--- + +## Data Sources + +### IBM Environmental Intelligence Suite (EIS) +- High-resolution global weather data +- Hourly forecasts and historical data +- Requires authentication + +### WiscoNet +- Wisconsin mesonet (~100 stations) +- Daily weather observations +- Public API access + +--- + +## Response Format + +All outputs are returned as **GeoJSON FeatureCollections**, including: + +- Weather variables +- Disease risk scores +- Biomass predictions +- Station metadata + +--- + +## Performance Features + +- Async multi-station processing +- Cached weather and station data (6h–7d TTL) +- Parallel risk computation +- Optimized data aggregation pipeline + +--- + +## Setup + +```bash +git clone +cd ag_forecasting_api + +python -m venv .venv +source .venv/bin/activate + +pip install -r requirements.txt + +uvicorn app:app --reload +``` \ No newline at end of file diff --git a/_build/html/_sources/applications/index.md b/_build/html/_sources/applications/index.md new file mode 100644 index 0000000..5cf674f --- /dev/null +++ b/_build/html/_sources/applications/index.md @@ -0,0 +1,14 @@ +# Applications + +We are building OL to support a wide range of applications with minimal changes required from those applications. Our approach is to port more real-world workloads and let their needs drive incremental improvements to the platform. + +## Want to deploy FastAPI apps on OpenLambda? Just ASGI us how. + +In this post, we look at an agricultural forecasting application and an ASGI-based web service. The ag app is a natural fit for serverless because it is fundamentally stateless: results can be regenerated on demand from underlying data rather than relying on persistent runtime state. This also influenced the choice of FastAPI for a modern, async-friendly interface. +To situate ASGI, it builds on the long history of WSGI-based Python web serving, where earlier work (including Jaime’s contributions) helped shape synchronous server patterns. ASGI extends this model with native async support, enabling higher concurrency and better I/O utilization, but requiring deeper runtime integration. +A broader design question is whether it is beneficial to consolidate multiple functions into a single Lambda-like unit. We believe it is: co-locating functions enables opportunistic state reuse, faster warm starts, and reduced overhead. +On the implementation side, OL removes its dependency on Tornado and adds optional support for both WSGI and ASGI applications. The ag forecasting app also surfaced practical issues, including /dev/shm constraints when using process pools, which required targeted adjustments. +Looking ahead, improved visibility into execution—such as detecting when applications are blocked on I/O—opens the door to new billing models that distinguish compute from idle waiting time, addressing a longstanding serverless concern. +More broadly, expanding the set of supported applications continues to drive OL’s evolution, alongside features like environment variables and GitHub-based deployments that further reduce friction for onboarding new workloads. + +- [Ag Forecasting API](ag-forecasting-api.md) \ No newline at end of file diff --git a/_build/html/_sources/index.md b/_build/html/_sources/index.md index e2330bc..b878d5b 100644 --- a/_build/html/_sources/index.md +++ b/_build/html/_sources/index.md @@ -1,7 +1,7 @@ --- myst: html_meta: - description: "OpenLambda — Apache-licensed serverless computing built on Linux containers" + description: "OpenLambda - Apache-licensed serverless computing built on Linux containers" keywords: "serverless, OpenLambda, Go, Linux containers, cloud computing" --- @@ -61,5 +61,5 @@ manually deploy workers yourself and put an HTTP load balancer in front of them. ## License -This project is licensed under the **Apache License** — see the +This project is licensed under the **Apache License** - see the [LICENSE.md](https://github.com/open-lambda/open-lambda/blob/main/LICENSE) file for details. \ No newline at end of file diff --git a/_build/html/_static/open-lambda.png b/_build/html/_static/open-lambda.png new file mode 100644 index 0000000000000000000000000000000000000000..979e24b7ffa75216c6865ccf2d7f2c00beb7c6f9 GIT binary patch literal 289165 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%0Dtjq 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

A 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 WCFJ+Vc408^bIR + + + + + + + + + Agricultural Forecasting API - Technical Documentation — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

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

Agricultural Forecasting API - Technical Documentation#

+

A FastAPI-based service for crop disease forecasting and biomass prediction using weather data integration from multiple sources. Developed by the University of Wisconsin-Madison Data Science Institute.

+
+
+

Table of Contents#

+
    +
  1. Overview

  2. +
  3. Architecture

  4. +
  5. Technology Stack

  6. +
  7. API Endpoints

  8. +
  9. Core Features

  10. +
  11. Data Flow

  12. +
  13. Disease Models

  14. +
  15. Biomass Models

  16. +
  17. Weather Data Sources

  18. +
  19. Response Format

  20. +
  21. Development Setup

  22. +
  23. Deployment

  24. +
+
+
+
+

Overview#

+

The Agricultural Forecasting API provides real-time crop disease risk predictions and winter rye biomass estimates for Wisconsin agricultural locations. The system integrates historical weather data with scientifically-validated disease forecasting models to help farmers and agricultural professionals make informed management decisions.

+

Key Capabilities:

+
    +
  • Real-time disease risk predictions for corn and soybean

  • +
  • Winter rye biomass accumulation forecasts

  • +
  • Multi-source weather data integration (IBM EIS, WiscoNet, NOAA)

  • +
  • Geospatial queries by coordinates or weather station ID

  • +
  • Batch processing for multi-station analysis

  • +
  • GeoJSON-formatted responses for mapping integration

  • +
+
+
+
+

Architecture#

+
+

High-Level Design#

+
┌─────────────────────────────────────────────────────────────┐
+│                     FastAPI Application                      │
+├─────────────────────────────────────────────────────────────┤
+│                                                               │
+│  ┌─────────────────┐  ┌──────────────────┐  ┌─────────────┐ │
+│  │   /v2/ibm       │  │  /v2/wisconet_g  │  │  /v2/models │ │
+│  │  (Coordinates)  │  │  (Station-based) │  │  (Metadata) │ │
+│  └────────┬────────┘  └────────┬─────────┘  └─────────────┘ │
+│           │                    │                             │
+├───────────┼────────────────────┼─────────────────────────────┤
+│           │                    │                             │
+│  ┌────────▼────────────┐  ┌───▼──────────────────┐           │
+│  │  IBM Service        │  │  Pipeline / WiscoNet │           │
+│  │  (ibm_service.py)   │  │  (pipeline.py)       │           │
+│  │                     │  │                      │           │
+│  │ • Authenticate      │  │ • Load stations      │           │
+│  │ • Fetch raw data    │  │ • Fetch measurements │           │
+│  │ • Build hourly      │  │ • Compute biomass    │           │
+│  │ • Build daily       │  │ • Annotate risks     │           │
+│  │ • Compute rolling   │  │                      │           │
+│  │   averages          │  │                      │           │
+│  └────────┬────────────┘  └───┬──────────────────┘           │
+│           │                   │                              │
+├───────────┼───────────────────┼──────────────────────────────┤
+│           │                   │                              │
+│  ┌────────▼─────────────────────┴──────┐                     │
+│  │     Risk Models & Biomass Calc       │                    │
+│  │     (api/models/risk_models.py)      │                    │
+│  │                                      │                    │
+│  │ • Tarspot risk (corn)                │                    │
+│  │ • Gray Leaf Spot (corn)              │                    │
+│  │ • Frogeye Leaf Spot (soybean)        │                    │
+│  │ • White Mold (soybean)               │                    │
+│  │ • Winter Rye Biomass (logistic)      │                    │
+│  └────────┬─────────────────────────────┘                    │
+│           │                                                  │
+├───────────┼──────────────────────────────────────────────────┤
+│           │                                                  │
+│  ┌────────▼────────────────────────────┐                     │
+│  │  Output Formatting & Response        │                    │
+│  │  (adapters/geojson_adapter.py)       │                    │
+│  │                                      │                    │
+│  │ • GeoJSON Feature Collections        │                    │
+│  │ • Time-series grouping               │                    │
+│  │ • Station metadata embedding         │                    │
+│  └──────────────────────────────────────┘                    │
+│                                                               │
+└─────────────────────────────────────────────────────────────┘
+
+
+
+
+

Directory Structure#

+
ag_forecasting_api/
+├── app.py                          # Main FastAPI entry point (v2)
+├── app_v1.py                       # Legacy API (deprecated, v1)
+├── requirements.txt                # Python dependencies
+├── Dockerfile                      # Container image definition
+├── docker-compose.yml              # Multi-container orchestration
+│
+├── api/                            # Core business logic
+│   ├── __init__.py
+│   ├── config/
+│   │   └── constants.py            # Configuration, URLs, thresholds
+│   │
+│   ├── models/
+│   │   ├── risk_models.py          # Disease & biomass calculations
+│   │   └── disease_metadata.py     # Model metadata registry
+│   │
+│   ├── services/
+│   │   ├── ibm_service.py          # IBM EIS weather integration
+│   │   ├── wisconet_service.py     # WiscoNet station pipeline
+│   │   └── risk_processor.py       # Risk annotation orchestration
+│   │
+│   ├── routes/
+│   │   ├── wisconet.py             # /v2/ag_models_wrappers/wisconet_g
+│   │   └── models.py               # /v2/ag_models_wrappers/models
+│   │
+│   ├── adapters/
+│   │   └── geojson_adapter.py      # DataFrame → GeoJSON converter
+│   │
+│   ├── schemas/
+│   │   ├── geojson_schema.py       # Response schema definitions
+│   │   └── model_schema.py         # Model metadata schemas
+│   │
+│   ├── utils/
+│   │   ├── math_helpers.py         # GDD, logistic, rolling averages
+│   │   ├── conversions.py          # Unit conversions (F↔C, mph↔m/s)
+│   │   └── caching.py              # Station & measurement caching
+│   │
+│   └── pipeline.py                 # Orchestrates WiscoNet workflow
+│
+├── api_cache/                      # Cached API responses (JSON)
+│   ├── metadata_stations_*.json
+│   └── station_data_*.json
+│
+└── materials/
+    └── example_callapi.ipynb       # Usage examples
+
+
+
+
+

Module Responsibilities#

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

Module

Purpose

Key Functions

ibm_service.py

IBM weather API integration

get_weather_with_risk(), _fetch_raw_hourly(), _build_daily(), _annotate_winter_rye_biomass()

wisconet_service.py

WiscoNet station data pipeline

_compute_winter_rye_biomass(), station loading & filtering

risk_models.py

Disease & biomass calculations

calculate_tarspot_risk(), calculate_winter_rye_biomass(), etc.

pipeline.py

Async WiscoNet orchestration

retrieve(), multi-station batch processing

math_helpers.py

Shared mathematical utilities

gdd_sine(), logistic(), rolling_mean()

geojson_adapter.py

Response formatting

dataframe_to_featurecollection()

+
+
+
+
+
+

Technology Stack#

+
+

Core Dependencies#

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

Component

Library

Version

Purpose

Web Framework

FastAPI

^0.100

REST API framework

ASGI Server

Uvicorn

^0.24

ASGI server

Data Processing

Pandas

^2.0

Tabular data manipulation

Numeric Computing

NumPy

^1.24

Numerical calculations

Data Validation

Pydantic

^2.0

Request/response schema validation

HTTP Client

requests

^2.31

Synchronous HTTP calls

Async HTTP

aiohttp

^3.9

Async HTTP requests

Logging

Python logging

stdlib

Structured logging

+
+
+
+

External Services#

+
    +
  • IBM Environmental Intelligence Suite (EIS): Premium weather API with historical-on-demand (HOD) data

  • +
  • WiscoNet: Public Wisconsin mesonet weather station network

  • +
  • NOAA: National weather service data for historical context

  • +
+
+
+

Deployment#

+
    +
  • Container: Docker with Alpine Linux base

  • +
  • Orchestration: Docker Compose for multi-service deployments

  • +
  • Reverse Proxy: Traefik for URL routing and TLS termination

  • +
  • Health Monitoring: Periodic curl-based health checks

  • +
+
+
+
+
+

API Endpoints#

+
+

V2 Endpoints (Current)#

+
+

Disease Risk & Biomass by Coordinates (IBM)#

+
GET /v2/ag_models_wrappers/ibm
+
+
+

Query parameters:

+
    +
  • forecasting_date (required): Reference date (YYYY-MM-DD)

  • +
  • latitude (required): Decimal degrees

  • +
  • longitude (required): Decimal degrees

  • +
  • planting_date (optional): For biomass calculation (YYYY-MM-DD)

  • +
  • termination_date (optional): For WiscoNet biomass integration (YYYY-MM-DD)

  • +
  • API_KEY (required): IBM EIS credential

  • +
  • TENANT_ID (required): IBM EIS credential

  • +
  • ORG_ID (required): IBM EIS credential

  • +
+

Example:

+
curl "http://localhost:8000/v2/ag_models_wrappers/ibm?forecasting_date=2025-05-15&latitude=43.0&longitude=-89.0&planting_date=2024-09-15&API_KEY=xxx&TENANT_ID=yyy&ORG_ID=zzz"
+
+
+

Response: GeoJSON FeatureCollection with hourly and daily weather data plus risk scores.

+
+
+
+

Disease Risk & Biomass by WiscoNet Stations#

+
GET /v2/ag_models_wrappers/wisconet_g
+
+
+

Query parameters:

+
    +
  • forecasting_date (required): Reference date (YYYY-MM-DD)

  • +
  • risk_days (optional): Days to compute rolling risk (default: 1)

  • +
  • station_id (optional): Filter to single station (e.g., “ALTN”)

  • +
  • planting_date (optional): For winter rye biomass (YYYY-MM-DD)

  • +
  • termination_date (optional): For crop termination biomass (YYYY-MM-DD)

  • +
  • disease (optional): Filter to specific disease model

  • +
+

Example:

+
curl "http://localhost:8000/v2/ag_models_wrappers/wisconet_g?forecasting_date=2025-05-15&station_id=ALTN&planting_date=2024-09-15"
+
+
+

Response: GeoJSON FeatureCollection grouped by station with time-series risk data.

+
+
+
+

Model Metadata#

+
GET /v2/ag_models_wrappers/models
+
+
+

Returns list of all available disease models with descriptions, crops, risk categories, and input requirements.

+
+
+
+
+

Legacy V1 Endpoints#

+

The API maintains backward compatibility with v1 endpoints (mounted at /v1), including:

+
    +
  • /v1/sites - Station listing

  • +
  • /v1/predictions - Disease predictions

  • +
  • /v1/models - Model metadata

  • +
+
+
+
+
+

Core Features#

+
+

1. Multi-Source Weather Integration#

+

The API combines weather data from multiple sources with intelligent fallback:

+
┌──────────────────────────────────────────────────┐
+│ Weather Data Request (lat/lng, date range)       │
+└────────────────┬─────────────────────────────────┘
+                 │
+     ┌───────────┴──────────────┐
+     │                          │
+     ▼                          ▼
+┌─────────────────┐      ┌──────────────────┐
+│ IBM EIS API     │      │ WiscoNet Network │
+│ (Premium,       │      │ (Public,         │
+│ high res)       │      │ station-based)   │
+└────────┬────────┘      └────────┬─────────┘
+         │                        │
+         └────────────┬───────────┘
+                      │
+                      ▼
+            ┌──────────────────────┐
+            │ Data Harmonization   │
+            │ • Timezone aware     │
+            │ • Unit conversion    │
+            │ • Interpolation      │
+            └──────────┬───────────┘
+                       │
+                       ▼
+            ┌──────────────────────┐
+            │ Growing Degree Days  │
+            │ • Sine method        │
+            │ • Base: 0°C, Cap: 35°C│
+            └──────────┬───────────┘
+                       │
+                       ▼
+            ┌──────────────────────┐
+            │ Rolling Averages     │
+            │ • 7, 14, 21, 30-day  │
+            └──────────┬───────────┘
+                       │
+                       ▼
+            ┌──────────────────────┐
+            │ Risk Model Input     │
+            │ (Ready for scoring)  │
+            └──────────────────────┘
+
+
+
+
+

2. Efficient Data Caching#

+

Reduces redundant API calls through tiered caching:

+
# Cache layers (in api/utils/caching.py)
+- Station metadata: 7-day TTL
+- Measurements: 6-hour TTL
+- IBM responses: Variable TTL based on forecast date
+- File system: JSON cache in api_cache/ directory
+
+
+
+
+

3. Async Pipeline Processing#

+

Multi-station workflows use async processing for performance:

+
# pipeline.py
+async def _run_pipeline(...):
+    # 1. Load all active stations (filtered)
+    stations = load_stations_sync(...)
+    
+    # 2. Fetch all measurements concurrently
+    measurements = await fetch_all_measurements_async(stations)
+    
+    # 3. Merge metadata (station location, timezone, etc.)
+    merged = merge_station_metadata(measurements, stations)
+    
+    # 4. Compute winter rye biomass (if planting_date provided)
+    if planting_date:
+        biomass = _compute_winter_rye_biomass(merged, planting_date)
+        merged = merge_biomass(merged, biomass)
+    
+    # 5. Optionally fetch WiscoNet-specific biomass data
+    if both planting_date and termination_date:
+        wisconet_biomass = await fetch_wisconet_biomass(...)
+        merged = merge_wisconet_biomass(merged, wisconet_biomass)
+    
+    # 6. Compute disease risks in parallel
+    risk_df = compute_risks_in_parallel(
+        merged, num_workers=4
+    )
+    
+    return risk_df
+
+
+
+
+

4. Intelligent Date & Timezone Handling#

+
    +
  • Automatic timezone conversion to station local time

  • +
  • Date arithmetic aware of DST transitions

  • +
  • Support for both absolute dates and relative forecasts

  • +
+
+
+
+
+

Disease Models#

+
+

Tarspot Risk (Corn)#

+

Crop: Corn
+Disease: Phyllachora maydis (Tar Spot fungus)

+

Model Type: Ensemble logistic regression (two sub-models averaged)

+

Inputs:

+
    +
  • 30-day mean air temperature (°C)

  • +
  • 30-day max relative humidity (%)

  • +
  • 14-day mean nighttime hours with RH ≥ 90%

  • +
+

Output: Risk probability (0–1), classified as:

+
    +
  • Inactive (mean temp < 10°C)

  • +
  • 1.Low (prob < 0.20)

  • +
  • 2.Moderate (prob 0.20–0.35)

  • +
  • 3.High (prob > 0.35)

  • +
+

Reference: Damon et al.

+
+
+
+

Gray Leaf Spot Risk (Corn)#

+

Crop: Corn
+Disease: Cercospora zeae-maydis (Gray Leaf Spot)

+

Model Type: Single logistic regression

+

Inputs:

+
    +
  • 21-day min air temperature (°C)

  • +
  • 30-day min dew point (°C)

  • +
+

Assumptions: Growth stage V10–R3, no irrigation

+

Output: Risk probability (0–1), same classification as Tarspot

+
+
+
+

Frogeye Leaf Spot Risk (Soybean)#

+

Crop: Soybean
+Disease: Cercospora sojina (Frogeye Leaf Spot)

+

Model Type: Logistic regression

+

Inputs:

+
    +
  • Degree-days above 14°C (cumulative from emergence)

  • +
  • Rainfall in previous 14 days (mm)

  • +
  • Hours with RH ≥ 85% (14-day rolling)

  • +
+

Output: Risk probability (0–1)

+
+
+
+

White Mold Risk (Soybean)#

+

Crop: Soybean
+Disease: Sclerotinia sclerotiorum (White Mold / Sclerotinia)

+

Model Type: Dual variant (irrigated & non-irrigated)

+

Inputs:

+
    +
  • Days since planting

  • +
  • Cumulative precipitation (mm)

  • +
  • Soil moisture availability

  • +
+

Variants:

+
    +
  • Dry: Non-irrigated fields

  • +
  • Irrigated 15”: 15-inch row spacing

  • +
  • Irrigated 30”: 30-inch row spacing

  • +
+

Output: Apothecial presence probability (0–1)

+
+
+
+

Winter Rye Biomass (NEW)#

+

Crop: Winter Rye
+Metric: Aboveground dry biomass (lb/acre)

+

Model Type: Logistic growth model

+

Formula:

+
+\[\text{logit} = b_0 + b_{pd} \cdot \text{plant\_doy} + b_{pf} \cdot \text{precip\_fall}\]
+
+\[\text{pred} = \frac{\text{logit}}{1 + e^{-k(\text{gdd\_total}-x_0)}}\]
+
+\[\text{biomass} = \max(0, \text{pred}^2)\]
+

Coefficients:

+
    +
  • \(b_0 = 423.1\) (intercept)

  • +
  • \(b_{pd} = -1.031\) (day-of-year effect)

  • +
  • \(b_{pf} = -0.2878\) (fall precipitation effect)

  • +
  • \(k = 0.003663\) (logistic rate)

  • +
  • \(x_0 = 1049.0\) (inflection point GDD)

  • +
+

Inputs:

+
    +
  • Planting day-of-year (1–366)

  • +
  • Precipitation during fall establishment (mm)

  • +
  • Cumulative GDD from planting to current date (0°C base)

  • +
+

Output:

+
    +
  • Biomass (lb/acre): Numeric prediction

  • +
  • Biomass Color:

    +
      +
    • Gray: 0–2000 lb/acre (low coverage)

    • +
    • Yellow: 2000–4500 lb/acre (moderate)

    • +
    • Green: >4500 lb/acre (high/dense)

    • +
    +
  • +
  • Biomass Message: Human-readable interpretation

  • +
+

Use Cases:

+
    +
  • Cover crop management planning

  • +
  • Soil health assessment

  • +
  • Erosion mitigation evaluation

  • +
  • Residue management decisions

  • +
+
+
+
+
+

Biomass Models#

+
+

Winter Rye Biomass Calculation Pipeline#

+
def _annotate_winter_rye_biomass(
+    rye_daily: pd.DataFrame,
+    planting_date: str
+) -> pd.DataFrame:
+    """
+    Compute winter rye biomass from daily weather data.
+    
+    Steps:
+    1. Parse planting_date → day-of-year
+    2. Filter to dates >= planting_date
+    3. Compute daily GDD (sine method, 0°C base, 35°C cap)
+    4. Accumulate GDD and precipitation
+    5. Call calculate_winter_rye_biomass() for each row
+    6. Merge results back into DataFrame
+    """
+    
+    # Step 1: Parse planting date
+    plant_date_obj = datetime.fromisoformat(planting_date).date()
+    plant_doy = plant_date_obj.timetuple().tm_yday
+    
+    # Step 2: Filter to >= planting date
+    rye_daily = rye_daily[rye_daily['date'] >= planting_date].copy()
+    
+    # Step 3-4: GDD accumulation
+    rye_daily['plant_doy'] = plant_doy
+    rye_daily['precip_daily'] = rye_daily['precip1Hour_sum'].fillna(0)
+    rye_daily['gdd_0c'] = rye_daily.apply(
+        lambda row: gdd_sine(row['temperature_min'], row['temperature_max']),
+        axis=1
+    )
+    rye_daily['gdd_total'] = rye_daily['gdd_0c'].cumsum()
+    
+    # Compute fall precipitation (Sep 1 to planting)
+    fall_start = plant_date_obj.replace(month=9, day=1)
+    fall_precip = rye_daily[
+        (rye_daily['date'] >= str(fall_start)) & 
+        (rye_daily['date'] < planting_date)
+    ]['precip_daily'].sum()
+    
+    # Step 5: Model calculation
+    biomass_results = rye_daily.apply(
+        lambda row: calculate_winter_rye_biomass(
+            plant_doy=row['plant_doy'],
+            precip_fall=fall_precip,
+            gdd_total=row['gdd_total']
+        ),
+        axis=1,
+        result_type='expand'
+    )
+    
+    # Step 6: Merge results
+    for col in ['biomass_lb_acre', 'biomass_color', 'biomass_message']:
+        rye_daily[col] = biomass_results[col]
+    
+    return rye_daily
+
+
+
+
+
+
+

Weather Data Sources#

+
+

IBM Environmental Intelligence Suite (EIS)#

+

Characteristics:

+
    +
  • Premium, high-resolution service

  • +
  • Hourly data with 999-hour request window per call

  • +
  • Requires JWT authentication

  • +
  • Covers entire globe

  • +
  • 15-minute resolution available

  • +
+

Data Acquisition:

+
    +
  1. Obtain JWT token via SaaSCore authentication

  2. +
  3. Request hourly-on-demand (HOD) data in time chunks

  4. +
  5. Convert to timezone-aware UTC timestamps

  6. +
  7. Interpolate/aggregate to daily summaries

  8. +
+

Cached Columns:

+
    +
  • temperature_min, temperature_max, temperature_mean

  • +
  • temperatureDewPoint_min, temperatureDewPoint_max

  • +
  • relativeHumidity_min, relativeHumidity_max

  • +
  • windSpeed_max, windSpeed_mean

  • +
  • precip1Hour_sum (hourly accumulated)

  • +
  • Rolling averages: 7, 14, 21, 30-day

  • +
+
+
+
+

WiscoNet (Public Mesonet)#

+

Characteristics:

+
    +
  • Wisconsin statewide mesonet network

  • +
  • ~100 active weather stations

  • +
  • Public API, no authentication required

  • +
  • Daily data update cycle

  • +
  • Station metadata includes: ID, name, lat/lng, county, region

  • +
+

Measurement Types:

+
    +
  • Air temperature (min, avg, max)

  • +
  • Dew point (min, avg, max)

  • +
  • Relative humidity (%)

  • +
  • Wind speed (max, direction)

  • +
  • Precipitation (daily total)

  • +
  • Soil temperature (select stations)

  • +
  • Leaf wetness (select stations)

  • +
+

Data Retrieval:

+
    +
  • Station list via /wisconet_active_stations

  • +
  • Daily measurements via bulk query endpoint

  • +
  • Cached in station_measurements_cache/ (6-hour TTL)

  • +
+
+
+
+
+

Response Format#

+
+

GeoJSON Feature Collection#

+

All responses follow the GeoJSON standard with extended properties:

+
{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "type": "Feature",
+      "geometry": {
+        "type": "Point",
+        "coordinates": [-89.4, 43.1]
+      },
+      "properties": {
+        "date": "2025-05-15",
+        "forecasting_date": "2025-05-15",
+        "station_id": "ALTN",
+        "station_name": "Alten",
+        "city": "Alten",
+        "county": "Columbia",
+        "region": "South Central",
+        "state": "WI",
+        "latitude": 43.1234,
+        "longitude": -89.4567,
+        "station_timezone": "America/Chicago",
+        
+        "temperature_min_c": 8.3,
+        "temperature_max_c": 21.5,
+        "temperature_mean_c": 15.2,
+        "relativeHumidity_max": 92,
+        "precip1Hour_sum": 2.5,
+        
+        "tarspot_risk": 0.45,
+        "tarspot_risk_class": "2.Moderate",
+        "gls_risk": 0.28,
+        "gls_risk_class": "1.Low",
+        "frogeye_risk": 0.12,
+        "frogeye_risk_class": "1.Low",
+        "whitemold_dry_risk": 0.35,
+        "whitemold_dry_risk_class": "2.Moderate",
+        
+        "biomass_lb_acre": 3250,
+        "biomass_color": "Yellow",
+        "biomass_message": "Moderate coverage"
+      }
+    }
+  ]
+}
+
+
+
+
+

Time-Series Grouping (WiscoNet)#

+

For multi-day forecasts, results are grouped by station with embedded time-series:

+
{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "type": "Feature",
+      "geometry": { "type": "Point", "coordinates": [-89.4, 43.1] },
+      "properties": {
+        "station_id": "ALTN",
+        "station_name": "Alten",
+        "city": "Alten",
+        "county": "Columbia",
+        "region": "South Central",
+        "state": "WI",
+        "time_series": [
+          {
+            "date": "2025-05-15",
+            "temperature_min_c": 8.3,
+            "tarspot_risk": 0.45,
+            ...
+          },
+          {
+            "date": "2025-05-16",
+            "temperature_min_c": 7.8,
+            "tarspot_risk": 0.38,
+            ...
+          }
+        ]
+      }
+    }
+  ]
+}
+
+
+
+
+
+
+

Data Flow#

+
+

Complete Request → Response Journey#

+
User Request
+    │
+    ▼
+┌──────────────────────────────┐
+│ Route Handler (app.py)       │
+│ Validate query parameters    │
+│ Extract coordinates/dates    │
+└────────────────┬─────────────┘
+                 │
+    ┌────────────┴────────────┐
+    │                         │
+    ▼                         ▼
+┌─────────────────┐    ┌───────────────┐
+│ IBM Service     │    │ WiscoNet      │
+│                 │    │ Pipeline      │
+│ 1. Authenticate │    │               │
+│    with IBM     │    │ 1. Load       │
+│ 2. Chunk time   │    │    stations   │
+│    range        │    │ 2. Fetch      │
+│ 3. Fetch hourly │    │    measurements
+│    data         │    │ 3. Merge      │
+│ 4. Build daily  │    │    metadata   │
+│    summaries    │    │ 4. Cache      │
+│                 │    │    results    │
+└────────┬────────┘    └────────┬──────┘
+         │                      │
+         └──────────┬───────────┘
+                    │
+                    ▼
+         ┌──────────────────────┐
+         │ Math Helpers         │
+         │ • Convert units      │
+         │ • GDD calculation    │
+         │ • Rolling averages   │
+         │ • Biomass prep       │
+         └──────────┬───────────┘
+                    │
+                    ▼
+         ┌──────────────────────┐
+         │ Risk Model Scoring   │
+         │ Apply all diseases   │
+         │ Compute probabilities│
+         │ Classify risk class  │
+         └──────────┬───────────┘
+                    │
+                    ▼
+         ┌──────────────────────┐
+         │ Biomass Calculation  │
+         │ (if planting_date)   │
+         │ Logistic model       │
+         │ Color classification │
+         └──────────┬───────────┘
+                    │
+                    ▼
+         ┌──────────────────────┐
+         │ GeoJSON Adapter      │
+         │ • Format geometry    │
+         │ • Embed properties   │
+         │ • Group by station   │
+         └──────────┬───────────┘
+                    │
+                    ▼
+        Response (GeoJSON)
+
+
+
+
+
+
+

Development Setup#

+
+

Prerequisites#

+
    +
  • Python 3.10+

  • +
  • pip or conda

  • +
  • Git

  • +
  • Docker (optional, for containerized development)

  • +
+
+
+

Local Installation#

+
# Clone repository
+git clone https://github.com/UW-Madison-DSI/ag_forecasting_api.git
+cd ag_forecasting_api
+
+# Create virtual environment
+python -m venv .venv
+source .venv/bin/activate  # On Windows: .venv\Scripts\activate
+
+# Install dependencies
+pip install -r requirements.txt
+
+# Set environment variables
+export IBM_API_KEY="your_key"
+export TENANT_ID="your_tenant"
+export ORG_ID="your_org"
+
+# Run development server
+uvicorn app:app --reload --host 0.0.0.0 --port 8000
+
+
+
+
+

API Documentation#

+

Once running, view interactive documentation:

+ +
+
+

Testing#

+
# Syntax validation
+python -m py_compile api/models/risk_models.py api/services/*.py
+
+# Run linting (if installed)
+pylint api/
+
+# Test endpoint with curl
+curl "http://localhost:8000/v2/test/rye_biomass"
+
+
+
+
+
+
+

Deployment#

+
+

Docker Deployment#

+
FROM python:3.11-slim
+WORKDIR /app
+COPY requirements.txt .
+RUN pip install --no-cache-dir -r requirements.txt
+COPY . .
+EXPOSE 8000
+CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
+
+
+
+
+

Docker Compose (Production)#

+
version: "3.9"
+services:
+  ag_forecasting_api:
+    build: .
+    expose:
+      - 8000
+    environment:
+      - PYTHONPATH=/app
+      - ENVIRONMENT=production
+      - IBM_API_KEY=${IBM_API_KEY}
+      - TENANT_ID=${TENANT_ID}
+      - ORG_ID=${ORG_ID}
+    networks:
+      - traefik
+    labels:
+      - "traefik.enable=true"
+      - "traefik.http.routers.ag_api.rule=Host(`your-domain.com`)"
+      - "traefik.http.services.ag_api.loadbalancer.server.port=8000"
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:8000/"]
+      interval: 30s
+      timeout: 10s
+      retries: 3
+
+
+
+
+

Environment Variables#

+

Required for production:

+
    +
  • IBM_API_KEY: IBM EIS authentication credential

  • +
  • TENANT_ID: IBM EIS tenant identifier

  • +
  • ORG_ID: IBM EIS organization identifier

  • +
  • ENVIRONMENT: Set to “production” for optimized logging

  • +
+

Optional:

+
    +
  • PYTHONPATH: Should include /app for imports

  • +
  • LOG_LEVEL: Logging verbosity (default: INFO)

  • +
+
+
+
+
+

Performance Considerations#

+
+

Caching Strategy#

+
    +
  • Station Metadata: 7-day TTL (rarely changes)

  • +
  • Measurements: 6-hour TTL (updated daily by WiscoNet)

  • +
  • IBM Responses: Variable (tied to forecast date relevance)

  • +
  • File System: JSON cache in api_cache/ for persistence

  • +
+
+
+

Concurrency#

+
    +
  • Async Pipeline: Multi-station queries use async/await for I/O efficiency

  • +
  • Parallel Risk Scoring: Disease calculations use multiprocessing (4 workers default)

  • +
  • Connection Pooling: HTTP clients maintain connection pools (max 50 concurrent)

  • +
+
+
+

Optimization Tips#

+
    +
  1. Batch Requests: Query multiple stations in one call rather than sequential individual queries

  2. +
  3. Use WiscoNet: Public API has lower latency than premium IBM service

  4. +
  5. Limit Date Range: Smaller date ranges reduce computation time

  6. +
  7. Filter Diseases: Specify disease models needed to reduce calculation overhead

  8. +
  9. Cache Warming: Pre-fetch station lists during off-peak hours

  10. +
+
+
+
+
+

Additional Resources#

+ +
+
+
+

License#

+

See LICENSE file for details.

+
+
+
+

Changelog#

+
+

Version 2.0 (Current)#

+
    +
  • ✅ Winter rye biomass model integration

  • +
  • ✅ Unified API versioning (v1 legacy, v2 current)

  • +
  • ✅ Enhanced GeoJSON responses

  • +
  • ✅ Improved async pipeline performance

  • +
  • ✅ Extended documentation

  • +
+
+
+

Version 1.0 (Legacy)#

+
    +
  • Disease risk models for corn and soybean

  • +
  • WiscoNet and IBM EIS integration

  • +
  • Basic GeoJSON support

  • +
+
+

Last Updated: May 2025
+Maintained By: UW-Madison Data Science Institute

+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/applications/ag-forecasting-api.html b/_build/html/applications/ag-forecasting-api.html new file mode 100644 index 0000000..9611812 --- /dev/null +++ b/_build/html/applications/ag-forecasting-api.html @@ -0,0 +1,656 @@ + + + + + + + + + + + 🌾 Agricultural Forecasting API — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ +
+

🌾 Agricultural Forecasting API#

+

FastAPI-based service for crop disease risk forecasting and winter rye biomass estimation using multi-source weather data.
+Developed by the University of Wisconsin–Madison Data Science Institute.

+
+
+

Overview#

+

The API provides geospatial agricultural intelligence for Wisconsin, combining weather data with validated agronomic models.

+
+

Key Features#

+
    +
  • 🌽 Crop disease risk forecasting (corn & soybean)

  • +
  • 🌱 Winter rye biomass estimation

  • +
  • 🌦 Multi-source weather integration (IBM EIS, WiscoNet, NOAA)

  • +
  • 📍 Coordinate and station-based queries

  • +
  • 🗺 GeoJSON outputs for GIS applications

  • +
  • ⚡ Async batch processing for multi-station analysis

  • +
+
+
+
+
+

System Architecture#

+

The system is structured into four main layers:

+
    +
  • API Layer (FastAPI)
    +Handles incoming requests and routing (/ibm, /wisconet_g, /models)

  • +
  • Data Layer

    +
      +
    • IBM EIS: high-resolution global weather API

    • +
    • WiscoNet: Wisconsin mesonet station network

    • +
    +
  • +
  • Processing Layer
    +Weather normalization, unit conversion, GDD calculation, rolling features

  • +
  • Model Layer
    +Disease risk models and winter rye biomass model

  • +
+
+
+
+

Core Modules#

+
    +
  • Weather ingestion (IBM + WiscoNet)

  • +
  • Disease risk modeling

  • +
  • Winter rye biomass estimation

  • +
  • Async pipeline orchestration

  • +
  • GeoJSON response formatting

  • +
+
+
+
+

API Endpoints#

+
+

IBM Forecasting (Coordinates)#

+

GET /v2/ag_models_wrappers/ibm

+

Returns disease risk + biomass using IBM weather data.

+
+
+
+

WiscoNet Forecasting (Stations)#

+

GET /v2/ag_models_wrappers/wisconet_g

+

Returns station-based time-series disease risk and biomass.

+
+
+
+

Model Metadata#

+

GET /v2/ag_models_wrappers/models

+

Returns available disease and biomass models.

+
+
+
+
+

Disease Models#

+
    +
  • Tarspot (corn) – humidity and temperature-based risk

  • +
  • Gray Leaf Spot (corn) – temperature + dew point model

  • +
  • Frogeye Leaf Spot (soybean) – GDD + rainfall model

  • +
  • White Mold (soybean) – precipitation and soil moisture model

  • +
+
+
+
+

Winter Rye Biomass Model#

+

Predicts dry biomass (lb/acre) using:

+
    +
  • Growing Degree Days (0°C base)

  • +
  • Planting date (day-of-year)

  • +
  • Fall precipitation

  • +
  • Logistic growth curve

  • +
+
+

Outputs#

+
    +
  • Biomass (lb/acre)

  • +
  • Color class (gray / yellow / green)

  • +
  • Interpretation message

  • +
+
+
+
+
+

Data Sources#

+
+

IBM Environmental Intelligence Suite (EIS)#

+
    +
  • High-resolution global weather data

  • +
  • Hourly forecasts and historical data

  • +
  • Requires authentication

  • +
+
+
+

WiscoNet#

+
    +
  • Wisconsin mesonet (~100 stations)

  • +
  • Daily weather observations

  • +
  • Public API access

  • +
+
+
+
+
+

Response Format#

+

All outputs are returned as GeoJSON FeatureCollections, including:

+
    +
  • Weather variables

  • +
  • Disease risk scores

  • +
  • Biomass predictions

  • +
  • Station metadata

  • +
+
+
+
+

Performance Features#

+
    +
  • Async multi-station processing

  • +
  • Cached weather and station data (6h–7d TTL)

  • +
  • Parallel risk computation

  • +
  • Optimized data aggregation pipeline

  • +
+
+
+
+

Setup#

+
git clone <repo>
+cd ag_forecasting_api
+
+python -m venv .venv
+source .venv/bin/activate
+
+pip install -r requirements.txt
+
+uvicorn app:app --reload
+
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/applications/index.html b/_build/html/applications/index.html new file mode 100644 index 0000000..4511aba --- /dev/null +++ b/_build/html/applications/index.html @@ -0,0 +1,479 @@ + + + + + + + + + + + Applications — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Applications

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

Applications#

+

We are building OL to support a wide range of applications with minimal changes required from those applications. Our approach is to port more real-world workloads and let their needs drive incremental improvements to the platform.

+
+

Want to deploy FastAPI apps on OpenLambda? Just ASGI us how.#

+

In this post, we look at an agricultural forecasting application and an ASGI-based web service. The ag app is a natural fit for serverless because it is fundamentally stateless: results can be regenerated on demand from underlying data rather than relying on persistent runtime state. This also influenced the choice of FastAPI for a modern, async-friendly interface. +To situate ASGI, it builds on the long history of WSGI-based Python web serving, where earlier work (including Jaime’s contributions) helped shape synchronous server patterns. ASGI extends this model with native async support, enabling higher concurrency and better I/O utilization, but requiring deeper runtime integration. +A broader design question is whether it is beneficial to consolidate multiple functions into a single Lambda-like unit. We believe it is: co-locating functions enables opportunistic state reuse, faster warm starts, and reduced overhead. +On the implementation side, OL removes its dependency on Tornado and adds optional support for both WSGI and ASGI applications. The ag forecasting app also surfaced practical issues, including /dev/shm constraints when using process pools, which required targeted adjustments. +Looking ahead, improved visibility into execution—such as detecting when applications are blocked on I/O—opens the door to new billing models that distinguish compute from idle waiting time, addressing a longstanding serverless concern. +More broadly, expanding the set of supported applications continues to drive OL’s evolution, alongside features like environment variables and GitHub-based deployments that further reduce friction for onboarding new workloads.

+ +
+
+
+
+ + + + +
+ + + + + + + + +
+ + + + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/genindex.html b/_build/html/genindex.html index 5bd82c0..92eefb8 100644 --- a/_build/html/genindex.html +++ b/_build/html/genindex.html @@ -147,6 +147,14 @@ + + + + + + + +

OpenLambda

@@ -166,6 +174,10 @@ @@ -349,7 +361,7 @@

Index

diff --git a/_build/html/index.html b/_build/html/index.html index 40cbcf6..59834ad 100644 --- a/_build/html/index.html +++ b/_build/html/index.html @@ -7,7 +7,7 @@ - + OpenLambda — OpenLambda @@ -151,6 +151,14 @@ + + + + + + + +

OpenLambda

@@ -170,6 +178,10 @@ @@ -391,7 +403,7 @@

Related Publications

License#

-

This project is licensed under the Apache License — see the +

This project is licensed under the Apache License - see the LICENSE.md file for details.

@@ -469,7 +481,7 @@

License#< diff --git a/_build/html/objects.inv b/_build/html/objects.inv index 65baa8e844588055a31b92e566a1bff2e7842855..15613001a5d03da7f6834643da3fa13229f7024f 100644 GIT binary patch delta 249 zcmV{~ej#)LUjclVlc9V@rBMk7@$8(~X8k(88toX_kVHjcmW4Ay#i delta 185 zcmV;q07n1x0<;2 + +

OpenLambda

@@ -168,6 +176,10 @@
@@ -361,7 +373,7 @@

Search

diff --git a/_build/html/searchindex.js b/_build/html/searchindex.js index 277964f..a654b61 100644 --- a/_build/html/searchindex.js +++ b/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"1. Clone the repo and copy these files in": [[0, "clone-the-repo-and-copy-these-files-in"]], "Configuration": [[2, "configuration"]], "Deploying Multiple Workers": [[2, "deploying-multiple-workers"]], "File Structure": [[0, "file-structure"]], "Further Reading": [[2, "further-reading"]], "License": [[1, "license"]], "Local Preview": [[0, "local-preview"]], "One-Time Setup (do this once per repo)": [[0, "one-time-setup-do-this-once-per-repo"]], "OpenLambda": [[1, null]], "OpenLambda GitHub Pages \u2014 MyST Markdown Site": [[0, null]], "Overview": [[2, "overview"]], "Related Publications": [[1, "related-publications"]], "Starting the Worker": [[2, "starting-the-worker"]], "Worker": [[2, null]]}, "docnames": ["README", "index", "worker"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "index.md", "worker.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": 2, "0": [], "16": 1, "17": 1, "18": 1, "24": 1, "404": [], "8080": 2, "A": 2, "It": 2, "No": 2, "That": [], "The": [1, 2], "To": 2, "With": 1, "_build": 0, "_config": 0, "_toc": 0, "about": 1, "action": 0, "add": 0, "address": 2, "after": 2, "al": 1, "all": 0, "alreadi": 2, "also": 1, "an": 1, "apach": 1, "approach": [1, 2], "ar": [1, 2], "arriv": 2, "atc": 1, "author": 1, "auto": 0, "automat": 0, "back": 2, "backend": 2, "balanc": [1, 2], "base": 1, "behind": 2, "between": 2, "bin": 2, "binari": 2, "bit": 1, "book": 0, "boss": [1, 2], "branch": [], "browser": 0, "build": [0, 2], "bundl": 0, "call": 2, "caller": 2, "can": [1, 2], "cd": 0, "cdn": [], "central": [1, 2], "chapter": [], "check": 2, "cloud comput": 1, "cluster": [1, 2], "cold": 2, "com": 0, "commit": 0, "compon": 2, "comput": 1, "config": 2, "confirm": [], "contain": [1, 2], "content": 0, "coordin": 2, "core": 2, "could": 1, "creat": [], "ctrl": [], "curl": 2, "current": [1, 2], "default": 2, "dep": 0, "deploi": [0, 1], "deploy": 2, "describ": 2, "descript": 2, "detail": 1, "develop": 2, "directori": 2, "docker": 2, "document": 0, "e": [], "each": 2, "enabl": 1, "endpoint": 2, "error": [], "et": 1, "eventu": 1, "everi": [], "explor": 1, "expos": 2, "fail": [], "far": 1, "faster": 1, "field": 2, "file": [1, 2], "fit": 1, "fix": [], "forklift": 1, "format": [], "forward": 2, "found": [], "from": [0, 2], "front": [1, 2], "function": 2, "g": [], "gener": [], "get": [1, 2], "git": 0, "gitignor": 0, "go": [1, 2], "goal": 1, "guid": 2, "haproxi": 2, "hard": [], "hendrickson": 1, "here": [0, 1], "homepag": 0, "hope": 1, "horizont": 2, "hotcloud": 1, "html": 0, "http": [0, 1, 2], "i": [1, 2], "icdcsw": 1, "imag": 2, "implement": 1, "incom": 2, "independ": 2, "index": 0, "initi": 1, "insid": 2, "instal": 0, "invok": 1, "io": 0, "its": 2, "jb": [], "json": 2, "jupyt": 0, "just": 1, "keep": 2, "kei": 2, "lambda": [0, 1, 2], "larg": 1, "latenc": 2, "lean": 1, "left": [], "librari": 1, "lifecycl": 2, "linux": [1, 2], "linux contain": 1, "list": [], "listen": 2, "load": [1, 2], "local": [1, 2], "localhost": 2, "log": 2, "log_output": 2, "login": 1, "m": 0, "main": 1, "make": 1, "manag": [1, 2], "manual": [1, 2], "md": [0, 1], "min": [], "minut": 2, "mode": 1, "more": [0, 1], "mostli": 1, "multi": 2, "n": 2, "name": 2, "new": 1, "nginx": 2, "node": [1, 2], "now": [], "oak": 1, "old": [], "one": 2, "open": [0, 1], "openlambda": 2, "oper": 2, "optim": [1, 2], "option": 2, "packag": 1, "paper": 2, "pass": 2, "path": 2, "payload": 2, "per": 2, "period": 2, "permiss": [], "pip": 0, "pipsqueak": 1, "place": 2, "pool": 1, "port": 2, "post": 2, "present": 2, "primari": 1, "print": 2, "problem": [], "process": 2, "product": 1, "project": 1, "provis": [1, 2], "pull": 2, "push": 0, "put": 1, "python": 0, "quickstart": 2, "r": 0, "rapid": [1, 2], "read": 1, "rebuild": [], "recommend": 2, "redeploi": [], "reduc": 2, "refresh": [], "registri": 2, "repo": 2, "request": [1, 2], "requir": [0, 2], "research": 2, "respect": 2, "respons": [1, 2], "result": 2, "return": 2, "root": [0, 2], "rout": 2, "run": [1, 2], "runlambda": 2, "sandbox": 2, "save": [], "scale": 2, "see": 1, "select": [], "server": 2, "serverless": [1, 2], "servic": 1, "set": 0, "setup": 2, "shift": [], "short": 2, "show": [], "side": 2, "sidebar": [], "similar": 2, "singl": [1, 2], "so": 1, "sock": [1, 2], "standalon": 2, "standard": 2, "start": 1, "startup": 2, "stateless": 2, "statu": 2, "stdout": 2, "still": [], "subsequ": 2, "suitabl": 1, "sure": [], "system": 1, "tabl": 0, "take": 1, "task": [1, 2], "technic": 0, "them": [1, 2], "thi": 1, "titl": 1, "tree": 1, "txt": 0, "under": [1, 2], "until": 2, "url": 2, "us": [0, 1], "venu": 1, "verifi": 2, "via": 2, "vm": 1, "w": 2, "wait": 2, "warm": 2, "we": 1, "well": 1, "when": 2, "where": [1, 2], "whether": 2, "wide": 2, "work": [1, 2], "worker": 1, "worker_port": 2, "workflow": 0, "wosc": 1, "write": 2, "written": 1, "yang": 1, "yml": 0, "you": [1, 2], "yourself": 1, "zygot": 1}, "titles": ["OpenLambda GitHub Pages \u2014 MyST Markdown Site", "OpenLambda", "Worker"], "titleterms": {"1": 0, "2": [], "One": 0, "action": [], "ad": [], "clone": 0, "configur": 2, "copi": 0, "deploi": 2, "do": 0, "enabl": [], "file": 0, "further": 2, "github": 0, "licens": 1, "local": 0, "markdown": 0, "more": [], "multipl": 2, "myst": 0, "onc": 0, "openlambda": [0, 1], "overview": 2, "page": 0, "per": 0, "preview": 0, "public": 1, "read": 2, "relat": 1, "repo": 0, "setup": 0, "site": 0, "sourc": [], "start": 2, "structur": 0, "thi": 0, "time": 0, "troubleshoot": [], "worker": 2}}) \ No newline at end of file +Search.setIndex({"alltitles": {"1. Clone the repo and copy these files in": [[0, "clone-the-repo-and-copy-these-files-in"]], "API Endpoints": [[1, "api-endpoints"]], "Applications": [[2, null]], "Configuration": [[4, "configuration"]], "Core Modules": [[1, "core-modules"]], "Data Sources": [[1, "data-sources"]], "Deploying Multiple Workers": [[4, "deploying-multiple-workers"]], "Disease Models": [[1, "disease-models"]], "File Structure": [[0, "file-structure"]], "Further Reading": [[4, "further-reading"]], "IBM Environmental Intelligence Suite (EIS)": [[1, "ibm-environmental-intelligence-suite-eis"]], "IBM Forecasting (Coordinates)": [[1, "ibm-forecasting-coordinates"]], "Key Features": [[1, "key-features"]], "License": [[3, "license"]], "Local Preview": [[0, "local-preview"]], "Model Metadata": [[1, "model-metadata"]], "One-Time Setup (do this once per repo)": [[0, "one-time-setup-do-this-once-per-repo"]], "OpenLambda": [[3, null]], "OpenLambda GitHub Pages \u2014 MyST Markdown Site": [[0, null]], "Outputs": [[1, "outputs"]], "Overview": [[1, "overview"], [4, "overview"]], "Performance Features": [[1, "performance-features"]], "Related Publications": [[3, "related-publications"]], "Response Format": [[1, "response-format"]], "Setup": [[1, "setup"]], "Starting the Worker": [[4, "starting-the-worker"]], "System Architecture": [[1, "system-architecture"]], "Want to deploy FastAPI apps on OpenLambda? Just ASGI us how.": [[2, "want-to-deploy-fastapi-apps-on-openlambda-just-asgi-us-how"]], "Winter Rye Biomass Model": [[1, "winter-rye-biomass-model"]], "WiscoNet": [[1, "wisconet"]], "WiscoNet Forecasting (Stations)": [[1, "wisconet-forecasting-stations"]], "Worker": [[4, null]], "\ud83c\udf3e Agricultural Forecasting API": [[1, null]]}, "docnames": ["README", "applications/ag-forecasting-api", "applications/index", "index", "worker"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "applications/ag-forecasting-api.md", "applications/index.md", "index.md", "worker.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [2, 4], "0": 1, "003663": [], "031": [], "05": [], "09": [], "10": [], "100": 1, "1049": [], "11": [], "12": [], "1234": [], "14": [], "15": [], "16": 3, "17": 3, "18": 3, "20": [], "2000": [], "2024": [], "2025": [], "21": [], "24": 3, "28": [], "2878": [], "30": [], "31": [], "3250": [], "35": [], "366": [], "38": [], "404": [], "423": [], "43": [], "45": [], "4500": [], "4567": [], "5": [], "50": [], "6": [], "6h": 1, "7": [], "7d": 1, "8": [], "8000": [], "8080": 4, "85": [], "89": [], "9": [], "90": [], "92": [], "999": [], "A": [2, 4], "By": [], "For": [], "In": 2, "It": 4, "No": 4, "On": 2, "That": [], "The": [1, 2, 3, 4], "To": [2, 4], "With": 3, "__init__": [], "_annotate_winter_rye_biomass": [], "_build": 0, "_build_daili": [], "_compute_winter_rye_biomass": [], "_config": 0, "_doi": [], "_fall": [], "_fetch_raw_hourli": [], "_run_pipelin": [], "_toc": 0, "_total": [], "about": 3, "abov": [], "aboveground": [], "absolut": [], "access": 1, "accumul": [], "acquisit": [], "acr": 1, "action": 0, "activ": 1, "ad": [], "adapt": [], "add": [0, 2], "address": [2, 4], "adjust": 2, "after": 4, "ag": 2, "ag_api": [], "ag_forecast": [], "ag_forecasting_api": 1, "ag_models_wrapp": 1, "aggreg": 1, "agricultur": 2, "agronom": 1, "ahead": 2, "aiohttp": [], "air": [], "al": 3, "all": [0, 1], "alongsid": 2, "alpin": [], "alreadi": 4, "also": [2, 3], "alten": [], "altn": [], "america": [], "an": [2, 3], "analysi": 1, "annot": [], "apach": 3, "api": 2, "api_cach": [], "api_kei": [], "apotheci": [], "app": 1, "app_v1": [], "appli": [], "applic": 1, "approach": [2, 3, 4], "ar": [1, 2, 3, 4], "arithmet": [], "arriv": 4, "asgi": [], "assess": [], "assumpt": [], "async": [1, 2], "atc": 3, "authent": 1, "author": 3, "auto": 0, "automat": 0, "avail": 1, "averag": [], "avg": [], "await": [], "awar": [], "axi": [], "b_": [], "b_0": [], "back": 4, "backend": 4, "backward": [], "balanc": [3, 4], "base": [1, 2, 3], "basic": [], "batch": 1, "becaus": 2, "behind": 4, "believ": 2, "benefici": 2, "better": 2, "between": 4, "bill": 2, "bin": [1, 4], "binari": 4, "biomass_color": [], "biomass_lb_acr": [], "biomass_messag": [], "biomass_result": [], "bit": 3, "block": 2, "book": 0, "boss": [3, 4], "both": 2, "branch": [], "broader": 2, "broadli": 2, "browser": 0, "build": [0, 2, 4], "built": [], "bulk": [], "bundl": 0, "busi": [], "c": 1, "cach": 1, "calc": [], "calcul": 1, "calculate_tarspot_risk": [], "calculate_winter_rye_biomass": [], "call": 4, "caller": 4, "can": [2, 3, 4], "cap": [], "capabl": [], "case": [], "categori": [], "cd": [0, 1], "cdn": [], "cdot": [], "central": [3, 4], "cercospora": [], "chang": 2, "chapter": [], "characterist": [], "check": 4, "chicago": [], "choic": 2, "chunk": [], "citi": [], "class": 1, "classif": [], "classifi": [], "client": [], "clone": 1, "cloud comput": 3, "cluster": [3, 4], "cmd": [], "co": 2, "coeffici": [], "col": [], "cold": 4, "color": 1, "columbia": [], "column": [], "com": 0, "combin": 1, "commit": 0, "compat": [], "compon": 4, "comput": [1, 2, 3], "compute_risks_in_parallel": [], "concern": 2, "concurr": 2, "conda": [], "config": 4, "configur": [], "confirm": [], "connect": [], "consolid": 2, "constant": [], "constraint": 2, "contact": [], "contain": [3, 4], "container": [], "content": 0, "context": [], "continu": 2, "contribut": 2, "convers": 1, "convert": [], "coordin": 4, "copi": [], "core": 4, "corn": 1, "could": 3, "counti": [], "cover": [], "coverag": [], "creat": [], "credenti": [], "crop": 1, "ctrl": [], "cumsum": [], "cumul": [], "curl": 4, "current": [3, 4], "curv": 1, "cycl": [], "dai": 1, "daili": 1, "damon": [], "dashboard": [], "data": 2, "datafram": [], "dataframe_to_featurecollect": [], "date": 1, "datetim": [], "dd": [], "decim": [], "decis": [], "deeper": 2, "def": [], "default": 4, "definit": [], "degre": 1, "demand": 2, "dens": [], "dep": 0, "depend": 2, "deploi": [0, 3], "deploy": [2, 4], "deprec": [], "describ": 4, "descript": 4, "design": 2, "detail": 3, "detect": 2, "dev": 2, "develop": [1, 4], "dew": 1, "dir": [], "direct": [], "directori": 4, "disease_metadata": [], "distinguish": 2, "doc": [], "docker": 4, "dockerfil": [], "document": 0, "doit": [], "domain": [], "door": 2, "drive": 2, "dry": 1, "dsi": [], "dst": [], "dual": [], "dure": [], "e": [], "each": 4, "earlier": 2, "ecosystem": [], "edu": [], "effect": [], "emb": [], "embed": [], "emerg": [], "enabl": [2, 3], "endpoint": 4, "enhanc": [], "ensembl": [], "entir": [], "entri": [], "environ": 2, "eros": [], "error": [], "establish": [], "estim": 1, "et": 3, "etc": [], "evalu": [], "eventu": 3, "everi": [], "evolut": 2, "exampl": [], "example_callapi": [], "execut": 2, "expand": 2, "explor": 3, "export": [], "expos": 4, "extend": 2, "extract": [], "f": [], "fail": [], "fall": 1, "fall_precip": [], "fall_start": [], "fallback": [], "far": 3, "farmer": [], "fastapi": 1, "faster": [2, 3], "featur": 2, "featurecollect": 1, "fetch": [], "fetch_all_measurements_async": [], "fetch_wisconet_biomass": [], "field": 4, "file": [3, 4], "fillna": [], "filter": [], "fit": [2, 3], "fix": [], "follow": [], "forecast": 2, "forecasting_d": [], "forklift": 3, "format": [], "formula": [], "forward": 4, "found": [], "four": 1, "frac": [], "framework": [], "friction": 2, "friendli": 2, "frogey": 1, "frogeye_risk": [], "frogeye_risk_class": [], "from": [0, 2, 4], "fromisoformat": [], "front": [3, 4], "function": [2, 4], "fundament": 2, "fungu": [], "further": 2, "g": [], "gdd": 1, "gdd_0c": [], "gdd_sine": [], "gdd_total": [], "gener": [], "geojson": 1, "geojson_adapt": [], "geojson_schema": [], "geometri": [], "geospati": 1, "get": [1, 3, 4], "get_weather_with_risk": [], "gi": 1, "git": [0, 1], "github": 2, "gitignor": 0, "global": 1, "globe": [], "gls_risk": [], "gls_risk_class": [], "go": [3, 4], "goal": 3, "grai": 1, "green": 1, "grow": 1, "growth": 1, "guid": 4, "ha": [], "handl": 1, "handler": [], "haproxi": 4, "hard": [], "harmon": [], "health": [], "healthcheck": [], "help": 2, "helper": [], "hendrickson": 3, "here": [0, 3], "high": 1, "higher": 2, "histor": 1, "histori": 2, "hod": [], "homepag": 0, "hope": 3, "horizont": 4, "host": [], "hotcloud": 3, "hour": [], "hourli": 1, "html": 0, "http": [0, 3, 4], "human": [], "humid": 1, "i": [1, 2, 3, 4], "ibm_api_kei": [], "ibm_servic": [], "icdcsw": 3, "id": [], "identifi": [], "idl": 2, "imag": 4, "implement": [2, 3], "import": [], "improv": 2, "inact": [], "inch": [], "includ": [1, 2], "incom": [1, 4], "increment": 2, "independ": 4, "index": 0, "individu": [], "inflect": [], "influenc": 2, "info": [], "inform": [], "ingest": 1, "initi": 3, "input": [], "insid": 4, "instal": [0, 1], "institut": 1, "integr": [1, 2], "interact": [], "intercept": [], "interfac": 2, "interpol": [], "interpret": 1, "interv": [], "invok": 3, "io": 0, "ipynb": [], "irrig": [], "issu": 2, "its": [2, 4], "jaim": 2, "jb": [], "json": 4, "jupyt": 0, "just": 3, "jwt": [], "k": [], "keep": 4, "kei": 4, "label": [], "lambda": [0, 2, 3, 4], "larg": 3, "last": [], "lat": [], "latenc": 4, "latitud": [], "layer": 1, "lb": 1, "leaf": 1, "lean": 3, "left": [], "let": 2, "librari": 3, "lifecycl": 4, "like": 2, "limit": [], "line": [], "lint": [], "linux": [3, 4], "linux contain": 3, "list": [], "listen": 4, "lng": [], "load": [3, 4], "load_stations_sync": [], "loadbalanc": [], "local": [3, 4], "localhost": 4, "locat": 2, "log": 4, "log_level": [], "log_output": 4, "logic": [], "login": 3, "logist": 1, "logit": [], "long": 2, "longitud": [], "longstand": 2, "look": 2, "low": [], "lower": [], "m": [0, 1], "madison": 1, "mai": [], "main": [1, 3], "maintain": [], "make": 3, "manag": [3, 4], "manipul": [], "manual": [3, 4], "map": [], "materi": [], "math": [], "math_help": [], "mathemat": [], "max": [], "maydi": [], "md": [0, 3], "mean": [], "measur": [], "merg": [], "merge_biomass": [], "merge_station_metadata": [], "merge_wisconet_biomass": [], "mesonet": 1, "messag": 1, "metadata_stations_": [], "method": [], "metric": [], "min": [], "minim": 2, "minut": 4, "mitig": [], "mm": [], "mode": 3, "model": 2, "model_schema": [], "moder": [], "modern": 2, "moistur": 1, "mold": 1, "monitor": [], "month": [], "more": [0, 2, 3], "mostli": 3, "mount": [], "mph": [], "multi": [1, 4], "multipl": 2, "multiprocess": [], "n": 4, "name": 4, "nation": [], "nativ": 2, "natur": 2, "need": 2, "network": 1, "new": [2, 3], "nginx": 4, "nighttim": [], "noaa": 1, "node": [3, 4], "non": [], "normal": 1, "notebook": [], "now": [], "num_work": [], "numer": [], "numpi": [], "o": 2, "oak": 3, "observ": 1, "obtain": [], "off": [], "ol": 2, "old": [], "onboard": 2, "onc": [], "one": 4, "open": [0, 2, 3], "openapi": [], "openlambda": 4, "oper": 4, "opportunist": 2, "optim": [1, 3, 4], "option": [2, 4], "orchestr": 1, "org_id": [], "organ": [], "our": 2, "output": [], "overhead": 2, "packag": 3, "panda": [], "paper": 4, "parallel": 1, "paramet": [], "pars": [], "pass": 4, "path": 4, "pattern": 2, "payload": 4, "pd": [], "peak": [], "per": 4, "period": 4, "permiss": [], "persist": 2, "pf": [], "phyllachora": [], "pip": [0, 1], "pipelin": 1, "pipsqueak": 3, "place": 4, "plan": [], "plant": 1, "plant_date_obj": [], "plant_doi": [], "planting_d": [], "platform": 2, "plu": [], "point": 1, "pool": [2, 3], "port": [2, 4], "post": [2, 4], "practic": 2, "pre": [], "precip": [], "precip1hour_sum": [], "precip_daili": [], "precip_fal": [], "precipit": 1, "pred": [], "predict": 1, "premium": [], "prep": [], "presenc": [], "present": 4, "previou": [], "primari": 3, "print": 4, "prob": [], "probabl": [], "problem": [], "process": [1, 2, 4], "product": 3, "profession": [], "project": 3, "properti": [], "provid": 1, "provis": [3, 4], "proxi": [], "public": 1, "pull": 4, "purpos": [], "push": 0, "put": 3, "py": [], "py_compil": [], "pydant": [], "pylint": [], "python": [0, 1, 2], "pythonpath": [], "queri": 1, "question": 2, "quickstart": 4, "r": [0, 1], "r3": [], "rainfal": 1, "rang": 2, "rapid": [3, 4], "rare": [], "rate": [], "rather": 2, "raw": [], "re": [], "read": 3, "readabl": [], "readi": [], "real": 2, "rebuild": [], "recommend": 4, "redeploi": [], "redoc": [], "reduc": [2, 4], "redund": [], "refer": [], "refresh": [], "regener": 2, "region": [], "registri": 4, "regress": [], "rel": [], "relativehumidity_max": [], "relativehumidity_min": [], "relev": [], "reli": 2, "reload": 1, "remov": 2, "replac": [], "repo": [1, 4], "repositori": [], "request": [1, 3, 4], "requir": [0, 1, 2, 4], "research": 4, "residu": [], "resolut": 1, "respect": 4, "respons": [3, 4], "rest": [], "result": [2, 4], "result_typ": [], "retri": [], "retriev": [], "return": [1, 4], "reus": 2, "revers": [], "rh": [], "risk": 1, "risk_dai": [], "risk_df": [], "risk_model": [], "risk_processor": [], "roll": 1, "rolling_mean": [], "root": [0, 4], "rout": [1, 4], "router": [], "row": [], "rule": [], "run": [3, 4], "runlambda": 4, "runtim": 2, "rye_biomass": [], "rye_daili": [], "saascor": [], "same": [], "sandbox": 4, "save": [], "scale": 4, "schema": [], "scienc": 1, "scientif": [], "sclerotinia": [], "sclerotiorum": [], "score": 1, "script": [], "see": 3, "select": [], "sep": [], "sequenti": [], "seri": 1, "serv": 2, "server": [2, 4], "serverless": [2, 3, 4], "servic": [1, 2, 3], "set": [0, 2], "setup": 4, "shape": 2, "share": [], "shift": [], "shm": 2, "short": 4, "should": [], "show": [], "side": [2, 4], "sidebar": [], "similar": 4, "sinc": [], "sine": [], "singl": [2, 3, 4], "site": [], "situat": 2, "slim": [], "smaller": [], "so": 3, "sock": [3, 4], "soil": 1, "sojina": [], "south": [], "soybean": 1, "space": [], "specif": [], "specifi": [], "speed": [], "spot": 1, "stage": [], "standalon": 4, "standard": 4, "start": [2, 3], "startup": 4, "state": 2, "stateless": [2, 4], "statewid": [], "station_data_": [], "station_id": [], "station_measurements_cach": [], "station_nam": [], "station_timezon": [], "statu": 4, "stdlib": [], "stdout": 4, "step": [], "still": [], "str": [], "structur": 1, "sub": [], "subsequ": 4, "suitabl": 3, "sum": [], "summari": [], "support": 2, "sure": [], "surfac": 2, "swagger": [], "synchron": 2, "syntax": [], "system": 3, "tabl": 0, "tabular": [], "take": 3, "tar": [], "target": 2, "tarspot": 1, "tarspot_risk": [], "tarspot_risk_class": [], "task": [3, 4], "technic": 0, "temp": [], "temperatur": 1, "temperature_max": [], "temperature_max_c": [], "temperature_mean": [], "temperature_mean_c": [], "temperature_min": [], "temperature_min_c": [], "temperaturedewpoint_max": [], "temperaturedewpoint_min": [], "tenant": [], "tenant_id": [], "termin": [], "termination_d": [], "text": [], "than": 2, "them": [3, 4], "thi": [2, 3], "those": 2, "threshold": [], "through": [], "ti": [], "tier": [], "time": [1, 2], "time_seri": [], "timeout": [], "timestamp": [], "timetupl": [], "titl": 3, "tl": [], "tm_ydai": [], "token": [], "tornado": 2, "total": [], "traefik": [], "transit": [], "tree": 3, "true": [], "ttl": 1, "two": [], "txt": [0, 1], "type": [], "ui": [], "under": [3, 4], "underli": 2, "unifi": [], "unit": [1, 2], "univers": 1, "until": 4, "updat": [], "url": 4, "us": [0, 1, 2, 3], "usag": [], "user": [], "utc": [], "util": 2, "uvicorn": 1, "uw": [], "v10": [], "v2": 1, "valid": 1, "variabl": [1, 2], "variant": [], "venu": 3, "venv": 1, "verbos": [], "verifi": 4, "via": 4, "view": [], "virtual": [], "visibl": 2, "vm": 3, "w": 4, "wait": [2, 4], "warm": [2, 4], "we": [2, 3], "weather": 1, "web": 2, "well": 3, "wet": [], "when": [2, 4], "where": [2, 3, 4], "whether": [2, 4], "which": 2, "white": 1, "whitemold_dry_risk": [], "whitemold_dry_risk_class": [], "wi": [], "wide": [2, 4], "wind": [], "window": [], "windspeed_max": [], "windspeed_mean": [], "wisc": [], "wisconet_active_st": [], "wisconet_biomass": [], "wisconet_g": 1, "wisconet_servic": [], "wisconsin": 1, "work": [2, 3, 4], "workdir": [], "worker": 3, "worker_port": 4, "workflow": 0, "workload": 2, "world": 2, "wosc": 3, "write": 4, "written": 3, "wsgi": 2, "x_0": [], "xxx": [], "yang": 3, "year": 1, "yellow": 1, "yml": 0, "you": [3, 4], "your": [], "your_kei": [], "your_org": [], "your_ten": [], "yourself": 3, "yyi": [], "yyyi": [], "zeae": [], "zygot": 3, "zzz": []}, "titles": ["OpenLambda GitHub Pages \u2014 MyST Markdown Site", "\ud83c\udf3e Agricultural Forecasting API", "Applications", "OpenLambda", "Worker"], "titleterms": {"0": [], "1": 0, "2": [], "3": [], "4": [], "One": 0, "action": [], "ad": [], "addit": [], "agricultur": 1, "api": 1, "app": 2, "applic": 2, "architectur": 1, "asgi": 2, "async": [], "avail": [], "biomass": 1, "cach": [], "calcul": [], "changelog": [], "clone": 0, "collect": [], "complet": [], "compos": [], "concurr": [], "configur": 4, "consider": [], "content": [], "coordin": 1, "copi": 0, "core": 1, "corn": [], "current": [], "data": 1, "date": [], "depend": [], "deploi": [2, 4], "deploy": [], "design": [], "develop": [], "directori": [], "diseas": 1, "do": 0, "docker": [], "document": [], "effici": [], "ei": 1, "enabl": [], "endpoint": 1, "environ": [], "environment": 1, "extern": [], "fastapi": 2, "featur": 1, "file": 0, "flow": [], "forecast": 1, "format": 1, "frogey": [], "further": 4, "geojson": [], "github": 0, "grai": [], "group": [], "handl": [], "high": [], "how": 2, "ibm": 1, "instal": [], "integr": [], "intellig": 1, "journei": [], "just": 2, "kei": 1, "leaf": [], "legaci": [], "level": [], "licens": 3, "local": 0, "markdown": 0, "mesonet": [], "metadata": 1, "model": 1, "modul": 1, "mold": [], "more": [], "multi": [], "multipl": 4, "myst": 0, "new": [], "onc": 0, "openlambda": [0, 2, 3], "optim": [], "output": 1, "overview": [1, 4], "page": 0, "per": 0, "perform": 1, "pipelin": [], "prerequisit": [], "preview": 0, "process": [], "product": [], "public": 3, "read": 4, "relat": 3, "repo": 0, "request": [], "resourc": [], "respons": 1, "risk": [], "rye": 1, "seri": [], "servic": [], "setup": [0, 1], "site": 0, "sourc": 1, "soybean": [], "spot": [], "stack": [], "start": 4, "station": 1, "strategi": [], "structur": 0, "suit": 1, "system": 1, "tabl": [], "tarspot": [], "technic": [], "technologi": [], "test": [], "thi": 0, "time": 0, "timezon": [], "tip": [], "troubleshoot": [], "u": 2, "v1": [], "v2": [], "variabl": [], "version": [], "want": 2, "weather": [], "white": [], "winter": 1, "wisconet": 1, "worker": 4}}) \ No newline at end of file diff --git a/_build/html/worker.html b/_build/html/worker.html index bd79468..c3e3cde 100644 --- a/_build/html/worker.html +++ b/_build/html/worker.html @@ -60,6 +60,7 @@ + @@ -147,6 +148,14 @@ + + + + + + + +

OpenLambda

@@ -166,6 +175,10 @@ @@ -451,6 +464,15 @@

Further ReadingOpenLambda

+ +
+

next

+

Applications

+
+ +
@@ -486,7 +508,7 @@

Further Reading

-By OpenLambda Contributors +By OpenLambda

diff --git a/_config.yml b/_config.yml index 26a52bb..1ba1d55 100644 --- a/_config.yml +++ b/_config.yml @@ -1,6 +1,7 @@ # Book settings - https://jupyterbook.org/customize/config.html title: OpenLambda author: OpenLambda +logo: _static/open-lambda.png # Force re-execution of notebooks on each build execute: diff --git a/_static/open-lambda.png b/_static/open-lambda.png new file mode 100644 index 0000000000000000000000000000000000000000..979e24b7ffa75216c6865ccf2d7f2c00beb7c6f9 GIT binary patch literal 289165 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%0Dtjq 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

A zFY+86e^u^zD1KZ#_f0)?vqH&;f*PtVzNYV0LW@YyKTX&OxMyj(Dm@;Pm{awK0!=kc zIvh~#;jRw_OZG;V71xy>uybkIBEN!~<(>nj_sFLk;E-pRZ2Qfos~q3@rx@rs2zr|q zSg2YYod+jCb!9j?4*qbI8|$p_1~Nu?A_)A4wT>P1J!?U`ii6L~UcD>(Q@)20jGytX zUwit@q{ci;R^^Kz1$fhcNRos0M(E`C-Hr0p$-C)yYD~PZnH)Rb5lS-Lk>bHjHwP5l z@!pilsj~qgi}sq!0Ocq*qhXT&0;FR|k4l|NNeF`bMMo#L+r}G{HkKBm&sk^_-3=VB ziM9xQ&|fw!3~<}3x`=J!+IEA7SWxoQCS&v>=^c}Xm$>q9p<#lMxR{S4@pn;4fWi67 zvx~elx~}1kUO${GHX1*bEHY@}QzGwlg1;A|Dg}i~&CUeQKX{>X{)m^}#Qheps%%@O zwh)=17O_naB?Be}9BI>Nfek|bi4i3MFWfgmAj5Yv}YqoGSMg^f*e_8 z+CE;s4MJ+{=)vR|yWT5scHN4kHF(@;w|~^A!1|(3pM7`;JAAYErlb_VkP~^YH}!Rh zze)bP@&|ohu=NgwvzF=<;0En5d-M#sjR~~D^D~F`uw89i^tq3(P6H*a38Y1g`a(2p zWLQ}n-2Km}<(Iw95}U>0vO7tbdF1y_nI?BnLhuKXugg`W1(do6jg5Eh1BmHpS$-fm zR~b-dad#dj;XOat%>*Y1?=Kg{Vw~QQ?W+s7GmQMRyu>`e>W6ZMblGf=Jn?5w!@I{B zc_!pyPN}#c6tl8Vj(bSeQx6{pb~QSY+Jm~Hi)ZR@dC+~xbSG4?ph>tFM;?UY@M7x+ z?L+K8Z+IQ%0RiHC>LdZ`9Z7zwNBR8&w4XM%WZpa_-yPR2yLOTxXis8y?k0Ood2?HHfGkrqEfJhBxSo!$GtbYM z?dzL)AJ-EQa+I%q>R(v(=3lxVxN~;;+{fH@7q)u;J;Emco@rlNTHdt1EYfZ>Gk)Gr zPqaR55A@TzmB66kwH2gkcXtG5-&E}-?e7ast68zrt042rI5O3st#3G*NAayJC3zc3 zZzo3OdwyHE|MY>E&FC!)hr4 zQ>_^dXO`Sl0e_+kLsmq8RGJJp+p|WOc|hvphV!^!F=Qb%O>Bs@Pg9$3!aY$K6B`JH zC6oJ^>QtZB(J#fgy}b%bGozXp6XJOmEoW`QvPa%ng8+z*nT`>Qdif9a_IrU}lDHdGYnx0wK;CZbAamS(zr6SQv@n*h zPJKYeMSokW3BI5hlL8ePXOj9yF(Krp2{SyVP*4%H7pfTK0pR>Zj`ZPsi6JTtEg3B7zP6_CfL-CO{7RDyt9# zDS-}EB?3p*$P=|QHFe%Xux!`X_E)x*!M<+J`{~*DXeh#+RBwPao$;=7f>-h3cBu17 z=Sj2!>u7*koyrB>ObYi+%U^fYgtlIHU>dp5l|Pm4`HBT*HQdaVfW<94DBCEcSK)HP2I%VS zM9YlLc1hLy!1Te_+Jv$H3dzj%40c>?@e>D|ZmBIa-^AU1XWT5m(`V|<^PACm@ zYi(YY`G6sDWT26eY;TcXa!0 zPzcvejGkV9iV1-l@SCZjfk5Y#TW?6FKNiTKH+4-eJDAG4=7DSJEgpu;;{-ijxD7D4 zZfDBem6j=e?GmDUSnICZDk#nxX9G@%KMdqalxA)qDn6EKmZm6RR~$*mF@JTdN#t zeJzqg5td%2Zh^#fv5`udbT820nxG3=zI+&m|F5TRzM5ezoJR=qJEV9WQo2g5~2$sA`wI#4( zE7C3m3B?utG=rp~2@|J{QA#Ym#1-e&=R&OL8{!L)=potfm=QaIY6Ahbb>haEyZPw` zu5|EqqHEU(qz5w?Q4a_gE;Ha0fIM=li7l5(`7OuFc@zYbBcr*{u%<<}f8*ThZ5?cX z5yzG8H8?-upi#Ipx*(%@2XtfljWK@r8e70!ZaneeU^Q}-ckOodFYR~|_*#16PJ|&5 z`j2(q4+^+2c6{nCZ}I>Mh)A}#KL@{#b9g&W8dnUL*Lh0~9BwzFF3$+>&0!hh&|5bW)_Z57t}zg`Iquto#`)xD^m zE%X!eLR`;X-gjYNKi((=xqz|$6GC?O9UV(5mdL;ujO+yD9ihd=^oI5AZ)nUnCPHqY zVnDiA{NqCM>gi27th<6OQad!#{4REzx0 z0n3dLH;iQwU6_{)`Nq3{p$DgR$BLM{fqc^LmWFPD;h!;Y*Uql69<#RMc=C#7H_M%&BB&G3rrVBByEN`b zh(0BXR9t?qnoqZ>pV;lFU%JclAf#$8>CyY^Nx<>R-Z#9=^Wl%m@-9QyGvd?3)q8W5 z{q>9--Q+79q#Gg_8iE_*=^?g-*)5Wc&!?}6b;P8-)xpddow37xnfHOTKcUsSK%_0* ziBCs^VCfNItNz!setSe%ZtJ8gKha16dg8#{@7CmhuVv{Ci{>&CgpK(QGXPF?6GUm10U>`^nHPmZAIK+)LH+)x0F+=xW>>{UI<8oXL_15coH^tMI zoh^~K0gntef7}*qqq~DTk#n5sH}^dF!Yr^NA`(^zcbJrZpvMu9@@Wj#N=qa_B}iiy zw=GC*Ynr~QILirbe^zkhCy^=kF}s`&Dmto(SxC6V#lyW#lrhl5;~twB(FhSwCFfWG zn8;O&-3;XwwObkc+~|(-(e7KHtJQ{~4&<%K7%!slr16W%se@dW#)n!C*&84&sa?h3 zB0bhkWLPsqD`aUhb1Ej70imK1v;`1jKx}{G-qyi42fC8g8Si*PFh5r5pJMoq2KeHP z{*9hZh?IpF;}1BECxDYUWYM))ro3#&85lL^`MO{4U0aFU>KS&seS>FYP)OON)AfgW z51!6*uVs8833RciP@U9c6uC(0}^fs(+#7hzdB2N7bjvt$^{Y zzRm(1`M(|noTocq!>&!SSG>fR=1?raA!V2>f}(0Nl{K_=U7D*tfB#O|>U`0D=em`| z{k*la<*2N*y?igO-i3L&YA>YJmnl;^NgE88P_OPd+4>mlc75V+50ah1WTqL~{G4e; zJA?@IgWj-Av~R$kYxrIwx6qO5$0~f`_wTV+X?f zQlj=ACpcdV=K<kQ{#>u1_2dBFv=9grr9u=!El0>y1 zg)b33IlN)wojvk>G?|xmzH`iNMb|<_q}e+G{`=bnb5ZVBJ|%pV_hJBv={TjzB7wsP znXT%W!3@fqz1`|jv{C21V=wPkbmdpAqcDzK#SbkWWhkOxpqbB~V@m!@2Hq+AB$kH6TJu0D$jkH?k%rbv}usf6>o*#oRDH^obk)qxL@llXwBWHZa@;P;R9C%3` z{P2j_RzKZ=G@rliY|hXDeU~q^u{BDVpsnuD;0KKsKBmrC3C79E<8_hh_w+?;cBQjBj{20_1B!QPck4 z?JdQ2o7vW|2&rgMknH?kQ`+B`o;J+Yw?+30(!;404@Jw*(h98MVc6)6WG;kZ^Os{} z-S6W(dr{NZ0K@Vq^bqa#bIAELW?DR}CrKUJ+LVt1*nOWc<~oM3xJA7}tJWwal-+S) z5!ky@WtcCAcw?PVRmu^t0KE%hJ_3fwUOfRMkIs`0agvt)>lFC8%{bK%%#yb)`ShcUs(ve!((Tt zY>&)~DC;*k_=AUrF}$LkFG#^s^qa(jwuApFA2Q|Mo;gEn6~U|731>0a&SNe6D(N?sq%@G&kPK!4Levi57ll}N^NsRg60)=D_990fEfmNN`r%9#1u z;($C@0HLqu%U5v$XKUIObjk;_;N|NPv}Ux^P01vmMjPngV&Cj%h0kDM@oDU|cPEg$K`14Vv??T8*EN^tqT zov@Remnz!6SjDQjxNC}#&L|M#A^3&1Vmej1B6}-yvm}-wuf)z!dN-C4$iM+j_WRdZsVt*W-M_8|y1{2@ zM{5^WTPx(8mI4J7_C(s)lEGq$h(F~?acsEvG9vUR$WKJm)g`)p9!nJF|YK4lQSU6;)1!)V0 zpO7nv!5>oNMN2zFaDLrUk?t)+8V&o7%tg)siB^4$8N{{KWn?TXHF*i8nG%fWiuOQYalY~mw zeJygd4K1fd8+w;^MqE|>!OfN0HTU(guv3e58m3vB> z95dP=fbrewSSoT4?)eSCgXzo|l=6}}g92pr|Nax)Mxm)I8WmRKrJas1H+#%^%_n~@ zrW5X2``4dTntmqY)6>(qT&u0MBF!KareB?~F=s)rFuU@3*cS`?MfxInJYGK;i@Hv7 zJWsA#Zb*+%C{*<0_CX1gbwE4)x8nBOt*7gRQ@*s;DccjyoD!+h952KYY5$;3Z#@{b z7si2Gb7S^U!8>AuAfY?mMBQ}M?R!RgnbCE$OIwGpCDSss((9D4O#ftmrkhFP3!1ku zq*m4=fhz``SIpo2d`H~vZ+|}nb+t8Jkgt4C`8~hvHz`y7BT<|jq_!+~h`fxNg_M~F zvVYYcfpPAgTpos6%nIWoH#D+aA*-1-o4~_vgqsgvm{_--)**=~?E=aQ)gd9Pg#rR* z+`+;7%ASO%=FJ=X%%-bW#N7g^6tf5EDelxm>onplM2YjoD-@fqh*`x|`-erONB z5NId)IuSS5A;80I+}rH#l&BAf3y057Rk5JFSv-g{;OC_p8Y5Fmnesmwa}Y%dxl@ z4T-Q9HXQ3Y^H5N#7=@`6RGK=I$_kDAc}bTB6P%2b%-3k|6>GUk$^?gB;3TI^eDDP~ zib4(MTA}{Cs`!4u8n7g-o$P zLvbk-cPsA2-MtjI;LuW_SaC0|0g4oNiWiDQzi>bA_b@_sl8t!8%t) zv&c41#QNLqF(gl^NoyNXCOuUZdjQdl`Q0?5I$+3Owy?OkgG1T1ZhW)sy(|kxk?xBk z=wbgH7S-F6oAco;r7d8K|K#cTdgZd8@_RV9SjK}|@#ZF)(_nK)v>22-a4ApVu}(N9 z!`vcjGDlsVa$T-53Q@gGagD0-vS0Cw8RQ0SQmx!8_~TNExBpIuiM|Wt2n~u;OLG$r z1o#<>n?tFE?x3sb?N~vf7u9VxVDXVK_nTT&{I$5L&x|z{lQ`j_#WPD)#h-B%%*kQ_)T#wS!H8JJ zkXCEyU6-AQM~Om&P+gJQzO5!7O1CL+GFLZY?c!<7^-3z1zeI`Y(d2$pgwHh)`~P zt41|~DK}|i65Tai?rxY1n};XggYPVe{Yl{85>x)75 zOsyGmid+MCb|F6xMBrAQlf}}?zNz<=9@s78g%=R~{Btsp46oZPO#|WMD-ZpTugZTA zVt!!;$z=Mf;1S~k$P3WuZ9Ubuf7$->_>FEQ6vMZ}JzcVS-Z%;4V1qXpdK-M65p?m) zibHLsTJs>oDfcwX%D0)b)64Yr%|j+O?4sXwB$6-bv73EJMk%Ms{0>?nF1PGN7y-YZ?YSj#T?Lm5g%seDyz(TD?Eff zijOm3_U}k{uhM;J^pN7u@9F%F+Iuwll>^Kg3FaG7@4HG}h);zH(psDL21X3Yt z5`Ma}xop8NF1%3?FvaSqBG%C25!-9s*Gc)+qJaG`7U> zZ;?N24E}=cM`h`Uy?Br~?Uy9ty?*z>!=$&BD#n6eHQ&)j2D3P|ZCiscEb9$L+=JV-jRE=|+wx3mflopGXjiVwSThj2l#i zvE@}HR=*@Bovz2+#uovNzQKVU7;K5`>Mm&?#e;6;MR-42e$=6$IWf%ERipYoDt?|9 zA&~ri15vqlBad4k6Tm3E$9W@MhO z_k=;Ty#F|7L;7uY`_tc|51-GR>jK^t@0k@yiccGUdc{#1OcMo1GYWUy)PNJ<`(DzK z0c8k^0Nn}0mefF744sXI*fsdsJ<-)Kti9P}FG;PD@sVayOAck$0}~k9b%5DyAl76!RK2@dYF%ei>tVXfO?UOyzP+VT8rs4bfI!s7hck9m0Xl-x zCUmUS6eo#N0s_940Ox62eeIG`Ks}aw5mU-5(N#hf1-ONM=Yp6|dNuBaZ?#=r>7*4R zj=9;^H+1%o;`rY9^$i?5^6_&^?}P9NT+;JL;;Gw7DOct6XGWA3GU+kc4HBz}n($&f7V7QRU~lNotU;fMR{b|cnmZZ-m{x5wP4 zGSwq$42j;@o|as!iqFZ2Sj$Mj?&9x}ZpUi*2VSy#xbmUs6Y~trww|-gDl5UB>}yZI zU$YP*?Yg-=ZB?oX9K=qd9DI;E@=#X7Mv{gZgELLlIT*ecw9>$6J|Kv+D2=&2?27luE!c3AZ z#?|aqMKrdT^jRxm#?bAUBX5__RMsDim07OLyCVB^xp_72(W^wh713g|Gdiiu@h)@s zJNSOG9K(LW`8PO9^FfPYxXR{w%kOouQYmg*I(Nr)8lciSvFkx}Ndj8<0}X;2c&J}q zt9Aa0GWHt_=~ztm;}mDfU?NuQ76e1++>f{uZx61k`z?&?iUB6U8AciJJ(?l$ZA&S8 ztGvLIBj`M-knM)7Xgy&o5PKEQTv!?zOslSoU$R@Y=nIj4xkbiVV)RnXu+mTWuZ9R5KMT) zVWv=~6&fU?Ja14_3ERLg*Dp|&ru&LHdMQ#hbJ4E-ixY+a9V|V#jl~=5gLt@EHff$D zY43@o0t7%;HRCd16k+(%HtlwvrQgFB-wQ++a8d5;mBz}C{VU@oh7BY?gHKb=#40h_ zC#@CE`1X@a(as>-&(}toZqe;xQbH&UM(GoWpY*Duu4-;a?8tJkI$NZeHrh2ytUhag z()h_Az3{}4yNF%V5G?^UC5l_mJ0}0)75s!;(DL)(^%?aIR&O`(0S(5h9wIUSF+VDO zuavd}ZkaZxPkh;PNFdWB|exaU4ESHN6rZWuIbb zDGb;b`+z3=GU&m6k;R9A48=;y+ZTRELmBxqIH!m!yucy$g=@n0>z{a&ex$f+F|%A; z9OO@&1K0TiG)TivBaQ)1_5TFuNb|g%_Cv#k(pEm18H`HnP4#EfVSV~BR-y=1@Y23O zjLyNzrneSdevj-AL>Pz-XNS2-r3okO0pY>?v6C~R%mMGJdBCF|_m+5+6vw6aGShrx z-GYd^pw4-`T}Oc)szQD$#g$h4Z$7=Sp~}K8WlDujymQSKgKdd z=EX9Aw#R0F5hCsS9>zH07UN$yy*fdIxzL3oOq^uq40JO5IT9^BZCH73*DH60()IXDcsEo~2Li?=4*ePPRH;S!=ecwGp3IwQ=2j%$e5> zo;|pQYecn@`i1|XVm6TRp(tTTvrqJQ^tEk-quGshAD}uTgzsM<`x8s<2yS8PbK3x?=>hBr$5snQe|Fj&yjm)T z=|x<1zIEe%sUl_ivE-u?{60=2xX%TXkKuJyPu7Pg_V5t$YO4*Zu?WWVkjUUb6j$jy zS)p+fRw~!m*O^xZ^Bkjb(9oAoAPkh{3I{?z{CL_W^&pe-a4VeCwnonPj>m{0l~#Q%}4q+Udieim$^sS@&FAVR--=9dp>}~t>rQphCC~M_bI=jh>ZA6R@VY@+QE+WNk7nC)2oe~)K$1ZI z&*S{7LG5V|>R4R*x}QXkDSnx({~_ZO8gqsPuE>_Hwf6pg*iX|1$15tLD64sIjJrp! zy(M}r`p zr+9QSu~rez(c{F5;cjbx>JnBQwIP2N+XiOqA-y5EbU^44E19hc2$I_7nWUc7^`@>) z!2PrHL+@zn;oJT8pQIH8E9Q}!blNS*ekMGHCUA=@%JgC+sbmydP_4EXCU%n^*NGYi z!LY3v<#(H<+8?l$ioF^gg;>{K_b_;=+TYqY;(UG2R#hGP>m>tYk%G^>IG|33S&j}zr8Y&V$`G+ zdQ}M)#{E)k-#0#B`l>$wZ5a;oM?KlPp!tb2WvGz&?oNii{S$@S#YT(s4%)15da0d9 z=bO~GHJ(fPmFYVTHqgfW6ICBGNi>TmF<1WU52Uv81r;wdF*Ha_7p$BXhA3Bg_A0jK zIMF_iq~z0Mdge7dQ5vlz7Aj1NU!xY`1gubs1!{PaTqPXW(3*mw7>I}@i)c@1V*|C@ zP1~GkfzhZt?~(aYHcUNHtO0GF>qvt(h7MiicDN)vVZzaoyR!I89_YKWoNU?I#_8WZ zHiH1Xfe)~?uRhM66zn=WSWP%M!x8MZc>8gHW68oj<_7Q$&8cnZ>{0@lPL`I|TVY2B z7@CZW9$T+Q(CO$y7<$-tlGiBFZDe9N|rE zg*0RTNW|MfZ+S$NXEI~CysIo z{_Y)+IeXhp{SVIzS`}*-6SJAxA6lnGz_7#f)+3ogad*Uf^=1iwS1ebP{W}$Y znt08EEXsh1AIC4XqK|Au6`#`SwPESR1Azjn&=$3Q**Iqm!Nv z&++J(Yx=WJRg0UvLUo!z(3H;aQ!qkUr$&{|40h)Va^8jbM0bf-eL4H9wSSmu-hP#c zBSR^~RH(oq#Y`gZ%g#-?90aeV!kG> zoOv0F7!P9Z&N56bSGbdu$wd_n$uWH!Z)eJ*TYn6q8Z(Ie6!&=QH2c!~mYvCGYobX^g=wPb zu&fg59zs4dOXI+TrpJgg3++eZOmDiQ{mKiD7Nwe}YT@fKVuZf#-e5Uf@Dckn z#l*hKx1>rJT)v9WC)4J>6>#12YfavE#-t@;ahObw0keozGgIexQ3IvY>_1biLKWN% zS}_1pA#x5Di}<$B;)}&oQ!l4Q6;mzRNGwBR#9|Aa?Ws=Qf{a&2LgU5re-Iw78V?`4 z7owvd5LZdyEqSEg)6=x#N$0=tO|szO4HvfpYlCs>#6zd>0~`+cBKD12-w?h_{w64wnwQXL-s*jc-aWS69SEz1pg3Qdo*iRIS{{ zu~9^&VB)nAcPY)Ff^^it-3mz&_OwUJbd>o5om)0orO$Gomd~JMk&gG{r<{-SzRKfF zm2ceNWT+}uTK&*L0Xv5EMJ?CY_|F*m?wqzF6r$GZlfW^-_7}3g!aN|XkO6vxVzE^d zG7d`wpE>eUrZO=(#aaA8a}J>PqcSar%ZWr6?J-cV27rkb(*6~m8~gMT3o*IhdZ_P` zcj#5z-9{!gbt@4p5!F8^}vZ+t%U33JouM3NEl37R3Wm|?C5@4}(d z?PuE0lHw(K{Oe#mW>oi)&8!u4~%@oI@o6HI7nv)z(4xNx{GdX)Jf?R}B@eFgqdRjy?%S&(%g zQu(gz??F4f-q7yVlorI4xhJsVu_JgYiJ6XaB(9E$Q#6yG>SWm^nij-lM!*W}#aE#T zFM0R?SCkoK$W3j+wd=iucI?hv9<*1B#~F`)k{gu%y>`b9dZnC5g4#$q9lzf{#w@=Q z?E+c@Wm6LAf4it;Ezz7UtZ=tdPqW)xsCq-$qpitnFcg_L{DE1$Ot7Y{SuEQ$7njU3 z&Cc^(`JPW@({v7Ru7#oQV~kX`>LT*!2$d9!P4U3MHfEA&^!9U`6*881ZUm{M!WA*B z29Os?OY`9?z>6hachlDB2=-y6QMo2nHQ9$sfAS)k5#j$TKbY|;wP{JjyDBJ~_m`PW z9wG$yM*%p9?l!cQQ)Qmg_m5RHpR8Hg&E_}JoiqoCF_uf>d+|_JCM7R~s402!l6KYM zo%o`^43B39tE#^?blofRZZMPJHndGNWazhK^Bk^984`5`$rX5d$5C3Ra@GQ z58?%oj>QHdT@-bB5#WkR+iYmL*atW_5*>$;%7$A5{MTpD3X8*V@6D4uNS3>E#E2j_ zS4k-{>9m|@dR?bDE`lg%faVnw^p^I>dR%2;ZtH8_~%irAL+qU#cJKwq+81L#C%n*u9TXq-sW+^5ToIg4~Z32aRC z``dAbc4#ys)?t8d#%=qO!ZASYGX5#G;haN+sQx7graviIf`4~^KfH40TRFms%7!j2 zB;vd5>GjuiwFlSGqRhG&!2w95J@ZvB)#aM_@shuv9lmyo6lOFDAYTfjMy!wJ=2Of` zMf>8y-J+zW%9ug(w(v5$>@zRsiON>u3|AKJzYW?`7)3ToWw1nuDHWq!9WKxz(h3)p zNi~f3a>yn4{odPkSBuqdw4N429h9UFANH&x?${YkM0F3 zCmGI16TfI3Sg+xXRjA-pbb~O5p93xmbG4v=wl62q%#9)3<8!>K>UP92z1niRRd%0! z4fKw+W@>rTcc}ER;r;Ls{PbfL{d7&33<$T(@<{jmin>g4*@|RCI;*L=n2|lEvvz)X5rge zrE{Et$D!|=!VXagsC&fr+*BCMk6O3Mg81-KEbYu*kcAzdETt9D`c6+SU-pZJpCHdn z!@_X=#4ZnlI6>B?pqyfj)TtOqc>^_07E(6mjnStbtZt30Hs%>L+HY}gVL!iZ^=Ycp zY~lV3549zvVOD>)PZ6wjk(^009n&&}B5%F>3qtlb0;S=?`SmdCIRTZWQ!o8zn~&Rm zQbivxk_~h0KKCEAr=MDqC06b!_tA@9*H&+fIIv>(0X6H@lbD6xQgB6+A!YV|r4QeK zrF^GT_EJAt2FpBuI-CaFu(|c~n+9z-s;dmKO6XO~Kh33I7gm5qp!Chtg=`N1CA2zG zIV89X>ET3eT#BY!&WaFxLrzntBfT!!PkUtQe{ZLYR!=N`I*^q61Jycg`nsAn zwN4U2rJ9mIA7kvZs)JRj?k>k)9y4kut@hLpV@6><(_w7|tv^~=L=4Ff_g~|TnBqkC zPz?Q&5+X?lgBzGu39W-Q;)h7~e@Qvz5B#MJFQ&mK$WjMmZWaUnh2vnL6Oxz)hP&@# zLMSq0AwAR#mCS;zBOY(^ zaW}015x`Euv-|vTG9b1xpo`uiS|KDjw1*Cgnm`1m@%`={oxXmPrF0_V#j$H`C0#6U zWu!>!ifcrY^BEC5>O6iD&FF0lkrMF$2lu`5m5yJ!FwqY)D-V}!{JgG%U%#?4W!e8> zwhV?Q{MyUaRw^Io*=M2QWS~`vi#)%o#q9-Vp>Tie?Q;{dm9G!65+I$B5XcNk=ESwJ z;>IL|v@0Tk(|l&mM@mWES>%m*8LfneE2})&j~LC*A`YBSLlJk5C6Una;^Sw+d$Jf6 zDIxgG%nDQ!fcKzBnSRbLOu#gNX0fdO;Eg)pvPhY+)9D>L{ zsq{HSmxX&0gFPm)bqwh{@eGk4P!lDTTuv4_n%#-J)^VtXPg`Y_V6Q7?Q|8DKS+E{K zg-X^Nljh7<(?|?%+fzR+8~xkPIGJAg;zV^%t7EU9PBe8~p0b#qeussZc0SFkf zX@5}5D8E1M#<)Svz*5_0pv>dpuzpj8KY+mm5}A;Xv&o~X+R|X7->rQ8Z;q??=|W%j zns*J|RrYBGA~f~=id!(GL%&Pf?;Vb*<*JVmGgLW(4a5LAyl zVbA4HLe`w{iy{kUcaR!5J?{p9g20bqH)noSMmUo62$5u=e39l6+>A#zj!y1hrUZ3);ZR9`K3N`508qt{UKk(ePpu^aluI*8rqjrB)!m zG-~uor~oN*>E&&5M{&j>Bp4Om3&U9+)kG{2D7$|RDOi2DZVG=QDIx`xC_Kr8{mGS2 z{#{uE{=FGGi$0$zRH86i3{3}T4Kn2=Wd?CSZZ5PT4Fshsi(e1|T@u@g0qM!*dg>+U zrWoa>)Gxsv@b8H=nC8ZlS{LJEuR6-IWF!mWr8B_{7Y$^-rNc)w#p(yCEPV;^!c3h0 zSqPRS4<{Bj62Fk8&j)pZU)|mwZ@r|;8C?Wpp)w)CWG~=M_qe|@YLqnZ3|nhF#1_j? zI@ROZJ@)tYyr1CYC%p&{>I2LCv|>>Hw*E&pHXASr(C^uwe6>VWe|rJ}qVUHJ$<9|l z^alLtNm}U>E@*B!KzGO;5e1PwtoQM>VGA=}%lgrrInvXo-*A?f0)eFQC~{n}M=8WG zNmwy=Bc`=rrt5t&6MmV}VF`frhQ2`(ysw@B)U+k02#-*i<808JQ76Qg>Fcij!Uhpw z=Hx7`)YSeN3Qa8PzkkJPB!y}bNu8HemaBVC@BDD9BkpmwgKGNVGPnjjSvfOYeW=eJ z6Bi>yW!S`BJ(0$gNQDXfXt71z9v8Q@=m~Y-XfOU0L-`V{4zn4W4#Ysd>5Tn}+lzz} z3VCBJJ$L7NijVOZO1kNtP8J&Zba|%J=jkL5);uxxKe}{3SIt+c117Z5%jlA4Z8vh(h zw#o+L?lBK%F8>ad-&a75sYFNncx}a0OxSB2J#fYb0YsQ@yYXiarj(I@`r*Jv@T`RT z7l<7p2D5V^3&E(2!hWz6QXqZp+?5m%C1$8A1asZTAB2gY_|d&v9t8Lt`ho4Xu#W=; z$v<<1i5n?493TYpV*@lIe}Mpjk<|S0U^1?Hrq_M%G(PJ^&}617^M1)Eq77&fIqVg? zxKp|=eB5hPn<>9AyKfi!B)9iz4(<04vl0Z!;f-7uQY2-mmqb^A?_{kYE(Yi!aH2;! znw(VCtOlQGeXH=2K{V>?t{~_A?A3w4NdEQ9{S(UWlOMz@GaUXaM*TJ)js$*^t`;11 z<4AWy7Sx{WaY1$2*HU)yRFkid9o4QZb#qeCJ-w@XzOVnJs|k`2F5hK0GUe%G1p2|T z)3upuPw-iSCGJrM>612d5n2~9L|=vkmd70to+SuIpJHZ}*9UP!xx^QyejIP~MA)fK zu9<*zc!6u1%_GO9yYtbCrDe6{^$+Yo%WN!-cc-Tp*+_xJ_YlVlZ2d40^286|MM47h zcZFj>U!oLAW~8+2cRRx41fxw(pjgk&-i$X0aB| zGa<=-L3fzZXdzRsbPIi^QYfqQ$(xc#d$AJSdshCyZ1%DGH8)4S0$J+xx9Y~AH0z419G}ANogKxwAc%-viv6HC0$|t%o_BLx;wbVL}?$!;Lmv-rkWkuhaBXZI` z$#YIR|It|LNR5Pn^jc|w1baG8tnDrxjE;NikCD(D%DFWD2c9+t?xTTg_ykJjfvksVa6@IMKGY_J&V&hWVhI<{fio;=#I9Pv@Q_5Zg2T6v4=!O zOIrW$&8GmAFyl;|MvFZYji0jOV6hM{z*@akCZ_8o9tYxPPFpjK{hWC2S;93gFbb#r zZ%Puk@`;XU1!-qfw5^Plp#}8$#T7KkC=OD@+!a=Bo?+UTThVq#Ed`Mm_%)3Cn z5__ko=ZQq3sgg=c%_gmb4hF%cYsqJtU6N zo`sPT5iWP#CXXyNobL47KnGDL3HAc$hw=G$^;U>%7Yv`xI7jsY zC}TTMA7AN3*49rUkV_Iy_IiTlRXZ$+EU5c zVXi7L@^7@YHP5C$6C+iFF(;aCNZIne>7R4NmbKHi9No3Z;y?0Ef!0zaM=P1qZ!Kg* zfYJmy)P9l<{L^R}$|)#q~5mAfIZOT!@BNzXrTZRfWH? zown8n4^}&Ns)*Z&JXJd#l4*yV`yjloMza($OYRYfT|o)s3l=8SV$K}2!MpVYFD9&f zV!hXFpl?3`@UaLdo)z101Wx1$+!v9PiSD+V@>v2U`K)!`gDDsgsYXCS_t#H-dC-kl zzzQ3ia*O=5NlLUugPHYRhvE##Mwvr2C8rqV4TPaIQ(y`~ z*Xca5e;5zwrhFckxrZmDGMo`5S!Suqi)Chr6!3q8rB2c()F7zuG`u&yE$Xa{U#!q) z+RB!|scmlOhb9uOZyX00r0h2)VVlKGNGnQiHCHcEVv~xX-QwK_?ynsvBk>V)kr-}eXL*@}I`>IrdHFmv2)WZY=?#1WELEjH|c zr>g!6zg#jtyx4CPQ<)S=s#QCtr$~Zk*QAR%5Fj*YF$DWrKBzWtv(w1h!I&O}7%2LW zEz4G$pZ_>7=3yih)$X4ymN$QOAZQz8=es?8w)E#?_TVVwM0UFC)^y1t$cir z=_|_DG}P80;lVukR{NK?^WXS;coO{x8xT^st2$rPvl@%@?1rSc6z=|MLJZQDc-QlU zHZT5E+IBUabJCNSv~sj9%?Vc;w=(Z1l8;9Yz?+?oCIiXw6p2fD>ynQ#Ep3!fWxr-n z*Mdm_vlu+z8KYci&oXdgnH$kGsbYn&(Mr(jp1NXm5C)T~L|+R>0Mn;!U@|~g$D-TyKgLuT$z|1>l5@#Q!zY~(h4L^ zXT`$EEq~vGk1(GrCUM5}i)j%sXDHq(WAEDfK$=PO7wRX%GC5tmXI)Y9N4c7C{ zc8qtE-AZD7oV70R#3e#cN7@$}K<*u!{N?tT4-wh@vOvc>2f{5~U<#DyuG zXVzr@@plB$(H>G+0iz`0ds$@E5D9)NrJNzxcdOqa2396W*?n9 zvKJku4RVpb+kKpg$CRABK!SnRc4;4$Y~ov$e8@jI z_G`_=Igu?P-9aodfI{L;hzCPOt*MM!MOIWV?1XlG0C9ZbR6DE4QAv5;lhQOFez$PM z6mxmA{&$|SLiC^Ksa`b1|AZ{i0V9CNpLCZmw~f5FicMP8*rg>Tpv9%PdhM0{PXMdT zLpB_}YwP@;KdM>rt5R&eoDJxN_(C)c(O>z-6X*mbBY=6)?O8txuw$-I__b2c5~Fve z(5&Ye`!$TFARXvi#R2bpgCT&eLm!ieA1Xg;z$i!<#k2a;{o|*X2`il}V4BwCY_tQ> z3fp0}81Z&ApMrBL3vJrS7kOpY0DZRX&Raj7@zn;;i_%vO>e5sE0zjM1ax?Br&&4ED zmmAJNHGe?JZcfYi5F%4$Kl?_qA2AjmuJC|R-QdbzjMX=)tL_B>cQ5=QfhUYq%Ptr7 zsYQBce3J-4^^nn?a93KOS4ebHsm}{BOWlzk)zBkY*1ylbe3`W?XF0W>F@;vH>S`Ei z^nISOA++VSRl|NNKu=LB&j~Q7HCd-9#EYBHsGy-tVU|eo3lTo%G3A-}Id@ ztgfF&m4LwH0HI8Ikyb%Swx|`9`z5ECB`AS5?GnipO5tHrm>`WBqIZLV$n7=z63QW; z3Wx-VE>>etIa+!=REMAblgE@;QeWEnBE+&fH$pI{K~={fHdaC#qOovQ6TNsD!v}@> z66&`*nQFB1E9#i&SR=}1q{ItErnf9Kw~FjWsFG2_^WC~Igs6H1tVplU~&4z=u$xC69`3`aiy06|F=eTWn1 zLAD!dA*$d*eNMF%NFkPM%kZ*@Bj`9FU%4|Ayb)N~1vsU?!o&01m z`-Zy7hWJC65@V8?s<7#nO8KOi|9%1No}nSE=R%nZjTPrJN8Dm5r#D`hyky9RT8l0a z1ti4#1=c;p^@^3bo|v8P#S8f1l2d-FCH0(f2BPj~MF#Bq7zZfSK$ptk+3?Hkd4zV@ zXna544(HiP8K8x67|)pRxdllmlrX|NuzLX~Xc(UeK@a79o?M320xj}^pjoVS0;)nz ziDUdzJnqL?Agd%`J<|V@2$np2AAXI768X_jB)6+NsuD*x*Vpx?R;3jIF2owe$9d-J zYP(?hjL{;@5On}zQvIVXTC?Kf)V}L{giDDdBJ2KN_PC=#kdOf`4aQg@jjTLlYLAHOjSZnWu)zWkmuW+rKvhY9!MIa5yz(@!lEOUz`z>8 zdQ;`&^);SEHFU;ymW}b(568A+!Q@& zJ=?42se(7K_%X-=HfTSrwgHTUBnF1EwR#`c`FUJ_&dF`wdhw08cXv0^#%>fH+{QIc zHUMeD3i_l$NQ=~qpx(2iU9K1N*$e6t{TQc?6!>%rCa~i*IrFpWD|JGwWoKV8*DGA4 z5XngD83LgG_<4{ff$dXM6?IA^YA% zKtK&GX^^oE26CQ<`e2LU);ok8ULgzM&uyNd2$|Pc3G3ej&1cVRLFFOfA7fa+5Qoo$ z%(^Mo0Hfh=QJsu*ST1l%N-RO4O*z~=sfFqCm2;kqTKjWBei2{@fKi%FOsCca_Q?B; zAYc>E46KdBS7B)w6GM{ivkM9Vp9ZyvF#YOac^QTmPz4mQib% zf6V@Hmi+_4OSpp+d0{B3R>7b^!!Zu~zHyjvrtjZ!w*(Qv`O!m}<-f&kphMpC`APc# zA^Kxn6eNyiA1#;;23C8b+vBA#(l5xeZDhYmgQ(@@K@~1i(h>~@G9jpf_D?U>*pLj# zLi`=x^^WLu-nyt#yl}C~@BmJM+^0gD^>;@op|m%I9v**nf*#}Hh#G`A6o~WD!`EG3 zhRCAy5@luqj>F^TOgqC-1(IQBA^r#-jOzuD8e{|9#_}a=T2;*&?e03BwncjK%+DH* zi5xG}2bTY=vLC8b_}W}xxWsqh)A6TiR@EtDqES*5#qs2!%eYh?(y8cgCDxK46b#Hu z16X%Fn9E)MxeV9vPvb^gqN8_EWs4h89>$Bn)AjM}8V z5#H{ginj8}zqkpKuU&Nf!HIeP6A4seVF|->FGtjsotY4b5rMvdh$?af9O4V7RmTN2 zYbdmEkfbJhmN71p>daT=HR&$C zj8%b&H)kXy!;a6*e$5J^01j~HWA{X$e+B>P?v>k{t`^+$Vjw3;S#1wLU?Nj@{U`^> z7Si-ef+{MKD&j9gvu0BgEr`E$k6Ci-U06g^|FC}-jE>RVgx!8_f;w}`3s6j@*(^=m z%z*$EIMC)ZNPZFDca?0k!|fDOJ&hAP4UKpM?Cx3h$6jPM^##Gcv`u0sP!E+2(O4$I}0W7|wHu;Y{$w($><0t7^;!e@5u>-`>1{f=`u*smdRLX(Su@fO8<@oOfS+pw-0L# z#Pj-UqArxfeRc~Td?!UP!zOQK$JkPv1b%cD|*FJs)EkO;xT4AR*}2#l-pT zux-~r?kQbDUtPL8{Bddx%-ChHCB08!N9z732a|0x#K!Jnee#C5Bl^FVuK!>-o*@2m z?c_6`RA8iTFwr9uJRSQ}C!;p(55YCSOtr@NwzBQ^+?nAco^;`>;#d33)NdG-C-qX& zY+B&VGcOQ&)32yY{W7TD@#u8=Ye4{ZL9 zfE8yGJ(qJZukh;}TLrq~Xkx|(HpV;_K#xGyb-_>PwEVD$fPKNyMVm~ujMBj>8R{l9 zM@$g#JveeOsf7munh?K_lp+0nOfBV;1h#iDfA%4e0LQ}-6zI4IuLFBzHy`B8xy&pb zi4DjvUtBqDQ}8rk^bY~g=?qbj`EkX=6H1b66V9*9wE_%IP*Ay@Qw~% z5=eJ(gIMW7uEm_E4`0eOR{KZfQOy@6#rD0Y;jt@SJrC64kGTj}U&eAw{bXBVN-;#l zkM@I?PYCQoDurdU!!hEmO@$-s;8ZyAk1|WJ11=J$ujv%udOYHKKeH3`+)vKU!U#gm z+u2xdXr|4HNDL$X64-0YY-KXMaBeu$o@Lunrsttw&SKZ=?wHCx(~g+QuS_r3`iiSn zI?O!ta`0__&tzS_ZUQn2`qIAAC4}Zp`l#snYow_poprk`gtnM{*sXj^K zbMmxOSueacc@(ju{pUO^nN=*y{dBM!EOzM}4c`~>I*M4FBm>E2|EqPt#_DQFSiKrG z2)fK-?ISr~Kac6E>UpSBQ>12pRRR}M>1#a`F{-)sckNeLGtIuT~B`?-SUn{hopy zLMboN08Yu8-t3Lf$@AT(TIqU4UOv5T>*Nb$R2VI?qUmFD$mtkYHq2n4$p2=Q#d$9f zgMyx0pNnOBF0HILcZ)PSjk``{BUiXxVcj&L3|BOUQ{s|=~;1|o&_XgQg> z7<#cfo$e3pgriEbABD(I0G{i-=rcp_w=J~@#YO;O2p2TxjQ?F^*7U;>h)>NgcqL8T z^V&IRo2uI^YghgY*sry-2_w=awd(VpVLdA2ngUMKvIe%wg7LwOodQ9=t`c!m<(1)m zb-EZV?t>4@@Fsei25Z@m0eu}-#r%{MT-@vJvPEo3U)MLtftaHVuXBwN zn1yc^n^}1}TK$(&p~8ri3cV+)yCnq*hX6<@gWaS&&WU#Sn}+sjxfZd5ryKHl07C5s3}xJQaQ%jhN|r#M%XD<3Mi&Ua3fNf40yJekJi2| zzu+DSUWxr4zc%tg&#`2tDmJ%H|G>Ru=g=dzYVL*Q4y ziOC7i6nl1v@w_nSk=%yB*yPZS9T=HuL%|=vw;N0`F5HOxJa35*@G_odNe+%LY$K2g zT;Q^-50W2!bg;xmuv9Mr7^_Gz^GXbzlON;yO@$?sNkNt#N2J6t_yaX|CRo-FYhShh zl9Yr>97hr$)lC8g5n|xvy)X+-9PmQ4?ZLDz>WK2N4l}efD5tGeLEzSRQkKOmM|C29 zxASvyCGHk5(cNc~AY`6+W*oE(RW*`1>wU0T0tebZnmRUCov@$uMrEqCRciBAX%Wy3 zpOz=Ra(9LAmAp0XBZnMDH9lo#UZ^{(gwf`XtRA@sGNurA_?^hH8%LQqPGG?AvOS86DV=n6!T zUIHO2MFpg&L^_C}XQ_fAkbB@ zOV0)~CCGaF@#2h}4tsd2xTYg0=GR5`LN%+~Ei8vR7 z2op^aJ%P4yEnjZCyc7b|+8JH&?+9KO$2$=W+i!gw;ET8&s%k!askj>u&(ngQ<>N1j z@Xa(YX;#WkmtP<(FS+|pj9XebJ9Az|9MNB{KfI}1KaqCFh3&bARI~s^pwy+Ap86P9 z{e{Ys!U6ZnnTvxSyg?5rIE*VgC4cHC95YA|CrI16tL#6i2Bpv#?ASZ@^pQDUDPF&> zTXksCEWmA`$WvKI0Wj`(C}5obBDJ=JiDm{M?mMf}HOSk-MXHIuk?aJ!f>O=oTNd|- zrdfFDf4Z-0-jRS4Gp!;Z!-zvvT}tj zT*4mf)T>X*UMYm{DwJ9vC^%bB6{?_TkYNWFEd$y4&olZwe4~GftrAPDJPV~bUYS|$ zE!I&higWOI!QppgEFXwd5tZVr(QStH%l1tYoWu>GNDo#2XF`BrpZH;)mWq7u?(g(xi zv%+zbCSv|F#`GfuI4W!}3=Xr5yKy7l&0^xBsrr^)G=faB1z z>0NKn-Co4|MC+c<3{X8Iwp8f#?wnN%T1=9GwzyJ8a~s)y|MSWHYOfYIC3S^YrWP<5 zY7vpXCi>|7RV+3;?1C~uU?MPGcum6GI7$w7SsBq?%Y+g;Ae&3E09%aG#x#e1sZ$=y z2-DNL_ff9xDnU+G&fT=U6t+O-sCTO+D8##kUo0JEEcc%5T5A5v8F+SF?+iAd9@YP8 zVrX{ZzNTyAWs&|ct5^}YjX%BQw6=1_Nnf2ell3Th%qI$M1C#7!bA(a9Jn_40SOP4z~$R+JanE>nghsA9P}BSvLBTUM@zBkw5^=3TUvuWJ~W zbT2c-jjy^i5ejiYH%dg02t$D^iW&YGY%)KVCVMp#4#Q-a72)IEV@}%}M_%{1`1+9A zow&j?US4l}BZ7C$+_rOU6B&q;2>&pS=zMx=r^~-1-jEEe{WAs#AxKtCfS%m+_2oZoKdu8Y^PNA?onVN_lt=*)m*5MwI)OdsS`Jl&U`(QJn!E_|#I$c{^oZ}c$ynakd8gq} z@9U%55^uydI?mLIj*~00&}fiA@9a$J>f6v9*m)tLVe*m2_1qn6S@_$W@D?(m!_}#^&l2PG{>2te6Dl>XBEW9@aR;4wqY39Np6CkA&a#6s zXyj9gJQhEf>KlFt!Fmxsj!ZMev^MQH?D7Wesf`E{-r2`(@$nJ+P2l3#fj>Hxrp;S> zNI~W@WH*RtC*-@$>XG0k?l^CPJuN@@=LHYEJPa^Q7$>w`C*Cro?@oY(KTfVlYd7P1RdFe>?O030V4Ak5PODsySIgS4ExP76()JN9j5;) z;jihyCmP{hTg`@C?Cfll)s)9&;@@OWg2)^m;Oz;KnS>5K+dO8$E3dzians0dSk7Ez zQcDi^S0oS1T?fVnV?PIZQ^0j2L$2E=y}=&=?0L<|lh?0x($@NTppn6dWa*QSS1Im& z6LmK@Ltm#FS&eHdymyFby+>Zd0OtSi9)nt58FI!eefF{)FSnjMN1A$&#+rNG(Dyae zY2!{9``?ECj$8_l0ji~LJofSD1OA0ytT*iCt_3d0$p$g>UdH|U?Vi!PQSKzq|AI6T zW0Le?F3+QP<8BZ;h`F`FSQ#~~UJLf7_Ma@l@~03dvmn%2jW`{BhYUwHN|$fI$?XB+cA28miL&$PayPzv4{+9j&M`U@IynGzB`btzN>;Z0 z_07@xYSPk_uSaCzVV0@(eg%2M83!&Sw@%K1cm9f9*pxs^{{tULY5;0`uzi?^Z+;lz z{{p8@;Z_+k)DHFHnlSQf!^dF zV&b7gjHJdh^;ck)Oc}CqbBWs9dJu7YNfRk)ei=RI>*^Yjcu&2ii;5#o%%5TRdXbW> z9y?xJz!=!gzscl_1B&g0+St&Y@qe!l1sAtDZ82Gd_7Yi%5JX5sJ5vKn z_-Hc>>Bn)(vO+^KIFY{YJ;lyj>Wc=-;%0k|Mn)DfDBMtcaW&~B#$c^MpEuv1er&l@suH*!x%-{7wP4kE#FA~k0a=bz>pWj4LOfhwpG#ZVGeVmHCzV>8bcK?Vk{ZkO z-Me&j?Zp_GRh7XtC?o=yU*FLA0{xI#A%d7g&?gHG;~>r7jGMb04$KYnMIjgsQJeMi zpfN;kc_}9IQgBe8q!Q6Qa(OW`E2m*W_A2(x0Rm|CRZXm6=NR?thQ3Tr$!(1kk{e>) zU7I9k{Xn{I@5Z7#x-p0sF4w=D;i-wo%bAsl8<(9Ti zylgi({>zX=CoCp<8}vZsSbwN`{=qj99F+Jr69w7KlsTvJ??&{W4~5&{eI;T?h56Yc ze7_7D0QevXUB7?QW2*6I_-6o6_fXw}$#`}1cW2}8=VTVtn}k(^(h>W%OTJA69_Qsl zKC;!u_Z|560Px@hl)P|)8r{i&(EDcqu<{4N9?_PGROE-2{_lhTE#-ew`ELleks9Rr WCFJ+Vc408^bIR +git clone https://github.com/UW-Madison-DSI/ag_forecasting_api.git cd ag_forecasting_api python -m venv .venv From 06f94d8c19e4fdf996d7f437e874eeeb31647f10 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Tue, 12 May 2026 15:04:07 -0500 Subject: [PATCH 22/40] Add Ag Forecasting application with open Lambda --- applications/ag-forecasting-api.md | 122 +---------------------------- 1 file changed, 1 insertion(+), 121 deletions(-) diff --git a/applications/ag-forecasting-api.md b/applications/ag-forecasting-api.md index 36b53e5..adcbd46 100644 --- a/applications/ag-forecasting-api.md +++ b/applications/ag-forecasting-api.md @@ -6,128 +6,8 @@ FastAPI-based ASGI service for crop disease risk forecasting using multi-source ## Overview -The API provides geospatial agricultural intelligence for Wisconsin, combining weather data with validated agronomic models. +The API provides geospatial agricultural intelligence for Wisconsin, combining weather data with validated crop disease forecasting models. -### Key Features -- 🌽 Crop disease risk forecasting (corn & soybean) -- 🌱 Winter rye biomass estimation -- 🌦 Multi-source weather integration (IBM EIS, WiscoNet) -- 📍 Coordinate and station-based queries -- 🗺 GeoJSON outputs for GIS applications -- ⚡ Async batch processing for multi-station analysis - ---- - -## System Architecture - -The system is structured into four main layers: - -- **API Layer (FastAPI)** - Handles incoming requests and routing (`/ibm`, `/wisconet_g`, `/models`) - -- **Data Layer** - - IBM EIS: high-resolution global weather API - - WiscoNet: Wisconsin mesonet station network - -- **Processing Layer** - Weather normalization, unit conversion, GDD calculation, rolling features - -- **Model Layer** - Disease risk models and winter rye biomass model - ---- - -## Core Modules - -- Weather ingestion (IBM + WiscoNet) -- Disease risk modeling -- Winter rye biomass estimation -- Async pipeline orchestration -- GeoJSON response formatting - ---- - -## API Endpoints - -### IBM Forecasting (Coordinates) -`GET /v2/ag_models_wrappers/ibm` - -Returns disease risk + biomass using IBM weather data. - ---- - -### WiscoNet Forecasting (Stations) -`GET /v2/ag_models_wrappers/wisconet_g` - -Returns station-based time-series disease risk and biomass. - ---- - -### Model Metadata -`GET /v2/ag_models_wrappers/models` - -Returns available disease and biomass models. - ---- - -## Disease Models - -- **Tarspot (corn)** – humidity and temperature-based risk -- **Gray Leaf Spot (corn)** – temperature + dew point model -- **Frogeye Leaf Spot (soybean)** – GDD + rainfall model -- **White Mold (soybean)** – precipitation and soil moisture model - ---- - -## Winter Rye Biomass Model - -Predicts dry biomass (lb/acre) using: - -- Growing Degree Days (0°C base) -- Planting date (day-of-year) -- Fall precipitation -- Logistic growth curve - -### Outputs -- Biomass (lb/acre) -- Color class (gray / yellow / green) -- Interpretation message - ---- - -## Data Sources - -### IBM Environmental Intelligence Suite (EIS) -- High-resolution global weather data -- Hourly forecasts and historical data -- Requires authentication - -### WiscoNet -- Wisconsin mesonet (~100 stations) -- Daily weather observations -- Public API access - ---- - -## Response Format - -All outputs are returned as **GeoJSON FeatureCollections**, including: - -- Weather variables -- Disease risk scores -- Biomass predictions -- Station metadata - ---- - -## Performance Features - -- Async multi-station processing -- Cached weather and station data (6h–7d TTL) -- Parallel risk computation -- Optimized data aggregation pipeline - ---- ## Setup From 06c7bb30236feafbede45c8876669d0000ba9358 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Tue, 12 May 2026 15:09:16 -0500 Subject: [PATCH 23/40] Add Ag Forecasting application with open Lambda --- applications/ag-forecasting-api.md | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/applications/ag-forecasting-api.md b/applications/ag-forecasting-api.md index adcbd46..c45c45d 100644 --- a/applications/ag-forecasting-api.md +++ b/applications/ag-forecasting-api.md @@ -1,4 +1,4 @@ -# 🌾 Agricultural Forecasting API +# Agricultural Forecasting API FastAPI-based ASGI service for crop disease risk forecasting using multi-source weather data, developed by the University of Wisconsin–Madison Data Science Institute and integrated with Open-Lambda technology. @@ -7,18 +7,5 @@ FastAPI-based ASGI service for crop disease risk forecasting using multi-source ## Overview The API provides geospatial agricultural intelligence for Wisconsin, combining weather data with validated crop disease forecasting models. - - -## Setup - -```bash -git clone https://github.com/UW-Madison-DSI/ag_forecasting_api.git -cd ag_forecasting_api - -python -m venv .venv -source .venv/bin/activate - -pip install -r requirements.txt - -uvicorn app:app --reload -``` \ No newline at end of file +The tool is now entering its next phase through integration with OpenLambda technology. +For reference, please check the documentation [here](https://github.com/UW-Madison-DSI/ag_forecasting_api.git). From 2018bb37d790f22d84eddd20aa2385caf6ab3733 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Mon, 18 May 2026 15:55:53 -0500 Subject: [PATCH 24/40] ADD blog content --- .../applications/ag-forecasting-api.doctree | Bin 25890 -> 4803 bytes _build/.doctrees/blog/index.doctree | Bin 0 -> 4005 bytes .../blog/post/2026-05-18-hello-world.doctree | Bin 0 -> 3322 bytes _build/.doctrees/environment.pickle | Bin 41111 -> 44464 bytes _build/.doctrees/index.doctree | Bin 15689 -> 15716 bytes _build/html/.buildinfo | 2 +- _build/html/README.html | 22 +- .../applications/ag-forecasting-api.md | 144 +---- _build/html/_sources/blog/index.md | 11 + .../blog/post/2026-05-18-hello-world.md | 13 + _build/html/_static/ablog/tagcloud.css | 36 ++ .../html/applications/ag-forecasting-api.html | 234 +------- _build/html/applications/index.html | 30 +- _build/html/blog.html | 522 +++++++++++++++++ _build/html/blog/2026.html | 526 +++++++++++++++++ _build/html/blog/2026/atom.xml | 46 ++ _build/html/blog/archive.html | 440 +++++++++++++++ _build/html/blog/atom.xml | 46 ++ _build/html/blog/author.html | 440 +++++++++++++++ _build/html/blog/author/openlambda-team.html | 528 ++++++++++++++++++ .../html/blog/author/openlambda-team/atom.xml | 46 ++ _build/html/blog/category.html | 440 +++++++++++++++ _build/html/blog/category/releases.html | 526 +++++++++++++++++ _build/html/blog/category/releases/atom.xml | 46 ++ _build/html/blog/drafts.html | 431 ++++++++++++++ _build/html/blog/index.html | 484 ++++++++++++++++ _build/html/blog/language.html | 440 +++++++++++++++ _build/html/blog/language/en.html | 526 +++++++++++++++++ _build/html/blog/language/en/atom.xml | 46 ++ .../blog/post/2026-05-18-hello-world.html | 517 +++++++++++++++++ _build/html/blog/tag.html | 459 +++++++++++++++ _build/html/blog/tag/announcement.html | 526 +++++++++++++++++ _build/html/blog/tag/announcement/atom.xml | 46 ++ _build/html/blog/tag/openlambda.html | 526 +++++++++++++++++ _build/html/blog/tag/openlambda/atom.xml | 46 ++ _build/html/genindex.html | 5 +- _build/html/index.html | 22 +- _build/html/objects.inv | 5 +- _build/html/search.html | 16 +- _build/html/searchindex.js | 2 +- _build/html/worker.html | 28 +- _config.yml | 34 +- _toc.yml | 6 +- blog/index.md | 11 + blog/post/2026-05-18-hello-world.md | 13 + requirements.txt | 3 +- 46 files changed, 7904 insertions(+), 386 deletions(-) create mode 100644 _build/.doctrees/blog/index.doctree create mode 100644 _build/.doctrees/blog/post/2026-05-18-hello-world.doctree create mode 100644 _build/html/_sources/blog/index.md create mode 100644 _build/html/_sources/blog/post/2026-05-18-hello-world.md create mode 100644 _build/html/_static/ablog/tagcloud.css create mode 100644 _build/html/blog.html create mode 100644 _build/html/blog/2026.html create mode 100644 _build/html/blog/2026/atom.xml create mode 100644 _build/html/blog/archive.html create mode 100644 _build/html/blog/atom.xml create mode 100644 _build/html/blog/author.html create mode 100644 _build/html/blog/author/openlambda-team.html create mode 100644 _build/html/blog/author/openlambda-team/atom.xml create mode 100644 _build/html/blog/category.html create mode 100644 _build/html/blog/category/releases.html create mode 100644 _build/html/blog/category/releases/atom.xml create mode 100644 _build/html/blog/drafts.html create mode 100644 _build/html/blog/index.html create mode 100644 _build/html/blog/language.html create mode 100644 _build/html/blog/language/en.html create mode 100644 _build/html/blog/language/en/atom.xml create mode 100644 _build/html/blog/post/2026-05-18-hello-world.html create mode 100644 _build/html/blog/tag.html create mode 100644 _build/html/blog/tag/announcement.html create mode 100644 _build/html/blog/tag/announcement/atom.xml create mode 100644 _build/html/blog/tag/openlambda.html create mode 100644 _build/html/blog/tag/openlambda/atom.xml create mode 100644 blog/index.md create mode 100644 blog/post/2026-05-18-hello-world.md diff --git a/_build/.doctrees/applications/ag-forecasting-api.doctree b/_build/.doctrees/applications/ag-forecasting-api.doctree index 5247539c52808e581dc25352acf1642ca4252d3b..610d4d3a00e987fde7452ba54c55b4c21def2933 100644 GIT binary patch delta 1219 zcmbW0-%Aux6vw@@JG<->2|c)xyUR^5*4&*n3X3Sv2wkx>&`>MUyEE54qq}pb`Jwp` zTMt3fgy@~{MS^;cAbco@q6mTlpL*_3=zr+WuB%3A+1s5v=X=jNpYJ)(zoJj=@;&*< znCt!4@zT2&^DLcf;yG2E1mHhRw+*KkvU`Fop$UvTyrgpV4MNC~0!5wu^GQyNcK}W)QY+7udUx-fq zm4W}juXAgKiGU=eh9Es8c(!;bzR%CGe`8lYFuZ+o{;41_1L?u0TD?jg`!CdIg?oEp z-!oIpi&=E*8K3)&!Scd^PmTGnf9%k+`Kj=UvKJ9b*V29O-2d9?yU+=@MOU${39tE5 zcSPA;Gbi0jtPxb;Z<~8il)spuD7lfi@l2B7%f`D~-$Tcw?$eE;gJZp9Xq}BBo+k;u zIh~ed#D7eu+9P6fw!1}L4V5@;ixPq8Y#;z~MhYYTlq94U#9xz47S>@6R$$|0 literal 25890 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 CZ6Ra; literal 0 HcmV?d00001 diff --git a/_build/.doctrees/blog/post/2026-05-18-hello-world.doctree b/_build/.doctrees/blog/post/2026-05-18-hello-world.doctree new file mode 100644 index 0000000000000000000000000000000000000000..99aa0628b391110986f9c041c886c4918d5ddc63 GIT binary patch literal 3322 zcmbVOTW=gS6mFVslHF`Jmo@>ZP1y>SrXstWMqDZ$0jZ#rAaUzcHS*4Q*Crl&uszM@ zAyWHLsge9v^T7Y$@(tFi2&-|(1aaB!@jmmXQy}JaCm~oM4D*a>c8iCz%VcNs@i-yLQ zD>;77Dr|u*KK47T>ME97L8q?V)@M`*wcGqMqw*n1y9sH2EL7iz7kF^x8#)M%GiRbwfBDO-u)H}0c#yAEs}Pc zcy^uD*$p|NGEUDVk&+npq8^1yAD*$n9~v)>BY@FYmuaSclc``?p6gm@|q^fgjq*%W~W zZEmX&vfG?UX%3}K*-fT?sH04)zNV%`O~oopgg?0C zY9k(+;Ft%$=UgMsb--jaMqqtJDUs-w47HZaKHARuxR3O-l9tNEyM^zF$N|A|BU(_o z&2sAx+3KOI_NkfE4Uf4NIIUO} zM*-F07N%5Svp(@|qX#jeR;DgrxRub~WS&NYfB^r(H4Iuw76D)d1|aZyNdaUEN^}fB zN2AUHeZvRCR&(g;nr2GdNYEz~;k@i>jEM2E;@0VaBZ`*T+>Dqiu9DDh-iNxzG0_rH z1c#<11*M8~#5A}R?BfzKi_mmb0xs{Wx$U*?w*XS_Zk)f2sMbnH3@{c{BLl(I*m}2G zMt(|4rI6y?_RP(U2zKHcrO=51qo+5{U(CF8Yrz2&o?(cOfJ5G`2qODA=~IL|!TB1y?91^piIQSGZGKvl2ETlRJS>`y+Q}NL5JB?Kv~t2E+CXx z<`0(KHVQJ0#>gBy5ETQhdj(M1nO#WE{~B= zF&Tz-JI2T(F%n;b4N)#ah}TDX1{GoFDHfSw4>&{hsF=$hYGBwDHbR#$d3T15r=fO* zA|(>TMsnm)GHI74fbR(`V3b;we_jKrFx6L-xS9Y9QE? z4B0&O?BSVVxA6Y~s~fj6UDw6ym6!t^AytrAQbPM0@s%l^rj&eG3V?&OtHc;81?#mL z;+VU7PGWVWwRp5~PCmwvwjOy2HOCdYf(#Kge=EO2oxcFz-(RoB-9w_FX8-i z{}mbqR#vnetl9?HC>4%->^buCm|T?iGMBN)lK`iF*w<@G7z4wO85SH@OHT~urpU2i JoO-O(e*<^!9<~4g literal 0 HcmV?d00001 diff --git a/_build/.doctrees/environment.pickle b/_build/.doctrees/environment.pickle index 20d9255f4d38c495446a2c101729b06ad2470693..39ae491e80f9e93977bb607a765d95e687c67ef6 100644 GIT binary patch literal 44464 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 diff --git a/_build/.doctrees/index.doctree b/_build/.doctrees/index.doctree index af5eec76ca27ffa80bf27007e5951ac8f17bb61d..4a7d57ec91592219724200e1c703fceae3e534fb 100644 GIT binary patch delta 195 zcmX?E^`wfWfpu!+MwS*M-X0dGoc#1DJzPmZYI41i8dFx&$s delta 104 zcmaD-b+U@3fpx0gMwS+%$@7e4Cm%4{#n`gA+L)Q~=;j);U(AfmlRsEVOzyXmV`QAX z4oEUhK5M1KC=3*}0E%c@n=&#?j<=Rz6q;ONt;IHzg@GY!%H$Q+8jLe1U$hoyoU-|) Hbu}XZsP-dG diff --git a/_build/html/.buildinfo b/_build/html/.buildinfo index 45d769d..a4fb4ae 100644 --- a/_build/html/.buildinfo +++ b/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: ff326529dec566ff85861a347816d852 +config: fe0d8d89ecad092c9e1a52c98b324dc8 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_build/html/README.html b/_build/html/README.html index 60718d9..796377e 100644 --- a/_build/html/README.html +++ b/_build/html/README.html @@ -59,9 +59,16 @@ - + - + + + @@ -175,8 +182,11 @@

diff --git a/_build/html/_sources/applications/ag-forecasting-api.md b/_build/html/_sources/applications/ag-forecasting-api.md index 68e08e6..c45c45d 100644 --- a/_build/html/_sources/applications/ag-forecasting-api.md +++ b/_build/html/_sources/applications/ag-forecasting-api.md @@ -1,145 +1,11 @@ -# 🌾 Agricultural Forecasting API +# Agricultural Forecasting API -FastAPI-based service for **crop disease risk forecasting** and **winter rye biomass estimation** using multi-source weather data. -Developed by the University of Wisconsin–Madison Data Science Institute. +FastAPI-based ASGI service for crop disease risk forecasting using multi-source weather data, developed by the University of Wisconsin–Madison Data Science Institute and integrated with Open-Lambda technology. --- ## Overview -The API provides geospatial agricultural intelligence for Wisconsin, combining weather data with validated agronomic models. - -### Key Features -- 🌽 Crop disease risk forecasting (corn & soybean) -- 🌱 Winter rye biomass estimation -- 🌦 Multi-source weather integration (IBM EIS, WiscoNet, NOAA) -- 📍 Coordinate and station-based queries -- 🗺 GeoJSON outputs for GIS applications -- ⚡ Async batch processing for multi-station analysis - ---- - -## System Architecture - -The system is structured into four main layers: - -- **API Layer (FastAPI)** - Handles incoming requests and routing (`/ibm`, `/wisconet_g`, `/models`) - -- **Data Layer** - - IBM EIS: high-resolution global weather API - - WiscoNet: Wisconsin mesonet station network - -- **Processing Layer** - Weather normalization, unit conversion, GDD calculation, rolling features - -- **Model Layer** - Disease risk models and winter rye biomass model - ---- - -## Core Modules - -- Weather ingestion (IBM + WiscoNet) -- Disease risk modeling -- Winter rye biomass estimation -- Async pipeline orchestration -- GeoJSON response formatting - ---- - -## API Endpoints - -### IBM Forecasting (Coordinates) -`GET /v2/ag_models_wrappers/ibm` - -Returns disease risk + biomass using IBM weather data. - ---- - -### WiscoNet Forecasting (Stations) -`GET /v2/ag_models_wrappers/wisconet_g` - -Returns station-based time-series disease risk and biomass. - ---- - -### Model Metadata -`GET /v2/ag_models_wrappers/models` - -Returns available disease and biomass models. - ---- - -## Disease Models - -- **Tarspot (corn)** – humidity and temperature-based risk -- **Gray Leaf Spot (corn)** – temperature + dew point model -- **Frogeye Leaf Spot (soybean)** – GDD + rainfall model -- **White Mold (soybean)** – precipitation and soil moisture model - ---- - -## Winter Rye Biomass Model - -Predicts dry biomass (lb/acre) using: - -- Growing Degree Days (0°C base) -- Planting date (day-of-year) -- Fall precipitation -- Logistic growth curve - -### Outputs -- Biomass (lb/acre) -- Color class (gray / yellow / green) -- Interpretation message - ---- - -## Data Sources - -### IBM Environmental Intelligence Suite (EIS) -- High-resolution global weather data -- Hourly forecasts and historical data -- Requires authentication - -### WiscoNet -- Wisconsin mesonet (~100 stations) -- Daily weather observations -- Public API access - ---- - -## Response Format - -All outputs are returned as **GeoJSON FeatureCollections**, including: - -- Weather variables -- Disease risk scores -- Biomass predictions -- Station metadata - ---- - -## Performance Features - -- Async multi-station processing -- Cached weather and station data (6h–7d TTL) -- Parallel risk computation -- Optimized data aggregation pipeline - ---- - -## Setup - -```bash -git clone -cd ag_forecasting_api - -python -m venv .venv -source .venv/bin/activate - -pip install -r requirements.txt - -uvicorn app:app --reload -``` \ No newline at end of file +The API provides geospatial agricultural intelligence for Wisconsin, combining weather data with validated crop disease forecasting models. +The tool is now entering its next phase through integration with OpenLambda technology. +For reference, please check the documentation [here](https://github.com/UW-Madison-DSI/ag_forecasting_api.git). diff --git a/_build/html/_sources/blog/index.md b/_build/html/_sources/blog/index.md new file mode 100644 index 0000000..ebc9baf --- /dev/null +++ b/_build/html/_sources/blog/index.md @@ -0,0 +1,11 @@ +# OpenLambda Blog + + News, releases, and technical deep-dives from the OpenLambda project. + +```{postlist} 10 + :format: "{title} — {author}, {date}" + :date: "%B %d, %Y" + :list-style: circle + :excerpts: + :sort: +``` \ No newline at end of file diff --git a/_build/html/_sources/blog/post/2026-05-18-hello-world.md b/_build/html/_sources/blog/post/2026-05-18-hello-world.md new file mode 100644 index 0000000..7a403e3 --- /dev/null +++ b/_build/html/_sources/blog/post/2026-05-18-hello-world.md @@ -0,0 +1,13 @@ +--- +blogpost: true +date: 2026-05-18 +author: open-lambda +category: Releases +tags: announcement, openlambda +language: en +--- + +# Hello, OpenLambda Blog + +Welcome to the new OpenLambda blog. We'll use this space to share release +notes, performance experiments, and design discussions. \ No newline at end of file diff --git a/_build/html/_static/ablog/tagcloud.css b/_build/html/_static/ablog/tagcloud.css new file mode 100644 index 0000000..7a6d07e --- /dev/null +++ b/_build/html/_static/ablog/tagcloud.css @@ -0,0 +1,36 @@ +ul.ablog-cloud { + list-style: none; + overflow: auto; +} + +ul.ablog-cloud li { + float: left; + height: 20pt; + line-height: 18pt; + margin-right: 5px; +} + +ul.ablog-cloud a { + text-decoration: none; + vertical-align: middle; +} + +li.ablog-cloud-1 { + font-size: 80%; +} + +li.ablog-cloud-2 { + font-size: 95%; +} + +li.ablog-cloud-3 { + font-size: 110%; +} + +li.ablog-cloud-4 { + font-size: 125%; +} + +li.ablog-cloud-5 { + font-size: 140%; +} diff --git a/_build/html/applications/ag-forecasting-api.html b/_build/html/applications/ag-forecasting-api.html index 9611812..8ecb7b3 100644 --- a/_build/html/applications/ag-forecasting-api.html +++ b/_build/html/applications/ag-forecasting-api.html @@ -8,7 +8,7 @@ - 🌾 Agricultural Forecasting API — OpenLambda + Agricultural Forecasting API — OpenLambda @@ -60,9 +60,16 @@ - + - + + + @@ -174,8 +181,11 @@ diff --git a/_build/html/applications/index.html b/_build/html/applications/index.html index 4511aba..8fb6984 100644 --- a/_build/html/applications/index.html +++ b/_build/html/applications/index.html @@ -60,10 +60,17 @@ - - + + - + + + @@ -175,8 +182,11 @@ @@ -388,12 +400,12 @@

Want to deploy FastAPI apps on OpenLambda? Just ASGI us how.

previous

-

Worker

+

OpenLambda Blog

Want to deploy FastAPI apps on OpenLambda? Just ASGI us how.

next

-

🌾 Agricultural Forecasting API

+

Agricultural Forecasting API

diff --git a/_build/html/blog.html b/_build/html/blog.html new file mode 100644 index 0000000..6de3d01 --- /dev/null +++ b/_build/html/blog.html @@ -0,0 +1,522 @@ + + + + + + + + + + All Posts — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

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

+ + All Posts + +

+ +
+

+ Hello, OpenLambda Blog +

+ +

Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

+

+ + + +

+ Read more ... +

+
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/2026.html b/_build/html/blog/2026.html new file mode 100644 index 0000000..10287ab --- /dev/null +++ b/_build/html/blog/2026.html @@ -0,0 +1,526 @@ + + + + + + + + + + Posted in 2026 — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

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

+ + + + + Posted in 2026 + +

+ +
+

+ Hello, OpenLambda Blog +

+ +

Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

+

+ + + +

+ Read more ... +

+
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/2026/atom.xml b/_build/html/blog/2026/atom.xml new file mode 100644 index 0000000..f2812f9 --- /dev/null +++ b/_build/html/blog/2026/atom.xml @@ -0,0 +1,46 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posted in 2026 + 2026-05-18T20:49:10.786309+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-hello-world.html + Hello, OpenLambda Blog + 2026-05-18T00:00:00-05:00 + + OpenLambda Team + + <p class="ablog-post-excerpt"><p>Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions. + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/archive.html b/_build/html/blog/archive.html new file mode 100644 index 0000000..2c6fc4e --- /dev/null +++ b/_build/html/blog/archive.html @@ -0,0 +1,440 @@ + + + + + + + + + + All posts — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + + + + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/atom.xml b/_build/html/blog/atom.xml new file mode 100644 index 0000000..7d4b528 --- /dev/null +++ b/_build/html/blog/atom.xml @@ -0,0 +1,46 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog + 2026-05-18T20:49:10.778644+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-hello-world.html + Hello, OpenLambda Blog + 2026-05-18T00:00:00-05:00 + + OpenLambda Team + + <p class="ablog-post-excerpt"><p>Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./." + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions. + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/author.html b/_build/html/blog/author.html new file mode 100644 index 0000000..dea6f06 --- /dev/null +++ b/_build/html/blog/author.html @@ -0,0 +1,440 @@ + + + + + + + + + + Authors — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + + + + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/author/openlambda-team.html b/_build/html/blog/author/openlambda-team.html new file mode 100644 index 0000000..083accd --- /dev/null +++ b/_build/html/blog/author/openlambda-team.html @@ -0,0 +1,528 @@ + + + + + + + + + + Posts by OpenLambda Team — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

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

+ + + + + Posts by + OpenLambda Team + + +

+ +
+

+ Hello, OpenLambda Blog +

+ +

Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

+

+ + + +

+ Read more ... +

+
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/author/openlambda-team/atom.xml b/_build/html/blog/author/openlambda-team/atom.xml new file mode 100644 index 0000000..60a39f8 --- /dev/null +++ b/_build/html/blog/author/openlambda-team/atom.xml @@ -0,0 +1,46 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts by OpenLambda Team + 2026-05-18T20:49:10.782865+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-hello-world.html + Hello, OpenLambda Blog + 2026-05-18T00:00:00-05:00 + + OpenLambda Team + + <p class="ablog-post-excerpt"><p>Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/author" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions. + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/category.html b/_build/html/blog/category.html new file mode 100644 index 0000000..16f1f79 --- /dev/null +++ b/_build/html/blog/category.html @@ -0,0 +1,440 @@ + + + + + + + + + + Categories — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + + + + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/category/releases.html b/_build/html/blog/category/releases.html new file mode 100644 index 0000000..8f65cf3 --- /dev/null +++ b/_build/html/blog/category/releases.html @@ -0,0 +1,526 @@ + + + + + + + + + + Posts in Releases — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

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

+ + + + + Posts in Releases + +

+ +
+

+ Hello, OpenLambda Blog +

+ +

Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

+

+ + + +

+ Read more ... +

+
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/category/releases/atom.xml b/_build/html/blog/category/releases/atom.xml new file mode 100644 index 0000000..27ec46d --- /dev/null +++ b/_build/html/blog/category/releases/atom.xml @@ -0,0 +1,46 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts in Releases + 2026-05-18T20:49:10.785174+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-hello-world.html + Hello, OpenLambda Blog + 2026-05-18T00:00:00-05:00 + + OpenLambda Team + + <p class="ablog-post-excerpt"><p>Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/category" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions. + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/drafts.html b/_build/html/blog/drafts.html new file mode 100644 index 0000000..c2ea681 --- /dev/null +++ b/_build/html/blog/drafts.html @@ -0,0 +1,431 @@ + + + + + + + + + + Drafts — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

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

+ + Drafts + +

+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/index.html b/_build/html/blog/index.html new file mode 100644 index 0000000..b634f81 --- /dev/null +++ b/_build/html/blog/index.html @@ -0,0 +1,484 @@ + + + + + + + + + + + OpenLambda Blog — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

OpenLambda Blog

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

OpenLambda Blog#

+

News, releases, and technical deep-dives from the OpenLambda project.

+
    +
  • Hello, OpenLambda BlogOpenLambda Team, May 18, 2026

    +

    Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions. + +

    +
  • +
+
+
+
+ + + +
+ +
+ +
+ + + + + + + + +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/language.html b/_build/html/blog/language.html new file mode 100644 index 0000000..dec5673 --- /dev/null +++ b/_build/html/blog/language.html @@ -0,0 +1,440 @@ + + + + + + + + + + Languages — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + + + + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/language/en.html b/_build/html/blog/language/en.html new file mode 100644 index 0000000..23c0b6e --- /dev/null +++ b/_build/html/blog/language/en.html @@ -0,0 +1,526 @@ + + + + + + + + + + Posts in en — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

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

+ + + + + Posts in en + +

+ +
+

+ Hello, OpenLambda Blog +

+ +

Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

+

+ + + +

+ Read more ... +

+
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/language/en/atom.xml b/_build/html/blog/language/en/atom.xml new file mode 100644 index 0000000..6a6762f --- /dev/null +++ b/_build/html/blog/language/en/atom.xml @@ -0,0 +1,46 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts in en + 2026-05-18T20:49:10.784103+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-hello-world.html + Hello, OpenLambda Blog + 2026-05-18T00:00:00-05:00 + + OpenLambda Team + + <p class="ablog-post-excerpt"><p>Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/language" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions. + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/post/2026-05-18-hello-world.html b/_build/html/blog/post/2026-05-18-hello-world.html new file mode 100644 index 0000000..bb9539d --- /dev/null +++ b/_build/html/blog/post/2026-05-18-hello-world.html @@ -0,0 +1,517 @@ + + + + + + + + + + + Hello, OpenLambda Blog — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

Hello, OpenLambda Blog

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

Hello, OpenLambda Blog#

+

Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

+
+ + + +
+ +
+ + + +   + + + +
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/tag.html b/_build/html/blog/tag.html new file mode 100644 index 0000000..76f4f99 --- /dev/null +++ b/_build/html/blog/tag.html @@ -0,0 +1,459 @@ + + + + + + + + + + Tags — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

+ +
+
+ +
+
+
+ + + + + + + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/tag/announcement.html b/_build/html/blog/tag/announcement.html new file mode 100644 index 0000000..d5f233d --- /dev/null +++ b/_build/html/blog/tag/announcement.html @@ -0,0 +1,526 @@ + + + + + + + + + + Posts tagged announcement — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

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

+ + + + + Posts tagged announcement + +

+ +
+

+ Hello, OpenLambda Blog +

+ +

Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

+

+ + + +

+ Read more ... +

+
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/tag/announcement/atom.xml b/_build/html/blog/tag/announcement/atom.xml new file mode 100644 index 0000000..c817040 --- /dev/null +++ b/_build/html/blog/tag/announcement/atom.xml @@ -0,0 +1,46 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts tagged announcement + 2026-05-18T20:49:10.787417+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-hello-world.html + Hello, OpenLambda Blog + 2026-05-18T00:00:00-05:00 + + OpenLambda Team + + <p class="ablog-post-excerpt"><p>Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/tag" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions. + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/tag/openlambda.html b/_build/html/blog/tag/openlambda.html new file mode 100644 index 0000000..97cef07 --- /dev/null +++ b/_build/html/blog/tag/openlambda.html @@ -0,0 +1,526 @@ + + + + + + + + + + Posts tagged openlambda — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+
+
+
+ +
+ +
+ + + + + +
+
+ + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ +
+
+ +
+
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+ + + +
+

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

+ + + + + Posts tagged openlambda + +

+ +
+

+ Hello, OpenLambda Blog +

+ +

Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

+

+ + + +

+ Read more ... +

+
+
+ +
+ +
+ + + + + + +
+ +
+
+
+ +
+ + + + +
+
+ + +
+ + +
+
+
+ + + + + +
+
+ + \ No newline at end of file diff --git a/_build/html/blog/tag/openlambda/atom.xml b/_build/html/blog/tag/openlambda/atom.xml new file mode 100644 index 0000000..309ee8c --- /dev/null +++ b/_build/html/blog/tag/openlambda/atom.xml @@ -0,0 +1,46 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts tagged openlambda + 2026-05-18T20:49:10.788423+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-hello-world.html + Hello, OpenLambda Blog + 2026-05-18T00:00:00-05:00 + + OpenLambda Team + + <p class="ablog-post-excerpt"><p>Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/tag" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions. + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/genindex.html b/_build/html/genindex.html index 92eefb8..1e02632 100644 --- a/_build/html/genindex.html +++ b/_build/html/genindex.html @@ -175,7 +175,10 @@ diff --git a/_build/html/index.html b/_build/html/index.html index 59834ad..1a706c3 100644 --- a/_build/html/index.html +++ b/_build/html/index.html @@ -62,9 +62,16 @@ - + - + + + @@ -179,7 +186,10 @@ @@ -341,8 +351,7 @@

Contents

diff --git a/_build/html/objects.inv b/_build/html/objects.inv index 1561300..95991da 100644 --- a/_build/html/objects.inv +++ b/_build/html/objects.inv @@ -2,6 +2,5 @@ # Project: Project name not set # Version: # The remainder of this file is compressed using zlib. -xڅAJ09*nub -&i4 I؝pޛxOCSTf{{$mʫj!Ka9.;[pB|A56P {0ШH ӊcTքsœ1DedN+'iJt - + - + + + @@ -177,7 +184,10 @@ diff --git a/_build/html/searchindex.js b/_build/html/searchindex.js index a654b61..4df1dfc 100644 --- a/_build/html/searchindex.js +++ b/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"1. Clone the repo and copy these files in": [[0, "clone-the-repo-and-copy-these-files-in"]], "API Endpoints": [[1, "api-endpoints"]], "Applications": [[2, null]], "Configuration": [[4, "configuration"]], "Core Modules": [[1, "core-modules"]], "Data Sources": [[1, "data-sources"]], "Deploying Multiple Workers": [[4, "deploying-multiple-workers"]], "Disease Models": [[1, "disease-models"]], "File Structure": [[0, "file-structure"]], "Further Reading": [[4, "further-reading"]], "IBM Environmental Intelligence Suite (EIS)": [[1, "ibm-environmental-intelligence-suite-eis"]], "IBM Forecasting (Coordinates)": [[1, "ibm-forecasting-coordinates"]], "Key Features": [[1, "key-features"]], "License": [[3, "license"]], "Local Preview": [[0, "local-preview"]], "Model Metadata": [[1, "model-metadata"]], "One-Time Setup (do this once per repo)": [[0, "one-time-setup-do-this-once-per-repo"]], "OpenLambda": [[3, null]], "OpenLambda GitHub Pages \u2014 MyST Markdown Site": [[0, null]], "Outputs": [[1, "outputs"]], "Overview": [[1, "overview"], [4, "overview"]], "Performance Features": [[1, "performance-features"]], "Related Publications": [[3, "related-publications"]], "Response Format": [[1, "response-format"]], "Setup": [[1, "setup"]], "Starting the Worker": [[4, "starting-the-worker"]], "System Architecture": [[1, "system-architecture"]], "Want to deploy FastAPI apps on OpenLambda? Just ASGI us how.": [[2, "want-to-deploy-fastapi-apps-on-openlambda-just-asgi-us-how"]], "Winter Rye Biomass Model": [[1, "winter-rye-biomass-model"]], "WiscoNet": [[1, "wisconet"]], "WiscoNet Forecasting (Stations)": [[1, "wisconet-forecasting-stations"]], "Worker": [[4, null]], "\ud83c\udf3e Agricultural Forecasting API": [[1, null]]}, "docnames": ["README", "applications/ag-forecasting-api", "applications/index", "index", "worker"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "applications/ag-forecasting-api.md", "applications/index.md", "index.md", "worker.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [2, 4], "0": 1, "003663": [], "031": [], "05": [], "09": [], "10": [], "100": 1, "1049": [], "11": [], "12": [], "1234": [], "14": [], "15": [], "16": 3, "17": 3, "18": 3, "20": [], "2000": [], "2024": [], "2025": [], "21": [], "24": 3, "28": [], "2878": [], "30": [], "31": [], "3250": [], "35": [], "366": [], "38": [], "404": [], "423": [], "43": [], "45": [], "4500": [], "4567": [], "5": [], "50": [], "6": [], "6h": 1, "7": [], "7d": 1, "8": [], "8000": [], "8080": 4, "85": [], "89": [], "9": [], "90": [], "92": [], "999": [], "A": [2, 4], "By": [], "For": [], "In": 2, "It": 4, "No": 4, "On": 2, "That": [], "The": [1, 2, 3, 4], "To": [2, 4], "With": 3, "__init__": [], "_annotate_winter_rye_biomass": [], "_build": 0, "_build_daili": [], "_compute_winter_rye_biomass": [], "_config": 0, "_doi": [], "_fall": [], "_fetch_raw_hourli": [], "_run_pipelin": [], "_toc": 0, "_total": [], "about": 3, "abov": [], "aboveground": [], "absolut": [], "access": 1, "accumul": [], "acquisit": [], "acr": 1, "action": 0, "activ": 1, "ad": [], "adapt": [], "add": [0, 2], "address": [2, 4], "adjust": 2, "after": 4, "ag": 2, "ag_api": [], "ag_forecast": [], "ag_forecasting_api": 1, "ag_models_wrapp": 1, "aggreg": 1, "agricultur": 2, "agronom": 1, "ahead": 2, "aiohttp": [], "air": [], "al": 3, "all": [0, 1], "alongsid": 2, "alpin": [], "alreadi": 4, "also": [2, 3], "alten": [], "altn": [], "america": [], "an": [2, 3], "analysi": 1, "annot": [], "apach": 3, "api": 2, "api_cach": [], "api_kei": [], "apotheci": [], "app": 1, "app_v1": [], "appli": [], "applic": 1, "approach": [2, 3, 4], "ar": [1, 2, 3, 4], "arithmet": [], "arriv": 4, "asgi": [], "assess": [], "assumpt": [], "async": [1, 2], "atc": 3, "authent": 1, "author": 3, "auto": 0, "automat": 0, "avail": 1, "averag": [], "avg": [], "await": [], "awar": [], "axi": [], "b_": [], "b_0": [], "back": 4, "backend": 4, "backward": [], "balanc": [3, 4], "base": [1, 2, 3], "basic": [], "batch": 1, "becaus": 2, "behind": 4, "believ": 2, "benefici": 2, "better": 2, "between": 4, "bill": 2, "bin": [1, 4], "binari": 4, "biomass_color": [], "biomass_lb_acr": [], "biomass_messag": [], "biomass_result": [], "bit": 3, "block": 2, "book": 0, "boss": [3, 4], "both": 2, "branch": [], "broader": 2, "broadli": 2, "browser": 0, "build": [0, 2, 4], "built": [], "bulk": [], "bundl": 0, "busi": [], "c": 1, "cach": 1, "calc": [], "calcul": 1, "calculate_tarspot_risk": [], "calculate_winter_rye_biomass": [], "call": 4, "caller": 4, "can": [2, 3, 4], "cap": [], "capabl": [], "case": [], "categori": [], "cd": [0, 1], "cdn": [], "cdot": [], "central": [3, 4], "cercospora": [], "chang": 2, "chapter": [], "characterist": [], "check": 4, "chicago": [], "choic": 2, "chunk": [], "citi": [], "class": 1, "classif": [], "classifi": [], "client": [], "clone": 1, "cloud comput": 3, "cluster": [3, 4], "cmd": [], "co": 2, "coeffici": [], "col": [], "cold": 4, "color": 1, "columbia": [], "column": [], "com": 0, "combin": 1, "commit": 0, "compat": [], "compon": 4, "comput": [1, 2, 3], "compute_risks_in_parallel": [], "concern": 2, "concurr": 2, "conda": [], "config": 4, "configur": [], "confirm": [], "connect": [], "consolid": 2, "constant": [], "constraint": 2, "contact": [], "contain": [3, 4], "container": [], "content": 0, "context": [], "continu": 2, "contribut": 2, "convers": 1, "convert": [], "coordin": 4, "copi": [], "core": 4, "corn": 1, "could": 3, "counti": [], "cover": [], "coverag": [], "creat": [], "credenti": [], "crop": 1, "ctrl": [], "cumsum": [], "cumul": [], "curl": 4, "current": [3, 4], "curv": 1, "cycl": [], "dai": 1, "daili": 1, "damon": [], "dashboard": [], "data": 2, "datafram": [], "dataframe_to_featurecollect": [], "date": 1, "datetim": [], "dd": [], "decim": [], "decis": [], "deeper": 2, "def": [], "default": 4, "definit": [], "degre": 1, "demand": 2, "dens": [], "dep": 0, "depend": 2, "deploi": [0, 3], "deploy": [2, 4], "deprec": [], "describ": 4, "descript": 4, "design": 2, "detail": 3, "detect": 2, "dev": 2, "develop": [1, 4], "dew": 1, "dir": [], "direct": [], "directori": 4, "disease_metadata": [], "distinguish": 2, "doc": [], "docker": 4, "dockerfil": [], "document": 0, "doit": [], "domain": [], "door": 2, "drive": 2, "dry": 1, "dsi": [], "dst": [], "dual": [], "dure": [], "e": [], "each": 4, "earlier": 2, "ecosystem": [], "edu": [], "effect": [], "emb": [], "embed": [], "emerg": [], "enabl": [2, 3], "endpoint": 4, "enhanc": [], "ensembl": [], "entir": [], "entri": [], "environ": 2, "eros": [], "error": [], "establish": [], "estim": 1, "et": 3, "etc": [], "evalu": [], "eventu": 3, "everi": [], "evolut": 2, "exampl": [], "example_callapi": [], "execut": 2, "expand": 2, "explor": 3, "export": [], "expos": 4, "extend": 2, "extract": [], "f": [], "fail": [], "fall": 1, "fall_precip": [], "fall_start": [], "fallback": [], "far": 3, "farmer": [], "fastapi": 1, "faster": [2, 3], "featur": 2, "featurecollect": 1, "fetch": [], "fetch_all_measurements_async": [], "fetch_wisconet_biomass": [], "field": 4, "file": [3, 4], "fillna": [], "filter": [], "fit": [2, 3], "fix": [], "follow": [], "forecast": 2, "forecasting_d": [], "forklift": 3, "format": [], "formula": [], "forward": 4, "found": [], "four": 1, "frac": [], "framework": [], "friction": 2, "friendli": 2, "frogey": 1, "frogeye_risk": [], "frogeye_risk_class": [], "from": [0, 2, 4], "fromisoformat": [], "front": [3, 4], "function": [2, 4], "fundament": 2, "fungu": [], "further": 2, "g": [], "gdd": 1, "gdd_0c": [], "gdd_sine": [], "gdd_total": [], "gener": [], "geojson": 1, "geojson_adapt": [], "geojson_schema": [], "geometri": [], "geospati": 1, "get": [1, 3, 4], "get_weather_with_risk": [], "gi": 1, "git": [0, 1], "github": 2, "gitignor": 0, "global": 1, "globe": [], "gls_risk": [], "gls_risk_class": [], "go": [3, 4], "goal": 3, "grai": 1, "green": 1, "grow": 1, "growth": 1, "guid": 4, "ha": [], "handl": 1, "handler": [], "haproxi": 4, "hard": [], "harmon": [], "health": [], "healthcheck": [], "help": 2, "helper": [], "hendrickson": 3, "here": [0, 3], "high": 1, "higher": 2, "histor": 1, "histori": 2, "hod": [], "homepag": 0, "hope": 3, "horizont": 4, "host": [], "hotcloud": 3, "hour": [], "hourli": 1, "html": 0, "http": [0, 3, 4], "human": [], "humid": 1, "i": [1, 2, 3, 4], "ibm_api_kei": [], "ibm_servic": [], "icdcsw": 3, "id": [], "identifi": [], "idl": 2, "imag": 4, "implement": [2, 3], "import": [], "improv": 2, "inact": [], "inch": [], "includ": [1, 2], "incom": [1, 4], "increment": 2, "independ": 4, "index": 0, "individu": [], "inflect": [], "influenc": 2, "info": [], "inform": [], "ingest": 1, "initi": 3, "input": [], "insid": 4, "instal": [0, 1], "institut": 1, "integr": [1, 2], "interact": [], "intercept": [], "interfac": 2, "interpol": [], "interpret": 1, "interv": [], "invok": 3, "io": 0, "ipynb": [], "irrig": [], "issu": 2, "its": [2, 4], "jaim": 2, "jb": [], "json": 4, "jupyt": 0, "just": 3, "jwt": [], "k": [], "keep": 4, "kei": 4, "label": [], "lambda": [0, 2, 3, 4], "larg": 3, "last": [], "lat": [], "latenc": 4, "latitud": [], "layer": 1, "lb": 1, "leaf": 1, "lean": 3, "left": [], "let": 2, "librari": 3, "lifecycl": 4, "like": 2, "limit": [], "line": [], "lint": [], "linux": [3, 4], "linux contain": 3, "list": [], "listen": 4, "lng": [], "load": [3, 4], "load_stations_sync": [], "loadbalanc": [], "local": [3, 4], "localhost": 4, "locat": 2, "log": 4, "log_level": [], "log_output": 4, "logic": [], "login": 3, "logist": 1, "logit": [], "long": 2, "longitud": [], "longstand": 2, "look": 2, "low": [], "lower": [], "m": [0, 1], "madison": 1, "mai": [], "main": [1, 3], "maintain": [], "make": 3, "manag": [3, 4], "manipul": [], "manual": [3, 4], "map": [], "materi": [], "math": [], "math_help": [], "mathemat": [], "max": [], "maydi": [], "md": [0, 3], "mean": [], "measur": [], "merg": [], "merge_biomass": [], "merge_station_metadata": [], "merge_wisconet_biomass": [], "mesonet": 1, "messag": 1, "metadata_stations_": [], "method": [], "metric": [], "min": [], "minim": 2, "minut": 4, "mitig": [], "mm": [], "mode": 3, "model": 2, "model_schema": [], "moder": [], "modern": 2, "moistur": 1, "mold": 1, "monitor": [], "month": [], "more": [0, 2, 3], "mostli": 3, "mount": [], "mph": [], "multi": [1, 4], "multipl": 2, "multiprocess": [], "n": 4, "name": 4, "nation": [], "nativ": 2, "natur": 2, "need": 2, "network": 1, "new": [2, 3], "nginx": 4, "nighttim": [], "noaa": 1, "node": [3, 4], "non": [], "normal": 1, "notebook": [], "now": [], "num_work": [], "numer": [], "numpi": [], "o": 2, "oak": 3, "observ": 1, "obtain": [], "off": [], "ol": 2, "old": [], "onboard": 2, "onc": [], "one": 4, "open": [0, 2, 3], "openapi": [], "openlambda": 4, "oper": 4, "opportunist": 2, "optim": [1, 3, 4], "option": [2, 4], "orchestr": 1, "org_id": [], "organ": [], "our": 2, "output": [], "overhead": 2, "packag": 3, "panda": [], "paper": 4, "parallel": 1, "paramet": [], "pars": [], "pass": 4, "path": 4, "pattern": 2, "payload": 4, "pd": [], "peak": [], "per": 4, "period": 4, "permiss": [], "persist": 2, "pf": [], "phyllachora": [], "pip": [0, 1], "pipelin": 1, "pipsqueak": 3, "place": 4, "plan": [], "plant": 1, "plant_date_obj": [], "plant_doi": [], "planting_d": [], "platform": 2, "plu": [], "point": 1, "pool": [2, 3], "port": [2, 4], "post": [2, 4], "practic": 2, "pre": [], "precip": [], "precip1hour_sum": [], "precip_daili": [], "precip_fal": [], "precipit": 1, "pred": [], "predict": 1, "premium": [], "prep": [], "presenc": [], "present": 4, "previou": [], "primari": 3, "print": 4, "prob": [], "probabl": [], "problem": [], "process": [1, 2, 4], "product": 3, "profession": [], "project": 3, "properti": [], "provid": 1, "provis": [3, 4], "proxi": [], "public": 1, "pull": 4, "purpos": [], "push": 0, "put": 3, "py": [], "py_compil": [], "pydant": [], "pylint": [], "python": [0, 1, 2], "pythonpath": [], "queri": 1, "question": 2, "quickstart": 4, "r": [0, 1], "r3": [], "rainfal": 1, "rang": 2, "rapid": [3, 4], "rare": [], "rate": [], "rather": 2, "raw": [], "re": [], "read": 3, "readabl": [], "readi": [], "real": 2, "rebuild": [], "recommend": 4, "redeploi": [], "redoc": [], "reduc": [2, 4], "redund": [], "refer": [], "refresh": [], "regener": 2, "region": [], "registri": 4, "regress": [], "rel": [], "relativehumidity_max": [], "relativehumidity_min": [], "relev": [], "reli": 2, "reload": 1, "remov": 2, "replac": [], "repo": [1, 4], "repositori": [], "request": [1, 3, 4], "requir": [0, 1, 2, 4], "research": 4, "residu": [], "resolut": 1, "respect": 4, "respons": [3, 4], "rest": [], "result": [2, 4], "result_typ": [], "retri": [], "retriev": [], "return": [1, 4], "reus": 2, "revers": [], "rh": [], "risk": 1, "risk_dai": [], "risk_df": [], "risk_model": [], "risk_processor": [], "roll": 1, "rolling_mean": [], "root": [0, 4], "rout": [1, 4], "router": [], "row": [], "rule": [], "run": [3, 4], "runlambda": 4, "runtim": 2, "rye_biomass": [], "rye_daili": [], "saascor": [], "same": [], "sandbox": 4, "save": [], "scale": 4, "schema": [], "scienc": 1, "scientif": [], "sclerotinia": [], "sclerotiorum": [], "score": 1, "script": [], "see": 3, "select": [], "sep": [], "sequenti": [], "seri": 1, "serv": 2, "server": [2, 4], "serverless": [2, 3, 4], "servic": [1, 2, 3], "set": [0, 2], "setup": 4, "shape": 2, "share": [], "shift": [], "shm": 2, "short": 4, "should": [], "show": [], "side": [2, 4], "sidebar": [], "similar": 4, "sinc": [], "sine": [], "singl": [2, 3, 4], "site": [], "situat": 2, "slim": [], "smaller": [], "so": 3, "sock": [3, 4], "soil": 1, "sojina": [], "south": [], "soybean": 1, "space": [], "specif": [], "specifi": [], "speed": [], "spot": 1, "stage": [], "standalon": 4, "standard": 4, "start": [2, 3], "startup": 4, "state": 2, "stateless": [2, 4], "statewid": [], "station_data_": [], "station_id": [], "station_measurements_cach": [], "station_nam": [], "station_timezon": [], "statu": 4, "stdlib": [], "stdout": 4, "step": [], "still": [], "str": [], "structur": 1, "sub": [], "subsequ": 4, "suitabl": 3, "sum": [], "summari": [], "support": 2, "sure": [], "surfac": 2, "swagger": [], "synchron": 2, "syntax": [], "system": 3, "tabl": 0, "tabular": [], "take": 3, "tar": [], "target": 2, "tarspot": 1, "tarspot_risk": [], "tarspot_risk_class": [], "task": [3, 4], "technic": 0, "temp": [], "temperatur": 1, "temperature_max": [], "temperature_max_c": [], "temperature_mean": [], "temperature_mean_c": [], "temperature_min": [], "temperature_min_c": [], "temperaturedewpoint_max": [], "temperaturedewpoint_min": [], "tenant": [], "tenant_id": [], "termin": [], "termination_d": [], "text": [], "than": 2, "them": [3, 4], "thi": [2, 3], "those": 2, "threshold": [], "through": [], "ti": [], "tier": [], "time": [1, 2], "time_seri": [], "timeout": [], "timestamp": [], "timetupl": [], "titl": 3, "tl": [], "tm_ydai": [], "token": [], "tornado": 2, "total": [], "traefik": [], "transit": [], "tree": 3, "true": [], "ttl": 1, "two": [], "txt": [0, 1], "type": [], "ui": [], "under": [3, 4], "underli": 2, "unifi": [], "unit": [1, 2], "univers": 1, "until": 4, "updat": [], "url": 4, "us": [0, 1, 2, 3], "usag": [], "user": [], "utc": [], "util": 2, "uvicorn": 1, "uw": [], "v10": [], "v2": 1, "valid": 1, "variabl": [1, 2], "variant": [], "venu": 3, "venv": 1, "verbos": [], "verifi": 4, "via": 4, "view": [], "virtual": [], "visibl": 2, "vm": 3, "w": 4, "wait": [2, 4], "warm": [2, 4], "we": [2, 3], "weather": 1, "web": 2, "well": 3, "wet": [], "when": [2, 4], "where": [2, 3, 4], "whether": [2, 4], "which": 2, "white": 1, "whitemold_dry_risk": [], "whitemold_dry_risk_class": [], "wi": [], "wide": [2, 4], "wind": [], "window": [], "windspeed_max": [], "windspeed_mean": [], "wisc": [], "wisconet_active_st": [], "wisconet_biomass": [], "wisconet_g": 1, "wisconet_servic": [], "wisconsin": 1, "work": [2, 3, 4], "workdir": [], "worker": 3, "worker_port": 4, "workflow": 0, "workload": 2, "world": 2, "wosc": 3, "write": 4, "written": 3, "wsgi": 2, "x_0": [], "xxx": [], "yang": 3, "year": 1, "yellow": 1, "yml": 0, "you": [3, 4], "your": [], "your_kei": [], "your_org": [], "your_ten": [], "yourself": 3, "yyi": [], "yyyi": [], "zeae": [], "zygot": 3, "zzz": []}, "titles": ["OpenLambda GitHub Pages \u2014 MyST Markdown Site", "\ud83c\udf3e Agricultural Forecasting API", "Applications", "OpenLambda", "Worker"], "titleterms": {"0": [], "1": 0, "2": [], "3": [], "4": [], "One": 0, "action": [], "ad": [], "addit": [], "agricultur": 1, "api": 1, "app": 2, "applic": 2, "architectur": 1, "asgi": 2, "async": [], "avail": [], "biomass": 1, "cach": [], "calcul": [], "changelog": [], "clone": 0, "collect": [], "complet": [], "compos": [], "concurr": [], "configur": 4, "consider": [], "content": [], "coordin": 1, "copi": 0, "core": 1, "corn": [], "current": [], "data": 1, "date": [], "depend": [], "deploi": [2, 4], "deploy": [], "design": [], "develop": [], "directori": [], "diseas": 1, "do": 0, "docker": [], "document": [], "effici": [], "ei": 1, "enabl": [], "endpoint": 1, "environ": [], "environment": 1, "extern": [], "fastapi": 2, "featur": 1, "file": 0, "flow": [], "forecast": 1, "format": 1, "frogey": [], "further": 4, "geojson": [], "github": 0, "grai": [], "group": [], "handl": [], "high": [], "how": 2, "ibm": 1, "instal": [], "integr": [], "intellig": 1, "journei": [], "just": 2, "kei": 1, "leaf": [], "legaci": [], "level": [], "licens": 3, "local": 0, "markdown": 0, "mesonet": [], "metadata": 1, "model": 1, "modul": 1, "mold": [], "more": [], "multi": [], "multipl": 4, "myst": 0, "new": [], "onc": 0, "openlambda": [0, 2, 3], "optim": [], "output": 1, "overview": [1, 4], "page": 0, "per": 0, "perform": 1, "pipelin": [], "prerequisit": [], "preview": 0, "process": [], "product": [], "public": 3, "read": 4, "relat": 3, "repo": 0, "request": [], "resourc": [], "respons": 1, "risk": [], "rye": 1, "seri": [], "servic": [], "setup": [0, 1], "site": 0, "sourc": 1, "soybean": [], "spot": [], "stack": [], "start": 4, "station": 1, "strategi": [], "structur": 0, "suit": 1, "system": 1, "tabl": [], "tarspot": [], "technic": [], "technologi": [], "test": [], "thi": 0, "time": 0, "timezon": [], "tip": [], "troubleshoot": [], "u": 2, "v1": [], "v2": [], "variabl": [], "version": [], "want": 2, "weather": [], "white": [], "winter": 1, "wisconet": 1, "worker": 4}}) \ No newline at end of file +Search.setIndex({"alltitles": {"1. Clone the repo and copy these files in": [[0, "clone-the-repo-and-copy-these-files-in"]], "Agricultural Forecasting API": [[1, null]], "Applications": [[2, null]], "Configuration": [[6, "configuration"]], "Deploying Multiple Workers": [[6, "deploying-multiple-workers"]], "File Structure": [[0, "file-structure"]], "Further Reading": [[6, "further-reading"]], "Hello, OpenLambda Blog": [[4, null]], "License": [[5, "license"]], "Local Preview": [[0, "local-preview"]], "One-Time Setup (do this once per repo)": [[0, "one-time-setup-do-this-once-per-repo"]], "OpenLambda": [[5, null]], "OpenLambda Blog": [[3, null]], "OpenLambda GitHub Pages \u2014 MyST Markdown Site": [[0, null]], "Overview": [[1, "overview"], [6, "overview"]], "Related Publications": [[5, "related-publications"]], "Starting the Worker": [[6, "starting-the-worker"]], "Want to deploy FastAPI apps on OpenLambda? Just ASGI us how.": [[2, "want-to-deploy-fastapi-apps-on-openlambda-just-asgi-us-how"]], "Worker": [[6, null]]}, "docnames": ["README", "applications/ag-forecasting-api", "applications/index", "blog/index", "blog/post/2026-05-18-hello-world", "index", "worker"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "applications/ag-forecasting-api.md", "applications/index.md", "blog/index.md", "blog/post/2026-05-18-hello-world.md", "index.md", "worker.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [2, 6], "0": [], "003663": [], "031": [], "05": [], "09": [], "10": [], "100": [], "1049": [], "11": [], "12": [], "1234": [], "14": [], "15": [], "16": 5, "17": 5, "18": [3, 5], "20": [], "2000": [], "2024": [], "2025": [], "2026": 3, "21": [], "24": 5, "28": [], "2878": [], "30": [], "31": [], "3250": [], "35": [], "366": [], "38": [], "404": [], "423": [], "43": [], "45": [], "4500": [], "4567": [], "5": [], "50": [], "6": [], "6h": [], "7": [], "7d": [], "8": [], "8000": [], "8080": 6, "85": [], "89": [], "9": [], "90": [], "92": [], "999": [], "A": [2, 6], "By": [], "For": 1, "In": 2, "It": 6, "No": 6, "On": 2, "That": [], "The": [1, 2, 5, 6], "To": [2, 6], "With": 5, "__init__": [], "_annotate_winter_rye_biomass": [], "_build": 0, "_build_daili": [], "_compute_winter_rye_biomass": [], "_config": 0, "_doi": [], "_fall": [], "_fetch_raw_hourli": [], "_run_pipelin": [], "_toc": 0, "_total": [], "about": 5, "abov": [], "aboveground": [], "absolut": [], "access": [], "accumul": [], "acquisit": [], "acr": [], "action": 0, "activ": [], "ad": [], "adapt": [], "add": [0, 2], "address": [2, 6], "adjust": 2, "after": 6, "ag": 2, "ag_api": [], "ag_forecast": [], "ag_forecasting_api": [], "ag_models_wrapp": [], "aggreg": [], "agricultur": 2, "agronom": [], "ahead": 2, "aiohttp": [], "air": [], "al": 5, "all": 0, "alongsid": 2, "alpin": [], "alreadi": 6, "also": [2, 5], "alten": [], "altn": [], "america": [], "an": [2, 5], "analysi": [], "annot": [], "apach": 5, "api": 2, "api_cach": [], "api_kei": [], "apotheci": [], "app": [], "app_v1": [], "appli": [], "applic": [], "approach": [2, 5, 6], "ar": [2, 5, 6], "arithmet": [], "arriv": 6, "asgi": 1, "assess": [], "assumpt": [], "async": 2, "atc": 5, "authent": [], "author": 5, "auto": 0, "automat": 0, "avail": [], "averag": [], "avg": [], "await": [], "awar": [], "axi": [], "b_": [], "b_0": [], "back": 6, "backend": 6, "backward": [], "balanc": [5, 6], "base": [1, 2, 5], "basic": [], "batch": [], "becaus": 2, "behind": 6, "believ": 2, "benefici": 2, "better": 2, "between": 6, "bill": 2, "bin": 6, "binari": 6, "biomass_color": [], "biomass_lb_acr": [], "biomass_messag": [], "biomass_result": [], "bit": 5, "block": 2, "book": 0, "boss": [5, 6], "both": 2, "branch": [], "broader": 2, "broadli": 2, "browser": 0, "build": [0, 2, 6], "built": [], "bulk": [], "bundl": 0, "busi": [], "c": [], "cach": [], "calc": [], "calcul": [], "calculate_tarspot_risk": [], "calculate_winter_rye_biomass": [], "call": 6, "caller": 6, "can": [2, 5, 6], "cap": [], "capabl": [], "case": [], "categori": [], "cd": 0, "cdn": [], "cdot": [], "central": [5, 6], "cercospora": [], "chang": 2, "chapter": [], "characterist": [], "check": [1, 6], "chicago": [], "choic": 2, "chunk": [], "citi": [], "class": [], "classif": [], "classifi": [], "client": [], "clone": [], "cloud comput": 5, "cluster": [5, 6], "cmd": [], "co": 2, "coeffici": [], "col": [], "cold": 6, "color": [], "columbia": [], "column": [], "com": 0, "combin": 1, "commit": 0, "compat": [], "compon": 6, "comput": [2, 5], "compute_risks_in_parallel": [], "concern": 2, "concurr": 2, "conda": [], "config": 6, "configur": [], "confirm": [], "connect": [], "consolid": 2, "constant": [], "constraint": 2, "contact": [], "contain": [5, 6], "container": [], "content": 0, "context": [], "continu": 2, "contribut": 2, "convers": [], "convert": [], "coordin": 6, "copi": [], "core": 6, "corn": [], "could": 5, "counti": [], "cover": [], "coverag": [], "creat": [], "credenti": [], "crop": 1, "ctrl": [], "cumsum": [], "cumul": [], "curl": 6, "current": [5, 6], "curv": [], "cycl": [], "dai": [], "daili": [], "damon": [], "dashboard": [], "data": [1, 2], "datafram": [], "dataframe_to_featurecollect": [], "date": [], "datetim": [], "dd": [], "decim": [], "decis": [], "deep": 3, "deeper": 2, "def": [], "default": 6, "definit": [], "degre": [], "demand": 2, "dens": [], "dep": 0, "depend": 2, "deploi": [0, 5], "deploy": [2, 6], "deprec": [], "describ": 6, "descript": 6, "design": [2, 3, 4], "detail": 5, "detect": 2, "dev": 2, "develop": [1, 6], "dew": [], "dir": [], "direct": [], "directori": 6, "discuss": [3, 4], "diseas": 1, "disease_metadata": [], "distinguish": 2, "dive": 3, "doc": [], "docker": 6, "dockerfil": [], "document": [0, 1], "doit": [], "domain": [], "door": 2, "drive": 2, "dry": [], "dsi": [], "dst": [], "dual": [], "dure": [], "e": [], "each": 6, "earlier": 2, "ecosystem": [], "edu": [], "effect": [], "emb": [], "embed": [], "emerg": [], "enabl": [2, 5], "endpoint": 6, "enhanc": [], "ensembl": [], "enter": 1, "entir": [], "entri": [], "environ": 2, "eros": [], "error": [], "establish": [], "estim": [], "et": 5, "etc": [], "evalu": [], "eventu": 5, "everi": [], "evolut": 2, "exampl": [], "example_callapi": [], "execut": 2, "expand": 2, "experi": [3, 4], "explor": 5, "export": [], "expos": 6, "extend": 2, "extract": [], "f": [], "fail": [], "fall": [], "fall_precip": [], "fall_start": [], "fallback": [], "far": 5, "farmer": [], "fastapi": 1, "faster": [2, 5], "featur": 2, "featurecollect": [], "fetch": [], "fetch_all_measurements_async": [], "fetch_wisconet_biomass": [], "field": 6, "file": [5, 6], "fillna": [], "filter": [], "fit": [2, 5], "fix": [], "follow": [], "forecast": 2, "forecasting_d": [], "forklift": 5, "format": [], "formula": [], "forward": 6, "found": [], "four": [], "frac": [], "framework": [], "friction": 2, "friendli": 2, "frogey": [], "frogeye_risk": [], "frogeye_risk_class": [], "from": [0, 2, 3, 6], "fromisoformat": [], "front": [5, 6], "function": [2, 6], "fundament": 2, "fungu": [], "further": 2, "g": [], "gdd": [], "gdd_0c": [], "gdd_sine": [], "gdd_total": [], "gener": [], "geojson": [], "geojson_adapt": [], "geojson_schema": [], "geometri": [], "geospati": 1, "get": [5, 6], "get_weather_with_risk": [], "gi": [], "git": 0, "github": 2, "gitignor": 0, "global": [], "globe": [], "gls_risk": [], "gls_risk_class": [], "go": [5, 6], "goal": 5, "grai": [], "green": [], "grow": [], "growth": [], "guid": 6, "ha": [], "handl": [], "handler": [], "haproxi": 6, "hard": [], "harmon": [], "health": [], "healthcheck": [], "hello": 3, "help": 2, "helper": [], "hendrickson": 5, "here": [0, 1, 5], "high": [], "higher": 2, "histor": [], "histori": 2, "hod": [], "homepag": 0, "hope": 5, "horizont": 6, "host": [], "hotcloud": 5, "hour": [], "hourli": [], "html": 0, "http": [0, 5, 6], "human": [], "humid": [], "i": [1, 2, 5, 6], "ibm_api_kei": [], "ibm_servic": [], "icdcsw": 5, "id": [], "identifi": [], "idl": 2, "imag": 6, "implement": [2, 5], "import": [], "improv": 2, "inact": [], "inch": [], "includ": 2, "incom": 6, "increment": 2, "independ": 6, "index": 0, "individu": [], "inflect": [], "influenc": 2, "info": [], "inform": [], "ingest": [], "initi": 5, "input": [], "insid": 6, "instal": 0, "institut": 1, "integr": [1, 2], "intellig": 1, "interact": [], "intercept": [], "interfac": 2, "interpol": [], "interpret": [], "interv": [], "invok": 5, "io": 0, "ipynb": [], "irrig": [], "issu": 2, "its": [1, 2, 6], "jaim": 2, "jb": [], "json": 6, "jupyt": 0, "just": 5, "jwt": [], "k": [], "keep": 6, "kei": 6, "label": [], "lambda": [0, 1, 2, 5, 6], "larg": 5, "last": [], "lat": [], "latenc": 6, "latitud": [], "layer": [], "lb": [], "leaf": [], "lean": 5, "left": [], "let": 2, "librari": 5, "lifecycl": 6, "like": 2, "limit": [], "line": [], "lint": [], "linux": [5, 6], "linux contain": 5, "list": [], "listen": 6, "ll": [3, 4], "lng": [], "load": [5, 6], "load_stations_sync": [], "loadbalanc": [], "local": [5, 6], "localhost": 6, "locat": 2, "log": 6, "log_level": [], "log_output": 6, "logic": [], "login": 5, "logist": [], "logit": [], "long": 2, "longitud": [], "longstand": 2, "look": 2, "low": [], "lower": [], "m": 0, "madison": 1, "mai": 3, "main": 5, "maintain": [], "make": 5, "manag": [5, 6], "manipul": [], "manual": [5, 6], "map": [], "materi": [], "math": [], "math_help": [], "mathemat": [], "max": [], "maydi": [], "md": [0, 5], "mean": [], "measur": [], "merg": [], "merge_biomass": [], "merge_station_metadata": [], "merge_wisconet_biomass": [], "mesonet": [], "messag": [], "metadata_stations_": [], "method": [], "metric": [], "min": [], "minim": 2, "minut": 6, "mitig": [], "mm": [], "mode": 5, "model": [1, 2], "model_schema": [], "moder": [], "modern": 2, "moistur": [], "mold": [], "monitor": [], "month": [], "more": [0, 2, 5], "mostli": 5, "mount": [], "mph": [], "multi": [1, 6], "multipl": 2, "multiprocess": [], "n": 6, "name": 6, "nation": [], "nativ": 2, "natur": 2, "need": 2, "network": [], "new": [2, 3, 4, 5], "next": 1, "nginx": 6, "nighttim": [], "noaa": [], "node": [5, 6], "non": [], "normal": [], "note": [3, 4], "notebook": [], "now": 1, "num_work": [], "numer": [], "numpi": [], "o": 2, "oak": 5, "observ": [], "obtain": [], "off": [], "ol": 2, "old": [], "onboard": 2, "onc": [], "one": 6, "open": [0, 1, 2, 5], "openapi": [], "openlambda": [1, 6], "oper": 6, "opportunist": 2, "optim": [5, 6], "option": [2, 6], "orchestr": [], "org_id": [], "organ": [], "our": 2, "output": [], "overhead": 2, "packag": 5, "panda": [], "paper": 6, "parallel": [], "paramet": [], "pars": [], "pass": 6, "path": 6, "pattern": 2, "payload": 6, "pd": [], "peak": [], "per": 6, "perform": [3, 4], "period": 6, "permiss": [], "persist": 2, "pf": [], "phase": 1, "phyllachora": [], "pip": 0, "pipelin": [], "pipsqueak": 5, "place": 6, "plan": [], "plant": [], "plant_date_obj": [], "plant_doi": [], "planting_d": [], "platform": 2, "pleas": 1, "plu": [], "point": [], "pool": [2, 5], "port": [2, 6], "post": [2, 6], "practic": 2, "pre": [], "precip": [], "precip1hour_sum": [], "precip_daili": [], "precip_fal": [], "precipit": [], "pred": [], "predict": [], "premium": [], "prep": [], "presenc": [], "present": 6, "previou": [], "primari": 5, "print": 6, "prob": [], "probabl": [], "problem": [], "process": [2, 6], "product": 5, "profession": [], "project": [3, 5], "properti": [], "provid": 1, "provis": [5, 6], "proxi": [], "public": [], "pull": 6, "purpos": [], "push": 0, "put": 5, "py": [], "py_compil": [], "pydant": [], "pylint": [], "python": [0, 2], "pythonpath": [], "queri": [], "question": 2, "quickstart": 6, "r": 0, "r3": [], "rainfal": [], "rang": 2, "rapid": [5, 6], "rare": [], "rate": [], "rather": 2, "raw": [], "re": [], "read": 5, "readabl": [], "readi": [], "real": 2, "rebuild": [], "recommend": 6, "redeploi": [], "redoc": [], "reduc": [2, 6], "redund": [], "refer": 1, "refresh": [], "regener": 2, "region": [], "registri": 6, "regress": [], "rel": [], "relativehumidity_max": [], "relativehumidity_min": [], "releas": [3, 4], "relev": [], "reli": 2, "reload": [], "remov": 2, "replac": [], "repo": 6, "repositori": [], "request": [5, 6], "requir": [0, 2, 6], "research": 6, "residu": [], "resolut": [], "respect": 6, "respons": [5, 6], "rest": [], "result": [2, 6], "result_typ": [], "retri": [], "retriev": [], "return": 6, "reus": 2, "revers": [], "rh": [], "risk": 1, "risk_dai": [], "risk_df": [], "risk_model": [], "risk_processor": [], "roll": [], "rolling_mean": [], "root": [0, 6], "rout": 6, "router": [], "row": [], "rule": [], "run": [5, 6], "runlambda": 6, "runtim": 2, "rye_biomass": [], "rye_daili": [], "saascor": [], "same": [], "sandbox": 6, "save": [], "scale": 6, "schema": [], "scienc": 1, "scientif": [], "sclerotinia": [], "sclerotiorum": [], "score": [], "script": [], "see": 5, "select": [], "sep": [], "sequenti": [], "seri": [], "serv": 2, "server": [2, 6], "serverless": [2, 5, 6], "servic": [1, 2, 5], "set": [0, 2], "setup": 6, "shape": 2, "share": [3, 4], "shift": [], "shm": 2, "short": 6, "should": [], "show": [], "side": [2, 6], "sidebar": [], "similar": 6, "sinc": [], "sine": [], "singl": [2, 5, 6], "site": [], "situat": 2, "slim": [], "smaller": [], "so": 5, "sock": [5, 6], "soil": [], "sojina": [], "sourc": 1, "south": [], "soybean": [], "space": [3, 4], "specif": [], "specifi": [], "speed": [], "spot": [], "stage": [], "standalon": 6, "standard": 6, "start": [2, 5], "startup": 6, "state": 2, "stateless": [2, 6], "statewid": [], "station_data_": [], "station_id": [], "station_measurements_cach": [], "station_nam": [], "station_timezon": [], "statu": 6, "stdlib": [], "stdout": 6, "step": [], "still": [], "str": [], "structur": [], "sub": [], "subsequ": 6, "suitabl": 5, "sum": [], "summari": [], "support": 2, "sure": [], "surfac": 2, "swagger": [], "synchron": 2, "syntax": [], "system": 5, "tabl": 0, "tabular": [], "take": 5, "tar": [], "target": 2, "tarspot": [], "tarspot_risk": [], "tarspot_risk_class": [], "task": [5, 6], "team": 3, "technic": [0, 3], "technologi": 1, "temp": [], "temperatur": [], "temperature_max": [], "temperature_max_c": [], "temperature_mean": [], "temperature_mean_c": [], "temperature_min": [], "temperature_min_c": [], "temperaturedewpoint_max": [], "temperaturedewpoint_min": [], "tenant": [], "tenant_id": [], "termin": [], "termination_d": [], "text": [], "than": 2, "them": [5, 6], "thi": [2, 3, 4, 5], "those": 2, "threshold": [], "through": 1, "ti": [], "tier": [], "time": 2, "time_seri": [], "timeout": [], "timestamp": [], "timetupl": [], "titl": 5, "tl": [], "tm_ydai": [], "token": [], "tool": 1, "tornado": 2, "total": [], "traefik": [], "transit": [], "tree": 5, "true": [], "ttl": [], "two": [], "txt": 0, "type": [], "ui": [], "under": [5, 6], "underli": 2, "unifi": [], "unit": 2, "univers": 1, "until": 6, "updat": [], "url": 6, "us": [0, 1, 2, 3, 4, 5], "usag": [], "user": [], "utc": [], "util": 2, "uvicorn": [], "uw": [], "v10": [], "v2": [], "valid": 1, "variabl": 2, "variant": [], "venu": 5, "venv": [], "verbos": [], "verifi": 6, "via": 6, "view": [], "virtual": [], "visibl": 2, "vm": 5, "w": 6, "wait": [2, 6], "warm": [2, 6], "we": [2, 3, 4, 5], "weather": 1, "web": 2, "welcom": [3, 4], "well": 5, "wet": [], "when": [2, 6], "where": [2, 5, 6], "whether": [2, 6], "which": 2, "white": [], "whitemold_dry_risk": [], "whitemold_dry_risk_class": [], "wi": [], "wide": [2, 6], "wind": [], "window": [], "windspeed_max": [], "windspeed_mean": [], "wisc": [], "wisconet_active_st": [], "wisconet_biomass": [], "wisconet_g": [], "wisconet_servic": [], "wisconsin": 1, "work": [2, 5, 6], "workdir": [], "worker": 5, "worker_port": 6, "workflow": 0, "workload": 2, "world": 2, "wosc": 5, "write": 6, "written": 5, "wsgi": 2, "x_0": [], "xxx": [], "yang": 5, "year": [], "yellow": [], "yml": 0, "you": [5, 6], "your": [], "your_kei": [], "your_org": [], "your_ten": [], "yourself": 5, "yyi": [], "yyyi": [], "zeae": [], "zygot": 5, "zzz": []}, "titles": ["OpenLambda GitHub Pages \u2014 MyST Markdown Site", "Agricultural Forecasting API", "Applications", "OpenLambda Blog", "Hello, OpenLambda Blog", "OpenLambda", "Worker"], "titleterms": {"0": [], "1": 0, "2": [], "3": [], "4": [], "One": 0, "action": [], "ad": [], "addit": [], "agricultur": 1, "api": 1, "app": 2, "applic": 2, "architectur": [], "asgi": 2, "async": [], "avail": [], "biomass": [], "blog": [3, 4], "cach": [], "calcul": [], "changelog": [], "clone": 0, "collect": [], "complet": [], "compos": [], "concurr": [], "configur": 6, "consider": [], "content": [], "coordin": [], "copi": 0, "core": [], "corn": [], "current": [], "data": [], "date": [], "depend": [], "deploi": [2, 6], "deploy": [], "design": [], "develop": [], "directori": [], "diseas": [], "do": 0, "docker": [], "document": [], "effici": [], "ei": [], "enabl": [], "endpoint": [], "environ": [], "environment": [], "extern": [], "fastapi": 2, "featur": [], "file": 0, "flow": [], "forecast": 1, "format": [], "frogey": [], "further": 6, "geojson": [], "github": 0, "grai": [], "group": [], "handl": [], "hello": 4, "high": [], "how": 2, "ibm": [], "instal": [], "integr": [], "intellig": [], "journei": [], "just": 2, "kei": [], "leaf": [], "legaci": [], "level": [], "licens": 5, "local": 0, "markdown": 0, "mesonet": [], "metadata": [], "model": [], "modul": [], "mold": [], "more": [], "multi": [], "multipl": 6, "myst": 0, "new": [], "onc": 0, "openlambda": [0, 2, 3, 4, 5], "optim": [], "output": [], "overview": [1, 6], "page": 0, "per": 0, "perform": [], "pipelin": [], "prerequisit": [], "preview": 0, "process": [], "product": [], "public": 5, "read": 6, "relat": 5, "repo": 0, "request": [], "resourc": [], "respons": [], "risk": [], "rye": [], "seri": [], "servic": [], "setup": 0, "site": 0, "sourc": [], "soybean": [], "spot": [], "stack": [], "start": 6, "station": [], "strategi": [], "structur": 0, "suit": [], "system": [], "tabl": [], "tarspot": [], "technic": [], "technologi": [], "test": [], "thi": 0, "time": 0, "timezon": [], "tip": [], "troubleshoot": [], "u": 2, "v1": [], "v2": [], "variabl": [], "version": [], "want": 2, "weather": [], "white": [], "winter": [], "wisconet": [], "worker": 6}}) \ No newline at end of file diff --git a/_build/html/worker.html b/_build/html/worker.html index c3e3cde..e41c487 100644 --- a/_build/html/worker.html +++ b/_build/html/worker.html @@ -60,10 +60,17 @@ - - + + - + + + @@ -175,8 +182,11 @@ @@ -465,11 +477,11 @@

Further Reading

next

-

Applications

+

OpenLambda Blog

diff --git a/_config.yml b/_config.yml index 1ba1d55..b93b435 100644 --- a/_config.yml +++ b/_config.yml @@ -43,6 +43,8 @@ parse: # Sphinx configuration sphinx: + extra_extensions: + - ablog config: html_theme: "sphinx_book_theme" html_show_sourcelink: false @@ -54,4 +56,34 @@ sphinx: navigation_depth: 2 show_navbar_depth: 1 logo: - text: "OpenLambda" \ No newline at end of file + text: "OpenLambda" + + # ---- ABlog config ---- + blog_path: "blog" + blog_title: "OpenLambda Blog" + blog_baseurl: "https://open-lambda.github.io/" + blog_authors: + open-lambda: + - "OpenLambda Team" + - "https://open-lambda.org" + blog_default_author: open-lambda + blog_feed_archives: true + post_date_format: "%Y-%m-%d" + post_auto_image: 1 + post_auto_excerpt: 2 + fontawesome_included: true + + # Show ABlog widgets on blog pages only + html_sidebars: + blog/**: + - ablog/postcard.html + - ablog/recentposts.html + - ablog/tagcloud.html + - ablog/categories.html + - ablog/archives.html + blog: + - ablog/postcard.html + - ablog/recentposts.html + - ablog/tagcloud.html + - ablog/categories.html + - ablog/archives.html \ No newline at end of file diff --git a/_toc.yml b/_toc.yml index d180c10..f55657e 100644 --- a/_toc.yml +++ b/_toc.yml @@ -8,4 +8,8 @@ chapters: - file: applications/index title: Applications sections: - - file: applications/ag-forecasting-api \ No newline at end of file + - file: applications/ag-forecasting-api + - file: blog/index + title: Blog + sections: + - glob: blog/posts/* \ No newline at end of file diff --git a/blog/index.md b/blog/index.md new file mode 100644 index 0000000..ebc9baf --- /dev/null +++ b/blog/index.md @@ -0,0 +1,11 @@ +# OpenLambda Blog + + News, releases, and technical deep-dives from the OpenLambda project. + +```{postlist} 10 + :format: "{title} — {author}, {date}" + :date: "%B %d, %Y" + :list-style: circle + :excerpts: + :sort: +``` \ No newline at end of file diff --git a/blog/post/2026-05-18-hello-world.md b/blog/post/2026-05-18-hello-world.md new file mode 100644 index 0000000..7a403e3 --- /dev/null +++ b/blog/post/2026-05-18-hello-world.md @@ -0,0 +1,13 @@ +--- +blogpost: true +date: 2026-05-18 +author: open-lambda +category: Releases +tags: announcement, openlambda +language: en +--- + +# Hello, OpenLambda Blog + +Welcome to the new OpenLambda blog. We'll use this space to share release +notes, performance experiments, and design discussions. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index dd8cc3f..f82c4af 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ jupyter-book>=1.0.0 sphinx-book-theme>=1.1.0 myst-parser>=3.0.0 -sphinx-copybutton \ No newline at end of file +sphinx-copybutton +ablog \ No newline at end of file From 4437a6ab11cba97d497849d36b25a50e8f55865f Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Mon, 18 May 2026 16:27:37 -0500 Subject: [PATCH 25/40] ADD blog content --- .../2026-05-18-ag-forecasting-case-study.md | 19 +++++++++++++++++++ blog/post/2026-05-18-hello-world.md | 13 ------------- 2 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 blog/post/2026-05-18-ag-forecasting-case-study.md delete mode 100644 blog/post/2026-05-18-hello-world.md diff --git a/blog/post/2026-05-18-ag-forecasting-case-study.md b/blog/post/2026-05-18-ag-forecasting-case-study.md new file mode 100644 index 0000000..3bdc1fd --- /dev/null +++ b/blog/post/2026-05-18-ag-forecasting-case-study.md @@ -0,0 +1,19 @@ +--- +blogpost: true +date: 2026-05-18 +author: Maria Oros, Tyler Caraza-Harter +category: Case Studies +tags: case-study, agforecast, asgi, fastapi, openlambda +language: en +--- + +# An Application Case Study: Forecasting Crop Disease with OpenLambda + +*Maria Oros, Data Science Institute, University of Wisconsin–Madison* +*Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison* + +Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren't originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + +Recently, we selected an agricultural forecasting application (AgForecast), developed by the [Data Science Institute at UW–Madison](https://dsi.wisc.edu/), to port to OpenLambda: . AgForecast is an interesting case study, because it implements its REST API using FastAPI, which in turn uses [ASGI](https://asgi.readthedocs.io/en/latest/), the so-called "spiritual successor" to WSGI, which we recently started supporting in OpenLambda. WSGI is the basis for popular Python web-programming packages such as Django and Flask; new ASGI support opens the door to an even broader range of applications. + +In this post, we describe the challenges of porting AgForecast to OL, and four new features we added to OL to make deployment of similar applications in the future simpler. The features are built-in ASGI support, direct GitHub-to-OL deployments, OL function environment variables, and OL-based pip compilation. \ No newline at end of file diff --git a/blog/post/2026-05-18-hello-world.md b/blog/post/2026-05-18-hello-world.md deleted file mode 100644 index 7a403e3..0000000 --- a/blog/post/2026-05-18-hello-world.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -blogpost: true -date: 2026-05-18 -author: open-lambda -category: Releases -tags: announcement, openlambda -language: en ---- - -# Hello, OpenLambda Blog - -Welcome to the new OpenLambda blog. We'll use this space to share release -notes, performance experiments, and design discussions. \ No newline at end of file From a600dccbabb22959f8baa1a2857fd049b9eff7ce Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Mon, 18 May 2026 16:30:07 -0500 Subject: [PATCH 26/40] ADD blog content --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f82c4af..a332513 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ jupyter-book>=1.0.0 sphinx-book-theme>=1.1.0 myst-parser>=3.0.0 sphinx-copybutton -ablog \ No newline at end of file +ablog>=0.11 \ No newline at end of file From 3b873aa5bdf72cc7ff12217fa4d545bf104bdcb1 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Mon, 18 May 2026 16:33:44 -0500 Subject: [PATCH 27/40] ADD blog content --- .github/workflows/deploy.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 966162a..b4f6235 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,10 +32,7 @@ jobs: python-version: '3.11' - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install 'jupyter-book<2.0' - pip install sphinx-book-theme + run: pip install -r requirements.txt - name: Build Jupyter Book run: jupyter-book build . From 9eb3d53c7ab41214eedaec6a2c83f720a47b5ce7 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Mon, 18 May 2026 16:42:28 -0500 Subject: [PATCH 28/40] ADD blog content --- _build/.doctrees/blog/index.doctree | Bin 4005 -> 4056 bytes ...26-05-18-ag-forecasting-case-study.doctree | Bin 0 -> 7729 bytes _build/.doctrees/environment.pickle | Bin 44464 -> 59412 bytes .../2026-05-18-ag-forecasting-case-study.md | 19 + _build/html/blog.html | 132 ++++- _build/html/blog/2026.html | 132 ++++- _build/html/blog/2026/atom.xml | 44 +- _build/html/blog/archive.html | 41 +- _build/html/blog/atom.xml | 44 +- _build/html/blog/author.html | 70 ++- _build/html/blog/author/maria-oros.html | 561 ++++++++++++++++++ _build/html/blog/author/maria-oros/atom.xml | 51 ++ _build/html/blog/author/openlambda-team.html | 32 +- .../html/blog/author/openlambda-team/atom.xml | 2 +- .../html/blog/author/tyler-caraza-harter.html | 561 ++++++++++++++++++ .../blog/author/tyler-caraza-harter/atom.xml | 51 ++ _build/html/blog/category.html | 51 +- _build/html/blog/category/case-studies.html | 561 ++++++++++++++++++ .../html/blog/category/case-studies/atom.xml | 51 ++ _build/html/blog/category/releases.html | 32 +- _build/html/blog/category/releases/atom.xml | 2 +- _build/html/blog/drafts.html | 32 +- _build/html/blog/index.html | 85 ++- _build/html/blog/language.html | 41 +- _build/html/blog/language/en.html | 132 ++++- _build/html/blog/language/en/atom.xml | 44 +- .../2026-05-18-ag-forecasting-case-study.html | 561 ++++++++++++++++++ .../blog/post/2026-05-18-hello-world.html | 53 +- _build/html/blog/tag.html | 117 +++- _build/html/blog/tag/agforecast.html | 561 ++++++++++++++++++ _build/html/blog/tag/agforecast/atom.xml | 51 ++ _build/html/blog/tag/announcement.html | 32 +- _build/html/blog/tag/announcement/atom.xml | 2 +- _build/html/blog/tag/asgi.html | 561 ++++++++++++++++++ _build/html/blog/tag/asgi/atom.xml | 51 ++ _build/html/blog/tag/case-study.html | 561 ++++++++++++++++++ _build/html/blog/tag/case-study/atom.xml | 51 ++ _build/html/blog/tag/fastapi.html | 561 ++++++++++++++++++ _build/html/blog/tag/fastapi/atom.xml | 51 ++ _build/html/blog/tag/openlambda.html | 132 ++++- _build/html/blog/tag/openlambda/atom.xml | 44 +- _build/html/genindex.html | 3 +- _build/html/index.html | 3 +- _build/html/objects.inv | 3 +- _build/html/search.html | 3 +- _build/html/searchindex.js | 2 +- _toc.yml | 3 +- blog/post/2026-05-18-hello-world.md | 13 + 48 files changed, 6128 insertions(+), 62 deletions(-) create mode 100644 _build/.doctrees/blog/post/2026-05-18-ag-forecasting-case-study.doctree create mode 100644 _build/html/_sources/blog/post/2026-05-18-ag-forecasting-case-study.md create mode 100644 _build/html/blog/author/maria-oros.html create mode 100644 _build/html/blog/author/maria-oros/atom.xml create mode 100644 _build/html/blog/author/tyler-caraza-harter.html create mode 100644 _build/html/blog/author/tyler-caraza-harter/atom.xml create mode 100644 _build/html/blog/category/case-studies.html create mode 100644 _build/html/blog/category/case-studies/atom.xml create mode 100644 _build/html/blog/post/2026-05-18-ag-forecasting-case-study.html create mode 100644 _build/html/blog/tag/agforecast.html create mode 100644 _build/html/blog/tag/agforecast/atom.xml create mode 100644 _build/html/blog/tag/asgi.html create mode 100644 _build/html/blog/tag/asgi/atom.xml create mode 100644 _build/html/blog/tag/case-study.html create mode 100644 _build/html/blog/tag/case-study/atom.xml create mode 100644 _build/html/blog/tag/fastapi.html create mode 100644 _build/html/blog/tag/fastapi/atom.xml create mode 100644 blog/post/2026-05-18-hello-world.md diff --git a/_build/.doctrees/blog/index.doctree b/_build/.doctrees/blog/index.doctree index dab9c09d07ba8cc362b173aaefac7e13839dd6d8..8f5d0940f727ca3983c6315e2eb84636f64fdb78 100644 GIT binary patch delta 384 zcmZ1~e?y+7fpzNHjVzih)_y$-NjdrH`UUyLCHh7NMrOJOrn-g}x*4fCIr+Nf`9(P? zQ`)8^_V8rpCFhi;q^4!&q!v$!osvU4W?wU0}T=bv0A5qgfpbG z*d{yiSTKH>T+L%7{u!GIS*(+f@My|(XS5afaONfErj}F|01XCe?(QtkPz2I#n>l&I z8SC>(@{>!7Qd1R@^Ycm)GxLfSic-^3i&FEFQx!_`74q`)QY$ixOEUA)6;kq(OLJ56 zN)#S7%)lBNiRo$iMXAY&#U;8xB2~Azq%@`SQNv7y=v1IBdO(9?pffgxjZ b9+Nhkbe1EKJ^4PL%w%PLEk^sve*ED8Agqpu delta 298 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 JMq@nv{{Xc&_p|^2 literal 44464 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. AgForecast is an interesting case study, because it implements its REST API using FastAPI, which in turn uses [ASGI](https://asgi.readthedocs.io/en/latest/), the so-called "spiritual successor" to WSGI, which we recently started supporting in OpenLambda. WSGI is the basis for popular Python web-programming packages such as Django and Flask; new ASGI support opens the door to an even broader range of applications. + +In this post, we describe the challenges of porting AgForecast to OL, and four new features we added to OL to make deployment of similar applications in the future simpler. The features are built-in ASGI support, direct GitHub-to-OL deployments, OL function environment variables, and OL-based pip compilation. \ No newline at end of file diff --git a/_build/html/blog.html b/_build/html/blog.html index 6de3d01..dca8da9 100644 --- a/_build/html/blog.html +++ b/_build/html/blog.html @@ -155,6 +155,12 @@

+
  • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
  • + @@ -168,11 +174,27 @@

    Tags

      -
    • +
    • + agforecast +
    • + +
    • announcement
    • -
    • +
    • + asgi +
    • + +
    • + case-study +
    • + +
    • + fastapi +
    • + +
    • openlambda
    • @@ -186,6 +208,10 @@

        +
      • + Case Studies (1) +
      • +
      • Releases (1)
      • @@ -201,7 +227,7 @@

        @@ -450,6 +476,106 @@


        + +
        +

        + An Application Case Study: Forecasting Crop Disease with OpenLambda +

        + +

        Maria Oros, Data Science Institute, University of Wisconsin–Madison
        +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

        +

        Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

        +

        + + + +

        + Read more ... +

        +
        +
        diff --git a/_build/html/blog/2026.html b/_build/html/blog/2026.html index 10287ab..ac146bc 100644 --- a/_build/html/blog/2026.html +++ b/_build/html/blog/2026.html @@ -155,6 +155,12 @@

        +
      • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
      • +

      @@ -168,11 +174,27 @@

      Tags

        -
      • +
      • + agforecast +
      • + +
      • announcement
      • -
      • +
      • + asgi +
      • + +
      • + case-study +
      • + +
      • + fastapi +
      • + +
      • openlambda
      • @@ -186,6 +208,10 @@

          +
        • + Case Studies (1) +
        • +
        • Releases (1)
        • @@ -201,7 +227,7 @@

          @@ -454,6 +480,106 @@


          + +
          +

          + An Application Case Study: Forecasting Crop Disease with OpenLambda +

          + +

          Maria Oros, Data Science Institute, University of Wisconsin–Madison
          +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

          +

          Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

          +

          + + + +

          + Read more ... +

          +
          +
          diff --git a/_build/html/blog/2026/atom.xml b/_build/html/blog/2026/atom.xml index f2812f9..c5bc476 100644 --- a/_build/html/blog/2026/atom.xml +++ b/_build/html/blog/2026/atom.xml @@ -2,7 +2,7 @@ https://open-lambda.github.io/ OpenLambda Blog - Posted in 2026 - 2026-05-18T20:49:10.786309+00:00 + 2026-05-18T21:40:18.247222+00:00 ABlog @@ -43,4 +43,46 @@ notes, performance experiments, and design discussions. 2026-05-18T00:00:00-05:00 + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + diff --git a/_build/html/blog/archive.html b/_build/html/blog/archive.html index 2c6fc4e..36c0d83 100644 --- a/_build/html/blog/archive.html +++ b/_build/html/blog/archive.html @@ -155,6 +155,12 @@

          +
        • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
        • +

        @@ -168,11 +174,27 @@

        Tags

          -
        • +
        • + agforecast +
        • + +
        • announcement
        • -
        • +
        • + asgi +
        • + +
        • + case-study +
        • + +
        • + fastapi +
        • + +
        • openlambda
        • @@ -186,6 +208,10 @@

            +
          • + Case Studies (1) +
          • +
          • Releases (1)
          • @@ -201,7 +227,7 @@

            @@ -369,6 +395,15 @@

            +
            +

            + + 2026-05-18 + - + An Application Case Study: Forecasting Crop Disease with OpenLambda +

            +
            + diff --git a/_build/html/blog/atom.xml b/_build/html/blog/atom.xml index 7d4b528..9d45437 100644 --- a/_build/html/blog/atom.xml +++ b/_build/html/blog/atom.xml @@ -2,7 +2,7 @@ https://open-lambda.github.io/ OpenLambda Blog - 2026-05-18T20:49:10.778644+00:00 + 2026-05-18T21:40:18.234517+00:00 ABlog @@ -43,4 +43,46 @@ notes, performance experiments, and design discussions. 2026-05-18T00:00:00-05:00 + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./." + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + diff --git a/_build/html/blog/author.html b/_build/html/blog/author.html index dea6f06..e4729e5 100644 --- a/_build/html/blog/author.html +++ b/_build/html/blog/author.html @@ -155,6 +155,12 @@

            +
          • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
          • +

          @@ -168,11 +174,27 @@

          Tags

            -
          • +
          • + agforecast +
          • + +
          • announcement
          • -
          • +
          • + asgi +
          • + +
          • + case-study +
          • + +
          • + fastapi +
          • + +
          • openlambda
          • @@ -186,6 +208,10 @@

              +
            • + Case Studies (1) +
            • +
            • Releases (1)
            • @@ -201,7 +227,7 @@

              @@ -352,6 +378,44 @@

              +
              +

              + Posts by + Maria Oros + +

              + +
              +

              + + 2026-05-18 + - + An Application Case Study: Forecasting Crop Disease with OpenLambda +

              +
              + +
              + + +

              + + + + + + + + Posts by Maria Oros — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + + + + + + + + + + +
              +
              +
              +
              +
              + +
              + +
              + + + + + +
              +
              + + + + + +
              + + + + + + + + + + + + + +
              + +
              + + + +
              + +
              +
              + +
              +
              + +
              + +
              + +
              + + +
              + +
              + +
              + + + + + + + + + + + + + + + + + + + +
              + +
              + +
              +
              + + + +
              +

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

              + + + + + Posts by Maria Oros + +

              + +
              +

              + An Application Case Study: Forecasting Crop Disease with OpenLambda +

              + +

              Maria Oros, Data Science Institute, University of Wisconsin–Madison
              +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

              +

              Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

              +

              + + + +

              + Read more ... +

              +
              +
              + +
              + +
              + + + + + + +
              + +
              +
              +
              + +
              + + + + +
              +
              + + +
              + + +
              +
              +
              + + + + + +
              +
              + + \ No newline at end of file diff --git a/_build/html/blog/author/maria-oros/atom.xml b/_build/html/blog/author/maria-oros/atom.xml new file mode 100644 index 0000000..9f02b6e --- /dev/null +++ b/_build/html/blog/author/maria-oros/atom.xml @@ -0,0 +1,51 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts by Maria Oros + 2026-05-18T21:40:18.238902+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/author" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/author/openlambda-team.html b/_build/html/blog/author/openlambda-team.html index 083accd..2c238c4 100644 --- a/_build/html/blog/author/openlambda-team.html +++ b/_build/html/blog/author/openlambda-team.html @@ -155,6 +155,12 @@

              +
            • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
            • +

            @@ -168,11 +174,27 @@

            Tags

              -
            • +
            • + agforecast +
            • + +
            • announcement
            • -
            • +
            • + asgi +
            • + +
            • + case-study +
            • + +
            • + fastapi +
            • + +
            • openlambda
            • @@ -186,6 +208,10 @@

                +
              • + Case Studies (1) +
              • +
              • Releases (1)
              • @@ -201,7 +227,7 @@

                diff --git a/_build/html/blog/author/openlambda-team/atom.xml b/_build/html/blog/author/openlambda-team/atom.xml index 60a39f8..8bc17fc 100644 --- a/_build/html/blog/author/openlambda-team/atom.xml +++ b/_build/html/blog/author/openlambda-team/atom.xml @@ -2,7 +2,7 @@ https://open-lambda.github.io/ OpenLambda Blog - Posts by OpenLambda Team - 2026-05-18T20:49:10.782865+00:00 + 2026-05-18T21:40:18.241543+00:00 ABlog diff --git a/_build/html/blog/author/tyler-caraza-harter.html b/_build/html/blog/author/tyler-caraza-harter.html new file mode 100644 index 0000000..e1b8ada --- /dev/null +++ b/_build/html/blog/author/tyler-caraza-harter.html @@ -0,0 +1,561 @@ + + + + + + + + + + Posts by Tyler Caraza-Harter — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                + + + + + + + + + + +
                +
                +
                +
                +
                + +
                + +
                + + + + + +
                +
                + + + + + +
                + + + + + + + + + + + + + +
                + +
                + + + +
                + +
                +
                + +
                +
                + +
                + +
                + +
                + + +
                + +
                + +
                + + + + + + + + + + + + + + + + + + + +
                + +
                + +
                +
                + + + +
                +

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

                + + + + + Posts by Tyler Caraza-Harter + +

                + +
                +

                + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                + +

                Maria Oros, Data Science Institute, University of Wisconsin–Madison
                +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                +

                Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                +

                + + + +

                + Read more ... +

                +
                +
                + +
                + +
                + + + + + + +
                + +
                +
                +
                + +
                + + + + +
                +
                + + +
                + + +
                +
                +
                + + + + + +
                +
                + + \ No newline at end of file diff --git a/_build/html/blog/author/tyler-caraza-harter/atom.xml b/_build/html/blog/author/tyler-caraza-harter/atom.xml new file mode 100644 index 0000000..934c222 --- /dev/null +++ b/_build/html/blog/author/tyler-caraza-harter/atom.xml @@ -0,0 +1,51 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts by Tyler Caraza-Harter + 2026-05-18T21:40:18.240305+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/author" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/category.html b/_build/html/blog/category.html index 16f1f79..9dc07aa 100644 --- a/_build/html/blog/category.html +++ b/_build/html/blog/category.html @@ -155,6 +155,12 @@

                +
              • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
              • +

              @@ -168,11 +174,27 @@

              Tags

                -
              • +
              • + agforecast +
              • + +
              • announcement
              • -
              • +
              • + asgi +
              • + +
              • + case-study +
              • + +
              • + fastapi +
              • + +
              • openlambda
              • @@ -186,6 +208,10 @@

                  +
                • + Case Studies (1) +
                • +
                • Releases (1)
                • @@ -201,7 +227,7 @@

                  @@ -352,6 +378,25 @@

                  +
                  +

                  + Posts in + Case Studies + +

                  + +
                  +

                  + + 2026-05-18 + - + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                  +
                  + +
                  +

                  + + + + + + + + Posts in Case Studies — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                  + + + + + + + + + + +
                  +
                  +
                  +
                  +
                  + +
                  + +
                  + + + + + +
                  +
                  + + + + + +
                  + + + + + + + + + + + + + +
                  + +
                  + + + +
                  + +
                  +
                  + +
                  +
                  + +
                  + +
                  + +
                  + + +
                  + +
                  + +
                  + + + + + + + + + + + + + + + + + + + +
                  + +
                  + +
                  +
                  + + + +
                  +

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

                  + + + + + Posts in Case Studies + +

                  + +
                  +

                  + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                  + +

                  Maria Oros, Data Science Institute, University of Wisconsin–Madison
                  +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                  +

                  Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                  +

                  + + + +

                  + Read more ... +

                  +
                  +
                  + +
                  + +
                  + + + + + + +
                  + +
                  +
                  +
                  + +
                  + + + + +
                  +
                  + + +
                  + + +
                  +
                  +
                  + + + + + +
                  +
                  + + \ No newline at end of file diff --git a/_build/html/blog/category/case-studies/atom.xml b/_build/html/blog/category/case-studies/atom.xml new file mode 100644 index 0000000..133aedc --- /dev/null +++ b/_build/html/blog/category/case-studies/atom.xml @@ -0,0 +1,51 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts in Case Studies + 2026-05-18T21:40:18.244931+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/category" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/category/releases.html b/_build/html/blog/category/releases.html index 8f65cf3..edbc843 100644 --- a/_build/html/blog/category/releases.html +++ b/_build/html/blog/category/releases.html @@ -155,6 +155,12 @@

                  +
                • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
                • +

                @@ -168,11 +174,27 @@

                Tags

                  -
                • +
                • + agforecast +
                • + +
                • announcement
                • -
                • +
                • + asgi +
                • + +
                • + case-study +
                • + +
                • + fastapi +
                • + +
                • openlambda
                • @@ -186,6 +208,10 @@

                    +
                  • + Case Studies (1) +
                  • +
                  • Releases (1)
                  • @@ -201,7 +227,7 @@

                    diff --git a/_build/html/blog/category/releases/atom.xml b/_build/html/blog/category/releases/atom.xml index 27ec46d..674510a 100644 --- a/_build/html/blog/category/releases/atom.xml +++ b/_build/html/blog/category/releases/atom.xml @@ -2,7 +2,7 @@ https://open-lambda.github.io/ OpenLambda Blog - Posts in Releases - 2026-05-18T20:49:10.785174+00:00 + 2026-05-18T21:40:18.246122+00:00 ABlog diff --git a/_build/html/blog/drafts.html b/_build/html/blog/drafts.html index c2ea681..6760eb4 100644 --- a/_build/html/blog/drafts.html +++ b/_build/html/blog/drafts.html @@ -155,6 +155,12 @@

                    +
                  • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
                  • +

                  @@ -168,11 +174,27 @@

                  Tags

                    -
                  • +
                  • + agforecast +
                  • + +
                  • announcement
                  • -
                  • +
                  • + asgi +
                  • + +
                  • + case-study +
                  • + +
                  • + fastapi +
                  • + +
                  • openlambda
                  • @@ -186,6 +208,10 @@

                    @@ -168,11 +175,27 @@

                    Tags

                      -
                    • +
                    • + agforecast +
                    • + +
                    • announcement
                    • -
                    • +
                    • + asgi +
                    • + +
                    • + case-study +
                    • + +
                    • + fastapi +
                    • + +
                    • openlambda
                    • @@ -186,6 +209,10 @@

                        +
                      • + Case Studies (1) +
                      • +
                      • Releases (1)
                      • @@ -201,7 +228,7 @@

                        @@ -355,6 +382,49 @@

                        OpenLambda Blog

                        OpenLambda Blog#

                        News, releases, and technical deep-dives from the OpenLambda project.

                          +
                        • An Application Case Study: Forecasting Crop Disease with OpenLambdaMaria Oros, Tyler Caraza-Harter, May 18, 2026

                          +

                          Maria Oros, Data Science Institute, University of Wisconsin–Madison
                          +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison + +

                          +

                          Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + +

                          +
                        • Hello, OpenLambda BlogOpenLambda Team, May 18, 2026

                          Welcome to the new OpenLambda blog. We’ll use this space to share release notes, performance experiments, and design discussions. @@ -425,6 +495,15 @@

                          OpenLambda BlogAgricultural Forecasting API

                          + +
                          +

                          next

                          +

                          Hello, OpenLambda Blog

                          +
                          + +
                          diff --git a/_build/html/blog/language.html b/_build/html/blog/language.html index dec5673..81f0e44 100644 --- a/_build/html/blog/language.html +++ b/_build/html/blog/language.html @@ -155,6 +155,12 @@

                        • +
                        • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
                        • +
                        @@ -168,11 +174,27 @@

                        Tags

                          -
                        • +
                        • + agforecast +
                        • + +
                        • announcement
                        • -
                        • +
                        • + asgi +
                        • + +
                        • + case-study +
                        • + +
                        • + fastapi +
                        • + +
                        • openlambda
                        • @@ -186,6 +208,10 @@

                          @@ -168,11 +174,27 @@

                          Tags

                            -
                          • +
                          • + agforecast +
                          • + +
                          • announcement
                          • -
                          • +
                          • + asgi +
                          • + +
                          • + case-study +
                          • + +
                          • + fastapi +
                          • + +
                          • openlambda
                          • @@ -186,6 +208,10 @@

                              +
                            • + Case Studies (1) +
                            • +
                            • Releases (1)
                            • @@ -201,7 +227,7 @@

                              @@ -454,6 +480,106 @@


                              + +
                              +

                              + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                              + +

                              Maria Oros, Data Science Institute, University of Wisconsin–Madison
                              +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                              +

                              Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                              +

                              + + + +

                              + Read more ... +

                              +
                              +
                              diff --git a/_build/html/blog/language/en/atom.xml b/_build/html/blog/language/en/atom.xml index 6a6762f..b96fdbb 100644 --- a/_build/html/blog/language/en/atom.xml +++ b/_build/html/blog/language/en/atom.xml @@ -2,7 +2,7 @@ https://open-lambda.github.io/ OpenLambda Blog - Posts in en - 2026-05-18T20:49:10.784103+00:00 + 2026-05-18T21:40:18.242715+00:00 ABlog @@ -43,4 +43,46 @@ notes, performance experiments, and design discussions. 2026-05-18T00:00:00-05:00 + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/language" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + diff --git a/_build/html/blog/post/2026-05-18-ag-forecasting-case-study.html b/_build/html/blog/post/2026-05-18-ag-forecasting-case-study.html new file mode 100644 index 0000000..6c35ed3 --- /dev/null +++ b/_build/html/blog/post/2026-05-18-ag-forecasting-case-study.html @@ -0,0 +1,561 @@ + + + + + + + + + + + An Application Case Study: Forecasting Crop Disease with OpenLambda — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                              + + + + + + + + + + +
                              +
                              +
                              +
                              +
                              + +
                              + +
                              + + + + + +
                              +
                              + + + + + +
                              + + + + + + + + + + + + + +
                              + +
                              + + + +
                              + +
                              +
                              + +
                              +
                              + +
                              + +
                              + +
                              + + +
                              + +
                              + +
                              + + + + + + + + + + + + + + + + + + + +
                              + +
                              + +
                              +
                              + + + +
                              +

                              An Application Case Study: Forecasting Crop Disease with OpenLambda

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

                              An Application Case Study: Forecasting Crop Disease with OpenLambda#

                              +

                              Maria Oros, Data Science Institute, University of Wisconsin–Madison
                              +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                              +

                              Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                              +

                              Recently, we selected an agricultural forecasting application (AgForecast), developed by the Data Science Institute at UW–Madison, to port to OpenLambda: UW-Madison-DSI/ag_forecasting_api. AgForecast is an interesting case study, because it implements its REST API using FastAPI, which in turn uses ASGI, the so-called “spiritual successor” to WSGI, which we recently started supporting in OpenLambda. WSGI is the basis for popular Python web-programming packages such as Django and Flask; new ASGI support opens the door to an even broader range of applications.

                              +

                              In this post, we describe the challenges of porting AgForecast to OL, and four new features we added to OL to make deployment of similar applications in the future simpler. The features are built-in ASGI support, direct GitHub-to-OL deployments, OL function environment variables, and OL-based pip compilation.

                              +
                              + + + +
                              + + + +
                              + +
                              + + + + + + +
                              + +
                              +
                              +
                              + +
                              + + + + +
                              +
                              + + +
                              + + +
                              +
                              +
                              + + + + + +
                              +
                              + + \ No newline at end of file diff --git a/_build/html/blog/post/2026-05-18-hello-world.html b/_build/html/blog/post/2026-05-18-hello-world.html index bb9539d..4359895 100644 --- a/_build/html/blog/post/2026-05-18-hello-world.html +++ b/_build/html/blog/post/2026-05-18-hello-world.html @@ -59,7 +59,8 @@ - + + @@ -213,6 +212,12 @@

                              @@ -226,11 +231,27 @@

                              Tags

                                -
                              • +
                              • + agforecast +
                              • + +
                              • announcement
                              • -
                              • +
                              • + asgi +
                              • + +
                              • + case-study +
                              • + +
                              • + fastapi +
                              • + +
                              • openlambda
                              • @@ -244,6 +265,10 @@

                                @@ -168,11 +174,27 @@

                                Tags

                                  -
                                • +
                                • + agforecast +
                                • + +
                                • announcement
                                • -
                                • +
                                • + asgi +
                                • + +
                                • + case-study +
                                • + +
                                • + fastapi +
                                • + +
                                • openlambda
                                • @@ -186,6 +208,10 @@

                                    +
                                  • + Case Studies (1) +
                                  • +
                                  • Releases (1)
                                  • @@ -201,7 +227,7 @@

                                    @@ -352,6 +378,25 @@

                                    +
                                    +

                                    + Posts tagged + agforecast + +

                                    + +
                                    +

                                    + + 2026-05-18 + - + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                    +
                                    + +
                                    +

                                    +
                                    +

                                    + Posts tagged + asgi + +

                                    + +
                                    +

                                    + + 2026-05-18 + - + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                    +
                                    + +
                                    + +
                                    +

                                    + Posts tagged + case-study + +

                                    + +
                                    +

                                    + + 2026-05-18 + - + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                    +
                                    + +
                                    + +
                                    +

                                    + Posts tagged + fastapi + +

                                    + +
                                    +

                                    + + 2026-05-18 + - + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                    +
                                    + +
                                    +

                                    +
                                    +

                                    + + 2026-05-18 + - + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                    +
                                    +
                                    diff --git a/_build/html/blog/tag/agforecast.html b/_build/html/blog/tag/agforecast.html new file mode 100644 index 0000000..6dbfce6 --- /dev/null +++ b/_build/html/blog/tag/agforecast.html @@ -0,0 +1,561 @@ + + + + + + + + + + Posts tagged agforecast — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                    + + + + + + + + + + +
                                    +
                                    +
                                    +
                                    +
                                    + +
                                    + +
                                    + + + + + +
                                    +
                                    + + + + + +
                                    + + + + + + + + + + + + + +
                                    + +
                                    + + + +
                                    + +
                                    +
                                    + +
                                    +
                                    + +
                                    + +
                                    + +
                                    + + +
                                    + +
                                    + +
                                    + + + + + + + + + + + + + + + + + + + +
                                    + +
                                    + +
                                    +
                                    + + + +
                                    +

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

                                    + + + + + Posts tagged agforecast + +

                                    + +
                                    +

                                    + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                    + +

                                    Maria Oros, Data Science Institute, University of Wisconsin–Madison
                                    +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                                    +

                                    Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                                    +

                                    + + + +

                                    + Read more ... +

                                    +
                                    +
                                    + +
                                    + +
                                    + + + + + + +
                                    + +
                                    +
                                    +
                                    + +
                                    + + + + +
                                    +
                                    + + +
                                    + + +
                                    +
                                    +
                                    + + + + + +
                                    +
                                    + + \ No newline at end of file diff --git a/_build/html/blog/tag/agforecast/atom.xml b/_build/html/blog/tag/agforecast/atom.xml new file mode 100644 index 0000000..fe37ac3 --- /dev/null +++ b/_build/html/blog/tag/agforecast/atom.xml @@ -0,0 +1,51 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts tagged agforecast + 2026-05-18T21:40:18.249385+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/tag" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/tag/announcement.html b/_build/html/blog/tag/announcement.html index d5f233d..e78ce32 100644 --- a/_build/html/blog/tag/announcement.html +++ b/_build/html/blog/tag/announcement.html @@ -155,6 +155,12 @@

                                    +
                                  • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
                                  • +

                                  @@ -168,11 +174,27 @@

                                  Tags

                                    -
                                  • +
                                  • + agforecast +
                                  • + +
                                  • announcement
                                  • -
                                  • +
                                  • + asgi +
                                  • + +
                                  • + case-study +
                                  • + +
                                  • + fastapi +
                                  • + +
                                  • openlambda
                                  • @@ -186,6 +208,10 @@

                                      +
                                    • + Case Studies (1) +
                                    • +
                                    • Releases (1)
                                    • @@ -201,7 +227,7 @@

                                      diff --git a/_build/html/blog/tag/announcement/atom.xml b/_build/html/blog/tag/announcement/atom.xml index c817040..07a2d44 100644 --- a/_build/html/blog/tag/announcement/atom.xml +++ b/_build/html/blog/tag/announcement/atom.xml @@ -2,7 +2,7 @@ https://open-lambda.github.io/ OpenLambda Blog - Posts tagged announcement - 2026-05-18T20:49:10.787417+00:00 + 2026-05-18T21:40:18.250561+00:00 ABlog diff --git a/_build/html/blog/tag/asgi.html b/_build/html/blog/tag/asgi.html new file mode 100644 index 0000000..5f9b747 --- /dev/null +++ b/_build/html/blog/tag/asgi.html @@ -0,0 +1,561 @@ + + + + + + + + + + Posts tagged asgi — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + + + + + + + + +
                                      +
                                      +
                                      +
                                      +
                                      + +
                                      + +
                                      + + + + + +
                                      +
                                      + + + + + +
                                      + + + + + + + + + + + + + +
                                      + +
                                      + + + +
                                      + +
                                      +
                                      + +
                                      +
                                      + +
                                      + +
                                      + +
                                      + + +
                                      + +
                                      + +
                                      + + + + + + + + + + + + + + + + + + + +
                                      + +
                                      + +
                                      +
                                      + + + +
                                      +

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

                                      + + + + + Posts tagged asgi + +

                                      + +
                                      +

                                      + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                      + +

                                      Maria Oros, Data Science Institute, University of Wisconsin–Madison
                                      +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                                      +

                                      Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                                      +

                                      + + + +

                                      + Read more ... +

                                      +
                                      +
                                      + +
                                      + +
                                      + + + + + + +
                                      + +
                                      +
                                      +
                                      + +
                                      + + + + +
                                      +
                                      + + +
                                      + + +
                                      +
                                      +
                                      + + + + + +
                                      +
                                      + + \ No newline at end of file diff --git a/_build/html/blog/tag/asgi/atom.xml b/_build/html/blog/tag/asgi/atom.xml new file mode 100644 index 0000000..9a5d1a1 --- /dev/null +++ b/_build/html/blog/tag/asgi/atom.xml @@ -0,0 +1,51 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts tagged asgi + 2026-05-18T21:40:18.251674+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/tag" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/tag/case-study.html b/_build/html/blog/tag/case-study.html new file mode 100644 index 0000000..3361874 --- /dev/null +++ b/_build/html/blog/tag/case-study.html @@ -0,0 +1,561 @@ + + + + + + + + + + Posts tagged case-study — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + + + + + + + + +
                                      +
                                      +
                                      +
                                      +
                                      + +
                                      + +
                                      + + + + + +
                                      +
                                      + + + + + +
                                      + + + + + + + + + + + + + +
                                      + +
                                      + + + +
                                      + +
                                      +
                                      + +
                                      +
                                      + +
                                      + +
                                      + +
                                      + + +
                                      + +
                                      + +
                                      + + + + + + + + + + + + + + + + + + + +
                                      + +
                                      + +
                                      +
                                      + + + +
                                      +

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

                                      + + + + + Posts tagged case-study + +

                                      + +
                                      +

                                      + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                      + +

                                      Maria Oros, Data Science Institute, University of Wisconsin–Madison
                                      +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                                      +

                                      Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                                      +

                                      + + + +

                                      + Read more ... +

                                      +
                                      +
                                      + +
                                      + +
                                      + + + + + + +
                                      + +
                                      +
                                      +
                                      + +
                                      + + + + +
                                      +
                                      + + +
                                      + + +
                                      +
                                      +
                                      + + + + + +
                                      +
                                      + + \ No newline at end of file diff --git a/_build/html/blog/tag/case-study/atom.xml b/_build/html/blog/tag/case-study/atom.xml new file mode 100644 index 0000000..2ee7f24 --- /dev/null +++ b/_build/html/blog/tag/case-study/atom.xml @@ -0,0 +1,51 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts tagged case-study + 2026-05-18T21:40:18.252875+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/tag" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/tag/fastapi.html b/_build/html/blog/tag/fastapi.html new file mode 100644 index 0000000..2112abc --- /dev/null +++ b/_build/html/blog/tag/fastapi.html @@ -0,0 +1,561 @@ + + + + + + + + + + Posts tagged fastapi — OpenLambda + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                                      + + + + + + + + + + +
                                      +
                                      +
                                      +
                                      +
                                      + +
                                      + +
                                      + + + + + +
                                      +
                                      + + + + + +
                                      + + + + + + + + + + + + + +
                                      + +
                                      + + + +
                                      + +
                                      +
                                      + +
                                      +
                                      + +
                                      + +
                                      + +
                                      + + +
                                      + +
                                      + +
                                      + + + + + + + + + + + + + + + + + + + +
                                      + +
                                      + +
                                      +
                                      + + + +
                                      +

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

                                      + + + + + Posts tagged fastapi + +

                                      + +
                                      +

                                      + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                      + +

                                      Maria Oros, Data Science Institute, University of Wisconsin–Madison
                                      +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                                      +

                                      Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                                      +

                                      + + + +

                                      + Read more ... +

                                      +
                                      +
                                      + +
                                      + +
                                      + + + + + + +
                                      + +
                                      +
                                      +
                                      + +
                                      + + + + +
                                      +
                                      + + +
                                      + + +
                                      +
                                      +
                                      + + + + + +
                                      +
                                      + + \ No newline at end of file diff --git a/_build/html/blog/tag/fastapi/atom.xml b/_build/html/blog/tag/fastapi/atom.xml new file mode 100644 index 0000000..84bf9da --- /dev/null +++ b/_build/html/blog/tag/fastapi/atom.xml @@ -0,0 +1,51 @@ + + + https://open-lambda.github.io/ + OpenLambda Blog - Posts tagged fastapi + 2026-05-18T21:40:18.254639+00:00 + + + ABlog + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/tag" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + + diff --git a/_build/html/blog/tag/openlambda.html b/_build/html/blog/tag/openlambda.html index 97cef07..3c34508 100644 --- a/_build/html/blog/tag/openlambda.html +++ b/_build/html/blog/tag/openlambda.html @@ -155,6 +155,12 @@

                                      +
                                    • + + 18 May - An Application Case Study: Forecasting Crop Disease with OpenLambda + +
                                    • +

                                    @@ -168,11 +174,27 @@

                                    Tags

                                      -
                                    • +
                                    • + agforecast +
                                    • + +
                                    • announcement
                                    • -
                                    • +
                                    • + asgi +
                                    • + +
                                    • + case-study +
                                    • + +
                                    • + fastapi +
                                    • + +
                                    • openlambda
                                    • @@ -186,6 +208,10 @@

                                        +
                                      • + Case Studies (1) +
                                      • +
                                      • Releases (1)
                                      • @@ -201,7 +227,7 @@

                                        @@ -454,6 +480,106 @@


                                        + +
                                        +

                                        + An Application Case Study: Forecasting Crop Disease with OpenLambda +

                                        + +

                                        Maria Oros, Data Science Institute, University of Wisconsin–Madison
                                        +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

                                        +

                                        Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

                                        +

                                        + + + +

                                        + Read more ... +

                                        +
                                        +
                                        diff --git a/_build/html/blog/tag/openlambda/atom.xml b/_build/html/blog/tag/openlambda/atom.xml index 309ee8c..8ec31c3 100644 --- a/_build/html/blog/tag/openlambda/atom.xml +++ b/_build/html/blog/tag/openlambda/atom.xml @@ -2,7 +2,7 @@ https://open-lambda.github.io/ OpenLambda Blog - Posts tagged openlambda - 2026-05-18T20:49:10.788423+00:00 + 2026-05-18T21:40:18.255820+00:00 ABlog @@ -43,4 +43,46 @@ notes, performance experiments, and design discussions. 2026-05-18T00:00:00-05:00 + + https://open-lambda.github.io/blog/post/2026-05-18-ag-forecasting-case-study.html + An Application Case Study: Forecasting Crop Disease with OpenLambda + 2026-05-18T00:00:00-05:00 + + Tyler Caraza-Harter + + <p class="ablog-post-excerpt"><p><em>Maria Oros, Data Science Institute, University of Wisconsin–Madison</em><br /> +<em>Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison</em></p> +<p>Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.</p> +</p> + + <script type="text/x-thebe-config"> + { + requestKernel: true, + binderOptions: { + repo: "binder-examples/jupyter-stacks-datascience", + ref: "master", + }, + codeMirrorConfig: { + theme: "abcdef", + mode: "python" + }, + kernelOptions: { + name: "python3", + path: "./blog/tag" + }, + predefinedOutput: true + } + </script> + <script>kernelName = 'python3'</script> + + Maria Oros, Data Science Institute, University of Wisconsin–Madison<br /> +\\ +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–MadisonOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. + + + + + + 2026-05-18T00:00:00-05:00 + diff --git a/_build/html/genindex.html b/_build/html/genindex.html index 1e02632..3ef730f 100644 --- a/_build/html/genindex.html +++ b/_build/html/genindex.html @@ -178,7 +178,8 @@
                                      • Agricultural Forecasting API
                                      -
                                    • Blog
                                      diff --git a/_build/html/index.html b/_build/html/index.html index 1a706c3..9d98970 100644 --- a/_build/html/index.html +++ b/_build/html/index.html @@ -189,7 +189,8 @@
                                    • Agricultural Forecasting API
                                    -
                                  • Blog
                                    diff --git a/_build/html/objects.inv b/_build/html/objects.inv index 95991da..b7f1890 100644 --- a/_build/html/objects.inv +++ b/_build/html/objects.inv @@ -2,5 +2,4 @@ # Project: Project name not set # Version: # The remainder of this file is compressed using zlib. -xڅRAN0+6q JDDĪc[&nI͚ݝuo/pPx`$eR@+p}]R\\ºU3Bʔx8(*zW%UYcVg?sRHH,~@\o!&fG^–;ւgq%m@r ˈu\h2C2DSǀ( qIYzn$Qmdss69p?^ihTtPTXJu:#KjW(9T[FLV 󚭯7 -1#Ѿ \ No newline at end of file +xڭSKN0O% ؅JDTĪkG$nӴJ+5of=[<;Lb4Hfqe839- 3^ #`|:1kqq /MJ¤$@PDӭ:A;!ԑׇyMu}:֦&οP+]TGI`hôUmilY̴.QZj;Tb}E,>_}A \ No newline at end of file diff --git a/_build/html/search.html b/_build/html/search.html index e0fcd45..610a244 100644 --- a/_build/html/search.html +++ b/_build/html/search.html @@ -187,7 +187,8 @@
                                  • Agricultural Forecasting API
                                  -
                                • Blog
                                  diff --git a/_build/html/searchindex.js b/_build/html/searchindex.js index 4df1dfc..0fb07af 100644 --- a/_build/html/searchindex.js +++ b/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"1. Clone the repo and copy these files in": [[0, "clone-the-repo-and-copy-these-files-in"]], "Agricultural Forecasting API": [[1, null]], "Applications": [[2, null]], "Configuration": [[6, "configuration"]], "Deploying Multiple Workers": [[6, "deploying-multiple-workers"]], "File Structure": [[0, "file-structure"]], "Further Reading": [[6, "further-reading"]], "Hello, OpenLambda Blog": [[4, null]], "License": [[5, "license"]], "Local Preview": [[0, "local-preview"]], "One-Time Setup (do this once per repo)": [[0, "one-time-setup-do-this-once-per-repo"]], "OpenLambda": [[5, null]], "OpenLambda Blog": [[3, null]], "OpenLambda GitHub Pages \u2014 MyST Markdown Site": [[0, null]], "Overview": [[1, "overview"], [6, "overview"]], "Related Publications": [[5, "related-publications"]], "Starting the Worker": [[6, "starting-the-worker"]], "Want to deploy FastAPI apps on OpenLambda? Just ASGI us how.": [[2, "want-to-deploy-fastapi-apps-on-openlambda-just-asgi-us-how"]], "Worker": [[6, null]]}, "docnames": ["README", "applications/ag-forecasting-api", "applications/index", "blog/index", "blog/post/2026-05-18-hello-world", "index", "worker"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "applications/ag-forecasting-api.md", "applications/index.md", "blog/index.md", "blog/post/2026-05-18-hello-world.md", "index.md", "worker.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [2, 6], "0": [], "003663": [], "031": [], "05": [], "09": [], "10": [], "100": [], "1049": [], "11": [], "12": [], "1234": [], "14": [], "15": [], "16": 5, "17": 5, "18": [3, 5], "20": [], "2000": [], "2024": [], "2025": [], "2026": 3, "21": [], "24": 5, "28": [], "2878": [], "30": [], "31": [], "3250": [], "35": [], "366": [], "38": [], "404": [], "423": [], "43": [], "45": [], "4500": [], "4567": [], "5": [], "50": [], "6": [], "6h": [], "7": [], "7d": [], "8": [], "8000": [], "8080": 6, "85": [], "89": [], "9": [], "90": [], "92": [], "999": [], "A": [2, 6], "By": [], "For": 1, "In": 2, "It": 6, "No": 6, "On": 2, "That": [], "The": [1, 2, 5, 6], "To": [2, 6], "With": 5, "__init__": [], "_annotate_winter_rye_biomass": [], "_build": 0, "_build_daili": [], "_compute_winter_rye_biomass": [], "_config": 0, "_doi": [], "_fall": [], "_fetch_raw_hourli": [], "_run_pipelin": [], "_toc": 0, "_total": [], "about": 5, "abov": [], "aboveground": [], "absolut": [], "access": [], "accumul": [], "acquisit": [], "acr": [], "action": 0, "activ": [], "ad": [], "adapt": [], "add": [0, 2], "address": [2, 6], "adjust": 2, "after": 6, "ag": 2, "ag_api": [], "ag_forecast": [], "ag_forecasting_api": [], "ag_models_wrapp": [], "aggreg": [], "agricultur": 2, "agronom": [], "ahead": 2, "aiohttp": [], "air": [], "al": 5, "all": 0, "alongsid": 2, "alpin": [], "alreadi": 6, "also": [2, 5], "alten": [], "altn": [], "america": [], "an": [2, 5], "analysi": [], "annot": [], "apach": 5, "api": 2, "api_cach": [], "api_kei": [], "apotheci": [], "app": [], "app_v1": [], "appli": [], "applic": [], "approach": [2, 5, 6], "ar": [2, 5, 6], "arithmet": [], "arriv": 6, "asgi": 1, "assess": [], "assumpt": [], "async": 2, "atc": 5, "authent": [], "author": 5, "auto": 0, "automat": 0, "avail": [], "averag": [], "avg": [], "await": [], "awar": [], "axi": [], "b_": [], "b_0": [], "back": 6, "backend": 6, "backward": [], "balanc": [5, 6], "base": [1, 2, 5], "basic": [], "batch": [], "becaus": 2, "behind": 6, "believ": 2, "benefici": 2, "better": 2, "between": 6, "bill": 2, "bin": 6, "binari": 6, "biomass_color": [], "biomass_lb_acr": [], "biomass_messag": [], "biomass_result": [], "bit": 5, "block": 2, "book": 0, "boss": [5, 6], "both": 2, "branch": [], "broader": 2, "broadli": 2, "browser": 0, "build": [0, 2, 6], "built": [], "bulk": [], "bundl": 0, "busi": [], "c": [], "cach": [], "calc": [], "calcul": [], "calculate_tarspot_risk": [], "calculate_winter_rye_biomass": [], "call": 6, "caller": 6, "can": [2, 5, 6], "cap": [], "capabl": [], "case": [], "categori": [], "cd": 0, "cdn": [], "cdot": [], "central": [5, 6], "cercospora": [], "chang": 2, "chapter": [], "characterist": [], "check": [1, 6], "chicago": [], "choic": 2, "chunk": [], "citi": [], "class": [], "classif": [], "classifi": [], "client": [], "clone": [], "cloud comput": 5, "cluster": [5, 6], "cmd": [], "co": 2, "coeffici": [], "col": [], "cold": 6, "color": [], "columbia": [], "column": [], "com": 0, "combin": 1, "commit": 0, "compat": [], "compon": 6, "comput": [2, 5], "compute_risks_in_parallel": [], "concern": 2, "concurr": 2, "conda": [], "config": 6, "configur": [], "confirm": [], "connect": [], "consolid": 2, "constant": [], "constraint": 2, "contact": [], "contain": [5, 6], "container": [], "content": 0, "context": [], "continu": 2, "contribut": 2, "convers": [], "convert": [], "coordin": 6, "copi": [], "core": 6, "corn": [], "could": 5, "counti": [], "cover": [], "coverag": [], "creat": [], "credenti": [], "crop": 1, "ctrl": [], "cumsum": [], "cumul": [], "curl": 6, "current": [5, 6], "curv": [], "cycl": [], "dai": [], "daili": [], "damon": [], "dashboard": [], "data": [1, 2], "datafram": [], "dataframe_to_featurecollect": [], "date": [], "datetim": [], "dd": [], "decim": [], "decis": [], "deep": 3, "deeper": 2, "def": [], "default": 6, "definit": [], "degre": [], "demand": 2, "dens": [], "dep": 0, "depend": 2, "deploi": [0, 5], "deploy": [2, 6], "deprec": [], "describ": 6, "descript": 6, "design": [2, 3, 4], "detail": 5, "detect": 2, "dev": 2, "develop": [1, 6], "dew": [], "dir": [], "direct": [], "directori": 6, "discuss": [3, 4], "diseas": 1, "disease_metadata": [], "distinguish": 2, "dive": 3, "doc": [], "docker": 6, "dockerfil": [], "document": [0, 1], "doit": [], "domain": [], "door": 2, "drive": 2, "dry": [], "dsi": [], "dst": [], "dual": [], "dure": [], "e": [], "each": 6, "earlier": 2, "ecosystem": [], "edu": [], "effect": [], "emb": [], "embed": [], "emerg": [], "enabl": [2, 5], "endpoint": 6, "enhanc": [], "ensembl": [], "enter": 1, "entir": [], "entri": [], "environ": 2, "eros": [], "error": [], "establish": [], "estim": [], "et": 5, "etc": [], "evalu": [], "eventu": 5, "everi": [], "evolut": 2, "exampl": [], "example_callapi": [], "execut": 2, "expand": 2, "experi": [3, 4], "explor": 5, "export": [], "expos": 6, "extend": 2, "extract": [], "f": [], "fail": [], "fall": [], "fall_precip": [], "fall_start": [], "fallback": [], "far": 5, "farmer": [], "fastapi": 1, "faster": [2, 5], "featur": 2, "featurecollect": [], "fetch": [], "fetch_all_measurements_async": [], "fetch_wisconet_biomass": [], "field": 6, "file": [5, 6], "fillna": [], "filter": [], "fit": [2, 5], "fix": [], "follow": [], "forecast": 2, "forecasting_d": [], "forklift": 5, "format": [], "formula": [], "forward": 6, "found": [], "four": [], "frac": [], "framework": [], "friction": 2, "friendli": 2, "frogey": [], "frogeye_risk": [], "frogeye_risk_class": [], "from": [0, 2, 3, 6], "fromisoformat": [], "front": [5, 6], "function": [2, 6], "fundament": 2, "fungu": [], "further": 2, "g": [], "gdd": [], "gdd_0c": [], "gdd_sine": [], "gdd_total": [], "gener": [], "geojson": [], "geojson_adapt": [], "geojson_schema": [], "geometri": [], "geospati": 1, "get": [5, 6], "get_weather_with_risk": [], "gi": [], "git": 0, "github": 2, "gitignor": 0, "global": [], "globe": [], "gls_risk": [], "gls_risk_class": [], "go": [5, 6], "goal": 5, "grai": [], "green": [], "grow": [], "growth": [], "guid": 6, "ha": [], "handl": [], "handler": [], "haproxi": 6, "hard": [], "harmon": [], "health": [], "healthcheck": [], "hello": 3, "help": 2, "helper": [], "hendrickson": 5, "here": [0, 1, 5], "high": [], "higher": 2, "histor": [], "histori": 2, "hod": [], "homepag": 0, "hope": 5, "horizont": 6, "host": [], "hotcloud": 5, "hour": [], "hourli": [], "html": 0, "http": [0, 5, 6], "human": [], "humid": [], "i": [1, 2, 5, 6], "ibm_api_kei": [], "ibm_servic": [], "icdcsw": 5, "id": [], "identifi": [], "idl": 2, "imag": 6, "implement": [2, 5], "import": [], "improv": 2, "inact": [], "inch": [], "includ": 2, "incom": 6, "increment": 2, "independ": 6, "index": 0, "individu": [], "inflect": [], "influenc": 2, "info": [], "inform": [], "ingest": [], "initi": 5, "input": [], "insid": 6, "instal": 0, "institut": 1, "integr": [1, 2], "intellig": 1, "interact": [], "intercept": [], "interfac": 2, "interpol": [], "interpret": [], "interv": [], "invok": 5, "io": 0, "ipynb": [], "irrig": [], "issu": 2, "its": [1, 2, 6], "jaim": 2, "jb": [], "json": 6, "jupyt": 0, "just": 5, "jwt": [], "k": [], "keep": 6, "kei": 6, "label": [], "lambda": [0, 1, 2, 5, 6], "larg": 5, "last": [], "lat": [], "latenc": 6, "latitud": [], "layer": [], "lb": [], "leaf": [], "lean": 5, "left": [], "let": 2, "librari": 5, "lifecycl": 6, "like": 2, "limit": [], "line": [], "lint": [], "linux": [5, 6], "linux contain": 5, "list": [], "listen": 6, "ll": [3, 4], "lng": [], "load": [5, 6], "load_stations_sync": [], "loadbalanc": [], "local": [5, 6], "localhost": 6, "locat": 2, "log": 6, "log_level": [], "log_output": 6, "logic": [], "login": 5, "logist": [], "logit": [], "long": 2, "longitud": [], "longstand": 2, "look": 2, "low": [], "lower": [], "m": 0, "madison": 1, "mai": 3, "main": 5, "maintain": [], "make": 5, "manag": [5, 6], "manipul": [], "manual": [5, 6], "map": [], "materi": [], "math": [], "math_help": [], "mathemat": [], "max": [], "maydi": [], "md": [0, 5], "mean": [], "measur": [], "merg": [], "merge_biomass": [], "merge_station_metadata": [], "merge_wisconet_biomass": [], "mesonet": [], "messag": [], "metadata_stations_": [], "method": [], "metric": [], "min": [], "minim": 2, "minut": 6, "mitig": [], "mm": [], "mode": 5, "model": [1, 2], "model_schema": [], "moder": [], "modern": 2, "moistur": [], "mold": [], "monitor": [], "month": [], "more": [0, 2, 5], "mostli": 5, "mount": [], "mph": [], "multi": [1, 6], "multipl": 2, "multiprocess": [], "n": 6, "name": 6, "nation": [], "nativ": 2, "natur": 2, "need": 2, "network": [], "new": [2, 3, 4, 5], "next": 1, "nginx": 6, "nighttim": [], "noaa": [], "node": [5, 6], "non": [], "normal": [], "note": [3, 4], "notebook": [], "now": 1, "num_work": [], "numer": [], "numpi": [], "o": 2, "oak": 5, "observ": [], "obtain": [], "off": [], "ol": 2, "old": [], "onboard": 2, "onc": [], "one": 6, "open": [0, 1, 2, 5], "openapi": [], "openlambda": [1, 6], "oper": 6, "opportunist": 2, "optim": [5, 6], "option": [2, 6], "orchestr": [], "org_id": [], "organ": [], "our": 2, "output": [], "overhead": 2, "packag": 5, "panda": [], "paper": 6, "parallel": [], "paramet": [], "pars": [], "pass": 6, "path": 6, "pattern": 2, "payload": 6, "pd": [], "peak": [], "per": 6, "perform": [3, 4], "period": 6, "permiss": [], "persist": 2, "pf": [], "phase": 1, "phyllachora": [], "pip": 0, "pipelin": [], "pipsqueak": 5, "place": 6, "plan": [], "plant": [], "plant_date_obj": [], "plant_doi": [], "planting_d": [], "platform": 2, "pleas": 1, "plu": [], "point": [], "pool": [2, 5], "port": [2, 6], "post": [2, 6], "practic": 2, "pre": [], "precip": [], "precip1hour_sum": [], "precip_daili": [], "precip_fal": [], "precipit": [], "pred": [], "predict": [], "premium": [], "prep": [], "presenc": [], "present": 6, "previou": [], "primari": 5, "print": 6, "prob": [], "probabl": [], "problem": [], "process": [2, 6], "product": 5, "profession": [], "project": [3, 5], "properti": [], "provid": 1, "provis": [5, 6], "proxi": [], "public": [], "pull": 6, "purpos": [], "push": 0, "put": 5, "py": [], "py_compil": [], "pydant": [], "pylint": [], "python": [0, 2], "pythonpath": [], "queri": [], "question": 2, "quickstart": 6, "r": 0, "r3": [], "rainfal": [], "rang": 2, "rapid": [5, 6], "rare": [], "rate": [], "rather": 2, "raw": [], "re": [], "read": 5, "readabl": [], "readi": [], "real": 2, "rebuild": [], "recommend": 6, "redeploi": [], "redoc": [], "reduc": [2, 6], "redund": [], "refer": 1, "refresh": [], "regener": 2, "region": [], "registri": 6, "regress": [], "rel": [], "relativehumidity_max": [], "relativehumidity_min": [], "releas": [3, 4], "relev": [], "reli": 2, "reload": [], "remov": 2, "replac": [], "repo": 6, "repositori": [], "request": [5, 6], "requir": [0, 2, 6], "research": 6, "residu": [], "resolut": [], "respect": 6, "respons": [5, 6], "rest": [], "result": [2, 6], "result_typ": [], "retri": [], "retriev": [], "return": 6, "reus": 2, "revers": [], "rh": [], "risk": 1, "risk_dai": [], "risk_df": [], "risk_model": [], "risk_processor": [], "roll": [], "rolling_mean": [], "root": [0, 6], "rout": 6, "router": [], "row": [], "rule": [], "run": [5, 6], "runlambda": 6, "runtim": 2, "rye_biomass": [], "rye_daili": [], "saascor": [], "same": [], "sandbox": 6, "save": [], "scale": 6, "schema": [], "scienc": 1, "scientif": [], "sclerotinia": [], "sclerotiorum": [], "score": [], "script": [], "see": 5, "select": [], "sep": [], "sequenti": [], "seri": [], "serv": 2, "server": [2, 6], "serverless": [2, 5, 6], "servic": [1, 2, 5], "set": [0, 2], "setup": 6, "shape": 2, "share": [3, 4], "shift": [], "shm": 2, "short": 6, "should": [], "show": [], "side": [2, 6], "sidebar": [], "similar": 6, "sinc": [], "sine": [], "singl": [2, 5, 6], "site": [], "situat": 2, "slim": [], "smaller": [], "so": 5, "sock": [5, 6], "soil": [], "sojina": [], "sourc": 1, "south": [], "soybean": [], "space": [3, 4], "specif": [], "specifi": [], "speed": [], "spot": [], "stage": [], "standalon": 6, "standard": 6, "start": [2, 5], "startup": 6, "state": 2, "stateless": [2, 6], "statewid": [], "station_data_": [], "station_id": [], "station_measurements_cach": [], "station_nam": [], "station_timezon": [], "statu": 6, "stdlib": [], "stdout": 6, "step": [], "still": [], "str": [], "structur": [], "sub": [], "subsequ": 6, "suitabl": 5, "sum": [], "summari": [], "support": 2, "sure": [], "surfac": 2, "swagger": [], "synchron": 2, "syntax": [], "system": 5, "tabl": 0, "tabular": [], "take": 5, "tar": [], "target": 2, "tarspot": [], "tarspot_risk": [], "tarspot_risk_class": [], "task": [5, 6], "team": 3, "technic": [0, 3], "technologi": 1, "temp": [], "temperatur": [], "temperature_max": [], "temperature_max_c": [], "temperature_mean": [], "temperature_mean_c": [], "temperature_min": [], "temperature_min_c": [], "temperaturedewpoint_max": [], "temperaturedewpoint_min": [], "tenant": [], "tenant_id": [], "termin": [], "termination_d": [], "text": [], "than": 2, "them": [5, 6], "thi": [2, 3, 4, 5], "those": 2, "threshold": [], "through": 1, "ti": [], "tier": [], "time": 2, "time_seri": [], "timeout": [], "timestamp": [], "timetupl": [], "titl": 5, "tl": [], "tm_ydai": [], "token": [], "tool": 1, "tornado": 2, "total": [], "traefik": [], "transit": [], "tree": 5, "true": [], "ttl": [], "two": [], "txt": 0, "type": [], "ui": [], "under": [5, 6], "underli": 2, "unifi": [], "unit": 2, "univers": 1, "until": 6, "updat": [], "url": 6, "us": [0, 1, 2, 3, 4, 5], "usag": [], "user": [], "utc": [], "util": 2, "uvicorn": [], "uw": [], "v10": [], "v2": [], "valid": 1, "variabl": 2, "variant": [], "venu": 5, "venv": [], "verbos": [], "verifi": 6, "via": 6, "view": [], "virtual": [], "visibl": 2, "vm": 5, "w": 6, "wait": [2, 6], "warm": [2, 6], "we": [2, 3, 4, 5], "weather": 1, "web": 2, "welcom": [3, 4], "well": 5, "wet": [], "when": [2, 6], "where": [2, 5, 6], "whether": [2, 6], "which": 2, "white": [], "whitemold_dry_risk": [], "whitemold_dry_risk_class": [], "wi": [], "wide": [2, 6], "wind": [], "window": [], "windspeed_max": [], "windspeed_mean": [], "wisc": [], "wisconet_active_st": [], "wisconet_biomass": [], "wisconet_g": [], "wisconet_servic": [], "wisconsin": 1, "work": [2, 5, 6], "workdir": [], "worker": 5, "worker_port": 6, "workflow": 0, "workload": 2, "world": 2, "wosc": 5, "write": 6, "written": 5, "wsgi": 2, "x_0": [], "xxx": [], "yang": 5, "year": [], "yellow": [], "yml": 0, "you": [5, 6], "your": [], "your_kei": [], "your_org": [], "your_ten": [], "yourself": 5, "yyi": [], "yyyi": [], "zeae": [], "zygot": 5, "zzz": []}, "titles": ["OpenLambda GitHub Pages \u2014 MyST Markdown Site", "Agricultural Forecasting API", "Applications", "OpenLambda Blog", "Hello, OpenLambda Blog", "OpenLambda", "Worker"], "titleterms": {"0": [], "1": 0, "2": [], "3": [], "4": [], "One": 0, "action": [], "ad": [], "addit": [], "agricultur": 1, "api": 1, "app": 2, "applic": 2, "architectur": [], "asgi": 2, "async": [], "avail": [], "biomass": [], "blog": [3, 4], "cach": [], "calcul": [], "changelog": [], "clone": 0, "collect": [], "complet": [], "compos": [], "concurr": [], "configur": 6, "consider": [], "content": [], "coordin": [], "copi": 0, "core": [], "corn": [], "current": [], "data": [], "date": [], "depend": [], "deploi": [2, 6], "deploy": [], "design": [], "develop": [], "directori": [], "diseas": [], "do": 0, "docker": [], "document": [], "effici": [], "ei": [], "enabl": [], "endpoint": [], "environ": [], "environment": [], "extern": [], "fastapi": 2, "featur": [], "file": 0, "flow": [], "forecast": 1, "format": [], "frogey": [], "further": 6, "geojson": [], "github": 0, "grai": [], "group": [], "handl": [], "hello": 4, "high": [], "how": 2, "ibm": [], "instal": [], "integr": [], "intellig": [], "journei": [], "just": 2, "kei": [], "leaf": [], "legaci": [], "level": [], "licens": 5, "local": 0, "markdown": 0, "mesonet": [], "metadata": [], "model": [], "modul": [], "mold": [], "more": [], "multi": [], "multipl": 6, "myst": 0, "new": [], "onc": 0, "openlambda": [0, 2, 3, 4, 5], "optim": [], "output": [], "overview": [1, 6], "page": 0, "per": 0, "perform": [], "pipelin": [], "prerequisit": [], "preview": 0, "process": [], "product": [], "public": 5, "read": 6, "relat": 5, "repo": 0, "request": [], "resourc": [], "respons": [], "risk": [], "rye": [], "seri": [], "servic": [], "setup": 0, "site": 0, "sourc": [], "soybean": [], "spot": [], "stack": [], "start": 6, "station": [], "strategi": [], "structur": 0, "suit": [], "system": [], "tabl": [], "tarspot": [], "technic": [], "technologi": [], "test": [], "thi": 0, "time": 0, "timezon": [], "tip": [], "troubleshoot": [], "u": 2, "v1": [], "v2": [], "variabl": [], "version": [], "want": 2, "weather": [], "white": [], "winter": [], "wisconet": [], "worker": 6}}) \ No newline at end of file +Search.setIndex({"alltitles": {"1. Clone the repo and copy these files in": [[0, "clone-the-repo-and-copy-these-files-in"]], "Agricultural Forecasting API": [[1, null]], "An Application Case Study: Forecasting Crop Disease with OpenLambda": [[4, null]], "Applications": [[2, null]], "Configuration": [[7, "configuration"]], "Deploying Multiple Workers": [[7, "deploying-multiple-workers"]], "File Structure": [[0, "file-structure"]], "Further Reading": [[7, "further-reading"]], "Hello, OpenLambda Blog": [[5, null]], "License": [[6, "license"]], "Local Preview": [[0, "local-preview"]], "One-Time Setup (do this once per repo)": [[0, "one-time-setup-do-this-once-per-repo"]], "OpenLambda": [[6, null]], "OpenLambda Blog": [[3, null]], "OpenLambda GitHub Pages \u2014 MyST Markdown Site": [[0, null]], "Overview": [[1, "overview"], [7, "overview"]], "Related Publications": [[6, "related-publications"]], "Starting the Worker": [[7, "starting-the-worker"]], "Want to deploy FastAPI apps on OpenLambda? Just ASGI us how.": [[2, "want-to-deploy-fastapi-apps-on-openlambda-just-asgi-us-how"]], "Worker": [[7, null]]}, "docnames": ["README", "applications/ag-forecasting-api", "applications/index", "blog/index", "blog/post/2026-05-18-ag-forecasting-case-study", "blog/post/2026-05-18-hello-world", "index", "worker"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1}, "filenames": ["README.md", "applications/ag-forecasting-api.md", "applications/index.md", "blog/index.md", "blog/post/2026-05-18-ag-forecasting-case-study.md", "blog/post/2026-05-18-hello-world.md", "index.md", "worker.md"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [2, 7], "0": [], "003663": [], "031": [], "05": [], "09": [], "10": [], "100": [], "1049": [], "11": [], "12": [], "1234": [], "14": [], "15": [], "16": 6, "17": 6, "18": [3, 6], "20": [], "2000": [], "2024": [], "2025": [], "2026": 3, "21": [], "24": 6, "28": [], "2878": [], "30": [], "31": [], "3250": [], "35": [], "366": [], "38": [], "404": [], "423": [], "43": [], "45": [], "4500": [], "4567": [], "5": [], "50": [], "6": [], "6h": [], "7": [], "7d": [], "8": [], "8000": [], "8080": 7, "85": [], "89": [], "9": [], "90": [], "92": [], "999": [], "A": [2, 7], "By": [], "For": 1, "In": [2, 4], "It": 7, "No": 7, "On": 2, "That": [], "The": [1, 2, 4, 6, 7], "To": [2, 7], "With": 6, "__init__": [], "_annotate_winter_rye_biomass": [], "_build": 0, "_build_daili": [], "_compute_winter_rye_biomass": [], "_config": 0, "_doi": [], "_fall": [], "_fetch_raw_hourli": [], "_run_pipelin": [], "_toc": 0, "_total": [], "about": 6, "abov": [], "aboveground": [], "absolut": [], "access": [], "accumul": [], "acquisit": [], "acr": [], "action": 0, "activ": [], "ad": 4, "adapt": [], "add": [0, 2, 3, 4], "address": [2, 7], "adjust": 2, "after": 7, "ag": 2, "ag_api": [], "ag_forecast": [], "ag_forecasting_api": 4, "ag_models_wrapp": [], "agforecast": 4, "aggreg": [], "agricultur": [2, 4], "agronom": [], "ahead": 2, "aiohttp": [], "air": [], "al": 6, "all": 0, "alongsid": 2, "alpin": [], "alreadi": 7, "also": [2, 6], "alten": [], "altn": [], "america": [], "an": [2, 3, 6], "analysi": [], "annot": [], "apach": 6, "api": [2, 4], "api_cach": [], "api_kei": [], "apotheci": [], "app": [], "app_v1": [], "appli": [], "applic": 3, "approach": [2, 6, 7], "ar": [2, 4, 6, 7], "arithmet": [], "arriv": 7, "asgi": [1, 4], "assess": [], "assumpt": [], "async": 2, "atc": 6, "authent": [], "author": 6, "auto": 0, "automat": 0, "avail": [], "averag": [], "avg": [], "await": [], "awar": [], "axi": [], "b_": [], "b_0": [], "back": 7, "backend": 7, "backward": [], "balanc": [6, 7], "base": [1, 2, 4, 6], "basi": 4, "basic": [], "batch": [], "becaus": [2, 4], "behind": 7, "believ": [2, 3, 4], "benefici": 2, "best": [3, 4], "better": 2, "between": 7, "bill": 2, "bin": 7, "binari": 7, "biomass_color": [], "biomass_lb_acr": [], "biomass_messag": [], "biomass_result": [], "bit": 6, "block": 2, "book": 0, "boss": [6, 7], "both": 2, "branch": [], "broader": [2, 4], "broadli": 2, "browser": 0, "build": [0, 2, 7], "built": 4, "bulk": [], "bundl": 0, "busi": [], "c": [], "cach": [], "calc": [], "calcul": [], "calculate_tarspot_risk": [], "calculate_winter_rye_biomass": [], "call": [4, 7], "caller": 7, "can": [2, 6, 7], "cap": [], "capabl": [], "caraza": [3, 4], "case": 3, "categori": [], "cd": 0, "cdn": [], "cdot": [], "central": [6, 7], "cercospora": [], "challeng": 4, "chang": 2, "chapter": [], "characterist": [], "check": [1, 7], "chicago": [], "choic": 2, "chunk": [], "citi": [], "class": [], "classif": [], "classifi": [], "client": [], "clone": [], "cloud comput": 6, "cluster": [6, 7], "cmd": [], "co": 2, "coeffici": [], "col": [], "cold": 7, "color": [], "columbia": [], "column": [], "com": 0, "combin": 1, "commit": 0, "compat": [], "compil": 4, "compon": 7, "comput": [2, 3, 4, 6], "compute_risks_in_parallel": [], "concern": 2, "concurr": 2, "conda": [], "config": 7, "configur": [], "confirm": [], "connect": [], "consolid": 2, "constant": [], "constraint": 2, "contact": [], "contain": [6, 7], "container": [], "content": 0, "context": [], "continu": 2, "contribut": 2, "convers": [], "convert": [], "coordin": 7, "copi": [], "core": 7, "corn": [], "could": 6, "counti": [], "cover": [], "coverag": [], "creat": [], "credenti": [], "crop": [1, 3], "ctrl": [], "cumsum": [], "cumul": [], "curl": 7, "current": [6, 7], "curv": [], "cycl": [], "dai": [], "daili": [], "damon": [], "dashboard": [], "data": [1, 2, 3, 4], "datafram": [], "dataframe_to_featurecollect": [], "date": [], "datetim": [], "dd": [], "decim": [], "decis": [], "deep": 3, "deeper": 2, "def": [], "default": 7, "definit": [], "degre": [], "demand": 2, "dens": [], "dep": 0, "depart": [3, 4], "depend": 2, "deploi": [0, 6], "deploy": [2, 3, 4, 7], "deprec": [], "describ": [4, 7], "descript": 7, "design": [2, 3, 4, 5], "detail": 6, "detect": 2, "dev": 2, "develop": [1, 4, 7], "dew": [], "dir": [], "direct": 4, "directori": 7, "discuss": [3, 5], "diseas": [1, 3], "disease_metadata": [], "distinguish": 2, "dive": 3, "django": 4, "doc": [], "docker": 7, "dockerfil": [], "document": [0, 1], "doit": [], "domain": [], "door": [2, 4], "drive": 2, "dry": [], "dsi": 4, "dst": [], "dual": [], "dure": [], "e": [], "each": 7, "earlier": 2, "ecosystem": [], "edu": [], "effect": [], "emb": [], "embed": [], "emerg": [], "enabl": [2, 6], "endpoint": 7, "enhanc": [], "ensembl": [], "enter": 1, "entir": [], "entri": [], "environ": [2, 4], "eros": [], "error": [], "establish": [], "estim": [], "et": 6, "etc": [], "evalu": [], "even": 4, "eventu": 6, "ever": [3, 4], "everi": [], "evolut": 2, "exampl": [], "example_callapi": [], "execut": 2, "expand": 2, "experi": [3, 5], "explor": 6, "export": [], "expos": 7, "extend": 2, "extract": [], "f": [], "fail": [], "fall": [], "fall_precip": [], "fall_start": [], "fallback": [], "far": 6, "farmer": [], "fastapi": [1, 4], "faster": [2, 6], "featur": [2, 3, 4], "featurecollect": [], "fetch": [], "fetch_all_measurements_async": [], "fetch_wisconet_biomass": [], "field": 7, "file": [6, 7], "fillna": [], "filter": [], "fit": [2, 6], "fix": [], "flask": 4, "follow": [], "forecast": [2, 3], "forecasting_d": [], "forklift": 6, "format": [], "formula": [], "forward": 7, "found": [], "four": 4, "frac": [], "framework": [], "friction": 2, "friendli": 2, "frogey": [], "frogeye_risk": [], "frogeye_risk_class": [], "from": [0, 2, 3, 7], "fromisoformat": [], "front": [6, 7], "function": [2, 4, 7], "fundament": 2, "fungu": [], "further": 2, "futur": 4, "g": [], "gdd": [], "gdd_0c": [], "gdd_sine": [], "gdd_total": [], "gener": [], "geojson": [], "geojson_adapt": [], "geojson_schema": [], "geometri": [], "geospati": 1, "get": [6, 7], "get_weather_with_risk": [], "gi": [], "git": 0, "github": [2, 4], "gitignor": 0, "global": [], "globe": [], "gls_risk": [], "gls_risk_class": [], "go": [6, 7], "goal": [3, 4, 6], "grai": [], "green": [], "grow": [3, 4], "growth": [], "guid": 7, "ha": [], "handl": [], "handler": [], "haproxi": 7, "hard": [], "harmon": [], "harter": [3, 4], "health": [], "healthcheck": [], "hello": 3, "help": [2, 3, 4], "helper": [], "hendrickson": 6, "here": [0, 1, 6], "high": [], "higher": 2, "histor": [], "histori": 2, "hod": [], "homepag": 0, "hope": 6, "horizont": 7, "host": [], "hotcloud": 6, "hour": [], "hourli": [], "html": 0, "http": [0, 6, 7], "human": [], "humid": [], "i": [1, 2, 3, 4, 6, 7], "ibm_api_kei": [], "ibm_servic": [], "icdcsw": 6, "id": [], "identifi": [3, 4], "idl": 2, "imag": 7, "implement": [2, 4, 6], "import": [], "improv": 2, "inact": [], "inch": [], "includ": 2, "incom": 7, "increment": 2, "independ": 7, "index": 0, "individu": [], "inflect": [], "influenc": 2, "info": [], "inform": [], "ingest": [], "initi": 6, "input": [], "insid": 7, "instal": 0, "institut": [1, 3, 4], "integr": [1, 2], "intellig": 1, "interact": [], "intercept": [], "interest": [3, 4], "interfac": 2, "interpol": [], "interpret": [], "interv": [], "invok": 6, "io": 0, "ipynb": [], "irrig": [], "issu": 2, "its": [1, 2, 4, 7], "jaim": 2, "jb": [], "json": 7, "jupyt": 0, "just": 6, "jwt": [], "k": [], "keep": 7, "kei": 7, "label": [], "lambda": [0, 1, 2, 6, 7], "larg": 6, "last": [], "lat": [], "latenc": 7, "latitud": [], "layer": [], "lb": [], "leaf": [], "lean": 6, "left": [], "let": 2, "librari": 6, "lifecycl": 7, "like": 2, "limit": [], "line": [], "lint": [], "linux": [6, 7], "linux contain": 6, "list": [], "listen": 7, "ll": [3, 5], "lng": [], "load": [6, 7], "load_stations_sync": [], "loadbalanc": [], "local": [6, 7], "localhost": 7, "locat": 2, "log": 7, "log_level": [], "log_output": 7, "logic": [], "login": 6, "logist": [], "logit": [], "long": 2, "longitud": [], "longstand": 2, "look": 2, "low": [], "lower": [], "m": 0, "madison": [1, 3, 4], "mai": 3, "main": 6, "maintain": [], "make": [3, 4, 6], "manag": [6, 7], "manipul": [], "manual": [6, 7], "map": [], "maria": [3, 4], "materi": [], "math": [], "math_help": [], "mathemat": [], "max": [], "maydi": [], "md": [0, 6], "mean": [], "measur": [], "merg": [], "merge_biomass": [], "merge_station_metadata": [], "merge_wisconet_biomass": [], "mesonet": [], "messag": [], "metadata_stations_": [], "method": [], "metric": [], "min": [], "minim": [2, 3, 4], "minut": 7, "mitig": [], "mm": [], "mode": 6, "model": [1, 2], "model_schema": [], "moder": [], "modern": 2, "modif": [3, 4], "moistur": [], "mold": [], "monitor": [], "month": [], "more": [0, 2, 6], "most": [3, 4], "mostli": 6, "mount": [], "mph": [], "multi": [1, 7], "multipl": 2, "multiprocess": [], "n": 7, "name": 7, "nation": [], "nativ": 2, "natur": 2, "need": 2, "network": [], "new": [2, 3, 4, 5, 6], "next": 1, "nginx": 7, "nighttim": [], "noaa": [], "node": [6, 7], "non": [], "normal": [], "note": [3, 5], "notebook": [], "now": 1, "num_work": [], "numer": [], "numpi": [], "o": 2, "oak": 6, "observ": [], "obtain": [], "off": [], "ol": [2, 3, 4], "old": [], "onboard": 2, "onc": [], "one": 7, "open": [0, 1, 2, 4, 6], "openapi": [], "openlambda": [1, 7], "oper": 7, "opportunist": 2, "optim": [6, 7], "option": [2, 7], "orchestr": [], "org_id": [], "organ": [], "origin": [3, 4], "oro": [3, 4], "our": [2, 3, 4], "output": [], "overhead": 2, "packag": [4, 6], "pain": [3, 4], "panda": [], "paper": 7, "parallel": [], "paramet": [], "pars": [], "pass": 7, "path": 7, "pattern": 2, "payload": 7, "pd": [], "peak": [], "per": 7, "perform": [3, 5], "period": 7, "permiss": [], "persist": 2, "pf": [], "phase": 1, "phyllachora": [], "pick": [3, 4], "pip": [0, 4], "pipelin": [], "pipsqueak": 6, "place": 7, "plan": [], "plant": [], "plant_date_obj": [], "plant_doi": [], "planting_d": [], "platform": 2, "pleas": 1, "plu": [], "point": [3, 4], "pool": [2, 6], "popular": 4, "port": [2, 3, 4, 7], "post": [2, 4, 7], "practic": 2, "pre": [], "precip": [], "precip1hour_sum": [], "precip_daili": [], "precip_fal": [], "precipit": [], "pred": [], "predict": [], "premium": [], "prep": [], "presenc": [], "present": 7, "previou": [], "primari": 6, "print": 7, "prob": [], "probabl": [], "problem": [], "process": [2, 7], "product": 6, "profession": [], "program": 4, "project": [3, 6], "properti": [], "provid": 1, "provis": [6, 7], "proxi": [], "public": [], "pull": 7, "purpos": [], "push": 0, "put": 6, "py": [], "py_compil": [], "pydant": [], "pylint": [], "python": [0, 2, 4], "pythonpath": [], "queri": [], "question": 2, "quickstart": 7, "r": 0, "r3": [], "rainfal": [], "rang": [2, 4], "rapid": [6, 7], "rare": [], "rate": [], "rather": 2, "raw": [], "re": [], "read": 6, "readabl": [], "readi": [], "real": 2, "rebuild": [], "recent": 4, "recommend": 7, "redeploi": [], "redoc": [], "reduc": [2, 7], "redund": [], "refer": 1, "refresh": [], "regener": 2, "region": [], "registri": 7, "regress": [], "rel": [], "relativehumidity_max": [], "relativehumidity_min": [], "releas": [3, 5], "relev": [], "reli": 2, "reload": [], "remov": 2, "replac": [], "repo": 7, "repositori": [], "request": [6, 7], "requir": [0, 2, 7], "research": 7, "residu": [], "resolut": [], "respect": 7, "respons": [6, 7], "rest": 4, "result": [2, 7], "result_typ": [], "retri": [], "retriev": [], "return": 7, "reus": 2, "revers": [], "rh": [], "risk": 1, "risk_dai": [], "risk_df": [], "risk_model": [], "risk_processor": [], "roll": [], "rolling_mean": [], "root": [0, 7], "rout": 7, "router": [], "row": [], "rule": [], "run": [6, 7], "runlambda": 7, "runtim": 2, "rye_biomass": [], "rye_daili": [], "saascor": [], "same": [], "sandbox": 7, "save": [], "scale": 7, "schema": [], "scienc": [1, 3, 4], "scientif": [], "sclerotinia": [], "sclerotiorum": [], "score": [], "script": [], "see": 6, "select": 4, "sep": [], "sequenti": [], "seri": [], "serv": 2, "server": [2, 7], "serverless": [2, 3, 4, 6, 7], "servic": [1, 2, 6], "set": [0, 2, 3, 4], "setup": 7, "shape": 2, "share": [3, 5], "shift": [], "shm": 2, "short": 7, "should": [], "show": [], "side": [2, 7], "sidebar": [], "similar": [3, 4, 7], "simpler": 4, "sinc": [], "sine": [], "singl": [2, 6, 7], "site": [], "situat": 2, "slim": [], "smaller": [], "so": [4, 6], "sock": [6, 7], "soil": [], "sojina": [], "sourc": 1, "south": [], "soybean": [], "space": [3, 5], "specif": [], "specifi": [], "speed": [], "spiritu": 4, "spot": [], "stage": [], "standalon": 7, "standard": 7, "start": [2, 4, 6], "startup": 7, "state": 2, "stateless": [2, 7], "statewid": [], "station_data_": [], "station_id": [], "station_measurements_cach": [], "station_nam": [], "station_timezon": [], "statu": 7, "stdlib": [], "stdout": 7, "step": [], "still": [], "str": [], "structur": [], "studi": 3, "sub": [], "subsequ": 7, "successor": 4, "suitabl": 6, "sum": [], "summari": [], "support": [2, 3, 4], "sure": [], "surfac": 2, "swagger": [], "synchron": 2, "syntax": [], "system": 6, "t": [3, 4], "tabl": 0, "tabular": [], "take": 6, "tar": [], "target": 2, "tarspot": [], "tarspot_risk": [], "tarspot_risk_class": [], "task": [6, 7], "team": 3, "technic": [0, 3], "technologi": 1, "temp": [], "temperatur": [], "temperature_max": [], "temperature_max_c": [], "temperature_mean": [], "temperature_mean_c": [], "temperature_min": [], "temperature_min_c": [], "temperaturedewpoint_max": [], "temperaturedewpoint_min": [], "tenant": [], "tenant_id": [], "termin": [], "termination_d": [], "text": [], "than": 2, "them": [3, 4, 6, 7], "thi": [2, 3, 4, 5, 6], "those": 2, "threshold": [], "through": 1, "ti": [], "tier": [], "time": 2, "time_seri": [], "timeout": [], "timestamp": [], "timetupl": [], "titl": 6, "tl": [], "tm_ydai": [], "token": [], "tool": 1, "tornado": 2, "total": [], "toward": [3, 4], "traefik": [], "transit": [], "tree": 6, "true": [], "try": [3, 4], "ttl": [], "turn": 4, "two": [], "txt": 0, "tyler": [3, 4], "type": [], "u": [3, 4], "ui": [], "under": [6, 7], "underli": 2, "unifi": [], "unit": 2, "univers": [1, 3, 4], "until": 7, "updat": [], "url": 7, "us": [0, 1, 2, 3, 4, 5, 6], "usag": [], "user": [], "utc": [], "util": 2, "uvicorn": [], "uw": 4, "v10": [], "v2": [], "valid": 1, "variabl": [2, 4], "variant": [], "venu": 6, "venv": [], "verbos": [], "verifi": 7, "via": 7, "view": [], "virtual": [], "visibl": 2, "vm": 6, "w": 7, "wai": [3, 4], "wait": [2, 7], "warm": [2, 7], "we": [2, 3, 4, 5, 6], "weather": 1, "web": [2, 4], "welcom": [3, 5], "well": 6, "weren": [3, 4], "wet": [], "when": [2, 7], "where": [2, 6, 7], "whether": [2, 7], "which": [2, 4], "white": [], "whitemold_dry_risk": [], "whitemold_dry_risk_class": [], "wi": [], "wide": [2, 7], "wind": [], "window": [], "windspeed_max": [], "windspeed_mean": [], "wisc": [], "wisconet_active_st": [], "wisconet_biomass": [], "wisconet_g": [], "wisconet_servic": [], "wisconsin": [1, 3, 4], "work": [2, 3, 4, 6, 7], "workdir": [], "worker": 6, "worker_port": 7, "workflow": 0, "workload": 2, "world": 2, "wosc": 6, "write": 7, "written": 6, "wsgi": [2, 4], "x_0": [], "xxx": [], "yang": 6, "year": [], "yellow": [], "yml": 0, "you": [6, 7], "your": [], "your_kei": [], "your_org": [], "your_ten": [], "yourself": 6, "yyi": [], "yyyi": [], "zeae": [], "zygot": 6, "zzz": []}, "titles": ["OpenLambda GitHub Pages \u2014 MyST Markdown Site", "Agricultural Forecasting API", "Applications", "OpenLambda Blog", "An Application Case Study: Forecasting Crop Disease with OpenLambda", "Hello, OpenLambda Blog", "OpenLambda", "Worker"], "titleterms": {"0": [], "1": 0, "2": [], "3": [], "4": [], "One": 0, "action": [], "ad": [], "addit": [], "agricultur": 1, "an": 4, "api": 1, "app": 2, "applic": [2, 4], "architectur": [], "asgi": 2, "async": [], "avail": [], "biomass": [], "blog": [3, 5], "cach": [], "calcul": [], "case": 4, "changelog": [], "clone": 0, "collect": [], "complet": [], "compos": [], "concurr": [], "configur": 7, "consider": [], "content": [], "coordin": [], "copi": 0, "core": [], "corn": [], "crop": 4, "current": [], "data": [], "date": [], "depend": [], "deploi": [2, 7], "deploy": [], "design": [], "develop": [], "directori": [], "diseas": 4, "do": 0, "docker": [], "document": [], "effici": [], "ei": [], "enabl": [], "endpoint": [], "environ": [], "environment": [], "extern": [], "fastapi": 2, "featur": [], "file": 0, "flow": [], "forecast": [1, 4], "format": [], "frogey": [], "further": 7, "geojson": [], "github": 0, "grai": [], "group": [], "handl": [], "hello": 5, "high": [], "how": 2, "ibm": [], "instal": [], "integr": [], "intellig": [], "journei": [], "just": 2, "kei": [], "leaf": [], "legaci": [], "level": [], "licens": 6, "local": 0, "markdown": 0, "mesonet": [], "metadata": [], "model": [], "modul": [], "mold": [], "more": [], "multi": [], "multipl": 7, "myst": 0, "new": [], "onc": 0, "openlambda": [0, 2, 3, 4, 5, 6], "optim": [], "output": [], "overview": [1, 7], "page": 0, "per": 0, "perform": [], "pipelin": [], "prerequisit": [], "preview": 0, "process": [], "product": [], "public": 6, "read": 7, "relat": 6, "repo": 0, "request": [], "resourc": [], "respons": [], "risk": [], "rye": [], "seri": [], "servic": [], "setup": 0, "site": 0, "sourc": [], "soybean": [], "spot": [], "stack": [], "start": 7, "station": [], "strategi": [], "structur": 0, "studi": 4, "suit": [], "system": [], "tabl": [], "tarspot": [], "technic": [], "technologi": [], "test": [], "thi": 0, "time": 0, "timezon": [], "tip": [], "troubleshoot": [], "u": 2, "v1": [], "v2": [], "variabl": [], "version": [], "want": 2, "weather": [], "white": [], "winter": [], "wisconet": [], "worker": 7}}) \ No newline at end of file diff --git a/_toc.yml b/_toc.yml index f55657e..79dea18 100644 --- a/_toc.yml +++ b/_toc.yml @@ -12,4 +12,5 @@ chapters: - file: blog/index title: Blog sections: - - glob: blog/posts/* \ No newline at end of file + - file: blog/post/2026-05-18-hello-world + - file: blog/post/2026-05-18-agforecast-case-study \ No newline at end of file diff --git a/blog/post/2026-05-18-hello-world.md b/blog/post/2026-05-18-hello-world.md new file mode 100644 index 0000000..7a403e3 --- /dev/null +++ b/blog/post/2026-05-18-hello-world.md @@ -0,0 +1,13 @@ +--- +blogpost: true +date: 2026-05-18 +author: open-lambda +category: Releases +tags: announcement, openlambda +language: en +--- + +# Hello, OpenLambda Blog + +Welcome to the new OpenLambda blog. We'll use this space to share release +notes, performance experiments, and design discussions. \ No newline at end of file From 0a39950cdfe5342e0d89cad81897594f846e3ed8 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Tue, 19 May 2026 11:52:58 -0500 Subject: [PATCH 29/40] ADD blog content --- .../2026-05-18-ag-forecasting-case-study.md | 124 +++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/blog/post/2026-05-18-ag-forecasting-case-study.md b/blog/post/2026-05-18-ag-forecasting-case-study.md index 3bdc1fd..be2607f 100644 --- a/blog/post/2026-05-18-ag-forecasting-case-study.md +++ b/blog/post/2026-05-18-ag-forecasting-case-study.md @@ -16,4 +16,126 @@ Our goal is to make an ever-growing set of applications deployable on OpenLambda Recently, we selected an agricultural forecasting application (AgForecast), developed by the [Data Science Institute at UW–Madison](https://dsi.wisc.edu/), to port to OpenLambda: . AgForecast is an interesting case study, because it implements its REST API using FastAPI, which in turn uses [ASGI](https://asgi.readthedocs.io/en/latest/), the so-called "spiritual successor" to WSGI, which we recently started supporting in OpenLambda. WSGI is the basis for popular Python web-programming packages such as Django and Flask; new ASGI support opens the door to an even broader range of applications. -In this post, we describe the challenges of porting AgForecast to OL, and four new features we added to OL to make deployment of similar applications in the future simpler. The features are built-in ASGI support, direct GitHub-to-OL deployments, OL function environment variables, and OL-based pip compilation. \ No newline at end of file +In this post, we describe the challenges of porting AgForecast to OL, and four new features we added to OL to make deployment of similar applications in the future simpler. The features are built-in ASGI support, direct GitHub-to-OL deployments, OL function environment variables, and OL-based pip compilation. + +## Background: Agricultural Forecasting API + +**Motivation.** The agricultural forecasting app is an open-source tool designed to address farmers' needs in a customizable way. We first built a backend infrastructure using FastAPI to serve crop disease forecasting models for corn and soybean, focusing on integration with Wisconet weather stations and on-demand model serving. We then developed a custom R Shiny front-end interface for farmer use. + +**Fit with OpenLambda.** We began exploring OpenLambda to leverage the benefits of serverless technology. Hosting our tool on this platform offers significant value not only to the developer community, but also to plant pathology practitioners and scientists who want to build on robust, nationwide infrastructure. + +**Technical overview.** The Ag Forecasting API is a FastAPI-based backend that serves crop disease forecasting models for corn and soybean across Wisconsin. It exposes two parallel data pipelines through a unified interface: one sourced from Wisconet, the public mesonet of weather stations across the state, and another from IBM Environmental Intelligence for point-location queries by latitude and longitude. The core logic lives in the `ag_models_wrappers` module, which dynamically pulls the daily and hourly weather variables each disease model requires for a given forecasting date, runs the risk calculations, and returns localized predictions. Currently supported models include Sporecaster (white mold in soybean, with dry and irrigated row-spacing variants), Tarspotter (tar spot of corn), gray leaf spot, and frogeye leaf spot — all based on peer-reviewed plant pathology research from UW–Madison. + +**Infrastructure and integration.** The project ships with a `Dockerfile` and `docker-compose.yml` for containerized deployment, and includes a Starlette `WSGIMiddleware` wrapper so the FastAPI app can also be served behind WSGI servers for legacy or mixed environments. A companion sub-package, `pywisconet`, provides a thin REST wrapper over the Wisconet v1 API with endpoints for active station discovery (`/wisconet/active_stations/`), station field metadata (`/station_fields/{station_id}`), and bulk measurement retrieval (`/bulk_measures/{station_id}`) at configurable frequencies (5-minute, hourly, or daily) for variables like air temperature, dew point, wind speed, and relative humidity. IBM credentials are handled via environment variables (`IBM_API_KEY`, `TENANT_ID`, `ORG_ID`) and validated against query parameters at request time. The API is MIT-licensed, fully open source, and currently deployed at [connect.doit.wisc.edu/ag_forecasting_api](https://connect.doit.wisc.edu/ag_forecasting_api). + +## Porting to OpenLambda + +When porting AgForecast to OL, we encountered 5 challenges related to: expectations about writable directories, package version selection, deployment from GitHub, asynchronous execution, and parallel pool execution. To overcome these challenges, we introduced four new features to OL and made minor changes to AgForecast itself. + +### Challenge 1: File Management + +AgForecast is semi-stateless: data files describing stations and measurements are used across requests, but if these files are deleted, it can generate them on-the-fly from upstream data sources, such as the IBM Weather API or Wisconet. This is a good match for FaaS platforms such as OL, where lambda instances frequently persist (along with their state) across multiple invocations, even if an instance can silently be terminated at any time to reclaim memory. + +However, most directory locations are read-only for an OL function; the one exception is a single "scratch directory" and various other locations that are symbolic links to the scratch directory (such as `/tmp`). Full-featured sandboxes such as Docker containers use union file systems to make many directories editable, on a copy-on-write basis. OL's limitation is due to its use of bind mounts, a leaner, but less flexible mechanism. AgForecast wasn't originally built for OL, so we modified the code to make the directory location for station and measurement data configurable via environment variables (otherwise AgForecast attempted to write to read-only locations). We added support to OL function configuration files to support the specification of environment variables, like this: + +```yaml +triggers: + http: + - method: "*" +environment: + MEASUREMENTS_CACHE_DIR: /host/tmp/cache + STATIONS_CACHE_FILE: /host/tmp/cache/wisconsin_stations_cache.csv + ... +``` + +### Challenge 2: Package Management + +Like many Python projects, AgForecast specifies PyPI package requirements in a `requirements.txt` file. Also like most projects, not all version requirements are exact. Here are 3 of the 21 lines in AgForecast's `requirements.txt`: + +``` +... +matplotlib==3.9.1 +fastapi>=0.95.0 +pydantic +... +``` + +Note the different levels of specificity: `matplotlib` must be a specific version, whereas pip can select any version for `pydantic` (probably the latest, barring version conflicts based on other dependencies); `fastapi` specifies a range. Note that some of these might also have indirect dependencies on other packages not explicitly listed. + +OL requires exact versions for all packages, direct or indirect. For this purpose, we recommend the use of [`pip-compile`](https://pypi.org/project/pip-tools/) to translate a partially specified `requirements.txt` file to a fully specified one, based on the latest packages at the time of compilation. + +One challenge is that pip and pip-compile sometimes select packages based on the host environment. For example, in certain cases, the suitable Python package version for Ubuntu 24.04 might be different than for Ubuntu 26.04. Initially, we encountered this when deploying AgForecast on OL. The `requirements.txt` created by doing pip-compile on the host machine was not quite compatible with the environment inside the lambda function. To address this, we created a new OL function that does pip-compile inside the OL environment. It works like this: + +```bash +curl -X POST -d '' http://localhost:5000/run/pip-compile/url > requirements.txt +``` + +### Challenge 3: Deployment + +AgForecast lives on a public GitHub repo: . We wanted to make it as easy as possible to deploy directly from GitHub to an OL function. Thus, we added a new `ol admin install` option to point directly to a repo: + +```bash +./ol admin install -c ol.yaml -r requirements.txt https://github.com//.git +``` + +### Challenge 4: Asynchronous Execution + +AgForecast is built on FastAPI, which in turn is based on ASGI. ASGI is an asynchronous alternative to WSGI (Web Server Gateway Interface). The idea of WSGI is to let you mix and match servers (for example, Gunicorn, uWSGI) with application frameworks (for example, Flask, Django). The server/framework interface is minimalist, a single function signature that the server calls for each incoming HTTP request (GET/POST/etc). The framework implements the function; a common framework pattern is to route the call to a user-written handler function. For example, consider these two functions: + +```python +app = Flask(__name__) + +@app.route("/") +def home(): + return "Home page" + +@app.route("/about") +def about(): + return "About page" +``` + +The `app` object is a Python callable (meaning it is an object that acts like a function); `app` implements the WSGI interface. So when a server sends a request to `app`, `app` in turn calls the correct user function (`home` or `about`) to execute and obtain a result. + +ASGI was introduced as an alternative to WSGI to provide more options for handling concurrent calls. Consider how (in the above Flask/WSGI example) two different users may want to visit the home and about pages at the same time. Can we handle the requests concurrently? + +There are a few ways to do this: multiple processes, multiple threads in a process, or [Python's async functionality introduced in Python 3.5 (2015)](https://peps.python.org/pep-0492/). If we want all execution in a single process (useful when there is shared state), we can either use threading (with WSGI) or async (with ASGI). + +Threads are a non-cooperative form of scheduling, meaning that a scheduler can switch from running one thread on a CPU to another thread at any time (perhaps a very inconvenient time!). Writing multi-threaded programs is notoriously difficult, as one must identify shared state, introduce locks to protect that state, and acquire/release locks at the right points. In contrast, async offers a form of cooperative scheduling, where switches can only occur at well-defined points (e.g., an `await`). Thus, programming is simpler (no need for locks). + +Normally, concurrent programs allow (a) parallel execution on multiple CPU cores at the same time and (b) execution of code at the same time that input/output occurs, say to the disk or network. In many languages, threads offer both benefits and cooperative scheduling only provides the I/O benefit. However, Python threads only offer the I/O benefit due to the GIL (Global Interpreter Lock), [though this may be changing](https://docs.python.org/3/howto/free-threading-python.html). Thus, async is especially appealing in Python since it (in theory) matches threading in terms of performance benefits, and surpasses threads in terms of ease-of-programming. + +AgForecast implements REST calls in FastAPI, which is based on ASGI, which is the async-based alternative to WSGI. To support AgForecast, we implemented ASGI server functionality in OpenLambda. This makes OpenLambda an ASGI server implementation (in the same role as Uvicorn, Gunicorn, Daphne, etc). When a request arrives, OpenLambda uses `asyncio.run(...)` to invoke the user-provided entry point, with async send/receive callbacks. The user-provided entry-point can then be a full application, written in any ASGI-compatible framework (FastAPI, Starlette, Django/Channels, etc). + +A user can indicate their lambda function is an ASGI application entry point by configuring their `ol.yaml` as follows: + +```yaml +environment: + OL_ENTRY_FILE: app.py + OL_ASGI_ENTRY: app +``` + +### Challenge 5: Worker Pools + +AgForecast indirectly uses `/dev/shm`, an in-memory file system called tmpfs. Docker containers have a `/dev/shm` mount by default; as it is frequently used for inter-process communication, its behavior is configurable via the `--ipc` flag. In contrast, OL functions do not have any `/dev/shm` mount. + +Why does AgForecast need `/dev/shm`? AgForecast uses a `concurrent.futures.ProcessPoolExecutor` to run a Python compute-heavy function called `compute_risks` in parallel over different chunks of data. `ProcessPoolExecutor` creates different Python processes for different chunks of work, which is desirable as a way to get around Python's per-process GIL (Global Interpreter Lock), which is held whenever regular Python code is being executed. With multiple processes (created by the pool), each process will have its own GIL that it holds during execution; thus, multiple processes can hold their own locks at the same time and execute on multiple CPU cores in parallel. + +As a fix to get AgForecast working as an OL function, we replaced `ProcessPoolExecutor` with a `ThreadPoolExecutor`; this avoids inter-process communication via `/dev/shm` because coordination occurs within a process, between threads. Unfortunately, all the threads share a GIL, so the performance benefits of using a pool for parallelism is lost in this case (the only value would be if `compute_risks` were I/O heavy, which it is not). + +Using a `ThreadPoolExecutor` works as a short term fix, but this experience suggests that eventually adding `/dev/shm` availability (and thus `ProcessPoolExecutor` functionality) would be a useful future feature for OL. + +## Recap of New Features + +Porting real, complex applications to serverless platforms highlights the most important features to develop. In this post, we described 5 challenges we encountered when porting AgForecast to OL, and the following features we added to better support similar applications: + +- environment variable configuration for lambda functions (challenge 1) +- pip-compile as a lambda function (challenge 2) +- direct GitHub deployment (challenge 3) +- ASGI support (challenge 4) + +We also made some minor changes to AgForecast: + +- customizable directory use for stations/measurements (challenge 1) +- use of a thread pool instead of a process pool (challenge 5) + +The second change suggests a future possible OL feature: adding `/dev/shm` availability to support process pools. \ No newline at end of file From b08948ede1627c23a1f5ff16944f21130c14bb07 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Tue, 19 May 2026 11:55:59 -0500 Subject: [PATCH 30/40] ADD blog content --- _toc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_toc.yml b/_toc.yml index 79dea18..7f0dc25 100644 --- a/_toc.yml +++ b/_toc.yml @@ -13,4 +13,4 @@ chapters: title: Blog sections: - file: blog/post/2026-05-18-hello-world - - file: blog/post/2026-05-18-agforecast-case-study \ No newline at end of file + - file: blog/post/2026-05-18-ag-forecasting-case-study \ No newline at end of file From 770e14893f8805157cdc67a7dba29e7182026ea6 Mon Sep 17 00:00:00 2001 From: Maria Oros Date: Tue, 19 May 2026 12:41:31 -0500 Subject: [PATCH 31/40] ADD blog content --- .gitignore | 1 + _build/.doctrees/README.doctree | Bin 7045 -> 0 bytes _build/.doctrees/ag-forecasting-api.doctree | Bin 152871 -> 0 bytes _build/.doctrees/blog/index.doctree | Bin 4056 -> 3372 bytes ...26-05-18-ag-forecasting-case-study.doctree | Bin 7729 -> 47712 bytes _build/.doctrees/environment.pickle | Bin 59412 -> 141418 bytes _build/.doctrees/worker.doctree | Bin 16815 -> 16763 bytes _build/html/.buildinfo | 2 +- _build/html/README.html | 510 ------ _build/html/_sources/README.md | 45 - _build/html/_sources/ag-forecasting-api.md | 932 ---------- _build/html/_sources/blog/index.md | 13 +- .../2026-05-18-ag-forecasting-case-study.md | 126 +- _build/html/_sources/worker.md | 2 +- _build/html/ag-forecasting-api.html | 1627 ----------------- .../html/applications/ag-forecasting-api.html | 63 +- _build/html/applications/index.html | 59 +- _build/html/blog.html | 49 +- _build/html/blog/2026.html | 49 +- _build/html/blog/2026/atom.xml | 2 +- _build/html/blog/archive.html | 49 +- _build/html/blog/atom.xml | 2 +- _build/html/blog/author.html | 57 +- _build/html/blog/author/maria-oros.html | 49 +- _build/html/blog/author/maria-oros/atom.xml | 2 +- _build/html/blog/author/openlambda-team.html | 49 +- .../html/blog/author/openlambda-team/atom.xml | 2 +- .../html/blog/author/tyler-caraza-harter.html | 49 +- .../blog/author/tyler-caraza-harter/atom.xml | 2 +- _build/html/blog/category.html | 49 +- _build/html/blog/category/case-studies.html | 49 +- .../html/blog/category/case-studies/atom.xml | 2 +- _build/html/blog/category/releases.html | 49 +- _build/html/blog/category/releases/atom.xml | 2 +- _build/html/blog/drafts.html | 49 +- _build/html/blog/index.html | 77 +- _build/html/blog/language.html | 49 +- _build/html/blog/language/en.html | 49 +- _build/html/blog/language/en/atom.xml | 2 +- .../2026-05-18-ag-forecasting-case-study.html | 193 +- .../blog/post/2026-05-18-hello-world.html | 63 +- _build/html/blog/tag.html | 49 +- _build/html/blog/tag/agforecast.html | 49 +- _build/html/blog/tag/agforecast/atom.xml | 2 +- _build/html/blog/tag/announcement.html | 49 +- _build/html/blog/tag/announcement/atom.xml | 2 +- _build/html/blog/tag/asgi.html | 49 +- _build/html/blog/tag/asgi/atom.xml | 2 +- _build/html/blog/tag/case-study.html | 49 +- _build/html/blog/tag/case-study/atom.xml | 2 +- _build/html/blog/tag/fastapi.html | 49 +- _build/html/blog/tag/fastapi/atom.xml | 2 +- _build/html/blog/tag/openlambda.html | 49 +- _build/html/blog/tag/openlambda/atom.xml | 2 +- _build/html/genindex.html | 54 +- _build/html/index.html | 54 +- _build/html/objects.inv | Bin 488 -> 445 bytes _build/html/search.html | 54 +- _build/html/searchindex.js | 2 +- _build/html/worker.html | 61 +- _config.yml | 12 +- _toc.yml | 3 - blog/index.md | 13 +- .../2026-05-18-ag-forecasting-case-study.md | 2 +- worker.md | 2 +- 65 files changed, 375 insertions(+), 4611 deletions(-) delete mode 100644 _build/.doctrees/README.doctree delete mode 100644 _build/.doctrees/ag-forecasting-api.doctree delete mode 100644 _build/html/README.html delete mode 100644 _build/html/_sources/README.md delete mode 100644 _build/html/_sources/ag-forecasting-api.md delete mode 100644 _build/html/ag-forecasting-api.html diff --git a/.gitignore b/.gitignore index 9f11b75..5ef4674 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea/ +_build/.DS_Store \ No newline at end of file diff --git a/_build/.doctrees/README.doctree b/_build/.doctrees/README.doctree deleted file mode 100644 index 098f02a24a2f435bb1875ba26595cc7724f0c53d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7045 zcmeHMUvC}76_1nHv9JHd0SsyqI*=0Vmc5rEL}}hAP$(gWlC-LXqSfBrxp&6i-C1^K zW4jVk`Vfevd8ouzr4kY!0I8nnlL+7s9j3K>T^Ps^L7U7_tp#=2X7e@64rNR^I07qencoVi(Uhy^=qq=|WJ$#&n# zc=~pb^rL{iAFlxn}onm+ad9^&9M3kncolH)YqQ;U#ebqtiF|9!dDn-`^=K zo#wIt8kkb7*#&>3vN&buYE8H7=~$+`+$#Ek?F7c;vR@cjh%9nSMw+xg6UKqoAmVv8 z4U+0DOFsyAaz3Cvg*{_}AuW|+RXllhMqIQvdOy=V*S#djWuS7Ud#}|OfTzF& z*F(wEkpCprupI>Gz3}`CFZC3x=Ecrz-Jvw1=y#>+z4!VnuU&h+n?$8JFP6jwajNLU zSPRfK80JAH+Lr(04Iwqld8SyzvsmqG78FJ$fstVl$NS8v$r~xOOo#0Kw~B1v@SOcf zshyh}!kA27>GifNY9GX|%7>esT}Z{=pSZ#C?qpvZ4^lz%Zq9?q2#!0@q{Ai)G{ZYH zJQOL3!kX)WWGZE9z{qD<VP!?kgE3H-i^ z1u<)v+6Jinaeaz7X8FT5%Rqb^&Lf_J2VcV9Gx&QJf17ZgIUH5wvb2vMVbHP=-xEK8 z&p<%&Tq7*RT(>iwBXwA}v+f>_-0*T0;!taO;;I_Grl@1Ze)?dFi8t(}Mx$dc{TS_f z59<$O87J`j&M45-aQl^UQb+n8{s%@#W!TLyC2-B05CG9-5G0Anye zXPO%W@X>8XMukUm0c&D(Bk04f0E}8L%{GweSfX;yNM6kZ;=3(g&Oaz*&ME)tuGurw zG7{H!_l*D!0W>umsN8{7zd%ZCNk^b8hbayMv8+v5BXzGsT*u^HmG2B>_la8cFKX~TCJ$_Wzsp{YRf^&V1&}Mvf;0kpWvIpk?upS2Xkc<9{X={)R^Sg0 zr@*&r1-`5m__(<{`xl@b3!T7ClCO)=P$lgewf#J zpAs6g3D;+ysvPH-8l#z*i0AC1u3?H@qwZ(98lt$UCML5+!O_aACv4SJVGob+T2Ro= z*p;xzX&&Q`rY}nkrJBOn`KAXb?HUaP+{_6Xff|ko4fM~0xWM?OY1HkUDoj?Ga!agk z*@Yob(e40d*~CA@~&M$i6k@hK#A)x!0>!U;c?Y-_|&fZ z%~T2J)gRPjrY*Zf_?a6&=C?S^dD3=75RYDG?Hb>cu%Zb}p_@&!b~fVuVu<5bc7r@c zCxsoDyCk42;L1WyDv^9Lh0T17JXC~TC>0Ac@Lq-k;`zelqR;bO<-Pzc$2`XkkfFu5@Gu{}#VXc$VsM6oMwmz(Mr7LQQu zp2W=3K9ciL<&lq037&&vB;01p&Q*;mSwu#SLx?%MLPIfsOtL2>+-*53lFT2uBn;~a zC`fpo1~D;Qbrcs6bo*mcrg;%5A4NEJo#lI((%f%<>AWN~{w;~XcP_i?M^aNWTer{n z@Jtgb2)iXHgYjVM;tp%e^)}xnRvJ#O(-RH>VAC`McSGDFT=^n~yQ9~uGj@&Q4W5$@ z;fS$B-BeyX`>b8bc;=7hVWi9wQBVVLpF+bv(NusS>n=uw=#gm>h=_WOb~*vD(>FZ9 z^#IV&d+^MA=J^+4&y{=-PO&G-nEmC3J%TqNm)*hWP;xVHX8;hY)B}$-K_5|skz#pu z-d==HCjKZmM+*2=`*UE=>iyIJO@$na7=Q5J(Ja8j&H}|e#-~isELYWTW12rz3BcRYle`=ddkPL8E zPz56mq<2cVOw#8OB6uIYfZ*KVjK@$b1v@@Z0vY=#d|(xz1V5Fv=Mq_5&p7`m;G zP7z1D7bZ9^G^e_c&Q0(~mdi~E%zA8^SG|H_1HkS4lrq#}sNxt74jquX&%8?h3;HK8 z)1C4?fROt|!pE;Tnu;(A?sFsjo**xd$S!miWg5msM4>vQuR0N>m>P|#ezF}ZxqKZL KL$Vxxt@#J9HAEo* diff --git a/_build/.doctrees/ag-forecasting-api.doctree b/_build/.doctrees/ag-forecasting-api.doctree deleted file mode 100644 index 1cf61adbeeeffb2e294b775987a0967133affb07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152871 zcmeFa3xHh5RVFOkvSf`d+44hv$d<1qTWU?FXGSkSM3h9@Pz`tP=USSDKU_%~gdF-;g{JZ=tj}3(V zPTe}E>fXM6yY5KJlI$2_Pv5FjbzW6<>eQ)I&t3h_cVBtMGWw@`eXCKf)XtCkrBbb4 z3R(-@YfANEXD+C<7v8b3^;;L7UC4D;HT`p~dZ$?o7P`w&qgbv~OUR#Qhw5x$t)V+W2OtVt#RNI}VU-b^wn?ccU zwJWt5Z|}(?Ufw$$6w9?r5oP-|UcPFbT111(PY34-(?z%Q=7o^P6%8L0wHL~3yQ>Pq zg7Q_}6`Jzn-R0FvEm%0-new|se!JbQOm*7e7;)&TN~uNMSXr$4trkAw@2hM6T=>^D zrB1{AnDUEfn!z;H>2z1N{TV7+C|_UR@W>VAySkHOkG6tlYi!PMR{VOi-Wp@V@t5EB zCyJGzRt%2Rz@;`27~4L+{r<6fBdF!8{@hf_ADyYR%blswN`1_q$xj=O=KV%xbgr~e zUSGbhd}sNp&J-B93UvE3O}|mLrSj{0y@L<~M3A5ITS3VKN@pv@z(aFhu~~0;rAjM6 z34IWW`L&WaRjJQ`1zw{WlqyOQyiSY6c`oqV<)G=6K!aDQwF7iYlJusV^*L`28c=Ce z125!uYt-8xoDHfV3r)^@fb<@%RnCGjmG-<>pY|TFw2Ji_TFxKyfeYFp=6ISrp0Ho5XKQ1rri4DQ}$R&`fYYH9-EX_XNuuj^jJ4KEnVYyBzDb(gD7y36P0 zK~WHwbQKb=q^U!91#rY9x6r+@cZyiRd{3owexyt@)V+Vc&}Q1hyw?KfwFHdX=V zz(V(0R0+;Es+D4;z3>9*+6*u#_9q~YFsbG$ExO52bm_YM1`FT`E$adcsz-2lJ+Zfm zHLHzt1I!VhQR8`qP;!pD)iRisyY!;wgW-n=G!g3F;@0 zclXCLNghL59xuAeg8>H1CXr^0OlI@g5%j0FuUKY>0e5L76CtdRWM(&~qMIa~)uC`^H)+T;q-hPK zHAcgf2g~QyCzSnpuv#bUfQ;PyH2!v$%PIl4Wb$Mxk^N=zx=SsSRYFidc|4kmYLYzG zXnCBV*spge$FQ%h(ty!hmi(Oh;4GOn(S|JXyfu~P{^EJzQj2Fzl(c>_ z`u0?OlVo(gmeIFnkdcOQlF`F@wR&j6R$}MjFOJM)@Zm*Bf^=K}{$(5RE3ipU@^41dDrhy}C4t>gZ_fE`hz+)b`a+H&d~uf8 z^|7WbVcmA+;w*<-0GGB1%P!S*8+3h)xPEe4n~HFfoNm-|TB9M;&}Q2~!#K!k%M;q! zMQ&GbB4~FSv|NP_F#48n(KlyVt?g;flGdSA;`{*M+s~piHoR%S3IB44eFP=YKOMAMIO6cDEpN_0696Atbxj?SGuDrr@{QI$v zasIZV)o#{nGuDAYcWqB=a#Ye=VjBNatnpM2`s^2|_J&99)Pyl+I1}uHG0u%PJOX>o zOp`n##t)geO>62{)xCDAQ>_N=erGWKo%au%lIep-W6#V%69c?PH8q8_>hn{9Ut^vv z8s2dBt64a!&e`tLZ2gLcbg>s1=I;ci+@C93AMc$g{UQ$TJ5_zEs?TNRm@NZ@q5PJs z(oFlLRepn}{6-DwLOH`YQU1zfbX1%Vcbw6=oLIuA%DE#CAM*|znHULIjN?Ij#5;as z?_O=9t?OQNJBCXmnYnbg=F-*-Tw)j}E;z5BNpy~0tk;`3q*SXZ z#tg57IB-!%@kjQ{s97w$;mW?uT=6tlUX_6>4CBO=mp$yai)9!c^&+jzh)STDL&YA@ zp_AePR_5w_t0Lnj6O5t$^_i)^M^pcJ2I?8ciTWLo>8mGB9M@ZavTu099NJcMexpH5 zvBnYW!=hjfH{O_;8yht@Y8kk}Foqlb7pv}ya6!V3AWu7j*}n-FM4pAs;$_;f&b-Zb zz?_5o_CiRz0Bu8y6`yq%aBs*1flt{5L=UI+P9XZxNaF`HNrQF+o3%8)U!+k^L1yjY z%1k+bl>8S6<7ri9WHC-CF=+ivX0&n|tq&QrR&`gy1Vg|_wJ?QE!5Pc2dhMB;mMy!m z(7mwm+}G#-zisHk!t-9zKRQ^;+uNWhjBp}Ls^_5rH1giBPx>LY_xEK%BDsklLmq&U zi`9j3!vP^_cgpDqp26m;5e;?%sYCJZk}o<^GE zBmcNIb*Smjdq)F*+MA#jlNxhv>R_`z6X2l4YEAn-1v}TK9;fJN2oLjcF5ZSF)48e8 zF?kAzu@2-A=!@f*N>SrAxT%Yu+H3`O{M(+xM7F@yX)+Ulvvj`AEvQFLue zZ#2C*y{+_uxv8K;muaNE!A+%18R=SaF{O@EhLDlr4^WJW=l=**7sC;OeQ8Mhj+fkS z%EE^*U8aBG-#@EA;&XonJ(jAWLJzQEBd(el3*vr(w7M}+{LBcwE44c~a0_ za=VfGi2{>cmfUXPi0q@IJ-pKKfJ<(-kZtvPAl9bI_n>p@a!`$?b+YFX5jEm(-lNx!2=m0OfCiV`kZ@69V0EZSX9Dz1n*yK6FdYyBCC@M?HO+udcAJJld|GPQ zr~{)~{ZNkvPuZyJD;#o7!HP>4_C!S{@sB1NOEtL31aj$ECy&FjVl6QT6hrkzfqIka z_qigWP87$OMK>rq6-$zDF-j0~3;`*DFWH$8=%*reh;F{^~~FPuZF#s-}#GC*Ob z4+Ro6VOXkpLGhpoErtN5HTjE`OinbVB&znk2c1j<<&HSmM4n6U!du=hr;r#Xh=sx# zscBFC;yzm#XVUacM^iz68e<9uyiTqep=`~J*Yp<+TM$~>d z<1%ZxKzBzWMuRc+b7=qm5j7c6u*8VRelLy~GaZ7jW`Kok4DXQIi_0cTnc1ev2wYah zUhd$9w=C=%@#Y$3{4qDyqNPC3II2xn|DunCd9@iEJ*_-^Si2dMfW-KDy1r>m{^AyS zy!AARb~kw^WHv`&+~X9*d^~7-=jzQfltqae!~a+(FufP3!=TS3k7<@lOKR=I)T$C* zw7eW$elY}dYdpsl^vuvI43E-zeGdh?yg-r9Rvpx18tIxcvbI*CuEZ@<5S;htklhqm zSF6B&w9=TbO(}*F@sGA>UDS12a&Ee0PG}BU|5-98;>=hwC!!|6k~x7GPUKOb^vFRw zKHDyt6HDgAk~#5zmpLK+p#KJEg`+=c_TQoI?C;XQK8t_R1zF4cQ-Jr!I6*A$&rKzE z$KXCSyJL+1#}wnri7AeGfY{CA<^j4D#(4+c2W{_HI0XlLf%=vkPteNcS+X3^ec12O zo}lF#Ql-+rT4fEgE}ZH_)JXEtRuPgtMf4=X%3{6RY6Qie!jxP`06AAFwaW{S+(VMN zo3L0vd#8}WxjJS&d}8;M#-?BDAw28wf3#Jw;%eMf@=LvpSk=9%SwGkFT|FqFTx2~( zCRb5+MW`RF4*b(d|G2QtEsOs8*+&F|8J(VMH1F0qBxt3=!Qb7A~E8Fsu@DoUm8MEr+hVBzbK+*%A8jC-YF@yD_&i`zo)nCYr!p( zyydrUqK88@sy#O))MH5`mKpXRSPc6Y^op=o1G}sUuaJ&1vHzQTz|vQQ4dQ6#Lm_hQ z%E=IOWl%N4peaGXVG2`%*b)+g;ofRZ6QdX&5 zUCK$}hRNu;aMFCRCR&9>7yoP+_W@x;23ft6?Lv`N>V&HJ{eI~v6Tg432W-GBkbXkW z4B0TCnqknV1OW#IDM~*n5SNwGhbQ^yKPccCFS^ohnTMt<(drxVU_FL8YGZT3Z3Z&h zDzmPC1;e!eC@gSb8qWZ%RbSG;3DzGM@i31rh8qm(NklUNgQ^)a{^unlV})k8X**6z z>NKMC>W>7Qi`1*st}f+_wR+MzCr+BKuC>ZpJdtmPUz=7e!t8xfPgHknU>9@cPU$EU zn{V#{OP{Fj+}oP370u~*B=CfJkzUC#=T*|V!+2B5v_~K=E0rUY%>Zw!B7jhBMx)6& zr(*d#71gonXvn}bQ|wQM1y2Y;4lLj)hxOxe4Xmad4-pk%R$84zve4t}f*$UOO3!aY-7<*T?FxuzJ25-hGE~B7?-czC|?FO{C2Vuw@`ac0PXT82G8D&0Ggb%+XDPiSEw!slIl0{o zA8S0JOVa#yV{bL)ds30%{q-vsVYj@bXSr)Nu#4StjdYZW_gD9TrO$FVNhl`0eu0Z54>iO4G(kaurQeNNb^8hYwjj%ZU?Iolb}6vFI>V857fh zSV0C?G(0*a6g%*Ur#x1deHz$BU0x*}T_kH4IaJfZ-b+r@q(kujVBO_(_P+4QRdk4c zM+kpwk1sYlA9dI8F?lQRciMH_Zi&9LK6?wbu;G#K)dSLm2pB}Vw<6XUK?`{uoN9s= zOss^i!YSJADzSJ84n{EX5>`*qr=d;r@$a!Vb;55+J)Sjn`S*p?3w%np@ZR^Eb^7w& z0;BZr5?ypq`Z9%VyjRO(K{P%!g}J&Qf>*la&I=FCwY?<xqSI4+GScSKpZ9>JFWD=PR;HSMbDpu6-v;;Pxa{V9sHm3aD+J>5;{I58 z+d**W-v;;ff{82NZxe{ii~Hb^pY4K)EAC?gagn&2WhEt4=1+Q5EnP!(s7%6C^uC^f zxQG~;)sF{Lp1OKOmq}PBVqcABJR!Vt&;ezTyqzqua*E8Fl_?F#it0!xi(l2*hQ@{KiuUCQhqsM9ONnRVb;*Q1kgg@}B6scHi9<(J7X6^fvWQz~dj4K7=B5C-V4WsMna;$e!-Xvpz_Ix*Nxlf36741fW$i$Yrd%)6%(~6UL#MPI# z)A*;s{N>W1E9MUg#AU^N`5U&6$_f?!Fj!9r4z5_A6o|`;_3fv9JY(iJ!>2g#s%)j9 zZ}zhmrPMI=%?h@z^vwvwMbh^*8)j>dckoVcrKsN%v3!sTC5AQMDTKPR=3fXzCf0m= z4_Nw8yBhSIlnt8xW$^w%Y0eez?-z*6i}xG0MOH2K%i#U51PfQZe^wwaE8gq0{@_7P z4jQ3Xn|Yk|D>jsUM(}i{>^BACA}RZt4YF{}dMtcD8|-23^n5pL`TvASSGN3Dfyl&` z|J(zXKESRyIbT8!7d#}-539=ugZ+x3tOm+e0&!WfPhHRM5*%E4euqF@R;)LkLOLR3 z^%>)=4S1TJPR2d`B)g?jE>(@3b_)Kk6mJuVi=_B#Hu$bReERfBZ(o((vS*!*d^7Ag zEyTI9<23@2i5PPATBH3>n0FbR>nK@^-jxET7)GICu4fz>sM?jd$-`}O4*A7agmgL&4$-d7=B0W zVaC{>3^RUSNONVz&j~~(W_+XvEPZgT^egppyWL>)<+s88cce*I+_r! zAx1p>VX*#l!NC>lKM{z_iuFxKXK;`ko!Ju03{77Z3|(pZia=Z>O<%Jiweo0vX2#ly z$#27k4cBHhu+|GiCN|vG1C~CR*66&5i1V^Zh<`Se?2-;#1-e}zE-NJ~TJ2J`GR1?7 ze;Uk>3LdVQ9}$SliusKboJFEUY13>uBo!Hoih`djMUw(?krXX*aHWIk;FsP*wEkcm z{Ic8%e)+ipXLqybP@!MI%MbKKGMLW0YvE)MkPz02r!cW7sxXpZ6j3#?fE13Ca17r# za2|KpYS^n!gpd4+Ewi?_#Hhu4M93~`K~W_i&_utaAv;sEe|u#-d?QybMB_QE^c3ac zVU^~xcD4fhi_)+H=_9yxjhAL;kZm>aCOY&sWA4C_iLJxKyWuDf<|>`J$W3;-=VXSelatyl%KHXF~`?tk&mgbzlkGpA2tzWs$QAi~MOVr_TDwLTKVIjYu(o6{M;nR4rkA^c>lk<`)5 z3jPsIJ7b^}{O&;{m`)kaU6Z-TgTn1pMAfvzF#7~1Wu18C@UTgx3va0<5fzfy3Ot%{ z^ldesheW$VGbtvZH^z7y70~KPe=MZfSHrXOvBpyAXF+{b3yLvOf*KV;xlv|t;AY(A z#t76z2B~-}xiO5B+_1i%!j;D+gYCAUp3WSNc`)?HfM>n~-H7Q+~6nMFEo zt0%7VJh__X&os~-!hV&PUD>VD#xz#4^(lHDr91?qo|jWz*SolSJRLM?BUf5@p)+N* zenUGbmTPtRE#{Fd(=VQ}ObDxtOnFrnvmo?+2DxF8^@hg33WY52DK|7$Q?|4NwUT;> zM0V1#uSWE%R%b9al@am_TH#h`NGMziI_n*o+*x=CJvpYG?Jig66MYlUege%I#4R_<+ShafdMd}K z8+lk5Tf12u5=spFj$~pV?ezamFZ;4Ne0ERT?*m~A7)*LOIvYUd+|t(F$YZPL3-a2) z@AEqRlRtJWzkh$IE3s?`H^f_Gx_b)@*?tzX`O4rYHRVr<;^6*f&KY;pJ2&9IG;r6i zm#$OSF=c)+%;N%+Vm5D{r1x;zol;B~`-37LEvmvdInxZV$xFzDg*UW9NM^kGU`T$; zVi^8wn&HnI3f6V+j4(WopXrf-+?mYXeT#HAn8^&|#N;iL)p~7aaa>*{pv-3Li=p}h zi{bOX)qMUjAsmYB%4Y_0=QDTre(7#7pBcu9&##(n;9WP`D$r9Uq|x;TJvZf7F})nb z?oX%kwBy(Y&NHhcZL$zzUyUGsXEB2KlorHq3TGgQZQ0Q`XmCsJ(qSAvEjSF84#PM} z=jf!hZ|fr<_PvUvtW>oFB?a42_Jyi_7FKV8VbuRzjJ!Ur<@G;=SCH549(lP_WANc7 z-37Sa1yEB)Hrp%;3T!2VNIlulbR(B9?EMp?LjA@jJFmuhg(C3;AtGzGF=W zvzZs=U)Lg7r-9X0?e54Lk$|A-l;Pa@%st*DJr3qG!#MGIc=Ggt<9m;vE*#mv7*4Me zXy&!`#Ss3=#c=yKG`GJ=XotdQ;5Ng#bDMj7P{b z<;QpBx9!@@*72U5J4VMhixsyg|KLOT9Wg2hY-fJ_Ap+CW<(~8B&u^9iy=Q)YesidE zd!By!>5Z}%{kp?D6e2dWFG7aSdt*2f%L{$?#-Hi8H-0VW-`OoMFCGl@)$EgeHQ{+p zm=<0+m{mG>Ik8kHm5nN*Ln&J?%!*ItR_;t zWGN0MF~}yubcN#5%LHR&^Qla-p|F|HX;MC^A#v(xzogvVoZ^H!r=K>%!>6o(uGMAO z{eG5Vm+q4KLkv4Z#>Km&{wxzS$tCrLUS@v%xum|Dg>1Hdzo;qyU!q1Z6&B-?;s)Gp z2JZTArR%{q1H=5az@)gO_J+B;Oa6Q-x`W@3FJ8NjNk=7gmseud%#4@5)idt9y={r^ z!c|lYyTW-H^VSzLqBmW?h`q>{v^4J4z-ljYe`Gu8j=RByn{$^9BXXx8GFUbY<0P9` zP3rinLZuWH&OwzlpTvWxtQkB@rYm~6V0315#M`*{=;`Ad6Gby*+T?l7{$v<(crn8H zvKG#M;R%MygAw5j!u`T??*7GXdpu2b&mA!(>VDT`FlXzY^$N?7S`u6aw zjd)lF`PpNhE`2j5_SMK}ZZR_YV=beKFa|OjkID${yFu6+EVv3^^c7{`t8g2W(6v+MdQ;pa+2YUrK=pTIv0Tta4Jhwz`l>r1rH|FeD@j#DoCeDx41 z!jZ6RWz$53YPKtL0R^*G5SXAWN!s$u4*zmAZ4~kEGb`d>^eCbkJ>9K(TIt!_v#wFN z4IPNtLAxotdj?~M5m+o3hxfDA);#O({=aIHtR_-+_iON~X;Af!1#O=M#WQOBv*Gdj z8!}k*Dk$eKHA1&($oL+8W6B;~EdedrpSx6*p|TbIIS-Zez4?E~P%-FRd-M9KpxtTK zT3!{GX1w~ehwILse-=+5`cp94BP&@e^o^B*R&iRXHnGM~O9Ea4mP6klQx`%6KvG zF5>=J3wQtE|H*q3`ehlKupkM=ir5+RDgj_dSzin-?^z7HzM|RnE~9Vjx;G}^W%}W& z?mXj87NnC@QK~R6hWTEBN%5&|Q9Nznq`ne9Oii5KUugx1(Dtm)N!-1jxErs7kB>V*^5B0eap*@SqZHkR{M=gV%t<;mX_XDb=bFrpl4m5|0xux zz^5$Et5w#1ee5Z|@7Px(`1{sow3d%uafQ~djT$sPhJDkvQSX>~GHjyWY2udmQaPu3uJ zx1vUy%oMd2USn^2)3C6~2$6_}OWmwt!2V1OfTerv>Rtv!92>8F3Ay7gEOaj{JonG? z|KB!rVc~gEq5YIk_EeZ{#>*i9W2{=6841J5n|^I3*y@G<00@8!*-83fc92Cd?xi7( zr}+gm?yy-9gm+Ak-kH^c*?+Y(}9DH4zw!AHDX0hO4bEpg)^+#8C z=pRxL`QvdqLO+gl0r(%K2cS}5{JfXb*(FB8x>2ZHctfAdRGSK_T$w4;J2jSGnZC5I zCAO|1NtM>fZO_3JZ^qlNuAM+IIPvd6jM+OuSL|U`m+K`)t{;0J#y)4aH~y<1-Z$dy^BcRp z9lP*%Z|!e<4xd8g8*z9ql+vGpO+)|mG9uLV2S&VYJ4d|j+eW+{<9P&6Bvt*tfM*o? z7jEK?C>Lixp5;yjeraCaTc=1t@EP-dFLMWSOh!n`A1|?!dC5lOB_`yS%Ose>SI44+ zHh4$qqJOUob4 z*{zf-GOwMLd2&XwW7Qm1lW$cg!wUVd?Awf1kDg#36Njmrv-kGxquzmOgve25{&1VU z&o7qw7!RiqDK(5=vzp1TiBsZZJJ_#TNpkG&I2DvSNL>flO{s%tn}8d6i&W}&uZ?u@ z9k_Mc6=bi$v2lp6cyAX4Ye;!I6Dj1P-PKD<#6{cv^d@X+kzL8F`txu!;2uuR!}-G) za%NRqV;cX_#{AYHbC}9!QM7yt;hU37Fj@;Po-JhphQC?U?UNtzn@U&|y zXzlhM^P3eFFoIH*->&4rZNb;!l*bkAA+8#Z@%dIenA`2Wdg8=!#mxZ6>V#l{Pz%No zbJ7foNFg=P8=7wLH|k~ zDL;@j==X%DPTDK$k@t7HT0htFIyeINTX+Wo2jO*%tlGjif+jQ?*@TOM4F8L4#gO;Y znaHDwU~eyZk%{27v_@?58k+SO@k1e5xEbRWnw?sKi*lo*qg!_?kKQH^>%h^vkFXaC z1VeDZS-HA_sbpG34 z9{O)bJhVR=!sC6k8O-&2;7!CIOc(kMBe`-m0wWR)8R>iHsD589NW7*{nf4-Aeo5EP zR!Yp-cyTBkvOGCu$sVtu?>!a5YY+uo;wb1+AV>s^MEeNwqef!%#i8`?2tB(-y%Rcl zN);Y0B}hI!$+tL^oUx<1MhO9gOx2O?FG?&02gZ|g7!oGP8%0YXt*0_` zCSDLB_I@Kgj)0^9#}=(rlv%4<4XTPf`dTPW149;us#mCBaOrwERned};?+8H1)6TK zIPcl1O0CYDDjrkCQ=;Lag?C=H?22XdPZ+IP6X+m{%|hq;#)SG0nM^3M5PdeGJ|`Ap#^BT)dpm99w8Z0xVo2C0ymbAQ<5ek% zh^oXSE(+F=`C5y4hk zzYLYo-#uGJ-ts})`L#gSOs≪HNCM{h-*!L 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ⅈ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 diff --git a/_build/.doctrees/blog/index.doctree b/_build/.doctrees/blog/index.doctree index 8f5d0940f727ca3983c6315e2eb84636f64fdb78..e78e2f9edb09f8774edffc9ab7b105d13a528cae 100644 GIT binary patch delta 133 zcmca1zeb9+fpw}P??%= iIP(&7Q%foffWoy?GEzH>GZcYz!e(P$MaIcf`JDme5ijxp delta 701 zcmZWnJ#5oJ6poYHX`Mg^5CiFtD+IJqx232E20#@^2#PYWFrWYz`!&yzeP?`UnhaIT zK-8$W`4BL&v!EjEC$qvmXbxF zA_;)2nyN}?KNB-97MGWnFStu9?zxLDLKrf4gC(J_I*Q10K)o>aVLb@<>+lhgqY-KO z5DQede(5EP9*IT3s0OtYvhnwaTb3MYgsiT*(!#*^fvO#OXb3nAbmb^bqdFwutF@f8 zMIdw|M#Hw+N%1UtIEnK(wPs)iAEtGJ(*wRUn(K+0lH)_R?nXl57!pPBq)wgId#}6l=DYI!Axm;E(t?20G z(z5YA`)nUIo8}_w#SWKaltdufu@+=g;cl1XjJ`X)52YDnOB-~Ux4D4mK?IzW z1{}0$;Xm7sNjfCrc#H}XQ0^qKu0^39ID$EpQD_BR1hnD!%u6F}q|@JianQmQ?ICHb zvjjZCg{u#6xk&wXfBU6#4|JOaja*Yt)t||!G_Mc1MfrKF(p()pFO5uIF++F^p<2t! nkpWLVId@m@RBu*qC~0w)CLSo9*XlN}>WY5_)*fZw%GZ7a>^=aR diff --git a/_build/.doctrees/blog/post/2026-05-18-ag-forecasting-case-study.doctree b/_build/.doctrees/blog/post/2026-05-18-ag-forecasting-case-study.doctree index 8cde8b9826d2725ca69cac4fce27058982f5b9e4..90491a9db1364c8ef5785a60a8555aea363da2d9 100644 GIT binary patch literal 47712 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 bR2BfO0XphMXK{uikba!OQ@r{AjzmTPXDU)W diff --git a/_build/.doctrees/environment.pickle b/_build/.doctrees/environment.pickle index b44285e6d8b94c7d5df67c9f553642342f3564b6..22c195400a86972e17083458a0d9c486255fa8d2 100644 GIT binary patch literal 141418 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 literal 59412 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 JMq@nv{{Xc&_p|^2 diff --git a/_build/.doctrees/worker.doctree b/_build/.doctrees/worker.doctree index 9b6fe6fc27e0e1233c4123b8017a4fcbb3a0775d..597ba683510adb13d5b96b457f31f867b29890c5 100644 GIT binary patch delta 411 zcmZ4A%=o*Bk)?rkYQaX9+lJA7(SfCz$=SsviA5y}>7|(|sj(UvB_##LR{HwsnI##e zNqWiox%&A9sd>6NiMdHBi74!(octvH+{Da0{gnLVV*Nt6S$erClYbdnPZl?on4E27 z%D8ayLL=G91*|;5J#0m(X{AM(Q+nK~WYLt(DaM-^S+f?fFfdG3GhM`Z0%jR&)_RcG zZ&OEs`9Ma7oVQ(uY=%yTbk>o{K4yW8M<&lRvt&Ft`Jb`&W@hsWW=5^eHCDfv88aq- zu#=eFZzso?HhCS8OrLz#PKmJsC~5%|(X=;ZOr0EWFTq$oxx!wH{U6Zite-5CSK4dK zd;zgP0*TTd&b-9j)RM}A)Z!_%Q#7*vu}uD8FT)2?&{>+H2oeJ7k#f*t`pB}`%^{N! E066lKO8@`> delta 482 zcmey}#JIkhk)?rk>XMBtw+&_dq614ale3FU5{pU{(n~W_Qe!nz@{{#4N^&(PCm5Sd z&NpJyWa!~3NX<*h%uA22C`wJ6GI@$--k7&$R5 zW0`EoD`T$F!va>^!;)KBTrwp!Llvk{9f&n!r<7)BXDwl2V91cpS_qxYta00DK$*b&lM*CtDt1u|ZnJm1)m3nq4%Wpcl=+T;nGESt}pRWLK!Z}zbI#mrL6%D^z0 zkxgWBl$|_d_2eo$ImVjFGwqaEdSMcm?G%9$U+qk#s(?a0f - - - - - - - - - OpenLambda GitHub Pages — MyST Markdown Site — OpenLambda - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                  - - - - - - - - - - -
                                  -
                                  -
                                  -
                                  -
                                  - -
                                  - -
                                  - - - - - -
                                  -
                                  - - - - - -
                                  - - - - - - - - - - - - - -
                                  - -
                                  - - - -
                                  - -
                                  -
                                  - -
                                  -
                                  - -
                                  - -
                                  - -
                                  - - -
                                  - -
                                  - -
                                  - - - - - - - - - - - - - - - - - - - -
                                  - -
                                  - -
                                  -
                                  - - - -
                                  -

                                  OpenLambda GitHub Pages — MyST Markdown Site

                                  - -
                                  - -
                                  -
                                  - - - - -
                                  -
                                  -

                                  OpenLambda GitHub Pages — MyST Markdown Site#

                                  -

                                  This repo deploys automatically to GitHub Pages using Jupyter Book -with MyST Markdown as the technical documentation of Open Lambda.

                                  -
                                  -
                                  -

                                  File Structure#

                                  -
                                  .
                                  -├── index.md                        ← Homepage content (MyST Markdown)
                                  -├── _config.yml                     ← Jupyter Book site settings
                                  -├── _toc.yml                        ← Table of contents (add more pages here)
                                  -├── requirements.txt                ← Python deps for the build
                                  -├── .gitignore
                                  -└── .github/
                                  -    └── workflows/
                                  -        └── deploy.yml              ← GitHub Actions auto-deploy workflow
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  One-Time Setup (do this once per repo)#

                                  -
                                  -

                                  1. Clone the repo and copy these files in#

                                  -
                                  git clone https://github.com/open-lambda/open-lambda.github.io.git
                                  -cd open-lambda.github.io
                                  -
                                  -# Copy all files from this bundle into the repo root, then:
                                  -git add .
                                  -git commit -m "Add MyST Markdown Jupyter Book site"
                                  -git push
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Local Preview#

                                  -
                                  pip install -r requirements.txt
                                  -jupyter-book build .
                                  -# Open in browser:
                                  -open _build/html/index.html
                                  -
                                  -
                                  -
                                  -
                                  - - - -
                                  - -
                                  - -
                                  - - - - - - -
                                  - -
                                  -
                                  -
                                  - -
                                  - - - - - - -
                                  -
                                  - - -
                                  - - -
                                  -
                                  -
                                  - - - - - -
                                  -
                                  - - \ No newline at end of file diff --git a/_build/html/_sources/README.md b/_build/html/_sources/README.md deleted file mode 100644 index 42a0660..0000000 --- a/_build/html/_sources/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# OpenLambda GitHub Pages — MyST Markdown Site - -This repo deploys automatically to GitHub Pages using [Jupyter Book](https://jupyterbook.org) -with [MyST Markdown](https://myst-parser.readthedocs.io/) as the technical documentation of Open Lambda. - ---- - -## File Structure - -``` -. -├── index.md ← Homepage content (MyST Markdown) -├── _config.yml ← Jupyter Book site settings -├── _toc.yml ← Table of contents (add more pages here) -├── requirements.txt ← Python deps for the build -├── .gitignore -└── .github/ - └── workflows/ - └── deploy.yml ← GitHub Actions auto-deploy workflow -``` - ---- - -## One-Time Setup (do this once per repo) - -### 1. Clone the repo and copy these files in - -```bash -git clone https://github.com/open-lambda/open-lambda.github.io.git -cd open-lambda.github.io - -# Copy all files from this bundle into the repo root, then: -git add . -git commit -m "Add MyST Markdown Jupyter Book site" -git push -``` - -## Local Preview - -```bash -pip install -r requirements.txt -jupyter-book build . -# Open in browser: -open _build/html/index.html -``` diff --git a/_build/html/_sources/ag-forecasting-api.md b/_build/html/_sources/ag-forecasting-api.md deleted file mode 100644 index 2a2e377..0000000 --- a/_build/html/_sources/ag-forecasting-api.md +++ /dev/null @@ -1,932 +0,0 @@ -# Agricultural Forecasting API - Technical Documentation - -A FastAPI-based service for crop disease forecasting and biomass prediction using weather data integration from multiple sources. Developed by the University of Wisconsin-Madison Data Science Institute. - ---- - -## Table of Contents - -1. [Overview](#overview) -2. [Architecture](#architecture) -3. [Technology Stack](#technology-stack) -4. [API Endpoints](#api-endpoints) -5. [Core Features](#core-features) -6. [Data Flow](#data-flow) -7. [Disease Models](#disease-models) -8. [Biomass Models](#biomass-models) -9. [Weather Data Sources](#weather-data-sources) -10. [Response Format](#response-format) -11. [Development Setup](#development-setup) -12. [Deployment](#deployment) - ---- - -## Overview - -The Agricultural Forecasting API provides real-time crop disease risk predictions and winter rye biomass estimates for Wisconsin agricultural locations. The system integrates historical weather data with scientifically-validated disease forecasting models to help farmers and agricultural professionals make informed management decisions. - -**Key Capabilities:** -- Real-time disease risk predictions for corn and soybean -- Winter rye biomass accumulation forecasts -- Multi-source weather data integration (IBM EIS, WiscoNet, NOAA) -- Geospatial queries by coordinates or weather station ID -- Batch processing for multi-station analysis -- GeoJSON-formatted responses for mapping integration - ---- - -## Architecture - -### High-Level Design - -``` -┌─────────────────────────────────────────────────────────────┐ -│ FastAPI Application │ -├─────────────────────────────────────────────────────────────┤ -│ │ -│ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐ │ -│ │ /v2/ibm │ │ /v2/wisconet_g │ │ /v2/models │ │ -│ │ (Coordinates) │ │ (Station-based) │ │ (Metadata) │ │ -│ └────────┬────────┘ └────────┬─────────┘ └─────────────┘ │ -│ │ │ │ -├───────────┼────────────────────┼─────────────────────────────┤ -│ │ │ │ -│ ┌────────▼────────────┐ ┌───▼──────────────────┐ │ -│ │ IBM Service │ │ Pipeline / WiscoNet │ │ -│ │ (ibm_service.py) │ │ (pipeline.py) │ │ -│ │ │ │ │ │ -│ │ • Authenticate │ │ • Load stations │ │ -│ │ • Fetch raw data │ │ • Fetch measurements │ │ -│ │ • Build hourly │ │ • Compute biomass │ │ -│ │ • Build daily │ │ • Annotate risks │ │ -│ │ • Compute rolling │ │ │ │ -│ │ averages │ │ │ │ -│ └────────┬────────────┘ └───┬──────────────────┘ │ -│ │ │ │ -├───────────┼───────────────────┼──────────────────────────────┤ -│ │ │ │ -│ ┌────────▼─────────────────────┴──────┐ │ -│ │ Risk Models & Biomass Calc │ │ -│ │ (api/models/risk_models.py) │ │ -│ │ │ │ -│ │ • Tarspot risk (corn) │ │ -│ │ • Gray Leaf Spot (corn) │ │ -│ │ • Frogeye Leaf Spot (soybean) │ │ -│ │ • White Mold (soybean) │ │ -│ │ • Winter Rye Biomass (logistic) │ │ -│ └────────┬─────────────────────────────┘ │ -│ │ │ -├───────────┼──────────────────────────────────────────────────┤ -│ │ │ -│ ┌────────▼────────────────────────────┐ │ -│ │ Output Formatting & Response │ │ -│ │ (adapters/geojson_adapter.py) │ │ -│ │ │ │ -│ │ • GeoJSON Feature Collections │ │ -│ │ • Time-series grouping │ │ -│ │ • Station metadata embedding │ │ -│ └──────────────────────────────────────┘ │ -│ │ -└─────────────────────────────────────────────────────────────┘ -``` - -### Directory Structure - -``` -ag_forecasting_api/ -├── app.py # Main FastAPI entry point (v2) -├── app_v1.py # Legacy API (deprecated, v1) -├── requirements.txt # Python dependencies -├── Dockerfile # Container image definition -├── docker-compose.yml # Multi-container orchestration -│ -├── api/ # Core business logic -│ ├── __init__.py -│ ├── config/ -│ │ └── constants.py # Configuration, URLs, thresholds -│ │ -│ ├── models/ -│ │ ├── risk_models.py # Disease & biomass calculations -│ │ └── disease_metadata.py # Model metadata registry -│ │ -│ ├── services/ -│ │ ├── ibm_service.py # IBM EIS weather integration -│ │ ├── wisconet_service.py # WiscoNet station pipeline -│ │ └── risk_processor.py # Risk annotation orchestration -│ │ -│ ├── routes/ -│ │ ├── wisconet.py # /v2/ag_models_wrappers/wisconet_g -│ │ └── models.py # /v2/ag_models_wrappers/models -│ │ -│ ├── adapters/ -│ │ └── geojson_adapter.py # DataFrame → GeoJSON converter -│ │ -│ ├── schemas/ -│ │ ├── geojson_schema.py # Response schema definitions -│ │ └── model_schema.py # Model metadata schemas -│ │ -│ ├── utils/ -│ │ ├── math_helpers.py # GDD, logistic, rolling averages -│ │ ├── conversions.py # Unit conversions (F↔C, mph↔m/s) -│ │ └── caching.py # Station & measurement caching -│ │ -│ └── pipeline.py # Orchestrates WiscoNet workflow -│ -├── api_cache/ # Cached API responses (JSON) -│ ├── metadata_stations_*.json -│ └── station_data_*.json -│ -└── materials/ - └── example_callapi.ipynb # Usage examples -``` - -### Module Responsibilities - -| Module | Purpose | Key Functions | -|--------|---------|---------------| -| `ibm_service.py` | IBM weather API integration | `get_weather_with_risk()`, `_fetch_raw_hourly()`, `_build_daily()`, `_annotate_winter_rye_biomass()` | -| `wisconet_service.py` | WiscoNet station data pipeline | `_compute_winter_rye_biomass()`, station loading & filtering | -| `risk_models.py` | Disease & biomass calculations | `calculate_tarspot_risk()`, `calculate_winter_rye_biomass()`, etc. | -| `pipeline.py` | Async WiscoNet orchestration | `retrieve()`, multi-station batch processing | -| `math_helpers.py` | Shared mathematical utilities | `gdd_sine()`, `logistic()`, `rolling_mean()` | -| `geojson_adapter.py` | Response formatting | `dataframe_to_featurecollection()` | - ---- - -## Technology Stack - -### Core Dependencies - -| Component | Library | Version | Purpose | -|-----------|---------|---------|---------| -| Web Framework | FastAPI | ^0.100 | REST API framework | -| ASGI Server | Uvicorn | ^0.24 | ASGI server | -| Data Processing | Pandas | ^2.0 | Tabular data manipulation | -| Numeric Computing | NumPy | ^1.24 | Numerical calculations | -| Data Validation | Pydantic | ^2.0 | Request/response schema validation | -| HTTP Client | requests | ^2.31 | Synchronous HTTP calls | -| Async HTTP | aiohttp | ^3.9 | Async HTTP requests | -| Logging | Python logging | stdlib | Structured logging | - -### External Services - -- **IBM Environmental Intelligence Suite (EIS)**: Premium weather API with historical-on-demand (HOD) data -- **WiscoNet**: Public Wisconsin mesonet weather station network -- **NOAA**: National weather service data for historical context - -### Deployment - -- **Container**: Docker with Alpine Linux base -- **Orchestration**: Docker Compose for multi-service deployments -- **Reverse Proxy**: Traefik for URL routing and TLS termination -- **Health Monitoring**: Periodic curl-based health checks - ---- - -## API Endpoints - -### V2 Endpoints (Current) - -#### Disease Risk & Biomass by Coordinates (IBM) - -```http -GET /v2/ag_models_wrappers/ibm -``` - -Query parameters: -- `forecasting_date` (required): Reference date (YYYY-MM-DD) -- `latitude` (required): Decimal degrees -- `longitude` (required): Decimal degrees -- `planting_date` (optional): For biomass calculation (YYYY-MM-DD) -- `termination_date` (optional): For WiscoNet biomass integration (YYYY-MM-DD) -- `API_KEY` (required): IBM EIS credential -- `TENANT_ID` (required): IBM EIS credential -- `ORG_ID` (required): IBM EIS credential - -Example: -```bash -curl "http://localhost:8000/v2/ag_models_wrappers/ibm?forecasting_date=2025-05-15&latitude=43.0&longitude=-89.0&planting_date=2024-09-15&API_KEY=xxx&TENANT_ID=yyy&ORG_ID=zzz" -``` - -Response: GeoJSON FeatureCollection with hourly and daily weather data plus risk scores. - ---- - -#### Disease Risk & Biomass by WiscoNet Stations - -```http -GET /v2/ag_models_wrappers/wisconet_g -``` - -Query parameters: -- `forecasting_date` (required): Reference date (YYYY-MM-DD) -- `risk_days` (optional): Days to compute rolling risk (default: 1) -- `station_id` (optional): Filter to single station (e.g., "ALTN") -- `planting_date` (optional): For winter rye biomass (YYYY-MM-DD) -- `termination_date` (optional): For crop termination biomass (YYYY-MM-DD) -- `disease` (optional): Filter to specific disease model - -Example: -```bash -curl "http://localhost:8000/v2/ag_models_wrappers/wisconet_g?forecasting_date=2025-05-15&station_id=ALTN&planting_date=2024-09-15" -``` - -Response: GeoJSON FeatureCollection grouped by station with time-series risk data. - ---- - -#### Model Metadata - -```http -GET /v2/ag_models_wrappers/models -``` - -Returns list of all available disease models with descriptions, crops, risk categories, and input requirements. - ---- - -### Legacy V1 Endpoints - -The API maintains backward compatibility with v1 endpoints (mounted at `/v1`), including: -- `/v1/sites` - Station listing -- `/v1/predictions` - Disease predictions -- `/v1/models` - Model metadata - ---- - -## Core Features - -### 1. Multi-Source Weather Integration - -The API combines weather data from multiple sources with intelligent fallback: - -``` -┌──────────────────────────────────────────────────┐ -│ Weather Data Request (lat/lng, date range) │ -└────────────────┬─────────────────────────────────┘ - │ - ┌───────────┴──────────────┐ - │ │ - ▼ ▼ -┌─────────────────┐ ┌──────────────────┐ -│ IBM EIS API │ │ WiscoNet Network │ -│ (Premium, │ │ (Public, │ -│ high res) │ │ station-based) │ -└────────┬────────┘ └────────┬─────────┘ - │ │ - └────────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ Data Harmonization │ - │ • Timezone aware │ - │ • Unit conversion │ - │ • Interpolation │ - └──────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ Growing Degree Days │ - │ • Sine method │ - │ • Base: 0°C, Cap: 35°C│ - └──────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ Rolling Averages │ - │ • 7, 14, 21, 30-day │ - └──────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ Risk Model Input │ - │ (Ready for scoring) │ - └──────────────────────┘ -``` - -### 2. Efficient Data Caching - -Reduces redundant API calls through tiered caching: - -```python -# Cache layers (in api/utils/caching.py) -- Station metadata: 7-day TTL -- Measurements: 6-hour TTL -- IBM responses: Variable TTL based on forecast date -- File system: JSON cache in api_cache/ directory -``` - -### 3. Async Pipeline Processing - -Multi-station workflows use async processing for performance: - -```python -# pipeline.py -async def _run_pipeline(...): - # 1. Load all active stations (filtered) - stations = load_stations_sync(...) - - # 2. Fetch all measurements concurrently - measurements = await fetch_all_measurements_async(stations) - - # 3. Merge metadata (station location, timezone, etc.) - merged = merge_station_metadata(measurements, stations) - - # 4. Compute winter rye biomass (if planting_date provided) - if planting_date: - biomass = _compute_winter_rye_biomass(merged, planting_date) - merged = merge_biomass(merged, biomass) - - # 5. Optionally fetch WiscoNet-specific biomass data - if both planting_date and termination_date: - wisconet_biomass = await fetch_wisconet_biomass(...) - merged = merge_wisconet_biomass(merged, wisconet_biomass) - - # 6. Compute disease risks in parallel - risk_df = compute_risks_in_parallel( - merged, num_workers=4 - ) - - return risk_df -``` - -### 4. Intelligent Date & Timezone Handling - -- Automatic timezone conversion to station local time -- Date arithmetic aware of DST transitions -- Support for both absolute dates and relative forecasts - ---- - -## Disease Models - -### Tarspot Risk (Corn) - -**Crop:** Corn -**Disease:** *Phyllachora maydis* (Tar Spot fungus) - -**Model Type:** Ensemble logistic regression (two sub-models averaged) - -**Inputs:** -- 30-day mean air temperature (°C) -- 30-day max relative humidity (%) -- 14-day mean nighttime hours with RH ≥ 90% - -**Output:** Risk probability (0–1), classified as: -- **Inactive** (mean temp < 10°C) -- **1.Low** (prob < 0.20) -- **2.Moderate** (prob 0.20–0.35) -- **3.High** (prob > 0.35) - -**Reference:** Damon et al. - ---- - -### Gray Leaf Spot Risk (Corn) - -**Crop:** Corn -**Disease:** *Cercospora zeae-maydis* (Gray Leaf Spot) - -**Model Type:** Single logistic regression - -**Inputs:** -- 21-day min air temperature (°C) -- 30-day min dew point (°C) - -**Assumptions:** Growth stage V10–R3, no irrigation - -**Output:** Risk probability (0–1), same classification as Tarspot - ---- - -### Frogeye Leaf Spot Risk (Soybean) - -**Crop:** Soybean -**Disease:** *Cercospora sojina* (Frogeye Leaf Spot) - -**Model Type:** Logistic regression - -**Inputs:** -- Degree-days above 14°C (cumulative from emergence) -- Rainfall in previous 14 days (mm) -- Hours with RH ≥ 85% (14-day rolling) - -**Output:** Risk probability (0–1) - ---- - -### White Mold Risk (Soybean) - -**Crop:** Soybean -**Disease:** *Sclerotinia sclerotiorum* (White Mold / Sclerotinia) - -**Model Type:** Dual variant (irrigated & non-irrigated) - -**Inputs:** -- Days since planting -- Cumulative precipitation (mm) -- Soil moisture availability - -**Variants:** -- **Dry:** Non-irrigated fields -- **Irrigated 15":** 15-inch row spacing -- **Irrigated 30":** 30-inch row spacing - -**Output:** Apothecial presence probability (0–1) - ---- - -### Winter Rye Biomass (NEW) - -**Crop:** Winter Rye -**Metric:** Aboveground dry biomass (lb/acre) - -**Model Type:** Logistic growth model - -**Formula:** - -$$\text{logit} = b_0 + b_{pd} \cdot \text{plant\_doy} + b_{pf} \cdot \text{precip\_fall}$$ - -$$\text{pred} = \frac{\text{logit}}{1 + e^{-k(\text{gdd\_total}-x_0)}}$$ - -$$\text{biomass} = \max(0, \text{pred}^2)$$ - -**Coefficients:** -- $b_0 = 423.1$ (intercept) -- $b_{pd} = -1.031$ (day-of-year effect) -- $b_{pf} = -0.2878$ (fall precipitation effect) -- $k = 0.003663$ (logistic rate) -- $x_0 = 1049.0$ (inflection point GDD) - -**Inputs:** -- Planting day-of-year (1–366) -- Precipitation during fall establishment (mm) -- Cumulative GDD from planting to current date (0°C base) - -**Output:** -- **Biomass** (lb/acre): Numeric prediction -- **Biomass Color:** - - **Gray**: 0–2000 lb/acre (low coverage) - - **Yellow**: 2000–4500 lb/acre (moderate) - - **Green**: >4500 lb/acre (high/dense) -- **Biomass Message**: Human-readable interpretation - -**Use Cases:** -- Cover crop management planning -- Soil health assessment -- Erosion mitigation evaluation -- Residue management decisions - ---- - -## Biomass Models - -### Winter Rye Biomass Calculation Pipeline - -```python -def _annotate_winter_rye_biomass( - rye_daily: pd.DataFrame, - planting_date: str -) -> pd.DataFrame: - """ - Compute winter rye biomass from daily weather data. - - Steps: - 1. Parse planting_date → day-of-year - 2. Filter to dates >= planting_date - 3. Compute daily GDD (sine method, 0°C base, 35°C cap) - 4. Accumulate GDD and precipitation - 5. Call calculate_winter_rye_biomass() for each row - 6. Merge results back into DataFrame - """ - - # Step 1: Parse planting date - plant_date_obj = datetime.fromisoformat(planting_date).date() - plant_doy = plant_date_obj.timetuple().tm_yday - - # Step 2: Filter to >= planting date - rye_daily = rye_daily[rye_daily['date'] >= planting_date].copy() - - # Step 3-4: GDD accumulation - rye_daily['plant_doy'] = plant_doy - rye_daily['precip_daily'] = rye_daily['precip1Hour_sum'].fillna(0) - rye_daily['gdd_0c'] = rye_daily.apply( - lambda row: gdd_sine(row['temperature_min'], row['temperature_max']), - axis=1 - ) - rye_daily['gdd_total'] = rye_daily['gdd_0c'].cumsum() - - # Compute fall precipitation (Sep 1 to planting) - fall_start = plant_date_obj.replace(month=9, day=1) - fall_precip = rye_daily[ - (rye_daily['date'] >= str(fall_start)) & - (rye_daily['date'] < planting_date) - ]['precip_daily'].sum() - - # Step 5: Model calculation - biomass_results = rye_daily.apply( - lambda row: calculate_winter_rye_biomass( - plant_doy=row['plant_doy'], - precip_fall=fall_precip, - gdd_total=row['gdd_total'] - ), - axis=1, - result_type='expand' - ) - - # Step 6: Merge results - for col in ['biomass_lb_acre', 'biomass_color', 'biomass_message']: - rye_daily[col] = biomass_results[col] - - return rye_daily -``` - ---- - -## Weather Data Sources - -### IBM Environmental Intelligence Suite (EIS) - -**Characteristics:** -- Premium, high-resolution service -- Hourly data with 999-hour request window per call -- Requires JWT authentication -- Covers entire globe -- 15-minute resolution available - -**Data Acquisition:** -1. Obtain JWT token via SaaSCore authentication -2. Request hourly-on-demand (HOD) data in time chunks -3. Convert to timezone-aware UTC timestamps -4. Interpolate/aggregate to daily summaries - -**Cached Columns:** -- `temperature_min`, `temperature_max`, `temperature_mean` -- `temperatureDewPoint_min`, `temperatureDewPoint_max` -- `relativeHumidity_min`, `relativeHumidity_max` -- `windSpeed_max`, `windSpeed_mean` -- `precip1Hour_sum` (hourly accumulated) -- Rolling averages: 7, 14, 21, 30-day - ---- - -### WiscoNet (Public Mesonet) - -**Characteristics:** -- Wisconsin statewide mesonet network -- ~100 active weather stations -- Public API, no authentication required -- Daily data update cycle -- Station metadata includes: ID, name, lat/lng, county, region - -**Measurement Types:** -- Air temperature (min, avg, max) -- Dew point (min, avg, max) -- Relative humidity (%) -- Wind speed (max, direction) -- Precipitation (daily total) -- Soil temperature (select stations) -- Leaf wetness (select stations) - -**Data Retrieval:** -- Station list via `/wisconet_active_stations` -- Daily measurements via bulk query endpoint -- Cached in `station_measurements_cache/` (6-hour TTL) - ---- - -## Response Format - -### GeoJSON Feature Collection - -All responses follow the GeoJSON standard with extended properties: - -```json -{ - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [-89.4, 43.1] - }, - "properties": { - "date": "2025-05-15", - "forecasting_date": "2025-05-15", - "station_id": "ALTN", - "station_name": "Alten", - "city": "Alten", - "county": "Columbia", - "region": "South Central", - "state": "WI", - "latitude": 43.1234, - "longitude": -89.4567, - "station_timezone": "America/Chicago", - - "temperature_min_c": 8.3, - "temperature_max_c": 21.5, - "temperature_mean_c": 15.2, - "relativeHumidity_max": 92, - "precip1Hour_sum": 2.5, - - "tarspot_risk": 0.45, - "tarspot_risk_class": "2.Moderate", - "gls_risk": 0.28, - "gls_risk_class": "1.Low", - "frogeye_risk": 0.12, - "frogeye_risk_class": "1.Low", - "whitemold_dry_risk": 0.35, - "whitemold_dry_risk_class": "2.Moderate", - - "biomass_lb_acre": 3250, - "biomass_color": "Yellow", - "biomass_message": "Moderate coverage" - } - } - ] -} -``` - -### Time-Series Grouping (WiscoNet) - -For multi-day forecasts, results are grouped by station with embedded time-series: - -```json -{ - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "geometry": { "type": "Point", "coordinates": [-89.4, 43.1] }, - "properties": { - "station_id": "ALTN", - "station_name": "Alten", - "city": "Alten", - "county": "Columbia", - "region": "South Central", - "state": "WI", - "time_series": [ - { - "date": "2025-05-15", - "temperature_min_c": 8.3, - "tarspot_risk": 0.45, - ... - }, - { - "date": "2025-05-16", - "temperature_min_c": 7.8, - "tarspot_risk": 0.38, - ... - } - ] - } - } - ] -} -``` - ---- - -## Data Flow - -### Complete Request → Response Journey - -``` -User Request - │ - ▼ -┌──────────────────────────────┐ -│ Route Handler (app.py) │ -│ Validate query parameters │ -│ Extract coordinates/dates │ -└────────────────┬─────────────┘ - │ - ┌────────────┴────────────┐ - │ │ - ▼ ▼ -┌─────────────────┐ ┌───────────────┐ -│ IBM Service │ │ WiscoNet │ -│ │ │ Pipeline │ -│ 1. Authenticate │ │ │ -│ with IBM │ │ 1. Load │ -│ 2. Chunk time │ │ stations │ -│ range │ │ 2. Fetch │ -│ 3. Fetch hourly │ │ measurements -│ data │ │ 3. Merge │ -│ 4. Build daily │ │ metadata │ -│ summaries │ │ 4. Cache │ -│ │ │ results │ -└────────┬────────┘ └────────┬──────┘ - │ │ - └──────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ Math Helpers │ - │ • Convert units │ - │ • GDD calculation │ - │ • Rolling averages │ - │ • Biomass prep │ - └──────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ Risk Model Scoring │ - │ Apply all diseases │ - │ Compute probabilities│ - │ Classify risk class │ - └──────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ Biomass Calculation │ - │ (if planting_date) │ - │ Logistic model │ - │ Color classification │ - └──────────┬───────────┘ - │ - ▼ - ┌──────────────────────┐ - │ GeoJSON Adapter │ - │ • Format geometry │ - │ • Embed properties │ - │ • Group by station │ - └──────────┬───────────┘ - │ - ▼ - Response (GeoJSON) -``` - ---- - -## Development Setup - -### Prerequisites - -- Python 3.10+ -- pip or conda -- Git -- Docker (optional, for containerized development) - -### Local Installation - -```bash -# Clone repository -git clone https://github.com/UW-Madison-DSI/ag_forecasting_api.git -cd ag_forecasting_api - -# Create virtual environment -python -m venv .venv -source .venv/bin/activate # On Windows: .venv\Scripts\activate - -# Install dependencies -pip install -r requirements.txt - -# Set environment variables -export IBM_API_KEY="your_key" -export TENANT_ID="your_tenant" -export ORG_ID="your_org" - -# Run development server -uvicorn app:app --reload --host 0.0.0.0 --port 8000 -``` - -### API Documentation - -Once running, view interactive documentation: -- **Swagger UI:** http://localhost:8000/docs -- **ReDoc:** http://localhost:8000/redoc -- **OpenAPI JSON:** http://localhost:8000/openapi.json - -### Testing - -```bash -# Syntax validation -python -m py_compile api/models/risk_models.py api/services/*.py - -# Run linting (if installed) -pylint api/ - -# Test endpoint with curl -curl "http://localhost:8000/v2/test/rye_biomass" -``` - ---- - -## Deployment - -### Docker Deployment - -```dockerfile -FROM python:3.11-slim -WORKDIR /app -COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt -COPY . . -EXPOSE 8000 -CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"] -``` - -### Docker Compose (Production) - -```yaml -version: "3.9" -services: - ag_forecasting_api: - build: . - expose: - - 8000 - environment: - - PYTHONPATH=/app - - ENVIRONMENT=production - - IBM_API_KEY=${IBM_API_KEY} - - TENANT_ID=${TENANT_ID} - - ORG_ID=${ORG_ID} - networks: - - traefik - labels: - - "traefik.enable=true" - - "traefik.http.routers.ag_api.rule=Host(`your-domain.com`)" - - "traefik.http.services.ag_api.loadbalancer.server.port=8000" - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8000/"] - interval: 30s - timeout: 10s - retries: 3 -``` - -### Environment Variables - -Required for production: -- `IBM_API_KEY`: IBM EIS authentication credential -- `TENANT_ID`: IBM EIS tenant identifier -- `ORG_ID`: IBM EIS organization identifier -- `ENVIRONMENT`: Set to "production" for optimized logging - -Optional: -- `PYTHONPATH`: Should include `/app` for imports -- `LOG_LEVEL`: Logging verbosity (default: INFO) - ---- - -## Performance Considerations - -### Caching Strategy - -- **Station Metadata**: 7-day TTL (rarely changes) -- **Measurements**: 6-hour TTL (updated daily by WiscoNet) -- **IBM Responses**: Variable (tied to forecast date relevance) -- **File System**: JSON cache in `api_cache/` for persistence - -### Concurrency - -- **Async Pipeline**: Multi-station queries use async/await for I/O efficiency -- **Parallel Risk Scoring**: Disease calculations use multiprocessing (4 workers default) -- **Connection Pooling**: HTTP clients maintain connection pools (max 50 concurrent) - -### Optimization Tips - -1. **Batch Requests**: Query multiple stations in one call rather than sequential individual queries -2. **Use WiscoNet**: Public API has lower latency than premium IBM service -3. **Limit Date Range**: Smaller date ranges reduce computation time -4. **Filter Diseases**: Specify disease models needed to reduce calculation overhead -5. **Cache Warming**: Pre-fetch station lists during off-peak hours - ---- - -## Additional Resources - -- **GitHub Repository**: https://github.com/UW-Madison-DSI/ag_forecasting_api -- **Interactive Dashboard**: https://connect.doit.wisc.edu/ag_forecasting/ -- **Example Notebook**: `/materials/example_callapi.ipynb` -- **University Contact**: UW-Madison Data Science Institute - ---- - -## License - -See LICENSE file for details. - ---- - -## Changelog - -### Version 2.0 (Current) - -- ✅ Winter rye biomass model integration -- ✅ Unified API versioning (v1 legacy, v2 current) -- ✅ Enhanced GeoJSON responses -- ✅ Improved async pipeline performance -- ✅ Extended documentation - -### Version 1.0 (Legacy) - -- Disease risk models for corn and soybean -- WiscoNet and IBM EIS integration -- Basic GeoJSON support - ---- - -**Last Updated:** May 2025 -**Maintained By:** UW-Madison Data Science Institute diff --git a/_build/html/_sources/blog/index.md b/_build/html/_sources/blog/index.md index ebc9baf..d30a5f0 100644 --- a/_build/html/_sources/blog/index.md +++ b/_build/html/_sources/blog/index.md @@ -1,11 +1,10 @@ # OpenLambda Blog - News, releases, and technical deep-dives from the OpenLambda project. +News, releases, and technical deep-dives from the OpenLambda project. ```{postlist} 10 - :format: "{title} — {author}, {date}" - :date: "%B %d, %Y" - :list-style: circle - :excerpts: - :sort: -``` \ No newline at end of file +:format: "{title} — {author}, {date}" +:date: "%B %d, %Y" +:list-style: circle +:excerpts: +``` diff --git a/_build/html/_sources/blog/post/2026-05-18-ag-forecasting-case-study.md b/_build/html/_sources/blog/post/2026-05-18-ag-forecasting-case-study.md index 3bdc1fd..fb36833 100644 --- a/_build/html/_sources/blog/post/2026-05-18-ag-forecasting-case-study.md +++ b/_build/html/_sources/blog/post/2026-05-18-ag-forecasting-case-study.md @@ -1,7 +1,7 @@ --- blogpost: true date: 2026-05-18 -author: Maria Oros, Tyler Caraza-Harter +author: maria-oros, tyler-caraza-harter category: Case Studies tags: case-study, agforecast, asgi, fastapi, openlambda language: en @@ -16,4 +16,126 @@ Our goal is to make an ever-growing set of applications deployable on OpenLambda Recently, we selected an agricultural forecasting application (AgForecast), developed by the [Data Science Institute at UW–Madison](https://dsi.wisc.edu/), to port to OpenLambda: . AgForecast is an interesting case study, because it implements its REST API using FastAPI, which in turn uses [ASGI](https://asgi.readthedocs.io/en/latest/), the so-called "spiritual successor" to WSGI, which we recently started supporting in OpenLambda. WSGI is the basis for popular Python web-programming packages such as Django and Flask; new ASGI support opens the door to an even broader range of applications. -In this post, we describe the challenges of porting AgForecast to OL, and four new features we added to OL to make deployment of similar applications in the future simpler. The features are built-in ASGI support, direct GitHub-to-OL deployments, OL function environment variables, and OL-based pip compilation. \ No newline at end of file +In this post, we describe the challenges of porting AgForecast to OL, and four new features we added to OL to make deployment of similar applications in the future simpler. The features are built-in ASGI support, direct GitHub-to-OL deployments, OL function environment variables, and OL-based pip compilation. + +## Background: Agricultural Forecasting API + +**Motivation.** The agricultural forecasting app is an open-source tool designed to address farmers' needs in a customizable way. We first built a backend infrastructure using FastAPI to serve crop disease forecasting models for corn and soybean, focusing on integration with Wisconet weather stations and on-demand model serving. We then developed a custom R Shiny front-end interface for farmer use. + +**Fit with OpenLambda.** We began exploring OpenLambda to leverage the benefits of serverless technology. Hosting our tool on this platform offers significant value not only to the developer community, but also to plant pathology practitioners and scientists who want to build on robust, nationwide infrastructure. + +**Technical overview.** The Ag Forecasting API is a FastAPI-based backend that serves crop disease forecasting models for corn and soybean across Wisconsin. It exposes two parallel data pipelines through a unified interface: one sourced from Wisconet, the public mesonet of weather stations across the state, and another from IBM Environmental Intelligence for point-location queries by latitude and longitude. The core logic lives in the `ag_models_wrappers` module, which dynamically pulls the daily and hourly weather variables each disease model requires for a given forecasting date, runs the risk calculations, and returns localized predictions. Currently supported models include Sporecaster (white mold in soybean, with dry and irrigated row-spacing variants), Tarspotter (tar spot of corn), gray leaf spot, and frogeye leaf spot — all based on peer-reviewed plant pathology research from UW–Madison. + +**Infrastructure and integration.** The project ships with a `Dockerfile` and `docker-compose.yml` for containerized deployment, and includes a Starlette `WSGIMiddleware` wrapper so the FastAPI app can also be served behind WSGI servers for legacy or mixed environments. A companion sub-package, `pywisconet`, provides a thin REST wrapper over the Wisconet v1 API with endpoints for active station discovery (`/wisconet/active_stations/`), station field metadata (`/station_fields/{station_id}`), and bulk measurement retrieval (`/bulk_measures/{station_id}`) at configurable frequencies (5-minute, hourly, or daily) for variables like air temperature, dew point, wind speed, and relative humidity. IBM credentials are handled via environment variables (`IBM_API_KEY`, `TENANT_ID`, `ORG_ID`) and validated against query parameters at request time. The API is MIT-licensed, fully open source, and currently deployed at [connect.doit.wisc.edu/ag_forecasting_api](https://connect.doit.wisc.edu/ag_forecasting_api). + +## Porting to OpenLambda + +When porting AgForecast to OL, we encountered 5 challenges related to: expectations about writable directories, package version selection, deployment from GitHub, asynchronous execution, and parallel pool execution. To overcome these challenges, we introduced four new features to OL and made minor changes to AgForecast itself. + +### Challenge 1: File Management + +AgForecast is semi-stateless: data files describing stations and measurements are used across requests, but if these files are deleted, it can generate them on-the-fly from upstream data sources, such as the IBM Weather API or Wisconet. This is a good match for FaaS platforms such as OL, where lambda instances frequently persist (along with their state) across multiple invocations, even if an instance can silently be terminated at any time to reclaim memory. + +However, most directory locations are read-only for an OL function; the one exception is a single "scratch directory" and various other locations that are symbolic links to the scratch directory (such as `/tmp`). Full-featured sandboxes such as Docker containers use union file systems to make many directories editable, on a copy-on-write basis. OL's limitation is due to its use of bind mounts, a leaner, but less flexible mechanism. AgForecast wasn't originally built for OL, so we modified the code to make the directory location for station and measurement data configurable via environment variables (otherwise AgForecast attempted to write to read-only locations). We added support to OL function configuration files to support the specification of environment variables, like this: + +```yaml +triggers: + http: + - method: "*" +environment: + MEASUREMENTS_CACHE_DIR: /host/tmp/cache + STATIONS_CACHE_FILE: /host/tmp/cache/wisconsin_stations_cache.csv + ... +``` + +### Challenge 2: Package Management + +Like many Python projects, AgForecast specifies PyPI package requirements in a `requirements.txt` file. Also like most projects, not all version requirements are exact. Here are 3 of the 21 lines in AgForecast's `requirements.txt`: + +``` +... +matplotlib==3.9.1 +fastapi>=0.95.0 +pydantic +... +``` + +Note the different levels of specificity: `matplotlib` must be a specific version, whereas pip can select any version for `pydantic` (probably the latest, barring version conflicts based on other dependencies); `fastapi` specifies a range. Note that some of these might also have indirect dependencies on other packages not explicitly listed. + +OL requires exact versions for all packages, direct or indirect. For this purpose, we recommend the use of [`pip-compile`](https://pypi.org/project/pip-tools/) to translate a partially specified `requirements.txt` file to a fully specified one, based on the latest packages at the time of compilation. + +One challenge is that pip and pip-compile sometimes select packages based on the host environment. For example, in certain cases, the suitable Python package version for Ubuntu 24.04 might be different than for Ubuntu 26.04. Initially, we encountered this when deploying AgForecast on OL. The `requirements.txt` created by doing pip-compile on the host machine was not quite compatible with the environment inside the lambda function. To address this, we created a new OL function that does pip-compile inside the OL environment. It works like this: + +```bash +curl -X POST -d '' http://localhost:5000/run/pip-compile/url > requirements.txt +``` + +### Challenge 3: Deployment + +AgForecast lives on a public GitHub repo: . We wanted to make it as easy as possible to deploy directly from GitHub to an OL function. Thus, we added a new `ol admin install` option to point directly to a repo: + +```bash +./ol admin install -c ol.yaml -r requirements.txt https://github.com//.git +``` + +### Challenge 4: Asynchronous Execution + +AgForecast is built on FastAPI, which in turn is based on ASGI. ASGI is an asynchronous alternative to WSGI (Web Server Gateway Interface). The idea of WSGI is to let you mix and match servers (for example, Gunicorn, uWSGI) with application frameworks (for example, Flask, Django). The server/framework interface is minimalist, a single function signature that the server calls for each incoming HTTP request (GET/POST/etc). The framework implements the function; a common framework pattern is to route the call to a user-written handler function. For example, consider these two functions: + +```python +app = Flask(__name__) + +@app.route("/") +def home(): + return "Home page" + +@app.route("/about") +def about(): + return "About page" +``` + +The `app` object is a Python callable (meaning it is an object that acts like a function); `app` implements the WSGI interface. So when a server sends a request to `app`, `app` in turn calls the correct user function (`home` or `about`) to execute and obtain a result. + +ASGI was introduced as an alternative to WSGI to provide more options for handling concurrent calls. Consider how (in the above Flask/WSGI example) two different users may want to visit the home and about pages at the same time. Can we handle the requests concurrently? + +There are a few ways to do this: multiple processes, multiple threads in a process, or [Python's async functionality introduced in Python 3.5 (2015)](https://peps.python.org/pep-0492/). If we want all execution in a single process (useful when there is shared state), we can either use threading (with WSGI) or async (with ASGI). + +Threads are a non-cooperative form of scheduling, meaning that a scheduler can switch from running one thread on a CPU to another thread at any time (perhaps a very inconvenient time!). Writing multi-threaded programs is notoriously difficult, as one must identify shared state, introduce locks to protect that state, and acquire/release locks at the right points. In contrast, async offers a form of cooperative scheduling, where switches can only occur at well-defined points (e.g., an `await`). Thus, programming is simpler (no need for locks). + +Normally, concurrent programs allow (a) parallel execution on multiple CPU cores at the same time and (b) execution of code at the same time that input/output occurs, say to the disk or network. In many languages, threads offer both benefits and cooperative scheduling only provides the I/O benefit. However, Python threads only offer the I/O benefit due to the GIL (Global Interpreter Lock), [though this may be changing](https://docs.python.org/3/howto/free-threading-python.html). Thus, async is especially appealing in Python since it (in theory) matches threading in terms of performance benefits, and surpasses threads in terms of ease-of-programming. + +AgForecast implements REST calls in FastAPI, which is based on ASGI, which is the async-based alternative to WSGI. To support AgForecast, we implemented ASGI server functionality in OpenLambda. This makes OpenLambda an ASGI server implementation (in the same role as Uvicorn, Gunicorn, Daphne, etc). When a request arrives, OpenLambda uses `asyncio.run(...)` to invoke the user-provided entry point, with async send/receive callbacks. The user-provided entry-point can then be a full application, written in any ASGI-compatible framework (FastAPI, Starlette, Django/Channels, etc). + +A user can indicate their lambda function is an ASGI application entry point by configuring their `ol.yaml` as follows: + +```yaml +environment: + OL_ENTRY_FILE: app.py + OL_ASGI_ENTRY: app +``` + +### Challenge 5: Worker Pools + +AgForecast indirectly uses `/dev/shm`, an in-memory file system called tmpfs. Docker containers have a `/dev/shm` mount by default; as it is frequently used for inter-process communication, its behavior is configurable via the `--ipc` flag. In contrast, OL functions do not have any `/dev/shm` mount. + +Why does AgForecast need `/dev/shm`? AgForecast uses a `concurrent.futures.ProcessPoolExecutor` to run a Python compute-heavy function called `compute_risks` in parallel over different chunks of data. `ProcessPoolExecutor` creates different Python processes for different chunks of work, which is desirable as a way to get around Python's per-process GIL (Global Interpreter Lock), which is held whenever regular Python code is being executed. With multiple processes (created by the pool), each process will have its own GIL that it holds during execution; thus, multiple processes can hold their own locks at the same time and execute on multiple CPU cores in parallel. + +As a fix to get AgForecast working as an OL function, we replaced `ProcessPoolExecutor` with a `ThreadPoolExecutor`; this avoids inter-process communication via `/dev/shm` because coordination occurs within a process, between threads. Unfortunately, all the threads share a GIL, so the performance benefits of using a pool for parallelism is lost in this case (the only value would be if `compute_risks` were I/O heavy, which it is not). + +Using a `ThreadPoolExecutor` works as a short term fix, but this experience suggests that eventually adding `/dev/shm` availability (and thus `ProcessPoolExecutor` functionality) would be a useful future feature for OL. + +## Recap of New Features + +Porting real, complex applications to serverless platforms highlights the most important features to develop. In this post, we described 5 challenges we encountered when porting AgForecast to OL, and the following features we added to better support similar applications: + +- environment variable configuration for lambda functions (challenge 1) +- pip-compile as a lambda function (challenge 2) +- direct GitHub deployment (challenge 3) +- ASGI support (challenge 4) + +We also made some minor changes to AgForecast: + +- customizable directory use for stations/measurements (challenge 1) +- use of a thread pool instead of a process pool (challenge 5) + +The second change suggests a future possible OL feature: adding `/dev/shm` availability to support process pools. \ No newline at end of file diff --git a/_build/html/_sources/worker.md b/_build/html/_sources/worker.md index ff4f29e..ff2d221 100644 --- a/_build/html/_sources/worker.md +++ b/_build/html/_sources/worker.md @@ -58,5 +58,5 @@ multi-node setups. ## Further Reading -- [Quickstart guide](doc.htm) — get a single worker running locally in minutes +- [Quickstart guide](https://github.com/open-lambda/open-lambda/blob/main/docs/quickstart.md) — get a single worker running locally in minutes - [SOCK: Rapid Task Provisioning with Serverless-Optimized Containers](https://www.usenix.org/conference/atc18/presentation/oakes) — the research paper describing the container backend. \ No newline at end of file diff --git a/_build/html/ag-forecasting-api.html b/_build/html/ag-forecasting-api.html deleted file mode 100644 index 1f0b844..0000000 --- a/_build/html/ag-forecasting-api.html +++ /dev/null @@ -1,1627 +0,0 @@ - - - - - - - - - - - Agricultural Forecasting API - Technical Documentation — OpenLambda - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                                  - - - - - - - - - - -
                                  -
                                  -
                                  -
                                  -
                                  - -
                                  - -
                                  - - - - - -
                                  -
                                  - - - -
                                  - - - - - - - - - - - - - -
                                  - -
                                  - - - -
                                  - -
                                  -
                                  - -
                                  -
                                  - -
                                  - -
                                  - -
                                  - - -
                                  - -
                                  - -
                                  - - - - - - - - - - - - - - - - - - - -
                                  - -
                                  - -
                                  -
                                  - - - - - - - - -
                                  - -
                                  -

                                  Agricultural Forecasting API - Technical Documentation#

                                  -

                                  A FastAPI-based service for crop disease forecasting and biomass prediction using weather data integration from multiple sources. Developed by the University of Wisconsin-Madison Data Science Institute.

                                  -
                                  -
                                  -

                                  Table of Contents#

                                  -
                                    -
                                  1. Overview

                                  2. -
                                  3. Architecture

                                  4. -
                                  5. Technology Stack

                                  6. -
                                  7. API Endpoints

                                  8. -
                                  9. Core Features

                                  10. -
                                  11. Data Flow

                                  12. -
                                  13. Disease Models

                                  14. -
                                  15. Biomass Models

                                  16. -
                                  17. Weather Data Sources

                                  18. -
                                  19. Response Format

                                  20. -
                                  21. Development Setup

                                  22. -
                                  23. Deployment

                                  24. -
                                  -
                                  -
                                  -
                                  -

                                  Overview#

                                  -

                                  The Agricultural Forecasting API provides real-time crop disease risk predictions and winter rye biomass estimates for Wisconsin agricultural locations. The system integrates historical weather data with scientifically-validated disease forecasting models to help farmers and agricultural professionals make informed management decisions.

                                  -

                                  Key Capabilities:

                                  -
                                    -
                                  • Real-time disease risk predictions for corn and soybean

                                  • -
                                  • Winter rye biomass accumulation forecasts

                                  • -
                                  • Multi-source weather data integration (IBM EIS, WiscoNet, NOAA)

                                  • -
                                  • Geospatial queries by coordinates or weather station ID

                                  • -
                                  • Batch processing for multi-station analysis

                                  • -
                                  • GeoJSON-formatted responses for mapping integration

                                  • -
                                  -
                                  -
                                  -
                                  -

                                  Architecture#

                                  -
                                  -

                                  High-Level Design#

                                  -
                                  ┌─────────────────────────────────────────────────────────────┐
                                  -│                     FastAPI Application                      │
                                  -├─────────────────────────────────────────────────────────────┤
                                  -│                                                               │
                                  -│  ┌─────────────────┐  ┌──────────────────┐  ┌─────────────┐ │
                                  -│  │   /v2/ibm       │  │  /v2/wisconet_g  │  │  /v2/models │ │
                                  -│  │  (Coordinates)  │  │  (Station-based) │  │  (Metadata) │ │
                                  -│  └────────┬────────┘  └────────┬─────────┘  └─────────────┘ │
                                  -│           │                    │                             │
                                  -├───────────┼────────────────────┼─────────────────────────────┤
                                  -│           │                    │                             │
                                  -│  ┌────────▼────────────┐  ┌───▼──────────────────┐           │
                                  -│  │  IBM Service        │  │  Pipeline / WiscoNet │           │
                                  -│  │  (ibm_service.py)   │  │  (pipeline.py)       │           │
                                  -│  │                     │  │                      │           │
                                  -│  │ • Authenticate      │  │ • Load stations      │           │
                                  -│  │ • Fetch raw data    │  │ • Fetch measurements │           │
                                  -│  │ • Build hourly      │  │ • Compute biomass    │           │
                                  -│  │ • Build daily       │  │ • Annotate risks     │           │
                                  -│  │ • Compute rolling   │  │                      │           │
                                  -│  │   averages          │  │                      │           │
                                  -│  └────────┬────────────┘  └───┬──────────────────┘           │
                                  -│           │                   │                              │
                                  -├───────────┼───────────────────┼──────────────────────────────┤
                                  -│           │                   │                              │
                                  -│  ┌────────▼─────────────────────┴──────┐                     │
                                  -│  │     Risk Models & Biomass Calc       │                    │
                                  -│  │     (api/models/risk_models.py)      │                    │
                                  -│  │                                      │                    │
                                  -│  │ • Tarspot risk (corn)                │                    │
                                  -│  │ • Gray Leaf Spot (corn)              │                    │
                                  -│  │ • Frogeye Leaf Spot (soybean)        │                    │
                                  -│  │ • White Mold (soybean)               │                    │
                                  -│  │ • Winter Rye Biomass (logistic)      │                    │
                                  -│  └────────┬─────────────────────────────┘                    │
                                  -│           │                                                  │
                                  -├───────────┼──────────────────────────────────────────────────┤
                                  -│           │                                                  │
                                  -│  ┌────────▼────────────────────────────┐                     │
                                  -│  │  Output Formatting & Response        │                    │
                                  -│  │  (adapters/geojson_adapter.py)       │                    │
                                  -│  │                                      │                    │
                                  -│  │ • GeoJSON Feature Collections        │                    │
                                  -│  │ • Time-series grouping               │                    │
                                  -│  │ • Station metadata embedding         │                    │
                                  -│  └──────────────────────────────────────┘                    │
                                  -│                                                               │
                                  -└─────────────────────────────────────────────────────────────┘
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Directory Structure#

                                  -
                                  ag_forecasting_api/
                                  -├── app.py                          # Main FastAPI entry point (v2)
                                  -├── app_v1.py                       # Legacy API (deprecated, v1)
                                  -├── requirements.txt                # Python dependencies
                                  -├── Dockerfile                      # Container image definition
                                  -├── docker-compose.yml              # Multi-container orchestration
                                  -│
                                  -├── api/                            # Core business logic
                                  -│   ├── __init__.py
                                  -│   ├── config/
                                  -│   │   └── constants.py            # Configuration, URLs, thresholds
                                  -│   │
                                  -│   ├── models/
                                  -│   │   ├── risk_models.py          # Disease & biomass calculations
                                  -│   │   └── disease_metadata.py     # Model metadata registry
                                  -│   │
                                  -│   ├── services/
                                  -│   │   ├── ibm_service.py          # IBM EIS weather integration
                                  -│   │   ├── wisconet_service.py     # WiscoNet station pipeline
                                  -│   │   └── risk_processor.py       # Risk annotation orchestration
                                  -│   │
                                  -│   ├── routes/
                                  -│   │   ├── wisconet.py             # /v2/ag_models_wrappers/wisconet_g
                                  -│   │   └── models.py               # /v2/ag_models_wrappers/models
                                  -│   │
                                  -│   ├── adapters/
                                  -│   │   └── geojson_adapter.py      # DataFrame → GeoJSON converter
                                  -│   │
                                  -│   ├── schemas/
                                  -│   │   ├── geojson_schema.py       # Response schema definitions
                                  -│   │   └── model_schema.py         # Model metadata schemas
                                  -│   │
                                  -│   ├── utils/
                                  -│   │   ├── math_helpers.py         # GDD, logistic, rolling averages
                                  -│   │   ├── conversions.py          # Unit conversions (F↔C, mph↔m/s)
                                  -│   │   └── caching.py              # Station & measurement caching
                                  -│   │
                                  -│   └── pipeline.py                 # Orchestrates WiscoNet workflow
                                  -│
                                  -├── api_cache/                      # Cached API responses (JSON)
                                  -│   ├── metadata_stations_*.json
                                  -│   └── station_data_*.json
                                  -│
                                  -└── materials/
                                  -    └── example_callapi.ipynb       # Usage examples
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Module Responsibilities#

                                  -
                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

                                  Module

                                  Purpose

                                  Key Functions

                                  ibm_service.py

                                  IBM weather API integration

                                  get_weather_with_risk(), _fetch_raw_hourly(), _build_daily(), _annotate_winter_rye_biomass()

                                  wisconet_service.py

                                  WiscoNet station data pipeline

                                  _compute_winter_rye_biomass(), station loading & filtering

                                  risk_models.py

                                  Disease & biomass calculations

                                  calculate_tarspot_risk(), calculate_winter_rye_biomass(), etc.

                                  pipeline.py

                                  Async WiscoNet orchestration

                                  retrieve(), multi-station batch processing

                                  math_helpers.py

                                  Shared mathematical utilities

                                  gdd_sine(), logistic(), rolling_mean()

                                  geojson_adapter.py

                                  Response formatting

                                  dataframe_to_featurecollection()

                                  -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Technology Stack#

                                  -
                                  -

                                  Core Dependencies#

                                  -
                                  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

                                  Component

                                  Library

                                  Version

                                  Purpose

                                  Web Framework

                                  FastAPI

                                  ^0.100

                                  REST API framework

                                  ASGI Server

                                  Uvicorn

                                  ^0.24

                                  ASGI server

                                  Data Processing

                                  Pandas

                                  ^2.0

                                  Tabular data manipulation

                                  Numeric Computing

                                  NumPy

                                  ^1.24

                                  Numerical calculations

                                  Data Validation

                                  Pydantic

                                  ^2.0

                                  Request/response schema validation

                                  HTTP Client

                                  requests

                                  ^2.31

                                  Synchronous HTTP calls

                                  Async HTTP

                                  aiohttp

                                  ^3.9

                                  Async HTTP requests

                                  Logging

                                  Python logging

                                  stdlib

                                  Structured logging

                                  -
                                  -
                                  -
                                  -

                                  External Services#

                                  -
                                    -
                                  • IBM Environmental Intelligence Suite (EIS): Premium weather API with historical-on-demand (HOD) data

                                  • -
                                  • WiscoNet: Public Wisconsin mesonet weather station network

                                  • -
                                  • NOAA: National weather service data for historical context

                                  • -
                                  -
                                  -
                                  -

                                  Deployment#

                                  -
                                    -
                                  • Container: Docker with Alpine Linux base

                                  • -
                                  • Orchestration: Docker Compose for multi-service deployments

                                  • -
                                  • Reverse Proxy: Traefik for URL routing and TLS termination

                                  • -
                                  • Health Monitoring: Periodic curl-based health checks

                                  • -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  API Endpoints#

                                  -
                                  -

                                  V2 Endpoints (Current)#

                                  -
                                  -

                                  Disease Risk & Biomass by Coordinates (IBM)#

                                  -
                                  GET /v2/ag_models_wrappers/ibm
                                  -
                                  -
                                  -

                                  Query parameters:

                                  -
                                    -
                                  • forecasting_date (required): Reference date (YYYY-MM-DD)

                                  • -
                                  • latitude (required): Decimal degrees

                                  • -
                                  • longitude (required): Decimal degrees

                                  • -
                                  • planting_date (optional): For biomass calculation (YYYY-MM-DD)

                                  • -
                                  • termination_date (optional): For WiscoNet biomass integration (YYYY-MM-DD)

                                  • -
                                  • API_KEY (required): IBM EIS credential

                                  • -
                                  • TENANT_ID (required): IBM EIS credential

                                  • -
                                  • ORG_ID (required): IBM EIS credential

                                  • -
                                  -

                                  Example:

                                  -
                                  curl "http://localhost:8000/v2/ag_models_wrappers/ibm?forecasting_date=2025-05-15&latitude=43.0&longitude=-89.0&planting_date=2024-09-15&API_KEY=xxx&TENANT_ID=yyy&ORG_ID=zzz"
                                  -
                                  -
                                  -

                                  Response: GeoJSON FeatureCollection with hourly and daily weather data plus risk scores.

                                  -
                                  -
                                  -
                                  -

                                  Disease Risk & Biomass by WiscoNet Stations#

                                  -
                                  GET /v2/ag_models_wrappers/wisconet_g
                                  -
                                  -
                                  -

                                  Query parameters:

                                  -
                                    -
                                  • forecasting_date (required): Reference date (YYYY-MM-DD)

                                  • -
                                  • risk_days (optional): Days to compute rolling risk (default: 1)

                                  • -
                                  • station_id (optional): Filter to single station (e.g., “ALTN”)

                                  • -
                                  • planting_date (optional): For winter rye biomass (YYYY-MM-DD)

                                  • -
                                  • termination_date (optional): For crop termination biomass (YYYY-MM-DD)

                                  • -
                                  • disease (optional): Filter to specific disease model

                                  • -
                                  -

                                  Example:

                                  -
                                  curl "http://localhost:8000/v2/ag_models_wrappers/wisconet_g?forecasting_date=2025-05-15&station_id=ALTN&planting_date=2024-09-15"
                                  -
                                  -
                                  -

                                  Response: GeoJSON FeatureCollection grouped by station with time-series risk data.

                                  -
                                  -
                                  -
                                  -

                                  Model Metadata#

                                  -
                                  GET /v2/ag_models_wrappers/models
                                  -
                                  -
                                  -

                                  Returns list of all available disease models with descriptions, crops, risk categories, and input requirements.

                                  -
                                  -
                                  -
                                  -
                                  -

                                  Legacy V1 Endpoints#

                                  -

                                  The API maintains backward compatibility with v1 endpoints (mounted at /v1), including:

                                  -
                                    -
                                  • /v1/sites - Station listing

                                  • -
                                  • /v1/predictions - Disease predictions

                                  • -
                                  • /v1/models - Model metadata

                                  • -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Core Features#

                                  -
                                  -

                                  1. Multi-Source Weather Integration#

                                  -

                                  The API combines weather data from multiple sources with intelligent fallback:

                                  -
                                  ┌──────────────────────────────────────────────────┐
                                  -│ Weather Data Request (lat/lng, date range)       │
                                  -└────────────────┬─────────────────────────────────┘
                                  -                 │
                                  -     ┌───────────┴──────────────┐
                                  -     │                          │
                                  -     ▼                          ▼
                                  -┌─────────────────┐      ┌──────────────────┐
                                  -│ IBM EIS API     │      │ WiscoNet Network │
                                  -│ (Premium,       │      │ (Public,         │
                                  -│ high res)       │      │ station-based)   │
                                  -└────────┬────────┘      └────────┬─────────┘
                                  -         │                        │
                                  -         └────────────┬───────────┘
                                  -                      │
                                  -                      ▼
                                  -            ┌──────────────────────┐
                                  -            │ Data Harmonization   │
                                  -            │ • Timezone aware     │
                                  -            │ • Unit conversion    │
                                  -            │ • Interpolation      │
                                  -            └──────────┬───────────┘
                                  -                       │
                                  -                       ▼
                                  -            ┌──────────────────────┐
                                  -            │ Growing Degree Days  │
                                  -            │ • Sine method        │
                                  -            │ • Base: 0°C, Cap: 35°C│
                                  -            └──────────┬───────────┘
                                  -                       │
                                  -                       ▼
                                  -            ┌──────────────────────┐
                                  -            │ Rolling Averages     │
                                  -            │ • 7, 14, 21, 30-day  │
                                  -            └──────────┬───────────┘
                                  -                       │
                                  -                       ▼
                                  -            ┌──────────────────────┐
                                  -            │ Risk Model Input     │
                                  -            │ (Ready for scoring)  │
                                  -            └──────────────────────┘
                                  -
                                  -
                                  -
                                  -
                                  -

                                  2. Efficient Data Caching#

                                  -

                                  Reduces redundant API calls through tiered caching:

                                  -
                                  # Cache layers (in api/utils/caching.py)
                                  -- Station metadata: 7-day TTL
                                  -- Measurements: 6-hour TTL
                                  -- IBM responses: Variable TTL based on forecast date
                                  -- File system: JSON cache in api_cache/ directory
                                  -
                                  -
                                  -
                                  -
                                  -

                                  3. Async Pipeline Processing#

                                  -

                                  Multi-station workflows use async processing for performance:

                                  -
                                  # pipeline.py
                                  -async def _run_pipeline(...):
                                  -    # 1. Load all active stations (filtered)
                                  -    stations = load_stations_sync(...)
                                  -    
                                  -    # 2. Fetch all measurements concurrently
                                  -    measurements = await fetch_all_measurements_async(stations)
                                  -    
                                  -    # 3. Merge metadata (station location, timezone, etc.)
                                  -    merged = merge_station_metadata(measurements, stations)
                                  -    
                                  -    # 4. Compute winter rye biomass (if planting_date provided)
                                  -    if planting_date:
                                  -        biomass = _compute_winter_rye_biomass(merged, planting_date)
                                  -        merged = merge_biomass(merged, biomass)
                                  -    
                                  -    # 5. Optionally fetch WiscoNet-specific biomass data
                                  -    if both planting_date and termination_date:
                                  -        wisconet_biomass = await fetch_wisconet_biomass(...)
                                  -        merged = merge_wisconet_biomass(merged, wisconet_biomass)
                                  -    
                                  -    # 6. Compute disease risks in parallel
                                  -    risk_df = compute_risks_in_parallel(
                                  -        merged, num_workers=4
                                  -    )
                                  -    
                                  -    return risk_df
                                  -
                                  -
                                  -
                                  -
                                  -

                                  4. Intelligent Date & Timezone Handling#

                                  -
                                    -
                                  • Automatic timezone conversion to station local time

                                  • -
                                  • Date arithmetic aware of DST transitions

                                  • -
                                  • Support for both absolute dates and relative forecasts

                                  • -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Disease Models#

                                  -
                                  -

                                  Tarspot Risk (Corn)#

                                  -

                                  Crop: Corn
                                  -Disease: Phyllachora maydis (Tar Spot fungus)

                                  -

                                  Model Type: Ensemble logistic regression (two sub-models averaged)

                                  -

                                  Inputs:

                                  -
                                    -
                                  • 30-day mean air temperature (°C)

                                  • -
                                  • 30-day max relative humidity (%)

                                  • -
                                  • 14-day mean nighttime hours with RH ≥ 90%

                                  • -
                                  -

                                  Output: Risk probability (0–1), classified as:

                                  -
                                    -
                                  • Inactive (mean temp < 10°C)

                                  • -
                                  • 1.Low (prob < 0.20)

                                  • -
                                  • 2.Moderate (prob 0.20–0.35)

                                  • -
                                  • 3.High (prob > 0.35)

                                  • -
                                  -

                                  Reference: Damon et al.

                                  -
                                  -
                                  -
                                  -

                                  Gray Leaf Spot Risk (Corn)#

                                  -

                                  Crop: Corn
                                  -Disease: Cercospora zeae-maydis (Gray Leaf Spot)

                                  -

                                  Model Type: Single logistic regression

                                  -

                                  Inputs:

                                  -
                                    -
                                  • 21-day min air temperature (°C)

                                  • -
                                  • 30-day min dew point (°C)

                                  • -
                                  -

                                  Assumptions: Growth stage V10–R3, no irrigation

                                  -

                                  Output: Risk probability (0–1), same classification as Tarspot

                                  -
                                  -
                                  -
                                  -

                                  Frogeye Leaf Spot Risk (Soybean)#

                                  -

                                  Crop: Soybean
                                  -Disease: Cercospora sojina (Frogeye Leaf Spot)

                                  -

                                  Model Type: Logistic regression

                                  -

                                  Inputs:

                                  -
                                    -
                                  • Degree-days above 14°C (cumulative from emergence)

                                  • -
                                  • Rainfall in previous 14 days (mm)

                                  • -
                                  • Hours with RH ≥ 85% (14-day rolling)

                                  • -
                                  -

                                  Output: Risk probability (0–1)

                                  -
                                  -
                                  -
                                  -

                                  White Mold Risk (Soybean)#

                                  -

                                  Crop: Soybean
                                  -Disease: Sclerotinia sclerotiorum (White Mold / Sclerotinia)

                                  -

                                  Model Type: Dual variant (irrigated & non-irrigated)

                                  -

                                  Inputs:

                                  -
                                    -
                                  • Days since planting

                                  • -
                                  • Cumulative precipitation (mm)

                                  • -
                                  • Soil moisture availability

                                  • -
                                  -

                                  Variants:

                                  -
                                    -
                                  • Dry: Non-irrigated fields

                                  • -
                                  • Irrigated 15”: 15-inch row spacing

                                  • -
                                  • Irrigated 30”: 30-inch row spacing

                                  • -
                                  -

                                  Output: Apothecial presence probability (0–1)

                                  -
                                  -
                                  -
                                  -

                                  Winter Rye Biomass (NEW)#

                                  -

                                  Crop: Winter Rye
                                  -Metric: Aboveground dry biomass (lb/acre)

                                  -

                                  Model Type: Logistic growth model

                                  -

                                  Formula:

                                  -
                                  -\[\text{logit} = b_0 + b_{pd} \cdot \text{plant\_doy} + b_{pf} \cdot \text{precip\_fall}\]
                                  -
                                  -\[\text{pred} = \frac{\text{logit}}{1 + e^{-k(\text{gdd\_total}-x_0)}}\]
                                  -
                                  -\[\text{biomass} = \max(0, \text{pred}^2)\]
                                  -

                                  Coefficients:

                                  -
                                    -
                                  • \(b_0 = 423.1\) (intercept)

                                  • -
                                  • \(b_{pd} = -1.031\) (day-of-year effect)

                                  • -
                                  • \(b_{pf} = -0.2878\) (fall precipitation effect)

                                  • -
                                  • \(k = 0.003663\) (logistic rate)

                                  • -
                                  • \(x_0 = 1049.0\) (inflection point GDD)

                                  • -
                                  -

                                  Inputs:

                                  -
                                    -
                                  • Planting day-of-year (1–366)

                                  • -
                                  • Precipitation during fall establishment (mm)

                                  • -
                                  • Cumulative GDD from planting to current date (0°C base)

                                  • -
                                  -

                                  Output:

                                  -
                                    -
                                  • Biomass (lb/acre): Numeric prediction

                                  • -
                                  • Biomass Color:

                                    -
                                      -
                                    • Gray: 0–2000 lb/acre (low coverage)

                                    • -
                                    • Yellow: 2000–4500 lb/acre (moderate)

                                    • -
                                    • Green: >4500 lb/acre (high/dense)

                                    • -
                                    -
                                  • -
                                  • Biomass Message: Human-readable interpretation

                                  • -
                                  -

                                  Use Cases:

                                  -
                                    -
                                  • Cover crop management planning

                                  • -
                                  • Soil health assessment

                                  • -
                                  • Erosion mitigation evaluation

                                  • -
                                  • Residue management decisions

                                  • -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Biomass Models#

                                  -
                                  -

                                  Winter Rye Biomass Calculation Pipeline#

                                  -
                                  def _annotate_winter_rye_biomass(
                                  -    rye_daily: pd.DataFrame,
                                  -    planting_date: str
                                  -) -> pd.DataFrame:
                                  -    """
                                  -    Compute winter rye biomass from daily weather data.
                                  -    
                                  -    Steps:
                                  -    1. Parse planting_date → day-of-year
                                  -    2. Filter to dates >= planting_date
                                  -    3. Compute daily GDD (sine method, 0°C base, 35°C cap)
                                  -    4. Accumulate GDD and precipitation
                                  -    5. Call calculate_winter_rye_biomass() for each row
                                  -    6. Merge results back into DataFrame
                                  -    """
                                  -    
                                  -    # Step 1: Parse planting date
                                  -    plant_date_obj = datetime.fromisoformat(planting_date).date()
                                  -    plant_doy = plant_date_obj.timetuple().tm_yday
                                  -    
                                  -    # Step 2: Filter to >= planting date
                                  -    rye_daily = rye_daily[rye_daily['date'] >= planting_date].copy()
                                  -    
                                  -    # Step 3-4: GDD accumulation
                                  -    rye_daily['plant_doy'] = plant_doy
                                  -    rye_daily['precip_daily'] = rye_daily['precip1Hour_sum'].fillna(0)
                                  -    rye_daily['gdd_0c'] = rye_daily.apply(
                                  -        lambda row: gdd_sine(row['temperature_min'], row['temperature_max']),
                                  -        axis=1
                                  -    )
                                  -    rye_daily['gdd_total'] = rye_daily['gdd_0c'].cumsum()
                                  -    
                                  -    # Compute fall precipitation (Sep 1 to planting)
                                  -    fall_start = plant_date_obj.replace(month=9, day=1)
                                  -    fall_precip = rye_daily[
                                  -        (rye_daily['date'] >= str(fall_start)) & 
                                  -        (rye_daily['date'] < planting_date)
                                  -    ]['precip_daily'].sum()
                                  -    
                                  -    # Step 5: Model calculation
                                  -    biomass_results = rye_daily.apply(
                                  -        lambda row: calculate_winter_rye_biomass(
                                  -            plant_doy=row['plant_doy'],
                                  -            precip_fall=fall_precip,
                                  -            gdd_total=row['gdd_total']
                                  -        ),
                                  -        axis=1,
                                  -        result_type='expand'
                                  -    )
                                  -    
                                  -    # Step 6: Merge results
                                  -    for col in ['biomass_lb_acre', 'biomass_color', 'biomass_message']:
                                  -        rye_daily[col] = biomass_results[col]
                                  -    
                                  -    return rye_daily
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Weather Data Sources#

                                  -
                                  -

                                  IBM Environmental Intelligence Suite (EIS)#

                                  -

                                  Characteristics:

                                  -
                                    -
                                  • Premium, high-resolution service

                                  • -
                                  • Hourly data with 999-hour request window per call

                                  • -
                                  • Requires JWT authentication

                                  • -
                                  • Covers entire globe

                                  • -
                                  • 15-minute resolution available

                                  • -
                                  -

                                  Data Acquisition:

                                  -
                                    -
                                  1. Obtain JWT token via SaaSCore authentication

                                  2. -
                                  3. Request hourly-on-demand (HOD) data in time chunks

                                  4. -
                                  5. Convert to timezone-aware UTC timestamps

                                  6. -
                                  7. Interpolate/aggregate to daily summaries

                                  8. -
                                  -

                                  Cached Columns:

                                  -
                                    -
                                  • temperature_min, temperature_max, temperature_mean

                                  • -
                                  • temperatureDewPoint_min, temperatureDewPoint_max

                                  • -
                                  • relativeHumidity_min, relativeHumidity_max

                                  • -
                                  • windSpeed_max, windSpeed_mean

                                  • -
                                  • precip1Hour_sum (hourly accumulated)

                                  • -
                                  • Rolling averages: 7, 14, 21, 30-day

                                  • -
                                  -
                                  -
                                  -
                                  -

                                  WiscoNet (Public Mesonet)#

                                  -

                                  Characteristics:

                                  -
                                    -
                                  • Wisconsin statewide mesonet network

                                  • -
                                  • ~100 active weather stations

                                  • -
                                  • Public API, no authentication required

                                  • -
                                  • Daily data update cycle

                                  • -
                                  • Station metadata includes: ID, name, lat/lng, county, region

                                  • -
                                  -

                                  Measurement Types:

                                  -
                                    -
                                  • Air temperature (min, avg, max)

                                  • -
                                  • Dew point (min, avg, max)

                                  • -
                                  • Relative humidity (%)

                                  • -
                                  • Wind speed (max, direction)

                                  • -
                                  • Precipitation (daily total)

                                  • -
                                  • Soil temperature (select stations)

                                  • -
                                  • Leaf wetness (select stations)

                                  • -
                                  -

                                  Data Retrieval:

                                  -
                                    -
                                  • Station list via /wisconet_active_stations

                                  • -
                                  • Daily measurements via bulk query endpoint

                                  • -
                                  • Cached in station_measurements_cache/ (6-hour TTL)

                                  • -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Response Format#

                                  -
                                  -

                                  GeoJSON Feature Collection#

                                  -

                                  All responses follow the GeoJSON standard with extended properties:

                                  -
                                  {
                                  -  "type": "FeatureCollection",
                                  -  "features": [
                                  -    {
                                  -      "type": "Feature",
                                  -      "geometry": {
                                  -        "type": "Point",
                                  -        "coordinates": [-89.4, 43.1]
                                  -      },
                                  -      "properties": {
                                  -        "date": "2025-05-15",
                                  -        "forecasting_date": "2025-05-15",
                                  -        "station_id": "ALTN",
                                  -        "station_name": "Alten",
                                  -        "city": "Alten",
                                  -        "county": "Columbia",
                                  -        "region": "South Central",
                                  -        "state": "WI",
                                  -        "latitude": 43.1234,
                                  -        "longitude": -89.4567,
                                  -        "station_timezone": "America/Chicago",
                                  -        
                                  -        "temperature_min_c": 8.3,
                                  -        "temperature_max_c": 21.5,
                                  -        "temperature_mean_c": 15.2,
                                  -        "relativeHumidity_max": 92,
                                  -        "precip1Hour_sum": 2.5,
                                  -        
                                  -        "tarspot_risk": 0.45,
                                  -        "tarspot_risk_class": "2.Moderate",
                                  -        "gls_risk": 0.28,
                                  -        "gls_risk_class": "1.Low",
                                  -        "frogeye_risk": 0.12,
                                  -        "frogeye_risk_class": "1.Low",
                                  -        "whitemold_dry_risk": 0.35,
                                  -        "whitemold_dry_risk_class": "2.Moderate",
                                  -        
                                  -        "biomass_lb_acre": 3250,
                                  -        "biomass_color": "Yellow",
                                  -        "biomass_message": "Moderate coverage"
                                  -      }
                                  -    }
                                  -  ]
                                  -}
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Time-Series Grouping (WiscoNet)#

                                  -

                                  For multi-day forecasts, results are grouped by station with embedded time-series:

                                  -
                                  {
                                  -  "type": "FeatureCollection",
                                  -  "features": [
                                  -    {
                                  -      "type": "Feature",
                                  -      "geometry": { "type": "Point", "coordinates": [-89.4, 43.1] },
                                  -      "properties": {
                                  -        "station_id": "ALTN",
                                  -        "station_name": "Alten",
                                  -        "city": "Alten",
                                  -        "county": "Columbia",
                                  -        "region": "South Central",
                                  -        "state": "WI",
                                  -        "time_series": [
                                  -          {
                                  -            "date": "2025-05-15",
                                  -            "temperature_min_c": 8.3,
                                  -            "tarspot_risk": 0.45,
                                  -            ...
                                  -          },
                                  -          {
                                  -            "date": "2025-05-16",
                                  -            "temperature_min_c": 7.8,
                                  -            "tarspot_risk": 0.38,
                                  -            ...
                                  -          }
                                  -        ]
                                  -      }
                                  -    }
                                  -  ]
                                  -}
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Data Flow#

                                  -
                                  -

                                  Complete Request → Response Journey#

                                  -
                                  User Request
                                  -    │
                                  -    ▼
                                  -┌──────────────────────────────┐
                                  -│ Route Handler (app.py)       │
                                  -│ Validate query parameters    │
                                  -│ Extract coordinates/dates    │
                                  -└────────────────┬─────────────┘
                                  -                 │
                                  -    ┌────────────┴────────────┐
                                  -    │                         │
                                  -    ▼                         ▼
                                  -┌─────────────────┐    ┌───────────────┐
                                  -│ IBM Service     │    │ WiscoNet      │
                                  -│                 │    │ Pipeline      │
                                  -│ 1. Authenticate │    │               │
                                  -│    with IBM     │    │ 1. Load       │
                                  -│ 2. Chunk time   │    │    stations   │
                                  -│    range        │    │ 2. Fetch      │
                                  -│ 3. Fetch hourly │    │    measurements
                                  -│    data         │    │ 3. Merge      │
                                  -│ 4. Build daily  │    │    metadata   │
                                  -│    summaries    │    │ 4. Cache      │
                                  -│                 │    │    results    │
                                  -└────────┬────────┘    └────────┬──────┘
                                  -         │                      │
                                  -         └──────────┬───────────┘
                                  -                    │
                                  -                    ▼
                                  -         ┌──────────────────────┐
                                  -         │ Math Helpers         │
                                  -         │ • Convert units      │
                                  -         │ • GDD calculation    │
                                  -         │ • Rolling averages   │
                                  -         │ • Biomass prep       │
                                  -         └──────────┬───────────┘
                                  -                    │
                                  -                    ▼
                                  -         ┌──────────────────────┐
                                  -         │ Risk Model Scoring   │
                                  -         │ Apply all diseases   │
                                  -         │ Compute probabilities│
                                  -         │ Classify risk class  │
                                  -         └──────────┬───────────┘
                                  -                    │
                                  -                    ▼
                                  -         ┌──────────────────────┐
                                  -         │ Biomass Calculation  │
                                  -         │ (if planting_date)   │
                                  -         │ Logistic model       │
                                  -         │ Color classification │
                                  -         └──────────┬───────────┘
                                  -                    │
                                  -                    ▼
                                  -         ┌──────────────────────┐
                                  -         │ GeoJSON Adapter      │
                                  -         │ • Format geometry    │
                                  -         │ • Embed properties   │
                                  -         │ • Group by station   │
                                  -         └──────────┬───────────┘
                                  -                    │
                                  -                    ▼
                                  -        Response (GeoJSON)
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Development Setup#

                                  -
                                  -

                                  Prerequisites#

                                  -
                                    -
                                  • Python 3.10+

                                  • -
                                  • pip or conda

                                  • -
                                  • Git

                                  • -
                                  • Docker (optional, for containerized development)

                                  • -
                                  -
                                  -
                                  -

                                  Local Installation#

                                  -
                                  # Clone repository
                                  -git clone https://github.com/UW-Madison-DSI/ag_forecasting_api.git
                                  -cd ag_forecasting_api
                                  -
                                  -# Create virtual environment
                                  -python -m venv .venv
                                  -source .venv/bin/activate  # On Windows: .venv\Scripts\activate
                                  -
                                  -# Install dependencies
                                  -pip install -r requirements.txt
                                  -
                                  -# Set environment variables
                                  -export IBM_API_KEY="your_key"
                                  -export TENANT_ID="your_tenant"
                                  -export ORG_ID="your_org"
                                  -
                                  -# Run development server
                                  -uvicorn app:app --reload --host 0.0.0.0 --port 8000
                                  -
                                  -
                                  -
                                  -
                                  -

                                  API Documentation#

                                  -

                                  Once running, view interactive documentation:

                                  - -
                                  -
                                  -

                                  Testing#

                                  -
                                  # Syntax validation
                                  -python -m py_compile api/models/risk_models.py api/services/*.py
                                  -
                                  -# Run linting (if installed)
                                  -pylint api/
                                  -
                                  -# Test endpoint with curl
                                  -curl "http://localhost:8000/v2/test/rye_biomass"
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Deployment#

                                  -
                                  -

                                  Docker Deployment#

                                  -
                                  FROM python:3.11-slim
                                  -WORKDIR /app
                                  -COPY requirements.txt .
                                  -RUN pip install --no-cache-dir -r requirements.txt
                                  -COPY . .
                                  -EXPOSE 8000
                                  -CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Docker Compose (Production)#

                                  -
                                  version: "3.9"
                                  -services:
                                  -  ag_forecasting_api:
                                  -    build: .
                                  -    expose:
                                  -      - 8000
                                  -    environment:
                                  -      - PYTHONPATH=/app
                                  -      - ENVIRONMENT=production
                                  -      - IBM_API_KEY=${IBM_API_KEY}
                                  -      - TENANT_ID=${TENANT_ID}
                                  -      - ORG_ID=${ORG_ID}
                                  -    networks:
                                  -      - traefik
                                  -    labels:
                                  -      - "traefik.enable=true"
                                  -      - "traefik.http.routers.ag_api.rule=Host(`your-domain.com`)"
                                  -      - "traefik.http.services.ag_api.loadbalancer.server.port=8000"
                                  -    healthcheck:
                                  -      test: ["CMD", "curl", "-f", "http://localhost:8000/"]
                                  -      interval: 30s
                                  -      timeout: 10s
                                  -      retries: 3
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Environment Variables#

                                  -

                                  Required for production:

                                  -
                                    -
                                  • IBM_API_KEY: IBM EIS authentication credential

                                  • -
                                  • TENANT_ID: IBM EIS tenant identifier

                                  • -
                                  • ORG_ID: IBM EIS organization identifier

                                  • -
                                  • ENVIRONMENT: Set to “production” for optimized logging

                                  • -
                                  -

                                  Optional:

                                  -
                                    -
                                  • PYTHONPATH: Should include /app for imports

                                  • -
                                  • LOG_LEVEL: Logging verbosity (default: INFO)

                                  • -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Performance Considerations#

                                  -
                                  -

                                  Caching Strategy#

                                  -
                                    -
                                  • Station Metadata: 7-day TTL (rarely changes)

                                  • -
                                  • Measurements: 6-hour TTL (updated daily by WiscoNet)

                                  • -
                                  • IBM Responses: Variable (tied to forecast date relevance)

                                  • -
                                  • File System: JSON cache in api_cache/ for persistence

                                  • -
                                  -
                                  -
                                  -

                                  Concurrency#

                                  -
                                    -
                                  • Async Pipeline: Multi-station queries use async/await for I/O efficiency

                                  • -
                                  • Parallel Risk Scoring: Disease calculations use multiprocessing (4 workers default)

                                  • -
                                  • Connection Pooling: HTTP clients maintain connection pools (max 50 concurrent)

                                  • -
                                  -
                                  -
                                  -

                                  Optimization Tips#

                                  -
                                    -
                                  1. Batch Requests: Query multiple stations in one call rather than sequential individual queries

                                  2. -
                                  3. Use WiscoNet: Public API has lower latency than premium IBM service

                                  4. -
                                  5. Limit Date Range: Smaller date ranges reduce computation time

                                  6. -
                                  7. Filter Diseases: Specify disease models needed to reduce calculation overhead

                                  8. -
                                  9. Cache Warming: Pre-fetch station lists during off-peak hours

                                  10. -
                                  -
                                  -
                                  -
                                  -
                                  -

                                  Additional Resources#

                                  - -
                                  -
                                  -
                                  -

                                  License#

                                  -

                                  See LICENSE file for details.

                                  -
                                  -
                                  -
                                  -

                                  Changelog#

                                  -
                                  -

                                  Version 2.0 (Current)#

                                  -
                                    -
                                  • ✅ Winter rye biomass model integration

                                  • -
                                  • ✅ Unified API versioning (v1 legacy, v2 current)

                                  • -
                                  • ✅ Enhanced GeoJSON responses

                                  • -
                                  • ✅ Improved async pipeline performance

                                  • -
                                  • ✅ Extended documentation

                                  • -
                                  -
                                  -
                                  -

                                  Version 1.0 (Legacy)#

                                  -
                                    -
                                  • Disease risk models for corn and soybean

                                  • -
                                  • WiscoNet and IBM EIS integration

                                  • -
                                  • Basic GeoJSON support

                                  • -
                                  -
                                  -

                                  Last Updated: May 2025
                                  -Maintained By: UW-Madison Data Science Institute

                                  -
                                  -
                                  -
                                  - - - - -
                                  - - - - - - - - -
                                  - - - - - - -
                                  -
                                  - - -
                                  - - -
                                  -
                                  -
                                  - - - - - -
                                  -
                                  - - \ No newline at end of file diff --git a/_build/html/applications/ag-forecasting-api.html b/_build/html/applications/ag-forecasting-api.html index 8ecb7b3..bd326b1 100644 --- a/_build/html/applications/ag-forecasting-api.html +++ b/_build/html/applications/ag-forecasting-api.html @@ -32,7 +32,7 @@ - + @@ -60,6 +60,7 @@ + @@ -181,13 +182,11 @@ @@ -232,53 +231,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    OpenLambda Blog#

    News, releases, and technical deep-dives from the OpenLambda project.

      -
    • An Application Case Study: Forecasting Crop Disease with OpenLambdaMaria Oros, Tyler Caraza-Harter, May 18, 2026

      -

      Maria Oros, Data Science Institute, University of Wisconsin–Madison
      -Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison +

    • Hello, OpenLambda BlogOpenLambda Team, May 18, 2026

      +

      Welcome to the new OpenLambda blog. We’ll use this space to share release +notes, performance experiments, and design discussions.

      -

      Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments. +

    • +
    • An Application Case Study: Forecasting Crop Disease with OpenLambdaMaria Oros, Tyler Caraza-Harter, May 18, 2026

      +

      Maria Oros, Data Science Institute, University of Wisconsin–Madison
      +Tyler Caraza-Harter, Department of Computer Sciences, University of Wisconsin–Madison

      -
    • -
    • Hello, OpenLambda BlogOpenLambda Team, May 18, 2026

      -

      Welcome to the new OpenLambda blog. We’ll use this space to share release -notes, performance experiments, and design discussions. +

      Our goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

    -
    -
    - + @@ -435,6 +390,23 @@

    An Application Case Study: Forecasting Crop Disease with OpenLambda

    @@ -450,6 +422,105 @@

    An Application Case Study: Forecasting Crop Disease with OpenLambdaOur goal is to make an ever-growing set of applications deployable on OpenLambda (OL), with minimal modifications. We believe the best way to work towards this goal is to pick interesting applications that weren’t originally designed for serverless deployment, try to port them to OL, and identify pain points. This helps us identify the most useful features to add to OL, to support similar deployments.

    Recently, we selected an agricultural forecasting application (AgForecast), developed by the Data Science Institute at UW–Madison, to port to OpenLambda: UW-Madison-DSI/ag_forecasting_api. AgForecast is an interesting case study, because it implements its REST API using FastAPI, which in turn uses ASGI, the so-called “spiritual successor” to WSGI, which we recently started supporting in OpenLambda. WSGI is the basis for popular Python web-programming packages such as Django and Flask; new ASGI support opens the door to an even broader range of applications.

    In this post, we describe the challenges of porting AgForecast to OL, and four new features we added to OL to make deployment of similar applications in the future simpler. The features are built-in ASGI support, direct GitHub-to-OL deployments, OL function environment variables, and OL-based pip compilation.

    +
    +

    Background: Agricultural Forecasting API#

    +

    Motivation. The agricultural forecasting app is an open-source tool designed to address farmers’ needs in a customizable way. We first built a backend infrastructure using FastAPI to serve crop disease forecasting models for corn and soybean, focusing on integration with Wisconet weather stations and on-demand model serving. We then developed a custom R Shiny front-end interface for farmer use.

    +

    Fit with OpenLambda. We began exploring OpenLambda to leverage the benefits of serverless technology. Hosting our tool on this platform offers significant value not only to the developer community, but also to plant pathology practitioners and scientists who want to build on robust, nationwide infrastructure.

    +

    Technical overview. The Ag Forecasting API is a FastAPI-based backend that serves crop disease forecasting models for corn and soybean across Wisconsin. It exposes two parallel data pipelines through a unified interface: one sourced from Wisconet, the public mesonet of weather stations across the state, and another from IBM Environmental Intelligence for point-location queries by latitude and longitude. The core logic lives in the ag_models_wrappers module, which dynamically pulls the daily and hourly weather variables each disease model requires for a given forecasting date, runs the risk calculations, and returns localized predictions. Currently supported models include Sporecaster (white mold in soybean, with dry and irrigated row-spacing variants), Tarspotter (tar spot of corn), gray leaf spot, and frogeye leaf spot — all based on peer-reviewed plant pathology research from UW–Madison.

    +

    Infrastructure and integration. The project ships with a Dockerfile and docker-compose.yml for containerized deployment, and includes a Starlette WSGIMiddleware wrapper so the FastAPI app can also be served behind WSGI servers for legacy or mixed environments. A companion sub-package, pywisconet, provides a thin REST wrapper over the Wisconet v1 API with endpoints for active station discovery (/wisconet/active_stations/), station field metadata (/station_fields/{station_id}), and bulk measurement retrieval (/bulk_measures/{station_id}) at configurable frequencies (5-minute, hourly, or daily) for variables like air temperature, dew point, wind speed, and relative humidity. IBM credentials are handled via environment variables (IBM_API_KEY, TENANT_ID, ORG_ID) and validated against query parameters at request time. The API is MIT-licensed, fully open source, and currently deployed at connect.doit.wisc.edu/ag_forecasting_api.

    +
    +
    +

    Porting to OpenLambda#

    +

    When porting AgForecast to OL, we encountered 5 challenges related to: expectations about writable directories, package version selection, deployment from GitHub, asynchronous execution, and parallel pool execution. To overcome these challenges, we introduced four new features to OL and made minor changes to AgForecast itself.

    +
    +

    Challenge 1: File Management#

    +

    AgForecast is semi-stateless: data files describing stations and measurements are used across requests, but if these files are deleted, it can generate them on-the-fly from upstream data sources, such as the IBM Weather API or Wisconet. This is a good match for FaaS platforms such as OL, where lambda instances frequently persist (along with their state) across multiple invocations, even if an instance can silently be terminated at any time to reclaim memory.

    +

    However, most directory locations are read-only for an OL function; the one exception is a single “scratch directory” and various other locations that are symbolic links to the scratch directory (such as /tmp). Full-featured sandboxes such as Docker containers use union file systems to make many directories editable, on a copy-on-write basis. OL’s limitation is due to its use of bind mounts, a leaner, but less flexible mechanism. AgForecast wasn’t originally built for OL, so we modified the code to make the directory location for station and measurement data configurable via environment variables (otherwise AgForecast attempted to write to read-only locations). We added support to OL function configuration files to support the specification of environment variables, like this:

    +
    triggers:
    +  http:
    +    - method: "*"
    +environment:
    +  MEASUREMENTS_CACHE_DIR: /host/tmp/cache
    +  STATIONS_CACHE_FILE: /host/tmp/cache/wisconsin_stations_cache.csv
    +  ...
    +
    +
    +
    +
    +

    Challenge 2: Package Management#

    +

    Like many Python projects, AgForecast specifies PyPI package requirements in a requirements.txt file. Also like most projects, not all version requirements are exact. Here are 3 of the 21 lines in AgForecast’s requirements.txt:

    +
    ...
    +matplotlib==3.9.1
    +fastapi>=0.95.0
    +pydantic
    +...
    +
    +
    +

    Note the different levels of specificity: matplotlib must be a specific version, whereas pip can select any version for pydantic (probably the latest, barring version conflicts based on other dependencies); fastapi specifies a range. Note that some of these might also have indirect dependencies on other packages not explicitly listed.

    +

    OL requires exact versions for all packages, direct or indirect. For this purpose, we recommend the use of pip-compile to translate a partially specified requirements.txt file to a fully specified one, based on the latest packages at the time of compilation.

    +

    One challenge is that pip and pip-compile sometimes select packages based on the host environment. For example, in certain cases, the suitable Python package version for Ubuntu 24.04 might be different than for Ubuntu 26.04. Initially, we encountered this when deploying AgForecast on OL. The requirements.txt created by doing pip-compile on the host machine was not quite compatible with the environment inside the lambda function. To address this, we created a new OL function that does pip-compile inside the OL environment. It works like this:

    +
    curl -X POST -d '<some URL>' http://localhost:5000/run/pip-compile/url > requirements.txt
    +
    +
    +
    +
    +

    Challenge 3: Deployment#

    +

    AgForecast lives on a public GitHub repo: UW-Madison-DSI/ag_forecasting_api. We wanted to make it as easy as possible to deploy directly from GitHub to an OL function. Thus, we added a new ol admin install option to point directly to a repo:

    +
    ./ol admin install -c ol.yaml -r requirements.txt https://github.com/<org>/<repo>.git
    +
    +
    +
    +
    +

    Challenge 4: Asynchronous Execution#

    +

    AgForecast is built on FastAPI, which in turn is based on ASGI. ASGI is an asynchronous alternative to WSGI (Web Server Gateway Interface). The idea of WSGI is to let you mix and match servers (for example, Gunicorn, uWSGI) with application frameworks (for example, Flask, Django). The server/framework interface is minimalist, a single function signature that the server calls for each incoming HTTP request (GET/POST/etc). The framework implements the function; a common framework pattern is to route the call to a user-written handler function. For example, consider these two functions:

    +
    app = Flask(__name__)
    +
    +@app.route("/")
    +def home():
    +    return "Home page"
    +
    +@app.route("/about")
    +def about():
    +    return "About page"
    +
    +
    +

    The app object is a Python callable (meaning it is an object that acts like a function); app implements the WSGI interface. So when a server sends a request to app, app in turn calls the correct user function (home or about) to execute and obtain a result.

    +

    ASGI was introduced as an alternative to WSGI to provide more options for handling concurrent calls. Consider how (in the above Flask/WSGI example) two different users may want to visit the home and about pages at the same time. Can we handle the requests concurrently?

    +

    There are a few ways to do this: multiple processes, multiple threads in a process, or Python’s async functionality introduced in Python 3.5 (2015). If we want all execution in a single process (useful when there is shared state), we can either use threading (with WSGI) or async (with ASGI).

    +

    Threads are a non-cooperative form of scheduling, meaning that a scheduler can switch from running one thread on a CPU to another thread at any time (perhaps a very inconvenient time!). Writing multi-threaded programs is notoriously difficult, as one must identify shared state, introduce locks to protect that state, and acquire/release locks at the right points. In contrast, async offers a form of cooperative scheduling, where switches can only occur at well-defined points (e.g., an await). Thus, programming is simpler (no need for locks).

    +

    Normally, concurrent programs allow (a) parallel execution on multiple CPU cores at the same time and (b) execution of code at the same time that input/output occurs, say to the disk or network. In many languages, threads offer both benefits and cooperative scheduling only provides the I/O benefit. However, Python threads only offer the I/O benefit due to the GIL (Global Interpreter Lock), though this may be changing. Thus, async is especially appealing in Python since it (in theory) matches threading in terms of performance benefits, and surpasses threads in terms of ease-of-programming.

    +

    AgForecast implements REST calls in FastAPI, which is based on ASGI, which is the async-based alternative to WSGI. To support AgForecast, we implemented ASGI server functionality in OpenLambda. This makes OpenLambda an ASGI server implementation (in the same role as Uvicorn, Gunicorn, Daphne, etc). When a request arrives, OpenLambda uses asyncio.run(...) to invoke the user-provided entry point, with async send/receive callbacks. The user-provided entry-point can then be a full application, written in any ASGI-compatible framework (FastAPI, Starlette, Django/Channels, etc).

    +

    A user can indicate their lambda function is an ASGI application entry point by configuring their ol.yaml as follows:

    +
    environment:
    +  OL_ENTRY_FILE: app.py
    +  OL_ASGI_ENTRY: app
    +
    +
    +
    +
    +

    Challenge 5: Worker Pools#

    +

    AgForecast indirectly uses /dev/shm, an in-memory file system called tmpfs. Docker containers have a /dev/shm mount by default; as it is frequently used for inter-process communication, its behavior is configurable via the --ipc flag. In contrast, OL functions do not have any /dev/shm mount.

    +

    Why does AgForecast need /dev/shm? AgForecast uses a concurrent.futures.ProcessPoolExecutor to run a Python compute-heavy function called compute_risks in parallel over different chunks of data. ProcessPoolExecutor creates different Python processes for different chunks of work, which is desirable as a way to get around Python’s per-process GIL (Global Interpreter Lock), which is held whenever regular Python code is being executed. With multiple processes (created by the pool), each process will have its own GIL that it holds during execution; thus, multiple processes can hold their own locks at the same time and execute on multiple CPU cores in parallel.

    +

    As a fix to get AgForecast working as an OL function, we replaced ProcessPoolExecutor with a ThreadPoolExecutor; this avoids inter-process communication via /dev/shm because coordination occurs within a process, between threads. Unfortunately, all the threads share a GIL, so the performance benefits of using a pool for parallelism is lost in this case (the only value would be if compute_risks were I/O heavy, which it is not).

    +

    Using a ThreadPoolExecutor works as a short term fix, but this experience suggests that eventually adding /dev/shm availability (and thus ProcessPoolExecutor functionality) would be a useful future feature for OL.

    +
    +
    +
    +

    Recap of New Features#

    +

    Porting real, complex applications to serverless platforms highlights the most important features to develop. In this post, we described 5 challenges we encountered when porting AgForecast to OL, and the following features we added to better support similar applications:

    +
      +
    • environment variable configuration for lambda functions (challenge 1)

    • +
    • pip-compile as a lambda function (challenge 2)

    • +
    • direct GitHub deployment (challenge 3)

    • +
    • ASGI support (challenge 4)

    • +
    +

    We also made some minor changes to AgForecast:

    +
      +
    • customizable directory use for stations/measurements (challenge 1)

    • +
    • use of a thread pool instead of a process pool (challenge 5)

    • +
    +

    The second change suggests a future possible OL feature: adding /dev/shm availability to support process pools.

    +
    - - + @@ -330,53 +331,6 @@

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -