diff --git a/.gitignore b/.gitignore index c6fc6e08..9bc58fe9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,9 +7,12 @@ .DS_Store /.luarc.json -/__pycache__/ +__pycache__/ .Rproj.user .Rhistory /_inv/ /objects.json + +.venv/ +__pycache__/ diff --git a/Makefile b/Makefile index ac8e37a4..e0fc2f91 100644 --- a/Makefile +++ b/Makefile @@ -76,7 +76,8 @@ quartodoc: rsync -av --exclude="index.qmd" py-shiny/docs/api/ ./api cp -R py-shiny/docs/_inv py-shiny/docs/objects.json ./ # Copy over index.qmd, but rename it to _api_index.qmd - cp py-shiny/docs/api/index.qmd ./api/_api_index.qmd + cp py-shiny/docs/api/express/index.qmd ./api/express/_api_index.qmd + cp py-shiny/docs/api/core/index.qmd ./api/core/_api_index.qmd ## Build website site: diff --git a/_extensions/shafayetShafee/line-highlight/line-highlight.lua b/_extensions/shafayetShafee/line-highlight/line-highlight.lua index 67a0cf44..935a91b9 100644 --- a/_extensions/shafayetShafee/line-highlight/line-highlight.lua +++ b/_extensions/shafayetShafee/line-highlight/line-highlight.lua @@ -1,4 +1,4 @@ -local PATTERN = "#<<$" +local PATTERN = "# ?<<$" local function ensureHtmlDeps() quarto.doc.add_html_dependency({ diff --git a/_quarto.yml b/_quarto.yml index 4bea0be7..3fc1a956 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -13,13 +13,14 @@ project: - display-messages - layouts - docs - - in-depth - development - gallery - - api + - api/express + - api/core resources: - /pypi/** - /robots.txt + - /_redirects - objects.json - "*.png" - "*.gif" @@ -29,7 +30,8 @@ project: - scripts/post-render.py metadata-files: - - api/_sidebar.yml + - api/express/_sidebar.yml + - api/core/_sidebar.yml filters: - shinylive @@ -64,35 +66,39 @@ website: logo-alt: The logo for Shiny for Python search: true left: - - text: "Learn" + - text: "Learn Shiny" file: docs/overview.qmd - - text: "Install" - href: docs/install.qmd + - text: "Components" + menu: + - text: "Components" + file: components/index.qmd + icon: sliders + - text: "Layouts" + file: layouts/index.qmd + icon: layout-text-window-reverse - text: "Deploy" menu: - docs/deploy-cloud.qmd - docs/deploy-on-prem.qmd - docs/shinylive.qmd - - text: "Components" - file: components/index.qmd - - text: "Layouts" - file: layouts/index.qmd - text: "Gallery" file: gallery/index.qmd - - text: "Examples" + - text: "Playground" href: https://shinylive.io/py/examples/ target: _blank - text: "Reference" - href: api/index.qmd - - text: "Help" - href: docs/help.qmd + menu: + - text: "Shiny Express" + href: api/express/index.qmd + - text: "Shiny Core" + href: api/core/index.qmd tools: - icon: discord href: https://discord.gg/yMGCamUMnS - text: Shiny Discord + aria-label: Shiny Discord - icon: github href: https://github.com/posit-dev/py-shiny/ - text: Shiny for Python Github + aria-label: Shiny for Python Github page-footer: left: 'Proudly supported by Posit' @@ -118,43 +124,43 @@ website: href: components/ - section: "![](/images/sliders.svg){.sidebar-icon .sidebar-subtitle}__Inputs__" contents: - - components/inputs/action-button.qmd - - components/inputs/action-link.qmd - - components/inputs/checkbox.qmd - - components/inputs/checkbox-group.qmd - - components/inputs/date-range-selector.qmd - - components/inputs/date-selector.qmd - - components/inputs/numeric-input.qmd - - components/inputs/password-field.qmd - - components/inputs/radio-buttons.qmd - - components/inputs/select-single.qmd - - components/inputs/select-multiple.qmd - - components/inputs/selectize-single.qmd - - components/inputs/selectize-multiple.qmd - - components/inputs/slider.qmd - - components/inputs/slider-range.qmd - - components/inputs/switch.qmd - - components/inputs/text-area.qmd - - components/inputs/text-box.qmd + - components/inputs/action-button/index.qmd + - components/inputs/action-link/index.qmd + - components/inputs/checkbox/index.qmd + - components/inputs/checkbox-group/index.qmd + - components/inputs/date-range-selector/index.qmd + - components/inputs/date-selector/index.qmd + - components/inputs/numeric-input/index.qmd + - components/inputs/password-field/index.qmd + - components/inputs/radio-buttons/index.qmd + - components/inputs/select-single/index.qmd + - components/inputs/select-multiple/index.qmd + - components/inputs/selectize-single/index.qmd + - components/inputs/selectize-multiple/index.qmd + - components/inputs/slider/index.qmd + - components/inputs/slider-range/index.qmd + - components/inputs/switch/index.qmd + - components/inputs/text-area/index.qmd + - components/inputs/text-box/index.qmd - section: "![](/images/bar-chart-line-fill.svg){.sidebar-icon .sidebar-subtitle}__Outputs__" contents: - - components/outputs/data-grid.qmd - - components/outputs/datatable.qmd - - components/outputs/image.qmd - - components/outputs/map-ipyleaflet.qmd - - components/outputs/plot-matplotlib.qmd - - components/outputs/plot-plotly.qmd - - components/outputs/plot-seaborn.qmd - - components/outputs/text.qmd - - components/outputs/ui.qmd - - components/outputs/value-box.qmd - - components/outputs/verbatim-text.qmd + - components/outputs/data-grid/index.qmd + - components/outputs/datatable/index.qmd + - components/outputs/image/index.qmd + - components/outputs/map-ipyleaflet/index.qmd + - components/outputs/plot-matplotlib/index.qmd + - components/outputs/plot-plotly/index.qmd + - components/outputs/plot-seaborn/index.qmd + - components/outputs/text/index.qmd + - components/outputs/ui/index.qmd + - components/outputs/value-box/index.qmd + - components/outputs/verbatim-text/index.qmd - section: "![](/images/chat-dots-fill.svg){.sidebar-icon .sidebar-subtitle}__Display Messages__" contents: - - components/display-messages/modal.qmd - - components/display-messages/notifications.qmd - - components/display-messages/progress-bar.qmd - - components/display-messages/tooltips.qmd + - components/display-messages/modal/index.qmd + - components/display-messages/notifications/index.qmd + - components/display-messages/progress-bar/index.qmd + - components/display-messages/tooltips/index.qmd - id: layouts collapse-level: 2 @@ -164,47 +170,47 @@ website: - section: "![](/images/navbars-blue.svg){.sidebar-icon .sidebar-subtitle}__Navbars__" contents: - text: "Navbar at Top" - href: "/layouts/navbars.html#navbar-at-top" + href: "/layouts/navbars/index.html#navbar-at-top" - text: "Navbar at Bottom" - href: "/layouts/navbars.html#navbar-at-bottom" + href: "/layouts/navbars/index.html#navbar-at-bottom" - section: "![](/images/sidebars-blue.svg){.sidebar-icon .sidebar-subtitle}__Sidebars__" contents: - text: "Sidebar on Left" - href: "/layouts/sidebars.html#sidebar-on-the-left" + href: "/layouts/sidebars/index.html#sidebar-on-the-left" - text: "Sidebar on Right" - href: "/layouts/sidebars.html#sidebar-on-the-right" + href: "/layouts/sidebars/index.html#sidebar-on-the-right" - text: "Sidebar Within a Card" - href: "/layouts/sidebars.html#sidebar-within-a-card" + href: "/layouts/sidebars/index.html#sidebar-within-a-card" - text: "Collapsed Sidebar" - href: "/layouts/sidebars.html#collapsed-sidebar" + href: "/layouts/sidebars/index.html#collapsed-sidebar" - section: "![](/images/tabs-blue.svg){.sidebar-icon .sidebar-subtitle}__Tabs__" contents: - text: "Tabset with Pill Navigation" - href: "/layouts/tabs.html#tabset-with-pill-navigation" + href: "/layouts/tabs/index.html#tabset-with-pill-navigation" - text: "Tabset with Pill List Navigation" - href: "/layouts/tabs.html#tabset-with-pill-list-navigation" + href: "/layouts/tabs/index.html#tabset-with-pill-list-navigation" - text: "Tabset with Tab Navigation" - href: "/layouts/tabs.html#tabset-with-tab-navigation" + href: "/layouts/tabs/index.html#tabset-with-tab-navigation" - text: "Card with a Tabbed Tabset" - href: "/layouts/tabs.html#card-with-a-tabbed-tabset" + href: "/layouts/tabs/index.html#card-with-a-tabbed-tabset" - text: "Card with a Pill Tabset" - href: "/layouts/tabs.html#card-with-a-pill-tabset" + href: "/layouts/tabs/index.html#card-with-a-pill-tabset" - text: "Vertically Collapsing Accordions" - href: "/layouts/tabs.html#vertically-collapsing-accordion-panels" + href: "/layouts/tabs/index.html#vertically-collapsing-accordion-panels" - section: "![](/images/cards-blue.svg){.sidebar-icon .sidebar-subtitle}__Panels & Cards__" contents: - text: "Main Image w/ Floating Panel" - href: "/layouts/panels-cards.html#main-image-with-panel-floating-above" + href: "/layouts/panels-cards/index.html#main-image-with-panel-floating-above" - text: "Content Divided by Cards" - href: "/layouts/panels-cards.html#content-divided-by-cards" + href: "/layouts/panels-cards/index.html#content-divided-by-cards" - section: "![](/images/arrange-blue.svg){.sidebar-icon .sidebar-subtitle}__Arrange Elements__" contents: - text: "Grid Layouts" - href: "/layouts/arrange.html#grid-layouts" + href: "/layouts/arrange/index.html#grid-layouts" - text: "Column Nesting" - href: "/layouts/arrange.html#column-nesting" + href: "/layouts/arrange/index.html#column-nesting" - text: "Controlling for Page Size" - href: "/layouts/arrange.html#controlling-for-page-width-and-height" + href: "/layouts/arrange/index.html#controlling-for-page-width-and-height" - id: docs style: "floating" @@ -214,34 +220,33 @@ website: - section: "Essentials" contents: - docs/overview.qmd - - docs/inputs.qmd - - docs/outputs.qmd - - docs/server.qmd - - section: "Reactivity" + - docs/user-interfaces.qmd + - section: "Workflow" contents: - - docs/reactive-programming.qmd - - docs/reactive-calculations.qmd - - docs/reactive-events.qmd - - docs/reactive-values.qmd - - docs/reactive-mutable.qmd - - section: "Page Layout and Style" + - docs/install-create-run.qmd + - docs/debug.qmd + - section: "User interfaces" contents: - - docs/ui-page-layouts.qmd - - docs/ui-styling.qmd - - docs/ui-navigation.qmd + - docs/ui-overview.qmd + - docs/jupyter-widgets.qmd - docs/ui-dynamic.qmd - - docs/ui-feedback.qmd - - docs/ui-static.qmd - - section: "Workflow" + - docs/ui-html.qmd + - docs/ui-customize.qmd + - section: "Reactivity" contents: - - docs/workflow-modules.qmd - - docs/workflow-module-communication.qmd - - docs/running-debugging.qmd - - section: "In Depth" + - docs/reactive-foundations.qmd + - docs/reactive-patterns.qmd + - docs/reactive-mutable.qmd + - section: "Syntax modes" contents: - - docs/ipywidgets.qmd - - docs/ui-html.qmd - - docs/workflow-server.qmd + - docs/express-vs-core.qmd + - docs/express-or-core.qmd + - docs/express-in-depth.qmd + - docs/express-to-core.qmd + - section: "Modules" + contents: + - docs/modules.qmd + - docs/module-communication.qmd - section: "Extending" contents: - docs/custom-component-one-off.qmd @@ -250,6 +255,10 @@ website: contents: - docs/comp-streamlit.qmd - docs/comp-r-shiny.qmd + - section: "Miscellaneous" + contents: + - docs/nonblocking.qmd + - docs/routing.qmd # TODO: if the sidebar only has 1 entry, then it displays for the entire site... # added entry below to prevent this. - id: deploy diff --git a/_redirects b/_redirects new file mode 100644 index 00000000..627a74b8 --- /dev/null +++ b/_redirects @@ -0,0 +1,42 @@ +/api/express/* /api/express/:splat +/api/* /api/core/:splat + +components/display-messages/modal.html components/display-messages/modal/ +components/display-messages/notifications.html components/display-messages/notifications/ +components/display-messages/progress-bar.html components/display-messages/progress-bar/ +components/display-messages/tooltips.html components/display-messages/tooltips/ +components/inputs/action-button.html components/inputs/action-button/ +components/inputs/action-link.html components/inputs/action-link/ +components/inputs/checkbox-group.html components/inputs/checkbox-group/ +components/inputs/checkbox.html components/inputs/checkbox/ +components/inputs/date-range-selector.html components/inputs/date-range-selector/ +components/inputs/date-selector.html components/inputs/date-selector/ +components/inputs/numeric-input.html components/inputs/numeric-input/ +components/inputs/password-field.html components/inputs/password-field/ +components/inputs/radio-buttons.html components/inputs/radio-buttons/ +components/inputs/select-multiple.html components/inputs/select-multiple/ +components/inputs/select-single.html components/inputs/select-single/ +components/inputs/selectize-multiple.html components/inputs/selectize-multiple/ +components/inputs/selectize-single.html components/inputs/selectize-single/ +components/inputs/slider-range.html components/inputs/slider-range/ +components/inputs/slider.html components/inputs/slider/ +components/inputs/switch.html components/inputs/switch/ +components/inputs/text-area.html components/inputs/text-area/ +components/inputs/text-box.html components/inputs/text-box/ +components/outputs/data-grid.html components/outputs/data-grid/ +components/outputs/datatable.html components/outputs/datatable/ +components/outputs/image.html components/outputs/image/ +components/outputs/map-ipyleaflet.html components/outputs/map-ipyleaflet/ +components/outputs/plot-matplotlib.html components/outputs/plot-matplotlib/ +components/outputs/plot-plotly.html components/outputs/plot-plotly/ +components/outputs/plot-seaborn.html components/outputs/plot-seaborn/ +components/outputs/text.html components/outputs/text/ +components/outputs/ui.html components/outputs/ui/ +components/outputs/value-box.html components/outputs/value-box/ +components/outputs/verbatim-text.html components/outputs/verbatim-text/ + +layouts/arrange.html layouts/arrange/ +layouts/navbars.html layouts/navbars/ +layouts/panels-cards.html layouts/panels-cards/ +layouts/sidebars.html layouts/sidebars/ +layouts/tabs.html layouts/tabs/ diff --git a/api/core/index.qmd b/api/core/index.qmd new file mode 100644 index 00000000..60cef8ab --- /dev/null +++ b/api/core/index.qmd @@ -0,0 +1,9 @@ +# Shiny Core API + +This page outlines Shiny _Core_'s API reference. + +[Compared to Shiny Express](/docs/express-vs-core.qmd), Shiny Core is more structured and verbose, but also more flexible and powerful. + +Newcomers may want to start with [Shiny Express](../express/index.qmd) Shiny Core API. + +{{< include _api_index.qmd >}} diff --git a/api/express/index.qmd b/api/express/index.qmd new file mode 100644 index 00000000..ab72fdab --- /dev/null +++ b/api/express/index.qmd @@ -0,0 +1,9 @@ +# Shiny Express API + +This page outlines Shiny _Express_'s API reference. + +[Compared to Shiny Core](/docs/express-vs-core.qmd), Shiny Express is a simpler way to learn and create basic apps, but it is less flexible and powerful. + +For an introduction to Shiny, see the [tutorial](/docs/overview.qmd). + +{{< include _api_index.qmd >}} diff --git a/api/index.qmd b/api/index.qmd index 7f60deb4..5c268c9f 100644 --- a/api/index.qmd +++ b/api/index.qmd @@ -1,46 +1,51 @@ # API Reference Intro -This website documents the public API of Shiny for Python. See the [Getting Started tutorial](/docs/get-started.qmd) for a more approachable introduction to the API. -The left-hand sidebar gives quick access to the full public API, and the table of contents below shows the same entries plus a brief summary for each. -Most of the reference pages include a live example app at the bottom, or at least mention another page with a relevant example. +This page details the Shiny's full API. +New users are encouraged to start from the [Quick Start tutorial](../docs/overview.qmd), and then come back here when you're ready to learn more. +We recommend newcomers start with [Shiny Express](../docs/express-vs-core.qmd) instead of the more structured Shiny Core API. -We've intentionally designed Shiny's API so that you can `from shiny import *` to get access to most of what you need for most apps without introducing an excessive amount of namespace pollution. -Namely, it gives you: +::: {.panel-tabset .panel-pills .border-0 .p-0 .justify-content-center} -* User interface (UI/HTML) helpers, available via the `ui` subpackage. +### Express - * To avoid clashing with this `ui` namespace when you do `from shiny import *`, you'll want to name you UI object something else, like `app_ui`. +```{shinylive-python} +#| standalone: true +#| components: [editor, viewer] +#| layout: vertical +#| viewerHeight: 150 -* Reactive programming utilities, available via the `reactive` subpackage. -* Decorators for rendering `output`, available via the `render` subpackage. +from shiny.express import input, render, ui - * 3rd party packages that want to implement their own rendering functions are encouraged to use a `@render_foo()` naming convention so users may import with `from mypkg import render_foo`. +ui.input_slider("val", "Slider label", min=0, max=100, value=50) -* A handful of other things you'll want for most apps (e.g., `App`, `Module`, etc). -* If you're using type checking, you'll also want to use the `Inputs`, `Outputs`, and `Session` Classes - to type the instances supplied to your server function, for example: +@render.text +def slider_val(): + return f"Slider value: {input.val()}" +``` +### Core ```{shinylive-python} #| standalone: true #| components: [editor, viewer] #| layout: vertical -#| viewerHeight: 400 -## file: app.py -from shiny import * +#| viewerHeight: 150 + +from shiny import App, render, ui -app_ui = ui.page_fluid( - ui.input_slider("n", "Value of n", min=1, max=10, value=5), - ui.output_text("n2") +app_ui = ui.page_fixed( + ui.input_slider("val", "Slider label", min=0, max=100, value=50), + ui.output_text_verbatim("slider_val") ) -def server(input: Inputs, output: Outputs, session: Session) -> None: - @output +def server(input, output, session): @render.text - def n2(): - return f"The value of n*2 is {input.n() * 2}" + def slider_val(): + return f"Slider value: {input.val()}" app = App(app_ui, server) ``` +::: + {{< include _api_index.qmd >}} diff --git a/components/_metadata.yml b/components/_metadata.yml index 7a876a9b..bd07e269 100644 --- a/components/_metadata.yml +++ b/components/_metadata.yml @@ -1,12 +1,12 @@ -sidebar: components +sidebar: components format: html: css: _partials/components.css toc: false code-line-numbers: true + code-overflow: scroll include-after-body: _partials/componentsjs.html filters: - quarto - line-highlight - - shinylive - \ No newline at end of file + - shinylive diff --git a/components/_partials/components-detail-example.ejs b/components/_partials/components-detail-example.ejs new file mode 100644 index 00000000..870504aa --- /dev/null +++ b/components/_partials/components-detail-example.ejs @@ -0,0 +1,2 @@ + +<%= include('shiny-example-panel.ejs', {apps: items, appDir: templateParams.dir}) %> diff --git a/components/_partials/components-detail-relevant-functions.ejs b/components/_partials/components-detail-relevant-functions.ejs new file mode 100644 index 00000000..91b37a07 --- /dev/null +++ b/components/_partials/components-detail-relevant-functions.ejs @@ -0,0 +1,19 @@ + + +## Relevant Functions {.mt-5} + +```{=html} + +``` diff --git a/components/_partials/components-detail.ejs b/components/_partials/components-detail.ejs deleted file mode 100644 index aa77473e..00000000 --- a/components/_partials/components-detail.ejs +++ /dev/null @@ -1,45 +0,0 @@ -<% for (const item of items) { %> - -::: {.panel-tabset} - -## Preview - - -<% if (item.shinylive) { %> -

Edit in Shinylive

-<% } %> - -## Code - -```{.python filename="app.py" } -<%= item.code %> -``` -<% if (item.shinylive) { %> -

Edit in Shinylive

-<% } %> -::: - -:::{.mt-5} -::: - -## Relevant Functions - - - -:::{.border-bottom .blue .mt-6 .mb-4} -::: - -<% } %> diff --git a/components/_partials/components-list.ejs b/components/_partials/components-list.ejs index fc7e8fa3..c478319e 100644 --- a/components/_partials/components-list.ejs +++ b/components/_partials/components-list.ejs @@ -22,7 +22,7 @@ -<% if (item.previewapp) { %> +<% if (item.appPreview) { %>
@@ -43,12 +43,12 @@ ```{shinylive-python} #| standalone: true #| components: [viewer] -<%= item.previewapp %> +<%= Deno.readTextFileSync(item.appPreview.file) %> ```
-<% } %> +<% } %> <% } %> diff --git a/components/_partials/components-variations.ejs b/components/_partials/components-variations.ejs index b904bfc1..ffa83151 100644 --- a/components/_partials/components-variations.ejs +++ b/components/_partials/components-variations.ejs @@ -1,48 +1,15 @@ +::: {.variations} + <% for (const item of items) { %> -<% if (item.variations) { %> +### <%= item.title %> -:::{.border-bottom .blue .mt-6 .mb-4} +::: {.variation-description} +<%= item.description %> ::: -:::{.pt-1} - -## Variations - -<% for (const variation of item.variations) { %> - -#### <%= variation.title %> {.mb-0 .mt-5} - -

<%= variation.description %>

+<%= include('shiny-example-panel.ejs', {apps: item.apps, appDir: templateParams.dir}) %> -::: {.panel-tabset} - -## Preview - - -<% if (variation.shinylive) { %> -

Edit in Shinylive

<% } %> -## Code - -```{.python filename="app.py" } -<%= variation.code %> -``` -<% if (variation.shinylive) { %> -

Edit in Shinylive

-<% } %> ::: - -<% } %> - -::: - -<% } %> - -<% } %> diff --git a/components/_partials/components.css b/components/_partials/components.css index 247278bf..7a7d41cd 100644 --- a/components/_partials/components.css +++ b/components/_partials/components.css @@ -156,7 +156,6 @@ a.component-list-header-text:hover ~ div.component-list-icon p a i.component-lin } /* detail page styling */ - .tab-content { margin-top: 0px; border: 0px; @@ -165,27 +164,6 @@ a.component-list-header-text:hover ~ div.component-list-icon p a i.component-lin margin-bottom: 1em; } -code.sourceCode, -pre.console code { - padding: 0.25rem 1rem 0.25rem 0.25rem; -} - -.code-with-filename div.sourceCode, -.reveal .code-with-filename div.sourceCode { - margin-top: 0; - border-top-left-radius: 0%; - border-top-right-radius: 0%; -} - -.tab-pane div.sourceCode { - margin-top: 0px; -} - -.tab-content div.sourceCode, -.tab-content pre.console { - margin-bottom: 0px; -} - .component-hr:last-of-type { display: none; } @@ -208,10 +186,10 @@ pre.console code { /* Tab styling */ .panel-tabset .nav-tabs { - display: flex !important; - align-items: flex-end !important; - justify-content: flex-end !important; - border-bottom: 1px solid #E9ECEF; + display: flex; + align-items: flex-end; + justify-content: flex-end; + border-bottom: 1px solid #ffffff; border-top: none; border-left: none; border-right: none; @@ -237,11 +215,10 @@ main a.nav-link:hover { color: #202020; background-color: #fff; border-bottom: 3px solid #202020 !important; - margin-bottom: -2px; - border-left: 1px solid rgba(0, 0, 0, 0); - border-right: 1px solid rgba(0, 0, 0, 0); - border-top: 1px solid rgba(0, 0, 0, 0); - border-radius: 0px; + margin-bottom: 0px; + border-left: 0px solid rgba(0, 0, 0, 0); + border-right: 0px solid rgba(0, 0, 0, 0); + border-top: 0px solid rgba(0, 0, 0, 0); } .panel-tabset .nav-tabs .nav-link:hover, @@ -254,8 +231,8 @@ main a.nav-link:hover { } .panel-tabset .nav-tabs .nav-link { - padding: 0.35rem 1.25rem; - margin-bottom: 0px; + padding: 0.45rem 1.25rem; + margin-bottom: 2px; } .iframe-border { diff --git a/components/_partials/componentsjs.html b/components/_partials/componentsjs.html index 6643ad16..3881fa48 100644 --- a/components/_partials/componentsjs.html +++ b/components/_partials/componentsjs.html @@ -1,6 +1,6 @@ \ No newline at end of file +const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]') +const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl)) + diff --git a/components/_partials/shiny-example-panel.ejs b/components/_partials/shiny-example-panel.ejs new file mode 100644 index 00000000..c285f841 --- /dev/null +++ b/components/_partials/shiny-example-panel.ejs @@ -0,0 +1,30 @@ +<% const previews = apps.filter(app => app.title === "Preview") %> +<% const codeApps = apps.filter(app => app.title !== "Preview") %> + +<% if (previews.length) { %> +<% const previewApp = previews[0] %> + +:::{.app-preview} +```{shinylive-python} +#| standalone: true +#| components: [<%= previewApp.components ? previewApp.components.join(', ') : 'viewer' %>] +#| viewerHeight: <%= previewApp.height ? previewApp.height : '300' %> + +<%= Deno.readTextFileSync((appDir || '') + previewApp.file) %> +``` +::: + +<% } %> + +::: {.panel-tabset .shiny-mode-tabset group="shiny-app-mode"} + +<% for (const app of codeApps) { %> +### <%= app.title %> + +```{.python .code-overflow-scroll <%=app.shinylive ? `shinylive="${app.shinylive}"` : '' %>} +<%= Deno.readTextFileSync((appDir || '') + app.file) %> +``` + +<% } %> + +::: diff --git a/components/_qmd.py b/components/_qmd.py new file mode 100644 index 00000000..184af4f0 --- /dev/null +++ b/components/_qmd.py @@ -0,0 +1,72 @@ +import os + +import yaml as yml + + +def find_qmds(dir, exclude): + qmd_list = [p for p in os.listdir(dir) if p.endswith(".qmd")] + qmd_list = [os.path.join(dir, p) for p in qmd_list if p not in exclude] + return qmd_list + + +def slug_from_path(path): + return os.path.splitext(os.path.basename(path))[0] + + +def get_qmd_split(path): + with open(path, "r") as f: + lines = f.readlines() + + yaml = [] + body = [] + + in_yaml = False + found_yaml = False + + for i, line in enumerate(lines): + # if the line starts with ---, we're in the yaml + if line.startswith("---"): + if found_yaml: + body.append(line) + continue + + if not in_yaml: + in_yaml = True + continue + + found_yaml = True + in_yaml = False + continue + + if in_yaml: + yaml.append(line) + else: + body.append(line) + + meta = yml.safe_load("".join(yaml)) + if os.path.basename(path) == "index.qmd": + meta["_slug"] = slug_from_path(os.path.dirname(path)) + meta["_dir"] = os.path.dirname(path) + else: + meta["_slug"] = slug_from_path(path) + meta["_dir"] = os.path.join(os.path.dirname(path), meta["_slug"]) + + return (meta, "".join(body)) + + +def write_qmd(qmd, path): + meta, body = qmd + + keys_rm = [key for key in meta.keys() if key.startswith("_")] + + for key in keys_rm: + del meta[key] + + with open(path, "w") as f: + f.write("---\n") + f.write(yml.dump(meta, sort_keys=False, indent=2, default_flow_style=False)) + f.write("---\n\n") + f.write(body.strip()) + f.write("\n") + + return path diff --git a/components/display-messages/modal.qmd b/components/display-messages/modal.qmd deleted file mode 100644 index f779527f..00000000 --- a/components/display-messages/modal.qmd +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: "Modal" -sidebar: components -previewapp: | - from shiny import App, Inputs, Outputs, Session, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("show", "Show modal dialog"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input: Inputs, output: Outputs, session: Session): - @reactive.Effect - @reactive.event(input.show) - def _(): - m = ui.modal( - "This is a somewhat important message.", - easy_close=True, - footer=None, - ) - ui.modal_show(m) - - app = App(app_ui, server) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Modal Message - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDUxfGOGLqmVkdMuaR0AI28yUicwdmIAdzV8JliAZTZophhiOyhrJjsOTOIzWIBKPA1CjQ07OBpWODpFOgdPbwliby8yCRY4FhYOUkLEZ1cAASk-BTgMAFEaGjhZIZdR6VkJjDhFckaIdoxIqLKIV2yqph0HAcXj1MM3DDSM6ycj69fYgBVOFl5vqFZGOBRNhQYR8ARCKDkVLdFjmSaxEovV7HORkaxwAyJAFAkG8fiCMiQ4TwHpwhFXZFMaQsbA6QjWYhdAzvOjKJQU5E0YjECh0AwmB6ZIIhMKxAAiHBYMElLCKiMph0pAvSQv2Dhghy06FuYlQDm0eg4nVq9UKYAAvgBdIA - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("show", "Show modal dialog"), - ) - - def server(input, output, session): - @reactive.Effect - @reactive.event(input.show) - def _(): - m = ui.modal( #<< - "This is a somewhat important message.", #<< - title="Somewhat important message", #<< - easy_close=True #<< - ) #<< - ui.modal_show(m) #<< - - app = App(app_ui, server) - relevantfunctions: - - title: "ui.modal" - href: https://shiny.posit.co/py/api/ui.modal.html - signature: ui.modal(*args, title=None, footer=MISSING, size='m', easy_close=False, fade=True, **kwargs) - - title: "ui.modal_show" - href: https://shiny.posit.co/py/api/ui.modal_show.html - signature: ui.modal_show(modal, session=None) - - title: "ui.modal_remove" - href: https://shiny.posit.co/py/api/ui.modal_remove.html - signature: ui.modal_remove(session=None) - - title: "ui.modal_button" - href: https://shiny.posit.co/py/api/ui.modal_button.html - signature: ui.modal_button(label, icon=None, **kwargs) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Modal for authentication - description: Place inputs inside a modal to collect, and then login with, credentials. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDUxfGOGLqmVkdMuaR0AI28yUicwa2IzLjV8JliAGSiYsABKPA1UjQ07OBpWODpFOgdPbwliby8yCRY4FhYOUlTEZ1cAASk-BTgMAFEaGjhZNpdO6VkejDhFclKIaoxI6IgsiFcmXPydBxbRjaZmIxMYYjsoayd1g5uTMp8KAA8ycOh4WIlYgFU6uje4VppDLXG4bO4Lbw6VBQBoAd0Ejli0LhCI+8TAAAUYSx4XQ7ID0vtQW4PBCfN0AsEyKEIOESBAIMMyGjYgBhUiMkZAomg6QsbA6QiROoGAAqdGUSh5NxoxGIFDoBgAcqQ4NKmGtiSczhcdOxiLCHDBNaD9uNuop+oMmWaupNLTNKC97hh6ZyyCaXFsmDodnsQQdtedrDopKdFLt1QBiJjs3JMUJMN1MpiwjhkNi8MkYf67JhQCB2LOLZE4hGRzTQdCGUToBzaPQcWqFYqpMAAXwAukA - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("login", "Login"), - ) - - def server(input, output, session): - @reactive.Effect - @reactive.event(input.login) - def _(): - m = ui.modal( - ui.input_text("name", "Username:"), #<< - ui.input_password("password", "Password:"), #<< - ui.input_action_button("connect", "Connect"), #<< - easy_close=True, #<< - footer=None #<< - ) - ui.modal_show(m) - - @reactive.Effect #<< - @reactive.event(input.connect) #<< - def __(): #<< - ui.modal_remove() #<< - # Code to connect with input.name() and input.password() #<< - - app = App(app_ui, server) ---- - -:::{#component} -::: - -## Details - -A modal is a dialog box that appears in front of the app. You can use modals to display messages, curate the user experience, or collect user input, like passwords and usernames. - -To create a modal, first assemble the components of the modal with [`ui.modal()`](https://shiny.posit.co/py/api/ui.modal.html) and save them to an object. Then call [`ui.modal_show()`](https://shiny.posit.co/py/api/ui.modal_show.html) on the object to display the modal. - -Typically, you will want to create a reactive effect to call `ui.modal_show()` whenever a particular event occurs. For example, the reactive effect below will open a modal whenever the value of `input.show()` changes. - -```python -@reactive.Effect -@reactive.event(input.show) -def _(): - m = ui.modal( #<< - "This is a somewhat important message.", - title="Somewhat important message", - easy_close=True - ) - ui.modal_show(m) -``` - -## Modal contents - -To add elements to a modal, pass them as unnamed arguments to `ui.modal()`. Modals can contain any UI elements recognized by Shiny. - -Modals come in four sizes: small (`'s'`), medium (`'m'`) (the default), large (`'l'`), and extra-large (`'xl'`). Set the size of a modal with the `size` argument of `ui.modal()`. - -See Also:[Notifications](notifications.qmd) provide a similar, but alternative way to display information to the user. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/display-messages/modal/app-core.py b/components/display-messages/modal/app-core.py new file mode 100644 index 00000000..fc554bbe --- /dev/null +++ b/components/display-messages/modal/app-core.py @@ -0,0 +1,20 @@ +from shiny import App, reactive, ui + +app_ui = ui.page_fixed( + ui.input_action_button("show", "Show modal dialog"), +) + + +def server(input, output, session): + @reactive.effect + @reactive.event(input.show) + def _(): + m = ui.modal( # << + "This is a somewhat important message.", # << + title="Somewhat important message", # << + easy_close=True, # << + ) # << + ui.modal_show(m) # << + + +app = App(app_ui, server) diff --git a/components/display-messages/modal/app-detail-preview.py b/components/display-messages/modal/app-detail-preview.py new file mode 100644 index 00000000..f3fc6157 --- /dev/null +++ b/components/display-messages/modal/app-detail-preview.py @@ -0,0 +1,22 @@ +## file: app.py +from shiny import App, reactive, ui + +app_ui = ui.page_fluid( + ui.input_action_button("show", "Show modal dialog"), +) + + +def server(input, output, session): + @reactive.effect + @reactive.event(input.show) + def _(): + m = ui.modal( + "This is a somewhat important message.", + title="Somewhat important message", + easy_close=True, + footer=ui.modal_button("Dismiss"), + ) + ui.modal_show(m) + + +app = App(app_ui, server) diff --git a/components/display-messages/modal/app-express.py b/components/display-messages/modal/app-express.py new file mode 100644 index 00000000..4dc26571 --- /dev/null +++ b/components/display-messages/modal/app-express.py @@ -0,0 +1,15 @@ +from shiny import reactive +from shiny.express import ui, input + +ui.input_action_button("show", "Show modal dialog") + + +@reactive.effect +@reactive.event(input.show) +def show_important_message(): + m = ui.modal( # << + "This is a somewhat important message.", # << + easy_close=True, # << + footer=None, # << + ) # << + ui.modal_show(m) diff --git a/components/display-messages/modal/app-preview.py b/components/display-messages/modal/app-preview.py new file mode 100644 index 00000000..36976d2a --- /dev/null +++ b/components/display-messages/modal/app-preview.py @@ -0,0 +1,21 @@ +from shiny import App, Inputs, Outputs, Session, reactive, ui + +app_ui = ui.page_fluid( + ui.input_action_button("show", "Show modal dialog"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input: Inputs, output: Outputs, session: Session): + @reactive.effect + @reactive.event(input.show) + def _(): + m = ui.modal( + "This is a somewhat important message.", + easy_close=True, + footer=None, + ) + ui.modal_show(m) + + +app = App(app_ui, server) diff --git a/components/display-messages/modal/app-variation-modal-core.py b/components/display-messages/modal/app-variation-modal-core.py new file mode 100644 index 00000000..68cc4121 --- /dev/null +++ b/components/display-messages/modal/app-variation-modal-core.py @@ -0,0 +1,27 @@ +from shiny import App, reactive, ui + +app_ui = ui.page_fixed(ui.input_action_button("login", "Login to database")) + + +def server(input, output, session): + @reactive.effect + @reactive.event(input.login) + def _(): + m = ui.modal( # << + ui.input_text("name", "Username:"), + ui.input_password("password", "Password:"), + ui.input_action_button("connect", "Connect"), + title="Database Credentials", # << + easy_close=True, # << + footer=None, # << + ) # << + ui.modal_show(m) + + @reactive.effect # << + @reactive.event(input.connect) # << + def __(): # << + ui.modal_remove() # << + # Code to connect with input.name() and input.password() #<< + + +app = App(app_ui, server) diff --git a/components/display-messages/modal/app-variation-modal-express.py b/components/display-messages/modal/app-variation-modal-express.py new file mode 100644 index 00000000..1b8d505c --- /dev/null +++ b/components/display-messages/modal/app-variation-modal-express.py @@ -0,0 +1,25 @@ +from shiny import reactive +from shiny.express import input, ui + +ui.input_action_button("login", "Login to database") + + +@reactive.effect +@reactive.event(input.login) +def show_login_modal(): + m = ui.modal( # << + ui.input_text("name", "Username:"), + ui.input_password("password", "Password:"), + ui.input_action_button("connect", "Connect"), + title="Database Credentials", # << + easy_close=True, # << + footer=None, # << + ) # << + ui.modal_show(m) + + +@reactive.effect # << +@reactive.event(input.connect) # << +def connect_to_databaset(): # << + ui.modal_remove() # << + # Code to connect with input.name() and input.password() #<< diff --git a/components/display-messages/modal/index.qmd b/components/display-messages/modal/index.qmd new file mode 100644 index 00000000..0e5ff794 --- /dev/null +++ b/components/display-messages/modal/index.qmd @@ -0,0 +1,94 @@ +--- +title: Modal +sidebar: components +appPreview: + file: components/display-messages/modal/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/display-messages/modal/ + contents: + - title: Preview + file: app-detail-preview.py + height: 400 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDOFGIVOANzgAdCI2ZsuPLHAAe6Ma1Z8BQkQFdORbuiMUFCk1nOWA+hKnkHAI0sVyACjlgOpADufkR+AMrsQcgwpAAmUAA2yLGciaQA5n4AlNYQCgACYs4ycOp0dHCSBUWSJeqylN72FFgBgTkQsXB0KkEO-ILCUJQO8LpQ6XDeWYgKyPPRyAC8yLYx8Qne8wDEyAA8e3MLx34AKlx6nHpQbMxwgexQIgOGwyJjrBOlITv7hxDHY7iVi4BzEBKkVhwJanBhGOBEZC7A5HQHIOikUhUBhLABy5ARvxRAIWWSJ-2OaziiQcbW8MA6hFQFFw6AQKDAVA0FDAAF8ALpAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnCIBXTgB0IGjOgD6q5AF5kqnFADmcHXU4APOABMAFBuSvjnLN3TKKOmXPIdACMfCnJnMA5SAHc1QmQ4gGV2GOQYUnsoABtke05s0jM4gEoCDWKNSoh7ODo2OAZFBkcvHyJSH28KIlY4VlZOcmLEFzcAASl-BTgsWro4WVHXCelZadnFShaILqwo6IqIN1za5B1HYaXjtMN3LHTMrMdXAGJkAB53q+u3OIAVLisPhAqBsZhwaLsKAifiCYRQShpPqscwzOJEZBvT7fH7IOQULJwAxJcGQ6F8ARCCgIkTwfqo9GvD5fI6447SVi4HTELKkXoGP4MZRKJnY1k-YqillskwPbI6faOGCSzHMqpaTC3cToRzaPScHoNJqHeJgCi4dAIFBmuA2ChgAC+AF0gA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.modal + href: https://shiny.posit.co/py/api/ui.modal.html + signature: ui.modal(*args, title=None, footer=MISSING, size='m', easy_close=False, + fade=True, **kwargs) + - title: ui.modal_show + href: https://shiny.posit.co/py/api/ui.modal_show.html + signature: ui.modal_show(modal, session=None) + - title: ui.modal_remove + href: https://shiny.posit.co/py/api/ui.modal_remove.html + signature: ui.modal_remove(session=None) + - title: ui.modal_button + href: https://shiny.posit.co/py/api/ui.modal_button.html + signature: ui.modal_button(label, icon=None, **kwargs) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/display-messages/modal/ + contents: + - title: Modal for authentication + description: Place inputs inside a modal to collect, and then login with, database + credentials. + apps: + - title: Preview + file: app-variation-modal-core.py + height: 500 + - title: Express + file: app-variation-modal-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDOFGIVOANzgAdCI2ZsuPLHAAe6Ma1Z8BQkd3QBXCkROcFCy1mNmA+hKnkHAIzMVyACjlgANqQA5tx+RH4AMsHcyF7IACZQFFBuUKzyYACU1hAKAAJizjJw6nR0cJL5hZLF6rKU3vYUWIEhENkQ8XB0KqQA7g6t3A4wpIn+3pmICsizyCwAvMi2o+PeswDEyAA82zNzB7ZNDlQaFL6QsBnhYACq6QzQ8NNZBPsHs0cQphQO6GmsPpCeIXf66IEMeJhZB+AAKAIh8RemTeEA+cy+PycNVcHgoXggFzIEAgFQo0L8AGFyKTKq93h8pBR-HAFn4ACJJFJpODISliLqUThQfysaHILa7BkHcSsXAOYiBdILAAqDBMcCIEp2ezR6OQdFIpCoDAWADlyJrNjqGZlrVK9Z9OFhViKHBx+t4YB0cgVxDVZKVypJ7bq-UVA3B6ucmlhibSKHbtQ6uj142STqQHIlkql0ucpqGGSsxm6xKNZJMi47tdSurFSMh0yG+pwKOw+N8zFgnnAq1BOp2fjgEcCqxsHYRUBRcOgECgwKcKGAAL4AXSAA + - title: Core + file: app-variation-modal-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnCIBXTgB0IGjOgD6q5AF5kqnFADmcHXU4APOABMAFCe7plFHTLnkdAI3cU5I5qYAA2pGbcIUQhADIR3MiByPZQFFC+UKxwIQCUuRqFEPZwdGxwDIoMjq7uRKTubhRE2aysnOS5iBrIvcgAAlJeCnBYpXRwsj19g9KyI2OKlDUQTVjhkRAFEH0ppcg6jl3Tu70sRiYwpKmhjr0AxMgAPE8np7suq+46VDYUwZBYDlCMgQgBVbIMaDwbpgXIEN7vXqfJo6dBZVgAdyEThC6La2IY9mioLAAAUMYT7LD4YikSjvsMfP4KIEIACyBAIJMKCSQgBhcjcqZwhE7JG7OQUUJwAwhAAiaQyWTgyH5UhKlE4UFCrBJyEeLzp72krFwOmI4WyBgAKgxlEoHs9XuKJb06KRSFQGAYAHLkR0G53G5C5J1G12nS7XHU6DikTGOGDbN6zYaKMZ0CaycMu3Zp+YZuBLf61ChYTnCihhoMR3YlMo6Q5dXMh6M3HRSK6KI6tyO7R6CkpJUjISs85CYzgUdh8L7l6FwXtQYpztb4rE43v3CNFbSGMSYRzaPScFoVKrbEFgCi4dAIFA3uB-MAAXwAukA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A modal is a dialog box that appears in front of the app. You can use modals to display messages, curate the user experience, or collect user input, like passwords and usernames. + +To create a modal, first assemble the components of the modal with [`ui.modal()`](https://shiny.posit.co/py/api/ui.modal.html) and save them to an object. Then call [`ui.modal_show()`](https://shiny.posit.co/py/api/ui.modal_show.html) on the object to display the modal. + +Typically, you will want to create a reactive effect to call `ui.modal_show()` whenever a particular event occurs. For example, the reactive effect below will open a modal whenever the value of `input.show()` changes. + +```python +@reactive.Effect +@reactive.event(input.show) +def _(): + m = ui.modal( #<< + "This is a somewhat important message.", + title="Somewhat important message", + easy_close=True + ) + ui.modal_show(m) +``` + +## Modal contents + +To add elements to a modal, pass them as unnamed arguments to `ui.modal()`. Modals can contain any UI elements recognized by Shiny. + +Modals come in four sizes: small (`'s'`), medium (`'m'`) (the default), large (`'l'`), and extra-large (`'xl'`). Set the size of a modal with the `size` argument of `ui.modal()`. + +See Also: [Notifications](../notifications/index.qmd) provide a similar, but alternative way to display information to the user. + +## Variations + +:::{#variations} +::: diff --git a/components/display-messages/notifications.qmd b/components/display-messages/notifications.qmd deleted file mode 100644 index 2c3a0e49..00000000 --- a/components/display-messages/notifications.qmd +++ /dev/null @@ -1,230 +0,0 @@ ---- -title: "Notifications / Help Text" -sidebar: components -previewapp: | - from shiny import App, reactive, ui - from pathlib import Path - appdir = Path(__file__).parent - app_ui = ui.page_fillable( - ui.include_css(appdir / "styles.css"), - ui.input_action_button("show", "Show Notification"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, - ) - - def server(input, output, session): - ids: list[str] = [] - n: int = 0 - - @reactive.Effect - @reactive.event(input.show) - def _(): - nonlocal ids - nonlocal n - # Save the ID for removal later - id = ui.notification_show("Message " + str(n), duration=None) - ids.append(id) - n += 1 - - @reactive.Effect - @reactive.event(input.remove) - def _(): - nonlocal ids - if ids: - ui.notification_remove(ids.pop()) - - app = App(app_ui, server) - - ## file: styles.css - #shiny-notification-panel { max-width: 100%; } -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Notifications - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDUxfGOGLqmVkdMuaR0AI28yUicwdmIAdzV8JliAZTZopgA5YjkaDkIof00wAEo8DQKNDTs4GlY4OkU6B09vCWJvLzIJFjgWFg5SAsQyiFcmAAEpPwU4DABRGho4WWdXMelZSYw4RXIGiDaMSKjSodcKqp0HfqXhlwgDACYr65MIDI4snLydA6dj6+uaWIAFU4LCYUQ41msTDsHBY2mkdCYUBoFERIAgAF9qiQIHYWBhYhJHn8XHZlHRcr1bppftcjlp0IZROgHNo9BwOjU6gUwBiALpAA - height: 200px - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("show", "Show Notification"), - ) - - def server(input, output, session): - - @reactive.Effect - @reactive.event(input.show) - def _(): - n=2 - ui.notification_show( #<< - f"This will disappear after {n} seconds.", #<< - duration=n #<< - ) - - app = App(app_ui, server) - relevantfunctions: - - title: ui.notification_show - href: https://shiny.posit.co/py/api/ui.notification_show.html - signature: ui.notification_show(ui, *, action=None, duration=5, close_button=True, id=None, type='default', session=None) - - title: ui.notification_remove - href: https://shiny.posit.co/py/api/ui.notification_remove.html - signature: ui.notification_remove(id, *, session=None) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Warning notification - description: Set `type="warning"` to create a warning-colored notification. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDUxfGOGLqmVkdMuaR0AI28yUicwdmIAdzV8JliAZTZopgB1KDoILjNYgEo8DVyNDTs4GlY4OkU6B09vCWJvLzIJFjgWFg5SXMRiiFcmAAEpPwU4DABRGho4WWdXYelZMYw4RXJaiGaMSKii-tdS8p0HHvmBlwgDACZzi5MIYjkaDkIofwgdXYcmAGIAHn+dwurhosQAKpwWEwohxrNYmHYOCxtNI6EwoDQKOiQBAAL4VEgQOwsDCxCQAoEHEEDOzKOjvLpXCAFak0lxkbCoOAGWJRDJZCA5MCU4GufZadCGUToBzaPQcVqVaq5MB4gC6QA - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("show", "Show Warning"), - ) - - def server(input, output, session): - - @reactive.Effect - @reactive.event(input.show) - def _(): - n=2 - ui.notification_show( - f"This will disappear after {n} seconds.", - duration=n, - type="warning" #<< - ) - - app = App(app_ui, server) - - - title: Error notification - description: Set `type="error"` to create an error-colored notification. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDUxfGOGLqmVkdMuaR0AI28yUicwdmIAdzV8JliAZTZopgBROgY6WIBKPA1sjQ07OBpWODpFOgdPbwliby8yCRY4FhYOUmzEQohXJgABKT8FOAxUmho4WWdXQelZEYw4RXJqiEaMSKiC3tdi0p0HLpm+lwgDACYT05MIYjkaDkIofwgdLadd09OaWIAVTgsJhRDjWaxMOwcFjaaR0JhQGgUOEgCAAXzKJAgdhYGFieS+3z2yjoLw65wg+MJpzI2FQcAMsXKmViTAAxAAednXPo7LToQyidAObR6DjNcqVbJgVEAXSAA - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("show", "Show Error"), - ) - - def server(input, output, session): - - @reactive.Effect - @reactive.event(input.show) - def _(): - n=2 - ui.notification_show( - f"This will disappear after {n} seconds.", - duration=n, - type="error" #<< - ) - - app = App(app_ui, server) - - - title: Replace/update a notification - description: Assign a notification an `id` to replace any existing notification with the same `id`. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDUxfGOGLqmVkdMuaR0AI28yUicwdmIAdzV8JliAZTZopgA5YjkaDkIof00wAEo8DQKNDTs4GlY4OkU6B09vCWJvLzIJFjgWFg5SAsQyiFcmAAEpPwU4DABRGho4WWdXMelZSYw4RXIGiDaMSKjSodcKqp0HfqXhlxMIDI4snLydA6dj6+uaWIBNFqZCazZADWcDsTDIbDgTCSKWCZFCQxAjTI+2SUQuAF9wXwuhhYhIrh8Tso6LlehADOkIEpCUTeHYDLF4N1zHBYrTXEctOhDKJ0A5tHoOB0anUCmAMQBdIA - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("show", "Show Notification"), - ) - - def server(input, output, session): - - @reactive.Effect - @reactive.event(input.show) - def _(): - ui.notification_show( - f"You clicked the Show button {input.show()} times.", - duration=None, - # compare to what happens if you comment out the line below #<< - id="message" #<< - ) - - app = App(app_ui, server) - - - title: Track and remove notifications - description: Track notifications, and use `ui.notification_remove()` to remove notifications one at a time. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDUxfGOGLqmVkdMuaR0AI28yUicwdmIAdzV8JliAZTZopgA5YjkaDkIof00wAEo8Z1cTT29fWQ4A4LJQiHCpGGJFWIlYgCU4ZsU0jI4snLzYoo0CjQ07OBpWODpFOgdysgliby8V2ZYWaogCxBKXDjsWRCZrDhYyYCu6AF1DJmA7w6YIM65hIwAGCYhXJgAASkfgUcAwAFEaDQ4LJXsDpFVFBg4IpyEsIBsMJEouN-q4pjMdA59q8ARBSNZiDlrLwTmTXBSIFSaW8GS4AMRMBJQXpkNhwJgASQAIkwaIJJN0WlBadZcnN2XTHiYKZlsrldjoceEALJwbbmQWxJgAalYZEWewkdmUdE1pAM6QgcDxAIBxxYGG0lEcxzd7pc-1NRgAjH8AQjQcioTC4fiXFGkeDUZQyBisU0Wq7XoSmMTSQn3UyWbK6SwlQNywci4GXKr+oMHRAdFnFEsTlhiKgSXitOhHmIe9o9BwJCw5gsCmAAL53IA - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("show", "Show Notification"), - ui.input_action_button("remove", "Remove Notification"), - ) - - def server(input, output, session): - ids: list[str] = [] - n: int = 0 - - @reactive.Effect - @reactive.event(input.show) - def _(): - nonlocal ids - nonlocal n - # Save the ID for removal later - id = ui.notification_show("Message " + str(n), duration=None) - ids.append(id) - n += 1 - - @reactive.Effect - @reactive.event(input.remove) - def _(): - nonlocal ids - if ids: - ui.notification_remove(ids.pop()) #<< - - app = App(app_ui, server) - - - title: Help Text - description: "[`ui.help_text()`](https://shiny.posit.co/py/api/ui.help_text.html) creates stylized help text which can be added to the user interface to provide additional explanation or context. [Tooltips](tooltips.qmd) provides a similar, but alternative way to display information to the user." - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDUxfGOGLqmVkdMuaR0AI28yUicwdmIAdzV8JliAZTZopgA5YjkaDkIof00wAEo8Z1cTT29fWQ4A4LJQiHCpGGJFWIlYgCU4ZsU0jI4snLzYoo0CjQ07OBpWODpFOgdysgliby8V2ZYWaogCxBKXDjsWRCZrDhYyYCu6AF1DJmA7w6YIM65hIwAGCYhXJgAASkfgUcAwAFEaDQ4LJXsDpFVFBg4IpyEsIBsMJEouN-q4pjMdA59q8ARBSNZiDlrLwTmTXBSIFSaW8GS4AMRMBJQXpkNhwJgASQAIkwaIJJN0WlBadZcnN2XTHiYKZlsrldjoceEALJwbbmQWxJgAalYZEWewkdmUdE1pAM6QgcDxAIBxxYGG0lEcxzd7pc-1NRgAjH8AQjQcioTC4fiXFGkeDUZQyBisU0Wq7XoSmMTSQn3UyWbK6SwlQNywci4GXKr+oMHRAdFnFEsTlhiKgSXitOhHmIe9o9BwJCw5gsCmAAL53IA - height: 200px - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.input_action_button("show", "Show help text"), - ) - - def server(input, output, session): - # ui.help_text() is only a ui component - pass - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details - -A notification is a message that appears near the bottom corner of the app. Notifications normally disappear after a short period of time, and should multiple notifications appear together, they will stack on top of one another. - -To create a notification, call [`ui.notification_show()`](https://shiny.posit.co/py/api/ui.notification_show.html). Typically, you will want to create a reactive effect to call `ui.show_notification()` whenever a particular event occurs. For example, the reactive effect below will create a notification whenever the value of `input.show()` changes. - -```{.python} -@reactive.Effect -@reactive.event(input.show) -def _(): - ui.notification_show("You've been notified.") -``` - -You can call [`ui.notification_remove()`](https://shiny.posit.co/py/api/ui.notification_remove.html) to remove a notification programatically, but usually app developers will let notifications expire on their own. Also, notifications come by default with a button that the user can click to close the notification prematurely. - -## Duration - -By default, Shiny notifications will disappear after five seconds. To change how long a notification appears for, set the `duration` argument of `ui.notification_show()` to an integer number of seconds. Set `duration` to `None` to have the notification appear until the user closes it. - -## Type - -Shiny notifications come in three types: messages, warnings and errors. To set the type of a notification, use the `type` argument of `ui.notification_show()`. - -See Also: Modal messages](modal.qmd) provide a similar, but alternative way to display information to the user. - -:::{#variations} -::: diff --git a/components/display-messages/notifications/app-core.py b/components/display-messages/notifications/app-core.py new file mode 100644 index 00000000..38523ea5 --- /dev/null +++ b/components/display-messages/notifications/app-core.py @@ -0,0 +1,24 @@ +from shiny import App, reactive, ui + +types = ["default", "message", "warning", "error"] + +app_ui = ui.page_fluid( + ui.input_radio_buttons("type", "Notification Type", types, inline=True), + ui.input_action_button("show", "Show Notification"), +) + + +def server(input, output, session): + @reactive.effect + @reactive.event(input.show) + def _(): + type_txt = "notification" if input.type() == "default" else input.type() + + ui.notification_show( + f"This {type_txt} will disappear after 2 seconds.", + type=input.type(), + duration=2, + ) + + +app = App(app_ui, server) diff --git a/components/display-messages/notifications/app-express.py b/components/display-messages/notifications/app-express.py new file mode 100644 index 00000000..6e986dfc --- /dev/null +++ b/components/display-messages/notifications/app-express.py @@ -0,0 +1,18 @@ +from shiny import reactive +from shiny.express import input, ui + +types = ["default", "message", "warning", "error"] + +ui.input_radio_buttons("type", "Notification Type", types, inline=True) +ui.input_action_button("show", "Show Notification") + + +@reactive.effect +@reactive.event(input.show) +def show_notification(): + type_txt = "notification" if input.type() == "default" else input.type() + ui.notification_show( + f"This {type_txt} will disappear after 2 seconds.", + type=input.type(), + duration=2, + ) diff --git a/components/display-messages/notifications/app-preview.py b/components/display-messages/notifications/app-preview.py new file mode 100644 index 00000000..94eef7e9 --- /dev/null +++ b/components/display-messages/notifications/app-preview.py @@ -0,0 +1,37 @@ +from shiny import App, reactive, ui +from pathlib import Path + +appdir = Path(__file__).parent +app_ui = ui.page_fillable( + ui.include_css(appdir / "styles.css"), + ui.input_action_button("show", "Show Notification"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + ids: list[str] = [] + n: int = 0 + + @reactive.Effect + @reactive.event(input.show) + def _(): + nonlocal ids + nonlocal n + # Save the ID for removal later + id = ui.notification_show("Message " + str(n), duration=None) + ids.append(id) + n += 1 + + @reactive.Effect + @reactive.event(input.remove) + def _(): + nonlocal ids + if ids: + ui.notification_remove(ids.pop()) + + +app = App(app_ui, server) + +## file: styles.css +# shiny-notification-panel { max-width: 100%; } diff --git a/components/display-messages/notifications/app-variation-replace-update-a-notification-core.py b/components/display-messages/notifications/app-variation-replace-update-a-notification-core.py new file mode 100644 index 00000000..2093f19f --- /dev/null +++ b/components/display-messages/notifications/app-variation-replace-update-a-notification-core.py @@ -0,0 +1,20 @@ +from shiny import App, reactive, ui + +app_ui = ui.page_fluid( + ui.input_action_button("show", "Show Notification"), +) + + +def server(input, output, session): + @reactive.Effect + @reactive.event(input.show) + def show_or_update_notification(): + ui.notification_show( + f"You clicked the Show button {input.show()} times.", + duration=None, + # compare to what happens if you comment out the line below + id="message", + ) + + +app = App(app_ui, server) diff --git a/components/display-messages/notifications/app-variation-replace-update-a-notification-express.py b/components/display-messages/notifications/app-variation-replace-update-a-notification-express.py new file mode 100644 index 00000000..06c50c92 --- /dev/null +++ b/components/display-messages/notifications/app-variation-replace-update-a-notification-express.py @@ -0,0 +1,15 @@ +from shiny import reactive +from shiny.express import input, ui + +ui.input_action_button("show", "Show Notification") + + +@reactive.effect +@reactive.event(input.show) +def show_or_update_notification(): + ui.notification_show( + f"You clicked the Show button {input.show()} times.", + duration=None, + # compare to what happens if you comment out the line below + id="message", + ) diff --git a/components/display-messages/notifications/app-variation-track-and-remove-notifications-core.py b/components/display-messages/notifications/app-variation-track-and-remove-notifications-core.py new file mode 100644 index 00000000..0e5d1b10 --- /dev/null +++ b/components/display-messages/notifications/app-variation-track-and-remove-notifications-core.py @@ -0,0 +1,33 @@ +from shiny import App, reactive, ui + +app_ui = ui.page_fluid( + ui.input_action_button("show", "Show Notification"), + ui.input_action_button("remove", "Remove Notification"), +) + + +def server(input, output, session): + ids: list[str] = [] + n: int = 0 + + @reactive.Effect + @reactive.event(input.show) + def _(): + nonlocal ids + nonlocal n + # Save the ID for removal later + id = ui.notification_show( + f"Notification {n}", duration=None, close_button=False + ) + ids.append(id) + n += 1 + + @reactive.Effect + @reactive.event(input.remove) + def _(): + nonlocal ids + if ids: + ui.notification_remove(ids.pop()) + + +app = App(app_ui, server) diff --git a/components/display-messages/notifications/app-variation-track-and-remove-notifications-express.py b/components/display-messages/notifications/app-variation-track-and-remove-notifications-express.py new file mode 100644 index 00000000..e1545fe3 --- /dev/null +++ b/components/display-messages/notifications/app-variation-track-and-remove-notifications-express.py @@ -0,0 +1,27 @@ +from shiny import reactive +from shiny.express import input, ui + +ui.input_action_button("show", "Show Notification") +ui.input_action_button("remove", "Remove Notification") + +ids: list[str] = [] +n: int = 0 + + +@reactive.Effect +@reactive.event(input.show) +def _(): + global ids + global n + # Save the ID for removal later + id = ui.notification_show("Message " + str(n), duration=None) + ids.append(id) + n += 1 + + +@reactive.Effect +@reactive.event(input.remove) +def _(): + global ids + if ids: + ui.notification_remove(ids.pop()) diff --git a/components/display-messages/notifications/index.qmd b/components/display-messages/notifications/index.qmd new file mode 100644 index 00000000..c106232b --- /dev/null +++ b/components/display-messages/notifications/index.qmd @@ -0,0 +1,100 @@ +--- +title: Notifications +sidebar: components +appPreview: + file: components/display-messages/notifications/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/display-messages/notifications/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDOFGIVOANzgAdCI2ZsuPLHAAe6Ma1Z8BQkd3QBXCkROcFCirnRw9AXmTA5YACZw6UEwBsKbkRu8LpQAObyhMhuAO5QDBDcYYHRYHAMTAxuALrWEJZYxmYA+gxQ7pykxQBGZhTkrAAUbrb2KW4AcqRSdJzEUFLkyAAqdpFErQ5E3L7ccI7DDCZwAJQKBUUUxRKDEDV15M1gHKQx7WAAyuynyF09fQOVEG5rz28AAmI7MnDqdHRwSQKT7iSQ-dSySiNTZYE4xV6eOgqU7FCDdTi9fq7RorRAKZAE5CTYoUDQiZxuNH3LFPNx8JEwyY45COCkeLw+fx0uC+VhwPgQUwULBM16E5AFKkYh67Ypw5oQcXiuhuYZcPQgYmkigAX2QMU4vl8yAqrAw9niyCgdCoDGQACY2IDyO5WFhAvilQTJo5GWMcQRPV73CYyrtHPbA4rCa8omBJrR45oKGAddkgA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnCIBXTgB0IGirnRxWyALzJgasABM4dKMoA2FU0VPxWrKAHM4D5KYDuUBhDcbl6mcAxMDKYAuhoaGOgA+qqGyKo47nAJdDaqZgAUGshFqZxY3OjKFAkMUGacpAkARpUU5KwFYNq6IWAAcqRydJzEUHLkyAAqOp6EyF16RNw23HAGEwzKcACUBIXFaeWVCTJjEE0t5B0cpD49AMrsN8j9g8Oj9ZpgOxpbsZoQFjobDCigYeUOFCIpEqFUhwJcHy2iD2RQAAlITgo4FhLHQ4LIUch0dJZFicYpKOCILCsNcfL8IMVkIDkAk8kjCUz5gkKAAPERGUwQAacIYjU6mPhAiFYebswyC8yWax2SVwGysOB8amVWXTdl-JlMtLC17ij4JOkFRlG210UwTLj6EDcvkUAC+yB8nBsNmZnFcmGkDGQUDoVBDACZgWQAawsA5Oba5tMDDK5d8bcnimZlDVTgZI7ss0aGX94ilxOg8vEkpwiJqGKCGbNOtNaJ04PywO6okA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/display-messages/notifications/ + contents: + - title: ui.notification_show + href: https://shiny.posit.co/py/api/ui.notification_show.html + signature: ui.notification_show(ui, *, action=None, duration=5, close_button=True, + id=None, type='default', session=None) + - title: ui.notification_remove + href: https://shiny.posit.co/py/api/ui.notification_remove.html + signature: ui.notification_remove(id, *, session=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/display-messages/notifications/ + contents: + - title: Replace/update a notification + description: 'Assign a notification an `id` to replace any existing notification + with the same `id`. In the example below, a persistant notification is created + with `duration=None` and updated each time you click the notification button. + + ' + apps: + - title: Preview + file: app-variation-replace-update-a-notification-core.py + - title: Express + file: app-variation-replace-update-a-notification-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDOFGIVOANzgAdCI2ZsuPLHAAe6Ma1Z8BQkd3QBXCkROcFCy1mNmA+hKnkHAIzMVyACjlgOpADufkR+AMrsQcgAcqRSdJzEUC4QfgCU1qkQAAJizjJw6nR0cJIKueKSBeqylN72FFgBgRkQACZwdCpBDkIOJuhtyXAOEHGcCUkp3mmICsgLyLZj8YnJnK7NvhCLu8h0fgCapCbIxAA2iQDWcG3IFOxwyBFRHhReOyANTZGBMwC+934cFYWBC8z2CzaJgY63IAF5YhA4AQIZCAMRnZjoKBie6kZCBdjJZDEzDUPQTZC4E5YmDwSjIE4iB5PS7I5BuODnIJovacNrwvzwXRQADm8kIfNahFQFFw6AQKDAVA0FDA-wAukA + - title: Core + file: app-variation-replace-update-a-notification-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnCIBXTgB0IGjOgD6q5AF5kqnFADmcHXQA2qgCYAKDchfHOWbumUUdMueR0AI28KcicwDlIAdzVCZFiAZXZo5AA5Ujk6TmIof00wAEoCDQKNMog7ODo2OAZFBgdPbyJSby8KIlY4VlZOcgLEZ1cAASk-BTgsAFE6OjhZIZdR6VkJrDhFSkaIdqxIqNKIV2RK6v2dIT10O1zLCAzOLJy8hwHF47cse8zs3L6IHT7JxHD6guixACarWQxGs2QA1nA7MgKOw4MgkilghRQkcQE0KHtklFXgBfFH8bpYWLFEGg452ZQMP7kAzpCBKd705AAYhhzHQUCkKNIyCi7FyyAlmGorD41Vw0LIMHglGQrREqPRcI5yECcGs0S59M4dgMsXgPXMcBpxpch3K2kMYkwDm0ek4nVq9UOcTAFFw6AQKH9cAAHhQwKSALpAA + - title: Track and remove notifications + description: Track notifications, and use `ui.notification_remove()` to remove + notifications one at a time. + apps: + - title: Preview + file: app-variation-track-and-remove-notifications-core.py + height: 225 + - title: Express + file: app-variation-track-and-remove-notifications-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDOFGIVOANzgAdCI2ZsuPLHAAe6Ma1Z8BQkd3QBXCkROcFCy1mNmA+hKnkHAIzMVyACjlgOpADufkR+AMrsQcgAcqRSdJzEUC4QfgCUNpx2EKYUTpKcrh4UXhC+YGIwpLIhyH4ASnBVsjFxnAlJKenWEJwAJqwoADacrBTAYwwAusgAvMjAUwoQKNwi8wAMPQoAAmLOMnBYAKJ0dHCSu-sFsuqylN72FFgBgRkQfXB0yA7eaYgKZBA5AAcyGpDcUCGfAGgOBYIhUOQqQgwOQAGJkGEoC0KOw4MgAJIAEWQdCEoia1SRQ2ScAYcKB-TmyFsEDaHWShQgDle5QAsnBdFAQQS-MgANRsCgMbwQNJEPomBhc8izWIQODvNH9VhYDDoah9R59bXA1ES+YARm2ED24huR1O50uduuUlucHuFEeOTMWEq1S1Ck+31+-0ZoPBkOhusj7Rhg0jaLZHMSqp5gdkJr1gnQf3ehFQFFwhtoYCoGgoYAAvlMgA + - title: Core + file: app-variation-track-and-remove-notifications-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnCIBXTgB0IGjOgD6q5AF5kqnFADmcHXQA2qgCYAKDchfHOWbumUUdMueR0AI28KcicwDlIAdzVCZFiAZXZo5AA5Ujk6TmIof00wAEoCZ1cTT29fWU4A4IpQiHCpGFJFWKJYgCU4ZsU0jM4snLzYoo0CjQmIOzg6NjgGRQYHcooiUm8vVbnWVmqIAsQSl047VhRrTlYKYCuGAF1DZGA7o+QIFG4RIwAGSddkAACUj8CjgWAAonQ6HBZK8gdIqoosHBFJRlhBNlhIlFxhB-tNZjoHAdXv8IORrKQctY+KdSa5yRBKdS3vSXABiZAJKC9CjsODIACSABFkHQhMgmi0oDTrLl5mzaY8TOTMtlcnsdNinHj-nqXHRYuk1UM9sgQBAAL5tZB2ZQMDXkAzpCBKZDESmsSy1eoGABiMq9itx+uOpyw2mojhOIdDeIA1EYAIx-VzwkFIyHQ2G6lzpxFglHUCjozFSxSxlwE5BEkm5vWM5ky2msRUDFuHeuhtxYVUDdV5HTluDLcOCdDE3GTbSPcQT7R6ThEL0Lea4uJgCi4dAIFCbuAADwoYEtdyAA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A notification is a message that appears near the bottom corner of the app. Notifications normally disappear after a short period of time, and should multiple notifications appear together, they will stack on top of one another. + +To create a notification, call [`ui.notification_show()`](https://shiny.posit.co/py/api/ui.notification_show.html). Typically, you will want to create a reactive effect to call `ui.show_notification()` whenever a particular event occurs. For example, the reactive effect below will create a notification whenever the value of `input.show()` changes. + +```{.python} +@reactive.Effect +@reactive.event(input.show) +def _(): + ui.notification_show("You've been notified.") +``` + +You can call [`ui.notification_remove()`](https://shiny.posit.co/py/api/ui.notification_remove.html) to remove a notification programatically, but usually app developers will let notifications expire on their own. Also, notifications come by default with a button that the user can click to close the notification prematurely. + +## Duration + +By default, Shiny notifications will disappear after five seconds. To change how long a notification appears for, set the `duration` argument of `ui.notification_show()` to an integer number of seconds. Set `duration` to `None` to have the notification appear until the user closes it. + +## Type + +Shiny notifications come in four types: default, messages, warnings and errors. To set the type of a notification, use the `type` argument of `ui.notification_show()`. + +See Also: [Modal messages](../modal/index.qmd) provide a similar, but alternative way to display information to the user. + +:::{#variations} +::: diff --git a/components/display-messages/progress-bar.qmd b/components/display-messages/progress-bar.qmd deleted file mode 100644 index 38c0feef..00000000 --- a/components/display-messages/progress-bar.qmd +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: "Progress Bar" -sidebar: components -previewapp: | - import asyncio - - from shiny import App, reactive, render, ui - from pathlib import Path - appdir = Path(__file__).parent - app_ui = ui.page_fillable( - ui.include_css(appdir / "styles.css"), - ui.input_action_button("button", "Compute"), - ui.output_text("compute"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input, output, session): - @output - @render.text - @reactive.event(input.button) - async def compute(): - with ui.Progress(min=1, max=15) as p: - p.set(message="Calculation in progress", detail="This may take a while...") - - for i in range(1, 15): - p.set(i, message="Computing") - await asyncio.sleep(0.1) - - return "Done computing!" - - app = App(app_ui, server) - - ## file: styles.css - #shiny-notification-panel { max-width: 100%; } -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Progress Bar - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACKAZ2wkJuIB0IAgGaNiMFuwAWNCNhZ0GzFgEF0eFozhRCZGgDc46zRAAmcRuoCuNAQLSoA+tZYBeFtaxQA5nAdCANtYmABQCLOHuNBgyqJZkDtq6pA4ARnFkpKFgaWQZgvgsfGAAwmKxFEUAlHhhER7EceUOFAAeZFkk9HFwVTUQlbamcEIS5gaMwTFx6g1k5erscOzsvP2IteEAArPlGyybxmaMGK1kewdaOvpwGHAG5JMQ5Rg5eQMQEWyc3CxmI53lODBSrrD6fCIAdxoZEkkQwAAVRF5NMtgjAZC4AIzqGBQFpYgCslS+LFQoPBFNJGEW7Xgy28cBcRWKUH8hEs-igSQ+MlJSJR7CK6jMZCgNH8TLAABVpOwWLi5KKANZwNgsCHSfw3DAYKqDSngoRMeTyD6MKAQHzBbEsTFE8kGymYGmTHFLdgMyWlLq6S16sGO8FQCFi1gcLg8YjUrVwVDBAAMGEx7z2n00ZEsjA+RQAIqRVQC4jIvABCIqDeyuFToYL2Jw0BZjcyVMAAXwAukA - height: 200px - code: | - import asyncio - - from shiny import App, reactive, render, ui - - app_ui = ui.page_fluid( - ui.input_action_button("button", "Compute"), - ui.output_text("compute"), - ) - - def server(input, output, session): - @output - @render.text - @reactive.event(input.button) - async def compute(): - with ui.Progress(min=1, max=15) as p: - p.set(message="Calculation in progress", detail="This may take a while...") - - for i in range(1, 15): - p.set(i, message="Computing") - await asyncio.sleep(0.1) - - return "Done computing!" - - app = App(app_ui, server) - relevantfunctions: - - title: "ui.Progress" - href: https://shiny.posit.co/py/api/ui.Progress.html - signature: ui.Progress(self, min=0, max=1, session=None) - - title: "ui.Progress.close" - href: https://shiny.posit.co/py/api/ui.Progress.html - signature: ui.Progress.close(self) - - title: "ui.Progress.inc" - href: https://shiny.posit.co/py/api/ui.Progress.html - signature: ui.Progress.inc(self, amount=0.1, message=None, detail=None) - - title: "ui.Progress.set" - href: https://shiny.posit.co/py/api/ui.Progress.html - signature: ui.Progress.set(self, value=None, message=None, detail=None) - ---- - -:::{#component} -::: - -## Details - -With Shiny, you can display a progress bar while a computation runs by running the computation bar within a special computation manager. Here's how: - -1. Use [`ui.Progress()`](https://shiny.posit.co/py/api/ui.Progress.html) to create a computation manager, and use `with` to run the computation within the manager. For example, you might set up a progress bar like this: - -```{.python} -def compute(): - with ui.Progress(min=1, max=15) as p: - # computation -``` - -`ui.Progress()` creates a progress bar object that you can use to update the progress bar that is displayed during the computation. - -2. Set the minimum and maximum values of the progress bar when you call `ui.Progress()`. These provide the outer bounds for the progress to display. For example, in the code above, when the bar is at 1, it would appear empty. When it is at 8, it would appear half full. When it is at 15, it would appear complete. - -3. Update the progress bar object as the computation runs. Updating the object is simple: you can call its `set()` method to change the location of the progress bar, as well as the message it displays. For example the code below would update the progress bar above to half finished, and change the message that accompanies the bar to "Almost there!". - -```{.python} -p.set(8, message="Almost there") -``` - -Finding opportunities to update the bar while the computation runs is more tricky. To have a responsive bar, you will need to interlace `set()` calls with the computation that runs. If the computation is a function from an external package, you may only be able to alert the user when the computation begins and when it finishes, which is unlikely to be satisfying: - -```{.python} -async def compute(): -with ui.Progress(min=1, max=15) as p: - p.set(1, message="Here we go") - # computation() - p.set(15, message="Finished!") -``` - -If the computation involves separate functions run in sequence, you can update the progress bar after each function: - -```{.python} -async def compute(): -with ui.Progress(min=1, max=15) as p: - p.set(1, message="Here we go") - # computation1() - p.set(5, message="Working hard") - # computation2() - p.set(10, message="Almost there") - # computation3() - p.set(15, message="Finished!") -``` - -If the computation is a function that you have written, you can write the function to accept a progress bar object to update as it runs. \ No newline at end of file diff --git a/components/display-messages/progress-bar/app-core.py b/components/display-messages/progress-bar/app-core.py new file mode 100644 index 00000000..312a45a7 --- /dev/null +++ b/components/display-messages/progress-bar/app-core.py @@ -0,0 +1,26 @@ +import asyncio + +from shiny import App, reactive, render, ui + +app_ui = ui.page_fluid( + ui.input_action_button("button", "Compute"), + ui.output_ui("compute"), +) + + +def server(input, output, session): + @output + @render.ui + @reactive.event(input.button) + async def compute(): + with ui.Progress(min=1, max=15) as p: + p.set(message="Calculation in progress", detail="This may take a while...") + + for i in range(1, 15): + p.set(i, message="Computing") + await asyncio.sleep(0.1) + + return "Done computing!" + + +app = App(app_ui, server) diff --git a/components/display-messages/progress-bar/app-express.py b/components/display-messages/progress-bar/app-express.py new file mode 100644 index 00000000..09daca2a --- /dev/null +++ b/components/display-messages/progress-bar/app-express.py @@ -0,0 +1,19 @@ +import asyncio + +from shiny import reactive, render +from shiny.express import input, ui + +ui.input_action_button("do_compute", "Compute") + + +@render.ui +@reactive.event(input.do_compute) +async def compute(): + with ui.Progress(min=1, max=15) as p: + p.set(message="Calculation in progress", detail="This may take a while...") + + for i in range(1, 15): + p.set(i, message="Computing") + await asyncio.sleep(0.1) + + return "Done computing!" diff --git a/components/display-messages/progress-bar/app-preview.py b/components/display-messages/progress-bar/app-preview.py new file mode 100644 index 00000000..bc7a9e6d --- /dev/null +++ b/components/display-messages/progress-bar/app-preview.py @@ -0,0 +1,34 @@ +## file: app.py +import asyncio +from pathlib import Path + +from shiny import App, reactive, render, ui + +appdir = Path(__file__).parent +app_ui = ui.page_fillable( + ui.include_css(appdir / "styles.css"), + ui.input_action_button("button", "Compute"), + ui.output_text("compute"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + @output + @render.text + @reactive.event(input.button) + async def compute(): + with ui.Progress(min=1, max=15) as p: + p.set(message="Calculation in progress", detail="This may take a while...") + + for i in range(1, 15): + p.set(i, message="Computing") + await asyncio.sleep(0.1) + + return "Done computing!" + + +app = App(app_ui, server) + +## file: styles.css +# shiny-notification-panel { max-width: 100%; } diff --git a/components/display-messages/progress-bar/index.qmd b/components/display-messages/progress-bar/index.qmd new file mode 100644 index 00000000..22fd4773 --- /dev/null +++ b/components/display-messages/progress-bar/index.qmd @@ -0,0 +1,92 @@ +--- +title: Progress Bar +sidebar: components +appPreview: + file: components/display-messages/progress-bar/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/display-messages/progress-bar/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5KAZ1wmLtIB0IggGbNSMZBwAWdCLmQMmrZMzhRiFOgDc4RVRAAmcZiLETps3FjgAPdKo4cFjFm1noArhSIe6gwb5Y7l4A+uqa5CEARl4U5AAU-GAGpCFkjF5wSURJAMLinlRJAJT+QhAAAvpGzFi+glVqGtpw1jqU8cEUWClpBZml0Fw8yEbCyOmFcPHFiILIC8gA7nQUUsiBAApiAOYOHPEwsgC8AIxEMFA2ZwCsxexO6HMQi6-I2BxwFIdwjlA7cGOeSgABtiB4QVAIi9ZO9dvtsqMvlA6CCgWAACoyJyXeQUKAAazg7GWMhBrSwWBKZTei2ELAUChezCgEAB8XOyFOd2etNpHy+nQuvw4-0BeX6mjZ1JefNeUCWKLYnG4vFIWA45Lg6HiAAYsKdBvNFqoKB5mC8kgARcjEyZeWQ7ACESUEhFQFFw6AQKDAVBsFDAAF8ALpAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5KAZ1wmLtIB0IggGbNSMZBwAWdCLmQMmrZAEFMRZnCjEKdAG5wN1ACZxmRAK51BgjOgD6V5AF5kVnFADmce8IA2VsYAFILIYW50WLLoFhT22rrk9gBGsRTkIWCpFOlChMj8YADC4jFUhQCUBKHh7qSxZY50mWSMsXCV1RAVNkIQpsKSZgbMQdGxRPUUZUQccBwcfN2INWEAAlNlq8hrmv1mWFbbu1o6+nBYcAaUYxBlWNm5PRDh7Fw8yAPIrWVwQRUrF6vcIAdzoFCkESwAAUxJ5NAsgjBZM4AIxEGBQAAeaIArBU3sh0IDgaSiVg5hQkfMOF44M5CkUoH5iBY-FBEi9ZES4QiOIUiKYKFA6H4GWAACoyDjITHyYUAazg7GQIJkfguWCwlV6ZOBwhYCgUL2YUAg3iC6OQqPxJL1ZOwlLGGJpdPFJTaunNOqB9uBUBBIrYnG4vFIFI1cHQQQADFhUc9tq9NBQLMwXoUACLkZU-WKyTwAQkKvVsmBcqkwQTsTVmwzMz3yYAouHQCBQzbgWIoYAAvgBdIA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/display-messages/progress-bar/ + contents: + - title: ui.Progress + href: https://shiny.posit.co/py/api/ui.Progress.html + signature: ui.Progress(self, min=0, max=1, session=None) + - title: ui.Progress.close + href: https://shiny.posit.co/py/api/ui.Progress.html + signature: ui.Progress.close(self) + - title: ui.Progress.inc + href: https://shiny.posit.co/py/api/ui.Progress.html + signature: ui.Progress.inc(self, amount=0.1, message=None, detail=None) + - title: ui.Progress.set + href: https://shiny.posit.co/py/api/ui.Progress.html + signature: ui.Progress.set(self, value=None, message=None, detail=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +With Shiny, you can display a progress bar while a computation runs by running the computation bar within a special computation manager. Here's how: + +1. Use [`ui.Progress()`](https://shiny.posit.co/py/api/ui.Progress.html) to create a computation manager, and use `with` to run the computation within the manager. For example, you might set up a progress bar like this: + +```{.python} +def compute(): + with ui.Progress(min=1, max=15) as p: + # computation +``` + +`ui.Progress()` creates a progress bar object that you can use to update the progress bar that is displayed during the computation. + +2. Set the minimum and maximum values of the progress bar when you call `ui.Progress()`. These provide the outer bounds for the progress to display. For example, in the code above, when the bar is at 1, it would appear empty. When it is at 8, it would appear half full. When it is at 15, it would appear complete. + +3. Update the progress bar object as the computation runs. Updating the object is simple: you can call its `set()` method to change the location of the progress bar, as well as the message it displays. For example the code below would update the progress bar above to half finished, and change the message that accompanies the bar to "Almost there!". + +```{.python} +p.set(8, message="Almost there") +``` + +Finding opportunities to update the bar while the computation runs is more tricky. To have a responsive bar, you will need to interlace `set()` calls with the computation that runs. If the computation is a function from an external package, you may only be able to alert the user when the computation begins and when it finishes, which is unlikely to be satisfying: + +```{.python} +async def compute(): +with ui.Progress(min=1, max=15) as p: + p.set(1, message="Here we go") + # computation() + p.set(15, message="Finished!") +``` + +If the computation involves separate functions run in sequence, you can update the progress bar after each function: + +```{.python} +async def compute(): +with ui.Progress(min=1, max=15) as p: + p.set(1, message="Here we go") + # computation1() + p.set(5, message="Working hard") + # computation2() + p.set(10, message="Almost there") + # computation3() + p.set(15, message="Finished!") +``` + +If the computation is a function that you have written, you can write the function to accept a progress bar object to update as it runs. diff --git a/components/display-messages/tooltips.qmd b/components/display-messages/tooltips.qmd deleted file mode 100644 index 9f7586b7..00000000 --- a/components/display-messages/tooltips.qmd +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: "Tooltips" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.tooltip( - ui.input_action_button("btn", "A button with a tooltip"), - "A message", - id="btn_tooltip" - ), - ui.output_text_verbatim("text"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input, output, session): - @render.text - def text(): - return "" - - app = App(app_ui, server) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Tooltips - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYGOGMsWIWyHVHYgPfjjFyoCmSaUIQepJoARsEuEHZgUWRq+EzKYCJMMWRxTADuHGRsTFBMLm4eqOkAlHj2fmkZTPAsLCZw6XU+DRzSuulJEJrl7p6d9X6oFmFw8OT9YHQcxmxk6fW1E-7EwUEhFAAeIQBuclFQHjAJh2tg1ar3ahCyNKxyp3Q2gcESO2R7EhYcFaHFI1UQ9QAAlJnnJnHAjvUXmUEWQbOCtg4pGQFHQfN8yBhBsNXKMvI91Og9KJ0DYNNoOID3nJqmAAL4AXSAA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.tooltip( #<< - ui.input_action_button("btn", "A button with a tooltip"), - "A message", #<< - id="btn_tooltip", #<< - placement="right" #<< - ), - ui.output_text_verbatim("text") - ) - - def server(input, output, session): - @render.text - def text(): - return input.btn_tooltip() #<< - - app = App(app_ui, server) - - relevantfunctions: - - title: ui.tooltip - href: https://shiny.posit.co/py/api/ui.tooltip.html - signature: ui.tooltip(trigger, *args, id=None, placement='auto', options=None, **kwargs) - - title: ui.update_tooltip - href: https://shiny.posit.co/py/api/ui.update_tooltip.html - signature: ui.update_tooltip(id, *args, show=None, session=None) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Update a tooltip message - description: Call `ui.update_tooltip()` to update the message of a tooltip with a given id. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAkBXDgB0IGtKgD6qpgF4mqrFADmcHTQA2qgCYAKDU2McMZYsWtzUTiC4DXDC5UZTIdGTlSHQAjMI8IJzAYsk18JjUwESY4sgSmAHcOMjYmKCYPLx9MgEo8Z0CMrKZ4FhZzOEz6-0aOOwNMlIgdSu8OVC6GwNRrGTh4cgGwOg4zNjJMhrqGkzJzFgwYugdtnt39w+PTlxMQsIjZDmjchKShvVQ7KAoupoBVT7fOAVTxjVAtOBtDq1DQ1DQaOxwGisOB0RTHO5kCTEMKhLEotpPCA1RBTJgAASkkQUcAwAFEaDQ4LIyZTpI9FBg4IpyA5MYdUh8vhQ4T0XIjkToTqSxY0SORKMIjH5GqqmtlMkwANRNJoYABWxC4DmAmQAcnSAOqamiCJg6Xj+OhQCAWPkQPEC4bKQEUE41AC6NW1uta7Qsm1lgVFZMCJh9wssox8b0FyfGv3lFHIEnYxAKBgAKnRlHAY9B0IZROgHNo9Bxc6j0TUwABfANAA - code: | - from shiny import App, reactive, ui - - app_ui = ui.page_fluid( - ui.tooltip( - ui.input_action_button("btn", "A button with a tooltip"), - "A message", - id="btn_tooltip", - placement="right" - ), - ui.tags.br(), - ui.tags.br(), - ui.input_action_button("btn_update", "Update tooltip message") - ) - - def server(input, output, session): - @reactive.Effect - @reactive.event(input.btn_update) - def _(): - content = ( - "A " + " ".join(["NEW" for _ in range(input.btn_update())])+ " message" - ) - - ui.update_tooltip("btn_tooltip", content, show=True) #<< - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details - -A tooltip is a box that appears next to an element when a user hovers over the element. To add a tooltip to a UI component, wrap the component in [`ui.tooltip()`](https://shiny.posit.co/py/api/ui.tooltip.html). Then pass `ui.tooltip()` one or more elements to display, such as a simple string that contains a message. - -Optionally assign the tooltip an `id` to trigger reactions when the tooltip becomes visible or to programmatically update the contents of the tooltip as your user navigates the app. A boolean that describes whether or not the tooltip is visible will be accessible as a reactive variable within the server function as `input.()`. - -Control the placement of the tooltip relative to the item it highlights with the `placement` argument. `placement` defaults to `'auto'`, but can be set to one of `'top'`, `'bottom'`, `'left'`, or `'right'`. - -## Accessibility of Tooltip Triggers - -Because the user needs to interact with the `trigger` element to see the `tooltip`, it's best practice to use an element that is typically accessible via keyboard interactions, like a button or a link. - -If you use a non-interactive element, like a `` or text, `tooltip()` will automatically add the `tabindex="0"` attribute to the trigger element to make sure that users can reach the element with the keyboard. This means that in most cases you can use any element you want as the trigger. - -One place where it's important to consider the accessibility of the trigger is when using an icon without any accompanying text. In these cases, many icon elements are created with the assumption that the icon is decorative, which will make it inaccessible to users of assistive technologies. - -When using an icon as the primary trigger, ensure that the icon does not have `aria-hidden="true"` or `role="presentation"` attributes. Icon packages typically provide a way to specify a title for the icon, as well as a way to specify that the icon is not decorative. The title should be a short description of the purpose of the trigger, rather than a description of the icon itself. - -For example: - -```{.python} -icon_title = "About tooltips" -def bs_info_icon(title: str): - # Enhanced from https://rstudio.github.io/bsicons/ via `bsicons::bs_icon("info-circle", title = icon_title)` -return ui.HTML(f'') - -ui.tooltip( - bs_info_icon(icon_title), - "Text shown in the tooltip." -) -``` - -```{.python} -icon_title = "About tooltips" -def fa_info_circle(title: str): - # Enhanced from https://rstudio.github.io/fontawesome/ via `fontawesome::fa("info-circle", a11y = "sem", title = icon_title)` -return ui.HTML(f'') - -ui.tooltip( - fa_info_circle(icon_title), - "Text shown in the tooltip." -) -``` - -Compare tooltips to [popovers](https://shiny.posit.co/py/api/ui.popover.html), which are a similar device for organizing the layout of a Shiny app. - -See Also: [Modal messages](modal.qmd) and [notications](notifications.qmd) provide a similar, but alternative way to display information to the user. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/display-messages/tooltips/app-core.py b/components/display-messages/tooltips/app-core.py new file mode 100644 index 00000000..d62f8f45 --- /dev/null +++ b/components/display-messages/tooltips/app-core.py @@ -0,0 +1,20 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.tooltip( # << + ui.input_action_button("btn", "A button with a tooltip"), + "A message", # << + id="btn_tooltip", # << + placement="right", # << + ), + ui.output_text_verbatim("text"), +) + + +def server(input, output, session): + @render.text + def text(): + return f"Tooltip state: {input.btn_tooltip()}" # << + + +app = App(app_ui, server) diff --git a/components/display-messages/tooltips/app-express.py b/components/display-messages/tooltips/app-express.py new file mode 100644 index 00000000..d289ac03 --- /dev/null +++ b/components/display-messages/tooltips/app-express.py @@ -0,0 +1,21 @@ +# FIXME: Rewrite as an Express app +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.tooltip( # << + ui.input_action_button("btn", "A button with a tooltip"), + "A message", # << + id="btn_tooltip", # << + placement="right", # << + ), + ui.output_text_verbatim("text"), +) + + +def server(input, output, session): + @render.text + def text(): + return input.btn_tooltip() # << + + +app = App(app_ui, server) diff --git a/components/display-messages/tooltips/app-preview.py b/components/display-messages/tooltips/app-preview.py new file mode 100644 index 00000000..df9ae2b2 --- /dev/null +++ b/components/display-messages/tooltips/app-preview.py @@ -0,0 +1,11 @@ +from shiny import render +from shiny.express import input, ui + +with ui.tooltip(id="btn_tooltip", placement="right"): # << + ui.input_action_button("btn", "A button with a tooltip") # << + "The tooltip message" # << + + +@render.text +def btn_tooltip_state(): + return f"Tooltip state: {input.btn_tooltip()}" # << diff --git a/components/display-messages/tooltips/app-variation-update-a-tooltip-message-core.py b/components/display-messages/tooltips/app-variation-update-a-tooltip-message-core.py new file mode 100644 index 00000000..c6979175 --- /dev/null +++ b/components/display-messages/tooltips/app-variation-update-a-tooltip-message-core.py @@ -0,0 +1,21 @@ +from shiny import App, reactive, ui + +app_ui = ui.page_fluid( + ui.tooltip( + ui.input_action_button("btn", "A button with a tooltip"), + "A message", + id="btn_tooltip", + placement="right", + ), + ui.input_text("tooltip_msg", "Tooltip message", "Change me!").add_class("mt-4"), +) + + +def server(input, output, session): + @reactive.effect + @reactive.event(input.tooltip_msg) + def update_tooltip_msg(): + ui.update_tooltip("btn_tooltip", input.tooltip_msg(), show=True) + + +app = App(app_ui, server) diff --git a/components/display-messages/tooltips/app-variation-update-a-tooltip-message-express.py b/components/display-messages/tooltips/app-variation-update-a-tooltip-message-express.py new file mode 100644 index 00000000..c2838bd2 --- /dev/null +++ b/components/display-messages/tooltips/app-variation-update-a-tooltip-message-express.py @@ -0,0 +1,15 @@ +from shiny import reactive +from shiny.express import input, ui + +with ui.tooltip(id="btn_tooltip", placement="right"): + ui.input_action_button("btn", "A button with a tooltip") + "The tooltip message" + + +ui.input_text("tooltip_msg", "Tooltip message", "Change me!").add_class("mt-4") + + +@reactive.effect() +@reactive.event(input.tooltip_msg) +def update_tooltip_msg(): + ui.update_tooltip("btn_tooltip", input.tooltip_msg(), show=True) diff --git a/components/display-messages/tooltips/index.qmd b/components/display-messages/tooltips/index.qmd new file mode 100644 index 00000000..f0727571 --- /dev/null +++ b/components/display-messages/tooltips/index.qmd @@ -0,0 +1,107 @@ +--- +title: Tooltips +sidebar: components +appPreview: + file: components/display-messages/tooltips/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/display-messages/tooltips/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQGJkAxASQA0BZAURQCU4B3AE4BLKsigBncRGScAHukFwJUjOgA6EAGaDSMZBIAWwiLmTCY6UoIrIAgpiJKIAEziCiAV2GbNagPreyAC8yN44UADmcP5aADbeLgAUmshpYcJYFKSkcRTC6ElpDAA8JanpleEm6J4U-lDE+eT+AEZ12RApYK0UEOqEyAN2yO0Uncj8oobiyNm5+RpgAJQEFZVpw8jwKlFwA0TIpeUyG2nCLsEDvRD+83kFB8XIZesb6HGNcPCUV2AikUMFCeRxeJ0qqze4VIdVq9SocnqADd3K0oPkYN0EcCVmsIMtfP1XHAtAZ3CjBEkanUiDCKHCiBJlBJhORlog3gABZxuQRZOCIt5uUnYpLst6VJQUTyCGTUihYG53HIPQrLZ6vIl+TAheyYJIBbyM8nuAkQQZgCi4dAIFCWgUUMAAXwAukA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLBVKkLFTuhsOAxMgAeAPtHUMNudAUKTShiT3JNACMo1wg7MESKNUJkZTBRZGSKVOQAd04KdmQoZFd3T3Q8gEoCENCHPIL4VlYTODyiZH8gtvbOaV08zIhNOo8vAb9A4Ih2x3QLWLh4SkmwBk5jdgpFoeXRltHDUijI6KoAD2iANzlEqE8YdMeTsEuIJqqIEQWR0NhyV4MGwRKJEG4UO5EVhwHqcchNRCjAACUhBchccCeo1BtUJFBsGNGoSkFAUDFWdDyABU3PN0GwKB84CgQDCKFhprNWQ0KQBfPJLEZqaUaPRiTA2DTaThIiFyQEQHJgCi4dAIFDaslgUUAXSAA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/display-messages/tooltips/ + contents: + - title: ui.tooltip + href: https://shiny.posit.co/py/api/ui.tooltip.html + signature: ui.tooltip(trigger, *args, id=None, placement='auto', options=None, + **kwargs) + - title: ui.update_tooltip + href: https://shiny.posit.co/py/api/ui.update_tooltip.html + signature: ui.update_tooltip(id, *args, show=None, session=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/display-messages/tooltips/ + contents: + - title: Update a tooltip message + description: Call `ui.update_tooltip()` to update the message of a tooltip with + a given id. + apps: + - title: Preview + file: app-variation-update-a-tooltip-message-core.py + - title: Express + file: app-variation-update-a-tooltip-message-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDOFGIVOANzgAdCI2ZsuPLHAAe6Ma1Z8BQkd3QBXCkROcFCgO6cK7ZJawVSpADZT0ACk4ATAF45MAAjCggAfVcPL2CidHcJOHhKILAGTgBzdgpggEpEBWRip04sYzMIiSlyCJCzVwhvYLCIOORggEFkeopG5DsHZChkaM9OdHyikuCAFXY4Ubdx9GR4XShM+TBrNohnCooozQpmsDGvCJhWTPa55a81uA2tu7AAYXYoCC2ngEJ8lgoH4-BFiIldGcYBQALQAFimewUAAExNUZHB1HQ6HBJN48ii0ZIMepZJRfBBTBQXA8JlcbgSIH44HQnOg-FAqFFaeh6Zl8YUICVSlgTOzOXBuTEJmdWlKVu1DjTpbzrvy8kQOKQbAFZgwTHBGYRUBRcOgEChzicwABfAC6QA + - title: Core + file: app-variation-update-a-tooltip-message-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnCIBXTgB0IGjOgD6q5AF5kqnFADmcHXQA2qgCYAKDchfHOWCqVLW56JxFdAtyxudGUKHRk5ch0AI3DPCCcwWIpNQmQ1MFFkeIpE5AB3Tgp2ZChkT29fLIBKAmcglyyc+FZWczgshoCmvjsDLNSIHSqfTnRuxqb0axk4eEpBsAZOM3YKKd6Xeung0PDRuAAPCmSx3x0YVjNuzLAAFS9x9GQ2jos7rIBhdigICxvOAAQjqWCgdjsOmIc3ayRgFAAtAAWOo9WoaTEQOxwOhsOAMRQMBwHChEUjhMJk-HtTjkWqIPYAASkUQUcCwuLocFkzNZsnZnMUlBJECpHmel2uZgx22QOLxynQdigVFGkomVxuDgZe0CJiVKrVFwmyWG6uqEzupIllt00p1RA4pEKBgeDGUcFlWO0hjEmAc2j0nCdBKJsoyYAouHQCBQUZOFDAAF8ALpAA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A tooltip is a box that appears next to an element when a user hovers over the element. To add a tooltip to a UI component, wrap the component in [`ui.tooltip()`](https://shiny.posit.co/py/api/ui.tooltip.html). Then pass `ui.tooltip()` one or more elements to display, such as a simple string that contains a message. + +Optionally assign the tooltip an `id` to trigger reactions when the tooltip becomes visible or to programmatically update the contents of the tooltip as your user navigates the app. A boolean that describes whether or not the tooltip is visible will be accessible as a reactive variable within the server function as `input.()`. + +Control the placement of the tooltip relative to the item it highlights with the `placement` argument. `placement` defaults to `'auto'`, but can be set to one of `'top'`, `'bottom'`, `'left'`, or `'right'`. + +## Accessibility of Tooltip Triggers + +Because the user needs to interact with the `trigger` element to see the `tooltip`, it's best practice to use an element that is typically accessible via keyboard interactions, like a button or a link. + +If you use a non-interactive element, like a `` or text, `tooltip()` will automatically add the `tabindex="0"` attribute to the trigger element to make sure that users can reach the element with the keyboard. This means that in most cases you can use any element you want as the trigger. + +One place where it's important to consider the accessibility of the trigger is when using an icon without any accompanying text. In these cases, many icon elements are created with the assumption that the icon is decorative, which will make it inaccessible to users of assistive technologies. + +When using an icon as the primary trigger, ensure that the icon does not have `aria-hidden="true"` or `role="presentation"` attributes. Icon packages typically provide a way to specify a title for the icon, as well as a way to specify that the icon is not decorative. The title should be a short description of the purpose of the trigger, rather than a description of the icon itself. + +For example: + +```{.python} +icon_title = "About tooltips" +def bs_info_icon(title: str): + # Enhanced from https://rstudio.github.io/bsicons/ via `bsicons::bs_icon("info-circle", title = icon_title)` +return ui.HTML(f'') + +ui.tooltip( + bs_info_icon(icon_title), + "Text shown in the tooltip." +) +``` + +```{.python} +icon_title = "About tooltips" +def fa_info_circle(title: str): + # Enhanced from https://rstudio.github.io/fontawesome/ via `fontawesome::fa("info-circle", a11y = "sem", title = icon_title)` +return ui.HTML(f'') + +ui.tooltip( + fa_info_circle(icon_title), + "Text shown in the tooltip." +) +``` + +Compare tooltips to [popovers](https://shiny.posit.co/py/api/ui.popover.html), which are a similar device for organizing the layout of a Shiny app. + +See Also: [Modal messages](../modal/index.qmd) and [notications](../notifications/index.qmd) provide a similar, but alternative way to display information to the user. + +:::{#variations} +::: diff --git a/components/index.qmd b/components/index.qmd index 74a853f9..4758973f 100644 --- a/components/index.qmd +++ b/components/index.qmd @@ -9,27 +9,29 @@ resources: - _partials/animation.lottie format: html: - css: + css: - _partials/components.css - _partials/components-list.css code-overflow: wrap -listing: +listing: - id: input type: grid template: _partials/components-list.ejs - contents: - - ../../components/inputs/*.qmd + contents: + - inputs/*/*.qmd - id: output type: grid template: _partials/components-list.ejs - contents: - - ../../components/outputs/*.qmd + contents: + - outputs/*/*.qmd - id: display-message type: grid template: _partials/components-list.ejs - contents: - - ../../components/display-messages/*.qmd + contents: + - display-messages/*/*.qmd --- + + :::::::: {.column-screen-inset .mx-auto style="max-width: 1300px;"} :::::: {.grid .hero-area .my-md-0 .my-5} @@ -44,7 +46,7 @@ Shiny Components :::: {.g-col-md-5 .g-col-10 .g-start-4 .components-hero-img-container}
- +
@@ -110,4 +112,4 @@ Provide feedback to your user with notifications, progress bars, and confirmatio :::::: :::::::: - \ No newline at end of file + diff --git a/components/inputs/action-button.qmd b/components/inputs/action-button.qmd deleted file mode 100644 index e8fd75fb..00000000 --- a/components/inputs/action-button.qmd +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: "Action Button" -sidebar: components -previewapp: | - from shiny import App, reactive, render, ui - app_ui = ui.page_fluid( - ui.input_action_button("action_button", "Action"), - ui.output_text("counter"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - def server(input, output, session): - @output - @render.text() - @reactive.event(input.action_button) - def counter(): - return f"" - app = App(app_ui, server) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Action Button - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAlSIAEzh0JAVw4AdCPrSoA+jqYBeJjqxQA5nGM0ANjtUAKfUy9WOGBgHcPCG8QnwwSFxgINwA2bV8uVC0yYxk5UmMAI2SyUg8UWQ4M7LJcg3wmXTAASQhCKSgWOCYAOS0YTI0qgEpuvE9Qr2sI9ui4sOJkpJSKAA8yfJItci6wbowoVVVjQidGlnzVDhZUPewAWgBWJg7zgAYevoHBkCrd-arESrB5NnOARjudyYACstCw5DQLiQVuRzoRKBQ6EwoE4OLYIOcOBQYCx4YiNExULMrlUAL79YLedabbbvFgHKpzMj4lZ0Hr6br6blqOA0VgaRR0NyJZISSZkaYSJoMooQbqIZ5MJbkCySaSFRQYABqqK0cDcdy5BipXgAAg1NXAMABRGg0OCyJUWjVyLVwRTkEUQaYbQrFHKkY0hdT84xuBVKkIqsgYJoLGMRpgAaiY-2NzpU6joGGZStDysmbIjitNoSkZC0dGCNCqIET3TJVR5hnQarEqDcRlMHGlgo0xrAZIAukA - height: 200px - code: | - from shiny import App, reactive, render, ui - - app_ui = ui.page_fluid( - ui.input_action_button("action_button", "Action"), #<< - ui.output_text("counter") - ) - - def server(input, output, session): - @render.text() - @reactive.event(input.action_button) - def counter(): - return f"{input.action_button()}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_action_button - href: https://shiny.posit.co/py/api/ui.input_action_button.html - signature: ui.input_action_button(id, label, *, icon=None, width=None, **kwargs) - - title: reactive.event - href: https://shiny.posit.co/py/api/reactive.event.html - signature: reactive.event(*args, ignore_none=True, ignore_init=False) - ---- - -:::{#component} -::: - -## Details - -An action button appears as a button and has a value that increments each time the user presses the button. - -Follow these steps to add an action button to your app: - - 1. Add `ui.input_action_button()` to the UI of your app to create an action button. Where you call this function will determine where the button will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_action_button()` to define the button's identifier and label. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of an action button: - - 1. Use `input.` (e.g., `input.action_button()`) to access the value of the action button. The server value of an action button is an integer representing the number of clicks. - -See also: [Action Link](action-link.qmd) - - - diff --git a/components/inputs/action-button/app-core.py b/components/inputs/action-button/app-core.py new file mode 100644 index 00000000..11de75ef --- /dev/null +++ b/components/inputs/action-button/app-core.py @@ -0,0 +1,16 @@ +from shiny import App, reactive, render, ui + +app_ui = ui.page_fluid( + ui.input_action_button("action_button", "Action"), # << + ui.output_text("counter"), +) + + +def server(input, output, session): + @render.text() + @reactive.event(input.action_button) + def counter(): + return f"{input.action_button()}" + + +app = App(app_ui, server) diff --git a/components/inputs/action-button/app-detail-preview.py b/components/inputs/action-button/app-detail-preview.py new file mode 100644 index 00000000..1dc19196 --- /dev/null +++ b/components/inputs/action-button/app-detail-preview.py @@ -0,0 +1,26 @@ +## file: app.py +from shiny import App, reactive, render, ui + +app_ui = ui.page_fluid( + ui.row( + ui.column(6, ui.input_action_button("action_button", "Increase Number")), + ui.column(6, ui.output_text("counter").add_class("display-5 mb-0")), + {"class": "vh-100 justify-content-center align-items-center px-5"}, + ).add_class("text-center") +) + + +def server(input, output, session, starting_value=0): + count = reactive.Value(starting_value) + + @reactive.Effect + @reactive.event(input.action_button) + def _(): + count.set(count() + 1) + + @render.text + def counter(): + return f"{count()}" + + +app = App(app_ui, server) diff --git a/components/inputs/action-button/app-express.py b/components/inputs/action-button/app-express.py new file mode 100644 index 00000000..81f2e08e --- /dev/null +++ b/components/inputs/action-button/app-express.py @@ -0,0 +1,11 @@ +from shiny import reactive, render +from shiny.express import input, ui + + +ui.input_action_button("action_button", "Action") # << + + +@render.text() +@reactive.event(input.action_button) +def counter(): + return f"{input.action_button()}" diff --git a/components/inputs/action-button/app-preview.py b/components/inputs/action-button/app-preview.py new file mode 100644 index 00000000..59760a52 --- /dev/null +++ b/components/inputs/action-button/app-preview.py @@ -0,0 +1,18 @@ +from shiny import App, reactive, render, ui + +app_ui = ui.page_fluid( + ui.input_action_button("action_button", "Action"), + ui.output_text("counter"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + @output + @render.text() + @reactive.event(input.action_button) + def counter(): + return "" + + +app = App(app_ui, server) diff --git a/components/inputs/action-button/index.qmd b/components/inputs/action-button/index.qmd new file mode 100644 index 00000000..acb46220 --- /dev/null +++ b/components/inputs/action-button/index.qmd @@ -0,0 +1,52 @@ +--- +title: Action Button +sidebar: components +appPreview: + file: components/inputs/action-button/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/action-button/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDOFGIVOANzhExEACZwGAHQiNmbLjyxwAHujGtWfAUJHd0AVwpFrndU4gOsV2wH0JU8h4BGthTkABSqaJKcvgEUQRBhRGEAghHkYQCUyMgAxMgAPLnO6gACCsoMWFT6FMFpxWLeMnB6spTB7hRYDVGB5LVKcHTIZNaUKjWI6pmZYhTWDBDIdGEg7Z0pEP49EDUAvmHqhKgUuOgIKGCVFGA7ALpAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnEnUAJnAZEArpwA6EPRnQB9bcgC8ybTigBzOEboAbbSoAUe5J8ucs3dJoojGTlyIwAjAIpydzRZTlCIiij9QmQdMFE48nSASiJkAGJkAB5ijy8rUgD-QKoADwoYsk1KdVyCPRy9bog1OjZ1RQZXPwCiKooaolY4VlZ4iBzEcs8AASle9Sx6xq6IL2R16TjFLDhFShGIGqxghfDI8j2DvuRm1uGllYPkKQpNBj7OjpECjCi3LIQB5JaI5AC+6R6Bkw5jEmFchhMnGmg3Ue1SYAouHQCBQhLgDTAcIAukA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_action_button + href: https://shiny.posit.co/py/api/ui.input_action_button.html + signature: ui.input_action_button(id, label, *, icon=None, width=None, **kwargs) + - title: reactive.event + href: https://shiny.posit.co/py/api/reactive.event.html + signature: reactive.event(*args, ignore_none=True, ignore_init=False) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +An action button appears as a button and has a value that increments each time the user presses the button. + +Follow these steps to add an action button to your app: + + 1. Add `ui.input_action_button()` to the UI of your app to create an action button. Where you call this function will determine where the button will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_action_button()` to define the button's identifier and label. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of an action button: + + 1. Use `input.` (e.g., `input.action_button()`) to access the value of the action button. The server value of an action button is an integer representing the number of clicks. + +See also: [Action Link](../action-link/index.qmd) diff --git a/components/inputs/action-link.qmd b/components/inputs/action-link.qmd deleted file mode 100644 index 95477870..00000000 --- a/components/inputs/action-link.qmd +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "Action Link" -sidebar: components -previewapp: | - from shiny import App, reactive, render, ui - app_ui = ui.page_fluid( - ui.input_action_link("action_link", "Action"), - ui.output_text("counter"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - def server(input, output, session): - @output - @render.text() - @reactive.event(input.action_link) - def counter(): - return f"" - app = App(app_ui, server) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Action Link - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAlSIAEzh0JAVw4AdCPrSoA+jqYBeJjqxQA5nGM0ANjtUAKfUy9WOGBgHcPCG8QnwwSFxgINwA2bV8uVC0yYxk5UmMnLgBrDxRZDgysiGzdfCYygEkIQikoFjgmADktGAAjDTKASi68T1CvawjW6Liw4mSklIoADzI8ki1yTrAujChVVWNCJ3qWPNUOFlRd7ABaAFYmdrOABm7e-oGQMp29ssQKsHk2M4BGW63JgAKy0LDkNHOJGW5DOhEoFDoTCgWVsEDOHAoMBYcIRGiYqBmlzKAF8+sFvGsNls3ix9mVZmRccs6N19F19Jy1HAaKwNIo6G5EskJBMyFMJA06YUIF1EE8mItyBZJNICooMAA1FFaOBuW4cgwUrwAATq6rgGAAojQaHBZAqzWq5Bq4IpyEKIFN1gUijlDSF1LzjG45QqQkqyBgGvNI6GmABqJh-Q2OlTqOgYRkKoOKiYs0Py42hKRkLR0YI0MogONdEllLmGdAqsSoNxGUwcSX8jSGsAkgC6QA - height: 200px - code: | - from shiny import App, reactive, render, ui - - app_ui = ui.page_fluid( - ui.input_action_link("action_link", "Action"), #<< - ui.output_text("counter") - ) - - def server(input, output, session): - @render.text() - @reactive.event(input.action_link) - def counter(): - return f"{input.action_link()}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_action_link - href: https://shiny.posit.co/py/api/ui.input_action_link.html - signature: ui.input_action_link(id, label, *, icon=None, **kwargs) - - title: reactive.event - href: https://shiny.posit.co/py/api/reactive.event.html - signature: reactive.event(*args, ignore_none=True, ignore_init=False) - ---- - -:::{#component} -::: - -## Details - -An action link appears as a link in your app and has a value that increments each time the user presses the link. - -Follow these steps to add an action link to your app: - - 1. Add `ui.input_action_link()` to the UI of your app to create an action link. Where you call this function will determine where the link appears within the app's layout. - 2. Specify the `id` and `label` parameters of `ui.input_action_link()` to define the action link's identifier and label. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of an action link: - - 1. Use `input.` (e.g., `input.action_link()`) to access the value of the action link. The server value of an action link is an integer representing the number of clicks. - -See also: [Action Button](action-button.qmd) diff --git a/components/inputs/action-link/app-core.py b/components/inputs/action-link/app-core.py new file mode 100644 index 00000000..26204f4c --- /dev/null +++ b/components/inputs/action-link/app-core.py @@ -0,0 +1,22 @@ +from shiny import App, reactive, render, ui + +app_ui = ui.page_fluid( + ui.input_action_link("action_link", "Increase Number"), # << + ui.output_text("counter"), +) + + +def server(input, output, session): + count = reactive.value(0) + + @reactive.effect + @reactive.event(input.action_link) # << + def _(): + count.set(count() + 1) + + @render.text() + def counter(): + return f"{count()}" + + +app = App(app_ui, server) diff --git a/components/inputs/action-link/app-detail-preview.py b/components/inputs/action-link/app-detail-preview.py new file mode 100644 index 00000000..31de7999 --- /dev/null +++ b/components/inputs/action-link/app-detail-preview.py @@ -0,0 +1,26 @@ +## file: app.py +from shiny import App, reactive, render, ui + +app_ui = ui.page_fluid( + ui.row( + ui.column(6, ui.input_action_link("action_link", "Increase Number")), + ui.column(6, ui.output_text("counter").add_class("display-5 mb-0")), + {"class": "vh-100 justify-content-center align-items-center px-5"}, + ).add_class("text-center") +) + + +def server(input, output, session): + count = reactive.value(0) + + @reactive.effect + @reactive.event(input.action_link) + def _(): + count.set(count() + 1) + + @render.text() + def counter(): + return f"{count()}" + + +app = App(app_ui, server) diff --git a/components/inputs/action-link/app-express.py b/components/inputs/action-link/app-express.py new file mode 100644 index 00000000..164298f0 --- /dev/null +++ b/components/inputs/action-link/app-express.py @@ -0,0 +1,18 @@ +from shiny import reactive +from shiny.express import input, render, ui + +ui.input_action_link("action_link", "Increase Number") # << + + +count = reactive.value(0) + + +@reactive.effect +@reactive.event(input.action_link) +def _(): + count.set(count() + 1) + + +@render.text() +def counter(): + return f"{count()}" diff --git a/components/inputs/action-link/app-preview.py b/components/inputs/action-link/app-preview.py new file mode 100644 index 00000000..6f5063c0 --- /dev/null +++ b/components/inputs/action-link/app-preview.py @@ -0,0 +1,18 @@ +from shiny import App, reactive, render, ui + +app_ui = ui.page_fluid( + ui.input_action_link("action_link", "Action"), + ui.output_text("counter"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + @output + @render.text() + @reactive.event(input.action_link) + def counter(): + return "" + + +app = App(app_ui, server) diff --git a/components/inputs/action-link/index.qmd b/components/inputs/action-link/index.qmd new file mode 100644 index 00000000..2fc5393c --- /dev/null +++ b/components/inputs/action-link/index.qmd @@ -0,0 +1,51 @@ +--- +title: Action Link +sidebar: components +appPreview: + file: components/inputs/action-link/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/action-link/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDOFGIVOANzgAdCI2ZsuPLHAAe6Ma1Z8BQkd3QBXCkTEQAJnAZETnBQodZjZgPoSp5dwBtuANYAFHJokpw+-hABoUShAJIQxGJQrHDIAHImMABGtqEAlMjIAMTIADzlThAKZCaUyAC8ouLhsljSUL4mcEEADAXVCgACKW1w6nR0cJIjY1LtcLKUQW4UWF4REH6Bg9ZwdMjuQQWICsXFdZRYaRRBV3dFANTIAIx71aPUNgxYVBqPBQ2Q4PWwnM4QC4tCgmBiQuihEAPE4AX1CCkIqAouHQCBQYH+FDAKIAukA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnEnUAJnAZEArpwA6EPRnQB9bcgC8ybTigBzOEboAbbSoAUe5J8ucs3dJoojGTlyI0duAGt3NFlOUPCICJ1CZGSASQhiKShWOGQAOU0YACN1ZIBKImQAYmQAHjqPLytSAP9AqgAPCmiyTUoysEq9cr0xiDU6NnVFBlc-AKJWinaiXNZWOIhyxCbPPspzZGzYxSx5KGc4VwAGUf0IL2QAARO5M7g6OjhZPZe3hRwLBwRSUeYQdpYYJbMKRcqeWoNP6TZBGVw7P5PA4ULC5HrY9HIADUyAAjPc-q9VOosF0evcnijsep0btHk8vFIKJoGI86MkQATygBfZLjAyYI7idCuQwmThrGbqe4pMAUXDoBAoNVwbpgYUAXSAA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_action_link + href: https://shiny.posit.co/py/api/ui.input_action_link.html + signature: ui.input_action_link(id, label, *, icon=None, **kwargs) + - title: reactive.event + href: https://shiny.posit.co/py/api/reactive.event.html + signature: reactive.event(*args, ignore_none=True, ignore_init=False) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +An action link appears as a link in your app and has a value that increments each time the user presses the link. + +Follow these steps to add an action link to your app: + + 1. Add `ui.input_action_link()` to the UI of your app to create an action link. Where you call this function will determine where the link appears within the app's layout. + 2. Specify the `id` and `label` parameters of `ui.input_action_link()` to define the action link's identifier and label. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of an action link: + + 1. Use `input.` (e.g., `input.action_link()`) to access the value of the action link. The server value of an action link is an integer representing the number of clicks. + +See also: [Action Button](../action-button/index.qmd) diff --git a/components/inputs/checkbox-group.qmd b/components/inputs/checkbox-group.qmd deleted file mode 100644 index 62504575..00000000 --- a/components/inputs/checkbox-group.qmd +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: "Checkbox Group" -sidebar: components -previewapp: | - from shiny import App, render, req, ui - app_ui = ui.page_fluid( - ui.input_checkbox_group( - "checkbox_group", - "", - { - "a": "Watch me Whip", - "b": "Watch me Nae Nae", - "c": "Watch neither", - }, - ).add_class("mb-0"), - ui.output_text("value"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - def server(input, output, session): - @output - @render.text - def value(): - return "" - app = App(app_ui, server) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Checkbox Group - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EqQEcJAVw4AdaOgD6apgF4marFADmcbTQA2a6QApNTJ0Y4YuqFWW2E2cQgGsAI2IAD21TBhVUOyZHZ3j1Il8A4LCI4ijEiTj4p0SAYWSg0KZ0zPxYiFznEErq6sSoRMRYsBEsuvqEsEDm1oAhDpyu1sI+gqGq+oBfbKmnAEo5+OMMsg8vChCyBzAANygbOESlzRBEwisoFhZx-bYAWgBGAAYXpmkH6zgQpkOOUwQB4cCgwFgPQiUCh0JioEIPAAsiWmmgWmlkNFYcj2cjs7k8EjWGwkLDgNw4pAWiGGAAEiZ5aVIILI6BgtmRhhimAcjnYqcN4lIyCo6FUhmAMAArYhcPEQDYYHx+YppSLRBZorSoAyidB2NCoXQcEnYuQLMDTAC6QA - height: 200px - code: | - from shiny import App, render, req, ui - - app_ui = ui.page_fluid( - ui.input_checkbox_group( #<< - "checkbox_group", #<< - "Checkbox group", #<< - { #<< - "a": "A", #<< - "b": "B", #<< - "c": "C", #<< - }, #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return ", ".join(input.checkbox_group()) - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_checkbox_group - href: https://shiny.posit.co/py/api/ui.input_checkbox_group.html - signature: ui.input_checkbox_group(id, label, choices, *, selected=None, inline=False, width=None) - ---- - -:::{#component} -::: - -## Details - -A checkbox group creates a group of checkboxes that can be used to toggle multiple choices independently. - -Follow these steps to display a checkbox group in your app: - - 1. Add `ui.input_checkbox_group()` to the UI of your app to create a checkbox group. Where you call this function will determine where the checkbox group will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_checkbox_group()` to define the identifier and label of the checkbox group. - - 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_checkbox_group()` uses the dictionary keys as the checkbox values and the dictionary values as the checkbox labels. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a checkbox group: - - 1. Use `input.()` (e.g., `input.checkbox_group()`) to access the value of a checkbox group. The server value of a checkbox group is a tuple of string(s) with the selected value(s). - -See also: [Checkbox](checkbox.qmd) \ No newline at end of file diff --git a/components/inputs/checkbox-group/app-core.py b/components/inputs/checkbox-group/app-core.py new file mode 100644 index 00000000..7299b3e5 --- /dev/null +++ b/components/inputs/checkbox-group/app-core.py @@ -0,0 +1,23 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_checkbox_group( # << + "checkbox_group", # << + "Checkbox group", # << + { # << + "a": "A", # << + "b": "B", # << + "c": "C", # << + }, # << + ), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return ", ".join(input.checkbox_group()) + + +app = App(app_ui, server) diff --git a/components/inputs/checkbox-group/app-detail-preview.py b/components/inputs/checkbox-group/app-detail-preview.py new file mode 100644 index 00000000..3e68eb10 --- /dev/null +++ b/components/inputs/checkbox-group/app-detail-preview.py @@ -0,0 +1,26 @@ +## file: app.py +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_checkbox_group( + "checkbox_group", + "Checkbox group", + { + "a": "A", + "b": "B", + "c": "C", + }, + ), + ui.output_text("value"), + {"class": "vh-100 d-flex align-items-center px-4"}, +) + + +def server(input, output, session): + @output + @render.text + def value(): + return ", ".join(input.checkbox_group()) + + +app = App(app_ui, server) diff --git a/components/inputs/checkbox-group/app-express.py b/components/inputs/checkbox-group/app-express.py new file mode 100644 index 00000000..8452b7ce --- /dev/null +++ b/components/inputs/checkbox-group/app-express.py @@ -0,0 +1,18 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_checkbox_group( # << + "checkbox_group", # << + "Checkbox group", # << + { # << + "a": "A", # << + "b": "B", # << + "c": "C", # << + }, # << +) # << + + +@render.text +def value(): + return ", ".join(input.checkbox_group()) diff --git a/components/inputs/checkbox-group/app-preview.py b/components/inputs/checkbox-group/app-preview.py new file mode 100644 index 00000000..c8e4668c --- /dev/null +++ b/components/inputs/checkbox-group/app-preview.py @@ -0,0 +1,25 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_checkbox_group( + "checkbox_group", + "", + { + "a": "Watch me Whip", + "b": "Watch me Nae Nae", + "c": "Watch neither", + }, + ).add_class("mb-0"), + ui.output_text("value"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + @output + @render.text + def value(): + return "" + + +app = App(app_ui, server) diff --git a/components/inputs/checkbox-group/index.qmd b/components/inputs/checkbox-group/index.qmd new file mode 100644 index 00000000..36c8f4c3 --- /dev/null +++ b/components/inputs/checkbox-group/index.qmd @@ -0,0 +1,52 @@ +--- +title: Checkbox Group +sidebar: components +appPreview: + file: components/inputs/checkbox-group/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/checkbox-group/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6xdnGIBrAEalVdgOZND6AApkZABiZAAecNlg4OkwR2d3Tx8-dDiiUIioiBjkOIBhJ1cPVWRfUn904LDI6JiQaqy63Ni0OJQ4gEEqzNqclta3drywACEemuyB1uJhgomm-uCAXwzJ2QBKRr7LAAExCEkGLCpVCllJOmQANygAG0M4AI3EZtE4CkMGHKq4rAArUjcAK2ChYBLFZLlfzPDayQioCi4dAIFBgU4UMDLAC6QA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm4uzjEA1gCNSAA9NYyYFdBsHAGJkAB44+0dk5TAvHwDg0PD0VKJkWISk5IdUgGFvP0Cg5DDSCLyY+MSIEscQJqLWtpLUqFSUVNFGgubintKwfwHkVIAhEcKWiZS0mfLFse62gF98pfGASn2t5MN6ijcPKiCKOzAANygrOFTj1UPVL4hZOjY5B5yGyudxEC5XIisOCsVicciHRDjAACUh+ciwNwo41+yCeLxsCPGySkFAUDFajVSWAAVqRuMCIFcsOkqlk6hECZ81NyNHoxJgbBptJxIQC5FzCKgKLh0AgUGBMWAdgBdIA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_checkbox_group + href: https://shiny.posit.co/py/api/ui.input_checkbox_group.html + signature: ui.input_checkbox_group(id, label, choices, *, selected=None, inline=False, + width=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A checkbox group creates a group of checkboxes that can be used to toggle multiple choices independently. + +Follow these steps to display a checkbox group in your app: + + 1. Add `ui.input_checkbox_group()` to the UI of your app to create a checkbox group. Where you call this function will determine where the checkbox group will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_checkbox_group()` to define the identifier and label of the checkbox group. + + 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_checkbox_group()` uses the dictionary keys as the checkbox values and the dictionary values as the checkbox labels. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a checkbox group: + + 1. Use `input.()` (e.g., `input.checkbox_group()`) to access the value of a checkbox group. The server value of a checkbox group is a tuple of string(s) with the selected value(s). + +See also: [Checkbox](../checkbox/index.qmd) diff --git a/components/inputs/checkbox.qmd b/components/inputs/checkbox.qmd deleted file mode 100644 index 66c82ebd..00000000 --- a/components/inputs/checkbox.qmd +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: "Checkbox" -sidebar: components -previewapp: | - from shiny import App, render, ui - app_ui = ui.page_fluid( - ui.input_checkbox("x", "Checkbox Checkbox").add_class("mb-0"), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - def server(input, output, session): - @output - @render.text - def txt(): - return f"" - app = App(app_ui, server) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Checkbox - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOtHQB9JUwC8TJVigBzOOpoAbJdIAUqpnb0cMDAO42I9jw4wkLMCFYA2RUcuVAUydUI2OEIAawAjYgAPGyJouMSk5XwmbIBhdITk7IkAFToFOABKDChpaUizKBYWVJh4gFoABiYKJLIOwkoKOmyqqolbTzt9HwU-QOCMYnCwiKVUgDcoCzgx2vrG5tbs9u7euH7B4bkxianpkGzCJpbsxFywTbYOgEYunoAKwULDIHBo2EGpAo5Gu5DkTB2HEMEA6HAoMBYcJGTFQSQ6AFZsgBfB5MKqqCkQVSyGisOSbORWULhCQrMhrCQsOAtDikKqIMkAASkEFkdAwSjJtKY212VgFZI8UjICjo7hZZG8hUyCtUaFQOlE6CsBs0HC5DLkVTAxIAukA - height: 150px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_checkbox("checkbox", "Checkbox", False), #<< - ui.output_ui("value"), - ) - - def server(input, output, session): - @render.ui - def value(): - return input.checkbox() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_checkbox() - href: https://shiny.posit.co/py/api/ui.input_checkbox.html - signature: ui.input_checkbox(id, label, value=False, *, width=None) ---- - -:::{#component} -::: - -## Details - -A checkbox creates a single checkbox that can be used to specify logical values. - -Follow these steps to add a checkbox to your app: - - 1. Add `ui.input_checkbox()` to the UI of your app to create a checkbox. Where you call this function will determine where the checkbox will appear within the app's layout. - - 2. Supply values to `ui.input_checkbox()`'s first two parameters (`id` and `label`) to specify the id and label of the checkbox. Optionally, set the `value` argument to either `True` or `False` to specify the initial value of the checkbox. By default, the checkbox has value `False` and is un-checked. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a checkbox: - - 1. Use `input.()` (e.g., `input.checkbox()`) to access the value of a checkbox. The server value of a checkbox is `True` if checked and `False` if not checked. - -See also: Checkbox Group([Checkbox](checkbox.qmd) \ No newline at end of file diff --git a/components/inputs/checkbox/app-core.py b/components/inputs/checkbox/app-core.py new file mode 100644 index 00000000..8f84d8bb --- /dev/null +++ b/components/inputs/checkbox/app-core.py @@ -0,0 +1,15 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_checkbox("checkbox", "Checkbox", False), # << + ui.output_ui("value"), +) + + +def server(input, output, session): + @render.ui + def value(): + return input.checkbox() + + +app = App(app_ui, server) diff --git a/components/inputs/checkbox/app-detail-preview.py b/components/inputs/checkbox/app-detail-preview.py new file mode 100644 index 00000000..4b965679 --- /dev/null +++ b/components/inputs/checkbox/app-detail-preview.py @@ -0,0 +1,24 @@ +## file: app.py +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.row( + ui.column( + 6, + ui.input_checkbox("checkbox", "Checkbox", True).add_class( + "mb-0 text-center" + ), + ), + ui.column(6, ui.output_ui("value").add_class("mb-0 text-center")), + {"class": "vh-100 justify-content-center align-items-center px-5"}, + ) +) + + +def server(input, output, session): + @render.ui + def value(): + return input.checkbox() + + +app = App(app_ui, server) diff --git a/components/inputs/checkbox/app-express.py b/components/inputs/checkbox/app-express.py new file mode 100644 index 00000000..3dbc6d8d --- /dev/null +++ b/components/inputs/checkbox/app-express.py @@ -0,0 +1,9 @@ +from shiny import render +from shiny.express import input, ui + +ui.input_checkbox("checkbox", "Checkbox", False) # << + + +@render.ui +def value(): + return input.checkbox() diff --git a/components/inputs/checkbox/app-preview.py b/components/inputs/checkbox/app-preview.py new file mode 100644 index 00000000..e9b1b508 --- /dev/null +++ b/components/inputs/checkbox/app-preview.py @@ -0,0 +1,17 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_checkbox("x", "Checkbox Checkbox").add_class("mb-0"), + ui.output_text_verbatim("txt"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + @output + @render.text + def txt(): + return "" + + +app = App(app_ui, server) diff --git a/components/inputs/checkbox/index.qmd b/components/inputs/checkbox/index.qmd new file mode 100644 index 00000000..f91347d8 --- /dev/null +++ b/components/inputs/checkbox/index.qmd @@ -0,0 +1,49 @@ +--- +title: Checkbox +sidebar: components +appPreview: + file: components/inputs/checkbox/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/checkbox/ + contents: + - title: Preview + file: app-detail-preview.py + height: 150 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrNlmsB4wH1i7OMQDWAI1KqAFNLAOnbjx8iHwBhRxd3VSDkADEoABtWOABKZGQAYmQAHiyLCFkAATEISQYsM1lJOmQANwTDOE9kxFk0tLEKQwYIPggjCiw-CI8m2UJUClx0BBQwKlUKMABfAF0gA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm4uzjEA1gCNSAA87MC8fAODlQmRogGFvP0Cg6KIAMSgLVjgASiJkAGJkAB5i+0dDUnc3DyVQgDdMhThovNUc1U6IWTo2OXq5G1d3IiqKGqJs1lZOchzEcocAASluuSwlReQe5EarOBt5rcdkKQoFBgg+CBqscKTgw671TD0xTBsNbU5J-rkOiAxMAUXDoBAoYFwIIUMAAXwAukA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_checkbox() + href: https://shiny.posit.co/py/api/ui.input_checkbox.html + signature: ui.input_checkbox(id, label, value=False, *, width=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A checkbox creates a single checkbox that can be used to specify logical values. + +Follow these steps to add a checkbox to your app: + + 1. Add `ui.input_checkbox()` to the UI of your app to create a checkbox. Where you call this function will determine where the checkbox will appear within the app's layout. + + 2. Supply values to `ui.input_checkbox()`'s first two parameters (`id` and `label`) to specify the id and label of the checkbox. Optionally, set the `value` argument to either `True` or `False` to specify the initial value of the checkbox. By default, the checkbox has value `False` and is un-checked. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a checkbox: + + 1. Use `input.()` (e.g., `input.checkbox()`) to access the value of a checkbox. The server value of a checkbox is `True` if checked and `False` if not checked. + +See also: Checkbox Group([Checkbox](../checkbox/index.qmd) diff --git a/components/inputs/date-range-selector.qmd b/components/inputs/date-range-selector.qmd deleted file mode 100644 index 528a08bc..00000000 --- a/components/inputs/date-range-selector.qmd +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: "Date Range Selector" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_date_range("x", ""), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input, output, session): - @render.text - def txt(): - return f"" - - app = App(app_ui, server, debug=True) - -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Date Range Selector - preview: | - https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAEygrIEt4nvVi6ZVuzgAdCOPqMmAZwAWnCNl4x+gpgEF0eJnUos4dHQFdO48WlQB9U0wC8TU1igBzOFZoAbUywAU4pkDHTgxFVGMyKzYKKzooCDd-MGjDeLdRfCYMjJ0ZMihBOwyAJgAGMoBaUoBGKuqMgEoMKBYWK0JPKBkZJNQyCoBWJhgADwqoCOImChH+wkoKOka8AKCnYgjwyJmyJIA3KG8xMAaViCCLphAMjq6ZDMQssD25CurS0qYAK2M8zhpsBUSOQFkCFoYmIdOC4IBVOBQYDIwSC6ExUGMBhkAL7iJotNq3bpJGCAiZkKY7ZGLRrmCQQAw0WSGPaGXxhCI6DZkLa5ODdTikBqIVaBAACXK2IqYor09MMGB2UoZTAOR18QqlFz0ZGMdHONAyIHZZAwKTiCTg6uApQAuljplMjRAtqaRObEg1gNU7dk6RZ0PZNOhfJYbJxeXQWXQGmAsTagA - height: 380px - code: | - from datetime import date - - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_date_range("daterange", "Date range", start="2020-01-01"), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.daterange()[0]} to {input.daterange()[1]}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_date_range - href: https://shiny.posit.co/py/api/ui.input_date_range.html - signature: ui.input_date_range(id, label, *, start=None, end=None, min=None, max=None, format='yyyy-mm-dd', startview='month', weekstart=0, language='en', separator=' to ', width=None, autoclose=True) - ---- - -:::{#component} -::: - -## Details - -A date range selector allows you to select a pair of dates from two calendars. - -To add a date range selector to your app: - - 1. Add `ui.input_date_range()` to the UI of your app to create a date range selector. Where you call this function will determine where the date range selector will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_date_range()` to define the identifier and label of the daterange selector. `ui.input_date_range()` also includes various optional parameters, including `start` and `end`, which set the initial start and end dates. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a daterange selector: - - 1. Use `input.()` to access the value of a daterange selector (e.g., `input.daterange()`). The server value of a daterange selector is a tuple of date objects. You can access the individual tuple elements using square brackets and indices (e.g., `input.daterange()[0]`). - - -See also: [Date Selector](date-selector.qmd) diff --git a/components/inputs/date-range-selector/app-core.py b/components/inputs/date-range-selector/app-core.py new file mode 100644 index 00000000..67f49adb --- /dev/null +++ b/components/inputs/date-range-selector/app-core.py @@ -0,0 +1,16 @@ + +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_date_range("daterange", "Date range", start="2020-01-01"), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.daterange()[0]} to {input.daterange()[1]}" + + +app = App(app_ui, server) diff --git a/components/inputs/date-range-selector/app-detail-preview.py b/components/inputs/date-range-selector/app-detail-preview.py new file mode 100644 index 00000000..f9ba575b --- /dev/null +++ b/components/inputs/date-range-selector/app-detail-preview.py @@ -0,0 +1,21 @@ +## file: app.py + +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_date_range("daterange", "", start="2020-01-01").add_class( + "pt-5 mx-auto text-center" + ), + ui.output_text("value"), + {"class": "vh-100 justify-content-center align-items-center px-5"}, +).add_class("my-auto text-center") + + +def server(input, output, session): + @output + @render.text + def value(): + return f"{input.daterange()[0]} to {input.daterange()[1]}" + + +app = App(app_ui, server) diff --git a/components/inputs/date-range-selector/app-express.py b/components/inputs/date-range-selector/app-express.py new file mode 100644 index 00000000..c74477bb --- /dev/null +++ b/components/inputs/date-range-selector/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_date_range("daterange", "Date range", start="2020-01-01") # << + + +@render.text +def value(): + return f"{input.daterange()[0]} to {input.daterange()[1]}" diff --git a/components/inputs/date-range-selector/app-preview.py b/components/inputs/date-range-selector/app-preview.py new file mode 100644 index 00000000..db8833ac --- /dev/null +++ b/components/inputs/date-range-selector/app-preview.py @@ -0,0 +1,16 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_date_range("x", ""), + ui.output_text_verbatim("txt"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + @render.text + def txt(): + return "" + + +app = App(app_ui, server, debug=True) diff --git a/components/inputs/date-range-selector/index.qmd b/components/inputs/date-range-selector/index.qmd new file mode 100644 index 00000000..2788752f --- /dev/null +++ b/components/inputs/date-range-selector/index.qmd @@ -0,0 +1,52 @@ +--- +title: Date Range Selector +sidebar: components +appPreview: + file: components/inputs/date-range-selector/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/date-range-selector/ + contents: + - title: Preview + file: app-detail-preview.py + height: 380 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD64qFTsMoEAOZwAFNLCOqrh5wvkS+ACJOcKJuniFsFFDCALy+AEwADBkAtOkAjDm5vgCUyMgAxMgAPJWWsgACYhCSDFhUqhSyknTIAG5QADaG3kWIsqWlYhSGDBDIdL4gthRY-lIxw8DpALoAvsgUpMiLEEbLq4GeXkXAubu+soSoFLjoCChgbRRgO1tAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQB0IAzAJ1JmQGcALASwl2Q8Y6UswrIAgpiLNqAEzjMiAVx4MGGdAH1VyALzJVOKAHM4WxgBtVcgBQNkjwzyx90yilrlQqW5lAgzezBvKn9AuDpCZCiAER84ZHCzKKIOCigxPSiAJgAGfIBaPIBGYpKogEoiZABiZAAeBocnI1IPd08qAA8KYIA3KGtIsGqGSvUIBgVGTkV+xVs3DyJ2ik60uA4OHnJKxBbHAAFZCAVmLB6KQ+QZ5EHh232bpyS4CmVmCGRGKJBlihYUKKAJBSrAPIAXQAvsgKKRkP8IJ0gQlknAnsASjCopMNJh9JJMLZNDoeJtmAtmBMINEwBRcOgECh6XBemBoZCgA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_date_range + href: https://shiny.posit.co/py/api/ui.input_date_range.html + signature: ui.input_date_range(id, label, *, start=None, end=None, min=None, max=None, + format='yyyy-mm-dd', startview='month', weekstart=0, language='en', separator=' + to ', width=None, autoclose=True) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A date range selector allows you to select a pair of dates from two calendars. + +To add a date range selector to your app: + + 1. Add `ui.input_date_range()` to the UI of your app to create a date range selector. Where you call this function will determine where the date range selector will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_date_range()` to define the identifier and label of the daterange selector. `ui.input_date_range()` also includes various optional parameters, including `start` and `end`, which set the initial start and end dates. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a daterange selector: + + 1. Use `input.()` to access the value of a daterange selector (e.g., `input.daterange()`). The server value of a daterange selector is a tuple of date objects. You can access the individual tuple elements using square brackets and indices (e.g., `input.daterange()[0]`). + + +See also: [Date Selector](../date-selector/index.qmd) diff --git a/components/inputs/date-selector.qmd b/components/inputs/date-selector.qmd deleted file mode 100644 index 14018afc..00000000 --- a/components/inputs/date-selector.qmd +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "Date Selector" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_date("x", ""), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4 flex-column"} - ) - - def server(input, output, session): - @render.text - def txt(): - return f"" - - app = App(app_ui, server, debug=True) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Date Selector - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAEygrIEt4nvVi6ZVuzgAdCOPqMmAZwAWnCNl4x+gpgEF0eJnUos4dHQFdO48WlQB9U0wC8TU1igBzOFZoAbUywAU4pkDHTgxFVGMyKzYKfzBosXwmUTBkgEoMKBYWK0JPKBkZWNQyAFoAViYYAA8SqAjiJgoq0sJKCjo0vACgp2II8MimsliANyhvBNSuiCCmEGTc-JlkxCSwEbkSgEYABh2mACtjGS4abBKScjaLtsMmcc4XCBLOChgZG6u6JlQasuSAL7idKZbKLAqxGDnOpkBpDT7tNLmCQQAw0WSGEaGXxhCI6PpkAY6GRwAqcUipRDdQIAAQJA2pTBpelRhgwQ0ZaKYYwmvkpjNmejIxjoM1xZAw8T5yIs6HsmnQvksNk4xMxhlSYABAF0gA - height: 380px - code: | - from datetime import date - - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_date("date", "Date"), #<< - ui.output_text("value") - ) - - def server(input, output, session): - @render.text - def value(): - return input.date() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_date - href: https://shiny.posit.co/py/api/ui.input_date.html - signature: ui.input_date(id, label, *, value=None, min=None, max=None, format='yyyy-mm-dd', startview='month', weekstart=0, language='en', width=None, autoclose=True, datesdisabled=None, daysofweekdisabled=None) ---- - -:::{#component} -::: - -## Details - -A date selector allows you to select a date from a calendar. - -To add a date selector to your app: - - 1. Add `ui.input_date()` to the UI of your app to create a date selector. Where you call this function will determine where the date selector will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_date()` to define the identifier and label of the date selector. `ui.input_date()` also includes various optional parameters, including `min` and `max`, which set the minimum and maximum allowed dates. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a date selector: - - 1. Use `input.()` to access the value of a daterange selector (e.g., `input.date()`). The server value of a date selector is a date object. - - -See also: [Date Range Selector](date-range-selector.qmd) \ No newline at end of file diff --git a/components/inputs/date-selector/app-core.py b/components/inputs/date-selector/app-core.py new file mode 100644 index 00000000..9057f042 --- /dev/null +++ b/components/inputs/date-selector/app-core.py @@ -0,0 +1,16 @@ + +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_date("date", "Date"), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return input.date() + + +app = App(app_ui, server) diff --git a/components/inputs/date-selector/app-detail-preview.py b/components/inputs/date-selector/app-detail-preview.py new file mode 100644 index 00000000..15c7da85 --- /dev/null +++ b/components/inputs/date-selector/app-detail-preview.py @@ -0,0 +1,19 @@ +## file: app.py + +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_date("date", "").add_class("pt-5 mx-auto text-center"), + ui.output_text("value"), + {"class": "vh-100 justify-content-center align-items-center px-5"}, +).add_class("my-auto text-center") + + +def server(input, output, session): + @output + @render.text + def value(): + return input.date() + + +app = App(app_ui, server) diff --git a/components/inputs/date-selector/app-express.py b/components/inputs/date-selector/app-express.py new file mode 100644 index 00000000..16ab24cc --- /dev/null +++ b/components/inputs/date-selector/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_date("date", "Date") # << + + +@render.text +def value(): + return input.date() diff --git a/components/inputs/date-selector/app-preview.py b/components/inputs/date-selector/app-preview.py new file mode 100644 index 00000000..3d16cb7f --- /dev/null +++ b/components/inputs/date-selector/app-preview.py @@ -0,0 +1,18 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_date("x", ""), + ui.output_text_verbatim("txt"), + { + "class": "vh-100 d-flex justify-content-center align-items-center px-4 flex-column" + }, +) + + +def server(input, output, session): + @render.text + def txt(): + return "" + + +app = App(app_ui, server, debug=True) diff --git a/components/inputs/date-selector/index.qmd b/components/inputs/date-selector/index.qmd new file mode 100644 index 00000000..4cba72a7 --- /dev/null +++ b/components/inputs/date-selector/index.qmd @@ -0,0 +1,52 @@ +--- +title: Date Selector +sidebar: components +appPreview: + file: components/inputs/date-selector/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/date-selector/ + contents: + - title: Preview + file: app-detail-preview.py + height: 380 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD64qFQAU0sI6puibgCJO4bgCUyMgAxMgAPBGWsgACYhCSDFhUqhSyknTIAG5QADaGcM6BiLIhIWIUhgwQfBBGFFgeRYGyhKgUuOgIKGCpFGAAvgC6QA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQB0IAzAJ1JmQGcALASwl2Q8Y6UswrIAgpiLNqAEzjMiAVx4MGGdAH1VyALzJVOKAHM4WxgBtVcgBQNkjwzyx90yilrlQq9sN6o6QmQggBEfOCCASiJkAGJkAB5EhycjUg93TyoADwo-ADcoa0iwGIYo9QgGBUZORQLFWzcPIgyKLKIOOA4OHnIoxFTHAAFZCAVmLFyKYeRa5CKS20G5p2RZCmVmCEEILKwAuBWqjUx9SUxbTR0eLobFSohgsApcdAQUV7g8sABfAC6QA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_date + href: https://shiny.posit.co/py/api/ui.input_date.html + signature: ui.input_date(id, label, *, value=None, min=None, max=None, format='yyyy-mm-dd', + startview='month', weekstart=0, language='en', width=None, autoclose=True, datesdisabled=None, + daysofweekdisabled=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A date selector allows you to select a date from a calendar. + +To add a date selector to your app: + + 1. Add `ui.input_date()` to the UI of your app to create a date selector. Where you call this function will determine where the date selector will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_date()` to define the identifier and label of the date selector. `ui.input_date()` also includes various optional parameters, including `min` and `max`, which set the minimum and maximum allowed dates. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a date selector: + + 1. Use `input.()` to access the value of a daterange selector (e.g., `input.date()`). The server value of a date selector is a date object. + + +See also: [Date Range Selector](../date-range-selector/index.qmd) diff --git a/components/inputs/numeric-input.qmd b/components/inputs/numeric-input.qmd deleted file mode 100644 index 2b05803b..00000000 --- a/components/inputs/numeric-input.qmd +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "Numeric Input" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_numeric("x", "", value=100), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input, output, session): - @render.text - def txt(): - return f"" - - app = App(app_ui, server, debug=True) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Numeric Input - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOtHQB9JUwC8TJVigBzOOpoAbJdIAUqpnb0cMXVArLqIC+HQ6EbkT3I+yvhMwcESAIwSMFzaUUwwUAAecQAMAJQYUNLS6oRmUCwsfqhkALQArAlJZVCuxEwUSeWElBR0wel4tvb6xK4ubk1uAG5yAEZQZHx+I1AWcJ3dEPZMIMH5hSzBiKFgI2xlEampTABWCizTNNhlJORtd21yTPMchhBlHBQwLE8PdCYqBqFWCAF9VJlsrlNkU-DBbnUyA1hv92p1VLIaKw5GM6FZnK4JP0yIMJCw4EUOKR0ogenYAAJSCCyOgYYb0phYphzBZWWmc1ZSMgKOgrQlkDAeLw+fmqNCoHSidBWBWaDjk3FydJgMEAXSAA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_numeric("numeric", "Numeric input", 1, min=1, max=10), #<< - ui.output_text_verbatim("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return input.numeric() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_numeric - href: https://shiny.posit.co/py/api/ui.input_numeric.html - signature: ui.input_numeric(id, label, value, *, min=None, max=None, step=None, width=None) - ---- - -:::{#component} -::: - -## Details - -A numeric input control creates a way to specify a number. - -To add a numeric input control to your app: - - 1. Add `ui.input_numeric()` to the UI of your app to create a numeric input. Where you call this function will determine where the numeric input control will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_numeric()` to define the identifier and label of the numeric input. `ui.input_numeric()` also includes various optional parameters, including `min` and `max`, which set the minimum and maximum allowed values. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a numeric input control: - - 1. Use `input.()` (e.g., `input.numeric()`) to access the specified numeric value. The server value of a numeric input control is a numeric value. - - diff --git a/components/inputs/numeric-input/app-core.py b/components/inputs/numeric-input/app-core.py new file mode 100644 index 00000000..c5a95b03 --- /dev/null +++ b/components/inputs/numeric-input/app-core.py @@ -0,0 +1,15 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_numeric("numeric", "Numeric input", 1, min=1, max=10), # << + ui.output_text_verbatim("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return input.numeric() + + +app = App(app_ui, server) diff --git a/components/inputs/numeric-input/app-detail-preview.py b/components/inputs/numeric-input/app-detail-preview.py new file mode 100644 index 00000000..df1ffac3 --- /dev/null +++ b/components/inputs/numeric-input/app-detail-preview.py @@ -0,0 +1,19 @@ +## file: app.py +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_numeric("numeric", "", 1, min=1, max=10).add_class( + "pt-5 mx-auto text-center" + ), + ui.output_text_verbatim("value"), + {"class": "vh-100 justify-content-center align-items-center px-5"}, +).add_class("my-auto text-center") + + +def server(input, output, session): + @render.text + def value(): + return input.numeric() + + +app = App(app_ui, server) diff --git a/components/inputs/numeric-input/app-express.py b/components/inputs/numeric-input/app-express.py new file mode 100644 index 00000000..21e94908 --- /dev/null +++ b/components/inputs/numeric-input/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_numeric("numeric", "Numeric input", 1, min=1, max=10) # << + + +@render.text +def value(): + return input.numeric() diff --git a/components/inputs/numeric-input/app-preview.py b/components/inputs/numeric-input/app-preview.py new file mode 100644 index 00000000..c71c52ee --- /dev/null +++ b/components/inputs/numeric-input/app-preview.py @@ -0,0 +1,16 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_numeric("x", "", value=100), + ui.output_text_verbatim("txt"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + @render.text + def txt(): + return "" + + +app = App(app_ui, server, debug=True) diff --git a/components/inputs/numeric-input/index.qmd b/components/inputs/numeric-input/index.qmd new file mode 100644 index 00000000..c3c35292 --- /dev/null +++ b/components/inputs/numeric-input/index.qmd @@ -0,0 +1,48 @@ +--- +title: Numeric Input +sidebar: components +appPreview: + file: components/inputs/numeric-input/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/numeric-input/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6V+A07EAFNMiGnLj0Q8A5LykXPggjCl9kAEYiGG4AXhjkGChVRIAGAEpkZABiZAAeAstZAAExCEkGLCpVCMq4OmQANygAG0M4V0zEWRycsQpDBghQ8KxHYLdM2UJUClx0BBQwWoowAF8AXSA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKmiAvgNOxO5Decn7KhMihAHJBvsR8EG4UoUQAjEQw3LqpyDBQAB6ZAAwAlETIAMTIADyV9o6GpO4JmlS5HgBucgBGUBT8AW1QVnChJapFqhMQsnRsch0MNq7uRA0UCUSscKysnORFiLUOAAJSU3JYLYkQjsjTyANDNvuHN8hSFAoM10sUWF4+fiek3UmD0YkwNg02k4GzmcnGEDCYAouHQCBQyLgrTAAF8ALpAA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_numeric + href: https://shiny.posit.co/py/api/ui.input_numeric.html + signature: ui.input_numeric(id, label, value, *, min=None, max=None, step=None, + width=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A numeric input control creates a way to specify a number. + +To add a numeric input control to your app: + + 1. Add `ui.input_numeric()` to the UI of your app to create a numeric input. Where you call this function will determine where the numeric input control will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_numeric()` to define the identifier and label of the numeric input. `ui.input_numeric()` also includes various optional parameters, including `min` and `max`, which set the minimum and maximum allowed values. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a numeric input control: + + 1. Use `input.()` (e.g., `input.numeric()`) to access the specified numeric value. The server value of a numeric input control is a numeric value. diff --git a/components/inputs/password-field.qmd b/components/inputs/password-field.qmd deleted file mode 100644 index d7e0832a..00000000 --- a/components/inputs/password-field.qmd +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: "Password Field" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_password("x", "", placeholder="Enter password"), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4 flex-column"} - ) - - def server(input, output, session): - @render.text - def txt(): - return f'' - - app = App(app_ui, server, debug=True) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Password Field - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKym1FBYsA7oNtlMC8ffzppIIkgyKYgmGwQvwCARiCASgwoaWlNQgtvFjtgsgBaAFYmGAAPEqh3YiYKKtLCSgo6dLx7R0NidzcPJo8ANzkAIygyPiLhqCs4Tu6HECC8gqDEWLBhthLkgAZ9pgArBRYpmmwSknI267a5JjmOYwgSjgoYFnvbuiZUGplIIAX1UGSyOTWPiK8Vq9UacGaP3a6VUaIgshorDkozoNlc7gkfTIAwkLDgPg4pDSiCWTAAAsSBnT6VIMXIMEM6ZimLN5jYaXTHJI4GQFHQILwIAMjKEAgL0ep0HpROgbBptBwyTi5GkwMCALpAA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_password("password", "Password", "mypassword1"), #<< - ui.output_text_verbatim("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return input.password() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_password - href: https://shiny.posit.co/py/api/ui.input_password.html - signature: ui.input_password(id, label, value='', *, width=None, placeholder=None) - ---- - -:::{#component} -::: - -## Details - -A password field creates a text box for password entry. - -To add a password field to your app: - - 1. Add `ui.input_password()` to the UI of your app to create a password field. Where you call this function will determine where the password field will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_password()` to define the identifier and label of the passsword field. `ui.input_password()` also includes various optional parameters, including `value`, which set the initial value. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a password field: - - 1. Use `input.()` (e.g., `input.password()`) to access the value of the password field. The server value of a password field is a string. - diff --git a/components/inputs/password-field/app-core.py b/components/inputs/password-field/app-core.py new file mode 100644 index 00000000..6edd6efb --- /dev/null +++ b/components/inputs/password-field/app-core.py @@ -0,0 +1,15 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_password("password", "Password", "mypassword1"), # << + ui.output_text_verbatim("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return input.password() + + +app = App(app_ui, server) diff --git a/components/inputs/password-field/app-detail-preview.py b/components/inputs/password-field/app-detail-preview.py new file mode 100644 index 00000000..49c95d0c --- /dev/null +++ b/components/inputs/password-field/app-detail-preview.py @@ -0,0 +1,20 @@ +## file: app.py +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_password("password", "", "mypassword1").add_class( + "pt-5 mx-auto text-center" + ), + ui.output_text_verbatim("value"), + {"class": "vh-100 justify-content-center align-items-center px-5"}, +).add_class("my-auto text-center") + + +def server(input, output, session): + @output + @render.text + def value(): + return input.password() + + +app = App(app_ui, server) diff --git a/components/inputs/password-field/app-express.py b/components/inputs/password-field/app-express.py new file mode 100644 index 00000000..3e575559 --- /dev/null +++ b/components/inputs/password-field/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_password("password", "Password", "mypassword1") # << + + +@render.text +def value(): + return input.password() diff --git a/components/inputs/password-field/app-preview.py b/components/inputs/password-field/app-preview.py new file mode 100644 index 00000000..5017592d --- /dev/null +++ b/components/inputs/password-field/app-preview.py @@ -0,0 +1,18 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_password("x", "", placeholder="Enter password"), + ui.output_text_verbatim("txt"), + { + "class": "vh-100 d-flex justify-content-center align-items-center px-4 flex-column" + }, +) + + +def server(input, output, session): + @render.text + def txt(): + return "" + + +app = App(app_ui, server, debug=True) diff --git a/components/inputs/password-field/index.qmd b/components/inputs/password-field/index.qmd new file mode 100644 index 00000000..9f2e044c --- /dev/null +++ b/components/inputs/password-field/index.qmd @@ -0,0 +1,47 @@ +--- +title: Password Field +sidebar: components +appPreview: + file: components/inputs/password-field/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/password-field/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD66KFoDuQ8QAppYRy7deiXgAKTqyuDOL+yF4wuD6hbgCMXgCUyMgAxMgAPFmWsgACYhCSDFhUqhSyknTIAG5QADaGcO7JiLJpaWIUhgwQfBBGFDghYR7JsoSoFLEIKGDlFGAAvgC6QA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm9FFasA7kNtlMC8ffwZpIKIggAVvPwDI5CCYXBD48IBGIIBKImQAYmQAHiL7R0NSdzcPKgAPDwA3OQAjKAp+OzAGqCs4HIJVbNVhiFk6NjkmhhtXdyJKimqiVjgfTnJsxDKHAAEpUbksOopt5DHkbt6bTdPHZCkKBQYIPghqo1CA65H1TD0xTA2DTaTjLSZyIYQQioCipBAoMDHMAAXwAukA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_password + href: https://shiny.posit.co/py/api/ui.input_password.html + signature: ui.input_password(id, label, value='', *, width=None, placeholder=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A password field creates a text box for password entry. + +To add a password field to your app: + + 1. Add `ui.input_password()` to the UI of your app to create a password field. Where you call this function will determine where the password field will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_password()` to define the identifier and label of the passsword field. `ui.input_password()` also includes various optional parameters, including `value`, which set the initial value. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a password field: + + 1. Use `input.()` (e.g., `input.password()`) to access the value of the password field. The server value of a password field is a string. diff --git a/components/inputs/radio-buttons.qmd b/components/inputs/radio-buttons.qmd deleted file mode 100644 index 9e3ab806..00000000 --- a/components/inputs/radio-buttons.qmd +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: "Radio Buttons" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_radio_buttons( - "radio", - "Never gonna:", - {"1": "Give you up", "2": "Let you down"}, - ).add_class("mb-0"), - ui.output_ui("value"), - {"class": "vh-100 d-flex flex-column justify-content-center align-items-center px-4"} - ) - - def server(input, output, session): - @output - @render.text - def txt(): - return f'' - - app = App(app_ui, server, debug=True) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Radio Buttons - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOtHQB9JUwC8TJVigBzOOpoAbJdIAUqpnb0cMXVArLq6UaR2LqARq7JSFismW3tw5TAPL2JIiTDwu0iAJU9vJn8yQIgWONCIRPsQSIBGSMRQsAB5VDJvArL8SoAmcsqautImVqbIgGY2yI76pgGwAF94gvsASinw-WJXFzclGzAANygLOEi5hKZiojMoFlykSo22AFoSgAY7pmlr8zgADyZtjkMIa44KGAsa6ESgUOhMVBva4AFki41UM1UshorDkGzkVmcrgkSzIKwkLDgZ3qM0QBwAAlIILI6BglAdkUwtjsrKSDuEpGQFHQCliyBhot5Wao0KgdKJ0FZRZoOAS0XJERBVKoJgBdIA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_radio_buttons( #<< - "radio", #<< - "Radio buttons", #<< - {"1": "Option 1", "2": "Option 2", "3": "Option 3"}, #<< - ), #<< - ui.output_ui("value"), - ) - - def server(input, output, session): - @render.ui - def value(): - return input.radio() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_radio_buttons - href: https://shiny.posit.co/py/api/ui.input_radio_buttons.html - signature: ui.input_radio_buttons(id, label, choices, *, selected=None, inline=False, width=None) - ---- - -:::{#component} -::: - -## Details - -Use a set of radio buttons to select an item from a list. - -To add radio buttons to your app: - - 1. Add `ui.input_radio_buttons()` to the UI of your app to create a set of radio buttons. Where you call this function will determine where the radio buttons will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_radio_buttons()` to define the identifier and label of the set of radio buttons. - - 3. Specify the value and label that accompanies each radio button using the `choices` parameter. `choices` can be either a list or a dictionary. If `choices` is a list, the list elements become the radio button values and labels. If `choices` is a dictionary, `ui.input_radio_buttons()` uses the dictionary keys as the button values and the dictionary values as the button labels. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a set of radio buttons: - - 1. Use `input.()` to access the value of a radio button set (e.g., `input.radio()`). The server value of a set of radio buttons is a string containing the selected value. diff --git a/components/inputs/radio-buttons/app-core.py b/components/inputs/radio-buttons/app-core.py new file mode 100644 index 00000000..c64d30c6 --- /dev/null +++ b/components/inputs/radio-buttons/app-core.py @@ -0,0 +1,19 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_radio_buttons( # << + "radio", # << + "Radio buttons", # << + {"1": "Option 1", "2": "Option 2", "3": "Option 3"}, # << + ), # << + ui.output_ui("value"), +) + + +def server(input, output, session): + @render.ui + def value(): + return input.radio() + + +app = App(app_ui, server) diff --git a/components/inputs/radio-buttons/app-detail-preview.py b/components/inputs/radio-buttons/app-detail-preview.py new file mode 100644 index 00000000..98ee3428 --- /dev/null +++ b/components/inputs/radio-buttons/app-detail-preview.py @@ -0,0 +1,21 @@ +## file: app.py +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_radio_buttons( + "radio", + "Radio buttons", + {"1": "Option 1", "2": "Option 2", "3": "Option 3"}, + ), + ui.output_ui("value"), + {"class": "vh-100 d-flex align-items-center px-4"}, +) + + +def server(input, output, session): + @render.ui + def value(): + return input.radio() + + +app = App(app_ui, server) diff --git a/components/inputs/radio-buttons/app-express.py b/components/inputs/radio-buttons/app-express.py new file mode 100644 index 00000000..91169915 --- /dev/null +++ b/components/inputs/radio-buttons/app-express.py @@ -0,0 +1,14 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_radio_buttons( # << + "radio", # << + "Radio buttons", # << + {"1": "Option 1", "2": "Option 2", "3": "Option 3"}, # << +) # << + + +@render.ui +def value(): + return input.radio() diff --git a/components/inputs/radio-buttons/app-preview.py b/components/inputs/radio-buttons/app-preview.py new file mode 100644 index 00000000..49b8e466 --- /dev/null +++ b/components/inputs/radio-buttons/app-preview.py @@ -0,0 +1,23 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_radio_buttons( + "radio", + "Never gonna:", + {"1": "Give you up", "2": "Let you down"}, + ).add_class("mb-0"), + ui.output_ui("value"), + { + "class": "vh-100 d-flex flex-column justify-content-center align-items-center px-4" + }, +) + + +def server(input, output, session): + @output + @render.text + def txt(): + return "" + + +app = App(app_ui, server, debug=True) diff --git a/components/inputs/radio-buttons/index.qmd b/components/inputs/radio-buttons/index.qmd new file mode 100644 index 00000000..2c3b54c5 --- /dev/null +++ b/components/inputs/radio-buttons/index.qmd @@ -0,0 +1,50 @@ +--- +title: Radio Buttons +sidebar: components +appPreview: + file: components/inputs/radio-buttons/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/radio-buttons/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6DKOM6k7AI2MVyrABTJkAMTIADzBsv7+0mCOzqRRRIEhYRARyFEASk4uyB4UXhCs8f5BoeERIFEAjFEoUQDy6BQuKdWEaWAATDXtDU3kyF1tUQDM3fWNzcijYAC+CSXJAJTFSZayAAJiEJIMWGayknTIAG5QADaGcD6LiGX+YhSGDCm2FFgxLteybWAUuOgIFC-NQUWYAXSAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKmhlGmdSmgEbuFOSsNg4AxMgAPFH2jvHKYF4+pIlEyJExcfEOiQBK3r7IgRTBEKxpEdGxEDmOIIkAjIkoiQDy6BS+tc2EyIkATC39YB1d5MhDfYkAzMPtnd3Ic2AAvumZNfEAlBvV2U5YpO5uHkp2YABuUFZwibuq26rPELJ0bHKXcjau7kTHFFORFYcFYrG620QBwAAlJXnIsEoDm9kNdbjZIQd4lIKAoGLVfhQsMlfBiXupMHoxJgbBptJxgZ85E8IH0wBRcOgECh2XAAB4UNYAXSAA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_radio_buttons + href: https://shiny.posit.co/py/api/ui.input_radio_buttons.html + signature: ui.input_radio_buttons(id, label, choices, *, selected=None, inline=False, + width=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +Use a set of radio buttons to select an item from a list. + +To add radio buttons to your app: + + 1. Add `ui.input_radio_buttons()` to the UI of your app to create a set of radio buttons. Where you call this function will determine where the radio buttons will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_radio_buttons()` to define the identifier and label of the set of radio buttons. + + 3. Specify the value and label that accompanies each radio button using the `choices` parameter. `choices` can be either a list or a dictionary. If `choices` is a list, the list elements become the radio button values and labels. If `choices` is a dictionary, `ui.input_radio_buttons()` uses the dictionary keys as the button values and the dictionary values as the button labels. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a set of radio buttons: + + 1. Use `input.()` to access the value of a radio button set (e.g., `input.radio()`). The server value of a set of radio buttons is a string containing the selected value. diff --git a/components/inputs/select-multiple.qmd b/components/inputs/select-multiple.qmd deleted file mode 100644 index 07d90920..00000000 --- a/components/inputs/select-multiple.qmd +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: "Select (Multiple)" -sidebar: components -previewapp: | - from shiny import App, Inputs, Outputs, Session, render, ui - - app_ui = ui.page_fluid( - ui.input_select( - "select", - "", - { - "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, - "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"} - }, - multiple=True - ), - ui.output_text("value"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input: Inputs, output: Outputs, session: Session): - @render.text - def value(): - return f"" - - app = App(app_ui, server) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Select (Multiple) - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymlnAtxCZG0wAxAA8wfaOEcpgXj5+URIhYRARkWAAyt6+wsSoZBykLEwARt7EAO6I8UGh4SlMIFEAjCJRiExRAMJsxByEcEzNVU0AQq3tYF09fQOj+OONHWOd3b39C1EAvgk1yXVMMAoWeag+ugAqdAr9ibVMAJTbSRGGxO5uHhQAHv5RAG5QVjgUQeqjuqlUshorDkvzkNlc7gkrzI7wkXhYLHyEDulV2DgAAlIILI6BgvmRbpCmP9ATYcbcIlIyAo6MkaFEQAiyBgYlk6RsouDoOg9KJ0DYNNoOGiYXI7mANgBdIA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_select( #<< - "select", #<< - "Select options below:", #<< - {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, #<< - multiple=True #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.select()}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_select - href: https://shiny.posit.co/py/api/ui.input_select.html - signature: ui.input_select(id, label, choices, *, selected=None, multiple=False, selectize=False, width=None, size=None) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Select list with grouped choices - description: To group the choices into categories, supply the `choices` argument with a dictionary of dictionaries. `ui.input_select()` will use the top-level keys as group labels. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymlnAtxCZG0wAxAA8wfaOEcpgXj5+URIhYRARkWAAyt6+wsSoZBykLEwARt7EAO6I8UGh4SlMINVJdXVRAIxRiPVtIh1MUQDCbMQchHBMrT34fWCtAEK9A0MjY3NVbf0LYIPDo+MbYAC+CTXJzakATL0gUeeTnYs7Y7drYOfzSNPby0xvL+f79y2S12-yiB0atRSRwhpzqMAUFjyqB8ugAKnQFGNEpCAJTHJqOQzEdxuDwUAAe-iiADcoFY4FE8aocapVLIaKw5NS5DZXO4JMSyKSJF4WCx8hAcZVYUwAAJSCCyOgYClkSHspi0+k2KWQiJSMgKOjJGhREB8sgYGJZHUHKKs6DoPSidA2DTaDgirlyHGHAC6QA - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_select( #<< - "select", #<< - "Select options below:", #<< - {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, #<< - multiple=True #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.select()}" - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details -A select list creates a way to select one or more items from a list. - -To add a select list that allows you to select multiple items to your app: - - 1. Add `ui.input_select()` to the UI of your app to create a select list. Where you call this function will determine where the select list appears within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_select()` to define the identifier and label of the select list. - - 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_select()` uses the dictionary keys as the list values and the dictionary values as the list labels. - - You can also supply with `choices` a dictionary of dictionaries. `ui.input_selectize()` will use the top-level keys as group labels. See Selectize with grouped choices variation. - - 4. Set the `multiple` parameter to `True` to allow the user to select multiple items at once. By default, `multiple` is `False`. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a select list: - - 1. Use `input.()` (e.g., `input.select()`) to access the selected value(s). The server value of a select list is a list of strings. - -See also: [Select (Single)](select-single.qmd) and [Selectize (Multiple)](selectize-multiple.qmd). Select inputs and selectize inputs are similar, but have different interfaces and provide different ways of selecting multiple options. Selectize inputs also allow you to deselect items. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/inputs/select-multiple/app-core.py b/components/inputs/select-multiple/app-core.py new file mode 100644 index 00000000..d645da64 --- /dev/null +++ b/components/inputs/select-multiple/app-core.py @@ -0,0 +1,20 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_select( # << + "select", # << + "Select options below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + multiple=True, # << + ), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.select()}" + + +app = App(app_ui, server) diff --git a/components/inputs/select-multiple/app-express.py b/components/inputs/select-multiple/app-express.py new file mode 100644 index 00000000..b4977990 --- /dev/null +++ b/components/inputs/select-multiple/app-express.py @@ -0,0 +1,15 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_select( # << + "select", # << + "Select options below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + multiple=True, # << +) # << + + +@render.text +def value(): + return f"{input.select()}" diff --git a/components/inputs/select-multiple/app-preview.py b/components/inputs/select-multiple/app-preview.py new file mode 100644 index 00000000..5fdffc84 --- /dev/null +++ b/components/inputs/select-multiple/app-preview.py @@ -0,0 +1,24 @@ +from shiny import App, Inputs, Outputs, Session, render, ui + +app_ui = ui.page_fluid( + ui.input_select( + "select", + "", + { + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, + }, + multiple=True, + ), + ui.output_text("value"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input: Inputs, output: Outputs, session: Session): + @render.text + def value(): + return "" + + +app = App(app_ui, server) diff --git a/components/inputs/select-multiple/app-variation-select-list-with-grouped-choices-core.py b/components/inputs/select-multiple/app-variation-select-list-with-grouped-choices-core.py new file mode 100644 index 00000000..d645da64 --- /dev/null +++ b/components/inputs/select-multiple/app-variation-select-list-with-grouped-choices-core.py @@ -0,0 +1,20 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_select( # << + "select", # << + "Select options below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + multiple=True, # << + ), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.select()}" + + +app = App(app_ui, server) diff --git a/components/inputs/select-multiple/app-variation-select-list-with-grouped-choices-express.py b/components/inputs/select-multiple/app-variation-select-list-with-grouped-choices-express.py new file mode 100644 index 00000000..b4977990 --- /dev/null +++ b/components/inputs/select-multiple/app-variation-select-list-with-grouped-choices-express.py @@ -0,0 +1,15 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_select( # << + "select", # << + "Select options below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + multiple=True, # << +) # << + + +@render.text +def value(): + return f"{input.select()}" diff --git a/components/inputs/select-multiple/index.qmd b/components/inputs/select-multiple/index.qmd new file mode 100644 index 00000000..2b558ae7 --- /dev/null +++ b/components/inputs/select-multiple/index.qmd @@ -0,0 +1,76 @@ +--- +title: Select (Multiple) +sidebar: components +appPreview: + file: components/inputs/select-multiple/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/select-multiple/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6rOABs4xCgApkyAMTIAPH6yXl7SYI4ubqFEPv6BEMHIoQDKzq4ipOgUnOTaAEbOpADuiFFevgFBwSChAIwAgqEooQDC7KScxHDI9aW1AEKNiWCt7Z3dA4RDNc2DLW0dXdOhAL7R5XEJMIZOWeguALwAKgyGcGuxsgCUZRcQlgACYhCSDFhUqhSyknTIAG5QTlO7kuJXiwTEFEMDHidFCIFsFCw4TSwOWoVkkzAFFw6AQKCxagoYGWAF0gA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm1nAtxiFGw4AxMgAPCH2jpHKYF4+ftFEyMFhEZEO0QDK3r4ipOgUnOSsyABG3qQA7ogJQaHhEGmOINEAjKLRKNEAwuyknMRwyG01rQBCHcjdvf2DLeOEk2AtXRNTfQNDK2AAvonJ9Y0OMAoWBeg+ugAqDApwe3WpyACU9ykNjoak7m4eVAAe-miADcoFY4NEXqonqoYRBZHQ2HIgXIbK53EQvhQfkQvKxWIUIE9qu8HAABKRwuRYf4UR7w5AgsE2ImPSJSCgKBgNOjREBoihYWI5ZnbaKw9SYPRiTA2DTaTg4pFyaEQBZgCi4dAIFDquAAnYAXSAA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_select + href: https://shiny.posit.co/py/api/ui.input_select.html + signature: ui.input_select(id, label, choices, *, selected=None, multiple=False, + selectize=False, width=None, size=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/inputs/select-multiple/ + contents: + - title: Select list with grouped choices + description: To group the choices into categories, supply the `choices` argument + with a dictionary of dictionaries. `ui.input_select()` will use the top-level + keys as group labels. + apps: + - title: Preview + file: app-variation-select-list-with-grouped-choices-core.py + - title: Express + file: app-variation-select-list-with-grouped-choices-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6rOABs4xCgApkyAMTIAPH6yXl7SYI4ubqFEPv6BEMHIoQDKzq4ipOgUnOTaAEbOpADuiFFevgFBwSChAIwAgqEooQDC7KScxHDI9aW1AEKNiWCt7Z3dA4RDNc2DLW0dXdOhAL7R5XEJMIZOWeguALwAKgyGcGuxsgCUZRcQlgACYhCSDFhUqhSyknTIAG5QTlO7kuJXiwTEFEMDHidFCIFsFCw4TSwOWoVkkzAFFw6AQKCxagoYGWAF0gA + - title: Core + file: app-variation-select-list-with-grouped-choices-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm1nAtxiFGw4AxMgAPCH2jpHKYF4+ftFEyMFhEZEO0QDK3r4ipOgUnOSsyABG3qQA7ogJQaHhEGmOINEAjKLRKNEAwuyknMRwyG01rQBCHcjdvf2DLeOEk2AtXRNTfQNDK2AAvonJ9Y0OMAoWBeg+ugAqDApwe3WpyACU9ykNjoak7m4eVAAe-miADcoFY4NEXqonqoYRBZHQ2HIgXIbK53EQvhQfkQvKxWIUIE9qu8HAABKRwuRYf4UR7w5AgsE2ImPSJSCgKBgNOjREBoihYWI5ZnbaKw9SYPRiTA2DTaTg4pFyaEQBZgCi4dAIFDquAAnYAXSAA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details +A select list creates a way to select one or more items from a list. + +To add a select list that allows you to select multiple items to your app: + + 1. Add `ui.input_select()` to the UI of your app to create a select list. Where you call this function will determine where the select list appears within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_select()` to define the identifier and label of the select list. + + 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_select()` uses the dictionary keys as the list values and the dictionary values as the list labels. + + You can also supply with `choices` a dictionary of dictionaries. `ui.input_selectize()` will use the top-level keys as group labels. See Selectize with grouped choices variation. + + 4. Set the `multiple` parameter to `True` to allow the user to select multiple items at once. By default, `multiple` is `False`. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a select list: + + 1. Use `input.()` (e.g., `input.select()`) to access the selected value(s). The server value of a select list is a list of strings. + +See also: [Select (Single)](../select-single/index.qmd) and [Selectize (Multiple)](../selectize-multiple/index.qmd). Select inputs and selectize inputs are similar, but have different interfaces and provide different ways of selecting multiple options. Selectize inputs also allow you to deselect items. + +:::{#variations} +::: diff --git a/components/inputs/select-single.qmd b/components/inputs/select-single.qmd deleted file mode 100644 index e8d1c47a..00000000 --- a/components/inputs/select-single.qmd +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: "Select (Single)" -sidebar: components -previewapp: | - from shiny import App, Inputs, Outputs, Session, render, ui - - app_ui = ui.page_fluid( - ui.input_select( - "select", - "", - { - "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, - "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"} - }, - ), - ui.output_text("value"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input: Inputs, output: Outputs, session: Session): - @output - @render.text - def value(): - return f"" - - app = App(app_ui, server) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Select List - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymlnAtxCZG0wAxAA8wfaOEcpgXj5+URIhYRARkWAAyt6+wlDJxKhkHKRMAEbexADuiPFBoeEpTCBRAIwiUYhMUQDCbMQchHBMLdXNAEJtHWDdvf2DY-gTTZ3jXT19A4tRAL4JtcmOAJQ7SRGGxO5uHhQAHv5RAG5QVnBRh6r7qqqyNKxyd3I2rncEjOZAuEi8LBYhQg+yqewcAAEpBBZHQMNcyHUmF8mA8njZYViIlIyAo6MkaFEQICyBgYlkCZsoh9oOg9KJ0DYNNoOODfnJ9mBNgBdIA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_select( #<< - "select", #<< - "Select an option below:", #<< - {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.select()}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_select - href: https://shiny.posit.co/py/api/ui.input_select.html - signature: ui.input_select(id, label, choices, *, selected=None, multiple=False, selectize=False, width=None, size=None) - - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Select list with grouped choices - description: To group the choices into categories, supply the `choices` argument with a dictionary of dictionaries. `ui.input_select()` will use the top-level keys as group labels. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymlnAtxCZG0wAxAA8wfaOEcpgXj5+URIhYRARkWAAyt6+wlDJxKhkHKRMAEbexADuiPFBoeEpTCA1SfX1UQCMUYgN7SKdTFEAwmzEHIRwTG29+P1gbQBCfYPDo+Pz1e0Di2BDI2MTm2AAvgm1yS2pAEx9IFEXU11Lu+N362AXC0gzOytM768XBwe22WewBUUOTTqKWOkLODgAlCdmo5DMR3G4PBQAB7+KIANygVjgUURqnhqlUshorDkeLkNlc7gkaLIGIkXhYLEKEHhVThTAAAlIILI6BhsWQoVSmASiTZeVCIlIyAo6MkaFEQIyyBgYll5YcohToOg9KJ0DYNNoOOzaXJ4UcALpAA - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_select( #<< - "select", #<< - "Select an option below:", #<< - { #<< - "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, #<< - "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"} #<< - }, #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.select()}" - - app = App(app_ui, server) ---- - -:::{#component} -::: - -## Details - -A select list creates a way to select one or more items from a list. - -To use a select list that allows you to select a single item: - - 1. Add `ui.input_select()` to the UI of your app to create a select list. Where you call this function will determine where the select list appears within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_select()` to define the identifier and label of the select list. - - 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_select()` uses the dictionary keys as the list values and the dictionary values as the list labels. - - You can also supply with `choices` a dictionary of dictionaries. `ui.input_select()` will use the top-level keys as group labels. See the Select list with grouped choices variation. - - 4. The `multiple` parameter controls whether you can select multiple items at once. By default, `multiple` is `False`. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a select list: - - 1. Use `input.()` (e.g., `input.select()`) to access the selected value. The server value of a select list is a list of strings. When `multiple=False`, this list will have length 1. - -See also: [Select (Multiple)](select-multiple.qmd) and [Selectize (Multiple)](selectize-multiple.qmd). Select inputs and selectize inputs are similar, but have different interfaces and provide different ways of selecting multiple options. Selectize inputs also allow you to deselect items. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/inputs/select-single/app-core.py b/components/inputs/select-single/app-core.py new file mode 100644 index 00000000..9cdeffb8 --- /dev/null +++ b/components/inputs/select-single/app-core.py @@ -0,0 +1,19 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_select( # << + "select", # << + "Select an option below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + ), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.select()}" + + +app = App(app_ui, server) diff --git a/components/inputs/select-single/app-express.py b/components/inputs/select-single/app-express.py new file mode 100644 index 00000000..9946ccb8 --- /dev/null +++ b/components/inputs/select-single/app-express.py @@ -0,0 +1,14 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_select( # << + "select", # << + "Select an option below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << +) # << + + +@render.text +def value(): + return f"{input.select()}" diff --git a/components/inputs/select-single/app-preview.py b/components/inputs/select-single/app-preview.py new file mode 100644 index 00000000..8fd1b49d --- /dev/null +++ b/components/inputs/select-single/app-preview.py @@ -0,0 +1,21 @@ +from shiny import App, Inputs, Outputs, Session, ui + +app_ui = ui.page_fluid( + ui.input_select( + "select", + "", + { + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, + }, + ), + ui.output_text("value"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input: Inputs, output: Outputs, session: Session): + pass + + +app = App(app_ui, server) diff --git a/components/inputs/select-single/app-variation-select-list-with-grouped-choices-core.py b/components/inputs/select-single/app-variation-select-list-with-grouped-choices-core.py new file mode 100644 index 00000000..25d72753 --- /dev/null +++ b/components/inputs/select-single/app-variation-select-list-with-grouped-choices-core.py @@ -0,0 +1,22 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_select( + "select", + "Select an option below:", + { + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, + }, + ), + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.select()}" + + +app = App(app_ui, server) diff --git a/components/inputs/select-single/app-variation-select-list-with-grouped-choices-express.py b/components/inputs/select-single/app-variation-select-list-with-grouped-choices-express.py new file mode 100644 index 00000000..c8e3a5ea --- /dev/null +++ b/components/inputs/select-single/app-variation-select-list-with-grouped-choices-express.py @@ -0,0 +1,16 @@ +from shiny import render +from shiny.express import input, ui + +ui.input_select( + "select", + "Select an option below:", + { + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, + }, +) + + +@render.text +def value(): + return f"{input.select()}" diff --git a/components/inputs/select-single/index.qmd b/components/inputs/select-single/index.qmd new file mode 100644 index 00000000..4d8c69c8 --- /dev/null +++ b/components/inputs/select-single/index.qmd @@ -0,0 +1,75 @@ +--- +title: Select (Single) +sidebar: components +appPreview: + file: components/inputs/select-single/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/select-single/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6rOABs4xCgApkyAMTIAPH6yXl7SYI4ubqFEPv6BEMHIoQDKzq4iUPGk6BSc5MgARs6kAO6IUV6+AUHBIKEAjACCoSihAMLspJzEcMiN5fUAQs2JYO2d3b1DhCN1rcNtHV09s6EAvtGVcQCUFbGWsgACYhCSDFhUqhSyknTIAG5QToZw7ltl8cFiFIYM8XShIFsFCw4TSr1WoVk0zAFFw6AQKBhagoYFWAF0gA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm1nAtxiFGw4AxMgAPCH2jpHKYF4+ftFEyMFhEZEO0QDK3r4iUBDIpOgUnOTIAEbepADuiAlBoeH5aQ4g0QCMotEo0QDC7KScxHDIHXXtAEJdyL39g8Ntk4TTYG09UzMDQyNrYAC+icmNkQCUBw2pTlik7m4eVAAe-tEAblBWcNGnqseqvxCydDYcmechsrncRGuFFuRC8rFYJQgx1qTQcAAEpP85FgHhQLgDkK93jZkRdIlIKAoGPk6NEQOCKFhYjkSbton91Jg9GJMDYNNpOLDgXIfhAlmAKLh0AgUBK4I89gBdIA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_select + href: https://shiny.posit.co/py/api/ui.input_select.html + signature: ui.input_select(id, label, choices, *, selected=None, multiple=False, + selectize=False, width=None, size=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/inputs/select-single/ + contents: + - title: Select list with grouped choices + description: To group the choices into categories, supply the `choices` argument + with a dictionary of dictionaries. `ui.input_select()` will use the top-level + keys as group labels. + apps: + - title: Express + file: app-variation-select-list-with-grouped-choices-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrNlmsB4wH1WcADZxiFABSzkX5NLAPnrr4Ent6+AMpOLiJQEMik6BSc5MgARk6kAO6IQSFeILneXr4AjL4o+WDFAIJlPmAAwuyknMRwyNVBdcUAQrW+jc2t7b2EXfV9DU0tbcXjYAC+wbGFoWAATLUVazW0-VND252+ayMoe4NtJ0frc2eTF8hrc4sFLxAAlBYQsgACYhCSBhYKiqCiySR0ZAANygjkMcDc72yyy8YgohgYsTovhANgoWH8UUR818slGYAouHQCBQFLUFAWAF0gA + - title: Core + file: app-variation-select-list-with-grouped-choices-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm1nAtxiFOxCOQcjKYF4+fqEE9sEOoQDK3r4iUIGk6BSc5MgARt6kAO6IUTGxIKWxjqEAjKEo5WDVonUhYADC7KScxHDITVGt1QBCLaEdXT19I4SDbaPtnd291XNgAL7RgZVBoQBMLQ27zbRji5NHA3vTKKcTvbvTRHurNwt3yLurGxVB31sOAEpNkFDKR3G4PFQAB7+UIANygVjgoSBqgBqgxEFkdDYcjhchsrncRDBFAhRC8rFYWQgAOK-2QAAEpFi5FhoRQKtjkAikTY6T9HFIKAoGIE6KEQESKFhwsl+WtQpj1Jg9GJMDYNNpOBS8XJ0RAZmAKLh0AgUMa4DD1gBdIA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A select list creates a way to select one or more items from a list. + +To use a select list that allows you to select a single item: + + 1. Add `ui.input_select()` to the UI of your app to create a select list. Where you call this function will determine where the select list appears within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_select()` to define the identifier and label of the select list. + + 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_select()` uses the dictionary keys as the list values and the dictionary values as the list labels. + + You can also supply with `choices` a dictionary of dictionaries. `ui.input_select()` will use the top-level keys as group labels. See the Select list with grouped choices variation. + + 4. The `multiple` parameter controls whether you can select multiple items at once. By default, `multiple` is `False`. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a select list: + + 1. Use `input.()` (e.g., `input.select()`) to access the selected value. The server value of a select list is a list of strings. When `multiple=False`, this list will have length 1. + +See also: [Select (Multiple)](../select-multiple/index.qmd) and [Selectize (Multiple)](../selectize-multiple/index.qmd). Select inputs and selectize inputs are similar, but have different interfaces and provide different ways of selecting multiple options. Selectize inputs also allow you to deselect items. + +:::{#variations} +::: diff --git a/components/inputs/selectize-multiple.qmd b/components/inputs/selectize-multiple.qmd deleted file mode 100644 index 9cb4fee4..00000000 --- a/components/inputs/selectize-multiple.qmd +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: "Selectize (Multiple)" -sidebar: components -previewapp: | - from shiny import App, Inputs, Outputs, Session, render, ui - - app_ui = ui.page_fluid( - ui.input_selectize( - "select", - "", - { - "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, - "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"} - }, - multiple=True - ), - ui.output_text("value"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input: Inputs, output: Outputs, session: Session): - @output - @render.text - def value(): - return f"" - - app = App(app_ui, server) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Selectize (Multiple) - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymlnAtxCZDgBecDZMAMQAPOH2jjHKYF4+foFwcRIRURAxsWAAyt6+wsSo-qQsTABG3sQA7qlhkdFZTCBxAIwicYhMcQDCbMQchHBM7XVtAEKd3WB9A0Mjk-jTrT1Tvf2DwytxAL54jVkwChb+qD66ACp0CsPpBwCUaQ2ZjobE7m4eFAAeZHZgADcoFYUmBHqp7qpVLIaKw5AC5DZXO4JO8yJ8JF4WCwOKR7ogDgABKQQWR0DA-MgHGFMIEgmz4g4xKRkBR0TI0OIgZFkDAJArJBk7OJQ6DoPSidA2DTaDiY+Fye5gHYAXSAA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_selectize( #<< - "selectize", #<< - "Select options below:", #<< - {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, #<< - multiple=True #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.selectize()}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_selectize - href: https://shiny.posit.co/py/api/ui.input_selectize.html - signature: ui.input_selectize(id, label, choices, *, selected=None, multiple=False, width=None) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Selectize with grouped choices - description: To group the choices into categories, supply the `choices` argument with a dictionary of dictionaries. `ui.input_selectize()` will use the top-level keys as group labels. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymlnAtxCZDgBecDZMAMQAPOH2jjHKYF4+foFwcRIRURAxsWAAyt6+wsSo-qQsTABG3sQA7oipYZHRWUwgDRnNzXEAjHGILd0ivUxxAMJsxByEcExdg-jDYF0AQkOj45PTy-XdI6tgYxNTM7tgAL5pjZkd2QBMQyBxN3N9a4fTT9tgNytICwcbTG+nxuJxe+3WRxBcVObSaWXOsKuzRgCgs-lQPl0ABU6Appuk4QBKC7tRyGYjuNweCgADzIdjAADcoFYUmBiapCapVLIaKw5Iy5DZXO4JBSyFSJF4WCwOKRCXUkUwAAJSCCyOgYWlkOG8pjM1k2BVwmJSMgKOiZGhxEAisgYBIFZJG05xbnQdB6UToGwabQcKUCuSEs4AXSAA - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_selectize( #<< - "selectize", #<< - "Select options below:", #<< - { #<< - "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, #<< - "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"} #<< - }, #<< - multiple=True #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.selectize()}" - - app = App(app_ui, server) ---- - -:::{#component} -::: - -## Details - -A selectize list creates a way to select one or more items from a list. - -To use a selectize list that allows you to select multiple items: - - 1. Add `ui.input_selectize()` to the UI of your app to create a selectize list. Where you call this function will determine where the selectize list appears within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_selectize()` to define the identifier and label of the select list. - - 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_selectize()` uses the dictionary keys as the list values and the dictionary values as the list labels. - - You can also supply with `choices` a dictionary of dictionaries. `ui.input_selectize()` will use the top-level keys as group labels. See Selectize with grouped choices variation. - - 4. The `multiple` parameter controls whether you can select multiple items at once. Set `multiple=True` to allow the user to select multiple values. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a selectize list: - - 1. Use `input.()` (e.g., `input.selectize()`) to access the selected value(s). The server value of a selectize list is a list of strings. - -See also: [Selectize (Single)](selectize-single.qmd) and [Select (Multiple)](select-multiple.qmd). Select inputs and selectize inputs are similar, but have different interfaces and provide different ways of selecting multiple options. Selectize inputs also allow you to deselect items. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/inputs/selectize-multiple/app-core.py b/components/inputs/selectize-multiple/app-core.py new file mode 100644 index 00000000..ba840547 --- /dev/null +++ b/components/inputs/selectize-multiple/app-core.py @@ -0,0 +1,20 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_selectize( # << + "selectize", # << + "Select options below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + multiple=True, # << + ), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.selectize()}" + + +app = App(app_ui, server) diff --git a/components/inputs/selectize-multiple/app-express.py b/components/inputs/selectize-multiple/app-express.py new file mode 100644 index 00000000..896c9096 --- /dev/null +++ b/components/inputs/selectize-multiple/app-express.py @@ -0,0 +1,15 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_selectize( # << + "selectize", # << + "Select options below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + multiple=True, # << +) # << + + +@render.text +def value(): + return f"{input.selectize()}" diff --git a/components/inputs/selectize-multiple/app-preview.py b/components/inputs/selectize-multiple/app-preview.py new file mode 100644 index 00000000..63cc668a --- /dev/null +++ b/components/inputs/selectize-multiple/app-preview.py @@ -0,0 +1,25 @@ +from shiny import App, Inputs, Outputs, Session, render, ui + +app_ui = ui.page_fluid( + ui.input_selectize( + "select", + "", + { + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, + }, + multiple=True, + ), + ui.output_text("value"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input: Inputs, output: Outputs, session: Session): + @output + @render.text + def value(): + return "" + + +app = App(app_ui, server) diff --git a/components/inputs/selectize-multiple/app-variation-selectize-with-grouped-choices-core.py b/components/inputs/selectize-multiple/app-variation-selectize-with-grouped-choices-core.py new file mode 100644 index 00000000..3facca34 --- /dev/null +++ b/components/inputs/selectize-multiple/app-variation-selectize-with-grouped-choices-core.py @@ -0,0 +1,23 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_selectize( # << + "selectize", # << + "Select options below:", # << + { # << + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, # << + }, # << + multiple=True, # << + ), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.selectize()}" + + +app = App(app_ui, server) diff --git a/components/inputs/selectize-multiple/app-variation-selectize-with-grouped-choices-express.py b/components/inputs/selectize-multiple/app-variation-selectize-with-grouped-choices-express.py new file mode 100644 index 00000000..4cdcb0e1 --- /dev/null +++ b/components/inputs/selectize-multiple/app-variation-selectize-with-grouped-choices-express.py @@ -0,0 +1,18 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_selectize( # << + "selectize", # << + "Select options below:", # << + { # << + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, # << + }, # << + multiple=True, # << +) # << + + +@render.text +def value(): + return f"{input.selectize()}" diff --git a/components/inputs/selectize-multiple/index.qmd b/components/inputs/selectize-multiple/index.qmd new file mode 100644 index 00000000..c30eba97 --- /dev/null +++ b/components/inputs/selectize-multiple/index.qmd @@ -0,0 +1,77 @@ +--- +title: Selectize (Multiple) +sidebar: components +appPreview: + file: components/inputs/selectize-multiple/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/selectize-multiple/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6rOABs4xCpwBecABTJkAYmQAHiDZPz9pMEcXN084SKIA4NCIcORIgGVnVxFSdHdybQAjZ1IAd0QEv0CQsPCQSIBGAEFIlEiAYXZSTmI4ZBaqpoAhNvSwLp6+gdHCccaOsc7u3v6FyIBfRJqUtJhDJ3d0FwBeABUGQzht5NkASmrbiEsAATEISQYsKlUKWUk6MgAG5QJxXbx3SqpcJiCiGBipOiREC2ChYaI5OIQjaRWRzMAUXDoBAoAlqChgDYAXSAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm1nAtxiFTgBecDYOAMTIADwR9o6xymBePn6BcPFEyOFRMbEO8QDK3r4ipOj+5KzIAEbepADuiGlhkdEQOY4g8QCMovEo8QDC7KScxHDI3Y1dAEK9yANDI2OdM4RzYJ39s-PDo+ObYAC+6ZktbQ4wChb+6D66ACoMCnDHzdnIAJQvWa2OhqTubg8VAAHhQ7GAAG5QKypMCfVTvVRIiCyOhsOQQuQ2VzuIj-CiAoheVisTjkd4NH4OAACUhRciwIIob1RyChMJsFLesSkFAUDFadHiIBxFCwiSKKU5B3iyPUmD0YkwNg02k4RIxckREFWYAouHQCBQergoMOAF0gA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_selectize + href: https://shiny.posit.co/py/api/ui.input_selectize.html + signature: ui.input_selectize(id, label, choices, *, selected=None, multiple=False, + width=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/inputs/selectize-multiple/ + contents: + - title: Selectize with grouped choices + description: To group the choices into categories, supply the `choices` argument + with a dictionary of dictionaries. `ui.input_selectize()` will use the top-level + keys as group labels. + apps: + - title: Preview + file: app-variation-selectize-with-grouped-choices-core.py + - title: Express + file: app-variation-selectize-with-grouped-choices-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6rOABs4xCpwBecABTJkAYmQAHiDZPz9pMEcXN084SKIA4NCIcORIgGVnVxFSdHdybQAjZ1IAd0QEv0CQsPCQauS6tIiwAEZIlBBItoBBTvSwAGF2Uk5iOGQ+qp6AIQHIkbGJqfnCQbahheHR8cnNyIBfRJqUlvDIgCYB7rBL-tpF3ZX7mbu1lCflycu1oiuto8dt9kJdAcdGrVUuEIUkoWkYIYnO50C4ALwAFQYhjgJyaEAAlJCUpYAAJiCCSBhYKiqCiySR0ZAANygThx3gJlWhfjEFEMDFSdEiIFsFCw0RycU5h0isnWYAouHQCBQirUFDAhwAukA + - title: Core + file: app-variation-selectize-with-grouped-choices-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm1nAtxiFTgBecDYOAMTIADwR9o6xymBePn6BcPFEyOFRMbEO8QDK3r4ipOj+5KzIAEbepADuiGlhkdEQOY4gTVmtbTnxAIzxKCD9ooPI8QDC7KScxHDIfaOE42B9AEJjk9Oz8+uN-RObYFMzcwuHYAC+6ZktPb1gAExjw09LKFun849LRPGPG1onx2yAB+yeFw+x22Z0eF2unTuPQRGWa2RyMAUFn86B8ugAKgwFHAbmjug4AJSkrqxQykdxuDxUAAeFDsYAAblArKkwFTVBTVEKILI6Gw5By5DZXO4iPSKIyiF5WKxOOQKQ1ycgAAJSEVyLAsijo0XILk8mwa9GxKQUBQMVp0eIgGUULCJIopS2XeLC9SYPRiTA2DTaThKiVyQUQZZgCi4dAIFBxuCsq4AXSAA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A selectize list creates a way to select one or more items from a list. + +To use a selectize list that allows you to select multiple items: + + 1. Add `ui.input_selectize()` to the UI of your app to create a selectize list. Where you call this function will determine where the selectize list appears within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_selectize()` to define the identifier and label of the select list. + + 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_selectize()` uses the dictionary keys as the list values and the dictionary values as the list labels. + + You can also supply with `choices` a dictionary of dictionaries. `ui.input_selectize()` will use the top-level keys as group labels. See Selectize with grouped choices variation. + + 4. The `multiple` parameter controls whether you can select multiple items at once. Set `multiple=True` to allow the user to select multiple values. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a selectize list: + + 1. Use `input.()` (e.g., `input.selectize()`) to access the selected value(s). The server value of a selectize list is a list of strings. + +See also: [Selectize (Single)](../selectize-single/index.qmd) and [Select (Multiple)](../select-multiple/index.qmd). Select inputs and selectize inputs are similar, but have different interfaces and provide different ways of selecting multiple options. Selectize inputs also allow you to deselect items. + +:::{#variations} +::: diff --git a/components/inputs/selectize-single.qmd b/components/inputs/selectize-single.qmd deleted file mode 100644 index 3065eb55..00000000 --- a/components/inputs/selectize-single.qmd +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "Selectize (Single)" -sidebar: components -previewapp: | - from shiny import App, Inputs, Outputs, Session, render, ui - - app_ui = ui.page_fluid( - ui.input_selectize( - "select", - "", - { - "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, - "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"} - } - ), - ui.output_text("value"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input: Inputs, output: Outputs, session: Session): - @output - @render.text - def value(): - return f"" - - app = App(app_ui, server) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Selectize List - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymlnAtxCZDgBecDZMAMQAPOH2jjHKYF4+foFwcRIRURAxsWAAyt6+wlCZxKj+pEwARt7EAO6IqWGR0VlMIHEAjCJxiExxAMJsxByEcEydDR0AQt29YANDI2PT+LPtfTP9g8Oja3EAvmlNmY4AlIcZMYbE7m4eFAAeZHZgAG5QVilgZ6onqqqyNFYchechsrncEmuZFuEi8LBYHFIJ3qxwcAAEpBBZHQMA8yM0mACmG8PjZkQSYlIyAo6JkaHEQOCyBgEgVkmS9nE-tB0HpROgbBptBxYcC5L8IGA9gBdIA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_selectize( #<< - "selectize", #<< - "Select an option below:", #<< - {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.selectize()}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_selectize - href: https://shiny.posit.co/py/api/ui.input_selectize.html - signature: ui.input_selectize(id, label, choices, *, selected=None, multiple=False, width=None) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Selectize with grouped choices - description: To group the choices into categories, supply the `choices` argument with a dictionary of dictionaries. `ui.input_selectize()` will use the top-level keys as group labels. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymlnAtxCZDgBecDZMAMQAPOH2jjHKYF4+foFwcRIRURAxsWAAyt6+wlCZxKj+pEwARt7EAO6IqWGR0VlMII0ZLS1xAIxxiK09In1McQDCbMQchHBM3UP4I2DdAELDYxNTMysNPaNrYOOT07N7YAC+aU2ZndkATMMgcbfz-etHM887YLerSIuHmyYPy+t1OrwOG2OoLiZ3azSyFzh1wcAEpLh1HIZiO43B4KAAPMh2MAANygVhSYDRqhRqlUshorDkJLkNlc7gk2LIuIkXhYLA4pBR9WRTAAAlIILI6BgCWR4QymGSKTZhfCYlIyAo6JkaHEQOyyBgEgVkqqznE6dB0HpROgbBptBxecy5CjzgBdIA - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_selectize( #<< - "selectize", #<< - "Select an option below:", #<< - { #<< - "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, #<< - "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"} #<< - }, #<< - ), #<< - ui.output_text("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.selectize()}" - - app = App(app_ui, server) ---- - -:::{#component} -::: - -## Details - -A selectize list creates a way to select one or more items from a list. - -To use a selectize list that allows you to select a single item: - - 1. Add `ui.input_selectize()` to the UI of your app to create a selectize list. Where you call this function will determine where the selectize list appears within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_selectize()` to define the identifier and label of the select list. - - 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_selectize()` uses the dictionary keys as the list values and the dictionary values as the list labels. - - You can also supply with `choices` a dictionary of dictionaries. `ui.input_selectize()` will use the top-level keys as group labels. See Selectize with grouped choices variation. - - 4. The `multiple` parameter controls whether you can select multiple items at once. By default, `multiple` is `False` and the user can only select one value at a time. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a selectize list: - - 1. Use `input.()` (e.g., `input.selectize()`) to access the selected value. The server value of a selectize list is a list of strings. When `multiple=False`, this list will have length 1. - -See also: [Selectize (Multiple)](selectize-multiple.qmd) and [Select (Single)](select-single.qmd). Select inputs and selectize inputs are similar, but have different interfaces and provide different ways of selecting multiple options. Selectize inputs also allow you to deselect items. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/inputs/selectize-single/app-core.py b/components/inputs/selectize-single/app-core.py new file mode 100644 index 00000000..d9112042 --- /dev/null +++ b/components/inputs/selectize-single/app-core.py @@ -0,0 +1,19 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_selectize( # << + "selectize", # << + "Select an option below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + ), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.selectize()}" + + +app = App(app_ui, server) diff --git a/components/inputs/selectize-single/app-detail-preview.py b/components/inputs/selectize-single/app-detail-preview.py new file mode 100644 index 00000000..e91dcc5a --- /dev/null +++ b/components/inputs/selectize-single/app-detail-preview.py @@ -0,0 +1,20 @@ +## file: app.py +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_selectize( # << + "selectize", # << + "Select an option below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << + ), # << + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.selectize()}" + + +app = App(app_ui, server) diff --git a/components/inputs/selectize-single/app-express.py b/components/inputs/selectize-single/app-express.py new file mode 100644 index 00000000..80efd73d --- /dev/null +++ b/components/inputs/selectize-single/app-express.py @@ -0,0 +1,14 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_selectize( # << + "selectize", # << + "Select an option below:", # << + {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, # << +) # << + + +@render.text +def value(): + return f"{input.selectize()}" diff --git a/components/inputs/selectize-single/app-preview.py b/components/inputs/selectize-single/app-preview.py new file mode 100644 index 00000000..afec0379 --- /dev/null +++ b/components/inputs/selectize-single/app-preview.py @@ -0,0 +1,24 @@ +from shiny import App, Inputs, Outputs, Session, render, ui + +app_ui = ui.page_fluid( + ui.input_selectize( + "select", + "", + { + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, + }, + ), + ui.output_text("value"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input: Inputs, output: Outputs, session: Session): + @output + @render.text + def value(): + return "" + + +app = App(app_ui, server) diff --git a/components/inputs/selectize-single/app-variation-selectize-with-grouped-choices-core.py b/components/inputs/selectize-single/app-variation-selectize-with-grouped-choices-core.py new file mode 100644 index 00000000..98e4c88f --- /dev/null +++ b/components/inputs/selectize-single/app-variation-selectize-with-grouped-choices-core.py @@ -0,0 +1,22 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_selectize( + "selectize", + "Select an option below:", + { + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, + }, + ), + ui.output_text("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.selectize()}" + + +app = App(app_ui, server) diff --git a/components/inputs/selectize-single/app-variation-selectize-with-grouped-choices-express.py b/components/inputs/selectize-single/app-variation-selectize-with-grouped-choices-express.py new file mode 100644 index 00000000..47657718 --- /dev/null +++ b/components/inputs/selectize-single/app-variation-selectize-with-grouped-choices-express.py @@ -0,0 +1,16 @@ +from shiny import render +from shiny.express import input, ui + +ui.input_selectize( + "selectize", + "Select an option below:", + { + "1": {"1A": "Choice 1A", "1B": "Choice 1B", "1C": "Choice 1C"}, + "2": {"2A": "Choice 2A", "2B": "Choice 2B", "2C": "Choice 2C"}, + }, +) + + +@render.text +def value(): + return f"{input.selectize()}" diff --git a/components/inputs/selectize-single/index.qmd b/components/inputs/selectize-single/index.qmd new file mode 100644 index 00000000..8a9bc8ff --- /dev/null +++ b/components/inputs/selectize-single/index.qmd @@ -0,0 +1,77 @@ +--- +title: Selectize (Single) +sidebar: components +appPreview: + file: components/inputs/selectize-single/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/selectize-single/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6rOABs4xCpwBecABTJkAYmQAHiDZPz9pMEcXN084SKIA4NCIcORIgGVnVxEoVNJ0d3JkACNnUgB3RAS-QJCw8JBIgEYAQUiUSIBhdlJOYjhkNpqWgCEO9LAevoGh8cJJ5q6J7t7+waXIgF9EupSASlrky1kAATEISQYsKlUKWUk6ZAA3KCdDH33q1PCxCkMGKk6JEQLYKFhojk4t59ltIrIFmAKLh0AgUEi1BQwFsALpAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm1nAtxiFTgBecDYOAMTIADwR9o6xymBePn6BcPFEyOFRMbEO8QDK3r4iUBDIpOj+5MgARt6kAO6IaWGR0aU5DiDxAIyi8SjxAMLspJzEcMi9zT0AQv3IQyNjE91zhAtg3YPzi6Pjk9tgAL7pmW2xAJSnrdlOWKTubh5UAB4UdmAAblBWqWBXqguqmBEFkdDYck+chsrncRAeFCeRC8rFYnHIFya7QcAAEpKC5FhXhRbmDkN9fjZMbdYlIKAoGKU6PEQLCKFhEkUUlSjvEQepMHoxJgbBptJxkZC5ECIOswBRcOgECh5XA3scALpAA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_selectize + href: https://shiny.posit.co/py/api/ui.input_selectize.html + signature: ui.input_selectize(id, label, choices, *, selected=None, multiple=False, + width=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/inputs/selectize-single/ + contents: + - title: Selectize with grouped choices + description: To group the choices into categories, supply the `choices` argument + with a dictionary of dictionaries. `ui.input_selectize()` will use the top-level + keys as group labels. + apps: + - title: Preview + file: app-variation-selectize-with-grouped-choices-core.py + - title: Express + file: app-variation-selectize-with-grouped-choices-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrNlmsB4wH1WcADZxiFTgC84AClnI-yaTAHZ1cPOECCX39AgGUnFxEoCGRSdDdyZAAjJ1IAd0QIqL8QIv8-QIBGQJQSsAqAQWqAsABhdlJOYjhkBojmioAhJsC2jq6eocJ+luHW9s7uipmwAF9I5LLosAAmJtrtxtoR+fGDvsDtyZRjse7L853l67nb5G3ltdLPiABKCwhZAABMQQSQMLBUVQUWSSOjIABuUEchm8PwKGz8YgohgYyTogRANgoWGCCTCXh+K0CsimYAouHQCBQdLUFFWAF0gA + - title: Core + file: app-variation-selectize-with-grouped-choices-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKm1nAtxiFTgBecHYQjmHIymBePn6BcJEE9uEOkQDK3r4iUKGk6P7kyABG3qQA7ogJSckgVcmOkQCMkSg1YA2izRFgAMLspJzEcMjtCV0NAEKdkb39g8OThGPdUz19A0MNy2AAvomhdWGRAEydrUcdtNNrc+ejxwsoV7NDRwtEx1uPq8-IR1u7tTCAP2DgAlHswoZSO43B4qAAPCh2MAANygVniYHBqlBqjxEFkdDYchRchsrncRGhFFhRC8rFYnHIoIqIOQAAEpAS5FgERRaoTkGiMTYWYDHFIKAoGKE6JEQBSKFhopk4qLtpF8epMHoxJgbBptJw6SS5LiIIswBRcOgECgrXBETsALpAA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A selectize list creates a way to select one or more items from a list. + +To use a selectize list that allows you to select a single item: + + 1. Add `ui.input_selectize()` to the UI of your app to create a selectize list. Where you call this function will determine where the selectize list appears within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_selectize()` to define the identifier and label of the select list. + + 3. Supply the `choices` parameter with either a list or dictionary of choices. If `choices` is a list, its elements become the select list values and labels. If `choices` is a dictionary, `ui.input_selectize()` uses the dictionary keys as the list values and the dictionary values as the list labels. + + You can also supply with `choices` a dictionary of dictionaries. `ui.input_selectize()` will use the top-level keys as group labels. See Selectize with grouped choices variation. + + 4. The `multiple` parameter controls whether you can select multiple items at once. By default, `multiple` is `False` and the user can only select one value at a time. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a selectize list: + + 1. Use `input.()` (e.g., `input.selectize()`) to access the selected value. The server value of a selectize list is a list of strings. When `multiple=False`, this list will have length 1. + +See also: [Selectize (Multiple)](../selectize-multiple/index.qmd) and [Select (Single)](../select-single/index.qmd). Select inputs and selectize inputs are similar, but have different interfaces and provide different ways of selecting multiple options. Selectize inputs also allow you to deselect items. + +:::{#variations} +::: diff --git a/components/inputs/slider-range.qmd b/components/inputs/slider-range.qmd deleted file mode 100644 index 60ca7b92..00000000 --- a/components/inputs/slider-range.qmd +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: "Slider Range" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_slider("range", label="", value=[25, 70], min=1, max=100), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - def server(input, output, session): - @render.plot - def hist(): - print(input.range()) - - app = App(app_ui, server) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Slider Range - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMArhzxM6lACZw6EgILoAOhFVpUAfTFMAvKI5YoAcziaaAGzHSAFKqYODGLqhFlNLCx1l07YT95yyvhMwcESMFy6AAwRUAAeugCM0bFMAG5QVnC6wADMAKwSAGwFALoAlBhQ0tKahBZQLCx+qGQAtAVMMPHtUG7ETBTxHYSUFHTBFXj2jmIYxG6u7sPu6XIARlBkfH6Z2VMzEI5MIMENTSzBiKFg6WztKdFMAFYiLDs02O0k5OM-4zkTCyHGMEHaHAoMBYAL+dCYqF6BWCAF9VFUanULs0-DBvv0yINVrCJlNVKpZDRWHJ1r4XG4JIsyMsJCw4M0OKQKohZg4AAJM5a8ph8qQQHwYVbCykZLIiOA2bnCk5SMgiOjHGjBED0sgYAI+RVosDk6DoPRMJSoGwabTial0WkVMAospAA - height: 200px - code: | - from shiny import ui, render, App - - app_ui = ui.page_fluid( - ui.input_slider("slider", "Slider", min=0, max=100, value=[35, 65]), #<< - ui.output_text_verbatim("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.slider()}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_slider - href: https://shiny.posit.co/py/api/ui.input_slider.html - signature: ui.input_slider(id, label, min, max, value, *, step=None, ticks=False, animate=False, width=None, sep=',', pre=None, post=None, time_format=None, timezone=None, drag_range=True) - - title: ui.output_data_frame - href: https://shiny.posit.co/py/api/ui.output_data_frame.html - signature: ui.output_data_frame(id) - - title: render.data_frame - href: https://shiny.posit.co/py/api/render.data_frame.html - signature: render.data_frame(fn=None) - - title: render.DataTable - href: https://shiny.posit.co/py/api/render.DataTable.html - signature: render.DataTable(self, data, *, width='fit-content', height='500px', summary=True, filters=False, row_selection_mode='none') ---- - -:::{#component} -::: - -## Details - -A slider is a widget that lets you drag to select numbers, dates, or date-tifrom a specified range. You can use a slider to select either a single value or a range of values. - -To add a slider that lets the user select a range of values: - - 1. Add `ui.input_slider()` to the UI of your app to create a slider. Where you call this function will determine where the slider will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_slider()` to define the identifier and label of the slider. - - 3. Use the `min` and `max` parameters to define the minimum and maximum values of the slider. `min` and `max` can be numbers, dates, or date-times. Dates and date-times can be provided from the `datetime` module with the `date()` or `datetime()` functions, respectively. - - 4. Pass a list with two elements to the `value` parameter. These elements define the initial range. `value` can be a list of numbers, dates, or date-times. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a slider: - - 1. Use `input.()` (e.g., `input.slider()`) to access the value of the slider. If `value` is a list and the slider specifies a range, the server value of a slider will be a list of length 2. - -See also: [Slider](slider.qmd) - diff --git a/components/inputs/slider-range/app-core.py b/components/inputs/slider-range/app-core.py new file mode 100644 index 00000000..c095edf1 --- /dev/null +++ b/components/inputs/slider-range/app-core.py @@ -0,0 +1,15 @@ +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_slider("slider", "Slider", min=0, max=100, value=[35, 65]), # << + ui.output_text_verbatim("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.slider()}" + + +app = App(app_ui, server) diff --git a/components/inputs/slider-range/app-detail-preview.py b/components/inputs/slider-range/app-detail-preview.py new file mode 100644 index 00000000..74baf3d7 --- /dev/null +++ b/components/inputs/slider-range/app-detail-preview.py @@ -0,0 +1,20 @@ +## file: app.py +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_slider("slider", "", min=0, max=100, value=[35, 65]).add_class( + "pt-5 mx-auto text-center" + ), + ui.output_text_verbatim("value"), + {"class": "vh-100 justify-content-center align-items-center px-5"}, +).add_class("my-auto text-center") + + +def server(input, output, session): + @output + @render.text + def value(): + return f"{input.slider()}" + + +app = App(app_ui, server) diff --git a/components/inputs/slider-range/app-express.py b/components/inputs/slider-range/app-express.py new file mode 100644 index 00000000..3a1aa071 --- /dev/null +++ b/components/inputs/slider-range/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_slider("slider", "Slider", min=0, max=100, value=[35, 65]) # << + + +@render.text +def value(): + return f"{input.slider()}" diff --git a/components/inputs/slider-range/app-preview.py b/components/inputs/slider-range/app-preview.py new file mode 100644 index 00000000..f70db38c --- /dev/null +++ b/components/inputs/slider-range/app-preview.py @@ -0,0 +1,15 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_slider("range", label="", value=[25, 70], min=1, max=100), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + @render.plot + def hist(): + print(input.range()) + + +app = App(app_ui, server) diff --git a/components/inputs/slider-range/index.qmd b/components/inputs/slider-range/index.qmd new file mode 100644 index 00000000..51f6769b --- /dev/null +++ b/components/inputs/slider-range/index.qmd @@ -0,0 +1,65 @@ +--- +title: Slider Range +sidebar: components +appPreview: + file: components/inputs/slider-range/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/slider-range/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6rADadJDABTSwTl1M9FPAMrOrn7IMNwAvAAMRDBQqhEAjFExyABuUI6GcBHAAMwArEQAbAUAugCUyMgAxMgAPPWWsgACYhCuWFSqFLKSdOmZ2W4ViLLV1WIUhgwQyHSeILYUWN6uIwC+nrKEqBS46AgoYN0UYBtlQA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAV05EG1ACZwGRAIKYAOhFUZ0AfXHIAvGM44oAczia6AG3HSAFKuQODWbulEVNrC51kM7YT95yyoTIwQDKXj7BRDDcugAMMVAAHroAjPGJyABuUFZwusAAzACsRABsJQC6AJREyADEyAA8zfaO4likbq7uVMnu2XIARlAU-H65+cF1qjWqCxCydGxyQ74ubkTdFL1ErHCsrJzkNYjtDgACUktyWP0UF8jLOXmicDZnT47IUhSiDAgyDowRAmwoWACPk+AF9got1Jg9MglOgbBptBJVgx1vMICEwBRcOgEChCXABmAYVUgA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_slider + href: https://shiny.posit.co/py/api/ui.input_slider.html + signature: ui.input_slider(id, label, min, max, value, *, step=None, ticks=False, + animate=False, width=None, sep=',', pre=None, post=None, time_format=None, timezone=None, + drag_range=True) + - title: ui.output_data_frame + href: https://shiny.posit.co/py/api/ui.output_data_frame.html + signature: ui.output_data_frame(id) + - title: render.data_frame + href: https://shiny.posit.co/py/api/render.data_frame.html + signature: render.data_frame(fn=None) + - title: render.DataTable + href: https://shiny.posit.co/py/api/render.DataTable.html + signature: render.DataTable(self, data, *, width='fit-content', height='500px', + summary=True, filters=False, row_selection_mode='none') +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A slider is a widget that lets you drag to select numbers, dates, or date-tifrom a specified range. You can use a slider to select either a single value or a range of values. + +To add a slider that lets the user select a range of values: + + 1. Add `ui.input_slider()` to the UI of your app to create a slider. Where you call this function will determine where the slider will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_slider()` to define the identifier and label of the slider. + + 3. Use the `min` and `max` parameters to define the minimum and maximum values of the slider. `min` and `max` can be numbers, dates, or date-times. Dates and date-times can be provided from the `datetime` module with the `date()` or `datetime()` functions, respectively. + + 4. Pass a list with two elements to the `value` parameter. These elements define the initial range. `value` can be a list of numbers, dates, or date-times. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a slider: + + 1. Use `input.()` (e.g., `input.slider()`) to access the value of the slider. If `value` is a list and the slider specifies a range, the server value of a slider will be a list of length 2. + +See also: [Slider](../slider/index.qmd) diff --git a/components/inputs/slider.qmd b/components/inputs/slider.qmd deleted file mode 100644 index f8b2e90c..00000000 --- a/components/inputs/slider.qmd +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "Slider" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_slider("x", "", min=0, max=20, value=10), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input, output, session): - @render.text - def txt(): - return f"" - - app = App(app_ui, server, debug=True) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Slider - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMArhzxM6lACZw6EgILoAOhFVpUAfTFMAvKI5YoAcziaaAGzHSAFKqYODGLqhFlNLCx1l07YT95yyvhMwcESAAwSAIwRUUwArBEAlBhQ0tKahBZQLCx+qGQAtAlMMAAeRVBuxEwU5cWElBR0wcl49o5iGMRuru717gBucgBGUGR8fkNQVnBtHRCOTCDB2bkswYihYENsRbERTABWIiyTNNhFJOTN181yTLMcxhBFHBQwLPe3dEyolQSwQAvqpUulMus8n4YFdqmRaoMfi02qpVLIaKw5CNfC43BJemR+hIWHA8hxSMlEJ0HAABQn9GlMWlSCA+DCDJkYpgzOY2KlM5ZSMgiOhLGjBEB4sgYAI+fmgsBo6DoPRMJSoGwabTiLF0HHJMDAgC6QA - height: 200px - code: | - from shiny import ui, render, App - - app_ui = ui.page_fluid( - ui.input_slider("slider", "Slider", 0, 100, 50), #<< - ui.output_text_verbatim("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return f"{input.slider()}" - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_slider - href: https://shiny.posit.co/py/api/ui.input_slider.html - signature: ui.input_slider(id, label, min, max, value, *, step=None, ticks=False, animate=False, width=None, sep=',', pre=None, post=None, time_format=None, timezone=None, drag_range=True) ---- - -:::{#component} -::: - -## Details - -A slider is a widget that lets you drag to select a number, date, or date-time from a specified range. - -To add a slider to your app: - - 1. Add `ui.input_slider()` to the UI of your app to create a slider. Where you call this function will determine where the slider will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_slider()` to define the identifier and label of the slider. - - 3. Use the `min` and `max` parameters to define the minimum and maximum values of the slider. - - 4. Set the `value` parameter to define the starting slider value. `min`, `max`, and `value` can be numbers, dates, or date-times. Dates and date-times can be provided from the `datetime` module with the `date()` or `datetime()` functions, respectively. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a slider: - - 1. Use `input.()` (e.g., `input.slider()`) to access the value of the slider. The server value of a slider is a number, date, or date-time (depending on the class of `value`). - -See also: [Slider Range](slider-range.qmd) diff --git a/components/inputs/slider/app-core.py b/components/inputs/slider/app-core.py new file mode 100644 index 00000000..d11e33b7 --- /dev/null +++ b/components/inputs/slider/app-core.py @@ -0,0 +1,15 @@ +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_slider("slider", "Slider", 0, 100, 50), # << + ui.output_text_verbatim("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return f"{input.slider()}" + + +app = App(app_ui, server) diff --git a/components/inputs/slider/app-detail-preview.py b/components/inputs/slider/app-detail-preview.py new file mode 100644 index 00000000..9412d714 --- /dev/null +++ b/components/inputs/slider/app-detail-preview.py @@ -0,0 +1,18 @@ +## file: app.py +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_slider("slider", "", 0, 100, 50).add_class("pt-5 mx-auto text-center"), + ui.output_text_verbatim("value"), + {"class": "vh-100 justify-content-center align-items-center px-5"}, +).add_class("my-auto text-center") + + +def server(input, output, session): + @output + @render.text + def value(): + return f"{input.slider()}" + + +app = App(app_ui, server) diff --git a/components/inputs/slider/app-express.py b/components/inputs/slider/app-express.py new file mode 100644 index 00000000..ae9e9504 --- /dev/null +++ b/components/inputs/slider/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +(ui.input_slider("slider", "Slider", 0, 100, 50),) # << + + +@render.text +def value(): + return f"{input.slider()}" diff --git a/components/inputs/slider/app-preview.py b/components/inputs/slider/app-preview.py new file mode 100644 index 00000000..7286b989 --- /dev/null +++ b/components/inputs/slider/app-preview.py @@ -0,0 +1,14 @@ +from shiny import App, ui + +app_ui = ui.page_fluid( + ui.input_slider("x", "", min=0, max=20, value=10), + ui.output_text_verbatim("txt"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + pass + + +app = App(app_ui, server, debug=True) diff --git a/components/inputs/slider/index.qmd b/components/inputs/slider/index.qmd new file mode 100644 index 00000000..770b57ad --- /dev/null +++ b/components/inputs/slider/index.qmd @@ -0,0 +1,55 @@ +--- +title: Slider +sidebar: components +appPreview: + file: components/inputs/slider/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/slider/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQAFGawHjAfVYAbTpIZXpYF26leiXgDKru7+yAAMRACM4ZHIAKzhAJQEScjIAMTIADzZlrIAAmIQ7lhUqhSyknTIAG5QzoZwVkmIsunpYhSGDBDIdF4g9hRYPu4tAL5esoSoFLjoCChg5RRgEwC6QA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAV05EG1ACZwGRAIKYAOhFUZ0AfXHIAvGM44oAczia6AG3HSAFKuQODWbulEVNrC51kM7YT95yyoTIwQDKXj7BRAAMRACMMXHIAKwxAJREyADEyAA8efaO4likbq7uVAAe7gBucgBGUBT8frVQVnDBmarpqv0QsnRscvW+Lm5EZRQVRKxwrKyc5OmIRQ4AAlKDcljVFOvIQ8jtnTarh47IUhSiDBDIdMEgExRYAT7nAL7BA+qYemQSnQNg02gkIwYYz6EBCYAouHQCBQ8LgNTAXwAukA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_slider + href: https://shiny.posit.co/py/api/ui.input_slider.html + signature: ui.input_slider(id, label, min, max, value, *, step=None, ticks=False, + animate=False, width=None, sep=',', pre=None, post=None, time_format=None, timezone=None, + drag_range=True) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A slider is a widget that lets you drag to select a number, date, or date-time from a specified range. + +To add a slider to your app: + + 1. Add `ui.input_slider()` to the UI of your app to create a slider. Where you call this function will determine where the slider will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_slider()` to define the identifier and label of the slider. + + 3. Use the `min` and `max` parameters to define the minimum and maximum values of the slider. + + 4. Set the `value` parameter to define the starting slider value. `min`, `max`, and `value` can be numbers, dates, or date-times. Dates and date-times can be provided from the `datetime` module with the `date()` or `datetime()` functions, respectively. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a slider: + + 1. Use `input.()` (e.g., `input.slider()`) to access the value of the slider. The server value of a slider is a number, date, or date-time (depending on the class of `value`). + +See also: [Slider Range](../slider-range/index.qmd) diff --git a/components/inputs/switch.qmd b/components/inputs/switch.qmd deleted file mode 100644 index 966aaa64..00000000 --- a/components/inputs/switch.qmd +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: "Switch" -sidebar: components -previewapp: | - from shiny import ui, render, App - app_ui = ui.page_fluid( - ui.input_switch("switch", "Make it switchable", True).add_class("mb-0"), - ui.output_ui("value"), - {"class": "vh-100 d-flex flex-column justify-content-center align-items-center px-4"} - ) - def server(input, output, session): - @render.ui - def value(): - return "" - app = App(app_ui, server) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Switch - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMArhzxM6lACZw6EgILoAOhFVpUAfTFMAvKI5YoAcziaaAGzHSAFKqYODGLqhFlNLAO4cyhNnbAvHz9lfCZQgGVvXzZQiQAVOhE4AEo8e0cxDGI3V3cxAIA3KCs4ULTVFIwoaWlNQgsoFhYA1ABaAFZy1VVZGlY5QrkbFzcJHLI8iRY4Zo5SFMQMhwABCbzlphWpCFk6DDFNvqZi0ptFzcdJODIROgheCDyMIJjznuh0PSYlVBsNbTiAZ0IZ0FJgAC+AF0gA - height: 200px - code: | - from shiny import ui, render, App - - app_ui = ui.page_fluid( - ui.input_switch("switch", "Switch", False), #<< - ui.output_ui("value"), - ) - - def server(input, output, session): - @render.ui - def value(): - return input.switch() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_switch - href: https://shiny.posit.co/py/api/ui.input_switch.html - signature: ui.input_switch(id, label, value=False, *, width=None) ---- - -:::{#component} -::: - -## Details - -A switch allows you to select between logical values. - -To add a switch to your app: - - 1. Add `ui.input_switch()` to the UI of your app to create a switch. Where you call this function will determine where the switch will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_switch()` to define the identifier and label of the switch. - - 3. By default, the `value` parameter, which defines the switch's initial value, is `False`. If you'd like the initial value to be `True`, set `value` equal to `True`. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a switch: - - 1. Use `input.()` (e.g., `input.switch()`) to access the value of the switch. The server value of a switch is `True` if checked and `False` otherwise. diff --git a/components/inputs/switch/app-core.py b/components/inputs/switch/app-core.py new file mode 100644 index 00000000..35d4b58d --- /dev/null +++ b/components/inputs/switch/app-core.py @@ -0,0 +1,15 @@ +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_switch("switch", "Switch", False), # << + ui.output_ui("value"), +) + + +def server(input, output, session): + @render.ui + def value(): + return input.switch() + + +app = App(app_ui, server) diff --git a/components/inputs/switch/app-detail-preview.py b/components/inputs/switch/app-detail-preview.py new file mode 100644 index 00000000..c4f28561 --- /dev/null +++ b/components/inputs/switch/app-detail-preview.py @@ -0,0 +1,17 @@ +## file: app.py +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_switch("switch", "Switch", True), + ui.output_ui("value"), +).add_class("p-5") + + +def server(input, output, session): + @output + @render.ui + def value(): + return input.switch() + + +app = App(app_ui, server) diff --git a/components/inputs/switch/app-express.py b/components/inputs/switch/app-express.py new file mode 100644 index 00000000..5a7a2fbb --- /dev/null +++ b/components/inputs/switch/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_switch("switch", "Switch", False) # << + + +@render.ui +def value(): + return input.switch() diff --git a/components/inputs/switch/app-preview.py b/components/inputs/switch/app-preview.py new file mode 100644 index 00000000..85dfdc20 --- /dev/null +++ b/components/inputs/switch/app-preview.py @@ -0,0 +1,16 @@ +from shiny import App, ui + +app_ui = ui.page_fluid( + ui.input_switch("switch", "Make it switchable", True).add_class("mb-0"), + ui.output_ui("value"), + { + "class": "vh-100 d-flex flex-column justify-content-center align-items-center px-4" + }, +) + + +def server(input, output, session): + pass + + +app = App(app_ui, server) diff --git a/components/inputs/switch/index.qmd b/components/inputs/switch/index.qmd new file mode 100644 index 00000000..a7f1b721 --- /dev/null +++ b/components/inputs/switch/index.qmd @@ -0,0 +1,49 @@ +--- +title: Switch +sidebar: components +appPreview: + file: components/inputs/switch/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/switch/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6rAO6cKxdgAppYJy7deiXgDKzq7s-sgAYlAANqxwAJTIyADEyAA8aZayAAJiEJIMWGayknTIAG4xhnDu8YiySUliFIYMEHwQRhRYPqG1soSoFLjoCChgVKoUYAC+ALpAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAV05EG1ACZwGRAIKYAOhFUZ0AfXHIAvGM44oAczia6AG3HSAFKuQODWbulEVNrAO6cKxdnbAvHz9lQmRQgGVvX3ZQogAxKAtWOABKImQAYmQAHhz7R3EsUjdXd3EAgDck0ThQ9NVU1WaIWTo2OUq5Gxc3IhKKMqIU1lZOclTEAocAASlWuSxxaeQ25GqrOBtJlcdkKQpRBgg+CDKsIJjtlvVMPWQldBsNbQkOhi6GJogwsApcdAIFB-OAADwoYAAvgBdIA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_switch + href: https://shiny.posit.co/py/api/ui.input_switch.html + signature: ui.input_switch(id, label, value=False, *, width=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A switch allows you to select between logical values. + +To add a switch to your app: + + 1. Add `ui.input_switch()` to the UI of your app to create a switch. Where you call this function will determine where the switch will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_switch()` to define the identifier and label of the switch. + + 3. By default, the `value` parameter, which defines the switch's initial value, is `False`. If you'd like the initial value to be `True`, set `value` equal to `True`. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a switch: + + 1. Use `input.()` (e.g., `input.switch()`) to access the value of the switch. The server value of a switch is `True` if checked and `False` otherwise. diff --git a/components/inputs/text-area.qmd b/components/inputs/text-area.qmd deleted file mode 100644 index 8359b8c5..00000000 --- a/components/inputs/text-area.qmd +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: "Text Area" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_text_area("x", "", placeholder="Enter text"), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input, output, session): - @render.text - def txt(): - return f'' - - app = App(app_ui, server, debug=True) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Text Area - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMArhzxM6lACZw6EgILoAOhFVpUAfTFMAvKI5YoAcziaaAGzHSAFKqYODGLqhFlNFAB7uoUqHbAvMl84KGV8JnDwiXCACTgLC2ImAHVBC2lwgEoMKGlpTUILKBYWANQyAFoAViYYT0qoN2SgysJKCjpsvHtHMQxiN1d3IM0ANzkAIygyPgCxqCs4bt6HEHCikpZwxEiwMbZKgEYABhOmACsRFlmabDbSCnI2jrkmRY5jCEqOChgWF7kN6oBrVcIAX1UOTyBU2pQCMHuTTILTg3kBnWyqlUshorDkEzoNhcbgkgzIwwkLDgpQ4pCyiFWTAAAlIILI6BggkzcUwFksbAymY5JHAyCI6BBeBBhly0cE-ILsdB0HomEpUDYNNpxPi6ISsqowOCALpAA - height: 200px - code: | - from shiny import ui, render, App - - app_ui = ui.page_fluid( - ui.input_text_area("textarea", "Text input", "Hello World"), #<< - ui.output_text_verbatim("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return input.textarea() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_text_area - href: https://shiny.posit.co/py/api/ui.input_text_area.html - signature: ui.input_text_area(id, label, value='', *, width=None, height=None, cols=None, rows=None, placeholder=None, resize=None, autoresize=False, autocomplete=None, spellcheck=None) ---- - -:::{#component} -::: - -## Details - -Create a textarea input control for entry of unstructured text values. - -To add a textarea to your app: - - 1. Add `ui.input_text_area()` to the UI of your app to create a textarea. Where you call this function will determine where the textarea will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_text_area()` to define the identifier and label of the textarea. - - 3. By default, the `value` parameter, which defines the textarea's initial value, is the empty string (`''`). Provide a different string to `value` to change the initial text. - - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a textarea: - - 1. Use `input.()` (e.g., `input.textarea()`) to access the value of the textarea. The server value of a textarea is a string containing the current text input. - -See also: [Text Box](text-box.qmd) diff --git a/components/inputs/text-area/app-core.py b/components/inputs/text-area/app-core.py new file mode 100644 index 00000000..bac1d55d --- /dev/null +++ b/components/inputs/text-area/app-core.py @@ -0,0 +1,15 @@ +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_text_area("textarea", "Text input", "Hello World"), # << + ui.output_text_verbatim("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return input.textarea() + + +app = App(app_ui, server) diff --git a/components/inputs/text-area/app-detail-preview.py b/components/inputs/text-area/app-detail-preview.py new file mode 100644 index 00000000..c7d0209f --- /dev/null +++ b/components/inputs/text-area/app-detail-preview.py @@ -0,0 +1,19 @@ +## file: app.py +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_text_area("textarea", "", "Hello World").add_class( + "pt-5 mx-auto text-center" + ), + ui.output_text_verbatim("value"), + {"class": "vh-100 justify-content-center align-items-center px-5"}, +).add_class("my-auto text-center") + + +def server(input, output, session): + @render.text + def value(): + return input.textarea() + + +app = App(app_ui, server) diff --git a/components/inputs/text-area/app-express.py b/components/inputs/text-area/app-express.py new file mode 100644 index 00000000..22de89ba --- /dev/null +++ b/components/inputs/text-area/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +(ui.input_text_area("textarea", "Text input", "Hello World"),) # << + + +@render.text +def value(): + return input.textarea() diff --git a/components/inputs/text-area/app-preview.py b/components/inputs/text-area/app-preview.py new file mode 100644 index 00000000..d8fdab70 --- /dev/null +++ b/components/inputs/text-area/app-preview.py @@ -0,0 +1,14 @@ +from shiny import App, ui + +app_ui = ui.page_fluid( + ui.input_text_area("x", "", placeholder="Enter text"), + ui.output_text_verbatim("txt"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + pass + + +app = App(app_ui, server, debug=True) diff --git a/components/inputs/text-area/index.qmd b/components/inputs/text-area/index.qmd new file mode 100644 index 00000000..a2f8e663 --- /dev/null +++ b/components/inputs/text-area/index.qmd @@ -0,0 +1,54 @@ +--- +title: Text Area +sidebar: components +appPreview: + file: components/inputs/text-area/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/text-area/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQAFGawHjAfSqqKDqGKhXpYZxXdwobyJvABU1fQgjCiDkbwAJOAAbRNJkAHUhRPFvAEoCHORkAGJkAB5Sy1kAATEISQYsX1lJOmQANyhEwzgrHMRZQsKxCkMGCD5I40bw-08c2UJUClx0BBQfcLAAXwBdIA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAV05EG1ACZwGRAIKYAOhFUZ0AfXHIAvGM44oAczia6AG3HSAFKuQODWbulEVNVAB7uoUqHbAvCl84KGVCZHCAFThvPghXCnCicIAJOAsLUmQAdSELaXCASiJkAGJkAB5K+0dxLFI3RI9Y9wA3OQAjKAp+ALaoKzhiglUi1QmIWTo2OQ6GGxc3IkaKRKJWOFZWTnIixFqHAAEpKbksIMPkaeQBoZt9q8dkKQpRBgh4xIvWkP9xtSAjR6ZBKdA2DTaCSzBjzAERQK4dAIFCBVpgAC+AF0gA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_text_area + href: https://shiny.posit.co/py/api/ui.input_text_area.html + signature: ui.input_text_area(id, label, value='', *, width=None, height=None, + cols=None, rows=None, placeholder=None, resize=None, autoresize=False, autocomplete=None, + spellcheck=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +Create a textarea input control for entry of unstructured text values. + +To add a textarea to your app: + + 1. Add `ui.input_text_area()` to the UI of your app to create a textarea. Where you call this function will determine where the textarea will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_text_area()` to define the identifier and label of the textarea. + + 3. By default, the `value` parameter, which defines the textarea's initial value, is the empty string (`''`). Provide a different string to `value` to change the initial text. + + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a textarea: + + 1. Use `input.()` (e.g., `input.textarea()`) to access the value of the textarea. The server value of a textarea is a string containing the current text input. + +See also: [Text Box](../text-box/index.qmd) diff --git a/components/inputs/text-box.qmd b/components/inputs/text-box.qmd deleted file mode 100644 index 5fdf2817..00000000 --- a/components/inputs/text-box.qmd +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: "Text Box" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_text("x", "", placeholder="Enter text"), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4"} - ) - - def server(input, output, session): - @render.text - def txt(): - return f'' - - app = App(app_ui, server, debug=True) -listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Text Box - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMArhzxM6lACZw6EgILoAOhFVpUAfTFMAvKI5YoAcziaaAGzHSAFKqYODGLqhFlNFAB5k7YL2WV8JkDAiUCAUXI5Jn8MOMCASgwoaWlNQgsoFhZfVDIAWgBWJhhPfKg3Yhi4b3zCSgo6RLx7RzEMYjdXd39NADc5ACMoMj5fPqgrOGbWhxBAjKyWQMRgsD62fIBGAAYdpgArERZRmmw60gpyOoboyY5jCHyOChgWG6i6JlQywsCAX1USRSaUW2V8MHOFTIVX8H0aiVUqlkNFYcgGdBsLjcEk6ZG6EhYcGyHFICUQsyYAAE8d1KVSpBBZHQMP5KSimBMpjZyZTHJI4GQRHQILwIN1WTUfAkkdB0HomEpUDYNNpxGi6BiEmB-gBdIA - height: 200px - code: | - from shiny import ui, render, App - - app_ui = ui.page_fluid( - ui.input_text("text", "Text input", "Enter text..."), #<< - ui.output_text_verbatim("value"), - ) - - def server(input, output, session): - @render.text - def value(): - return input.text() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.input_text - href: https://shiny.posit.co/py/api/ui.input_text.html - signature: ui.input_text(id, label, value='', *, width=None, placeholder=None, autocomplete='off', spellcheck=None) ---- - -:::{#component} -::: - -## Details - -Create input control for entry of text values. - -To add a text box to your app: - - 1. Add `ui.input_text()` to the UI of your app to create a text box. Where you call this function will determine where the text box will appear within the app's layout. - - 2. Specify the `id` and `label` parameters of `ui.input_text_area()` to define the identifier and label of the text box. - - 3. By default, the `value` parameter, which defines the text box's initial value, is the empty string (`''`). Provide a different string to `value` to change the initial text. - -The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a text box: - - 1. Use `input.()` (e.g., `input.text()`) to access the value of the text box. The server value of a text box is a string containing the current text input. - -See also: [Text Area](text-area.qmd) \ No newline at end of file diff --git a/components/inputs/text-box/app-core.py b/components/inputs/text-box/app-core.py new file mode 100644 index 00000000..24ddd7d7 --- /dev/null +++ b/components/inputs/text-box/app-core.py @@ -0,0 +1,15 @@ +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_text("text", "Text input", "Enter text..."), # << + ui.output_text_verbatim("value"), +) + + +def server(input, output, session): + @render.text + def value(): + return input.text() + + +app = App(app_ui, server) diff --git a/components/inputs/text-box/app-detail-preview.py b/components/inputs/text-box/app-detail-preview.py new file mode 100644 index 00000000..c4e1c9a4 --- /dev/null +++ b/components/inputs/text-box/app-detail-preview.py @@ -0,0 +1,18 @@ +## file: app.py +from shiny import ui, render, App + +app_ui = ui.page_fluid( + ui.input_text("text", "", "Enter text...").add_class("pt-5 mx-auto text-center"), + ui.output_text_verbatim("value"), + {"class": "vh-100 justify-content-center align-items-center px-5"}, +).add_class("my-auto text-center") + + +def server(input, output, session): + @output + @render.text + def value(): + return input.text() + + +app = App(app_ui, server) diff --git a/components/inputs/text-box/app-express.py b/components/inputs/text-box/app-express.py new file mode 100644 index 00000000..f11b9e8d --- /dev/null +++ b/components/inputs/text-box/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + + +ui.input_text("text", "Text input", "Enter text...") # << + + +@render.text +def value(): + return input.text() diff --git a/components/inputs/text-box/app-preview.py b/components/inputs/text-box/app-preview.py new file mode 100644 index 00000000..c1fc4ea9 --- /dev/null +++ b/components/inputs/text-box/app-preview.py @@ -0,0 +1,14 @@ +from shiny import App, ui + +app_ui = ui.page_fluid( + ui.input_text("x", "", placeholder="Enter text"), + ui.output_text_verbatim("txt"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4"}, +) + + +def server(input, output, session): + pass + + +app = App(app_ui, server, debug=True) diff --git a/components/inputs/text-box/index.qmd b/components/inputs/text-box/index.qmd new file mode 100644 index 00000000..2f2306d5 --- /dev/null +++ b/components/inputs/text-box/index.qmd @@ -0,0 +1,52 @@ +--- +title: Text Box +sidebar: components +appPreview: + file: components/inputs/text-box/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/inputs/text-box/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrIsQzWA8YD6VVRQAU0sI4puibgCpr9EEaehMhuAKKUUsgeWLFuAJTIyADEyAA8aZayAAJiEJIMWB6yknTIAG5QADaGcM7xiLJJSWIUhgwQfIHGRf71siHuuOgIKO7+YAC+ALpAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAV05EG1ACZwGRAIKYAOhFUZ0AfXHIAvGM44oAczia6AG3HSAFKuQODWbulEVNVAB4U7YLxWVCZECAFThvPghXAKDAgFFKOWR-LFTAgEoiZABiZAAePPtHcSxSN2iPcPcANzkAIygKfl9qqCs4DIJVdNVeiFk6NjlahhsXNyIyimiiVjhWVk5ydMQihwABKX65LH815AHkVvabFf3HZCkKUQYISOjdqtO+9Uw9ZCV0Gw1tCSGGEY9CBBPy4dAIFB+KpgAC+AF0gA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + contents: + - title: ui.input_text + href: https://shiny.posit.co/py/api/ui.input_text.html + signature: ui.input_text(id, label, value='', *, width=None, placeholder=None, + autocomplete='off', spellcheck=None) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +Create input control for entry of text values. + +To add a text box to your app: + + 1. Add `ui.input_text()` to the UI of your app to create a text box. Where you call this function will determine where the text box will appear within the app's layout. + + 2. Specify the `id` and `label` parameters of `ui.input_text_area()` to define the identifier and label of the text box. + + 3. By default, the `value` parameter, which defines the text box's initial value, is the empty string (`''`). Provide a different string to `value` to change the initial text. + +The value of an input component is accessible as a reactive value within the `server()` function. To access the value of a text box: + + 1. Use `input.()` (e.g., `input.text()`) to access the value of the text box. The server value of a text box is a string containing the current text input. + +See also: [Text Area](../text-area/index.qmd) diff --git a/components/migrate.py b/components/migrate.py new file mode 100644 index 00000000..c7b0bdbb --- /dev/null +++ b/components/migrate.py @@ -0,0 +1,287 @@ +import logging +import os + +import yaml as yml +from _qmd import find_qmds, get_qmd_split + +lg = logging.getLogger("migrate") +if len(lg.handlers) == 0: + formatter = logging.Formatter("%(levelname)s %(message)s") + console_handler = logging.StreamHandler() + console_handler.setFormatter(formatter) + lg.addHandler(console_handler) + lg.setLevel(logging.INFO) + + +def extract_component_parts(path): + if isinstance(path, str): + meta, _ = get_qmd_split(path) + else: + meta = path + + info = {} + info["_slug"] = meta["_slug"] + info["_dir"] = meta["_dir"] + info["title"] = meta["title"] + info["sidebar"] = "components" + + if "preview" in meta: + info["preview"] = meta["preview"] + + if "previewapp" in meta: + info["appPreview"] = {"code": meta["previewapp"]} + + if not "listing" in meta: + return info + + # Find the core app from the listing keys + listing = meta["listing"] + if not isinstance(listing, list): + listing = [listing] + + # if listing is an array, then it should be the component + if isinstance(listing, list): + for l in listing: + if "id" in l and l["id"] == "component": + info["relevantFunctions"] = l["contents"][0]["relevantfunctions"] + info["example"] = { + "code": l["contents"][0]["code"], + "shinylive": l["contents"][0]["preview"], + } + + if "height" in l["contents"][0]: + info["example"]["height"] = l["contents"][0]["height"] + + if "id" in l and l["id"] == "variations": + info["variations"] = l["contents"]["variations"] + # rename info["variations"]["preview"] to info["variations"]["shinylive"] + for variation in info["variations"]: + variation["shinylive"] = variation["preview"] + del variation["preview"] + + return info + + +def write_new_component_dir(path): + meta, body = get_qmd_split(path) + info = extract_component_parts(meta) + + os.makedirs(info["_dir"], exist_ok=True) + + new_meta = {} + new_meta["title"] = info["title"] + new_meta["sidebar"] = info["sidebar"] + + # Add preview html if needed + if "preview" in info: + lg.info(f"{info['_slug']} has a preview") + new_meta["preview"] = info["preview"] + + # Write out app-preview.py + if "appPreview" in info: + path_preview = os.path.join(info["_dir"], "app-preview.py") + new_meta["appPreview"] = {"file": path_preview} + + with open(path_preview, "w") as f: + f.write(info["appPreview"]["code"]) + + new_meta["listing"] = [] + + # Write out app-core and app-express + if "example" in info: + l_example = { + "id": "example", + "template": "../../_partials/components-detail-example.ejs", + "template-params": { + "dir": info["_dir"] + "/", + }, + "contents": [], + } + + base = {} + if "height" in info["example"]: + base["height"] = info["example"]["height"] + if "shinylive" in info["example"]: + base["shinylive"] = info["example"]["shinylive"] + + core = {"title": "Core", "file": "app-core.py"} + + express = {"title": "Express", "file": "app-express.py"} + + core.update(base) + express.update(base) + + l_example["contents"].append(core) + l_example["contents"].append(express) + + new_meta["listing"].append(l_example) + + path_core = os.path.join(info["_dir"], "app-core.py") + path_express = os.path.join(info["_dir"], "app-express.py") + + with open(path_core, "w") as f: + f.write(info["example"]["code"]) + + with open(path_express, "w") as f: + f.write("# FIXME: Rewrite as an Express app\n") + f.write(info["example"]["code"]) + + # Relevant functions + if "relevantFunctions" in info: + l_relevant = { + "id": "relevant-functions", + "template": "../../_partials/components-detail-relevant-functions.ejs", + "template-params": { + "dir": info["_dir"] + "/", + }, + "contents": info["relevantFunctions"], + } + + new_meta["listing"].append(l_relevant) + + # Write out variations + if "variations" in info: + l_variations = { + "id": "variations", + "template": "../../_partials/components-variations.ejs", + "template-params": { + "dir": info["_dir"] + "/", + }, + "contents": [], + } + + for variation in info["variations"]: + new_var = {} + new_var["title"] = variation["title"] + new_var["description"] = variation["description"] + + # slugify the title + var_slug = variation["title"].lower().replace(" ", "-").replace("/", "-") + + new_var["apps"] = [ + { + "title": "Core", + "file": f"app-variation-{var_slug}-core.py", + "shinylive": variation.get( + "shinylive", "#FIXME: Add shinylive link" + ), + }, + { + "title": "Express", + "file": f"app-variation-{var_slug}-express.py", + "shinylive": variation.get( + "shinylive", "#FIXME: Add shinylive link" + ), + }, + ] + + if "height" in variation: + for app in new_var["apps"]: + app["height"] = variation["height"] + + l_variations["contents"].append(new_var) + + path_core = os.path.join(info["_dir"], new_var["apps"][0]["file"]) + path_express = os.path.join(info["_dir"], new_var["apps"][1]["file"]) + + with open(path_core, "w") as f: + f.write(variation["code"]) + + with open(path_express, "w") as f: + f.write("# FIXME: Rewrite as an Express app\n") + f.write(variation["code"]) + + new_meta["listing"].append(l_variations) + + # Write out index.qmd + path_index = os.path.join(info["_dir"], "index.qmd") + with open(path_index, "w") as f: + f.write("---\n") + f.write(yml.dump(new_meta, sort_keys=False, indent=2, default_flow_style=False)) + f.write("---\n\n") + f.write( + body.replace( + ":::{#component}\n:::", + ":::{#example}\n:::\n\n:::{#relevant-functions}\n:::", + ) + ) + + +def migrate_directory(dir, exclude=[], clean=False): + qmd_list = find_qmds(dir, exclude) + for qmd in qmd_list: + lg.info(f"Processing {qmd}") + write_new_component_dir(qmd) + if clean: + os.remove(qmd) + lg.info(f"\u2713 Migrated {qmd}") + + +def migrate_all(dirs): + for dir in dirs: + lg.info(f"Migrating {dir} -------------------------") + migrate_directory(dir) + + +# Step 2: Fix component previews ---------------------------------------------- +def rewrite_preview_app(qmd): + meta, body = get_qmd_split(qmd) + + if not "listing" in meta: + return + + import shinylive._url as shlive + from shinylive import decode_shinylive_url, encode_shinylive_url + + ex_listing = [e for e in meta["listing"] if e["id"] == "example"][0] + examples = ex_listing["contents"] + + shinylive_urls = [e["shinylive"] for e in examples if "shinylive" in e] + + app_preview_bundle = decode_shinylive_url(shinylive_urls[0]) + + preview = {"title": "Preview", "file": "app-detail-preview.py"} + + if "height" in examples[0]: + preview["height"] = examples[0]["height"] + + with open(os.path.join(meta["_dir"], preview["file"]), "w") as f: + f.write(shlive.create_shinylive_chunk_contents(app_preview_bundle)) + + for ex in examples: + if "height" in ex: + del ex["height"] + + examples.insert(0, preview) + + for ex in examples: + if ex["title"] == "Preview": + continue + app_path = os.path.join(meta["_dir"], ex["file"]) + ex["shinylive"] = encode_shinylive_url(app_path) + + path_index = os.path.join(meta["_dir"], "index.qmd") + del meta["_slug"] + del meta["_dir"] + + with open(path_index, "w") as f: + f.write("---\n") + f.write(yml.dump(meta, sort_keys=False, indent=2, default_flow_style=False)) + f.write("---\n\n") + f.write(body.strip()) + f.write("\n") + + +def step2_migrate_dirs(dirs, exclude=[]): + index_qmds = [] + + for dir in dirs: + cdirs = [os.path.join(dir, p) for p in os.listdir(dir)] + cdirs = [p for p in cdirs if os.path.isdir(p)] + for cdir in cdirs: + index_qmds.append(os.path.join(cdir, "index.qmd")) + + for qmd in index_qmds: + lg.info(f"Processing {qmd}") + rewrite_preview_app(qmd) + lg.info(f"\u2713 Migrated {qmd}") diff --git a/components/outputs/data-grid.qmd b/components/outputs/data-grid.qmd deleted file mode 100644 index fa2bf95a..00000000 --- a/components/outputs/data-grid.qmd +++ /dev/null @@ -1,174 +0,0 @@ ---- -title: "Data Grid" -sidebar: components -preview: | -
- -
-listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Data Grid - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFqcQV5ZUKUGRQWXSwcA3hGkoKNE2xEDfaDn0udABujpFlFTabZNvOru6kaKINaFAAC322IKYoLsEAcdAwu32h2OUIeLF4EWEFxoMWBECKhLGeygyTOIgwBjgineEG2GAgMRuRKKdjIfDoBNh8IwABESQBxOgCPJIqB3eKoZJWVCRNCoRICP4vRzRMAAXwAukA - shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFqcQV5ZUKUGRQWXSwcA3hGkoKNE2xEDfaDn0udABujpFlFTabZNvOru6kaKINaFAAC322IKYoLsEAcdAwu32h2OUIeLF4EWEFxoMWBECKhLGeygyTOIgwBjgineEG2GAgMRuRKKdjIfDoBNh8IwABESQBxOgCPJIqB3eKoZJWVCRNCoRICP4vRzRMAAXwAukA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 20), - ui.output_data_frame("penguins_df") #<< - ) - - def server(input, output, session): - @render.data_frame #<< - def penguins_df(): - data = penguins.head(input.n()) - return render.DataGrid(data) #<< - - app = App(app_ui, server) - relevantfunctions: - - title: ui.output_data_frame - href: https://shiny.posit.co/py/api/ui.output_data_frame.html - signature: ui.output_data_frame(id) - - title: "@render.data_frame" - href: https://shiny.posit.co/py/api/render.data_frame.html - signature: render.data_frame(fn=None) - - title: render.DataGrid - href: https://shiny.posit.co/py/api/render.DataGrid.html - signature: render.DataGrid(self, data, *, width='fit-content', height='500px', summary=True, filters=False, row_selection_mode='none') - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Select Rows - height: "350px" - description: Set `row_selection_mode` in `render.DataGrid()` to `"single"` to allow the user to select one row at a time. Set it to `"multiple"` to allow the user to select multiple rows at a time. Access the selection(s) as `input._selected_rows()`. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFTQBKg6IubHCEFAqILc2pxBXllRQAHmQNDENzYhBsQnCBACp0fHAra4VnC4VJQKKBkKBZOiwOANcIaEE0JqxCDI7QOPouOgAN0ckTKFRs5zIl2crncpGiiH+TAAAkTLtSaXYIA46BhQeDIdDqeiWLwIsIETEqRAimKxmCoMk4SIMAY4Io8RBLhgIDFkeKinYyHw6KLmayMAARSUAcToAjyHKgNgeSl2+zIHggShgxAcgSaMD4bCdUzgSLiYrpQLIjINjgwNzDoqKvIewmF1MKDoOcAUyXxZCw-PhCho9rgezTygTMWTtjgOr1TAA5DZaxgAFbEISRYRkOh46JMGhSMTPfRFx3p1HxVDJKyoSJoVCJASk7GOaJgAC+AF0gA - shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFTQBKg6IubHCEFAqILc2pxBXllRQAHmQNDENzYhBsQnCBACp0fHAra4VnC4VJQKKBkKBZOiwOANcIaEE0JqxCDI7QOPouOgAN0ckTKFRs5zIl2crncpGiiH+TAAAkTLtSaXYIA46BhQeDIdDqeiWLwIsIETEqRAimKxmCoMk4SIMAY4Io8RBLhgIDFkeKinYyHw6KLmayMAARSUAcToAjyHKgNgeSl2+zIHggShgxAcgSaMD4bCdUzgSLiYrpQLIjINjgwNzDoqKvIewmF1MKDoOcAUyXxZCw-PhCho9rgezTygTMWTtjgOr1TAA5DZaxgAFbEISRYRkOh46JMGhSMTPfRFx3p1HxVDJKyoSJoVCJASk7GOaJgAC+AF0gA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 20), - "Rows selected: ", ui.output_text("rows", inline=True), - ui.output_data_frame("penguins_df") - ) - - def server(input, output, session): - @render.data_frame - def penguins_df(): - data = penguins.head(input.n()) - return render.DataGrid(data, row_selection_mode="multiple") #<< - - @render.text - def rows(): - selected = input.penguins_df_selected_rows() #<< - return ', '.join(str(i) for i in selected) - - app = App(app_ui, server) - - title: Filterable Table - height: "350px" - description: Set `render.DataGrid(filters=True)` to add a row of filter options to the header row. Users can interact with these options to filter the table. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgDMACyL0XgFRanEFeWVClBkUFl0sHAN4RpKCjRNsRC32g59LnQAbo6RZRU2W2Q7zq7uUjRRDrQoAAR+O1BTDBdggDjoGD2ByOJ2hjxYvAiwkuNBiIIgRSJY32UGS5xEGAMcEUHwgOwwEBit2JRTsZD4dEJcIRGAAIqSAOJ0AR5ZFQGw0ARsCh0UTBAAqdD4cHu8VQySsqEiaFQiQE-1ejmiYAAvgBdIA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 344), - ui.output_data_frame("penguins_df") - ) - - def server(input, output, session): - @render.data_frame - def penguins_df(): - data = penguins.head(input.n()) - return render.DataGrid(data, filters = True) #<< - - app = App(app_ui, server) - - title: Set Table Size - height: "350px" - description: Set the `height` and `width` parameters of `render.DataGrid()` to constrain the output size of the table. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFqcQV5ZUKUGRQWXSwcA3hGkoKNE2xEDfaDn0udABujpFlFTabZNvOru6kaKINaFAAC322IKYoLsEAcdAwu32h2OUIeLF4EWEFxoMWBECKhLGeygyTOIgwBjgineEG2GAgMRuRKKdjIfDoBNh8IwABESQBxOgCPJIqA2AYisgGZJNADMi0WqAAHnMmFSBDwDDJgk15gBWJWqsB3eKoZJWVCRNCoRICP4vRzRMAAXwAukA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 20), - ui.output_data_frame("penguins_df") - ) - - def server(input, output, session): - @render.data_frame - def penguins_df(): - data = penguins.head(input.n()) - return render.DataGrid(data, width = "300px", height = "250px") #<< - - app = App(app_ui, server) - - title: Customize Summary Statement - height: "350px" - description: Set `summary` in `render.DataGrid()` to `False` to remove the statement “Viewing rows 1 through 10 of 20”. Set it to a string template containing `{start}`, `{end}`, and `{total}` tokens, to customize the message. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFqcQV5ZUKUGRQWXSwcA3hGkoKNE2xEDfaDn0udABujpFlFTabZNvOru6kaKINaFAAC322IKYoLsEAcdAwu32h2OUIeLF4EWEFxoMWBECKhLGeygyTOIgwBjgineEG2GAgMRuRKKdjIfDoBNh8IwABESQBxOgCPJQlmFJFQGxi8XCGowKB0EzBJoANQE9lGNAE01EIGE+2kAF8mKSQPYTQ4mCARvs2EamjLCnd4qhklZUJE0KhEgI-i9HNEwEaALpAA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 20), - ui.output_data_frame("penguins_df") - ) - - def server(input, output, session): - @render.data_frame - def penguins_df(): - data = penguins.head(input.n()) - return render.DataGrid( - data, - summary = "Viendo filas {start} a {end} de {total}" #<< - ) - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details - -A Data Grid presents tabular data in a spreadsheet-like view with cells separated by grid lines. - -To make a reactive Data Grid, follow three steps: - - 1. Call `ui.output_data_frame()` in the UI of your app to create a div in which to display the table. Where you call this function within the UI functions will determine where the table will appear within the layout of the app. Set the id argument of `ui.output_data_frame()` to a unique value. - - 2. Within the server function, define a new function whose name matches the id used above. The function should assemble the table to display and then return the table wrapped in `render.DataGrid()`. Shiny will rerun this function whenever it needs to build or update the output that has the matching id. - - 3. Decorate the function with `@render.data_frame` - -A Data Grid can also collect input from the user. To allow this, set `render.DataGrid(row_selection_mode="single")` or `render.DataGrid(row_selection_mode="multiple")` to allow the user to select one or more rows of the Data Grid. - -The indices of the selected rows will be accessible within the server function as a reactive variable returned by `input._selected_rows()`, where is the id of the `ui.output_data_frame()` associated with the table. - -The value returned will be `None` if no rows are selected, or a tuple of integers representing the indices of the selected rows. To filter a pandas data frame down to the selected rows, use `df.iloc[list(input._selected_rows())]`. - -If your table is a data frame that uses the pandas styler, replace `ui.output_data_frame()` with `ui.output_table()` and `@render.data_frame` with `@render.table`. - -See also: [DataTables](datatable.qmd) - -:::{#variations} -::: \ No newline at end of file diff --git a/components/outputs/data-grid/app-core.py b/components/outputs/data-grid/app-core.py new file mode 100644 index 00000000..1c68961e --- /dev/null +++ b/components/outputs/data-grid/app-core.py @@ -0,0 +1,18 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fixed( + ui.h2("Palmer Penguins"), + ui.output_data_frame("penguins_df"), # << +) + + +def server(input, output, session): + @render.data_frame # << + def penguins_df(): + return render.DataGrid(penguins) # << + + +app = App(app_ui, server) diff --git a/components/outputs/data-grid/app-express.py b/components/outputs/data-grid/app-express.py new file mode 100644 index 00000000..f94c95bc --- /dev/null +++ b/components/outputs/data-grid/app-express.py @@ -0,0 +1,12 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.data_frame # << +def penguins_df(): + return render.DataGrid(penguins) # << diff --git a/components/outputs/data-grid/app-variation-customize-summary-statement-core.py b/components/outputs/data-grid/app-variation-customize-summary-statement-core.py new file mode 100644 index 00000000..3aafe228 --- /dev/null +++ b/components/outputs/data-grid/app-variation-customize-summary-statement-core.py @@ -0,0 +1,21 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_data_frame("penguins_df"), +) + + +def server(input, output, session): + @render.data_frame + def penguins_df(): + return render.DataGrid( + penguins, + summary="Viendo filas {start} a {end} de {total}", # << + ) + + +app = App(app_ui, server) diff --git a/components/outputs/data-grid/app-variation-customize-summary-statement-express.py b/components/outputs/data-grid/app-variation-customize-summary-statement-express.py new file mode 100644 index 00000000..d9a21854 --- /dev/null +++ b/components/outputs/data-grid/app-variation-customize-summary-statement-express.py @@ -0,0 +1,15 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.data_frame +def penguins_df(): + return render.DataGrid( + penguins, + summary="Viendo filas {start} a {end} de {total}", # << + ) diff --git a/components/outputs/data-grid/app-variation-filterable-table-core.py b/components/outputs/data-grid/app-variation-filterable-table-core.py new file mode 100644 index 00000000..0b25bba3 --- /dev/null +++ b/components/outputs/data-grid/app-variation-filterable-table-core.py @@ -0,0 +1,18 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_data_frame("penguins_df"), +) + + +def server(input, output, session): + @render.data_frame + def penguins_df(): + return render.DataGrid(penguins, filters=True) # << + + +app = App(app_ui, server) diff --git a/components/outputs/data-grid/app-variation-filterable-table-express.py b/components/outputs/data-grid/app-variation-filterable-table-express.py new file mode 100644 index 00000000..79d90898 --- /dev/null +++ b/components/outputs/data-grid/app-variation-filterable-table-express.py @@ -0,0 +1,13 @@ +# shiny.express +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.data_frame +def penguins_df(): + return render.DataGrid(penguins, filters=True) # << diff --git a/components/outputs/data-grid/app-variation-select-rows-core.py b/components/outputs/data-grid/app-variation-select-rows-core.py new file mode 100644 index 00000000..ed7fed5b --- /dev/null +++ b/components/outputs/data-grid/app-variation-select-rows-core.py @@ -0,0 +1,25 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_ui("rows"), + ui.output_data_frame("penguins_df"), +) + + +def server(input, output, session): + @render.data_frame + def penguins_df(): + return render.DataGrid(penguins, row_selection_mode="multiple") # << + + @render.ui() + def rows(): + rows = input.penguins_df_selected_rows() # << + selected = ", ".join(str(i) for i in sorted(rows)) if rows else "None" + return f"Rows selected: {selected}" + + +app = App(app_ui, server) diff --git a/components/outputs/data-grid/app-variation-select-rows-express.py b/components/outputs/data-grid/app-variation-select-rows-express.py new file mode 100644 index 00000000..5e5c448c --- /dev/null +++ b/components/outputs/data-grid/app-variation-select-rows-express.py @@ -0,0 +1,19 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import input, ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.ui() +def rows(): + rows = input.penguins_df_selected_rows() # << + selected = ", ".join(str(i) for i in sorted(rows)) if rows else "None" + return f"Rows selected: {selected}" + + +@render.data_frame +def penguins_df(): + return render.DataGrid(penguins, row_selection_mode="multiple") # << diff --git a/components/outputs/data-grid/app-variation-set-table-size-core.py b/components/outputs/data-grid/app-variation-set-table-size-core.py new file mode 100644 index 00000000..b60cfc1a --- /dev/null +++ b/components/outputs/data-grid/app-variation-set-table-size-core.py @@ -0,0 +1,18 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_data_frame("penguins_df"), +) + + +def server(input, output, session): + @render.data_frame + def penguins_df(): + return render.DataGrid(penguins, width="300px", height="250px") # << + + +app = App(app_ui, server) diff --git a/components/outputs/data-grid/app-variation-set-table-size-express.py b/components/outputs/data-grid/app-variation-set-table-size-express.py new file mode 100644 index 00000000..b886b1be --- /dev/null +++ b/components/outputs/data-grid/app-variation-set-table-size-express.py @@ -0,0 +1,12 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.data_frame +def penguins_df(): + return render.DataGrid(penguins, width="300px", height="250px") # << diff --git a/components/outputs/data-grid/index.qmd b/components/outputs/data-grid/index.qmd new file mode 100644 index 00000000..7f0863a7 --- /dev/null +++ b/components/outputs/data-grid/index.qmd @@ -0,0 +1,141 @@ +--- +title: Data Grid +sidebar: components +preview: '
+ + + +
+ + ' +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/data-grid/ + contents: + - title: Preview + file: app-core.py + height: 375 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTORCdHTUNUWQAXjkFFWChUQAKAEpAiCEsQwAmOK0wAAUOLmQcvljtMCSIZIABKwgbBixFKAooZUZYOGRkAGJkAB5enRs6VmLNZUU6RMQdTs6rCn4GCGQauqwAESaoAHEGQUU4mM0Ezp7+nUJUClweWjAqVwowAF8AXSA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynSCAB5wikE6yDmxgliGAExZYAAKHFzIpXyB2mAhBNm5caT8FOhtyopQFFDJDLBwJQGaXXRa9UTIAMTIADxzOmEQ4Q50Bo4Abo5Bwh0URK3tbUQicCIiguQhiE05AAJ2EA4MWN29-YM5swt3yGusGqjRR0UK3CC5SHIOwUfgMCFPF5YAAiPSgAHEGIJMiNRCFvvNFitiRh0DFrOggqSooJTltHMtCKgKLgeLQwFRUhQwABfAC6QA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/data-grid/ + contents: + - title: ui.output_data_frame + href: https://shiny.posit.co/py/api/ui.output_data_frame.html + signature: ui.output_data_frame(id) + - title: '@render.data_frame' + href: https://shiny.posit.co/py/api/render.data_frame.html + signature: render.data_frame(fn=None) + - title: render.DataGrid + href: https://shiny.posit.co/py/api/render.DataGrid.html + signature: render.DataGrid(self, data, *, width='fit-content', height='500px', + summary=True, filters=False, row_selection_mode='none') +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/outputs/data-grid/ + contents: + - title: Select Rows + description: Set `row_selection_mode` in `render.DataGrid()` to `"single"` to + allow the user to select one row at a time. Set it to `"multiple"` to allow + the user to select multiple rows at a time. Access the selection(s) as `input._selected_rows()`. + apps: + - title: Preview + file: app-variation-select-rows-core.py + height: 350 + - title: Express + file: app-variation-select-rows-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTPER0fgoiIR0dNQ1RZABeOQUVCKFRAAoASjCIISxDACZkrTAABQ4uZEK+JO0wdIgMgAErCBsGLCE0nRs6ZCYAdxE0xB1kYe7SPpj-QIocCs1lRTplETh2OGIqFV7+1OGAYmQAHgOhkeXV9bhFCYKiAqwAK1JhZJEKBmTBHbppcX8DC0uyS2qR2gi6W2QK2WyAKADlyHACidhlYKPwGBBkHQCgAlMZiM5rDYoECEi6KAC+SNqNIa1lsWEUUAoUGUjFgiKacC6iTmCwGyO6cDRGKFXJaABFmVAAOIMQSKZK80REXpLFZEwTkZQwUg2aIFGD8dgUQToVYFHbIfZHHSEVAUXA8WhgKiuChgCkAXSAA + height: 350 + - title: Core + file: app-variation-select-rows-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLVGCRUwA7jV1DVlNLW0UyopQFFDJDLBwRQGaY3RatfUQYRDhDnQGjgBujkHCI0TNrS1EInAiIoLkIYgDyAACdhAODFjjk9OzT9usKqLRR0UKPCDZSHIOwUfgMCFvD5YAAiEygAHEGIJ0gtRLZSN1lFd2HBiBQ7hBlDBSA4vCsYPx2OT0CSViEsgBiZAAHm54Uhr3sjiwQlC-zgOx6IjBT0hUpixxaOCBoiWRLgJLJcBUUtCnJ5fIhUKyxNJVEUMRWRBWWAAVqRhEERBQGEd2XRpOJxBCRBZtUEpSF2YJJQSxBqrsgVgA5chwFay7IwuEQ5ZgABKYd2mvNKBApq1igAvgnNmWMOgYtZ0EEKx1LvtHBtCKgKLgeLQwFQAB4UMBFgC6QA + height: 350 + - title: Filterable Table + description: Set `render.DataGrid(filters=True)` to add a row of filter options + to the header row. Users can interact with these options to filter the table. + apps: + - title: Preview + file: app-variation-filterable-table-core.py + height: 350 + - title: Express + file: app-variation-filterable-table-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQGJkBnACwEsJcs4APdAJziNGAHQgAzPqRjJ0UADbw+6agHMAru0bJWMdKT4Vkc0lAAmAfWUR1m0RKlM2Hbbv2GBEU3D53J0luycPPyCWjp6BsgaoqJWNhBaALxGJhZxGgkAFACUMRAaWMwATJnCYAAK8orI5aoZImC5EHkAAh5efFimUBRQ5hKwcKJeYjJ1muamYjmIosjzyAIUanwQi9QdWAAiPVAA4nysppnpmkRirHJUfIyJACp8anDZ8wwAPG+ihKgUuMq0YCo3AoYAAvgBdIA + height: 350 + - title: Core + file: app-variation-filterable-table-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLcqKUBRQyQywcEUBmh10WrX1EGEQ4Q50Bo4Abo5Bwm0URM2tLUQicCIiguQhiA1ZAAJ2EA4MWJ3dvf2nyLOsVcOKdKEnENm-yHYUfgMH6Xa5YAAiXSgAHEGIJ0kNREQ6IJ2FQGCIvAAVBj8OAhLIAYmQAB4SeEdBh0DFrOgglSooIdotHFNCKgKLgeLQwFQAB4UMAAXwAukA + height: 350 + - title: Set Table Size + description: Set the `height` and `width` parameters of `render.DataGrid()` to + constrain the output size of the table. + apps: + - title: Preview + file: app-variation-set-table-size-core.py + height: 350 + - title: Express + file: app-variation-set-table-size-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTORCdHTUNUWQAXjkFFWChUQAKAEpAiCEsQwAmOK0wAAUOLmQcvljtMCSIZIABKwgbBixFKAooZUZYOB0bOlZizWVFOkTEHWRR5CsKfgYIcetbLAARJqgAcQZBRTiYzSIAdw2KQzDsgGYABjP0V2yiQzhBXkMKY7B0gFZL67LRgGJkAB5-jpCKgKLgeLQwFRXBQwABfAC6QA + height: 350 + - title: Core + file: app-variation-set-table-size-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLcqKUBRQyQywcEUBmh10WrX1EGEQ4Q50Bo4Abo5Bwm0URM2tLUQicCIiguQhiA1ZAAJ2EA4MWJ3dvf2nyLOsVcOKdKEnENm-yHYUfgMH6Xa5YAAiXSgAHEGIJ0kNREQAO7wiiGLxjADMAAYcegAB5jIiGOCCXiGCiYsD5ACs+KJtSyAGJkAAeNnhHQYdAxazoII8qKCHaLRxTQioCi4Hi0MBUAkUMAAXwAukA + height: 350 + - title: Customize Summary Statement + description: 'Set `summary` in `render.DataGrid()` to `False` to remove the statement + "Viewing rows 1 through 10 of 20". Set it to a string template containing `{start}`, + `{end}`, and `{total}` tokens, to customize the message. + + ' + apps: + - title: Preview + file: app-variation-customize-summary-statement-core.py + height: 350 + - title: Express + file: app-variation-customize-summary-statement-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTORCdHTUNUWQAXjkFFWChUQAKAEpAiCEsQwAmOK0wAAUOLmQcvljtMCSIZIABKwgbBixFKAooZUZYOB0bOlZizWVFOkTEHWRR5CsKfgYIcetbLAARJqgAcQZBRSyZsZ2YzQIRnbGRfhgYKAZcMOyANUFrUmQ6QXYoMRARZpkAX2QoZBA1l+NgBFFIzXY32yRGQAGJkAAeBGHUblQioCi4Hi0MBUVwUMDfAC6QA + height: 350 + - title: Core + file: app-variation-customize-summary-statement-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLcqKUBRQyQywcEUBmh10WrX1EGEQ4Q50Bo4Abo5Bwm0URM2tLUQicCIiguQhiA1ZAAJ2EA4MWJ3dvf2nyLOsVcOKdKEnENm-yHYUfgMH6Xa5YAAiXSgAHEGIJ0k8-tkhqIJkikSJ+DAYFAGLgvGMAGqCeykZB0QTsKBiEAiboyAC+yCgyBA9iZDlZFFI3XYDLGRGQAGJkAAeUWI7JTcIYdAxazoIKyqKCHaLRxTQioCi4Hi0MBUAAeFDADIAukA + height: 350 +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A Data Grid presents tabular data in a spreadsheet-like view with cells separated by grid lines. + +To make a reactive Data Grid, follow three steps: + + 1. Call `ui.output_data_frame()` in the UI of your app to create a div in which to display the table. Where you call this function within the UI functions will determine where the table will appear within the layout of the app. Set the id argument of `ui.output_data_frame()` to a unique value. + + 2. Within the server function, define a new function whose name matches the id used above. The function should assemble the table to display and then return the table wrapped in `render.DataGrid()`. Shiny will rerun this function whenever it needs to build or update the output that has the matching id. + + 3. Decorate the function with `@render.data_frame` + +A Data Grid can also collect input from the user. To allow this, set `render.DataGrid(row_selection_mode="single")` or `render.DataGrid(row_selection_mode="multiple")` to allow the user to select one or more rows of the Data Grid. + +The indices of the selected rows will be accessible within the server function as a reactive variable returned by `input._selected_rows()`, where is the id of the `ui.output_data_frame()` associated with the table. + +The value returned will be `None` if no rows are selected, or a tuple of integers representing the indices of the selected rows. To filter a pandas data frame down to the selected rows, use `df.iloc[list(input._selected_rows())]`. + +If your table is a data frame that uses the pandas styler, replace `ui.output_data_frame()` with `ui.output_table()` and `@render.data_frame` with `@render.table`. + +See also: [DataTables](../datatable/index.qmd) + +:::{#variations} +::: diff --git a/components/outputs/datatable.qmd b/components/outputs/datatable.qmd deleted file mode 100644 index 62638025..00000000 --- a/components/outputs/datatable.qmd +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: "DataTable" -sidebar: components -preview: | -
- -
-listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: DataTable - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFqcQV5ZUKUGRQWXSwcA3hGkoKNE3RTADEADz32rEQ2g59LnQAbo6RZRU2TZkbbOVzuUjRRBrQoAASB22hTBhdggDjoGF2+0Oxzuj0R7xYvAiwguNBiUIgRSpYz2UGSZxEGAMcEUfwg2wwEBiL2pRTsZD4dEpKLRGAAIrSACpQDpsE6YqA3B5PV7xVDJKyoSJoVCJASg76OaJgAC+AF0gA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 20), - ui.output_data_frame("penguins_df") #<< - ) - - def server(input, output, session): - @render.data_frame #<< - def penguins_df(): - data = penguins.head(input.n()) - return render.DataTable(data) #<< - - app = App(app_ui, server) - relevantfunctions: - - title: ui.output_data_frame - href: https://shiny.posit.co/py/api/ui.output_data_frame.html - signature: ui.output_data_frame(id) - - title: "@render.data_frame" - href: https://shiny.posit.co/py/api/render.data_frame.html - signature: render.data_frame(fn=None) - - title: render.DataTable - href: https://shiny.posit.co/py/api/render.DataTable.html - signature: render.DataTable(self, data, *, width='fit-content', height='500px', summary=True, filters=False, row_selection_mode='none') - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Select Rows - height: "350px" - description: Set `row_selection_mode` in `render.DataTable()` to `"single"` to allow the user to select one row at a time. Set it to `"multiple"` to allow the user to select multiple rows at a time. Access the selection(s) as `input._selected_rows()`. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFTQBKg6IubHCEFAqILc2pxBXllRQAHmQNDENzYhBsQnCBACp0fHAra4VnC4VJQKKBkKBZOiwOANcIaEE0JqxCDI7QOPouOgAN0ckTKFRs5zIl2crncpGiiH+TAAAkTLtSaXYIA46BhQeDIdDqeiWLwIsIETEqRAimKxmCoMk4SIMAY4Io8RBLhgIDFkeKinYyHw6KLmayMAARSUfKAdPaRDlQGwPJS7fZkDwQJQwYgOQJNGB8NhOqZwJFxMV0oFkRkGxwYG5h0VFXkPYTC6mFB0HOAKZL4shYfnwhQ0e1wPZp5QJmLJ2xwHV6pgAchstYwACtiEJIsIyHQ8dEmDQpGJnvoi4706j4qhklZUJE0KhEgJSdjHNEwABfAC6QA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 20), - "Rows selected: ", ui.output_text("rows", inline=True), - ui.output_data_frame("penguins_df") - ) - - def server(input, output, session): - @render.data_frame - def penguins_df(): - data = penguins.head(input.n()) - return render.DataTable(data, row_selection_mode="multiple") #<< - - @render.text - def rows(): - selected = input.penguins_df_selected_rows() #<< - return ', '.join(str(i) for i in selected) - - app = App(app_ui, server) - - title: Filterable Table - height: "350px" - description: Set `render.DataTable(filters=True)` to add a row of filter options to the header row. Users can interact with these options to filter the table. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgDMACyL0XgFRanEFeWVClBkUFl0sHAN4RpKCjRNsRC32g59LnQAbo6RZRU2W2Q7zq7uUjRRDrQoAAR+O1BTDBdggDjoGD2ByOJ2hjxYvAiwkuNBiIIgRSJY32UGS5xEGAMcEUHwgOwwEBit2JRTsZD4dEJcIRGAAIqSACpQDpsU7IqA2GgCNgUOiiYKCuh8OD3eKoZJWVCRNCoRICf6vRzRMAAXwAukA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 344), - ui.output_data_frame("penguins_df") - ) - - def server(input, output, session): - @render.data_frame - def penguins_df(): - data = penguins.head(input.n()) - return render.DataTable(data, filters = True) #<< - - app = App(app_ui, server) - - title: Set Table Size - height: "350px" - description: Set the `height` and `width` parameters of `render.DataTable()` to constrain the output size of the table. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFqcQV5ZUKUGRQWXSwcA3hGkoKNE2xEDfaDn0udABujpFlFTabZNvOru6kaKINaFAAC322IKYoLsEAcdAwu32h2OUIeLF4EWEFxoMWBECKhLGeygyTOIgwBjgineEG2GAgMRuRKKdjIfDoBNh8IwABESQAVKAdNgnJFQGwDAQKMgGZJNADMi0WqAAHnMmFSBDwDDJgk15gBWFXqsB3eKoZJWVCRNCoRICP4vRzRMAAXwAukA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 20), - ui.output_data_frame("penguins_df") - ) - - def server(input, output, session): - @render.data_frame - def penguins_df(): - data = penguins.head(input.n()) - return render.DataTable(data, width = "300px", height = "250px") #<< - - app = App(app_ui, server) - - title: Customize Summary Statement - height: "350px" - description: Set `summary` in `render.DataGrid()` to `False` to remove the statement “Viewing rows 1 through 10 of 20”. Set it to a string template containing `{start}`, `{end}`, and `{total}` tokens, to customize the message. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACVKAG3jtUoHMBXAJYQAzkwExUxOmSZtiUACYB9bhH5DhAHQj1GTYQAsh2MRKkyAgujxM6lBXDo3hcYcIGkbg7dtXqRTAC8svLKfoIiABQAlD7Q6EqCQUyCWFA8cEo0bIIKkdpMhSkCGEKofGRKEHycAoT5kJr4TE0AcjUARo5MxDS2xADuomTETAoCwqhsUNhNNgBMAAzReAVFqcQV5ZUKUGRQWXSwcA3hGkoKNE2xEDfaDn0udABujpFlFTabZNvOru6kaKINaFAAC322IKYoLsEAcdAwu32h2OUIeLF4EWEFxoMWBECKhLGeygyTOIgwBjgineEG2GAgMRuRKKdjIfDoBNh8IwABESQAVKAdNgnKEswpIqA2cUS4Q1GBQOgmYJNABqAnsoxoAmmohAwn20gAvkxSSB7KaHEwQCN9mxjU1ZYU7vFUMkrKhImhUIkBH8Xo5omBjQBdIA - code: | - from palmerpenguins import load_penguins - from shiny import App, render, session, ui - - penguins = load_penguins() - - app_ui = ui.page_fluid( - ui.input_numeric("n", "Number of rows to display", 20), - ui.output_data_frame("penguins_df") - ) - - def server(input, output, session): - @render.data_frame - def penguins_df(): - data = penguins.head(input.n()) - return render.DataTable( - data, - summary = "Viendo filas {start} a {end} de {total}" #<< - ) - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details - -A DataTable presents tabular data in a figure-like view with a minimum of grid lines. - -To make a reactive Data Table, follow three steps: - - 1. Call `ui.output_data_frame()` in the UI of your app to create a div in which to display the table. Where you call this function within the UI functions will determine where the table will appear within the layout of the app. Set the id argument of `ui.output_data_frame()` to a unique value. - - 2. Within the server function, define a new function whose name matches the id used above. The function should assemble the table to display and then return the table wrapped in `render.DataTable()`. Shiny will rerun this function whenever it needs to build or update the output that has the matching id. - - 3. Decorate the function with two decorators: - - 1. `@output` - 2. `@render.data_frame` - -A DataTable can also collect input from the user. To allow this, set `render.DataTable(row_selection_mode="single")` or `render.DataTable(row_selection_mode="multiple")` to allow the user to select one or more rows of the DataTable. - -The indices of the selected rows will be accessible within the server function as a reactive variable returned by `input._selected_rows()`, where is the id of the `ui.output_data_frame()` associated with the table. - -The value returned will be `None` if no rows are selected, or a tuple of integers representing the indices of the selected rows. To filter a pandas data frame down to the selected rows, use `df.iloc[list(input._selected_rows())]`. - -If your table is a data frame that uses the pandas styler, replace `ui.output_data_frame()` with `ui.output_table()` and `@render.data_frame` with `@render.table`. - -See also [Data Grids](data-grid.qmd) - -:::{#variations} -::: \ No newline at end of file diff --git a/components/outputs/datatable/app-core.py b/components/outputs/datatable/app-core.py new file mode 100644 index 00000000..732121d6 --- /dev/null +++ b/components/outputs/datatable/app-core.py @@ -0,0 +1,18 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_data_frame("penguins_df"), # << +) + + +def server(input, output, session): + @render.data_frame # << + def penguins_df(): + return render.DataTable(penguins) # << + + +app = App(app_ui, server) diff --git a/components/outputs/datatable/app-express.py b/components/outputs/datatable/app-express.py new file mode 100644 index 00000000..aa39acf6 --- /dev/null +++ b/components/outputs/datatable/app-express.py @@ -0,0 +1,12 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.data_frame # << +def penguins_df(): + return render.DataTable(penguins) # << diff --git a/components/outputs/datatable/app-variation-customize-summary-statement-core.py b/components/outputs/datatable/app-variation-customize-summary-statement-core.py new file mode 100644 index 00000000..93865b93 --- /dev/null +++ b/components/outputs/datatable/app-variation-customize-summary-statement-core.py @@ -0,0 +1,21 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_data_frame("penguins_df"), +) + + +def server(input, output, session): + @render.data_frame + def penguins_df(): + return render.DataTable( + penguins, + summary="Viendo filas {start} a {end} de {total}", # << + ) + + +app = App(app_ui, server) diff --git a/components/outputs/datatable/app-variation-customize-summary-statement-express.py b/components/outputs/datatable/app-variation-customize-summary-statement-express.py new file mode 100644 index 00000000..efcdc9ce --- /dev/null +++ b/components/outputs/datatable/app-variation-customize-summary-statement-express.py @@ -0,0 +1,15 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.data_frame +def penguins_df(): + return render.DataTable( + penguins, + summary="Viendo filas {start} a {end} de {total}", # << + ) diff --git a/components/outputs/datatable/app-variation-filterable-table-core.py b/components/outputs/datatable/app-variation-filterable-table-core.py new file mode 100644 index 00000000..7ded73ca --- /dev/null +++ b/components/outputs/datatable/app-variation-filterable-table-core.py @@ -0,0 +1,18 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_data_frame("penguins_df"), +) + + +def server(input, output, session): + @render.data_frame + def penguins_df(): + return render.DataTable(penguins, filters=True) # << + + +app = App(app_ui, server) diff --git a/components/outputs/datatable/app-variation-filterable-table-express.py b/components/outputs/datatable/app-variation-filterable-table-express.py new file mode 100644 index 00000000..eb8f7eb3 --- /dev/null +++ b/components/outputs/datatable/app-variation-filterable-table-express.py @@ -0,0 +1,12 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.data_frame +def penguins_df(): + return render.DataTable(penguins, filters=True) # << diff --git a/components/outputs/datatable/app-variation-select-rows-core.py b/components/outputs/datatable/app-variation-select-rows-core.py new file mode 100644 index 00000000..a6ff207f --- /dev/null +++ b/components/outputs/datatable/app-variation-select-rows-core.py @@ -0,0 +1,25 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_ui("rows"), + ui.output_data_frame("penguins_df"), +) + + +def server(input, output, session): + @render.data_frame + def penguins_df(): + return render.DataTable(penguins, row_selection_mode="single") # << + + @render.ui + def rows(): + rows = input.penguins_df_selected_rows() # << + selected = ", ".join(str(i) for i in sorted(rows)) if rows else "None" + return f"Rows selected: {selected}" + + +app = App(app_ui, server) diff --git a/components/outputs/datatable/app-variation-select-rows-express.py b/components/outputs/datatable/app-variation-select-rows-express.py new file mode 100644 index 00000000..7fac1c5b --- /dev/null +++ b/components/outputs/datatable/app-variation-select-rows-express.py @@ -0,0 +1,19 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import input, ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.ui +def rows(): + rows = input.penguins_df_selected_rows() # << + selected = ", ".join(str(i) for i in sorted(rows)) if rows else "None" + return f"Rows selected: {selected}" + + +@render.data_frame +def penguins_df(): + return render.DataTable(penguins, row_selection_mode="single") # << diff --git a/components/outputs/datatable/app-variation-set-table-size-core.py b/components/outputs/datatable/app-variation-set-table-size-core.py new file mode 100644 index 00000000..7912af61 --- /dev/null +++ b/components/outputs/datatable/app-variation-set-table-size-core.py @@ -0,0 +1,18 @@ +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.h2("Palmer Penguins"), + ui.output_data_frame("penguins_df"), +) + + +def server(input, output, session): + @render.data_frame + def penguins_df(): + return render.DataTable(penguins, width="300px", height="250px") # << + + +app = App(app_ui, server) diff --git a/components/outputs/datatable/app-variation-set-table-size-express.py b/components/outputs/datatable/app-variation-set-table-size-express.py new file mode 100644 index 00000000..c9fc3d16 --- /dev/null +++ b/components/outputs/datatable/app-variation-set-table-size-express.py @@ -0,0 +1,12 @@ +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import ui + +penguins = load_penguins() + +ui.h2("Palmer Penguins") + + +@render.data_frame +def penguins_df(): + return render.DataTable(penguins, width="300px", height="250px") # << diff --git a/components/outputs/datatable/index.qmd b/components/outputs/datatable/index.qmd new file mode 100644 index 00000000..8edc6fbe --- /dev/null +++ b/components/outputs/datatable/index.qmd @@ -0,0 +1,143 @@ +--- +title: DataTable +sidebar: components +preview: '
+ + + +
+ + ' +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/datatable/ + contents: + - title: Preview + file: app-core.py + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTORCdHTUNUWQAXjkFFWChUQAKAEpAiCEsQwAmOK0wAAUOLmQcvljtMCSIZIABKwgbBixFKAooZUZYOGRkAGJkAB5enRs6VmLNZUU6RMQdTs6rCn4GCGQauqwAESaoABUoACN2ODiYzQTOnv6dQlQKXB5aMCpXCjAAXwBdIA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLcqKUBRQyQywcEUBmh10WrVEyADEyAA8MzphEOEOdAaOAG6OQcJtFETNrS1EInAiIoLkIYgNWQACdhAODFid3b39WdNzN8grrFXDRR0ULXCDZcHIOwUfgMMEPJ5YAAiXSgABUoAAjdgDIaiEKfWbzJbEjDoGLWdBBUlRQTHDaORaEVAUXA8WhgKgADwoYAAvgBdIA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/datatable/ + contents: + - title: ui.output_data_frame + href: https://shiny.posit.co/py/api/ui.output_data_frame.html + signature: ui.output_data_frame(id) + - title: '@render.data_frame' + href: https://shiny.posit.co/py/api/render.data_frame.html + signature: render.data_frame(fn=None) + - title: render.DataTable + href: https://shiny.posit.co/py/api/render.DataTable.html + signature: render.DataTable(self, data, *, width='fit-content', height='500px', + summary=True, filters=False, row_selection_mode='none') +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/outputs/datatable/ + contents: + - title: Select Rows + description: Set `row_selection_mode` in `render.DataTable()` to `"single"` to + allow the user to select one row at a time. Set it to `"multiple"` to allow + the user to select multiple rows at a time. Access the selection(s) as `input._selected_rows()`. + apps: + - title: Preview + file: app-variation-select-rows-core.py + height: 350 + - title: Express + file: app-variation-select-rows-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTPER0fgoiIR0dNQ1RZABeOQUVCKFRAAoASjCIISxDACZkrTAABQ4uZEK+JO0wdIgMgAErCBsGLFCmuDpkJgB3ETTEHWQhrtJemP9AihwKzWVFOmUROHY4YioVHr7UoYBiZAAefcHhpZW1uEVxgqICrAArUmFkkQoGZMFtumlxfwMLC+Sm1S20EnU2yGWS2QBQAcuQ4AVjkMrBR+AwIMg6AUAEqjMSnVbrFAgAnnRQAX0RtWpDWstiwiigFCgykYsAR7U6iVm836SK6cFR6IF7RaABEmVAACpQABGK2S3NERB6i2WhME5GUMFINmiBREwl4KwK22Qe0OOkIqAouB4tDAVFcFDA5IAukA + height: 350 + - title: Core + file: app-variation-select-rows-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLVGCRUwA7jV1DVlNLW0UyopQFFDJDLBwRQGaY3RatfUQYRDhDnQGjgBujkHCI0TNrS1EInAiIoLkIYgDyAACdhAODFjjk9OzT9usKqLRR0UKPCDZSHIOwUfgMCFvD5YAAiEygABUoAAjdhzBaiWykbrKK644gUO4QZQwUgOLwrW7qXErEJZADEyAAPJzwpDXvZHFgXBDsgCeiIwU9IeKYscWjggaIliS4GSqCpxaF2VyeSKobs1XBFDEVkQVlgAFakYRBEQUBhHVl0aTicQQkQWI1BcUhVmCHYy1VXZArABy5DgKyl2RhcIhyzAACUiWJSXByUaUCA0xnFABfKObIsYdAxazoIIljqXfaODaEVAUXA8WhgKgADwoYDzAF0gA + height: 350 + - title: Filterable Table + description: Set `render.DataTable(filters=True)` to add a row of filter options + to the header row. Users can interact with these options to filter the table. + apps: + - title: Preview + file: app-variation-filterable-table-core.py + height: 350 + - title: Express + file: app-variation-filterable-table-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTORCdHTUNUWQAXjkFFWChUQAKAEpAiCEsQwAmOK0wAAUOLmQcvljtMCSIZIABKwgbBixFKAooZUZYOB0bOlZizWVFOkTEHWRR5CsKfgYIcetbLAARJqgAFSgAI3Y4OJjNIjpBdioGETCVhn44BNGAYmQAHnudQlQKXB5aMCpXCjAAXwAukA + height: 350 + - title: Core + file: app-variation-filterable-table-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLcqKUBRQyQywcEUBmh10WrX1EGEQ4Q50Bo4Abo5Bwm0URM2tLUQicCIiguQhiA1ZAAJ2EA4MWJ3dvf2nyLOsVcOKdKEnENm-yHYUfgMH6Xa5YAAiXSgABUoAAjdgDIaiIh0QTsKgMEReaEMfhwEJZADEyAAPKTwjoMOgYtZ0EFqVFBDtFo4poRUBRcDxaGAqAAPChgAC+AF0gA + height: 350 + - title: Set Table Size + description: Set the `height` and `width` parameters of `render.DataTable()` to + constrain the output size of the table. + apps: + - title: Preview + file: app-variation-set-table-size-core.py + height: 350 + - title: Express + file: app-variation-set-table-size-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTORCdHTUNUWQAXjkFFWChUQAKAEpAiCEsQwAmOK0wAAUOLmQcvljtMCSIZIABKwgbBixFKAooZUZYOB0bOlZizWVFOkTEHWRR5CsKfgYIcetbLAARJqgAFSgAI3Y4OJjNIgB3QUUKQzDsgGYABkv0V2yiQzhBXkMKM7B0gFYbu7LRgGJkAAeIE6QioCi4Hi0MBUVwUMAAXwAukA + height: 350 + - title: Core + file: app-variation-set-table-size-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLcqKUBRQyQywcEUBmh10WrX1EGEQ4Q50Bo4Abo5Bwm0URM2tLUQicCIiguQhiA1ZAAJ2EA4MWJ3dvf2nyLOsVcOKdKEnENm-yHYUfgMH6Xa5YAAiXSgABUoAAjdgDIaiIgAd0Eigohi8YwAzAAGfHoAAeYyIhjggl4hgoOLA+QArETSbUsgBiZAAHk54R0GHQMWs6CC-Kigh2i0cU0IqAouB4tDAVGJFDAAF8ALpAA + height: 350 + - title: Customize Summary Statement + description: 'Set `summary` in `render.DataGrid()` to `False` to remove the statement + "Viewing rows 1 through 10 of 20". Set it to a string template containing `{start}`, + `{end}`, and `{total}` tokens, to customize the message. + + ' + apps: + - title: Preview + file: app-variation-customize-summary-statement-core.py + height: 350 + - title: Express + file: app-variation-customize-summary-statement-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyG1RXAY69LIyaxwAHuisixEqTORCdHTUNUWQAXjkFFWChUQAKAEpAiCEsQwAmOK0wAAUOLmQcvljtMCSIZIABKwgbBixFKAooZUZYOB0bOlZizWVFOkTEHWRR5CsKfgYIcetbLAARJqgAFSgAI3Y4LJmxvZjNAhG9sZF+GBgoBlww7IA1QWtSZDpBdigxEBFmmQBfZCgyBA1n+NiBFFIzXYv2yRGQAGJkAAeJHHUblQioCi4Hi0MBUVwUMC-AC6QA + height: 350 + - title: Core + file: app-variation-customize-summary-statement-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKAG3gfWoHMBXAJYQAzskEx0pBhWTtSUACYB9HhAHCRAHQiNmyEQAthucZOmyAgpiINqiuAyJCdOtRtHIAvHIUr3QqIAFACUrtCYykLeyEI4ULxwynTsQopBOshZsYJYhgBMGWAAChxcyMV8gdpgIQSZ2XGk-BToLcqKUBRQyQywcEUBmh10WrX1EGEQ4Q50Bo4Abo5Bwm0URM2tLUQicCIiguQhiA1ZAAJ2EA4MWJ3dvf2nyLOsVcOKdKEnENm-yHYUfgMH6Xa5YAAiXSgABUoAAjdgDJ5-bJDUQTFEokT8GAwKAMXBeMYANUE9lIyDognYUDEIBE3RkAF9kFBkCB7CyHOyKKRuuwmWMiMgAMTIAA84uR2Sm4Qw6Bi1nQQXlUUEO0WjimhFQFFwPFoYCoAA8KGAmQBdIA + height: 350 +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A DataTable presents tabular data in a figure-like view with a minimum of grid lines. + +To make a reactive Data Table, follow three steps: + + 1. Call `ui.output_data_frame()` in the UI of your app to create a div in which to display the table. Where you call this function within the UI functions will determine where the table will appear within the layout of the app. Set the id argument of `ui.output_data_frame()` to a unique value. + + 2. Within the server function, define a new function whose name matches the id used above. The function should assemble the table to display and then return the table wrapped in `render.DataTable()`. Shiny will rerun this function whenever it needs to build or update the output that has the matching id. + + 3. Decorate the function with two decorators: + + 1. `@output` + 2. `@render.data_frame` + +A DataTable can also collect input from the user. To allow this, set `render.DataTable(row_selection_mode="single")` or `render.DataTable(row_selection_mode="multiple")` to allow the user to select one or more rows of the DataTable. + +The indices of the selected rows will be accessible within the server function as a reactive variable returned by `input._selected_rows()`, where is the id of the `ui.output_data_frame()` associated with the table. + +The value returned will be `None` if no rows are selected, or a tuple of integers representing the indices of the selected rows. To filter a pandas data frame down to the selected rows, use `df.iloc[list(input._selected_rows())]`. + +If your table is a data frame that uses the pandas styler, replace `ui.output_data_frame()` with `ui.output_table()` and `@render.data_frame` with `@render.table`. + +See also [Data Grids](../data-grid/index.qmd) + +:::{#variations} +::: diff --git a/components/outputs/image.qmd b/components/outputs/image.qmd deleted file mode 100644 index 4ee44655..00000000 --- a/components/outputs/image.qmd +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Image" -sidebar: components -preview: | -
- -
-listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Image - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhHqNWnbhjLZUcFr36DhASRgBzACJQyUVeuapbbADYcARkYFCmABRdVNjk4JgBefxcACgB9GJoOVzg4gEosKClyVVU0VBilcKYldItkmlclaSjVJlqijgwuVAUyGMJgwgBrD2IAD2qwdmIAd2V8JjGAZTYRoyhSgH4xiQA3KArQiIAVOgU4FLwauuLiFubWvnm4AcvSsZSmAGIAHmfVFOyIWRpWORW5KJNFoSU5kc4SFgGFgcUgpRBHWoAAUysjojRgVyerwRTG+c1KUThOLqRgshRAYxYdEIY0QTGCUgA9JStNgsBALMsJmBhhxpGQ2LTuQBGAAMotQvTGAF8sW8ICSSVIyAo6Aq+GSOD8gWQMENhoSmHBXJCmAA5UhwT65QpiVBRXL5DgQv5yD4QMDSvDgaDwajsLhs1Ac-BEUgUKjIDgANQAQgB5ABKw1FAGkAOIWYgiHMiM2TACqbAAogWLDmAMLSTq5sg0CsiACauZEhAAEgBFABWAFkc6mIHBi65ix3o4mACwAJgUAC9pJMAMwAKS2U48jYUE7bxfnpmGwxoLAsU7ghDIAEcRJ1hR2rwXRcMPB2RBfU6KoApU420BYAOoThWHiJhYbAAFqoCIxbCpMADUHB-sKYFmt0E6pm2AAyNBmtIhCprOEAAGyEDQPYVgWbaLqgAAcAAa1GTI20gWJMiZalOGETmwACcXaJi2uYcIRPakMKtFbKOL4thhpgeIy+6mAJf4iBWqC0bGNC9HQ6BwGaUBmheXYwBhHZ+L0xZ9i2VjDCwq4sAJQ5dmawoMIuwoeLOhEWLO1HSImrjxlO6bDMQqYCbGhHpp0bCigJfjLpMHBbD2f6EdGGFWAA7AojLxsMy7cX+1Fdp0ABijIZVJuYKKV3GpsxLaxsMi4The2DRploo0BeCgQLBvRtrB0YVhAHgrI23Gxoy74CSIChWHVDW5k1tGtdg6ailOACsdBdjQbaMlOBYFrO0ZQJlXbDKYpUthYGG9WBrYCdIhGisQooEY2mWEdIbAeNRLDDDAdAYdIy7DMWVgtsMzmJselkqXNMFFtxtGZdpdDxm2NCimavTcQWhC9FAIiMqVXbNi2i5WBOAXDC2FaAaKtFgUJYGENxsHDHAjJ0GBBYsMWZClQoU5+LGIj0zmPZWGQBZ0KYUO5hYZpy64znENgEC0X4g2xisbZibOpgWB43HEB21ENi26aEW20WxVTphQEl8bMbRRs9go2VmvG2B+FFYFbAKKxbZTy0WH4nSoFOAlWBWKzEF22AsIue3RtIGm2bOCgXltXYWOmjIeMWfgVlVIhWNgqYoRLuYdqmhEcJlxbRjsCgsGQ1HFrBYEjVA43caT1GNsWdc5sMPbcVs8O5g2ECFe0EBG0OkyMguNDEFwHhWLRsdxVYXZ0wJE7poQBZbdIKwXjQ0bq2BoquIyFgToy-nxsK6ZR1LuawW2ZD1XLLmaypgJx0GwHALYWwPCEUyoIaiZoFCdGLJlDC19ZwwHjB2WijJAbDALHPEQfgfqdCao1RkqBEo0ETNGeMChCKEUXKbWccA84cELm-Hs2E47UR7IWTKcULB8TAhAPKMDUBbTllACqO8oA9hjh2Xo1FqJxWGJlOyAlYLFm4qVGAjZUDCgvH+Xef4PB+BoNNSYUAxSZUUkAkQfZprVnHpLNs0hSpTgHnABa0ZRTClnBwUq6VYyZTbBOPwsE-yMmovYnMkNlxWFibGSYCgoBbTGnAWCF44CTGEoyWc6ZUxgQvCsPywpiwCRYD2QiBYBGNUbLRUUf4wKzhYKVWCfhmoYTbL0MgRVsCmCLmBYs2YWylTYG2SYEBw45joKmOAHA-CmF6PAYUwo2zpisIyToChlyGS-lsNsxAkkWAgJMLsj0qoYVjAshW4kPAQAUDALYsZIkcDoPoqAoMWCTFiSIP8sZpCAIZuwQiGEWCJggClbirgmxE2FoQUUy4pxhVGbmaMMdJidgZnQOg5ythuzYB7Dwk8Y6lRWFOXyF5aKQkjr0a6AlUwAOwB2CchDhTRj-CjUqVJYIsFTBOUUE5pDRloj2QgFhGRhxuiC9MHBakCVKmBPwBYtiEToIuNQ0ZuKmETL0DwwprkYRgFOYU8ZzIytzEy4sLK2WVhEMKaQZ82CdEXBUToZo2DxS9aKIOAoLyKRbI2WMBZiBTg7BUyswx0yCGwB4Ggf5YJzMbF2LsphowQyeT2TKYVGTFgsAQls2APoJPsYrVwGKth+GIDCuAwpei0WCp0ToEBkKoyJtgLZrgLCEAEhWYYXYNEtlcOrRM0gSmLg7LOAs3FGyTGwNRVViYPCZQvhUqqZFsAFg8IrINGFOgFiDsQQahEoBQGjNRZcjZ4wsAMjSuAkrRQHr7cMDCQ7cyuE6H5VAMBlxAoFMKNg3TVUBpjrOaK-bcwy3IrYpWOZGx+FbmBOCUBRSZUBT+bAPZgmhPCZE8plSezyrqctBpxYWZ0GkFtNyWxhi0V6CwYgUBl1+A6heESiqSxTJmSIN9TcCXMVDrBdMQdRQ9gvIuToIEpUMsqcWYj4UwIYQLImLa6YWCZRnKA7AjrSqzjNAWKdhFGwEZbPZBT9SrDkdZoRdm3FHyYeoh1UqGFEyZW7YW4BKZ305jbK4MCY72NbQrIuRjVg-CZSsKmZcxAZ4ev4i2cWHZj4tjgLGNgujCDoevnQGAQcVY6cZJlP8PZFx0C-omI5sTEkrC4Jc3MbYtkcBWPuGACg1m0T-G2CGE5CIXnjI2LaGlsDDDCi2eMYKHYCW4sRUStEVii1QIRXksYthMsSHQWijYIDHKspHDgFyRBVUa4uGAZA8oXmjL0RcYVegKGwFAaQmtW1WEM41YYrgtozwEhhP6iYaAmuNIVUU5l0zSFgteUUbBW3YOop0Cs1WFAWFQKYaQAk2xwC7OhFY0ZYKRQyF2RmjZYIwBQX4S8Rk-AdjCSwODIgVZIMer2nMUNMqTDmR4LsWwKioAnMMBQ6ZMdQBQaYGgbAOyWpzKDUqtrCGmvTAWQiiZWkmv0BWRsPY2wWmwDAMxYNJeVz4XD+Mt0o7RmQ3QP8qBGx-r1RYFgnRlza9bX7EQgaVIdi2F0E3ysekeK8dIAm3dhiNgwqmIlqdaWMmFI2TzOYkwdlniziwW1eh3zNFtHAi5aKepYBWRM6Z3IDNh8QBHjVYJsBR2jqysEvxmh7FtKc8ZYLTL-MWMCNh5FTgnARjdFYVUyTpxOcVF82+bT5ctmAIhSptlKtIWcpVTARIBRXUmIaUss8ia4NsU5iBkFcIQetPZCnYEbM51z7mC2qLAj50mrg2CBfkfWtMFgG2LgvGBTbPYH1+ETBG4BIgNAwoqY2AksuY8YVgNApUXKhEU0uc-AYuZoFYs4dAW0JWvqHgCgiYY2wCE4cWPuOYFgbY1EbUCgt8eOp6u0sYjYjYXU0YbY3+dKjYBuxYMcjKiY2Ai4HgzuM6seIgwscAs4kw0YdALAWwb2c8t6W6JG9ObYnWEApgyE6SqAVgjYvaNAUUHgUAO8m8VgooBYLitkNSMhlcf40Y0Y6YSaL0HstEkwFSOCdAy4eynBZYceIg8YwssuOYsYFgi4iY-kGqxAjI0Y9ecYKwW60gxYGEU4NAWwtEDBCyZk-+UabYqA32LYZoYEpUBYtEUAWO0gQBbA0+BSoqs48YpsvEhE7uOYXWwBS0lYuKB2Amvh7kwwkwsYugF4jYWw-kCgoo8EnGC40yAkF4y2xAtSxYNUcAwwYxIgmURMTuU4hAE4y4f4VUikGK6Y1OZmpgb4LASQ3E30Eiy4Fg2AE4pUhE3a3Es4p8xcCyiqFgZA3GIxhEHYpw3ECuhEW0E4GEIgvQLcF4MWYqP+f+kaKk0aaR9kYyYEIaUALSt63EnSV0fgHgvQbAZoU4AE8OZaVgrgP62xuYLAfsqYxUFY50tEBY0gah8c8Y50MAYUZsPyfyeJ8YWKfe1cLA+gZoy4KwUg-KIg4EjY9UF4vEooVg1EiYsYG6Vc26u6uYxiWRU4jYU4MA8RJAVgpUFgF4REpgMcwwwoN0VyIg1EG+OYn6rgiY18i4xoWiooGEFY2As4XYHxtSBYLsnGDEwxRahEIgokNAC2U4oxIUFY0YhAbcZohARmJmYJUujMG+pgsYQSaR1aXAtEs6HYsYqYU4B6RizUhEy4sEdiuY6Yfx9UpC0kqYqYrszEtSjyBhHAwwpUxAwEAUQUu2pGGErB+8uYpgTyqYtUHUki-W-JZAYqkwWw0gFQy4vphCxMsYpCP8vxW8jh82iYWSrxxAVgwol4E4MAKwRMYKTmUpUGVgr2sGqW6YGWSpKpOehALyKwIgKwiYfSxUnQB0msfyRyhEbJUGsYUWhAqAYpXYj2RKj8VgJuKwUWXei4oo7R0pBM55uYcAAppUcA0YHAhx6qqADYfgE4HYkw1CAUi4MasSjMfgEo3ZOYfgcAqA2O78ew5cSyNYMcyuRyNO1sOY24E4YayRlc7QYKEKAUewZxPYE4sYci2pUmkqW0Eu4Ui4kwxuLYgEE45uWwx6eOF4+k1EikmU9kQMIMC4x5LY0goo8UiS4BFYNU8Y0Y6J8YqUu0DY8Y6S5qxmKuZoCWuYZo-O76DYpqUABYKwf4+RWwgGRCJAqFvQcAvQsB8kWYcuhEtcP8bYsYHg7ysk0CdZsYJUU4ZAmULsHAjIHsjIbYmUpV1EGEFgwo2Am828r2BhLYMsJpeUPZVgHgBYy4lpF468o6gGnQ8YeMCgvQoog03MDGHgpUiY7S3lqAolbYW05V0OrgxURSt69KkuHYNM8ZsYW0pU8YtEnky84koZg2cqwof4EAf4W0ulEAMAW0KwjIhELAMKbSdA3E3EjIHAU4sEWw2S6ubAW0hsrFm51EK+J5KqiFOY2ApUCunkupwojIbeHYg2NA-pnQrg0gXwSphE+S3EAMfgqA3EZoqAFUjIfgKwhUAUMSooiQkwQUb8v+UEXmhAX2UJDWambpYE6Yw0m2nYF4u8qsHgUSe8Cgrgkw-RvQagWw1EfAWWqYHYzG6JmJ3FZeOYikm84abYLY1EqY8YJJrgHs18MAMA+4vQ-stsi4jYhEsEC+sE7+UAXxAsQsIsMEE43kMAhAk1gU6YE48OSlJJCiYJ4p0A4K0YmSbYGQdAFYpgxYcgwoGQoMf4MAVgi4f420CgHgv6aGfgWwsEVgF40gqkbAyxU4Ug0VWyNlq+OM6i5l8e4W0NBYp2EAf6WwvQJUKSqUi4YEU4GNNxZoeOzetE5ULMY0YEHgFYYELAJAgZcAiYU4WyX6HlVFvQKwzxLYD1nQ70n030v0pghACgWws4iK04VgsEe+vEv0pNvQ8YjMMA5Uo+EqooWOE99mz6iWsEnQTOXmdAYCKcbYdAt80gPYkp2VZoXYqVhENAQ2ZAZoKwFAjIsEnUs4501EZMW0g9l8sEkw6u120EQNXY+hLixAWxmtuYooFYWOtEXOFQMA9Y0dhAsBW0LApqpqKwHgWwLUs4s49UWwCg92i4BRb4U42BKVcsZAVgLAoNUuVgItzV9q3EZ0DdQV9UhAsEpU8tmUGNYEFtVtp0y6wsnQYDaAHgf6U4EAIgbYMA260YLWbAw2FgOBTYpUFFvFVgdAF4+KhKxKpKU4bYBUGEXY0gR8sEFibAF4ZA0YZ2bANA1E8aFi1E3EGEHAUAPDMAwwbYRMbACumUjYqVHY7u1BZoFF0M1aOALAfgN8IRZoV2bdqYqUjIjIKwfiU4HAi4U4ooKws41S-I46GNxNfmsEZAx6na2A8YhkmCsOee9i6YgKNc5ZuYDCIkcALpjCkddDDDKwF2HkVSl48YqAxFV12dCgxq81jY6YkwqYDaLA96FgNAAyDjwab04aYJFYuK4GfdDCUAHYQU8ti4ZAcyaic9WSLTkwF4E4KwGEF4F4Zo3EItstHYaUPYGBCgbADjCZGKMABJsyGELsUBCgCThEKw2Fpg4qzpsDItnBLAHg6YvQhAr1Hg62gTKDFMXYGEvQnu8YfgzpWTbpHAiqzGU2UaMAsakC0CsCqzMddAcdBlBY1EU4zkNAsEVGi4mRBsHgW071Qki4P1px0gtE8YHAJVhLu0ByYSSSf4HAYEqOZmpUb4JpnQoo6S2SPYRGyuLAbY3sc46YtENDMKPEuziJE4kD71F4ooZAkm6YrgJ00YFk8E9xYyUApUAr4JMamsekGEaFfgZoGY8YWwUAvzb4+5W0cA+50YvUUA+1kIMAPYO8pAFYW0MAG0fqoT1RIgeJU4P5Uj0taa0YhEhqsYdAHAzrhAXYd2ZAAz2AtEY035g7HUZOPDfg2AhEG9jYZR8YnQZ20gru7uVgGEyUfVLYf4pUO1ni-wPiUOBY6YHhnZItxb7RXYKwsEU4pWZoWw0YU4X1s4+dFYxAEZRiydfgFRZAVRAkeJZz2KUusY0tCsbDGduywwptakoMulW08YpNGE6H5VbKuOqotenBf4wwU4xYwwaSz5PKdYjGKtIg6Y49szLii7IkH00y29bAu9+9h9QqgLZ9I7yiuGmUHADSL7raFYbYyUzh8lfkAkPYZAIgXhIg1BVgnQ0YaBGEi418SCJsvQT41LKwvQ0gfgMSM477PYtJBYZAZAMAjLjIXY1ECgtF6YPYTpuy+y2dVWSkeWVrhJZoHAqY7A0giCcAtmzrHArr6YMAs4tEk7iEKwllXraqz4osrTZAKwnQqYMAwSrmHgZAXYEhlYGEkwDuBB-yxYvQHiypqpfguEl7ub-Dv6hbcAk7WwXYmU7jOEF4Jorgs4HgkZcJiY+Y3EHAooryYU9impsFXplcTYXA9UcxU4bcAVBHrgGuXYwoLQHStEqAmUHxIpBYkwrdi4W0jIKNNA04pg2AF454T7qO6J6Yf4mUnQvyhCiYCbC5c8IzScKcacAD6aWVotF4sEhVlVzTrTl6E4gyuu1pEAW056vQNAtE-OVgM9aeHaXaV+uYEML7SeOY9X2+u+qZs6wDEAHYbsMA3Ei4KnXdT2u3pgqYbD56773st1o4aSAs7r0gRmy4wHLYqRqYHbRCTUZ2eU30xAO1IgaSfzUA3eSdicFYeVVzHAqoF4zX+xoo+Z-OyqinwcbAX49ODWFgpgq9E3ww2AWOZAqMulqA-WQXiYM8qX54xFvQxAjYjZrgwwF4U4y4woNAUK1YPYJY6Y1EASf67ebTry059iv2fgBvUMjI7OqY6rPKdAfKqYr+2A4TF4LA7Wpq6dyOycRMMALAVnpvWElxFYvQ93fIrqjqs4bYS+kSZCLOgBw0oBP8TlbYORGQ9mPYwofgf4Wxpgjeyd0gndFyvz4dv0rgworvnif4E77ObPPXZo5KZAWwnQGZVMr2G+8YsYNUMBcBRtrgtDZoCaworgHgGmcAmUnK-UjYGO8YGEYZvQPY90qArSqAsYqAJWZWX8HYH1eTc8aERTNHoUxwCi0fkwwW7qmisCmAmkjCRhH+j5QW9fkt3UUKTR4YQtCI+aDyPGHMC654wQ4X4g1lcYb5fKwoOAAFT-BsA8oi4BNkjS2hikVgYECwN9AR4a4XoRzW6udzIBThbMieYZMQBFiMgDyGEI8sdiAjECRApqeMA3RoryNqI-iRsDCVxSZQewerbiBpmkBOp4wqMaFrfCnBow-wUADBFsCgFmh9EMAEUushy4qRJ03uFsLfW4iJhgwVAlAVYA7CoBuCh9YUIRDrQl1hQiYDCKF06AsAhO9XToHxwE5bAaA8LMCOiUmD9dBusEMPrmGXAGsk2ksHUsVBEyZQKShAQbKA2VKpgWWsgYUJiVbrUQYAmULYGaEygdNFkjcVULFljBLJ1UA2N-rc1GwthTApgHJOBxEDLgRodFISnAHVziolcrSRcAoCLaZR4wrSKOqh25JmpYE8ArUvzEFhTEm8oJYBOVRgxKV4w58IOHACgAaZhOK2WiEynWAWBXAooN3iwC-jTBYGM8REq2ljDb4oWsWY8AnkDra0dhuYYfPsLUonpNKrgW0m+jOSTBfoNAZOglWjDp9XAO7VMJ0EeKSZ2gGECABOGVZsAewpgDpEXiwT0RsS4BKwCsFo4tgaAhEaiJuUIh+AwItEMgGGR+4gtckPbQ1AkgqGtUbAQgbiKgF1bChyqvhToGGTFQSopUzBBqhWBoCyk6cjIVwL0ETDlN-ggeRpH7zdgiBG80gJYouHjC7Ausi4UwFRGgZqQtC2UDwFJn7ai02ikiZfhCiMp88-MsjRGA9QdZWAwIxIqkof2P6LcsssYRcCph4YTg0k8UZcKJQ6YtBX+7-dMKF1nDUDSYN0TzNZFQLpFCCbYVGK4EsKvUjoHKYgLBETDLgu6xYLYHAFSgUxcYDSBOI7SmIu0OwmUd2rGEWJYlKOFYWMHDAsAIxReY6YGEwmCLSBvuR8DIObnoCgNCAi4Iupsnz7CgYAvkQlnJALAf9CA8qGeBwCTSwRGwYlClFfRtgVhFoczKGEoGJGc5uctnPnNgGXBtg8oF-b2NWy0HEBKheeLdOlGXAYRR6csBQD+xEhTh9AZdRkCpiqj9pCWiYxxqKFUrqVT056bSpVW4iC1S2s4XKuExXTTNEwXYNeGfC2Dpgto7GRkMuDvAxCzQN3SoZz0RjcR9IL3ePC+P7LmpfsNKG9CbDcylJRCZALwfl2PAwRhgMwlAcBVVBZkiOXYLaM7jAhbtpYovSUfahFSpgAqMgi9B9AUEiAuw0yKeHPRfHQsuwsYHsG4y2ipIIAoMJ5AWACHCMxoi4b-AVTUaeYKwLAWMNIQPYiB3E15crpVxzb21raemBgXtQ8CTBnRtEQPLoP0GGDnkJgjIDAD-yeQOwpmCbusFdxSwLAQSP8AFAFGZRzEM8ZcC8KHEzC3U2QjIG3nwSoAnC4aCAJ9njC7k9MDdUUPGD0Q9EKgW0EZEGlewB1pYFYPYnQBsAYQPA7kxsMAzDSgMPAqAQ-NwOHGEBSoPPbiCsBYABJcoE4JNO4zYC9gJwfHKAH0HwbRV3cDYOOsuGIkiBUwfZNsE+XpbowRh9DV1hMKmEzC88pgD+E-gmzqJwcKwlngoDZ6eQOeC0h1M93r6rSlAqYNBO-CJJsAL2CgaMBc2uSZdTOpgZyK4GgRQBW0EDfVphD8BWAdqtSHJuwgWnnUtoHnWZNTy1AiwEmCCD-lFk-SZQKwxVFYMRzoDm4AhpUWsSlRWDLgto45c1ME3VyxhA2z2TnIZjo7tNS0yQsCPzDVQrBNUX3OMEfBBZaCmBg7ZVlsC6zmN84KrTlAoFgi8kJeXEhKmMypzsVh0WY3ng6S7CkBwB0CNrODAQ6niWJOcXSh4GkCJ9Jg6YRcJlCUSJ9ZYRNbiKJRmGwQzQt1Slm2FnB1tHBbYeqMQAiQcAHu3hCwAoHOT1ZJYUAnAE8X14KBUoXzLYhLz+aphi41MXOAaxoCxhZwy4VANyUJy5RGEfsToFFG6KTlteaKeTtHEoq3i9aBtbUrbC7DphU+MDFUK4ApYlw2AVgZcC3PWyuBiAVwiTD2GLB3lQM3eXvD2Wgayd-ktEegoGVKRWAqmvVVMKxigCKcvg2NOAM2BoCEByAJoUqATXMSEQyAC7AsLbziKDwpoqYEKKRlohdkzMVZHzmwGgapIJwEAKwJ7JilzF4w2UBjJlDThIFD6xAYtnQEIizgmBxCQ1FRnf7RhSs5WKnB9T14HtuJyM3jHsmrIWA-E0yC9CbG1TOBXAmUJqZQhKHDByKDSCcK3RUlCsfIrgVSKTgwJ7z2ybuDUsQDWIkMcwQkN4lYAJbZ5xCVJGEhTCfaktCA8YPfCt37Tf4OwLzT5CUOjCOo4eU+OAAVCyaEB3Sysboa2iei5dS8bATqEHDVAWAk6p4gUWPU2yoAgpU4SeG-PTr8BOCbDNKLQJGQixhIE0UwDoiOwtgEmo8sga4A8TPYdYiYQgOmH3r51SkI-C8MZGkCmTfZlpMgGiS949gXRnqYsL4tVQBVGw0nBIDAqQqV54FSyRKM0RsKdMcA6YP9H4FuoYgBp50M6BYE6Aalu0VRHhltChSJgBR7ixkNDIba+pg4iYANIQjxzRgVp1FABCICTT2Y-EnWPvmg21LqLqIvikoX+F6ANleupgGcJUPSgmomE4GQUeKmkqiiGsd+e0TVgfyuAMImeCdjK0GzFgZJjYaRplAv7phWkWGFKOmF3aEQoEMwzoFZzUmc1L2uklYMCS1C8tt2vUKvFTAwjetfY2APKhYEIhqNmedAYsG0naxi0HUHeFUhwFohaw+JnadCFsBdLZMFFhBe6IdmZxyd385yW+DlGxZdhxW9DceudhmLdFJ6edSYB2Fu4QICwnQO7GaFnDdF+8XLV0jivpyIJlFBK70cQCoRuYtBA7KpIQAvCJglwNAS5YyruweAswW5Uybeh6itMJ+sPeHnq1JyxSKcMAJWROFpwtgegmDXoWaB1yay-w2suDnrLygzDvYooaQDAHhp-k-wzMeFl2BUYQByaUU+MFTR6iNhiA+sUUOIWlJyxB89qU1ORClWGx0AakXkLvG3JgQ-wrDUUOsJEDTw4SKE5cNRDDIQNOgKlHsAR3yLxZoYbYcycWRuSJgwI9JaQBcLAhfjGwf4E2WQEnKGdeIo8EQCSj8B9sKJz44sE5QgDJJZwf4YIY9EjQVhxRSbBTj530CoxCIxAVABwAlV0AnuUgLsBpjlgrpK431KwMQCdVoZdSAUbAPDkU6ZRqhRyPwIVElxQzZwG+RJGBDTyuAw2-9aMNhB8VJh++U4b0ZoxH4Gxz0BcNgGslh7UQaAYELfNIAUlvjPqpjAhlVE6QrFExNMY6M0laTtJOkdpZtRhD-Cqg4hxqKcL0GNKv4VgE0tsGBF8aQoUOpUZKHeiZJmRZMOYJpY-HtEAd-CtEToCuxoD21IBpgSltS2LA0BcqsYHRC0AnAGE3ZgE89asXoQcTCOA6R2WMxMjKzcwFCbALzwXbRhTgJXRXFdROK2rXe0YCdqrAsDejsWGdNSYRB3hwBpAalOMHQHNFi1bu0ZAAobDCmEEFokwdWMKGICtJuh37CMhAGZpXLZwKwcpLUjugKACwqsKFsIIlmoBbIlVY3sLlgwHoXEjINDGzKopbRowHNVpKmCyQz06YSM4MC1O4jFt+2wsPfI2A2orgFEEAK7ANixxoSMIf8F5Emhnpz1tkqPHMKKFKgOkwC9OZvCSUJzkkM4Uko+DRRSRMi6kOSMEDACwVaF9AJQrEULmF74NXkvxIBEQXOqf1vC7SKANFTcjiQiOg2R+tMhzgHTZheYU5maHxr15phOdQpVtA40nL+B3sV9ndw7Bx56pPYDfJkVohEww0SQD6V9J+m9A-poja7QXhgBdhbCdADwKyUwiNYYZ2TVKqkoTLChUAxDBvrciZRm9OSlvF1jPHuiWzFwxXFgFAHs6mAKwpUF3jHE6DUQyAy4XsF7yBgiAZFANV3N9FMDBT+0WwSEge03H+5T28jc9pexhHhNgRTDdlXABujzp1R+Hc6qKGDYoDMJH+UUB2AYGE1CAB5UwGTCcUhzDFSeEsjogVyN1m6rde7m7AsBD8u614s0KbOChkw30GENSM+L6rQbEdq6P-JIX1YKp0Uz6xwd0ALCq5hhjYCMohDIBmwuNaUEyFYD-AVgrVW6ErMIINTWUFCZoU7rrgq7LhJcp8wEomNjBmFP4eibuVOETYODUAXddrMKF5JtZFwbYQiG9XJSMgiFs4aJC-BEB3w3B5emHkZFKhX1MRxYaiD9V1JThwMbASDJLHkTNjLImyA0jd3+Cm8JJIeNTBwDOrlZNMu5JnbXobBmgqWngs0AoVJqXFc5FYM9Reu9nXqWwp8yYO+iL2JgDSu+LWF4o-XdjG8y4X5l8Hl4rJFuzBR1LKqbwoMZhVbccQmtoiAliAwJSOJsIcSvhtJcpHwtmLvjlFZVjILYLwLNBLUVgLwy5Q0wNIbqRAD87iMSXhJv8sdxYTurkwcZ4kYAvPL2H0tghdhZu2Q0cHkO4WEQm64OA0lS0rjyREwNKR+OdDaiow2dUVAmETBJhkxutO7SYD2H3aIxsthYQKieHhqI1Tth8c9LAigBwAPA14GmOmDtmNMys4XSxdGGsVvaYIRU3oJsshqihjGNdCwNZU80awtYXWU4WBHmJrg1BGjSIuUVeQ55LwJoeibekxG+Ktg2WgPkQ0ZDC40U-yWMGBGBSVh-YpAfVCvSaXnpTira2Bv1TYCMh0wF4M6rt3LAWdTAyKQgOC0LBndwR3EKwAIDfgBRP4NCzZNgWcRRpCy4COAAmnXKNh6pz80zouCah+dvZu+X4rBET1Y6ShW0RVoFpoBuQKBk0puFACIVzT8JPhHbsoqkgsBEmete1o6zgBW9Wk7rTKK2gtaj8Sy3o5VKgD6SoBBN5m5FnEsi1QB501AqaCbDiN-gP68CoSCQEY5n4BUmUG6FCsmIRUxa8LOaIuCAJQ9Tg4+6KNgFNqNtNeHS-2fd0OxbHSo3nE0pXKNom065sDJvINKURUsJpOYdzJ0Dd6lRSBWwX9NREDamBAtGCdOakzJ3daKwJkeQz7gbBp5yI-wV6gWGgiNokwe+GEb0nmIA4Jw1EYcdTgPDphDBzSCBDQC+jcjv24qIxLdUGkTQ+6w3Qgt0LywqKZYUWTkgoF9ipQIAXYKATFI0jWckC1EWMHwFoiWa7sEACRJlEArbVUxuIjsAqyxxc8swBvY0ljiDHAUYo5Kc9EF2FCFR2cGECgPsq2y8ZUw6iKmR2COaUszU0YDPVnr1y56MizUd9NIw9gx1S2CDKABeG5jQDvY1A1BMULbCC0KkMkSNrTgL64VVQGET3nTIfmtKIlyJyuBYFqxomcw7YWCDfL857BAuLrVWOsEICuBqBq81sKpIUDbYfId8J-J6nhwsAOo-fAbuKUkZEJM4XhanZfy+x1qn8NxOzSwDUnLg8q-DIcxFxaiSl7Ia0vwFtEIidZH2E4sAxwF3iQHoDv+ZIj2EBTyw5SiSTKHstQPNcLeq0DAywGeSNgaA-0DwHAE1RN62WPpMSHjB7BfRKZnzRIWr1vncteVylHipGk1qLhmsp8uAKbwfC9AL2ObZUoghwC0RBNiYaZeWBAKSIWAobCoI9RxyXoiCnQW+AkSYKS4yAooJuo4dVh3xWzz2Xgo9DOVmgM8HgMJh72i7T5vIm0dA08magQBFckKraCzxYDMQHqy4BxhVSeLjcrAw7Bc2hmjN81iAdmvZmQC+ABMNGntYYPHowVdzqIMcKAIQB7DSBlU4xCchUFRTAJ+ADChvvJHATxpE0yac057PHwcdiCfYpTCWVez+lGQb1PjtRChRbA+c30p8y1hWQGU4KwCA9ArDgwWACzTBqcJ4fHm5DypiQF8RAQJrtJhQ1BEssQWbIeBs0fgWcLBAwgMJCqpw2AH90T4rjYwEAHKhgYayno0hvMbAFqBoR0JJ8T8tdlljin2QQElmmgMGBZjGj-JE0vORWgXy19fZ9iAwzOMooVQOASUeZT+0KjdwLAYvCRCwF06XLygbTIg+KP33u1H+g9eaA-LrYtKm23ZxJBwX7PGlL2qYX3rRDoAs8JsNcvE1wPjCEmYml5LsDmFJwsA3etTZFezkIDDA9UozCAOQEn0-wpoiYRSojFC3+VeTBMAUx8uFOSsdodAPGHdUcpF6R1hgiAhbK1z40+Z93f8Jt2r7EAdOBYSXDjAcNbaFoUUs0O-lvjvrvmX6wfoOA4B1ptSpgZgoBB4nGHnSv+Uw3zTWwWgzOLVkQHGJj62DEYQBMgWMKeokHhgec2G+1DP4nHFLQK5sL1Nggt4hsGecNDFFxkJsRb+DNfhNxMpsEVNpUdyvbEMFrAJwcV98F9W4E55uD7VnMNLVQplEfIH1R6t9J7DM70mr7BIoslgPU7eeqYA-MKAnBPIdYgDD5crcXADSPA9UuMxhN6AfUt+qHcxC+zAj+xZwU4UwJwbvC7xy7lwicDHHmmkYPAgAnMAwhCh4tnUWwAhmqEmAs3cqXdU9E9EXFN3hQAzR6txGFChHj8kW4CE3UsnwycwJussnXBMnEB8yDeb9QrZ7BaxNbVwjpBY0KozhXAGQTCfTFp233TAtIlDgvLUAdhe4fgU-mUQqKC3gE5rJGdXh3FTcCOn1YUCnTUaDYCwhkFgBODSwXhdYluG6IQGSTgjBpiTTKP73q4YRgZ2DcpPWiDsEMUiAu3MMKEU5yiSk1m1GFDjiUqjNMj7RbtPjYAwALZPEwiFfWwDsqhxpwjuZtm2w0Lxk3EA3i812geoJxBiNgGBMM2W5rcf6JlEGtGwo5LCMEJYisT-C6HRsxSTgtGDNstgQ2FMmujbgLBKcr4FTUdJbq+RwXKW9TMRhOETD9oXmqYWMDSkSbZWHB-mKttyRUJ+xpKDG1aWQHLWsoL7Xe1CvtS+RNSqSfM37lOEbvWc4AmbMTU1BtYrtTEHKXYF8qtqQrV06yGHuFxjauALwehq1CGsy32PD0xsqkcKCgQna6BZy5jv8ksko0mGATbOlGPW6Hwa4ScaKLBDC3WPhqTTkNIeitzFg1gN1YGVALK1bBlwIhTJ32qo5WACiUtAR9RHURYTrut3NVPkxyalzvS3FCYlMV-ocAzQ90biE3mpOEBGQ+QqcEUQqSMgBk5+fwUSgXNEGIAnZ0+zKmoIsrw7kNBdb-LN7aRgwK2NsCKT-AXgfIqXXeM2HygJMY4fgXq01zcR7q7N5ouAOq3CyoAnyyRa5E1R-iJ7X2Hil-b-jf1fr4wX+iA+0H-DmNDuXglOuvIO6VoWsWbXLAFNeLBSRAtOCtQ2DAgWFFcrrN6nlD6r0YJTFtTJwoFgbcQTN5jGAN7djC+2OwMUN2UcPonRPTAe8rwiWSyLWV0SMDTGCwA05o3-IM4HmJMGIAmR6YCgf5Fo7gDvsIA+3OcQWAbwQBSohAU6DGxgDuVpIcZWRhYFbhRSpLqsQolw7RzTgkgewTNvdx8IWX-wh3UlxE2llXDk+CHG3P+n3UNlA0JZXoFfcJLEALw4Keiuag7C+KWYmoshwNPAVowRFc0PS++yMR4cCORHAMfrUgdmxhVsSWBx5yhimApuaOTTHNwJlThFuKkydhoz2iaQwm3SlgM2DbD95RQpyHu4zuXDUUsF-sRRMDFBglXcuHYS2+set5LVYIBNXxGJDrvuC+a4KzSBCtKi8HrIKseZTlF6sF8uwTezTSu3jD8K2sGFu2XGyx7jIkjOYAZtFh0SK5tpGuXaa0hlf0wZYi46kTcbuO3UHj8S545wSgBvG4qbuYTjxRIbWR2qdAG3gfmkDYAWxkq9CnDs+RWt7SjYFYNwDQmdwpwM8U4mwEI5IsUW42fNTFGlh-lobakT3k8iFZHjF+LQKkWuGJygMgpRRPsJMEmD-JMoC6JnYPTOKMhft-csfT3nXQDnBo-u+PF9gLBcaRSYmMSL3zeLyMLwb1royOxlnn6+w4yEydxCCGtJRp12eFrpYLCuBerUQzyFPfqpyd8FLNFsHd3crjon8CNNg3QKJErpMjTYcB5zCQaFNESFXOAB7rDTZJZ689CTrmEXAVhmN4U6MwF4RH+QssCcFjr4rAgSnPEBlROt0hEXgD-5NAZBJqj7gic87bUcTovUXAiAyvuKp4q4FFy45CI-oi8KBugEwBYBZPJ7I6rIDVaoY5+2FaTVaRWdsAelx3mUXkPHvpAO5kLApQUOJIBQklw5Vq1XMVhVY0KlYBUEo9-kTNN-Q+sq1nAx0IATmIqZ9N8U4Z2ERcP8KG+K-0yUsKsMb64e1h+Bfv30hMx4F+b5laIQj-wuWH5RQBgmdAGcNCxWCZEnILqdMHLA5VrudU4HkQL+lNVSRX01cLvJAVFQ4Tvm2NNsF2HnBgNuBttWOBUgSmEBVoWViAIJx6+id+vrhFsL3H-FbRUxKMT4ttOJYaEy+YEE2d6uuGle+wW-GPlfBYCmdHkO32lpyurSBkBsQ8BIFdFroQBy3lcFLvIl0h2VOD5p0wJaeDCgxOg2AaQCSiASMg7AXBEg5ZoR42a7LZoyYKNU63EAN6pI2+x20njmwZ4zeP7mBDrd2SEfn+6QGaknYbUiEFgCVzvYXMKEtIe0brsqk7PNtcCPYS64lihduQxo2AXfMtg4Cxh3WTz1DjQFg1IvQqxYOgOhmlruFsmpVepn5lCHv5q+gbtgCu16LlS4jFCdxuBxhheXsAZBZdPHMjrEBVT0YGVYyGG9M-DEQiuaFYHRak9X4DpDH00n98Fg3n2ug8gT+k5u-rwYPhaNzh7DwR6ocby9gm9MY5N1RTU7uCpAnBaCvbBY-ToyGQJe2vcBGJYI56GKhlgRlg4y4UK4OkSKwwRAlCoAAmonTzah-JAjKWs9JBq1YFtFRRi42VvrwFqEShKITgJWCeD5Et6LAbiwkfOZaMgF4BwBsAM8JMAqUOaGWY2cATPewEmOnPRiUswwEAjuY1wiijmscOgTZE22pKTZT6Y8FXDxOiMCAKZQnvDQH0k8HKnw2sEYBVwSmpjkAj-wDGBaBzgLACgz6otmv77cwxLvjRkukaKfLqI6RNRw6IXKObo2alupMDW6uVEPyNg6fGgCEcPhORizgGjBxbgYr8F4K1InaOczFIpSI-qB0eKAVzeE3RE0jwk6GimDYaDXrKzOBQ-IrjcQbLGyg24tUAuzpgWzOQo-oxYFQrVo9iHpAoQwnrxivIZFtzDL6IOFw6JgvbFOBkOW+tvjOkkdJWB-gbEB8ieqpNIaoKAZwnJpdgCmkZBKahqtbDUETjOHZQw8EBQxUMTyLQx9ysBANLr2kphz7xm91HXo5qZMGBA0Ay4Odgw+6XHozZcVUB4QyckgXI7tiGeBwCtIsWFALAyTUoLSqcYWgIhos1EH4Cw2LvlQbAUY9OHpT0H4rmixiUjOXayMisOYRBwqAKeLYAdAOsCRQaGPOTFsvQIarcQRbCUKFGnziICOEQ1JrqKW7QKmAewyTC1h6c4dFgpHI4pKe7WuF4KZ4qwOWuN7UI9LLzAqm9Hiv5r+y3BeCb+XWLQak8HGmwAw8D3vlD8iaysKLSoaPKpCz6OYEqjKYaqBqhaoOqATxE8TqohbaIrDH6qBo++h4RTgGlhVSNg-xDtYC2SAplDQMtEFgRGUZEKSERqcnGsT6S+kGpD1SfvvZr5cAfrdzpQqfuMjQAUABVwdInTCGQ3UDEBiCdwt4JaivodkC2I5guYhKIwIYbLcYZwuqFlT8WranOArAwCmZBu4w3vmi2KlRvD4d4CgGBCZoVbDmikw+aIWj2k+xACG4kqlNWi1o9aDRY-SqALihMuYSKBokom5O4RNCBSIYKsIpSF4JDWNfrkTmCS4uNaTWy-FJDXoG9E8zSwvUK9I44eOLKZmmFpl6I0A1pv2hQwXYIyCTWwEMGASIvMFDjMOUUH+CzgpAuVK+hrckKF9C5GhzSF4WwdSjaKu8D3C6GZoJOy9srmIkjzw-DChzbYy4PqgWAOFumG3yRUCVAHQTvkAgJknctjo5goKEGL6oqAALAYQZoIRCE4-sDODaM1tNjCmoeeHAajwhEO67CkLvN6KiUSTBPTfEieFGhIo6RFyYKM-wLe7UQkkn3DLcf4ETJd0InFlRQkqEnqxAaGjONB3UnQKYySOZABhT4MB0Hih-hiZB-yYsBOtW5DCIlJKqusMDAjqAm0YAEyyM3olbSlOMyl7wU0fqsgo9QWRCS6vY6xGQC1yxwfbjVqoiHRivwrgmQDkaC4ZjjZoXRhqilQ94f0qk03EJkwzE4MB+HaRPKryy5gTZH+AdstOJiYja2QpSQKCh8B0zKkjYCTyxhsIYRL24UMNfTv8ZRuqIdiW0HvTgK+dneT0EBkr+aRo1kARFQkEBBlhcoKwGOLd8tnsrZbALomqDM+wyBYDoupgJxCZQakgjqvImkPGioAWoULb2hgJqjxlwyWACHCcF8BORyIqjmBI72F5nlTd0QLOByLiFiKnBDikwIhBf27So+SvoNhutAjINfEXqhQtEHW4RStEPYxbQ-BHOBvyU8KKDUQsIbGBdAkwC1iyQf4OtH0wIBC+CgQH1JCiLgVIiuiK8yLtjbG89MOmx3SmUCQRWAEbHEJtgiYIMag8i4LOCoAUTCJY+aBlvi79sGrtGB+AhAF9SY+mZMrAFQZkpIFtgbAN44iIeiNCwzoYMUWpbQ6co2D6Ss4PMHwQbpGmgdg9MBYCJ6tEMuDPIc1MJA-0m3NcoFQ5KvFo0eHQj2b68mxiziPUUBmJAzh8jIBjlhqYPDr-cLAINJUsZbtTH04fcnuR-gJMVDLu8C6Lsg9g5MMWBsAp9Pwq40aOoGhtgevKvQGm0NtSiHo9AObB8yXYNTiZOrpr0DUipQn+GCC3ELfDpmHPFFRMuoDMYKmArgD3ppQt3DzqB0WrJbaMwOCA+D6K8RB2CfmZwotx06gZH+BEEDiFYBe4F8hLSvULAA-C1MUpLyCBU4XJlD6kRniICDGU5rIzhIYmltAuif3AwhQRtvnxpqYmBFfA2UTUjSwlkfYNzg96r8O5RN0SEIyAYsD+J-Bowg2IaQ5g1MAF6lxeUkpxow8NBLzqotvk0jIKggG-Iy4ZWpnr1UC7BhB+AD1NTHgK44mhjcSObIuC9wvAqwTsqx-m5idQ6kFJCEAy4GQIkYd0Mvzqwz+tnj5xNfhYw-sUesbIXIoGl2BsAI2LRDi4bKN4gcAVem4jki5ACuYuodCFXb-0bmDBSSMhDrfHKwxfubgLOzUdMhmgg0dxDJqqYNow8wEMlJCQQraPPEPyVGlsDHSmsJ3TUIjNCpC9ADpMcGYiKmHpYtQwRPVzsY1yJSwk8GOMRBt2R2IkhEQCenDpoAhAKjgYQJuLfbSsRlBUjxgQ6I2IqoRLnIRpIOaIohiOsYFCxfIWWI6q9ATIR2B9gd0PZiIWYhMMAkGOdLH4ZxNigoDDAb8JbIooOvP0qlQfUktBXQ0-hUIXwHUnDwdhcgG1hnUdTmwBX4oPLhDsafHB4CGxYtLBCRsl7PCy7A2QlSI+KNCgNbsaJQeLD9cLLF5TiIrpo+D+wtEMFzJQnBgag5MWwHYRHYEsOZwj60FgFDkwgMlvDYKbYI2BIRlcHgSReDomMSsKvZCg6HsSNL2x1gtENeJLxDGLAAIwCgAmCeQtEImAUWuwKfBb+T3BEZz03YLW4yo1kBp4Q20eFtBuYX6C2pXMWVGcgbI0VKkhfEfgoMgs4LULySEQCIiIiWJnQAwLmJmUNQjWJSQv0rTySRvgqowUtH3SYwu0R8p1OCFl2DWkygi0yUwjWJsFRMfQRdz9E4STmwYC2sKPS8sY2HwmoqBug9TEAxAG5Ao0EZhIrKiZoGT46h68BhD1SP4NwGcUxYLVCHcxAPWgKAv+Pka1IJWFYAQA7GFwIT2uYHfrpE-jlFL5aWoJj5fgCgWaCqJGJHLaZQEroRDN888NmSmMhABmFpYWITKI3eLAMKAvs8jNICt03EOQAhRuYLmqAC1kIMa0QjclBGgw-pFHQx08wJtCtIUULLpAIJoMvDyMvrovYfU8wcAGRJkwgtD-wrnINrSAGEF4Qc8DAKyqtI0fnAC3KhAM6pmcf4AOBDSFRlOCRuksGHjlspgARAYQMLAFDpmgMuO7e+kZEZRQyi0EAi2mwwObjs4VuAW56obdMuB5QmNNepR6pUCHiq03EBWDrY7lFUjbYo0kRznMxNn8w6ulMMuATg9MekSYx+rKb7wMocH+B1WJ1MgrpgGzA6ZeC1ECTD1hCZOHS5s8qcEKXmunrOLyo-cJvCm8qCGfLmMpQClgm4W0GJ7tY1vgmh98kph0Tw6U9s35e4ZEEQjXgmUqDDEQ3qtEpmoMPr1gQxR4JMxY8BkKZ6AQnQOAjWxg0G0wJsjhJSyC0LTBfzFgJZr7xwYzpsvQoI6clsBD+naFAC9kU4DBSSkUkIhh1E6aWoxKcFEPDQ2UfkJbpyszLNSLxgDaj8TeEPfOzjbYQUs2YpCvxOAJhkATNrHfJhfsR4QA3igoYVgcAOYL38TXJ1L72mtuVJsArSJ-p7UiEinTWu8eAkbp0mTmrapEE7GW7kwI9mXq8e2piIAcgtMLIzDCexGwChaoidgDKSRGKKh5wQgCbKzgxACUFWADaJ9iQIsECClhJNFnanRJCMSRSEEflguySBEUHAieptwgVq9AKpGoRAuPtNGDt6EAJRigZLcoJCpEVYJdBRUOAbdqSmVxkOJXwNaBOAi8UkNxI9CKGSJioUiYFuSMIY2lwqC0yulqK5UfGrLFSwAHDPDv0ooO0qeo2nr7yEA8mOA5AxX8NaQGEKGTTAki-5l2DRgmEtfD-cjemsBoOgqMJoqgL0KmAoOiYKczeE1ENrG8kDnnyAI8PMKeodQ-LtWBxsXJszCZaqRJBHpgwFD2wzETPHpbQqsKlYYDaR4OBiNgAmTTCNgjuK0GokN8UL5WOlcCxLkMlyFDAmYWTASwrAVtLfbwuQrBOQqh+xDZS3o1WhPB9CtoRKZtg0qYJqL+M+MWAGCnQIhZpwqWizi7sIcX2kWE8ELyQrcoLEbyL8P7IUgQAr1hUaUMkwMPGWSoaSKlbQdxgoDZWIgNHGpcqALBCwAy2Ewa-MqhBLDTMxlm0abos6niyN+KoMvAuo-eF5QOmHgL4mFob8lequxTdD9H-w-NpGH8K30NGBn8+wRPDxQQoYXBtwrgFV6ESDCBgkmwEZsmrSIz5oIkG6VgHKxPBggE9xWAWoAWrgKb4VICJgdAIyB+EPurxjGkKWNRxZECuIUZGIS6eWph4DGImAWcXBDHiIQGyZf6TAaEeOgYRNkBODvI8Wg-CmAykCpAJxy4MjLHgYKLSyZQgbBJickT8tAIxo+3AEK9An7FuiWQ1BCiF3axYChw7WiJFuipc6UFlClQfgNaR1okaDLD404VoxoFgT+prDZCT5IMhuwu9FSzew4dGdTj6eEUBHEAFRnlwdg2AL4yk0WKGsTqo3sA6aOZ7ZBYAFQEgXaiN6MaJ5l90eiFiitm-mM7nBZdauxhhZ7OpR7cQFSNZARG0SDqguieWMJxkJozBYoVSPZnOibGUMPPnEi4KlEyJ81rq-haQ6Pk+Td0HEBTAypc6IRoXgOifTjdCCeq2gQAwwE+G0Qp3KWmTAx0l1QsAP-FRiyUadvHDvpqYKWBoMq6DGmCajMOKifMjeBtwqCSDJiQIwYlOmA1CHgO7xPUObEcxW0+aMzxrCqFEVLkBenF4ROUbVLkQssdIgXSAyWWGBBmoHgECpQA1EFUTwOMMHLRowlMWoQ64BYAz6hs7kFSIaErtNbDSMcCvA5Tmd9l6LXwhOdIA-ovjOQoxC0gOvDwQIqFsS9AQCH4BQQhiqcZ5ofQHsB9B-0DFCwQcABQnBJm+fdACqVFHAAosA5Mwlja6ToyKRIsenKTsZKwCvR5s6kBODDg9XMWBBQvIKTD0EbpG85ss8ye2D8IlYBOBi0tEFtBewWeB4BHiJ4nohYQDyBQJmceTizjkUzwRyg92GNGIS5UtBEbzLgB8pBoVo92MD5Qwi4E3ySwDYO1hNCMxD3YW0RHMeKBpdat2iuAY9vvBQwAfGkj2cYGrwh2EMkGu6VYfMEIAxMvyt4R5Eu2rxptQ6cPvZrIbYEVGigJXtlA5wunOCEKAGNqrTz0Peu0juUk0iwCyqctLfZFCkIG5E4Ul8h7iXF7+LBADSNnmg6X8bENUijQFtNhClgPhGnZFwRNGQCiU5iK4CIk8qMajdZUtN3yigmSI4ooZGWjXTlA-hLF7tYsEHaQgFKhKwzcEU+jLDyUCEJfyPirulsC4hemOqKs51aHUkVg3th5yQc-8kGYGpeMtpEfJTduhR0FZPObB1wCnPkodID8imBQoGElhKxgn8LdwDWgaLAF7snJtmLlIaFH3Q9qmqVBH9oVLGpLL0m7A2rG+4JBeCgmsFIwFT4TYgPHYqwJYASq6NdNsioAqyRoJqg+eZ7KhGq6g8gA4MaWq58U2RhnSAKsUmBCBeDeWlwZQLcK3mBFfshAR+A5bmRA0AqYABS7pqUGgoWA0YBMIQA0EC0DmcfDj2ZuojqNSagISyK2gF0i-u0BiQTzo0zTEIxY+TAEgqYARx0bpFWJceEXCRqPGs4P9iQRInNtBdUzYChmpglpFBlpEsGTYAIZPmZto5gC8mMHDAr7DHSTUM4Mth80GyH8ywI1yoNSEAFpSpa5gO1nQCigZ2N5qZ6acmniVR9pBBHRUCgp4if59Mq6aER9jNRTiFlBX8I0F74soLJOjBcrCpgV2LDyASjeJCKYMnntqGm8G0jUm+0isBAB6ltCjSkLWq6BsGWhkpEIBd0b8h4APItECxl2OsYPNrtI8lBYrgxnJQ4oVgEBt6HT4uYIhhAoS0Ihg6IsECugEsoxAoC4mCAdMih5ipptiJgFSJTAZQ7TBACsxQKQWCAe3SLBAnqU8P5CPsnwq4j6sn9Pgr5g2uVkg-R3UB3DUSYIRij0x-6HMzGkiCDeDSy3WMZZV2OaugrviN8BeC7APYCWFw2jsK2mlQQ6BzxHIKBfL4eAFQPRht0+ssxjKkh9Oelp2-ILDyFlHiBEU4JZALOCH88qX5DwQoMT8hGU0yR2whUZAI4JnKgeH+C358tPWwVAyNoTkcqXAi2BS0EAOyES0qBU+YQApfHnJSY-IFrx2IDYIBSOENkUtiMYNzqhQzEv2bFjqi6otGYeAEiiDlxIhUAyxdgE4OqHQ+vFvoRhkKNBQJiB2YgKzaIciWgwN265K7xPya0l3HwsF-HNRbwnQJZCJINVuiR7MFxNRCwMDELBnW4oMIznfJi4MQBIR1OixkcmzGZrDNw5sa9R++qaDbFcig1FKzAQ9Ct4QTg++C7pu6BYEgjxgvvOsgxGlGDIWRobhQfK1wRCDTDQEBgo+gzJJkfNotA6iT9Ge8rNHTkRIYEMgj+InJO-zFgchJ4Y3VoyPTJpy6RPTK6i4CN7KM5cyHHZPyy4HxoFInnrUrPwUJGRAx8QtiwCqMq4DLzBQU+ImA8Q2qAax3UIVnJxx2Q6BFA7YugH4Ai0UYkWDeVdqo3icwHYAVUqaQKmwWMMX-n3ZBwJpKpAOaTSJlBBS0NaoQkiZcOcRm6nBqDBZkWxIrxasSTGdR1or0ANrhIrahSRbQHABATHiegkPY18IqOvCvUkOZpFp2mpERbGkiSIejFItPhVwAKeYLkjcEpUJKb7q1IhwCtqo4CiVHY34KKAAOr1pDmrQkIlsBvOXHi+Zy2MCNRTyVfodx59gCGIpx6WhsAAwioluoexR63EvwwBKypFKQlklcGZA8Q3zorDnqYENAzoiKYL2D+uAKPbg+0zkDxAbSdVBLCbogFlDDTMO1BQ5vgv0NxAqUWVN+l4sEwgXjewJkKAQRQ4hLwkLskpmsiokBlig7cQWEuWIUovHmHziu-LE1DrFQSqgpOUd3E2A8SFvHYAVculJEJ3wwuAboqIZPq6j2cnAH6lZExZa4DapzEMD5860taHidAFRckWjWoLPHb3cgTEy6Lio7BbBZ19MA84pURzCDR9B7AKKBYO5DOci1y68CNhjYieun6juGEMKpRM-2F4L9pO1LfI4Sy4K2gLoegkIRk5l6JmzD1olKhItwpAtGwfKqYF7jd8fgp-BfZdaOXBQwaqN0ov1IgNuHWBcgMVjPxCauWpUgqYCnIxw0souBss4UlzRvegEktg8wPmTMS6WXYFCyTORLgxr-+ZbktCMgsYCVz+SPpUcS2InKcbKoY0gHykwAMPNJzykpUNckMxUCBVVl8EbOwwwMIpNqXx4FYCixtGUMryDdst4anLQMFyEfrKkyyDVbYACNNuQJswDfJiIiZetSjCckwIAo60bUITz+YSFIOjIy+NMbzXVz5iwX+1a1aVV-gZnCaDlwlkNfTB5TDFWwH0W0AEAEs39JhXmi-UJiqaoKVSzgQwMiYGzMwn+DUXdQoWHCLPybsOnXpmY7LkHX2ERSUh5cnRYFpww8YDD6W0ifOFwEso8KMiMwi9mMHryZhZFg7WpOGwBLgWoteGQljRcKCmAcsQmFEQiCMWDGMF4DBkFgnaLSkEanPCbhDmcNZrQfULWOCp1gVrhpzcQ4IXACDUyur+izowoBhaFVk-G7x6iObL+hYYE2XKgBIGmJ0DkUcALjAJYTUJ9iERRAU0gA0hVDqnRc0dIcKqGDdlW6j0+hsni64oUdtiU2FYCkj-yWiFlWO0wsH0TA+TUEpwMtG0CzBgMnUjR4OI9Hl3RjZJjl4KxQUsOEgYgyUB5Bg4dZbSGTWG3II5ElMMAlj9oqYD8L-IF8I4JEiyEHWpNKSBNgDIQ3CteKt5uSDP4WgIdlDD0xcBU+SLImeAqzOinQAaXvs5qJsp1sKWDDaqVivKBo9QwBT5mGQQLd7ArAI+iI5dEP8HYkzCXHgSicA0VSvySkotmJoz13EP-Ch1xpDrSmef8PYnfUELBdywQVvPWx4yZ6YYUZqfHHdQQWxWHdQ1FkzQH65IMRnBUNgatPQrbEzJaMS-QtZAoAZkbdBIyx6sYK5hIaYmsqgFpQLVZiiOAQr82EQf4LdwA4MSCrSJw6WSPGzYyKUAQixyohTDKsUAAhEhR25CMmxItkAE7bGFOl2Bb8WCb3E6uj+l6zZMKWb62fwzfIkh0AFmf6Rpk8Oj1BBcPmTDq7g55roYHKpeAGEJhQ9dAwkxycHWgw8UisPb8ATOfN7DArOWIzBoRCHQGr0C7FtBaaXrOdDjUq+lDitIXAuWU5gCgMPpuQjqJFSEsmUFwxBwAUbsAQsMFEsw6IHUbBAJJjsBEhvgpUD2B-uE-O5DeO-bOmGBp5sHgb4JwCFuiokfsP5REBPYCeAcA0ZqbyjghaBgkR15VEOa-REDMi7xgm0ChDd0FMBpLcQ54MKCbctiZPCwQIitADOAy4HhABNDYACWgwFrDWAZkieAGHXQcfJzjUBNnRhAKCWVK2rpgjYMCKpIs4GBBO8FkhJgRVRMOmAbc2iAmjgK+mSNCwWe+Ic6-B+CsVKf0l6JmlBw3UOeCigHyI9D2a6LZiSCO-4g6S1Ou7k3Td0vQMFAQqWVXY0rA56t1Cqufsq2lN032E4aBFNcOKjqIVpOeH0xUscDCjlrHn1Xxd8pH-SbBzyFsBRNVVWOhZcEjFKTrF+ZAuTqpq2L7E2aFQDjnYAAQjlTDVoWr2ysMvpErANgs9FoUTiVZqgB38YhNQQ5iuDk8osopmNZCUBlMFPDZE8ibkTYKpaadochGfP+UjqKVlZBaJ0LLqyHOoMAUTaSCZSEimt1LXGz0yN7oRHotVboJQzg5qFRzp0YEOdC-Q10r3C7USVFqTpyZkCsDBQp2CryQqYLObFkAqiQbFCQKWBzzYAqRijTaoHsKDi0WcrP1hkxaalSDAUhcflDkUZWl8qDJgbZYzFYMsDSlSckLQbFsAp+lLAc8MIBABp4sRIVBlh4ujkysB9hZMCdY7KsU2U+GEEWowA9xWAwhJSnHeQ5MUdAtCUkTuS3hkAHYDWDaUbxEOFlw0YO0hbA9bVwKNtLrPWzJxAQg9hsA+CO8VEQ8YDAgQhCypk4HZXYN7UdQ3XYHHzN+YF6TaIsJINg+Mt8E+SPGEEE3ZBUnXT2AcQ9RFDJ3kkwJzglk3fLUq5yUUB2AaCFQIpDZgLYn5yy4PxK37YAoAraEXQtcTLGC4mohAap8dAInhSizaG7zIo0PsWUDQ54f4Rp4b1MLi-EUML1gqNbluAIBOB-F8qotilgoAQdKpF2DQdRbHIWkdCOJZDU6kDDWjEE0LL0BE0VPdRAHxR8WYlvaKAufHMwm3UQYJUO3QRxNi6sDe4WKtRRYyh4datcl5Y4uSpl0APYG-ATcehF3LGVG3AUhsMVoQoD8KaMGjBLk9OH5Y75RBp2Saw36Y+wfgpUArA6FDnj8nFghEPwB-RZcGtjgcMsE5BFY0XNWBIoavC8LftMCHYhIGUyPVi2m9dRRAoC0YHSIE8QPp1yQ8TdmQxUu-OBFQiYzvpFQSQAKDdVgITlA6liMEhPaSUu4rgoyTOXrL2xoQdJa4zGySpFcyxdc3ZxQhIQ4rlQgZhsVrDbp1GgpmrFSvYGjjIrJF6RewoUNGayVFAOrgRk3gqlDFIT1DGlBqzijLLncg6IdAAQpjEPZiot8G-CvUkmI9k7srGSbhe50NEjU0Y1pIDCvYTyEOXYQARfRKjEwORuiVw0wLnJeFELKgAYQremBDqdsDUCURBCnGMFMN7COUzSy30LihR0XCBLzXwdEOmx8okwDtUi+Psfnwqkw7BOCPqkCHDmxgxbVFqAYZbYoNSQZMC42uF25JaR9AkUK2gaEn6jV6tqatjV2hUaPJmR1Rp6MCLyU0RLpIKAPHb5AcAf-F-5+Qs8Kow0pIFPLAbqGZNaE-IjAS5jZZI3JQKfYeMGmjPh-ko+o3xFCecoSEqTXTDzwGAkime8Z7WilcOGKaNAxEgOQfiu+PZLX4JkNKMuBkpiYBSky9TYm-wrDeLLYZ6EmwYkiJIuqJqmjEgBUnwp8u0G6SOqjIKzBkRbcD3VUUbuCOpsMTOVwLW9WwFJKs24hMEQA6jYLSPFYJxErDCg-WsMD0yFYNZjw62NMrkVGq1X1S-QjTDISL9-DJFUCGehG9ROQgFMnz+IbfGbD50LKGFCD1AkZrQbuCQGmjeaZANlr2YNBADQOeSEF1TrccAFB4ywXuHv1RU20aJbgDaujCRHerObggcACOA2B44ibE1ArQ3FFDQUWAfllicjQjFoz9cflu7ShaUehQK8UTQgnofILnf+izgEsLfaadKoHjVWOAuFmxLQL0G9AzYeAlrwv4ptFSMT0EVTpx74qbudYDoT1PaycAPMJ5DVg6aOJg+MKKDQDSydULmBwI35J2C+tUyDTwb9QPuV3jah9CLCtqq6mAOCoBAizgw8SnJAj5KzXa122N9jaQIAKOBDazOIwwP2hvgQYlliQEuQb-FV29Eh0wrco5DZRvF9qJHKlJ82vGAVJBkINI72krKrmqiu1M3wvdpUBuU9qL5oTBDxf0ABBPOPdgjRG9ZOUQiWJfuRFyW4NQj4QVUE1dYztASaB844EO1mpqdgEsHY1cZvMBUCC58OJmzEcsxUkp0GLhQARzGbmB7HDVBYIFqD0vFlVTR5v8m5E0wxfhC6MgW8M9XoVe6phXWx0RFOA6YdAqZ704wmlfSQog0AnG1JtmVVw1IYbBXWxJQCLnTbpS0E9EMcpedBY3uERbO4a4l2MigWRGEGQ6EQHzlRwtg8ODKnYAKCDGh8cTro0zdWk1nQhBNZPDOR3QJOIV05qF8APB-cxk7tBQCBlgIAF4cxtOZiW9iNfSesrI7SriNcSsgTnDKdG2BElCCJsK39iCYxoxwWoC8Ircl1KsOJgu9LjIbDHronTbDdFQDidt1KOCGsFVWQYG5IhEoFrYkDYOloYSRI5Kh9Y79VdQ1gJynQAiwRtaJN680gCxKQoC7BbR5YpUGYyAy6HFfDWkvnVRQuK8TisROYVOb1nNcNcRaaTAMQttCZOrdZR3hw1kOcR-SaaNFkKE0tIQCiJzgZZrpML6X0IDdW8m5gH8cxuqgL+qpj3gE+N7Tj7ZElEw3wH0uhqLJmgEpidXTAjYHoDaEWHcQC6x6BqGkvgZpmPFuWpQOdE08D8b1C9UwuXRiWaIAxEEGQn6OypkxPfGwwgtUAiKjzgX1N8l8lDYG2Dy8x8IN20UoneJ0X1UnXQBsALvv-Tn56wLo65gGUE-wvt6YNiL+8d6j3ZWAWBekOu5L4Gkzxg+KvDU6IaFMJo9qDyI8q1y5WGoIS050OAPUQkuMMK9A-bYwHpQLcuBCNkJNSZl4R4sPyhw1U8G3z-diiXLTVjqhAoWLen1BD1QY5DLqymDVIr-H0Y-ZFjjdoXAo3oIx8lW4UMV1gMN6kCDdHkSgw6PgdnywbWJ24xCBurTEzhnBqdwxpOPrGWrmUCSLSs5d2KwMTgegN9h3VlxYch+wIYSsSJah-auqPFFxGQOMjeYBQjM+8DBUimA2lGSmtIXtUAy6eaBA-SadnMbQ3uEYgEvV9CpA+9y9kHXIPS0C25ILTTGqUNi2mCqfgPbYobXjDDyOaMPkaEQeUHaR8gFMGPSAyryB4A1qWKO2QQALHHTCJIzxt2nBzBRGy36pFgKTweurHmlxBCsFjcjWR9iBzyTAGrjhwXcSuIQB6AAA0TNI5a-NZDL+wxDDBmgyWBiQUJFEOAYwiBllICjRMDFWT3jiMD3aZOUABZaUAYZKEZfSarORgbgqVAmFwAfsAqhcm5IuCMop57dCOYpBfNzKHs25A2AIwNWDUjIom4MIIzKfgJJXSVITnJWbCfgEqiAIi-WdTyw6qDpzLVr8UyhRSU5nwEuMqBdxDLglGGQR6EfHKQMWAn5gIbs9F0KwoBAMqe4RWAiYEJIRQm8G5Uu+nlS3W06Naq863ez6it4VwkHBIizZgCiNJcEBGgKB9UWDqZz16rSHBTWQMAC9lHY-eF+2YIv0OX5VTVXYvxPkvzCG5fZU4EhGtiFgLh3dKZcMXAo0T0eOAlQUUGt21VYkxOCty2c0-LMN9AYwGuMeqYcIlgbqB3BaErxbNDkohyKOn2xfQYkxkwgyLFNVuEmAzEZkhcDtpPQ6HAsg3YXtqFoRcaDtloIjRJbpQMYNagWAfTuYOqIEcE4lvOPKvcbUhy0U5TShRwUSPvZiaDiA6Q9zuYuIRiF0Zt+XioIBFSBNIOmMqR-Mk+djVuWLIv9JkAOyJTQxQbYD3yUYpti+C3C5ktRw7UN3PMDpaKNTSJ8QJ6XQAdM7SIRot8VgHQE9geRMuKtIXgi7Ew+dfb0TYAAxKnngQzHsaRkWb4URBUgg7KqbL0JcJ-geuCrFPpJx+nCRCw2H3kvPoirqdGB3lutPziSobmPqSGk4pCXBsEnebK1oV9ANtE7lUUI9jkAXwA9TCcFcDuwNIdBQU0dSnmj3aYS6Efuq0eYUFvzaW5VuYzeCZHbkS6ayia2r50crOCHkqAzHQD04dOM2Do0jSMKD3OVcBiT4cO5ajjRgQdWW204QI1-5sk1kNpSawh9JYTZIW0OOIv2-RDWrZoX0N7C2wpkxXP5QD4iLiD01mS138jSTMEThE-M72TOTqA4BBdk-+KwphY-C9LJBkn5jvh7lBjTERA+KEn2gucrNpzgzEHAMdWrEPhFg4eokw3PXHQEsNZDFgGiKfCkFe9Iuo+Mw4jRb+YZhJTqqc-gqxiakO027gqj1CJQyHOT5kcP+OmBKcPSA5w4pAC4aadHwlmbU5-V5CP9WeAiwmUJqvarSlK2wPi3EPnSQ8niHnIqYDpghkFxvCb1LmSEBKox7U30AtiEQL4rUXFgeiO5Iqh0VG4z6kRRJD3-YoMR8RF0FRR96FikDJ0CmABYDPQ1qWwDUJA+tLcHH7sv2JlD-Y5JrvL0AmlRYAcERMmpDaOlyy4jUQVgJ0zCN24FdSF4IqNUFSNh+D2pft8jSKMbUPiiUUQENUDdyHxvaVwRHiwfewAQRUqJFA2iW-GpK5YJOC8p6iuVMMJSFvQJ-AxGdUwjiJIiTGiZsmJJO9BwEvDHtBR0ZoHACPizWFABvyOnJaMOO-VfXAvKIyHdgY0oGrDZvsMcsKC7O384nC0x0+BwDFgU2LZA3WyUHmUZQqzNQW5Ts7gYBnoLngJBb8FiLrBeClsvuo-r7g7DkZwWXL7z9o85EJJLIF8GoVQhnCllQu+KmP-QI6q-qJNp+ohJ54fQYQrp7ga0wGC3W4CMfTWLg11UAg7WqniOMh4a0H+AwU4a0CgfKTahEy5i6fEd616HUqTguI4xnIRKcGFq9iLhaRLiGpyhiNQLUI-+PWCUuiSP1D+QQrFepmgyCthpAolGJQArcK9OhB8r93JQInqXhWx6bcebnBlt+R-CKTOaRCIkJTYl6AtMUQ8sNxBJ+yolHoewcrHyl7QWa23gCQhAOKJe21aH4LwAgWivx9wE4Ivyz48PqLgikQ7rIRltsuB0hOjw7MF30SoXbJZe4xUlOZeCwwJIGDjZTJi1gQYyZMIkagyN9JGoRKGIzI5nSDfjfY4SNRDgILiRpjmMpwiKTu84Ib8yOyxIgdizQCgNjA+lY0NFSl8+fEuxG8PfI943JR6xtS8Ip61NCI18wMkMGAblsDVhch+LrhuISpCnQ-NfzQ1ii0C8tERf+eujfFNiazbUbxabCxsL-4y4JfLFgFYAAi1QLeR2BcEvSxg4VADav6SUsIjnLRUu7OtNAbuByumypwWfl8w0A9mC+PRcWvGUxJZ7pAhVe4+7BzxwIeix5XdBhi-5h8gbBY1zLotZgJL86aOE1DpgzkEOJgVp4FChsFmVbwWTEgVHszTk2YApvGEPZqkjakZ+B-UdT39WExLr3sKuvWARBMizCg1Ceaq1Q0WP+jk0seLUw0ACaQnOkC5rUnEmZGtA4gOC26J9mjW1fk-JRQ4IlyvQsgtJjrbI+SBCo10zGS+GojUTHUoVxH7f3HftQ8afX-UVrNZAsZHlSjS0QSaOKqqmXrfSSDLHCX4ivrdFb6Qsj2aofErstMFG2FgbzhOSwWbmLO7Sc9kCZnY6U8CGhbLdYGQCMwN6GZBqQpbGwxtI8odpQnww4GUYXLVy36oxQOeFwQxJ8EMb5mmUXXlD0y7PQ6s+KWSHjj14YnRaO6tt-UKwlBdFfHpS0VDeBVlE8aZnpCQeuPYlPZSBAKqrYWaR-yud9UEBr4+0LMrHWZ05rATrEI0Ncg0opnCCZEu5YA73AiOLaAS-EJA4lRNChdt9Kcw0swQxHwZhHdgCbL0C6KxwjCtLAYSiJCFHIeTlGagnq5+h1DQyizouAkACOPTK7M32NfS0U8iLmVpQYEsthNK-mFthpSXYOnS8Dl5OHDiuttKehAYKBSQYrs2hHJvRVZsEOmH0006BqXOUMswQ7t7y5tDGRrrdoQGWndKND9cT0pXDaSGmLhTG05QgXzejGpbhLOaLEvGD1NvaMtwWk9sGOi7A-KCnyxuW2CEt8H0BXysqZW7iLCzgOroIQf0jMIvyoAfgOgkVg2aL8FQyqk9YDRoa-YJoHiRE6xhhIKkqmArAemNdWXL7REkjTZd1G4yLhmksg3iYCeh3VJZ5Ul4t+AHAHA5PZ-kk6qIIMorqJ-EYjtYx2A5sh0xGulFKsuR8a8OWyAeKaJEc-s3PlUSiwPO-3gp4e++AL-YGrkmjXrA7EOxSq4-aOtys25HYSti-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-MxYpshVjuZn-zzYJwsGkLFZevsVuJvLMQoPUB8TTgjqPdsCQ2iIGkCgDzhpjDVEVceI2QXtYSdcxYUK2lQAGiM6ZNwnSzLJiQQ84NjIPU9ibJgQl7UTRwLhBGDiajVPcEyAE3PtCyYSCHMDOM5oMzWjgzFgFsCnE4xbnTOHzQGaipQ+6R2Czo1CCnDO5yUAFXAIDaBFW6sPYDsApBlsoNz1sozKFhyQVGNpYbUjZJ4uQi5xCkctESPs+T4+lt70am89CGOkqK9cFM-sh2CLQfp6CaYwcVczB8aR41bBOZlYENavVAXCbd0-4kxiCBUZeCOVHWF04GizHzqe6UH87BwTvDPiHoM8Nx7Gk3Q488STh+5r0ZVPzSBMu+gbqDA5epPbNDu+55f1xUsNaHlLp0ZRQYFEumKhtJkumtJbS1wGG9lxpEsXvRITNGpWo7TQ2AMEspdtIr+make2BqWe8osjmqg3fduYaDYedN7B1gNaMRy8s19NRaD424CMibnP6XgP-psiF2BR62aEecnnCZJKYutexjZAwkCAZOxfQmpAQjFo1dJuQVozdy9UIbs9KrAokWjLcd1g4CjxiEqCUjSjgYKC+ISfb322+66i3XQDuHsiRg1BUgWedxnngC6D2BSxJtWYS-o1yWBDp0zooiMCQCgOxnKsnvHeqTOCvGK28FkOUs9K4YUC92XODpJvCDU5HVNIVIaSPNr4mDuhxn-YITQzCBsYSc7S00E4iqTgGMDUUIqw-ENci-azVAno7UPj2xXXr-j4YavWo0CJXGTvq5Jz5DojgWohiNuUNe-a-eGsnrdK+Duw6JfVE4bmGsbepUJtWlUTKjkFiBYx16MB3FCDoF5VwJTShzOxdybpUFmW+HtlTWj2VgBDCB0wryG4w5qXrJdQeVI8Pn4fyp3GiIhEhzrNAqQE7GnSYw4pBdCUAWXLxccE7gkfwGw12QjgFQMuOCZEQGkwxhMohAJIURk75qYigw+3PoQmEqeailvkeAvgy9xJ0zHKblQUAYV68HGY9A0AksMy81wqMNngUk0W7dsOcOGvwxQAIBMAeTwJ8LnoJkmBMILTCDSKdz1pOtFUnBJtSQjjdCFrIAT0f3aZo3lbeWTFttUTuTa9ysbAJMxl3mEAEVAQuULQ+7Me-dIj3OqoNjTUQc1MKAE2p9E7cu5-8S+BuFXUW5bdBfeaCqtu80PVKzogDfLxHeWotS1UkeQ5zAWQFSJ0hCw84ADpowUEXFrAFKDpSYV1CrJ3MTYK-MJ4zYvxppO0dgM+hyj0pWGi+KcsjHvMJsNdNVETi9nMKCtovsGR-y0FH1JXU87hIRAKcyX8JCUivy70Cn0Y+4NAcJax5wR-MY9uBTgUWIW4Rvo0gALDb8hzAZC+8pzOcHLqd3FS00t5jFRXHwNUJK2Jg+9qOauAzrH+7Tg-kBs5CAkJiPf1EdFS23bQlo6eA8Oy7KP71v1hrJRuIiHz6TtYZuifOhz8tLvKro5Inz2y6NJbNBkzY0uULc+HiOmB0A1IgLajM2UDvbfJTPY4wOJqPkupc4oITAgwN4dOStxo+HNeSOWzkDSL+8LbGZP707QPVwv8c1FzMoC84Kt38gG6ivhRtzVBGMGETHxFx5Z5DJSyNgcgDa+HsKwFARNgn3yQSBUJMTmz9WM3otzUcASCbtdYiU+5TbEy3CAT3Js+GhSTOe6bZ431neyerxaCFnmhCQRnAB-jGjCM5Dyp3PkQGm8urBxFcRaMCvTHkq-pcJ5QApftS4wCDLbASCWxBcyw25YvwWzQW-KkRVvUPRJC2IpaysAtOgyWFA0w9sGwTlquizDy3wqMO89uwdFpgg-R68A0huqikFm0NgbAM8YhY9XM+fYAhAFEjPaihEwaGX46x0JfZy0pBwaQ-tBSRmwaHdQ8PI3MqVTpgU4LVg9DccHd-Fqm4LOBoYi4pYD05WHczm4d3yfh2vIkdtws2cXyOuZkAh3GEwbJI6LSN7LlWFqLpMo-GE9c8CcBnS1422D5kE+KJNX9bEsCEJAOpsH9iRXqrqeCZAEXKJ8yaYNPwOW+KI6r0YcfsgH4buEeMhxDewIMAjqjno8MtEnil8ILit6kmLSSAQTvA3t6ipsFsAM1JctMniqQ7-ClBJ9MsYi9NA8mhDQAswKSgSYukUJRhOIm9HGdNuFNoX+BOAxNCgxbOvERG0JyUWYNtFa5GfAO+v4h7OrtQ1JMnBXUrlBjDLnI12I+k-YEC4DCG5Y-ZuKQB2HQFnhh1Bw6Gg5e2C7FUMMnZ5FA7Z-ngmRiqj3ojEMioRoP1M9CH5BgREsQawJY4WUD6R7AnUx5Tp0hYIIXNqxjN4qIM2oBuPDs7UDbAPADcgq4CSRESMdxEbgsZBbBAIBLk+QNYmkx-QqYI8apdRAsjwNM2BmBcTg4Iq3GxA35Aa0vmGCB1oDaI5OFvl6JIQAT6K6kviFYVXiJnNtLHEIdxmthU8p0A4HG5ZdiFrAieNxATbCVhfZGZx1gNkIMUBwAhqLNAn7MtgveI2gZcJAhXnGrpOcKDIl5n2Nb8nedXMN7hw9AegG6loUBmFQ9L2OL5BAEfpZACVxrKs64nfokYmUAzMIADvgOeBMpROokxOkCXQZ6JtwbsFqRVRAR5SEAIhoQMfobaguBvmFgkBcHCUcqBGYewNCxwylBhIbB7sY4LdwjvvbcuplFQxaES5ZKGyYpaH1Rw9K3BstGhVCOND5HjMBR+GJFAGMJyMNagzBRsNyRfFH4RyntzBj7h7x0wJ149CAChggfKhyrIexJqO7RssNqQLOG098wJZpHUJ6pv7i3BSBmkQK5mzMpyhrpWGDN5LoBGwYiFWghhng9UImpgXcgsgHuE2RTVL2hvOJyQKSOBpzZImBj8NZRUwO4JlXNRpQkEjUjVJ0IKwJ+hGpBBBrEJ4gz+EPxbKmCooInFU4wBCCEDPHp88N71fel9R1vlBEL2Hv1nyAjoy2l3RU7OFB4kg15AYqfMR9EW46PHBMrCvqMG4C2IE4o9BpiBWAtRFR50PqAQl-HjYMxvBlq8JUh3tG5gUzLkC-YPpJ5UjNQShOvAbdpXAjaAkCMIANctYLfBJTL3kacii0lsDMJUilVkUCIWBUTvUlIIt2gh+EpxUiF7xURPjcMII6pZKmah9TsMBIeI4cJXIBs0GNuF0JsyDxdDSIKhNSxqIMd1U6Gsgb9gARpABOARbDYsY+CtwYEG11zoL3kzIIU4EpurY9DFrgdIltBfCHQF9aAjNFjrRAiRB8RTALpQKeKDBTJtGc+DDboOQFRgIzCTh0kBxV5LE7hE0N8lcEPDhNyKR0GFGRAhzDT4YjAYJ9cgWVsoA9pcYDABVir3cVMoc0NMBYAUGCZlJFmrxVbglxD-MECNfLBgp8O4g9EAYg-cjdgFAnMhEMnRZHCFgltCHP99gfzMgXq5hfsH6IlevwpOCGipeMM6wYMBFJXAFFIyaBJIu+JxA+ZLeM7qInhuCKgATNFm0qKBhAhypUI5oCgQW4PMRTUEFxhoNMhN4JlZwYFeBPEPUpU5GyYuAKYAvshpIgUGsCieDSUU0INQiEg7ofLGjNlYFWBhgIG4kzk3pFTFFkgQajBzPsmUmSM5dTgFihe0PygAKPQJcKgBpeNLlRBqJSx9WO-Q-wPaIezNZp+GCyhE9CwgKwIsgOAFkFWkDkFEBgCMdsLTFARmwRREt5x+lC0wYGqBDTaPJY61JSwIAMbATIjBCYyESRY8CbhhAQ0wLaDCQsQjIUPqLXhsKEntq+N0R5sDWhcutghjSB2Ui4lrxl0PxYytPbQ+ntZ0-VKKAU0NUJ-sG5h7wWFAxRsKgN6C6DjSGggaihSQHOK9QOWGmBEemQ4KQdA4dsDSDU5NmURSLSk2rOo4LOrGDu6B-hdqIBgPFhQcJ4A6RjRF0QKgMRRksvMUVUM+YDKBpCMntpChofIhkUs5ATcIahgwPhQnVNzJ0prehxiA6c5OMbBkUJrp2lETBc6MzRj-JMJ4Yi04xCG9hzPvwh7GEN9Y2t8Rx0ObBgGLeMa1DnArOOrUhwnFAj9L7xATLpxVSOmBSoOEhMRLVBiRL3Fb3qi0tCr3N5yFNAzbM1hlwBPwZflsQb6m-JKob4dGGJ1Ay4JRDK4FsgegLDxufJNZ+inmxo5PCxsANKpPENclzUNdAWJPmBjwL9NpBvCRQuBdw9Ml1lqxAUhl6F8hHsAOpe7qHhdnIPRESDhAnkBV8oIkk9aGi2IIirR9wBE1dsAJEJ6IFXpuRONppkL1x0kLlhPjGu5ZoP2hGyH9JH5Ff1ljHOA8CBpA9UKVA9Xi3BcofqRxfsOJiAHmcaAM8EBmHjUR4Bw1YtlWYhQVdg-kKUEa1saZIUMuB4GKAxH4OT8uqBxp14FNJPoRu5wtKjhPNP-BZKvfUKIMYghoFzMTMhns3EIMY4lAB8WAOuZ50HOBnSPfxOcJ0BeLulAMSLyVg-GRRC9tIxc5oShetGsAiDsLCgmmDhwlhAACjMh1V8MKF8aBoQZiP3wNmPGVesEUJTbDCRXMplBI4LGhj0IzkLwCJhBTBNlzoIjJhBqOBZoOkswkkiJXADVY4AGCwGABmRSkL0BP+N9AKuAnhusMllvsDXwItquhHWO4lXGN6JyGO3hWGNERUwGoJpKrNBRNj3hkWCQYJ2GpQiLg5pGAmRcboCnIj4M1ROvP4Q7uBnB-Shs0PeGGw8iMrpPECLBHYOFB+oOLBhICFhOcDroKYB3htIHsg2Ibl1KrEXF3+lNBvRPXQYqJJ46wOiQHSMmoThtdJ-4FSRV0CoQAPucRT4JSYrOASxmajl41OkBo5CBuBnYbRAM1HClbmJppk4KQA+TCwA0-iSw4iFRFqWDHxsNEVMmwVZAlSAvkrmJKgCfNz4xQCbB3fG2k5BLPVeoBfcRqkUxBoPSRPytstgDl-43WDmh1qm8D8ID8gxMN-DkFP1MtRD9AKgIyAOwMyCQIYllN6mcdIROUBmqNKJoWEOkO8EAtaGAG5fcgIl2cCTAB4UshTEKCwtwByxasJPooxCPoaUpx4y3HJwb3BrRb+oZ1pzJ7xSoMqw-Jnb5akEBAThqow9RBihSnqrQVMnHFowOEgCkMuBQVLp4SeJ3tRiMEk5xGXgAoGJR-KDAh5kN6oMaD311VqVgMaMZhTSIQQ9hEFBicDABE0EFBJ+FKkZUpiox7gqklUvnx8wLUhy0BihNdP3k3Pk-D36J6o5IAoRbDHPBw9PGhWFLPDqIP1BChNwJ5im2Bl-JFVE4H4iKkAH5HCMHAnDDQgAoDcw2cKdAz-tdJ3aPpg+YLER3jgB8RXNbQZvA2R4YTvYd1jq57im3w7oR9R8oA0C9SEsgQBDaFwBNkIioo3h8xIWIviHiQAhAB8YYPSgRGOIcrKHxwvyEUIwhIpAE7hIEw4PbBLqPtR4aJbhlUNVtOsGYcU6K2oD8A69RinsggGChcvbElwY4WXxtQs6RSXsyCeUDJxNkRqQlOG5hPeGaBp5I98qSAuwSYWc1U1MaBEBh2A7SMXCuwKVAy4U6QEmEeUSoJB9WzCIRqFOWBE6JawQlDsZzwd4d8Bu+AnKMEtx0C+F+ANmtZoBDABrJ2NTGHxJqNFwhzVqnJSeMH5jkHDkP6K2ACdHXMDWBtxqBNJ4A3Khhu+DMRagmJkAPn2l3kA0gwIOqw1bKqAKwOXo0mIGxrGA4oEGLeACwIeMOqPDBPIusgsCCUJhKDtVghHzhPUA54yCNTRhQL4c43gJBlwAjo7YCuJNJJGwlEvMsNfLE5ItKthfSOQpQCL0AO8KWCr3suhw0JGFSBjqF2lBfx8wNGIB4ehxI+qCw13EMDHZHRBylKtU-IIbBNxB5hFotx5ClIhABYXCDiqjZoiSCCxdWPvR-6DngzoC2jEsMipIiNERQZOzpHHEC4+rLicCyPl5yaNdUN6EQR5tLR8VJFURpaKkRP5A14jeAEITJj5o5bGBB+uJRgCwJPVZoGnIwhPmIXWhOxkFCnRqUGZwcDCiRmXvnBWFDjhQ3JmwdIsZhyKBUVghIvCRMBoQ3ARMo6brsBypI3h99LBDjSMZxjzi94RCJCIRHBwASIIK1L+F-Urkh9pEREWjzMs2JClEDEPwETRYbHxN-fGAI7QnHpKwDbgQoPA4UQpgI2cLFIVgIBpOCJDdlvvFoJTrn9vwLGAKKGkwQoGGCL0D6IVuGBJlcMQA0RtkJV0EOVE6DAcTNLBBkFNQkJuAlMyoNLIcDHAAp0HtRZVMg1cxtGZrpNCkFBJdZo0KGDuZH9xR1KQJLMdpVBaNjRAkOdABUL0BpjJIgPvAPDJ4HGg9+rERNsDvApvPMVViLABtYpjB1Qt9RwltSZhwPVAVVD5wRoeKdYIJKdcID5ptELs4GBIXCsQRNw5wQZYaUFARt2ugZ1wn1R4QZlcTjBrpU5GMNWyFmjKEVNAyABBFE0EzwZAhggJ6HIVlxKgiAPvYcKACzACkKNI91B+D0wl+DEMof5AAfZpXcLNwfcgx5+4C-En5Ei4DLNABu6DUgCVAzAZ6GCFPkKhtsxr-gSuJOwWkDq4GvNWAUUSpJmXhCVKdOsBLMU3hP4OqJHLDl5L2JTCqOLliako2AmBD2BGmGYclspFg1MPdRN2KJ1U5EvViqg4IYEQr59iDuwCyJ+ZqRhjQU0K2hFwJX46OoQhcTkVBIctzh94SmgBNFEcncCS9uZIQA88K65t0rXA1UBSI-jDAgd6MDUNUHRZoNrER3bAB8rAPDieoDikULlSYJoE5EinuxhRYI3hFIHvMeeKNBhvATdwVC0wd7FWN9MOEwH4PRI80JdixGAB9rAM8gRoBBARSEm9Y8Pzg9dDYBLRhtIbDkyFXXLRROcY18ZsNRRaIPfxIKG+hlxK9hUMHIIvBC6tJ5gB8n7I3hVGGJAPeIuEHTPmJrBjHBbBuYxmgFih6wPHkFCAJDQYK08oBI6hqBLDotGNYgQ2ANog0BsgDGLkRxSOSIQ1um9YpEXgj+HiN0cdlwd0E-JOgA4I1OHIBMZMYhy7GEJykWTFSoF9AZxP89CCP8g24OwBvEIc4-3BTJeapCB4WG9DR6B9D7PgHs8BJjF9tEthuoAI4W6DUw8ygydb8C0F+nj+gh+PTCcmMIjs0YNA-biViZAl9p0eLPpIEKmJs-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-jA6YJEP48WaQTReSHfA8UiHCEwvL5m-vHlr1pLjKDBixo4n5ZZKv0QGyPMg8SKjhmFuaxbNrHpWqL0sT+EIBvBPbQXRCphQUTABhNI+EiaAMtyRJ0AQ8N6Cv2rUhkUDBlfZE1TwFDgAIsUzlZTEtRqJMDjWSNnhDFCUJQUfgpiOMNV1QhywfkF3AHdFyNHbk7kXcjBlaMIkIZ4G30lOB1BXEvGpPzLtAm7GxAyNJqJzYAVlIsLYloYG7gtGKcQ8sGNAb4n00AKMKAZWAmdEpgshVYYdgcnJQgOyQqMY4FrFckAEoL+OaxzIZZDiyH8QeRorANMJNSIwrlhUIdgppkLTFUiMOMtgOtB+5pQBaJMMjzWGGhhYDohO4OiTQUXBBpGJzgQ5l8B5wCidsoMaSWfm5hG8GFAUIQ7AvLK9Jh2FRAoxDUUTiWkROcM-MNXIFQHUfjSZIQ+AI2KM1sfCKg1HJ9JHsc4BQYMKoC4HOgmqb65NYJj5QFt1gOwloxSsB84o9JSw8uAJVQURnw2GP4I3dGiMkwOt8VuMUgx1g2R7oJTY+qErxwRjrAd7HkFQRDu0ThsqQo4FjowmEHjRcfJBG8OiEJTH0EcDApTuSHrwgNPKtOCDI5swJ6RPmG1AomKGQngj3s9NHoB0oES45BIiwGwSoiueCQRcKtWx10a2lb4FRx2VD+kmnrjRATLDhqOLUhVGLW0fepwJFQb7wpvG0w3oG8ke4BMJ5HgB8GwBShxQC1hUEHWDjoiRoX8JPxiqgBQVQi9BsCBAQvfjmgiRALE-jD9Ji3v-jBKQU8nGflx6pMxiD2KlAjmJpQV0D3YyLjUEUGZJ888OP5E8cMA-IADh4AKHAqmtuTjurcUF5BVA61Dj5OiaCiGwOeJqxCPorsLIAwWJdB7yPKkZ8HtZV+DKx3btMIQkO+Ti2FDxYutGicmLUgQ5m5BdoI8yboaKlqllBSUgrFS4KQFA44fyMWwauh1CLMtwsHBc60BoMxHnX1tCPbQgGJco1RM6JhxK5iBIDZxYnCxIhIP9wKYGGwL2DAA2Io7lncvJRreIwTUVE+AidskD+qGSgaAHIZVTCg4DIOUBVQFsAH5gB8TcGpAf+LswLOGEJT8JyN8ESCS8OH5AI0CuBXGGPZ2euUxx6YBStiJbQxis6Ym7Gdh6CC3SQyMikuYJNQGmDZSOoS3Bb+pQh0oW3xpAe1hq0ngtswjWhMybZ11DmcgtIGBE6AEEJt1LNBEhCKMyEETsyYEQxjpM3936AukCwCNAxoNlC-8R7jkoJghstFyg8WYhcTiFVR58En5myOPoZcNHA-ouyTcSHuploIqxfmPpgk-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-kD8CagkAh9VCjRm-iqQ5kVzQqcozAaYAs9+LP6DaKND5pVKNAbOOwzvki-x6NicTdoMkxn5soRmkGJgZkPaQoaIvtMYoGo-4DhAN4nWpDYmIxPZMsU+AkplQIBXhyhpz0Vkq0TpMaIRqxD9RbTmcJ4uZTBvFgiJ-nuMhOgGegcIEyhoGDMpk5hFUzQHuC4qgChj9vbAgNLzAPGMxBy-CxIY4L4x-2jHgxYEMCdEDkwWFDdNGxJDjh9K4AhOB8QWkK7J6uOqw65jFBwmRbQdsIMl3MDMIwWICQnMFal0oHg85RgF4UHHjgDqXYBoJmKJ+ZklwpHtjQr6MqwqHHHZDuPQQQMjQ1QoFxNfZHIQk+LVByOoD1hgBzIPAGcRdoOawgXJFgXUqsyVUuHhgoJIgjgRKZMwHzRaIOxkOCDkcqICMgtEItAdOD6pUFACYS3mgQY4Ntk9+a3TMuOAKnDlFgbODHB+6e2wuKT9ygikchXXBtyx2DKi1ON89piFoKqmBupt2u-Im3tORIccIDV+DHB60AURpwBmEKqDnBM5nY1OPMZY+tAMg0GK9QSkMFlUYHnhEPAExvWG7yKuIwKNkOAKxcZiIViovgZhNEwwIL-JlfB-SioNXwCWLRAYrqhJKsR3AcBXmNvyjegM8CGR2lJitW4NkxIbrhzpYCepW+a3T4AOgYBjH1RmWcDAbkjBRduPTF8uM+pczrxTiOIYIvMgdlmkHKwMgAncA2StjKqNShWkBxlq2Hup2bpgh+8pldxqFOZa5FuFRTpY5ESDBAuGJykl+MDNRYJpp1IBNzU5B1QaUKIR1RVDJSQhNIiYJYInxOIQA-L4xMuJGwg4K0S2Vh0TYdOzh1uEYphxeFgoekShkUJpAQhT8RlEudVwcKzkFONMp96W0gJ+KslYEYTkNmmNk5bOOtWGOuY9lt4yzYZPBUJLNltCGzgShfjNa4eULYPpxFCAOwNsWDQFmiPbzzglAIP4gsgssJAzOgBZDLSdQQQiPVxj9oUpsrNFQYMoDNHWST8IUJFQS0c+piwAIZV+Pot96C3Vq-u+JI5LZgN2EDSgIn9AqhK7paRG4B6uPzh+lG6h58M1lWEEgJ-qKDBx3MfMihLqljpMDly2PbEfoEURwqaa4KYCTFrLL8LHiKtUPZqgdK6v4JiwFgdwBNggPwBKSxodKTNHAW4dHOILw0g+JLCDOBSaaDxzwC7EB7OdNWcc1gcuZARasHqTUYAaTLmYvxO4MptaHhNBBADYAlRVZAMJBHhFVA8hufMY1ElgeRAihEydsODFKAh5AaAiw0M9iaI-YfJgKgN7AuPMQyh+jyDchfnBfeDxJTeJRg3UNyF-EODEZhOHRwVCST1zHWc4YPFo-CJ15F2IJCNMVAIskBsEfLGqhegF-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-4NgoBAAJtJgNlB-BG4wHwWTLxRO0xG4IuIzmDtgF4I8hMwFp13KArBKqE+hVKevBZwPgo+oK0gMSF+AafLfBM2IwhReCOgwYgRyoxD0gk9uYQvvJVZx9ZPrwBcQgxir8QtCLxA1BJlwXwl3xHYVoRICIXSZDkRl8ost0P4Mkxo2GhQp4N1BHLCwgOAA+I+gCxlb4N+1ofD9Rjjk0gLwExz5oQJBP4GQ4h+P-ACUDDx7wQOg-WXHZFLJ546MJSgxrLh0NUKLIPFR-RuRr1FWiai0d7Avl98H3Q3omuxyqMmJREgI5IDo9sF6TJA2GALMrRcMIhzJ2BMCP14xcIewsCCOsTholMs2aQAsDMaY9yO9BbEOOhXGCsgxHFoRvahup7gp15uKS5JhlI2tQUQghWkCZlURIdxYEDuAvalxBXrJ4E7yMEIgUHwAQNm2BFyXvM-wOUwyNI9hi-OkhesopZy2AoUZ4O4x4pO-hnKPmQ98DUIadFSAZ4GPR4-gNczILF1EYIOx-4FtgUwNMJaov7wtPMBAkIS1h8bhkiw2K50NtecFOYNrkAKBSRE0BShs5NHRXiju1a8E8bQEJG4iOTP4+kjWonpNZBh-s5jrYA2A+0nMRE4KqBugAkxYiBWAvcHeRTkF+IF0lAh2AEfjXDVqwDuMH4aUpIsL4DsjXPtkJO4JS1uoG1R8uGbBOcCCobAL2LtsByhkCWgN8Kgux6wtJAhhjBRfXEvdN4nsByYFgwC5SjtTuGWBLqHnR6yTx0uoPpwx0PAxwIAZg4SK0gY0jKwYmPhUquVlwU0N3QpMF1knuNSIN4sNBZFi2IZwv9BfNd4QquUNBJ4C0wFCqEqW8DCRtXAJkG9C04NMcTQU9Sagt5LQEWZaEhYMfuQzkGcJbmTl5U0KhFLSMHBO4KokdZndiACIIBIQDYdzDLh1M8EVqernABQEP5QM+NiJgKGQBRpLeBW0IzlgDbtRccC7EdMDDpPeDgh7srk0MEOVJSCG+gHBFSA3JcHEipKCiWxL3kzsAvhziAYDdKCG4rRXQgeGFaJCElvS2WejADoG8Ri4BAApuGsAUpdLIf0P4IBGUD5a8Aax4Ln0QqqE7h3JBjZwqeMhXwBigbDqJw33I5Y3ebBI8qBX0z5fwpTeATRN+YyAWJIiwGvHcSr1L9B6FCQQBNnpSm0UCF0yuRQtgoOSDMBvFF9p0JEyNwKNwGBEShMwtCmOiEhWBtwQcNVTREO-k28gdBMRIdxq-vSR+lHnBhUNusbIWHg0oLcZcsLwwdcP0VwiDOJ+QL7BZwJQLK1EDEo0jycMQBxpdnOs5EBgPZphFGaBYBxUMjHbjuZGSIKIP-4ZshrFrKNL9UoFgoUOLKcPwCwVgmAI5vWJlIXKBtFBeQ1RQVAxBNLozoqWEzojKowAv-G7wSKemwBkJEj+AkBlrIrp5HkPtxkcAkKKEimoNCLqJO5HKqqKtvAVJLqjsAOVtSsBy9ZoIpBxfKNAIuPKki1OCoHtK2BP4EmL1nEn4yhX5z7CohVZTuUAJ3DNwoECmoFuGoRnibeh4aNllmLEHBialDhtImc1VQBmF-TQ3wcDNSBQsJppGAHqJnINchsoC7ALjk-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-B6spOQjsIHIaAIkw4zKCj-xl0qYsDEgyjFAYJLlx4teOtwngrtQ5bHpabcJyUyAKcQwBsq4G4PbBSLJYkUqBjh68Lf1QUTbgnfKIROuiJY5OAlELOOj5+7Cnh+7J+wZAtfRczj6J7WEKxcoBmB0kOrJvHM6o1vhFhZ0EEhWZrNBfiMZwsGON5cZKoRO4H+gZJG5hbINMpIIjtZ+LK50wlNng9NdSx-4CSRrsi70rhBFALQArBGCRbQ1venTdmKV5I2MfgJCZvUdDFXBNOkVYa8qOQfSmgh7IhBJCcJWkc8gKlv1GRodEkfBTwF6wSCNuRc2Cc8J4E1B+hD2YVOC7FA+XdAc0ORBGMB9QsGHODrMadxtIicNulNw0npLqjg8jHg4kJotGQGo5XAAVAVYIIJtaOLZ5MBNgHSBUIMKAxBPwCnQePSbUF+Suh6nLgRtIgdwHxJXAERMw4NSqLIeJHwgEaBpblBFFhqKKHBKYRtRZybg5QoD6k6cl6hHoMmoTHCcYbcrkRH5HWg9KC5yBSr3wYkPZBymPQoa1vYwQYBVw2rB4q79M9o2OrGLMNrOhMcD6RD6GsQIDIypqcJ-BvELZ0U5OhaWcM1hE5bWIxRj8068clbZ8G4hPPG9bgEN5B1cN2b90pqRUwPwJhkEN8TJF3Q0KMeczJdIkvqLZ1-gN7QVxHDYLLN7VYCEsQquXkD5HYkhRmsdJXoFe9V5CyoYkKMxgKmGqULNAz3itxI82OmZNkEMD06mOA-EL8R3KOVILoE9wlTQ2hRkP+ZIUBEoFkOQ0dYOTQWEL4cqSPKlOoBhBowC2wQ0PnwiECC0MWIbBMiIn95YXiLc9CTBe0C+BNEqIgysE3pN4jpxWbDt54cX+5H2IDNBaN3QNPArTpGNRht+m-I1BHDAaAEN95UqTx2wKG18kLLcwSFKQo4CsQiDEP5kVBlYSqIugLGGmR2mBoGlUDegM+IyHrxJWA3wKDNqqVqIAijpwJwLSxpUsExHqFBqe4lxoFwr7Iq7O75e4PJB4aJpxCELUkHyG4xpiA7lKML7VDoJZJ4+g6Q8pP+C3+JxGjsBs4pMNjBLZMFkKjJDwUWBRAFwCMNvYPYVCqMQRajAE0hEKzRrYE1ZHBJrgCEERhRYNIlbEHHZGMAEBiwBaAJYKTJe+G7zP0OKSuCII5oINwJXrNu0-BNqQvbJqJOCJNNcKIwhZVGVgWUBXBjkE+ZGyJZISDOx6L4FUQ94I-oyNOkwugEDEduD1B79YcIxOlCRqFRTJp4JBofPo3hJED70CWMjgHeG9RFeGEghAK2jLWM2Ak-LGFEyCEoPaEIx1kJaCfmibUoYFa1F-B-gfokcJ6YihdIiMTgVMsxYBoBugzJNaDaPPTMeYCMxMAU1cNMd7VaPJ3JZ6LmAVMG5hOYBxVqTChwwEDCA1UEKhDIDtR4QmeB4oGQAoNXFAu+DuAaUJvULstQqQMkLAv0G7xHcJXB1UNCwfbJVEncpygJkFJBOCCVRl6MH5ciTpxh7WJAEMP-JiqKyQXYt8l3qHbJqhD3gVxJfF7Zo9tmqPH1UaaTBaYoFoRkHfAqWKFoJBBMhERS10fqLZ13MF9B8Kt9ANfMQAU5Kpx9IF7wXanmhLlFcw8YeTgTZCoRjLmjxqYnOCnDBnhegP8QzNu7s3SM1AiUD90G0MviUaJNpdPC+xLqGTQmclhhk6Olp2PXwgtgVRGywHHAsEAoIhvNIx6ZKYBfDk2AB0CE11cJ9hT4RPwwaZwYHbGQ4GdEJShjWVg2ACmoyYt8ljqtJxWxCsR0iv1M8HkWxMNqnl2XdUIkDRLAfCAhI1pDzA9rDOFqMJvUtCh7xxyLyQcwSh7wKFm1wKPnB+0ATZF0KfB+Kg1BW0EGJpyP+YK4q5Ia-uKSaAFBqQlbGBy9Pt8JrHODK4BAQhGDUlp5CcQBzBXFZ6FJxngr1gnlcqwfuV9hG5MbAnIFPYIJLBAUOMlwHGJPB7wbO6XeKrB8yP2w6jP3GhEE3QWmDPAvlBNBdTpvA2WOOsG8FSxphDf9UYvjRPPH2M2eNmVKrHMYzbETFkoxDBiqm6QFBHdAnorFJrskRV3mKnhiCAmFvCEM6a8mTA9CJqJqcORI02lRxvMUVBc6FZwJBFdEY8BCgpYD0hYTYc1qUBZC2AG+xufHQgahDLIBNBlYwuLwSo0EgRycPmhhlIDNNOgIhevkmB0mM5cVkoKgCoNZjkw+4Rs6LSwWYCgwBmOJBAusjgQ8I20hrtbaAmoz1gSj81QKW7h48vZBMSv9wfSFtBO0C276cKuA1ULOBXUinBval9hhqFIJusFNAisD2hlIE2InGGMhI4YGCJBJVhmwN4n4VGKNejNFgfmZBoKAKxhtatbbIkAKhHZDQBi2P1AG9NA8NBG5E2ZvRN7IANgyNFBrfBXOCkFo8o12EQZ68Ob1a8LXg1wJeYHIW-IhrohIwoer0V1mToWwPrtJ+TX68pAkZmY6nJfeIn8sILLpWo9PgJyNBteSKBo6AKdBNoMSIK8D4EEGJbJZ0HTgrWuMT0YGDZY4BvFugP7M-opppA8IAROAOV0oIBqUWfp0w0GMz4642ziBkG-AjorSMSwIQhR1FqsB2M1RRwZfB4ds5dWVLo4pSJyMBpPJtdYBbIq7IBA12QtwPjm3xl1O4Qb+OVJ+pu400RWfB44GKNqcO5IWgLgsXfDvZ4oNckPce3h5Fa+xcgQR1cwJxDa-IQ5paNMRVRP5I9eDZArHJ9gu3WsmIzN3w2YrGE9+vWwznCMnt-Oxl6YIwxfIDrxs-VRQv0GDhIUHqwagjX8g9u5BGwNUQG4NSSgYNGgo6AIgOiGmHEhMTgr3thADUHGg-cDfF6mNlxP0G4QfOKbwsChqQoNaQgm8IjA3ClsEvqIYkEzOBQ3oJaMo9F7hioC2B+TI8hOkLxoTQE4YIYA0g3cLX58Kkuop4PNRhUH6z7ShwBQWMzQAcOJVqiDRHOugXA2TLZ1-8PxC8ud+AIWCnBlIIeM7yrQ9EJDpxqBHvQlYl6hTwH1RRpKVRvRBtJ8KDZxwQji1malPBYGGPcyEp+lvIGWSvwEbBOoPxAFpDRGF+spAlcDomiaagRlwMlGmAYdwaktkJ1egNxc6nDgYAFLt14C1BGEKEhqIEsw26ZvEaUKnwyaLpBYEExzrGKNMH8MRR-kJCV1kAfHmU5WAQ9DUmb+COBmIAu1Q0ipkPYVq1MICaADASz9lXGk8gGE5CKALjRPwLhQkUodBxfKBoqZF3xOukTFD4j7EUsRu4UGMERaAkARGEDAhsTgumEYlpHReOx77ILmJHxOzp4ODzoIYIMwJYA6RusHlJkinBZkWBAhG4J4FOGC7kziNtE8RUQFDhOlHT6A0jaaJiwN1oAC6rdDIUulVEaCKtJt+MdVxcDbpP6YbFZVIWCMrGLl0OIhUGA6hw1sF7diIL3Aztmzqy+D6HYwCwVuMTTol8PAy-oiWQEcNJEfOJkg4LJPw32MqRokLAANJUFBLk9FQekNRBwBJZ8cqPWwOCL81cwPrto3nXMANqnIV5EjR3oF2osiC6gmwJxAwQqG8-0NpYwaVjh5kAJ1H5P1YUaAbBU5MQgXfDDxb+qYJvVDiq12Q1QVCM9GOwPaRvY30J98KTBXiBgJQHmqrYY1Wwgbo5wrOBow509Ch97MWBDuNfAxoCdMZZIZi+4D-AEoKWkOvaUAhg-MHOCIWsjJlJBntD4QM8PEQgYIwJA8IgHhvZCYssFExtoBFgviEuwW2OfpVXBqVlJOIR7IDGyF8vuovBK9ZW-N2g+wF9sIYJOQsYDtcb0M0A9QnVioCCiQ1AAmdsNKARloCK5UM27gQYAkhXXNJI7wiZoVYIhsjoIapz4wdxTfM0ivReTYOwIipa-DGy2xvTBz9AIBQxvgp7GM1xjoHPhiaMohnAq9EVZi2BrMf8HVxXUh8IGNACBCHpm4+4Q0RuJhZVH0FPwE2jUIl7YDSFxNlAxxlokOqFeqjeAytEOJozuBB-HCMk8CKV5S+GrZgc-EDQUyxJocJdR8KNWJa9HiKRSECttYBlYgxBVB+Zm0RBBEswUQk84-kKXhiAFBrqcCsVghWq4HI78x7ICrdOwPeHxwMEIzCFF17YksChqLuMpJHdiiwL2h+FAPooNeWBxvGt7K4Pm7yRC7FNsEvrpzC-FcOq3UAmP3QV+uAQZyHnHpsmRpnLrlN8+nPggEH1A-4H3ZQkMsmhALjhDYIcR5YwwhOun0RKIG-B8YHgI7sCuiziHHhTmOux3qHLnmIHyCHxIrAdaEejQ0prQ3ChFwRKu7Q1k0QosgvRI-4GOwahD5lC1sUmyoDEhh6mwxakj9hsMEEQBNAfC7sJnM6+vhQ02g+R7cRiYBDEpHws9KlFYHsVXsM7Am7OdxpJCPBWgiOwa-d+RroFtgKqAwJRULqiVg7GVkICVFe+JwQOVH9nllbKwMLNg5accMg1bOuxEkPFAGMB7wzuF1cKuBYBkzCTw79Pfw85AuwOiMqg-yNmBg-KahCcFF05NlIsRjjj5urARxT0KCor4C74GmJ5ABWfnxOgPc4GCKFpi2OjBOsEPx4aAEh0lnu5ooPWABAFwIf4ucpiwCNU9CPThZTD9FzYDKIcEKnhE9NeEXI+cpcEHqF9uMo6W+DdZx1hZAi4ghIPYABslEHBZzkC+B5MHjVtqNZA8jMWB5lMgptIgjhPIrhmR4gfYaEOZl3djvYwEP98ipCCs-AOPpZ3YVRjQB2AtVlYBU5AKRHYLiRUgZQJ6YNLQsYQ3tCIHkZosMZh36JrpYkVq4iOCwV7qNEgJqKzB2mFKhpoLXIHsNg4fIMLBnTOfpmfGfBqIOe5VaJZRbiohYlsO5gqwCZoEAvJAbcj2ZhiAgFaPEwIONJjEbqmx4SqHwBOIDdU5ULZhoHpVntIouJvgE3otwptAMaPbFQkDfpACD7FKrLvAEdPxAFOOe4nDAmRr6CbJRjvZBmwO0wG6En5IqKrAbwA1wcELDxOWH8G-kCl0iOEQZI4EihY4ERUYsM5BJiLNbXMKV4Q5HvySYsBAx7E3Y8SP+ty+vvYNtdlpTuB4QqIt3xrEPbRfYnThetIeMb0wlEFzHXjOWF9hOUBrq3cNohITCxkCyOOle4ipx32FaoH1i9Q5SBfZo030RG8KPAF+mI5MwJhIoBJZn9OP3ZJgBFgxRiIBvWHXM5CpyNvxPAxCxLCEu5HJ16IG6gklEC0vi2T586JFVliLQgomVWBSEMqhegAE5PpA3t+hNiwBNNgpNuK6Ym1MwRcjPAwYeLLAHTNO18mHLmC0J49q4YI9k8uWpD2L9Hp8HqIoZBNldPKdg1YmsdsMBYh+oHXNDhDnlshJKZWntjV7GINhk8uYxYoPLwCEPOQB2JpoyEGEJDGXiRMcM4EvXCG4GyJ9dCuGk83cAFSNdPZBWoxKNZ4aLxqFRiQlEJOwdqHdENnMdmB2BKYEqOhw3JRiNRYWoQqmOcFZRC2ARFGaAiOALVCNHHoa1vvA-CDdRXoCggHQi+EF0IG7R0UOIcUpGR+iJgGpFh3hWVGgjy4N7BsuIOS15AmB6YMyz0CnnRGxO+Qwmm24RaHiwnUD0gM8FLEIlMnEoIruQYWMt1KME3YcnOrhrYjWAFMToFe2J6gvOM5cQQqAQvIIht4GE1wKhD4Rv2NO0KYK4Jh9XxIWoP7iKZGTBSeL+gTpi2BpyGBFhIGT4OLL1JAIBGJ06oNJ6lPwJtIDMlXsOxTINOWpQ2uZwZIC71jutWxKs71ZT4V7ZriOExqWMGWikKhgIYCusfqKqIUWNJw5UIeMDIJBFurCWR-vtwLMA1+Blvt-gvYXlzxyNSxNbGWAQQi3BuAlqt7ECqh+OJZJWwMzUZKDsD8hNuQnGE-w7TNGhp8KpA8PdiVrNOaoQsGcxyaM6RAmCQNmHAOwfBBtF1OiLQ2qDGQm4L4pNYPRHGxDdUnDJHAx4GKNrvWbYsQjMB2wHwBLlOA52kGBAvLEfwyZtLJ6mBtwJ2AU0gODSx4YskUSIAwFSEJkrJ4PlBY4Ficu+HhEChtZVC4CpATJbvBNC3xBkii-wisJGwXMHBZNjRtrHZA2RPMERViWB7wVMs2BiysbA91MnQ7AEgtx1g3ooYBLBKIMY1a8GTMTMjZwIUCpkAimQRJkIOB9oNYr4AKTwztv2QE4uGUGwJ2QGAh5ULRQBwRoJGQ1CBFIsRI77SYNbwTIvDR0WnjARoLmdyutkQAYEVBrhDzBxfCUhcHOz0CNDTkrCcWU6RDtkmGMagydihA7oaWlvNNgJbvBnJsBOoFEUvnx4GC6JpKxxUuoKEg2-Os4u5GW49oGGliPJSR7aFmwgGucQrJnUh97hMoB1KkxfSN0IZZGIy7KP5QtkD5AVZiOw3ZD9yeSIHgDUBawOwHu42eL3lKKPlA4C11gjwCxxsK3sJlFHR8V5DKkMSm6xGaPlsveDmJCxJ1t9uOjBIEBVAvsF8gHxKuoNdC2AwULnVmHMYgzkAKBp8AMhaPFLgG-ci40kFDrSvLUkUSotFF8AbtzoIfA24PtxZTmLScqBPqrEJ2QWtLh0VCxKhCELjQPYDmDVUA4gt0Mzp7ICIhaPDrpnfG4U2o6DEyYoG61bGJ0UIX1BATLf1lwOUAIJLPDDIB3h3YPtBBaFVAJYMZg1PJ2BkCNukiGL3UYiLMilSCJWFU-JFZ8PmbF+F7YarPRghnZJgUwLWJEjA3j1wOx7w4AvVmLIgMoaCZoVEHnhnEGRAIUGQAjXL4oK4uaYxRpcJvOFPBufPTNOCCBlt0LcV1zLKojkJ-IzwEvqrEGQ5i-NarF+HSJd8E9UinmlgVIGnIGFHrwewC+BUydMhmfKnAhJrbRRtUTAFWErWdEoGQaIwOzQeb2Yp7MAdlA9YAu+O1QqQ2qqFOFx8QWkIBTMlmAmyPFowCPRA9RMBASCEQQdDNmVCmDnQPwMXVjuNngNnLXIJsNeAO3aQwImOYSa-QURC-lbBa4GRAJSIHX5oN7LCUn8RzlJXB3kNMwSqF6FOsPHkhCKiIXMCC01plhB3WIZaVIKQAtsBKJRnZNQULucMak5HAuSy9nTsMzUDARAheuAmAG9tWJ62CpIZgPTMfjKDIS0t9A4LDlIklOPJl1PhUBXHylVi2BEJpAWQveBuouwMQRrSBGtNILQ82TWoABFV8xuSKnIp8PXh4LqghcaGYJdqLxoaCDtYdYDnA4hFPBeQKfgSMGLQoeKAQ5UGRAvOE7JLYCZBXOvMpqcOx6ieOYQRwEeVLlIkwaWFmQ3WCjhW6dMBI5H+AN4oAp4QhyxbvLnoBcNetiDLzBH5CfR2lGmgUqrCFRZj3gj+B1Q8CFdAwoZJgvtlABdCNLI7qFgYPgdMRPs7DZeMAgEOPosg60EshISWMNJAvqwjwGdAahDUkboIUxZPmjheRDGN7OM6ZrMaGkiYnKwiOP8aM4nIBVGEw12hZZm-CNZ03GLZhICNRHrNAEVFCl2oroGTwHWDonisAfZpiMVx80GKBA8F9tykGTRM46nhzsPYUsGRhtw6Ob1COFao3eO7lPKAOpe0EnAZwFXo0LRmQLyo9A0cE4xdTgpxbaBwAq7EFQpSBhAJqJ8xjMDGAJYLfIo4lqIlqTWpUSeOI0aDmC5IfrBdqOu0NoMtgeGPZEx0jgkpI0K6mENwK5OCQNBpMuIfGLrRq2Cl0NPKnAEpCAQVQg85c2GgjXBBLBkUEQhVPDpWiEDwxp871JV0FEwuMDTQraFYU3GA36AxiixELPM5KxqAwaRKBAFsNkJkKGeAhsPFXOyP3wRRu+xWzAlRipJvA9OLAAePaYBQ+gjBtqJ9RAUIWIbsGWBXBNAIQW9nQiMF0AjIFHobwOtAOVI-Aa1hM3shD0QwYlmwnRq+B8xJa7qMB7iuAKTRXGCY5nSL1pHZCTxS8gsq7beDhzVA7wXJEtgR06s2gVPLBkuPIpkKFLAOwL9N+ACrBV5Qu1XaxmoUSGIBI2CMsBpCt4YdFKQadFKp97BrptLL1VLjgSwTJs3hxSb3CPIEQogFtNAEENlIohHsSmOUtQ7+CzBxcAMgteDkVksQyaseI4IMOfzAIcPrs6BjpWtcPqgtcBSIrhO+w+AN5pd8D44NMV3xNwBcReSMg0MwKVRaHqYwqeuYdOibUleM8TAX3fvdVsBKQVEJTBFIBCgGAxYl6tMt83fO0QdK1NBqUiNY4EIFQlJGlnYwKV5iAPvdNG2shg0JG4uPIeAGACahIIixkqwDogIxiKNyMN8QahEj4zuEzlOAOJMfkPVwziNkYMcPnw1kxBE8wCL5lUuPI1W1PgRxpegNaP08v-C2cb+DCBDNE0LsEAuxycAwB0YGKBm4PYk9+lkkG8CepIzQqmI0FoRfiLqQMyFI0LGJNscwRxBGLDtBsatTpd7DRHBoGpR+lK6hFYKXh4ILzBUkH6oDjL4dNG4upCbHgQA0FqsaI5yUCKHMRrOFHW1HJHJXrTHAVSF7UfIDLZyhrFIcpBeUAHChA-4CSk8oJTYvroSQiG-4JEUoADhiOAoxwCTBapEmBVEgG56MCbI13Ms2o4haA08NRhfFKBByFPottvhxVrYkU8mlPvZiIFWAWut3A+OCfQ9+iTxbIA9gS4BCwoEAT0S4Nd0Ki5wRUABvRe0GFBrKrhb2qAWpyYFmJHSlszc2NhhwHPc58BgIBPK9xSMEpAxlSCEowmmuzXiuYA1BC+Eqa8DHdUaowIGB16dwMtAAHCPoA0C7wWoCGa5OKqgPhCeBQZsnBlNhuoouksQnUOIX-HEGpNUG5KgCLQ8TMpBxxxNyQ6Pm4gfeoFkklI7zKrGVA7+CnQDjO77gEPmQ+hEsQgpCcQU-ZZJh24ZiOiHUZeyJeQQoJqQoeJhs8KFAgD+NODrOlrxt+m+EJ9QmAvIN004zte33oOLEbwFzMKSDSkmDLUkZUA2AHRRRM-Wcthv2BWBSBFqsXYAZB5anZQbULw7c2CqwLIakgLNrPD4fGzwLwL4RYyqfANPIAQC8GzqrWR8RlSI+Q9kOfBeoDj44tvEQo0+JQf4KcoW6CJwezHnRmQQJWjkJuxqI7QFa5GQ4myE9YcIMWAQMlW4YRFot7oKthMVOBXVYBCXosJmQkmznQnwECopFT3AiMCTFG0NZk2hQoU9dAjqHIXkCWcPLQm8K2obqMAdK4FKoyuwZB+hJBRhqjKlt+L1o0RlzA+4ALAdOJyMM0IfhvHBAQhIBehCAAZgiArwx7eojEwyITZc1Ki04LCghQZnlyxZt4QUhC9BT0B-COcJXB7XR-N5aI8QbdC3QIEJYBpkNchAoDphrwG-BINDbgkoFUR2lCuJKYzfhl6G4AXChVVf3W-JREovm2Oi0xdnJQZYnE9QyUvFoBUHditYslQ6EA2RljCt5sK9bFlFHZp0PgKz7cHKh4YenIViujXSeKRYzCBUAOvedwlkNOBuwAFhAmE8hQ6D3xOAIGpBNN0EikJfBnLg9gyHAcpbIIZg1jtSw-+IzRAnYG70-q6lPtT6QtRNUd+Kh16+oA6gQWIUn3xNJEUqicMXq2sgZ8L2wNcHPhjs8xhzzM4FKrC1IWmOr18tk-xX0a2D9CGHhggAhjfmOGgCwOmmcpNrQIYRUgpGpR4DtJQxRErTEMyED2+hL81Q6P0boqMMJqwEIBqaK51kwDQEzkB4sf+FzMKpUAwzOK8Vy4KIhR4A0b8xLxh-6F2oucBBA79JmAEOpXADSNYgcWn6lF1DUVyiL81JG1sRykHIQR4MYBCmOXAxoC7BJoOchVsIBs3JQGhERK5J3+ipRduBFgTSLFhDBKscxijcRntC7FQyyeA4zqAhmdAXhcEATJI0AmQm4EnR1RFghWGBGh1U7nHpm62AjmLZx-wJosUJPaxRiDPw0RUYlaEKYJOFmzggkDlJgoGJgQNgEgqRP+NR+AU1CmXIR9oG0gShv236ZDCgShP196ZolBxe-kcxQEgaSCpUUPqArXDMZWlDCyIAISxikupsdB8YMvxNsC7Ar4Cph5lKcpHcNgRjFPpIgpgKIvEaeI5BDOAxwHO2a1klB8IBfMHODeBjIIuK0yGZA00RoQvfhikxlrYR19EgbzZL5YS63nYuIxKh6vbcZ1etrQG-cvA4+JToY8F+APUMsgFFvlxUECOndRKgg7qKORluAR4jaCgglGJyxLiGVAdc9wLgwD+wuKSSgkmKnIj9NqQ-syc8tyHGc1kCCsY0O4Iv-C2IXq+GgtiLp4yNLmok6Fg5bhPTJ7SrGzJsCeImkD7QD4yJxegKoRIRIRxqxAGNVIETApOEUjf0KSFACNVph2BKIe6kGMh68PwGMHJxV+GV3S+LuB-4ufAw0IWCfpLQ8k4MHkUaJBoHOHhR3+BiRQELgI9IM-M-UvNh+oMIInIBx56YrlAXYuTRDUDcHcFQPps6L377IAMgGFBtQAaPaQDVlW4MaOYIcWp5AICstJqYCowiMspg6vhrI8RSghzwI4IsyBEwatTMpEMi2IdcGE1TuP44pIC2JA3ZHQTklx71OUTw63HYQBEOhwQWDUEYjBrERXGArNCyUhzhoTk-EE0gn5OpBTGAYDM4IFAPXLLA6nDToCyP1ZjMKnQ1vurNyaHqgV0NDJZwFAgg1BYlfCP8Qh-Ijm+Jta4-mEgRetDemnfCGhAATJBcjt0EELBiB+Zlcwr3g0xbCG0gyHHh6ahNtaM+KUM6saxgg4F3p5YDUFiIM0jAoDWpg-ELABNrLBQmCvRczviJwkDWYTYMtA3iN2AusJTYaUA4hKrOh2HEHXGuUCoxIEEXExCwWgi8tCxcUDbgCWEC4AYPlofohCoqmlth-qrjgdgBUIcnG0Lq1Pc4WwUfA9kMEIFsHWohy1JAl2AKU6yQ36PiKdEkcLOGVMg2HXu2DF2nEC0OwB5U8uB5VzWA+wYmIHXMSCXAXkBtr2lKfJe3ZtAWChVwjEGbItkNExiRP4RWYKiTaHi3gHvDFoSICuiaWFWxGYEQFuYOVRw0DdBrxMyzrINv4gGEQF7GBmE-BKARlBNMpITL4wmBMd0fCE6NxcOsAfIESh6KRFwbdO4gl4U-BsFDiqQYMyHSeC1iv7ExyF0HtQCoGKMKhCiWSUn1B6Ysq4fqFARP2EP5DIGUQWwMpt4OC-zDMehRNsKtBNSOrg-OuUQUoDmpuCFf1-LD0hIQNS0z+OYYR4N3wuwD6VYAS9AJTGQWZKDXJuZEB1jXWLl+jdZVgROeBaotSAwacNQF8CmAm8PoHQtYGQh-Adx-zJWAbmC61-KGdsvO7WIUh-pACPIfFFEEj56EJZ8c8uXpF+BzAIzOapZTkU9z3NhRIqLBiKpZF0WCl8gToG4JLaFvNSIOgVQCHep7OFZhXTMohU5EB1FOHityKDlXrMVOhswFAAE-s1Q0ntwIBcNcZ+BDZBpwSs2EwDdhFxHtBcoLlMQ9ND4EyNQgv4I9gLZEJMpnesSsDBnE8KOuZx0DEROiY56-oBhQIILsAb0KdAIGAv6aGPWArkMzBlSCggCC32AePQfgOwJtEMWN4gC1CPoWmYXhxfARn7CmVhl-PTBWoCqAnoj+AdEOLEe2MRAQCL6g1pjzAiZDWgG2O1hsWEUihrguB56aQx1MIvYSKTdBhiNyQmIxtRbtEpIxCCn7w9FT1DVE0IaAspBsiK2YfiLKpBvfVxzcgatCaKbwwoXNArgzoY56IcIEok5hACFuhofGu41GOVGrAuLYXwkthOwAQgeGM4FAxlUxesLrAokFjBpIkkB2pJOASkONRdgKfh5FOwg0ABYhqYMU4gOEpSQiGshoNtVES669ZRbFUI8uYIQ3nI8gUJH9AyIL9UkKOdxSeA0iWoGjg9DKwQIi2Cn5lJywEMMnUP5hORMmKG1s0MFl1ZpYA9kKb03B9mRxKiIQ13CvQH4M8FJhGZwIpGGgEyPahXAFT16YJrQuaFzAvrI1xIuh0guCFmcV+LpBKWDUQdsEQ3haEYgAbnHQsiuvJz-j4wq4JdQOYGlwr+X9mvESOwqkCFsdVD2Z5UZghhqqdheGNEhXTG6R4qrGByMBob+BLGdmuK1QGxxZAbqm0QhrgfZ-YA2ou4WyxA0GPBIqsYI-Y95pJYE7JBUJ3pdqUqRjBFyJcaFwRKbMegR7jQQlcAYxLWHfBbMFOK13G6xf3REVtIJ1whUNXAjKIXAz0NxOQGih6hyorhL61epQNL4w95oXAL2KrGvcBWgUQrvBXkBVK-iPjRo3mrZdy4-xt+P4gp7JnNTR2U9KdVdF6YpnNkqM2BOyOVZUfH0BfIFjBW6dIlJkHEo63KVRQYlJU4Cmega-azBJSPDjOIHpqGYioXG9C1G-wP6RkVCPKYiIww4YDGyPvRpgqxP4gaC5HBpJNJImcMpJD4NthKIExzK7MggWgLnHbtEOlZVIn9kKBgU3yJTp3CJxFAZmpIaclgzHSGyZTOkWx8ILBYmEEwwDuOUx362MMNZM6Yt8sY0oSHJDxi5XAgIMaQmcsNVHZMwRxQBfINS8VAR+wztQVJ2B5sH4AgGJR59EBgZumih7MkNz5l0D+kRwONR2XRVwVeCum5YPrsG+MlRKWiFsbiLvhe0L+6QWMZge2Jkx5+hWBoZKQAUUL5y8akN3BCNvhBqITyZ7tYhRCEGgUPYshr6BKZ6nMfh0WoRpNaMIi19JYk8WJCx44KAwLiPmhMmKGk9ECckWkH2N7Er8se7J1ArqPbRRwK2h5+4GgZYBCgd4HsB5lAvA0-XyDjxPTJoZL4xKBENd6tCUgoYIz1-k3vhNC8BBJp09g27J3IM4unRI4fpAXRHOB-COZwqyMmJoWL5ADlHgQk8AmRWYF0BL0C5BwRMLNGkCC3tCxFhKAAxgDjOYRT5NEQoIMWVKhNbEacvQiVkP9A3GsqQAIGNkwYBTA7LO4nakazB-EHlyoCO4xjfNToC6MxBXBDfEc2DUEPYSqAvlCum1IF5xmYL2H4wNT2WCi7ltYGdwUJFepRcDhpGTAoB0-niwWGk7ggUBtwFa8FAHyGMtJiLzBLPkUl+FCXWsq4il84nxpKUF71+0Fx8Q8BjhesU7lKBOWBckKJYmVWXArFEAGHDdXxvZSelNG63pgkqAQqoC+Excrswc2HKgHyGJQzwP0UboKkQIYB0RSLCTWZIFW4aKKV4UEP2wlXtSwRCAdBuoT4QLAJVFIKBShwBAEgctBIw95mfArVB-N0oN0RHPYwT2XbbQdUSWAMKJDc7qWggB1NShLZPdXNUFp62frmAMECb7reMwYO4L6RBcCggVIAWVuYOV1zWJ4hdOIkh8FGowb4s74t8l9RJyD5ByYLGUROOComfNMZaTA9QRqicuY2fYVC8MPowGG6wpynXHHOvD5vEyCFmfN7BAXlUx-wHOBjINKuquW3x6ZiUMvkMKoycl9sFrIFRgsEjhAEtjYvetYBEUnBZV+IhZTaBCWxchrgFOK-ADuAhY9BFLQ13DfFAILiRNSG-IgXLyJYdN8LKoXER2Ms757YFURR4PyYAhBXFUkC2IbDvNh2oAKv0OPkhMGEcxvnOy7GwedABsCTxmgGyFUYITyEMXixqqHisUhOVh+CNkxiRLSJswGjhI+F0AO3XbIwkLuEGduagKLNRxtFJMQ1IN0Rflo4RmgGfgpnl4taW5dAC1LrAwQq1QMBEvzlXIwTXzDpxqBWANs8PaRLF1bg1yEd5pwKiQt3NABokOvBQtEKxXTNRRNoF3x58MaYC0u74A+GH1KwGiL84o6hqWhLByiKxgD7L6RKswhA3EFLEnGO00REN0BjXZG45DL7IotFVlGVFxmedOWwL2H9BVEjMpN2vUx4INPBMnKV97NAlFD+o9RbPeUg0-q0xTkPpBKSDTxi9EJMAcPFBBUGkQNSrpQEc82ulUNlBJWCjZO9O-QWsESNvBHR8V1mxAtCKdExObVhTMs2gTajPAocLd5fLBTno05cIS4VXY0MHdBQmCHgb3jx7G8DlBxWRZD9YF7wERI21SaK+6WuvZBb7KMdpOJqI8opV3G+ZRRyqPmQIGJbRvqNmA6vtNkzfrfZ9dj3hUoBtFMuLF1qWgawadAWUVQk7lsXIs5tIqnwV7BfJHBMPri-COxdINBtjqriGx8YG5NYB7RdqH-BCaNaLl4LcwbWKjAvamwVsFPSRT4LMy96OvIz0yGS+IFM9BRpZRO9GtIewJWQMyO1QXmE9h5GFuBvEKqIOWBZ4aWPNh6mCPKS4XLBfCB4gIWJgCCoLmx97P1ac8nlhDiNgoDViqFwYuFw0ngVRYwDZQWo+xTjkH7VG+RDlXrAYBLjtHg2cOvoZwFLRhEb+Rf3eTAd6xTIG9jdBwmJVCxhvkosrlxScoFPZyMNHRUEM3r8uLogY0Biw8sCJmxOpFQLN8PVYUIBgferzBTxGIRdYHyhPcA6YUuGhB4mF2AnzIlBxvG3AiYIXx6IMUhWMPsoksJ5R-sNODW0vUw12TJQGwDrgquUQZReMLhEMkDx0tNVE+APNR6siioPOxfACIE6g4SLAgsIAdP4dLqRG+RYBKPBoQiYDrBNUEVg-6PCYRMPSQBRHzglUBUIdQjDoIqtkQUEC5gaRMEwBOvXAXmAvJluF8wU1Dn0twESMpVOp14hkupiIMYhxZbjRcEAOxAZgLhOyOHpAGB7w+gqCucEGzXQ0BSh19C0xv2PyYZsOO4V7Ncl6ZmCxSJTIVjokCsU8BaxIutKvOSAFFhRwKRi2fYwz0MLgqh4zR5HAX96YLyJYeL1U6ApQwi0WE07+NzBHtsIR1cN7BN4izZZdCZMZpJtAoDD+Aa-uNRmgF4isTi1AyeKnwi4D0Rv1E3RBmOONMfPKglYrfYfUkCto0AaxFWC712kBCXkGv+BnvFahKEGZw-OIyAjmKKJ6VBKh4hso791H0h7El8o95m+BYCANBNxKFp29JFhiVz8Q-mDWopLCbsNMRxPNOoKgR9BvQnMJzBQNMkxXaHVjKdGpJcSFItG4IQSIXemVNPtMoGmOb020ZaR7YucFAIKa2ncIIAWJP0oVtl9YpypzgThlpkw1bLpFLCg4nyL1xuCANhlEBxU2IAvh4l1REIR9Hm24PwkMUgzsJIN3QuAwatlBOUAa1DnlakmTNEMvDGMEJCxcsLE5JEEXAQMrlYtc1VBNFqNMIkAjEPeOZ8NqPRMZ-HR8+tJkxSYBp5syvlEvx+Zw-AKnAt4KYwewPEwRUFDAGABSgekIIAMqvZw2mGTxAsueBOIKJQsdNeMK24mh2gDMoHkAiIFU4quUqsdJnEGgjbCx-AY8I-wIi+XA+QQ1AwoBZtmkFtA7qMWwzsDggtIB4g1Na+gEtM+QPeERAmW4twvlEU9jzkxy3YBEhzVDYudwFdFpEJOBkiqqB3FNgovKy2AHMDhDEMhmP5MOKgS4GbZddvMoi+urA0AH3Zq-igglFf1gqRF64S6FAJXME5RQ0l8BqWMZgH8HO2GmP7wVeMYx2cF-BugF9obqGiNmIH3qxcpBATKFmj-iCFo5IIuIMgIzRS8FKo3okSgnoAb1vuOWAjDbd5+OO05fikAwteKmSAmsX4+cAtB3qJBAvtPVOipFSIAmtlpt+LvgCZC3JEwIgNje86YmkHqJ5UjzMj4BDApnUnMoInSI88AXxRCBUZNSBIxATAYQN6CVAveJwwgGJ6odOH2kcEBOBxqJyUYFA3Bb8gx0raESM79OFYd8N3QPXApRKY5NtoAB95u4FjFr2kR2uqdaRUYPRgxQDdh90BmRowr+g8SKDxyYEXEc2CiutCC185ADLgUVFZw6sfyB+TOMcYWNngEdKSs3nAdx2mKlQ4EF6hqkDeg-6OMYHbL2guI3IzZbibg3CodgCEP2tW1NAwHufkYSuDYZMFahQ3qFpAZAlWwOAFJgroHiQwmmeXuMVdF06AXBkqBRZqNY-wOQudABDmgR+iJKAkDX4QyoJKhdkLF1zMpFB50G4VyoCJViDKZxaPK2CgGCzg84WWalkMTBrwFd1+uH5wmfCJUlAA2o5z2El-XDDwDoAm868-npziDdVOmPZwHUInoVSKkDYKDvB9JGpQ0kBzA01PqhPmLKRisKmBFYD0QH0HvJbjKnAuNGTAKCy61LCA7o1LQJspUK-BrMkCoU6EAhWYFOAqwDroh1M1RGVxEWWV8rp4mIupzgi6ljQNCBWL0FA7uDSVSaEqhDnE8hNFt8lxwPuAZwoegIoAXxBUCMkM+E9FfT8JpugE3RdkGPZa5NqdqNdxi-BBLhgDRXE3+F5RLjoCgD+HOBVGCus4EKghm4MXB15B-RmwM2BUfKPRisJ6hwBFTDuBf3G1BK3k6DFXYDIFxNOsP0bEYfhxS+7jIyNJVhb8mgBUMJuRt0JcoJEB30JhKNg0oLXIG-WbBVoJ6g6cn7HjuLLd6tKQJRpMIJmFhbI8SJ-g9m3Dg1+MlRPjEcIM6KGkL5GhhuI96dmqA2US6Biht0C1piaJFRSBikF7ShgJpyFOx0WuKzYS-kpTJEkpymMIJNcE9783fEDzglCgFNv4RuGpMABQBtI5wsvQTIpWEeoJj4sIFzAnIy5hU-Cbg8HoqZq7dmBjxN5iRxvoRXBPbFerDgAwQmW10AEdBC-oNQ2dalwAnDgh0mPtBs8ARoXYDUJlXOMRSZJMJElx0FI+uOgPKgXwoUFGJMwKYxHiFEIDAV3jIShowSSDpw88FWwFzDUJKSF3NqdLSQSSMTcyze-wzJLnv0WtkkIzFRFy7POQQcKLI+iD6ROSlW4tEv+t78PrAwyOHp+FEEOBoNMoOuCQNfFIyBYLOpgOmFOLLGOgBZAAx0FNiBPF+OehkspVYsiErF3wMHB68KXg3LCBP2Miag+UMQXqtDBc-6F64teBiYFKHHRj0NiJBjNMQGArKwcoLFhWoHrPcID3xvHHQJ8lNOCSuAbapfYMZeoDHp+FMJgGBMO7uZJOQS4QjapILs5HBKgQUbEQYiKpiXEkBFAHFLihoGGshUaXViIlHHQppftAF2shhsIF-4LkP-F7AoIBZ3PaxoGHKJCcHqIBwOBo7eFRBHxHYAAhM6JEUnJCmrq2pm020U5aPyYL7MqgoqLFBuSOdeNqI+AgPH2MTkmRFKTI8huiIHWk6IMY5Y23BK216x+ZkPAWWNFQnHjkQoEJhXW26Fm+cj6k15IWQIpOKBG4OSsgUB9gSYLjBh9G7yuoH3ZP6WTwC+HnBzAMt1joopBTINvoIyFKRQakNXW2O+x4GC6l5eBbAP7ZTZNLn9E0LdMhKEKeB58vcoDAMixkMCTFJV+T5A8Cvwg1NXxSgAbBajN5BRmi8hA2IIJRjuAgCOGjAAF-NRYGBDh7EAkBsXEC4M0GTwrhJrRoBGEURkjBleGPcU0iHvRobFLIR5f0pdIF64bsE0IVYFWBAqEqQyBDdYG9nv09DBQavgAgxrsGTQuNLoY5EMW67pcNAUwHVOupp1Jt+N4mT6KgwGVKUAHRIBJ0RJWEyzScQ9TL2hGLGQkcAAkwZZHvI0oNmMwoQdwoWHkY5EC10Viun1RpNGAT6JlJQoGtjMypDwIRyvRHxQUgxHJnh1OgYIYmC7k3eezAoUF5YqRL+hKWFGkx4HdFik++xeINmB0imURV-BLAOuENRu8HfKGMJM6A-GExJyIdxUYBLwuTkTREYn9eZ4E3AcJMVgTJQAhh9STwA5KZxCGZ6hlJPkgQw11ApypUVG2jUhQ2Jp96cKb1MfAMwJeB2vO69fenGAwEdQr6eidmD3TOPPhbvO0hRpDmoEgJxA71qqZJnVNjnglEtuZIc5xSCaRzeqRqDUCmAG8QtAShnl2ncmdhFxCXQqNW5BXXCZoANuEsXzPMgIH0QZ7j0PAwoMpg1HAWIdvLHfNG3jJf3cTEx0gjpcUD6J4G7QlIqFa1dTp-hadNa5f495BKsJHw0JBhyuPKPAqZAdBhCdzI2CinBsbYDM7sOdFLlpWB-JL8QTIYFAi2PZBI4HbOvrtZpGcooVzcGmgG8SJVzuABBeWNaQOQoLQoFXMgLLFXZ4do3I29NWI9OCjQE3i61aHsnYdlQKlNYjvAQLPExG-GLhDwJ+k+Um24l1KwwBUloQw4BmPFIPfx+YL-KLsoWDJ2IFqnxSCw5kTLJlXMq9omHwgTHMVvXyQ3hcvj5BVqwNBS4MLgKBHshG+afI5iBs6i4h1QsdJBEaWJaxLIFWQGMa0w12KZJeay70O3Z0xnggagnyLshf4+8hdnDthdYIOgTZA2ALIC+NQavxw7SGoJ5wPQxISsCIdYBWhOIOvJ8uG3BYVlGJzzChxRbL1Y4CzfwckAIBUEFKRYwL81taWRpokJQgM4C-V5DKyeHEEOUMOb5YB9KOR99BEV+BIuFjpFWQ3GuYmw4A7pAkJ2gNy1cHxcJvEXcsueiRIvx06qagSDE5DLlB16uELvRjov-FakByhvVGoBsYDMB6cPjQ98BAx7aGOkYGoeN3CD0EX6nohSsNMBufCqQdvMP9XGGWM9QhEYUGNukc1EwI9qejBguFcxhWl8hWqF7D0KMgRYA5nGvoGu5AXcVUEYSyxvMTHBFuBcguELBi7ZDmB3KDbJdIG6nhERtRjYAPtblimBm8BxZiuA7YOg4I5fDi7FEUHv7uwK2AUuiC0HHEqg9QiuJYsFMh+TJruQMoMhpsq14PvPNpMYL8Qo6KB-A0lFoLaF6hLaKtI5iH-YGwC73c2BIwgkHSIZYHCJdqeKyXqwqxBCBjgV1gXxBNNFwsDBKNq2PL5WzJ9IDEzawxYJKYkLXykDWFpB7+BCxKHP+ZLqOlgPnBAxsoBup96LYAZ4IUwShG8OGYiZp68I3BqqZ+uiMN2uUhPfgyYgjbjoHHZuBGE1VMCcxqNfeCuPhGgrJqs22mEP1ioPN4IUPhQSkJKgWMlF0lmJNPsIIwQAHt4oo9M+RNGwrAdEgatmrYFkQ5IBJAZumAhOK64xRq8RV91RwYhHVi9BLohI5MWxpV0lB7nH5YH0JOxg8iiQ0GK9AuPKOjfEtv4ZAsdJiYOHQJ2e-IuMi0BUi53IpVOdBtqHVjQlbfQiMM6wS4AvhetMIWBuk+ZYsMljXyPAxRLNVoRNkgOpIL+6dXCjZugjNi0CJ0xW1MDVp4NSwc4PEu85fWAEJOYZwV9wQr1FwJntHYQgFuVAU0GwUkaJZt3xOrNNMAdBh9Oq5Lj8NSuP0fOXYilAvEfzEyjLih05GhaxJo8oCv5F16FPdh06jfwa1JtANUHqxkiljVqwJYQQaG5YHBFrgLkv9hqBfxwiILIBqRJRgvbi8gdvM17sShiZXkMlgNZB64yCE2RnjiE0IoBzwx6D-Fg1c-ykmGt+0LagAcIYkxCjEIAqIu5RsoE2ptZc+BdyK0xQyyZQKitXCooANIekCaPrkrxp+0L3Auproh5kE1dwRKkwNJedB4D0SQ9eEIR3EOsuWmAT1KwB3fWwW5gUh2yhMLiUXmlulgqaWfgLiA+JZwMEAiSqDET7ioILoHaZTJE0w4ls+YNfPUv4lwWB-RNBtesOEsiTcv5dOOnwdEnWSnMOnRYGCquUPbZPZadZxl0F-53CL4Q32Gyg2UFWRuYL1gTajhB7CldacJGDLezFrBpEisVEsZW7mXpP3eSLE5C4BjhyAOhRzVhq465n6lGVEJB6EJfATYKA5hNBRZHtvlA72xW9Cuy1JhqL50gWguARXNtRH+IuJKhAUQXYBcQQQtUhOaFXBv4ij1iYP9QbmHEQdDKcQuPsg0cUp1PygIEmL5hihkKOKSLYPog2iGdwvLEVIL+OznOkC+ANqOSia+CQMuPFqtqdEyEDxjf7Sg7wgZRE7k9oLDZeoLgt4zW0irCDWKt0QJxBEZHwA8tBeCJ4EpAxJMP-Q6MBJABhQvIjEwJe0UjRKxCz8rHhZLuYAWnomRPciR3igwCzgxkDdADYAoLBRRO2ST0DYCE9glLBfKMd0VtBTOpyU17T0or4oivBdwOVIKvC+yAcWe3AqhPlsGkjr6JBwtIyHoED2QKiPQLcUsKyfPnd2psCZzNMwG1DuMAV+2aBK9JcofSi2VDog7MAGsOloakDFJi7kewjYCNXC0NgQMKXAsFjjiDSIvsQvwCZI55QrFLs4FUAw1nvMHECMCNcY46xbyGnIgsAsQAKg4iTBAFLA+rAkGORAkpjmCNOC3gjkvCh6XCCQhlhEcMB6nrYQg0iSKtkIqnAaYrIkjeBrYOkUTYhvoNZwbLAXILUofMBiOFjg4xznlMvAtYJU5BnQmejYiBAwFEB1xvm6iyCl4Dmw5aiidL5grNgJsOWAoMwYCJomd0CNSCjQ5dh2-i5kLuTnYO7sGNCR2LwyPvQ-sGQw5fTaRBeUAhgBMNSwI6DUsFSES9wgQK6kBMjxMJjoHrhtMFEQ2DgJTDAA9Wgo0DqiUaR9wIe4FaRAIKwgveTh0HgQstx9gI9Q2WgkMK2CcJDoUJUIE0Ah6JtAOYIuFA8+oNT3cBFwHtACgH2ibWDH+J-g-KAGwOn87LrzeBLwiAb50BEoVga7UNhoiS69VGQQ7cAZYPewPOiVQikO7OhXgC2CTdjLgBUUcRBeLFjoJkAVIBu4ivATkPFo6LQLuOloJmTt6B4qVGp8SL-gkGjl2NugJURYJLKwJSC1ClUwbPCMys+oHFSAzGZ+HiC3CMUa-eDqdOWA9MB4QMsYN8AIBApQXczyYPugHboVVE9wkWCfgKGwGBgLQJqQY7APkOuYEABFYP1YXHreJmT4wiIpdDXIm0AJoDng1lRaIJFg2LotdBsgg1D9KNCoHLBPmFcwH-icsCIAXrp9ABawvcTqQPaUYox2+BBENYCa0Ma6k7B2yIwwOGjTCLrsH3gr8LQ8+uwoQBNQ7ABhcA0gkcJM6IXgOCDMWNWwEpDqdNpAA0AIuE1ICGBbzKFoFUqDIKWwk6AjHAUQ1EKafCNgvCR5YEpgvSCw3DWAFSgOtJyBnwIFEC7kWOD2YGBAvbC4LFvIofQKLCIgFiQrpoDAPEDHVAH617RfwDdU2P5MhGpIWCTyFG+wBKD5wLOggEBDqNLIliTAQMb49mKjQN-gLGS8IBAwzKYzUJfwmtDq4NuqZBCXHl5YmBBALPyiy0iroIv0LTjh-LsAxUAD2Iago2pAEK4ALQ7u7NiBGzBJcPuQ6PgwoHLA2ZCfwNw0BMhHsHUE-MziEMz4V6ABhJostCAhRI7g3Sia0EmAVcC57g5CfoK4VFGID1CSLPUwm7Aggnuw8yh+wJUUnnj1ZDSIzsCWjB4sk06dcKRABqzIEC3keIga+H+G3AiqwLtQFYBXIk+g9OBFIGkQsFhAdDegfKgh4KWk9kAP4OdAm8AWwD5A2DhmSIkwQYjZMP4IjvI8UEwYVw6rqIhs9LJkCPdCaaLKuOtw1FgmYOjQKJCseJNYYkC5Ag3s3STZzGT4yKjBQBLyeggq+A4g8qD81lRwobRAqDgguVBfwNlwWJx1uGxA-Ix9gH1Ye9DOXLsAaIrSRLigiFi6wLYg10Bi5N6oFhBKINRYJk5IMDv+zYAz0OQA6Wg1gN0OIGSadLdQGjAqIEKmKoZenETQINDKuMliM2Bd0P9wy8AkliRSf6AN7M8gwWABMJcekJR5EC5Aj2xLsAmwfySmZDhBvViaYIIQZhah4HGYPR7npFOUxtDmEgja7CANgPzMNayEGFFAqHZpkNDQiqSrNuIQEbSrIPdwxWB7gcgQ8tD6AOh8I8AagexoL7C3UMo68OpmcCGQDYAhkIG4ipgwNm7ArMDbUOKIChAVUJWA3ZqaiJTGY5QolNf2AlZAtGWBFiDJgKHQO3hKIBZwhaw9QHRgGKDrQHX00bz5bK+C2DiiUBJg-fD58Du0DSQgWHwo3EiUMNtg5RCpBJHAVyKJCExG7hDsegIAciDF1GzgtTjpLHJwKOCjln8QTOjraoc48DCQmNIgWgi9cAHIwfjaSE1AEra98JpgJcKi0KJ0QLjnQM-YOUCn8OSozTDdZOJQBTZtcJQwFHqIxLkCAZihYDYYXizx5L3kyyot0DhoYBDJMKvuLYglLM50oyRzXuIQMaQl1qR0dgqtqHv0eTjTtrFgQHDcCk1cQgBJQLXIm0DQ0IggTehUkJkwVRA3xHeA1BB2lpFUJKQHcCFQgMB9CONuWOC70B26DcA9wE2ASmZ8-pVC41AuQDCQ4WCPsJPQIEDNwHngobxy2MlktlSkdNfA74AwkNR01LAcoA3i7kYcqP5QiEAA4NFgcNgE2CFktiB9LrHAfKCXwNEQ7PTDeJLALXw44FRqD8jM6CsQe-T6VmMsbWD0wFx8st4RmEYaO1hPUNuA1ASt5MRQEYgyBD1BxiBEGDGyfRyTmCbUc6a0ruzgk4CU7I9AOGgIMPActHgoWKcAh0CUQFgg4AjmQJuIzDjocKWYTTrT4IyoJFJ0COCEJoj-4JpcOx6HwPvUGsS-LI+w0ohfZFdgoUACiK-g7Ogu8MwQHfTIEOUgH8AEcrTgxLTnwpR48Ojq1Oy6mBAoIHUMy9C4kOZ8I4C5AjBQy8BPyFrg3VgwqGW4ykgz8lCWdZJFYCkIrnRXUM6wDiAJGISWhmKHwFwBa7p8wfpgm9QupIZSWoDUsN0A9yi3oLHAbSBuoHz4vMCMEndQLqwU6KLw40DjoEOIacC8MGYQ2aa4oOrUI7DkUFWIH0C5EqGwjsj0SKl6thAuRlL+COTJFF6Kbkp1qKFA6TB1fKnI6SKiEGwUOqIwKHYQM+RLsIFkAOj51G5Y7OjseiYO+9xxoBewj3QqcF6Y5fQwIK50EOrmAM1ArWSgiNmIdgDI2OjAb8AdwJmko0grplOU04BziPJQyt6iAWrB2sBekpFQz5iCAVRwlowDHrKYxSDJwCxUN9TyomvwBYBJMCQMUsB41L5WQahyoChINLC98HJAYICV2CfQa8ArIM1gzajKIJ1Ir3iMYONQMighqORgoiSSqAOgpcDcyFZgyWBvEJqg2-Ty8CV4fYz-DmnAvbByKsNcUYivkl74GzB66Oe4II6L2KVQluAPTpS0GDiteOXA7CDUarmwze68ePlwCSLgCOFgARbAQAEwXvDdmmAgq6hMYDgkXpin0FZw9yK9YFN4jnrWAOCuVHDEYBOQXGglgHfKkdiX8DgAovBsRCVQT3AKpvyAx+zFYLI6Iejc+Hb4DGDjgCGCAJgk2BsMfoLaEJDAdHzaEGcw89KADpQISOC+KHhALrRk4rVEyyokGK1oLuQy2jt4IiAKInCQiTAhaA9Q7MBG0C3ev6DYVvMoxMBHeE5Ca5APgFuQDvBTIJrQOoSBQCh6VYCgzM74XrgY0KuoyuAFqGPuFBqUYBow4iHVgHwoYaCWSF8omv4KcN5woMy96EWALqRxmCf2-iCzImNk5nxEwMaggwy8ICjQUdISVh3AGfDy1DrAkcJFYNfOOyAb9CjQ77DQEBtEflY5eNNYm5CWEIAwv2g2sPrs10jD6mfa31BD9KF0Z-CPsGmQYCBecHJCWOjK-j8yzPgNkByADuh7NuHguni5WJNQQLg6BD6MN2DONm6QhkDWRGaYuni8QL2y6y5dGG0weuhKRmt8UMCkyJ2QJZixaFmUIZ6MYCl6HISgMA0itST4VJmQidAUIHj+c9iNoBegy4iPkGtM4LYjsBqUr2BJzPAwhiBYYBUUL4yKcC2CRPAG7KFo6UAonGLiAK7TkOYYhEioICGwosgE2Ksc2w5hwNiUcxjynPTAkRCKqBPq97Cd0LAgUKAhCgR4G1ADIC7wbfAmZDhAn+haQEpme9BCMOMQe+jWAFJgZXZAtOBormo2sGJ0aCAEQBxkBZCWfPJApZhB9j4QeECmIAtgKCA08N9Q1xgWIK8QifwaGluAM8C8MGyCDSK7kBy4ohBmtqTkiAy7yK9AgmiT6OeGltAiVDWA1gDiiihwQHAREovY+eDgIC3I-UyyBmD2hNCFUK6YNkDMEC+YsFiEONuAP7BDgOqmpmRMIqNqi4HGmOcEcaADYMqQrTBXMGfOSNA7tCwUJxidEuAovhzJmCkIpVBoYKDEIBCR0MqQaMCPQSXA4IgCGIZibPC7wKQMJQjmyFxMaODOZjUkkHAY0AKUXIiSgKV8fKALRvmAfcgIKnesYoD+-pBSUPC9sCCsTej-rFOY1xDPwO9Q16BycOD+AlbmoKOQY0DFcCTAqZLW0HRmmGxtCq3Q+SjRIK50wSSAdMbIseDZwblQwkBXwOVAfGi2wAAgCVBwej2oKgh6AK2oF8y6nD6UkziEEtXwxjT9BuM2K4CncCumXUBb5HmAPjgJgNBYxsABeDOgi+Ay4LbAXHxNcDk49WghuLEQ5iCm+ESU4sS9WKIQdpg4UJPooBC6ZNkIgGBEyPGu-8RT2NmUf4CAFgwG48hHgCoW6GF9MJvU27TeOHY0vzTpsE0ghyBNKLNwf8Dikj3gYnQG9CqEWUDcQPBwFUo3+vugr6ZXRB6gbTDCcMXAGaAbEHYK81Ye0FCwfRDrAO3gyAYMMtLQewiqcBKAbvKzKL5A2NaAEDIoBdA1+q9YdbjXoGpIM3grrJ9OqeDngAHIDGCnEJkgZDhvyAfC36idwPyAWKDR0J-o2BB6QDP4T7CF4JuA4eA3uERy7QrFlH0QTTrH7A0g04IqcKs2SzDREN8QPojTlgGg9aAicAWoH8CIQJ+A7QChoOeBsJaaLLDiaOC7modgfcCGoPvYvIAIYu9A+rDVaN3YR+6EcM+AoE6mIG3UZPhXasjgy3yy0KJYYaAJmHroFR6CCMAcegAyBIG4lBhJNBKI7Sh8pPOAuCDbhMEA8DDs9K3yFSBCUOfAlbrJ5H-gYDCjHJrYS8LeCCmgRqL3ULZgfqTlwNkQOiQCVvhApaQ8xnoITCALsG7IZ4B19JKA5ODq1FrwV07BCFHkozC6AD9ExaCLijlQgjjtAKA42cJFgCpQM3jHnFZMoWAvhOSIurAGMJxAbw6M0OOAvihVIk3YHnZjZNoivihH8HQIdHx50OJQoWCGvGDSajQS4JlwVGCEaFbgl5AfwP5Iblg1gChcd+hIGpiQIxyvQJo28RCTUMKofmDboCMgc4yVZioIzsDG0PSKgqAZVJzAYCD-jLggbKAzNjTot3ghEIHWOwB2EIIIrgBNCHtYslaVFOA4HUAqEPTAXkA0UO0KVHCaFtIw37CdyFoIQjDV-NKkyrDkrGxAMKBkpFREJQzVwGAgIehcYm0wDOHnQOMcudSXQGo0XHr5CC18EwgWbMqwEJ4bUPIwzZAMAIdiL4gtwHYKQ6hciFLEoXTOQAxgx8YrFJZILd4sDm4ImlwSCK6Y+HDoQGD2ngS-oN7KuQJsQL802ME+DPpAqpCRYNEsDigviF94ZqAniNwQkb4woNbQmqC1OCpwQPjQbKagB4DLICFuoSCAUKjS+SBmmNKkI+EwKFUQOuiFgipg+xA+aJ8On2ADMJeQiKR+EJCAEERQIaWkOaAJ6LhAlx4zUCSgFMCzdvbAHbpmEE683ERewtnQtJDrsJ0iYXCIQOKyMKrwHrig0jCTQBFwZwBaJCC0ebBvNLUkR+5ewvSYxbC5sIeU2CiIoLmAt+SlIM1AzahfbBQaRHLuNCnQORAWICS4NaC2IFu4kmCMMJnoI8oWyBsEToyqYPjcLMELmDJIKNDQMDKI8PhpwEtSKggCAOPobO5e-GnkFsDwwCxA9hiJsI8QWvDTCJNe3AhoitDQ-B7EcKHQe+CaXP6Ic+AGWF0QJyTUalu4PpTH4a3I4f6FKLnGVIik0BVwCZgO6DUUCZwWcGQQESAoSPeEKeCn0OzgpwAm7NS4fUAssoSwoDhUVh9AC4DsUpbAzkBAMFrAicACgIPQ54G81PEQXtxeuO74xSB5oGOgyVD98F7Y7FJYoH-Q91AhIF5Yv0BCoKzAJbwj3AR24jCP8LbAUizXwJUIDACjYCxUlAhmoHWAA2GIsBiQelhvqF2odgCIZDpg8IQwsAb0OWiRYLXGPEjp8MTaycCMMOYwQDCo4Fn0OnCzcCG4RDaaoOrMlDhrhnuolCCR0P5Ym0BI4IhI0qgVcENQOJzIsDoOpAwGQMTADSIHaGGw-B5NoqTkS1K05lci8igEoDogVtA5sJj4sOiqJK08ADz2QFSA4Dj7gNlAZ17NQMhgfQC0PJj4uuDXEEpmuHSXoJCYQ0DZEAwQV9BBEOnQfqgSXJW4oZaSmE3YeL78VOnw65hczGkwH3gXHMmY5JgIWAMhaIidkFhgVZAQPsiRUeJW0AKgjy4ByHUEC1yudEewhVBNwDX6UUhfKL9g+aDdDEch+9xFYIIAfhB0YASg0EjFJk3oEpgx0JhAAP7hcEQQM7ZzEBlUe9DO9JVQvCA9AOrg0DyaoqZQ4+i0iGT4pyBCkPyAYTBNwLnEVcAHoFdEjxBYoFoschRbYBJc9EyP6IhsyBJQIIYglULs4HjCoNQBCD8gi6Am4N5BQSirQB1IhJHnoCK24kBemHDYWYC2fJBQ-RTIoLCaMdCOWB9Q+sAYWERw0nCeInjhIZDYCC7wG0RmgJMgmRBsQJVQo2pW4G7wqEgAcCPA0CLFlkMc94IrgIsaKmBOYLXIzCzCYAlEgehOYMnwtsBDQDlIrsjvUEHACUjN4CQMrH55Xrpw0iAzeOJAampPIDCAAcrfULSIVyJsXk1IeAgioIJoqojBQHOCNbQ6IAmqWqxMhBEUFPy6kHDAPRDRsGG2RJQmTGggQCwfIICgSLirNuHuxkARSCigjnrDUB5URiDd8HIAbLBwIKfChYhI4IJoYLChzqPwwQCovrfK6ZhDoTBA1AhHeOWoM3j5wEoAiLBGiECsjpCOqIxAEUjw0Jz0mMQAwJggbljuMMIe9jAMYHsAO8BNkNDQ1iChdJQ4XRASoHykC4BoEJ-IC4CYSEE02LBFsASwtUioSLdKKgiqgG1g9MRAqMXAi+BY4PKiHipXPpuIXUzvUADoVtBDQNR23UCbvnqEWOgJvP6I16xTeJ4RyEB4inKIhcDkjkB0W6CBqB9ciliOwH3AozBFsEB48tT0zLKoU+BnQOuwDxHMvFCwBfr73DR458D8oIrwEoynJJCALGQlDBAweRh+4dLoVrQk2IRwxbD3IpceUzrC9PpA24AKFJj4EUg+EBFAyTAgWK8UXAD-AAYI-iFBUGTi04CuYFug5QA0pIAhOUDPmPvc3i4a+OUQRyA11IXAZOi0eISwV0BHCGeATAhqsAG+BHJUVJWEDHSoIFvAApApdBv0EjDGoNbGctDBcElAA8CHjBqwjpDc3lM67PStUCVAP3IkGCKMuQhL0jfyoGgaEMb2GNiZtkmOoZBD8KfIuwBnIfMo4sS2etvwRWBmwJKwERIjVMkg1OhSNs6IGhp8IDDArg7YsPaQnBgImCOAvOCAoDDoJDp-nuL47bCtQBTAx8ZQ8M+o7DD-cLxgs9AO8BLgt+TaypbgJ4Ag0DNgh4A4pPL4V6jbhLjQ39DgsMXUKsy5AnVir2DWgjcQwiLlgLFA1xBsXh7wezAqEJbswDgohOTQNfya0N7KS7DScApws+iFwJIgvfDp6kewbaKsXlXYp2DpIE+YC+AfzJNsMDRTSEOoIWinYOYSapFDUAnoseCi2C2CtFHDQI+QwebIqESIg2ARYAvA0OAS0MtwC4DyogXwpLgtdJjgyRG98MxgfKTTQGTAQ1weEGDGq0gtMAuYOwAGQHHQrkGQaCbUXfD2aCEgt4B4Tsro6+hqNGKAO9jWMA9QLkglwpKQImgsFCJwDdjJfqkOyeRSNuJQAFCKwNWBGYT0TMzoAfBCkERwlZjmZKggmAHdJPL4GjA55ItwN8SlAKhwGwTYaNggBYh9UN+w74iigV7AEiJD+HAgrugEwJaBm9QDQGx4FFjGICGgvVR0CPzAkPCDOGTEmuCleG1YqpB4ZtuE2TCUGOasWDIOOClUYuQ1QNKuqxyvku2wGhCpiGcQBiDyQfo07j5hQvrQSSh5MC103MAsVGVgN2DdEvwejhbgsH0IR2DcAHlhvGB4bPjcbJjmMKJI54C8MH3I43he2HKI2-AN+nJC5kBfYAXgckLTQFfQu4aBgd6IX2Bc0DnQTiFrkKokgSDfqO4gNeTokQTIqOAiKCbs82ByFDsC5SB5EPGgGzCn8AosXk7DUD-E+qieRGRA1Z75QEP4kcDtULHAuZy-xI2S4xzJ1CxklfijOrVqH-B0QIDMlDCcLFjg2BAWiEWaSfgJMD5YSUAayIII9nBgoLV+STRBUNl+8hixQMRYmKhc6nZQvp6O8PngLQAioNKum5gDQApQKaDMOMIio0Ch0BywuEBu+paBdvgmDjZwx0ggTog+ehDPkKcAASCL8FCwMyhiPsTQ5NDtIFz+1URt+J101ioHxq+S2GhdskvqQLi4oE7+LaB74PxAGwzf4iVQXEBE0lIs-IHB4edQfUjGMHvRfRDZ4BigwQi9WPhAydDeJsLA6+jRoBEo2liVRKhQmcCZzAlIbiGsQAmEE7B8IEXEhkDXhPWefIDrmJZ8VmKzIugAKEigMDIEu8gYmFzATwRLECxA5XKfmPogEZgD6D3RzOgVFPmA6+jigBPQxOD18HdAYNJmMJH08yC2wAuY6dDQIAikvCC5kS7ADHTDHqEwqkDWAAgE5VjtCrrg6Zi6iHb4u5j+-mKQTxDTgAwEa7qpcORg6ih+4Zk6zqi3CKO+JxhsRHZY1LALQMWgYeDOqLDoZZq5gA14aya5EDVY4GjEiFFoucYiVJUUAuDYODUIbjRT2AJsAaDCFk2ih8SByILAuMjHICTAcBSIINZkKkCWkOvotUCDcPKkoDi35IUYTeBsRM-EcBqoRA6YEVTisuPQ7LrUQYz6pnQYgPYYWQS-NCMkHRDa5O7QCqaLhOmUGaAVxHV8sISUYMJovqCuCAOYMkA86NOAndBK9Dw2ySCUCGOw2Vh8oEC0QEAxQAUQp1Du8ClULaDXNDSk4sA52uQAILCwhG2k2Bal4LrsWsI4TCkIMMCAoNuQGkDZaFrwzTAooKegK6BW4CBO-2AUwLg4DuiK8BXqgTKUeCgQE3R6iPeClsAy8LJ6CbB9jGdQCUTkAO1Om0Az4bgqB2C6cJQIawAaYKXkhNC+npp8luoN4JwhFUBqOFx8ISCFlP8RwtGbYEjQvXA4wuxoHbrEONwKecixYM0iPvQ7AnUEEBgoIKpgagJlgM709841MStOJAAegWGgTlC5iAPivQAf8IkwyCjnlIuE9WS9SJdADSL9gHUYXFLgdFokp4DeUu7wQ1y35NsYhmDmoNTqZ+AWeBLgjYgQSD0ugyDdAIWUVzEVKLtQDbCaYCuw1YHpoFvABLD0sPvogbASxPvYr7YK4P5IjvAJsCEoQKAFCJCYKXQmSj9MVJBbuJPQy0BVMBfAGNoe4gJsSDCwILQ8EiZrrlcIVIgkodrAoDAx4LAwgRS2OKsQ-RR+pJFgv8QfeCpAlLpvtg846HzYIOUggWgE+F5YbWCXELBEV1CNtFbgDui5wEDEe-TcYuTgXtwkEMN4hbT-VIHgrxDVwMBQELryMDmCd6igaGFws3oM6FnUaTxztqkSTlAMAAdwRcB7QJnoy3QyBJZQjcAyQH3enJB6pu0x43iQaKnQWsT66r2YgZCEaMYW2kHRQGYQCNCRyOz0XygZwEWAHPB2WFicUyD16BZwIYYoEOSot8jvIKhQg5aSlpYARSIsFI-IboE5eB7OiGQ6BGVR7WxnYAdoSEBuFIjA63AgnvKchJFn4JvEI8pALCmq4kBNKC1AFMABuHEQkVCu8PI4LLBN4Sug6fjyYMQOaIgKcP2gwBpFZD3gRDCE8nxI18R5EGGqjvCDMI7ykggGwCcMbHQO8PrAwqD-cI1IN+bGQB82r5JWiptweJC-TL1Up1E3rtVEvYDl9EMaKa7fFla0M8ikjr6Rp2AMBE7e0SBQsPqQMFCYWD1a2sB3qAGguZExPpcQ2uSbsDHQNxBmsQnEvLA+9OCo884OkPTMkwisXtOQvZB1zBmEoLxBqFRqJ4jmpiVElQjKIF70ETJg9kAwrGA2yO7sECCRCMkwVrqawAmYDXhMERYQ3sj+OKhIU5jmEgmOPeDRsGmgPdTIkXHY3OAmYLyIiySIsMfuoMSPUPSQrLBqcFwAuzgeTtrQc+BxgEWOzjbnYO4ogJDkMGoCGgh7sDB2XQARSCK4iEi+xLDYLTBdropKOtBEKEMm-IC6nASwKcC1iDmCV0Q6hD9AarC0iGzwyKAjqNPR1FA7VC8woaTRvOVhgtDm9BA805BglNkc12RSLM-ALBSNiPEwKDCjkFWAQGhKxAvkupy4OLiQHFS2cIWCiQiASBwRXUxc6krgEZgiOLnUzlxceocgG1D9FP64uhgjwJ1ILHJ-0BOQHIDghK4IlRRjnlGxH3jecLs48QKSxLwwOEAGwCjQfHHOhJF05qBAtJhIyKAI2vwwAohXhv3YdVYTsKKg6WAlOIQSQDDYYR7giFR5GLtQM9C9QBn82ljWxHoIvfqDbtLIoCDu7BRa7WDp-L3kEjBEyOO4rmCDsINxy2D5oANYeFDOXOfosCCcjI6gp6AjVCXC0kjcBhKAI7BcIJZIXnBPIMRQRFpBNFDwSdA2GEy4NSyRyMXUU5jCfr1I+C4swMuoZ2BmyEXoQHSSBP44RPLw+M0i-4yYXJkwhGgfIBoIj7AWILQGCggJINkIQ1AbQCDAo2oIwptg+2SvFJqQJsBI8bHA+eDNIia+-v4-RJp0gKBAMO+wKFGD-PSYErCyVrAAdgqiyHqg5yA1+qYIb1A0UJOAPQC+KAposkAqgDfAL4hBQA2QdQQycIFoXXBz0EUGaxCOwDmwKeBrsJRAW8y2dJawp+B6BuYgB2CpeuzBqLQ9sNXA3dAaCHeAm2AeTiusIow5gMMgZzFMcpQwV2CCwFRExVB1WooQdQQGsDGgw9SkuAHwwQK8JAFAdQYHYLrQozrBMPXgt1ZvUE64x8YKLKZI-jAy4KYIw-yeIh4sHGREBP0UIMD7kPQg8tRhoP4wNtinnsVgNnDkYM6QDZD2oDNQOeAwNM0wEXA6hN3Un8iXLEWwPdiDSLYAFFim8CQQxOHaSJyMqWGiSIng85ASjIYWwrRltGPAQgCK8BVEF2SdeNMYWWAu8MaAcMAiWG8QHlTeOHPI6og-BtMQLkZjZKNI6ZQHaEfAGFhFEWdslNgWEEvMn2CSLEQE-MDzKFgYdHxSQF0QayajHLwKpPBEiKZQKIQiUocgxdSFMWmgY2FJcIfgYtAEIJCw4rI25BpAp2BjwETSAQgL+iXCieCY6FmUNPDcUE7k7vZggIghFtBgMIHqksDd0soGT1B+QCpQlhBnbIThi4S-uhLwmAYSwHLQe8gLwBRYHEBSqDvo0Ahk0EC4JkRmgIKx-jDOmNta1IC1+M6KRHLsIB7A9hhaiA361pAeEGAg9kTEQBLwukDqYIFoozrViGDg8BBx0N0q2ZRR+C0AxshFYEf2MRhoilrUbqh6HNXCElGskIBAKcB4wFcwWDAfeHoAdLRuqAvkJtRHCEBApXwWEFGI6yCf0rYgs-EvKD1AATRcwGJgKKBmbEKwjvL0xIEmJdCqJKqgw+iDvgpsu5BfZH1OEwhWpFAhiFSYENcoZQwtdNTQLFRfULRS6SzF9lxM2-TaWGs+FSKk0CV4gTA72FlQSuDYOJQ4kzjh0CZKQKgJoJtA5jDPmn3xv2jlDNbQACDUWDQgmtAKEJ1AZFz92GAwc+BElKYkChCBXEn4ERifwOpW5ajViN0ED4h2UDkJToywrLokUpA9IASqMIDBEGOk5ph6QDmOXQCafJ-Id8BqIDTmQwxX0FmUukAsINwARNDPIKZkcFhQ4IgKoL4m4BkgI8q3UPls+DDXGvnQJEbOiCrBDtx44PQoeUgkQWC214DNIgZAe1LIIP4ISiCc0EP4dIgSwBmQfWCRUBcgOaFwwAOBLqw9IGjA9EjfSFIsv6xfIJDAq0ifSOiQiuDNkI7wLFSnAPggckAn1utANOTqoIxYLGAEOrE4afzGiGiMDbDq0KXAXdDQllEg5UAM7H-A+SBbEMvw8iBc-us4NFAooNUIIaC2mHOIOx5mSM4Edbjdmlg49Wi1yDqgJaImUOKy4KKsIJMQjyABcCt4afwhUDcQRmzU6HmAGkD1aICgGhDCQGsmCOQ5qFWgiAwvsHXMxiDxAsXA8yiNxvwQ2MBOUDeATyKLOA-AM-DOhPnEM8ALIL7WoUD73NwQtnQ-SMpgQmpQIJ5Aj9ASMHTkqcg2tgWkM4TzghcwF1A0-CMwe6ivIPIYRiCc4LsQjlh7AHIAiaCtgt0Ia2A6ovugeVBk0AEgbkoa+FBA-eBEyAwgP+wt0OKy-bBK4csQPrBEuDluEJZU4Dk4OEIsFNRwJ0wurJwsbqo9EJuA20SUmDpwF2SDYKpwuwDg4FvwAog3wObIbrBaLBOyCcRu4N9g5Jj-thqU9mjXwBbAgtAHeHuCFd43UNFcQGDOYhLxFpBvVsVQ3YBvUG0wGY7Z5hAQfSB0iA9Qgbpd8O9QQYaHmM420xgzCEvCX0Dc4LfAdkniymaYWjC0PKlwMFBxSKhIHhDDXPzg7vj8QNuQ2GAWgGpAnIw3MBtQcfAqILtE18TldFgUrQQk1Kl67AyVRP44MZpP8HwgbvAeuP0UBgLtMGXwAECumOjA-1B6QKXkSKQIFGIA5TCjNCsQlnzXoOyo9TDawD9AGQnhEBNAS2AFGNnqKSBLwh9g2UBmmClUDvYoOPrAPfDKSKOcsgCf-jawfWggbN4mn8C04KXgAbiOdLDiwFSiEMzyiBqvSA3AZOjXSIdAk0Ap0MBOU9hZ0TPQ327bhEZsCggYmGsg-ZDoCVggd0RRwDsAPJBkaM5iHlTZaBcgvhKKFGTibchkkK50nBjAHJCAVFRMMOwwfdiWULpAPqSiwnlIxmDUsMNQ6fzVCPDoMRgnDK1ACgiGxN+AfnTqdEUgyxBFBiICx3A-VL7E8LAvfnLYsNTuAN7Io2CGVmEw3qj9YD3R7LoakC3EveSPyJOg3ih6Fp3a0iB3YDzAyFDUatOgZETJmHViHrgswAPAMxKleKzi9gR8SPlE1LB4TKnIYaAyyGYQ1bCtmPI4SShWFLkQkJQbcLkSBDSYAZ2ALmBdAMmoukAm9lWAu9FSCGGgMGRIESzAtcg+9O1cvhzZIGgJcqDqzE0gmuCDvmQg3MD5GOrwHvCU0VcGP7AMzFHAZMQkxIkwMqxwNhFUSiDHiBhQ0MgFgBTA-3yC0BdQKBBOCd2g0VDR4GGgUixtUP8ADqCK4E06yRQlYPxA-bClgIWAqQ7B5AEU10C6og5wXNCU2GpoQagJ3OOM+mDRvEBo1LBjFLrA26AD6FAY04JawFYgQKzYKM5AIMCl4KfelJh6amTAdagJRDeAhmiSqPTMhdHyUAKgh-qHQNGwBBazIl1kYrImROLatKFT2J0S1LAOCBdkJ0AyKOhQWZQpULh0fQiBujDBtFAnzihcqfD9KI643sqfyAQg0bzyWO1gVWTUsCzAreSbyQxgJNjHxmdseVRK4L4elLBRcecMOvCm8A7+FOiiJEWwivA4aOQwhSAYJMEkfYwvTiUIoGg7ZOp0wXBMYHe+26DW8LoY3fD-wJAa7viLijIoACjM6MTgyRRZoqSEV0Q-9tckqoAN7Gjgj9DWxKDRcBSDgL5YJOA0pHu4KqBuIITYgdYPkKNAunBcTNmqDXjjuHiKfwZi0LwwdTgoCCCsTajQCI-mieiwAlyInET0wP+sJ-ZzGLuwaRChINqJRbAlXgOwbvANMAUQBuxdyJlI5hhEkM9oDMmsXl1QCZwY2GdguVDNYGTQXNC1JBCgC851gPbA74DngPPOp5BuQhikkfDtUEq8xaDFIEmgwcBRyUcUeWDboOYg8iAyrjA0l7ARkE-wDZCQaPTE3Vi14P0QTowcqJEg9TAmiOekNuT2kClQrOIPUHIYMoi3LKqgt9iQaP6QXHyYAnDgiSAlQCfweJAaoBxkiGRk4tbg-4yyqODA2VieqOpgM2CKsM6wRPF9aNxIt9gISb80wxBBiO1QcIjPkMsBWYmYSBlgECCtMOKAYTTN7q2oHnZluHzAJxjBZNOYmmg-NCFQvWCtQEZUJgIuavxoksARsBoaMwgXyen8heC7SH4IvjDrElWARMjzoCRo-+g3+l-AJEAYlFrCniBmQCmokJiQgEq8xSYy4EpGedCxhNwKnMDsCXmACAQZxCn+6SCTsClw8QLmoKJYNASKINZQddDecI8gcsG6cOy64rIUQDCgW8hYwE06xWBCAHqeUsAL+il61pCvwLLYihTJ+JFkoqDgwApWginfSPcU3nAfwBiMRWBF6HWgWUC20tfEJGitBPDoyrgI5GCgp0CFQOnIk9CaoKb04lD54DhAari73hzA17QDcBsEM4gocG5AabYE5sKCGmKWABBIk+i2YIuwFMDsaNpAPsTWdEKq1Goy8JM4o4CdgACgnYBhqhVUd5AISETIMDRVZPKBmkD5RD4w0iAZWObUOJzeiF6Yregu5C1ArjBgwGRAMbJH8AERegjPqKZIU5TuQHlw2UBWqNZ0acC0JEVgYLQ4GCgUB6AuxHjC4hBTQD3AorE5QB7A6ijMSQfI5KD3UPYEf+BjDCQUxoBEseMp1LDO+MtIPbpidHxI4OAUoPbglJhboEKwfWC6UMwQXvqXYEdA68C68eEsGKSNiFXo6ja4LCl097qZSICghVBeuOdEcTYKsGB8hVAlDAnEnCzzIFjAekpPYPtAxvAI8LbAeDwHYLQxhYK3wDGyPxAo7qLA5ehigKBoghFzULyuCrAIIKl6CGItfJPyIywF8HTC0REi0OYYWM4+ZCJwAjj2ZqjSlMaQQEgQwiIZWK1AfWjQADBwnUhXRE3gqEQq8BTAQ4BQRPhQpNqpek6Mlx5fEB92dvQ4JNjMD3jmCKlQqEj+kD5AfchViETadGCbcNi47vjEwdOAKQRPPjJIgKD4VLJW6qApCMJGmEBcek+YZkhEkNsgWCTJFJS0x6CftnAggTB3cn0AggG+IMbQCUyr1mWAJZCJwM3A-pF1uEyEnDQi0EvSX0D74E9g0EhsKE3Y0abNet3SGVhgoHmAUdAClAi4SkYF8N+QobwnqJVY0aAAKJSQLWBcCMo6oEB-Pl785Ih1oGAqqJC-run4PKEQlhpKRNAtMGW4v8SJoLjQIsA5gghg7FKmdEXAIBDmIGoCNcAj6LeAVopowJ-iXuDYaHLAMwlQGDSUnUGRuLSoAYS14I3AHGjBCHMYBCA82kBwGfBJwES46rBEyLzAcghZiQXQlMigaP1Gf-wn0FqAnezhEexg9uDJYmLAJABOjCZM3ZSFEeksbO6aoPBhhwiF-iQYbjAZoJOw2DgC4P5gK6aaFppgV4Cm+H6kNyDmEmZwuNBSqPTIQLiAAiFoK3iICQT0QhB07sYw2qA0sJZIhmJjQLFACZAHsflsXQh3vi8oq0gVVAWkS56wAopYDigQSLwMqnjmcTrgFoBZIEB4KEAKptPAoLAaxD1xjfKZcDWg7hBcAL1YFxDgICb63Qz54GggGVjhcDPguECdwAGM4XDgoN0I3sB70J+keBJyoM5ccfBhQubAYCBJ0AKu1yRg0k-AtxgJAMUgI8DZED+i82D7hPKcOrgVShFAzogpDndAVRBZFDhIfqg1iS9WMKoWMd0EsDAX7i9WFJDIoKWAlQjXCFyk71BmyGq4IlRDqHZMatjmIA8gyJJQCA6wqLTGKMJwqYi2VCLA2IhjpNAICfG3oGoAz5iRuF8QHqQqMJbgpqD0YD9ETSD3KP+sjxCPkLNwyyoVcCDQQKj-gClAr4BArKeIYpBQQIBAEaAWjNesH8AghLnAxKEcQA2QxcBt4DhoC1j5gK-etFSdINOY9mDC4IOxP0QpsZqOXEDJYOdAh0CK0JAwNUlqgEdgniCAKFCg11pt2GYgvpH1ZByEuqDqsOKSSfgPIFXWs6DmQFBAEaj40MVU5ILH4PLUOtLq0BO6qBQ4QNpE8hgAIJTIjXH1SAQgkcB4ELf0OoTzUIMwzGAl1iRSkHDXVKQMBMgprrXgYXxWYDu0D1YLmPUwKdA8kRYK8tTpsNZ0KUDB+CumZMD7QLfY0yBeWKXAAEANwLqcKkgcEGQwUEAgtpDAuUC67NmUj-CTWEPwn+hxrg2gyqCdgOUYhyAnGI-enaDbhIoE6dSzoA0QaiDw+GsAG8RHwon+sBCIsCwUa7KmZOQAsCBYoK6gwYCBUJ1guqBb6vtwvQBtyDkwhZRqCLWB2Ig-9lUIJxCukd5oBsCqYEqQ9OChtJBAVyEEGbvg4pLwmNSkhSgniJismpCIaUM6fkAFlF7YHRDGYMeIfECmdGmQXnBJDmE0uMBk0CWY7LoJRBoa6HDZcGREXnAMQDhAvhxlYGmg6wDqwFkUYeDuCD+AE2AKULgUUmB9ECcMkDBiUEz4ZsC-unU4HvBtpDBQL4hXIthAZPB-8IamJZBjwHBYAODHSHjgMtGHiW8pdeBWFO6wdTi56pkg7bASoDQgVZAnEHQIpHSrSOeUwECw8D6ko0gKFBA8IoxpPBZA1RYVAL-EE0B92JeA0NFM+Kcwd2Gu0BZCVcyacDlANmgPYBUovDCzSSigsTgzgInOrKiEEodA-pAZ0PaiOgS0mDnQTxDTKEZA2lAZ+ljgJMDl9Fgo6tQWQlvIqXCe4CKQ++CokI4Q2iCYiNQq5hgQukeAmiIsVM3goMAgtDHAw0BOEPBYkwhpoIFQPwF68M7kGFglRCrAtmDXoH1oFO6qoMYI3sD9IX5gxzK9mEKwPUBngF7Y62HF0sroH0Ap0GoAgfK3GT9y6ops8POQb7B3JikgemwlkN8BRcQyBJuwZ3AySAwQ7MLTMNWI9AABFC5gNUCvdrf0RUAxshGgEDBewndQShJ1YsWs17QGWLGE-khqEF78g0jMvD5ozrzUCHf4MkGPIHWx5UCpQP0OoMAV4Bq4kizCEJjovXCdgGUQ7igOoLmc5cD6qEsQzvicoGTsBZCf4H-whYCTsO405nCxQJZo4xjcyMLwtMCvSI4IgbDbhAD88DCSsIjqtyzRQDYAhGirgBImp4DtMG9AdcYf4E3gQ3xoQbmc2DHwMFQeAUCaNjBQlVjUQqOi3sri9K8g3+iYwKLIDphDYMYg7VBCwK8U85AK1h-QKsDnmHhQzYDRwONAwnz8gKVgozo-sIG6kGjBCGNkizZe2HoAh5IhMPggV0QvgCoIbaSRUI7IdOQniJBEIWgTqoPQMKh1gJAQlywaGlOKUSAauK9AYNJrgP-AZWByECgI54F+qjfE8eigyJdgIiDM0AtgzxjW0H5ASyAY2KXw1ahPQAkgRLiVCJsgOYDRwGYOSYnXGEgQypAicBhIiAxoiMvQ1bDtOsDAXHwiVDMo-ABeLDOgQMQqFlmU8jD1ERyo9mB3yuOIGchLMLmoOwKWJPCwWoCjqLQgBpC64MWw5hIEaG5gZNC1KE+QTBjO+DoYt5kLmLhQ4Swl1kkwH3g0QNvwx0jpQIeMJuxSNFsyt3id6CqqzSJaeslklKDVmg5utAQJQDgg3QR-eo9A5DBJgKeRyaDGugFwtiBiAAdgNOQroO04uUwRsF3izSC6AJGaHcBAqJnY+DArgMfgupCL4BnEBfDCCNX85nAHxvhUWYjq6hDgZjCAxHShNfDfqD6QXCC5WHOI1FB19Kfw5qhDfFCwPJz1cNesggDE1m805nyddAlIzOZTQNSA20D7EHesDTBpIBgIbdg7QJzA9xSQEDYYLUiaovhU4srdNN00ecDowImQ0shrTFI0JmA66Msq3EiS6h5kxClPRIPg1gC-NIDAMKAF5qH0QpDqILFggtBYnCt4NaBFjCKgDPzowPtwRvCWwJmAUdAyULuAq6gDSOPID3j+gvYELCD2GAdADGDJYgVQmFS6cGb28JiiyD6Us+AioNRQOahQoN6o5CiJAOXoaIzYAP9QISzddOlAlcCFwV9cvvDcYvFoNOjFWQIY13oTkBq47bBOqDkQfIJLEMOwmNTd8KY+vsBqsN9AqzavWBOOdYIU7hcQIeAzAPmsFUoTiKYIJqC2QM+c25APcfQoX2RDEP+Ac+DGgLogvEB5sOMQ44g3EJKAmxQ7ILOAC1giuDPktSgzgPTAjACeeFqsCUhFInpqdZZ5oBGg2ha9QMbAxLBtYJH0ihShtE6oK6yFIOEsBeDofH4QrCgPULgUOYCWfOsgIwB1WlUQlLDHxtEgwiRecPDC8vaDGLr2JDbrwE84SiBk6D7E8mBhsJhAy8DdZMXAYarzYNOgHVivoC1A6nR9gKeAYISUxsecpujTgjxAILREGM1EWJEo0FigqBDNjh+AZcLnqA4I7SjgvsuoX8SAId1ANOh8SPogQiAYWSZQ8MJOkHaQcEBR6ESgKDTufs4AOyB5yIiBkoAeuIUo1WjyIA3iJKQCwOYwXvCPQFPgoMgLoIZ0MaBDGpQYx5x1qIuI04B92N9I0yjisueYvcQeKqRAIUDINP5GVOAfzHh8Ewj6wPGZIWBoSP5A9GAcAPrw+pB9WCPAInDY0LxA9aoSMF78pFgNeDawEXDuAJMgJwwdSMYw-eD4DDA0a4BSVOnh4WCcEOtAMfDm-nzQBHaqJBoQJVqniPKgo2oTIAuAESiL+DzwyuC+wGjAkcgrltuEQ-AJ7qGWDbA3gE0gi2yvYLwg1NBEyK9IYQ6y6NYgWMS4dEEIWIRKoL1oRKA1qKyQ+raOuNyI-wD5GCZAlGDnmEwIDCDXMVg6oBBsoOtAOAAk8K8x1CpILITglxz8wI-QuuAVSvtQ7TqNSKNIDTBFPF1M9aL3OL3kuED5oIGMMkgDwDKkHGTTmFJwpiCHcBiU8HBkXFQg5uDxAk9gkdjnoEiJ0LBpqGOkUOA25HvCXIigMAfwtsDU0JVYY4IlREUkwwwE9KF0I4D4KMBUcgDmZOve5KAN0JS6aWaWfHDkCUh-SSogoGhoIO063hDoULuwpvjXIMXUwhb8KEVgNUD76A0ik0BJjlok6nFd8apa6MJczBrgwqjawENgg9TyKIDIG1C44FowInBmEOVgmhZoUJuw5mRNNmnAETAuRsnQpLi8iOSYc4A8wA026IhRwGjAd+ibdDN4ozBwcG7yaZAmZAKQsXSR0MPUxQIFEE6M7yBcaA6YbiFaJI6gxUCnwvCEEKjlWUQgSSi+uBtQ5rCuYPwwDziBZNpYJZCE5CNqeb5a4ByoP6CVFDiqDAQqkOVA1yT4MNyIgbpIiCEhPkBqeNFEyo4kQCigL4xhkN3w71CAYJNeFGKwIK0O6wJH6L1IwRCAYB7inmieICHoWiQJRANY5QD8CJro9OCzwqAQJmhlQPoQ+5DKoMfSDADAiKTIWsKUAPSYTmAWIM1wLkCPsDJQpiDjeO7wKISRaJFQf8lz4OCg5JhP2E6YGyCx+CcY2GFtogBAUSC5qONM-jhfTP4gdCCBut+Q41B5cGPYQ-Dl9IXgMyiQwHlwzKSqiE7gpCAGEJo2oiC9YNDYl-7HclRUfB73gVSitCRORpS6K3i9wDpwk4C2ACFEOnCSmIQcv2BTeCgIeNSmMMog1mhkEGHWedh0YL1YnECOoANIIei1+N-g5IjaSKZ00Pgz+K9gBqxrsIUg48iUINMIjABqaOEgluAJkMpAO1A3pipgFRiGabcYhmCEpGmAU0hbkFYgwb51PEzoIShXau2wbvASXAdopfCZIMYIJKGzINAQotAIYgE4YtAjABAMuYgRmLzAY9D3YFWeWITCrAEImPgj6KDwpVCz0F9ieLmGAsgQCcS1SBUYHY4swO4gE9CQ5Dl4vfCxnKkOpVC-xguEizioFFaK9tB6AIIQc4C20iuwihAndmdwkBAtcmOk7jDoUDaxCcBe8K3I1kAgQLX4XzjoGExApVCk8LXon8h9pP9wDTAeEIcQZoAF8IuEn1BAtEFpSpDaFhKYLkaKWBvQupA+RjEYM4C4oDWyokgyiGkgRzAEaDzR85D8COrZXsCNyB16r4AQoPng9aA-QLbQ-pBzRHIQTQh9AF7gE5B3ykIKdZKhdF3Ie8wcoH3YDBCEwN+cjKhEIHYK4oBXYJyMRzCIYG0g4+gzYPvYTwkf7EMaj5DRINIk8ML9EKqIpllpEIWUWWArcOPIEmB6WpqIYNJ1zNZqN0Aavp-gE5QakCPKPkACxucEWxCWwCMweY6u3n5gTUAGIBPqyxAQMJMIJoiHxAE26LTghMMgnmj0wBoaWnrI4CTYkmC0UAKgrgBt+OqwG2rHdK4IjXD8CNQgVaA6hORg5pLGCKyoupwzoJJgr36B1t4I+UQWwKscCNrvgKzY8LDl9m2ilDhaJK+AsPoVGDcQX0B-0OXAgMQ5MANYiBJElILACtZuQLO61QgSJi6kXQAI4LU49UDOBPJQMigqkAfGbkDqwOBAmqrngBdaXkAQlj3ACaBmwKygR+gk2LzgxiBxEKngmhYaygOAZHCOWDgYEa4iLl8op2DEbudwA9jk0IHyJkpYhAfYTuyHgPpgGVhpZh30p4AJxMNAtpipcFwOUEDlYSEo7jSlBJgCR0SV9DGAVXorrM0Aa0hNwKQIRHKY+NWwediWeYYYEOBy2GoCH1LWgbmwtCTXerR4Naw6dLyIM2ACoNzgLWAUoIzhx+z4XvFAi-iLoAkw5wRMcnGctfh9wPq2fRAW8FREb7Au5BOyfND-rNAQuBQmSOiQIahRGfc4WCjGNNsQ-B5iwObkfEissIv4pzD+EPbQIqDBJFzqngBGuG-IE0jiQLSIk6jUiBEYK3jVRCQACsBhsLO6LPyD0GLk2UCotErg7DBdVNkw-Ch5lOSg9BCOCOzoRkDUtCZo8+B9AJ4E5KCw2JIskzj+WAR42kgQwF0QeFCKQOLK94LM0NTQa9ZwwOsAfplFBqvwhmIbMCyoOUDNwDJJR5av5FVQQVCWgcggYZD9EA9QmkAymWhIgeCp4Dnkh3B8wP1AJvZNCEhAOdAjwCwUlfieGN+oTrh3UG0wFO76oMACC5jtACMkzyBLUCKMGzicjDfE9yLQqCiEHVCbsCpARhpoQqLYVWR+EF70o0xM+AUQ3VhA9H9EeDweoM0AJxnwAPwINKD+8ANIS8KYBqGg+UD5QKDEhLkJnMt0gqCIxJUUr4KEivyMLeAoMLqwSmZfoN-QDIKaYKwo5nwcQPsQLHD2lCqE-0HkMDpgCCDyge2A1GqE5P0URYAdQI1wlxxaEKvwYzKeGLJW4sDeQOEQGAhxoF-AF6A+lJzQpkA2aI8ol1BsdI2IG9DZEPZAllDFuT6Qj1AoSBiioBIiVEBwkzh-TnIYwSTixF7gQSirNg7w9EgT6vYk+0CC-r9MLci-MHYKOCCJQM5cq2Cw2CuI1oKtQJAgoMTK5O-w30iMEkGhAciUOGOwOqAoPC6xD+Dh0Prwwtg7eJOQtLbqXo+wQHQqkIdAgjgWWA6w-YpYIOSo6zjkiBdkRBgNwCoQxBA6wNOCCYRycWcR8JxQan4QR5QhYK7IurAOKrYQvhBDmKeGsZQcwDNQi3AFUCKQmSCNIBBIQ0ibsMdodHw34Ngg16TO5JUImEhvsPHIqfD3yj701mhENl78zCz9RjtA9pCs4lF08vA25OUo0uFtUJceYCA70kOkqHD0zJZ8yVAY4JyuGrgqvgKupYBIFOPI04CDgK3SvvBkpJAQeiA3UFM6SxBuFCAQ2kgcqA6gXvDvQCeAehDKSKAkACixQJygTUiIzl1MeIr5rMmomuB0YHeQRDiY6KLgowxkxCb2X8Bk+BImOBhWNgOor0CqgIoUgMAUkF1MDpjFSCg406DjuK+wkpD9sCRo8NDvUNoQbvBpyDdwVwhuIR4qJnT+WHwAoDB7zGscVhS6ID3AxgTJmKzYl-AEQOLYzsCR9CaglHiqwPzoaRBJNA5wB8iZkLTEDADYiSjgvhz6qNFga7rlbH1YJmT3Iq3SUTDqhKLwFRiorjSUxsCRaAos0UDIBg+AHFiPiD8Q9hiokN4IOEIHaGRI1nAYSDZwWxDgqM7kNfr0IBfISCDBcCAQEijw4jUIn5hsMJZQS+pHeEvgarDpaNQIweTc4HIIjYiPgGQQIywp4NoWKFxnYLDiXeKR9PRI0+CVYDt4nMBhqgHsX2w6wEOoCZBtQNfEaCBzpkXAsMJnbILQeuhFqLaYFAgaxBtGEjDwxEXQidBJMGGqb4Q0sFyk0BCo4DQE97CbiFW4Y9DURlvwTVwmSO5AZwiAUG-IYLDFlF+I7gC+JIagDuCekWuySBqKWGKMwsCvtPyMmFyHwNmAjhAoEDEmbpCYbo6oVRAsFClQIISsWOrM0DBSqJmw4xxc6mZw-ZA86Euei+G8eOKgiKSVQsfC-HAfwEVgt8hbYAjwatjaICGCHUAQSLtEIjjsqLcYh0CLeA44hHDboKngTqgUGpzAXvjq9MbIIWiw6JBO-sDb+LDi25BFYNyIlwgtMXBAqqHM6NoQb4SGYHi5MIgNwNGg3spo4FWQvyA8SPBAGBizwhs4eFCfgHjAsPqOqKb0JXg0BOCEXqCMNpT5osAmwMaYupCZ6NZoGHKhaJEQnCwpgGl0KyAhVJUUKITghPwAqYjWxvRAgWQ5QJCA0PjvsJ7ScuZ4TDZoXMADYcYwmpBd0I1IRtDyQHBY7rDl6Drgh0C5Eoc5RegATobE3KQniAYuyQoIBCEKxihFgJHwMgwgbB5AChTVsAUgC6hcUvSYqhDPzK8QvsAsFLAkYuQzeLwwCWgFIFKp-hHh6GJyeyBzIA14ivA5BdTQApR3UNEg+0CPEPn5bUCxnHtQ-8jtOkTsb6B4ihIw6sCN8t6of0QVVO-5GNgJ6AaQtcAHyAYIQXTGCISCtgLZEJdQuVDcEP2Qx0CNSPRg4XCVEKxsK4CN8pOAtjB+pAasT1gaEOJKfbbFYOHQFsDhLCbsl6AUAO2ibqihsKi0GBhvsFVkypBCofLwqNIlRoNIx0nkMPEGsFjGoHyg7mAcQJEIb5BlQG4ISECUGLx4LqYJMPnwmtAihFJg1AX0sCn6WyBIGuWgVZqBkISkmsCcLJFU4+idaTrorjBSoAeAYxR79BtAb4xzZn6YbLBnoOOBGyAGrKM6vNQM6Nuk-jBt8CHo0JZ9WNVEvNRTOvQw6LSz4NXwjWAn0AuYWUC3UA5+08CwUBsEc0D-rP-EI7CzIkmgzYBfOHPQg3Cnlkga+NAWMLx4aTBoIIbA+znZgZBoEEivwMPq7kjbhC0g4tiqMC8IAaB5MGmAuSCocMZwJeQPgPmAifyqoM7AabQ4wA0wJECpUCgQ0eAIIAE4O8AhKHjO2X4hQDYcRWDeYkwYHlROGGo491BhMEp2p0T3OHqEXsBoYK72MuDUwCZK3uxALOn4wnDwYE2IR0Af1u4ACZgUILogNXp8hu06CuCiWHlyMGQLoFBqJmD0QDoEYuDSqLtwlcDc4MvwZWA4KWPE1ajIKA2Q0iIuRiMkHBBfoD3Y9ACH4JHYZa5zoPAwlNhQjnrgJrqPUP2QsAi8gCioolJDQF2y6sxyRZFUFFgjHKWw3tQIMOa4S7BbzM7kqfjLOY9Aw0BjsHNSKNi93kBoi9KiECEKWMAedrXoZWCHQIdw48ik0A7oRHAcWPVAl0VXasg0RrjeOJtw6sygyQSwvyBGJPJQg9oTRAwI-UBTOrKoWYg4IBXuQ4BI+JMQFIi0jCz8KQR9CCJwyujQEOQFO+DO5N+AfsC2QCMgmiyvSAR2W8gM7Kxg-OhOyJceXpgfzJgwBGjwcOXAmAL5bD3RZWJFQF9kW-ClDNRqKq6qEPDg2yqjgiwU8igZWHpa4rIa6Jceo9BuQH-yZbR4UG+wcEAaqHjU-9C7cFDqAXDvUFZhgJCc4ORApiAWQu-QrpiVRHvAQw7doCbsE3CWuhDg8pyHsChA2WjFSMvAupy3oAOg0JbHQCwiDngnTF8QCa41BLsAIbjlYCz8a7IPOBik-5iTsJxEI6ZUVDHGFnAfIJYkGEhg0WPcS8w5oPD4cxBw2Nzge9TbRKzie1LMWBr4IYaQgBIwBvQdSDDwYMomZD9IUEALyDDB6fCe8I7IJsCOKA+ARaKLqOYwDHTdCHEIn7AWijdwS54qcARyGEixhC1oAjjCqDYAUAw4TMcgEOaeeP4IarASXBQgBYhVZEOIAOAqgPQQDOaswhpiISBuuY+AdECCECSkezDDXEWwZOIuQGbAhzanIIYgF+ZgTD2or-HGNCTY5EAduhpAvaC1SFsEsCAEyDqEFFgTjsmIkHCIQBggYXBkwKnQirBfUFuAdWIzWd4YdHw-gFegllBcEEAQieDFSJaQEZgnEPLw08B0cfDQIFi-FAbAL-AjJDBZYTQu2NkwKITxmhgheLDcANFwZEQpqLKchDjWkIxAtxgZVPIYr5L2lK3I1IBYJEUQOuCywGx0anhJxHOCObwtTl9QXEx80AGMnqhkMEKQmjY8kJM4fNBIoIfAlx58wJGanaD-VKf5RJSNSKagxs7DIJVCh4w5QMMg8eROQNl+LWDUUHJCOUilUK2gyRSw+ho6Unot5MP8vWAwsLigsVECZOqwkQit6MWw8DCbiL-IO3hJgJq2Grg6BHiglQjQ+IRI8RBfIN4m2spe3BUg0CD1LvoYDSJO1GAwfQQo2LZ68qKEEs+o4yl9YCeJc+CHcDZwsRCrQCMsrvAzhNQI8ABTlN9A35x-QF3Iiqh9yGEwpmQXICdoi6DSyHCQJuyUGPf5-OgNIm+wKUAm9kzkwTC8wGFwUEQcqEqgZzAzYErggyBjgLcYPpQRiD-wPMAdwINA44DLYF6gfch5gL3ItwiKwMi42qC45IiBGVTgaDUEUGrGcIyo7YCIIOTQ8rK30I002T7TtEWAZWAHaKtI+boM7Gdg8EDzkd3gEMBZooxAdIgSkP4IeEDwsDcwxcDw+fDR8vAgYZYmDLKW4AmYMPDHAcAa5ADUKk2QLwhHQCIoSKTbGM+YxHAchLZgI8oKcK5e3RDTgFUgLvSFKNBIV1DoiKhI-1DjiURAJmQpcK+wwubOqL4k3JDQ0GOkOQVIQKWkx-gpCHbGQBCaoCJUZWg5grfQuFBs4vUwsCDncPtwgroA-CTEcFgoMJpA9MwxIEq8-2E7IKyqZ6mCoKQAdpDbYG4acfA9mQpwxNTVsCIotMR5ciSWcnB+Ek4w5QwzYBmo1GiEwM54TDD1MJZ8JFINgBpAK8jaeniKypmbcGolgbDnKGCEeOABFLACMkjGIATQCaAGWEog+9yQoO5AoMhhJNSASTRToK7I6l4caDrAXIgCdIuuYCDZ4KcggfqKsFVQu3B6oLlAe-KXHIYgX1BpcOJUZMBLVq7wINAIMKOoQCwj3K7I6vQHMT+gvRhlwNBspeQMEEi49UUuYHFQibCRsGbAh0CacHeQHUgd4P9ApnCBFFFoHKgvJlkQLYiVuA0wbHgbaqwguyDqoMlkPeDQyNUcfZirEe4Q-v4aCOeoBHAl0LcU5OBaFHiQ9kTwxPyMChTXIPJwpyBJoFlw3v4dwGTQYKB9QLfYuzi9YGF07GA50NkwMTAlgL1uATRrIPRIt+TVjlusMfBsRO0KL1Y9HlLgWnoNII3yolCEaDogP8QW0CQYjAgYpa3SJmhs4KBkX2DAQDcwMshFsIMwT8Au8I3Ay3ClpFDq4Ka-xowg71B78txSeRiuFrOSBygAwNFBj5CWyPNQjeCtoCIQHvwWQu8uzNS8MHVAIBCrNuVgsOirqNVEOWiQoOrUhEhuIWdwuMA66JGwlwibpQE4j2DKIKsQkzjM0I1gZyoEJYNwGWA3phro4uB9SOhwnIhpwJdAzUCQlBQaOoXYEB8gpHSHEG8aKQT38CHodb5toqwgZDhi0FHQ3cCl4LD6USDHfInw9OAkUvkodASWEOn8eMh8KJhAxzLboPkgP0RAdBESCrCD4dBizcD2aIUoFyQsPH0OO1Ci2BakNuC0sJYwXEDynGsmpHTQeq2Yl9nXwEvMwMBKdpww1VJbrA4I6FnVsMN4sJqR2OC2LGRMINPF0wjv0GdAF14xgBUYRdDhYEuetxQ-9s2QMKafSIBIifAGCAE0-6yIunKIMPB8IFcGOGiMlvUwhwjnlMio65iTBuiIZ3BV2DcQGfBrfAEW6IgYUPls8QK6AJio67DEwC7EQ3wXJC-w+Nz6xgmYaNAikLOs2sqE5Pvc34URcAu0kcIkxHzAE2ADYQvgyYh66AH4LK61QGhaedAx4Jl8m0AOCFyk0+BE9s8EqhC0EAmAOoQZVMi4yfDWkAlQ++hZon8G6MBpPBxxWMTq9KYIqHBcTP-4rxRYhHmgaxydeLZAN-A18BYgGCABwDeCxTYpek8QAVKcMByoUgCQIFaoSSgqMOooDdhe9P44-DCy6NxI2kic7EwYKyRuFAfw3tRQ6rGEh9D0mBZsciAHQLXgyCC+kPYkVyV7qOaY-HCcoJVgwByYBu3elOhM+KXg6tghCipJ+tCk0PPgavHIYAggMYAO6BNQpMjkwLgg4soJxh5FgGwqQE5gPohowDEQzcDPIGwu6xrtKNZi1uBy5qZ0ORB8gHykwNTEwBYgMfARYCPcdu6mMBu4lEA64Of+1yCDgO8lGhqacGAqaUAs-G6w2JR79Duwr6DmMGa2rcCxwJqQKYDc4EoghSjGNKt61oI1+Nxi7bBuWTq4AqQgwIrg0iT1QLxotgCpyIhA-HC7Us6QsIT-QHvykIA-Iluga+qNcFzg4sq+VEnsfWgAIJZsg9DzoFWwlMZfgCzApLh3-CkgtOBHPLkStNA5QOlAFUDBQPKcQiDzeD3YjqS5xnOAGdAVIJgwsGJZWCAhB9DUKqHeNhjOsF6KamhNonHY-UyTYChU2ZCHhNMgBMjC1LwgOEjnoD-wEohFJaHAAXDp1NrAajgHWeXYDyA4pF9AB9h8QFDQVaAz4BCgs7iDsOA45qickF5537BoeTGg+YY-NMIQ3UBhCA3A6MDeeCIgSxAKsO4k3OBpYF7CqfBI0Cxw1iDy8ESUWGUiIMZgEtDq4HVaNPAEdgwQruhbuM5iZXK20vJYctC3ML1oLZ4GYGEwXAB7UvJEnBg2cEk0sK62EMps8PjnELO4r5zdJFKgfggAoFM6lCyjMCtw6ACBpHAgkVRNKPnQzwQXyMt0M-ANkDXkunAO8DwRRUbZkI34ELBokN84mSD1gtRYTSBNrNWAxFDw+LKYnnhKxF3Al2CZkE+Y-MDkUhKgz2gxpK3kWrh0QA4gnP7gwMpA-OhhCG7wAsCm8OIQJGjUEITwTdAwqBGYPahAbBpAFKCaaFMgTox5MJW4nXAs-ELEd3CdwFHEqMAZWOUMhBIKsIGwPSCH0LSQNxKXHMS6pVCZzDBADiDMGL-GFoBrfD9AmmBIMP9wJtS3wF3ihxCt5OgIy2AVadZQC7DWdFkeh0BNLgHI9EB78nDY8lCskGmiEmCmdMuoj9DmwMnUTvBjDCngrKh9CJZ8UMhBCBGyAMFdkIDAwXo08G84c2KhKv9A6fCXwObkeS61OLiQY7C4IBGwGwRPGcf2Q5iESKv4qnAI3gwGE0BkEOdw6fzr6PtA1kSWZuQ0YuREBL-E6u5vNDoYKDgySOqpOoSNiD80jACP9m3YSgBW0PEC0oEpBNDIM3gYkMfsJsBCIDpAXHi-aC8g0iKNiPloYQgEaPWw1QjZWNhQBxhNgFmiCegxsmKQYXDM7CsgLsRlYPfwEI4xQNXC8wAJRHFW-9B5GCcQM+R7MMpsb6i3LOqIuhju8DCIWoiPwO8g71BfKLEQT-B6hByg3fCvSOCFmlxbwCG22F4b0LXy8jANoI50MhT0YN0MT0RhRjoEf6B70CAu9uApIIUIV6gHgI2IYqB9EGaYU+BzgsY0IKypwIJFiOVBqG+wpMzHoOmwwNTIoOEsmcDyWHwAZ-BH9MLAUgASYEXkQLRkeuZ8YFwpoN5wsphE3GoCm8RoUMuo70ADcLic8Sh6GC5J0Dy6IAasQqAedhKgOyDONgzMSfiLoIRwKKgmTAjgi-itggFQslbawKs2mbDCwL4Q9gTBZGhIkMAo4PQov8hLgOp0syH20NxQlkgEFoG4r5mSrOVhUBCpUNuYEZjelYwwsgCw6P4ggWQpenWo-1De-szo6zR3kClUfqgAwK2ksFhAvkkotLZNSLVgRUhvODUUWYioUM+AOEialapw3EhF6ApwRGBmFrKIOECJsKG0M4iPGA3YLWhBNLEQLeRvsAIYRND5iW25qOAPIJuwForDsErgwKygfh52XlDKQOAw3AorFG7IC7CDkpUIo4LmEvuAyKgIxJ0wZhDgxHyAV0ZIyOSYoBqc5ZiQGjBzQFrEnMC-xlJwqBRBSAE4EEDYEJKm0jDikoMwPajJFDIoq2D2JEwIeQQ5SKkwvCAxoM6E3tT86LSYcyBKZprgHqAHoNgQtdbZxRFIyBAYsJK2EoA4mXWAbmDP7DBApeTJ5FDqvGBkJAuALri5YETwLPxhIDeyU6A3cOhwQPjmIAjwE2T-mBOCoTD3FBcw-8hnCCkEYCBsgkqE0AgjHK+0BKCWfOaozfwtoGpoMUBViMDAhYAlgDMQyuDWdMtWj7DcrBSQ5Jh5cGQQw3ieRANY1IgokGQ41OhcyOlAeggmwMzAycRpMDhIgOTcUNQQIZAUQD504oi8UtvwIUTyorR4PohT2KdwvfB4iiQQSxAjyjhCBSTuCCnA4DiVkGCg+AykALKoYMqeBSgUjMC1YFtgyuhXYGTMQGgv8LKo1mRf+C70WgjaoAEWmDClpKSEACiGCL9MBbFYOO7sW7gXWhpKW-BrSM3AFsj0IIWIXBxQQF6gJkwEIDOATdgKcBNYsXSp4HIYTLisMDeZOiS1OOMgGvg0wPm6-lDYEDrg-OAEwLZ265XWhM62PhhZOp3pe+DgUAfCHVA+OG1wkSAQsK2oVzDiMEbgV1DBCJHAXyieIib2j2yjTIhUv6CaotYwRLimIOnIC+QYsPLUhqgYONfAVrYvsGGkVIhYMLR4K7BJ+Bbwyq5gtIeggghx0FigtfgdMAhOUNDhmeYQ6qpU5NMCYQhDDOhQo2lvsFci3Ajc4MECCdzeRZEQCURL0UikmALdNDdYeXDQqPRAEBh1BEBARSLXJPwwVODNRAHwwIiumG-w3GYZwCl6EUCuYLqgOlDLoJBQ0WAz2L2AAvKw4jhIPDCxSDzwZDjM6OVh40CpQKDAlfhZ5gOwUgqUQCgwQAaWhY3AyEDBJBUR6EAKpuvoag7rgA6wFsiDYA+I+sBIQFPYsPq00INAvZjg4GpoyYAf8GTQucDYuDWACZhh4IZcgJCWOA7oaXCIwPzo5NBe-IYOizZeBaygS4brmKoQW65SxAWQpqCkuFWgqsDbWndgNnDy8JxE1yBaeuUg7lABAKHAzipEZBiYQhCbOa6YHqBPPJDAqcAxwKgQ9rBqqqXk56hRwNEofmDd4Bdk+HLpFJgGWUCf6NiGwFTYQHLEDezfsD0u+rCbQBu4dlCE4dUIbqidIHqe5wzw4n3Ysjp4kJxE8NCIxBnEibAAwJconIxMuGmQyAZfgFTIXUBsMMY0i3ieRJws4KD0MNOgD4i9QKkC5zDnBKmgzUCWBvMAOPisXihcv2C30AOoy-gFuNIkUcCGarJAThSMAKBpBggGrP8gWoA2oNmAN6COyETwz+ytoNZoo4JjZMIiPDDUpK7I24SYAh94HzgpqO8ovWDgCDOIucmLiofQzlCryqnwV6BqaGsAQpIr0BhQKKipMACxNLBwmqMcqEgpVJEIhLCO8GrFEaBJwPQAMigyyafAJ4CR8FcGocDxwE-V9hiuXmIAOMUiSQpsCZiPbOmEyxDaSBUU0JZw8Lik5piUeGFw2+7Y3vbFkdiuyLX4SzC4nFeomcxNKL9GMIhIrOZkYraJAKBo1SBHCFzMOiRbyAmgMaQ60A-AhqjBQDSkiEgXzC7AQ2BasNO0VMj38N9IEI6qoH2MJhg-9mcwBcB2mF3oAhjNgDqgsuF4wJwsThC70LiJp8LSIHYkxkDZlGKAEKg2aO5AOYjw6NOQvcCbkA0Zk1g7eNZkopqNSMTUsRBILLKI57gZVLSRVGAXQB4QVWRWTJQgERSjkKTovVgoCLUkTu6+wQ+QTxDx6BtI3eAiKNSgPjZvQLTgtlSoRNkw+1BNSMy8gDBWOMBUHmY6oCQUCYAPyKrAWECnMgoyk6iiyJX4av7A1GYgXBDUWKiQzSAEoPohiJaKQD7QM1nJmFEI+rCfYSh6eOCrHLXo4MTsqLkS6kDwcF7UZkjTMOaw0GwaYKZQ9pRcBjVFfPgfElGkg4ChkPBAInAi0OCwamDYaJfAaqDURjGgqESHgjegWhRSNjLwY8D38E3gagKn8E3oRhogTgKImODpmHgQQ+5fIINgXfDKNm-hcCBp-PewaEBkkFHRqQ5FwFAFyyq6QNJIzNCL2K-guSDh0HgIb0CUmNhCVPT5RLgU4eD6II+II6YzgLqiIGwaoOEQrmAw3kn4inAvhAq23sBxoAjainDm9BeguOBGTDrwIDL8mJuQXQAK1vTggGni4ANA5FWfwPQw0xiyALUYZNGiyKZQyBDynCt4iAyTipk494LWwfogifB9UNe07khW0OmEPJzhMLYE3tnxwOnIuUDp0PAwIxxMGAgwE1AbOKMQB6BowP9UpHQ98NX8UKAJmHNApbAL5K0EItAqCEd4O1wewJIgMygT0A5wVMgxgC+AchhVsDGguzje2croJMCSoDpgXAaZcH1o-aC4FPwAyyojMORoj2C7OIRIvXD9WS2gISBcxRNkCLghULyIkfRfKGpgt2ihsE0ozaCgxETa1mi0JM2oAVKjTC5IbaK20sDUk6BbhEtQJXjJ5FigjORmQjLCOGi7cJbI0XD0wMZYdeL8CLgsSxBtPOzo2Gg6hFLEbDB-Tu1QfQjcmL7Ap8EIQGEkZ4CIFTpg1LUm4JAgvAybgGGqI+i2VTA+pNACGKv4Ymit0teAlhDdEAE4QpBRMEygdahfaJ7w+5BxDhFUnD5ALBdk-Fgj3DikkSDPzFM6WbDl2O4I05xyEEFAjlgNsKzijyiIwAq12YB2yGdFcQjNqC8gZNAj6NrEK3Be9FsEqpY6bMpsTOSrDIaaHnaRmibmL1JKoPHogyR80PnAMkhCqsJgNCAXyBA8FSjxwEjQtxiYqGgldpi4nFoww1CjEKEe1USAYPygZRiVkCBYbJhgDBr435CblNzqGfBLnsiwSaDXgH3I8sDdQAZWwrTUQmygXyhi9NeE85DsMPVInuAoXF0ApODiEGLgsZTQlmCAu8jTJaYIvzB0KjaM2aDsIDtcZOg5oI-ovGis4hVUuQKlBlSAV1AbBG2sR-AaSBuo5VBHwDUU9pCfmN0MIJUaoDEYbVjQoenQfCDVydPI+NB8IC52isCOwsJipABA+N6or5KpyMYweQQjHPUuvvCm9J5qN1Tb8H+gDTAf4E2iaahbgCGw2PEsFBnI5nluwOOsj8A34mxEYhBxzsq4XWS-YC9AAVDeCEB0DHQu9MEhtFCa2AGM04IIgdn8nqhfXsyytcx8goHmehAwZH0cUYhnEJNO1BCfoEUQj9CKwF5Y3tBuCCngrDAbqJSg6vQmZNRgL0CiyJQA1xAHKCiQACDusCAQe8LWaL9AMIAVnrlJuSCcjLHgJtRXvKMcf6BpcCTgt4Bs6tMiiXbvIMz8TECKFP9UC04PmF7wV4CTQKb0q+UsQOVhnIzxoJG5IED-mJYwd2BEwFuAK6ypcPAwtOhM+LX4IrjxQDvgKQSXHGkwoWhptJCgJQyJAOLQ4soKCDoY1CqXHKbQwQKnREeAIbgXJG0Qt9A+EA-AMqRciI9g40D8wMi45nBmgrpJ0zYLtEWAE2QIQDcwBBbjeBLgPpTBYJKAf0BhcD7lj9B4QBPu68C7RINg8JjxyMPoIeiHcNWSrF4tIOUg+FRyFFgwWqwdwCsixSZvgP+A4EBoWmKggMQMGhzAOagvMEpwXeJqMFwApcBnILKwJOCp0Dpkg0jQ4P-EugDZhtwELECPELZgKhavkhq4cJClia9V4YC-QL2AnwJzGNEwevDAUJ7w56jjpmMMR+Dpya0E-VBPyIqwMxCyiGtMuUwdUE4QrJDWcIkwSCCDccX4g2Bb5E9gFaDQWOVhCOoYkOPwIA6N+LrQGUAtaDKIzNQtiOWAOcC-EL-gXWDxQLxoT7AhTIzkr4LyIFFuGWBPBDMSHsDIsCRACNAvdZAgghAE+B58AsDCJC8o2kRi4lp6yYA-RO5gZkh+wBBAsISncW0K+Aw74D5wjZBKAA3ATuTwXKq4zfwNGJTOEDbWkNv03ARpouQ0uyAe4KcQ58ZbZCEK5XTWdEXVvslRxPMoq-gWkBmQFFjXoIugAqHZ4ObAXcj6IO3Kq6ilDCcMESDqsAegAogJABxoKcBjpODEdsAhUARwDYDjeN3AwYBcTABs7WBx8O7wpi5CAEoA55QkkNespWA2GHsgGZAFqD2lDcCM6NyIeJDGkDgA1FiyVjPgRUDZyKNAPpqfUPhADcnU9rkg6aAGAmOgv2C6yWmRtRiaUBRY3YilsG+QU5RPmLPgk2wZoOKylWBtCgfYFXZ+cCFAtnou+D70oMDTiNfEPmgfwubI3spHCEZMA9hHgIwgleQNqkGow1Ar0ICYwCTSJP3gLkA3QEsw7PQRGZVgf5Bz4GschsSP6EfwxF68kOLg8yhuId1gVwaaoMjKsKxsRIno6fxTeLQkdvj8oE1ApvBJcJVEBc63EjgkVdgVABg4ViAhUEoghOHzkLxoyEAqQKkCKySt0inABeAd9MmIpZhk6PKig7BPgOrU8ADLKoMWdsgn0MVgt6BRxMxgfWgJ3IxgQMRnIAmY6mBwQJQIU5htpBJcozoWEC8wN-qjTBSIEpAu8D8g5ejp0BtJLMACGNIkjgh7IJmw07QgUXW4wCBTGkNIy-Cg1PA8FsDTKIBs3dJ12j-EJjhM5KgqtWC5sPneafzoeVHEHIAvjMX5r6DlSLswIsBrSHkErggWEGgwv0hfMDyQidyWbPweNRR9ILgUCnCYBmJ2LkjsDYRIS1I55MhQvfB7njsVgxmZgMP8TyDjoK2CjYh8+PVoEZCGYNdAkVAurjq4akDv0KLY8QJoiJpAS+oN7BFIA0iJQNRQZhYPOEoAd+gzeTP8o6J-oFOhMw0m4EZMQGjx9K9QXGgndGagbxCmdEP0uqLnDDhITUgMIGYEYgBzEMWUgEg25JFUvcANgAKgk6iBsETaYTnf1U+wEaCxOOzgQ8DbkK9+-QhkXChaLwikWMWgjvASoOyotkAXpM+AHFhFDcLUZRCddHLY9rCQRPBkYzEn9eRA68BfpppgqaBl0u04XNDRoEyg6WjncLmoGJgcZIeM9zjtEJQg41AXlIn8goLeRU0g8kCqwI50VPRVIMTA9kAocCyoFxg05IaotOKxQNCAoUB5UMCmalAWeIeMBFC+WNEwDCKQsF+gTvALtZtV1NBu8FAIohDFWQmOZRCxzgGgj-BaIB1a-lBzgHHwkvHAwBiwCa6REMzA4pLIuOSNRVaL5ScQhsThuTsClyLTgvhQ0KgyOdzIfsZzti4ZiqjZZLCa1nqb1KxehmLaSHfoOWisQMNUtGCU8XMgBc5lMBdAXcjUBPzAMuBuIdXCGBh7AN9Qfdj3cOQwl5hvUN2gKvDb9KxAn2CHxHoIWCB5vlYK8ilMqiBYb7iPdHkk8OjRoPEwabQ3QKNgN8C-NGuGyyCpINKuXkDVUqKokzgcEDVAD4i6AN4oUqjWRLyQwFAnJLEQM4jesMv4aTwCABCwNCAI6JEQ8igxwOiI7ijmyIpAVkxXxuRsADw1+oBQZ2xAMCZI5rBjjHlwW5AiIDkwzrDRMBngHISlDFLQhMDi2JYwRYARmHKIo4DKoI+QlZmXHmywUSDaFrlM2FBbyP1gkKDpLJsgYpBMoAc8Dn5IoMY0NuBwFDUMEEbuEF7Ud1CJQKcQ0NA6xpSg1sq1YN5wuMDeyCrAN-rVaAIgw7CMAKkgm56fIs1gRHJbzDOg0EAagQ9QrxDnINugT1DuZOcwlyhMYLI67YUauG+g4jDGkD4qm3Q2HBccVwYMYG5KbOrciBcglUSFKPYYW+QFlPORtcgzEmqAj9DmkHpYQDnbQIGox5zLYBMIrKhLoU4QXQAQjiKQWvCcsINQASBEiGuwSBCy8eEk2xAIxLCiRfRNiGlw3YAreND4D7AvgGzgzCyBurbA0TCo0kq8wgg6cAvgtlRldaXwaqAakESIu0C5IDJAQiDdiBg4geDi4VvMkw1UkEkoWECxQqkOMDWRwE+Z30hN4MpsJkAbqFxUU0AoXmPcOuX2lHdgVky6AI3yB6Dt4JsE1aDEbDcpLqx70I+IKJB3uZxqWDBnINGYrfj-VO+I+RzOXIHmTUAbaqYgQ7VCoKrUJqAmZM1AOLRyFFvM4pBjDA51ZvF5cvcqXeLHQKR0WdkNBTkg3SCuulpkfnDGNBzAvlh3gNjAGkBPENkI0PjHoESQ7mAS0BUgxyAKAjjCsPq57hYw0MgrJKzifECJ-BnQmhbxmpBE5XQS4AWU8tTUCD9y4EZM6DSIF1C5wKvE92Dc8u8QOgTguDfgw4DszhXeZhYqEPRM0bxOYKgUKBSZgIvgsdVycIGo+sW3oDdA5nzXQMahXvwrcLzUpcCUil3iKCVzpqghn2BqaE+gss70EMAkbkDC1Lp4OCBdqKkSKCB2kEIAMUkGMIUIoWi+WAvAHkA5qKtI47j1YIDAAfAW8BTl5qBdZBg4YODMODCqDajD6MMIJMAVVLHg2JWNMHzYMaByGI0umKjdZDSIeUASXKRRfzmRIECsLuRqeGC0syLaIMyyb7B92Plwy8B6GB3Y8vD0wMGgcBb3sBQaPaiysJDAUcTPxV0YRtBGQNVSblguiEPA+4C7yDqgbJjo+Iwwx+laenes6JTlAOOQXHymcJp8ATR9AOvAV-gyKE5UbvBcyF9Awfj2kDnkYuD0YB5AUam0VPVGbJHVREUiZRgRkOy6ZsgjqE9w+jRSAR7wdm4lkOcob6hElGLA-ADVHF70GkrUKlHQQQ0P4JM6ngBBiJDwbECfYNWcUUiWbFkQD4DGwBFNN8D8EPLUFnB5wAEgZthpMD0MtTDWNIpA8chRYNtQvli+kH4IJMCIWKTkQajBoETwiDnGuv+MUVD+EO4Ad+hFgIBsCyBKcBhsbLCxlGNAaXAw6J+AZKTOmPjQ7bCCEB1ASXC14NHQjvASYLx4ZoKdkHQIvThd4iG4VyIpVKrpOkjoQC9AqnC98Eyq2NDUxD+wXeim-Dqg--ggghZw14SvYC+EPkBLTkYaBaBzgNVQECAfEiMsw1TXDZVQvpAAzZxEFpBXBj4o2DZWwKLAraR-Br6QATABeKtIbLCO7NRoubCZcK4IB-AvKFDA3sqYQDHwY4BdTBroHkDhYLzA2-i8IHoikwgpribAaTzI9oEmXRjvxs2oirDXZLkCpNVqqtGwJ6iuoKs2YQ1EuNrEeOCdMIyo2-R2+BmQivAXsKtIIGnEcF3oVTTzQPdQe1LtgHIUjTKbINSYlLlDqOFF-B6aDl2o2bwreGgAdpDmQJ7IpNDBZLRlTwm+3LsQIODfsKFwoGXuRbUgF5y+IN0A1pqskNCofrI-INxi9MzpoCdMJmTQQB4slbhcIFq42NAOqnnAEykg4GQQ44AnoRYwOYJ0wT6QRQblKCK4r4CRUGLk5ySUsG3Ad4DhLAhYJkCO4B3A-xAhhggEADjnuKFAzfyQwIUgt-Ry0DnozUBUQFzA1MDtlhZcfWj6tWaY6sDHRG0++F4cqbkSSdAuYHngHICqkDRQJkDixOzAaagDTdLQByz+QOVAcMC1MNPgcuaWULFA+AUaoCNghYCQ5NbEIbCdEh64ohrFWYYY+6hR0ETO2sQCrtzgh4BBdLQ8BHD1MGFAJAApQLSYCCA7UJpQG0RxKEsQJpCPdHAWO1jnoKhQZk1BwPgo25AyKK4l-rjB5Mv49pSM5Lp4WvCN8YCY0aDKYEOAmtASwDRF9MAJ6A0ijPTwhOTNw3g7ZJHYq6ge8EikHV7WuaxeZKTfOKDEK6Y3lLB0DKgEupjobaJkkJWkTxBOmFT0Dah2VspIpQwZZTW04KC+yOLA+F4WyP-QeLDuALlg3xwixSbIbXCUtNi4nxhemBKiPxDKCMo6mpBeuVGIdhBfYKx4ZsCUxhCo2kBAePpg-ZCWbJVmhVA2aHJC3Mj5ICVEwCSJkK1GivBXwHQlCnD-jCpVKoBYhOeAXiJYKE2I5JIqEJcIpiD9WClAkci7DNcIh4DGYIGoRNKIZIVQkMCGYMjgOeY7cAgEHGFPWQ1FFmzd0PuA9dIZQKx4nYAAPJZs3GJrTJ60H8Kc4OhgNahiaNu00jzEcGbAYxSOdCbUgbhL-PvYM9BNXIvgQMDRKOHBxlizcEjQq4D+8Hqw50QjID806ojK6K+w1YAPyJDw8eiWfC6smZDjuDtwcnBsgsIeUECx4HLMKPinoA7ogWRoWsAQa7ARKJGhikA9QKTQLMA2zQRQ79CQcHdQNCAzEsFAOuCFkOOIVGCxdNBsZy1REITghmD6INXuweSSgISklpBewNcgknagyOVIUnCPyNkwOgS6cGj+vpCsqFdqVHAY2HVAn6SKWJR47yDLKofE-aA8pnwN8xCCAFrw7jAH2EIAY0Arpqi0FCCQEHHQ79CYqHYNUmAQuilqZ2x3cIuE2hB7wPRMNLBsdGKQTozEsF3IWrAvIDIEE7LTnJEQ6fiaoM4AIuE+lIpAcZzFuWygl5BsmISwqLQbQFNiISxs4JpoqIhgiadmRHCLigWJpFjIsMdIoyQJbMLAMBZcfMEAwqgu8NZ0OiRAYBWA8ABExG4gozS7QCXqG6hkCN5A2JR6sHtSivAPsA5hcdiGMcsBvxDW4KkOFrB+IBNOjWBX9JCYWCDLdNqhc4JD2dTQH8VDYNPgI8B6cOpAP0RPwPAwYZDYwFbQzQm7gMK0BcAycFciaACT8KJIgfLNAY2Q7SCjqB7C4lS3GKUgYLQdSAxACZxAaHpau8hiOscgxwHYwBUAtwjmwd7UC8gcvOKSAMDDgIBsqGDGDtkIY7BRiBUoIijKoMEk2XBlGNv4WYndYNTAqhy9WI0gHTADYPRgcrCQUNCox0Ar8NuQN9Q3YMBUElwWQpiQyCUo0Ght6CUK4NbeWIQ5iKEZNaC0sAeg82gqELTgaTCLism5QQhDwB1Q8hgzdkgQThj+uNBsRNDTnOeoD7A-cq4IiKBjpJWkEmCDyGCMn6BgMIMeREA0EHPgpIQNyd85GaCsENtgllAO2F7Y6wDYsNDIV7zLKojEt8i1KDtgQq6XyeL1sRC0wNdI8mC3booQeBDTmFjgzqj-mDokhOSAAqWKKKAt0OJUjUh+LZPgZiB+CD0eiGycRP16-ShnbJhAPkDNcCKg2kQ+EdDQAhj+-vqwdCAw8O747xXQyJhiQ3xHviFoPPBRdIqYOXihamW4sXQ3EEm1-cmhvHpgjQ3J0N0kfaQiYOnQ5YLYINSAblhsgjBcNrCmwLtwFADKuNVSVYjtKG+4VKCGYB+AU4r54ISwNmiUkBoQ6fj3gougdGDxFsKoNViaoEfonWBVFliEX8BTlJF+eGEreEZMFRiotLh0IkDngJKYjvJZYM9o0EhrgMWUsPoGoJkgtUDQQOiQeJSaaIRoDezviH5usUBbBMqQ1wSrSO9QYMCXkDOIO3AzSEC0hWLybEYks7qe8NmUQqoTZORCVODZQI2gkZBidLH5dZKZkB1QGUD2wNWAvcASKM6Y1kCfGN0MaybRYJot46A50DeANIjiyi+EX2ipDjQwgxgZkDNI5vT0-O9AE-Be2MaYsYif6FIsttIwkGMMcYDjyMxYoznWIFjgpmQhEGOgHSAbgGOkLHABIBrE3ABfQMyykGiqoKQt0FgKUEAwhKQjyqXik6g3UO1QGYA2bPgMk1jJYpX2bXCcVSy5KUAy0tv0Y16i8KVNCRhY6GmoG4BkpB8Sl5htWE64N8D-0MlgWIRpqJYAPjgEsEogToz5GBh5KEjqsG7ySkhEEA7Y-li8DMlgE1CqwHg8QHQWbGPY24B-OZGGokjIJeDgSuAGWNrKCDATQL8QuSAyLRUgOLRwGCZoaAAbQJSwLojKbNAgSSjR4IRosZz0EEz4qmDDhjTwZqB1Qd+EIr4mkGrAqcjcyNhgvUTckOG6GcgxgODAjAD3ZkbQOdB6WPgM8ABJcNdUlECuyGKAbsgalPggqxxM1e4A4lCzIRYkna5XYNToNlACZOKS+URLMFEsILDHoCcZF2REiIlANORJ6vnQI+hxdAm8+eB4QCQQiqT2JFIIY2TdCKuAp2AkQIvYC-pALKTgb4SudCg4NzDgoHUExWCl2LTEyfDUQkTs3Ej+duEhhhgr8HmAcYAvcKuABZBVEEbQhsBiEGo4agisMDZolgDYCOqw9yhoYKBeliQMBlgYmeAhQIrAUnC39OeBnKAikDdYhnE9EJpwxNQ8SDGAptCXLOEcfsAUyBf6zIJJgAyoTrj+kHdAUCCpoKJYjUjRYKsRN-BFSBmQSxCqmbMgY8Au5KrAFe1z+CfuEjBcpNZiSTBD8HGcTwkyqbsAvOD40DeAvlhjDARoMYB-wITySxCMYFW4OrhtogtY+iDYCL3A5mRTmOLAarABwDGAsyI3xLpQD4gz0Ga27gilpLzAb-D2lMWg5uCswAdw2JD-jPxWJuB2CuDA4eCtpKXg9aDHoPOQUYibkH9mKc33sCHg2liadMMIVOTDXAKGukBe2IhIqhBALPNAUhwW-l4IJ6i-LKiIbQpvgBvQBo0rIF5ZabSswHWtYuJUQGx0-pBvNNBspQy4IBbI7vg8MLBQvWiQsIIQu0Q3QLM6Ppk3QAzo-jDqzGpIFnDXiDSIwFQAbP5gKaASzRVQt-QGwFFQZESsqDCAycB5yAIYicD5gKgghRUGoKOoM0Tisi+Es+AvCMzUy15iwtGNeDwMQGDA57hgaBBIvbDJIPUuBFAHGFeozgT2kDUUxJ088OfoWrh6sGQwLYijJAEU-MwrEHS1I1Q18MAcheDGxTvglRSqxFvkTlQ7tPSYNBCUQNRgM6A-RMliZsC7RL05ffk-NAWgK6Axtc-t+4A7qhQgT-Au8AdZpZgAsSussZhk9pjo9S5SLLD6vSABIDHgx0R9CECQqqAAUJBohmhHYCusxjCvtLrA8PisEOqgfILh4FHQPS6TqCsgloGjHM1w7yBjPvKgHKJXUKRApfBfaPVQK1Ab8HF0u0CFrD9yIlRFIqFo0oh9dN8QNMAUyAG4WhAxEJJgwJmcLMvYvyDnYANZb4CL2DBUHXCaUMPU9pCRyFowfYZywFHERYCBsbXoeBA+lLLc2EDUaCDQUwJxoGAgd-rB5tTA-mDFMcWwHlRpcJOgjehOqIz0ikDRKFO8iSC35CmgzrCmTNRoXvT8CG0wbQpe4Cc64GD9QI8QrHg8nAEg5ExWcHvCvhiwIHsIiKQKLDCAg4QSkO7Q7mkxCCIuuiB6IEOYRHAnDMDURSDLdGEmKSAeKnygWhBIpBp493BHINwKLEBkaOEgwSQFIk0oe8Ax0Ni4OLQiOEQEmqT94HDwO4AkDBigbKDIIOb0XODYpTpgvUAPOGD2A3A7tKmIsUBHwHswGkqaLM-BOYIJRNWIcYDcUrCg5AAsVIfQRLVENgWoCtLVUos2xIlZwpxAJAWh0JGpwmRYiMjRQ1zxEFvIUXS70AdoZiDiiMvQ1kQ5uG0QlJgoOG1A2-A1jlsEVmACRqtAzQAgZD0eLkZcaM5iUB5oWq5IGNjv0ZM4AQgJsNS0uYizunEBSdCSsIKgCMQLcNzIL7CpEJ5Ee8JqaAjk5di5qAossKAjqJ0eyMVgKgJkpEAqzBFUTwRoIJ8YrXHKOr9VLmAiWPYkzakw6C18TdhvhFx8G4AM6BjYtjBe2F7x7mFusJk4iqSGkeMYymBViL5YaTy+QENlvZCw4igw27S+uCIQDdg3VMEky-iNcP5YctjD6Ifgw6ojsKV5SeU+WGW0WmSqkCIQEbAk8H3YpOA18EvMbGnigA-gY4AooHoA8cgu8IqVbyFxgJtAwFD1MOVQdBgmgIJozNC0kJrgC6gYoEgashZ9UFoI8TD6tBaKj8iddNMgGZAOkHiwpXxUcGoIPHKBTYwAfnDKQAdG2lAaSK4wTZCw8IbA8JhDiJmAxHkQEOSgHtB8ueCmbBReUAT0-xBcTKOiAxYWeAoUT3DjQC1g26QMIJHQLXQtII4Qz8yvKbQkWIS7MIFk4lE+xH9AlrEYIG6wTCCjYFtghSJw4N3QuZy4KaDwvCAG7NTQ92ClfJKoQ8CBQLON5lDZlNfQ-XCdQFwGa7JDfA+gUWjEQCrAc81k6OlJXygqgCDQaXDeaAcotDxpqMy8JEDNoGuAiMSc+uIwdWL-wGAgyLCjYOCg9zE8kCeAD6CaNsIWK6BUjpKwRcSeRMrt-RqLOGygRSI-EAvQ3AgDSB9QOUj9QFDQVhShcBtwAdbGcC8gL4AYmKYIIWgO-j5k7o6QsBZwHNVvNHuhEgJfEHWFsjqCCPSYaNDw6B1wk-C0JIGwBjm3hSnBe0Cm0PvQ0wDjUJNslRTDgJDw5M2AoF3IaybUtHjGODH0yEtSu1l-oJ+kaRDGQAtYZ3C0jA4CqIjLiKsQz5jQbgUQqnG0EA14x8aJ8e4Euux3yh3o0CDWRIxAM+DMYIG4ck21KAFgerAu+JzAmqB8xl+g-RSWjDdYhkpaQAnc71Bi5K+AZEDJUJWQH9CPiMa6DXKvqKgQW3aQlJIgAQC+eWpgm2BBIOCgnCyeIrXoItAocI3AbTDdJEIgTSBpPHgQIYK+kOcwvq1uIYhU9BBGJKqabg428eWAeNTNoDgg0EhSnk6mA6BcoIrgKxSJ5bVxe8xnnloIivAbUKIQg5LtQMbAunAA0AWUyxjJZJMgUixOHZhIXrBd8DkgiQiGMRiUGzmuyGCO3OC1OJYk40AXUAuo2SDJiNcQVEC6nGjghNhxmO1QqhA4+AXQTXDjUIUqOqIH4AWoIZIf8MXAsKycwMgGtvUSICigzSLi2GggamguiAPYXFIoeil01bB6ai2gFk14sECoqEivuFrgKySSkJ+gT9iFlIcdIR1BIPWq5NCMAB7C1vAo9l7c2q1XBuKySkZLnrog1KCKwKxYBBbgsEbwe9DBQIn8QSCYxDeAvxTuUKV40Xl8JYbI9bBDAhTA1OgBeCiwUJhkdlkEpemeGOcwUgDm4MFwEuAfOFAQqFBO8In8kph6sOgAkJiNkFos6wC2UtiU+9zq9KRANrDLKnkQRvBqoGogFAANLLj4uohc4P4wUSzT4DtkJPDRYFao8XCGqI6ow9R2UP3YyYB5gMvQY-qO8m-ILeBeuAGg16BRxMkgRUDzaCvBirAFYfPgptCnBboAWIRPPX2UicCMovqQDYCsQH1YcxjUalAQARZWFGTiISisMMrgK6bSyM8gOAD1gCLAzlwySA3sQaj54FfAKaDt6G84trH20PvNsyaxQB85sDCTbEn4WsCP8N1gpAwrELjgUlQYibDwrJAhRLgsaeBDmFHomnRsFJo2w3gCdL0gSKSB4MZFbuBO4K-K+uyumIEeh4Chlo6JRyBPCQbAyOHMENdIKkCiwE4YvRgPmFKQ3QAXjNEQIYKHxIOSPUFTlM70lMb-fGLAUPDixBDSsNihmiZQjDBoSEEgX2SKFFKQuxC8QJ4YfODWgnF0jBVfEGWVNfqX8HWgPKDcImoATAj+8IBg89119BK5BqzkUIkAS83p-GmJ48gODSFo5GiFiHpaYsAkUgLgnACfTYBApfCaNgvgafwC4Eyqj2BBUKVqj3QhqFvkjFgN2KlQqTDTKNuABHDxAkr2BqAN4Bp1O2T2BOEQ7+AnGJk4s+CqiDHw9sTqdMTAkUDWcipguUDygdIinJRk0DYdZDCgzKCwk1D4KARQUggPiCI4oGjAcKIQ3sCowMUggbBG0MtIrggvjGFwMKo8JKrAxbBrHGQOdgDqJuFwVMih4AKy81AvIL5Y-9DgxDNEDuDsinGgLCD9WGdQPS0u9OnI+SjnlSLhxsBk+GJQ1pXZoNJEH3jzkG6wTJUxoDX4VYhe3AYAgTB1vd+IwBzJiK8QJuDNxhzwNYA-9hRZg+j86JxEr8DlsErssZyaLLVI1cIQDLicgzndKERqqaCJQA7gAKDaWKUMGzADSM38F8wwqj4wPmQCiM8EYxTXQAH4M4R9pGgA5w23MGxEoxzhvq9+qkAlBZ5ow3y+WH8weMjBZISwKxTpmB52niJCqg5whcCW5htAvCDHoDKImuhpgAGgrcgxGOmtb0B3UKHg0BCeAJzA2YCQlIHgCW5HYJCI-lD34PVAyXBNOldNUeiE8OcQLqSJ9EXByOCGxHoKfghZIMvAYwz76LZ6dVrvULHFXsK1RBMobEQGYOyKKJJzQF9ottAjjokpzNATWKAwrSBkIAZg2OirEMsgY9xsRHnINRRPWHDwF8wE+NYw2kBAcFGk7iC8aBBE2-AssNRQOgSjOiTEEDAcyAZA-XCXoDWYNEZPYCFE2qBExPTM9w015KLAMECclHfwW8CsEBjQi3BXqNzgUgCq3frwPPB2+NHA1NC8QKtINQh8wDhAB8KYbC8gcbmVpGnItUQpoK5mwsDDeOLE22Bh4BwQu+Cc-kjg4sC5EKgQscDbgF6YNeT0QJww1KQLWMUmxjQCoHbAGMwy7qFAI+gO8NiEycLnUETI4VX2YCngJVDUCIfELSAeQCikjFh-EB7QUBDPwH9mLkgIBn89QKhUuRxUR4CNMJed+aAhoOzYzSIhQGeglEDtKCn6MIhpQK1A4pAo2AdAy3xkwWIwQGA1BONA0FiItWVov7oCoPCcU5QJ7RKAoaGK4WDEXoppgKCoa2CHwE8JCDBrAF5YAzSEriUgLHCO4C7EtUDVRAG+vJDMjYuE1sQIxAT073UPbrnUlEAVUEo5wuBNOsLgfrIrsN0oLzDZZE3oe5m9wj6QmnwlmEFQ2RCd0OxSKKhY-g8wqYhK4GogtJhxgEvChhi+nla0vcBy2AuwKKDBEDfgocAXoKwouvblAAP8BBkDgMVwo0h6CJNsgcWJsNA8y3xdyBZYYUBqMD+whOTnDN2A0h3kNIUFmmhqOPKgEXBtCgKy2SDboIlAf07l2ODol6Fe+ttaSzBk4tpIPzT0xC8Iy30TSDv+Q-gIYKA4HIQodYIIEc73UCgUIej+WDbkezAVVBs1XADkMAEAx3SxGchgMLD-xCeIH2JqeBQIxoBXULmo6zgPUB94rggw6MNU-B6aNso9OKoSuKLYtWDmMLlgEGVKZlIICUSAMCTgHlQjqBIwVqgeHZ0wf8AT6l1Mhay2VGo4AFC7UrAhhNj1SEmmtchbZPMgOPrvJR-Qy14viNTgmlxFfbqKXuA+lP2wVIDrwJFor5K50AMw6HzCqKMkwVFEMLuwHPDmwGRE5GQxeqcoIEC6GAJ0QCxNoYkILcBcJUUG06Au9BpiVIAWkMVU79BRdGIwqYjviCZEG0DXYFWgmTAfEJ1gD4FAuBRYKkjNzOCwmjoalPk9yagiWMaYFOioRHS1xHBuIMtwkxlF6LusPhDyIED0++hAeW4I2PaCgeKgrfijEAmYOw0WJDoY3sqfpCyg7eViYgJ05zAUwNFwORBJAPlso30j3PngyuhKRryaRcADoF9o-4y06EGIpWClIOmQNhijUblAobTnBJkgQYhmoHEVpYClNcAco-4FpJEZudSEpBzpbI4VpJYQvzTTQMHtLhTtCoQSq6DnsdaQung3MHvQfKCCoGUY3jifSBigVrS7EM6oPQbdDKFAJoD1ZCoImIg5eHwouUCQqBZsdgrm5NOgOnDMvInwV2AsoFdgL4AiLoWIZA3iEBYkXVBqsOfAQDC+wOkgDAZciIFQ-xDC2B16l9QdeorAwaBg0hiYrOKZgItwEXBIMHdgU0A8rmqSuwALIQVetywDcP2go9CeGGyCrvWaoMYgQ-CDXGcghCatoF3wFIhVuHVa6SylGtZoFhX0MJVQUMBLIFVyE5BxNiC0Taj6QOQFjeA5JuxEh4y0cZVgkzaSkAbIL4S6QDO2SKCJ-Hng93DnEEuwS4CfMBsAOXjkrFUQi7DmEONQ5pX3YDXARMjungPo16xkwJiQtwhMYHnAgXiaaPN4k4Cg5Sz8nUj4UByAWQScAPmgGvgQPFN0xtAxoIagPmT27U30G0Ch9IZoFOjUjRqUoYmgrQqmfUiV+EUga-iSIRikQ0hKAApsfSCIWNSYy8C7MCSQnnaWUPrOqFAbfKLAJVDSpO2wwnbAVAJov+AVFeZwK82mZCKm3FBRLOZwdATZWH3QRDpJQF1M0JbryNye0FhFYJgC5iDoYC7k+VYLoIqYPhBzgs+YR4C0iDX6MUUsFDOAAmj2FK2oHLA-UG4lxUBSkNWIXqAXHEXEeYBy0J5oh+AYJGTiIOC7cCItVBENyc24PhANaIuKl4A5SCq9qMBfaK3I4ojq1AwCPEh66FiEa0y14OPQYLCpnBjAZ4DUwPpwIFHLdCiUi7LTCEUaMFARoBkAUXQPOOe4tOboYHKImSCncP9weOCt0jtl5XRnIAwZvRhLnsQR+dT-IHnAHlTMOAGuCMXptt9QY2QchPVIURCrNsTUcmE4aBqQWZBlwNS0kWjL7aVgt9hpQA3Yt1CeaE5QJT3UKjBce6hvCLjg0z3cBPBk77BqpRYk-PlxBm2kEKgooFci23y+MM9oqQ5ryO1ggSHvFWu6YIBuAEOI4jAHwqhIAw3qzPVk8GR6ENyIaXDbtiR8xdTwQHgIDSjjuCCClJADqIBg+GzJIDVAZUAz2Eygb-CxdF0WKIPq1Ct4qVCbBLtATyDsMOOI8TCnxNRqLuTqIPvo3qhiNYlA2GhbzLKwx6AtfHz4xrr-fBdAMogPYO9ysfjA1CNgb8gyiMWUKIRDUMt8AuC4GXoIfKDTKMmAWZB4wnjyzPhhKRJJ4sBNXAdgf07mMEtpLXSmcJtAD3K2AFNi-RrI4ArYGCTsMKx4frJqML-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-GiZBy5SHIu14utOvq-Og3EKf9d4DF3Q0pJkq2wBqUYapCqtiUk6CL2Md02xHsIEAskXQmiCHox7acoMliGchhXeYQUsT+EIgOFOh4QB7VySB3cNzIdlDecJj4BuygaLbSXOqUmCADuVDBMJmlezBoWla0vyyFMHU+lmZNAcnw4GAJsJaQokghaI2gsOKocI0g+ZDh4BtId-j2YIiQWBS9gPyAHSCrNi6IH-DbGAjkkJTc4N7IqTB3wIG6BgD5xPRI05BOiIkAndD3CXRAVL05wFqJQj14QEmOtmBZgG6wvJCOdA0jSODkNDdp5xAUALp8a0xqckd4sOhEcETEa7CVkOJA1NBCELAjrxDo0IWALqSHIK7onKDD6isQNRSDJClcSBq--eORyhYpqFwI1aDLYGmiESCPKFF0HMDgYJVmgsC1ILE4BfUicJro5W7XVPTM5RCFlMqgn2A5EKqIDX3bED0gjUgVUMsqzeAYUDx6sFAByLJA5EININiNhQi1QAuoUynOXHCQ34CRVN3A8mwZpuLAk5DnBJCgwrT7cAR4yuTpiIWQOeT0EK5IEB1U0RQgqEiFID0eYzkxEIPeYg1ZYEKwMiizoBtApyixSAbEYZAchIs491DmDiTAZfDBoPnw6ogwMOU+CMJZlNUg3PivYGxAinA6uCUNGJAUSOXhgcgswCskOE3N-BfAhG2pIL-Iw4A4AA6N2eA23btAw7wOOBmAzTD6zi-APnCkQGW0F4JKvt-g50C7yCxUu1KQMO7uu0TgIJ9NTnzfgO9AjPR3ygb0nF0QQBtIGhUQwKTINZh8WvnAAFBarOU52CP6IORA71BUiIc5oXQa+B0u2s0GrNIg27SDcP9UUnDBCDSwu1IwwChcZOjecGZaPCIs-G+CTLiuoLrgYCoUoGuw3m6qWaIFEoBjDHpwtUBpPNhALVZQ8IZoGOBnwMoIxBw1yLfIGlpq9EyYLSB3YJpcO2BVkMy18SUaeA6NegibgK0wQhAJvNe0WvpJrR0QkcK0mBfMjnqt6FmCmwRYhMKCRARUVK5ZRahjDGZBcFk3QjRAZFWSGsHkn4AryAE4iQBtyH9OuqK39LVIyqDHaHW4Wt2IbDXuaMAVVEc20oiBqFhgQ2ALHfCY5iA5gPTEhYhXMDPwhiANoGBohbZQEMo635C-FH6oov5RwLbAK9CY4JDkmnCfDXMgpsC6hrx8pvR7yNqdFsA8kNKVfgiUunvCYcB54ALlJjiJQG0QzClwWO4AN4D1oJKQPxBuIbrQN1QOQoXAqjAJrqHQqSDgxFS9uQKMqE8QGfC1yOCo7GCNUmiWUdAk8C7E0aAXzOlg6fyjgsQg3siHOMugI7U1QNPg8ITIKIpApfDocE4Qwn7CtFtDMNlGuMkgE-D8cGRAYoPuAPqQ1Qjw+Bgg8+AqkISkuqBzQEcIzuShwBmAWpCpyAR4V6AEGTqgYTD6PZSQItCvSK2oGuggtHIAKlC0UFqI-hAI0MZgn9qRYPqwT3C0JINQ1w6QRO0orBDXVHH86HCkyE8QwmgLoPl1koC7RPQA9-CCALWwWoDzkbAAMKohuOQACuCBuopwbjQmZHkJWXDzeOT0amjdINRCUNDcyP4QwQBZQNcOHMBJKJZ8aIoZ8Fx6d5Au8Iugx6DONr2QakjFuHlQsfj8EE6QcYAmhAkgeNQOKAOowtSmIONQ2aD1oMbQiUDcYv2QGviI4UbwECAdqVFoS2CEpJEIXKP+XXO+wiRNiA5CBiAcgNvg8RDwGM0wLyCBuiig3tTuCEpweHpvBXKUAVImUAWteTCzwuKQpcUVIBEwfdjZjJCIvVhVwPSYDejG0JkoA7ACGNgoWyCOkC5gatgreFne4rI9QO0Q3ia4LEpZ4jDj2UTxuDgOQp-g8RAy8DlQ1RyaoEikQlX-fANwxwgFELvNFWY+WHIQskCNEPLwb8jPgTfwIwD-yFKQ9+BJwM5AbhTTMDRGqcB38BQI8MKwWBCOiyCrNkQEUcQGsBBEOeA1IC6IajRmSIuoOsCSmPHobNE6osGAG9C-o0Qw8mm4OKLQ7OgI6C7ASQDVIGLu27SioNZNcrCD0CV4IbhiwHfwNV0AKNu0cFiIpE8tdjTb8I+QT+XeoZlwjOQuxP8KsWFEVevoXzB-4MlgCAPn6MEwTyCv8TNKGG49sIb8iCAVQCOm8mB-zEewRTyo4a7Q-4yWgRZ4FGGDMJdAnzAhKCBQp0ATsIUYkixk6KZkS54DMOv0CRi+Hghiu8BE2qnA7vhbuBGgxfhDhNAInTD5IMyCjPSa4J5AnqjwQNgoQGDIQKOiqBAm9iggaZRqQLwiLyyZmaGgvYDmmAWU+iD5rtJwCdwiIIoUQ3ywuvloraDZMH6yY5pg4AYwwWQSmCGCpjAAoDi0lsiDYWmQbti+WmxAf+BG-fbWdJWeBJHAdAT1YFzgtJhk0Lz9G1DCtNIkFwJ4yLYVtzCRLS0gxUivkt7ZnkCFlC-wHvCD3neAIZCXHtpC7AA2QBcgw0AqCJEIHiDtYK2l3mijJK3QYUAQqDUUGvjdIDDwtKS-IDIUs6CD1Es1uD42QESIfCgiVJp8CZAaGp9dn6Dlw3bFr7BK4JNQz9pb8AmALXywYrMiucaw2FvImMQJmAtYGpBuMBNY3YAeIEhAfKTlUNQK+kD+8BPqo-wOKDUE20jxMFZtxrrIEDjV1JhiECQQ-QPwQA2QVyI+ZBKcbETi2DqicNTzKNegBC593g7+zBCVUGk86oR-ZqQIyYDrAB30SBqssD5AM+qVhEOiDcmizHlyk0C5WLcUSiAu+NCAy3ShQEGIcBZluIGwpXiumPvojUipIJDkWBAI6GxEx+DUwCKhxsBeCJxEj6iymI3gllCeQPggvAzwZJfANWktiN1tEs33KA7JI8pvxJxAEMCOyMeD-ji8aAUZZGixSJApYZC7mpOJmPjBQOLYUgjqQOUguyCnKYYgA6hGQBUwp2Cp0EBg0PiY+GkgfrL6eR0glJjWkD5YWBCN6JwQifCyqFp6sNhbECV5-8QJxIcIltCpZLDYrZ0mkJ1wqiQQoDf62xiGqK4wxIg4Sb1A1FBe9CuEWuDDCB52uQJw5AHwJYSNLsbwUMj5IKV8pvRKE9dAj2jC4BWkAYwA3cll2XDyCKFoYhCGaGm0MPCEOG1gA0iqkNJIEVSMqNBuI5MooLsGWUBrICrw3+BPeibIgGClYHAU9vndAP1Yx1Q+QMgotINb7eYIzahuqLD6cfAezqDEt9CUyLfQmogpcGHgxip4ELqw2lwVQPrMN1h0QMaVaC3BQIs2U0jG0NZEBdzu5bGiClADYZHQFiTVwqNgwQgWWGYwSBBV2FlVN1i-NO0ossDTAO1Nc9EyncIk3IhF0GZwSkhdA5BwWBi6lSZgKQSf4Jo2M8jl8KqgZshyALmyCU3eOIhAEI7TggfINMC0UJtNuSARmGLQXNTiksxgxqC84DSknP43YDvAj-1YJO+AO2SQUINwEUgOTP6Qw1RlwEz9k04ZwLP+8+S7JrkImIiTza6YFmyvgFrw5DDQ4E-wY7CFINf54RBkCJKQ1cIiIGQIQTQCoLTgqnDHo2ggiKCn4Ai4srBojK84Dcla5dCWELozEECVQkA-IC7AEsBCAJEgOnBjZB30wfieqNmASBCwAMT2F8zcCvRgevClsN00u1L3U0Wo6HzNRBiYVwj1oZHwy+J5sJ4EVwiOuD4w5nkkUkDTj7A1CfOAf0BnqKEqIyyLoDvAX9gPIOmdwmjBwHfKqZJokH4Q5ODeyhdQxsIDXKip1sYGwN7E+uxEiMiUJ1Ob1IJQm2AreOjQ1GXG8Diq7CB6CO40zmxbYO7QCCBRxBtAS56iWFxS2-DJYuvIhBJe2AJonci-xin8BT2TThQANBqQlNdIRNKpaRFgPiOmQAI4yFAH5ZrQucAjQHWCqLTkmAgErfhkMDlA35C0fBgk-HBRNvnQMMCt6P0QuJDz4PvYzNDNRJH0-gjdDAHINeQGWFYULKgwgA7YKeAd4I5NEoAI8N3d3Ih0mk3QR+jPqFoIeVBUvfhQuehp4Mi4PQA+aCNyYeA24FvAD+CPaG6xqjCkuIqwBZTe4jEQOeRf+Dn90aYzEGQ4XjykCG80aaKpMIpARMiadu+IzNQAwOqw+fAl1nnIzyCV2KoNbQoSwAzs3MBQoFMgIrjUmJ0w+EBVCJOAXiXaCT80RCgOoKOAFb2ZIGgAofQijEJAlrwSiNckbiGVkPPgqJJdg1zM482nAJG4ZBDQqBgklC3ZIG+wCEC5xmrmTZ392KJkBgImKQdZUWg2GNitGNBcCGWADfpcBlDqrnQVVHOAEqAmzAsd2lBXMOfEAMCIxMWwkXStWh5AaWaiIFXo4CC9wDIEykgK1vc4fzByhA6wrOIhCj4QohANgKIQzn0fOG24iRjp5HxIU9iIpJqQUyQnlVM6peRKYDiqs+ADsAipsIRuyD7Ec4K1SK+w5WAiILllQorWKlhgOEOJLIUwM9S-MIZgPRBOQIsglJNFwMSI6MIH2BSg7iiUMPF95wRjY2Et4MDj+vTg53B4PP4wHFiyVp8YhTkH2M4grQ2FrBiYA4AWWZj4M4wlZpRAt+TF+AXgV+ohhjKu9AaFlAkAfRDSJBpK97AWkL-EE2Q26J4iQ4D6sLtArugp45k4cIhOGFvMffDXgHlZAVPtEEvqT3DL8tdgxpj4UHv0xsACsuRQ+OrNIPlQWZQCpcVgoMyWwPWwYHXWnOCgncqfgF940ZgY0Jo1YXTFuo8gw+JcaENBEESjTE7g0KhmVBEgeXKM9JOwKjAE2MgQ6BQ+kH2ZydRrfMJoUl1mQJ1gdbBIowzoChTssS1tZRA2ZQGgtMRwiJpc5WHKIGUULMK56MugXnDEKv9GCiZDXNBIrOF4rhiwXch-caRprF6lePFA-XBTYoF4pMg9EK25XcTsigdod-CzUrnonqACbP9wB8L1qgR4cqAkxIUkxLBz7Dj4k56whA9Q-jjh6MyyhTmOtK9IfWg6IMHkzSBdQxbADcmjSMRAvNQNoAz8K9hSXeBQ8-Ch9D3wq-CkAN+QUWggtMtg4e7WgvH00CB1xlgk-UCB6XjAnJT67C9WVwit0tjAtzC25CrAJAxwg+XAqW2u09ZA3GK3CNooVqjD1F9lK7DngT9NmqOVtdkwmEDl2HOC-3xLIOxgJpAnEFcIuahdYPKB5UCYiGk8ggjq4KIQzTCcLGNAK9gdMGLkEyhcaPbEqIhR6MH4g1BAqJ9RGfCAoCJY9pRe1L4dklHPIIWsRGRPUCPA7RDMEElq2ZRxdH6obRDZZPDCSMhVcrfNb6BExBUUzuFPwGjAQ1zIBrsQ8S5OVNWIJKQWgqWdQPh1oKDjllALgCu6kiD84HDkHlmWsOuw4SAohBIwDeBuyEmO8VMGnP7cVcBfEOzAQkzl9A7ovIjB5EBozGh-0H1gyCBJwLxglJBNQOXYMRDu7LOg8pxP2F+gqpCwICLlihShpO5QU5Q1-CMkPpS3CDQQkQif4O3ouomIgSZI9GAQPPMgbhS-aJlwRUD0YJwQvcQtiPOApmRYFAIghoxGTEVgjyh1sOlg5UjzaNCmobBngCb2UcTo0EjI0FgQRJH0BV0JkHB8c4L1MG84B11vgnLZ63AFwCXC0ACpwPpgRq3w7IjIdlCf6GmQVk3-0b1oW6zAyLtwbzgYUGiMPhAJmDBuqNJTir-E58ZWtDX6lfLhLDLgxroO6NrEqzbyGNVQVPS-NLVI+AVZokuWugB8KH8D4xjVgTY8m53rQMLg41DV-EigtIyD0ILgLPy5UDyc0OD1ZOQApYAhaI1gvfrlYTYtIyycjBToAmwvKJaQ8GQF47mmxbrQw0B53WDeyKwQlGCYbJ1wqDFcBpqIA14TYFOY+OV7QN+Q5egmOIup-mAEUIAwlsBIo-FRr0hYMJ69NrNvuIiS6bDMYAlMuQLgqPhU2DjMwHjAPHqs2NpImAbWghWghawrppHcMIinELnu0NintRMoXWPxjaZAKHDIEDPQkfT8MOHuU9kQoIUoDbg08JuN3Aq2mAFgEDzuAHeFXOqPZrTpAx7HiHqwnzLyoszEt1yWDloIZRK8INdUScCniJuQCvqt+CTEp1kD2KGQiGBZog2w0zDzBgdwa7rwmJgQ8UBjyKnA4rJq2L3EfnCzU23IcdhpwCzAQHhAoCAQVg7yY2o0Y6RZJMtgLEjZCEUgsjpcpPN4nwLotIhI-lS8gPwqonQ6hClAcOQzgCK4XWB8wP4wV8DURmlAze4SMCHOFxDwxDq4GvhDhP9g2kD9QO4gplAYpMXdyxg+kL8sgCiOqESQI67goKGwvZAxdIQSJPA5mfheb0AMdHUC2LgJgCrwY3WgxD-25x2zIqiITajVUgR40Vif+F1wFliDUMR8V0CX8LSwkPYGAleAKkBkSMggGzM5oPctagJ1OMvwY9DzeLToDdChIARAd2AVICGwiFhiOF9oe-TBgEhAPMMmkPSge-ROQE+A3DS9mBNAoLDNwOYYbxE55EFQevBfwB0QcuY2cIqkXD4t0GhAgJjOkB3ACOQsFOKygAIS1W+4FRiddNsD8rOPIIUImKg3QEZWd+gCGKTI-ghWwJR4Iaw2sAOAeDyZcKTgKIQEsB5O2xhQ0sfgvECB8mhg7V15cqtAO2BHCMBQliQ98Pe5b4DzENXCZWDELemUtYjkiKb0pxBO5H1R74P2cA44P0QG9BFIcsDhWE2IpvCiBSngiFSl9uxkPzR5BEeylWDuKCJtZl36NIZIvcF7uJljdgrSqI2QGEggrL2QIiA3oyXCAXgbxNUc8EAcgGk8BdBXanqwZ4D-QAzEgVUypKXAGahGJMVg+ZBYwOLYoDB6oBaAI6Z+WNTAjNDaSPVIzSLhIJSg94LzEBow41Aq6VM6zhT1KFRqkoBvgOXAlZC9wH4g37P5tWLAXRBfaOUoN1gT0IeEvrQZxBiU4CgMBNyI2YgISOqIgmjYILzUfKA7AkwIyki4FMmo++IN2HLAX9LUwlXYpAjSKWlgwTB6WmcwrbEkaEMmBhN0YKHegeC5ICTwuCANeA8gXzAbAvVkWDjViFgkBBayQF70C5AhoP6IIHSfdaTQcOSfSBZYMN1fgG+gY0Au9OWo7IpHsAgE+YDxMObIN5DoFPuKDij76GIAPxDnmGCgU2KQlGw6kxkjHF7Q2Ghd2LDcY7Cr8Gx0XNDXJBzA3ggg4CmAvR3xoIng9WQ2cGW4b6hmRCl6dbACdPaq85GN+N4Rw4hqoMRAxbAoXLpwL4jojCHowUCvdipwgFDa7QYAxx4fUm6wvIinA5mAvhypcAKk34AKCBsE3MCTbOn4X63UYA2AbpD5zLdwCIjWxji0Yaq9GEgQ2FA7oC6J2iCm+MHkGYT1qpygtAQwqhCg83h8pNtAMEA5eHoItRiT0NEwL0AWMFNIX-3rwAVQ+tCi4GBEwaAmyGMUKjDzQJOAHL74yOjAiUBFsMvQaghDqIvw+Nzy1HEQWZkblDhMQUjCJNhCCyKSLPciBfAwMBp4rJBt4A7g40C5sCHoFJyhufLw4xjCELHgwrSP6OhA5ABzQGu4YtCQYYbdUgBg4LIJsNjcUL8QUizIiAOhBsC-5D3wkG41rAXQaDXMEbiguCDaCWnAUXQGCPBce8CtfTEQfKD+wKngO0Ac8BmoXs3kQVMz34rHnGpgF-A44ElAu4BjQCOACgiQwK2CTuBY4MdEUdAb0BVUEyDCwC3g08io4EdEEKg4jBegRHDeyMihaniW4MTpX12u8PsQ-wDnhaG8kzo6IPEwKmSY6PxRaBApwVoUaPw54DbYyEA9LDLw12DWANgocqCutkYaNkCp8KtCgji7fJ4gi9yvSF5Y14gQuj0ccZwG9GpQdQSs4l4ilsCFCJoWVIjRQFqwIGRnbdmQT3rGCIDAdTgl7bmwHGRlYKMc-CiFlJkgTCD8KGuyCUzJQIhgtxjqKI+Tf3BtIFfAQLQ3nZngotjw6AEwM2BfrlDgR0Sm8HNAT9g1AStEZWCMYNZyXvwcEHJCDmH5tqdguJyg1BIwdYA9oBNgyYAUIPEIiZBdMwawgDAp+uPZ5hiZsGa2OUDHVIhY-chnUJJ2xNAITTVAUtCEcAIAJuxrYBGglryvtBKMchBw2EAwOuhnQSGgPnrkNL7Z5EDoiKYwjyBiYOr0JXDU9q3yxLoGENcu6JA18DX4bKAjINHQmJBNQ3-OQtLlCJKYZGj1qlxohUCQsF8o6iAeKicYpLxJ-b2wmOjaoBQ8fdhk0B+AVbhVNOOlQSDVRNTwNahKRmVgB-Chlui0kFD5gBrjYZDi+K-A68i+xEaISnDoGF1Ch+AWJOOsBuyQaMFA7LpfoHq5AQ3oQCTwEHGWOCrMm9RrsjOgoMhaJLic8RCcoMNo82Be-CiwbaI6BK5IWDL0dtgQraCfoJjE1iBPRNCwHXBmyHv6++i4RCowsAJVvIoUf6DBCMf4JKROEMaYDdiljH+gXUyvFFdAbaJuQMeI6Zg81aMc8PhCsP-AkqDs6LGMT0B9aESQ1PDezA6QK9UmZK7Q0iCWWkcwQezMYDJwnUiP45lI9eDjhtXJAPzQgDHNKYDpQK34vnL9GuOAfqh5wGmoh23WKuPI2ihm2MlFp6BuwD6Q5xBExAhgmhJIoL9ATPjj0xyEOSB8KhGwkzifqS9WGi37sEk06wAdENOCL-ArFMjauUyAxNv07kiE8Lx4O-ATQNaQLUblwBEYXWBrHKcg-WBOoIGk2lkDHnO64ohSLGGwfA4aYLcI3dDxDAVJ2DhP0X-g8cBncJNZmXBeil617RDRmDxATdiCoPoQemq2nkTsXHjIUDLelqJkVozo+9xQEKY++qgp4O5QCVDnoACJ3qi5QIMg2BALHfcUUaS4ULUo9XOHgMzapODMWNuOsrCo0pmQdBgO4DlIMJCXCHUEiTDu8ElAd2CrqFJw4mC3LF8QSMgLqPKBEyDDAgUkkrAsQGzguzDY0MOwCF0UyIWIY0B8oKAgRPAf2ojArtC16PlwrA7AiCVAJ0D0THbGWrBdCDQwQRDUQrxAY8AdUCGoXrDWUF5wOXhCBQF4C4SESEZsZ42i4BtACLgBoPlpi7D9YL4gQEBA+EH+NCB7uF0QoiC4FGHAHLAtAIs2uWBJAJCRA1i8ME9LxkC39DEtdWKzoPVotiDHIIaM+pB6CGNAB9ijai8IJsgTlCGgQkCZkJgQO1QyBAxg-5jC8gMsf+Cw8AKg5nXxZsq4B+D94L3EBFB7IC+M4EBJKhpK9xTVCEZMZvOdkArgEjAM7LVIcurUqTKw8pyUcvs6hPBZJFx6O2TEsL1IB7ogrH2MRGDdQJMgEYj92FzqDOgoqD2wV1AO6PjcEXCPiFJdXsLFGpvUOdDg6MAkx3T2Q8Y0FBrHApQIJQICgBfwhNDw4OjAm8KFwDdUOUiByOAoUSDMYCJUOTjw4lkoivDPqGKAumT3cBTIH-DcYmQQ-vDIVaDIfgYFHddkLmDwxG+492BAeAbsAmRSyKbQ3sgmli0wQYhMNHMgPaiGwLvO7YBkOJxqRbBu4n-jdjQ08BdVEKCcHZFQtUC-xmvISfgqSIs4okjGmFRUOD0+9AwGTOSZOFqsRUCTCJWkGhphQGPADSJPWMNAqYj67N+Ag3U1WNMAjvjz5CdM5QjQAJ8Y6WgmTAKxrCAskxIoFAbYuKwg7vCfpJFAC4S70G1g44D1cKDgkDIGIOnQ4E7DXIoUwyAreN7UbzSYbNekuQL-ADYcMrDh+j5oFtBYwFRqgGzRcAKkahT8oAF4CbyTsHGgFiAlQCnAbsj+SGOwZOgEGZnomqKPyCgG0BCYSHZQy4iWfBoQY9D8WCygYNLzFOudDZBZYDdgF6C1RCt4gdVRxLf0Ggj5kHjUiJD0oAzEN8ADgBnQLzCgg8dUxUgGMHQg0XREyDOEozrLGDP45bC67KLANASotJG42ijMLP8QZHn1MHiwirCpwDEwy1MVQH6kFAhfKKmI0Ja5qOz0WSTUIGJAFsB5yNsQpf11WqZ07bDiMJ4geMItwGBgd6yLsOVQTuTd4Hnc0Eg1-MWgX2gTpSRADOzjrNbQNfhSYAXOflhtcOsddsBXjoodLvUzSHCIyFh28LyQwMjWROgAGiQcEGqgjuAMzHesiqTePZgCgzDKcrpAVYht4PuQ8mxHCDIehmCpiObkkzoXJOSsGBihMI7Iarhf2BBEYKW0mGsASgDlKAjExUDSRDq4lhBIGtrk6WMkaDtYY1agQpwYgfJSoIpwr2CUOM68Mu4OsJY9PDCddFYKMqCMMIIQqCCyqJnAJEFp4PHp1VKvamdgj2yUIIqYAhgyQM-MBqwCoSuZWGA8QIuIe7hhsLZAM+ycLCjYXyh4wvVkVMglcMo6DqAqFguE+fhcemoNR2BAqIkAYES00JpAS2CGIOKQvSrVsA6TZ5640P440pQDwQ7wT0QN2IwwZ-DAGnxIlMZ2WL6NkoB9aNnQCWwRCyJYUegBTn+p+sDsWEXQ9-AVKRcQTOijHJGwHMAPUF0AhxCtgoKzWBz8Hgb0KUCX8GagVFTL+NJEAQD6kMaYYU5oIOvgvGgBhO06AKB0GG4A0zzE0Iii2YhTmJQY-8R2wB0FrNiQUlrLe3aIDMORnmjpyC9AKnDb4PgMI7CnwpKofUjVYfZw7YDk0Huu5bBRA2lAGDO70Mqr0cDVCDyg0xiiwJrAxdRkxJjAR4BLgJb5PxB5ctVcw+DBZP9gX-hKRigwRiDD4Oeg9zhEOQ2QWrgWsMAcIQoK6agQovWeeC4CJkCi4FiE3rATkKuA+rCa6PoURPAaMNwAxZQ18E-O3sD0EPgMKVQwqm4wmUgFUHpADMz1SMsBOCAqBatSYmiA467IjaDz5NcguwANwB5AN-oLhDrQT7A5eCumiEDGKDEIrNQgEKnQeekx-tKIYETREO1gPpVpIOxhW6ylDHYK-6yKUOHgxoCQEOtwuRIpyHfw0q4REsRQfb0Q4KBOThA0sL2wNSD2BPrA3Aju7CFQDyD7BCJg6q2qYLOwBNDAWc5A2zEvVrlQZOiCE+PTlshgwCh6TGVDGpVuE+BWLjLjQHn8nZcQ74DBcOXoMGTlYeOIr4BKkOQ0ZWDJOcPqE+q4QEkoM+T5jJS6ZOKk0P6QIbiJkH461WjTkPqwfWiTbCiWnvAqZJRAXDCBULeAHQVAuL4cizg1CHUEhEgUWO8VApBJMIJohMCT88NQYxQyeMY0cgDFMQXwM8BQEC1IUZkJvAagbaLdDFzApfBDpLcU5qyRQK50wxbaSGEgKinfJFxAxEYeKl7DbdBrHHeoPMCYbFeGzRQWMMa6u6BHIOiQPmgyQ3IIkMCzuCjsRiTN4ILQXMwSQDKrMUBc6pvUdbD0EGfwMGSTQJfwA0NQ4ADg9zgzSAZjHiz9M-MQmmhvzWQkX2TeCGLA5WzSiIMgemrQMIuI9rFUSPVkX4DJwIFAJNjFcIqo5T4fENogbcCoYJCieVB-0LLo+WyqMHpd3PhaxHjCYP4RdOWYOMDxAgdoJlBsRBJAUf75IDAwm1Wyqhtw0TCS0goQtFxgXQdgBVkbcHhQn4OyI0bJGKQy9Xz4ZJDnDJcejeii2I-IHzgz5GJg2GpJKAyowaAo0L8sGhCAkB9g2+KdeHvIOoQ50QJ02-RZ9cnQ-9AKOSqEAVIZ8CZQekCVuPZAgZ4kDHqwnOCQ8IuwHKAXQPbQSKSOI65I7UAyKASgmlAmkMt0-kDJwDHA11R7AJH0wmiDgIcQ2SBaIO20hRi1ODrpCUBPmD0eNXYFiETE2-jVHMIQa0zxQOh8FT0NkHjIiAwjJNtAVm0GAPNQH2DlEk6g2TAaSC7kHxBasNlAXsJnefSwVwYEYT6kUhD8EPdwzYDHoMUmARQPYFMhQGAWQi6FFaR7uP9yUPBt5Dogv2giYOhIEVRMNEwCZzAA-MX4yxDsMIuoayBfeJI80q4DWO4o2LD2GFZM-pBN6B31Ch4L3vZwciuf4OiQVXKT8Oq1JxB90JiDTjALYA7VmuhAwP1wQxooQLQ0ZtnFSPl0gZDtxdEQXvCtvRQWI6iYGsFw0UDMpmW0ycROYM5AuVDiVBOQxcAKUEKq-9CjgA+IDXjNcDCQYjgHc-oQcaDrmCuAegBYg5sEOYiXHiBYMig4ANxQhqCC0JKoyVBZIMLwKYBYoCV430jC1LzUoMSXmIeMVOZT4LkQb1CE7Ado0iAOcP-A4xC0mNiUamiL8IzocJAqFq1A1aCfpNuLiEAhIMFdEZBdqMH4suAnJD-2CVA9HZVmWZQx4AWkUqhTBpOg4sTlUCpwotgNyWdg0Yk7YMSIUWCjQHQIifwsIKODwMhoMCigrGC8QMFgD4CZSNmOokj8EGoSmEBcoE3QKkhuqGuysKzV-KBoHTCrqN9paALlSJhApOCFiHWg+NwMIAMwXuCeIKIunOAyiaL1JtRsRP-gT5CmILTQcPBSVDGy1KDK6B0dBHV0IMAc1yBOkH6kMMkOkMUUQQhIGqfAslZPCS6InWCl3EOJbUAtdHO23IjtsJM6hiAUkJ3IYMrw6D+k0bwxGGzg1UQ2rQPArsgK1g+QaciGaBeLh7DNRCfQyWT7QP6QKP4TWGmQwFTNzVusbhSTENTQ7L370AKg4mAmyIGkT0T+kDCq6NCncBmoKXo+dEXAE1B7yPGanXQt5jQw1fzBEDou8xCy6LPC1VKXKJFArlBWtIJoyui9YF0QXtREkLmcHXZTaK2Yu3Bx8GGwggDUYJMQdsg2oP44L4iclFJUNLNZBCMwmBaQUFHEPPCt5DmqVyKtMD9AHzArrITgmJDZWL1AnmicoIuwi1G1MKMjJdDAiGmAcfDkaPWWqLRbkP7e-6ynWoTYKP7eTVYgfzDJiNLorxT-QPJQlnmwIEwgCLilfMq4u6Y+pMeIE0jFsOHgLML7oC2gJkQLwMEIbzgCkE-wSmDNq-8QicB5GCUIQb0wwOQ0qBBDOvhwzFgDGLDczcAcxPdgnORXjFf0sZzw46LAm3DbkEoAb8C15RdAXAgpVNx5EwgJnGGqVgQqTLCalyCbiJWKUsT8PQ3A46wSKM4AsohZaYZAQMDNfTlRTZCPqHnQc0Gl8IBsVZ1uMOyopACEOC7A1ATFmDloBBbB+P5g7giM6BEwvIiWjN0omnRExGzgiEDJmK5xz5CDS4OAabpQRDGAAMDJZBQUMDRToN1Y1nRTmPegqv28IGlwUqjN4LtwxXBbIAXwI+g9AI8QlbVcpDjBUewtfMYIq6juMDsgmPg7sMMI1OAaMIHy2NgCZD6UE+q8iKwwz6ghKDGgU5hqANcYc74gsDsCy3Tf9RoQc6DlbIYII1ShtNKk-j1uoL2AX2StsYmTfCCf+rqc-aCPEPKcZ3DgIBdAXEWiyHvIUeTtUIZoN-hM6LzgbBTZjHpgWoAMBhKIoLDywGoAFiStqNw5LODkMILQgipjZFvIqkCFOQQgaxDGIHmgDOhe4NEw82jzEJhctUQTWFTkrkgXRo3IBaApQDcwV4b6kApwipi5ILBiR+hqSP445UwHQP0V1ICHQPPkM2DK6GIAeRD0oA5hVGDCCPOgWpn38BoQFOkTsqGwQ0h+xs38Bqy6sMWwtSDL0ORCqBAGsCkgrgilgHvClYC6nKhwNo1U4JQYdpDd8KZwdTj9sLBQRiBjTcnQe+CmcJTIq4CnwuQ2aZAU7ohDOKukWGbYiTBj2B9r9ilViG3IFEDfECKh4yDqdBPwx1SZ4Mi4yyqIOQ3Ys8l2mGsADthpYGuAelq8gEa4Ax62dMTU0iTIqO-wcArYIEkwj8BJjjk4sowN4rGUCZzWszro6BQsqIZoj3RiaD1A8qKFlPjAlYChcETELPyokqziUqjBMKOoBKAKsJ9QP0TOABeN6WBDGo-AvjAQsNLsvMDMEBqgUGoEUF5wzrCm0AfQn6CAYFMgfiAHaD70lAiaUFDgc8h6YJfJDv6SqMFkdCDGoAOoOIbh7tMoXcDrANuAx3RV6Fok56hJcPFAIsALQNQgkiOQoKmgYSTRprkgJMAxMNngREBYYMNAPqQayHAWVYhBphVccluZgBlYI0D05R1QZzT2wALAOyCQMFTodhDmmEd4r0CnAOhAqEgOsP0QKosXHH2kdHxj2Fu4WDIWwBhYZyCTEDMoXwBywNRo9CDp-ClQLeDRsOpARBjKIH5wHKDCQHoIDA0pVLwM9evyQPXqamACdIGoxjCiIEj4raSYIVwQEWAcqCqEW4Qw6QkTzeBtwBKM6BRCQDrwtJjACAagTxCokq9AbDFbYDfEBhDRmEuA8oFPkCCwONgOOE1AK6DkYuUg8lP-LT+w60CqeOpFwwid7EN830C5WG4UgaRVkBewDjyJqa0LGIz9WVU0hxCQwB8gcWGpcPGGuYiXmLTAe5DyMEGI6UBAQDAwTHJ9JDk4ypBFW1W4eAhsMF8oi-A9qGW0aSLv4JsgFRSOdG1wACiIDMioaWAsUIV0JsBecPdwULEBeCRSjZCeAGLQN1huoMEQcMsPiAZAlrCWMPso+AwchN1AFoAypCHolFaDGEvCe-KESNHQ5EDrpYBsFaBaLIwgBRz5kNTw4xY+xIUYfzClfHK2B0D8HiTgdZK6wPxCLaDbIGCES+rE0HgIaRAOHgTGb6AUAGlmuzA7gMrFFxwwwPmgBiDURr5aBrCmwJEQ7GhqMD4Qn0gl0OeA9EiLiFU0WpHNwAlIv2jfG-ty3SkuoNBxIyA5oA36YAvEQGjAjWv+YIIAkcDAVA2w0Ja-MNhFHfDdEAvkWhBCqqJ8JkplMCcMLkCaiMwYy14YskdAYMoCbOuAK3gZyI7yF9JCYy1gUzoN2IPROfnmwCskawD5kE7gzxjIqLvq08BpkHCIEuB8CAmEIRAzeI+IlKChKipIZApMhEk0rujGuiiE1MTc4E7g82j2GAmgXfAcQKM6qJhUgOY8UeRvZtfAKVAWeFNV05BVEKegSt0nkuG5PKDZ-eV0vbDO2KIQB9Bwa33YPnD+-sYwbPCK2easHxDLcNGmX3adYKFgIyB25Na4Z1AYUxjgXnSYMN4IGagqcEq8OUD-+P42dfTElIkNMrAXQMzA90BDYEA+LyAkzdzAcfAFWlNhPInxDTdU7ggcqCwtoMhRSPzgK3glwpVEBZC5yI4I1Fgx0BzIUpAPOEZsSYzbWnu6XyAm1H1g70AVpNDYAJyTEDsgEjBkxAfY6SDFwJVYXrh9WM-Ms3BocM0inhjckKOQf9CyVgNIg4B1gNdITwlaJIKg7Io9ALTANeQxMO+ITLi6kIGwSUBRdPtQQYjvICMkZ+CTvjhA58CRYNRChKTMm13IWrgY2IrAGODUUEgwnTD+kADgCOB5EBg42Wg0oJngOsBYFINTGHCSqPkoVL27EF0ABSSe4MJoyZgJGI1wlfgnDMX9OmjGVB1A4kCRaBq4jpCoRDfUkxDUwE+ANJT6qM3MrU1NcNXCNrDhCK6Jw9ycRIsghbGBQOvItehJ2QH4t2E4+Oh2dlgT6owSXgiyiPYUC6rcwOYgMaDD-DfE6bDAlIdw+sC1y5wsgfI5VVp6XxCjqMF8TYBcet5wJJZvkPVwSLjjQCMkCZjZiOs45zALtJ0QZzCUMKXIIRzrHZ7u9UBIMMNCgTAjJF5Af7iM5BGgeLCocNLzxnxoSKbwpB41Hp+L-Ix-jP4gDCAXoBFgnmgA4IWhlsh3+G-bT4UJXRSgvPPVIK6gvW71oBAg9kSvIAJ0XWSf0tkgtphDQBa5+4BfbJ3Q4B79oO8giQCm9MZRW0HXcqxe1PBqoE0bn8g3MIG6+HJYxaKg0iKUMew8VaCZINfACUhe9I56Rrj20G5AXIPYEMZYi9hIjvKgk1jpoHBb6HnotMxYWuBMQAKk2VjvQBneYsBhsHKwhqlHRD4wzrAG9MQQQHhPOGoA2NidEmFAt1VViBpIEiY9AM6YlHgNEN7ZOVA2cNuEhkDkrJmAwhZyQpne1CoCgPqgjcBlgL7IAoi0IJCUxoYvIDEQucDl6PQQbUADYJpcZ2AryISMW6CTWK3AeEALzpbAobCeyAwrDzijqCqFkcK+HDEQ2ZT4IC1AhhioYJxATHBYmQ94hmKXCGToXiVfEIzGfRCRkIc4CYAqwPSgs8D2cBu4QjBrAPDCzfjOAHU4tWCn9b4oGYHQav2RWRTLsNyID2LJMHWwBHhw5O0QF1CjJDaw0ACiSFkD-8C+HBgZXqDWuFjEhMDC4CgIIji6nDDoyeR4oO758li9sK50oswBeDUg3zoE2AQZ6HyAmOeYuAwDsC7ALkCNiKJe2SBj0Cxk1IgzkM2Au3DtQBtq04K3cP98cdCPYBBEOBjIQCygluGlwKIQZyAoCO0wh8AX8GpoDkIhu+OQ8bs1-IMgpROpUE-wZzvyQGoCLqAmoG6W7bC5EM4EiRj0AEXogyDUICQoMDA9sE9Qhmg88J4MS4DFuuOg4MgeKtSwxtA8nP8GUcTEQHsAl5DoFPco5KwoMFPANuBikJ7wmEiBvoCpVVBqMAmgYTDjGCuIeiCqTN9IY4CFgEAs-0CASFQuDrBQHlrw+uzK4JwYEXkvsHvgqOBAlC3gkJiWkGCERMA5ICsQaRPjmWm0osDF1ISw0cAiYC8wD6DYKBEUb7C9VGgAe7rUIPfwKEiHcK7oPUZyQNuQ7gC7mqngaJCywGoQx0CN6Nsg4sRHltGYB2g-9uVhI5PZjJ1wx4Gz8jygd6wG9BBAUdDnoP3wU5QN6DxIrKB-oAUYHyAH4MMlFz3x1H8GtnCwUGdgxMBnME7IfKCZIIBjzkDTKJxA1wj8gC5ITeATbOHg6+gVxC6kDcakIPIgcARZYA6gA4C8iGrY-pA-NJfAhxCe8EP4DOy7OLtQTQhArDfs1WjXEExAQKygyObAdQRsgmyLeUiGYCpQGcAvhBpgsGL24G6gAFAycBpi9TCbwFykGGyhWX+ghxAK4BjYWBRu8FUwB4B9pNdgi+BeuGCE1CC6iGCE-jAgOnXG8f2tS9LQrui3uJyw3cDYOjK5l4Ac-UEoBZQFNJ-SvpDWKqZrIVaHUaNAVVAPIO6bs9BcMMY0msAuwGjQbVi0PAXOZph5MBawp8IYgEBoABWGaCimVolPDQPYzxhvdqugL+vs65EgETB5vhvVfWBBiNnsa3z524hjvNResJBEkBClBr1+M1BtcJmx30AQPP6QW6V7ACpwPDODsRVlRYAHaGUYUlRqSCV4npASJs-AmGy20n-we-RGVLzAziw0MO3GzMF8K1ZwWmRpYKBQSTBpPNlNkWgutHzgJNixhKi0ZEQuwKwQzNSrHGjACYBYwOUwnBh92JDcLuT-mGng9BCGeAB6uuAf8L-EOXiESBtITLjURAsdrqB7Cs8xGJDwmfmdqBTmPuZkjljfsBggbliliPjAQqDODFRAvGAfwGygJRiKFFgkErj+WM2oLcjRwEtQ05zrmGCgw4g38P+YZRgFGGcIo0A6e-0oxVSocIhAOiAJQApQTlM4CbeA2dDr6AOw31Dg6GSItpiyHbDFeKBEwB4QDngioM6ouUB5cF7cjDBnNNfE46yDgJKgyDRbYEBg7gjiMWURWMTGNAXAVYhOMC10R7A+CQlIkzhE0NBAA6C0tmWAljh9gAQWdgAeKqVqtgCgsE1lLoXy3dC4emDGwMqwAcih0FwwjlggbG5UE0jN4KagDbAuQMJA9WRlQH1Ynnj6w+Po1THRmGXA-8gT0AuA0wCs8TMIFvCf4DkQrfhjoN00nWEqULnoutDswPIozLIBwP9wjKgKulVko0zNekQE4DjUoNVQq-gxGDdpmNixOL4cHnZGza92+sAMBD3w-euHwLGcafztOuRj9UA-cuGg5rCetU+YBNiY4NSA6k7Q0CbUbmD74KG8Y2RXCBKA6fBo0A3Jd5lYFKYwdXEqMHqww-yW4FWgbghi5Fp6Lv0-SONABOHD-J1I6-uRwNSwCOiCaLsqZMC7cOWwiei1QIvSe8KkIGDAS0AEFvDoaTzM1ASwNrCYSMECh76MIQNIkXRYMGmbeMDnEKUAUFUfwoTQZkgDoCDrjlgiLrqwxNQalE1wv8QkFGHg50QdUNpIKci0PKRAehqK6H9wNMCOWMag8Y6QUiLQyujwsI9RWiQDXNwI8MKJGCocXaraIKggee6XHEIQ51AqhETao4Kr+GUYO3gxMIRoevALFH0IbQrZcPVkshTLwFEs0iQXEKgKZYCmSKhAjDD1MDhoh4z8QjvAFQhYIBBEMem6ZNMA4TBOjHQY+pBijMbwWiyP1YkwWG18QMgGBmMUxEFQZF5cEHQI+8FCkAqmHvBvEJbg97Bg4CpJd7sgtM2QKoAoIHSIerDUgMKgd6yxYL4QWfQU6CDANiwZosPmA0jYQDZoDEBFw0-w5bA1mF+AoSCZIF6YgeAFqId5h0BjqZgGhaxuYKfgXvzkQBVQpACHQMFk3TTzYJ2QjyihdPyMXcBseBUA05wwZCbUBRpIEFgweoYaxOLgEmCWaDSIlnyn4wKUa7rWYr+gDcmnIHBATSD-rEmgVasV+NpDA1BmEIJo4lD0zo2pYtDygbO4OOB1OMioLUiJK2og5QAOeNmM6PiRIB9A0Eg72Oe4XcDU0GlAXrh+slfVTLhn8P4rMYBgwOEQrahXUHWA3yR7urXIYPaxZlWIyECSmGQQ7kBrIChBCFhV6ChrnIbocGng0j0GIdv0C2PyoNJmTdAqYAYQjXBe3OKAPUDw4LiQg0AzuI2QG4C8iJk4olClBgJoqiRRQJkQKUApwJPSAOCiWF7wXL3LiPVwi4QPoO5QoNStoKCwyXBftRsE2FBgKgAby3x-iaAgNtG0DKdhPiMhgjLIAbgO8hjgEBkOsHDWygiByEkwETA6hDFgFFjRUNfQi4q-oObghsTOdRwQ4OickL7IMPAwu5zAH1BIoF2oBvTNgEP4HqDRUKjah4B-oPXee6j5pi8ooMTngRroi-jBJC6ImAaSsAwG17SvFH6yWNSRuNzg8DBtEAQm-RQvsAw5PjgaMAMwiIgYlBqmpmy4kEB5wcCzwuQAvhDncH-gpQxVMEBwhPIswNhgSNCCaNV8N3C0iEUiAOj8Hi57XooaSoTkViBYMOHQXOQ-sC7kF8x0QNqt643TtJroMFCWjN3w8xXiEBkA1FhsOOCw9-Bw5DGyWKAGEJOArrjokGjywFArEAvOZoaxEFv8aIjXSGJy19sO2KWw26SHOIE1CyCb1PJYd3RRMEr2dYBhcIZgAbjr6KxgXsDt6DQwK3hXySKMQSDtQH5YLBRMQBOIDAbtsFusCMKy+gcYbiEWeaR04viJ0NRoqqMfODPbC8ggbF2o3UDSpAHA3zgwmwkgrug66KcAFvBDAlzQOUhd6Lmos+sAii8olACWkAG4t-TcUmsgUTKLIAkgTISIbErE3BBElM6QAWAbgG7I5sDw0IAwCix9SNHgVLCbxEOYCOQhqNukUGp3UBtIU0DSIKdAL4zBwI9QUD2XLHxi+fACAISkDvBwWITggaSwU9g4WwRQmN1kDOwIwmx4KnACOE+gT5D0xGOAp8IRphtqSkgxIB7CZ3BPsGPcM+AvsLs4VETYiKXIRJDJ8AUkXBDQqCjQJkDisv4gUOAqJZ0FI9xMCOas2kA55AxAK3gWeN8lCNBZQKwQudSKQG3IaWB+2KMwZFxOmh64yqDsqNqQUUhy5hiMnkTp5JS6rBAyRA6QB3q5IB8gpAjMLOdAJva8gKGWifzPzIjOWDJhQi4UDSMztjrQ9nCNyCBkkZoIxGW47kCkaO5gW65MIEsw1fA4qqVlKJb5kLZwiFTXGNCoKoTYdNmMaCCDYFzA1MTldJdgXCC4oPHkIyRkOAaBUaTRKF7YLyiBaIegoLDNW7fkKySWbEBofxC7IE4YC7QngCngaVnZWGD2Oui6wF8Ai-hg7ktgGEh+pIdILyDWglqwH33Y2MwttJh7wF3iJdArJJOokwj53kIgfgXoeEPAzqjcAE0IWAG0BDqivcjeOC7wvC5zGMkUtDwaQBegqBADYWdBfQQx8FL9aEgvViZKIWClsOq9hOQLwF8KTxDPmJNoDeibiPRAN4Fza9tAo36H0IugEghFIINAWhwvvtjAG+1NkMeIHJhiUL+6wiQ4qm9sO8XaILQWwTDcyJ5o7FJAgf1wMbLSRF1gcYxgsMgQS5b43Iag3xDyWJ-SklqysAHAq-BMciwU++AyiORAqVBB+nb17bD6wF3I8k6ckEgsZsBn4OuA1FDZiBggpFi+IJHIGcQ88KBgJdZltAdL9ED5GHOAIhBbyJ10UVANqBckuUBTpddkcrD4cNdULuQjpptgBvShMP-ExdRfbMPoarCPkPdwoBBRYLQg2xjlEMEAtSTBZGCAgvNyPPOEt-RE0kdgZOLh7lxMQ-jXCOXuIuueQBVAk4mIQNugZWBEBLhAbIg0lJpoH8wpQKwrCmwEUAYgeiCJ0ETEgPXqsDzAXExrJkP0b8gZoA9QXKSpe3+g-Qg1yD6k9NYU7hbQzrSqcMxACUCOknXL10CskHUgxaBnUDLjEUgfIB9SxnDesPNQkUDlbF9IJGjv0LnQOiA8QbDs7SAcQAFwAMGkQHBbr7C1KBC6f6BOYL-E-AjVyRxUG0jE7GoIJZARFOeAPR7-yKHg47iJ4PYEHzjGQO0omEhXCBmh3XZUVEq8SPVVCETSBRCcGGkuXrDIQEYaZPjixC18V1BOVG80W+698Mfs2JQTrvSwanjtAD7EH2Bna9kwdZJBqP7+lgC+xLfjQ4jFmcIWVYCSICBOM-CVYAo9R4DtMPrA8mzygYOA2C0UAAmY+0DfJCBAnqDXwPHoP+IHabRg9yJztvQw-CjCfq2Cd-AaeD0Qamh6GNhoEjDzaMeIHLA9Bm9QWQStmFAg05xmQChcyeQWkEmg4kCjMEkokDDTEBiUgKWuCOPQuBO8YDa1tgB8cH1IkQgvJs8YtTjzzjSUTWkGoKzAPyY4GGEkcOTy8NYOV6jDXBGYlUKUujvgCmxs4GQ54xDBcGgg6tacxtRQ5iBEuE7gEUhEuG0wD8hXwOyxncC2cD80hwjJ8BAg-wC9IijglGCjSEbQKmTVwreAd5aMwH+gifzlA1dA5yiYiKDAQHh05NFwAhiUuo1IV40eFoBsrChHCDmwdpj3IgbAfnAIMCTgs+BQZeSYpIyvoGo4ttAXzMfs+rBtWAmAFMBDOt0AaeDC4Pz7YSTaxFHEqJAbajtg4+itMBKgcQnciBEw2igJUKQI+kuHIAwG4URSoD4wgFD0YDj4A-ISIM9FRcTRh1RwpZKIoKWYMvCa0BQA8MIQMCVwGPBVNN7UH0AqzNzAz4B4oAtWQShYh00zHkDNRNAuHKDGyDcw7SBCkGyg5qCULHvIYCC6GL8wHsvx9PwAfCiFgEZMGNBawJBwJoCX+Y34R8CddChJ2sAS0EPwrbFeVH9OkfRXvBxoFTjnBONQFSjUB+WA46w-IMtgKoRsREgaiFS16Mfs-AjaKKnAGZAIWPmAc8gkDI8gB+AEeDmI+xD0bm087ehPkIEmu0QPBwPA7+sikDFg5iBA+JCwaOCjqTloSXBREFqA5qA8UUgavGB1gihsjFhACqx4TkBxdGwNUVvpoLjIPgJwQBxkfHB-EDk4KVaf0u0KOSB1IBgIWvDnIEKqmOB+wDoihm4U7kRUX1D-rKcoLoiost+o19oH4Ggw9JDB+LBwIIInDPZo3WRG0GC1HlQKbDsCARYREigIGhqDQMIbeKCr7ZPQbkrNRAXA05gGWIZoXHp1tgPAjUhvsD2ovDAlUCyoRGDjrAfglDhcmUI5ZkCTEHrw81BPBLegO7SEm0U7SJt6YxZOReOl4OUeeZGXgAMw9kQhsLBiN6CJGDlowMBMmmdsD7CyqLSI8lVGVSpl88s5OHu6LvBAwI1w8a3U4AXQempX9D3YPlic-ivwvlSEe6h2fEjMswUkEBjxwG84NA6k6qDI26BYXrqcFaDWVCmgcFisIGD22IjIQKQgFaTJIL8QCsDMENXmIiDSGKgUEDwEScXUgaLYEDy7V4aysDP4S1BkCBbIljPQ0H4g1jDAJOgYVEBqwaVQW0MqIGKQpPAQPaQDaZDuSDrg-+lawupA90DRUFx4cIgLyJZ8BPwoENPILuQTUIAwP4A38N7RukAgZC+wQSCyKvVo86CGYH-g6BQBCK1A-cXPgCwYJZB2C4HWpmTbkM2g2XA5GOO9rkiCwDqTgdZbfCusfaRWqEE0EU1awCm4YG0qQJKAqmC1cd27jfhccUvcq4AtoD5Hi+AnDORDeRiF2KJ0Z3BJgDkQkLDTMHvA5E5DgPBAyOC16OegkLD92O+wGNA3cBbBNw7eYqZQzvgjqF7gXtSqMEB5RHA98BeU5bAUAHZYP3is4k74uSAuI2sc26SVkG4gWnoKcClMW8wBYOEwZCTURk2+koDSJypkH-BLMKngTUgeTgKylhDnQFVkF7BokzIE7UAWsD0gt6E4wP8zTdjsMHmiOUhxKKeHdORhkL17E2B4wC12B2gj3FoUS8wVUNrE54H86LxA-VgyyGhQRNKgOJ4AlDjh3nXMFRS-NMBCZ2bFoPB67VAx4LdQKfpruIZLehDZEJ3IjOiyNLqQRiA-IBOwB8KgwOHoVnBZlJsgLPzf0BToZxC6ZHqSjnpiwCeLEEgo4OgUbjAu+KM6CZih-gBATSDrmBm9qXoe4Fp6RMSqeAsonzBsMBawVb7zAHnIM0h52DN2QShYhDMoIYbMghXNILQO-s8YeyAoe9pYtxgijJ1geLDQEAOA8qRQ0LhU4AjusL1g7+BFIGZI7DDce88EXVDJZD5kYZBwiF7CluAKujzwOtBH8PBALSCIQOn8uYjPDHyg5sjz4MQgTTqb2w1Z3Mh7UkNATahuWLlgLaNIpLkQZ0D4XpGalmwqQBroJZgN7OX0QUA5iHuoruisXposS9z+IAwGCtJUYG7ytwhExOqwTKAoFCV42EvoUJW4YdJrgBcgmpC+IK6k82gkoGiQL4gjLKRRkSspVPYUldhbhE8JgCjPBAjQYtCpMA2QabRmCfxYe1KwQalQ1xB9R-cU3WQCgEqgfnAqUFrCTEC2eqVT60R0COHoq4Ay4E9Y6fgSNLP486BxnMtgVMjGMLUw-6pZBCxI4Md8wE-wUYhRolggiyCxx7TAdRgUoCdVPHrakEEoKedyQsOIqJKfodAQH0CTOP3w1SBgRFKo2LDb0ROb+FQjQG1g-wD2kD2wkVRwQF9Q9eCpdBNrfKQhELtwMu7DgBZwbgoS4GjQ7-EooIlAJKQjgLUwoBAicGrYeHrmyIiwQhBDeAi1nKC2YOPIxjCuYL8sgMw7cGdAEhjsYEWixHA1IHu67Qou5EiJFMBB2yTAfUgkI-BWUqgREkvCTUiQRAF4scDTKF1QXeruKOasFiCk8PnnVnCokEeAbmAVGFLQQ-D5xHY07gAZ4Ko2gWi0JCQAU27QPNxQUXSKqHVnKVD1LlvkfFs-oNrkCuBs6kewTYBlB35w1HsO8EewC2BkaLzcjlgTCJ4ihRgfQPzgpAjWIEEg8wBhsFcV5nzTznI8TUgS4Mn4D1BgyoNU5yUtRl9L1HDXoBaQUyCfmPX+XEiUeL++vvkQXZAQ2kBcEOnQe0RyAMXAsTgVQG0wM2DB5AAVt2g0QM6Ik1CWOCEKGzj2kOCEcojXGM6QDeAyUKmSB6DWYoewrKgDYc6E7kAroNbQEBicRD9ImRA5eFqAuxSTOlwwCYdkMDHg0aZY4CyoT7BukK2YstxfgOcM6FAYjHIYhcA1-PJE+WxjpKM6ZiucwAy5ehAFpPIwu5CYSBMIqxP7QK9ABaDHcLh1tjBl8Bpix3AoCPmAxODLoCpwFKDtPc387PQpoAFwJKTrwOp04uDwwsIk0+ClmAqwg0gdMPCgoSpOlQBAN-ADgCZE2ZBeIvo0-gRUfg842kQXUOTAwufXZCagb3CUxo8QtMC5iMIQh6CgxJaMsPDneGrLDaiwhORAChBa8+awlJAQ6S-ABRBDAiBOBBl2+BVwiMT8AJ4E8t0mUDfgUei3gNwDgXjScG+4T5D3UHMjjuBoMIhgXAI9oHz4AEBEEKdALECMMyVEToF7UmwUJQxG0IMwVVDePg44K9jiqkgamragQPH0r4AVUENIoaBD9LIbb4T3KIqoHGggQFEIPojJZLC7oiBpYptwS1IRFJ+k7SDOfP3wCmw+9GyY-QjXIsAQOgQaMLqcZU6O4NMgH8J7MIhIJZhD9OA4JkrU4GmARBhLILTgR4MeVKnDU6DVsBYgGzjLXjJwyOC5sDkwckC-ENbEX9g3UAasqTKW0HnYXIh-cAiUYoDrmBnAQQhHh-NAQYhdrPjQrHhMGGJ0rgglQByXz1ZpSVXoTl6FRPDiMqQsSBOyTqgHcP3YLiiaqvD4B+CcMEd4ISAMBCmgn6T6SA5CzXqbiNeAz+4IWLnA18CV4atI5tOmZDOgiRggtGpQl1CAKIxYcdBaenoAJzlPwF-u53C9YMuhOoRy0ByGkIBsg5MQASBEEI6XodDigAEAKFytPFisxODdDJx9x+DHdDBkpFiYMKzEsefFQH3QF81AxHAg46Z4wtG8euu84F7Ul+5ysCZkdaCBZBngOYjRQA3s6oSAJTEQ64CQg7XgXEwEIKlwWYgjHP+5zNRcBlHoi8LTqzjg81vv-bdQ0ao31AR4Y9hKxMGg7YBbyERWycRcTCVAGFAH0DFAVZDEIE4JnKALhJC06FBpwNlYMdBY+fIYAVKh0M8gr4C6QEJS-ohNXITAByjwxL3wCNpe2OqgsxctwMEACCACkNgQ55dHYM-uWMCOuADoHKDwQDLuxLDUCtbLCmW1fmQ2+rDb8JNYyNE0eOudhDi14AosYWIvsFOYgu3kqDf6+cCcKhYQNcAXqHglY9CnYOTCL1Zc6lRUeuqYBuaw6ZipQGQIXyFuqFxMBqxauKV4DaAPOFEsaftFYKnwDhDyIuVIYZAoEMH5I4CYCgQg-kzjp2sAzDhzZvcURNqqVOyK8kDOYYQ41CC9xKj+HnaquGmAwWAoqEww+0Cr1rfkUpzXrA2o0iCRsO-QEPN3QJ4YAzBV2JZQBeDbGFZ0zPj7QMUai6BoUKLwHISPqHEoFRiGCL1oIoziYABHYsCr49FQdUBRxENQ0Eh9WC5GMIiPIGdsFQiBpGkQAZz8gBbIWogl1kN8e9iHOFxSxdS+1BgWVQhy0IAC2uS56ONQMLCyVsNAWCA-EH4Qk04vIYsVIqDzkTGkz4CgsCPoqnA1dE6o9TBXCBvQANAM-D0A2VjjeOYS5VNWiofEPogrJDNg4lRhCM0iTmDjoE8JDbBYZf+AirB9WHyk14jWxpQYS+p6uVnhlLozEFJgV0Uo1X-jrUokaQXABST8ALmTqUD2MFSwTPh-TrVE6yBe1HoAHEBMYPpwd8OoRPtL1USN4MVWuqCiJHVa+qBeCK6FndBioAKN1mITGIbAD0t1WujQyiDEQOOgnkTNehg4W8zIoMvQlZrY0PBc4jC7EFxATuDKYBSgagJsK464WGCyOmkwMeBeuOSoqHDGoDfA5WxWtJftdYBQyMVZvGiNwEqIqODJFIkgO9hrIEWioXB1YiOg8+AbOMNcF8gLgDwlnEulwAlRVmBVEGtIMRioFNMQUI7-EJJg4xxWtN8QAXBmFuNQLH4t5MKoPn0PAta+TpWk4LiQvbvwG+VQyAaPEC8od8AkVU3AW8bvIA05ulDJ0GyCWsQpyNtAGDgmRFN45VDlPseOA4AIBEkopjCZIE6M1iUmQFkgkBAyJvQI8WidEowgRHL5xBtwUb5zIEdEjcDD6rB1j3Qz+D+w9tBICmDBLqCp8N1k-WL2wOLK6lRWbXDAMaCjLpeAAfB4epKHln1+wHyA92YqQAhibBQ0wJggLTSywEAwlRTiylWAHuK0wIqo8WgjpkOUFRQBCJVYM-D5QLtQB+D0xPuAVnD3sH1nHioIYu0A3ViUIfSgJYAcxLps43M1oEP4s7B-cEFOo0hgwLiQLkBruHWgo4KtyE2QJkpkMMhgRUj1sHBb7gCRYE7lipcKbOHQT7B0INOgRWAf0HsDmZAMU7vghMCaXAjayWLMOOMcAGQ0IH1JOai3AiNZJtqoLZ10-Ux6CUPAUaPv0NYA6PgAFabGsNy0iBtACATb4BnA56DVqAlAFVAWMG5gYqAqEGkakcLzgGdwHrgSmFI0uMiNSCQY7sy6UFEr-5huyOZAQkApgNCwVgRtCuP90dAA-L1AyxycS4twm2edwPGgQYjDBaqIkbCpiIZiLCAA-KhwDdgvhPoQAohsRNT26ZjCFr36k6hpkA3iLBYtA6q4aTAUQAVQCUCgODbkocDboL8skED-ICI4VMh5EP0I-oc7WFsWrYKsXqA4BtomZENcpXEo+yeFuRL-YKhBqaBV-taCsZyD0PzoTahpqB2NihR-ZjloQ6TzIOOg2ECd7JM4lKDjiDLYyYidSMaYhOC-wfOR5QghuHykVOUtwNg4jCBt2HtQNvRueJKQ9Tdc4KUAZWDGgEUVoqAdQCWQV4DrmF7UAKDX0CFEAHB-QOdg+WxDYF9sd4AK1lOY+bpzUAYCKhahdE8gFIgHDaXwOVB92DMX8oFBUJTIobaTEGxdBSQDtC6IZyA72LEhEmBZUISw1Cp5wM3uU2gf0G5ULUb2BCRj+dCncLkQNmiHp1FI-B4UWEB5bQpBwKDECsDmfIFAXUz9Wqng0ShOEPxAD-CjJCcx4KAOINVoRyjxu2KRDeiBqFOK1MhZJOQ0Eyj68L9oyIz1ZPMgt8gRMDxIqcCPsLywDSjfvatdhhg7eP0IgbrW4FDQQ0jRMP44pvh72wJsn0jpWOQoiCBysHswp2A9sNSASdu3eCus3WBiODmgXFLtUDLgH1IlDQx0IbBXi3jmXAi+KY-IqMBNgIhkXtSi2PnA4Dj9QG4glkdG8OLKVMi5EpgGlNi5Q6BAIigXoHD7-vB3ozfUrMAT0L3whSASKIuwCUDRsJCw061NXeballCjomFwNgA05DGkfqRiEDlAdR14sI+oY7D9YLnGoMyRuB52-6ykhpgCFp7QqMrMVZywIGhADPxINLDifWBU5MAc5rA9QNlJN-Bx4YtwOSAIxKbwVuBk0IGQ1cDvNSOmn2AGwJtwyLiGIOAIewjbpAJs8UMioNUu35CD4PDC2RDoAApw18RHlIUIVYCssKl6BPRt4PfgRUj3OGx4aWZe-eqwDthCwDYcf2Te0DWYdASjME3gAsBciNggeUAz+MmIi4huMG4wkWDlQHpjMhSy8EwIiEApwKutjFg5IHmgacg5y07g6+hqoPAINfy6cHVix0RuQIY1BMgRsGvI2zS7UNTAy-hqXgqwiors9MsBesA3oL7IcnC2MNcgILqncJfwvZARQKlQnP4SmCbAI6Zjt8cCTsoy7pqinNDHnDAns+nXGBALUzzOqOwgbRC0PClATYinRMNkQeX8COdc7IphkMnQW+G0YPNQH8CtqDg6gsABcC60NSQEeOh85bD2FCaI8PhVUE9wDtiKcGp+5MDusPZACQQh4J5Ay6iZOHWg3iADQP4wSEeBaFogbXC4QK92bxcmSD9AqxBUgF64jcAGrMKoyaiOwPH0DziGxEwIkmBhPmhgQrDJqFrIDMz84E6Qc6ZvUIG4o2DmII6oWfwtoP9QFUBlQ6cAIiATkAHwQHA7sEdAoMgLwOpp5iC6wBOQXu0caNJEfljSlKqQKsCog1duACjYaDX80RABTuPIvYAJTMsQsZxa8GT731liZ90gmqRigDp9BBZZojzA2sALwOtAIhDmQDPk-2HhLMqgXsAI6j9pGHJR0DLuBeCvIHtSIiAWWBtQgdZQ0GlA6o25Et+AGchlzWm0z5jkYIDEIWAmQHQIf5BmMzNIayvuMFEgQxp-QEO3-RTRpmWUfqQySCLareTcAFrwsWDrsNGYi4pM5Iag6LSV9FosgVBj3PD4zaDFsBUAenBLMA8MjEy7kIhYYkIBcPUwUiWhQM0A+3Chls+Y20CRmlgUKM1+EA7mZ2AyBDgAr7A8MI+QjeD+iJmQg7DD16GQ0wASwIcQ7MAzJ5G4UBiO8k74iXhgsI9gAzDtOs56OXi1YO7sCUH1LpGQpQBj3PbgQ7zSiLoAmTB6hAZAH4TtgGUY-B6BaNo6eALtKDA0l77sZCxwIowoelwG1SDZ4LFE8Zo7Ze4oS6jaRIdj2RBHsFcLzpCHEAgwVbp1sHYQGzix2NbQ2It8cTT2-SiaXH2AZMycLGJoNFAY2BiU3xBJcGeUU4pn4BigEoC8aPwQoMi9VORQH8LQWDVYxcCSkMbpRiQzYIz0bcvtgL1YxsgQdb65fYwVFK7wGJDXCOMgO8f0IGgAYNJRxEhsWhD6sIdA+dBHMAE0-RoSCOgA-hCxRFiE4RDVoDlG6yAjHIRII1Rt+CCGd+jFcAqwKgjkUP-4kJgiWJGaf5B-MK7o0iAtaNkjarBh4OzbuMhvONDImbDnlMJoJzn9sNMwLEirNoqkzBCw4rkQj-DIoN5X4vg7F3eA40DVQRZARNC0bEvgS1KymPPO05woNDkwYkDYEKTI54BJwFgkGcjCaLPCZUD7EOeoy3xVZBIwC4C-uimgAsDSavyKp4DVrNeAe+BENrZAnEA-xPEwHydmSGXAvEAAUJC8yWREkPtw3SQ6IGXXkyA4wPNgnUhewLnA56D7kGE0ggD50OrUo0Ax8MEwZwieoMEAamAHQGsAB3GizCG40+BKSNQELkBuIFmIAjjdzEw0tNAjoJ1IUPDlwbGU0qRsdD6I5jxArP4gd8ogTnX0axyBuJP6okjfUDCwlADViPvc2LhuIZV8BhDeCdQEVHbzQHd881t+zmhSc1D8jAKUBHKIYMH4seANkGnZZKQ54NxIyLBsvNegCNBNaVusr4DdoIy3IdsHPFoIsNhJoPrAdzeXHPhQTLijTCvQedC7UEZAGKRkzHDkaSmN+CnQEoW8sJpQ9S7w4Fwt4TDq1BZ4kHCOCByAJFUAIJSwjfI+lGu60CCRsKTwSrxoMAXQSxD-jOzAHrj2FC19NSQDXEygUBAEhokI3pY6yf1gu1GxQD4wIpD-EHvAh3DBMLltCtJ4EGxnInB6AA2gSKA+xAKkm3BdZGmQ0iBoUB8S56D9FFzMcyBciAG4L-A5gsJggMi7yG2ijTDmEJqGvqBIS6TwkIB4uVowEZhziLqgRiA4wEQgwhZhkIkwC2IfIPxU52AtiCOAfgiNwLuAkCC5INv4Ii6T0B0QUVBHINX8b1ivgnNnIi5oYOLKnUi5iOCokpAvbgpQunhQRMtePdeL4OZZY6XVCF8G0whPONMI8RXYVEC0lKAPsQzomGykoD9EWghFwLfYIVBCOGag8sAXzCWA9UjS0E+AnniHoGVDEZBNKEBgQHSVl1wIHTBFqPKcbdgxdrdo0LD4CtEg-yrryEMaiRjXVEpw2Aj0wIEUTVwvQGE0slaECWiQlmbJcEwwH4q1MPm2H3h1qOhwxDFgRLMx6kD8yJ9Q9+CByJyUr7DHkzQJLSAvMGTEd8BuIeA471dxgIrALw6QcE-YUGpuJQ-I+DBmEDqipcASkDcQISgw8gyG3rA15FvLfOZmQB7wjhA1COQAG0OfyBVwjfHUgwawKagBwKjQOPjSYdkwAXBVkBdQqIgLoDAwlVhCoNdgx3BpZlxAvigJoCHgmZDphBUgrrgaQAwGxLDn6DvgZDAJQM7NM3hIQAUYvUjhLBQAn1AyBn4IFngLIKhtHx6LitPggKBu8qtgvem2AHDkrLBemJOw2-TM0LTouzhryPnEEsZ6GIIQhphDfAz8upAaSu2AElI2eMnA05iD0GuU5AZU9AsgbIJwIBpgRWAqFkkANfxmEGJgtYfmfKQpMuBfZLvQSMhbIGagS5qUyFrCLXQ0BI0qzpTDXAirfNDOsDWoBRjDeNyIDtifUO06wByQXqFAbkgUyFdEM0Qdfr4k8+S-LEDENirH+Ce++qCm+Cl0lMjzQGyCl0BiMaIgmVj38EMMJVDoh7SDRzBKRoBgfEit3WIgv93UAuUwxjCY6OqwnUVIyA0g5BXotJzgLhZT2G4gzqitBLdwicAUwAYI1fA2aImDskf+IM7kyPPy8BPQJZDs4ERAvIBrlGT4WCjAGunUleBvEGzqB2jJN+DcHsCoRCb29AyPsPNAdbi1YD203FJ6nn1Yupx0Q31QJ6r38CbIkMAmRIhgO2DkiCpQWlIZ4RhIwmBxoM4Eg3FZR2uzfQQxhDUFcxgI2j6U2sCN+A0id-CEwOC+CGDRILXKbHT2FAMwUOpvglvIsGIaSBSgOmDNRMOAfuF51SXWr4LBCFxYA0at6FNV4AxJ7IUoeYBPCcnUOTiUFyHgx8s5el7kENQpoIWAWMCIDNnQ1ag-syOmH830EDqgxXtVCH5O4pIBwHIUsjo4aEZAf6DGyFPY1CDBgEr0iFQVclgkzJRAGwWI1OiIYJ4AuRIHcOEQW2DF+IWsBY7F3EIg2QhV6GkPA8COyO0oryOSYGrajeiuCNVO9EBO5EGoCrDwcCPEMu5vsOOADbCcwEB0USzCqFZtutM2UNB7Z-AYSMzUtKStwASg6fy7mqFgwWR50GDEsOg1mIRoxWAZI4Cg5VCkyGdA2zT+PXJCsQ7b8IOX9pT2FIHIdKWCCG4AMuP25mdsGEhR-NSYN1jcUlu45wyzwu0gjvD5urGUfsa5fjOIzUSjqFWQg7GU6H0gsDAgmdDQtyylsCDFachZiRvEBZJaeo20QkxsFMOIYeOWOOJAXriUxiOm2qBPwEWrOrnsuG9ysZRRSDu1R9s25HLmAsBvwIogWBiojP-Qo0iWsC02dhBoWrywdTu7MICYBNA9VqkOk+hWIAasnKBOVC5uouAdUJwsmjYz1nzMUeQ-bNBY48hCEInAOgT09s0AheDnBOx6kGi7QOQ0vWiv4MUmDaj3YBTIxT69WBMgRiC14KTBVXK4FIjEjUhEZFSQIISt5Aatnjlv8KQgTSissGIw3GJv5GLSMnAcWK3oXtSRCPmQYLDVgVqI5+iddBLAE7KGYhK1-Iwo0K-keAigqFpA4OeqeNS0sKyQoBqQDMRWNxx7yDTUhWdMlMimUNjYBVjlgFWIShQ5MHeoCLgmOKLMN1SXgKSEnIxu8ICLHcDp+OLg21rjrLe2t8D-rMPDXUzUmB4QPji7o0B4U3gh6CGtyOB4uZEQ+jTJYgWIo8Rse5-AlhosKIikKNgtwKbQLEivtNcgX1r7qMFg2SAEwJS0n+hTiu5Ie9HkmFigyzKWaAA8YQhDXJMQtHjlqDfEurAKJ228ZKTBAAcoZMSQaAag-fBTmGLA5KDfWURkRMQJmPrs2WiD4AsgJBDSREueraBaJPCoMWA44JLLmwTJUAVW8sBuMF+AHtR7AFzVEZhFBk9Q8Oz527SYX4ANIJyU5Qo4tHhHMRhFwNYgalDBJGSwOCBENtkXL0AFxG80nIx-ZqRY-1T-fPYUnNDUQvls9IPhuT9EF-AFpCQAbPBAaGCAWiRhkKdgbyDI4JdD-llZbN9AgKC-3USIGjD1qpTGTZCHSSt4T4AoYrYwfgjGA6i3PtBod64KTqDjeMqwr7RlaOnkTTNbhJwQz2jynFM6rBBF9PxwBGgZgEFIqpD2FLkQxah8IOX0SBr-xA2obvCq6PVkfsB-QMlHvjM8ZKAg1DBaxPI9Ii6DJF4iEvBlYJ6gYmh1tilQBgC-uk2I26A5MOZC1OCE0N4I9-BFBi+huu1n4Gy4cOCUtIlA8owYOI-mI8ppe1kgTAglRL7A1yCk8HGMr6DUiA0wBlhyFOrAYDbJmICYWUk0lkTQbiFO5NuE71nBMDTwxigEeJ7wgTBhNC+YWRC3wD6kbjTTDbkg-ZXK5KCw36ghhnpwzYBvwOZk-8iDsFyREbAoe9nggJDhMM3gE0BgsHMEv90JwFiEn5QQ2-0oGeDuQOvIdBgp3p+kzUCNkIY+p9Cw4qRAaFpqaC3nkICeBInwA8AreDgkFlhnCHJCKJCKWA2ohiD-mLd4t4BkaM70D53d0NSk+AxY7XvChKQV4OvoF-Bx0IuI8TDKSBDsqcByAMrolWZV4Reyi+D8HgPortAkFLtwycSxXVT0vfo8ervjP7D9WOcwBqwIPC1AcnBQ0DloBSQC4F3MgEi44KIerTzAEUgaBHgrougW3UDSiAOAnzDJYj5AR0SUKzl48UCAwKhzR7AFlELA9AA1ILqwc4KgsJcselpf2NMQxGJ6avAAJFJasDt4OKR7uLuAzI0i0H9AbdjyKGTMmSBc0LPgG6j8AK0vkize4HV89MRQwPNZtUD1FwYCzrDUEHHY+iDsbgWg67DUtb3GC2Aoh9TAidCIZPLVkZCRyLkIGkD3OEP00Nhs8Cj2tUDRUChw68Aj6EmQbpDqolIA7kDEwN7UXvDpQGjQK4ChwN3AzeAuoMY0kcICOOI02hB8o9IiE7AlYBKYWaIu+A-IveSrNqlNrZj2xLXXaxChRPTAP3IzKFoUSrwQEK5I7WAIQDSw3WCTULaYGFgp0L1o-HAiOHk1bHQH68VQymw6YEOYmeDjkLzA4eDOXAFwKLBqYHuWtnroYM1XhORNkOal5iAiIMdANINSYCugD2CGQNsZqCB90LahPaFZFPzMcNiR8BjgrSACZH9w8LBokOPItlRXwIhUhmC95ClNRv3fkOG8QYeWALGcw8nDePYwQDDWYpuwI4CDMNbw8u4e0p3jNMB8KMiC6PgnEIhg490wIL4gx+D7PR3sP0gOQqhIi+CzuEru7Gg9sG7wcyAVSkWBYVPkNFJgizgPoFkEpFmqgJtAy8ALWDF1BSC3aJGe64CFkHpAtnuM9JR43ZreiIHWYTDJcPTgDKjp1heUhyWaXLyxiIF8NELAwYBg0uokekDYCL4k0x7aJJQH9TugMI3yhaz5cCcQBrNUU6owtu1tMHW4Rrh29+JUe8igOIJoqUCZkNVojcidEmoAeXBZYAK1ejw7eElEKKB+QIc4nXgdcD0gqojSpA9gzTAo0KA4QiAAKKGQiuAqoPNoTOTfpb4wMygewkTwzyeBupno1mJJgIfg6HBoSFd2WqMt5AmZIegWsDkgwaC4BXyapmOtguxgpIQ6cMWUTRXrZy2RtFB2QEKwRqsfUIoQ54D9QCKQqeD2cEWov8iPgwdZezApIF5w35ALqIqwgeNokKscc+BaiLLA3mK-up1IJ5cpgJuI4MBxEJ6KpXiaUMPoEGAg0cLURrjJ5ESgWuB6WuOgpoUJQJmAx3SYwITyrHjmPL3IQRCuME9NeMABYLTInnhZ+lU0xHCkCBpI+nBuhGHgOdC4kPuQlxyTOHnKL5jQfDSgVbAUCLopo9DqKBaKtUTs62kaxUAHKY1I9sDPY9-FtCtMQGGqirAeQDXAWiBAQJThOSCHkVBAe8J1uJKYA6D+CLz3lhCi8B-wekBVEPggJqARsE84NRSCoAwQInx1oFRAERJgu0CgSzA0IGW+X4FZYNSM00D3HqnwMMDy1Kntf0AI9jnkHFSleCcvS+AAR6ug5agPkKEgThSVWALgKovzgLOgqWso4Gw6hPJVuDGAfRwMemqgnXiqcKGrr5KFwDcOdWuDcJczw9QPoDaXnWBmLFSA7UDa0Ar30sgmfkTAVsOE0LcIWBdQWVfNm4t12mGqf3DTjZjdu+VEoA44IyyfUKmg7Z1oigpw7iDz6XropSC8wL-LQ-Rw8Gx0KeAgxVrAbPDCrEz+j2CgM4OwWBAl0B3gn9HbWqc2elh2kETENaynkB160cDehAshENw-BmEISY7F+AmgsFjaSN0oi7D4Cm+QajD8KSfQSI1NOilAIKxFTaQM1IDyYMOAAji7gD0Q8WhMgBnwayDlbCyumlzm4Gfwi4ot0A84gJLghEYkggATVBwQM2BaQKNqsgAalOOsQjAVVM5V1yQ3YlS9fxAI6GnAbuDG+DRGK3XhudBIuCwN0C3QcuZtCoGkKOz5qSAQOCRcnT-2AXh8gL5iaFpAuwPpjn5t4K849pBW5C-jthAoMADosIQuFH1IWoApQITgfCDnqCjg11TmmHhAF5Tr9dOQgAJH8JTYttCclNrARLi-FOgYzPgwMH-QeVDtEMN4V1CYIFzQgRT3OHyAkKCSM4YY74AcVHuoLvQOcKjS5bCL4FrEnkSPQDGk068U5XIQ8xXu3XyCbkrNkJCgrvC6ogT4mlAgTmVgGHJtRRXEYMSIxJ4EwuUp0EYJgDAhhgZAECC2wNcYgtDy+CvbjWCuYG1YJ6iC0M1Ai6j3QEyqinAGCESgr5J2UCevUYgxgMiI5yB7SqPxupz-gCnzo4B-uC60jhCuuKwg1wj8ZqxAoMjUIPbAURDm9HAtzgQRYDtYiTAfOx94TOhX9CeosNyIsE9QYKC9WB8x9Jj1QPQQ-bB4oDXkCcS06AOo86CkhKLQxGpPCaUGusCqtnEQF7DeyMsQRUC7sFF0lBinKNVEoMih0CaQSUCVCA+wTCv7EJCgt9DQloTwrnTFIPxUqrekQCmuaYCLNi18CRg5sNRYOeRxKNGmkMDJFFggc5oqYINwTUD-UFbgxpiC4NfQ13oVGMG3X2RnbIAoCpb38N1kYGjgwC9WOUArcNnQgWTRKP86N-BAcEqQkfTusCEb5n1TJNZwj6h1gtfE85dOkKUM1Hew2J+A2Nh12okq-3zkFUjI17SFgqcQoxC2VLjgvCDygXOmE-Aj+vWgj2CASBCoNBbkAPBkxXCRCOmgEKA4pEEoQWs9oAxA34CUuhQyIiCpAthFRaLKkK7Q1MTlUDV81F6cRETwVmCvgjJANfh3+GVQO0AwkOxg7yBMEuqIm2D1sMsQMhvXGJhsPv6KrAvgCL5NCJY4-ZDLSMYgaZBOQN0EXVSm+B-gPT4tQCQY1nR9YLLBApR1e7xgR7AIuOcw7-lZd2Gg5GB7uvxYE5DVCDxIqxyncAqmYkDHgDHQNhiZpErguMjdBFWIjvA3cJeizURUJrbXhTBPcQkYrajZCFoQYnQswPlhtgDxyHBIFECgyFeG2kghebzghwj1KEuVjUheuMevhgiJ8PewS+pxKKyavJD7UAcoXWRLEMrHGsQBcGbI9aDGNCzAahAMBFgoCnAT8CID8EBgsC0XpkD0AG40isCChtd6o4BHsOuwtMTmT21g1CDU9mIQddq8eCPc74iYAtfQI7BOIqdE-OgM7AfIZMQdMPa46zjhcN7QA0gLD5-2L8AmvL8FgKUf0DFgDjg34HfouuyWaLb7YTS+nmIwpyBaLLUgyKjcEPVIkbD-yPIYbkpvwBQgodDaQB3vCTChcEUGcuYwsIjE8mzl2IeMSyAYlCQMKaoiIE9EHzjBoOOblKBQwBs480nXevmAfeUhqOox14ru+E6oj6hioMh50aC0JGE0P0hgoFl0-iCoUC5LjFhAoH+QXzBL4N4glg7u7IxYGzA1gEswserofFq4KhaOw8ioqp9TSGdsHUBN4Gtt86DxwHd558DwQLveUOqUkGdQbBREZHO2RvAQoNMfYpDY2OuA1jA72KDIrKjVDiNA3GJ9gE06x6oAbMkykqixnDXkGpDBwB9SXgissGs1UgVpsQVQsgBbuExgwmA-8BA8GqA+cCkIQDAYgDoYwvBYyqevsRCUOUYISCyZIOcwVbjVUtvJJpBE2DwWYbAJ10naJqBEBFrAByiMqMLgTwlFopk4t6ASwDAw8WgcpCiEJkrw4ETwRGAEeOhARyDg0w4o5JhrAIBs2-TpmdfQOuDXuIfgfwYN7HlSC7A1rJqk-B5qGywgPqRbyF1w9EggTrB3KxSEEpPQveHfsFvw+5CQaDtAPRzCtGZaAR5k4q+AF1DMoSBsIGyvwCBO91DSSMdwCcSnYBU6WIiu8EygaZCQ8F0YIIJawCkEpQCc-snknIz7KJS0U9gMFBqgWhm1+C2IyfXIyeb0CNp7Ust07Tfj0CzAZBCST5xEPPBzQLTobQqiwHoQANBcbQ6wBsAaYmygJEFagKziIriRwiXQMcDRvJEg1YFTYslgmAKPsCnQT0QPiCvY4KC30EogDqDpsETsOJw2+D0HVTT4UMCSUO1cfKvVglszhL7I28M7oI56EtAjANIkLkCSwN8qZsAwsGdg1sbqzDRGIQrkYJSY357bUMlQATgRJRg4WcoXIGcSyyLo0D6UtJhlEMgQQ-SEEt5wsQ4ZqKvwdGCE-j4w-0A1IAhiOeTi2DU837AEwEGInezmqERA8EDyIIhAqkCjVmGgEiDjiBUUWiEedgi4I0pgtAdZh4CigiQfAcBDYJmCAChwIJW4H8JExK8URwg4ZFIAnUhKkJMg6NALmHdAw+D9LQGvy7cQ8JnASqAjsOrUl31yGESgTlVFtFSwsRCZIOjpxvCIZLyInEBQIMHHdwe7MJCUA2AVUCqEE7CHOFqxOKoA6MeIINDg4GfwW7iaUGUwZseR9IGk9yJFIBZsqYiafL9hrvCfD5fmbBQGkEZGFcR1BC4zl0DqAaZusxQnTJzQ9k6xkc6oocCOCAwE7-TeKBNA6wBWFBrIqdA8SP4QXnC9o5-I+-OjYJWkNZhbb51A-BCilZo23yTRmCRBzaAnDPGHvBZPWIegSKA3sgRwqppFiMfOPkAaYiBshRi7kKIgxSbcND0Ar87kwNl+NKW8YBCw9mA+ZERwObCdoEB0v8bWHmEwGaEsGJeA45Bikrdwe8KTOtZU-8hZsHmrm9SHjOORo6jtKITM8iiKH+rMYLSbkAtYLKgJwOxSXEDCqMOAigvcUg9GdNzcyFzIGzh1gtBP2Cg+OOWAhiDgOJTGFnDQgE0IBxiPsN7vzoTLfKu+w4il5JVmf9DXCCtwzojgoIVAz5hjsNuJKEh-cFa0guDg6O0QQ9l5BDfktUC60BEN5uTWcryw4pJuqNCWdOREIBPqj0A6cDoYLBRo6-RM2GgYpAAVj8CzsKIkLFSJoPPOyUDnuG9eywH2QB0Q9YBXWw2wF8B5qmqgdAgdwKrtRMR1gh-A+cD7oIRw12N-L+qGdYCRK3woHuI-cpwQeXD-fMGgYDAkUkjb8GSSqIEwkpCr2XQY5k77ObpkMbKvUCTwR3gDYXm+Q5R7ILxA82jn4NIi1AR9CPaQxZTXwk2AGAi6kHMFFiDPq9BYH8A4QIuIZlmVCDOE4eiWUFoU5bBhxZZmeHpkXLcw3fCcRNKkrJBTt-etXEwGNd5veAjJYKqQRKCrFCIgE+W4FN+QcyDgRoTgN9QQY3UEqcCRYI6oALj7OWKMaYDeY5m2MKoE+Bdko5ARFLdwUdBdCGcIERT5C0FICFg5SCqZDuHG8MpgOaC7kHCVAfgAKBIgw3mmwILkohSXkPsQxigqEt0QHHwtaHn63FKPUC5GdEUscE2oS4CZMLFgHGT-xDewe8jpsNzInWAbUG8Q44h2mFhgRBgZ92mA4MSAQJNOt8hd3X9z39CVuCFqo1vEKZS6+6h3gCgQsvWU8j3gghBDgLvjaeG8eFHoqnjAGhab0yjE0I3IWMZQIAvkRrzg6LQQUqgghCdM-mCFILcPx6BYEOBQsCCeBJEIAMBvyHjAAaC3yLpAYTAmaEQoCoNrsqQIFsgnGMN4WP7BwOuwOEJpQDSgKa43VNu0leCqJMxY+iDjQFjD2GiWbAYwjDoHxrD6XlHkYHGcplACroNQcORV2Ewqb61TOr1Ywy-G2UNchZADgPQg+MBmdT5kPMBTqBWgI6YqMPKYlT8P7myw4sQu4KyOYdyywMNyc7YMBg1Bz2jfsG3wdmaPyClwBIa9aNrykn7rMQOAF2RVkOcMMwBeItTwy-g0TV7Yn-fN4CWQDuBYMBSQ-1RPyIEUt3jzgLwwHdxghETnvxQvIPc4hYju+GoAtnS5QEeALyjD6oEg8TAhuFlAPxDryMTtmqSddJJgPMDLINOcYGjgFixUHSBqCKDMQT8kQfLrBjD5oJhsoZiPkKxqueggwLeA-0GfYIHmrBDgoBFI+ZCpQIUwA9h8wKYg-MytpEUgp0BYOAFwuFCsoIrwrmbIqsrg6Hlsl8sgT5i5ENw0aSB2ENu0YIqWwLZwgfJj0Jnq12QKcFrgXMANIAXQ4EDaq3wAKxD0lvha3YCRCNv0EWDKXAmQMcATKKf7q0gr8AwoJ7XjkNwIdfTIqNpTmIjU0HWoL3Xw6NbgjlgmgF1QNOT-EHov8iD+v5hIFmxWiiwUKvCbQCuIfhStyC74aNDkqK1Alki5sN+wU0CLNlW48ijxAs4EeVCkhA1bWFHDFoGwCQCKeC7AP4AVGPkgAmR+Rrp4f5CWgdTcZtgKLEIgQhMJMHyCZzhvFqWY9a-uABOQchAO6BhIGhoaSPWqyCgVIC6epsASCK2kgMiEsNQIPmJrTC0LywEijBBAaaiOpzJwU+BkEPJAk0CQiMDUT2DXiF4iB6AWMKLw8VnOYiGo9pR9hOcMqOUzePaCI4BQQEaK6rXjiAFAUCAqMC6sBMA4uXGACOYvMKFTjKOb1N6ogFAokDt6fYxGX5j4sIRbuF+IX6ABACTAlLrh4DikTqg72LGUr3Y25KiSNgDC33xIlZBhRDEY-ljnwE74ZCl9CMio92ZonZcoBqy20OcguWBDqNIsAQiqQM2ob++W6i5AU4mbiERwm6sbIflExx52kJaw7ShQH-NgM3iqyKEglbiMMIwgdOne2Uz410BYJEX7eJBNQA94W4SXO7x4mlzsMKR0WjDj6d7EuuBSxPhQeWBcoFoI1CoLQKTxHEBCPQYI7CfciLzUWG7Qa6lwITE6wIdEGahbwAlIXWQGCPAwahtGJHOAvsD8HslASBrX1YSw2igsVO+anXjO+fmgB6DRpnfaFQC9SP5gSCwN4uAodsgN0KYvawD91D+AjYgKFNUIHPClfP8AL-yTe9TwG9CokOuAxSQE9JtgbziwWOOQGVRjpLY5O8DakCRoJcBauHZYpAiXgOYI8tRqAijsi4TBQCDcqQKYqDzwvxDaUbua4rLuCP-htFCjkGxrawC64O5AwWQXsKpEXcgSMJS0GmKTQBImKUBzBFPAZth7wOwg4ODTkD+jZqApd0uetxh2rzF6wBqQ5J2AcMCJ0EBwXHyc0FjNVIge01mia8jotOmY4q21iKCwChBTwA+KpWymoPcUUMla8A0w50RfNLDw3mwokIUwB3C6eJZmI4z60AwA1Qgn8K3bzXp7uqnwRzBAcKnqRMTX5EGI+xmSILCaUiz58H-gThBSYNOABrA+9F5wx0gkEGBn49CnIJ584SwxsgNZY8zl+GYWKgjzK19AJpB9YDEYeQQsDGcQXiK9sIuITZB+smYO0SC6p9zTV8BsaWgg1yQZqOKedWMBFP4gyCig8BtT4ZzaRI+ojbQtaN0g3FIqhYRofSBVwGMUQXeGYhMg3aCtUkLh6pDKD724e9DiYy+w+tB8ANi1M4C6wC7EqXDLdb5AiMRptAV2RHBceqAQSBBIuKcoOrgAwBoaCoFThttAgaSlLDHAJrdjQFmUxjDqoOgYRLi-YEIAybz38Pyg+TejHKTAfm7TZJsE2iBcesw4F7BPesdUfOUtgu8p5IjHP1ok10BntikgTVxkMOx6+CBEiGFhciA1wL76LmDRQKagFXCIsGSkBPgyQOMg2yBmEICYoiSWZh0QvLCMQPPgsCCY6DlAB2gsSFx45BDu+LsDmOiIxOMxq0BnbzIE-1QbxAbwIlVZYgo4J-kAnml04BnEE5Iv6B7lAWcD54PAwX9ABvQ+giKvmAoBzzEjQazllJ5i0ie9JUAPD0lHgKuA0oGEHPnQaVIu8htKBaxAj-urMFpABLAa+5GGhr4AXADVwWsQ75QvH12ssYnQWg-3ByGjioBFgLZAHmAoN0cISiICjgC00N5ooxBK4CEaEb5BrIF-g5KhyWw6uXPzAasNFmbBQFwCd3T8QAUgNSwASBTEC9wnZ6HjUPzgnDAIIhVuAjYANcbgIwhBdiAxEHwqPKkGT+-dlEUB4sBIggUgFGwDdhFcpQ6lQoK+qJA0maRpjDONhd6BYkOCwmnAGIAgQyb0JnpFdAH4BusgbUGzACxkUxg7egXIDGIB28EUQDKwosg9EAqFgbQPCYBVg-s8KBDE0C3+umNN1w-r84T5iDHPUNrwJwge7gNkDi4HfoHF0ZEu9sUe8D74E5GGaXHbId1Bo0A34FIQH0cJLgy6hRzKGCD0sHDgALsn6R4AB38GpSAu0UPoVOQa-jOqGuHqpwCoQpNBVUQQWglQIZieZANPAQkC2ACJgMIWDjIDv5UEB-yz+iAwxEZgMGhKoTFUDTkBC6e1gvpBK1Jb-y34OOsOWstRZCjBSCFfJDx6XIEjFg3JRZcDBwOFwQJMrvA9ADcTjqtBNITbg1KQJxD9WHOjNViZLgOIkBsK5IGbirtERoyS6pcYDz1xIGLbQWfqMaBaYAO-gvmANIerIfKQE7hNcBoCPlADEoZwhBoBKvBFcDj4AdAH3hSqCuMBH1DIEWyya7A0sxjwBI0HjUDggxGompBvOF9gNvgTOAa7JLzCN4EpDoLAVTgzcBksRqAljwL3ABeQx1YxKBa3RCgGYIT1ouIUMRj+WBryBYgOdMjBJ8YBpWi5SI61LNEep43wCvtCEqsgQPuwozQ0YAxVjjvl4sHRAouAHbDqKDT+BEUJ6IE7B+YAZhF2IIZqY2Qj0BfYATkBBYILAWLofzBooBEMCEgGoAGXAlRRmeZRsH74CZMX+EgCgruh+xlbpJOvJgQKiBpmBeQCdIEFIS3A8ehpyD6iSubFIIaOuEqAuPQyKEO4EEVSacnvAzECLNkgoPLwQsA1kAJUC+yB4YMteKKQG0hsRA0IBTwtGlcNAm4gytBzAR6hoKWdjAqrhQZh8IBDDIHWRTg6UB6MAs0kbNLjgUHgEaBA-QSXG-INfEOcEClBH578AE5cDGANNQvD0RkCPqHacJqgFdKFlsUhBEuDqMD5wKuAG3Be4TLST7kN3eMoEX4AlYh3YAIQJ0fXTwpH1bDzoiARECZoS5YTEZJFirEDDVL+gCm4SBonzjb4AAcEu1AaAZ+BUqAI6l3wCHiQHu+gcWLzbRF+KG34f9YVrQWJCxDRwmHyiVHAqSAXcha8E94HOCCoA6yA31BX0Hf4JpcE3Yu8hTyD9YCDEPhQXSo65hRaCCaCzANX8dCKNyBaAjpsEMgA0ccQgbOA2dQdQAygA2gBugzrB+Khu9Ge1gi4WdwBc4TJiuSFw8vggLmAeoQ7kZl8F9GsIWYNWGY5Q8AikA2YPCwTuAINMEbSQiERnJrSbikaBAgmjbtCxCNhAE6AhSA96CFgCQNEWoNvwAXAnKhT2ErSMhlIuIggAHkDAJDzsAb0UnID2AlBzwGGpiEcINeQRaIx6DspwvQHvydmGlZBMnCNMFNoO1QfPUJkpyISupGGqNKka6QLXR5FCCTj44NCwY1APdRjaDViE9iPGgMY6FMg+LTC8H2vB99ffQh0BQJZMdTWQGnpGlA1jBe4CDMF+IJcQGVWkERjKTuswOsru9YyAj6hCNBEKGysAaQdpuSiA3MDSRB6AF1ACGQXllUiADYVecA7+YjSSfgUQj1LlSgA+IKpAocBc847QG6wAQgGE2kp43MBO4BcnhdkIDoyeQohCa6AuyI90AQ0+AwJ9TugKnsDIUZLQtJhpBaTOFgQAaUcWUrrg+4DQOXTLqMBGFmCUDxSSpIHcQLToRDYfqQSDBa4F1wIAoLUAL4QXwjcUhN9K6kGhA5DRP9CWqS6yM1AUbUVbA3EKBZAO0KkgHaAi6gD8ZQwGGEK7oSsgG3A-8D68BdSJYQYLIzBAc0CfSBDsgBAJ8Oz+xbKjgDHg5pWEa6A4xA3IAlUDnQK2wM8QjxAAYK98BpYK50cDAiIEqRBiwHW0iMsDioc6ZChA9zhlSLuQK+AjxBHwAmwC+AHwgajA2bcTxoqgG5vKGQYIgjYg8mp+QDZMNwQHk4K6A9nZbuFz3LKIFdgKBRHxDAEADkAIYEuspoUyYjV3TBQOYQK94RDZMiCKcHezsd0QEY6g5Z4QpBCqQHiTbJg8ABnHruMFsQDcgaDGTaIXIAiYCNpl+IL2E+Wwr0CTUBu5CXAcNyrYIBcCqq1n-Jk7S+Aunh6cBygMHJLqiJ7AieBwdCfGFDhpgGOyOIOBr2hQ6jHYEUgMrQh4w0mCcAGGuH0IaGQOKRjXTAiAuMjX8fR0uIkbrBwhEU4JmQAmwv5ZeBhTlGuMLGEESo2YxTIBwwFMyOUwb9g6cgiMg6j013HjAHzgjQoUt4uxEDkLR4NTw2GgFtYc8DCYBWkUcAfSBEEB8QEOcIoQGlAteBlwaLT3BiFqOZ8AFhBXnBfhWaQKxgPYAq5JK7CaoGjjqMwEMEvxArwCjGjyoCJYHNA8UBsBBnL1L4E0cTsg8RB+7CwAE2gCgFDRgDrBKdAI6BXRhwxbaIKCB-YDt4BUQHIYd3gWrgsoBEEy9qHYyYTgHw093DiMGHECeAGcBxyAekBbpl9iI+MKjggMwwyBPkE9UMfsBpgX0AoYAvsFqJurgGFUInAvBAKsDnEMP8bNAXKBq+AQ4H-MGFzEaoVFRnjC3FCAwPEQO5gkbspQSrEAzpi3IfBghKdGAAx8Gs0G08ePouxAShhEUQysIBICg0tsBeNAsqmUwB5camAQCx-gCIYAIQMoIbiQMgR2XTeyHksH5YO-gbBQjoA3clzoG+AMGU7Ght8CFglG9mToWR0XsJtwh8gGnBHwgfMQoWhT8CT8HHEIDEE6WWKAFkCi2DH-HO2CmQxshxMD4KG8EMP8DSU-Qh4GDXoCR8FxSYxQnGwoUCCqn5GH4QFs+4pA08AeLHcwOQAD4kTah8yDURjnwMYMAhAbERjLD4GkE9hpgdyAILQjcY1JEkXFbfIcAO7QhUCAz3D3Ps5MzqfDFOEZuSkWQKlDNbAOPh-KDTGRdiPwAa7AAFAZwg8wG6yGKAYXAPUs7sB12kEELzUc3AyCgmfCJYm4kJSgdlQ6JAJ2BU5GhoMsRVGkLcAHnBzpmUEA94OdADSBaTBfEAZbpMlIPgDthUKCFrBBOiMAZi0LXQLdTU8AAgEKtXSqDvBHsCgyFAcHNQfegaZpdUAkWmVcFXoCN0VmAe7ChoBgYAwPfoQ2981ABM31yQDggFbgvrhdqBuIXLANCoHaA5WF6FCh0BoCPHoD7w9sA17oP4BW8OeUV2QJcAEdSnQDBlFeALnAgq9yi4DIA5MGjWFdct6BjwCL+Ax8ARAIcQCtZk1J-4C5SL7wOu0SaB5LAaSiIwEnsQRwJqAMHCFOSloNckZSA5FBYUCwYgctp-oXYASxBlryCgxiEIYYXHAaABF7Bq5n5wMiweecJABEEB-kHPznplV3gB-BwliJ6FvoCN7EDY56BORiZ7VT4O1AZ9Qh8AZvABcC34FgwfVyfCA5HbqIDCgN7QCUwpOQyRBD+FP4IvgawAI2AHxZFqCNtkdAAxgKIR9OoW20MMFbQUioX6VDBAFqFagCbIOAENvlR4D+CARyONQTBAUY5G2jN7iI5JaQdLAljgYoDIUGoGOrMP1opaRgsgZ8H6ICQQaqIIahZxj8QllOC-AEg8o0hVpBex1ollwGWnQchgUJBqMBCpgXHAi8dH4lMBA+EZVq1QNq2ApAsEgUWFe7AV8B3AJohqSBL6EW4LsQJ1Q-rg8dKwICBQHfoWWAddocqDVRHb4FkUNZG-OAHPAg4CEsng-IugZCAbrDdNC6MCzAZaQbggeeqchB7wLR4VyeacgPeD5kEzwPSFMlINfoduDnqFcwG3IHdA57p8OAOcDZ4NckTAE-L0DUBz4FikA3JF3gsZxtPYEyGkMt2vBCAvxQcWiw3G74NckMoBjnQpkA+WBlkCOWCXgUnBMiAPUEqKOglXPQDOJQageDiGoEVIQpADXh52DUxAlGMhQKuAAXB6tDlVxLgLnARfA2LhQ6C3aDtbqpLcNm1cIPKjEQFGSJHIAToS2IGIB14i0QP-9C+YUix9iDaEAxMI-QfyglMZnjDtSE2QNg4dxQMRB0fAqgBfYKtgMHAwnBikCYBnq4CUIDS821ApACqwHKGK1QDUcCyBJEq0mDNQBA+JTMSKQe9QBFjkIo9QQww5gBHLBvkFgLnpwFHAg7kPFhYwGCCn8DApILKBoOggQHKgO3gCoABvQyRDvoNM4ITAU8QnXBMEwmiF1YBQaLrQh5J0-h5SC9wPciQdAd-hiRAAUASmFwYQSydQRjeDu5F6wEkAUvIf7g0aAP9hVMlUjM8GDeJI6DUmDtlI+rQzAngATjB2r1H-AuwWpI4tg3WCcMATQKPGakQkcJxwHiaHRaAF4BXA7vBoED2cGOqHzxOtgm2AqNRsggvgPYUXRIXfBRnSSMwYIDMQP1QihVHARceCQWFxoBv03dFCWDo+G8UH8QEsAe8BKPAcaCpkLOgeCsU3gCtaIQCsINkIJsSz7Q8KC7UEDrLBiOzetJgeJwDIGYgMJ1GPgluB7kpu4ECgFiZWzwT1giXCjSFjOGYWcjA+7cEgI9AB8YNToSgwtAQrTKC0HadCOwR5QHk5saAbqD0IF5mRtYiGQgiBqEHhCLKcSjAupxoaC8rHGOAmQdCA5OAMtATKCTAK1Ae0YegBKGD43E+ert3WrAnTAY6Cw2ArQXzABKI-kAFcBvhEQwNooCKoGWBzoii2D7GAXAXMQlmwekQvCENUFUva6Qe7prMhI83b0ASlBgQDrBA3QxIB-7EUQcwg5uBeW4okBmwFMgbMQIqAHcD7EDpyIeMbs0bdg-MBRxE-wAWoNJ4mtEV0xkOEc9JR9HuwrN1QYgPIBoCJyBIVgsOhiqBI+BB9kCgSlggCgTYAz4GNQNuEPFgI7AOpAMui9MI+oPnwQgB0aBa3gmyA3iFdY1SAJSBse1KDPZwKnKT4IF0CS1AzILqIeN2tehG+io52QDHTkQGI5Sg8SATQC64AE0MmgJPBc-RkzDdUBE5cLgA4BEiZDOktIAcodxgjvBqewryEAoAsgFmAzh9umDMQVREEF5Af2RMBajj-QwAOA5waKgarAU1BrVH+oIaoFTg0SVtrSarGTqKegMCI5DQR2DL7GsyNPmKVAkmAywBpohBbhFAbmAE2Bf0Cu3z+iGuNZdQS8IA3AcwEhYOxgTHwX2xbmAI6mdgDSIaN40TBzeahlim3NiUABwddo5cwWJAqlFwGAKg5DQ5xDW7DagOZ8GvIAbgj2CRkC96PyYcVm3VQUOD0xAbULXIQWgXKB4mABCEJ5CusLP0oBAE2BOMGMwMgoM+ox+w5YACoXdNsJoHaggyBw05Y8CiIF0ATcA1FAxQBOuGtwCagNyUJZAToCaUB10CBsaDYtehalAZxCsQH1gGaIdlgSeB1knAQBdVbU0EVcZwRw4DA0JpADkA6qAcqAA6HggKeAfVAizYvsBs-BAyMAaAPwYNJLsDNwHOQBRYZhYtiAnkB9QC6MM3gBuAvShf6QxwBa0L1AUuAQHlsiA1+Ga5EXOUtacYBwYDFWXVVjU0KIuI8p45olQFWNiLQQb6ZBAX4CGYnjyHkQb4g24ABh5X+CCjKcwY6QxmZ4fDWcGsYJYQcBO4OBOfzsqAJgNzgDycWCRYVhp-CjlFTgGsAhOA6DClpGxoHxoc-uTPggOinKG4InZYDRg2khB2Iy7ntIJioevAHosj2A3QD3hNoQBnQ49BmvTKOnJWEP4CMwvjB08gN+iIbMKgewwjvklS4Fk0wDCKMGXQaFAIHjbRAIoGPglTgHtBCmAlQAoAMwQU8Q-RoJkBlEH-gCpITKQyWB8I5UBXoAGsmRp4xrohricomjTNTAPuQu3xiqBzQTvUDBQdIo9MAiOB3QCPgN1gbCg5S8Q1AMICH8OZkQaWAMB78CHIFb3AYQEIUbbUNfDYOClBJthS4QcdATexx2Gk4InoeLO13p06AOeHzqB-MEeAFmxiWBLgDd5A6Qa3ASuBf0Ak8FGTHIISEAGzgQFoWIFjCFhgUXmwnYLPBjuAuODkgRNA3apl0A6oH5QH8GYZwQTQ4QJysH+qALtMdIxbAIHi5UHFwEpgUCAmSBQqDKQB4OtVQWwgO2ByoCLNi3Goc4PbyLqw+hBn1Ctvg14X5g5W5KZAxsk5GDNEZCAIZ4OeBExGYgG0KZY+1BA6+i0eBlYNUZRMgG1Fw0A2cAlMFLuU8C7gBAiiCLnhYLUgJeYfxFK3DrgDOYEvCPNgcQDjwALICvQPyASUgCZx3ABvUFS9PPgBgIPcAn0BD8D7sBzrMxAuahlECJCCmfNQEPTAjyAieCSohKwG3IJ4+p5APwDwTybXmhgUlYqXp-EAbqDnOqbDJxg2sBRwAqIHwvIqzTcgbfAi+hkpE7IHaYYBI9sAg1A5PxvQLGERpgYCBYKBXBluMH+QDmAiaAdqh5wHUgNeIBwQZWVYMSGYC5uvFFHCE8qAiAhZBAXzJvALCmI5wBiJYOCQNEbQamg0IBNMDgjXsgLjAP3BFl4yCqd0H5GIhkJpMUeDoBANMDb8O9AeaA84AxaRL6ll0FZgchQk7ACaCk8C51OksGaIuuwmhCKEHzoIyhFFgHyBAZAO4FKwIgeNqAKBNv6CDklluJ8lbMQ2EBWFDSrjHAEBgdMyB2hZ0AIaTMLOn4F1YOCAvbDHVAwFDRGfhg1bAnVDGcAoOnDwP08MygNZAFziwYK+wSAgiqRWPyVFCYgL4wJA0dLAupjcVlDgNwILqgKoAFFgXNkmsG+EbqAWrgo8YBuBEsOooVmAXuB0ijnMBPEFDqPsAl2B6nwzoGrgPEsRQgTEBw9zuSGxEK8sboGG3BdIDTgkjICOwaOgD1BVUC8sAOstUcIVGbERd4DTGCNTMPgf-wtDx+q4V6BvcGx4cGIz5hD9gjqAewLdFM1qB3M6RCNtBEIPh4PcgGnhh6iPnkE9AugOQQR6NaYiVWHFZL-gERwozBGdBwZi3cDKuC0UQWAoNTnwHfYBAgQtYlsBEhAAo3TqCCEFugrWpchLp5HLTDLuJeENIhyITAUBpVNegWls5SBT0C9xCbwLnoaC6wFBP5CU6Fu4Mj3Z+Y+NAuKTf4BSEJ1-QqggaRcgR4wCMSNOYEzQrjB80AHwjIrAUYLWIUlY6uwG5yEAO09ZFSndAwkAfQGPEJHwQsExHBfTz6EFkrL5ANTQ1ikikABuDFxNTwD6kX6AuKSUYCCENzgKtgQGA3WAYUDzYJeQcDAihQwWyg1GMtKM0KsA-iAF6D7qC0yCFsZLAScBzEA5nQi4AXjAWYkPImy65qF12PyDX5EvWhLjzWjD0IHoYfi8pfAleijOXb0GIwEgoVmBMuBQIFymIwAB+AXlA6ci8u1EkEJg7uADWZANhQGHUrvvoLbAe8JzcgaZA50EOYL8u2Ip+ISjQFCYKU0YaoKJRg-BBhhUEG0KS1YIYZFOCVWG-gU9wPuQIFggNBpPGzKCqEeDgRkxi3S9kC96AdOBggyeQ65hPsgboOWAWggOPVvaAAcAHUPtVe8EbTBoEA74DygJ4gCoorxQLApyeBoQWEHB+Q1KQn45EZHWAfDsB4IMnBy+gz7nFALLocXwkZBN1yotEBiJYwfColAhxqCPXjwgB9SWxgLMIHeBd-xV4EMMdz6j0Bv1AwqFTwrTLYxSn0gmhBnRDA0J6oY6IudQEAglgErwAZYbeuJkAaIyl5E7gX3QP2MKjBPeCcGGhwPL4CiE4YkDpZUkBZYEuANQEr1guf7tADdITbgfVAYhBi-CnoEBkjMQG6o+uxJ2CJZABwI+RETAk+gVWjLXhRINZoYqycYAF8JysDjirVnWQAd-hmaCV+DsAIUwfhQAz9DHCvYGYWPzvWBA4AhBcB-kFRfG+geX8rDBTiCAYHmIK77ed8RdBqxAWZGsoAMecegA6Bx1ikQFR8mowGXgNl8fCADcGoFFBJVUg2WR06AmYBu5MlwVJghhgNtQoXDIste0N7k2-RM0zNkEhAIGkB0w1AhQahQwDHgJawI+AJsAk8Z44E3gD8QGNI13ohpCGYjK0HlyCcQEggS2ohRFLAKMkFyMskB2PSUMAaYFawOTy5ChK4B12mOZLqceYgCCBz1CJIBMlGiQSNwQYZivz4wEzSMcyIm0GAhSzCGGCbwPvQC9gzsBFnAUxixEHWwKGwbxBduAmZFGSEeSbMMizh28DqV1TEHnfOPiYdl-cAhBz7SDndL7enhgrrgBFlMSAkAXYg7GgtCBk+BiECbgfPAsug1vi-MG-Vk1wAuKtSAV+CUGFF4AuEJiAivV-uAbzFOYN5HZNQoNNGBChjGpwLKtRZwipgENCRyAwIF1gJ5AJoh40JiMC0EPLQYBI1mgwyAPlkpICigXrgd5BJSyGxCCatdkZrGZEAmVTQyE-QB84QLQKQRJMDkrA9xIGkM6A2sRWMC5EmDABitdrAYm5GyAoOCysJFQEfQzvgv-ADYUhoOiQFZAJvZWGDJICzKPKQ7GAw4gnfDzQHKwufobWIO1BB6D8CH9gGwUWZE7+td8ClACwcLH4SjATQAjkAG7D1dJnvOywPaAlPLayi7kKzQwPANpFpVzAEPBiIFkN7KHNAoU4cwHHAIzoBJgYB9taGRwCUzC4rXsAzQBwcBtjlT4AdZAkO-kBsSikcyPsIxYXHWaeABrBHwAqqBiQHWg2IgBsCjJjdkPTABugsOgmrijahmLFRqQaQnPsnKi2QGlXJHHXaw6LhMJBbhA9bHwgfxgkWgAxg4TDJ8AE0fXueFAcAAbSGLgCvwaKCvGgCfDuSHqXMy8aig3VhvHCDUFjKK3Ie+60xBVEhuXCDvMzUQDAZiAnDa-RU0+FrgPOAkmB5yA3CzNbIq-A38VyJesACfltarhQYRIILQAqRpz193mrYRVguQIj2BHmRzgLDcJHKaTBLwAxe1fYCVAZVwx4gfFA5QGbUMUmLyw79A56DzYDcQnJCDAQILBlpCMIBM0KLIH+I2TAarAIMC1xgPoLbA3Mg32DRvG7oLF0D+YtegpKApdAw+oTAX6ObPBiuB5GGzXFZgFIQYNgASj0kB1wOSYZmGUgBcKywAlZoJRgZOo3EMc8DbwLIsn1QbQsOtB9MBSVF7AHpaM-ii65S1wZoHKQPgwVJgvbA9LDRQAPoG64HKQOc4EMBi0kJ5JCAGOg13oMtjlwQYIGLgf8w-WB-XAmUCZCDh7dcAaMAuZiwmluoPc4I-gNug24DKuE5xtukGNATKAWcB7wirfJj4a9Am3BSOiKwCxOL5AOSAbXAJ2Bhqi1wDCwNDA9mglsBAuDBYQBbOtAqngmhBarEABFTgWvYj9AlqTWIDw9D3IM2QvxAUFqU1ghwJBAApIwwg4hBnMBjSAG3c8ouEAwQgQQHEgMsYDMgR-BLEh1qDxYLuAIyOgEADApAUIMBDtkAUQ5cB8GDy8ELWJTGepgjFhyzwswDBaFRUMA2GFhOoDJ1GXJlAYCUggJgsCgClB2BNaWbDQdgplWBi4lIQKmIH2quNBM8AiIlnoNQKYggfIJ0fBRYCpkEk0Xrg7xUODyJ8FzYHLAPZub7A0RD+SCrQrqIelAkWgVZiEpDMIH9OBeoezAEMDmEheYXpaGhgG0h06ABew0EOnwNP4C7QKUCAxmVyEGHLywSUAx7DxyFdcJ4iUrg7NZxSR4oFfVuVhHVEfDDRwBDjU5wBGJRZsWDJINDMGCGuETvOAoJuxbADlAHIhNVSJeYarAEKGuCFdcJrbPakoNRUvTqsDgMEYaeQwQDANzLgIDMkPrsAne1FBjMY+WBnngIYeqANTs56BHCDoEC8odjgkixtmCWSHmUKjgFrod0BLMwrM18ASzLcFAJuBB2DUbWPEL-IJnIhShbwDseizYK+gLL250AMSBcMESWj7ERB6pnBMsqRVGojBcXUx8pzlfSDBr0w2KZTXC0AohD8T9KFh4P+MNIyloFsQbb8A8QB-gYIgY0Bk6gCsl2pmKgAgyQVAwFQJoCUnkFQQNQVcAeJD+SGVyH8wGMAPpRPjAeuD2EOYYDwgf0RBCC3CCP6qGQLcIpQxBAAriFEkIZoVP26ohB0CckEmcGwUA7QPEAfqAUACAQOqgcqAvbAgOjWuE-kL9gP+gyKhU6D+5glIIO5S4QfLp97CynCqoER3fkAzjsJcDR4ENQG5YAVI5+hw0CPkH44AHAN6AnkYz+5DsOHBMRwOCwP7w8ghyEGCPiumFgoV6ATIDvRx1QFBAQ1AY05CpDu8GYgDOAOYwN7g9QhKRldbKZkA4GFtAQYDKsBAyDCILWA2hYmsEXJAgeL8UTiI-DA1VQM6Bj4DvAJrubdgRLK1QFWIBgYUvAKahKapg9kwDBNQRgAvUMd4DXgH8IX8GKQAycQdUCZGBSCMuJQqABlgjogBUhtyERkHG2lmZhMH03DHgKTwMdg1GAa-C51HuUFGzXVEJKMCmgHQGEEh64EpAgfIi4D1DhajL2gaZATEh3Gg9r2RrC3QPkEXFIpMCBpAYwOYIFlQ+YdLHjeIFMQIbCUhAd+g8qA5oFjKPlwEpAb7BvRDRwBhIALAN9gbPBq4ClmEIcPzAYJAaTBk8j-mE9QOUiYIQGqAPvClDkpsLhUK6oGD5h9S+KFd0L+gDwgWMBMkD73F2pGoAbAEHiAxYCT0FFSDIoAeOQwxSOijMgnZMSQUXAAFceTiE8EpMAlIQ8YsFAZ+ASCDpyKtRZMQdQQ8RSiwBaYIaoKlIZGhrsTM+G8EOEuSRcY8B4wLRMDbrrllSBg6soMsAESUHAFqwVAgzXBw3LmEBMkFJAPwQt-dFkBrswAcNv4Iko2FBZMjQPCR1tBIWqAgmgB0BuQBhIAWkcVALdDk4ibgAATjKkABWCOgWfj8uksIHY0fCopkhouCI+T8EGLgF8IObB6GC6UAhtgpsKNIBcBugBPEHeoF4iMggE2B-+LGUMbgG9QMmAWGN1QQu5EgoLqQLKAFOhLjyvoEpaN4QLtG5bA0DCcLF3oKKkfp4VzBZ4T60ADcAugOMAFQgGCBq5X74HqeRos-TwXVgysFyEHGgCXhmuBKSxc0Cr0CkwG3sIGQOYB1uCaQDR4Ymo0ZgdMBIoAQxHpgV-A8ihCcCfyCxnGsgLys8m1LiLUcEoYPu9bVk4OBlkDJ0HGsqi0B3UBTR-eA-IAKMNkgZSAQTVBaAB+FnoFmAPVApWB4wKQEG+IHDABOAuEAGKgEQGWwP8QM5gYQgnDDhMAJgJ0gZFASSx1gF8+CvsvcUXiAjRgsFArFEGSCFjLAwwL0ZhCqQRyoEsQYJIg7FCZoyyAd4F64QFAWaJI4Cp8F3NK08dUW55hpsg6oAkuCXAceQlKBCWBlEF+WLTNC1gw+giIDXrEuOGOwFnAfVC6RDYiGXEK6YPagDrBEzguSRPUHDwflCAmCrwxmoBOGBgIBpgn8hKsxFT19kEAwPOgjwwUhxMJy4ILd4D6kloElWZe9H2oI3yJYO1nQ9+grpjB7D8kKRo2JQsRDPoWogX7GaBA8eQ2UDgiGsiI40WFAk4xmuDA0QAgB1INToBeBk+ASwATQAYtSEoKjBsxC0iC9uIpwQdA+qBerDo0BXWMcVJgwymNxwC3FERQJOQXsAUcpX+7Ez2wlPNQPBA9tB9GLIUBAOCigLoQE2R4aDnmD+iKStcBQzJg5AC+EB5gI+IO7AgSZDJDdwBOCtv4ZOAXiUL5AZhGJysskLkWIi4L5jY0CJECgQIDyhaxPKxA2UvCCaQQ+IqlMUODSMFDCpBg-mAb-A0-iOenEqAvkCmAN4BgsBIEH6wIqwFxIZrZ-BD3Ij9jPi+GvIYwwB1Bt9gmwGSIdD446wHEANIwYII2gU-ABRAysDVqHHAA7oKZqmToAcAiOEK9OUgXXYEzDhUDy0Ad4ED1SCAOGhMASJ4BrgLxoJJgkJh4TB7kFNQAo9c+AWhB02ZbkDXkOughOo4rJfljNMGOZA14MqAIBAEICDJCloIdAMggmcwqJpRA2GEDGLJ8AiKQKmh8KCRoHaYJ3wcRACUDnQAdxjLwOKhnnh06ApVFhsMMgMpgUsRvBonTBwBKDwbhQzlVWRqwhGHYNiIL6gIGwYiBDgCWEdYwFC4w0ABpDtID9SFDwXU4h9BP9Bc0ERgH8ASlAQmUOoDMYDMkBpIYiAlb5rYiLsGhkNxSCgACAQAuDg6G80LKoDzsHUAZlDgDHTMNBsUmQdVp7sAO-SkWM2IPYQi-AqOASkB+oMQyc1Y+kAU1ymwH6NKi0DbgwUBd2Bd0DUojw6ZboKNBPB46YGQIF+AQmEsIR7GCanWQaEg0AVAGwQG7DGUMwuBFgfWQOYB6UDyGB3CrhULFAaTwIoAGMB7UDJwb2oeLAXVy-MCxwAbibxwGGxYqSKsG6EA3AfMA1YAAqQgsEi6O4QLvKwBw6BK40GWQPNgGvIWMBUgRJrWeNm+IWG4xyFDCye8Ga+NS0etAsNgj6BmmB-YO4AMUgBVdkypI+F+FDXAdcwv31EMC-IEUsBzwXDoe-JP2ChvCegAhgC44TdA2CgZnDVAHbAJNAiFQVQjsMDqCMHAdpgk2wm7CWwG34DQSZZUN3B1QgolHQ7GdgEMYbOAAsAbqBdgCJUV9onkAgOjHMl8lDZracA0bk1NbRUHmIL8UO3wXQgHJpToHTKDi0Me41jB+Rj6gV6gMEQQ9gllA-eCydUbaH3Q0nIR-B-oAmSiegG5YThYhOQXYjF1GXQGMxRPAllAuNCleC9hDAWYIA5YB++Cw2Fc6B7wUUqrVBR0R5MGfQSEKEAgqGA68ST3yDUN3wOcAMytx6BkpC1iD9QL2wBdBSXA15BQuM2QSz4zoQcDCXsCmxJsEaSI9GBnci7ADJmJnoXv0ydR9yCZjw-qIBAd6gqnArgh9CGZgPDsU2AWDgbiCjkBfekxQaEss7pCbCVhF20vCYJgEUMBgwAKEHqkIRwANwKJYR7gZWFHJAYCYh+KUBzICT0CngI1wIY0T8BSeCwMQuYBdkLc62TQyBBbgGbAEXoQzEnZBDnAJ3CVIGmQaB4wXBkuDhoFBiJZ8SRY8lhk6g5QHXUKS4GHQa-AJYAkQz60OpgdyQ7ig+oAF1Fk5rHgVVAmnBfiB76wwoGIAaNg-JgoeBGYItXqeId3wjqAEaAbanYYGvAewoj3RJEDSIDqxIuEY7gDzUsqAZkDZ4BbQGnIoswtcAbxD3uhOQH2g8Ogoeb9gANYJToZ+YbDoThhF6FGwHbIBjAyYgZAh1klP4DnkbMYpUlQEAiOD7YYI4Slolugx4B5SGnkKUGSMgKAYUECBMBGAL2AU8AUk5liB3kh6IC0AenuTc8leguiD6QAnoLMQRbALEDdgFvuvxwEtWYdpEUBEwAaQMeDeUqDkJjTAuFCqIMvQCmA82gBrgmQBUsC43afA9rA+ophsAqQMTJYEQs6Aa-D4XiUjANsTTA17RxGB3vAikNMIN+6V-QJEz+UQuyDLgQFAF8shUBycEwIBFIVzAvYB+rCtIBXQFlwU3w9NsvsAvKDgjmkwBvAXql+sCaMX-ipvCXzAlLoNCAjQGYsLQEd2g6mx8n6lwA8nBa1W-IuzBl6CoiBxwETAfBg-vB8OCmCEkbKWAbWga4AvlD2XGmIBjgP3+2lkx4AdILTaPYYbfw0IA+0jyGGxgB6gceAisBajDusCWpKSEPymnP5z4BTJW4pBhyJeY0iQAHAF4HmUNSkBIOagIE1QO4DUhrRgEsgzEB4Mh3d19IMqw3Bw5VZ3CALWCYYNxiaRAVqgmeFbEBQQHUYctQue4ZHxNU1KoHNfc7gjSArRAb0FDQKEofSaAmhxQAkDFcuFM8fbgMEAOFoDxhdgKJYa6A3iA+tDOIBbyJPoRFg3iZerAxGA64Mr7L7ALWhkVJPUHVEcDIVlgUEQV2BKOBAgFJABVCWmQhSD-fDJHBEgFQQGhA-syc0HlROHQRgEWggwZQIYnOIBoafqAKyRQywalAbQBYwN1Aj6h8GBaxCnYvTEDWggfpYTQ+iAZdpdgZrgXthaEgvgByIPsBQQAoiAblorjU8RMhAa+IM6BKJzJEBzYLzgN+QHuID5CssEUaJVEdCgj8A0GBsWRUyFqNcykkDZaSBcADEwL1AWlMutBu1yZkHCQCvwXKAfrMbsDfMDNsLUgZMAsohjFahQAQxEJMY6IotgCGTrgEtkOBodcAe1ISlBKvChkF3IRhgrGAAij7-XJsHoAaCw10h6N4TQHkwGi6GcAHFRthHmyz0gBYPDWWoqAH-wvCGXEGAqfC8DBtWoDsMCYQA6Qb8AApZ+piTsBpQIwgasCb0xvVDguj6AMEwBeByagIsAXyGiQIXVG3I8qA-wiTqA+gMpgS8gu-CGAD3KEGSKIgZLEE0BBi7SMEFwGYWf4AHTA0MA6hAKaBKgQ8YRadA06tsHkwHR8PIwyiAw0DNkHP0A3KFlgFeA1i6MWEKYCTwczya5BMkAVcFSBOtWK8MQ-RJ9BZURBwPE5GNa1sRqMAedjzwLpAG-0iS46AhlGEAVBMgbGwY0BkwCJ8ED5CXWcXApXgQWzkQEABNtgOKooAIFqxUgHUeOVAKsAIqB1wA6InaCJKWBVOlx4kECSIEZBGSITLgXHh4mB+slSwBzwBM4wQJurA8elZYHExROgxSZKhDFSGgsHTkQYwL7BWEB8ADZMOBoegAmuhAYjc3m6IH3IKJYr3YAiFqUCnKDmwYfUgP9ymC6AAE0IdHVNAiJBhxA3oCrcGAwAn4-1AShhJoC26ituSo8e+AnKCm8HRIAhYaxAT5hYKB2TB3QHUEPtIgdDQ75oiB+iOSoVAgoxAhsCRuDXZFDgPKQ-m1JoDk4Ad0AFgRWAzTBWPD6CzDYJnoaiMVkxufCc4GpiiMsOkQI3AXkDriMCoITYfCA7HCLsjy1BvgFpkauAstFCHCNkQQkMLLZFgzVBEoC4yF-kgEUAlA85EipwWwEdvnnIGbwRUA3VBRWV82jzoWIgUOULshcQE4UgnSJ6QPSYGdw+5VyMANwe8EnhgnvQN2AxGGPAP2MDKhXrC6ZHZ0E6QdDAVZBnYAGQB-TK7Qb2AD+A7CIUyC3yCOcJxgdaQyEh92BKGD+WW6ArDlr1h1QDnbPV1CkgM1AqOB5UFFsA9xJnI2yAB9D2xEoMGDSJfUvzQbAAE9n4UMIWT8wC7QKYCpSDuEXGcCbAIfcBWRmHF24BYsZBQlQhHiC8iD8QAYgSRA8o9NuAwsBLrDNQVK8GzYGMBpoBFQCrMSkiHioA3A6uH6UAOgPaKDKhD+xOuCA8t-QKtwBSR36wI4B6AKpwrfIXUwzZCbcC7kN5AXVU1tBIUBBIFwXJUWA+gxsBjBBRIGqYhFIXNQTqNyVjbUCIQAA8Hdh5ghsDxiYCdUGGQeCAPpBR4AH2CgqLI6dyknqYr3hlJm80K3ADzsjbQu1Al0GLvGv9ZMAnhhyGgKdy40CKMM4gGvFOYAZsHVqK9IAqgACApxRwJFOAFBATRMAyAB5H9GnwYIwSPZg-CgtghagCyQBBEStwe+Af8LPBB3wGEwfPEMaAHyA6oiyCHykf74l7BnWCTpkRICQUckQgbpRsB5UGioJeYFJAZYBvIJmeRQQFvkTqQyggb8ADSByEezSTug-T4FaQMKJUYGm5FLo-3BqwKuYmjUeJUckqwvAHyCEPhawHctXhgvlALEAAoEzYEkwEtMzVBpaCdeA1KNJIE6AAV0vqAZ0AacpceB1RXqUuhCf7zxkqCwTWBRARboDm5kycLYHOgCqCBLWBfgGIgCk1OrEYTA9DCoKBbyLgsFGMt94u8R+JgMrFDgDaIajAgpD-rFtQrYTYa42uR8OBkaEgsESkMqA-oZ7ECQwEjNORCKpoDSJetANMEqwJYkd8Qqi48pCqYESgG8uA+M+cBsHDjoDi6EOUZn+60AQsBvNDVcHd3MGILY9ChBe1CySPduN6A3tBh+EMwH4PGmoRByj+hXoBpgHFACeIJNAsPoWxB-uD2TILgC7iv+A+fABNCg1FWgCdcfghJSD+IEhKOEQPX0uDgxKDNUDXYKkgX0g4ogeSL1N3OmCh6ekg+F5qtDZjDbsL3wVi8u3Bg0BY9hkvCEgEFotCAhCCZnx6PMseRcI934X2CoyI14idAWJwM1ASbDw0HwYJZ1Xjw9olvKy3wHy0HOANUAjpBtCwFNjWQGygXM+mEhBAADcEGoM-MXaAmnABsC9lhzAHkwU3gGVgisDKYFkgPSgfVgtUR1wCbYEqhLG7C6AIVB95RrYGsSjdQekgr0B5TgK4FzUKH0I5A4CBxd772HH0I7LN6u3HhVEj+MEegMdpFegsIQp4AoQBkgJDGcegtwhZ7Adggq4KiIEYAMZA0niHZSCgF7Cf6AgZAQlQjqBrkKLMZbAj4AEYiOwguIOeAUHgSMg+gAkO1tMK7gIbw2TRhCA3gF7zG3wMnwM4ADViIxFysGkwbQgK6BmQQ86BN2GINBaA6igmlD8phOMEAQVp4JnMXlAzSBnQHNAc2AZKROuj5axi+NgQU5AA6BP6R5GBdFETSJzEFVUBUAo4F95ikOLiYQ3hJkB1QCvAHoCBHA6pEaeDCCAKHBtECqgn+hxwC+8Hilq5PL1ilWADlD6oAVYC5IBqi4aA-YBedXeECEKWuQGahxcCGFk8ABjgF5QjqBnACWEHpiLAQPCgrTxSXAaoEIkM8EeyIBGgeiBg9kK4EGoG6wwkdUsrZCAxMO0KXKefjJqNSaLE3qNTETiI3ihANg9ABqCP-KRwaFMBMQj0wDBiKQosewyAlzor0wBj0edAEyIcgBvBBjFDeoJBoKpgNZhBHbo+ElAIv4NTAdOB9dhu4w5atFQQwQ1SZI2BbYAzoBY8NuA3iUodQf909kHk5azg5sAKSBqEHEwqziXkQiMRJnA1CDoMCCsSqI-B15eA88BYKFOKb7AR7By2D-mARhHSlbgQhLAv-D4mhJLIIQeJUGkAB4YlRDi6GUwZa69Zt4TAZkB-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-EAf4gcyK5sKoZPIITHJcqLjrBDcJOwTl6p-B2-7CJDyCAfCDBAFMAYp7LAU0Cg8ydxMcOBdtANUF4wOdAHOgflE85BLYFbYOmgENQ5NA95CuoBZwa81LCxr0BcjJROliwFqOKAwPKB2XTkriqoNvwbag+NjGoBoQEmoLBXZxsiLBZVDkNF8SI7yJooGhpLR6eoBXYAk8bH8eBAyaD2RF-QD0sLrIv8YgmjFoC7UFM8R6AjzJ60BtOQE6BnsR+Qr8B3xABNjzHBA2VXQ1DloZDTwCv6OCCXKw2NBSgCWGQdTIJoKsSAs4+NHOiGAgjqaanQ5rAd4Cvdkg0ORQS5YV6gQhRcTGJECQMBdQyQ0dsjcUhJSOeAR6AlMY1MB6yk3RJrQT-An00B4SfyPTqFDIdFoGNAQcDBJDf8BlgNdkx3EXxB2bT-IHava8IRqtpgBnbFx1sGgAFAv2BYIxycF6Ir2Yfio07Q2UDNREmcK+gDrAymBkxANB2IQIDEBuSzgQFerkoB0bNmUcXAPhAziBMnFzAGk8a1woZZG+q7sGvaLgyaEA5EA3WqB4EjIF2XHOxywEEQLosScwNtaWmIVsBbSygohVID+gDSU2qAfuQ54HlRKF0bSwrktm-AkpAIoGDaUGACTBTlCwWCrAFosIGIPkAC4B92A1QIBIQKgIwBr2gkQCdyKokZnw66Q-8CP2nMmPxCR8oD4B4nJvKxNEdpQQVATVdCJDOACxwIXAj5wa8BMcBsmFJyI9APwO4LYzYRQ8AwMKmSW+A529h9TrdEe-BlgCqUwGhvExhJH8lI3IFroRdAGZI1qD2gJQAZvc5vQroiVQk+oIbAYiAlow99CpDns0HEYYBAADgckG4IGOkiHoHdKGHJO0ClIG8AowAOVAX-g1AA0Ik-AHTBElI-FRuKSLiDfkBfAQaAohAIUBMMH9uN0o0jo2YBzWDNREkWELmTzwuJxnwDuQFaYPfSXMApeBqaDAVyIbJewH-smDA1vhObBQUfIYFegdIELISvQAZdqqQB8g1ygGRHGWDHUR4IqDIHsJbrFLjkHJEXg88wS+pnUy1IEjJOAgD8AIZBGeggZF9PILgIcoR8BgZDt4HucF4uNLMfYBmawpMTYMWcwZCxi1pzGI-LCe4ESgbfgviQw8BiUCgQFAQNX0MTBQNBtWFpGG9SSrMK6jOJKDJBjkTeAOrhlDBpyDNQg+9MmACHaZCQkoAaQALFBP-JLsZhYpACOn1kAMbIeWooQ027BzpjTIF04dwg2whTdEzwHN0c3wWaAJyQFlwy8Fu8O3gB5+EMByRBTSgXwKtJJeEx1pckDoQGs0LicUr4EBgvSyRaDBpCl6Kpo+xARFDWuFaMR1wV8Es0B9dgCZDLhAgEPpxBhBJhDJUBpSLF0DsmPbB54iCfC8gEDzNCAWhBErGt6AFAFuASY0VscxHA94H5sb7wTSC3JAhAAhuDhqLNAVVAwA45CCotAbUMSBMMgmcxsXCD0D3kIrHTkBTuB2MCeQGFwMJwBeQjgtnAAbxlJrLGcTSg6iAzsbGkHaZJ+gEdQsNgaihq2C1cJQILJuR-ANuCNghIqpqQYJgTbtgzxpoF6kKFARFgXHggqCjyH7AGbYLTIB5wqehhS2PwkRkL0wmTAG-RgKiT8HlAADg2lgxQAuFDDhgWkMdg0SgtxHHxia1h2vIlw16pGUCpDmX+JVEbxwJmgvaBZQCZVL1IAugJdYJeCASDwTLZgGCiK3goxCivk14fRYlqgOW8tYSqED2dORofqw9Xks0QCOA0lNugDr0Z2B66QkDFIsAoUepwi+BgYDMahsznWAbxAW4AvDbK6ga8EAQBgAnJQ1GG2HX+4GmxUVgL4wD4Q-UBXkPecKCAAgjeSDmEncEQeATwRrahkKAAfGjYHLmQIosgDSQgLhDkgMnwE5ounc5hzf-ihprdoMRgCNoYKKhMDPWNh9aZAaTwcTBLDTiIPZgauAMwBTYDMvDDwEALQGAvp4Tpg1+kfBOxlfcAXvxW1AtdAL0TndEtibwIxQAe8BnMu7wDXASDBpEAk2EIcEdEaBA3tQGvDeqB9oAy7F1AZcBYoAAzQlETNQf5xafpRCggTm9thEUAOclsghBSRdD6fOl4cXAb1BSLBLnm3fnHQmJgIWgbwDdKKV8uRwftMq2B5LD1COmIAbgXMABrFlcDSaxa0F-ABsASrxGED-VHOgCgQVTgxSBOpBy2F8gCyLJSQ7DBYVg3gV5gJ+TKwofABw0B-JjAYPnAT0ieAgOXjLqAriMv6QZxZRBhnHOmDHuKkCL0wnvAfGCFwENXm5xE1AhLBTeDtMDjoL8TYgg9hQteBzoDRgLLrEYAfSBLjxsMH2yEGOT7A8pwa8iCuJXoDE49UQPEBM8CAJSJQDUEc8AwWBaKhy0Cf1MAgTQqefJKYjvKPk2BIIIBYGeBXiATCB1CDpwfg8A0B4ij00AeTJ10TpAl5CPCBOEDSYIfgfNA5iBooD+HEn3g3AP7g3AoDXJawmZqBY+Uqga+1v4QOIGlfBCgauEbNgZqHQQFj8ABsXJQN9UveBgDCpVFq46-ko2o+AD7QCICDnAC4g9kQNvzlYCEAGnIOGAhDE3TL+mO+BB1QXxQ1yhe26+g3MDrb0TJgGKBokBo10f0CIoEPQ5b438TQgDFQPxjDxA9bAR4C1cU3hAlAHLwG9YAPjUsBnbtcIHdKUWCRUDUCHHoPbQE5IMjCelxhQHDwG-YrHgNPA8jBXwEW9P3gQhw64BQGCyYRBWB5nEe4jpBCJBKwDgKCRNY3E4ogB1CTbBr9OdIptQu4BPSJ9EDGIdOcGOAelpFIBgKlEQJUmXu4eoh0fC9xE2wEFQDyAOojfUADJUZ0P6QAxArJAw9zZgAREB1udOkqZIY0AhsFY7JxELNgmnA5hYXwRGOOCgS4gd75mFhI0FbYEmhR-0woRhz7R4BegDOENRoqTA7SDxrnCwvxwQ58xbIMBDGhFmgICQdFiD8BlSAMxC0EG4gDvAj4hv8B5AgXANxCSHEpMhH+AgTgwdNaCREgmpAD6AM-Fp0BgIIJ8HXoqQDDIFZFImQQLkeLBkqBU9CA4KTQawsIeBoHjbRDRwJOgaRxYyBkoCjWJP4FAYHC6p8ATZBarEhgGM9Zn0qQ5K3A7IDjoQIYM+A7gMEmAN3lJgBTuLIg4VJ9dgdUBJgBr4iAgeUAIYDOAAshAdAQkOwnY7wLmUHgwliWG-Q-ZBBADBG2YcFyvC1E7tAzCAkGH9cPvQIKQosBFEBmTG7EPA4xGAG9A+ACfkWhAGlaeZQW8hbjCpEDoCLPQMOAmmB-DBiUAs4Fx4lsAK7l5NhysH5WIKgiLAvxAklAvsDT-DHwYiAn2A-IjtLS1iG-Y6nQDkJB8K-QCfbpaCaBglvtywq5QwLoIzQDAwVXjGoA5iEbkvCeDAoe0A3Bzm+wggAKyF8IycohpA3WHUkt8aYWSoKJjkByoHOwAUgSeA12ANuC2ICSUCoIB1+XIhlBD50Ea5nsmfRka1FwBQdenSrrIAFtaI+hxD5V2CIIG14AzAILZQUTUpFFkF+gFeQSUBOSCAKglAkDgifSp0QQ0QRWj76mvoy8AlDA1Gg16Cx0GfwZa8FWx8GDj4Ib2GXAAoY7XptCZVgDFBEBwGegFopDVDTNlMPDMreZQO2QJsgCIAgIHp2c50LYBxzxBeITQBQIMFRR4sL9b20AdYGVHDxUQ0QOuFjDH14Cc4gSAJmgNwDD-DEfj0gUoAFCAhgiyqDv8I4IC-SJ1jzJp9HHsgHlwZSQrSA4nTTmEg4KPAb6xJEiy-EY4Ey4FbQcpAQUAwGDIUHOUIRwV3xAkAUUCpkm9gE89erIj2E6jANsGXUNyeU9AC-R8VKupEHcRHAAgsnaBAGQXrDBAq6gLnUsQRK4AyiFHBLIE6yAWuBdUTlk3rQG0gdogI3VXrGmGPq0DmYsYs-ASAPjaIHI0MtgER0fEhC1j20C4+GCgOiIbuBkxARFkeZPVICoJnchwkDKCHvojMASZAn8Apnh78jCEOPIYKAvf5dqTeQGalDGgfK8XiISkDxmkI7gOgFLglLox6Cw8BfCKb0Q1QXUwAwhgN3-8BhsRCwsRAY6CNaS7PBLwUmQW6iqyBiEE8iDpgbJg5e9FmxnUAPjEFQb9QZEQQwTk4BTUCfQKPQCLgGzGjHAmoNPIbbAqJABSi0BHaQNwqAwg7UBTRBNqACoMN-N3gznYbICEpGFQKeQMXG49A8mANyWZgNIqfogcZxS8AaSBT9LTQVtAtSgDoqbcGuQOAKRIw66J7tBNCFLMo3AbPAnuAAeHgaNYYIiQaEA06A3CjOcMxEGJ2OkxrZhMSD78LSoRXgSCwAdo1ACJak2JrGEMAgdXwiMBv2KtaJtABuC96R5URf+EhKOJAW4wX0A1QCUWMn0kEIKgcjUA2QR6sHB0H9ARjAompnIDoACyQEPwH7aZTI91AoqHPjHa6MuAUGpFrzGwwDcFcIJhgjNAvxCeeDN8XJwVTw1rgljDYWKr0DQwMLgx1ZDxhy0AH2JxyZ2AA6A3wBjZA6kCz8bgAz4Bkgn8CBLAMZY1wyiwTq1CB8iqYLyQeqQ2NBM1w1ATbkBbmBYJkBAoNS99iNcDj4ABACZxaogRkGnABQIa9UySBawyQ4jrYB5LLxE5SBnnyFgjmQK5gXowWwRIShCQG5fIa8MqAK0gxkDVwEcERFwNqAUAg2sDp0GzfpDwMEANahhwAEyF7QCeoRKgAHxOWw68RCIJxcGigNEBVYzOQEhfEJAmyAy8MF8635Gs6FKQO9Yl5gTlS8YGvCJ4YHE4AzBozDVUjHuDmIOegKsBa5CDCNlSlMmUFE3iZMLjKuEb0FHoYmA7SB6JAxsg8gF1kGBAhyt+tha4HErHXANwoZ7FroTULGvWPKiOygT4BNOiWUBOGMfsIaEaIxG4Am4E3UOloMbALEgkIorYlGwF1MCXAOhRu6QwsBGOBcQNlgZzRzsB5TFBgLqcSRA87NksQ91G4CG1mQlEqzZnIAJwBFUTCwQc8WatFmxjQD5gDlAFP0lmgfGBOKEw2FoIH0gA8JI3AfwB8gAmAMGk1zNJhDnUGugON4XOMz-4EwDQMxvVFkUJlw0XZxbCgxh62IgggVkvYAT-DxLgdsIzkayAR2BkkwL0i+2JWEFsycdBFwi8xjnoP5ANJgcnASuA22LjgFDQItwNEEnDD-8Qz5AJIOK+kJR-WRdTG6aMw4IBgDewZYApCDfsQjgNIWbXABWTqQEiqGdwF74e3CzhLDsAmcaXYDQ0c0Bm9xAdC4IIrgNCAn-o4IDoGASYHLYctgE-AjoiWQBryPi42QJ0+BdYGU0lnEuhgWhIQ4luAj6NCFgIQ4Kjg5QAJg4rYjyYLX4K7AejwY1z84GpEGq0dGcggBn-zn4UTCY+CHfAZBAhlREBBNIJRgYIEvHghgTz4DzsPo0DlxhDhUUzp0jEHvogUhGmPgmXARwjr6Jk4D5w+FRj9iRdAGgAQgCGAKKgThixqkRSN2AGPy6LQAaCpQC1wO5IG-0bBRsiApsyegDqgOyy7TJPgFrEGtjJR3XGAJdAaUCqcG1gDVAOsEvihJYARQBmiMxmFsAWjAwUwqFVGkA+QIaA+gAfRBJjjJiKRxRo4cdhv8xg4HbCZ98UFudjRwkCBQCmkGkbaYgGGwiVJMRN7uLGceSwU0BAMAb0xbyCFAXFAtCgXdDT+ICBIDINdmLaBqBCe8EmdK3kGOwl4AzGbD4DEHpbuaBgreQeGBf508RNmAE3s16Z06SrgHWpu2wI4Q8qIdDBlEFJyEuwS444RV1KAl+3acJfAaZQFJAjsDJ1FnoHFEl0eD8hwRCHCBGYDtYEKImFJYXys2FV8GvAL0RywEZAihAnToIbENos2MASCAL9k6EPHACFQHfQVGDpoAG-p20CJgcwijaA1bDcaGygfgQDANQUTlEExgNWBVdQLdBHDIVsjjADlIKsQ+F4IJAlIGfUHOgPLkSFJYeBeLARhMPoQXxzig+CKPdAVLiAI4-YoJsRCrc4xvAHQ7O70ZthGkJZRIwEDWAUHgnD8ioCCQjOEOA4fqobzR50Drhi+2HYQagM9MhX8D51HEgGTEdzA-7w4kAXpjdCeJkOhg84BLyDa5FfgCIQATovvA5CDq4GtBAOwDZAXKpBiSdESswBjGUFEi7BLKDXOgQgN8QdVaTqBJyAQQAGkLXgK94CFhsEAfUgNgO5QJgQCsAtCw9rnjQOz0ZjUzYBTOi0zQAULlgKdaaxxuAhAgX6wOkkcwQZ6ATajMxIRwJTGU+Js0BcxAnkPfEI0gDVAK6Z6tDUegfkO06cIgevBU5BZFGYgFowNSQFvB0ZzG7VZoMhgMcJdJjFYBQCA8XFtgEpBBHhpZDmcB9qmbVJiA+8B6lzmPDUBKCid+gWUBTfBH7yRwB1yeCSS+BP-QxIBWxMZgSJGT5DnSDwJQMwEn4FMAgfJp2gFQC3QHw4XyeXkTe7jkAAiQG6QU1AaEBDYBFsAd-AnIZqAyjoRIC9mFTEDgkFUITOhNsDLYBzAKxeC3RlMIBVyuhiNcE+AfaIEJZH1Ge9V8sJokyxw6mBNNA9jSNcEIQFOAM1AG6DUsAoFH2AQsgSvoqBS0xHuIF4iP8aq1c28C0bwFHg+mM8ka4BbYmiSGIjE8gQiQvfplHQD2BtwJeDKP2uSAwQBCAHLUAjAEqAIYxKYT-jE61rkgLvg2NAJ+Bx2F1wJ3gtBg2-ArNA1gHGMNRqHBI2E8a-hxwiHgJXAXxgENAxuwO2HHEk+YFdhXCUZ8h9yFG1IEmWghiBVY-ylRPVCf-wCiAI6BAZqNLgMsHOAM+oWITm8BDvzFQKqIRnQT3pU-DZiAwzAPCAqAaSAzmgpyEbQJJgDo0-2APKjNcBxwBfwA4w42DZ0BtUBNwFvwRcQ9eBq3ig8kBiHm0F2JpnRwAzdiWKoAQgd+gg+i94A+4Xy0Ej4G+AbWAcQnDcUsYV8wOKJEaA0Aw3fVa2nIIK3ADk0aYDFQHfvEN8Jpg-1BGRjJ1GqoJYAaM4KAYzIR9wA9cGmoJyAtLBMYhwWVpoI+wMsAbsg8MSeyE0jmZsYcQvuYujhXoEQqIGtS8g4LA8DCRsCLuDy6ImgJmQcIQtiDhyFvzCYQu8hykBtGHZNpZEuOARBBNOA3UGRwBfAVxMy3Bc4DozkRWteqGqAvIBYIx2wDXwF68JSsuZDJECfyDVPJnGbsATrhFmY2dGjTIWsVKAgaRdqRArFZ1oNAMMJjKBamD81gAgBggS6gZRhzlD8CGywcymUygavoQ4R1QDaFO83MGkeUgnzBXBnnKpQwJHw85F+yBwWHBLmFAVvIQHhyViDaF+aI941sAwnBTGDdUlcEGEkMQgVGpsHY4nE1crCgOGxhSB3BDADAhIQTUQpcySAnZG+amsAL4yWOipbAd8DeiGW5hUIOEQ8DA87BNHUdkFgyUgY1YFfFDMQARStUIa9U-jgB0wWLDpyGDLTpAkJg91C7QC6AEXEfIwO1RqhC8j14+PA3eygVIg3c4ZyGkQFB+KUg68wTCAJkBH9u-QDIAyKhwXxNohXWNLIJ5AhJgQonkUEugPq6NRonXQKoDRMDsOOzoFNAPFprQQb2DugISZNlkifwKgi6cBLoOgYBXAExRxYio2OosOWUKLAzvhe4hmwgXoZrQH6AEBBP2CU6FfwGjoDZgkEB-zCUCEAKLUkSWECZArJhrRKsgGBUdSwkFBeRDhID4UHGZTsgNhx6ZjDXGj7PTAQbgRzAPIAuSBV4OPIYZRkzpCOB5ZiggG0YDIgFpAo-zayiq9urWC+Y13pOIAvhEkApWkemYKdAkxypm1rTEE0AJJDYBioC4QAEgKwcDWQUgAgYBNyWEwKl6ELAk1j5yJNKEdfKLwEJQue4kORUxIYTNoWULgfhAPqQo2BCQBCnacWIiAUOAE+I0xDcwCCQlOhREKg5TX4fk4ZqRT0gx4AMzEHJITovaxa+R6ZihJW1lOVsE2QmDskuCVgFcEEvqTWgLPtWczubBPENMINYgdUkhoAviFLYDKmMws3WJqLDH4AbCJOoGiCo85WYlp+i+0JDcEDIbsBEQJVNFrUSlGKFAD3hDKEL9zXgP1QIDymN5VsBWphcQP64ciGHGgspII6Fp5igITHwzDg7CC6yhzANqwbOJ0VoXJjXqnSKOZAeogTpVqrzn0DKovQAXWAzFh4TKjahZwHVANMA7iJfCABiwyyVtmGXA34SeyDsZD1nooUQ9g2JJ-4jWxm5wDBVIyYhUAVQjsyk6eqrQagUN1kwNDTGEJYF7wS8gpeRD3KWgV48ijWOJA-yAH4AlLlqVgKUabOP0iSADD-DJiKBAFqQUsB-zBKYCMmF3QDgBBVBmcAYpBkgMEk30grhMAICYDEDYFTAl8YvVg3ex6AiqOnsgQnu7ThPeA2eIb2JXAeWgAyAZCAMdFVEO0ADOIfKBngguwDDVE0BG4aYuQBoD7AiesMPaK8wgWQDUB5wGsVN5uT0R9KZUpyWhW0sEYkF2A359k8jLrWBURUgSNAMJsdgC5QCqYNpAH6Ae7ps0B0VDr6BFkvkEjuBYARoAErSYuKUDQosBe0r20AysEN8VJoy2ScwRI6WVvJHIs+sVrRasDE5M-8HpwJPKJsh8ECqJGUEG8TVAg94JH2A7VGMipyYf8AlaR12CtMDCSBcWSiAJxB6+DSqCsSZxQBzgMaTekIBUnhoAa-UpA1sZ2kBx4FIAHHYTqQwMhITBd8GvaFJAD-svcIpmAgbGYqlYUTnAV6gmuB-K1ekPtQQKgINAJMn04EDSEaoK1oQDAakjDoAjcirwI7UkOi1mjgaET4P44A3QPihWbCESHFADNgOsyyqsKgBUeRSieemV0JuuT8GBigEqwFWATggmUSfxCoIDHsMaYDDkeUBi6AAoGN8CM6YbJlQEPdBnwGqQD-APQgE4hwVyrNgTYAMwCHJksA7CAIJLEAIRoa7AGJ1sMC9IGGEPc4GMs4GgDrYW0GOiNMgcVJgkB+ODkzGjTCagLuAvaAVSwqQBHiXagaZgzCwxOhOoGhwAmYVZM08R+rACAGu6KeGPd0izZx5hseD1YK2AAgQkHA88xKwGgbnD-Wt8fzAuAyKFEOcDIUCzYDgodTBcehCwM2oQf8vmAiDCsxJugFNIc+AB-Cs2h9lTE7AmAeJJZHgocCSlV5IEYkVBCCQA+VqBMCiQGqwLdYOOBZVBJ7DHgC2APVArGBeEjEcOjxEAgdIoHvAJaDZoBCwGGqXpyjyhNuAWcAR2OBQdJCjCg8dYEkDVVJpjbGwE8FUayf6A1cItwCbAf0AAuF2NFSnFNAD7wU+hCyAQEBW4JecXsgvx4u-A8I3tQD95GzgD3h+igqFS8WAVCalJUMAnDA7VGEgNvYDCQm2A4CjBJAVgBOyJKgW7gZYK7kCI4utAPLBENBXijTGGQoGvwLdAhrpBVLhpVc7IGoc4Yw9FDuBsFHq4I20DcsPWgFoBUxOkXPWwcdq5fQpsnkHh7sGvAcoAHfQIFoCQDphokAACA2HtdOB5-lsdKtILT0BJB0+4FQFicJfDUngQYg0wQkaGWIBK4Klw2igcEiFoFJkAkcY9AFhEfox5eFwgPYZLKAKjBblj40huqHTTCMyqeBoXCYMKOwAHADvJYlAdMBQl26CNUoDXQdOS62BX9G1gNWAXwgQ1xzhggbCtgDSwt-JCYRqTDtOgpIC0wS6geOAG8ARkFYYKl6WqIa6QzSAYmA+knaQcdAMeAJsAiVA2CK6FY18E3BX4BSkDuiJRAM9AVOtQ74fwEhfIvsDqgoqQRRiHxCOQANIDeJ5RB4MAbuA7yXXaCvmjnU+FBXmErwBjQU8QDugkgwqQD3UF7CWDYXcxOKC9gC+uIrAewIRaMyCYpFLk4Gt8OBA6ro6jweSNhNAggaUR-YBxCDDkjmIJAQLjQdlA5wTdBEV4DnAbWA8xA3GhuAVK8LqcCyGoMxhdamrnHWLlGBnqaSVMlRE8C64CcU2KAFsC2loS4FPoPm6GfwRUgE4h5swmwN5wZh8gqh7cDYYBkKAOga2M+xBvRDrcGvWB1IE6EdqByiC4gL0LGMUazQPeAY0ia8EJ4DbE55grjACUAYgHVYFBEFGgunAzRyhvGXUAGEKgpXfADdhRyFUuDbkHLwtSILNhtGGSoIrwOwUGzBQ2CiWG3aGiMbLQ5XQ8qBJjjhuFGgcFgH+AvoIwUHxuETIcwQSR8cWj18CcqPo0WAEikBetDpmEOQMWwOQADclciQXHDUYA5mSvAsDBPZBjgGpvgcoRHI2JReajJUBbAJQgUUYPhBuJATJIFXFZMAugpkJIzyfYBygBIgTxI7kAXG4NgBYgKKMJsAhG8VmbwYBa0P3wc5gkbgdUB1wEg4M-MTxWF7CpdQ3sE88F8uYaoHk4g0BPn1nhMaTHuwxqA35BVbx+gOdAS2AjCgdIlmpOEhvLwMgujxlkMC9cE6WEkAVdAifB9DhboWyYFrwerggWRGMRpwFSgGpIUiAu0RkhCp8mBVnJwN-608B9AChwDEhIQSXowlnxI7gRwGNINlAe-gmohSkALaCXALNhVJQpaQtoyxQEbuK6bVTgcgAnnB6QH-FhKIBxgKyR2iCbwx1cCzAB1AXghd1xoiENiGzMUSws8AfSCuxkUsOOgVCQI9wpvB04GjTNMGN8hvp41kzO9EOcEj4AOAaZTfSDN4A7yQsgMogCSUOsRIyAgMBfwbVAlbs3iCepmVwNKuDKoj4cd2ARcF5wNRCXVK56YjO5T4BM0CQAAIQbsAm7BHQAMQCgQH+ASBAxcAMEBbAB7QbHQxfY0RiXYC1wG4gQow56g6+g-H2lXAAQFZIoiQs8ld4nH9DELIvMLvg1GBrIHVQPniVIgG6h7Ahi0gmEOUgW-IayB4GCqMFvyJTIXvJXqBLIm0xDbjMdgczII6AU9hQ7hQINSARz06TA7MEoIVh4LO6Db0IyQE8nspXlzA1gV5A12QVuAHKDbRG-AQdASY42P7ybGkiDTkd-Jj5BwdD1YCiwKleaAAlAgCEB3YiO0tkIFswa8ZoIA4wGOqDR4CbAx9hnXCBoDCgFVkBPJIa4PYS6yXWQNtAdAw+gANUBEeB60FNeI8pj-BP6DIlJmwB-wJ7Ab8hWSB7IGVop06TkYwkYYyCCAnYhqLUf8A+cBpEB-MDFyjVKHKA4libciAzES5iGCUaQ-OgkCwIRmCAHCDZIQsA0i+gQSAmwAjqVpga61L+DtQBmQIGwNKGUrFTORIIA1cN7ZLyAVqAFVoDHn7KYAQAaAlyBhNDvgHJENX0D-WgEBvCARoA2YN9AG7AbLApAAMuzGKb-wZ0KoP4etAFQAtzBLAGO2xSBgbqpUCJpCugRQoXMBRkBjwEqwJMgH6A+0BSBAwNF3XItwciECMBK0hDUFrwObBA-cIlhNUKQIDJSHHQU7A+ygA0AdlI69DHQVA+EVQZCkRwCxEITkYjwCyBoCCYXDXYPxY25gUXReRDQwC9YMEkfEa8NABUSBNzDYANkTWssZNCDDpFE7IN3QTSA0YgayxLqG-sctAKmkDYAQtA4QiUoPngC3MUMBLGCWOBlwFLsSl0jgheRDylC3gCmgVUgl7Q8AIuICcYD1mQ8YfqRfYAqrgdxlVBfGAf5S1pBUkEvIgxAIuAKa9rVEEqFcECAQMjmLzAvYTr1X3wH-AKcwyEDx8m9SDb8LjgBCAFQgW8DYlGVcCgQMzYKmh2gALsDMmCoWIuyOTh-IlfeDSQJ2gIBc-VA82AeICtFLvIApA25AaIC3wAgYETIFkUy0BWIDFQ22FlvADHRljhmcD4Ri4pBpgagpc+BbbGRuAvCXnQV9o15ITJDLQCvXsxmWb6tfjiUZidgbAOehTjYwVTQnwO8EjNIvsLfgV0BCDBWtAmoJP4ajgymAZeCpQFhjo5YGkQEDA+eGXwBhVDo5FsAJUBEwn0wHG8FeGODACGAAEnKuFEsIuKeRQJkBzPhKUDMkN+EhHALYho3gn0FUYP5YWyo-pRYkBzOURYi6sTCkAQgKDhVn0qwI9ADUskRAZCjrmHR+BLQLdAIyYBXyxOEfavQgBM4RiQccBhfEewPD4DCQlEJymAycFz3AMwBaAqEQ+uSIkkwKcNcIypmMZPsCQlMaDP4wY6I9Mg8OwiuCOiMNAcSAeE48FZy6P7AAn8eN0RbB2PQQ4CagHwGEVchKxwBjDEEjQNbcZuAwSxzVCSsFYYGp1UY4WqTCEB51Ngad4sU5QjaAqSDylHY9NXAJY+bHgmiK3vXlRN00BeAmYAGYCaLAH2NIEmeASmZjBB+QFDgFSwERw9Ex5IpUUBmoPLUGTQbHh255EuDhgPNAX84JuBIhCXlXcICQAR7wdWJBkgggm0sF9uTigSyB+QBxnHy2OyoE3hcrprspjPXAoIDIDqQbcgQ6FXQBTyNnQg9AyuhOW7wABR2HWAZNQL5gr0C5UHcwG3xZaA+UBvbKaJhr8CbgTUcCFg79B5GDPAG7gNJpkbhU0C0JAU0WUveAoPHosHD9QDVACioEiAtiBH9AtgA9xEczFgo+MB-6ry5M97JkQKmMys0h+itum9EFDGabARIgUiloih9EP00lyQ79BtEApTkxjFDARxmUUA4bArMwbABhQbB4ROxrsAyNIIxnWUotguWBSBjNVKiWM8we3AUpAZUBYYGtBOuwLRJuFBgiDghCuDICgS2AGUQhEADYCbsEn4EWAXvxD8DCTzfgEsYiuA5EBuMQCVgoyjGuXU4wiIR2DZ4Ehrg5mdmonBgHto1-F-OLokAwgS2ZVIAklguQOsyYlgxjBO0CA0PHgGCwdwA3ZoYBAwNBygLVEfGAsgA7LC3QCxXGV2XhAf9TgmAiwG1IE9wNEQQXEJYCPVlukeJkbxwCeSnKjHygaoIhYM++TzhtsDW4CCULwwFdALvAujjj6LU8A5CCYy0yAtQCFGFygIv4JcYk8Bw6AurDjsFgAyxcmdp4-hdAAkooRCEApaeAEeDCYFnQPKUfBAVTRIBL3SmEWNw+YiR2tBW0SMEiYiZqBJ6gFVRnGyGxD4gAtjLCp2qwJlAFEB7gEnAYJxX-hosACIEZgJnAQtU08ZX8CupiQNKlALNocJBgnyaIC0hPTU0sA9Eh5iCpQHCWOcMJqA7uAHbBeIjldLUYbMQ2KBb8ik5H8sM5ktHg3tQcmD-0B96LuRGhC4xh3imI5jXdFTGU6IzyBE+C3FOi4BW0mv0uJA-oBY6A2qUhADAQZKRSKB6Rl9zF6KDiobUB40CGxGngCZgN1QvEBzFgf+HgwGyYRfAIK4QgihkDyOORAV8EAlYxcQhUHWrMdIHZAMCBXKkfwk-AFuEDVAg0Bb2JYggSgFgyEtynCccmCAkCHABo0ysASdpJrA4QEUsL0YY844UAe0CWRPj6AasF8QdjRb2nHclZoFFgStBwrTJiADXGFaTrAcvQFix8KDheAI5FTGXBUn80GeZIjCmKIpAKykMMweGkqSDZ4FZAUXgvyAzGB2fgQ6UdgI-Qo2o94QcWDIiKhIgPw-jAdTQ15CnKBGgCkqqXAvbCr9TbwNXgV1sEyBj-BgwFYQPNgcUGPQVwoDOmHmADs4S0CA7lxbC8pPXMNuACGpkpBOwAr7XlSIDEFGwtpR3IiPwCqATmAajpAYZ-CBtwHUaWRcFWJ02AmrgtJXP0B92VhQF+lRZCgdKlIHIYIyii4RBVJugLUQDGoNwg0aAVMDvDh24LqgZhwuHRbODlCC1wJFYD70ORAC8CetNBkCCU2aG7hBKsAEIFXAHqIeZMlKZVMzIBiEBNhQaZsX2hkUBkDUtWlLAMTAavp20niVEFqWIAMIQ1IggYChMBWEpjgX6YEigPvT0YFIKRYsK3MisA7YCCz3FibQ5WzgfqRDYBFFXtQAkAEFglAoosAgsEG4LnUcdYmLlUoD0kENQFHoLVYv8AbwD75xx8IFQDqq5K9goSLqHPgPbwNCAiqAN1p5xmh8Cb3HJArChTGBnEBJiFbAIBARHJvnCmcDavOgAJU8L4h1vSnMDVTJG4QKgYOAsiDJRjvbC1gdxglDgOpC6nDJgPGgBa0VHBRwDe1Fw+idMGbAiIE3IAQqDPQJ2FAaQLfoxqKLsHToIcINNQPOBl1Ar2DygMeGU8gnP4khxjpyaTh8QLQgSLgLyhfLmToMeABvg1uAOKjGoEbgNZka9owHjyqBv0N7uJ6EanAvlgyZjgUGnQLVAeiAKtATezu0CkOO5sIiolWBe0B+MxygWToLQQvgtLl4kMCagDu0JlAY0BxqCrkR6qBHmcdcGXoEwDB5Dh6Sggb6QixVT8CgVBajpgQJHww6BMSA0lAwcDnAHQo65gQokNUDqMMiOG3xoTAPiAXdKZ8OBQMNJGixjXQfwm9gB7CfxADZV6GCYyxfEPkCJXArE4IpDYCCywO5QH9gi9hEykCiCXGI9sBWSF-BAKCQsDNQF20h0gGsYAkAN+jXYNGmU4APxAymn2oG6SJArS5YELE2sDB1IRoOnwf545RAUIB9NKKRHEoQBe7jQR0CIimhLJW4bqYeqTF0CnoCWaa2iKHU0zZuAh4QizIDSkT6gtQFCyBtJPRphKQHBIYVdQckCsjYybCEFtgfYBI2CYAk-YTCAGoQTZBOOpnCFhCNDxCNAYQVtjBhwxUKd-CfyhPSUoZBZBBRWPnQD567WCp4AWEAmkECmHsw7wSsUyNQGpwGqmGv0iZBjBCmGQwZDZwIoCvh1qoBDdI0OBsEXKAGuBrVRp+kW3MeAaOgwaiiMnJJgMEIHpejoM4hdMjawBxwOzuP6I81AURTGkHzyhfMP5RBuhB8hEoCnCeCeNV4NuRtECkIA-4IhAGugVRB-fxvwFIABxPCJQGVRKwgHiXCpN0MfgsVMgxsi4dlY-HvABuCeGTeBjQ+FSYJPAB04COAy+B-eL5BE3YJQpNhhE6kH2AX9MFkM24lah5UmYXAGuKYIceAsNhn0lW4BNkBfeOOA7iNfcwqUHTqANoU6BsHTCECaXFdDOA1CeSLEDWMCL8AJYGlgIBAZEBypAreAdOOS8KTAk6Ahoiw2G-IAbAeiQhQhHVDNdM36eBQU-g9DS4IwtRlIQAKyOmAF8AJDDItNzAHQIBf0eRwoYCMQEJyGjfaVQKdBT4QaQEC6RRCAcw9MhgEhksFjwEoM+eMr4B5Tiw4hhUPwwVrKzwRc3BmdFU4H80BsAEwCkBnrmCgMFTbT744lBc4yEEifQFosa6yO6I3axY2X3zrsHJ8gCaBaekDXCkwE8wMmAFws8qLaQBdaFusb6gZ6YoYBcoAmyE8JM2qiKB-uCV+BN+Ih0megzbtF7DUWHR8J+kf4gC4AnGn+lEpgObUpqQzcIXUicbSG1Mq1Jww80BS+BxgD8gPwwQqMl0AKUDUJBfCKNMRlcdI8TiC+IDjCdGcERQp9BukipyCcYHPgVmwE0A-6BUQH6EEImMnwt3TllE8pPR8Jmw970kfANYyYAkKYLjIWxI3iYRan0kD+Zk3YXowILF43gM6CcMHfwXZgvqBqVCpKFzXNxyHQIL6V2gALDLSzH-gTTgcGNVUAewGt4Mf4IaADBBSchAIDv4Av6bUg9CAmdB-cH+SVAQUucjKBICCoxiD0s8gNpAosxNV5pYClgIQ4B9MgEg7Ilg4C89k-aKsQ-1dX0DTRNAoWCANY4Ijhj5reEHiZuhgMmgayB99BTFJGTE2IYEZlsAv7jf4CcgITQamCc8STCAxsUXYLrgdJAbeAwuBkxBjwbu6ftgpj43Cg7gD8gNAQG5AI7Vx8mhnWmQJmwCTAYMAglBtYFMoM1KDOQtHxoLDynE9kT3GRkERlBdaD+uDxgGCAPGETdgIDB3qF8TJJwSCAAhIIEnEwHj0I+EyEAWdRHtjRmDMQQPYauAmLjCEDsADI0BpPaGw-UTD4AI6G1eGgQVGI3zTKhBxCDTUP-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-wDAwzMSt4Q-fz10BVAHWZIyxPZC6oglTriOYiAIQoqQGmKELKPTEPbQxNQ3EA4k3ksKIkB2wXcBe8S1+F70MQgfdxfVhdVGtHlAcJYkdygWBBKT5BUB9IpVmerQHzhwKktaB3Au40HbIfEhCNCY-FFUlwMlVogfo0AD1cF1Gh0aGYQ2ChbuCeAG+kKeINP0mtBLjxa8FN4EX0X7BFxxbfEqhKd+Fe8c1Ak7BYdCl8BdcKkNTugKlAhlgmkDngDJQVfw02Rkih2LCTHLBtbfmetJ7ihzQE4iJ4sr3Aa0UHEBNXHJUB7iMQgk6AKkDH6AEKa5sQjRUtBRnjLQFWgo7A55AlDBhDwCrg9oD6IfogGzB-eCNBLPgDZAeSw5FAc6D43FW6ZuWFmE1cB1UAXMDEoETwAGAsDAFCDJiFg3KBoHBIF6BELCTbGUEMymFiQFjBzaCSSAGkP9BMxgAHw8QYjmLXdLOxYf4tfhEgDBQFTgCoIA3ohgghxCg43d2JGgeNmNmhoWCBWP62JKgmfIGJJI5EEdkqzJMQMxAfOB4iAcviioAYCE6Y4OAe1AS8G4AHRgQeR8GAxHCgaFimXeQW7Qw3cONBLeNuMFp3PGQO1cV0yDYTCYBnOSNwEjBcs6DeUvStzgq6Y1LQXzCaiHtoB1BHi0s9CtCAuzOAUNRgKCAinB5pa+HCFFqKgcIQCyk9LTHkE7qX4klvAstSScDNVOLJAEEhGEXzB6DYZ8GD-h6Ua6QCsAOOn1sFVcHVAO7AdHxLGElRHWgGoAV0wceUCehHIG5RPhQbNUfrJZ6BrCWX6S+EGygzYBosBztkGlKAwTJwSDB4ZmgtkBmMrLUVZgL0kcAsSB84A9oV+8E4hnslUUDJ0Cl4dzY9lldgC0U2NkMCMjegEiYA16nYC0SF2PNX2izh1YAmmKpwPUoCRQkOcVQAwNJUgILQaRgxjQMqhtICM2ECmfMgraAPECEsDqCDhjOMZ7GS2sREFkJcme7bBQYQzadrjgA+pNJAlRgp8h7ICEOHkwCUgVIsldhIsBT5ESwJ-AdoxZ7tfTxIRXh2Maha0gv+B5TgfcIoNC+ALfgd5BN4iiWC+VOqbBIAi3jEsDsYF3wn6yT2ZucY-gxpZnhiCeoaEQe8gvoBt4HFgJxQX4oRiT8tg3EG5YcJgHeAKqzboBhIBNAC0AIpA8mxzVCqiCegPtw7kG6s0OpkPOFLmfPyO2Ac4g2-xQai4EGGErRAfMM9wHbRgvQC-UeWgcFhoCCNhNYUPhMvbp9jAI0karJaACJgSyQrvBgh7kJMqlhmoT+klOgr1lUcE2QBCwTtodazriA3hlb9NToBMwfrIgUx2gWWIGdQZ+AdAQfNCxEEqKJeIRVQSsAlMAKEDnGZFgcNpCjw30ntGO5IHd3JHqIsAV0w0DDLgF4szbolZBd2J2HkNgB2sKnA2rj9dhalED2hSQDdQLYh-qgnpKauF8gZmIaBAXwBowxoYFZwTNggeRejCOdPIggA8PQQAXhNVnYbP6mPdAG0ZQCxx5DWaBrAEgsIvmaggShjwMAw2F1QWpxgYQNqpW0DfAMmACWAwghYVglYF+KOr3RpA+9AUNlsqmuSBAgXNMXOpG1q8kD4kMJkgD4QpAcJaqgBDGIMYNnUucA31A15BPYM-MUPoFSA15DmZgHhCGGS4QYGzh-RhhO6CJw6BOZxbBzqBQ6msAEuwFVAGMzGgx21RFQNmqE0QGMYtyDTmHicKfQHtQK0zK1B05HK2RBsupAdA8FUDOnVpmrNAajgdOQ-YAYCH3wD9GRWADOwCwbBAGuwAN0xy6JZBa86XwBzwLOlUU0L+NKYQ24DVTEw0TtAAP59uB-MD3kCeICCIGcgvCovsClQGC0UNgQ3gZYD1sDvgIuoaYI7+BvWAV2k1oAPCMTAdTsCxC3cHZjBKBNjZk4BTEm2wGosCqEhJpllULEDKqyr0e+YoyRE9B31nCbNHLM3udEQbvJ4gS6wCw5FVkWKAwQJ8ICrVwN6A3YX08U9gGgwCwin0YS5c1Q3sZRtR1zFCQFwIGXgkThFIBYxBfEPZspuAsEZFIC1iFQQHigGZZnqgnDAVFPTqPxCO6Ap-BXXAJkF6sH1EEHWTUgw2BOIkS5G4gDCwhn4JkCPQGt4K0EaIgUeQ0RSUeAdwJa0V0w8oFWwRQIEOIHQIHD0CQAfUizbIn4HOCfPMh1SH+6lfGxmN3SWvAV1BXcDaFkd4JtgK8ROaosvJ5LPXDPvSJq46fBciRhpF77DMQhfAhaw6IRUanUwIsvHMxxaIq7Be-EO4KTQE8AN30EzhqNHovPOALJqVGA0GCxtWvkevoPGo9XANYjgUCUzFxtZJAk6BZdDjHCiWFVycWwHGhAtDbpCH8I+TFyQIzBzwLPgBH4Lf9DRgZUAm1AEoD0MsBUSfQXCdijD8CFMkNAIGEAYjBIYBvgFYwDE5DeKGhplpAwQDcaHxgebAAuAwYjrgAPupwQCmQfWRWJphJEvMMOARnQ+ChQHaLhCXiSaETOYK0km7DpdLbATOAfniVkCfGzjgG0sDWobVA-B49WRLeObgO2Ik0AWwt+7D+tIE5IdwYYQaZo9gA6cF5EDkQdvGiaAnuDZokKUKSyHzZiPYyEih7G9gO3jAmgFnkuAB5SF9QE9QHewVmliKC7wF7QMOLRUoRTweJByIAsht-CO-Q1jtu8C8Ni3yJ5vQ8uwFAOVAiSTXYAMwc00HxJJ0BpoAy9DmAEJQ9k4mnS00EQgL7mKIQ3Aoz2QyyGSKDYYO+8lsgICA1JCtFL0qcJ+5alrsBagFhuuIM-2QviBZ6AEaEfEG1QZxAtRhkoBA3AgYAUQNXcteAr+jj+hsAKGwDCgWBAtLi3hUfBMqnbBQ22AcdKu4E7QBbmUrwg0BsawgtLEAC3IUegpnAE7g+ZDhBhpAJq4dqSNSjnKAJ3MAgImk60B0kBfVIkEGDwr1gPsQ8Zx1YmsVDDwfqg-NRsMFnyEfYDRAFNAlyhWQZcZgitNcgVvIZzAG9Dbsy7ULd4dPcm9R8jAIhw6QJ-IHaAoiFReAMxGqQCywRgk5YYtYTVqndoMqgfkAEShaBYaMD2oNQQDpgUJJEEB-BiVKQfCQqgSSgyeAM6A7yVi44hpbKBmWRwwCSHGfkNOQEEgT6ABzmcRAqmQgwXyBZHHUCExriogdPgQRBQkK7RBDhCdMeeczK48mDQ4Db-sY0S1g84AgmjzkXdyInwKlxDABsIDkUCbMUQYBPQ58Y5UATSFhNCwUcwkCZgNqC1JGDgLEBEYuagJAJkAIT1pF5wfrQYlBwYnnKBr9BoQAsgryif0zoGDsCZDk+pQGMZ7SBk0AEyBrWVl21yCU5DrL1YgFkEDiwS7ZZoAvVlnygSQcdYImN84gTz2ZXCPoT1A3ttFwjI1IEgJuQd3g9QEoIBujOIILPQcCYQVBRwAmaF2pPAwL+w6Ig2GCr+GCcXcmFuAaGxj4TzKDrYH01SUAOuhnjlQ4AwibVEDCQ-v5eGzkONuMPE01GkgUBOfyHoF77nBYLFsnYB0mCfgGBEUOYAXpDMBJUCKHNY-BngPFkkWgv2EkRQQio-QYa4DnBtyCssDRSa4IJME-jgxuFnWR50PfgXWAxxVf3ROqBIMHoYKIQ2DhX4CdYBLYMFkZuStTpsBDULhsAADoJwI-DAViiZhn9-CNUTRMAPwOHzScBQYBtQEOEmmyzSkm4EPgKhIUyQkWAM8CCoE9em2s-XYsBB0-BmyGYgLPRAhKi1oAkAH5PcIBpgUtgCCAdMDtEzEoGKQMhwRYdHwCSeIHhBCoeVJblhxiARkCuDBr4cxA2XA4ujWel1EOkUHiaynozTDKuHyUGeAIbUCfo1UzuEBcspYM7P61W5CYBUcGpoHMQGnId5AkuL0JgyINDILyJsUAwWjCQBjAJQIazoO2BrxBgtDa2kOoVsAl2BITB-QHq0JDiCFgQ9jJIqZMDkIFgocroQHkPoDenO9oIVsaNAghAYpyzQCdcBxUf1ptMR3KkyLyjhN0oJyA64BxSSm0Hm7KgQKiIrHhNcBEZDOIJy45Og2WSMyBHlBjCEGVTOYSOBvenoanrYN16SgQy-oIVDjuHSsTPkXLAT7B5Kzu+HsYKygKzaoKgteBQHJLrOFSPjpTESdUBgMDBaIftHdAjAhAMAVVF+IIfEakw8wA32D19TcIKtIGXgbmTF-CdeFHUEy4J8wYmhfEjSqzcQFXxBVgmnB1PF7qAhVtYE2xgW4QCbCeRCiIGUwKHKsjoYnjvjWfWapcSM0deITNAmTDlgMigc9QxEA33CKQEpQNYyCcQNOgb0z19K3kNW0mLYMRAZJDngDjNsQwv3mnexnWDY0CHyE-7R8ElshqUl5gH3oLdPIFQkoAupg06HmgBbIJ3wwBw37ERQCrYF9cC44qxxj-4roG3QJDwXwgUWBqUgRcHKdI0EuOAM+Q72YNhDAGPxwaN4wIjvajUdzv0E6nLVYY0Aa5BfTlFxP5c8+M19BROj1SBnjHV8N+QyxAu1DlIAhmeO8T4wM3Z+UDQBWjeA2ge2g7RAdJjaz2FZrhySDgSYz3CDGwEqKBzwDSQTDAtWCZLKJ4GlAR4pJMQMaBstg3GbVgZqgEUgVwAfsHi7sR5EUEG1BNgiHjGv4t2c+2YT4yaYhFIiAii10M-gZOg-3BXIky4JpwYTQECYEql9oGloAV+QoQT1AUqirHHqemdwMz8fcg1wAg8gvSAMgQgwo8AvbBZlH53tLvHwglLoL973+IkEBgsg1hzuMNUDjrBIMMfNfhQC-Q3TkYOSHCFAgP7hXEE6gj1aBuAb2jT-00M4jLRVgGgiVkUbaIMhRjaS-4XaFJBoNhWApQLuQa4Go2RikONAn4Zwlg4QmvQIG4cuACjwPzRDhHTYJygNes6vpxwnCqEBgn7ACMksDA25AJoFcEETaPLkpWAOQBNjKpTG5KHbo0Fhe2AroF-Ocgoc3IFlhHsnw0AFwDAc2aAw0BxfhuWFm4GkgN1g+6BykB9WAFROnUasAO7Bk1DIMR8UBX9Tjk3idc9xb8BCwAYgH8ApvBASCrQCL0GjU7+E2pMErlQwG3SKxhHxQ6f9jZDCYF6gYbGPA5LmUsznDrk4RIMkS0gHioLRQ6HCrgkTaUSgoHSkMSqeAA6J8wS0Y-sFL+Cl5BlwAkZVtQEbCiPTtMmSYOFYPLgF6BtsDWDWuwPAA7qGMvAKPa+HWHsUHeNaJG0AzGB7a33QHIIQWyKmQ5xCtgndoEDSPFAoowbAC8DG3SGVoLUQf7gxYAy7i3fjqEerIZhy54CB1gjUJJCPKgaXAcnAaYkyxNZkeQwQ0SJSBfEgyIEz0QgwoMw3UBxEAeQH6ye4oTdgWkAcylQKPdvJFMU+oT+r1hicUFSQYxobiCm9BMGF8OD2oD6A4FAOQjw8magKwc9wIz5zEmD0pj14N+QWPAgKopOZdqAbsHgIIioAfhLwkNOlz3B7qGQofihs0QosBzQN6IKaW8NzRcQu2zI5llQCLgagJdqAjnJMKaNMMUWLQTiPD4nl3QK4wNJAedgqiA-Imh8HXXJCASBz+BBtWKp4WrmSygVx0DLD38B0pAfCYG5AkBqdCAPNHZEvCCCQnYBpkCzVjt8PVIGwwY2tjqS+8FngC+ISVgBlgOp7nlAtEk78enAbmSdoj8WF24O0wHzQ9apzyhDanZSp+gUMYdpBdzxQGBlbp1wejAo1yRPDzzjWiU4wSsZ6dc0+r+WCpwJ7gbFUHOFQUT1BjhBqXM+mIfFlZYYkQG3aPqwKeAbChk+CSslQ-mDEwLChJivnLYkiKCQFABwQcfAxKC93GsxNDk4i5raBqIScMEjkM0AeaMWsIEcAsIDNbDYU8hxSKR4ml2vwbYIzoBM5bEBz1BLEFoIEBAApoZgYMDCY-Ctetlk6gcbfgnKD6cLkKE5LL-w4hsqcgxVgA+O+IGvgRIwmMAmiDlYIkpOeaCUh-YDFJjJXlB0HBUTvdhLl7qAR1E-wRnwVfElLjCJCkqAfYBnQn8g+fDNoFFxMZmL649S47ajHcEHYhhYeRQAqtVYCVCGfbI+CGFqgNS6wQzhAtBjYYd+B++AXTFUizaxIiYxqMm+BX-7yyPD0PhwdRayJ4p6pDqBDhPwIbAQJGBkuBxKF+gNAAD+5QwwcpGVYA4yCKYQfCKzyTGEkYCySAE4QdisCBPUBNok5gBrgVUQ5EI-Uj3FlgYGxEKuJwCBQoB1nITIFlwT3q+bp9oK-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-QGvaDvABtAyiBNUD24GPeUN8Mj5LKh-XCw2DnbKHQIGIrzhnIA1+EhxO+ANQZ304w8B1gntZoz0AIAlQh2fCHXJlgFogOGoIUiwcAE0B8UExzAIAzFgARn3tNb0Er6ekM5lVdEChli+QJNMLmYcwZ+lCOqFoFmbYIhQjhNx1jWakRHrhyX8QVWRuyCHnD0bChcODmvJpjwBuYVyFHjIZRJycRQ6DqsF-dKsHBgMwEAyfCVvMphGMWIQFvpAERC6ZFlgFwQKwodgBOCARSHpuZXAWCwIfyySAPIDbkHHUTmAgxZ8+CPEGMsRz85RJrmBW-AjACvgAbAYQsUiwoiD8jnewL3ILg5J-B6WAcuN4wNd+XqQB2Ba8J1y3RaOfASe5rbAR0AhKlVgKjGcJYd3ADADUIEfUNgIH3oeNZywAqBNTgIrHBVgyYBcqDeOFb+QB8Bv0jrAAHBLqCL0CzAWA0WNprYIdRn2su3gSlgo4INkbtuHakA7pS8wTdg5xJ9oC1IMYwfG4lUQjECZPicAYRobNUYxQNuDNAEZoKbDMXEerAWYBcCFXuG+4aFQveIEcD6NHF8EwwCBAwQgaHyIpEiIIqkS0YX2ghrhqSH74FDuLxYQqZSnkN6BrZEnQFFA8sAcQo51Kd+PpgWdwnZAgYDw1hFoP0WftAM-AEzClICLoN8kE8Ao0gEAgJhDnYfT-VMEC6AEoi6GFUILsfAiJ5SgquRHCDqBlkgLBS2XjF5HVIAJYOrAZwIaEgm0TYUFWeEWAZNkfJZWrmPyFtiYrAGjwI1QP+C2YGgsI4QSCOavomGDA1DHsA7+H1IXVAdUD-xJeEMVAQ88KAhpwQzkWIoPGxE15baJ7uBQnN1wHjCUvAIZkZQUiwBHYPNgQfCmmg2ZgaWEs+ETAB9g9Ch-VzzUCToPPORF5lxxZ9ImgCpkJCgVOgZfRKJJoMFyEC0gC6AmbBKWDkQhcyWLOPsA07Qc4AIMA0wJ78+Hg6dJgoCY+H4OiGGc9Qa3xYKAqsMn7HOKW7g1mRvWAnGCr3l3MakAaXAqQDXiAa6NtgTlg9WRQUR6hDBQBcgKGkM6Q-aoFEE1riXULcAelpQfw0wDgLGUwEk4CUx96DsZBlEA9QKwmb+zbTD4eSBQF1QS48xKcN1AwoB74PaQjS2j-AQ2CjRM4gN0AWKQ2GhH2CDIHBQM3TdOkkHBvgU3oGYMO1AHPA2uyWJA2QA8gC1oNqwGe83CiKwEsoCmoPVoqbl4GBU4EkHPsC3vEh8xbEAbHUDUPN4cNyzpAiUDG+gdSDt4XUQE4hxMAAwFzfC+YPOAe7gUaBB8FJoAlpMH6XUBMwCY-DBykIwfyAl1AiaTboE5oJrQYLg4kBBmA4GHaQCggCxggGBG+hYQF2+oCQOfUQqp6NI4ICGBMkgbqZAkBlryQ23b1MBAYmo9t0PcQKwBfMCRHHHwyyA0qIAg0dcJSweZJJog9+SSqEROsPUWAEl4ScqzdCAGQCfcV223FiLeni3T0tDt4XbgNYBVYly2DTgLZ6cz4sZQ6+gdwHzGfHgSvA4aBOfx3+FU8DuOGleo5AFCjp2DqcANYWEI4oVcJji+DmMOqEbcItmBq5lLMDtmkQcqAwvtIXfhywGdEFmiNwQyYLoEBUj3rQE7HCJQtywlqCB6XKIFjoasCcthACwWsH3sBESLE4B9AQ4QVIHCIPxwMNAoBAAdBtUGYcL4gSawMuBqKDOiDiIGtU3yAyOdqdAHGFysANASz4wDcDUB7UhaYIqkNGAFBoQ4R9gFuYE2AehQsBBjwAKwAtAGP0SLAmUh3MCYwEnGbPE-fi-gDEz5+pGWAvIoCgAU2JezBLHLaBmLARVIvcAK0quYH-wu8WZFQKnBjqjL0B1wNCALxYZdROoBH6CdIJM6B3QTwl7SjK5E7DDqgBmOwSQBUjXz0wmTMQcwgtgBU6CPcXy4MN4Pagx4hDwJ8uiakDWnJyoT-BflhflKsgExgRyw64APFA0iH3wHqgR8QjMwP5j+gpoYOG5DqQicQkCAuQEXzCXARwQjFgToBTmzXdIzBRlAKVB2YAnVQKIMNUOyw0iQQYBdTCRSA-VHcAXlgAkBqMGh1H6yHKgDIEjwBkEG8svLcukxzNQAmi-YBdaMEkTT4PUBqog4pGR7gcoBNAcEAtFi+kHhxCpIOoIvihTwWMWGuUJUUKWpAHwwYDOqBviOWPIqpdagPCDZfmUulNscxg4IhxLxbYD-9MlAPd4b7gboDWABu5JbsEjQYnQLEDRYCBeaa7IJo5DRdcSCYXwKjW8loAXjzjO7rWAnoL5sKWAnWAc1BeHIUNjYgaigXGgD5ko7FDYHe2GNSstwdYBawD5wB9QW+wFiAAJ6lBKAYW7AG6giRgGSLEjWDOl6Kb4gD3gc4BS-HPQMeAPWGacBkuAt4EsIAKAJygmsEzJi0nKTUhKQWIglIUQ3Bj0UABK7C6yJR+gLWAFpGgQMSNUWQcRBduCkuGQBcDUeagVaxRHzDvA70rwwP1Q1JYurFSwDCaK6gNjoOuALoCQrQBgJSubwgdlhFUgKbDj+sEkNhh4k11uDYYAQsNMYclo53AaWDqMULirveR+ANug2mBtYClQG4UEO8VdgFWAbanO4AP8pEYs7hRJSgMDA0KKWJ5Ala55pnw0EXCWZwGGArghXBDjEGjeIfQTFQDHo8uSleU3AEFCh3gnLiVMjkTwbYHdgQ05zls32CBUFCwERbXjSwIhnCRQlkmQC-AZ8gAcB5pH3ROM0Y2gEWgE3IlcCqEBKEP5YDjQplBEMBPQoloED4GmAkQgEJAw8Em2CogUGYuMkFWiHbzkgAtgFBgmyB5yCubgyIH0IKo+xGRrhIQzBiIGE0QOQYSwRlgm3F72prAyuAcyAX4Z5IOWMMXTC2QEih+DwzVLf2ZToMDQBSAkRnNQCJoJVQaQ+s9AoCATCA3UD-5Uq2DF1hETlEAU7tgcraKgHgZiBlFF4GOnSbCGqEgc5b0sB7sFtgIdIMALYQgPeHugP5xBdAxcLLQI2t2a8Qh7dUQxMA-Np60lRaLkgYxAgMxsxCJoB7QN7UJagACBzVBvyH-8E2IV4gikBJkD6wBrkCcMaIFzXoBmA95jEgOGgcCF3QwqWC1yG4xLOC6lgtUQQyA9fMf4K6YV9oSkYM8Crwr7AGKMJjAp2AEwLD1AUbFSIYSYacZZoBE0EHJBhQTFSqIDSpal+jEILg4G5ghggTNAbUGnOKMQW7QgeBEHhPCS4QKhIcGARFzr6A3MGCSHDwpPYvhwzRn98EV4PheEsgqT5csDofHcubO5Kzg7vg8O7aQFMfJTCfHKQTpumgLoDRUQYCcrATqgXUiKFBOEf2wERcAOBYdCh4BPPD1LfggATBPY6QiDmIOxCt8Sy4Jf8itQr-QHY8jmAjHoQWBvCJv4B1IMyCpiB9UCdyD8wPOgGTx58AgCCckAiUB3gKp+WwRwYgIWDvUMfGFdY-gILEnYwG-Hj70ZtANXSLiYcqCySDj4L1w+tAb3DSRHkYNi4AVIutBsIBqOH0AEmAYrg3iAFrCcMFZgNxmJ4SQBYFwjcUH9IK9QSrMf20AqT8HlWwMFkG8AAiB06SqmjdQHmwIBFukBShL8MDLLFSwa2Ir8ACmhMGEtkInwCtAzpAq0BzUHomC3kfyQBvQh4CzcAMsJgwJtQUkBXkAtwBv4BZuY-wCyBv-AS8Es+e9QTJgVacDBlLHLUEFxoAWAa2BSIDUmBFoL7EOOgOlIbkDWxBYQPUwO-4LPwvTD50GP8IlaK4Mw+oc1B-EJ7QDagJp0yrgZrCK1xwMJHCcHAX0B-uCdaxpyDggFIIYqKeLR1mHBCJEgJJyFeAqIjG0AP4IfAFPA9hQikDRIHMFohgBF+DZBhea+eL1YAzofdQjoSUdgN+gI9PAUMAkbVAU4BVLCLgCuge3MiKRvjLLglcwJoWQhBKQhJ2A3XLOoAv6TmAXyBhaKmcCKTG1wBtQkmw6ybYQDjPlbQQdgZQChxDGKHRApLI9SAfzAoZzXwoOUIfgQxA-1Qv7CN8ELYWI4Uy21yQyHAPeCGuOV0B0wp4A5Zw25DChHjCfLQNiLN35j3ASAKO0aDwOpwD7AE9ClnFkigusCUQj4B9BBULKWkErwqEQ0oBYnE6YPzoR1QzjZdzT9kHsKMTAIa4rDAc6BiZJp2O8gaaA5qAPIABNAkTLF0UgQhyDwkDgsB1wM2TNiAT5hnRAwKFG6BTc-38KggeyIUoEhEPDoUNmEiY52gArFmgFx8CCIFMB3qYtdEjoCvo2+w4FpwiApuNssg3oeHQbdhzzCnMMycDAwdZkCQA+x7ewDwEDJwa8Q5QgXrCVom7pGlVdnQo5AH9QDovCeLcbPrQefl6FDWVA18AiEYGyx+xfTykDDo+NSUXqAawSRIDJeHjgF1QJgRRKAV+A6JCZ8BuWaZgFiA7KCokExIfweEY4KagpFgVDQX6ZDk6gUF1AnyTz0UhYO1gd2gr74foAIFkaYFEwSpkOEIjKb7KDcQNJC8BwUQhf8DuNFikOVhZBQkGAt8hyFHSulq7elgyuQXFHvWLWgjZ8x2EbjASuDgoGmuSZMGEgC-oJgg3oGNMAcYP2S-cK9xByADMgFPmXHAOJxRpBy0Bs4ALAPQw29TJVDP1y+oHvQKeFFBovLyHAr4ACVwKW4ROxNPiz0HsSFIsQhBIgZClAhxncEJsTTAgO9g75RKklqQDlTDdQLvAAcA5UHUjKzYMSYW8BMsHpaG8UI7IATQ8mxs8DSIk9nI1AM12qOAh6hGIEKEOpIU8QkQp3ehyQELBIG1LBIr1ACcaZzH6sNYqNZMxrpRUDlsDzQL6gIBgk4BbMCbdEhqUVgavgQz4o3nswHpZDhCQjQAHxvYC00CqDE5gIYYR0Ai+jaWEeKc5AULQZB5T3jyOFLMHRAZOAPysD-pRTyBWMdUHJgi3zaPxiAF5IC0AUiJ9TBP5C2XloDMvAaVIpQYxOQEnKhgPyAGkQsFzDur+YHFsDhoCaQkJhAkz4cCMmJHCGYQowYziCohJBoFYhPjs4CAp0CFlEwIH2MDRg2Yx94UvVgHlgAoaupdQRzxaXKHCiSJ4fqa5qBxpS8EhRXrehTxA0ZgvmBUVGcxHdwGoIp0BF7Dc5jWAA6wIcgr1A+rC7GjSyMFkLygXbYp4BplH2RvUwAxg7ULJyAA6FBirdwGzh8hgQ4QJkGS4C0AAsoMPBQujToGlSCZQIaQhOQr6BPkG9kENcf08V6gTJShaAGPJQwSmwF8AqcjLAQuSLAQQJAm7AEQYVxAzHPlATbg2lAxIB+RjDVPo0CEs0EgHsDu+QLIHcCAeEbKB4mCrQDDgFZwGZQmF5sbC7MH8gP0aefACGBWwRDKVhxI3yU+gUBBX4BrHDwEMvAf7xe1QJ9T3mwlgCiQU2ARWAQWiFkG5kCkEAbCESBd4DigEQiODUuOAB3N5RjFVCz8AIaKsg2SBzGDjIBAgJBobs0JuwqsilUBQgO2ATeAbLtINDhtWi4GCEBJAHSBD8APwBB+BKAETYgMBhRA3osUKNXsMiI4qoLCa+0g21HvCBcaZzRE6DBpiwICwkgwE12B9EAwICCgJtAYf4X9gD5BCMGooC6sKsQoqA3eTVmnBYNeeIChyOBww7dxVGxbKoGcIHTAR1Awvmo0YcC58wpQ5lsCN-Lv0KwwcCAwBoU+xPkAO7hCOE0SzXAgPLTwASgNdgZ+YDbZtICmsFGkOlnf0QTsheEhMMG0EkjIFqARUsigxQah9BjLIatA2Cg0LnTMBdSRXXH5AuxxuWHc3izKE5bGQo06U-egBvAb0DCIMgg1yA7YANq2syCtGe5EvjBo0BWYA4SgfgdA4axB48DFwGnkF4IHkgS90LqAvopd4LXmT3gWdw+xKzQECoB1weZQrugi+gCgCVIJMIMFgqXp2XQqMG4IOr4DJ+peR6GC3aAv4IGwJCAGkpLjxdrAVrEnACs5GMpuAU68Gmjr4lb1g-OAmXBKRifAeuwIgpfaBJFh3YCAlBYwbrAg0h+7BTYhMlDHgYKA6ohNKBMGH8gNZUbgA2DhEUZm2SOYCWYJNSpmRxICr8E1wJ6oX4g0zB8GnSDyT2LlQekwiZAMrBe-CGGLGELAwCEgfVkYpA5QHiC0tg8vgQlCjJBK8GUQB-ANugWgCO4FaYDDwU7FKlBnSBmIDCQA44dgAm+Uh4Dg6DkIDpgBnhOYA9Lgl1VGkBYgUMoh0Aj9BP4SwMAieXu4LqQHUx78iN+ktgAwEOWhkkhrSDxYDmIfLYGIxTsUZdJp4AlxDUgpUQKpTGuEe6PnEf-A3rBxGBK0Kf4A54VvQ0wIu6CBuiyuVzwNeAorlBCDIYF+gKrGdVArZhHkHX0G81PRAJu5i3AyYCFiFbUPAALzZJoBljBe+k24GXYjSAw+or4Dpik1OjqmHCZ8lxbOg2cI4yBcYSmEplAramCEAMEArJasQkoBWkCbwDTAM1-anA16wK8ZQsHhiHqgUaA-wAJFDl9ELKCbsI7F5Qx-CC9YBhIKs8LuICggtwhHEqxgCTEF1Yp3B+VKTIFa8Bh8ggiJoA0fqbxE3DBXgB3Ai9yD-SJZEnsV6JR-F4DhUvQ-xBVNhGQTn8yYAXzC9WlaTFPgPj0j8BjOID-GxoCiEQLIpYAuCXv4HvwKfQZHSO1hO5BDwF0oJ6scUkxSBCcjVwAe8AT4PqAXzBB3no4CXAAK2MEIz6g+UjehJZ3MioXOMF8EKgBZIEb0H9eC3gcKL4bwVQAbwJWEVrFn-ldt7OhEbkMI-CbkCOB32DxfldMD+wTNqR5RRKA-RG6SBSSnKAWMBvBAcVErCFUwV7Ew7xNgioRCmUTcwaTQ-sBXZD7fPmYHMQcBwIzAhjSvwAaQBZYCFgO2BD0BXYFCwJIgb5wA1hllTRwFeoKA4Vlgupx7+AJMFywE5ou0wQHgBmJ6nO4QBNye2ZL0l++APICNcDSIDlQe7pGygFgoyqEghMyi9RFZb4PoBoiA2gVXF9DALSABUnk2Ew0axAO6A39mVgG7EC7Ebag0qQ46Cfu2b3N3gbrI7p41KB+IBTgIIIOdumISd7CB6EVmHQo2x23sBLZqvglpcchkUFEYwxqwJHMC49HzeBOIhsAaPDOsEV4DqEHCAdWJByUKsErCNPAdygAFL8YmLqH5qjj4PUIKsxrlAsBJsAPEvazAULBs0QXoqWwNDQd6il-B1IAK0jU0CRSLMgUzpmsDEiO7pH3AZhWVmBSgx-wHcQN84E0xiigP4BYEF-komwLug-JgVuC9lHmoJdQQjgqoANF7djlQQAPANuAXRYM+GPd2aiCoeaeQLvgCnlUUE5ILyICxg3TRAsqMElFQOzgM5oY+KOMhfaArvCCHMggqaAsyCBQEqhPQQRywbqDL+laMGIpdkwGXB22A2sDgUEWXNcYeklVjCFNh+EBqSH5pAQlk4Bj7aXLGyQFM00JUg6AETaA9PAFHzAFEI3RA6EAwnhqgKLQHtgc9AzIBMGEClrhQMW2GghgYBGbBN0deIa88yAYqch5cBVeHhjbdZGHyzJBUsFm4BzAUGISmAvODKDEuoLQpIfyqJBp0Cz0GRwmqAH+gqc4HfxlQBwhC-5B7ySxzg8J8NW7oHNzeXwhqh+7CqgEpIJPLTyO7GhntCTiUz8MuwbKA1MBAZBIUsT4CaQc6AdcxSIA3kviBaNAKKQ4mBsFCbkIhYInAD4k7ENOfwfLVqjG1wAmgyxgaUC2enKIJUqSDgGIBaHgzkDqNDuwNxgFVL99oCOH7QtJfS8geXVurxzggCADGAAvgvGA7GRqEHKINCAFGwwBD7Cj8thYCQKUcuwkIhURDNgTgsE-wGql4FBseTM1ACQCJYNcA1ZCzEnZIDMgAfgae2YUsFkA4wBAgPg5V1A1Fc38RFxE1aCLQIw0IqAWMFAeDJgAlQaSQt9hKBAOtCk4PQAOzgWTjdnkXGKswF7tc4IajgRRjten4EBzAFFQrBK6RBeUClSXsoeIgsRA55B8SEXkTYPJ70jCpLZDc4F1QvPkEDJvSAF1yNYHi0NJMqyAZtIdDAcEA72qjSfKIBZRZWgfIC+8OSS1HAG0BaMDy8DjoAYgAlAuHQvIBDDAI4FXAW+wINBd7T-cV6pZMgL5Q7OhZ0R8YqEAPRMeJcV9A+ID+uERYCaALxIKagcqDZsE6gLs80cgVhRE8GvgguyPaEqni7bzy+iI0rmFNA8POgecAbuChkBmwBaQQOsO6Am7BfiFIGA6PD+AXOp5aDaoAzUOYsvFgXoptJDgCkmQMXxcN5dtNI5BEBGIrqDMQFANe9otwuSBn4N7QaUQJEKsYgdMC94LtQNW65uAsQznqA2DLBYXRI4AoAFAI6mpYNyQVtADChSBAyyRzUBUUJmBZTAxGDkaG64DjgFugukAlKUEeBUpXzANSl15LQUQn0LIGilQNciWvAE7hAxAa8r9MkeUxUBtwQQGBjBB78jS8nj9DwBVZBT9B8QRrA54F1aXVeKEANOcQR+3AB6gwlIHN6OtzGSIfABANjnJF8QLLwnWATZBQNAP4Bn4PQQbpIhDg99ZR5DLsXX4+EIvXNX2hMMGdMG0gUOgiuA0QwgwGhwHrhKZeSShnQjFqzKKFpkQZgBkAwcUreBkTJ6S5qU+ByD8AJUEe2CxrJtmoSpGCQiwAisVTos+ABgIevkqkGkiAtMIUEGYRhmA2nPzELZHdVBfFKgAXLcDSYMBSm-gYTBQmBEuDa4FhAHWAa2AP4QBjAewKQIGaljvA5qUmCDXRVmUJvA-LpurBqyiVQILQPQAvJBUgTtRylSaLQDmA7vAVeBFIGfIFWoX0ekrBjZAz8FbSGKQb9gnNBS+C+HAfRcOKJLiZSF0kDG0HkYFuEfbuiCV2ABmEoFwGeoIWAE-BLhBw6QdJdkwcPQr4J+sBrHDmRaMeOve4Ao4MRw8BXsMVQXIk4+hkCCMMpQICpIICAolBMfD4eUcIECoPrACmwwZRN3GAgJ9IGYyXpFuYDREDZySwGMkgwiIPWDuADBwHCIdlQ0wA4eA3ECfXIocloACK9tICh0v9-EbwnGAHNLhDkO-gaCu16IUgyypcyluQHp4PhjeGIhlLsxCdEqFYPRMKLQN4ATSAikFHJW3YBTY-9xXeC5nDRmQ8GTvYl8BJti9Uq34ANFOcQBddsNDJ1BFGAcsl3wpMAuWAtyBV-rSYDdQ1Rx8iTHoFY3l5MNEgpnBm6mxuDuSJ+k4REF-BHpJIuFEIBfAOtAlnx7DDB5CM6dQIVYgtzBiRDYaRspbLAFXgeMhnUwz+DQGac49qmG0Qu6AKAq1cAWIe-gUNBLyDd4GYwM2mPQQisUjKZXtSmQL3SwCBYxL+jRZJFRgCygHBUafT8wWDl1fhHzAMqA0kRahQCpCGGAIYSMgBLK8aY0oBjHgpsa1FHXpxGp+wEGCocbIbACDKskULQEHEI1YOcQ3ZoWKgy7k1SB4QNGQARR19A+RU1hvtQPYsuwFDhBqABKwOHgCnQKlBIlGujmNxLbANVAPdUJ9RIEBFQBsyrPOHIQ2WVryH4RQnoFNQn6kaorofEzmFFgAmgAVAiak9YNKDIxAWQliYyKuDTnFT4LyQFSQrkg8iAJUHEwNoYa3gqwJc4W+CGlSBsgScgO6ABYAfOAI4DXi3eQPnRmfSrYADRUD4F2IFaAvIDOqBVmKqQbGAxlgIWC3MATMB7AfhQ54ly0TiVCRcEfARnQUaQx2BvhC5JY8yWe5osxX2iBUGdMGVARCwWeFAUDDAVfaOARIwEaDBSBDakEEAKdAMiin0gmXBqUDJiIWsTGI81AZvDNSn4EG6gDwgXWQYeBXoFewPRIX6YHTBukgsSGzoJWQUiwIBBGECJYIkxUUGKAgdlAU5yZ6DzQLrAKsgsOJuODQfIUeCiQSKouJAJojYCHC4L4ytkEf9wZCi-TGaYL9MQnINcAIDAz8EuWIXvCNg1MRftBdTAKIHt0+1AC1F7Yj5KFlOFi0GCA7PQbB5LXz4gBVxDaAETSr4CRUD5gLAQLbAXdBrvQwkH5gOGVRrgpAw64yXZhWxFmhCYm0LBX8HJQBjSLsgWz0WWBG9BIEHPgBtVUaQXTD79raQAzUGUyi90-OgR2CgUt3tEmEyuAfKQuUDLiAuoBCOQKA2ihPKUwIu92srkSrAChRA0g72GDANZwchKj8hAZAaMvbzkVIV2QFdLbgykADQUHOAdk5hJwgkBrgFNiNoYJ0GNrl1RAEsBPWdzAPDWrJA+FDlKAZOk5CAs5SOBaRiV5EReeAMfyQYhA1pizcFgzuxoeVlmkBUqUxQAMBIs2KrqeMICGUqbGvCKqAeGEXzAqSA6jkLBMIymXcX2APkCUYHw4FFoWdwtMABkB4DEBiCLc72oHKh6tCbYsQwGJoF-gMGQ85BmxPTdJR4TiA-9ys4IIhXKwmeM6CQ1mI6nCEwBfZdOAQmRzohi16Eh3pYNhpFOctYh0tBWYAMsFcGZXIGlLbICWfCpUH4g+EgmFwpVDrIGW6QcYRGB4+o58CRaGRQPNAe9g7SAcvAFlFbkP6IE7FVdhYuLTZH1gjeqABQJMQwQi+HBYqPLnU6IWSQoUCyiGtjFm7UGAQsAgmgBNAdMNkgdry3lIS6xT8G80AI4OsOv7z6lxw8BthNXfMWkmaR5iB-kkYxCrwG5m7VB0Ci+HDy2jOgaNlLrdhajwXAo-tEQaX4ZPBqvkiJO7oPayDQQfzA1aWioFd2r2Sj4kFMA4+BQalOgHIANEQHxIcxx8giFYIxXDii5xAlqS1WmsxG+5CVwE7AHTCymB+ZWLgx+At9gEjBicqqyHNJfjMckJxKjqdBIICjYG1gSCBqWg2coQ1JoMhSWKBBMdBnYtpEB8CO-sLGQfNC0BF5ylBqImQVERuAC-yCAIO7QI4iHRB4LjE0CTgGj0emIBMhmwAdIC1OurbYOCBgJkKD0xDIDvnkXYguqxXXBYMDfcF63NLM4KBM7CQpnWUOOAMkgs8JjThiUD01DokaOgEKAgMCRwj1iP7wT-QC6BFxTwRP9gP+YZrgAcAo6AbIBObA68cNyI6Ba8BHMH9gCxULdA2LBXUBrwDbXIBIL7QbhQnqRqYEfAFqcJLSrvBMyCSgH8rlDQd5AC6A9MVlPEn4HlIZcQw1wDtAJfMT0BiUYXgdYj0ICYiG4wETsM9ACNpdoh8dAlcA+gD2gh3AdgDIIg4mfkCMnwFNNrlBnwDYgDlQLgqsYQUZgDHi-DuhAexgNfK1gDcEBEYOeAcRgcYBRyB6CBkoK0wdpm-yLQPyqwlZQDX8E4wkwgbqgxmn6sE6gUPmeyATiDZIAtYFwgJBgvskhPBjFCbAISUC4gGuh2wCtwHiYJ1AXql++hYMR9pGJqCusbpI3FIQ9CGYAMQHAkENASO4voDLwDZwInAL7AjPRmjggsG58CRAWH0e7B13G04A08AWkU6AQHR-vhvNCT9CZgdnAg0h4cBLYH3QF3fMNA8psAijCIPrAHLmGEwQMRhMDzkRwAMeGZPAtJBMSCtwB5gCGGVHAOLQOuCmSHQMMB81CQJogY4CxIWWAp8wR5AMfBCeCfmFBkBnacpIq9oRoDvWVnsjEIEueIsAwBgpoFPQPxwQzEYaAqWAcZGmQPogZOON0AZCgRVVQiAIEELAXUSiEADWEUsHHYHaAq2BBmCiUHu4PZoDioze5zWCWogYQJjoNVAokgTahj0DlzHswAawkcIzhAFjEQuVjEAdas7gPjS5UGT4BigOr41CANMSVQlDQBR04UgBTQJLhmoEXoh9SHhgN1RrOgMCEy4NZQUGFouJ5kSiJETaXoVDiozZk9hADQHu9DqYwAx7KhfYBbuGzoO-QH1IYmAwmCWTAGwPpsx5kAnRqwJJeBMCVokExwjORmsCtmC-AMYK1tAqOB5vBWFH4RMKQMVoSfhUaCXHgtxN0Rdr0g0hb0SRkH9ILR5O1ElVAucA2aB-WOIQHQmw6JCSS2dA-5ZkiCnciEghF6wMAz4HR8MmUOmBkIEGICGgOUwPdwskh+uBgKPUgMPUWuQX0BD5Ir2AQwHvQagQ3dJjgpcTDSIITxJCAfBpQVBuFHo3h1mUjoJcIOKj5Nh12pMIQcIbkoJhQL5HBiNmQeagw1JmjgemLZ1P1YcnowcAjBRaZHTcoqBWpAfNBpEjqdDQwNagthgYtI35BAoAySG4ALcARHAYtCeTgxGPc4clQI2BY1TdEHjQMHfHn04nsrtRBKCioD4K+jC9kAjoDnqEoEJEIXmoLoQ+qA2GC5oN0kHcAcxgVeCIkGrALgi74EheA5CjecDrAJmVfABRehfXwfEA5YKMkGDkJUQZ4Dl6C44UM6Hxgi0A5Nh-cAKaKR0snEFVQLuR5gE5IEcYINUu41eNBSjE8QPxwcNy0grkxB7kAlcPsoUGABhBsuAxGBpQJVgKMQa8gXkD3cHHCXMQRIwZA1lijjTQQXFHkQLIKdB-CD8oGkINWAHFRwvBlryxkyaPh1aMqKxsByFDznNbkNLQGeAT5L2lAdqz5oCEQeVIl49jaI+MD9ePdgdIEYTQ2sDv2kwQCGgOmIAiADuCvtBigLH4J30+xA5YCn4D-cPdAT-QFVA8SDU2iKeOJTKPwSslg4BHQDtkKZ0WJ6yLBPUAxsgTOC18J8otGBlRW5Cm8DIxqLVgswl7oB1zETtu4wCmA-RQY4ByUrnTOVtYxQAHT2hX6EHKkPe-AqgDexDPlo8ARcNesKPIKyZhYAI2DKIEPwKlgdcwhWB163qgIPhFyA7HohPDJQAEATqEbW4aaIAZi-ikmQDP4GZWewB8uDYsEi0KfaGfwhoFUERpyGkYIKgOYa22BD0CMMGuwFoUHECyT9TfDV3OTwI7E5pAk6InhXb8vnACkKyHI5SBiOAs0G9kNHgPFAUWADHB5CuqQF9kZ3w3tlRZjsAxQKJ2GP98dXxWGAVCqMQDRQQpg+nAGkQrx3sSF2QFWYhwguuqn8AaIvDCDbOlaQtiJe1GjwL04QlEsc9A5Bu6IPsCZEOJQdgAAsAuEC+0JegEik0whvrBMuFACfCYOYV9gRirIeIl7-AB8S9AZfKBoAjqDvIAhAP6AYLQDIgtIE+8FJ8VTQWKAUVBE0A4sM7QYtA91JC8BH4LlEBiMMiAGZwavnTcpTwENcFnyQ5Rl0Ae0FBUJdQAAYLyBaMB1MKwcEzyNnAGagcYDoiEUFZ7wH0QzsI3eQJRAJnKLiFFQoiQjIojoLnJmiMakAA0AgXAAoBmJJTUfjULkhGmDJ9xfEOiKh5wnP540BMQTvgL+88tQenBW2CbcBTUIFBKIgC8hjKoL1XOGDyTKvAZOgcVEvKEzYCTgM5oF7BCyhlQFLgC7kH6AFXBk2VP2iufD70ISA3Ih8uCL+G8EL2UFcQA0BOoAGEBgoNXQehA4IQdYALtGdyD2yJGg6UB06A7VAJqOhKERAtJTvPyoUAZmKfS9EQmm1ALGpkh4gNh5SfWqOhVL5gsElUPw7D3ELchzom3yG+kOICTo5JMAk-BojHwHJV2XlgNjJjcB+YF-XiC0BS0OxzL5ZCoHCqqpdcdQRlp-eJ8gH+oERaKHg5DQ+aBA+AwcDumM2wGGwYMDIUDBlLVA+4ow9RtBbh4BhUeRoY7gtBBKADKZB+wH40dkU9UAWQpgmjA0C3gd3hFMIOyivgglEIHWKTFq6BnYS9VD44L7CWd0SxzkEIL5H+Ut-IeC4X2ATaEvRPWQJLAMw4z7h1ai2VE9KCLQZr0WYga-g3TJuYGuQQ8AtHgcFTsnkPwKHQfni0ZgcRgcwB9FAkoYIEteJUyQE0DFoB7wT2Q46w8ajYFSEhLdwMuAynLZoD0sHGoLqwQeYZIgB1A2+3bKiDAd7yJHwEkASIHYdJNOFOgljAuaBCsAL4LufX3gabkxZW9+nGoOsAQSEQ5QdP5TQCIgMzQXiOgJAxACRQFYZDA0JiAj3QvYTGYGsFYRmRa2qtUi6BBhnm0fUgdhgfVAhfJawAjYJbQGPl00N8GDmGBlYHlwWpA19AeJDUtDaIPvgT04Z3A3eT2aByxCBYVCyvtJJngXQHzgG6lPTUAyAR0xI8oqAIGiUh4YaAfFBHrUyoo4Is-AJx4IRz6GLiNiFQUVlZah99CSYHkuC10bFgJ-BP+puNBMtP3ozWgcggQCC+EFsIH8zUewXAgaIDJ8BqLuMCcJA6txnER6P0bwEIfWzgUsQM+D9KGjMB-CPaATZATiC84E68Ax6E72MKAe2CdeC53M5cT3g9mB-JVkaHLZUUSSdkMohyoA00oPFRNYOM46dLJ-604GMINRwEQuZWAMwC3cFaeN+wIg6vAxUWjJtzC8LNAZOA8MQ7pIfEC6mKjSMowqGBjeDuoFCzj3wf+kCAlsBW6GEAYHgKwX0x0gQwSwhEoEFdgXDk5Hg33A7GDrAPlwFlU-VK65h8Khf6AwGCmQnJRmCBZFCUrmqwaRwKBQ+aB5sBakBRifVlWLj+qXWQCAiseaKjAogqJdkSCsjgBaiCYmP6A50z5qE9DBfy1vIjFoGplIGi4jLmY3uIXtQl1AXHA3Fa6AtzyTyADCgWgER0DPwOskzBgDBK29GJYN2yCpurOJjxCjrKsgMdUWjADMQns5NtS4KnvINRACVAV0yT6BcwAkYAKALhR4gRsMT84PYYHVABdA8KDZIEOgKLgLHIL5h-IC-vKu-E8QO9QLQBJhDocEWQLNzOpQffcocS2Mg8IG+QYwQU2I+jjIFhWqLwquGAzpgBFWEIBZgF7wIUgx1Q9dA55A5mQeQEgAMCAWKjwyFncHA4YxgxUg2+D6IDqCLBQcQ2ZMAdgBAeQXcOooGllNugs6b60BDmBZsIMZw7cOkS-KFMYI0qnWg+qgoujLXl7AG80ajA3mJvWDhcGO4Nm86EsVLAfiB+Skn6ryIRjUE4CmYhhQDyoCGMGFgiK1DWJ7whqQAB0+NACM5+QArcAVgL+KTJAGKAxYAFznzEAUQcoYtUA1MB-oGjME5AfiANZg4hj74C1YLLAaiE1GBsshn4GToDqQFOIIaA0EDrjKSeWpoJ5ulsY6Ah6Cp9oMPIgaAN4AboD8gGAso3gMdAxnBheDBwCWpMnwUAVjSBomC6TmOqHxSp98Ek5jqjDnBrAIhAI6l9UBeuDJgDI0DPAH9gJlBoNijNHlwrpkH4gTR9eNSWLS+UNPdX2getJOuB+qAuQOHufkV2NhBRVX6EvYL-gOtAmtAPKgOkEqoD6IZeV+Nw3EBJQEVpGtqSFFZzQ+KVAQCRZl9w6mAmhZi+iGGHD3PvylTIfONuKQlwg-wDogIOFeMA63AFEB0QGc0YmoeqARWYKUDz5Q6gA-Ax3JokR5UAildvgUGAGco5iCn0SLiI+IE4wXKAaKj0SoJoHMICoo8gqZzSVWBnoNEQXeQkZpQ06IQHQ+vVAHz0lVhtjDEYHOIEzkRVIXghkuDTmF+IGdwImIoMBcNSQoGWMN1C0jU7MBX2ADWBUaNngemVz488BB6IHBSc3gUmA8mxshXg4B8VXEoQq8eWBA+R+FO-hO1AX2Y1aUw3xIGimQEa48iV8OBlFDH7FSQExAH0UHeBgVUN6GMwIvYHOggUAT6CtZC95A0wTRVjkIdFXM+GkumhgHTor6Bp4CCPAE6OdgGegsbJVCCNPSJcE6MK+A2uRulDnaj5xkTSWC0QHkfUj8CA3-JKYMfkczRkxA6RBzyED1E4wtVzCYCJijE5jrCUxgBaqhfmlDAn1GkQVVScRksoCmdD2YBjgcDyGkA1+iu4FeoHt5dAwxuBpMI3IlGzJKQR1QwMgMxxmwiGgGUKgiVGcRKhU0UExyLUK5PgyjpuACHYHBwCOqvyAWsAB4B+8DbgH9wD-ECGB8xX5Al3gAzwfLQHLBSLBVMBp0E8QNAAg0hr+aO5WS+caMORon4BCwRxdAA6WpAf7he+sRixP2hzQETscoYRvAYq4XsD3kJZIQEw6IwXQ4hLRUaCkEcigTOQqKh-L0J4DwqjYuy15RRm2HVBRFKgQnmeAhw+xKIFX4Ej4DjQncci4hEcHMMKhSU+5tlBH6C6fR2BJ9INxAZIg7BSP8AmoJVia6EEsAdsAZVFqwCVwCbA3kBbrC+wHqJIQ4RaAtOBbcTgxGNFZ8ZT6QEDAo4hMGFvyLFILKVA8JsxyTCB3VcawlzA2oxIhCIxCh6AUEdnQyOBUcAYbCSYGmqglgeq8s1UikCIMIuIXqA63BrqAmmNwouAID+g5xILmC7ICQzp3sLLA4qAU0AzYBCkSxwPB0RBgf1Ue4iygH1QcqQ9Er40DrIF0MArWZRQy4JJtgBFF7KGLkMqFE-ANsGlIGclUdgMw4fxAqchoYEn1nJcVS+2NA46AWAv5OoAoH2gwHKSbJp-Be3H71Hp6i-hH4AoXHRGJKQEJR-7RVRAocHW1fsA8xV4mBuZY+lWkRJhIHi0MsAquSPdFe5cgq8SgSArYKBqgGnaHQEC-lruBLjzSKungGvIQRw41BXwBOEDkZOcSM5Aj1BzonlKDd4BfIFOQfQKEoiFljymH5YB1gtmBfEg6GFk+NYqP9wYcq8BAaMHFEP5oSjAmTAIEAsYsm2f3g5boJmpFuC4OAAoPwwNdwf7h3SBPzF1FowSdOQQUAuaD3GyLRLg4PeQ3mgdsAJTCPAJ1YYRkPhA3ECWfH1sRUUZ0E3fABRDNRE2gdggWwEh6INogJAx9FCFEMUJSUji5UUGhDFW6iTNgTUhrjTJ0U2FaMcG-gZewANhyVU+uD3wZb4hSgbVHvdP8wFW4Z4I0RBTnAH4CXFTmAdE8d9wqul0EPSWNMICUADegnPQvIEhECXEUAgZ2xTOg8eFgYDSge+hifBNLqfmGvEAUbKsZ4UAzCrJyuvgKnKxbgS7B5KCZyvj5UWiV3QfnR4+YNipQEKMcNHALYqsQhZI025XHYG+ozDg6jTXGEtGPbEDrMrGrByRWIDYgNrAUNQ-bAlqStkHFZYhYMSVj-BChCSStRFbuaWXiiHT9SCDgDhgC9NJJQluBLHBrJgmUO6MGKAFVByIQrEIbDMiwctg4sBfsDzHD98HWAZmA-sjoSqIguAQB+LOr4I6gw+XbIADGGoCHVE47BwBC7kCs2lWAK+w83gMUAalDvWJawPAVeUhCqDVUFVqqUg3eUQaZyaDv6yg1Lj8OClC4AOpChYAa8DogA9Ah4xTEgtiHrFc3gGeATwRXiDWCrjOPVoeEIGcD6uDL8phgJ3sMIQAThGmDT8jDxk2ibAgo5g1sAJkAtAExGOQosAA8ZW6GCCVVQUEpAxFD4ODFQGqODcKyyk3DRwFAbMgn4AvKsGIlYrU0ACaDJcDygTda2TB4lzuQCQNINgDKVXAqbADvbGkni+MN05UAgm16RyS-EIV5FC4Tno4wBj0E5-FzoJ1Aw9tLBW29FqAtzec7gtSATpV4zJtwOUAdQUdUZzWAOYoCwCNAcSAzMga2Ct6vPUAfBOQAspw8YBUcCo1fGMPag-MApsURwGBEKBEqOAa6JP0hZogzkFiq82ViqcRXCtkC9VeIhe4olpAgxa-YAM+tzeTlVxdwFcBeas7gIVADvoB-orqAVUB6PGzgQLQLYI7kFyeypFYrAOl4rkh-HB+wG-oLPys-gA9IwuWUwkpARWqvzgyBAmZU8MA3AKzKipAbTBB0CywBVgFAgGX59ylMJCfsF7iBiQDvoKrgL5iwoAHhDugXQwhRg1pAu41X4HmwFVAH9JoIAVGpLQNUa5fgF1KP+AS0FanHBmGCAKoAiTj7fM9QERgAZg7OAlhUxsi9hNzAMiYoaBcKLp+EAIMEIOpwXKQxoATkAfIk4xHRAx2IzODWUGX5aZILqlwBAp5xwFgFKAGCtH4e-RA3CGYBl4IngPqgH6kshXh7gXgE5qxkpVqr3NV6njilUt4juAhgrlXDjAggkKfgEdMrqAf+ANoGQUNaguCV32AudWGt1WoJYauURy1LaHhRaCHlfMwIaAPjAiGwVQAk5RSqzHQ2+BqVWhuBPlSlSVp4e8hSgSlAGINeNAbAQBKLnnTqIDf2RYbJXY3EgAhA-BPVqHnAOnVzPgY6BPkF6kESQFHkO6h3JDW6rNhu+IF-AJdBUEDUASfMMm0geEOUhvBCvglr0LigUOAJsAFsCZzEXBEwsTGpx5tFYBfCj7oOz0V2Zit4lDW4yHHWMdIXsAg7A9MXWQD6kGCwCpV7YNvz76Ct-Hh3APGs2yAmV7uLV9gKAq3CQECr7SHuKEwgItVKuVOawANj-+HmwB+AdcwxBoWw460FSgHymTypgCANIBYCp2sDgKghV37ARkCiwEIFUnsGTIpAr-Yko6uggKLFaZs2yrWkCCA2dMM1sQ5k6TBd4C2ADf4GYakmqFirl2UjMEGwF6y26A7-BqqTy4TV4GgQcPApr9DVBaJG1BjuoZ0wqOBX0AXTkgft6EOtwsqROYBHQC7kGmod2Zn3xjujzeCSFQwGWpASCxpEhxnHSQN7ZZPg+WhiNV9LQjpFcKnFVLEBAtCJwAXgABQDFgGJID0IYCBYQFeU1DA2NhEQLoJHyMFM6HVwu79E4Aa0FC1fJsYImBiA1ZWD4THMU4gQxoefLI4A0lCtwLMUOtAvUgIqi3FCbsAUgBxQQrBpkLfYn3gBXgT5gUZqsUB1qAA6d20W7wpRw39l8ME6QEpwcoAvYA-ToLmyowLpAeokLd4ekTCcENQMYIMBVl-BtaBMCGdIGDENjoyuRyaBgzVmgAMQtAkLWhc6AGrBMiNPgZfgANB41WhuFLSDjANgg2IgHIrwQFbIHVKrmgkmAj2Cr4QnZOzCspg8vBANVYaLBaHqwC0UP6wDuEgHBGQE8wFZlk-LMuBPRB0sMca77mbkZTfBv7P3wCY4KyVZMAhgS2Sq64BwQbtoTkrjyB6EFscAm8K-oe3lPdH9UDZYGDgW9ukfFAYhpQFMkJTCYxg0TAWbDgIGAIFu4Hi4UOoISX9DVOiIfAGUEMlNfYBEKD9FcAUUuV7Ghi6hYxAwoLVgSmEvi0bDioIC+oH0gV7svsQyKYsypv9MNicqgCmB2MjdNEKUCPTbSgoWBacDixDFIJp0BhAsgAtfDtquAQOHoeHEdsdb5jdVizRIdicdY8S4aggQUWERH4gfrQdosSojbGAvoFMgKOINgANi4GMq7gCl6U9JzUAWsBa9PFABBEJA0DRMxmwh+A54GuwbikrYAS6DnoHWQGWQFsVZsKcMTKjy1ukSUfDlhCBtfaOipXlUdAM+AroqoxCtBBfADfKOq0I-F+fY4WtdNQ90wnBnprMfj-mAFSAWkH7V-3w-tU-sFoIGMUKtgeqB7iCGxEwYMMQBhAQYhjxB50tGaJHIRsQYLQZoj5xCUQK+0CfgGJqoYCH4ATuNiIQwQJnxZThVkCU4LHAKuYjJVrdYYSG+wJkQQpgaiAdby3IgA6ffwYqgXFJW0BlwGKtSqkLnAaTBBCCiGuBqLGgCCQMIBk+A98G2NdMQWFwQUBgKirUAtVRYgHxVyYhMATOkBE0fkCLKg3sAdSLY0EXaHYZKvcIJ14oAdKAT0NOsXFA82hyKA4+DqtP0IV70y3cmXC7wUphBTCQckxoAPcQQul9iIhAPDU2xhW1CDCNXXuwMf5ACtJ4tC9aDxYGTKyc13qgCYDw6EowGEa7+EvzAYRA7tHHWHIUVBAkcANMB9qsSNR-BfBQlCBBHg24DyCHxweKAOGgXYj+aAZbpDcdsA-RRihUnwBgYPKMHEVN2A9ECgyBuwLSwLsE7pBz-7PEAgRuDEOa146AxWgSuC1EEAKg1Z7RrZoDH7HyiNZUPfk+fRFU6J0BfMB3eXbi37Bp5DR0iqQMUoW6ge6Jd5FrsEnIIN8En64mrCdWswGrQCt4Kkqiegbfb9cA05MqwZCk3MBVwCuuAnIDeDU+41AhuFU2AGVEnroV8Eepg+JlPCQ5htxIVEg6qsuPCipW+dFwalgGS1IGYj4LDfmcZwdpg+eqWoyfSF6UEGoPGAvUgCxB6GD8ORnwHyAN8RpdW5izWmCCESlg+9xRpjMyFvQMRgSaiwcB45BS0DVPGda-vsd0pYFUOnBlgLwwLl0pvAKLBDCvQNUPGR5QYUBwBHBgmKQK7AuWkxsgxCCQKt8OLEqIEueOAFNhJPMb0HzAFKIrLB7lDWIF9iCSQNxom8BpMw5gmzALDRXUWeYA9yBcfR3YK5cimVHUBvOjD6mAlUtSMLgpNrD6BIEDENZTa1KgQpAnDAjyktBIeMHaAs3BkMAWOAv5YbAP9wCUA8bDzEAy9A8uKjU3UwRsDFoChFTfGOMV+DAe155gGFJGRcS4QSY4niAQGEwYHEcF4QiuBxoDmmD3hD9IN+lWBgTHBs6gTOLqQPNg2Ng9RnTmru4ABsZR1rmRRwQBUjeHAEqs2AqOBGYB3gEjkAma0MspTA8+UEaHfED3YFQlh+A8HUoMA0gKyoLggMwAlYjpMFI8NjYLogO6IOxDXZFd4DUkXUQOzcfpVBoCKRBzDZuAsasa0Di72FtRbwaS5r3ZAEAy8FywHIqyo08lABQCB+n5AGHAuUQU0gEMAyUCYuagQJnIhzQ01AfxzbTN2xSvlcnBfhVWsHIwMt0CsUvMc3BAXwDKwEAKrywtiqVUhdwAkUPVwHCAXEwNqhr8ql0FgQKjgBHBIvAXHHW4HpKk21i-gjnDAXl0QORoCLocCqqrhZNUNQHsAGEcOKptRSFMHUlYIQZmQW+QrWARIHBCNCsU7AGqAFjAWeF4YQiDKcwXSliulNgEZ0NQaHkUJ0BXsAauCQNOdwcQV7pBr6CTWtigGSITHQ2sRIeBZYDXZBJK2zA5WwZwBdQFFlQEEvywZRBRpAXiJL5Rg47poIkBHWDGWHqSFPYNggRuEjjEmiDBBC8IHtg7jQQnoo2HYYC8qy8JWjBugDRKB0QGHgcXw8tAjojbUEcsINgghwGkASHg3oHsMFwaqHgixk+ZVJcGloKLYXOgIZAE5Xx4AfkD5AJDsVWUx-61QGIoLVCJ9g5dl+IDiwFnZZ6vZ0QWpqa0DEIF1Nb-aFr4BprRZhjfhNNWSIROAZxAgiACsipkUuwBawAUBeagl0n95iGMMhgVhQgXBWFGTjhUgTO1ry0RCDaclsEnFAaHAEaruBAUAB50MSKuNVGghb8hX4BgoLJNTcgeVBWhb5qCh1alKucEn5hrOD273biERcq9QaJIziBZIC5QA-cz-0oqqRRXt5DNsKXABJAQbrxSSdSG2YA8Ia0QvEiImgEQBNMVggAfgr6ANXCiKsdpGIK1nV0KRE9BTYH19ODEb2wxoyezUwVhJwOjhQc1IPJtbUUWrHEO+AbyAILRgzVNwAe4Am8Slw7OhaRB4CDy9DvAFqQOjqwWBgsBeEO5wA3A0zB9uBMcgaQIF0ULATIQ0XUV8qdcIZgcjwGiBDYiipG0kJi7dcAgDBHti-FRycAeNZOUL5gz1U-ykdIO5AUSQJkwZnKcEmeZvKkJhAsZww+h6EDEsCyQzg1C0AZ4Rw2ASdSTEOFUE2rSgnbUGptDAgL2Ac8hWmDqQFh4GW4a4guLwl2DZgENiHwgF4x8ygJxWtKs6gBG7RiwQVBy5U9Kq9NZ5QQuAzkBVbUhzEblZUCKQQAqR-nWlkGcQOVQKxA-XBihz0MCiIPciWAgtAMr4DVwnQedPIF8ET7l61RUVBRUEtiop4AmgPISJIB54IdgSEQF5QXVIMQiaFMfgT3gGwR9lB-oG8deg8rVwbSAjEB28EX4CfwNJgZsY1CVPsAIwCrMEoo9Mgo4BoYDkMMEwR8A04r7ijS9Gs1ahIJpQSYIDszRdHD5REgK0U2kgF5Bp6rj5dnKp7Iurp7IA5SHQMMMKWpAupqoDW1QAOgMnkVY4IYJBeREEEM0IXy5F1p8JUXXl8oxdTm8Qe6bBAUtJ4uoqUIf4TNlxLqZXAYck7oEUqwBCI6hLRg98o9oJ9QJt0CcBOkAOmGH5RhQSL1zArY4AgECWdcbayxIaRAkFSr6oqKF1IbeVm5Y0CA7YC0ECtKiIo3jdTpxJGrMXEcEH0gZ2wxaD-yAUNVHK9JAmlw2zjkMC2FjCgCR1usxfpBRMGUvoIFJ3wiQBSpUdCDrUAX8W0wp6BUWg5CDYIEJq4nsWMBR0T4kA4Gc4K-wQHrro1Xeuqx0PGqv11BCBXoBVGs3IIUwXdgSUrkFIhuE+kFmKrd6uYrfUBxRNtMEXoM4gXDtmeTSMD9ZFs0YhAzNAvKCjYFkdALoSbYnZzA6xWisq9ZKQHRkuRquxUAEC7gBFUN1gGoqiRBGuCQgHv0T3abXg3yjWllfBLUa4vwm2ragKCQJqtTx7YhAQGAAPi9CqqYB7QJzAjawjbLdTllaQ9wb9QrRgTNBUgC6IOUSO2oCagmUCZOHlgHIUJokcUAdMBuFF1wJwQCBhk8r8HXbUEEhJZoiQQ2MUb0ydwAZ9TPAdAwGYAoRUbxA9xFuVZ6qS4rqYQi3CNhJgQedAcdhz1AOsB-WBvawA1n1xJtgzCGDgIrAFAQ99rIqEekPy2CZ6vGonIqbfhKcCS8I9QSUAH-B-WA1CtMMSH4VcwzxBjGAcZBaVWOK9pVzKSccBZkHH0IvpEFpQMBZpz8QhzyD3wMbI+JrmgDAiBYpTx6OKggzAwOAbUEUsOdQCmQdBhofD1SskwF2QDYVsnqrURDOgMVBPKoJ1bjRCcgNImCVWc+NJ4U2APXWdSG7gDVAaX4v3g-LTGgG4IFhMY8MhHBLjzUpBu5EVAKoQlJh+0KqeulFV3wDZG1fwPbiwWHtYGzgO-wOMACODiPGIfChiTNIXZBq3G5gGMYKrQ35ghUBWlUuioCwDHAZPg2YAwQCeRF1rHAgFUgf9w1vVqMG5EHfwKkQARYDLBwGoD9VuVBy+ayBvTaWOpCIDB63oxAxBNkD0sGcQG6wVJAxWqM1UuTDO4EPAePIhcDqtXBCCv5CWsAVIbeBQ6BvwGFuhK+OTVkQT++F37kcYFPQOtwQMBSOjl6F2vLdtcH1e8AKigm7C+oKPgTQ5-lgHkDXoBJwD+ADHA1aglwC8iAIwL2gY+wGwN7+C2dCOEB9STAgmIhChDKW3KwshqPjgxLBqNQZnIoEYwgLHY0ORrTWA6ukROWAQjgejxwBzjYrmQC6avmV51qPTV-gkx+DegVp4l6AeYA7ilL5d00Y51P6wtsBAUI8QEo+SyQJBBrJiPgtqlSGgYCoHuJQOZ-RAG4PpqxLAxpAJ9RJCthTuOsH4gn4AL4D92AoQOBgbfmpeBbVhE7GMwFYUEnVBdA8BUO6F+gLXIHLwlvrkKASIHtaO29RSwiphNYDJxHXMMeQDYwzYAqJUgUESAH-aAwgTE8xGAewinNnrodE1ZsJiEANOvBYE06x9gLTqK+WAkF9+BAIsIo2n8QWiIkHh2AzEKPIjqByuhT4kvQMM6y9A-yAvBChkFyoO1AFKgXHrgoA16F4JNYAFvA6eQ0cDlqF0lcbau2QSpIzbXk0DZ9Vba7Z1eYAhVSaGQnjpGZaqI0wge27usF-wBxMhBAiCREkBbhAN9fIgFdADSIKqCumD9aiiGBKgIWz-TQl41oMgnAYQQH4RqUAyKDKJtPXEX4XzgRjUmaChYKZ0fBQaZBzLXImoWOs3geLVkqAmYZUsnuRJMIBSV5MkZwrxWq0SPrQCywyGRIOCZKQdHIsgWL1BLqEvW2Wo64HHquioyghioDt2qq0F3a86gycqz3JIpFDcGRAPyVYz1ycBu8EbkIz6W7gWhQ1GAXKomoPpwHcAOHrw0jbIDdgNZwHaAOkKnbWjHAm9UeANU1JzFuFj4IC51XEoYaA46wWxDqoFswAuAQ01XiiwxmIwEhMMEkQy5ppRtSw+iCaFWQ4HJw1agboBNQA8pLHAKGQWnoGBBVbyRkBYa1BiIpBUTVYap-lCeQ5d1hRgJlaPEAlfBToZqI1q0fdCQyo9uPbgKBANRVbGS-xlOYNRoEEIqqBxQD8RhMoCDQH7AssADA27EAjMLdEZrgv5phXpcmu8UHecGyAGiAhwBX9FSYH70IUEOah15VcCCj4o8ofwESyUIHoMCHbet0kB0w-sqRbXamEoAACoKuAW8hMHwf8GagD5KyG6KgrLpX+mjSYDugUCIrOIERwBaszXGtIe8EZmwIoBRwGE8OmUROgKqBgDTg4DzkOnytkERBV+rDfWqW+VMMi6055hiyjngEgkJn3S7AdoJOsnCUWeIAggNbAIipmgB7QAkuAWUOAZVPotkCcwAR1ZFS+1AKD1PZVIcCwWd6CaN4XAYFTR+7BGgNHSBxAYSQQSY5iH8kEniAyA8qQ-YBkCAgJe5EL1A3mJNMCzatNMMAQa-1t9gQ-CsXCvsHJVAUipssRLAfIFMfGnANJA7DBzBD7CLugA8QJN45QBMURQ8EskLLqj+kfiB10DhYFs1XmALIg8uKY941zKgjC9AISVzIrpw2KGDyoD8QF+Y-QUXqzBOtqUKDAYX1pDwFECAQTYFR7iOYggZxX0bQICAIBs62WAR3gujg18Tumo8gCCVpFpV4lEwBglSBG7OgilBFyKPgDZwFciEygXzA1GD43Br+JQYUtIw0BaHi94mOqI3IXhgOeQxSBdShClFaq3-AcYBHlisKAVQD4QRCotIhe5B8wGwWM9qmoIUPAShBqAlrDCHE9JgS9z9VCR5JEIN7QyjwA7qzrCpeEeYNsQBmI7EgBNXKkF39QDoTVE8FwEnTK6ErNRNwIKQg+qh3hXEtH1SiEUV1syJfoAsA3GCNrkReyWrgOXVhwCSduk3cnVSp8+ghVwEcFZ7mOrEIPQveAVcG9lezASDgDpgAmiC4Ag1Sy481QCqBJtghqCPAG90d+gwUA+aBPICYsqEqPdQn8Yf-XlCBlkIkwHL+3NYV5zSJAwcKVQVAYscA5hhHjE-wN3QAR1SzTS9hAuBNgFTkdwA9TRxsBEiD0sNMgVUNXWR1Q0XsE1DW6K1iAjyxdEByRuQUOFwQ0NcOBjQ30StWMpBQPJJl7qhXVpMAgkHlwOhAO-UAoD8YEbwKTACS4yNr7IDm9FCmPZCvTgXCdWsVPOCDEOHgOVglMo-GQuIHD0IEiZiAVsA7qBQeJwDYpYX81JOBjkCG1PPQDt0DqQoXBG9CdeAUVSZgBKYpVBRHW2EHEdX3gXhguWBUuBTwHfAE+qeRliuAHsC-KGnkDhG4y5TGB4LizeqI5LWGmjw8EAgCAsZ1cxKWDbMQyKAZcCRyEOIMnwCsV9rQsuB9yFEeg2AA5Vv0b93QH3VaVURyK+A7V1EMipQAQjTxOEyYVuBeyVOUF6kKTwXCQfhYrrTZgGo4LYiBcgHtpsyAXEE68N8kCgQn0hJhDhgr1YGta93IXcBGNSFQAvgGHKeC44sosFDjyFDUBji-yNgd4TKBsMGQlXaEPC1rpgsuCwDGItTfUaSZS1JCWBoEhy-vb6biVBPhtwhqyppVYAhFI1iSAikT5KTI1aNAbrAa7IEzCYXFlYCky++kZEBZkSGaAB0NOYCvAM7FraKvWChYL5GrtQw6J9Y2GoGOFQjEE4YC8hXeCNSEuFcHACg1Q8qMoAxRq28OmwcwAnuroZApwAYCPiwv3Yuzh1w33QAp0F6YRnIerAF1B8yutoFvMJKAG2NuRBuNDLQBqUdWA1nRUCyswBhwN7g2zgTCxcnV8qG4dU9AWU4oMAlI1QpAcQEy0jAQOMBO9iCvg5jTcwefAfsABpBEyBGjepgNAAWD4dOhzEHDcDDMCooYaAfIAA4CaZRTAS+W8qRLBw-RBn3pQauio9KdqQCU2FK+Ej1ehQOLQX+CmSFD5kcgaLgarhgdjaICdkNKK5MQ9UA5RVSVGmgBq4WQ43ZzrICBeDymIUwO0gfp0wtIEaH6wIkYBWqD1RofBJjhyjcteYKwajRf6Wn4rb8LFII5gBJceMDMLASiOh1fSVrlr+3XW+FhoFRQEhAwngngiHCEVSP6qnoKgaqK0jHSBDVQJEKOxF6rFEpZJFr1exqiS4xDQIig06Am4FkBQVI31BzsDfUEYBcZgNroErg-ppptGjdb7ENwghxA61D+QDJiOC4I6A4og8vWVFHVEIURaZCoGrY4AywHr1kWapmy6lJxMDdBDLdUZARVgbUqGwhqsDp1aLABnV6TBVMBAst7yNDUW-IwOwyNB+WqhCpp8ZPgywaPqTmBqGBJVmIw0gvJofBPJ1J9cw4enQZwCW8BRUF5dBvG8qgSbqqREUoujgIGwEKAieB3y6gEQnYAogFxAaEBtkDgiCLoGFJG9VI6ZvMSJuHY1PqcVXkBYQYZg7WDDQP8sRXI155VQBPUAtKkIAc41fKxcEC1OHttftnMkNLtqEjVfbA-gi6PDAYOPs-LUIKt+WHDwHhVgeAy2jJUAI3Fe6sZYt8MmBDyiTPgJ7Ki+U4CAqbWhQC7mP9wJagGagGeCXgHVmk7kUM0CuArtRE0l+VKIRASsykBIYB5yFzccjS8fQdi91lDMWCjoPZEMzYsBAunXGCDvgD8gKeMDSIE9DKKUzwNlAZ4I9ABq5h9gFqiMEkUvg1uAIYBGuFrWGEgWzoLyAmKWXEEhdcmoTggdKCF+nHxjoIEkAA1ALQB9HF2ADcSAZYRpNZ9ZNaCBIhpiKLgZ8gzHsHcCEKt+WNZiYOAcOAQGi1gGH+Bs6bEQKJIP5g24B0ML2UevAeRBu-VUUDBgLLgbxAhutpRWRyG4pCbAQqJOdABrDCCCugKOs-tA-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-4LuK9sgsuhkmhAID-cB2msnN2TAMBB-Zl7Rng6CuIOKaoYCxlAPwPrQJzqGRDpsitIAgeADUznge7rV6A9wET+BNKkCKGAhzlXu7D9eChTe6Q-lhSlVuwEppNjQU-AhZMof4e4iAgBOsfUuUlr-8DlhrnTDiEPZgQKqXw2bxEe6Aq9adAHyA6cAn8D7oPs65AMcKqzSpO+C5wAEGqSADihXMhpBEMxGhgX5NStBrABsgiJKBMgHRAJXBrkj9Jp3EAOwWMo9uZyVgbZtSQNWIGV18fBeEjHMiHQPHocEQoBq75yCJpgmr2jQzABXs3xpTokKqJiQJtEjDTsNDzQLZNV9gcusP6xuTWO82TiFKiVSwWrAJ6CYRpj4FkWzq1LRDOPCHhph1GlgZLE9rQgoB-QG1IGNSwKgp+qzNgLDQXIBymo4xHMgXjA1khkaFQcsyAR0QJSCQcFG9RXARnQyES3lotpsnNYg9K6gZNQWcAjuDyzMt6tSAH6rY4DresOGQuwYGQx-pnFCbpjukn-AFBVRHr7ihWFpqCLn8RSAn3JqpA7oFO4AA4QOQd3BRC3nEHELUeASQtI5QZC0NYHp9FS6wquNhx+fXBOs68NdgYQVykBLAjluFrkFHkU0+pVARLBKIHXlaLAIMNHfLxZB4PFpKVB41Cg10gBDB-cH1iKZGostlZAUPV6kGnFVRrGOAsRadwDUBBhUEpQJhEFRQoRpk8GNoTRAc0akCbHcqeUFdKpwshmIsdhGomOZnJMLqwLWVsUglg5r0CBUEEgKZAEDDPPD0uttMHdQNF4cbBVCDOi1YSUayDrgWf4nfCceAvYMWwb9VF2bsahfbGKQDu0GIQbfgMJAfczwIADoMCYonRLUDHRrFTf+AdR1FirKMB-cFHAO0K7agKIZgmBLUHrVP2U-gy+uajmCSqBiEPpmgqAaHJrw1ooA47FawMiAniBmhVRauexW4IYnsX51uzQ9qHj0FcgEJASGad2URDiQFTBAbSAnpxnsx+wDRMDLI5b1yihAs2h0A3SDPbDIZ4aR+YrVwmiUOPKwfNAvrTAzCoHVwIaMWWAjABtiAZQCdkCJ6zCAqyQZpWqwDJgMLAbm84nt7UB8pDp1eCWnqU3zhXLJYYBO1XCWv-gVbCI6i2IFS4FOkeD+6Jbk6BXCDweDVTItg1YBCuCXLBMdWwUK0cGqaqK24vG1TSzgBpAlzgVICumDPbvoAbildOaD5CWJjCuGyW3O1ksA1mLt4j9NQYAUB1LObRzBcMFrAHLSThZxqBwQiThvUQHzmiSVeUhRAE72F5EZdmixJZkhMHXc4A3XiOYrj1L0ouZi6nGMuF9Ylyte7owuBfZqYsSEoX7NG6hbuXX5v7CGk6okNWhBfc6URmxKCMvHAgT2BMBSp+FywGsACfgasqPUCH2t1YE9wY6Vv2BF9jo2p6qICKUWAechv9WUeC5mOUIdsgdPIkjD-jH7TUZMRpgyg4R01h-w+wMGKvFYw+hl+DlUCIyFx3QvA7waqYLpMGyLQ2AagQ-BZRELfOHeEOum9-Anqbt00DSGiDX6mlvAymRVYQp0Cr0NVqSz4g5IF8DaEB80HjaC+wtPqslTu+sYSDuEE0NUqcwkRZYG3YDIkvKYpnQwE2t+wWUcj6rtNrYBFnCloA6ZGVoR8AjUSWVRrfCoDUJAF9gsNhJ2BPmAIKJvgMkQVIBIqArFHQZm7AShwDqbwKVEIBh4MR0QQG3LKJjWE8CqIaHkBAGcxqdShx8OVrMSbZeAKmQvI0XcG3SL-ACl+S0BNggk4D6OLdwX8ILkIJrDR4DywAjkMUABeb9dj72HpYIrgQawUJbRg1hsF8UBMGlNIa5Qh0BzUERYJja-ewE2BYsDfsHPZF14CIlemBHZA-wAXYAA4RuABn48wA6YBxaOV0IAwCcR+I7TErPLVJAfywMcBETWyhqsNY7m+woHiaRfCCvK4pK7IeAV-FbHrWCVuaAHVUOVYhSTRigGhuyYHFgAQNSDqTkgoOp0XolgL1AO3hDA0Z4upTqYGst1klohSDeEDfALC0b0QLVrQYBBOO0TT1AKtORHYzJUv5OvANZoV8ET2cIzCOGkkTHswB+1wutLUAGkAFuYkgKzgwcACmjlZW9oJuQRyMyZgRwCNYEYJNmgbdg9PqjmCfmChWrLpaEV-RQkKXvGDM8LdENX2ZNBaRCspACgFjG32NkoB5UhaIBrmajwRd15UhVs240GGjRtmsaNe1q3cgi5GlqPdq2qIreRIqhykUaeoZoEZgu5oLRgVJongLG8QqlZBAFQ5ClOmSKTAB2izMBXbh5gFzMFTUY886mrnBIdQG7QGfgYfN80rWkBTMH9gG4UXQwNEQhVTFGtM6PzG9EY-Gansg1rFQbQlMNRAmKgShB1xvdrbXgAvphjRhERkeFVELsAJgwzOhI+CUxhZOCa6m9A-5rOKASjGqkCla8UkP8QsyC4l2dZcroagCs9BDHVbaCL6Os4RNGLtIiySXgAa9UkocS1Unw-zhEMDHaKM4URwBZBBwC3bWN5VMGS7AylrlMjBoBvQLU4d6iZRB1IDuSBWQFuAaONRGQcCBqzCSMPFALf1OIRuKTnRD94HgoAm1aqoCBDjBD3tG0gCrW2ZDfmhKmtEQL3kWvAgjbMBhxrAqQE8EKxANEq9cA3skxUPL4eRAr1BckkUiGGCKcgECo7IohlVFSvphGDK7BYdiB5kAE6slgMu+VmkoQqE0nL8BBCMhgbLSe7gWwCE5D44HWSHYA80bg-Aj0zXAAMeBGUoLgTEz7sEVgGKAPFAYcBk40W0HOFenGt5E1wrRWXplFtpMnEVEu9IoeiA6WrDaWHAUGAHfLT5AZLChIJkQRewztbFhBu1v5lYAQhvQTDK+rCJUMLzaFoa7AThR-C07IBdWKTWiQggsBC9g1EEMMPYmgK1s2b-cLfiI9oOamxLA1QlWEgbRtaCMsiyxgNnQz6yzIHGOClgFCA2dAXo0IYFZbtOQN-1FWrP-XT3Sh9WVNRgk5gAV2Cijg6gB4KpbAWyAEJD4MFpEBa0AH16RBVCA7gHXANBMnGAU+qTwBt+B8gAZQbzoBuhr1hOiVVgB-wBs11EaqY3y5qAiBNgUzwc9Ar+jW0DHWgBAZetifBxNxPlmVwO5qkdQshb-a2BJin5aTK411R8AlABwrHWMMbwO42avBMfBZpBcIHnDT-0udQU8DTQFoQGtaiqAR0R2C1FsAlIFvm-TNbsAJaD4ttGQDYAS3NgYQ30zg4DhYiJYSmwuKrm4DIyv9EESUFS1lBTkIn34C9YL2kMC16zgvPY4wEbwDEIK-AzBAu8D-4FMkIxW7CgCDAiDVfbGyQOecXhxV5xeywJkELkMxAXnEMwBo9nqwGZpciYajga2A2jDXIADQYamhQVj8qxEQ-NEJYCyKhnY04aazDLIl8LVx8Scg1KQfnWlDjNvozQSOaBATzlAgD3iIBAwFNcM8Bl+CK8A-4KqA78gRlBY4BKcFOUOWwHe6a7qRVWZsGUIMKmkVwWRQGW1HsA-ja6SAtNegrvBDR4AQBvnm5Igtch3Zp3urqCPnwV1w+9AOmzQmtfdbp0AHc8TgnDBEqh42u2KP11vVRJiTfEEGSPWwcl18QKJrDJyqTkL3CFPVjkxsrCUYEobXGCh2t5GgU+VzFs55M9qhpEMcBli2pKFzwAFSIn6regRxKBmso8AZmvVVHSgzNhaEAPGKzgNgVxigGhVCavckPPkPfW4MAFoQcyCogI4IHyO6UBz00J5ozsVUSPMInOFN21yyWXldzW93geFqai44lp+adbalSAncAKDSxSLHSCRAGVIg5IwsVR6A9mDi0S1A6GAfYiyMEnIBhyf5Vfkr2nRzCuWmAHYobYV9aYHCHoAhUKwwRFIZ2r9BWdoBngJQ2vogVRqgEDY2FHVbVQKd1BfTE4BptH44DN4bNq8GBk6C+lTd1J+ADLVlVAstWQJuxcO2QAzK1UhN1Vu8FZBlJUY2Q1cJEHUcVDLrV7wVB1S4x7GBRUE+MOzAIMMj+broB8ipfzR1q9-NZpBZGAm4DecG6oI0Gc60RsDlVzMOEUKr1lq-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-yd0AwhDLdH7VU0moAFNuR-dCqEG3smzgDBIxCB1c0ngAkwFBkL7AaGr0bXA5qUANDgFLo1YEI+iA4vpEFJAdDA7ZxVaAK1gFAH8O+3+I6aExCb-IDLeMEd324e5mfATlPMMCpKivA5dhNyEC1txkPmOogwxBAcASPhqEYBVWqSVOUAXYUobi-AG1wWPNaqAkoAB2kTzZh2-sAYNjGNBaIs8HY2q47Nahha-WBuLhdarCaZIXlyRmDKuHKEJZQYqA0jqq808qquCN1ERCVrkhESBkIObJASwPjgzsJtZR7onUyGUAx1gA7ASC1uWtPlTGG2xIADTHkgLQAfDZIVegtpoaK0gspuO6EjEQNAZ6wbDiBJj4rT32gzAUTSX2i8Fp3UMAkUdwh4ApxT4RX3jf0OnuV6NA+5WTFLPjYiS45kNnByrVromHAFVa9J1tVqm9AMZr54OA4QsIoWg2cD9NvaAFwQdEVwzbWWD7EABza6cmFCX6bKW3cUndYMn1DzstzRSYD2GEy0DW0N1NLLbuKDgUET4JMoTltXtwNYg8trTsD2oYuNLaaDK3SMBmoDoOjFNOdSaYDsaHDsBLANYAsGI9NQmssI0HKG+MYR-A9ABT5CDoA4qqgVlsgY0CT6HfEJz-Yigp5rsi0EpGGZMkQbrsOA7yuhXajrMe461Tw1pAh0jB8DgdNB4dpAmDrKbAwBjvUFZmAXt12AHurNbCDTEfMH7oC0BzQjPvFlOFzEHRNFRROEb6JuGraoQCLgycrJy25wAaGSTwVKgkybrQyMOCDGMDgSUdXFh0RXk4BcGL-gXCgHyBWa2O8zmgKqAP4JGbLTMg+iF7gPdAMo1O4BgpDJ0HPcAoYemQddoLq2RJoSIjEmptt63B5S2eoBrUU8QVJNRHqMk2uCo2YLAYLyg-XRsohArBwkD72yCRzmymqnbhDiEHpq8WwcBhMSAtMGXRNuEIGQjZAIGAv8GKOEKwHlVjMBsXVrFElgHvGP7MHhM4x3NcEKoBuoSUgKDADlD0QFHZNDIAXtn9I1Y2RYH3wm5gCR2NCADQh-kCEkFjwCDqNubg4BUSiS9lFQYfQb8AuYC3MBgUDbgHCAu5aR0ih4DMIJ2G0MgQRb5kjeYEIiH8QamtESg-YBmtpYgNLIU34ZOJaMCgfl+KPim+CAgGAiU3pJtJTSCsXsAvOh6XCNTtPgGxEJSuaSARHGfmHFiMSnJTtaFoybD9oBqEFymrSA9sRFGD8poulV6KIVNOXBcTFeEBIlgaGvUQRvrHE1CyDCYc90bYdC+RXxzVUBT0pfAbXINAqGYgI5HOkVVkIrw3aawCRAIGUgITQKSo28gIDUtDG7ZJceM6gBLB-PWyEDWIDLpFn4SI6Pm2W4EBHaV8HLg2iBgLJ2oE1IBhyYT+1YaOYRMiuPQHoGNkVrUqw+iNkFMEFA225gBYR483wNrNMIg2tb8HXoZQRRlsxUIKalWuRLgsa0nGBxrVXKxf8XarfuR-Hym5RtK1zciL4UsA9NvcgDsiIAVIs7Tp2QIFrTdYYuioWATqQB8FBSDQEgPqI6oRap2hBDhgI1O2CwfiATjCXVqHTTBNWhAt1bx01zhFJgH6kGeAQjR7YgEcjr1cxgVMgElqIgi+IFOuKzANdN3jdN03zLm1QInAX1NbfKIa3arB52ez60Yg1Yg96CzDsW7cJAZbtE3AZGDmjJQgOx221gPAqcrVppqo1KG2qXAVORgc2TlpooOgYcaAxjRJpypTvcCOK2g3QFmbG3UiVBoFaF0F8NrnFvVAFGE-DXB2KMmHsAaRBdUAFtZgGdqAPRr48gq0BtwGZmw1twH0mDCNGCfsH1IR5Abe0TZBikC9ZRhIQegoqBvBQPsBNlX1QM2V4GAwvAzZoswD4QAPgvAxozB49oOsDsANjoJBBq2DZlEjoJu+dn155gm7DYkgqoEuCvtVJcNQx3NRoRnRowDaApxBmsAl0HaVfVoZBdbealsAVnkjuJ6gVCgvZQ+sC6ZukiPpm0+VRmaV-UX2GTiGb4VqgYGaAY2ckHajbQgIFwZ3A-ejYOEuzMfGBdAR0RWPCKxktwCXar5tBiAhjXAIFpGmd4KKttnQ-YBhNAn7e-6yrV2sBIW0hbADkOa1XsgMNqUoCodpjAAPwQJMZfUcCBvZt20LXIKiAyzqqqDWGGbVSxSGqEAOBpyDGnWVQL6+YPelPbsnQ09ov4CagU9hwPgLEmP0Ey0LHAGVIzLadTVRyt9bHMQbAtC7A+cCUrmqMgGgDpATO4kJW7MHRdT0AUzYbMw4SACsD+kIaKySwoMAMyAxavFpRJgTwwoc9AwickCloIamJXo2vay+UVLoB+DQocOgeNjHYCZnUNFflPS4hLKBxMDQPAmrDmKiIoT3qKkDZ0poNa6kAQZtHgGDX2tCYNf6QWAweUBGUj0RG9EN72uqMkqzLaAAFrHoNWAIrotc0NPAHxOgTnFUXcambAO00RaJy4NGYHSI0zSn52oIDkvknsTFQGggJQB6MEsgn2ABPQsPBelIjqHClTIUPGE-NaDQiyP1lWJ-4dyAhyB4y0SCF39QHvENQfgkq5XD6DSIPTdO3gLMIVJWp8DEQE+wTiOvUgo0BfEH-ENKIZpAFSgrtT43As7RkjTuAFRgnxDRCvRcJXUkIdG+9pc1mQPqLbS2ysASyRsNAols5KB42s-43jblUC+NuBpJbARjUn9IL5DLERNgL8sbcAe1Bscjo9rSmEe0EOQXIgVSCPhr8pC+G6cwuDJP53Azt+IFvwIlAJW0bOiatsVMKLQIStRZAiDDikGqkOYwf2Auo6PkAQ9qH4GVAa7txMdP-A0wFGpSvqYhAu1AdsAu9sSzZrWODVZ3hSgCnQFx7fI4Gw4tM6hAALsGLlQ6wQegyukjvDF5vXHWXmrcdleb7wS7jtOQHCkGYYVZB2V0eVtUIC+Gko6j4dtqBkEGXoLQoB7wNnQrsAt8umEO0QNqgl+rRg6eWsp8BVwA8IhQheBjT5tHoLPmrvVNSBGkCNIEeEMvmohAjpADZmVZicnRT7aPlJUroLA0KAA4PwWt2s5fh1DosqvpkCcQN-1L8AQjXcqpywmTiUEFmDBa622eqfFTpcRhVysYikgjeCXfNA8OVVC+R+q1Kqr5QFT0SY1GY4+R0ndsFHSEoFcNgvj16jESGviKmq2ZE746ezUnwpegAA7Emw3tkWixmbBZgJo2fRYW1qXRVbZv8IJrWKiAeYTq1hSLH4dS8YAhAHUb5W0HcCgjPaCbfgZickFV-0AetaYIAHVjyAOA3AIDsKaO4EvSJVaW8BlVq7HTKFbEGG0hfUBujLsQNX8M6gt2b-MAHisVrSrMb6gN48Aji10CHMKRk40gACBidUIMBjNfwIbJA1nAPoACGs1IKoQalI8U76hSJTpf4MaYEGgWpAVaDUfDyuMzgcWAIUQ5BVGpp8ldEwQso-EIQQgCaBzbWZsOIg1SKUJDlABl1X92pf1KIZRkDU6EWugSQayAlOwm8BOFpUjdqQTXVOyAbgQcfn2IFLQVlCYbB0V3ZooMiII1MngRHhxHbrhqeyE5UTHw6EBu+A6Dr0FSUWoAVWcbVljbtB0wPdAIlwOFFoC0TkF2VRSmlVIZMx-dD1VHkcBJ-dotCLAbkS+louncZ3SDAtY4K1XjgGW6CZ+Po04q7c4CSrvjxBT4CBt0REuzUQ7AQnZjyjxERmw1iAclrWnEQW2sdOrgC12AxhenQLWuTgv+AqbDyRsLrbSoSzt70AApmj0DTaKLyU+AhjJ1Oh1BF2QG521rVZDgXrWngEF8VM6ZdNYUwnkAL6vaAcvq8H1QBB-PFXNFsOAiGQHR4JbpwCvwH44EZMb2yLtC-pCO+LkYPMCevg-KBT0BWFAFKAvAQGQzmrdWCuQPvXf54kKJVcAymBsbmObZOQX+VljBHsDU2p23d0OkVwE2BQg2n8Ab7d76lNASp8wrW2CTNWodErTtNUB4qbtODXkPp23LVwoQvUAKOB6AObYxnILFRIiDoppawJWQFGg-HIL+A5XGLvJp047g0w6PFgLdoRtKDUNcgJJQgIiYFyVGDfgfogtsqmIAg4EI7cOWjv+c91XkDj+QEHZgfbSwPbB8ojV5v9kJwK4OQ9LAyv7B5E+3efAQl1IZbkBibVumQnTpYu0XAhI5BEED1rj6KN9Q2Sb3cirnCzaJiQTdg7FqmfW0zoMQB7EciSfgrCOiO5GiIKWLL11yeQSRWYIHRENFQfCdmNgmR12OF9gAyG55ATqAjS3JzXFiJ+geLxq6hKF2+ODPHFjoApAxhDlWAD8oUTX5YJUg1QErh1GrtrkK7oPstOoRKd1DlspwhzwF5ALQskgCRtqylPuoUYtvsB8EDBSCWpF5wMLdXahN2Aoiuyna7wdPIoMAYEaLIGK3W14ALgYLBwcli7rcQBgsBi10u7fiC7ZipcLNwQBguGq-4BkQBcwFIAexcJ6rgKg1gGjUhCwa41GVRbEARpprNZ22pVCBuhR3KiTEfEA-AdTV-IbobahpDvUOUk0zoq0aRXCGwBn4PkGHmANHaR9zKBV-NQjaGhQU2qFHBwICigG3wZkQPqRfXA9QDeHAhgSHgWZRV-CyeXVLc4Ef6oQxaUuiFMC9cDegPIgYg654ANKsQ3cagaAAsFg5aSeqAzIN9u3rS14ganWyUB5IHzALGImvb3M1heoqXekG6SAzjYBWBhgtsAPDoQksh8aTjxGbEi+i2gKjgIKj780pyFc7c-mwbd--FSfDfqDQyGzMI-uE0ql9XL8Cq9bNu-2R9MQtzUkVy73UVGe9WdkrpVB6WoWbTaIcERF7hUOS0iAsVWPuPOG8hgRYDhIEh4KEmn-5FiBvHDc+HHAHVgP7MspxErWNIF6LdAG-8QocFZuD19uTSN765vtYxRkkHlgHsVflAPSdlBtDJ1uGsi5WncAIEugBH7R5IlH7SVq6cwNi6KtXT9sBiLCgBWVM-BH6Aw0reRC+IQQV+nA-9UIwjjwMMgSq400BPs23cD6rQg6-dQg1aK3XTnySaCfupPUzgQMcAX8C5wHM1TLdX4Bl+gTwG3HO+IL2N46rLHDuKHHuo6UNGAtexf5Br2p-aDLqvGEMe8-ODS7plgBQgbvIUMB3djUtAkhq8uj8dDErGC0d9Ee0XRgeSAYQhJ5SUsBZhClQROgH6qAqT4SGAsPfOqSA5nwbsAiKjRGMOGguAPjhT+DjhpGHbkgY8ACOBTsAw1u0sM2Wl3gksbNp37Fp2nWdcV7dV0BZV17rHDpJ0mmwAXEF+FUwbiGgBF22Oti0CDY3YrshzSCaOYgEKhiJBvDiXLW0qgwgFaA3lphXBGwWFAeyAvMBeSA6YB6Nbam+l1-zTjF11TqugI0kejox4lbA6zKt94BwGboI28Ab6hQQ0IcEWGdqAU5gcNoRcAcHQoXRvA9Q7IixQeDxgCZQIfd++EM0wngGCmURgFEgs2BpPhdZE6XUcOuCtpw6lwDyKEftUUq9ygmA7yN1ZCrX-GEkfKNu+tyFAwsDTXZGpcxgQcA+ma6sFVQAHwN6Asaq75RRUDTgBnqqmAqxB1NCTENHVVrAS45H0qPHQ8nApgOSIbsUYzcJyqqkDEcG8G1YRVMEvg02iFuePuYYTgunqtc0+xuTdArSLgA+3AYWBa+DpzVVyKddu3A61qzrrMDcIqn1ITdbBxgJ4mmdEmgSbdeB61KAzbtK+GgQCYgqFkhJg6wG5gJ22i2trlkBVyPHRfaHQYexA4oxQShUUAHsDQwGtQiO4Tt31SvwjZcoEJAQ1ArkQV-01yDSwf7AUqAG9Wx+EfUI2O254kuBrICO4H-EGhQD5CiQAld3OstIEFfQNXd9ChgDWKNsRHbOgZEdls7UR3Wzvg0E2ADfATU7a4WjHEhMIY2vndECAPNxcQGpXQTo17sC-bJNXL9plNYdAD98vQSeyCSLFlPXaKY4Vf6B5jgbdHCYLsgLjw+3aOvTSzvWNV3QL7oeMh8zradkkNTaIUQWfZ6fk0OpAFls2SQImGmq8qB1prRwCjYaJUKQhtFW7UF0VT9IfRVOdT6qjbdHr4B7asNA2-QZ83KSC71RbQROAvKKBIjsZH50MkWq8ptBBDzX4VAyLaZOyjgHPAF5BQNO0gCdAA+6PehmY1fKFWKCnQRHV9Mg1sD74Af8DFKGxtPdh9d3P3w0rS2AbzQcfrwCC2cBAtYzkdddWZA1GDZCD7gOG5DCQj5AmoB3TqF7Y9O-qAd6gC4m0UDGQM8HcbgJkggOBydoZJX-gJkVRqB2xR4X1LwIBAdJgCUxZKxngAPjNp2sPAy3BD60zmsr7UDZLHQvPA0RiJ-GJwBAiJvAZ+bLV3W5TcaFRsWnQqtqnOpuCAZdaFgZYwnIoHGCOhAN4EtSOxoslqw2A1IAuLU1ILBItlroUTediUzI166sU3eAPqCh4DoDZtulKg226mHCYoF6ELdKjC9UlQvgAGEGkZOyqf0tQCMfSC1RAKIOm5EKtK85NU3UVrg9S2AGn1UHhYvmp2tQLVV21BiuWbvnAsblz5UQQfG4T9hsngl4UsdUD4cuoR1b0Dg6lHO-t+uhlMawA-1RbzHbYM8CE7N-4xN4iX5talaryB7wnqhr428PzGJPfGur6T8bRbCUcALudOoHoAUUgKDS9gKeQC2KtjCfaRrHnQWvuwP7AeTVSc76GApzvoQcZIBEVbGQ5iDIioGsFIIfaV+ArBckwUGsVFB9cvV92BkGjMBqm3fCqgwVdKk8ayRVvnIJVcelgHGRqEBRSD-tG-u3R1i-p6IBGhDDBeBurBQZbRXySo0ketfcUROgCw7SfA24EYwBDCe0g+Nx3hDl9CRSMZgdIobggd033sAQQF8gduI+HA1CSJMHhxAKyArgZLbFcQWBu4FNoUiQUVIqMiDaxEFneDWOUis-LaMA9YtOXTTKtywO6AavAjSpTBpwwaUJc3ArkAG7HvUDfwB8AF0A+pDZFD5oDbu1DkQ5hAWAGEB3gDvY4qAO0Bc83EsBfMHVABLNTZBj62VgC9RPAoehAxt9hlFkXHOGM1EJL+gzqjdA16x3AnWwNW1lV5NbUg9Fl1PmW5bJT2Asj1dqBnMkGerUAIBBuuzVgSLYBOwHywOGKbKIE9H1oOkwLydK7lP8BHMGJne6ekq1o4rKKDjivpfi6sALg4CgYt3KIDi3aiIZAgMZy6BXKdj0sOxSfb8d6gj+DaQG7MD4QGXAj9ozWzflh7HXsKOXM3bIvLBfUE0XXmAHeAPhamOQN2Fb8FBup61BgAU0B75tzAEZ2iGEq1M-mAnLoMYAhOpPwUWAmPUoFEjsCGBUONx3BBz15TFC4OgequJ1rR+lDvxp9DTOACgQuogmj4PcWUjedgK7AehgJTCMakD5EHPFGgLyqqMD5KA2HZ8qyDRibAoGnZWAgePYGlvAkRAWxV7UHXgFgUT-0txhotQNeDnkDnLCXERfbwKAZyHsMNiuivtDjBuKXcLFJgCqEcUyfHB0agKQRYqPcEhQQYuCvTBUErEvjN2Jq4UcQUEAU6BbBDiCjMgmA5aWwFlHpuHW7b0QrOJu0DLdBtdAz8CLARUBzODK5BS6J5Ad+ahZRYKBx0HPAgbsOeJ50BPC0LQE-0O0QKc4yp8HxyqfAL4DMoGF8dpBtwBz4DTIHgG0ng6lJViC4aQqAKOgaGArnQjV3qJpBQRpAbbYBvUbE792HKkZ36VCIn011FAk8HJUPxwMdANLB2eirEGmcuGgchcod5CEBLWRWkInTOtQq94E7agtptkn9wU5Zqqq8UIkACPKH5gKMQIqALqD1CVVlbDwT1Qo5bOkCU1FZoGMMboAWFb+A1jDGQrJiQckQ97BYGCJkFpwClw-BAOyom0xEEAV9NVSKtguARN9WEsGHGJUecyAm0VpjARGCg9cgoZtQHFQ+5qQkHhwAfGYAYCcYLyVYEET+BeUCzVTg79V28YBITZkqJzAd0JAoqaikRIBqfTKQDcRuAA98HHEAYQeggsoRllTR4GaDcAcOgVU0AF8g7lyAXGRoKDwQm6U0oRIC-sHdwF5Abh7psiJoHiLSKgC+ASdB0OC1yBczW+wYmgg4BoTWVlrjwMVAZoNiWBGpAscOohDNvQ7WbzR+4Bf2ADcPVAW0wPUAfqDy1GZ0LX9NpgA2A7AB6rvvpBFAYkUkT6pMZdSRioT1hERAkkghACdTqCJs9OWPAoQ790VD9HO4LjII29XSJ7ECYxGnDjtMD7ATlQvRSjQFXQM2oTzsp2AgqxN2DzYL5tbgg4a96JDAaDuYKeIX90DegOWB0BBtENZAPiUSlA6rSfpGmNudSfOIfNAG1B8KrywBrEWnQ6YQFO4qzAcgiugCqg+vA1WChYEnAFvwBadF8bl13mMD4tpaQeIEFniE0CdgDf4DPAFo1vEiHjh-QDzWQncccx+D63VBanEsPXEYL-wpcg-zALtCJpDHbalgAcBNFhaMBEcBUAQVAfSBHtjy8GNQLQu8BAMO0jbLmmBLIB0gWAwvdR0lX9NIH1kDLKygrTBfvCaqUKoGDgZ1Q8j7HyAQsFhrKlAGbwUlRAIC7UC6lsIIYREcfbfMDBACj4CmAbXIKtEy2h7rljNQbW5yAL5hpEATKEYEGVe5mAJEB+ADzYG4FEzoEcAaLxx1jBxJuQOkoZqExsAJmTHQC4EAjQNRgfEgm0Q7WBw0MVOCjgcUtu4qdDk06NI8EkBpci7QSpTog8Btxc6w+sB6JjeYkmsDjQKd1BagcqDe1A21FJdIcw6tRKKmw8DclIIQDQ0U2Jm1C1SGphvBAXWA8Ox-ARpMGePebBS4g9MxSX0FzhSqM0cE9g3TIG1BIECiIJ5ALzBmb01kARmA8wGb9NBA4356VAenpuYMjSA3QblhwdDyUFJgIfENfyz1kP+AhYF3Yq7gPdwr8AUaDjuF8CM6CT19URANBDRDuAQEOUKmwwoQ3yBSqHdVf0zGKAuZxBmClUEjJPvoclA77zRAlibzHQCwgJP0D4AMgCPIFq3ZLAUot2NRzCFrrgXgBoQHGgC-z833uxSYMRBIZpAdbhcqD3gmZ8H1AIU4gzAqMD3sFBqBEHP2QAQJasCP2iVkoiBF4RC4RXb6YsyRZC60f38iaA6jBwiCBioIO0GQCOpATAdIAkTLQe5QU-4hmCARsDFyK92OQotLAqiJlgBOuCgk4TgkIh5KDlYCsoGW4DXQeVBiyimcCTojsSI1wiHwUCR9pBooArgC7g+Pb4tCLHuwgMt0S1g5UAAoAxCGiIJBYyKgZxBOH29lEnfXtsCbgUXQBbllPDWIFfjAjgKDAXbjIKGnVrHO4qASahYUCLilttcqPXYoCLgANivQHa4vZemogA+goPAdvFM4Iwg4DcK5rry5R8WeQBImNuAgfRIu0eNsiEEE0SOAS2B7pCQoRWkKG8FNFJbLMCCNtEvIMNNXCo40AiUB5E1JYc74VcMmqR9314wnuUEe+6XdlcB36kKGDNIOyKRXgFfAIXS1JxeaJpIH6QqdJpIj1cHCYCtsgFiVuAzA3GkAGgHHiR+YzoQ0hAZ8HkcDyWvwQhLBe3DaUQB0FwIdHw92Ab+CBaH4YBzIFFAsYQj5V0BDMZoZIbkIxchuiDRVqAiKpASM6sEMG+2uoBx8SOoFZgedpv2DFWUbmI9gVCIt9AM5C0wAJwM90H8QKDaNH3h6Fl7uvoN3gMBLW5D58BLgPYUW-InCwpVChAxpSB0wGWQngjekAPwBfKg1+mYEi36qpBlyDZBOCIYLAcFhSaCAYDiUI1wA4snEQ6wC+uX9wrhAN2QaIw8SiqJGNgINABfIR4AopAzIBnCh5+qLAXn6k5GQMGbzT2+ucEfb7hOBYQFUgHV9CxA7yASxUiuAPhElARUw9korE0AEEuIBbkuJAykbJ9DuQA2-cAQDFEDtoDbQfzEz5h+jBeQt3AkFi-Ai3BrOag9glJhnRh4yA-4GJoPpAmOkLRTOQDAYOzPR-FxtNQVAauDJcTi2fUIebB0IB+wDIcLa2Ar9vpB-TFbICxCBlUN5w-sAqIgi-tvkE9+pP6MBURli20nrZHbHI-g5gAq7DswGsiKeIL6AU3KFv1zwALQCUEvzVglFUvR4e0fkKw-aE4j7AlZhp-FXAE7dNXuy8x-9m7yF5IAPGtegBjBMtCEdGa4M+QQ99sDAVTBhWGHVJbAZiwTegkhIqSFAiPlwA3Yu1BR924liCaESQTF1qlwvfh14hbAMlwFP9V771AZyoOgnKiIF-gXch+0AQP1uWMdwbvAkwhCUjUgBnyGQ4cBoK6Yq4nEIEBdV5gK62Nz6yNo0lGZvusAJTAHiolr0pOKZHlLwsEJmT7UcDAHDWOMZ+qNdVhJxjB+zHtmPJQMUAm3gAq4JqGGWAMwIaQPsQj4DgaHDpPa0YTAtALc2C3WodYNBMbrATOhExAI4EXFEQwVEdmaxiX2rYE7gITkJ3IndBQnTrRSzELuQPEUBrAXJBpokJyKtAYTAlF6kRiEsG7yFRQPTAfNAf8W4VG8EMfgWH0D3hBISI2lsUMv4X6A7OBdgAwoH-AAj3Ztehbi9CAh2F6VHKDfPEC18l2Cvkj44HtALY4k2UZ-BVrsdQFvWKkArDAkXB7xUggNZEMnQcQggWXBbrG7IUkxTou6RP4Cr6j94J4EJ6IZljuRDoqvI0Jl-AaQq4AL4RDOi2CIe+6zQ8Ja-qhWYEquIAsKpEq6B9iCe8BaMOvYVEV0b7u0BBIGsyJaQaJAY9wAdCE4Ex0Bgka7AmRaFFiUcBNwC40c50aqBgTKwbiJcMq4F8ISQLrlA14v24Ax8NSQhggKgAtYGafU6JUmA+cBXUDw3oGqOjEPQE4qbtSD1OuAJbd4VzWmqlL+CdwGyYEoAcda9bAZ3ISJnxgMJ9Wq18nJBo1ofrPPa9uyuA1VBi9qNWGvra3IYF1VCqZwDmrGUEKEqN3RV0KaIxcCCKkLUkDIABOa0UCJIHcYNI4gY8pSBnQhPBF9IDPAVdQEvAuV5WcG2BgfYSBkaqBBABeAMmEPDCQ59NXgTn0BjDCmHWwEkQbMwxHCY6GOOAdAZOwjPQ9EAumNQ4I7mqJAVXcNGDsaER-Wu6dgQl8RS8j67stkI9sQ09nFAahiPeOJEAv1MlxJQgLiKnQHVYGmQNQQD8BkUBDET3lcagMsuPR4Lw48kFafYbEdp9XmBWCD-iEjgBiwJBA7SAzsiJj2QgA7uTBputd29Ca2H+oCRAQQAr8A-GikyraYPS+wNEt0Ab4gyBOAQL9oE6MUtBmDB+8FBeP3YVtA1ARyFAR6w+gCNANNoPlgTAOvdkuwESGgtkkr6XGB9gArUPBgYhAoL76AiStFJpor9W7graArP0mRCWoHxUu2OYaol2CtkCJQFwALH9FlhRy1QwHe5HbsXuAvTxnej0LF7cDUkeSA1jA8sB+YCKDDLJC+mJjgbKA-sGysPveHeA3AG07DsTvuKXkYG4Saf7RYi4nHlgCiEPRgKSAOWANoFVlYxwkNgVYhkmADurv-Si0ga49+ge0DJMCP3odwNSQCWgUbmwGgONcTqXSgCtJrGDYyth4MKqiJgrksB1DSBmyA+zoR7AK0gHSCxquOOBjkauEYww-mDo0DQhP-IevJo0xELD-foFZHR6jio3sokuB8wG7MMKEIhgvPAWPDywF1+Xa6rtQ1QgK+A7eBsgGSIfSQjgDMcjOkGcgDhKs3k6SAfNBWCDZMMyCYr9-yBa5A3jQ0QoRZTf8i3BMdrw0je-RsEdeQx0ExijKsBzQLp2yIQNBAF8h3SHluKheqRgvWB3hCIr0PiN0kb9g7c50zBJkXKABcwLvg+yhZAAiEArSGFwDWIDw6ZTZoapJmvYej6sEfVxICmfusyB8EJ2QbfgCWD0AbO2PRAAIoMLBzoCPIHVQOYgJsQfHAC0hSjAkFeFAOMDFBx+0BQED1EIEgNciCagGYgMhpaALXoK4M9Wh+4r+WC6MMH6tjoNOQUQhZYGZeKx4GlgUdB7mCJsAjqCjkHBIQVAmlCjYD3Qk0gFUASpJgFpmIEEOkAQbxQ4rJwWrp0DChN5DB+NwFQ7QRCXqbAChAIiDhX6gVBY-tbNtZ0EoQRHIinhZkFA5uoujri+1AxiihIFTiM3AS44k0AwoTCFkgYEZAAY8ChAjC1FcD9ePYgDFhpOR03advoAFFDkahAMRFO2nouOPOH8wHbw2UBkXB7UixQNgIJ6IqLQ6ySosBeEPiQfQ4jhA2qA2AFqYKlIMN93MJQEwoFjKgFYCQCQJEA6yTF-u8gKX+hjAJ5akRiaaEAiLMgGngDckuPi3cFhsCqYaAAkKAS6DWkDYKNtgIJ5e3q3nAEWSNWeHQG7AS2KJpCi4CdSN4QEwV8ChtjDFvhLtOQ2KxETshV7h2CnKFHMgBM4B3Ah+BD3DbsEEIdBmLBQMHADXCIaJcO5bJmmg8wl9mVd0GG45QQsoaWEAPyHKGNKuZAiff7k6BhyhAnGzqT+Ag0bKOAVEzN8CPERZw3Yh-vjM3rFpMWUlYhk5gT3BghG6mKfId8AE5rwKD85kAHd2c6ggQ3xKrhEIHnUJyQGJg+Pb64IPfsIpJL6mCAAoT6NZzoARtEC0fosKsB1gB06sw2IGRL6NiOZSAO+1t9kFdqJMDlhAUwN74D9ZCEoZKE6NBm5JxLHToC0AI2EkdBalASFMgYDFaOJ5RSrX0BR3pcYNlYGzQKVQWmCTuvvMLggAek9JhDXI6-rJiM60C8oGuh6JAf6HvpGmUCZEyXAHDRvgF3aAv4SzYLf9oXVbygR1AU0fO0x1R2UiBQaTHO0oPYAugbloDoGEtsJxQEWAYQheWCleSbsCMIebwakh81JRUFDAXMYfxA6bK0KCvUCs2nW+9ddtwhrwOwpGkceWodQx+1BFgg0bVTA-ZoGjwndB-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-yLsxi3pqsgLJFUVoJCGp7Bhs0qyLH+-29LbBg0CrFF4oP2geGEUEHFPwEaEbQA3JTToMyGgB1UiJqXU9If8wvsgTKC3Qp1kO8I2hAjAhzcgDHiE3QbgI1wRwR5dF-EAow-LAVqg7ehZAAlkBFoOlg0+QsfbKOA1EARWP84rUV4wiUGBtyAuiDt4cNyXrhQGxTvqUgKL6v5AjZYzWwMDjHYPygIUgJBgfc1oLPMlHvBwD4PahlkPNRjHSGHgA+JMQgZcUhht3YOEEK7NnkRjP3vgF3aN2GDQ0GCRNMB1zFUg1YSFpY2xrw6mtgE-SC74NEQ7jTrXA94DW+AwONCSxAGQ5AlogLgwHIc9AOblDiiLiDzsK+vJFw9Ga54PFoGk7S1QbpQC5ziqAo3IgQGlE--oWyBAyIprjcw+igvqWN+gqNSHwaW+p4xNeuu1Jy0xe3BPdWgskdM1YATDRtQCT8JKgJRAk1hiUr+8AWsPwSosNlWHoCACbuZ-XVhjMAfWHG2gdMCB8ENh52EbhAQ2BS2HGw+hQasA71AtBARviwZDmoZmgvhw-VBGvrcw0XoEB44UAo8hW0C94NugJQMkLL7ighaDTvXOIEFUDYAzoC-VvIQPsoN-ghqAkOBTVnBNmJADSyOYFiIVVeImUJnhfQgXAhGEDOihdaKcQIpYmIgvYTVYFlYEyw9zYdtjHLBOytUNQe7OAUHLh6SzzxnSKKVm-PECZBtkCA8yGhudAJcAQcBOuDyJKpYH9XAOAILTvqAPVGn1JDXNVg31AdUwqzG2QMsBVEdZOhQ+jBOJcikn+lSARztpXIn+FgYJhcYpM5ZjA+QtQGEwBCOVvSNf6w-DTOlK8NpB5mDLTAyRDiiG-wGchtzoLOg3WlTZF+Dejgb2yhUQyS1OGBIhCcYJMAVH7wBliNh+wBE+vmUbVBLlD4VASvC3gHpACUx6X1rfEhEKRQPD4WJZVYQU2v04JsEe3NdpAohA1qGRbYfAEao8-NKIRfej7AwiGGBAn6RxD6nQAONeAMCqeQ0N9qBw8BbYG4UVsdvwhUuDdAACYG7wAuU9sQY+BO4HsiJG4tSgKJieFgGfqCLDlIbSAAPMK8RDXAuSJoqf79mAEHIDv8AIQ0ME0ZgqEKraBP4tFVJ1wfb97ABQYipEH8nb8IKKARq6JuCIoG5EHJqVy5dsZMZBseHojd7KPrQFiwmI0l4aPYCh6dPwM8GkFjO5EYJJ+wOk4caAGwA-wAQqKR4Va53IgOgN6sy62PwQSYDapBNOjx6qvlR8cKGQhYA90OwMCBiNcnScASkGbH1mMDZjGMgXqEUsAy4p8ixCwNbERqAcgdypB+sgnhhYAMIAYQBQwC6AH0ANQAVKg0ABwECegAAALpAAA - height: 200px - code: | - from shiny import App, render, ui - from shiny.types import ImgData - from pathlib import Path - here = Path(__file__).parent - - app_ui = ui.page_fluid( - ui.input_checkbox("show", "Show image?", value = True), - ui.output_image("image") #<< - ) - - def server(input, output, session): - @render.image #<< - def image(): - img = {"src": here/"shiny.png", "width": "100px"} #<< - return img if input.show() else None - - app = App(app_ui, server) - relevantfunctions: - - title: ui.output_image - href: https://shiny.posit.co/py/api/ui.output_image.html - signature: ui.output_image(id, width='100%', height='400px', *, inline=False, click=False, dblclick=False, hover=False, brush=False, fill=False) - - title: "@render.image" - href: https://shiny.posit.co/py/api/render.image.html - signature: render.image(_fn=None, *, delete_file=False) - ---- - -:::{#component} -::: - -## Details - -To make a reactive image, follow three steps: - - 1. Call [`ui.output_image()`](TODO ADD LINK) in the `app_ui` section of your app to create a div in which to display the image. - - 1. Set the id argument of `ui.output_image()` to a unique value. - 2. Optionally, set `ui.output_image(inline=True)` to place the image inline with the text or elements that precede it. - 3. Optionally, set `ui.output_image(Fill=True)` to allow the image to grow or shrink to fill its container as the app is resized. - - 2. Within your app's server function, define a new function whose name matches the id used above. Shiny will rerun this function whenever it needs to build or update the output with the matching id. - The function should return the image to display as a dictionary with the following keys: - - 1. `src` - The file path to the image, relative to the app directory. Required. - 2. `height`- The image height in CSS, e.g. ‘100%’ or ‘600px’. At least one of `height` or `width` must be provided. - 3. `width` - The image width in CSS, e.g. ‘100%’ or ‘600px’. At least one of `height` or `width` must be provided. - 4. `alt` - Alt text to display for the image. Optional. - 5. `style` - A CSS style tag for the image. Optional. - - - 3. Decorate the function with `@render.image`. Use `@render.image(delete_file=True)` to delete the image from the server after it has been rendered. - -You can use an image as an input widget, collecting the locations of user clicks, double clicks, hovers, and brushes. To do this, follow the instructions provided for [plots as inputs](plot-matplotlib.html#plots-as-inputs). \ No newline at end of file diff --git a/components/outputs/image/app-core.py b/components/outputs/image/app-core.py new file mode 100644 index 00000000..47571f67 --- /dev/null +++ b/components/outputs/image/app-core.py @@ -0,0 +1,20 @@ +from pathlib import Path + +from shiny import App, render, ui + +here = Path(__file__).parent + +app_ui = ui.page_fluid( + ui.input_checkbox("show", "Show image?", value=True), + ui.output_image("image"), # << +) + + +def server(input, output, session): + @render.image # << + def image(): + img = {"src": here / "shiny.png", "width": "100px"} # << + return img if input.show() else None + + +app = App(app_ui, server) diff --git a/components/outputs/image/app-detail-preview.py b/components/outputs/image/app-detail-preview.py new file mode 100644 index 00000000..f0e568c3 --- /dev/null +++ b/components/outputs/image/app-detail-preview.py @@ -0,0 +1,24 @@ +# ruff: noqa +## file: app.py +from shiny import App, render, ui +from shiny.types import ImgData +from pathlib import Path +here = Path(__file__).parent + +app_ui = ui.page_fluid( + ui.input_checkbox("show", "Show image?", value = True), + ui.output_image("image") #<< +) + +def server(input, output, session): + @render.image #<< + def image(): + img = {"src": here/"shiny.png", "width": "100px"} #<< + return img if input.show() else None + +app = App(app_ui, server) + + +## file: shiny.png +## type: binary +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 diff --git a/components/outputs/image/app-express.py b/components/outputs/image/app-express.py new file mode 100644 index 00000000..4b73589f --- /dev/null +++ b/components/outputs/image/app-express.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from shiny import render +from shiny.express import input, ui + +here = Path(__file__).parent + +ui.input_checkbox("show", "Show image?", value=True) + + +@render.image # << +def image(): + img = {"src": here / "shiny.png", "width": "100px"} # << + return img if input.show() else None diff --git a/components/outputs/image/index.qmd b/components/outputs/image/index.qmd new file mode 100644 index 00000000..9f5287a8 --- /dev/null +++ b/components/outputs/image/index.qmd @@ -0,0 +1,72 @@ +--- +title: Image +sidebar: components +preview: '
+ + + +
+ + ' +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/image/ + contents: + - title: Preview + file: app-detail-preview.py + height: 200 + - title: Express + file: app-express.py + resources: + - shiny.png + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKCgCwBsBLAI2Q8Y6UgwrIACuw4AdCHMbNkAZw48IuQcNHiG1ACZwGCpi1XrcWOAA90e5cq0ixgiOgCuFIu55y5HIzhkAF5JaQAKAH1Iuh4uOGiAShwoPUo-CB8sdQ8KSOIA4gBrPlJrcJkwVVIAd0qiSoBlDlqtKABzOAB+euQANygudzhggBUGYcSMuQABNMMGbJgOoOQAYmQAHk25Qzo2zvDExDlkM612kOQQSuUGYkqUAL1kAHpkW7UNHAh23sqajx9JxHh8wABGAAMkPQ1kqAF8zhttqdznoKO4GBALoJ9jlPFhqjUjsg4FxlEEAHLkOByQioCi4dAIFBgKjWChgeEAXSAA + - title: Core + file: app-core.py + resources: + - shiny.png + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZdKCgCwBsBLAI2Q8Y6UgwrIACuw4AdCHMbNkAZw48IuQcNHiAgpiINqAEzgMiAVx5y5HM3GQBeSdIAUAfXd0eXOJ4CUOFBGlDbQmO5WTshWQQDmfnRcVsaucsgZMTxY6ugWFO7EdsQA1nykAB5pYKqkAO4yhMiNAMoc9VpQCQD8jUQAblDJcI4AKgwWcP4E6ZmxpPl5BUJdcNUrCY3TGQDEyAA8+3L+YXKmdCpm-WauuflECxRLRMpwyso85P6IsxkAAiFTAwcjBVrsDkcIJlkOdOglXN9ftCtHFoiBGsoGMRGig7EZkAB6Zo1NQaHAQOJ9Yl1HjGTg44kARgADMz0BVGgBfcGHJHQowUCwMKFCVE8C53ChYWp1BHIOBcV7IABy5Dgp3C6Gi+nQrgw6EiPBeVzMJwgTTAFFw6AQKEtcAqFDAnIAukA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/image/ + contents: + - title: ui.output_image + href: https://shiny.posit.co/py/api/ui.output_image.html + signature: ui.output_image(id, width='100%', height='400px', *, inline=False, + click=False, dblclick=False, hover=False, brush=False, fill=False) + - title: '@render.image' + href: https://shiny.posit.co/py/api/render.image.html + signature: render.image(_fn=None, *, delete_file=False) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +To make a reactive image, follow three steps: + + 1. Call [`ui.output_image()`](TODO ADD LINK) in the `app_ui` section of your app to create a div in which to display the image. + + 1. Set the id argument of `ui.output_image()` to a unique value. + 2. Optionally, set `ui.output_image(inline=True)` to place the image inline with the text or elements that precede it. + 3. Optionally, set `ui.output_image(Fill=True)` to allow the image to grow or shrink to fill its container as the app is resized. + + 2. Within your app's server function, define a new function whose name matches the id used above. Shiny will rerun this function whenever it needs to build or update the output with the matching id. + The function should return the image to display as a dictionary with the following keys: + + 1. `src` - The file path to the image, relative to the app directory. Required. + 2. `height`- The image height in CSS, e.g. ‘100%’ or ‘600px’. At least one of `height` or `width` must be provided. + 3. `width` - The image width in CSS, e.g. ‘100%’ or ‘600px’. At least one of `height` or `width` must be provided. + 4. `alt` - Alt text to display for the image. Optional. + 5. `style` - A CSS style tag for the image. Optional. + + + 3. Decorate the function with `@render.image`. Use `@render.image(delete_file=True)` to delete the image from the server after it has been rendered. + +You can use an image as an input widget, collecting the locations of user clicks, double clicks, hovers, and brushes. To do this, follow the instructions provided for [plots as inputs](plot-matplotlib.html#plots-as-inputs). diff --git a/components/outputs/image/shiny.png b/components/outputs/image/shiny.png new file mode 100644 index 00000000..cbc97d22 Binary files /dev/null and b/components/outputs/image/shiny.png differ diff --git a/components/outputs/map-ipyleaflet.qmd b/components/outputs/map-ipyleaflet.qmd deleted file mode 100644 index 58026095..00000000 --- a/components/outputs/map-ipyleaflet.qmd +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: "Map (ipyleaflet)" -sidebar: components -preview: | -
- -
-listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: ipyleaflet - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACASxwBs4obOzWZUxOnwDicYgCkAygHkAcniYBZNEyYBiJgB4tAHQj1GTAM4ALFhGz9BwpgEF0igK4t9h5mYvYA7iwAmAOZwZMbWQnzETmSoUQD6voHBinRwASzGFHTx-kF8Gtp6EPpoqLEuTAC8TC5YUEGxPC5+ABSR0XEJuc26YDBoPQCUA2qaOvrjEH5wNCZwdABuc80WMWSKbauKxnDGxiykA4j6amow2LF9qJXKaM2ElJkVzQCsAAwYAGwATM9fAJwAdgAHM8gX9ngCAIyKd4AZgALKDXn8-rCPr8EfCBooAF7ERgVWHDfJjCAnJgpNIZObZRJkbq9fr4JhnC5oYmjQoTErXByoZolMosLZzRZ0Ab6MAAXwAukA - code: |4 - from ipyleaflet import GeoJSON, Map #<< - from shiny import App, ui - from shinywidgets import output_widget, register_widget #<< - - app_ui = ui.page_fluid(output_widget("map")) #<< - - def server(input, output, session): - my_map = Map(center=(50.6252978589571, 0.34580993652344), zoom=3) #<< - register_widget("map", my_map) #<< - - app = App(app_ui, server) - - relevantfunctions: - - title: shinywidgets.output_widget - href: map-ipyleaflet.html#details - signature: - - title: shinywidgets.register_widget - href: map-ipyleaflet.html#details - signature: - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: GeoJSON and Markers - description: Read in country boundaries from a GeoJSON file and add markers to the map. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACAKwGdSAdCOh5i1RQyACwA2NAEa9+TVoygQAJsRi9eAM0ZqWNHOLhRNh1nMEBxOMQBSAZQDyAOTwsAsmlcfGAaziMtHRgWDlEaCGw9enkWAEF0VwBXGkDdUPDsAHcaZQBzODIOKIFWYkSyVHKAfWy8gtdGOFyaDgpGGpz81hYAYhYAHn6NCF5lOE0WRRU1KpJxJgAKTSMyRMaASkReFh3JgrWIFhBt3dPuImJ5gKQWc6lxKEIfc7wT053zzRpxcQBhS6Y50QkyUqhgGEIomINEIcAWwHOjWUL1uYGwcB+xEyKPOuUalBxYCYSny5wAuutXoddgBfYa8UT+OAsAC8QhEEmkGAAChyFlUql9DAL1rxsmIWMRUJQFozGlgoI1yCwAPSouBrKVwKoARh1AAYMPliBhODx8KjrusWFAipottSdiREuRGNgqlIyipFTQ4EU2WaIBh5lBlEtRSNoOgqslWSxkgr8oLxMkw2UKtVal0FucYGhzutrb0BkNI6NxiF-AA3fwLcKVMiudMN1wcP0cGikTZvFgwd151BxjyoBaw8j+FkLACshoAbAAmKfzgCcAHYABxT9fLqernWuQ0AZgALFv9cvl4fZ0uT8fKSwAF7ENQsw8RnvGqqBuNWWyOJw5o67zKCIUAss6rrup6LogYwvocFS7y7K02CGCyxxAUhHxEsIhA0GQ2BAiw+49lhqIgaEsSMIohE3Ocy4vKRWGfN84gOLh+G0cChokZhzFgJkcA0LkohkERvFkTSiFYVCNbtChaHHBcVxEecmRhBQhIUaIVE0apYD6oSQpsRxBFEYaU5SUxOwKdqhBQD8UiPD4LJTGCswAow0k7BGpx9lUA4YKGyhVA86KMAsn6Bu+QEMOErBst4fgRfM9lkJ2ECTkuGDzvqx6rpeB4YDq846lOW73soii5LkUD3HALIAGIOW2vm7P5gXBaFUDhQscXkDFpyNM0rT+B0dRkDmYADiiHVoDFvBoIObLxCOS0xjQrbVv4EZgFJ4DQPA1Aajo0q6gaRrWKaXAQPgFzjlQyAYdhBHSvpjUrGscD-D8cCEOl5rSZ8n2NBwREIkBz3vOcr1wO9INw-gTHnKgp3+OlfpEVDSHnBw9mGFMzw3BJ-HLCIX2EA8+mxMoMDhAAtPqLAQWQbqMXx2EPFIGKE0Rs7edDYBcHJQm5OQ1PiE5fBQOzZG48QVZVFAh7UwAMgAQrL-GhjA+pVMoNCaOZAtnGAhg1uIRHzibuww9gb10WAdgK0ywmHCzbNIxzqI6+EEtSzQMte3LKC03rytq5rwf8caiT64bxvWaisd8GJjuxJLSiB1rONgLkccR+nGs54LHBxwbRs3PqNvYWXUguvh-tZ0HNeomXSsq0XUet3cvjx5olfcT3kCwIjwLnBnAct0n5yHdq8wQLkTfSyXptSH3hfj2AsTF9Hufrz4VRz8v2d74LB9VHiZSoERECJD8w91evcBVv7GCr7bYAMK0Dlqx-2GaCYHmcQVQCSOwAEpwEqPcGEkoJiT2bv-VEgDGDAMFNcYEd8H4z0gMQCgSsw633vuIYeEA8HagPkQ7B3tZ6jyqFwZgJ9p40JHvAJW4g06YOIcPAccwmCrnEjwtAfDGDriIseIRqAREMWJpIkROpO7An5jghgqBQGtCIleQ8y5TyHmHrkZQaiYAhT9JwlgpV1wGmHqoqo6JFREXpheYeDxWhjjLmDG4uV9Qk1zgYtRdiMEsEccuYef1SBqC4qiWcGAWAABEX4YilOEXIexmiAxweEEgbC8Q30dseGJqssT+F7DkZQhg9AQCyYjYe2QfD6DgAbIOwJgnDy+KgDgupDI3CwSQjJXAlbzj-mfU2LRiAd0jkg84oyj6KNRPqfUYjhmfxdOMx28zFk1KkAMoZmzVlbx3t3HBmRiDahyA4pxOCdbh0PFUFoEylnYSuR3GMHj9m70fmHZ5LpzkhMuZ85WNQZA3BaTgkg5BwiUDMecAAopqB2w9hoZRjCMR2sK0aTKFokZ+aSUVb2duUOUhw0VagxYi0ggL9LEulCwAAZCwX4kLFDiDiB2ZhIc56hTAcCVczjSC5E5bilgPLLlSGforQwgqJE4PShEH5w8oTwGEIw4mTErJ8VxNYeArNInY0FrDfS3JLjYFyOklhJAmAG2gBQV5LAIZkR2Ha+1Dqk5IVyhgKcy59TznyseQ83i8rLh8U6lgx4dQYE3FOY8eUdSzj1IeK8+pZwut2GSVupxHXBvMYaY8s5Dw6lXDOdcfqLy5Wtsm04ob3VlQWZ6mN84C0nnLSwVNTaM3BrdbOfUU4dSWMDZ6w8q4rxSu9khStCyFzzlzXlWcm55yTqbS2kduw21OtKhgL18yo15tXPlWcw7M07CjeG489bJ07l3IudcYil07EXZmld9q3UXgvNudcsad2rjnfug9R6zzzO0YOnc2jr2ZrvcGh9ZEO07ovLOVcBVE1aL0U2w92aTzPs9ceHRfqVY3ubWm5dyGs0YFjTOTdob831sjfhitPEDTzJnXOxcl4QPBrA06iDWE3XVu8R6-UJ4DRLmo7sbRxHvUXlXLOSTy4i1rgXUJjjSEdTLgwNJ+ZZG9Srm8cedcQmdgidnDoi88adE3lDXJ1thGlMqc7fMmNsb1yDtysK3DenlOBtI2eUjnapzmdwwp94Vmo2dt7euUNV5B1IZcyGw0i59RwZPPOQ864v2Sd8-eyzym82eq3A50qu4dS+t09FjAn7P1+pKuew8U4k24bY-a-zpxAt8cjdJpLO4T2-Ki5WqNO5rw7rKlVnNaXwMZfdVGr1n7lySYHQaZRXWw17hfZ2zTeb601dA-J0bM2JNXvjeeTDc2D0hrDQ5gt+Vu2Jc09eY8w32Nbbytp2NPbYsFUi0dk9xUdw7u7ceE9cXku3fq6Nwd64u0KM3Pmqbb2f3zmI1e71IPSrXl3IDsiDXdhWdBzGhR2iZ3SZnTpwjH3SPnjQ6VT1oXUdYXRzsN1cW4tFeJ1e3NVOkI06I-OItZ3u3eMsduaHmaPuHlLR6mcG5q0sadXVtHhG3VLhXFORnsPSobgEbVzbUW5eeoR76-1mGg1OsrRGqNoanvxs7et1jyayRJxt3xOkQE1WnF1S9e2Y9UQfXJo0D+KM0bMHgljHBeMHL+CUETYEBvP5k1WI0SmTTUQ0zphARmzMvTaoxVzHmYfxHD2Fq7MWULt6JFaHBNl-FhZ7ITwAVQACoYqeRXROLDzYYitsPfVjtnYizdqnl06eHk+1pn7dOxfWanw+brSvE9a8Ytjv3JvIcU6NxHyX8fOD85T+3jPgfuNy4JyrrnrFDdC+xFH6XjF7dN7V7rzvsAF8K6DxYNXHBx8V9j7L7nDlC8l5v-P7fi+V+0+N+w8F8r++yZ+a+LCF8V8iQuSXC1CIcT8jQr8b+78t+38ZAv86cGKKCaCXKqIkC0CkghAcCcQEBH+gsuBDk6CVCvSLCZC+CVytBpC5CHovgzBL+dCDCJ+5BGKHKDkZiPScinkAiNwAugsvCnkiyEewhVwMiwI4hpskhVwCiOeKiUo6iZiyWBonOke2EfiAUJiGiYhCu8y1iGhAScqOCLiZAbixeVs3iehychitiRggSIKLCYSZCfY+ksOcSCS8w0oygqSGUmCpAFgohw8mSag2oOS+kYaLAAAEsJKIBUlUsCA4NCr8LEhirUvUo0lYSwm0h0gaBwSwtMlAIMunMAX0mMoAVvjUeUf0hALMucHlF0sPCsvUe0bkVspUdTI0SHJkH0a0Q0bkScrcsiMChciwk8gCncunNvhPtci8tTEsX8pPgCt8tMZ1ogf8jcsMYUSHGCjKpCpSnCtUjgmShAMiuceirfnXNcfpAAOqmL+BEoXGkpNBIqHGooXG0r0qMoOQsqQHsp0ISpETOYhzf4CqQmPyirIGwk3CK7SoZBHH8QKpQKKhmI6iqo2waoxH97Agu6fwd5byGriDGqmrHHPiMCWoiCYw3D+bo7s4xoqYFSSawbJZ+pbpQk-rrjFSJaYaaZlRrhTo+bq4WZRZsn9pnYGjC6waTqM6rglYFZvrVZrac7xqs7vCsnRInhdqha3jVqhooldYql7grjeLLiJa5QlQ4YbZSlHZslTgJawaxqJag4DqHY-oqkHb5rniSYxqBqDKSl+aWbRKlorjaE46Dp7qM7RKzpJYeqfrulTY6npoRnrp6jTazoenXg+mC7RIzpXgGg7raYaYZkEbSlTjFQDrnhKYlQziYabgJnEZbiab1oPb5R8ZVnOrSn5K5oI5lTdr5raaKH2o5oYC+o9r5rC6hYGblR9m2qWaHjhqJrnang7p5b1ptkziXiJrg4GYlRlTLmsmw7enaby48kLL5ptkSYFoeoGieoGabhnmWaw4DYLKg6Jrep+pUZE4ql6iumXhjnJZ7oSmOnhnSlhoxrab1ruak67lE7RI6JlQFSYYVn1oOmsYa7Olhp5QRoeonq+rXhXj3ndpVabibm5o3ZhnpbSnZonoimnheo5q5ptn86RoLj7lri+rvlRZubC6-ZFq7gcnXi7E-qoVOac5dq+rJbpn0UjaCXTkFRTY7h2aYZepOGjpAVeqg4wZVa5oDp0VQUMVHbKZDmgUFoLjC5riE7mkYAngSbeJzrxorgXgCUWXuo6JzqxoLK-a5pmnvYqlLgzhniBrJYTZeUHrKbbgW6WKYW5pKbKnupY5TahZi67h5QxWZoXRRq5Rc7lnXilQ6XvD5ROVsUOYGavaBqW5S54UHoXSRqsUFU9qxoLh8mC6hXTYlremulwa5XBp6jTmTqhpRoDaRqDpdXBoVU3gSb2YGgVY7pDVOolTFRha7inhPb1pXqpUrYLIGmzZiX1X2rS7U4fmiZxYpk9raa-aFSAXEZlbVXzKc6-a4lKV3bSmw6XiTpnoOZXjEUOUhXTnumni7jlS-arX2oKLrqXoXaWm5SYapW5oFqiWJYKJbg4UNVOlNWw5Xqhr6Vjm+r9qM4Cmc6Bqni9ozoFShlmXKXOlrl-lVbTX5QDpk3TnY5qng5WmRrQ1kSw2i4maKljW+ozWG4Cmnb5pKbMUzaQW4W415X5LxpXpriAbCWfplpdYCnlSuldpvUyUfX01fXOn5K1q-Yg5NlRq7gc1Ta-beIuW-Zbjer81YRlQ5SummnVainAZa3vbKZ8aerblg7XWS5nWNV5XRJep22fo84zhzoc0Rbbj9p-avau2KbRKYY2ngWwZ7inbfqC4CkbhnhY4Pajnp0BaoWdqc6WJ2kmYSYc0eqvm2kzozinVkTnVs5ZkOYvori-ZhYc09neLxrC6aY6Jq7G1A7SmoXiVcmJbtHs1E4Cn2nCk8Zin-kLrW626qo9hO67Akl2wOxbye4x6XHqpfx+4Yw2okm1z4yh4QDh7EStIIxx7UxD7J5Mwey0TOJ1RZ4P1qEsJ56NBuyF7qz3y1R-654Kyb7qwWDgL16fKN4H7WEBFt7Spu76Rd757uxp6ewT7D5bxgPiAQOgnaz7H6SwPwO35z5INDzr7WDH4UPgM+gUGmwb71GUMX576P7P6ANH6pxMPEMsNcMwNwMYr36Gw8OkKjyCMkOsOfxf58qyPCP-4byjGcOqOHxgGohENyPiN9wwFwEsBCEipiqyNoHmE-yWyOywM4FALUH4HnCEFYrEGkG6MqOtL2MgLaBlHsqsFMHdLcIv6sGUKBMIH8QcrcHKOQOcFsICG+P8TKH8IAMhxJOiJETBWJPCKeTyFP04JpOqE3DA38Q2KmKQlI0036IuHGKaFESXgFq8Mhw2KWE7E-2uKUDuIOF6hVP+JuHom5xeERK+ExLxIWxajBHXFhEQAREYrRHZKMBGPnBrksBV7oDFJ0zKBlLMhzNn1DE0B1JBGnzNIzEhzFGdIJO5wVFVGEMWCzP9IcNiO37TItHxHzIYpdGjF0a9HbI2O3O37DGiNUM1ITFnKtMbErELE3NAvgtfI2rnAaPLFfKCoeF7GbEHFArHOSW5wnEQrix-H3EIrfHkrbFbxUq7Pl5YpPGoq2htAfEEtXFEs3G-Gkv-F0oMqujAmxCsp8Hgn4HFO5wwkQlFPwlipInAiZO5wyqRIosYkxFKo4l4nIx5yaoFCezEnoNH2ogUlUkorDzmp0nhAMk2rMmK3tqw59YFbqXeoKVYuzX5JCk2l+r0Yelh0d0R1msqYiXC7aICa3Xi2TlrncnF3-nOWqGfVT1HaJZOXeteqyXenC4SuzWBtrj+oGUYZ7imUK3QWRv5J0awbualTeoUaM5rn9Zg7xqfr5Rvnhsy6a61nVY2l7gzoFZnpKlE5rkE792TZjmfoV2nCTrrrXhlS5YNt8WFlJuetobenXUlQT1ZvmUHr1o5QnraI7grg7rngLKM65sFr47R1DnW19u7BLsptlkBqUbXUlvholQ5qWKckFpzpHu0460l2Wtbh9prhXuaY7odUalbhhuT21uRsCmB3niFq5qhafpXsrjbrBmbj9aU41sXWa4qmwZtbxb1Og6JuG6w5iXbiJb+W-l03zsM2LsqkwafrRpKZdraJK7rpxZUV7j6VwYMRIdd0od1m7jaIDpoaEV0cFZqnab9rD2Zs43ZuLvRIabRpvoDqFWM4nZnrToLKVvVZPvmKSeHlJYKLXhxaFvydOU13SZFq6dwautYSd26my61lKaUfaf4ctX8uzVhpClXlGcHmulqferTk2l7pCcCZenYeTlhpY3xU9odm5RVaecds2kMedpKaOvab6fFoLINnbjyWqdseWea4-XzV7gziaWCZE5hoVtGbw6WLAWef42WI8eOY2eFZFcqYlprjtWbhert3mfuuroXlYeLgNMkUep+0w4Gdeqi7-bVqseAfIeRu4esV6hFr21TaDeC6w45radeL2ag6ifh2mtdfTmA06L5urec50dnjC7AXuXcftdIQWeZnZfEaEVaaSb5bxp0evrdoOYQ5PZQ2Ze3fTcqZvq85ZUE1FrQd6jY5eJLgGapY-fVl-ekZlRSZzf6VXt7q6G-baI5rngTckcm2LsrcGiBUm6fqin+tkS-b0eg60ULjJ3nqVftkZtWvwUnM-r2tk5OuJouub1Lp24d072O4CwH1gBkke4Iw+4X1aj+6MnquAN328yyI4LR4UxUzpzv0p5f0Z6-3iBy-AhLelwuzAMF4UMYjNCJDqAPHQMcPQqqwIOT60NP7OKoOeLt4YOd76+iw4N954MbEEM6PG80Cm82-XIUNW+z4MPz7IMsJL6gN+8B-UMFzqMh8PHcML4Uv1wCM2Mx9m+H4wOJ8gF9wP4p+f4yMZ-EP+9Z+xPzxKMl8m-l9QFqPB-W+aNHzF+EOZ-6OHyGMXOCxIEvxG-EMWPqFWMUN2OoIOOCrnAADSySYIbjbft+VB3jgSJj9B-jhCYTdBfj+CoT8BG-ETXB8gffNfPLcTHCXfSh2TVwohChshTA0h5iN-jAuTThuYF-TAhTwIjnpspTxhEe0avq5F6+apkYTMRtYnW5hXpvYjBbN4aWdhG1HaWf55wXCLTTFqEjBRDNHYfhUZokiCIhFSAUzGZk80qQxFL4CzeIjEmSIiQ0iMRDIlkRyL-N9m+RI5kEmZ65wzmpRdflEXubXMdG0KO5nUQT6N9OBYyF5mslU634Pm+kLtEmn+Z9FuB8LXgTIJz6CCjkILKYigJhbzE4WYAdWLnw0E3J7CNjXQbMX2K3EoBqLFYsy2YG2tTYOLCAGcXxYkpb81xUwSy3pZ8NsUGUF4m8UYB0tHBhLHFBSgcHUo2WQJZlFy1IZF82EQrblLykXhishUIrREtEJYCBcXoaJMwbK0VTYlxIirc+saC1RqsjgGrd3OcG1YmpdWoKWkvSWtTgxk0LJQjGuTzTCk9Qv2OdJuEXpRZu0TlLcgZW7Sulgs8tMTgu0Fzroeye4GNF2murHdCMXQydLHTfQlRJM8HNTmbUAyBoFSkPSmkVi6HnYvU9ZN9NJgA448I2B6WshbjXDEVqsmmWzNsIIqydpM2meKvZTU6Sdqs14SxOVB3AfdthhoL0sTx4z+otwLw0YX6gix4cweZVU4DOEFJYc7MCFFdoMO27idM0tZDcEWx3Qj15kQdH4eun7S7URaJUYjkMNI4oinq1tJTFNVCwKVGcymJcDolErnYIaOVGHv2XewlYS0SOBNsO0hG7BMM-3Aathm9YQdERbrHbpORygA850rWE9IWgLqzU3McWA7HujVqLg+aLIlclFjXI5Zbq71R8jOnHZOpoRA6ZOkWx-JUU1Oa5e0ouGHZ5RL03iHERuD4xDl3SBWCGp53bKhY50cWJTNXR3QOiMq2mANH0O+zujKKXHPjClgKwTkyIXQtUm3WlqToe02NJEcMODSNDLW4w1oZzgGq3Duhu4XoQNgGFc8pc29e3LvQF5Kthe5wE+l9DF6owJeV9QPDLxDza88mRRF+sr32Sq9P6uDb+tYU16tjUhbcN3iAwobEAOA0sG0CoCSL+AHwTQBWIawvwW91GAASUSKB9w+dDZvI7x17O9NW5wLBgbw96QQbePveFuOMnGggZxjAOcSairCLjb8cxVceuOoZh87ejTGOAw3T6EMLxgcKccEUSKzj5x946ALPnj4UM1xIjd8YfjT7L4fxE4v8VeMAk3jgJD47Phw0glN8C+EfMEvADHEISoA-468Q+AH70FwSVfeCZeOnHITbxC40CU3wwkvi8+WjFvjo1-GESkJs40iSHGgI6BYCZ-T+D3xQKEMMAiRbiSU3HGYFrGhDGgExIV5eNQE4-bQexKIk0TUJ9EzxqP0X4CTsIDBbUAEx34sEt+7BDgRX3oQH8bGKkziShLvFoSzJ8TUySwjSZX82xqTV-uk3l5OT3JT-B-u-3v7qE1EZTG4Kt34xyi2GQA2pp4hTYfjc4zTPphkIFYwCOmBgiPBeAQEGFkBVg1AeEh8KOxok-hMZqgGSS4CKh5RIgfM0WZgBlmqzaUIwBKSbNykOzXIgwMObx4ZWrA-QCUS6SGTaiPzQhrED4EwNMJQgmZJIM0zvMbi3RcaYoP6I2MBpM058eMVORqCspeg25FoPVjDS1pKUnRltOMFosXBq0-aRYIxZHSaS4KOwXi1cF+CGWAQklqiDJZcMPB5oPFOmEJQsBHpTgxloEOunBDASHLMIdy1vxf58CMaWIfymSEJ1TGSQ-AmFNJLpD1BLCTEvKxyH258SyrQkoUJvqogqxYAModSX4j6tqhUvDUbjzJnDUA6clN9LoX9QlRt24aauubih4Nkru7wG7rDyaqZYZ0fGemTJzU5WYNMsaemSu3pxqY1MeofmbSPEwGjJy+SPjJB0lnTkAKXWLUc2zFliyjhxI8mWtWUwWJCuKs91J6S26ijkRFM9dHmmvBXtfUi4ZMSbNTFrUi6G5T-gGxyi2YjaxwoDk1R1oyyye5rEUR1zFEC1UO0GPLHsPfahYr2+lP9l2QI7uytZJwvKiqXXY8dHhfGJ2rr0NxrlAqBpPdElgBpzt45nsyOipmxzVYLaDtF7u22Iy50v0BUZLFcP5mZ0y5HWGjo8MtlE45ZoaRLGuGEqrYzO13TrjDUjK45fRPaTKtGKwjk8qsLQuygTnyz8zURpGSdNdUiqHDeZPacYQWT+rVZ-ZA8wOW7VrI7hLwaHPjDjm9KM5ayiWAdA+U7S64dEjcpyrOSuGx1GOGcycrWU3SLDFyCbQNA-M9qXgdEiaNTLlB9mTzL5OZa6mPTgy9t1RrJFUq9QKydpsMPOArBfJygVsb5eUYtMbIDmmy1qKpBYRuBPAfCxqXqNBYmjgxbp5ucGArDgr3l4KYaL7M7uNU+ExpXS5Cj4fFTQ5NDWZpwdmayM5n0dI01MyxLTLflk98kkopmVNhZnFizqpYpCA7lOB70dggvXGTWO9xLJfcDYgPDcGxm4xZe2eTyacw7Hx4J43Y3vCeNvyZ4teRi4EHDNrgjjDeJfRUAYKgaKwOGqsaFsdM3H28UGFsNBiwlxmHj3eli-vPgyUnqwMQrijxIi08XeLF8b4-fFuMSVeg4JvvB4IwDcXr5wJNjLxVBOSV+L3BjDFxVktiVB5clhDfJVhMkaF9BY2jeFtErKXH9K+i8PvjEvb4wNqlzE5vnhNKXZK6+HfPiUY2X6IEESvfFxeJNimSSsChDAAJoj88CSk5xjAhILEAJgUSzJQMtOYKSfGjkzfvpLX49SV+xkx+qMr35sIom-S8pWRJP6CEgmXkqRCIUET5N3Jd-BAWk1yZDiX+TylQrMm6YBTIpwIO2u0Inm4gIpQUiPAJzMKArMp7UwWDYVgEOFzwPTVwpAMRkhxBmuUrePlKwGBFipVLKIuVNiKkDHY1UtZnVI2ZbMqBfSmpC1IaRMD4VpsNgd1OMYPKQ4VzChgsqeb3N1G3S3qSIK3h6gqinRSaZ8xKjfNZp8yyVXyoSX8Rjky0-pt3xMGQsdG-KnxVsQ2nqrzBSLJVabCfE-SzphM0gKcSukPTPiX0u6UpM+kwSqWpLGlu8Q+kWr-BPxU6TClZb-TWYnLIGdIyiH4FSeqIQVv6sSEvx4h3yoXgjKNW5xkZ2QlVGjKVb5DVWOqYoQaiNTlCMURMw1jUKZJ1D95rqLOaFlnYQd7qrZGYWuRDLClJMmmcjHQrZmDzIM+SViiWWp58YVsAapCK6RUxdpOySOGWmdk871stEA1QBaOwnkdr7WyWFdlGhco2yB1JWGdNbKHb5RpM2wyRTmkW4Dd80+5TztEhywIUxM8GWjjMOs6wYt1t8hzDGgLkpiSR7aTOlhiaFfCuc1WbYWcLKizYP2cGWip5z0reoUyPOEzGOveDlQSsRaPNPWU0zVU30nnZeg+X2yqiWOn7GYZJ2PIeVwqG4RKp511kK4cclPJBVu2PUlz5uJ6b1JySvCYanKeXPOgeT9RocX1T1LERuUu63VyN8VPuklhKqJZn1BGjcAd2FwjceScc69drPtR+pw0gGBsgqS8Q8idgwG8qOeAkw5oGm-GC0YaGa6iU1NCiTGnRtvJTUbKZc5kZN3Y5HZRNBaBtElnpzSYoOMwyRRpjHqhoNw1si0cV1Cz5Q2hV4VGg4qwiRpio2VarElk5wLhSKTm9kS21DQ90J0nmjteWp-bJkdsxPF2rAoaELZVsn6KKpQrFzbDS2gCvupjxKheoLRK3LtB6k3DwdRy8ZMtcRh7R5RXS5UT0QZo9lTcD0wuYjMfN1xKYTwt8zLU5R+yFU05Z3IkUJoTlpiLy1WmWoWvhyAaoRlo0eomNDRrgVwgmu2TeqdR5pvOCm8LPLJg5dbL1J6fUTxQMzBb-y63QGrJVQUVaGOF4DslWrO7BbI0tmIjdTLbadDYcwdG8ODhzRkbEtmohbJuBfR1p8sHZbYZ+W8S50QV1FNUYZqy7GbVNlGTDGehVrSZxFXm2HLaKqwJZDyJNFTZVpMzyVbMd1SLUBoU6yVO0qmNyhJix260NMc6Wcq6PbWE7H5O4NOfBwR68KU09arCKJvQpaJNamPbcHTqhFhpTc726FQVivVLbhNkGXWS1i07tDl1i4XMVeG5KkVtOeOXeXWrzXvBOcjXLUq6ScxBVK5nQsNNXQewDpG2ou1nbenZ2uoBS76D0t9nw7y6Zhgu+tHuG46YZiFtavhVbs13k0hd8dXRH1lzEXo5037IhUHW-VKygssaO2gFRPBB7HWfGbbC5rF24L7Zj6fUqbq3BPYds5UUBR2pOzC4a6ZWZypeDnWj1Vcru0evaKd0lzE01WCMZFSXJfac27qV0rNgtkyZ3uuYq9AuToxLh9ciHSHb90XZyzJh0Cm8J6Ok0pCjdxNbRPXp0RDZm9i7LUV2W-b9CjSfomvfmNPBRoe6fqBLUPo5mZoo2haBBfl31EPVntcNIdMjkLZs0oun2QzElnd0LCHMQO6cgcMoX21+hKe+hWnsgxZa+0BNWNCPWdkxjzWgaLHtPItwo4l9x+wNgGinaOFTOXWmtIOkxp8YgFK1OA+2hX0NotwppBpmQoq09kTy1WULHXqb2H6BF8Bj-V3IkzP6WyQ4qLSXIPVVqqOnulNFvW9g893gSi2kBWPPrqLReWi8XrVMbF6Kg8hi-+sYtJimK36SeNXr2I17cxbFMh+xe4uwaF47A4oOcYwAeAqAlxHi0Yr8ESIKDEW0E-xa3id4prXe3eMWGEq977SzxTsXQ-4AMNTE4lJhsw6HzKC+KYpgsKPpgzcP6HQQYEzfKYfMMVL-DMEkpXihCMeGRG9RSI50uwkpKLlJQ1w-hD0OJHgZ5EtpZ3gSNhGGJ3hqI4Mt6WZGdD2R9w8UZ6Wd99l2scZcJNRBVGyAJEjFBgVmWohTDiysfsEZaBFB-gEAZYGMEUAAxSpOyrSTQQaOf5V+usHSaiD0lsEzl7KjI+ZOVTxHqjoRww3kbuULGflIiFyeGrSZ38kdBxnJnCVeW-K3+syMFV-A0KQqhUt8xTaipqaPGLZ1w8AWivcIsCEVSUiAJ008T+pUVcK346bCxWRJzgmAgIuMxKn4DIiGSYlSQMqkJEKBqRHZjQOyLNSDmDKtqWCajydTzmMxwWJysdg9GeV-A-SCkYpOjTHYNlCaZvnpMzS5BYAck7smSM+H-mqgvVYJJVVaDqTXh1YmSc5OCn7pTK3kwdMsHinsItg+wb9PJa5xnB9091W4JDiPFGWXg0aD4KdWqn+IzgywSqa1AAl2WXqwGREPqW8tBUAK5vHyniHWmxlorZIaAphiRrpTqIGNRseIi5DfEKrIkkUKCUu9ySaagmdiyqFZqSZJrBhWRClnEb-KLmoKqlTCqGlUupaX-erqjNYRLKdlbdBqTsobhUqzlOLm5TsqeUcDTqZTMuvUrdpJMWlUqKlR0JpsgqxlbA9QdJmxUVMwlccmJSmwSU2yMXVLXJX82KVWzrJJil2VdFsVpsnFS8NxViziZ+KZZmGkeGbO10q1CwpHaOkzqiVLSZ2c8FBsXPRmVMbm67Aon7TJY2yTQ5OuNh6xKY1OymZ7FegDIbt-yzB8qpnTao+oL1r5NTgKR7P-kWOa5xNG2SdGgUL1EI7HoXMa2ZoBSQnNdrtqxzCVgLYOcDmFRjT7mRzhGAUhbIXBTZUtWGMA5POQ1DprWyXdCw1qM0HoLSnwmLu+2K0G73stZSdVpW7VHy80anJOSDn3LbUFqXGrrKiIkzj0N2L2cnQeawiJlfUA3FNiwq7RoK0piC8qKVHoyLbU9y2+1LurUziYD1tovPW+dGq4XKMJVBfcCNjYk6tKHqNHQRc3M5RJsr6HmnlDTNe6NdpwKOjx1Vrx0rS1errNEljqmdXd3tN9BbrwxOXdg3lmmnZb2EW5UqnOODAsk9LYYHLbO4KzsG8uA0mOBUcHF2msGTlQqYW1yrVuSyZV2Ln2L0RYknS60Gcj1e6hJgUviYdCRV9iruwoXEaMaKNXKP+zFKBpZyP5x+YOke5LqyoG58qqh0xp1yIuV4edKJaQg60-KeoX6liIfKpVjOyWOUihoguDai5waGMzNYCofbXzFaUKrFgirPZoqtWbg7zzLH88ewaiwMyLy9wKnP49Y8Q7oul5qnpDj9BAYr1jydiE8Fi9XtYoHF2KUhmho8YXl+BzjIQLAFZcQSMMRGAAWmUZ1WWHtxASmwwGf3FOwnFx48Jd7yUlg2-oqRKGzCA3HJH4bvh5PjhM-FpLQb4Ngm1AhcZE24+cNhGxSxiMVLYJ1N-G5DbpurKkjJh0mzUoHh1LTYDS1kzTa5uYAWloUCid0bFuE3CAnSkm8zf3h9wRbeNiG4QSmXnwDGwy-YygCaNUmSJ4tzW1-xmXSTujsN3oyAkcai3Obcty29MeOUHKCE8x4k8LZCYmTHbaxq5VvDVu02iCDN31fpNP6u3P4zkl5Y8pETvKH+uTM49NHcl+TnT9xwKT-2IjaVqOnm8FUYmAFWwSqMKlhHFPRVRq-j7TAEztPgEgn4pGK-iBCeGYFTsBDSOE8Y3CIImypVSZE2QKSIpEaVcATE3QLpU4mCiCUygoSfYGe3LmXAqkxbZpOK3Bpgq1EBFwZP1EF7zJyezKsntK3BYCqyYjyceR8n17xN-Qfyf5uinkW+J3e5KdOlunzgsps1YafhS3SkUypsADarZt2qHpDq7Uy-ZYT6m3Vz9j1SaaZQgl5Guky0+JACOmwg1VpjO3rcdN8t28rps++6blaxqI83pwI76axm2GgzlJdNbfkzVWoIzuajMxnWsz6Va61pLcjpYrQ611K3JSdK10Cv8K2zxcrOpzknS50N5m+7WiBpLp65TwEsya5XThox1rRkwqGdw6ToXg05TmUvYI8ayXzPaI5EjAAvPNE4A62iRUW1bLJAi5HGOM2lpjZq107tNtJetZntr5pnjztTg5bqSvERlaectWtxwRziP3sL7PWkuDq3E9+ZWoo+dxb8ro9+dvIyWjQsWyy08u3j82Qogpq9XfUM5GkZVSux85k5B+8i1DrxqGydCf2IXe1vidTVTSZ6DUoOmsdBXiHAWfHt2gpwQb60TteJ+pTy0FQPH3a-mcrgmoQjksc6WrTiPYcYLesunathhe+rWZm1xdSNFlgJ1Qjs0FBhTbrgMwLI1djl0p41kaFacssfQ6uqWs6GGgIsQpUskOki66OdgBWddBqTWzcVHzVmzZ0eePISYFcWGfmcrXpw4agFCGQJzJtgoUZc6h3ATsU6Yesl8k2VPOqVCpoW4qHuwLoa9WMz+b+9a2BedmQMyPrkyb6V59PuKgc8N2RmPLP3PTP-6D53neTYW0OrzasrMYrZ5Bw8qzabtBz4iMPOpmwZrZsWnETVUcwlVTdg+1J8PuLkWObZFNHNH5WRfQjYzDHeh7uF-lUu2SoT3dluVoUADLneWH9uQe44Q72XR+4aomRprHks9Ug0FzJuzSAZpq8yXPb2TFehVI0VwhsuVGFU4jxrro2tHFlR78zUOmFVioWzazEuvNhoANPLIAy9pes-MrCzaXWF5lqdFz-2v9xEV7pIO11P1+Gjb3vUs92nO8mo+84Tp1618vdNG8hrNdaFPL1R11grOM7CxxPD7j8+92NZ-Xz6KrEbPfTIu+ReaEnH0L2z1bILFFvKjBoDRUi-hdteJ-WjfXLq9REl6NwT3m00LtwYXQaxWgDok15uQZBtMpb-2qWg5Jc6eaKRG7To9rQTxrsqLYewXx0Dr8NG+jup3tscliW2mnIfaKbpqc77Fwu7do5WvMGlMSgaEsvlVJa4s7XL9QGp7ulqDwvna6VVrPvqH17KHqrU6uZiH5Mimunlplq7htXIaGh83QVIMO5F51lD3wfLFXXKxN16sSIfRmPX0Yz1-069ZbGA2Pr8hlXooZ7Ge8+x0A1Q62NjtAN3eheKwKP1lTm9jD+kWJNCirwbikb0JHcf5LRuVHMbjh6j6ixcPMe8wrHrwxx649k3WbkfL8ekvOASelAonmOJUtRCcfuPSfeT2qf4ZKewAKnqT9EfqJafUjtSim5EMyNGe1PVnqWwUa3g2eFboxMz03xFtOem+9Rse9331uOxmPxth66bY4-23rbH0UY8CTlukEPPmktBHsu89u3GCRytleE1mOnLdbkTCyY5-8CSfbPFpvYyHewhh3Ubbk64x5PFbR2Mmvk-5V8ceN0OLhBFzO4YSBXmJIqamL46CbdfnBEVyUuAY4QruF2r7YAGu47ASJ4rYTkzFgAQKJVt24iI38gV3YxMsBMiWJ+gQPcZWIOWI7SIk-F8-ikmt4nHwaaZ9k80m57UJ8neILFW+Fzv7Jlkwd4WkyftPwLRVUPf1V73HYrn0U1oI+-bTT7nX0OBfZ3uogb7heL+yHCVPWrnVr9jU47FeJanfB997+99INN-20Yxp0IUA8lvJCA1XX201j5DXipYZ8D1j1XejXIPPTyllRZ-ETV+n9FQvLD3jODMTHjVFqcM8ayIc4ukIbmcnAhgLLnhbSq6-7nmmjR61AxtslSxLszMdmvsKbU1yuAF9N090FI00gm0YeluMcqm-LvaTaxaO3X46pyrmmWyxWIsZUEt7Y4ugAL2KpXBdeu5k2j6Dh8aLcmFTWvi6hta1MNL1kXAI4y585cd2C9zYgq5NjzmNM06rQubNt3FDNgL57L1knykHS7RE73Q-s19TGLOgL+ur-rSsmV+58VB9EydMaMoj1F1tM3R08t+uJt+tagvDVlarpOtx9svCm5YPna61gmMDSu7Zs2fxUUuAhGhO49Mwn6quetH2d9nAz02nt13bzal5dpd-YFta5sLd9PJbP63Ta7wUPheXd-TWnHrjVHySORfxZs9ELaQVuY77GPMDKLZZMYrj+cGQRclaiFuY2bHS6gMq4r3CzjnwFn+fftnsro9c777ef0cr5zGT33kps-UEWHpzNGzCe47-D50-UMKBRASsbHRZz0djnCdGqtb2ItDO1LnHzlb8cLYik+0R-JqmWdquCkQR5A6XXyA0tnC7mV1iLLFxf8b3RTB+olhcLGNwE2HETuo7XdHkTRW-EP29RHCMHnac5hKfWhFuna+V6cysEP1NJqOBzCN82aWpxQ04sNdkp4BtF3w2s1qXDkUtvUJGmxxzcXJx9QBrRck6p5nRKwQDDnNclPl5yHuSwUfseJxADm2BSkcxTfIwOIgfHS4RFoIKODA5opaUJ2wom2ewNf8lnZdnjQuOD9BmwwZUx2ycKyIc3L8lAyvxUD93Qml0JyyJLALQOaCmi-9c-DcFV8zfEwPhpZ2QkTBwa3VDgHQsaN7SqxhzZVxoNhqH6kk1XyOMgtxxnXkT9IwacqEfJvuPALypzWJzBuoqRU8DrNHqRUkSCbMN6hIoQ-AThZptqYVQvV9qTA3m5-UPrGoDDA3wIxxndRXwmoatK8in05qS7CDJRFBRETR+ZCyCdp2iCxGUdSA-a3dReqR1mqsksPYOnIN0IqkCpddG3xDQVSffW0wBLWqnzQ7zcNBkVm2JKiyxEzdKmt9IFSIPF9Xfe1C2tExHa1RoAPeoMNlwqAymOtFAkEOUD7Uaa0TF2tLxDXAdwRaz9RlrSNGDJMabq23Rysdih+wwOFGhGtEdRPU6p6rKtV4w6XRjD2pegtq17QBLWa0RD53CXyQhQqY+QYMIcIXwXAOaTEUbIz2Hjm6sseXamK06XeDnicHaIhT6F-0Bc1aDg0YsmdoVwZbCIU9wbt2tIsaH0TqofA2gPeBJOGTiRpZKNCjcCk3D7VBxZKUqn4cDA+AIWDkrZdkoxnyPLHhdJtXkQVFGMHeUYDB0Yy11wwRUzghEcREqFhFJMeEU41gRFnX-ZPhDsmhCdXdclk4lqfLkNI1OQ+WZwzwb7EDD3Q3-0+50KTdkOt9QzkMNC0qABQkpxMWK0b8TsJcBL8kaUDXvkqXcSwC1GdJ0Tit39NoXtpuXC4TtCSnB0KFRcRNqxV8AaeKm217aa2Up4RKesKVCnUVCnLYZFWdi7kTgsFwLUkcFXFd069IqzowSKItG3B9aAzC60DMJxx9Eww2DCKtj5buR31aqDigq0d0BSlO5-+AqG6sTyK7ADIc3R4M7UlwFjhI0F1DrG6sfyIpy0pb5JYTT8nMTcCnQKcDDG6sL0DTHaxXRDoSOxvNOfT3RE-a6iCxIIv6hXA2HGOXw1OhM2k6pSKRIOtEMghwN1koqV4IMpxhJLAF8lrMilEoY0NiypcufajgN959fn2s1BfAni-JRfZD3M4FFND0utIYTD3RsNFe62wg8PSXmvopDYj3UNXJOQzutX6cjwZhKPKxR-paPQG2gcGPUcXe9KAPMBMl3FTfFiQnAXEkfFEGQpQQEW8M21jtcZf4Co9TxJSXiQIAHSKJhpPd7ycAJ+OT149KbOI009tIxUCciclfSNciClKRjZsvI84HsjHI3mw49AogW2CjblTI3CjfIzH2lswonyN0icEAAhc9oonpRFsEotKPKMvPZL135c4ISQ49KAAL1Eigvd7zcj5+BSWtsp+ReBn51lfwgcjEomqKmM4vQqKMlDlF2x29dJd2xWMUvPL21BvbbyJai8o3CSDt7lQaPP5SvFyWgcTjcOxK9pETRCq9xIWO2-4zEQPx5xXjbOyBME0cB0C8IBH4z+9uvUu1697TGOCQFK7Iu3BM0BbFXnsRmGExwEJvMhGmYW7DlSRNZvIVXm9KBRb2W8+7I5HpVB7En2HstvUe06jepKVU09qokaVM8sogVVGJCqRe0RiFkSVVu8YYo5BGIoojGJYQt7UFhBjXvA6VVUwo+GI1VD7bGIPtDpQbwNUpTDb3uhTVEH0h9EfK1TuIbpdwTftzgJwHkB3pUHz1MkfX+zJY0fAGQx9djeeGDVrCXH3FjZiJo3iFoHKVkB9zgD0wVZ41PIQwdk1QT30g3Ae+HSh8ZJn1DMWfAhzZ8l0eoSix2cQ5wgM1MEAzgxc9PNCKwZNM4Sx5PUIDCq0HNQjCYdygtoPXQaeJ9yLYdAu2JSFJFcWXBoTwU3TF8og5ELd8QRUZ3nJmyNoX9jgNIdBk5xKW0SVdWzD2OGpVNQOm04Aqas1tjCMe2JKw1KKajawr0AtDdiisM2OIgLyMemjQSyXXRtJ44yThaEGOYv12xAre0IPRK49almclLa+Rtip9AuJJ0pHZ2NBxXYqLF4MSxbnnwwTYo7C7jVNE8j5xvSJMSvCosGTSblqZKJ2Yp0rYpw7jeww5znAuSQOn5wseRkNXiUhKOmq5QNVulc12QpENBC1qZc2fQe3N2WkxHgteM+w1MTWhtIEcMOLviI4sEOIws6ULHspVaUEXjjayddWfQWyHQiK1y4wjErjGIl8kBoSdLdXjizaNAOF8eSSnjgTTY-OJYASI2sMdEs3SiLwTvNaiL-doDD4PHiK4vBOmsU3TCM7IZXI7Ft9rMapy0RcsLOhwTZ42hMFJT5TdhndC-UhPrZ80TWhLIhRCayOx3Y5hwPQQOZOh2xd9CdDfjz4sbDdlNMSihEtJEmhLPjyaHeTvYtwfLDGpG49chgxmMDESNdNE+BJ4TRnMWk9pizN9HjigKOjAmwa-YMi7QuEzuLwSKzb1HXV9KcLCFlSEoCko4gyO6gvBtMdxL3j8EwuN1pJAmc1AjswsFz9Jl1adXacuFcJINDFMCyB-Ju1HENW52FAJJKwnWNhR7phFbsN3j0kgLH2D-KD1BDIFwAzB-8EknKC51sKY0RIxSknsI8Sz4i6FiwxZBLH30ntZhOUSdwkHVnJJhfKDSSiwjJP18n4pjkcJX4oxKHiPhBfWCxG0ahMsTOk+eIsQkxCTGXj4k9+OBdSoYShd1KaN2O4jruXiOUV0PASKEN6fYSLrFL6Aj1p9g8AmBI9n6OSO+tzFCjxE8VDP+kfp6PTG20NhAYfD0j6iaFDsBuQHj0KUDozmH49LI+nxCUe8P6wiVMGQFL1jlVNFkpQwU9yMhT9ERTwBSoAIFP8iQUzFJ08PI3ODrhQop2BRTIo1FGJSelNIyKUJo5FPxTUU4W3yMf8PFCpSSjDFPBS3PViQPFOUuox1sCvH2F88OU8qNRBOjM2xhQQvJSXqiDEXQCai7AAVPkl2opflWNUvbqNZVzlDVOWN0vffk9N+U5lMlsHJXqNRAivDQyuNI7Sr0tSLjZElWi7UwFUeNrabpNjsDCN4xTsCsTAzzsmmCwmujBvU6MBMdeG4UAEjohWKG87oyEzABoTQqQbsXo5u1mZPo0lW+jO7X6OJVe7bE0YE8TP7xZVdbPbwek7AQ71GJQUnlJGlTvMAErZkY-SArSV7GlLXsaUktJUFnvAmIlMIWLQWLTKYnaRhRaUn7zDSaYy+zpjgfVmIR8wfb6SfteYslMpZofV6QJRHVcdMFgf7IdOZAQhYWPCFgHRY1AcHUm0ziFkhcNSEl4hO43liXvT+CVjUZRRXRlqfTBw1jHYXWIzUwzQ2NqFjY2x0cRzZCsgfJcrEjX04r0btUNJ9ud0jU56YX8xc140XQN6wQ3IbgG5rYucjbp60f9Myxs6ItDQ49aCN0jl2HL8NvIYMql3phyOcXC4UhfNAK-Zxya+RbYsRZ3z-i0nTNHphvLFqlb8c0Uihsor2K4SdjWKdoRtJuw350Ix6YCBLm4ZOOkJJ4GM7cmAwMrDKn-TlaKti3jLtfMXiTfUG4NvAaLOZ2BCOQ++Kwh6YLUS3Vt0aNCAVA0K2U+F5kIhQWFf4mgImTdgemHd9h6C7ELVoFcrQNliNK0P0p7KFZKnD7UEzPdQJsMemj0BMaYQNk05LTA0cp0RULKDpEp1CPBzNHxL7RDSdYNw4GnTHkTRO9NjLV8dgLZzXpDyJ0Taw6gw9Be0vsEOJAMFSXYLFdw0OYV+oeyC9TySusC8n-5IOYVQLJSMxTP-jXUfkRfQxSS9Cpo6ONmgBEG-fHAtFzZekXn9uZFrE-SbSPLVQyBLNxKpcUdSKgb80AvWX04-Kb8nIMSyQMjU5fhDzO6Cocd7jjDjsbMjZofRTTIcyAs9nC2cDkoX0VFQkzy3ew5wIhSTEZOfDlwC9swjB4gOeAtlnJ8cRcJQxBSbjnGs7XUtH-SYsVXDjQdCCrFDQisETGLR7KEaxm1FsnPwqxdODrCSwSEzUSLpkyKMT589sQsKUykIRmFBpLSKigdZ5SIHPJpHWd4SF9yMOLKfS5wUDTS4fsbLBXUGhR1041-NTMPrl-0wXVhztCU9BvDkaGnOnIZndzQPZH2TDM-JaMyHn41yuF7JYArwMkVoUlMCLkmx-0rOXQpQcBXMdZEgoHJVCQPXzlHIe0ETP18hknzhaFFsFXKeow9KQQO4RyLXMu1ycbMTh09OBoX1IEcHTRpo7af9NrIiMlMimxvaLciBzD5W9lIwZMWNBzQSchwM4yGZXOQ6ciDDDANzo6PRJkUgFIiN7DKM9BSkxUs3LFQSbc-XwfJxhRPUT1Uc2rPeB486sIkC2KRcBNwDc3ynWELZRIOFx-0v0gGpVRbtFM4+fIHPgU1aBzCxoezOLCrz3UGbDkoH2URW9RG80ah3D6XaqhSdm3cjODQsM4qCe45AwmiWxHggdATC0uQbCtCOnDvOjpdCLdTVIOSPHPXRTNPdDr00DOAPaSjMnYAnyTKPn2DIOqPNHWyksCjX-IStejDh1V81TB5y0AvuSBz1HXTOqdY2U3Q7yWyIchmwSaVMnfzRML7HlIb2Lq0wz4FJ7ncwBuIKjl8GhZTHGFR3WMOWsy4yArhpFfMDTrcJKR4KPRbqaF29J1A08H-S1XCalCTFNZjFwLgs5Th7RTE8chIKY3SrKlCOnfWXex3nH2KWF30Dzkwz9SHcOqp6mLETKgkuPnBN8e5A7ioNbsqLHjzOCorVFJ3SXizYL93FWgMw4dCkTZdR8jl3Hyk5SihrQazCnD7yGuSKg60itKfIDy48v0g6cKsAK2mosQhrlppFRA8JKD1Civxbdx8kDk00f2OLAEsQyfTngxmcfPwTEzC8pJPzyaYUVfJbyT8Lo5ZKW9muxGdXbI0KVXJ1AAynqaDwWpaksDOW46yW9iwwcdUoISL04siGfSmdCxwQ5JzT9Kw41EhDKboNEq3G55zk2kEuTncQSMyNbk0QzEiJDF63Lw3rRaNkjT6eSK7FPkxFP7FVI6SMTsNI5xVJZWgUgHNNTYCvCJTBiMhlt5sUqwwsi9xIT3sMsbJwzE9rVKYpXhjI9FJpSFin0z8NSU9ByptKUXYpmKqfDTy7Sji0uHJt0jCdPZsLisgGmK103fE3xQUu4rXh8+Cz0eKhol4reKkohzwelLi94rvx6+Q4s6URbaFDBLOlAqO1SfPMxlRRWgcVJRhKo0ljsBviqPFqjllbm1cYmo2EteK9imL2oIOoxEoS9NU9L36i9Uy5Uy9QS4kquKQHfL1NTzjS-hWibUq4FOMKvWQ1zgCmf5ShSJUh4w9SPKGbB2jmvapysRYVP1LpiA0suza8Q074zDThvLeGjT67CZkZZ4TBNJm8k01EFRMFvNNKW9aBDNNakw0nNOFSpkCe1RQN7EZF5UMU7EuwhnmRGO1ILvTfCvk0YylBtLP4AFnmKlpbeyPTz7VtPtKO0ttKxKO0370FNaYv70HSghESM-hwfRdKekOYsAC5jmAHmKZiR0gIWR9BY5dNNMRYwO3iFsfM2EljBUIsr3TkhOWIQc-vE9LjUz0hNTVimxEOFxkb0vBzvSjWB9KMz2cLzj7keKNAMQUXHU4QtJ6-TjTbUaqTzkbUKaCUM3QkcbYSwt5uHHHsp648csHZZrbc3aF2qWco9pWaEV3d0zMUbKzkyrGzGzoFqCORmEbdWdk9osFJCMXAH9YzAactEQ0ggpthe8w4TMDPLBVps86IMfRByW0SRyucezEb8Kzd4QGo30CNHy1Rsxi0V8+CsHBrNnyyrWfISA8rm1JRs1Cn1wWaBTUypHdToQrMqaRPTzQmyShQj1DhFoQqw0dbxLgrzsPOW-IXWFs0kLgOOsiv8bZPILfDMsdZFEdM81jIj0-sArgYwnXTcpU5yHRgxHyXCsfNXQLSOzBK0bZdCnqTdwELWTpgKQLRuz8iwLMfQk5R8y6CW8t9XiTZKn1A8caNFbCLQd1UGjIqEsS7FVxthP0l5D1SHOmQrHMyDAdjTQ1ugeE4IwcuPQe8jCnxxYDOys4wT1U8BnMJqOHX5dsMnjGA8PhW81GzlaEMN7L8K3lxkqhy3pOypvSc-1AwzrHiIutlFQQ0lYbknDyVZ2ih5Mkjnk6SNI83ksxW3hfrZQ3+sRix+juNxi2+zABGocIFyNgU0YkagVxIyIsNTIh3hRtdxLB26MKqpFMdgGqiACaq9Bd6BXEnALFNijUlClKGqRqyPhuL6q8aqCihbT+HJTvxD3EarajEzxaqlqmKJWrmSlos2qdjAsu-x3oI6s8N0oyEuPpdq7KL5T6q86vhKhU1kpgdkCM6qDAOjDEo9wbqlVKWV9ISLyajZqraqKJdlNVOmiFGOYy1T1U+pRpKLS1hGGj6S6sQerRY9hCmiioiQnck5oh-ijtOSpgFyZ5o+O1mRE7DaIyZYsSjHFLHjdrVIx2vGUpOj-jQNKzQpSyPiuiBvOmJVKHouu0CJY0zUqbs3o7UuIEvovUp+j0TQ0v+iTS3EzNKR7SGrBrHSq0uurC0saomqTvRGKGxXSpexVqbvMarrTrqxWqe9-S5tMDLnkYmMWqda7aS0FWqk2rJiqYumL7Sw0mMvlMviFmNjKkyqdNRBUysQFnSMyvmKzKBY-+3R9V0zHyljoSEssuNpY2B0lQifaVjpiay1BxVjjigoXVimy+nxbK9WNsuzVgQSM17CtdJ8gDcdMmch0QisAzEHZ8oAS1tIArWPOCLzEGCz8r8InDPeEC6rCyQiAcpHBNxyNNWl21kyL0X8SosWDBa1bAtiilzoebytdQA6U13TDB0G8H6SD0STE9YT0amXoxycAzPmCK60TRVx25busYtMrOYLKSc8-tlpF+6BXF4xIEgurNpHsSjQkpCKLHX7oF1fUX-RNQwjD3RXZJ2iyyAFc8Cx1msDhOJCe3ZF1zRW9XQnGsuOCNFu0JhAbKuEweLCqOwFwBmTi1HsLuW3BgtU8zSlYrLSjS4C6i8hg9G2bZO8Tn-JeuPyxcmLDB5dOUvxqd76n7VepoFShXUpPy1wtXQQOeFwuFs6NdnNDu6iyGaw5-UrAIMjK1UQox9LK8B7kC67NG7kLcAqBucgi3Bq84lRbuQYN05eJM7RjndA1zQfOas3LqxG-Gih56RAg1CSTHbCuPRUaLLCQVFEunitIGDVXBr8Bufhqco+0QthoyTfTzmK5GMBbmnlQKWD1kbbOeF3ipRcYSvDjRKx9GC4RKIMgg4FSfOpIaSsGjj7p6RPcAfDRsgik3UBMOt14bUG+7nVo1Qr4VorlKrsuC4E0MJp9YUuGRstE+dKrFcpwaBzDp5WhcsjHJ+0IzALrA2fNFEUY-VbGqzr3MRvyRerUckLRf3JhKnr9HHZ2Rx2iZwq8bNC1dGdzVMd0g9ISaE9ALrrOFoTKsNLEyjnU+6LBX-R2iYvPvrB1WJ1R4bOarQf1+0Y0Rr9jKK0ILqo6DgOwpGGxbgf1dE4RujjatGRv1IZFfch5ITKReu3qvygA07zx6YtAxF+6AuvI59o9c3HqbyqJvZJZdIhVqSNMeusq1rfYLBdjPOOcHBp4M8CI8cC6+81-JXNY3WU5bG5dnd0SMW8goUZGzLGrVdcUtAPIt6o-LRzNdNBtso0RStn6x6kmdGPQxySXMpzsGp5uobH0DtgXAgxekVBFnGyWgrUYtHTlTiRKgZu-KCkxjIGtFhWOjBblRXPR41tCRfSHrNdM4Xw5FhUeIYM16iBoDoBs2AM+FZnKhu8bIMSTg5ISrQvUC00slgELr65aMkcdZtCPUcwMIssiRcZOIrE0xJ8ubX3192f5vlbd67MiaDTCZrnm1EW+dWVFZraajUpoNHyilzz0DDDGcA2jck-VHWALUHraiyeNQ8Lk-iKaLrkoSJyrz6PKpJlHk7ot5LKCMjwGLFIr5MqqfkwJTVN-k96CmBYQGG3qJGocBHaqYWO3jMiYUtYqpN+qnG2ralAWtv2Kg+QavAR5pHFJOLlihT3OLBqmtrjL9CBaobah26I1OLZi-T0LxGoSdupTj6QdvM9BbSzwBKJ2ntqnb10qIWSj6q1dq5SB2udvKMRbFdr3bHq6+F1sSoidrRL7jIfkGqZU6tsoB1bfEoDsfqsktBq0aykudspav9vBq0vWGoy8DU49uvbkak1IhiI7Z5RuAiyhaM3Slo21OBV7UqFRq8U7PfO7NXUiFRTtC2LJOpqWa2mpLt6awbwykaa7KW8JI00byeiuanFGBApvREx1KUTIWu7t001b0zSJasGMA7YYlkwbb5as9tntEYmcErSMBETprT12rWo9wN2rkybSboltMNqzamTs+93oZTp7SAywfAB8NO6+xNVcWRmN1NFTUdIh8DO+4ueklJWH1pYdTNmMzLXVRdKFi8y-2uRqnTcGXiFE7csvwID0qsvlQyfZWLrLVYzGQTr+IXGS1iOEGgGTrKhA2PbKc1R9IcDK4zjNw4y5H+Pu0j1M+Nw57LGjlj01Ex5pwaK6k-OyhSwgHVoKWyf2M-JrWdBuisTncZNJb0cztTC1-czGgVxDEvBJR0a-Ud0kCJhAdCq6d63PPfDhFbRG4C40TDCUSLyYhTdyKnJjGvAuu55qczO1UzmrCa5HvSmwSuijVgwJsUCI8xsu5lum7Ci7zW-JfyNugibPMgZOB1daa7DxDeXBppqzqunrv+cvfObQQ0kg5rsflbqZnFWwdmqbpZaki7zR7cpRdlouECoZbpBwP0SQKbD-MtOJUqvu3Nk9EKDAjgtolEy0TNC-KUeJvA2kqRLi7du4CnllNaHbHqS9MUTEXBXyVvxvCPUD7r1aZu5Wku1iNMOSXV-Y+1kWE40XrHm5LEUnqFbIe1SmNDDhTEIHK2ReKj1FlrXrDB6Asgopm7y1M8ECpMDMel2SUhErB3kKyZ0SISWexIvHzO1ezBWy2HCN1+x44wBMMt5ZcbPAqLE3BLPj4u-dyBcQw2HWwiBkiBL3N9yeDDyxSzA3u4SjeroW5IEsBYSd8pe-5z6xm2YzGCTUerRIGTOMo3W7My2LklPiBk3NlzNuArDn31Luxpty6gkbKDEwK2NvXtIHhf2KZoZ8wKl+1qeQ-K27PumboS7UeVrN5wUu47pcyeyPWg30aOE5NOsp49nwrqEEs4NsxkqNrnWFTW9LJ80xMDZsz1c+kltwadgLDQuE3KS1hESPe5zUti+A9XMV7hesiCLpTNeeh7kG0AULwTK0LGiew3cp1x3i++67tOAdaVoWVb6cW-xX7lcHeThEStHEPbjt+7rt36SsaLMpov0tGnWyO+6ngXi29UsOn6IegBI0c1MKkTsyZLFfpMCT4kJL9zUmoXs-7DzevRB0hfM9AUR2+kNE-J+9PtDbUvsGvpSq6+mLt7DK4rUXUr+6LdQB144o8B40bSXK3fqP+yuInVq6aMgSwfsAeJDQFRaDD0K4MVUS360elfvZFv4uiOtEIaD3rcx2hXqwu5jKMgdISyRMHHawHNZnFp7aRPugZFHyEMVWTDey3q+DrYhPQsdz5Ffpwr2HDNh2CImoQbPijQocltEDKP7Fg9D0ICvM1rQloTlaD0Vgb0GPRX7q8LRKUvuYS+ROuh1C6nXPV0GBkkDhLRi6fHA-QMin9ADoRE2iNIwK2TweYTuQvxMRz+Q3Hrg9o2crE6t6cUUPkHHegZIaDYMOkO3Jh+2ntQ5mQmzmPJ2qP3rWS0h4q1LRnsZHBq0chrnLFIarFNnt7rB-3uYSUrC1jkCMrMPucGcrKrSbI91OBpSGOkgZNCsL1fzQhcEzFfrUqYrbkmM5FdcIYgbzZEHG3B3LfJtp7vLXrl+yjKRshmGp6uGmXlDMTKyMpkXQ9EjIbLQ4WGHqzTYczR1LEjMrYpLZWXD7M6NUPYbDLFoIaHihpoePQSg9dj-4NSWnsPlOrf3K796MXvpsGBh9ck40688sjeFYh08BCb4OSkPnIZ0c4eDQm8p7l-V6-DUJ+H4hvcw56OyFgcaHZh6DHPRnQh2jpkV+j+WzFIcV3QyHY+wzPj74Fa6hTddM0jVp77WKalpCOeU80RGnUHKyPkIObcMvzmRwUngw9QUnCpFb4q7uv7dgP0mnlIORUnGy4B6TIPCXNOqjQxNcvoYiTd1DCO6DR6Yzj3CABmEWuyIuZeM5HxRXPQ3VIcMDSW69R1dh05LNfCpJ61R+PstFP5TKz+aAhwXBMCH2A129FT1D1peGFB5hP79qkvnV7LHsWnpW5erE0jsxpMPIrAGu4-LPzYNaGgpPdj+7oQ-LxhQ8sv7gR5hMSyV3fyi0Rv4sMfZEuOSgI2FjRsiGCzNuWZzCz-2QsZFduKejE7103B0f76gkYLlczAyRsnstaB6TO8yoxJBIDQyx5TNMzMaEMPs14sEwZDQDy60LsyiFXEdeGjsZzOf0OnPyltIvsAUZMt5SXwYdpBx9HNgp6mf7u9Y4yKEajoR+mhTA5XgzMbxGD0emGVxeuIgtwtjRUXMPQoC0ijPRXsbQh3Hc8+gNHoPSSNq2oqhxKvYd-cuQMm7mxnfuMzG1GApf1RSCsiqH2sdrHcopBE9E-HTgemH+cEuTntvAP0Wnpt1C1QCNXMdwFCeMymaL4VPM-LdLRwmu1YMm4DX41bKImT8mfSHZ-sZjHd0oRm3X3qKsYMipo5x-0YXH3fB32y026BNnlHECqRvapckwajAmJRk-NU00uVXQkyOm0N2cpCgn8gmFqqeieIho2aqhgT5cBtAIHBRucjoj05S8fnGmqYjG-6XQ8HCUToRA7gtwCm9dj6ENJ3DjByIxEjWlp442CivJDyS0gAqnJj0Sp7FsJBTziz46EQ5Jf+obpZ0NJy0VtI+hTbl64QgkKdJcUsuYT9ylwKKbSo+cXAdkGhC0hMIGTREgfNFx405LZl6inYH4MypzKr1Rsqu6zuSdFXNoKr76d61eS+i95LKrBiztpo9y24r3Lwq2x2CrxU4BuzlSwQOttGILAdWCbafFFtq6rrDHqqvSfbDqe2L9IfqfwhBp6fjUAD7fSDGm5VY4oeKGUzyPWrzgZaYoBgiIafWnGbeoi2nlq7dsXbnivqYGmTptadr49PTfEum9q66YUY7qo6dWmGos6ZOqj2r6Yemfpp6f4gMozafVhtprWxYk+lLeABmWAU6eBnlbIZVvbYa+9phmMACfkfbJUsGdfa7placBn5U4ICaiLARoBEAWAdWDghMCcICIk3a96RXFGgOasmNYvX9q6iAO6kpA7nqsDsLxYZ+GeNTg7Z6vNSzWrGr5geSpRDQ6xcjDrMQJ0dlu9TLorO2a8bOGK2gcC7QJEFKuvOmvlKLo3xGZrAkDEMo70BZNLG9no7msY7W7fmt1LzgfUtTT0iI0pW9+7Tju06wAc0ueq805T0OQmiSkz89wZoTv0hwKUTq3hfZiTtRAxpqTtdmIZ02DxiVpamLe9HPL2b7bYWMGbDmFOrYgjK1pKMpTqLpOU3NUTO02ATKnapPjM79IGmY9rs5+Mv5i7O3MsAdHOk6tBloHSB3EhoHdzvDrUSYn3k7sIaOq9NY6s4vjrGyoLvp8QunWMZ9b0yLrTrwB0eZn6yenburkxtP3IGy+dNBNb1MebdAjdkyDSfjybOYHl8pcoNWnjjA2DIZ04WZB31XnUKAUT2E40NSgnHdu-VylFTNPzRMneJ68dCpieBMb8qyyJ8YDjjnS7QN9gK+ofB64u54MkxMDRutVwNnS3vQmCDQMhMwCnVecfmkcV7Bfm5A8BIYqJ0cnB31qRnLpbH48pOlIM5yVKcQWKMAHkKbPSVebOFo9R7EtYLERDRCn-nesaXnxyfp2sHipmkfz7We7buUzAB0jEPc4C5MZCmbdAptswAqabE26r+1hfRy5ZRHGASmBrHAvmTXF4NHiqsSHlXmTAwP0hwaaBaloHZKnuOo4YOUy1Xn3fAbiw5E-VkKf6UhVDjj86h+FzSmpJkRa-HGkl9D0S8ccrCMTJAh2gmp8DIRazGFxy0Wo5MDZ2nGEUqIRPZJQ4p0T6EfUVeZR1WuJCh3199KXuA0nYl9EDEIcDDId7+h5hJvGhFPeY5JOLA4ZSEN62s1a57J9xavGKM95yzolqVdmp155wLXxxi6sqzn1V51DEIpSl6iliHvNWjKXjeubSjvnUh7MeKhgEwgPpDA6HeYM58ucajIp5SDSezR4XeRMOoRE7Jfy6PKUJNUwkBjSaN0PhUESPlRdJwfgiXtOfTtI9tHie6XnSVvRfRKWuCmvl44sbOfRf+hDO8QVl45ykERyBgwbI4B53ooVvMPrEZ6ih++bypqh9UjQw4i07OYTZhNLl2ptKcnC6WUlo7AsgZwEegPDqteOn0nqreYdk40aGot-m8EjHJMaxyHiiz0XlrZ2gxVaQoYnQwlj-WfRz3canOXcplzPu0ItVbAOXIV68Zy5OqADGjIt0C+bnAMqNSl5aQdRRcq1yyBXOIpS6-Sbc1c9GptKwxRuPowX-nGUTkD-0EtE16qV-jC5wEMMLie5iF5dnjo63PtDjQlEvkSPl0Mdt2fJ1Vz9TeEzQ3REBX4IniGqKGDGcxLJV5h5wazXscrG3CPJxpPFkmyPHGD8rF5hbYXOaLyeMoW2e0ldXdtdZHzI6kr5cOXrxqcdCdT1Q6kSxg1+hzl6N2EnXtX-uOjKFImOBzBeXguevwAX3MZ8jRXYxjFcvlZR7Kglwr0ayfd9KaTdCxp7dCNYZWKM+1jcp-czAqvIYlkbUxpR2RMSHRU1mK1ADbV8jHbXj0NTFKXVRWpNTWRXZ9AGtW+nKZCms5ZsOvkitOvN5WRR-SuNF1SN+dq7qtH1GdYMqetYiSVM-sJAn6yfKDLIhlk3Htp2nVbP3X4+tJZMx1kHnASCFVudbTWyVnjHYo+mwVonnfVkAbYro4xPUqWsRcLEcxWM0AeUrx59HI7Z2eUeujHgMyperQKsS9D2wCsVNZc1XE8TSdYXl5pqdjxhaBVArnh9Fad6vYz3xndgEvykQXDycAP6EjMIEaKXx85puFDFLa2JrMXl+tgCpUyCh2IV1V+yyWW2hBcGfJEFsPTArD+7guSWD1+thk4xSMejB5WN57sQVXRAjgBxvV79Zq7AEoBOP9nV9RaOGRlmRVvAsOI+Y2oX0AKjVIgqF5e8sIl3CwQxBsY1dArhyeRbpF1FghTHlxyBpiQib1jBY-lHYrNYRoIaeON4XbMEegvYRssTdvW6ey1n4cAg+RbmWX2HOPlll1KhJC2MF9hc3QqRLhfUXeFknCfd2KWyoYXa+5NrSrFFRov3pmi+GBqm2i+5PqnmxQqqamFeItp+t2pmyLLa1DaquBtGPTafxBe25qs2nwEX4AhSpq-iHMiK23ufRt4UhwyGLnDJSWJm4AP6H3bzgJ8W63et18RHb+tnaYOnDPDrdm284BargZFt7PgXbVqpdva3ptzre2qFtzdpW2d2xzw23gS9lKDnrt09sc8et6EruqptmbZvb+JFGdFS7t47c22sZvz0TmAEXEv0hAJX6D4ASCO2zaimZtmapLQOmGo5n9Upj3u2Cy6DopLQ7DGqG2+St5Qx30a0rxjsxZv72JriYFuNnryalOxDiFS-O19SiOtplsIevLpnSltZ5UojTa7Q2bo7QiHmpNmPo5jo7s0TNjptmAY3GKBj1vbNMlrc02WqDmAd1EAqJRpp7aVr9IJ1j9nUQBXcDnlPSXbUgsY-7d23G0vWtbnNOoMs12Qys7bjnk53tJME05yoQzm6qudJzmjOxMvznky-FHdrP7T2sM7va8uc9VK5n1TMlnOiWO3T8CNzplifdoJS86cEduYp9z0hsskM5p1EH7mwuwedbLh5whwwGG+5rui4jNjscbc4BqrBCaOF8zVEpRNv0cjXj9e1nYodOCLEexjF7PcV1v894Ti4MuRLfAnacMkfy4WsEqh710+iBLExesYSmj0yLQjeO7UROpK8LMQqCvh7ncu7Sq0PwzdmJa8+lTYVbb+zVZD0h2LPQ73ioLlbSKezHf2U2WF-VpyhPUV6nhw4uIArwTs9hZZTpqnWmicnkNLOl3Yi9STFX3N0Sno8sR9pyeaaxMbQho0RZKXpPAS5E5ZqpVaWNFf2RW3TKoo26ekQf3gE7LFW56GpydUzhSBclnQkK1fYQo0pPzVYppMWA5a109qbBxxN0VfbUTN0PPfkX3FxhfQW599nEriB2W+QpFeMM8JAXnB4Ln43XRKHiexgtwvYbXb1Pfcx5CqLKnzMV+1TXGtfxyxG3IIViJIHZjck9G4aemicaPRJ1Fegmp1keIqLXUuiBN3QYrca3eo39fg5jci83TQWExk7faV7V0M2iaz9-GRSCaz4o9HHpKN2OltJCl0ydoMM2crltIvEO9lp6ycy0lnmwOCVUMOINzXUbU5AtzgOwo9dw8FJWHSzUC0mWsg+knzEZNgo5CVkblPKz4kTEW4DXfPMfIZ94RZ9X81boQWXnV4LHT63MIeLRE+KEVycn8aU82qpfOAA497dXGzAbcezSGnKPRMHC2ZxuAqtlCOCe72lupu5cKob2YjudGPQ+Ka2LQPuFgZP0xzLJ9yq1VhzA74XT0Ro8nrjNe8333hVQ4UVJRD+PsGPzAozEu0RyfKHT7fzGuML1EBxNv72AxrUUKSW+4SiAwDjqtHdWCe5-Vo2HD9tDllSaq8n700uLPfJp4uAN20mIKIA-aJHCDdBANvMdPtQ45NV0V2bfKDY5bGo2THrIdL0AtjBOjzN2WjI60PnP6PrF-tizkseRbH-ZhRt0bTE-SR2OOy+sXHGaOKGvE9EUk45E--J-ULwu2p699g7EPLRSNGXGDufHFiHxc4jThCA0GixhPG98xBW5999fNG0z1k-czonE1NmvkrBs48jYjda4TGoCrUiktHkj8Sz-zi6mWglWmFwU7XRTCWbFgCeMPg+SPHXFsg-dmyKHicnYKLxASxTzbLO-2sLeUn-9FhbCicnyA-9BVwcdZ2luPvC2dDLlLNehblPF2fBpoVCWy0mlCT9zLAKoOtUCtxwlK5Q+O6rV2zF4x+MfWkKPRMG-c5IHhcxOZPNjucG4wHsKnTRFQj4UYbGvQrDAFOBj87KzpQdHn3otnB1DCzopHTChfM3TxrgazCFVzWMXf0LJIAw59YDCtO4aTdFPkP0XOVCPPRVMnPR5hTI48XF2BU9NwXR3bTFJQj0Cmqd5cLcgwPfDsebJbjnAal5D967JcrRLWayqF9NhZo5TIcQlnJ3DZ18PtgosEptkXy2rCk+rdae4rgvqtzyg5y4zKhDae5Dz4rlN1mMAq2FVtT6I6xPj2aLicwE0eLhI0oRt84pxUufC0rOwL2nEgnRaUd2TMqsV87So2sezHC42DoM+P1rOebWHo8cVUXrPFClzl+1QEjniv3UXEA2q4y926iwv5yV9GM5SsT9f6a59-tibjq1dqlk5nlrC-AoMMYLCpb7D75c4PqDyNtJxqeXVcYObQhtiDIBMVAaTb5FHgz54MqjDwzaWirNtikKtiSKq3GpnotYE6tj5JLbxt6EgBtRi1rc0ifbHQBEAmS4cXY9HYRInAQAANT639qwNTbbeqg8WE9zLxYpcNfgOy-ShwS+becu3Lyas8uCSClKCviAey-BL2GUYhcv3LklNHa9PW6dsu4rkK7XbUQZK-O2oruGqpNgrhy9oRD2kEvOBYr+K+c9gdiK95ToZ7o2KvwS3iWRnnq1GYauTQD6ufat4Fy5xmt4f6omBKr7K8h2f26HdZnYd9mZg6Jo9Y1BtGr3mdRqH+I4yFngpEWaBscaxgD8kEBQnfsUhOHrFJ2tCbuVVmk7JUodm5S86IZ3Q0h2bZqoTR6JjSNS+jo533o-iB2Z27DAVY7FvV6NFqOO00odmnZya6evxd84B6vp7JK9qvS0z5l-lVa8G4mmhiWQRquQ5sADyvZOnXajmiYrQURuVO8K5SuT7U3a079aoH107LpfTus6vax+2M7ibp4od23pYufJv50sudjL7Oz3ZKu4awspc68faGVDUKyiOrDSw9tBzYZI9zoqyr0bcLrNRU6pPc7LLMSWioGFc6q03RYPaEYpxTsU9Ta6CNr9b8PDnAOlKw8cL4TxCG6InHrY8sMHkGw+NNBfYzpSODPssy1gg0ES+LBPLWdBuo2UVkDXR7BpklqepPJ4pFdzXMOvVz1oxwmFU3tha2FKTI-lOFHs2N9ZT1W+3PDnAhXfQme3QIKpyFXOioVnKDNl1ad9gLDpGgXPDWnktMNBSvloA2+WwU-5KdkAUbMYE9zuIFYvzVoYFH28Od9SJ+RrkatXLHIVo0dhyAwmMKI9NvnSQ+XMsT5LArUGbbvO8wU75VO6MPcXIg2Xld2WgrGOWea9jAst5fbVEbwJtkkEbR5AmhKz3savxnk1Qitb3AH5balaFssYhXVJ6ZFu77O-yEMPA9S5XzhFIIsFHhrkEcRHQbljXPfemoj7tOW6CrZD7SCx5KfOT3c6XEBrDlX0U1p7HsxHihjlSyDNzlu-ZaN1YooB+UkIoe0FrK5Xs46Okrzn73ihWwsE9yhrd8aJs9yTejgVs4u1b6lw7M1McMS-NxmquS3n4lhXP-RiWzu6aoTxv93BpAgksgYzCG4RWFVNaWF2JoQKFpq3m5bkvayxCRRHW3jYXQgubJicikfplt0dzAKbv41GLFcTDzA0bYMMMHHpkQcccl2O+6ZRqXv9HCYSLYitZTlFzoRu1yAUKaO1wEca7uxw9os12-ZkxLtXO4wV3SBZsnC6K-AJUx5cCPwW0VsQR9BH7SLvwOximsVw7YG2R8iorZrdYOs5eG6eUnQtV3R4lHYaQ7lPkOI7071u6DS1kVEK125ZCfVScKh-caqa0TQVQhy7E571AhJ7AujncjAyogXfRNwKIE-xquFr75CaUefKf9QAj91NBVopAFKNpDDsuhh6VoOzfvW9JhGtUKDvVKYMnCoeyNbBHviH92h-Hvscej4p4Cm261G6I1jMvActtJssxnc7uT-c6qStmCmGLApJqabZCc5ULYXU9TpEIaFKcBz0n+cpq0xcTEI7v4s4iEH2AaHLQUSSRry3QVqTxjDDl+n155dII3Q6j5GWzvclbV9yRjCUxmesV0TJ65CXCPk8Q3At4KVVvgJc1ZnyO+IgCg51hKCKsJoNks68goY4C9y6x57QlZC3F-Ua6ALTQVJXcrk04SMaNwUptw5Tn3mc0WS2-JoA2gp1FSD29FKmWAcqYFfKp02GEMyt3Dz0ue5slPzaZCWrZKqFDMy4WmBtyy8fpw1WqsLxEiF0AgZcvWYuXFgdqvAtrEbNK4G3vL6Pd8uNi0toGrurzV8VBtXpOaSv9XyK-en9CXFOB3rXrYvU9N8RIgdfUri7ZumKUjV8XgbXnK8BvvXulL+K9pqz1dfA3917s9Tq5y7dfbX7CFBnnL0N8uqoZzIwDetX97ZGUoa-VS+3Abl0ExnPqkN96uCCT9rWUJgTN6Dfhr7SXGuYdjmbh2-ruzxGiC36N8TeD2yaN1sBZ-GtK87+RO0+UjLnHfkRZkcNS2v8E7LCbo9r8SDbzDr5WbDTTr5FXOvjrvG-OArrqNJuv1Sxu1ejOdp68TSWOlNOFrrZz67tnvrld8dnRd2GpdmEbx70hj7Xg1-+vhBUYi43Ib+XbCSVd69-huvX+99zgI5nG-13ur1N8trO069+-e0UlYjFNras3f7Toygm8zm77Tbdzn7a+3ZdqYUD+3h8EPum-lMGb71SZuQZUstZvA6xozDqUmILpD2kZHztPS+DCPYC7JXqqaFv49lOsT2jY8W+npXZKURjIK2IdE4oJ9FMhSmYxoh6xeXSN0kwbzNfu5Bp-SNzI6oQyB+QNICDY0mbIbz30lVIrSKXL417ScD0hfCaBUmP3HKJw63kbnUDXA9Z6NERvIXKwujezV6EnnFI93R4Vc1c1lsjdvo7n9hAMjgrfbJeCFZ7mXk-qMhv2oCDGunqPW1aNyh5zMpXLqS5bghV6FFdJalHDo3aBTYp4sGUZrdZEixwUoe4r9TFd7zDEQjd30YDBMfl6M+dVpl5RIMVkgyIdSboNGpL5yhOSNUjXZx0Cp+yOMcRApUKrsevU01vn1xzY+Chu6gN8UN0bJiwNHUZ0W5dyyr9HorhO3KtZoW1SiMokaYrXxw5b72WzFCDs7jvZJvrHBg5MQjRsWPZqG3U9I7tbwIduAW3LAI4NDiuXm+GdFNnK5A-EC4GePWOZ2WTKKYhXKhB6RjFzk+fCJpNvXnwY73yfXYDBMapM5ek1XesTlfjOBPrspe1Ym2hWrUgxRa20IAFAbDS4Xn2x0GPcTtMmNEtSfIKeo-yRtlPUTwgFtqTKc4VwIi+zXymvlXsWcnq+uL8xAIpycUzCmomyC8zUmGnWiI++kfmLDrp393lwQy2yecLxxNudUgkLtns258pLHOHVNIQeFCjX3uG5PSdpMX1kklvWsaW+VFVT454VuuX0d1kcyXmC3r1AtDxwKs5bxeXpFhRkE+04-7p1mmwnyA+prdu7ix0SGVCvo-cfi5eHHlCFhm44l+wAq-IZD+6P+RBftw9jSvIa3dS0KC+fanVawZPgg6ASLaU3E4owsU9GxxTCh+SjJEdONB44rM97ETIeP+bTTJGHVKrOT0qgQ00vBb7S7FfcqiV6j2iParcHfmVEy7amFXxrZUiup6-iDxepreDpnolY6qb+nLlv-ARlBSaaNeBWE18TqRtvy8Vfio9+n0hW-hmcWL+2rv57-pq3T32mDPCf6BrF8BapXFu-q6f+K-XtbaX-2-vhk3w1-2f5Bnfirds3+Pp+q-OAd-i6rij7PW7Yv-6Z5f6P-D4eogP-nt8-7ABL-7N7vb839--lBOrqSXH-1-jW9FJOP97-rv9GZiNc63mNcG3hNdUdgdVpriAC2-lf8prijtc3mjtZotjsZolakxCCtdY7PyUMAYdFmvH9g+NIdc3UrtEI8ATQZZtMoLrme8F3kCZNZoEZGdpddmdq9cOauN5uatu9Hrpcw93jzsDSke9jSl9dxaj9cL3s7MAbu-8vSjLUPZjP9vZmSpe2C+8ZASKpMYn1JUQCuJxAaiAfSqMQX-kjd8Yrrs5ttHNlAYACMblIDjdvoIU5pbVzdiLdLdkTdh0iTdiWGTdrARTcUPimVuYtTd7AbTc3dvTcK5jh9wSnh8Q6kHU-dvh92bgT4m5sHsW5oN4ebp3M+bjR8y-sNtMjMLcaSEx8Oytd12cGvMQEjtcvRGlIutEi4d5IIVjKE2NrHvHkG9CxlTsNskBAqycLZPZp9sAO4eCiBoK1mSdIDMAk2wnFxIcL+RQvv+lvZHH81+qJRKwtXIDyN0Nk6EZRYMuyQINFtRMrK31u9DN94KM1gcQoMCz+taJXsP9gZKqo1Ofs4d4LIMC55L+pdtCpxTWp2pHzIIcikgXtBfguMsLAhQs1u5QYuCio2IjWZ3uEs99RIC8n0jAtL1PX4nyBuQ6NJppkFtB5Xgh3l3NIAtVuMAs3wmAsKDJQ0Pwtd9XnhPkoIs-Nngan9ThHLJqkrfNa9gwUgML1YMaBlZYMGn4r5g5MbKCD8yMmndUJpJxUgSCtqHqUCoGtkCD5j2s8tqpcU2g0U02sVstLqVtT6LVMnrJVty-oZcC2lX85XgpEP6Ba9hig39xZh38tDOP9YQJP8yUrq9HYCuI7AIf9R-ksVfXp-BBtt1NC-pgxh-nX8u2qKDBQQ-9JQdP9lAeKDHXqf9nXuO0W-qqCwAR69n-lqCfXgVc1qov8DQUgCWbMaCJQZDN+4NKCDqgKDEATdsnQUKC7QTaDX-pkYVxJaDP-p9tkSvqDnQegRi3u-8C0kADrbP1cWAN6DAwaSVa3tAD63k29oajADUAXACW3u-8fQVB0+ZgmDMAXB0ZXrB0uSiR9MdrjsCwUO9PIH5ICdsKUQBA9loHKQD5Zs-FCOsdEadkioHZuR1qdjgg13mqVOandd2dhwC+ahVIeAVbNqBPzsxasDEdAee9uOmLs6iCyYxQQJ0W-iaCwbvLs0pnICt4JW4PSqKDQweyYNAXODtdtoCUbv+9NQbaDCYuB8tBGKCDwXa8ran94bag7M7alnMabjbtHakh9bVI4Ci5s7sS5thAF0h4CPdl4CA6gECt0hDJCPsVFA9v+C9UGR8Q4OEC-OnHUk1LR8RXknUGPhF0DWPelouix8+Jv85x0O1hyMBhFe-N3Um5O+w3KP2goxEzlmmnGd+sLxdlsBM11yFmtUCvbQ7gYHkknvJpC9Aeo15Cs1BSFWoCeNslLNARCu1K1gTKIdxtcMfV9fLvp2tNTxQKkzkhyujwAuNYluesqEO2KrgtKCGQVaIQ9sQaPddxjboNSFTROVqw4qmsm4hzB1Q0aCCCn0lZhh3Gc5BVrrdu6h2x8IkN0WsANh-0oMcbnH60-Fjxh1sj-U5wjxpxqEBg+9hHdkgWuhTOHdQmMES9xft3UAjqVQRXPCtu0NZDRes2QfWCeROrHxDR3FYU6kgEFrIZ+Qw-HE868u-UyIQFQMqHZgXKNRC48oMcQ9CuxpmjX5hcGRCdmsfI5NMxRZfhxluyomIKDMup3ss41X1HNxsfuhoDDvkCo2Py1EFF9gF+gc0qvtaJ33Lss9IYHlBjrANv4vw5YsKXEeoYTQYiuVCaaNZCLIAZ9XLPmwnvkxDauCeQddPhDMMlZgpBHhMNZNbcIGkcMAFnM4JXIfkbvkkV80OyJqZP5pkcNlgyIaVwHgvBhnhJtDkNDhlGsgNlwGlPUNRvmx56JtRgnvkCjnOBw0IaschSJNDatN-ENHE0J+njn8Spnn8KpgX86PkX96QeVs6pvpdmQa2Jiqi1NSqonha-spFuQc1t8AY4oNioXgVxFJJ23vLBO-soCa8Oe1DXg6CvLt1UBPIP91itgwuQRNtx-iTCNpqKDKYdqCI3mcUKUsTCHIKTCttvv9OYaaCnXm3BDtqKC2YTp5n-sLCw3if9uYayk3-nzDKSC6CJYfzDqrhzCqYY-8KjKzC1YZ54nqlmDBJN-8lYQLC-ti39S3hf8pJIHBDgBDsYwQ7YDYX1FEvD1F7YYsZG3rACO3vADVYcrCMwfNc1ri5J+3ljt4OitcGvHHZSvH5IiymO9-2H9R2vrLMmvBTVuSBTsfUtQDRwbQCg0tHCtZknDBvGu8aOrddG7Du8uAdzs5vAe8+dse9AYmt4s0q0hhAc7DLSpODx-g6UpdnaUNYdIDlwaDhFdkswW4e+8VxHXD1dkLDNYT+9uTA7MDVEbVO4b3CwPvHNG4cYDzwZGVoPunMGYnbsXVLYC54VD4cUAqCZ0i+DbwaXN3AVh9PAWaZvARulyvL7s-wYKhd0oBCj4VzcHZmBCqPvWUogQLd4YZrFtYnHscHCGZBYPg4ouunV6+rg0u4vrdW1HFxbyLDkvjugpgKPuR4XKLoVliepC8jBEImopMmtIkkTcBa4+BkptMTg195HJVRoxrb0a0PRhkTrAMUFjTQr8qAjcRHYshSLNZTwOn1iyPFxcsHEsFIQJ9iHoc57HPLgL1HE89liQjN3GBFc6FNRKEYpCcQQFhA2HMIFSGPI1KN-s9KLohMaCy8QLrPtOEY1gVuEdlkyPUDquMidfxlnQTKNuFREVkdKfubF3UHZpudI+RtOLcdFhFpwdghU4DtB+c8ErDR+sAjxy5NVp6DsZoQOGhhb9JDh+hCstmmqM0FHoFQEpuMdl6PJQ4yFHJJhO5tBTu7RqwtOwpjn-DbjsiC5NOpRKaECNeXioiZ4hwdyzG6tHCPNxpvvfsV+s5xHYig91AsojZzpmg4qLicu-AqRhSIecWGj-1QImosNJpZRFyO1ROyKBlv9pl9pqIr4uxhhRSkY0lX0tuRPhBzlkjrrIieCPRdcCJwNJq+4DwpCM+3A6cu1DO4PmuINekQPkXgv6FxhPD1Mvn6xXJnCJxkXnJuXClwuLKEdjRHhkOyCf4fETEcAflcso9BY4ZDhr5P4lKI6IpE1EEaoiWAI7Jn0BQplFhcDLDr8I9kaU19aGJci9ptY4kXNwQ4hqQkkZYcUkVOt9oukjlLvltOLtEiIkutRLyLOhvoTnFlhvOpHyJAYXyEZwVlggZE-Ka5tyEo5oUXc1NOAcJZrIije6s+R7KFAdjTncM4XPXkeKHOQ0CucjxERjhy1PGxC8pJkoEYLh62JAYfaPqISQjiiBOLUEGnGydqcpYdURJ7dIcIZg2TissLyNmJyuAdQp0N2dncsIdHRKSiryPStQUd1xEgkN0RUaCcV+pIo+BjKIfWBTghUVV9YIndRJ7ntDnBj+VCKIVQz0CsFtUThD6yOPQD3P5Dw+nLJ1hO8IImi1RC1uBssXsYFDZLM5RcEd9MKLT1sBkwMjxqjRRXBSilIW7RXjpSFxMKrgJsIWNtkrpk65EWhrWHgiW2ApcoxAhRbhgwdPHpRRcLKa4PUXgjdcpAZzcLzhlfmmicDnW5BCuhQ5UfH02SHBwLvgpQW7lhchLLsMoqAlhy0S2N3aKAktyDVwWOLJcxsD7FExIC4VluZt4eFsFvMCZDbzmvtbmjHdAaO5CXUV3FQqI2QcEaM48tN2dfhDQpYnE3RC9M2jfEVhYTyt9hqXvmI1kbnoxMAGhdtEhckEb7cP9PF9T5u1geZNoc0LAFZ8RL7RtkchdiIPjl5IQ9giaOmdRFF-pCaI5hH0aeio7gUkWXuDwonPYltDi7pY1jFlsMP2iGZEi9DhNeQ4cuH0xzEKRvMJaFf0Rci2SCJQMRDmR6mIXp0zlFldMpOYI3CstAkjV9Cemv5IzqNRIEh8JU6Bki6NvgpjnG9RksjDlKHskdfzMxxBsrAEN6EYjOksWQCmrtht0JlN-4UaQL0AdgkGlBi6MDIpNbvojslvPlX4q+hoMA75VRkGjqEW884cAolOWhOZaBjJjvyAPoPuCtg8EQ7laknIshyMEibXLJRCzge48Eer9a6INhxvj6cuLF31oLhIlczi2iNOJs8F+r5wLZLcc7aFNQ2KF4VDEUpjXUSpi86NVwecIlRFfOmcWqLpwz8uFtUMZSjDnFxlSyLFg4OO05QjoRQjKNuEatAltnMb4izaA8Iuoc+Qg2CWdJsK8FHgaTgHESE1EPHE8t-AUj7uODQJsAG4-qBuiYjkc4Y8oC50gpDx5RqS5aKGFNzxk1in0Uk8TgW3Qo5ABgsLmPJorE1lf2Cei0MVVwFclosYnLBcPaDiFGdCw8FwNqj7-PXJrhPdRuxgthqtMQoAyFtQojmIjg0Ypg9xkxFkEgJwtDpYc0Gmyc3+tGMERlxiBks1QiEekENKCxxDzpUF+yo+sb4n1i-0anZXZAftiBkjQ+OHqNzgTFlGMD+xTyA9jmEogUqqErp5NIlR1xuNZVcE-oonOMjFuqtxvMPQ5DzsrRBFjpCNvj9iLkTBZQHrFYePkw1bUQAi2hCNZoXBpMPPna5zfkQpS0D6iYUaLoZzLrRPGhHdlMVKN3uGocFtC5omcYqMtsd09FMdliYjtyM10btgFhCvFycbOxa0M+Rn9AgiRcU+i6RjZQpRIyMpzKqiPaLugMhuyNtEBpNvLFnQFLAWglqJaQMRlHIKRtpxd2DTjcRCiM-Ks5QucBiNMREZwrKDiM9caCN5FiIknaGGEMRsMDRrBGJhIVDjZhkJiA3LxdtqFCNfhi0JbEYCMrcdhRWuMLQTyrqt+LM18hLGLgpsXFi+wrCiaLC79QNBiMmLPvs6xtnRFkXCJ9LIvluzkRYi+sZwKcOwjxRk+iYLMnRoXNzJ8XtCiDXBLgSqHXlYscdj3gL+ZpsN2pxKLOMm8TE8N5BCI2FI0iHzMIdFRCk9jxlzltKJ+Ym2JucAsY31v4lUUwsP2h17s4M67rBZrzA2Q0FkdjlMRdBEMOLhNBgFZS8R-oWaBeUesC5oVlmOYWKP7oAFpPiuKLy4MHoFQVlgRR3joKtSKIWhoUUbjQDjRQCcWniRqHBR+euNx3KDIdUKuhRDMFhQwNhzjAsetQvyF+lkWjiFuxo4kQKNuh4KL5xtUeCjryL01iESv1QrLCiEKq+QZzpEiJ4tDDCttSDVFCVtBqjpdBYDm0UYV0UpIjVt2xOyDi2pyD-LolIqqsLM+QSDZ9IBPxxxArBiACNNuCQ4B1wc20+-gioB-jECFQea9WCWikXDDwThYPwTjAYIThCWO1dpiQCXXo7A5CXwTwjPUQJ+EISN-vLCDthldUQJoSqwAoT0JKMRdCcoSeJMf9H8AgIRbCYSzCd7sj2g4T1YYQwUcHVdMjC4S9YS1cq4S9UJlFvA5CUW8ursYSHAObCwABGCvCbbDySsmCXYY7CeOsEwJrgeIMQBMBfYEGAAANz0oB4B0ABuxSASIB2AfwBSAXD4I7bgm8E0wlzXLt7o7OUElg-MFVE7MFyEDkp5gm4ziQTa4Vg8SB8-eDExw91KbRStz1g+d7qzG1AwvJd4dePWb3Rc4C4qJ6IEqaHzTeM2aVSfJAsAQpCCQSlSlIRqTEqYcHC7CuHjgy96iA4JAzg1EA7EuXaOwfYmiqTfCMwTyjvvCfhY3RQE6EuwCXE3GL9ws96DwrQR2AcBBuzHVSaqJQnhlP97PIcwHnSWeF5zeeE3EMdIu7UzqU3VeHofB2q2dD8EAOL8FOdf3YEfQVAB7Yj7LXZuaR1asoUfWsqXw-zrdzaIHyg69KwQkW4JAxCFJA2XBbOfjZQPY5ztUSb6QIqU7urT9KnrRH4OBLXB7CT9KQ0BkmZ1CyBSiXArK4MVaTfdH7APYVGrudWQ5Pax504b9gncV7q8kiGjrZD7C10IgzqyKx4O-dtDZoXCwmPKrjrqSb5BUC3o-oJmiXqNkkV1N1CJURLhUPSjiL3CUZPoU-pXsHYJuPQ4FznDajGYXAomBfUQRLDWQ5Q-UnOcVFF0cJ2L2jEUnM5AKyvcHFbotYyjEGUrKG5LLE2k4-QLYBphckuHBJLRUmroI3Q4WN26SI7+LotaOJJk4bjdJeUmpkhahOFbLRpw2agtOdc4AYQ8hTojhFYvNdCVua4RCk9ALvYZXAxZKklkkujhg4Usm5-IFEkEviIaXK5K4k4+hUEr-il-G+GzFaV4yRYy5ME+rbYw7GydTPGFIdHqaEw-SCqwfCCiARICIINjyb4VWA14G969-GmFdecQndkloyKgnGEswx2DzksQBLkkkqjVI8nrkrmFqEvUGogY8mLk5cn6IBaprkjcnPTfba1wcWFbwO8mnkpm6X4UYjPk-K6iw0q6ZGL8kPkpwnlXMAAgUs8nlGeoj-kjwlzkhcnfkpq7a2Hwluwubbf-O8lBE--4XksIkRgyClM3Bfh2w1Cm4IOImjXbfi+EzmbwUk8mgU6-4oA6WpmpSomizNa538O4wDvbAFrXMsESzTRCU6AHqKlLol8wTES9Ek679E+nb9eBsFtg5gGqlDd6dgrd7xpQgQFw5cExIGqTrMZYnbMVYkCAkcGDeX65EUq95rk3YnnAWCnzgvJBRoVuFgAe2irgz8ldwgSAa7Cykvk+VT3E0cGPEucmXkieHAfAynqdB4lQfW2qwfK3bAku8Gk3ReHsxJ8HOAteGuAvynkobMq+1FdJe7a-7JCE6LB1G4AXgk+HWpEIGok7zpZCcny83Knz83QjwSEvEmPwllKfwF+EjzDOr6knZYFY9gyKNGSrK0SjAxPUUoKkOnhMTd7hFOWOjbA-5zLWHrDMYa7QU-SlE2Qk6j1kVpJbfQ0SSKHeTlkOZyXxOnh1uMrARQ-8z8uS-x0ieDjBLCzEAtRNZCcC9gdaWakfxJNZFBOtzotIrQ-kBRJfoRNydCFyxlkHr4Z5UCYikuskKVFjIY8Cw7wRDPSOiZ7BNBQzAP6D7hxPP74wYbYFHDcLAcYjzInQz76SKBKi4DKZyN+fUi2HbcKjxKHBzqGZrMUeC4oNJDQutPWg3hAngcXSVZgXRcCd5Hkg6cA64O+bYQacfdi+UBahOiIyotnB9Q5YQoKN+V9Q84Y8jho9L4ik3dTw4WmjCkCpqvA09Q2UQihNsf6lI-d56LqH7B1yKiLrqHigDZBpgs-RkmDqfXQYUY3KX6eCITqdQIGkGdQHAjyGy4RtRt0BDJxsNtRdabLA9qbHDj0KvGgXHqkFqegzFqJgya0m9hikVbo1qB-RY-Edho0DSgC+L0RvCPOgj9SqF3cdAx7mCqllWKqkGcJfq-UIzD1U8kGUgvhTqXfP5dk2+GUE4v7Ztfsk5UqV70Eyv5R4av5Ywlgkj-P4zsEm4BjFZv63kxIAAADzgAMAGggjAB-wXWyPJVeAAAGh5dAKWbAdyWHTXpFITk6YTEXDKrBs6bnT86YXTzyZ+TS6VeTh2hSlG6TnS86WUAC6doS-yR3SRYTqCxYUYT9KU3S+6WsBW6Xv8YKcPTZYVuTCrkeTJ6S3SVYZ+SV6f3SZ6dYSn-kPSy6XBTl6b3TV6d4SPtq1d0KdnTMKV0Z9KWETiZleJYkIkBIQJEAmoj3Tm6ZvT7bNES6KbPAIaqRSPbORTiiQfSX6dPTyibDUBZh8oA4TEI1rrkwWKQTVfARJJk7GYh9cNbEp3mIQBCoJSaAcJS6AUMSKOuJScpJGkOwWwD7rj2C5KTMT+wYe9BwSXDBdmXCuOl1IJwUoD9KbZTx7JIDbyfPSEYvpBWhCZS2Ge+9VYPQzN7NZSmGXvTdajuDIPqjc5ycwygPloIuGfwz3KQ5TPKVeDvKVYCMPveCbwaFTDCcmULOi4CFGZCSt4Z+Cd4d+CwHPCS9GYEDZYmfD94eR90qb51MSRBCafD5cGfPlSh5vBDX4aPMQUcqEQRAxx0KuVx6AYaIeILJQlGuGFh-HGS1LE6EjceflR1LU5Y2F0cfQq6TcGvoM+NLPV9sCIl4nJaF9KGnZbQqmElBrftysApp-+nm4ucpoMRgkkNUmQ-4KnJSImeLk5pBoNhZBs2RUmWiJ7NP-wnWNiIZhB648ROkFNaISI-QqCIAgoGEweMGFvGXCIMKBGEA6QVtBmam1Oyem1dydh4I6bpdkYVBDVqkOT0YUrxMYeVUlQZOTBxNZcJireSRAPeJwSnMU-ya5cR4YeD5-v386YbCkh-rXSlmYtMjyRsymbmFdPybszO6fQwbyfpTLmQlcnybcyR6QYT3yePSIKU8zg3hBTXmQvSCriLZVYN8ynOke0gWWQBNma4TbyX8y03trCLmeCymbs1cT6b4S2ro8yyABfSpUr8ycKeW9SCGCyIWUAD36UB0HYfGCiKUsYyKSSy-6Z+TgWcjtMwURTu3ktdwGY0TH+BwTGWRtc7jGO9h+jCskGQoRmcLO8qdmJToBCR0NZpgzWwZ4QJKezVWdl2C8BA9dewSSpKpOSpapPVJqVE1J1KesSFeJXDtKaIDVYLcSOVA3CbmXszdvM0RRiLPV2GZzhzKVCz4blqz9WdhBf3gPC9AfpToWWIy5yQ6y3iSYCviQCgficapLAQFSbOgvD-iUvDPBI7BnweCTLVJoylGUultGfmVvdnCSD4a518fEYyUSdzd0STHVwIV3NIITiTq6Vqx8SfED7GcVT34eBM10HtThzo9p7NHjTInHa5SyOdTTSejSCKBhhY5Btj-WgjS9MuxcQyH3RUyXzgazFxRwsHFVOaBvIEMEXkjMFWzT0YMdhnl3IZ5jXQLKjL0K2P-watHa5byvgUPKBxp5NBOz56kOg-UZ8CIqrwlJsMthZdNpV4FAT1FGlugXdMuUeykhsI8ZJDDRPFUERKOVkqv4z7KojT-KlphG2BOzT2ApdHzBU451Os5AyFRcxaBOzIOB44PKuqQuaYyTM6ProhSGTpzKjMJLKryN3hEIEI9JB4NKkbjKKBOzdKlqQKFF64bWtcIV3LeBScBOzvEpegb2OhDImfmyPPh449lprRIeKWzd2HkiucJ6JRaZnUYNKt1fKE0E1KPy5kNCGRLtN2pHzC7TI2D+o-KkEyANHRoiFGBpv2Ky8WyWjSh2Xep-+G+xdsPRkCNCRh31PFxP1EodQflZxMaWu49hNs0vqai4CacxQAFliDq8T1TPNqThYaSlx4acdTEaaCIKyI0tlygDxvwnV07XKWzZOHpUH+lDT9ymJpwKMaIG0J9TS2dhRT1Dxw-qYY1HCOQZkCeATHOcaJecPBoXqQC1C2b00ItEdT7qWWzVWtLRjqEQT+XoK9KfNdZM2hMzqCVHS82rHTWQfHTRyaZck6WcylXqnTGKYAwM6ecA3AJcBVAFWAtmSKCt4G4BYkFay9dgcyxCUcz22nYYmYdIT66UpIaueIA6uaFdyGI7Bmua1zoru1zIgRSkBuUNzB6ZrEWufoTDruaDC8DNyFYFsyFqmNyAKaPSgKZrFauWty16THs9ufVzIWdVyFufvSmuUdykKUjMkWURSUWWAA3ACBB0WfNysWf7YK3u4BLuW-TmZgkTiWTETP6UmCP6czdUwatzjud7CKiegC2KYyy7+McZvJMWC6iU0TiYOtFWicFI+NDeEuWanZVuqgzk4egyg0nlBRKUzscGfpBxiYVJJicvCiGX2C8kAUgikEsSGpKpSqkGsTy4WqzNiSICa4aNyBdjqzGGadzxubQBDWawyMDkuDUQC2QzWadz4bptytAZHMhGXuDOeYbtWeVzyDVBB8LwTIyz3teD4PhCTfWQ+D-WS9J37HD4rOsoy3wZh8w2dh8dGbCSfwX4DD4TAyAIUiSLUilTE2WYzKPiMzU2VYzTXjYydWHYziZMx9iSZrhSEZs8uSJ8JO0ckEZKBOgR6M5QjKvBxuSPN1rWFkyOvoromNv5QF9IRNRsgdYbZD+w+0MGJB6KepoPElicyGG1fIYpp-cnV1gHgD8D0ekisEWG1VurFDzsJ9wzvnNw4xM8jSXrezOMPeY-KJz1RyNhhFrLJDqzJMI3NuRpJhEi52sCHpyLrNRZ0SZYpzmFRyNOIFYnrL44yAWZ2KN0FScAmx6Hp99aRNUVCaGSdLXBL9s6M7RcsBJonMeGT20AqIK1luogfvvo2yHS4E0NNgZyOHcVOZrg4qP5o6MAtQ-qJQs0-rCF5+VXpgyG-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-Lv-qmUX5ZzEwifDNSCNaqBYQRSCWSzMQFblL-uSyKgKR7DZ5aarQecAy4FdDze3g0SORbjUiIMHC8AQjzGpfYp3SP+Q0eTM9KAdQTOpUJSiFUCYLVgwCM4azUxWdddWAUbMCGbJSVRXQrC4bzs-oowrS4fbM5pfqK2FaIDzVZwqLVSwzHYPmI+FcsqBFaEShFZyrGRTazrpZLyUyi2rHWUqqrpdIybpQOk5Gd6ybASorp1Q4CNFU4C0yuozVebor3dtCSjedXMESfoy06UmLCfCmKz3tYrU5Q7zL0tpLRuffC4gUjK3ea4rrFhQdmusvRkcFtl2Wrzj-YnuBelnk5oDLCIops5x6-LdQShX10X1dmgQKpQonKjaQoph65BzJr5dJg3E8Es612qNwLyDMAkv1ai57WnhYjce9D1Wq3paHja4MMU5M4Ml8JRBu5RUBXoN7zA2wJhMCdQRE5MaHBG1c6tG08EoXVY2iXV4Rk8dxLqugghj61GdHZDYhoXUFqPrgbOMIFmNa8ixKgUkpRExsHWm-NYNYr4DyIS1w5fPjmuga1FuKWhjWlL1zWp75UEcy5vborjfsRjTSLgf0lOdLSmhhq1SqIUEm6NrggDuPV82GK1Tlf7FaWlK0rhK+hanpgcwwhy1xyJ9lrNTy0b2Hy1wqC8iYkReLutBS1lrDrhZxcqFJaDUyGWpaxU8RQLj2M5x7qKWRC0GWRlNXi0TdBugYOD4dZNal0YWp8JDODWh9EtZqkWoFoONq4cItcpi6cCRs68bCMRZVPUA6EOx2NDqFT0Css4qCM4ZFFTRuhm5qbgj34ydH9QiMY1x2NC5oSNCTRWtVcIfWI1j4sL-jItf+ikhWepalkaS9Bu4VZCgFYLZIlgoMTtgPuDPNjcK1rh6H-zUyBaMxMTQULcttRRKNZrngmxRdaHpV-MZpq0MdZxjNuQssaJlZrNXiD2NATgvSYL1p0cYitRLnp8muNw7kQMNmmiD0BLBBwQEQHiPHh+x9aHE9Y2JHymho2od9CApp1ODwcUflg6qJpprWGTiIdaMI-hreRBaQJqfNQLRIsgOzzcGIVioXRq5ZGGEp7ntS-GQRdhqPxNjckXoSfrQMf6n08t1KmRvCs-jtdBuQ-yNTpKhnRqTsPkrf1MmQCyO3jd8eawYqksItWuoFrNd+rT8Qxh6yIdiVEX-iRtItT6cm0iBhrRhXsG9R4sPRhmdbewe3KxkNco90QphWZvWL7SVCkVroCdT84yADwDET5w-NjG4Z5teZiKJfi-Ne9ql4iTo5lkBVVMJg9WMpkK0tV4MlxV4hmsHxQ9nFbqwNDXQ5dIRqrcRzTWAqV8PKFbr-sATRnsCzRsxBpMSFkUECqKMl-FjwsMpnscOnDyFE9ZVQldGZYg6JhdSEmUjvWI2QK3ArjydYbgWdY6JTOB5ZslrGh2SCfFE9AbRyUedq08YfIocraIXNkRqBhuaxIftvdyhvx8oCZXEmFORg7vk0FUQXRqs5HdpYrBeoY6PbqPwtJsGLqH1rNY2oAeLDk4KHxQZzrRiYaGg1p3PeUXnEolrwGJoJ-MzonGuViSgcC40aBMI4Bj3VRFIr4OyLsd+ddATM6B8M4yPgtH+U0NvZHxo6fhjjt8TLqxtcRAXygVQGRPmJqzLlrr2OWRTSDgc0RIOdjRKbhCgsYMFEABqPaNWZ9xsYVjdZQcsgiZR56BbJh2FL1nWqWhvRJlRemUAduKNYkoDBCiX1XcIA0Ghx7SBWlAdcfowaY-t3SNTpp7kdhnWpyd30KINP3Awb20PerIaPI1CWsKKz4q+qwuD6gP1WDhAURSCv1k4zYTm-su5C+qPPivNeDbtwtKATqRDTAiNfq3qADW6gONrQM4MIbkXZfAKLkWuhsnIoahnkYbXZVpqlsmnq0hjokPtM0cCaDUquRlr9MKJgc-6nAMNwDvl2sGZqi2LEMDDe0JAzipck5cYbZDZuiPaEmIX1TDit1IOdRnIUr2Db+ZujvVq4aNNQX1Qt8MDcYiYLId1zDTnQ-9ZkjhqNyF3qOYaA0RkbOko4lc3GkNEyHEyc0ZpolEhJhC4ps0VDTDRS2ELTzDaJ8n9V3FByHoFzDeZqOja9q19kBYYNSBwk+szrGMEc8IhpLQDwvbr+6Kvj2DZZQbwHkbt9QLRLRKHp-YqDhsyNOgcUXnRWChEMykYHQE0bPV-DZZRMMXgivHkol1jSDpFHl7rmEjKRK8WsaPXOBwVljolIjTBrojS3q0Bh8aZDbY5KDqocRGk4UmoXAN1jdOoDSKIKTMNLr8jUJrp1Ghpi0FppaEg8asOjeEvEJfyh9c11D5B-zO+WidjFgVAq0EJyLvqa4+jal0sgvcF4sAcll+iIaKzO6s1Eici2zjOwnDWCaK1lEazgpLq+NusdkjXzogJr1ZpNp4a4qCuxo9AWRzsOCaljW7QYLFLMNDqZpiBoyaqLlaE2IWwymjYu5q9m+ooFPbp7jY-IADu1QJsPr1tDcVrANdUk2rLa4aqCqbitEo5u1l+hBzkHQF9NApgKMs1tEkeAYPHAsFyFvNmjpY0wqNlRT+cYt1jRaxSmiUEydQmcAxr8aeKP8aiuiqbgTVugGsvw4pDXirk5a2SU5bDDQ6WsK6QbWIkYYyDaCTHTKVX0LeivnKOQeJK6VSnSeQTVUy5RSQ1QXrxa5XjIHAG-K2uaqrtyZ1zrGaNtNigLDUiamo3Qfsz6iNyAyzdKrVtgZ5CzYaDfEAtVWzeWaPipWal5RSkuzVaCN5aMQ+zdvLA7I2aizQrDWlLf8bGTObP4Mm9ySG2br5QubuzXaCESglLv-hSQnVXjJ+zY7MgdhAhsWU1ERzZ9zSRUl5QFX6qCyqmCzzSGrYFWyLeQZDzzedUTo1VSrWRWgqUFRVE4GZohRRn2gcFfmw01SbY81cR1admdFiFUzUQLSMTcGYNLi1d2DS1Ux1iGRWreAWQzq1RQza1aODWFf6rueSzzySAeaVpdelVzWaKokMH5LRWAAOqDaLuQAeb1AQagiLYdK5FYp1aLQebzpUxax1buDvidPCLdn8T1eczFHpTxb0rsmVoUGh93pSurIxX6K-pOurfpV8Lo2b+DY2eYq91dbzUxbbyMSTYqYZVmLyVQKrYgYjL9Yi4qiSW4qayHC5LtBLis9Py5YKGi4OqWdwdHGS8fymPQzDhSJC9YboF9if5cLIpzF-K1wlTmLLKmH34vYqEl+sIyIBZRXUqnoUFNLJP4c1YaJ2gl5M5-IS4O-Duju-DLQtMt5bDhNvJaCkXk4hZU9q-MBluKG7pwcF1pm-J4cW-EBzBZbmxc-MlQbMYDprwtlQGlQGgCeNn4rQvvstwkU4twGn4xcL+RZ0N2p4lZSi2SFohi6vkqmgtpV-nLUbjBcXRY6H-c3NEUlgsBkMqIg25RcCHlXleeKBaDt8xqaLgMca1SYye8sfBv9ggvhup+HA7RuKKtaPEZw4rsAG4SvrUF1kN8Et0FH5l5BDTsMVob5rZxgHkV+hYHmFpOqAL5VsIgM+6E2Q0rUOyyqe7TGOZ7TXrTVSDwnVSd+cBLI2Bn1fvr1xaLAIEm1lq4nafrhEVZxhDaUWpGDHMkKtBWpzabxdeviKS8DI3dCDEvIutKQZXQhQYKhq9TEDO7pkDEMq0lT5b0DAU0aNIqIH9GpQYXr3pQDNP44UTOYJhH1gH9PFwX9C-p7MPy4VuJ-pIDTRxcftjaXMj+RQ5GhYDwuv5YerYif4mc1V9NdRFdGLRNleojMqLvp5geziDOZFqvONHRX4rTQbwqTQGmTnso9CNwjcdLLGSeWoQ9PDqtqJJoWAtaxqTgGd3jaDbl9KNQdOHhN+6P10rXPJkYPBJZvsKULyyc5NMqFpgYyEgoEmenkqKEGQ+KHTwEVWPIk-n9Q5bgHRjmi4kesKtjRsgl1quBhVSqI+QZQvBxzButTaFIGT-sCsiEMpIcpMhWYRSEK5r4q-UmJaXFKsN6FxBVYForJrRx5FjRJvmL8MeH4tX4mXa9uLBF5FjftCrYFa4qKTU2HLUKm7km4n-DbIwqPFCaZU5gmyPyj7LG7daRJRpxsGwo+0AjbFMKxjGZe04k1Yva9uFbcIUU7RdBVra5npLRY3GL9jfjW583Cm4GDGm517QFh-XAtoO6hOhi2Em4ncQFo9UVG5n7sqIDgi65k6DiJPXLDlQcp-M93JDQzXDAU1+Zc5rXH5V-UApoArbg02SKBVWQpq43hCwE9XPWQTCjmc7rSQ4JXJcIU7vSjalfg0tqAWQZMNZs4XmvsAzTy4pZvy4BGhPdEPCK5A5Yk8aXOkUh8lo1LVi1oSTSy465HfbkEbJD4tIS5JsA6IyXCWg-cpS4yXpf4LFsZakXHf5zLY-5h2LiqhmVSDVLZlyEYYmbOhcmbpmYJK0zcJK2QRjCC5dmai5WVyeQX8kZJUGZmABiKsCEXTySOAhLKTyrF6ZpLEFWMyMbKcyczX1zU1GY7aoNYxnIlY7LKTQxeVTDLhzfIBzHZ47CUuObrHfoSEBMty3HasAPHT8zuQI21JzRXwonUE7jVQz53HRY7-haE6G5YjNYWaY7onek78ovrDbuTub5AHuaG0sDUP5UpJDUO47EgH6BmQDbDv2rGDyRSRT8pT-TyWXSVwOlU68ncE6aKTSyIRSAyEFbyLkFembCwZ+areQKKKaof0JTSKLBRdTJw4Rmq0GVmrU4cKyVZtBaKFTnC40rzVaFWNLBakXCq1bbMa1ae9MLfWrsLVe9uQJZSCLd47uFWMTcoCZT2WpRbLKTRbr0mE6xeUdL1pAahnnYYCtWB86pGexb3WZxaLAdxaw2aJagSa+Cx6aCSwxSJaQ2Z9K11X7VoqX9K4HDGzkhMHCQZdOTJWODLSfMpbk2RYzj1YF1HHReqdLVeq9LTeqOMuo5X0nS5pjrzL5sPu5v0mv1qiv7bkgTbpQnDB5jwoSdfZFkUAJRjxW9m0CqvrzrVMFKjoNSGToivqIWsDCtuHcZl3CigT1QsAjbxeyJqKgEVLSB1bItRPkeTnFC0ONUK7Cv2Z11AEEHhB3lrREti9Ckg19OEYVMeLnp+WgwUZCha46XQoUOZUoV2NIZgafgnL9aUq7eCpU4DwtcJ3MMIUn5MKQMeMjgGChDgv5IibVRDK6CGjnRCFIrTgldeNSCtaQlku+MqCtGwkxnQVDKugVl-JppMrTgVGcDxBMKiuwbnP1xV8tAURyEwK6RMAUkCu5gPuKgVFXcQ9lXfjhDxn2MdPkscQCvlhT5KaIGHWBcJ8nuYnRAwFEddfkP8iZwCqKU8vgei4kcDgdkqNfkt0Xfk-0Fu5V8hhFRUT9hwtNvlIFHvk3bWrQO8nZgnnjPlPKv3kvSIvlhFGEyK3Vi8wQV3k2ETTIDCpqILCoPlvWMPkxXSflq8k5yLXPXkBXcZom8r5ZW8gAsB7bg0J8hGgQDGwpxhPjgDckoiq7TBhYyVg7c8nOVdCHbogMHjgS8uhoscFE5AtPS6OMjy1agXy6IuMhRNRGq4v0qudAxMsrMMkXRVuAY5gvpDR+8tVrwaJoMgyNy6HHkP10eEZxt8qhl-+GCbtkvB6pCiREYtEbjb9Ce6rEd1oqRM7QSMGOKnXZW6pBn1ggFHa6yMfDkCktuRIDKaR9cIMDAqEZxbLNGd4ksDkYuMEloep11MMpO5jOJgSAqKh763Y+RScHM5dqJJN8gYcdx6ntjT1s2wM3T5oDyPRcnuLC8jPfOp8NvZYpaMGSzsvOoEMIvlMDPb9gPahMi6JXjDxnthxjYLhYKEaQjqKeZFhNy6pHDxoLLBkMa3L41HlfUxsoXkC3lSflSXcIdyXVaFKXYoUv0r5oqirhZs-nUUOJaQSlHdxLbrCSrI6WSq8uVo65mV9YFmQ1sXHTKDlXpGqZycyq+rmoBqKTXLN8OAgHANwz9mYOb7Hccz1haEpeufpLllK16iRW6LRiJ17uvf47F5UEYIEKN6LhQtVJvYtzYjGttwEPN71uR16uvQk64on9V1vSk61vZJ5QRTvS-qlt61zQd62vVrCtzfar-QQQQ1AHubOvThS9vfiyvuScofueAqwFdhaIFbd7DvbvCWSr4T+nVVK6pVGqmWfyKkFaM7HAgmqhTnlhJDimqM2EBaCAaQqBWWBb6auXYSFVgzRWf1LJKUWq2dlKzCGWWrtnUsxFKRqKqVFqKYiPTyqGdt5fCVe8HvcDcTvVN6JAbSYcVMhMyLfa533jT6NwSd63AH6VBGU6LB1Ut6pFXT62LRLyOLQorAXUGKIxSC7-RWC7HAUJbtefdKAxaGyoxQYq4XdJaTeQNtTFQkJ5LcECwZaECo6mmLw9lfD1LbT5mytpbn4aLcUZcS7XaRD9y5CbhbCo5RhZXD99nnXyvPeBcNqG5QDfNwFeshzRAyKmdT9IuQGbSTpN+RS07no5RX4sVp97nJQBfs7bi9jcE2rFUlYsB0TuqP9xDrbrpNuF9bgBYDTkqId1bmpTbB+WJ6wqJhjdsFjakveYhL5AydzcGA1EHLpQvggJhUeJWTWoSX6MaSZg0KD6ICqMA9yOBepXgu7pUUVe71OJ9hvsIHQCOFLbTHF6JHzCRtkFEZVo9ObhGtX7yR-QHzizA7433fmzpKDkLMrDTR8haY5ChRbRihTBg4OYkLecfQZ6uPb60hXEzMQebbM6ia5QhYWwF1BELKrGDhohXbkk3SKSPBV6QvBYfVIBdex7LP4LvyEXkw2mRrzRg4LI-GgKEeFdb7NJRKXfZQK5KAfdjBamiGUTPVNXBYK-2MoLiDsmFmzm7cIEmVwr8gdx-yqXzhGh5VuOMxg0FKZ9lOMPQAyL36QBRmIyBTFxA7hoKt3C1QZKNtRyNEgoLHib42Evr899nthS6DOQwvaNlLKGVZYnFjwOyHIKpgU7FFdIFpyNOyjBZJs8kxLgVJFGUMJsCgdGjc-6PlcNbrhBuL6ZIG4iZUOQDFmG1atOjqvhB+ov2A4U2FL2VNZNH720MFUz2IFUsqFexa6Lew7MBkNwA+YGhNXLTzcnxRp9vTJD+ZKIocNwE93V2Uo6MvsR2FMsMvdqTJ2N37lsAjQ51A2we3D8FW2HLcO2ATRt-TRlq7o37c2ICNHsuiI3bqWxCaA98qWkEaI3bQYLuLGw-hEOQNZXzpU2FjwuxuQGfqF6xejs2T9jlXIg2O0JW5K7oGqflgDsMQMbWPTIHWPPRnWBfc07apRxsO7agsMLJg-i5QuSCIlo7d2oyLjJyjKPTJ8xAfsOtNM8SmrxgvQto5j5Bo8RuNLRH7s9q9BbLgBcoWgmadrg2DXax2esRobEXqbUyU+rjmmjou6hvd7PePQ+ob66AWl2Y-qIkEa9mgoadCKQUeqZxVvphiXdOIL5FhoLTkdHFhyj6aCg0qT51Crg4dInoTlrS9Hlb1Y+sCndeSez8WyJz98HWTxJONU5efoRQSbdFyafkKQ6fuhrZqHXcRLl8JHGoGSyrOQtW6ET91+ST9oFKBYNNRAGhTvgib5Jhx0fijRDns1DL1NHbrfT2RbfbgUIvgvU5Hgj95HdGbhmUerCVY47Wimo78PEyC6CZV685dV69HUpEDHfSqVmeMKbLmW9XuaQR8iYwBCiQ1ySzc8TXiY3K-HdClqzU7zazZsLO5X9UTzRMA9QwaH2YXigXie2aeYat67QywAHQwt7N8MaHlvSFF3QzqHFUgUSfyQtVfQ7qqd5XdUvQ7965zZgxgw1dyfQy6G1zVGHfQafSbvUkT9Q-d6rCaTAjzX1cPQ8mHnvReanYVeaKEK07Cpe07tDHGGYFf964FVAyI1aD6RnSh0HHa+b1rgKVIfTYVjMGjyvSFGgJRbKUpRaj7ILQQrM4QWryLbBalRU-CRkNwCyVET6FWST7aeWT6dRRT7wYhqzcLQQQswwwyEwyaH1w2WkCcLc6r0DaK5lI1B4bmGHRFa86jaseHTapgxEw7IqB1SL7ZGYor+LTOrDpOL6NeUpJHdumVQXYiB9eUr6I2YYrYxVurEXTJaHTDDJT4fuqrFfr7MqbqCjfdYz8XWb7CSW-Dk9g2KxNDOQAQ2FgQ-cc94DWdhIXI5oXg+jQCldrTPg6KieMCOU9wwC0NSLGx1aDXk3bo4i0uLHQfRGXI6eBOYe6IeiKaH48xMs2tUjt6TG-StxVg5YUV5Gq0Z7p2Q68jC8i8kEq9g67Tpg+VA85CZRgHu-5xbdO5SDCU0N2MZtfOHXoZIzcFv4uMHxcIZ6uI-TxwtZ0HLOd0G2eJbEQDLbL-9WD9OaA9g98q5o+Mh3IKeAhgLumQ9qg9SsWdJ1Zl8lJkzIWjwxmoRxGPX9w92GFxQ6FSJ3I40kcyHlp9aLvcBg+eo+rM9xySW9wN5LmEs+QMH38QdwMKCAZ9NZkVTuEFCLuMCqdIwAKPkQtx+I5kUQpNLMNuJYazI-sGlxfrQVxSRppSQKTNxeLhtxQC1W-ClxqyUFq2XdhhEvcyG10My7cyYOKoit0ERxSWSfI7aS0yeuKRcGzLAyYmSWsv104HfmzIyeFQ5ZctZAyXth0yRw4l-WaTfSd8jPZdTIo-RCH4ydZYYfV2KvSWbL1o3aS59JHInSSThxZOn6eqRr4h2JaTC7jXbaFNKSmaCaSNSbxjQeKeo27SqTXuAuRjo+jSYsFKS-ZUFt5SS26h2e7Kao17LLFgbKHZaw7Qg87Le-VZgpcaEGDkg90NTaZHToTDRDZW1gr2JW4VwIrI9ZFkHDZM-pFZDvoGMmrI2ZddHItVZhqkshLBcHLJHjtzKLHOsEJyiAEWozTLuZFJlAaZTG5npTJhFLzJGZDTL02JbdMqCY9L5IDQEePbdiY9rKTOFrd9EjkLingbcdVoBK-o6eihZdGR0A12oe9IrIm6GXRRfnBRuftn7pfowGmJV6IpcmiHqeGlGSQ4KNsinz93hA2ToQzFxjMJZp4Q+2i69Cuj8g2JHixUhGUtA5pYBlE9OaKjRQQyHFrvo0KuDJxLhXppaEzZopZQ+JENHW3BZmUqG-oK1MxJaqGY3rmaGVU2GdXiY6CCMXgVfcKCSzeAgq8GuHR4b17+Va7hBVRsKhvefYXDOAhc41cyRuX1ci466Gpuat66488yOvU3G3mUtyPyTnGOAHnH7ih3Hi4z8VD4PSkIw2-9a433GiiWVd5zRPHWUIcAwvKHhxjBfLC40PGlzSrY7qrPGjvSQJ4pdd7XqhAhi8Pd7O47bDwwW3H54w0hF48qKGnTlL3vc064wbqlQOkVKnGKfGWAAvGxjJfGeneVLgfS5JcAWAzVrtyKXzXDyWwwAmCARTVrzB5qU1ew48FVQDBw72HFndKLepXKLhw8sxoUPAAC6WOHqFWTNwECuItdqbNVRUrtpw8pSaed3ZyfUICmeVT7RAYXHjRSvGrneRb+KCz66ExrUIEPT61AbwynGEfH6LTeHNBH9V2EyOrG46vGDaibsGLX87RfXp051W4C+LUC7gxQGz7VHL7fKQ9LoXVCTYXVPGxYv+HZLf9LkXUlSgfaR9dfWiTMXemLsXbYrHeaeqmueerTfTYJzfdeqGvrerOkgqNAxIqI2VtFZEVruhhzjBEoY1qboCeTwTzOdgJhmXJKJuvR4UV4Em6A4iVjf11i6HkF0VZYdWKsjgLsTpxVPdcbTaOnalhAjgdOIgSGZOhR8uIPl3MMEnMaaL8azO0QQCR8rFSAhY6kphhsk+FQXdLANZOGSaiUbAEg6L3t9sFvrnjmtQPsP4N6MLw1AMJPiN2BhUeNGVZMdaCiPsHz4vUlh1sCTyihnNv4XKA-qHEaZlw1odR9ErjycCeuR9FgQt-hg4iUdDqJt3D2Q35hVRHqbPJweDOYpk12p+6KtwuzIMbLDqfbIqNRQOsCgM5TSGjPyFRQxZA7S1xeoNKtLnFdOOuxkTVQiPE5+Q1KKBp3uANh9Jmuwm0a70pcgcniKHxHD0eDr4IvxNrEvDgRcKNrd8ZWgGMPWNadO5ohlgkMrgZItsPfEmmqB9hzhCCa8Ql4Uhljc5GI6lp4MASbHsR9gt5gbadsCb555h05zsFz00LH0mK0binKRIr5paDEsccTlgc4g2gSI9imlaD9R5Nha4fxrDH4IqWxqtNbF7NKLp4Ux4mmaMFhnEz4GKrCFMXtNOpb5JgYBvtknONGkKbKFrjXVjZRb8UhFS4uSmbjbYm-wlRCc+k4mXKO0RXExkiiCdPFvjc10frXN8x6P9bSEtVSfaSWZgCW2cHdAcFpOAWR55m9axMB9bIbckaAFnvldChuRr0VQtXbaC9+cIBhHXVYa0MXFRgeCzj-2LeB55gFYOusYLIcfyn20M5xvwvhwlNNZMiLgg8MhujRFjU0nfNZNTONFgo6bRfM5qdGREqhJQKTn1TnwgpZ2hjLTrdVtRd9P+wWnrmnduI1SN5M5RklfPNfFhZbrCoKbK05BgnU9YU+fCVQA04DbfaW5jMxnam82RKM4ulupNssSGLhgzSqgf2mnMmORo2K1g7tdGwPBjcndxjuh1Ec9hDtYOxycLotX1bnbadahQdgo0mWNQenzWkZbrNYfImBjKmN08610LnXr62Mvj707hx99IfqIEqbpJ02+nCihRhW9IfrG1MtgK09Bmhxp+h00QPyLhiyMz0Penk2ExdCdRKIQbS9qjeoemyKA+6UdclQrBb6a+JgWhBfLMbOmkeYa6PenIyN6Mv035qRbe4m-00nI-KBOMj9fUrf0xisamt1pKmnRqhmvrR706xj3KCxmN2KJHPk3+ncJk9gT08KoFSRXqD09iaZOYBmkI2eLKM9eNIcJrKnk3oMreuRhdFqDgV9eyQLvp2QYXnEn2M-xnjM3Rqu8VogDfPZnLM8pmYMwYbloTNqcoPemTDvXIb08yEkM4JqVM5f4ZRCem5Pqj1V0whHwJl3ELjR2Kg4sga40dBc5nB+siMeJmZVvTKYNaS4WhElmSsDbIqDbiI+U1ZnOklFnos52KRDcFx0KFGIqAgRmUTQVnwNUVmKtZmh-02dwS0AlmlhBGaFHVrawjTEcTMl4a3XViaHkfvojM4KUyIA1nycDFxqKC1nz07nkqtDlngxOVnUeL7MJs6hMdMxepLsWkNguDB4aMVOmUM4nb-+NNndaN5qD1iIl1ERhQ6jfmn6RPenUOEFRddatm6yEeyFs8ZkBMz1nYs1JrWs+KHFIR1n+sQqN5ZHUadSd4lVk17EGDC+qmaFAGHER64tOG5m0humI6koii4qORnAc1Mkn-flmKUzYa76iIaWjW3Q-s7+QlUxDmY3GjRskyv58DVnIH2ManTaB2wvs3Dm79CwMws0hCsdQfJyApeoX1cHdUIndmaEUvaBuHUbByIV8HEdhkf2C+rmmnKFiczimm4v+aYNdZwbLA4j9SAQYoVfVmIEjU8HEeTQxjQzm8xIVZmc2886cxPqRDYzncspIkqc0WKac4phTHiIo6jfWxakhtnkM-rnlaLzn8siDnKtFpxLczKNX0-5nljYkaWqJbmvuA7m9c1wiZ6P1qRczqi2M85m3aPPlRyLTHKLF7lOAirnwcB8rtHC+rJOH4kDk2Z79DVHQGGg4jg7jJdFc18jbUwMz2sw6mQpqFQjKKBsn4p4aDstOgAMJVamQ1pmURKhVmadu4FGnUa5wKPR6XGPJxs-umYxNJDpqK00HNP4bGxUiHQ3Q37-cywYu5NeKSgiRmcsyAp-GoV9NTX3n6dHFwKcvyaL0DlmfUI1Y6IwOMVczsImgv0I31OkiX1WsnHhE+4YMD9hE9eGNcQlVpdsKKnKLLeMF9HREF1AtkV8ytx3qPOjsqBGgt84XEtsrTauPYnqJytsl5FpiEFqHDn9AgKaD1JxHJ81NoxbRTQFKFyJvs7f0ThhpRCkgLmURIfJjtXGnVUxONL03hED3CNrPaInqzhFlh5yFGIbqEbmvYgJwOnL9odBivno7ge5YcsJQGTT7mSdODC0OLaQoM47mxLLBRNsfJQazH1xo8xEbdsLA90dXrjIJghkEMrOxY2BwWSaEVpXgiXV3c+qNIyAWs1AxGgE88Yk0RAckm3Xxn3M3mEUyBkNiFPgbUKLjhcvVpwMInrjT7dTpBurRHPDbuoRKHGgNyLOZ9C70sJI1mIf8zBrh5EOgoxjeYGCx7nnLIOQeOH9RTsG+VFcyG1ZzJRRbKHrjguKJQphN85g89Lmqvtpi13T2LEc0CssjVU5RdDRxE-ZRYHVlIJysBqQEc0AWwXKhQHWha4So-oblnPc0PjmGFlC5b0uMps8bqHCjYA2fmWZSlNdwsVpMC-j0iqMgFxSNNnraEs8RC1s9y8-crc89EHJ1lM6RDUXm6-MX43PrltPjcCjs849jE0A3qdgtWTNC+yQ5tJfik5ONgOxYp92DVuZL8QD8ki-VmVhgEE2ZbAWKdQRQmBqXcNZNkt6jeFHm827RYaJla5C4xhNbWWTd8Uc4-Y6cXGLLugSizcbYaBWstliHnvafBhqyW8X8KC9p0rFiaP5FflSjY9iLoBvnLo8ApLc2od9sxWjzwNORLc8LjMi4c4LoHhLki6MJn8Z+RS9XDmK9MsWXSc-iTAkr5qxc4b7UIOh2SHCtqyfsW3fCvp8NUKT1Ddjndi1CXVZeHnYaBlQTg-VmfHKnJqyc-jjc8WcYNaWwPHNSWYaOS8lOezwHkwTm0qEwNn8Yna4c6lqYi86Qo2Otxji7SSYNT9REaEKimaGJQqyRrJxNaWxabQHKhUZKiis-4bVZEKiZ6L5w4c7L0-M64WMcFnUaknDmsei4X5USPV0KE-mIbUKiRTbVn-De74JCxWiQBXlwpHEKSIk9dn2tKVGd8dATVtDXQ-0OrIjuhEMusUGX5SabnGC4phmtJPaVi6cWC9FOhDS+Hn40DjnDoerIGSxENnNKjw2ZWCWbjdntvaJbH6s0H0kzH8XEUX6QuwjlnCzHCWW0TfkhSJuxqyVib-lV6Roc9BjjONWSfSx-oiFGzL-i-gF7zPFsn80LoGJTOLrc-YHTi7g80KHsWHEbSIn88mXbS-FjbTUjxgyzlnagq2XfEfl08cB2Lz2UiMCJYxhQEXSMY5SVnInM76ui2tQtwI1wWOLFmq1OuXQUR6gPlXwlgy7XmlZMJRQETDi-SXRrECuTg-Sy5jVNNbRxS2phMIQMN9dQOYeS+HnIGghRRZPKSEtYAkkaP2iYQRHy-i+Aakk-uXmsUfrAFOg7YyyhXT1j-M7y0PICFPsNwDdx6bS6CjC6n1SSS61rFRkRilsgTgSS8Yt6NdpxcK-1jnWmxVjy9hWPwuWXnSM61dENwWeksgb5NJg6yK0HIzIdk1gy9xm4qGOQuK79jN05WwvUkRXwDadhMyRKXMs-JXpyE8aas9Fm6s8FrrMI5mHM5zbw84VnDKzfrVhGZntKD+4iMW5hs6LTrVhP-xMs9+xfdbGXuM-84p2ERi-SOME2ZexWfyh+Nw814awNNFn2PSjqV5EpW0MV4b9CsyXnPU0MtSxs16yyFXEtVBWmhv35vPmzHUqx-oDfNZrcOABKHKzlA2HPFWjK9OERtITRlyyFX-5kf6e9Rk4aKxWjL09EGZy8AouNQtgNXERiEg8PQxde2RExERiEBtZqNfMxXe6vFWwrcqFgsvZhhq5wH4qzEtk05MH4K6xjp0INX1EfIt+0ZGRDMNOLIKy0tEChWt4q0C5+0S8WTS8pqeIIJXGHpIo30vHFEChbJ+0RccA3KOXLqwzIL1DdXGkhnkvyw9XSqMKSFS4w81kxFg2ZVbq2dSBXfEZA19aB-r4IhRXpPvBWEeo2QHEi8m1KxrJwy--rd8T-UWLPiXxZHMtXhMQM2ZRRnCM49jIGvi9NqxC4jEoSJPPVJW3aPXqWKPWmJROQY9i6dXI6NiXoMGzK5lsNT98-BXlzF4X6S9ZNRMq5XWa3DQ5yCSXrJkDneuKAidaNgoGK6QkcuKBUSS2OW8qA+XkQcYsuhNCcGqy2jqsCBpMQtWKYlgRRhRsKWBaCrW-sIZWL5gthQEeHiKjUCtWTgsMja3txvgYOXEFlpw4a+LJXyxWjYltm51ay0tcCaDiNZB8n7i9ASVa1frrJjVXmU8rXEyPKRSqzDW40QjWITTDQHy3s4IK69Ro9Wvn+0Umdw0-KTrJplhRdDqX7a9LXVXJzKkaMtXydisXoq3-if6lJhdRnoNPJp2W4KxcWM6I2px6qVXlNQl1DyM9Wmsh5XoS3RqVuGGEA60DW-ZOlYeq6jxta2TWvGWqQ-q3Rr9giuw-y5VRWIqXXC4rjhxo+HmfayAoCa2NXpwszlZTZXWAsN90qtCqX-0CnWZenzgsa5nX7yx-IbEg9XaFNlGUS288KjmFwrdcZbQEfmnwxMGXotiBoa0DfWtJgWcXSQ9WYVoPqZM8Yi+RBqF1FvMa768nW5c2NhYJkXqXWmElw89CNXgieXDRJlhudH9n15s3X7tA9XEKoijEjb-16Sy0t4FFl7EUdZxExJus39kfJEUd5ZiRoBt5FljXaa8NR58u1pmMZb1otI5hUGy605loKXkwl+X9680bX3B9o6U-iacy6vWlnAqI31PPNaCtzIuywcnHlQF7ThCYEFhunXbMA7WW0ZWhTdCGWgVsrhEgh3Xmsb+hlnmLWQps5xccNI3Pq2fXPUlWgcQvpN4VjHXh6NbnDyAeRgy2xMucuBj5Sao3+sTfkBDYg2WJZYdUKHvmGG-uLuxvqQ5An3XUy2q4J6+H1rOBJYVi0rXfEZWXJqJo3w+uWpehrw2qUYDSX6vfWmcb7RnSxWi8y+vpdG3GWto3rlEUT9RfyLo3Vi0NwuHS1XbMDk3rLKPESS4ecmaJlRN644REUQIcOyGWXaxh+E2G8sbSXIWMvROFW6m4Alas1smLyKfXSa6mW68w9rd9OfiPerk3iQt1i1EhQ21qKtpaFA7k-dIWMA3KgjDkv77cy85xdqxdhOrN8MNcWDwDEV2Gc6IijqfhU4SSzIdcIhyRDm0oUodRY5J3qSMDOCFHlsO-jZG2E2YVZaQSS2HiNqD1hEUS0a7aNaMg9dCisMf9QbWAjxEUcVaa0zuWxho0lMK-KSWmwHmUIbeQAJg5pSq57Xj7QAbMaBgUYqg+RQKpRMq2Ox9Lkz6wvm7flPUVLk42JRMkxHfnKFB7pSm23Qe4shWqhuhpP617Wu4qJpLNMvJZi3S3a0AXXUW6JpVQm5j7Nernw+kXRt7lJnGsuHWhTXQE4MlpGmLG1ZJBlPjS7hQYJYzC26AuCclI-SXDzk18TrLE3zYuMNwaLxVgEjEtyAt-n6HPwHfG2U4tC+5g29jRyDa91pUsr25MrCk2W0QOxvfM2cwuHMsftAX5l1Lrp7G8pWm-V-dYoUhFptZb0MsoNiVsA2wTWxIiP5AxhVjmeMQg2KnJ8gTxUCaBVbrQM2ynFqIM2Ew2lZHln9G3lCtyPFs99KcnaGz3bY6IyneGmG27SwRQpggKbo-Om3rRAoccETewhUTxAJhoBzZ8RctJ2W0c0LF3J7W74jdDb1xrziK4Wls5NRTfZYYTQ22AMS0t3fOynR28dYF68IbLekboJLKW3US7rJaqPpNnaKBrWSyREFyH05EjtZMeILPV+ev4UGWyi2HiwQomae9RoTrqtaRAVi0xlJZn8cWR0NGdbUtPxsZWz3o29KuwTyIexWSxgHQ27PUz7S+28gjTbqFIu3iIEc5FuAVi2FM2R9Jp6kkujpozAzjX3izjjf1MqJbKBzrEpsuxjOKehidh7Gv650l1qHzpAMG6FBvjK3RnN6F8DPC5n8UEX7SA2R9KEBFnk8IFdW35jAa81i0S+y1YmnMJu9c4N7zOVhZKA+39EpfiKTd4lW-PFxFSDK2MIrc1JngJYNi6pRqzJn4NKIQLOO-hndNMOwxcF23msXFhHq1up2TaOQoRogUBCj9gs9GHLL8fC8v0vk5g4i0sfsh1gFfNMdQm2p3GLButQtFnpN1tmggFKXq0VWORL8YORMXMKsG0M424KJfjpIWd0u2Po1jG8nRI9UQFpM4y3jEV6gUDUMkQY6u3a-Tw2vq3lRou3Xoeglo2PaIg1qyaK3NsxklfhGlw4pj6IyrK6tqzBGhpUUuNSkbwM5yNTo7Dk1bSEkboDSPt0xqOScVc9Jg0k2ZZNNAa5W28O29OTvpPoy12CFL1xvXE1YdjVCmNjbsc9WwmxSkeTQl5uNxGyIOh9JsRpxsEwdorJy3lMWuAMu1an1K88mONsB2dwNewU9dWS1W0MDoskmXSkTZpiKJs911D3RjG5UmR6CmQn6y13c2Odh+xRJY7g0CtJnMLaHm-lgvWxcjLwKi4Do2h2lUTZ2n0TaR0FPSSdbrqF9JlaEnzF6J7NLt2tnCroMREOh-sPpNgMuVxHBh9XgO1ehFk28IZRpG0ZWxX1ILpNle88m3d+lRZFhLpy7XFLn5RC-cbOA8JraJpn4O0dgHMIJmU2HtgbnEd2gXG7qFAnVRekYmQYOGN9cvptGFOznQP0IGQfgr0igM4sJNLEimZW3UkStHuo5epL2c-LrRAU7y4PGfcrldTH0I3AirekY2pTkYBhg4pCnhlc91rRp7irHL0jqUaOQq2CWTqy5r393MQMLXLtirLUl3g0EWglxU6xr5Gt8Gg+l2OAg+Zd0Mxh+m0z2ZEu74-KsbhdsDBgoe1FCLu0glFW53iLIN+EHFpxoY26cJnNFfF3dB44Iu8e3AsRcb7Nmr2wA1D3kUd+QTfDzoacQQpBCqKsgMjEscTu9Q0Qx+gdo1VnKjbCFIcMXVqKLn6URDuw1A-78e3HH3TgPUbYoa9RDMLAML5pBN9aPbRCzkm3g+-VnlaKKMKY0MsjIVjWacQeU7Nd9g-sLRmqbUJxe8uhcuwkv2xbR3zcyD+y3U+bJvaCM1zaTTjbxqaR7tFGR1FsrQeLH+5G82cjXe1yMgvaQGtXGSEj+zjhsxF+g2KtM2yS78ISqE9wyDWAaAlsGQwRIzTARHriqtXewVCsCDN1pKikzM7TwQ433P9ZPlIDN-DETjf2G9T6wGmNWpPdU-21LCQsaaEPXo00WZSqx1HSeyFZRc6Co-NGBw7faAtutMRpxcAoGrjfgOkVczkCy9C355vPVgO7I17KBzx7aCWRt09Crq5AojOXWI8Vc-Xq6GgsJ09rRRW25iFPqR9oEsD9208S41V2KBRkueDRW22f40Cz5YnbVP3xq0eZUyK1xKFCNxW23D1xyFHD8uInqijmZpR4nlh-xnV3SHFk5EwlcJe+yFYgi2aIu8r7FXVqegHUfEsr8jwO7xSRReMXEFEVhF6SLgTxKszh3LekJQeO94k8uDB4oe5IcW-QfyEMtYPUK2w5ekpUVV2zvoqevfqM2InqG6ohM2W44OefG4P34gyH5ay-jVqyvnURFxMA5fpMYlTSTkzu-nO8tFZMKkvE6B0CtqfhgK7AuZZlBwAbsoPOQpqef1ZsHqnChl+ghwtfnNWykJSSR2yBvlFDXVnUkbnOsNitHoPkBx19GEnewaoQJhGh2Dg3qMzo3qBpNtMEdnC1MEOYPAU3BcA1qGUzhZzW1n3jDWni5qJhQCu-Ji7qe93I9K+QfWPhUeAzMOpyIhyocN6MXdDK2jKAa51tANRyh08EQRFc94vsL3Q3NOs85ADx6vL-3MQ6DR1cg2glOZRMMeANZkNogZjh88EBrKjXm+nS3lO8cODBRK0IWxiJtI2fWTh818AgsRlG81UN6RmB7ZQsD3fsScPzLFpXxZFUWiyGcECeGzKgJfoPDcEi0IFLMXdVjc1NnvyPkR5PJ2JgSmWozniWgXiOnqE+QMRssFim65Rjh8WQoqN2Mfyu7WNZIqPaDvKM2WpcbZi4qO4dCN2huJ5UmO0+j2R1X0uy4JdvyFaO2Rx37UtNgVFhPMmfkTcF2rFJojLCrmKqB8Jfzt4kFyDIdYKDQNRmtpQkB9EOOhrfla-Iu6FGvKNnOHxqCOEbiMs76PNR4b5ngbqTgx-llXdHlxW7i+QNRzcEhuoEdRuvGOGZDcjpKmwljh4nj5RmNlvElLWqx6pR6sR23ftK4jnBml1QVpyRVugKONhzPcBqCm4Xuk5go0bNZG2EkylbccPqUSeQGhymNM3DU2lMxQPD0Mw3Ey7qWZDiqnDqMcO+m+P3qyTIcmaAvZfRzDpufFhWrRtoQkW8cPg5VDwhuks9qe5nJW9ETkvyGxRrSfOOxcm5hA-LCNn4l0P3sFnJ-lhvsmuBCOb8npnycaayVc4HmhtVOPLDoOQoIlFN72-WMSh6MmaBayOLkfPkt0PFznBgZmecBXXWBxzppuwrhoUVH0Bh8pj58mq7J8cxE8J4FiRMObpDzvAo4ehTGpR0hAyJwS45+xC24nnALs+1gN5cxZZ5ZFeZuzj+op7h9pd2I6OEJzoltO8ZhI8qkm9rTWsugTeyz6zfkYrKfmk-fXJpZrGXfx1dXUCsgtXXDIcCFLBtv2JAsWB1JO4qB749i5RNbSLeXBRyJpjjf7lKJnplfO8pyex-hKvYsxN31ioUtk6xVxPbCqaNqePB2Go8Wo5e37uEpcgJzQ4WyEroDkta7Q3D5xoDtOVkhjMOb8jMF8Kjs019DK3zWyRgJ7vfogJ88EngYzoLFhFW2HYA7TGnJpphkBPiyImIuSIeyQKHitiqzpljyhFtgO1Xtujpfke9K1GCHUdm+NRuwnyFVPncixx1FvisMeFFMyRhYg78vZo3h6N2OgsXoK2DmmMJ7ROm1hWQH8yb40I90OUDUZgTSBTQIx5F3kjk9315okEmIuO2mTahH7Cuy1fxxT0+awQYtyJxo9UwThhDj1gmMFrmxp+8A8yw+w3Gv3ycsK23di5mEccHZgopuD8YPKE0fqXMtlGwuROHnWhXp0BP8eHkNvXNAoXlsrhmcIZhy9o9DIpwgMF9G82uux6RSq6NOpJz9oUyK22lqNEWUZyokS+n41yNuLXb+m1YMaM-o0CUBO3ztWEefB+FUbS+sLtCk1rtPRFIp4LoxSC8tLRKfzRy29PKqPw5usmPIxPqbWbs6mQBOPNpsO8tPxjhAY9nNaQOtIsI0Uz1ocmtbJkZ4+PmtAz3ZMRDQcyMzPKtJtxHnnVpi-VjP0DKeg0tIs8WllloCqEslXKBPn5ZwthKaKaJDWiMHSEtFoUMXFoafkhrGDM3b3NFC5BG75oIOAFoiFkBOtnNwNzNLZb2+-cqbNKzKzQhfjvZ+yQZAxppmAgEsdNMXUd5K2swNWJoNHOsIsq3Mt62Db0kIkWmnmwMc9JzhZWC+udZNi5CDBkxVgOyAK5aFRpsMAgsAll2OXyCTRxrPxO08SALOSU849OXb3DRO3qiNClgazKp2n0VroSinBpmOQNPThGxyKsIzp8xI-2z60uwI0CPbL1MuML5lRlfqMvMHNHgOJ5xaRMOSmcFuKRmwaxi18OVg15SyvOJRJlMqRKx7wc0CtLKt0EdRith12zMOl2E2xW6PXJJqfLWhyrQUtmya0aJ5roLCgCJgy-m3Yi1lmtyGzOVc73OLZCWh3HHxcHq06wEXv+h6Z1dP+2B36IHTEPpO05nHxxQHXxXoMPXN4zF+wAuQOHXqWGpW4qq5FP8GgScCXPcE2q4-XXMqDPKGkhqEGvUCu+k6J8q91oS6p+oCOVVPSsyTpXQumN+WxlWoGjTQYGlDkqp6DnwuG1pYmcpq3tX-UeKJxZ5ZVJOmKLewYirfVrK4-URKzE8tUQAu96gfdc6iKRAq56wkXOhRz6oz2bJ2mIQzgVGp6hvV6i8ovjnFTRAOZW5YciemF9J7P56ruPr525hKFHE8IURwFuM6hxEdNbK5tJRhKNVzkcAlCFOHFxqG6kdxfKH53MF+G0c6ofVzcIfqqtcXV4oQFoSJ5Qc8NSfOMNQjxdR-dpKFxUG5R4BXMNXOOTJ2RBmtFE5KOHJXwDVTk9q1VPS2Gdg69axViMoOXIJ4Y3UlZVrB2Alh3JxhDCR9eKb04Vljh9E1LNAxO9BtXk1wrUvfR9adRuNWS35tPV0rDGWNZFnPrRx648DSen2HFVoTR35Ofde+OjF+2c9aOhOpJ+WpB8YzXD9fPPADkBO8mp806NTxitZZFObNMXUWMyscTx0BPzq-BwNUf9hkdRA0IM2EKvC-BQopifVZK-KSvK36tCKxrI356cBxchjR5OxA00gyZgopvApZ2KY36p0irA2C2RoV93PfsVQ37uo028M4v7EVwhPd1HPpD1IWhYMSZnpnACvhMIEk1U4eP9M3aSOm8hWoplLJHlSZnqwr8X5SfXOADUehXuysXnK-Oon8UBOmvqy2txyxmgntMu2R2NlkuNWST07uhFtb6OiSySukyyKuwuDO3xx56wLhPdWTlx5OdJ4+PyeLrpSS0iqqMrRR-578PouDJgb05W5iCr6Ooeg05FV30vPHpIbxV0rI2HANqtJwWPOR5wPbMx7QCxx-s2l62OIGqYtxMA2PuKTen+lfyuLkdCMyI752b0-Sc9qwWOVRqVW9l9XJYNJsvVVxpOFzl+Wo12vcyB6SO6yNVRfV25RGV8pjBAmthZx24vGuEi48F9AulwqqQzEnaOnV7naZ2-6u29dXX3JhWudNInqC1M7RelwMNyaKQHWh6mRMm1PVvBp2QGi60JhG46v3M6wXCVzJp8R52Qaa61r2KIBOZhw+XbMseXAl9S7y9Y+P3y2hQ9a-KSxl+TQHNG6vAizvkHNAFXWtSXd4JyoPQc1RXq1wAbZGskvGl0LOWJ5Pry+vrWqK2zQj1+eu1UZd9wDUKRgi4A2JBzrQTyLOOb9d4Mr5IzXIB9YX-xygOSMNmXTu1+uwGzfqJy0FpINw10uNZlh-TnritC+sgsa+Abeu80P1RxIPtCsudsl8eVVu4Fjxl0GmzV2kNEsqrQdV8WvkrMWRbJjlmZxvWPIN9PrZx0OWngceWIR4XUfRPtE4u2qX3hpxv-l0BvB55yXRhLVmCN5XFUMx2RuR0iNASzhYZ6zMPUMxyQo02kNbxurqVcw+mKyJhv9DYLoa0FmvAsahnsFrRva0E+vOcRlkx5MgbIoRCOxN8hF4Z9kvbgsB3yS2uY69TBY5Arv3PSHXqLSC3UVN+s3as0+nhuPrXz+6NRysPuulV1AEAq35u9Z8FntPrv2YuEuPxZNxnzNgdwKYzTioekxNwW+auDaIZudNx-JzRxcMLSLfJ8mwkuYNQhmfOKiv3M2YF0t6JuzaFRQ3V8prAMpFRd+56IMQ2pYNbogpd+9PmMmwhvRMAwZEtxY0PZfGXzJjEaVN06MNe8-2uchE0Tm11u+Cs43oG2SXSutiiVN+BPLddxu40UB7Hx9RmbROpvxNfjQWsPk2z15zjFWtPJ3Swa5ZxyJufc4Zwq182X5FiOunjIJmht2SWQx9FYi12fXqM3hDoV5mWkI3o2Vt4-Mp8lkuRDcrg2aTTj5jYQbSV4pvhuLku9F06hLEO6gcs+sPIx8z38zt6IW1xENcOAVZSqztuc+xZBhRnqXAEkuu8l1hBksB7Q4c86TEu2fXQsO2QKOQKXFk2gOGV3z38sr0Hgy54bqUTuGVc2+h6OL1gYS9UUyy70igKEknGa4rmVZ8dvtEo6dG3d9u0hkE3uOKUiYsMgWzhBCPQe3njgS1PXOizjvOfEzRbTsVum+wvbSkZBVas8gXJOG0vxZKUj729oRFc+5hwGzMPWu9-Fp9Vt2RDe+Y8cJfifZ5Ztgy3MWCWtpu54ncJddBwXX9GVuou1WsAqAjv2DeMMLdw8mPO91oyNcKuYNe4vL9uHmpixzwk67tC2jSDhPd+slQVaNW2KOYb5wkZ3pi9Cu5i3xQSayEbXs1nnYulF2P5JUu0jZVQbdy139dQjiw90eYMV3-jvEFV9Fdbsb0FKuxL8eEtRhuSbuhIr4W9yoGPhIybdCHjHI921O-yCXvK9BCOBMDvkpqCXuaNDE3Ri8Ea3sxMXZpwm5+fhdku19BZ9ggOYamndoHx4rvyqLp2lbTeAUebQMgTawHGF8IonA9vvAPJ8dhVP78TBXCaj047T32GLRU12dgyofmJV6ucbG22c5rWK4cIR3NQFhNRxCRHG5ATbMvecNBEG3D-v1LCVWwO4GQJN+DuYsK5p7A-wHEF+fuYQtDlDcZDwFtIaa38Z6kAcvluwJzo18NZId3GUAeSwgZQJtNLRndwsnGbexokdUGtb9zQosAuuxtOD-vHTpBwQ+kGP39yBpxsGlJHsLv7fR6iFKeBpyszhwf9O1rdNFsB2+RPJpaCghqnYofufZ8BheMBMNdgzDuTe4HQ2Q6llqk8wl1jRcnqKKfJ3uKjvK4l0JTZXmYmOPE1b91MtwmelR9D44PF98jhl9+6a196dpi6D1hKc5nnQjfPuLKEJRcNyIbJaEYNSkVRYMKMPuNSGd32SExhGTQ9g5Bqbv0xOOzXja7bduzNwYDyiE92z-kWu0F7xTjabuhM1uWuxUu7C9olqfsi2HhwAa9u4AoFhmsbnOJUz+u0oUrx4kfb+tMrbd70tAB4yadk7t3PD2EWkRj4f9sC9n2yZGbm0MHTYzWnL4zcSrVHaSr1Hd0KZmUJKqvUnGaveOS04xA4GvTurNQ2syDxPMB6uXUhDQz6HXLgiLTQ3Y6y4w4qBvQik9JdXHXw8seoAKsenQy0YNj83H-HWts7AMcfTj+dNRiDcTNjzcLBzZE7O8LceQw+senj3aDR41Oa3j2ty7j39NwKTcf-j1vH6iI8fPQZgx3j-GGrvdha7uXYAqwD4A9zXYAvj4AqKnZCf-j7iKebAWHgFZebfVSWGBop97H407Bbj5ifobPebqw4+af43WGxnWD7Gwz29wfeWCfzciQPtEtXpnRTUKRPD7vzTAnQLU2ClnQgnRwe2DYLTj6ME3j7ELXgmLZm9cRamha9mJQzSE9QytiSuGDxCieDWRzynYBceDiVvA9MWRatT4wm8UMqfrWawm1T-qe1AfZTfncdKnieqfPnQeJLTz87hfcIm7w2L7xLToqnw06fnagurZfZZ15fZaAvw06foxb+H4XYKhg4XXNhWFr7YefDIdE2lTIZeYzVLZBG7FRpby41panFXBDCXfBHqc624Y3E0Jz7Qm5L7cm5r5s2YFNNG4vSYG6d7QkzKt-olHrTB4Z7d6I5gc2dWXZPIl7WWjm+tnUEY0PbFhgHyx7dkyJ7TVp92WKuRSdmg8DePRHxe0JSz73bM3Mu6a7cUkatDREB6Em5hh83bdEK3a8fkXasOCXaDkmHaYHXQ7PmwMHatLAEI3FnbL10KOvYgA09hIpoC7QMHZKIWoQyKY0zvvfOQGmjQKFHTw7vrMmccO8dnvv45i0F-UVY8ALs68d9AtKd9BQopzbyCORXqKt9XKAAomfnDozvgUq9vnBR9ZY37dXNN9qtNGMAK9w50i7ntlvmXndo4+h+vlAdccEn0fe1HyDLFS0IFjNHEnk19rDrz42vm7c21zANBOD18Wz1PMyvm7kJFskFqvkJxqwgFZuZVl8yFvGm8vpDkGBUV8sBcyHRSzFYEcJo8FrKY4Iigxh1KG0mEYzbo3ciGFQvgtv7fZF81ZLQpSoxjHF3MzocsllXtPUp80aPu2AvkgfPY01Q-SATRJsEsHEdItY6XGF2N4kNHi5CPs1zJCjflZOQPBWhhvg+vRuxyi29SMfqPF7gN-vo2PQAlXpx6OB51nOQ5Uimd8TNXQ4l-PZeCjchqf3BcIHHNKTJaBfkQPBpgUx+58xsPe5gxJmt3Am+5UHkny93MzhD3HH9ZyKe5nKP3pc6DNg93OsJWmj0q13LbQ7aNnRrWFI5ePXbKJbv93h3FRox3DKEp3B1ouClAvhL2240Q1+lTdOiXDzz24+aV2Fc5H4GOr2oOZzFW4UF0pMCzg25MNhm4tt5YMc3Lvaix4W4LEGPFNfhmeGWvpl30AkyFNam5de64eozV0fFHZKGNLYfQVHdHHhj3KGUzaXAE47K9dHVmbU4wLCbFK2JpJc16WjMsfKAD+TGuecfQPj16zQ7TCZppnHI491zK4wcfNOi4ZgTzWAxvc2aHj65cwb9N7BzbN68UIDeUb9cV1jxjf3yYvLXjzjeXYHjeib2Cf0b9t7GUn8fkb8onj5bTegb-GHKb4TfUQKARIw7jet4zCf8fOiekT6rBu1cfG8SoGH7Q5zfwSp6qXvU7YfVTfH8T7SV4auB0kb0zeqw7Sy4FVSesAYyraT-USvzR+bSwf8pEeUyecedEG0eeZZuw9KURWRZc4E-2HF8LKKBT8OG8GXBbcfQhbcE+Wrk0pWqpT-s70LYc7NKcc7eOpgwVxMaKbiazfq4Yz7UQGokTKaHf33nYA-bz2rQb9z6xFWtIzw1TeBfZ3hE79eHx1fIqHT6ImlFY+HJfbrzpfQuq3w8uqoXaurFE1FT6b0i7t1R-xd1dr7tE6lTQ9uBHoZbGejE7lTsHC7z8xSmfHGZkF1yMiic2zuQA-i5krPUeQQyHLOsLwLR3C8OQLXGBQpMi-rZyI5hfow33vLzs86yNJsrz+24UXh6JOyPi1o-A-JHCLmRIeIsJgp1bHm1GWQzC2GTnA0PI2PurHk-nGQP-UmRiC3x9Yr2tQmDc2R4ljoE5buJZCl72p4-mQ6y5ArkWchG5ZJ5ORA-iLToXqH8L-PZ6QNv3Q5nOv3AH788e0YpqjV2I6Uitc9bp3qI0FA88yG8I1M22fedawZx+zqO5FSNbR4Q6c9mHmthz-YFbdnm+liKMI0OsBoK3tAo0mMN6xs-AtexaPmwLL-U8JnnkqfMcK5s-KLhnyB09pUV080MD1gsFDkEEY-r3c-LU9qKGVWwFKiOTA9M4f2BE48uJvUeD5rRxniU9WXKp8j7QUfWSNSinluoFJMlqS4AxmOe7ge5U7WS89V3iieNN3lpSSeNc6AoE68ktPE03M8kUZuQtqL3eIXgPe7XWQYxQ9deypgSq7r3T52hUMeyvSMf7FQYpxj4nH+imOTC5TMf6vaML8zdnGDxIJAxgAVSCYT6HniGdKTItseLQ8Ym9yc461QyKrgjOfHUn21ywTxk-Lj7qCKUjoZinzPKWjOU+u4yt6DPNU+Unz8y7APU--mRXSRbM0+wEICf5zd0+Sn73BjvZ3h2nzCyun8k+enzCzub4ECin0ieXVV-LFUuM+Bn4ebVUoWH4ia9774-Dtyw0U+Wn+Sflb4+bQGdSf4FRAyW5WyV4eTSfoE48YqcndG2T2Tt2AryyoLf2I4E2R1rb0OHMfeKzKFTJTNnfj6BahKfdnW7f55dayhdrqLTmN7fIYiyY7AGtLVT20-IX8HfzgA+ww74uDdTy0YHJY868UCM+7iXJ0zT287hn5k+DpMB9oX0L7efbeGleVOqs767sJE8+HnpdInXasFTwxQ-YFE1ozJLf6fVfcyzAZUHsgIxzcFLTr7a76Yyoz3bzbr43eT1c3fM2UmeCSbpbUz7rnj9ElCiQiw9xZ2RCysM1OPtHaQ1o9WzGkh+qWOZrR0oay2atIhzltyPfOMMVwoeGBpe0MWhauwFDOaIxwvhCRR+99DHTOC3kN9kIX76qTnz0LE5O9BpegXgQpi6ulYdBV34EmtBgV7WYFm2F+4aDrZ8-k5lPlQsVxyMAWRqrAWsir2BpMeNJuFGuY1mIlfFbRP1hYvppW7EYhNRcrI1byJTRpI1nrZr9KRo7qNDS4kpztgYkbvSItRDSCq-VY-z3G9I4Qh6B2n7lUXRhI4U9XGV+fOre+YYrI+oFtD6hl2eRgN60HQx5EW+u7sfqZ-byR4jfcqNOG1o70XtpF-JyRquBn2Ogj5z1kP66+Av1vrLdpz-hBbH5LHRpp1EwOjxmVYQ-KXkBMGIU2rBtSK2TVxf1BMqyXu0E0J3+5hGsjwEaSAEscNZUbOPzIftH0yAgpwUuHFvPNDoEUEMO3kxXKbqxA6IMnSZuVQIuFsa1sfJP36DRlrFLkJ74goKKgbrZ5PFuEY3LrJ0Qrqc38rrfqKwfPeyH5kqIgpvembbHgvXqBew+cdlSb8QPyzqi+oXoEeDI0udS2FdEOt1R301RKddEHa7Suwp9HTqtBfP00yGQ-4HTjrYBe0m3dHxCOeBQssOFjRuY4J9U23OjEdSViZGp3I0dWFjmuBE5gdfLgp0LD2+IYCrI002wVV-q-Uy3Bm8cOgZ9yF9q6MxGi1sFDgwqjw8rtWaOByzS17tUfidwmIMH5E+5LSGbHn5I5Cjtb+o2cfwXO31THBhitrjzqfuwWhtr3NFtqtZ9g-b3FlnIqJNqyKAG3u1xsa4EdNg60IJ+l7uRxOqb1q2luhm1LN7JAMC6di6sxO+PYJ8GtRGgmtZHCDz3l+2tTLRC9E5z0v2aS0F5DwytfmIQMd3UqtZRQTzrOwNSbC0stQsMV941u6Ls45UWkJfov66h3fMGwq2HsDkJxcNzyhC1byNaK3OSVPerP7rjl93VvmjZhfmpW42P7QZzmhcJp2VjQeodPWMUcraZP12Vy1Inpg2Ihh9mvfVDmssPdloa0GI2gFGrRCdW52JZURJdhraEq-txpdew43ir0uRHGEz1HG4ytopQn-Gf44xE-3r5mbmCfo7Yn5zA5j+rf84-9fDpj4BFABCgOVaiAq8BPxuVVk+NJTsf7rzpK4b8KrXHX1NUf8ylNttczMf9j+Kn8nB1CTDMyf+j-7j0tNqfw0--QwZ4q8Az+7BD8ysf4yKJGHLCx45kYOf2j+ufwFL5zUL-yfxfKefxCfSf8L-NtoiyH5bCfv-kL+9zVXgueWlKlJOL-Gf1ESJbxEw8pXfGCpeAqiT5r+Rf2VKweYcZQZRrfb+NVLtb5reKucD6-JGyykefYpsqIHRw1DWD3jMBhOT0KUHn0j7eT1mhF684Qff5iphwwqL8VMNLCVGKfnbwLzKeYsTNRXOHaVAc7ZpUc6yE8uHaGWABVf8aKpfxqfUQJtwTKbn-33hn-o74dMWfyeGhE+afmfzj+8X1oIs-6nesXx6zQzPeHJExL7VFW6fqX6h9ZEx+GwAO+DGX0onowyzcAI2r6LecBGwz2kIIz3Xe9Ewb6sSXGfjfbmLW784r27yVTcGqtpfBmsd4puVar9BjOALI8JTXL36Cl8RQ8tLZRxWuv4w1qElQNGfuTL5mgFZ3lo00-ZQAc95b-PpDOBJtDvtHw0J3pxMmhRAab7-8TO-p+y0dv2mJBS2egiOjYUPlg7+hPTlK4wGSrNtY8P+zYDn1Of85zKvZ65zjnTmUclyqrTvZks+qDLFvoXc4l6CAovZ4l+j-skw55hFRiel4oiGUe1SQlorPUR7Ylfuzg2eyxsEmIhpD2aM2+fyquyPP0QfIZsA-eImhtTrTQpZBoBBdgDoiAYJJGKxzNYBaI4+xPYLVOxSQ4iI+4i-RtFpdOzIbi5CC0RU4RiJ7QXTiqiE7E0ViVThaIqU5xemAcjOjUOh72QGD2bH7qFoizakR+OzQeorU4LOi6BA4UZ34NCP5ORnBgclgitThjUNHo4U4yaiX6R6AcBPQBZFCRQvE4P8KQ0K1ap96GfuVQHrijxH22Wrq4FM5OVyb8otnQ7AH5LmZOvVAGkC3kAV56ZLdQh8RjyBaIek5+aJxoxSJmvh18Rk6TCGz2G0JQAcpOYGJjGofsi1iaTtPkFTgBfsQ80k6VFAKahBapCvXofAQiTrv+gk7CqMJODkyJmLRk4k7pYlF+gQGArmxOf7gcTqEkjnyouJJ+vE6GdpcqFhTqJKKQ0YxV+kNY2wyPJlJmaFaXKvPObfZXYLnIJjzUbs4soOo9YNZOC96aiIxYimxajEqcU96AJE3Q2cilxMB+UAG4RIQiBKyekDY+1lh6NEUywRzCAUOcFeib+MVo7D43iiTq3XwxARzowiQ-9P22behyCh1Smzw46NHoFogajGSsVyzlYOwGlGI9yH+QV2BQgdGwp6yakPFw7q6zUJM0llq5yPzgPZhvAd3IT8SEzrXQGgZqDoFo5IwW4BaIgbAIvDAkFrayBvr4oujn9Nhytb6U-HmWeSJbzD+MZGDzBjr2464uaNPusgFaiOuo5Tz1+Adw5CjJ3Hm+UoTVAVi8Cs463OjwilhVfmTwFD7sUFE4FjgGfhf+w2jmTClwFtAPkLVexTyNkKBER8g8aKDGrIHYDNsOv5BX5F8WhuCMWGs4rXC-9HcWTj7SgSRMxSIdMnT8wFhYcA8Ifmj2UPcO7V7faLf041AjcEWwXehu-PUKzOCv3G1eZUa+geoW0OTcHLvo95DItO5YI5Doxq88Jmhd+rsCKCR7kBgk6yDXmFjoabjjoMtqPehnARGIhNBJiKA8LIEICvdwZgTvrGwGudwSjlwG+FRRDi-+1-KGbNcMQ+w0Buk8tGSsZK0IqB7-AdboT1Bq0E-oAChbFu-IHM5TBCKQ6mTkBtN2KAb+oGgGGgqYBtoKOAbuCh-omwgFUPraHC5GPjJeBBxKCouBZYRZrNLkw7CyWKIKnbBvAhOBHZjbYOwKK4Qf+twKPJA5jtjW6oE2CtTI82iE8J6kGh48jmLQ1FxMChkWY36a6BrceAq4WCaIWwE4mrnQlHA86JQBPoGRsIgKJGbqBLGib94UaD5wgjQFWGWB2tqIFDTGahScVgJuMD7-LPwUr2D2IpcqaC7+5Ae4X-JXZlJQ-m6baroc7r5I-Dfy2hBq4g-yfd5hUC-y45hnap1G+-IkyjNaUmon8ll8HPAhxJkeIpJL8rhYK-JccHAuxEEb8ghBW8ywemPyWlQXYJPyDW7V+v1es-JuYi72TEH3LL3ybJzNJImYOhBESkTmEgZN8r2gLfIKbkp8wCTeHN5gG5ASLl+B-bCMujWgeuT6JHZgBQqzkF5MpmDGgT1SOiTtYDZeeIR84pv6p3RfoNTozS4J8obISfLrqEQEAD5k8CKaP7rdBJr4mF53genoOOZh8jgBgYi4FA3UVEHRonHyf-6roF7y0-rlfrP63DheiJ2uV8iL+kZUdXAf1kP6b36joPLmxfbj+kIBEFSesPv+rfop7o9Qlmib5N36khzkBmX6FLalkKscJjwaTrX6CIgX7DZyqX7Z+sOi0pIWkIUEvXAzkEX65AaBQg8slUbyyKlQhwjFAqn6WCgB+mBwevyffusEHfqfCNU2X37z3o2BYNpu+r+envpYcN76UOA5BilwkAE6RkxwZ9pQ-EN0MPzChvD8aFANUgJCOxy6YtA+QUE+aBpyr7JxkI+eoETPng74j+ahBC98d8ifnoY0CuRzaJ9acwamOLeecrhngH7mpkHHsOnau57wUBpgCoH1nkeeRMpIYsiGAwYx2v+41-oarjvuKRr9nE0IgZCkXujSgdqzcPDBHXRh2lVeWejR6JASBwHbQbtosohwUFR6MlRHgN7aYI5+2ls0Vtp4nBiIf1B22jvmWm4mNMuUutqvjgbaekEoiIlkd2i34srODX7o0ngYImxK2iZQQeiIturaUmpjQUIoXhQPsEuM8AHvoFR68+gcriKS1Cz8hB3oc+iztqn2+7i96Aa4XfQJphGBkbAUPhXon-YikLmIkBi8+HZQYXDJQZFBJXDxuCl8uejd6IXopcRXyHVCXFTiwXyaIzbpViQBPlA4GknoFtDZ8n7ox2qpWArB4OIODBo4iEFlCueUmDT26ObuuYhbxKeYU7B3UCwK2dBkVOWyNfi5iMboAThm6Lug5Gj9sjLontC00G+Ehr5K6Ls4SwhB9hFB+S5WrHGQsnAkaGgYGcGaBGcO0XxJwdKB0KxB5qwaLQiBQV5oxXAcno98zgo9gddO+Zw46OZowdrPrKN2KSSaZG5GWj4OgdQBMOjP7vDoJcSLAqMIdOSIGpjolyqozn9oYi7DsPzayGqg6BG44Og-OKHGfLycSicAduAO4HtAZIBAAA - code: |4 - # example and data from: - # https://ipyleaflet.readthedocs.io/en/latest/layers/geo_json.html - # https://ipyleaflet.readthedocs.io/en/latest/layers/marker.html - import json - import pathlib - import random - - from ipyleaflet import GeoJSON, Map, Marker #<< - from shiny import App, ui - from shinywidgets import output_widget, register_widget #<< - - def random_color(feature): - return { - "color": "black", - "fillColor": random.choice(["red", "yellow", "green", "orange"]), - } - - here = pathlib.Path(__file__) - with open(here.parent / "europe_110.geo.json", "r") as f: - country_boundaries = json.load(f) - - app_ui = ui.page_fluid(output_widget("map")) #<< - - def server(input, output, session): - my_map = Map(center=(50.6252978589571, 0.34580993652344), zoom=3) #<< - - geo_json = GeoJSON( #<< - data=country_boundaries, #<< - style={ #<< - "opacity": 1, #<< - "dashArray": "9", #<< - "fillOpacity": 0.1, #<< - "weight": 1, #<< - }, - hover_style={"color": "white", "dashArray": "0", "fillOpacity": 0.5}, #<< - style_callback=random_color, #<< - ) #<< - my_map.add_layer(geo_json) #<< - - point = Marker(location=(52.204793, 0.121558), draggable=False) #<< - my_map.add_layer(point) #<< - - register_widget("map", my_map) #<< - - app = App(app_ui, server) - - - title: Render Widget - description: Use `@render_widget()` to render any ipywidget - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACASxwBs4obOzWZUxOnwDicYgCkAygHkAcniYBZNEyYBiJgB4tAHQj1GTAM4ALFhGz9BwpgEF0igK4t9h5mYvYA7iwAmAOZwZMbWQnzETmSoUQD6voHBinSUfnB08f5BfBraehD6aKixLkwAvEwuWFBBsTwufgAUkdFxCdmNumAw2LEwaF0AlINqmjr6ExBpNCbpAG7pjRYxZIotK4rGcMbGLKSDiPpqaswVKqiNhJQUdGWNAKwADBgAbABM928AnADsABz3P5fe4-ACMimeAGYACyAx5fL6Ql6fGHQwaKABexEYZUhI1y4wKEGOTAAAikpulMokcmN8iTpkwen00I0DqM8kcSccUmQnHRicwCflJkVyvZ0I0iiUWJt5ulBvowABfPDgaDwahwfnEVBwWKg0HPILEDAAK2MpHwRFIFCoyBAXK6ZGweq6iCYXQAYlw+SkAMLEdicQhkPYFfBO2i+-nbd1MYBctSO4nc52uuDx70xlJdPBJ45dVAMPXCFhxpBMFPcwtgYyEKCcOhQCAAa3j4ILJK6NBzcEI7CgWbAdj8MAsAFpHkwSE5yHRsHmu7XBwAjODsZtt+MvfOpmtdS0LFIsALkYd2dirlssIeR-dpuvEOaxKCQi8AGQAQkuH92UGOjyxH4LA0PGjx7jWahdJwCzsPGbyQVB6ZupWXRSM+6RwKexKzvOi73lBnoAeOEYel0l7XhAt6-kRXRQIBr7vmhI7frRyFgCaTjAaB4FIQenHiHOLBkBeV43ne-GPgE3Fvp+P6ERxxjcSBYGVhBy7QXWTirsJoksZREnsQJylMfJxmPqudCtjxNBqR6Gl-rWGqZgZ4nUZJmnES5sTsKQARiVRNGKQJVk2XJBlsSFlnWbELmBUZ0X-mFsQBAwTioPGEBOMGUn-lAq5WXAcyBRgFn-oIxhkI2n7lbWNBCP07CxJQw4AEpwDEq7sCwhBMMQMyGR5dVaQ1dBNXUdBZTl7B5c5xAUK+gHTblXldBAC36mFK2zWtkCwPqlrCAlw1Jc5B2vuw+ketlq1OVp-SoCQfl0D8HZzQ9aDPUIfzxtCH3EY9310F8717UDQZCKCzEerue2CMU2zXUwSKQl8sKQgDXQBH4xQwH4LVVQhoJ-EaWNgAjsTYFwU2VhOCLk4OVVXBAynGAhjyPJ293ETjxTU1AtMevTXzk-2pCMAR5FgC8GBMAAIsVG66hYARMCkAThiNxEWCQ8CpXQmUsdCcsfsQ3jpEy-h+JwrAQHrrnk74rZsHAIF3sLDN7TQbDGAajw7eTLCWq+by1WdWnB8QZmRQpQchxAMPEZzv0R8Rc4x9LKfa103irqH4dO-nEXS3YUVO8Q+r+PGIvkwxMBAW+sTB+Zaf0YxTdOOzsc5yRjeQiUZFMLXe31-38SrjXXs810JDkBY1zDgAojqqHkxr4aD8vq+O3tylFZrpDDhhUSmOkxIryWu8z2AG+kBP29X0wABkTD+tczbsPYuyeTfPmcEPH4jN-K+VapWIBo9CopBfAAv65MwyWCnqLPaphGCdUFsjUEy5VTLmxuIeAZAFzxmrBxF0qFpYAAUgzYACEfNuNohAgWgBQbuHpEw8zUOwoiJIuHcJJG8Z49wviPDeNCH40JIRc0eNCL43M+EkmhKCDAAJ7jQmkaCF4hpIRIkeC8LyJIAC6AMeH6O5AIjA0IXiQlBD8J4fxJEIgEYhUxCilH3FBHY4RGi3i2JhC4pgRj-G8PkUwcxLxHjuNJrI4RkIfhIn+v4tQiiMCPD+O8N4VjpEvABG8DJ-jAkcOOME+RbwlEiM5mo6x4ifgvASYUhRzw-jQh8Rk4EIIPh-F+vUgJxiimJNCc8BECIgRpJsWI3JdSQlJMEX8Tmjw0ZxOBGjLpISCkhOKXwsJ4iEQvB+D8YRVirGY36WoixMIhnCJkRI+Z+TemcP6WEjxczoSKJsT41RdzjinMNHM7JuSPiIhWfItZ8iNncPMU8rmQj5mKIic47pag0avFEQiGpLwXhfHsb8W5QT+mgi+BgTFczpGvJ+FzaEfxPmIoJRimRiI0awjeDCLB3SQV8LBURfFhLwmcw0Zov4cSBEQIRSjAlsingRNmRK8J9wcXdI5VBLlajwlRKadDXZ2iqVMFOR8R4eyYRMr+BM9Fcr1l4oJdY4RgIBWlJBKCCRWrTk-BaZI0E3x7j3EhPcPRrLPkKprEq+ZqjMWQiBKo74jqlFqOBMicRHivWWNNaC81GBVGcxaV8dFsSjRwxFcksEwzwlkusT4n1qy-UpuzTUzp2j4QyNzVM7VSiBW2LEe4plZLkTQiTeyytJLRkk11fs45ea3gYHxSCWE9rml6qNT27h-ruRcriVK6GAIbGZpHY25prxOmiJXaU5EIJ51EUXSSLlsyNHQzRtkzF2TKUnLHRK+E5zSnCKaSeqCZ7jjmL1Xqx1T7OlWM-TWb9ahzFvHsa29xXNSZAi3VMndkInFCKeP8J5QK+FsoXQ8wRuTgQAYwKU-4b1fW4pFeY6F+7rlGhkXIxDzaPVqMUZo694Sy3AtMQYry3GnLKgLDgh8JD-xkNctLH0UA-TXwEsWXU6QwwVg9MJx89ZGzpBbO2Ss9GBK9kk7GAcHtiKjlIlOGckR8K9zXBuLcmmPSTKUphE8Z5kYUS7oQ4K5MjyZyMwAVQACq9zHrZPie1YIbgQvAjMx9HPYTPGZuchCCJ1zHBYC8bm6AedHh3JOFF-O9y4sF9S5MuLURcyOdLmWb4yW87lgL9DTKqRCzffeek0tVQy7-Oi2kasjjy-QlKql7JMEcl1+KBkKudY4v-fybX3OTdCrFEuvm6vkxSmN0uE3e4pTSpEI2N0Zp1ygcVWbZV6GVWqvBAyvcxoTTAdLDqXUep9QGvYTb9CbuNkmoHPaG1Fpj2+3-TasRtqVlurtP+F0jplbsG98mPlGzIzB+TCGL03qVgQwJFHP0wY3yxyDeMGPHx4+hnA+GupCbIyNUaSD2npK4z6ATJGBP3Wc3JpTAWQth7Ty60zMgLM2Yc0NMV+nHOkFiznpLYcY6FZKz8nqPw6s4CHwgDdUgIg0dB3tmgg2e3iJKKYAACVPKYO2DsPQyCXv6eWvdnau3dmL72vt-YA661HAuBkVt7Td0t2rvc3eJ2HNIgO9CM4+7AEHm3xcw4e8jz1uwfWK5Vz8A7m+QWm4twMgnrLDcmIlFYctwL2Wt5025xxNPA884p663PBBi8WKXzk73O+EBi-Swb2vPeOlm-DgAOpI3Pkwdv0mOLN4fvXneL834f0bN-Sro2LqwPAcAiAARQGAMO0VGBd2mD3HgV4KvHFUHwFQBgjs2C5p4LQYl4he1RPDioewGhdDyYkEYRYSTimEymO-WBpgGjCX7Loq7JGqSKVLCrbp-DjpMoyJkoeK-CZKypkbyp4qywxKtpGjIa7IZKOo-AYBggUrIjvA1KQbaIgbci-7-4wiSoSIvJPKKK74nK4FgjfBcxfBMoCJurvhIFmoir-6erNK7KaKGrzI1I4EWKZo2LwjooaKyJhzcHJq8GyxOLfBU7XpxK1KOqyw5KhpCLOqCGZpkEmKKEpKGhZo5JCGEGaG7pIhGjiIUqGikblrkaNoeLjqxLwj4pupPAyIAhWHIgCoiJkovJiI3LyG9q8EmxWL7oeLuJjL2JWESIkw2LIZNIYoeqGF9K8GQjKK6JtqwjiK2o+JWFPCIi6JroYpuoeIZH3K8FjqxK1I5JMpB6kzgGIayw1K2JCJGgHKYqIFOHIG1HjqeqpKzK6KiKSIfKMHjrxqIhxEZKwjVFf68FKIaIUo+LiovpFEnKoH0H7JXKkw+JcH9E8EuFlIUoepCLNISLIhIhWG2LQyAiqKtpWLdphE4a8HPAvI+LkpPCiJZpWHwaqLvAlG-ASKLG-5irIYvL2IgiAHIjIJ5qoFCqQYRISJGoGFvGnr9IEpiI7LAh8oyIiK058JiLjoiKzI7JepHLiLgnYmvDIazG2LvAMn-BiEwg1Jcy5LaLfAIi0kioEqXG5KaKpIvJWIMF5q4GfBPBwiyJGqBF8mNoEpAjsakxXJWL4piFwj4rZKwh6ogjSIKlTJGgWLlJQZ2HIilLEncKkmSKiICoYrDqyIcZYYVofGpovLeFEmjJEGalZqOL1Gep7KGkhKGgWLzH2pQoJpxKtEhKkkohopJGcmgnBnyJurjqKJeriLeqGg+KdJiHFqpJUE5qwnOncLYZYmDHvB6m-AkwUovKIhiFYGhocnkm0Epl8JpmIgZKtICpIiXEPoSkWKCGwgghMavHHEKEuHZEiKPFurMECIyKNmxKAhepMoPH2LtncJpmdKwo052FozzKOqQGQayKwhRLZL7JyETnhFTlEYSKZmxJiKxJHkWJXr2qkyhosGqKbmcrZGobozerOrzESIxnyIUrKJ7I2L4rNLRlVGYlfp4omzaKdK-CLJQlAUvkXETGQYzrOosrXnvEuEmxeIvIrpeFqIggvmZovJcwckelGrjnAqukuH3BEb8ExGaJCLLLwrboErzLCIFERK2GAg-mKqywiLUXOowa-E8WIaQFxKhoIgwpCqIiiUBqyx0qQYZK7Jggtr2axnyUAizKXokqxFqVLqoHhKQYHGsH5ENpyWpqZqYrsHZJPCllETlkIXGECrDLfDBHQwvkhFczaLIZkroyOFMXOFGmoFwnAFNFgEvmcEwFQrwETH5JcY8bYICZSTKZaR34sQSZSZ1RFhXxlif65W1iqZNgaY45da6ZSYGYXgpYQCmZ4TX70JWabg1WVj6UqYxY4RlZfg5QBCCxz4OYvhh5fgiBtSF456NZFahay4Ra35RYsQYTHixa4TmbtXJakTDhDXsAjUdazX9z7XTX5ZCSFYOTFZCSlb7XDWjXzbSSyQ5ZgBTUzX1YqS8QLXNY6StYsQHVHVjUmQvVnUfWraxSDZNbz7wD3WHWPW9zTYr5w1A1PXJSLavXvVbaxTrbESA0I39axQ7YZQu5l5HYlQA3DWnZs7EBVQ1QA0iDXaNSfbb5dAPY6RPb9QzD43HXvbM3NT0Ck0CS-b6j-ag4HY-ZA4g77Z3Qw2HThAo0E1w4XQI5C1E5fSQyvSk644a0vSpwejildZ46gxabI661QxJwDldaUxM7gILkXnC54yM5EyViIi2IjYcTs40wH4CS8785dyC5WlaR8xUze0l4IldbiwbQ9BS5yyKxwRyYK7N6q4QDq5+5a76xpS65dDZFMA+boCWzjh+A2xwCm5oI24sAuzy7BSewR0cQ+yoB+xGhq3-je7R7SxTV+4hyTXnX0L+6vVGjB7kyh4D2cyx5QDt142M30J5w9ZY0z2VzNzJ7h27XjwZ4d292r254B0M3g3Z7jxzg+2Pjl5j610v62gLznjj5XxN5K6byH3X2N6fUHxaz15QBVQD5D633K6n3ERD6T7vzzgz52A-yI0L7b5W0cR+Qr5r7xiQMCQFSb6wOViG2kL74r0oJoIn7HRabn64KCRX5EKVgVV5WrWULUK0IRjn1v7MKf6Lo-4PJjqxr2pOV2k8mOomzQFsGSKczSGQbmX8JjrowUrIZoxGiRJiKOrZEgH-DDH8FghHGRUDGNpMoYDcm2kon1HIaoOxnSO-BSIUmXL4ECM-omyD27LiqlKiJvJSN4GwruLaLOpiIAgmPgasXepsFgjZL2qtLYEnLZH3rBHOqyLVJXlKMnFTIZIpLIgeI2oeOgn2W6OEo0Fu1FrtoRUulRUhI+J3lMoIifCgnwipIcPjq2J3oSVREUWuOhK4H6O2HSKeNoY6NgXSNuqWKkxAG2K5LVOQappwiqnAhAj4q-C2NkriKaKEEdIk7wWgYPKQH8Xwh2JWJNLOq2PfBVIyEAhxofozPkEPK4EapAj6pu1SqEawlAhMrCljFhOZPKORO1OZrOrqL4oRJoyEacxxKAhgjkl7Kgy7NGEqO4EPFoVxKEkUqEb2rvkUoxLBWMW3MRPZOywOHqJpKxICLwNgXNqtJZKpJOPeo9NItlGhrqpoZWORpqPWWYr2J6o+L-A9OsX4pPPqoXOqLgsnJKLQHnFUulGeo9MmwyLAVDOSpBrksrnKkkxfMCJeo9MBNsF6o6LDPQEYsklKIOKpIeFAhon4v-OZEqNCPxlghPAEmfDkuOMIihpGqkyGh9HhOTmRNjqdLQzRnIaMsOrsuEqOI1lpIAgiLuVQSeWzMUZ1FSofDu1XFCKyWxl1EobAizpPJ-MEUVl6vulGskyohSGRtgVjqWLqoCJlGdIGk6s1HJvXGXEWM5uQZnOzIuvxqiOIh+s1gBt7NBuvDSKXqWLMOaqPrKK9EkyyNvkvI9NCNpKwZNM7nxH+NEaGhXp5ufAYompFtLHJsSoeLoqyIkzkm2O1I04vIMrhK8mLu-65Kvkkq1LSJ4W6ElMpy6IwjvBAj5M2vwt2vZNMN2r1psFrGl6xmcOvo8O6JCGYZlkZU8y8Y1j8YPiCYkgVUoRibESFWxjFUUylUKb54kPERVXqbbim3ex9iNUGTNWtXbVEOMwFTWbdUeiZv-hHhYQDX7UbiaxOAwC9xeaTVLwfgnVXXDaMxLWViUe1j5XSzrU0dxZtXEfZ6pYA30csCMccesfsf0IFbzXXV7QlYiR0eHXSdMcKeg0A1sfMdfVDYe0g26R3WScacyefVz16eE02RQ0-Vy3qcMdafK36zQMBRmdOfY3hSY3WcQ02S41dBfhScWd+cGy7Yt21iIPQKOfU1k502XYd1M3jQs1DxdAADSqsfgRgL2QX5nzn3s-NX24tstU2QOYtMt4Oo2Ut1kEXWkPkUOjnmnYD+sqtxXlXHEeOaOHohO-4eO+toSZtT0mtJtHoQdgM5tdAJOlYyrtYNtLto36i95iTdOTtFOBO8GrOZO-MYdZ9oW79fOlAAuvHXMY32MIuO3XOddAkUdkuLE0u8dys8uiuyuKdadfdGd+oWdw4+uRuAQJuusaC5ulu1uM9ldduNdl35MDdTdweFX8c0cE9+1S8XdCPPn8n8PcUr1ESeiIeLeYe2P49k9gXyPM9xcaPNui91cGDqeRe69eNvn+929+exP6PjPncQ8I8NPOeTcle1P1eF9EAdebeO83999qXYAX9z93eLEfeH9Aog+Iv9Co+vPwvT8r8gDhCwDoD9C-82+oF-4bnyDHo+vkX5NRvO+e+iCfPh+WDp+uDfGF+BDBCRDSmK15CxED+T+VDe0r+dATCH++e9DWT8i2R1iMBhoXxkGgZWq7iaj+RFJ7inqKqj7ZZzFiGKSIRYIGiESeplb-SsfGSUloy2lWz1TxFiysimBc7p5MfUa7tHaqSGKH51TrF7GvwlxgFcyY3NYsfIhKhFKypvwgHHlafISSL3q-hMRgzrJ+fjSffRoTy4jw--ro-8i4l1yCl5z073f3ITwUBq66K6xzS0rh7+feBDFYyIVnMAlMfzwRToVaSQFbqNzqfwffCrf4iQlwIzjn7jqApflMJNtKOULaJsvK26PAo4kPTaNYmO-BRGKgBCxJJE6jZZinxH5v9rSRGEdvhnsTNI7EvVEkmKj1T1pakqFD4N+VP4io-yjrJpLQU6LZJlu7-KEP8EcSKJRiXqZfo21X58JsinBD4LE2kQdIuYt-c-vMiiKCF7Uo5Hpq8EBDNIhU2pQIvgO4R79ACTSWZDIkT5ZkpBDjEEEgONT2oeuSglYucTKLMF+UijJ9jeSmSh8WGWfSPggJN5ERY+MIEEAn3jTJ90qhSUDv6yyoQccq+DATnBz7CIdZMpYFDjfmawNhqqWHUblD1w6DgmqJmacKJySx7d1wXVaIRbz3j9VnM+1Wmh5CYAtgFcBudIBiCVzPh38zHZ8HPQACSBuDjkpy46LU4Iy1G+AEPQjZCtqCWMTlzwk4d08ht4AoVMENwlCyhcwCofQnLz7VahF1SIJxyM7SRbqanAGv0KgCDCihIw2hGMOgD5YdOHdaYZZwaHzCqOf1Uzn0OMD5DChwwugKUM2HjDPMuwvGvsNC52dlOEOWGssPOEDDLhxQ64bFzeH6g3OuQz4asO+EbDyh2wmzjULqGQiAub1FYWsKuEYg-hXWbbOlF1xI5IEm+fahgANzIjPatNC7PtRYDQioehXVmnCOBEIifhNw8EWjXqiFdBabXOHGV2WhMjJai0aWkwAxH-DYgDXD4RcKGHUjRhdwn7CrSui1dxuQ3VHLVQ64Td+up3boBNxG5-5BuwMKbhRxpqIx5u2qTRMykUHB16c+MNbrx30ZHDZu5OUXNb19r7d-a+eYZgqJDqWjduN8G7jHRYiywZcCdVAKrGe6v1NcDsHXMOFzr51SwVsYurbAB7vCnYYPauoZk551UnczdNkTfDbr7U7AKPKERmIDwsQ-0vcEeoHjJSE80x49TGk8L2jeBKey9Z0V1hPp09AuZYrngfWZ5vUGxNYovA-WrFl4i8KvSHj7wF5C8-6ivdeHfXvgdjBxN9KXiOPF4nwyAZ8eXpL2HE-0exXQf+ur2nxfwQGwNR8LryHgaJl8q+RfBRz45aQouxUc3vqOIgIIpYvYm+EfnQQ4NRueDJyJfmd7Xi0OMHe-BQ2fx9iaGAfeMEHzuYhk+KqJNJDTikRuoSmWA7RGu33YaJqmXKJENW0gnAYKBLhAlA4U0QlNj+f6YlLynwq2tLBQExyvASvahoxE8EnEpMTzR-lvGuErvuYNf6ATUyBKUpDklsYogdmoAwNmhJSTWJkQtjCRB8AYloCmJHZeSrkRm5EQJERGPCfBMgLepCMyIeCQc22S2oRE7AzFBeJrDSTyS3qD4N8Uub4SLBhFI0rgW+DOsB+MKRlAJMsRUFakFraMvBNQJXpvUpFWil22omvAdKEyfZEakApOSLErk5pFahhBAZmmJJE2OojyaCpEi-DVCdFSIw3orKulJpJ6hKZeoI+DJe9HangmsV3avrasiTExSwCvkJsODFn0mbAklJ8UkMqxWBD1s4k8ya9PUUdSsUmUsSDouEmuTowAp1iUmIBSkrsDVmJyVihUjdRrtPUAKIyYxIRaplZY-BREOjF0RzIBEDA60m1NMJ6kwqeyZ1MpJSRElLE8yINAvy0nchYQiUjqYIWkQOI4WM059qmVwKjJ-goUjxPMREStTomeySpDgMgqDsapqZeSZNMhYjknSaUkaSkn6nKkNUYfBttyCbYAsjSwE1RKBNJjgTjxUEF5MoisrQT52HhWGYYmA4eUfBJISDscGg5gA2hYAeDrmDOglU5MZVVDnvEiGYdbMKonDnphSB4dS4BHJIURxSE3xOqNmbWl1mo5OYr6HdDcILB3qeYqhk1D8HvUbFzDuOzQ3jpFnd7tCNqOEeLBZgmHNV1OUs7uFvTlkKyusinb6q8NNmLDBqksugNLJU4PDAu8s-TkrM7wmclhEswcLbMNmd456TsyES8MaH-D9ZXs5rgCJmxmcDZXnX2SbI4hrYDowcu2TfFRHhdkxNY8mvrLxEyYCR9NDugAE0kut2cXuzW6i9QuaTAXLpHL5rJcBanObkVVz+ysi4e7IraDV1TlTZIcCtCOSHJ15ijEcEtHWlKKEBdc2ZA84GPKNVHDd4w4U2sMTiThC4tuxoj0NRQQEGCDRq3W2qN0habcb4XtQWEfQN42jDuO9Cjtf0dqh095Vox8K6OvFdAPRD3OXD6Ol7+jtcX3FiMGILp0AwxJdMulGPLExi3YEPeMfXUTGw8uR-c13N3SJ5vV85fdbupjT9kY9sx0sHMnmLx4D03URYgGjAqLjRyKeSefeZF1p7NivwCCtngPGPl41SFis9ngQpPHdjJ4l8-8DXkvplYFxe0UfGOJXFDjXZ0vNvPt0-rcKb4yvBharzkwAN1xs+OkXV3Abr5QsICQ8UwAcHERTxW+IeNPLyroNOxAkO8dg0wRPiBIJoV8eEK6yUzPelDXuL7394sJ-x3+dAURFUZ1k5yyzesr4Xz7ZFZCMBdFEEQj58tApuiexHexEIiEY+7iiJGSlyRXpwq5Aric2xUbuNUYgZJafE1XlQRVEmA0RNAT1RWVeW-0zZHlJ1JV97UvkmPmVMsSZoAUxGEogS1TR7pLyMBGJFd3kQepx0uyGxN6jbZeMMmd0wiSUg0roxtELDa1MuTWmODW+HiHNNElQovEemQLERLCHb7dEMYMfPKfYmsTuEyU9pNJD00gI2JdkdaMgb8xGb58kWFRHktKX+CqkemLE91NelmToojpkk1JXVLTaR8O2hyK5Wo0Na6VSikiDVMsteBkoim9k+trWQ+XKk-KoaC0kygUn58Vl6MKIjOVALTSRJs07gY0kWQeFMCebEqWoGaUep4QNSSxO7WZTVNJEABNNroSSJrL1FTyiGR4jERMlXJIAgiSZJCRkrbEviUNH+kxTDSRUaSq1nsjrQ2ImkyGUlaqxoFAUAlVicRCUqGJkpvUn5UCdcTFUQCfGrAwAhMhCUAFbJWzC8lY1ukor7p3ApRHEjnJaU9UWZf9G4ogFqI-Kh0t1CIlJXZsIkQiIyqOVMKnSSQnqV4BuwxgeomkC5J1a8HrY0ZEQh0z1ccG9UZSZ01bQSRgtyXcJkMajaRO4nRhqo90KSnvjwNCoZJIWvwb4MipX52KoI1icQoSqRDFp0Sma3fjwN2QCE0kVUhNiyqTZWDVWcKXhn2RRL2otV8rfJvaQ1SlIVVaaWDKiFAl+M+VY6QSiiDXS2T8ZxweGbq1bXn8hExU4EoawFQx8x0C-HSsvIBCwgDVRa0SYmsGTvIBWGKZCs5U3UZ9oVBqMohIibXGSW1bK54JogApoleUdZCNbiqxYol92syLkjUlJWCIPUDhCJVa3yK181GE6GFFs1XZzq1AC64tlYOeAeJ1CaLP4qkiOV8qo0V6MiVvKKUfKPgMiYlggNxIfBINiE6AjYSRC3pUBh61FeCkgKOIYSyGLJV6g8mNpY+VlElLEk8ZFL4NPSYtTWF6aaIakc5M8mwXI358o0tLaGGGrDWcTm1YAyJseRYxPJRESfSitJtTRAVvieyLFHqhmWBTlUr6s9iKq-U743E3DeZFWglXVKzWgIVjNWg9QjLUlzaZDNZWdTaJcSwk+jUavBSsVQqJGBRqFSEHabZEuidpQyQlZ0bOBQmsxCbA9TWIb2GiLFJEkg2dJUig9T4HRkU2PrlN2TSKTnx2kcTmkOKyzT6v3Ixo60iaBNfYr-J6a9SiEkChZtj4uD91uLUoqIhlapp1WRJI1vQIbL58x06k2pEen1VxIetwzYjU0kBT8olFPfbNmklQrBFXmuyHrfsmiQ7ldRyFK9RUXhCIh3E7GY9HVqgiqM1B8m11DYhn58rpyRzalUdKLQHq4tR6+ramneTsDdiEqdGVmosSwFbUOpSLekVO3Cbsiji0tGRJ8I0rftHi+AnsteTPa4ZhM7wXxmyoFhyZlM6mcPgqjIdywjMiIWpiFnYcb49VfTPEPw6JDtZO1VIWRwyEXjDwHQsrFIF8BkBShdAQcFMEqETVXq-oA3CTy3qHDlZ4WVWW71g4azhOnQnWbtV6HERmdIkNnRzuXpGyedfOmYQZ2hocRVOTOlnQrsKE7CesvO-nT7MF2uz-qgnHXekEV3Oyw8huqOQHLNHSL3h5u+XZbr109zXO4c53aztd2c7IRNu1XTCPjlrULd7Ot3aF2JrojwFZNLEcHvl2ZzHw52HOcRF50FyUux8XwDsDfikBewaQZsGGG-Ek6GRtcqPcLRZENwJR60arqzLrntz9YfIr3brt90udRa4otuZjgm7DyaVXQPri0KNpKj4wSi7vRN3VEoxNRi8xRV1KJVnyjRG8lGBokBVj6nRN4nnIfNZgUKOCDu3mOdwvlaKr5EuN0dLHu6y5E6vo0gK9w1xe4PugYliD92Nw-y4AQPK3BXSroAK4xX7R8ND2dxt7HwqYliCntgWo9hwtugA5j2HBMlUFPWcA6T3dzSx-9OC-3UbpvgVj8FjCwhdzwHh1iwAwB5XXniAMB6cDY4oBQg3oW0LiIzCwXuLPHFP1FxYvR+NQZ4VTje8-eecYIq6zCK6DeocRUAw3Ha9m95veeQLPkXb4BDacpBgotc3OhNFy+m3sfjt6PiHe+DQxcEBd5VhRdn4x-OYvoSWL381iysABIY1EQBS6MIUkaBoFilNSuqGUoOnlIg7uQNKBklUj0kslHl2k3AuyXCTP9uSQyapjiU21pECSwiUpGIWpyGMxS1JRHYYi4HcJISoiERrCUzTwkrCcrZ1FKjRLfABNiGpdkaU+IwUficy-4tsR7YJpgSB28RL5pe0GHFUUIakgcS8XF8EiMJZgq2nhBbLbDJIMVLkgCWqI5N8yI1FYTD73s1EQeaJD4fHSWsWiRAo6R6gSK2qilFKLxpimqZMas0YSuEv8F0RWFRBsxAVNv3xRLGLE97HLRkkvRQlNjQlJZlKVS0ZGojRESAnxPeCPMTyaJKwhoniR2k1WrRmJQjJCRMEPUjiSVPVNWUfSGKhJMJfVOsTVMzJK6EorCEEKWFwZeyWlF9JnIWrrj8WkkFoQkQRt9GiiXUtDrOl1T12liD1KUl4aFqKj-moiPNLmSooUUQRcddug0rpHnUjKu1dU3EpCk60VqQ7aGisIZoRka6Bcl0sNU9K+E4lRAShRkrCIwtiJPAqGxIwPF+UC7L44urH54ELygp9NDolc2uHMBgqkAtS1iTsm8CfZb5vsjXQRJGlJJSUqwM5L+rLWCxNo8cCBaSavSGSC4lasHL1kakJJ1FNTkhNDldk0KOtf8msSNkBEgIRlhUSSL7GqkrqDtu4noI-azpBzYFs5Rs3vA0Tr2qCPJJMP4pWNBK3ZGIWpZGp0Cpyh9d0tZXyIjDsg4UmYa9QWHpSFJawz4g8FYZMqqO3wejv8FkNAhHM7HbN1x3lUmZhO8jiPLqpxDDMFEHmVTu6Er60hROg2jLM1k5C-9pQwgCbmLlPYudBugAFqIG2xc1c2YHJ5w8cNRahtah0NnP8zDzMuroP6HXObnOoHNXqLJx537m1dLsqrFbKAOPmmAW5189pz3MHmlI6u+zqBbdllYHz-YJ849kAv3DgLdu0CIZ2b2-mYL-5zqPHv-BI13OsBv8wBcIBRybdH5wPU7uT34XMLUciPRXpQDpy1zcsB7FhfNHxcgDu51Pc1HJHQWNzGFuC4RarkTRGRTcwHA3PL3f7sLVemi-V07l4X0LBF0OZdD7kld29g8rWsTr70qXx54MfvSLtHma0R9EhimOTln3U5DQlyafc7WRjum82i+i7kQcfB+0j5+eDgg6O32c47L-4a+bHU9GPc3Yp+lXFyLVwX6UxV+1+cgrli-d-uH3R-SD2jEv77cqB0aCApou-7YDbFkA8RZAsCR+6UuG5Ljx6xStMFqVksaxcyuPhkDS9Ug+3HQPNxmx-oEiwQdqv1WyFreaQ8Qeqs9j3LtYcgwOK4UTiaDo48Xmwt+ov06EfCuXhfFYMj4pxv9Xq2IrXHcHJF8lhRWTDkUwNlr9O2i2IYgaW9rxnVrSDorkN-59FCwwhm+IvPkMNDBe-nr+N0NsJbF2Z9StynJI2VoKIIHU2dPklOUQCxxtygFM0pGovFulL6S+VkbGUpEHpQ0AFIqbjJpKIiZMwonkoXqYkuFVSk6bUCuEhJ9BbMlxUvUnI+KB5KdcJQ4FwybjiqYiuSifIHE00WmvNMsZoq7LTKDFeCUhQtaoU0Y6FXJJhSS1woA1NLckyTfRPHBoYjlDvlgWArPkTkkBFtFBWMOwVYtAth60umnJrKTyjUmgmGbxvJrO0cGcyVCXglPpSTGS9RKxiG15oBSYiJM2kSIJ+I0bf+bNuMvfQbKfEHpP-tylkJ6pgQKJE7SqaQ0hkx0oiE7tOyNS5J-Vwg7So432TtKUj8tyI4LfRtCN0UAS2RqoktStbPiTSLJbu10TvoY7860mwGlD7EtLUifKyq4r5XPAFKVG3UfZNzsIb87S6SKXpNLRAlHWvKzjSeoqLEF6pYJW2-ai1vBUuVPKaVZBtA06Vy2wM5mzpr1SDoJBI7dFJBq1Ps2-JGSwDb3dGkyFBm9iIykWe005o61B2l1iJTXviECVVjQsvmqtNKCK7KzHkrmrjUBTDUmZso4ahpvt3g1+qKy7xry2Vmn1c00psCRSLwqhSC23fp8U5OCpXK5pgKQWjbQAV8C1xMO6huJPZJ2b0SpTdxISnesak4qEdhP2EFPlfg7hF1eEnKMK3KjAaSUqok77ipYi8NyNdUdKTzKpEhKl-iKarMdkDmVyXUlY0UqX3HBd-QkqGgWRRIY0cktRmwUr7mEIlbdxDPAJRkNFM+tdwTYrfPRS3PU06WJtXZsSu360+GGpBHdqRiOmMNZadE8b6Oa31BkZLAn22-tsPf7Yk8R0MlXJkTRNIDuAVBufSJ9a0zK-LRg5DI7Kgimkgtrxo0Ka2fE4y3EnQKxNiPaM+ayCkMzYma3rpIaDtm0ohO93amDxa1oEe8L8TJbHrEgVpWhbvosz5DpdI9LSR1kOmV6UmFRRhRdMiVsFPaVQ94b4lYSphl8qMVYISVtGRpjJ2SXxSqD2+rNlwx9eUQyF70CIBwj4t7uWVnrDq166IXydCIm+LlH1hkeR2NtiZxwUmcmB7PqyqZQQ2mUh3plhDiGI5qIazIVGk7OZ5O7mZTuSGWZSO6Q1mejIZ0rnKDXQMQMlyt7Lmes8sJeD5nqHHnN9MEM8wN3Ouy6rzjz3WXtRYjfP+gvzshcOABdAuFOl1E3d+fMzuziICLlsDec10OywAqL52Zi5FknCcXXz9IIi4Jcg1-ngLpC3ZA13C0g90sPF0i55GAj4X1L-F0RdeokvSLYusAOy9pcxQbI1FsS6bxj1sv0gTFrSInoS7EQYrBXauS1HF4+hc9M+Ai2XJFfsWiuQl+uaLUblgKlL24iS5K8d3y0HxuLnlxy7loKWaLnXXvbKI0tTyJ5L0ZUV3sVEqWR9CoubpTnYLt9HlZ3dedqILVdObLO+1q-ZdX1HcT5IhzXa5cqtgBPLN+uOsfqe7J0mAb3Z+ZnUNjfdwrd+yMQ-qYAW4n9oPOK4Avf3-hP9SYg1xxBStKvSrrdOBSi4ZcgGkFxEUtBAbDzdvoDiPFiAC+KuDv23ieCqwleUVEK23aLhq9O7fMtW9rk79qyIujdML+xnziXpNYEgcLBrW7lTF3kYMy9mDE1vq+wumvLjN3avKfAtc3FSLvIMigffuPN6D7Nr0Cc8TteTcHXrXha3Z7WCUPtVXerQ3s10DMVXWOI2h2hoH3utlP2jhKN9De0ILwh2CsqkNLRnjRttQiPtrIyEkhLAh9k8qxlHw9SWJaEjiib-vGg+ClPKTVRwlKm3akXMv+sq1GEWlSSHFrEaD3x7EuyOEo92GKObalNlUpxz1zgrpkInglKIY0+kttPZK0qyrtS5xCVLATgm92n0tZb6URtaWtb+WxaeVbKVxLAh4JATC23stE-oxq3SgyKZ0W6IsnLTk90y-QOpW4ChEWqjlRJQdV0YfHP9gramSQqep2PtksNXyi1V2koKBahRjmkntEDPg2-GBzCCvXFTuykSNgp6iUeZGKC-LZcrSe+0cE9tdpAbWmmpYRG87cdv-JER9bzFLWqGjxFesw3hVcTnRQ9JPZY+aT8M8n0Z16pNVToC2jzYZsKb82imty69vj0MqMrPSR7-7T-ua2Iz83Y7KjoW4lrGYz2zyQhOh9+v2ntTAUUn0NJPckSwFkKy0-9viY6-TE9CiJvYk60i9N2fT7TexN2tn5wfO7Dxy4kiEM9qMi7E6VdvxSI898K76ja4uqmaTE3ZvMHoWwnZQfAEmM2jfBxncJXXJO7+tu8oHcNDB3C+5WvfuHY6nVavNCP+gi8wCKlmnyrtpyg6sju-rWH-X9h1uQNvU4Z0am6Ca7aeKW3JPtiV701MAdq3o1rt3b-4sHSEPutvdv8t3cApCl8ibjr5FLcgowPDiXjIr3XZK-C3xiD5apNmj3H5O1N75QU5cgR87kQjYyNErYhfInlZ72pAVJ8fQdceQy05DpOk2f5CUxfSSA5suRhJrkvUGJLDxQSEZYqm+6hdjBZtJJErakHqTon9Pd94omGQqSlaoMZTlbSSTZe0umhoH8-Q-gxSFpmVhM5kdj+ZB5UWUi10te7Mm2pBGXjTIz3EFh+ovygX6-L4JgiD0kHlYmcVzPUkyUn6W4Y+ntvvdz4qaQ6milJpR3r5G4bmX2lfgi0mxKMeVI8+1SlqTUpekzSpStpnnux9574Q1mTDIpWyTdu3SSlLDzZuUuT4pMDfbj723NfmbzbD++-Dv5RJIlLPdGKiJ-ZP42juPJFyU6KRM4s0bJpm5S0E1s7bdwIdsymuiAok6N2vfv2RRJUKM3XY2CAMy4pBCHQmhgc0Vb21Q7jWtE8J6mRAX2MDtXMldU61LZldtaKZ6UT5OYGEFIdgfajxrBZYfwnwwi0Z6TBBXbDgkGZLUCokMdbbJFlRYFyFEnRhrtHR2WZySIkgkE4Ke-ymQlCGChgw2CVdnNYifOG0o8k+EjGIDivObzUB1+Xb20Qt+admEE3UA-iIJjDO-3N9vjNfiGIX-fqVQxTfYQWrY8KKFCkQj7AQJCQ6pMKVmQsyfTQCptNddE4owqFEw48vPPxz0DAQRaXhJUUVj3etjvHJDc8FyVZR6lmA5REB80iQgOZIJ2CdSIwcKW1Uml2+VL3rsSQXAiQ9XmSj17JlSLVWnRrpX9WhIwgqwL0CrUOTQ8NnbN1G+8a1A40PRiMBRki0AzQeiuIt7K1FaQtVc9S7JtSQ-nW0f-Hj2ZI31R0isQXPT9jhAiA3jX2NKiTtEkIzHc-x3wGtX5j+IdSYKX2NRiUFkJIupRO0E8hUAEEyR30LX1tt5JPCg3RujDGHt8d8JChjRLERR2VR9jOdnwwtKAyWKZ8+YiiIJriZsj4EqPA-yggWJOUnmMKSLPl5Nngy-0b5PUGEleMZvOQJB81ADoxeZDkdpW4YEAtJVQ91EYYgpRMPTjE8EOzMDjR0hMfZyFcsdYISHN8dEWWZlFzcc3rpJzBIUnBeZLoVFcD5BczHMNrUWU2oysRWAgB+gVuT+cw8eWDkAsEWFyAgGhBUTCxFXN5wplgPLAz5lZqO82JdKADkM0xldFFzkA0uT8zJdNdH80HdZQwWHlD7Zf5yVDSXEF3uFILFF01DOQn2W5C9Q-2WQtmXbcVZclXE0O1DOXT3TtD2QrUL5dFQ5UMFdjQl0NNCk5ImjREaLFRS9C5XYiAVcUXD0NJFVXckQy4V8LLmYAXsNkLlC9XQSxNd2uUvREtQFGvTTCW5avRL0bQuvWktnQxMPd0W9RS1TD1aFS2HkNrHvTUsXXYGGVEUlIfR9c55UUP9cp5CVBgxzLcfSlYeUSNzctG-YiAcs19JyxO4z5JfUXcugVN0P103L0V8ss3DaFTogrV3BCt83NN0Nwi3KK1LdgeZ-XB439Ijx7AkrC1x1hIFMMIzFzQ8MK9wE4V6nRYe3K8NSRCrJV3PCkDMnndC8Fcd1318oKd0HcLQ2dy-DHww8wPoOefsKqtx4DqyAibQeeAoNWFPd3-Ad3DgwHNjhEa3F45AcIDnET3egyEVz3Fd1mtODea014eDLcWwsH3JfFWsDxPXg3w33BRQ2srxT91t5v3Y63-B-3FQ3fExQg5yUAcoMMFA9veG+Ag8-xPQ2g9SAi3yNImGaUyJY9kFzQ1sRUXFVb4DtYRCWQN2f4Fl9IQqZF-x47CGSGRTDaxgttytXFTKku+EciIDh0fpEyNfbI0jOIE0bkh9ZZBYAK9VAtBomlUEjAQXcDOPTwJDJBkfinVQRSI7QkjG0KSLwJNtJ4kUpOkFnxFRjI7DyEjPlIphYwWNb4AQDcVJFgj55WVzxrQBNOXxFQVIu22DVfkJ1joFvInyOaV92JSjki7A2xyA5WULjF6QGGNKP6R0bQZEqI4MeojTYhg6qJ3wNKRzVKQoSWllPIjIrVHSjjSOo34oNuYZGsjI1cSg-JVlVynGQ9-Cny+DOUaoyGRwnPCV6ItUOKPHQRIoCkk0nybqP6R0omlDpRZtC5Q24zg3yLKUhkHwmpwXVLaKqjJIpgBhCDkPslgkDfZqKRDbvFENAI7lS6MbQdo9JQ6V-grRGGidI4ELSRQQjKVE0Po5SOajczdJDYJg7cJVuInol4OdtUYG1DpQwYqEOOAdlKVm6J-2NpSqCe+dxmu0hSVZUuY8kEKJ6iIYtSPgIM7MdVmCVo4dWRYHGVe0bRQo9KOPJvUSM38I7UeYmWiWonIjxJmya5FkCSAtGLUB5JdW18RZBZCgCDd+IFkHpAiPzxkIIkVGIEiawHEliMMUckgrVMJJ6KBYnmaQjrIEQClCViZo74L8iLiAIkO0dg6tR75f-XEjUR-gTowSMjYynw7IZkOZB0ERSTiitjpYk015R-CSO3OInY+x1TIa-YUhXVxpXxm5iQQKdh0E2Pf4E4olHVKM+jmo40l1RiUA1A0YpYr1S0JpTGp3EZz2QOKX9g4tRj48+NRaLLsfInmIKj+pYRhVQbbJmLJjro40lkIkiKDDMEmo66O9RApUCWhgV7c00UiENNs1KiiZTsxJk-BZ8RYj8Qo50d4QheTDx1jFJSFJCxza50pCKdakOvMnnBkIyFRQ5kNo41qE-Ak4uQ16iXgpAChGBcULJoWF1zzIDwOchOMWXXjYXaUKkB94riP-CesY+NPj0XWYVVCDFdUME5n4-XTDx34-UPPjhrM3Vl1-4yzkAST4xlxASHOPeKgAD40UQ91kaeBMQTfQ7zmXhoEz0NQSX42OT9CU5etwQY6LP+ODCiwbOUVcVxPVyjDMubLhmAn4hBNwSdMIvUksy9DMNzDxLDkVblCEvMKtcmdCBL4NWubhN64O9YWVrDNafri9djaN1y0smw6RJ3kjLbUQopU40UJDoZ9bUQjI-2XsOTdBwuNwGQZTU2STcJ3CcP30b5MACP0ZwpOinFz9dOgDFQrPXELc-ue-Wittw2MWTda3NhNNcW3BHigVj408KPisExBVeonGG8LANutftx8SpAYdzbwAk8sUrFk3WsWbEgE-kKZ5MEj+IINAIvcL7hc8UCMyTurDdyGs2Daa04VL3dCPJdEI6LFPgBFU9wwilxLCJKScI69zwjFrYsPN4vXQ3gUUvXFRXN4GwimSkNxwsAC-c9FBQ3HjGIs62vihXTiIsVsQP3h0M6GfiONiSQemF4l7CDoltM-iclgLZ9SFcnhJBCapgnAmNGgQGVq+YXzOZPGe4k+YxiPr339nYqCCWS0YaygrV2NCSVsZfWd4A7ZUkOcj2TamdDChlktW71GYRGDqR8Zr+Cs0X8XI7hAnB2iVlhCYrgitRhVPJQClkjdSBAWS89k1ileQgMV3zKJL2SdknQ8mMaKkIgfJSIWTjgCcCQof+TqLaQxvSdkqR6yCM1SRvCPZL-I0nSQlhRYJAST+MPmLe11E9kiT2Cp20NVB2lQnTySsjykVWxwFeU3rVpYpCTwh5sXkosnvUb2a6WqYoQLlTKUPCK1Fqdu2EEG-4h7NLRSCSvCuxSoyiUQUUo-fSdTw8iAnbQyRdEeCWURC+LshCIdjMGVHQ4+ZCjEQcyQglBTpowuPsVCUAEGGR4CDpDPJCMJ8nMCWMJvk+CbkmsGVs01NRACVUjXGK+Rm0UQKcRD+bB0VjbbEbT08+UW71YlZg5JE5NOkb1G9YHEKNKDiiIRpHEYNNdIwyk8yd1nJRTVTNGWkw1FVLlNr0Qem2QlpGPxfVnpNNlRYLmF71tsUNf9ksYkiO9CTTpkKAnZskQIVCrIpooWOjTuQKcCIwFTOAKJI-KcrSRQHEIfmBYc1NtOnYWCJxnWYt7LVFDQTTddG6l2pBfx9TwUoiBXSiVTgkBAuGDAjPTjybhn8JktV5ANT5A4eBfVVlTVkTNuTYaNiRXgY-lBDnbFwQ+BJUtEk-IzVcRFm0z0m2N+UaNSpm6ZbbCcC3UrgudkRUrWSdJRhyAuNFoI5WNFm9TrkitNuSwdVDTBtB05sjPTyA61B2QIbZHz2SkKW9Gv5j-D1PwykQAFWekrUWlHjjWMj1mi9oY4NAiUEAnjPQoPkktMAJFItL36QJwQLUgpdCTNGzIINfpC9RkmVyhTgb0e1GqligvhEUysZGT1DYJUMyw0yOTVdRWdeGW1IwylCGjUBQ01PCkejKBWWE1jIKDAiQE64nQNVN5ESFPe1unf9VwFmMejOSYC1AZWWZBUL5MCk0WC4mu0KSCTPSDUKAVBXIHIq5LIdlY0lMlJs0VEi6ZUZURCQywyIEHyDmyN5Oiy+UNDA4CDtIGMKzq2TVgTR-1EO2iyJKGnDaV3yQAjfSUkDlTPZkQTDSDIMMtw0m9D0CQnVIQMu40alHiUYkKdmsolFQzbvEtBAz8bD5mds4bcYIGzxCVgOzR71PQjPSaUd1G+YS0VgQhDE4zLLUAJwdIJf8aHNgjFII0DTIJQs+IZi+ZalYKIMyIU9IPDI1ldj3hIC0lDVSkMleogyVHTV7PvStCM9mm0iVQFB+y3vXFiKl+YjcjszlEWhy8U1iMgQQDkkadn8D6BNJz2S3M4rKH8iHcVFNY4MelUId4VYHWBzbk8gPoEXVOAkEJ4U7dGbQAM2lFEDBmOTNSCsstimhhMNdFEJIGKclllJb2Yh16yf0tGPOywyPgRUIvFXjQLSTVZIzKVlAzST2T5mOAPGZUTKZzRzZckYl1FujZghFzTs4eGPIUBJvg+SFgwjBRJ2mLtFjZvM5yN8zDMyAlaU4HIAkL40crdVvZ6st9Td8fMkyMMz8bFZLrUN2dZPdZNk+VS6NHmDZ0xCQObZzUBf3DHXFCCQ45xniGZeeJMhF4jIWXj+zLmSMwZzGFxI5N41mQMsd41czbwqoUgAIjKqWWX8TPcRWW-j7LcF1FDKZW+M2p746XUGsS806AVD68KQCrzLZL+INCVOX+L-o28svODoiXY+O7zQLL8zKSwElcSHy73Q8FHyu8mBOtDCIsixnyyAUvLnz9oZBNwtB89fPby9oFKCgTx8hbH85bQtfI3yqLf0MPD6IYhN3zSEwyxYtO84-I-0yRIuWfMS5Z7BmAl4WfKTDi9TxPmh0wlhM4Scw--MtdeRAsPPz98nkUESUw91yHkCcOAroB+uUUKkSaw5SzVE55UF0MstRTBB5Js0TsNn0KgrAt3k+wzJJ0T19OZFHDbLMCMnCu3acJ8tLEl7gCsFwmxJfkVwsKzXDHE4t2cSK3HcLcSDwoRNrBG3FcWbchC1tyfysxK8NII8rXt2kL4DHxNEKtIWeiPzXwqnnfC0DNekSTF85JM7gtC5-I-DqrQgzAiT6HJPPoIInq3qT4I2sFgjH6DvGGteFYiGQjhAVCIV5qkwpNqS4IrgyaTb3JazIiSI593IizxSiI-cjEgZNoihksDkd5Rk5PMfBTFL8UYTHwHiNuswou9MEjNkJCnUDgSW7z0zObfPiYIw1aFR08HSXxUB9PGH1gEFVfPlTuMcBa9CH4kg3xTKJBnTMgQESYTOJ3xWY6MnyIzPElSzSwdd0x5RoYtFCaQY+e3LnJ+Ca6TG1oM3ore8z-VGElRA-GPnQlkYo6VtR3U3xS6lGHK-wai0kRYqHJHiWJG9Z8VBdOJSl0-hFYpKnIqXVYjtYVM40aUH5AaVipa9GqUzPYFkJU-s2YKEQLEM8hs1rELwi+kjNR4shZ1mSaReRdittAtYtc9QJpIs0nZT4lHEORjaVdinhj8lB6WtFRSs03-w4IecktJRRQS-PnkoNNGykh0k-L3JSLwUJglzTn09R3aQY+fIqKl12PSWVUMSzATgwqne4gcZaSv7UZRqWPZSEdqlWyUmkDUDtBIxOSsRGWYgYgGyOR6WVtnYDXKTSQls+VR6TbRIMPYjvRvbUkqPYGWQP0O01EFhi2JFSgAihR52R1lTVfFBbKyLfiyxFyKDS4dHAyii7FDKiI84eOxCuzXEPHjMdKePwZE8s50A8SQ0czTzYhDPLucs8h50lCOqZ5zJCekwvI3cvQCwCt16sCvOHAvQaoT5CBdY8yFC68tWSFdAwWkKlD1XOMrD1kXAqmqE5AFUL7ysXafKpkCypvR1Cw8ZMtLKDhcsqnzThODmrKldM0Nep6ypfPAsWXVfKrKIAeMr4MuXcTDbK3Q4sobLQuWEVjKBywsvQSwuEmmvzX3Y7AKoLAe-NDDxyqhLfzeLMuWnLBylVwEs-8ssI4SjXUS0EK6uc1zPL73fMOtdvQUcpaSYCzMPLDgYSsMQLNLXSw9dRE9Ar0sk4Ay1bCUGXVHeQCC9RMO1t5a2gtFqCsgtjcKClayqxDE9Qq0haCroHMSGCvy2sT3uWxPYL7EzgsiszcTcPLdYrPgtCL3E5K2PDiyvxKTKSyyQqlxE0GQqvCaK+QooqokuDkoqF6FA3gql3TQooqJy5qwoVvQFivST4kkg1CK8kqCLcKprH+mKSCkiCwcKugJwtnEqk0pPErN4C91XFGkz+GaShyvwsEM1rLStEMKI7fCoi+ksCMGSz8YZJ-jTrGIpExxQyZK0NpkqxTmTCkSqJUZPrfFHdRoURInRgtUDFGiYGVDFHYIG1ctN9SztSAg9J+laVTgx-CLyruMxtSoLK0z2NnJK9vgAAgKIUBXJDKIvKg5mcp9GaxmuzAq1IuE0+KKhzClPmFyi8qdiSILzZ3gfMyA0p2H0y8rziy0yJSTsklPAxzbL4jaRLkPjy8riKAgi+V4SNthqrgiHUmpyRCcrVqQZJD0itTFpeEBqqg0ZGPjNwnM4KsQ+mGnFnSdBFRCHVs+UQMApD02YPeAsZatAQzC-E8hVU5NKZ1Y9eczyv6R9qzMj8rETNpkUQaqy0lsIz7YIj2qTVUYlpYdpd9gSrf03pmztUUCNjDRaWLysERjpLtBZMZBapTIE3kR4yRBCHUGrDIb0AAKDS9clqtCR+WBI2ikXiRlC9iFAu-h0FXja7OuKh2LGScpziWbTgddi1IkQF5BWdKmKKc4TX9sBKcKs5UI2RGrEZU0mFPpUemVVn+QaKQ7XzNKixtHCQ5TLmD49lSVDBJKbc73PBQ3EaEmkJlmTAiuqRUTRDwJMgsz3mMN0XmpSQI2H5GpL4aryqYZe1LKWn5fqtGNKRU0HRD8oR-dVjxqmAZaqKkLktpn9V0sxdIoymar4udtFEbZC+97a5apaJUZdwnUdvgXxQmzrWEYmGc2i8asCMrU-FXjTza-XI+BxHO5QTJxiYw3qrpiHxl6zr+R8mlK-Ka6UICg8ELOur4lGgm3ZGWFNR60YkA4r88jkf9TKr9pO6rRhPgDVR602YnylbRlAlckbrkakolAJHyQWOUcLav8gZRGpUElRALNXZD6ChPOclXI0a04p-QJPWRnZIAlY-yWrRinUnaU4MQzSzSX1EGUpZMNT4GGjvK+APGRuNXFh1rYjEFTsQc0OJC8qLUIImuQnEUoiarh6pOrqInDe2KcY40BAOyQIgsZA0cgM47Pfr0a1RkP4Gmfsl29o6qWw8VxmPslRIw6qknNNovZ3L2r7c9QUAoRkRhzyq0igLV3RU07JFRM+yB+pSRRAp1j+N1YxOrAakWDVScQPNN5KnqlSfSUxQ2bO+yM1BUGKNsJH+VFi1QyUFpTI9bSCpgZqNSh5D4oYiYJhKIC0GRzH57snnIgDoyTbW2VHKVyo6rrpaClIbciREwRCAqweOdKUdF0tHjuzd0rjzPS8eO9K5485wJ1LnGUR0wV4+5zXic8mnRednXEyEZ0kyrcCuAdzOsrahUyxnkFChdEUKzKgDMMpbyPGlsC8adCzsrah0xT+LAsLZNUOxcysL0E8arCkfJ6wvQGJuATl8yqgpdkm1Jut1om2JueErQnsp4Twm+2DSarysORQTxMApr90imqOSnL6m8PSvzLym-Olc4OOgDXLyEpMs3KPGygG4s5Lfi0+xkwx8uPKloU8tgLm5YHC4TpmnkXr0umiJqqb1oXuUdcRE4iPfLscFBkQLlRTJNnkOwP1wUTkYM9niMVEw0QstiYFElAr8Rbbijd+k8gvzx+kx0QgrxcCWAP0sK++RP0s3HN0v0MK7OjABb9Lgo3Cy3ZVyQN-5eK3Yr9wxui-12msAGEKqZGOSytxC8TCyaO3K8KeAQku7kxbwkpMqRayrZ8IKo0WsdzULV3DQtzxMDTJuKaeK5sSpb53IwsySTCld36SRKuCNF4BrNlsnFlcJg3GtXCxSu3dMIzwtwj1KnwpaTxDJ93FbMRfSqHgek6iNCKTK+3kiLFDfBGUMxkkxXFC2Iq6BYAbK6hhmTIPGxUcqSvdKMUyn0VyX3QeGNNnwzwMXrRCJhiEVXlUh65qv1yzsz4B49VMw1iKkfCbmK3U8vbBxVKm7AuPyrbk71VYFiTB4ndQuY5qJG0-PBJ1gISHN2oyzhY4eG9UmMLFADstEdQW9a3vaFiPRXKlZwTjQG51uTbsifTU+AAAlIxQo2i61vqJwlWRhzqcleuO2jmoxTMikC2Eo1aUUjLNvEYXNKh1xMHjQNrwbDMtJRy10CVCkBqs234tUFUWTglkYB23QJCQW21dOf5ylAlR1Ss2ldGqQAiSDFpRHWwtvRqXWsxgDUM7S5lIoaYlGFWifawmNz5tArD1lqh2yKQjr3g0tHMdrogJhDsm+EJgQyxPUmKbbroxdrRhv+NKuhUYmCzSSQp2Y-xbqUHewjnbbcvzLSVnGKImKlh-a0oriypR5hc1SzS4N3bmY5tu9VBmU9iOkwqe2txU8CNmPsIxBdYzIzb0oKvvTvVflEI8tKBR1A6d8MDItIYkBJ1tUYOu9ohTXWvdCBLr-eNMjiTSXogJVAjOAio7yMxesWTY+EAgNRRkKUlNtUO1NFjRvGbRASMJBLjrJKh2pRFjR8PNlIOjuYsxicMA7KVFtIJOxNqLaTWu8npRfEHMmWRmO7ImsYatOUrvYE292qk7SU11pc0riRqRHUrW0JBtaHWkUmDrsOvRuo7uO+do87oQ5Tt9jktVpGhhmOndFek6MfRmly3Ok4v3abo+IPb4uSFhmu1iOptDUYunP5BF8gcqZBw7ro+Sg5UmiQh18R3gQzrcQAlez2DRgiTTpZj3SMrWOM-0alOuid0KQL5Qo+EsxSi92qLqYB5KQ6Q8JLJWxHrTeu8PwOIJWS1BvQ2u5qItQRIkUn-Viss9p0lqs-WM0QLbZbuuiBSHlHBDfWSvkS6t1HLWiQdPPDyMiwuyTsi6g2h7sTUalVktoEg-aryeimBe9msY2BSwPK6G4pTu3a4bFJz4FFEQzsIFtkeRr2QyBfuJG6PajGQgFJNV4z4FRyArpkR-UwMi8zLmUgh-aroiuI-4KKCdB-4gMcHve001KMiD8yu29q06lBHtjEjrNXZRalmo9Hq+IvFVP2nt0up1sy6WAhFUB99lDY2Z6cSbgJRJLSUUgO6K4hjODtm0-TXY1-O9HroCVybUhodhuirorj5mRxFkY70apBkbZHEwhl6CAmzU564emjqghJSBqRQF10+ruZ6kA11HXY-0NANx6k466N-8vFYM0AC1yQzoOYIzKJGwdkffTP+7f2iuJdMgOwdCPQUvT3q+L4CX030YD2Rtrx6fI9olNNbCSRxGII+7o0vQyBPdCBBxehPvVMdjT8i1NzDZnrMkW0VjyEdRBN+q57Ru8UxXQw0OG3u1DO9onlN8+7MlkQc+kWpSROTMz0tNkGxvtXSVCYqQL6jtdvsEDetEFKcYcTKiVQ6mTR41ZNhGEfrVMRVbE28VYTWKO1RCTCPnG1zGI3tV7c+-9S9R3EL6VhMre3rrykGU3ySlZt2yvuN7Hu7kCSyX-DTTDVqAwzsC00SzFPdQBUWHt36O+rtJJN7iWigglme0aSj4N0BRiDNzO9zvh6awdIL1IoYj5iAI0ezhieJXe7GLRgF++RBtN6pcUshVXjQzrMZ1iE7hfRVBY4sgGTe6AbOQJGDonDc8S3rtlZIdJ0nOQSYdAbFMyemtIf5flOXp4FKWdgiakAlZgYwEXNcpUP7ZiG9EM7Q+HZBKJeybJ34GiIHgTGlLTEqp16kmXPk5g0MefS8IZBs7Qx7A04ghkEdi5nuzZGpOgj5RWGlXoB6fIrFgsYpMnYy1TZut1LIks+forMHA+nyKNS4CE1NRhJNQzotSdBf725J-e6nvSjVUtQXVjokMAO8GdNXVN4Y0tJgLj6neiuInA3EQIjCpX1WjBoDme5W11LFUzJBkRNBmsESHCUflPUCfa-VCrbtUPopF7ySIfmtzSSiLtuTxVWQU+BuyBklfsfIzGThthSWuq8Qd+8wcbQCh-M3w8Y4xARP7p+kwjoxIKRZnmNnB+Pr6H-bUNkBzHmA4rl6Ls64laRh0KnDyHl0hO1CohCDqsnQ0+4tG0piTD2wCHahmnvvTMamIhm04Cewgj7v+b-m5JseZpE2HFkkjy4YokVEGqRDO+3LVQNg2owM9He8GL-bHOwZjk0FGWElhBvhwoZkIA7Xok3QC27-qmQChiZhgxmBMiS7IoR2pC+JKgmQjPIv+3oaRGJPbzSWldUKIin62h+7P0dWBGKthIXh0lMGRNWWjQfY4Y3rotQnyabt9jcWaYfiGLBt73tJzopod8RI4lDUWq+JVEDnY6R9G3pIc4pDzXQz2vfnhV2ML1Akp2SyUYC7tBRqQ80c2dIY7ijBdZ1C8lTNUdfYA1OQWbSBlYUYgEdSC7RLtuRoEYriuB6AThBcBLxgtH1jVGEL49uz4DVGqBV7p9r3u+Ua+6WBDdjmrbux0vbNI8keJ2cx4gSA9L+zQkNOdLG30oXj-Sq50DKGqYMunNQy3MvDK881xr6oPnMrB8xSsXy2jCcYRgG8bXqEQC-A-G6vPTLAmvMasqDnHMql1xOcXiLGRIEsZoT8uahUrGvwfFoYiMXJssSbKy9sYoAFcUsdjCAE3sf7HcmyfIgsRx4sfHGuxwpuHAqxmca0gBsUpoSbeyoV1HHOxmMPLGxWp0K6A9xpcYPHuxlEQxpVxvsaaaz8sAFPGmACccPHWmghPma9K5culgfMDADS4emx-LZc44fcrT0WIB8afG4wmYBEAUgSTHLkMsaqAsAEROSpcLqhFID3LC9VVzGb2EgApPKPEo8swnZmkApwmwCxZpPHFxx8eXH7y1vThanXSsAMtqw2GF2adwRApH0ekv8thghSPNiwLVEy5q0xUKIIi0Symg+WZhHLQOioKo3U-zebo6UxP1wvmzNysTs3RcIbdlwgFqBacKwHjwqwWrrFtxXEoioEK3xht1Ir-x8ivhcbx9FuHAAbLFulgzJ3FqMmmKr52MmSWqsTJa6Faq0wM1x+lubFXJqJoXdjCoSqhbwI2vHyToI6wqKTd3MSuM4ZKsAAQmFKuwvcLlKupNUqNeEVt4MkEgEWEMNrdpNSnAi1RU-LYioysySFW+QyVaRklVoA9VDcZOHBNWjiPiKpkm6wcqSU3-GNbW+V9QII9Sp2sjjEtIEiak3inQjVH-MxlnHZjDARFQpI46RiDMc6hgZqGZa2DsMzUCTHvUktEPwzamus9wj0dRyd5UBGk2sXPaR59MNS6IPbRactMY0GjUeJY+gPpmGkRtw3uVflbUdN95RkjxkEpCAClaQERgkYXbJSPCisH5lZPsjiGWPiX+RXrXIfWnLOxPocGTudQgkFvp0piB7OSY-mv7ERhdsanoKUZAFZWp+GL6ZDpKpAaJupkKLu6LO2-vqnm26chz422AglXJbB-HvtzlR3lA9ipSwGcy6yUpaYdNSBS9DKGo47mztJ5WEk1tGNp6cnxVaKWf0RMtYjuMyreUQI3rY60HqYk8gap4e0aSYSOIOYVmPwKcpPbHqf9thmR1kIINubSJ5iAiWil1LfEBttOmeRvoZ4EXmKY1LNp2fzuaVaun5RiZGfFWYhkzMqEhTt1JCGdkjhkNEPXRv-OIbtGfIzDP2lAKRFMOZWhzjQarCSKPiDR1JCWemI6USv0gEtZtJTeS70BlXdMW6nqc+I3omOb3U1++DvskxNUNiJIuZott+yzoviUEo3mJ6ND5dUYGRuIMCNUc+I+PatHjSqkPZEjihGHkgNiiUK7rVGdO-qV296pIpXLmO4ydRbqsShtXxGXBlwj6Zhkb+tWIOpVubIahkVQULIPDbud1rseCRt2C7vXUZyIrpNmMjtXKVeZcUbiOlCeBXUSOI5ZNWXMg3TtSOub6Yfi89RTVfiV0djQLWNFmm7GYw2Z9m+h6+3OSrS-1RuK8oiu22QUKVooDbaZ0br9ninHLtoIQKI6J3wwa3lDHVYpcebOmF2-VmtsL7DOxZH8el9X5n1I-dHFqepgJj19jKQUhSILRzowP7RNG1F2lwFqAeXTEtXAQ9tCAlgWY69+ZlCgwUtHYNOHJpuofyG2pbh3Y9okLRC26xUFdSGQGmVGQgGMuiBbykfTNdh9qMYfRMAWhiR5n0dDtFBx6mkKarOH9kA09KeiOWWWJzIS0p0iIXXyYwSOQfGTgnPmwyHlGL412ERsCGCZ8XJgdWlQsiZQbF+tXI7P+fdi0X-U64i80PU3FjYWrNW9lgkRAj+acW-2tqSwI8PcwMy15RiT1PIKkFcizIXGOhbIGGF+IOgJCCDMnOICu11tdQqFxxGrsUFo2aRGTYQVQHsNF15AKWHWIYwaZZCFzRJjvZjaYW8LkV6VO6PujuLB1Y2EQnlUQNHoYnmkR6ckBRflaMjClLZsHRTULbXhmNLnp4ZYXbRllSmlVz2WwmGmTSVbSl6xSBZdQW-MoRl1IGU2wl3YaB-HvcVKaupiBIdSMxb27AVPyXvIbNRaYGKK1QVGS9oS1pcs6AmP9iKrWG80dRnOKJMg6RkAspa-mKliIJYwBKA8h4Y2Fypdkis+HaW9YQ-T+Y2nRpZe2kIFIyTRZnRpCZl4Yk+c1iGW9lwzMqWUA0kzEiecthfcYRSPQlspQpHqdGlcSBLO3bSTS2ZWVlkXmbGYDZqJYSH3GVFngIwqadgpWoNTfokFLmOdAyXb+6TrAy9orMi5ykiSOKUJ3aFhhIdoSTNI+W6ZpFj2iRSd8jFI2F9onKLHmG9gTQ6V8-j+QPUg-oKZ45x6RJhVBZclyIeFjwMyXJVkFJ5Up0d5BczyZ+kl5QQqd5FUG-F0XoApr0FL2DmpkQEDvm5-BwZCYzF1QYqRVBG7LJm8oimefRTDDthx6mYnGYJkIxwxqjHjGmMdMa4xhPKJDLKyqlTzUx9mXTGpzEcGzzQm5xsjLlzCXTKwIJuAH7AVmp8G51VxtqH9Az4nJq0hhQhsf45xQxvK1knGnoXF5G15tbfN21ztbia5x8ysrKx1yJuKwiXaainWELGvIQi51lIHHXIEysY7Xuy7cfKb4XTdYXXkp3yGPHhXI9ZbXD8ndZXWD8nGjvH51y9fwSFyuFsDDD1ptePX5Ev8dxd1x4iA+wOLcXmKFgwSgFLlhmiMIPKgCrCYg28JySw7kby89ffWW1+HAondJr8ulEdLdSzHk+1z6BUtlRFAuH0k4TJJYm-8RKMB8gK5GCIDKCheTHCwIx5uEmVOOCscniIRCrMT6CuXFnDZJ+cN+bgrf5oLdsKpxLUmXE1-X4KYWutxQ2f9fSe-XDJtl13WTJt+THpaKoMXk2GK+Fx-Xc4Qluk2b1pAziTQihJMnW3JvTc8mGWnA1MK+xcwoCnQpx8BsLRFaKekrD3QThaAXCqSoFaPC2wtLphWrXmHzqm83gMt0poeAMsukyVtaFcp8mHymjrMypOsjFKxvVbWI9iO1aqp2ypqmoPQ1t-T0o8BsXnr+HbQqRuYzTPlUKkLlRhJOVs4dS3OGN5TQxvNb1my3bIxrL7IR2VdiNHgBo1mDQLSTLUq2wyE+cqZX1M3y5WfI5Or9aLVYf0L9y4nyM0yE0WDDhRXA2GZemSkPKUEXckH000dWtjdFRQgCLGuU81V0bqiYWCBPwBtaKBk2G22pC5GUpqkSAPFXB28FBOU6UMpk8157ZqM0yKkfJmClr+QAiNHKllFCpwrppogK6YQQlDVnsHC5QkIXtk00U92BNyjTVWtkUiUogSRlm-b1t+hf4RmUmAlSIckK1i+22pTbXFQXiSQaNHZWYZAy3r0LLdu2z+iVHfUCt0LrDGHVvhfOGzt+xXID1ENRvrYo+BruU7RejxmkJxGI0aUJ4VU0iaYN-NocGRZ03YZaIBCDnd1raUYjHSN8VModOQL+TlikRCyEFaTbk60ih0pRBWIz7ZDOxpClJ91fTVuXAd5Lyj9KAutA13kmKYKwIUQJlGx28CDX14E82DpmN2NTLhtcESBmRbh3TGE0k20UKetBM1jdtpk9Z7Saxkt372R5hAWZyYYtu2xUKshdUOCTokm3FlkpFD5gpc1lgwVUbLYj3SjdEnsDpFqvtd3wMB1jk1+1aEmVI0ez4hbIvHBIyYwjR8PweMgMAO2cZjdqQNYwA1Tmsr2Ig0EjEiFVW4fD3pBWYg+T-1WkdO2nut7UpmM0B-rKGkUU2ZzJV1PQhb3CHA+3yYrhuBfPSY++ZBDsUUZU2RWi21RmGJxa5LShIlkbLfkkjFrwmcUCV8pcK1O+34gU87SYRgP2p2eaJ5UJmKnqK2o2yKSGMfkVaQ8iz20DKPQfiOuuMNC5zLtUYI656w6RLGbLdqZsVSoI6Z-kS3ejQayUEZ+QlBkPl-8ZIogXdalugfamnwUSdW2QC0SM0b4FS+0YH8jWD5izJCCS3fpVV9+FTvQ1+njMaHhWTSgJ5MDyncEYT7ckh+Qp0dZdu2NKWWIMZu-AA422dOwFQq8cKeGrH3MTHwlqRIKYwyNGOWWNhzQnWKFF53G0b-ZcUuyeOvnZZDqAkICytXTJCpb93fY29w4ybWYOqd4TV+9CA4jDfVn02-ewdeiSjx8JZ20w9S3ngOoIdVzJdQODW2VNkfUkLcrFDWnYdx1Z-QUNFdmhRmUOFFT3kUS7ZW2sFo0ZfVIUElFA17Yn3dliSugFCZLAjiVeCOAVOlB3UEPDjT52zkOlCUorkCYl2Wz9kpEGRF5u9DGRO25ntdiWFxZE9RFjZw6jaykPNkqRaj+yWN2A1PQipSOkWPcJW5anI+z5dCAQhIl6jnj3E0mhrosGOKjzZGjbAyfRxoEYKJnZYYJS5LWr4W93Qi2Kt7YrO6XUOlYjeivGerIjMW9sTRbnmettUNjWj66OPZPbIFIG1Y0JnbNZAUSr2f5LdvyvlYPDFgRGG2httXfQNWfpS63n9u48xrBWCLVGCtuxrsUp+USVlVWN9wA4ZZ81YKlvQyBAo4ZzEpaEldUNudfe62VGQll1EPyXrN0pEuvmpQoa0GlgUiRd5FmpG0WSbqZ2AbTqtxZzWkXa6kJ0aFAZ2htzE70kI+VndYwET1ZHTX51LEO5BwOIxrdLc1g53jzp4wtai3kxmxrQKP9expDLHG6tYFkIyscwLz3Gv-QYBJMTzfecesA3DagAANS7X+JlcEzLIXcXTvjh1283F5-QPU7DBN8yYRYhjTs0+nW11v9wHz7zJ04NPOIIl3dPsmi060gWsFst9PiAfU83zTIMPCDPLQplxDPqmoAz9PN8nC2TPIz507HLpYOM8nK7xx04zP-T5OWfWxN-KFvyIz38cJE3T1TdoBX89qHfzOaF7HzOoz3-Kg3yuEs9wnORcZvOhryqCxTP5LB8ownsN58rkSMN8ROynhEnDZHOxEl6F9cx9WfUKDo0MjbgY8mYgvAr7mmjagrhwhNwMUGN-pOY3kKtjcYLwwNCtzdPuTCqQqHElSfgAU6UFsE3IWxjehaYeEiu8ThwY06k3iIHM4vDo4Tty6BPCcyb1w2+qyezPqz5QtepPzrTbYqHzrJPTxmxcC9fjdC189NP6WjJOM3mWsCNZbXN9lpbxJKwKdDOD3blsvNKklgws2YIwVtc2vCxKf9OdxR938KFFF9wC2DKkIt8nQtn9yiLippiOtOwAHVp-E9W3iLutkttGJJh7UkNGMofTCpDaLzpd9BbRWlDjuoaPOrlCpPb0QZh1yJL9xltRp2cyMGmKJcR3PZ9SWJnmUPpS5hLsM2w1DkvXdhS5Ak72Bfk5JkJdSQczYJXBsH2l0QGRdZcTP4w0QXU7dFRXYmBIwUo9MvaSekcBfqTek0c7FeRMhHBlWnQ9pdND0yjpDKXJRDLgxzoobpAKQWkGUA73KRVLqdmz5XPHied35M4wj6lV2aHpS8bUD6TGltKJZCmlcpWjwakkBZqSWc80NqSSuupFK+Pt8pG1LKYipeNe-ZxnHYw8vMzKQIfskpQImtWllE5F89MpdI2LSwQP6yCkvyUKRqyJrjPk4I+fWKTfqCrlwmclOKLEdgIFKLdm8l90Zyn8l+nXW1BZgnD0jRywdWyWVQ0SXsnS7Nr0yRyPtq9SW8Cw9zyV0lgSAyRsIjHCS9fYxHQ5ZO63o2We7Z9PSvh5R1mfK-Zz0bSUlKMbNNtm5IzgndAuWc2FEHFQzLoI--xSiVQcakdjbdjWYZIpebYENr6G7-xxKeNFSkg-eoliDt0P8j5tkZHMiAoarvX2aOJswaYkuSty1GXbMO+1BquAc7wm-TQB9KQ3Ri-JD2vDe7YiilYkPfZCDxS-Za5XQRGefb8pHLrA4DRybbPic78VHynKuOSUuxZrIbCW7YpP+q7axR8mRK8ulkr8WYF9aPEOyJUwvUQUgkN01ciVWBUV7y9TOiCEtMsY-H6fPV20dUhWc3bvYiak0PGw-BlHFQkgQyfWEBsevLfK3elIgnB0j4EPpCVFEZfJVyuF3Db15Fn9GHR4gLT0UxWsApdr54cNvUMRZQOR1iUK-pIrkSKIWyh6mO588ePHLRraL7duK8u-tGQmlIQiUtAxusj1wh2GsycKlBJbspq8Ck1yKxGS96UOu9Ju+7vJlBCnSJxlyjYyPKSqQ-JMiVLQig0Rt4IP+V6Tw852QlW9vL-eggP6PbKB3auLyBki2WhCPk2JZWPIDvY1UrhokLJuU0o+KIRCEoj+nipAKT3QCAsNHI8C03HK4X-kFY72lMkf9ld9KgoPw+l8SX3omVHq3uxCr2lN5OPrLWLK7KZ7CBQ5sIF68y6lsVCfLbEuskKB5GIzvIqTU9hTgeMzWxTnEKg48QpMrMaZMOU6TGU8lMdsblToMorXjMNU+zHc82nVZkvXaMrKwDcOcCOo6Q8vLbW3TnzG4rax2BKgYrTsqcvMPnZvNbHXzoR8FgRHpydOpxHyR57z4mk82HHwzsAEEeV8VR6nHXziR+DP919df0fDH4R5XHNHvdd0edx5R6Me5zWvRqad8roGsfjHhptMetHvBNPy+yzx5ceT8+csj1QC5RTLODHucArOk9Dx5ndAJ-9brPtyl7ECe1H39eYTFykWkmbsJ5kWAKYNns6cebH8idLDECl8pkTMN6ifomlTic4wKpzrORwL4wSHZWclz7ifuVVzu5tIKSOQSaHCOYZRZ3P2n5N33PWN75o43ArVgrzclJy8-43bz3gq0nfJ4isXKEWg3DieUxFFo-OzH2TelhaVhTbflDYoC7WebJgx-Wf7JwSucnYLo55pafH5C5OeQItC9yT13USv5bLN4Kc5bDQ8KaXh+FYi8efSLlzes23NtSo83UzoiON4JW3Suj1pW8c-45gtzBlkM6I8LYHGLK+U6lOJk+Ld1b7KpLbqmUCGSWwFLSRxniQASDiV0IPRz3MmmKCeaQNRxBYQiZ6vTCQhSGJmWQl6kKKczXoIUQ-MkqDWCHgc4IApNAm6MV9rAgkuKSggj0liCVZS5fYqe2NAJglfJySpLl1KkFOKd1W-KcDjG+zDUSBF9s38Dq1JxdZu4lW5YO-8R6TtRMCX1jzZ9S9V+m7AfEdhz4+nRmucvg1GJhPJ2pPyv5flEBPkQkTpZjDEcdpOZX1QVmHe1ps6VatHSNpTaZV7t0JMozsjkiVhsSp5plChtTmybS+kIElfNv2jDfIAnfJPbRvh1ezDoWzkbwqSLQ8NfitHOPIulqFkORebvesSkrUe9UTn2SF8lCphfEIlYYemEvapIFyV1TvQJL+STvZid7kiSJM3o9jn5KghZFZzrsl8hiC00GX1Mudam1Gx63k9yQ7eoNPwKtZeZqG8SqRtHYMLIHGUKWmM1ff5Hslpb7WqzSmGeNOGZlkEjE8uHKdTUg7+ZodOtfWD75nUc3JZjAIwpiPjpH857uB9vef0bNL5Xz1e2KgxGyBe88ZWlHoM-fwMHTvdM9S1yneCkjLQJ2ltjNbc3uVGdo4nRoCJ4i8J+jbPh8oVyU0vLe0q9O80k72bBbaIoCcZhGQ22MPu0vrMj0gFZ6CGm+I+oKYJglVqPsR3RIt7LkdyPCHoKI6ISH1G1A+-8BB-Ywa0rPtQf+yH5C0cb3xD6evQHrNC6I3KpG7qlD+6M2zsyPL+5RLPEVDHtrLEIrsAfOjVrtmdlOj2aEdKnHAMKNT592kk030eHL4-KCXLb2jSKFjABIMyFpCvQX-OV7BTqdiyixeVCHF+GG-fLQgJf81fQnDzwx-RpJkqHsmRoeCqOh4T0GH0qb9LFTmITLWyddh6rWuHmtbHMoynU+lgkJyWRrLmsRMpYhqhNqFZ4pH7tYHDZH6LaFdB1kTnVP7T4cBy+UJ+C9eoivkr+0eZ1k60rKGv2ctNkiXFr-MeHH-dyNDCv5Ce6+J8sPD6-4z6R8cfhv3L-bLHQ2puIguvvL8vGMEwr+K-bxvsqW+5vlb5CeAwiJ5y-onihLAAJvsDaAnsvkb+W-66dJ7hbMnts67Pzy3J4yfYNsrC2-+z5Dfu-JRYc-Q3pz7Zu65Knq+NHOZzpOBbDjmv6Ev6bmvp4Zxx9Ma4h+E9Nc46e9uLp90TnLESYR+XRExK8tpJ9jaYLON+SaytFJ3jYispnrcJmehN7SZE3snr85gNFvxQqPDADNb9a+9J789eo0Wf85zpdpPZ66BqhWn7U2esE79iTIL-pN02Gf-TZF-DNlC+asTN7iPueXns9wkqQpr59ybykliEinPnmzec3YpoVv+f8IwF9c5QX32iENZFVPDN5gi2-ChfbxcItMrCp8ysi3GH2IusqUXni7ReDWjF5FRepofiGdZBA7TR8RpxlWv5XjeJBxzeJFQmaOW0MTR9+hiPiR9qatG9vlfdX-zIOi95sRgh2r1G1IcJy77hgk+SXhTM7eXP7ZJhI2irjQfmvCbwI0W9ksVH1NJ0S01O6MtVt7WIg0K-3L+WlO9j4Fh0WdERCHWSYsdY2mY4yb-spDTQEI8WVrWkZiT3NQ5ip7kr32SKWXyTKMGSMSaBDsSz1pUEUJPj82n3p20t2mAF6wJ+nvECJTfVXb9bJo1Hta6dkZZVIwOjRaUVupXff0tf8PQN-iLS3+mlRu3yZDkfwj7eFMmacQE5pi019fONSz2WnzJKtMs-nH8s3mdkkWB79oWF78pnFqpH+GzF-fkchYhhiEQvgY1KHq6VqHiY1pTtF8cdAmNhzNY0WZCw8a3CqdMxpw8Wxhqdcxujg61mLIXvlcBGvuNQ+flIBGfm1YBQkONfaBV9SEAOtoXLV8uxHC5svjQDRvkwD6AYwCOvu194Xp18+AZd8DFL18GAf18sCmGdKXMd9xAdt8xvs19pAZN8yvqs1NvooClrGetqhFoDvHoV9VAbmdNAbN9L8q+MPvh01ouIV89ATTQv1lz9IkiM0EnixBtXC9hdASYCHAfq52zg99INhk8Lyp4CvNkRMFAW4CBEu99Bzp99NaMPIFRLRNtUP99ogWU9vyg085ztqJflLShmnqNwFonxNfJrRtQii811zpklBnt5ZDzqhVmClxslwjxtVwkT9uCgJtSfved+kvM84Wgi1qhPYCMeON9DAVT8fzmABVyGz8OgV6NOfsd8mgeWJ1Not9WgRBc3wlBdhftl9hgU19cDAYChAQYUAItc9skrc8zCv5MHnur8nnvL9ZfvYU7No4UUIlFMW1uwZyLu5sdfr4UjfjzhDfjRdjfltZTgWgwreMxdLfoq0xTmxcEXnb9Gxsi9LrAkU13IlsXfovVf8IkNEtI3xv+K8gYonF5rqq1FvAlyQYkPoJeUpUsb0I+RWUjldM6qJc1iEf10Qtn83fsLZ92Jw06TMVJM6uNI3FmKVBnA9dSbn8DChiGhHyOWxAjN1Vi4se8uTt6xeUvkVd2NWxIfLIIvKgEwSMISRZCMhQnIuF0FXoskhLpMwJNBeRNKKyDxCMsx0jPPpn0rykK-qeo5SjBRo6kZ5UYJg06MIVt3Pk5dFksewu7NI0McrEwRQc2lhVBwF1BJCo9kpbV9NHWQAUIp86PmPx+WLwEdUo-N3EMaD3FPHUxGJUR12FSChmFAc-KsoFjQVuoaBL6wMpMWhAQJnUIdt4wvFCQ5vQfEECiFXxXmNyRM6l0M+yN4RnbMaCkKLmoM7D5p6UNHUxlMj4gPhcpyJBhlwGtKQ9Mnh4auo3VEvC8x1mJ7Zr-qLlj2Al0Nou2g7EBupQQSewLchocD-qv9KMMK8JTBYxt3qrVl7paQrGGCEe7Kv8FLiWkWMMSg4CCWC0UCnA7UOFQiQZP8bEBAJQJJ+Qj0FahM6uawEBKGw4ViTc5wScofkkGlU0ntV5pA6l4qOuRZwTf8+7EsxAQZPtoCI3URyBcwVzmHw67ps4kdJGNo8tGN7fpgD81rKccAcSEFTvgCqnvVAiAZWssxqQD5zDw8sNuhwsvot8LsKk9DTuN8-MNS1SvomcwXCrIAfuwCb4pwC0viOt6vtBCJ1oV94IWWUpvh199HtUIcIUBY4IQhDyXCIClfp19SIQhZyIfY8sCrCISIY2AYIVvk3HthCWIVmdFvvhDsEtl9aIbetxXG00-ARYCPxlBDOIWdhemoV9+moV8LsLeBiQKBt4nh4DzAZABWElBtOzqECNAbwkOIY-g3vsU84gWhs6JvpDfvoooYgcG5vXDU9NmmBV6nigxajGSx6NqG5MECARKNvIl+nqEUsgfG5zmq5DfJsxspJhm5sfsec5JmM8zzhM8+NpUDpngRVZnlBc6gcJD4WhJsufvoUxCvT9svjxDAkkGJZkF0CuVPeF4oQc9qhClCBfqMChfp+FkoRRDuAU2J6vnlCexl5NGWj5MoLhhdfnlhcWrNhEW1vvBwpjOJHNrhdiIAcDfnhRcAXicDanvZZzgTs0pWkEVt8F645WncCYXhEVHgcq1ngXF80IUK4KpnFt3gdVNeLskV9DPrleompcRCB4YPkhFdb9muQYiA9NTyKftQVrVIWlHMp3UD7VkiGPsbYsxgQNPYIxVpkcPPgGhAtC0Zh-KaQg3uAc3CGVp4VFIM5jqdDUyKNJF5iAQs7pCNuDj6pp5iwQHtt3MWbE0MdjBkhWNMLVhtqgQEjGWkxInkRu5tIxC+JgRrVptovtrMoMYOuQuVM7ts9kEdVIokRCAgGlTDB+QvobsM6UI+Qt7CTCb+s9Cl0E+gwqG8F29uqhb9uNJiWFzlU1BihMYXYxrWLtcUltycrBPMxzkFv1I7MADeFqAD5vOqZfdmlVRSEjCVDjsp9fNbUfWNKRu5ltD6iAYw10CCDX2seRfiviolZgRpsZuTtVQVm98Zod0p2HhIcBC28btr10OWDJEPIhdCmYXDNqzLzEcuj3ESBJcdeuggsU4DsEEyGqMaUP4ZH+BJRAKF9tQ3tGRC-Gss9iCHCp2CskCiH8ZFyF3ta9gpQKNrCw1RlLZs7FSQ3kvh4vtkxpsYl9JV6jccnoWqDuQCFUSCHMoN+Fnwv9qG9ayIcND0O8Bs4UV1V7uiwc+CrVUOl90-kl8xrVm58QAbq8RYqot3ZsXDHYd3DaPHMh1oq8Z9kK3CwqEpQgzCux4QD0dF5sERviCiAE4aSYTuPbC9JOPD-jjJJ1Ijog3YaGMhTp4IKoka1k4nUQ3ik0MJXgJ5meu0RF4RFoeiJ0hBYXco8iHikOKH31+6kSxltKZZBYU3xuiEPxK3sodiPuLV9NGMRD+suRBYakxbSM6Nxoi-0VGilREJGNp7VpbCK4eegeBKOCpDm0hgpP9F1+iaY12Ett1BMXdy4byDWYRSwjKMiwUMk8FT+kV14shAj3yNyC0EWQjz0MGx+Yp7Zt7BEg8Bs69AyLgJOaneFbjhXE0yHfZ+CCswuiM55mepEQY1uixWkLqVyjgDCOyIBhW-HWg44iIxuEZio-Ym0pldoLDq+JaZJWLiUxBjUpoeuoQEYafdSEUPDSvJ310zKigSMIEQIhmJpSDlSwoSP9Ck2q4QfGKzt9BOsRyRpic2kGUFoMOrF5Ea4i6pLmoItNBJYMJmgmdhIR2PP78kHN3MTlKw0NlOiQopEztP+DbVWPMpQFdkW1XCChQRPIgI4PtCd3SBpFc1LpR3YVNsOyHqsV2NIRcHI1dDjqUxm0tmRnpG-9u5pKRPCOfcU7A6o8EdLtfpM4JN0BMhu5uNlE7FmRrKKGxOkVCBmlmCx-9gIcc9vx8DjF685pt-xDyJMdUtA2pcyOPc-JP0iiMPShLIraoerlYIlSLYQ7CLChBUIEiskUwQjPuLVKiCkQpdq4diHtEMkBHEiyav+RgrvR5jdpHxBckCQsZuYi5YejYNKPMZEiDIREBCh1htvdkFkX+hFgmXDETqN15wVBQc2gkiDjsCi2thLVKDjSxmkbrUcKCalgpAahb9oEZ4YUSQv-icjMuv-gxSCMQBlD8lTlsNspbFiYJ+iqhpaqCchEYSwpCIpc+YYvtamEZQXVvShWBNrDd0PGlaULd5dSFrNQMlJdctKb5i0FyiLyOUoiGmhpaDseQJBNDEKkNSNMkYSjzilton0j51l4bdt5KDCYUUKZZMVg8juiOowpCLuwVYeLDuUNrs5lGrkuUSlIsnB8krggKi2qjSxHyOSgAKFyiMyEIQBtFSwgUdugBHAX8t7Cl5R-IIiLBsRRNJEWDuiDIwfdsEwtahYwX0DDD1apgQAbHqI-YRPCupEcVLyNdlaUbLDeopFJ2MCUi44nOxEutfYXiCoJJhoqioUW+1fJG5RdJAsg1jln0i+DmxyDgGiXCA6wC2FEhAiKAQ1+oWk7WrGwRyHpJu5lup-2H5JAVPWQtZvmgU1C9J5VHGhu5isQwhnCE9uursDBmowmMEJI1ZrP5u5oIhTLAh1oHvh4IhrMQ-5scsgKCWjpkSnEVpBcxafG2xDEXKxohv8hxmPwFIUdMj7soP4QYQSpVSOojZ0iRhuij3FW4Zlp4VKMdjjHAtMZDRpoJNtN-Yq3DAfNvV9JDoRE0W0Mf2M-wPyKOQMlGqN9XlkoZPs9InEIYjuPj5oLiDloEMRQNG4bEs1PIYjz1DQIGBrlpsMcGgVnK-NvSIgMSPl4h9UcQNsMR8wm7NKY0UK3coMWxQxSkGZUBlntmYegjjgO0QT5q3UYMKF4EEbpJQBuqgymPRjy9o-1V6oQc2hq-0HEO-0zamqMtCK9dD+nYQJ+O2iz+lsx0zFciXEUW1MTK75zJItw9JAgipnHpkSTNv1sMYcQfWABQ4TGLCl7n5EkTKki0MFMiyYYopSOiupveoCYMTohhzitfUcbvVI4pF8j2uvcZmTE8ZAQr10TlG8YRGEUw91CBjDjBkoiGhA8++qoMMMBaRD+gSjRussYECL8w6jAbDRhlsY+pFnxp2KgieQTxjouoOhW7JMYC3n30aKIw4EMgsZdMZl0OjCQQu0D0Z2NH30BjAbEKkBqlV0cXFHGLUZgCJsF74QcZMyGMVo0DQJesV8RYCNw53ku2js4sUZdUKigxeg2jTIhnwVEIKRS2DQjRhvcQQdnkREAfidVsasQebv3VMCH30OAjql9iOJpe0ZH8RiLwxxiB8kI+tax2bHMQsRtdj6iOcQuSM0QwYRFj1TJ0Qn4dnYX4ebDT4cgCtnC+CmADHlIvuJgsAYOZvwUWtQziWsCAQBC2HlSEWqDSEQIVAxNThkJtTgWNhwGlxaaM+BiABWNccTIB+gYhCLHpacUIRC45HvZsFHnaduAdKE8cUeBCcVE1icaTi2vl6dg6D6cwAIziCcSY8WIGlwScTIDDQpWUecXMBmcXRDXqALi2cX49bIENgFRLCJRceLiT1sOViIIriuIYFxj0LxDVcfjixcaYDizspDX1tLBGcYd9icdJD7sPWdS5C9g1ce4D0JmE9K9IAUfAY99BOBuAZgPXBVygABuN+CDgFgDwABXCrgKwBSAdICrgKi7PfXHE64pXHQFEIF248yHhA8CGNhcp6oQ1DZCAesKMTOeRHNayGjcNQT6LWCoOQqeSrkDIFQXdyF-4HEH2Q8+Ro-SOgY-d0RDPb0Qr4PyxBQ6-TSwE2BMAM2AWwT+RF0b+TFuO85VuTJLRQ5SEItEWDvnLoAD4jZ7EQYfHD0NBTDgKcC8kXoFpcD07wGSXFSAOfH5Q0lqFQ057HwNqAATSqG8VbnGC48X4LAnnhLA0zYrAzYExTDlqYXLlqv0ezZEXNCJrA756a-Q4Ha-DSrK47fA+bQaGGQy4HgvHqhMXKC4sXeiLenWaHMROIrLQhLarQ2qY-A3DDqmQ9DvMSJDv-CjAV2ZIi8HLvgx+ZtAepaO6k3SjCx1DZJMYNAmJVPDDuoM3LCqU8EW1Vw5QYc1IUsFEx0SHAl-VO-hjMKtiosJt5sUabqEYA4j5SXCQG3Pj7mIetD7IZgmpEaRb13TZAvqZUbDRaSR3-KgnEE8ZzQkNZhPMLB5BHcxAxoOW6eSLnIb3NEFIfdMhqdAtLTkegTlFMcET-P6ocsAogx+IRiLMPgnoEqNCQqP65YyMgQ61I5DvSbtg6Uf1EcEk1Tu0AtJMMUszWEh4wu5M5CSaHWop2ZDCEYVjSpxNgk+EtFCu+TVgbpM3KModOpTBEE7MIo9iqsVup0SD9Rm5fxQME4gjGokkjRtVopkPAJCinML5oAiL4YAyeKfgr0qxfZiIYcMkLp5ctYo4wjiYQ0CEuNIaH5fHHEsQD8AiQUwBOARKCHxYcAfgPzDLPV+Ic48r6U4+vIcA2nFcAtqzShFomzidolQFJr5dEnokEQ9QEEMSsoTEtokdE2sqvUbom9EifL9E+fJDfaWDLEqYn+nGM7rEuYlqApCFsQromtEg4m6-diHNEy4mrEucph4DYkbfIVz7E+4k7fCVwvrCJ7LEk3HNEhKGjQWs5OAi3Gf5ZvF3E6YlXfNCaHlHJ7eAm76+A5SFSWODavEsEk7jB1yLlKibv4wH7GQnpKoFP75GQybgEbRIHkbOLLcE0vFqJE5pX8AvEPNTc50bHPFl4gZ6V4qcIFA4Z44-UZ7oVNgoAtd+ShidvERiD7hd43cJQ8HSZ94uKFgAbomD44UknE1KHGwNRBdAmihZQsUkHPJ4msVAqHeTNfG-EzYkCAhC6qkq546bGqEstGX7n4-qzYXBX634pX7hTVX434-YFkXbqFHAp-GcubfBkFN-E3RTKatJb-H9JX-Fwvf-G2-OaFIvdQxe8FaHO-PiICXD+ommUNFeKJDwWkJjwfac9R4FTAik1GJhCUXsgw2LTw1KFbJrgqXKwE5NgcqfRxTBTmayqHYKToeNKRmdvwcEuoioaaFTXSCYiQY7f4mEAphbMUQSOaHu4swsD5EYJYIXMYlRT6WFSrRNtgSgljQ3olQmRMMpD+qbrFILbRzHKXiS2EUt5Z8BoKHvGSTCwlFIMoLuEhrNzIHFWDAHKMzw9aU3ymIlLIAdR-7v8BVYVqJ1ibHL2aSfc-Zz2FY61kLJQx8NzJSUEggFsQAi6Ei2qjSXOowUQE6asS8kCNYYgIZWjAlRe7qNk0JDxKUAi9Ze8F5YxclkkCpiy2S6bpkyJh9Ke8iDKGtBMkf5ScUCZS9eKkbVKa1AV3epT8Uf5TqDJkgdKefTSlRuaFKBla5kspTAkUQLmfaUpJ8djRB3ZJSyqIpyZKDkhCSEopuUNeqmBSV63aQob6kCJRNTVtA9acHTLHFxQfFdxS+7NFDeKMt4cExzr3qOJjTdfEi0UiMxs9AZhiU48klIYeYhkvZTE1RELJgurpdkc1gxki2EoA0HFZrV8E5rd8FFEoqgFrWHGIvFTAI4-8GjQQCEcPVHGKPMgFgQip5ZCJol7EpwAAADzgAMAFXAkQDoA7nE6JzRJ8wAAA1zTuTie1mwDvSfI8JdI5S6vs0TPKd5TfKfyAAqUWU9iSFT5iWcStdF0SEqT5S-KSlSqsES4PwOlTGyoRDLHvICPwDlSkqf5TbHmlTQqacTwqUmd4qV5TcqclTtAQt8ugBVTmqVVT8qTt9HicVSjAS8TKqXlS9caE8CJuE9Omh1TPKT8S9iWbjcXFuAFcPLAnABuYrAC9hOqYlThqTbjISTM07vhpCVIU7iYofCSysGtSWqdVSinus0KwojihzmOdLIT998cBQDcSSPoX3ERtxhu6tE3Lnj0cG7Q2nrSS3IVSTjuNucVuN9TvIfSS6CoySZJsySWCqyTxnoT91wrhVwoX-JK3HyTHcBT9nztT8OqWqTxNklDiIEVS6qRKTG8c8NtnnjTo8Mps0qfKT+qcviHJqvjOKkFScaRc9qaVqTfJky1k3HVCqDMaStIFZsWac1D8LpfjiILLwbgOaSGoSpUJ8NaTRWppVdxFgVfNh2AsCgxch4IZVbgZkILfpNCrftNCipgATOLtxdpfl8CAya78O+oXVN+A4FVAvd51AkJR00loEZCVkchAu8huiADpxAprZAjO+1pAr2RjTK0VWNHz0OApWSwKEL1iYf+o+Tr2SQAb-hlUfT0miLsoKKDo4BCJp4ucqKjbbAT0v+E8RiBvhl0egUw4jEAIw2C3xz+NYxZ-jwwb+Pd57+Ksin+Ohk+PooF5WJmR0MAbTy7PvxjaZoFwMtkSvBAZTUARKd0AVFSoccUTzGqUSLnH+DEviTo7Kal90cdaJyAUuZXKfWsuiZJgxhNGcCvnsSTTiVCBAdsSwAL2tvvo3SoXCMTaifTjxeB+Bh6f6dXTuPTJ6cIDp6VlTmiWvTN8tVhHiRPShcabp9HqvSyACPSaqVjTj6fVSBvivkXifvS2qe49hSY-T9AZvTniUPSL6YWcn1qNTMpp-TpqdfTZqWzQgSWXJz6ZfTNqa2djXHCTYSbtTDqZ-TwGcEC9IVs1VLHZhXyhcCMSXdT0SbdTfXMxNQfrxw1yKfNUgSjAgMF9TqNpBUkftBUXLF5CoLvkCsfkecz9MUC8fj-oCfm-I5YCGJC6NbBuSQ7BeScJsnzgs8hSR+Al8Ss9MaR1Sb6bjTiIID5pSfwxegYIz5SWIzyafviMDM2JBGVvS5gSklmifIyt8RL9KoVL9+eGZtVgRaSNgfqSGDARdpYGaS+WqzTOoZaSOaT1DjgWK0X8SC8-Nk6TTfkFs5aa6T7gQVNlaTb9VWnDjLxA79gCai9Zkui9wCRRgByXCBmiOkgfam+SmpGxpRNGJ8zab+TLapFFDJAOj81G+TnpDQshmPhgGyTxjLapGYx5oCQK1IiFf-Mj5O0Nox6YQkzcmQbYaCONI9SjN1ONL8ZHGPeQUvFkoetH1JCPKpk0qlhoGmU3UT2sYj5jL4oSfOkZZ0PwR7alHEZyI6800EFozSpkUgVpv1PUU0p8iunF9SPUQHShwStSvMpRtnqUzglHFLlsaV+pHsYs0tJFZSgGl7WpyUxESqUzPEDEiCUnUNKGKRRGBLF9NDszf-MscJShj4jNNZRayKoJ2So4EDShbZj6uMtejPeSk6kwRAVO4N02Ip0Q1mZIviJGY1dpy9mSiohzVPPpV9oX8oUl2RMZgpFQ6jCV-7OzCDlJtodmfEjKgrGwXBJcpmSjT5dCCIFxrnypWVmsoxmFyMYiaVi5YVExSjmHxN7MMoEKeMps7MhTg3usyragBTfiFCtgKdYEGUYG85QSQ5IKdkxHyS+hnyeqxXyaOTViB+T7CMTNfFKeT-KDD5UWZ8p9JHscThsCywGtIx7YqzVmjtRQ3yYcRWlLTVxtqTVnLCWlmjvOTWtEuT1jIOgg-GuSs0mEzRiDyiJkCOS+VOKZxyTYRJySViM1iDjnwYZTwcW+DXgbQ9m6fQ8LKS8Di1sw8bKb+su6cBDqdE5T6iVgy3Gm5TiIEoAgwFlw5gKPSxHtLAlAPLBVGeS1p6bPTE8SZTosIvSe6cfQ9ZCxBM2ewBs2S6dssOVNC2RlSGqZfhKynWyG2Xzj82S2ySqQsS5AWVhO2c+BozkS4C2UWyNxpDQtxnfTuzgtCs2cOyn6eVM52Tmz1cWAAx2R-Ta2UuzN8kWdf6cNCKaPmy-AFAAAGV0AC2UAywAM4CZgEOzl2RAzHcdCSDqTAzo8XAyN2fWz52WdTUSRs0cScgyJEjECqwvhsOwCD8M8eUMhUGywaSaSTJaXsoKSRucKGcOFpEKj86Se81TEnfIM3I-JD3KecG8RIzTYObAOGeGJS6J3jqgd3j+ScjT+GS+da2epMmfj1g12SPiugD4RpSYsZegSez+3K9QKOcc9tSSqSe2eOyOKuoy2OfTSxgTqT0LnqT6oUrxnnsYytgaYy-6B89+aYJyfnjYzhaUlNbSdcCDfjpV5OcfQTfoxczfm4zjKh4ywttb8Itj4zLKWGyWIOrTrrKATgmfQsj2OQF8zBWoVEGO0C0seRkSOkgQqOyRqlFswQCGW03kqcx8nJRpxyYsp1BEZomhrwiKiG04kbiFVWlK9Yq5qYRlGuaCiVMSZQ2n74dlBcRImREoDUMo09lO6C20M4F53sj5GEXCgeihwT0JEKQkOrEQkBMWYOQUdoc+GNpKmSwjQkIVVG+P7E5tt5jrTKmhqcE9M4MRVzdXklVcfBlIiNK3UiPrGQ3DB2xGUC+htGFuC-qgKQVnHGhc-NVjCjKJlLWE8xK+C0slKZshCBMWkcYh4xbSH4Qw3mA9EiLVpcuZf4qcPANBrt0ziPlKQhuaFoZCLNU-iPWTmmcuQEiHkwaNFJRdSDkzKuUlUymPAdCyePc-PnHxp5g6QeTBKySkKG9ItPclnyST1CjLxpmhtndWwQtzwUHxQzAvOxmBBI5iiLsodpMiQ19so1QJPmpRSLiYxiAkQDioNEEYVZ9IefYomNI4w5iFxSCsoUYBjqAQFGFJRkuSupP+lKx11FA8AOt6w1UFH9lGh9jaUIERswcncnKH+gjWPMoIud3VlRoAiBBB9IB+CQRPWig5Iln7S5mLrU14Vr1W0FA96KCqh7lHpJWuUyydlMd1h0HsRfpP0ZDWJmYtVkzdsWUbSM4lilyUbGQtCGkNlmCqh7lr5zYiIfxxpFH5hCSgdYiGFQCFvjy+ydkwzJMhRgmLWRxNJp9HpIXx2YW0plmM8V06TKh+ZiWlEqC5RSKFLcdkNUpX1NBJk7NZzDfHZyuSCFRcwcDih4vpSdnOF89nIUTw2WZSvwaEJExl6SrKbGyO6ROZkcavEHKXTje6c5TU2fmNB6bWyoAFcAsuEiT8xuRy0uKRyp6SwDa8oMTgmtFTbTqMTq2TwCM2S3y3YBfkWcbWyu+a2zp2ZzikmuVNx+W3z-TofTGOTPy+2WcSB2YvzW+ZPyJceVN1+SU0Ezm2zzic3yd+e3z76aet2qauyl+bvyBIZ3zu+WK44oHeMVAGfzv6YJCzAbtTDcRmzWwH4Aj2auy-wuCTC5EmVGoJbBc5E4BaEMYBBwHMAeLC+ZgSS-yJ+efz6RBCTIGVM1oGftS4SaHjT+QgLbwIoAvQLnJqzkhskGRgzO9Ggz7qcgzlRC+4DmmQKrIV2EJvCDcQOVxNM8esYIOeQyDuN08-qRxNdzjQVgabfJq8chyCLqhy7EjnQ2GR-Iv5Fwzy6HhzEaSToBSbtSEWkoAABci0RGf-yH+V4lQDCxA7Al0CNBXRyFBQS17+aoUKacqSqafmyD+bTTjBSoLyWjQoWOTc8mafxyOaQ1CcLiRcTSdsD2hNfiLGYYz78VaTH8SLTn8UPB7SYpyEgbuz33GpzdrBpzFaQ8D66TpySpoAT-Gb6SQCf6T+LtrTImIIhMCUHlsCakSECYkT-qSqwIglnxUiVVULCfGTfuZsh4id8RMhWQTVpMNyLam4gQiW29ZjJ4Sa0lET82EULhjiEw+tGwTABq6kkBPtjpeS2wuVFKQw2H8RhCdGwZyLGx0MHYhSao6w8kS6xCHJYh+cp6xdKNpkqSKTUHjsplxana9TWLxo3jq1lDmcWSFYe7TshW9FSajscn7qzYoUOSwucpGjTjgPCfyVUzdaksdnFFNjzhZIdFenCgBYS6yRjuHyUqhMc80PztpjhMgdUkwjcZrIT2jt1iqkGKU-fI0gYKM1yi+JUKk6i+p4yeSxG+PnSCeWdp65ux5RWPGxMhQwSqMJp9GMN0Zq6bkSc+fkS8+fPTswBGyYvlGzS+VRxrKRXyKQlXyHGjXzh+fSF6+Q7VKASyFF2eQBKAErgGAETja2XIAeflkkS2ZFTy2YPym8rXyR+dKFM2ZyLBeDthcIfmz+RbPyOJlzipRXaBuRRHievuRyFRRvzj+VvyN2dKK1RVfTj2VqLD+aVSZ2RyLVRbKKjxlfyVRVyLLRaFww8EoBjRXfzYRDaKZRTyLIRB8SYoV-zj2baA-+UoABRX+s1XOaLbRe6LTvjXIUBZT9hLNmE8nlpC9RRaLQxSesBztHi0SbEDP2ZdSwgR+Uv8Q9Sk4F64iNtY5ZkEQyQwSwLOnmwLkfiOFS8WQzxJrdxpYIhyvRPwK-RH802SUGIRBZyTOGThyeSZILeGbC0YoXIKBRd7hGOU6LhGWoLG8dPjx8T1gUYnRyBRaBdypoOKNJtpsGaUVCM2bOLSoZxylxQKKT6EZtJfofjpfvoyT8UpUz8QJzXns4KwAG1C9gQLS4pkLSvBbJz7XMtZxaQ6SYKu+Mspg0STFOb8usG6TtOfC9PSdEKDnIZzwPHZUgmd8DTOSmhmZrUVb0MzyzmDSZX0Hj5Hubq9l0H0K5RhugWMVGxd0AxQD0B5d1Sh7zmJMmp6yJkKIWHh4YJXLCEJGCAqlmwS-fM2h29tpdvELML3WG0hHVPA9nXow4zcgcyAbi4SDjL9dFJGryKCOJIGiATcTuNpcmpHk4RUr05tLvmkrru9oyJNpcRGECBbGKuQsWdZ97DGsxson4F14QRKKCGIsTPooTlpKpKICWp0hhT2wckAwTTMnpKWCc+gxwWIS4RV1lPTNuhAMPQSQ3jkRcNDegRkPegIJU+SWciKQCRRQ88iREKSRSKKm6YXySiZSKyiTSLyQnY16RaqdGRUvS6+Smz5aSLJIIbJVggHOJFdN7JGiT1g5AB+Aaxn0S6xhfEgmpxdmxkmy4qWYyEpT7o-AMlKZiSr8PwOYL5+To8lRQvyVfkVLQ9FMBSpYS5UpRVKT6aAl9HnIB6pUlLDRRFNWpbfTGIXeNOpfJUGpSVKF2XVLhpd1K36Y4U+pQNThwENLEpYUImpcE9PRQbiInvNK-+WlLT2aBMy5PJUmAPNLipUtKX8sgKb2Vk81IXM0MBfk9xpQtLGpbpDzqV99UGbiTkCjEC8NrIlXaASSOwK0pxFoWKnmLD8KoPD9tEr9T43FQzAaTQyeBSxtQaf5CGGbj968UILAWpM8woST8IoWT85njILo8Qi1NpelZXqGlLKpXT9hxcRBj6l0CCZb0CMZfPi5pTNKFGVYKKWs2JsZaL8zGeTKtGYozf6LqTdxcJzT8YaS9xWFNjxbzSzxZJyPBdJyrxSHi9fruIhQveKFRNLT+oSJhXxTIZ7xFNDvJR6TdOdGzSGD+LHfhrTjOYBLMlr-hxKNsx85uUhuGFqoYMJUh2SAcUoruEFSgsjVxNJUEtVGsRvENdoucv6yXdr+SkshGZtGOfccgtao8goJI34ZADjTEe0ogqrshHKn8EgoipAAZxLrqjUofAuIsnbIX9GMC-V3PKEFtJXyp-UhKUovA4ExmYxgXJK4FLDAnKO+nBpIzH8YnsiYF5+OYEl+KnS2+Gg9O+LygF7KRkp2k5Q8-Hx9y+AB0fYdXwt5pxo6+AKyNlAAjdWR51X9ot5RjrnxhogXwzdvYtIHKSooNOHxTHFHwZMdYFVWPkQQNB2kpnKPLqWNZQEiYkQp5U0pwPqiR91JjEARvXL1aiupzrmzs7MUoJRlhugYfLoRCVMaYiBI6zhDkh4xmcykg8N5oJlibLM+aF8g2XXTs1pKdfJX2Z-JS3TApW3SKiWmNkvtUS0cflKMcX3TR9APSqAXNKhAN4AoAKxCWOFjKZANWcgsEKL++ZxdqvpLpQFWMSkIjAq4FXKLHCkgrFRTdRapWYzcFaxDV+XNLCFdqK5+ehw8mtAq6ALAr4FUS45AFQqTRQsTYRE4VGFWNLSFQwq8FVNLZKqwrnRYNKyFSNS9vhNSIpkIANpVtKuxmXJOFXwqwxUpDYGapCTpepCH2ZgKeFVwrX2ZRN32TFLbqf1wsSdpYPQGZCqBWkD3pT1QYAlwiSSYwKamGexSGa81EfqWKKCr08AaZWK9oLQy-IfQz-LNDLIacFDoacC1YaYjL4aYRUUZYRz6gUKSWFaKSWFdWdsrCxAXBITK6WMTKZAAc8olfoLGZZgYUlYZtqZYIqGZZTKD8TYKWZYeK5frQZWZbZtRObJVdgWr93BffBBaVe4Epr1D7GU4zaLg4zAhS4yXxepy8pppzWLjNCvxZxdFob+KBIEkUwCUBKhjoTyWlExhTVPOlZSNzEwQGMZGfCDFV0N6M5Dhws4Dl2hLQVMh+GqcE9KHKUTtkFjbtnfxUSELzXpBXdplb9ksijsEdyFxiPYcaoBnLOgUjAsopNNdFvKoOT22JcQBmStjsmKt18OqmoLIvoNHlehIPGNnxMrrt4jRi5UJHJykPKsx1vKlo0-WlciToYrtxGkH4WcPAckDmKY5GiQJTLIo01mbejXMTkxOGqIFZ0MAR-Ovw1ViPmYxUpugaTnQ11JEKQCut5Vl7AkiIHAh8DsZKyCGlYxJUeosaVXxRyGsuQVnIEZAdp8wLGK9JxpCiruEP-USBC5pmBFTgn9hmio2gEwqyOoJyelko1+v-UsmcZ4EGiqDB4d8jQkJ-VmSN-VqMB0KJepSjAGrQQgMi5isjk2Tr6pg8PkvKxuYt5V3CFnYX6iWg4jmBk-jIfUw0EfLUVWSR84TalbdqarfyeBg7+PpIlLo8Q+4jaq+KDExIVIr0WkN3MlSEnzk0VTYz2v-U7YtBQPNGiwW4e8qHpB6xIVIn5YUv51-6pHDZCPnDQWKiifeS0Rd4aIibVcrkacg2pfpth0ykVuQH4UFEkZr0RvEYIFlcuzYvFAjC5NHqiYcm+gNNCg4E1QP4NNBcQWsZcq61ZygGWFqs9SiuRLTDarwAeYSUKJMNa1XHsOyH+QMOoQ5MRbmrKllu1sHMswzYbsrG4kJTIdtSq4bJYrHlfywt5bkRp7EIQdEQWhcNG0wW0DarX9kSYbUbDzrsTqkeTPDU0KEqqs0VVUyPv6pY-tKrG4kSNseNDEfKMfwtZo7VxedV19CKOrl1VuQklqtIriB5pi-Darm0NEENNDoRCCBljD0UwxLSonYKGhkpUNZsjRsX8h3CCA1SYWaqMojwwatp+RtkDaqUNBugUiAyoeGL6qysX-go0H8gC0DDUHCPKMcSHWxTattzsVZRrQyK2jqcvzCR3k9E1HHt0lpCmplCXSiLBmMij0JLycVodzbikOQiUMWh7kqCFW4QX1CAmMd4kAUtH-CkQFZu1JAsUJq-VW5iOlHWRUBuwxJNV1lMtKwJCilHw1Ro1NsPraoc+GR5I4vJITSuGgAUBWoXNcmoQYYSRoUJ8xI4qHDRGJ4QnHI9DzNWxqg0dsELVEkirJQn1l6tVkbNDhR3kAFrZCNKZmgjjyyhvtU9uuMhZ-KH1iXvJqH-H0xmUKYY2Ym9Y4FstUOtKx4djJJResa3V+VsSdgCHgjxqgQQgWasRQSI1ioUZ-UcBF2CUMq9SRaucV8PNb4C0HxIY0eH9lvNN1s+JCqrVrkRYmP5FfaYBr6URQNPGL6zVbBWrlOqxo0PnWjYNSMrFUEsUdkQmgXBEdpQ1eM5DkbTlhVKUi4NfYpVWApEZ4eGgiWCcq2KEdo3aCq9bMvuqK4qox1JJGCBJbEwCuvw0nENPZUpAN04VZvtGFl2gqCGuCmhtMqykKARFhjO100RqrUtleT7toIQwNFrN+GjQdRNDHSrXjFrKueBgNeeMrfpm548ETMqJWBbZ5lUJQT4UgD5Xk5UFEeChXtoog1+nshEcp8jCdRYjj2II42dbdDePlzrNVeYhqVtjqVJEEQtDur5plbUxlRgeicVVWkNSM1F-gGxiV-oLrUtk2iBCNMqEHlchLdqtVmOkrqPbICKbhRZrREHKZWdVLqOdeks01npSjdYzrXEazE02NMr70W0otDinY1lT8YmNNmRyNdxiidcXjO+tGRNdcztWNT7qhLh6lhVURB2dZKUDtfMctyGb1aCObr7IkHqLEdCjB0NMrlMRwEuUZXx4UY2gakH5Eq6umqV1ZASJEc703DEyCY0RNIyhuzr+VdhrXMcLZJCBXr5mCigl1YdqA0ByxcugHrltE3ro9bNEvilSyg+jSg0boLDJCPsL5ELMgTCFkhBYbpQTWIrrQ4fxQuUT4w1Xj5F9kDkd0nN9qLBmpcyBNzFR9eLUBEavqtrh6wGUpvqCao3wNkXwI3dRgMndS9lyutXTz4Slso2uikxSkJJXVFmDmOqPq7YlQQmeQGsjRigdnCePUHiIfrRdhRQEMh0dE9ULrgkccM3KCoR6BX3rGuc9IFkAykRyJbsa4bp0XWLOlHdSaQ8JPKpWvE6q9SGNc-KJEh3Vdwgl9RPxvrNu0+XtGq6ekcNGpPys9dUqRj+KZpXJPcQNkVaUEYfnCdUmTznekqQcToEQmpiQjVdcnELppehD+gSo0lv-q+pOKwsBOEonVSDI5WNCgJlHAtR9U-rmlrqI+kfnqWhR7ZSKB5k00C-qxkR0QFNFaUZqqob7FEIw82gcoAAs8YIYi+o32DBRXfABrUdXfqviroNQic-r-9W-rKkIGkp0HTrA2bXTvDUSK5ZbHkPwT-LI2cXzcAfF926SFLWHlUTq+TUSq2cyLopZl902SB4gwPwCO+WHgKEDIBZgcWze+QbxhRfpyacTFTxRQYVpQg-hkjWozUjekaiFf3kSFR7wkjRIDnqD1g0jRka8LlRC8LrsTqjbQC6XGUbGjcRBNxkfyaFZpD1DCUaZ2Zfzn6cUbajejRVvpQhyjVrjEje0bH+StLP+RE8H8H-yKEF0aewACTzcUk8ZgKMalAUwljpTCSHcfsboxU99LpRdZBjWAUkxWNT48bHjqBXor0GbdTlRJEDf2XPS4fgByyJOiQFdQwLx9F4ppTMWKHFbaJqSQYlqGXucwZQecmSQFDvFYILzznDLQoSC1AleC0EaV2LRNoKTiOZQhVjbFClBQ0aqKu6I4JATTiIBMxZSSsaDnpibFSSvjDBVTL78FMafwpMa0TRuLtGVMDdGX+KClXYLeZQeLmTUeKylRLxxOW4LzxVr86lXYzRaQxMmlY0qP8SNCZaS6TQhTLKlaXLL5+T0rqcW0bYhYEz9WlrSQmSxQTCMN4a0NvYdmSsQJvHAdD7LCL0an3ZmvCaNokOH1tNDKtuvA7ksVZhKOyGV5fiA0QacDJkavIMYiMg15J7CBR95cokcvMNoojlHcu0OfZIvEMiYvNBRZEPF5bIUl4iNF3LzLr54jkgF5mUOFjONBJSWiDiNmCFaaehURRpiLP51SAmgOkDsyS2pxT3bB55s5UaRdIlttmgqCxAwUCFitGMQggpIJ9PoqCqlvGD76kCEHGJo4EVu0hQ5bwQveuLy3-jVyPimVIvHKhgZPG316JVWQ3VLqlViLKo-kDKg+PHpp9TfJd7ckIMp0LRQgSEmT9fH2xBVH5UTCfL4Z9bYrx-GewxmfywbUnsc3aOzYGCXeDa-CiwfSECES0Jd1N0oxTpyaaoWjKGT1KRGStKQyR6UPNzrTeCgJKae8jJTJSgQmlUJ+LpQ8ukWbsmGDo1UBDoiMQQaYdMJTQyQjp26h9oZBKhpvtFbL-tKuwM7BR9pihdpzkFdp9ND2p7tA8RHtEQINtFM4qWDmwQqAPLhIoAiQYrn4ptB3N0RjgMGwXEECCCtoaKNIF26n1o1JFcZIWdYERtCe0t+qydpigkSOVs1pHyJBp2tAV42-ijqjdW1zIpDyQtMc7ZismMyjUmmh7lKZkmBtMVJNByoJ0M-Y-jtYEwHAPxTDDyoUsrxT3TFqssRvepEQlCAGUmEoa7GQcjhbWQ+eaoQSHDo4OiJ8wG1K6xSaoiZWBNg1w4hJc+KIcQlkGHwM2EcLCyW8VLSJ0RcAlsxiYbex4HNYTZ0FcUAlLodXLcw440WmgtzdQTnXpHYUvDcQWeVz4VSpKo-VO7y0zUkLXyKllUCYM5z3rGQ+NRIJu6pdsbmQabmGjJQ5SHoQyrmE5QvCl5KPNwxtLqxpdckttz2GjkBSF8o39vCRoKGI5ZIpOhg7DAFBrRQNUpI0QPSFLzYiXig1HGHxaPlo4kbjiRylOZJqSBfL6JfclJHHcFxdkT4a9sZ9FHCA8uHL8ROCPexhBA0wgWbukX-s04qHGpSYiDmRhBLOlZUcw5t2F-cLyBURHNNjxC-s29auqoMotNA5oKOXL4HD1ymlK4ckHBrNUHKBa-7LsohJE8Z0kL-8Q1mA5OrmlazESiLHrI-ZC+IJIIMcIIHSBA54yIrlj7ByC8KOiwFkMPc37ApFgmNdlPEeZKDTUN4+1L6jH+ON5kcgfZbUBtcnwQGz35UZTP5bkbv5QhxzKcEafwUw8EvuEbCAWFLiARFKYjSuBMca842RbvFyGMIBwBfTRAqZQg2oH8SOOagrL4lTjKvhWz8jUyK0DEUbwgGrbLsB3lNbdrb22c0beYFziqEKraRqBba1iffgtbf18FRLqKVbXyAnbT1KKEL40GIahYDOWbafbVaKRjcHb1bXfzUjf7bpjVxdw7c7a5yvMbo8d6LY7cIBljaeyHbd7anANsBS6ApDUJuBsTpTtSH2fezLjWxDwCnBsM7ebbbpW+yLqXGyrjXrQ7jUnjMGZLaZ5E8aHpS5Doft10P2EQz0WFeb27a4qNTlByATW9SQZVgV3FRYkigRCbGxVDTygTDTVJnDT4TcEqooajKS7Qi0KENbb0TfUa3bZRyZYAIgugVWQCTevbpxQZyt7cxyFxaxyPeCfbTBRfb17bSbGZQyaBlbYKmofYKjSZzTlflfjhpRJyDSTNZLCrYybSTeLtrEKa4GM4zRoeKaOlWELPGdKa7barS5TTMaFTU78AJcqbhlX0Nfci0R-ckFkJLozkwlJKg+yGHklcgCpFnE7ksCBCw3cv0oPcs0L70oblMNUSgWiJeQmJVkggYpY4JpoyzfgW2qxkFQE+PPqqGMBAJISgmgOrdFlGhh6CNUJHZyWJeQiBMJ5XVPDbDMmZIHGNzkSBBdV+ci8oZUBPwtYQjlE7Eo7acvIsNkkzkzPG+goagjlFKFyNPqR4QZcnQj+pDAQ92OTlsbcul-Pp6lsAiHYp9XmgViD8hJSk9J1VTJa5Yf5lKnKwQa4usMocrWgbBoCgEMpGagjmLlfWBmQO0mzFn3j8KxjIyhj+MQRw2M1lLslPwEYQUxdslbsSHk9lSzJfqvzfelf-HehU7voJAvmk6nvAdk2mDGZ1si0ZRBInY1lOoE0nUdIqTraoO0BlbRcoNlo0MNkJmH1JOsviijKLwwBWM1kYogKpEzD5Q2iuektpD1lPEP1lV-kCxXPud5qsoJKVDo9JejP0pkZJIEOzX0Nssve9lSvlkLNKBlSiiVl-dpI63sjFkpKIMtKOolkyGk8zUsvcoGrR50xciohdRB5cs+HehQsozCJogdoiCHg7FVDOxpYbehQsh79L0D7C-iHg6RkDsFqHZf0zgjxlmeS+h71bOg8HdeiKbPOwLiDs6DmA4wRyNpRg4RhkpbAB1oFpJSxss2S3kmp0p0GJpyHbckfgvA17iONp2DarCF0aoJn0pxQGWe47fgf-xY0MtJIVDWRZguelOigWoUQnRgm-qKQqWAKZbVPVzE1Kt1VpHt0j2gTqcnaS61sdhQmiCKQTXnsj3MS+gGUrmRJnVY7Fkkxp9UKIiilKloe0qotflOURJ+HC6tCcxhgtNThHUBXYlRvVkjpDsL1XaSl5KDnZU7rWhF7piwYnd5oTuGIxPzSVaF2kxoBKIUzYAUjd5aj0jLpKIJDnfekUHYjy1ktRLHHc68sHdskxucF8s+T4bo8rnyqRX4yAjcLai+bPEQjb+CAFUl9bnCl9E2UE8Y3OAr4jU3z7sIwA3iXQCw8G1AZAOjS1GbracpTA6TxRhC5bU5NpQm1BK3YgL1Hj1ha3fW7-8dVLiFZWVO3Yi4V+US4+3W1LmyvICR3VW6Oja9QJ3f1LA7RW7R3dcThje1Au3W-ze3XW712cu7Z3XMahIatLxFSO6-+bW7T2TO7u3Wk89jXeyDjde6jjTd91FcRBz3YLKSwndLrjbSLG7f1wf2ZOcbjY3acGWYqjxLagytN3b8CL9LzRECbIOY4qtzsDL+7RXj4OZj8PFRPaWSZCb2SS2KsOR3iOxUjKagWBFe8bIKhSae7MZe1Bt3dvavrbibb5PjTiaY+6klQxzCPUoBUlbkqlGYR7+3T26NSfdgiPQJV6PUzK+OUyan7Syb2ZSUrOZRyb3nry0nNusC+ZU1Df7d4K5OQ3aBof4KbqUQkrgRC8NFO0qQtp0q-8TKaFZWm6lZW8C4HarL4hVTtbdcpSrdq8xp0EERIGsWYqcG+8zUozaPOkAcJYocgA7EQ0bOWQ0XiHnE7lDvK7XeBgS2vuxn0ouC40GIRm1ZpImVFQ41nZExrQXJTq0qfMnef6l1zb4hzcsE6sjibrq1Qx9hmS4J8yMuRQ2IkQa0IpSpXcJo2pBaoluIel+wrqYhWGa1VyNUhpSgBQOAvJ45lP56djH8i3aGVow3WdpwAZap7kg5lNPrZyRiF4QEYUGh4+RZyIfOfKonRAR4gjSx7Oenybna7somB+wGbCs4Ustkgo+ZgQY+UdI4+cyV6PCWrWdWUZizIHyhVEyQiyR56amH0xTCFVVjjFU4xCIT1JCB+wNlPF7EmRjFq2B0NTeR9zUZGKVIVCMQiNMo1AVYxrtefgRdeauwjzZe1KwUnV5mKyxcETpQW1SSQ6pEryM3tjxHFt66SkEbCD+kLyDtCLyw7ln0+pL9D6iMlz8PKqV2bICgPpBK8r-Ht5WUh8obBGvs5WB5dNPvncBWKyxkSLCYPlCQ4TyFCgYKAg5wZOswr-ODYC3iS6CqsihodXAcvmPJ9eJM0cX0PQJpLUCKEvehJ1fNg4BlDCRIJE4hqcCyYSjiF7smFi7ZGA2bUMctdJHCugb2F7ZOfWYhAZMZRYKZMokbiW0xHQNcpmNd7cmd8lmHA0wfVsNqWmOM5BhXyggzMiKcvWYhoWXkxPbIUx30CUwcYlgJekVUws0uJRbZnEwG5tG7abskwcLRyR7iEeSXfWcVlOnxpvGOMc9tkkxAmDHyYUrQsOCWYxeGCg19VDYxJ2ONzN3j-VLdft7VGAajOjNtCofJOwjmAYwkfR6kmvZ7VhGPYg8mOIxG4bYwZGAgJXmGatYyW+xWGJ+x46T+wBWH+w+GHObJvYYMhjL8MaKBzdhOnNts0TQ6vLWEp0TnBSqSCUwXBAn5b2F3dSakw5-kKiNoAiUxwlIf1BnBGbSahIJOtCih2DlhJMWVwwqyDDti-W4h50oFb2NILNt0JUtb0DDZtSJY6Y-UvURsXcFmyKtksrkkRJCK9Ji6cP7ZCeipYpKaDA1nndXyNKpfCQUVbDYy6ICWkTVJDZpp5h9JyzY1JdOs-Li-a4c6Am9srSgEoXjM7YwJeR8LiDrUiSA8dtduh8QeZh9I7GCFmnUnVwPiB1rsggI2rbKYDYsKVh0L29SaqUZ9CAcUSCEjcVJOnVS0J0ovLeIxVraZ7M2i+8LPWIx33tHcebSKcwcRDj8+VF9yRdgDRbb4zDwMFLKiUAqojSAri3bEayQnw84pWeyQGS9hA8XQBg8bmyesFIAN8WFS+jTPScjf2t0IZWysFRKKtyrAKy5GYGLA-gr0IDYHPTlkaB3fo9z2UwBPA2O6rA74HV1v4GWjcO6TA3Qkg8YcSiXNYHN8Tt97dEu7ZdHEHV3Srj0IOkGV2YkGd3WkHzA5u7E7SXbk7Z4GT3dLjdjUALASZsbgg9kHr2YcbTpSorzpbAyH3VkGCg6u6LjSU8ECo9Kug+QK48THigfpLT-3YopeNGp0iGbGo7FbkCSxf8a-qdB77Fej84PVXjQafWKwPPj8ygZs9UPW3i2xffoeGeT8+GWEqUTY+7ygxjSwg0kGyOe0D70HvaX4b0Dc5F6ADnrkGSTQYLqoefafA6cH1SeQpmxPcH2PWfbrBcJVH7ZYVn7RzLBvq1CHNjzKv7TUq5rALKMg80rtKqRFhTY+LnScEKaIuA6tOV4zIhRxdm3f0rEiv+KlTQkKVTaVbP+iWhwA8yhReU9r7yGGpRVO8K4jM0Mt2kEZwZP-7YCCiASWT4S7-WhRAyAsyIpHn1wqHwJVMt0KlrS2xj-T5RT-SeRJ-RSlL-RGY6A2A1s2FRgQ7MJRVMrv6ZyDLZ7lkisP-bns95Sc7X5nYRl-esYNYlcFYCBv7P+OZaJ-WD7rSNaCtLTP7rtF378CD37qWDKplrlww5XagNDdQ7LbhbCgMeQNa4CEjcitHcpb2FttEGtOTQjoQiA8h4tJ2NuxVSPeoc2LwxlhbVsfWNN0bVopLTCA6pxttZ6R-a2w0QnplO2BYSRkJEh+2KxhGVbD6Fjmch4SBDlyLTxas2DUoV9k9i62Ir7DPS05kfBCz5nYhhs2NXZKqv3C6-WYhg2HChgBFcR5vd2wAiahg42OML3ha0KunGZLPCV0K2w-whqhTJ9WGnUKIiTMc4DYaN3hb4SxwyhgsRe8LD+GwRQ0vckAfWA0nCdKRFJG4T1w7WhPCfYSJvcCKzkA2pmCcCRqw8ULV0kB7u2BNaJQzZ6jBOoSXkloTTJV6sGCfISY-NmorbhwSq0pITJ2C0hrhaL7EmYIS7EIpLWlAwSuCfHT1dW8L-w4wSKza6kTJZkLkwyAGZisZL7DtpdlLkb7PVTel4A7wQFJUBGlJdlUCPJJKWgjJKmhk+HzLixIJWGJLStJJLjQ1JIaJKjJMheb7KuVyh95ZP7ejBnz9vVygMJDH5Dzdz5KCWhHe7hagiGpp8ypCrqVQ77rVBsByn-VjJI5nZKDyG2gGQ6lJ46c1dbZqxh04t+TQIzxiFLiyYg1XupdlMnd1LiItBJAYbrPjg9cbCPcpLsAGxI45RJ9GJkWMB9zkvZpILbLT7cPjgGfCHgHSwySQkWIQGyPoK97I2BHICWMgSMkzz+fWgHflO04A4uW8CQ3ORHtcSGw7qSG1OkQF8rnIHyHsGzFA6SLDnCoGYcWoG9OTGyJbVoGC3cArYqWAqWRdvEjA21Au4NeLq3fO6fMEcGG3ZEGBiXrahiU4GjbZFLXA+1A6o+vSm2U4CmoxUaKyoEG+owfTx3UNHqFbIC6FU4Cxoz1K2oJNG2FWcTYRLVGdgM+613bNG1oy2AmABq51MPnoPgbWAr1u1BFo0Iq+yqtH6o8tKD3Qsaj3V3AT3SdG87Wd9H3WNHiQLtG89A2KHo+GKC7VAylFegLmgycano1tGXo27A9o+9H7XB0HcScPIXpQnjdFY3aKBanjpPX9KAORGQopJIwrFV2FtKM5CaBTB6McYPaOBbBzQisxtc6EvB4AP5Tlg-5Y+xtUJNNqUCmxawy86KIKuSe2LuGZ2Ldg92LkTajSz2Ux7cZTW77oxApmfsOB7JHvawSL0CFowc8Fo81HawOVZSTU8GjBY+6eYyuKWPbLHxY8x7yFHSb5YxXhtxXozj8fx7RPayaePeybuaSuIuTSJ678dUqLxbUqJFJJ7-7XCGoGPeKzIeLKsxa4yQhWA7JTeEKP5d4yohb0rYtpiHPgWrLEHRrK7tWTYjPKsEaKLOkmLTgs7GC2Ro0N0YvRoYaybJEQTgpmSGUjuSwKJq7x7tnZpfAHdY42rceBIshMAnb5gw6yNk1Lm1qRmZ8YYaa0G1KhLessOjHpC4EjWMVllQTDDR6q+h+uUHgpdloQimScY-KgDNd9cWa6bs1qEuqmq5sW4QZbmJpO5hCimVT55J1AyoO1A6R7kn31P+G8VmBO6YIdYSid0BkEWNRRRvsah06pK71W6jKgfKDDC+Un5U7ECDsYOcNipUKBqeUMSZq9cJq142p4inA28I+g6yspDOxDtIfHChsEQc2HEYBer101HLKQ91InsMJaVriza7lwmemg5KZ0i7il5EaWOZJBNRPGbTVuoPdsoEkiFVa0bTbcDUDQQacDsq+DY3FkkJcRqyInNVBjYsdSotcgOk6HSBrfGe5hp4fiD74Nlrb1sStD1TfGXHW2OepKkDy9h9e-wvPTncWTj5QQI+46k9X10CVNCxq0PSpFprbcymJeRUtCvGoUTugIahcUoKAUs2MtahPIr4hAcT3GQyDuhTyPHEe4j6Y4Ft6ogiLCQdcnMZG482SqVvuwEVHomp41koH5Qswb4xZr9BIlI97mSt2MTYsmSGpaxtEFE7E2xqHE4-ciBJUhXOq6MxSt1i-7u7Dr9fMkPOmrrgyU+a1KVZZFpnW94au+b-Bk6rzzYcsS4yzMMilJ4JHKzrazeomsJfcpdzc2l9zYtMBCE-d4MIshdI-wnNVRehx2EUpQRqiBFph5aSHI-xDWFocTvdCwfVg2YnosicuyUGZnfFHqmdUYaPHF5pvCLWh2MBDMoUCH9i0PCRzjiWR3CPHFrKA0m95jRRKEbwb4E9gdpBM36EyVJQewx3FEtAT4D7A2pZrlnH2w1En23q7zwyajN4k1GSdKV66vDdnybdRfC-2m0oxhg8qJevNIl+hLNxEBhGaVUuSXNJ8mFvCnrmotPUxiLa61k-ekoKIjlTVLOqfto39jk3yDaVX2obVXVJoerLrKNYkN+GkKwate4wMyP0mNpm8grajOQkU2cgsbWCn6hs6g+mAmr+WEWhcU5Z18U20hhXWKYkBq0hPk3oxayI+r0lCAbjWmMhpBHPGgU5EQbzZ8mbAu1i+U3B5rKJ8mlCFeqiU3nDpE9Mj0U2ZIhSHlqtoSL7Kk1ymlda74-I2vxAtK0FPk0XCYwUCmZtiSgdU7uhWMNCmcyOwScEwkMN0M6855vqmIKJ5Hck4ZkrU4JIdkxL10Us8wJZgWKRU8P4NlOEomijKnXMYkNPU48rljMx5Q09KpPk5Q5ttbdrm9culuU9DFXkwn0zJACZBUy8mE1e8nonEDj6dZbCDPYSit9YkSxwXrrGkNMK5WHupE7M0jdU0ws2Ca9qS6ain7E0rrBpPDqyGmomLUxYM80-mmkiYrq3EFV4luID5bk3YbG4m2n20y3LF9UWm30CWmrlrDMwk4GT0aqqmFzQcVXtRtxo013r6hkGmg+qOnFWPAay03CnSUhuxG0xoJ9BG8YzJtumzslambBnAsZlUH401Q6mIUlam5lAynCDW4gsKBGmdNHsQz2jMrZEb1rZU9dovJJmQ300cdaWEanf3hTrGkF1pPDUm6eQTmmZEwExejG+nHOg9VmE1yMgdY51N5TDC7+MSxuwUH1rBH5VMYUqR1SGzrQ+E3xO9QMmybPLqdRphn1TL9Zj06V4RtFWRz09IxRyJ+ma9dJI1iGfq+EHEg-tFKQTE00nYM+B1lQ1mnwMw8nb9Y3FlBKXNplaisbglRmWGDpoI2G+myvBcwYYd8lxmNMrKlvgEvE8HqtPl7ciVQyxGPjDC3MnoM30+ils7jDDbOVyQxM3HwZBGpmk9SJn59GZmRSF9qr9dbq9I1bCA42rdUVl28zM7vCl08Rm1bkhRlM-alUMz6piWH5mfXoxnhNUvsxyH5nWMOPHgE5b4YqPeozM2P9-U2FmWkSZHFdRD7I1pJnz0i9FbfT8YkWJrF34x6lH-YvrxKNDEaU6vG3M4zs0s4HrQk45mKE85mY016pssh4wNwSwJq0-bQFkJxS8w6tq8ouVVkOgxRx7m+nBCYjE1yEBhskC5q2QdGRYiO1o2dZa7l4waydSElmLNSG0FnNOGbiESrnYam9JnE4gXNTp1wkbCZXJDSVO01yV--G-6GmDtnApKj1EKRko2dSNp3yKjJ72CB0XNYYNr-Buwa0F4cMBnMNhGK8ZAdCVrus5xps2LQQ2kfqQVENMqcDk+RCLW8bLM5qr4OqWgHiCpk0UNMqy0U8R20DARr-aSnftHYgTyFWoUeojm7GIP18SBa0oc+lErZnMpvAo6iEc4rrIiIpapDuWamHcwiLEflFFujuxXfIaxbM6qRn+MdNiJS5qa45U4hHM4joLab1pItNVHkuwQvdVcqRVSsRB0WiQecmGxU9Zzka0IcsbUUpjMagmkbCAZI2dRpQDyKm1tGmZr0c9yB0ULbDUKJTCQNHLn-gsHYucodklMXFzdPB0RREUDrUCDegw8sSwYolbnEchEoM2lJRh09nr5pNCQtELkQgSF5mk2v-UN2O2bI+BTnnevZl4kCYNo0Oam9cxiZ+UxA4CrSsUzM4o0A8w4xmSEpiYTk0xGHPxoEs9bzdSHsQxs1RnQ1tPHJVQ614zYvrtFvxlXUHpJirX9mQKVr0VEDU5L0Ljmr+FiY7SIfxa02xrmlII0Wc7Klv+KDnPlEKqZUO6YWjtenRlMig+A8QQIdKeqg+vLVLTLbFBWdzmras1n31V3bFdRXZ2s+3xfUyr0p04kLXEbohDSlzlKCfbntVKCmYs8HFoWe2mzhYrqNKKFn7E6khI-hTqm+soFMhUTnk4iJroejyg2Ceen2iGLmx1YqhhbEclsdUoR+apOizGMyhz0+cVwRZOiR-s0czM0Fo1unpFJ0TgcplVVneBpymP8yEcvCIkS2ddp4NUKuicSH5mNLePnAC-vU-M-hHGWUnq0yJpncc8FoGljoTYCyYRQUbhIk-esr3FJL6380wWCmGAm04vhm3vNKRUI0wXZ-LsifjIL5LJJQTJ0e4w4qHQXj6u-mgNVV0bCXRIC4+Rm+fYHmskQpd+C-GpSCwGhVGJVVv82ZLB8zWRnfRfnFEY51YSICo2CUSqS2sqM-2GZLe0YFoRw8oXcc9qwdC6zCYqFiMXC5ble0S5U2C2IXeJDsZe0YVVUNIPnfzT4WhyNfnOHdnqJPPfnvE89zxOrgWgdVOjQCJjCL5j07lC8BmTVkpRKCeoXCUUmpH9fmnPWXPnL-KA8RI5jD6M5OC6JH4Sjs5CoZ0JQTMCwerpC-mZG0+NoPwx+pMYXk7IrTUXnvZjCjYdGhMhRTrwPtWwcM2TVqWDkXG038E7C8gXMs+L7zTIPm1NEgXZJJJnTkO0wii4vr6llVlKCfIWhEQnTB87kWoUewtYiE4X00C0XciERmgkQnZisrgWZsxEEYDpJnxmf4pBi2OSP3i2mWKL67fmAumO1drClSPVdcC4NmYssqmnM94nPih3K8tfdlLPnEjBkBRQpizocLtSBRrmkETJM-tUCBpYWdCRdrt2JQWVU8nFxqnCg0QpQTIVaHCQCHEiIfUEplCxyr27idM480LZp6gX8atQKQmTnEihrfo5cC9trCMc0iq0vehcC+1rxGqjB2S-tI5SCyWgU-3ru3JJmNlfwQ2i4sjnenfxUus0iFQRFplC2CXLtYODXi6ZI8pAHYYSy7MhSxBQpKIkXy068A4S-0j9lZEXIVSGnDkGGmgE-Xn-HEaWh05Cry+Powt2oM5os5aWHpGKhoYhBry+PeQ9S2Mx2JqwW8tYlocLc0iSmUbTKCe1qpERsNRS0Zr201S6E+pZ4uKHqX30IETiUEqrzC5XV8S80jH6jCgbVcOxuyEIXRSziRUWHlqn0C-70y-EE-JGUKsy9hLECV3xtixYN2dQZqKyyJlmkYlpNzdcWiNb70ayy4R2M4liaVTp052P-mXM+U4LuvRraPHyWm+BKXnFWPxVUvyg+S-46JSwUslSLP6kS0XCCHkCnBEJ8wOy9FROdj4REidUWO4vdli0hKXGHMSWIgtfmVCwn0UNA0X6UWVJVkmFrgyZeWLBstVmjr6GC07eWsHP2WGs9SW4M5OTlC7xrsrlzA4kbdmFKLhK7NeMRdc6YX61dG1zJHLNL-PS8kSzwJhFtBWAVhqXaMHEieZkHdKCXonx+B+xMhTD7nS+UifWvh0yS-KsoCG+g4kSapn-BDMo+EQ0ti-eWtrlupwo5kK9E-2bEzJCXi4qX0qi7dM4+J6WkSwGqn-D+WNlihhFs8CX5JDdJBS0PNaPN6xcC13ng9aGsDoXgjY+P-syswcW9Vu9CqizYtCBhuXapEyZIiyzMTVNrCN+gvqEzUMQw0PpWzkEf9xi10m6EfU62CfsXD0VbNTHDuXs5g-DRHfiXaK0aRO4rNr5RhdNeI1SX0bJ3Eg6hKXLVpf5A1PcXoqg8tnC3ZqXVNk7wK5yhRak8hbFWwTfy2HwSJWODAS3VnvE2rUbUGfHHlVCBrkIUXzi1kjlqjBJc1UYIimGuG3C+egOteuW2Iw2W3KO+Xl0+pRzC7zYIq48qmwx86kS6+w5i0CmdOrgJWK5UQ8S1WnVyx10LdvcWLUFSq2y4sgDC13xtYU31-FMBXHlWYSviNrDOGBuwpq3prby7Nrji9DNTK9dIcs00pxfT5z7i3nsJWF5rrU0X7fK3-hB5e7FlC3onDKJhptYaqx0MzVWnogKR+KG5WNE-uX8Ci9XpBNdXEq8ZmOuqIX9qwI0nS-2mdi+ilp3reXoJJK6Yq2TYt1EPwfS13x5K-jZhkL0WJKwNW+C9BXbsZpXUyJplamZbNXtvVJMYe0QABk8sg0IFW+0-Tmqk6Bl8zM0gNlmw1Ua6sQ9E3maSDj+XpK0nqss1khFE2xjeZu0KRi14gFCfj1D2rP4Bi+-HnBC67rAndo4ljkXRa5eQ6lolIW0AFmxjgjWTiwYsK3nspJC8sW10Vf4LRo-NkKwVXV43fwE+a2Xrel8U3FhhXUa+Mrla5qWfsUMh7ZelXg9eek30GRm2hm5kDdUTXLCbuXt42oTxy+fm8K1uRNMgOaxK6h1zlkpXD0d9sO9YsW7ERkMU6oOpMs6PULyFyWIhuBohKw7WjCUQQ38-Yjg0eVWVS5b5-bOsZUSytI-0Y51UpGtW+JZln+dl8xMhVLtTWomDy6+fwIhmlUoy5jD96pEW5enUR3PRdWucvSRzCQnUWjGj0jCfGZC0fKp3qzjWjBO0xzvJxRt0fJa1rk9NUiyyU4sgWpfvdwjp2PzDY1JKU56wqHI634WwKC8FntplnGcs4IytD6YIkUAMKWAmGntJ2pyixc7Ew6wWNMemRo0FfWd1fepN0D3E++qYRrsh6ipnK4Wc6zjWzGE+kg620MzJDC60y5ln-gQ9ji+jpo5-K5XMYcAN1SPxo44p0iQqvbEVCAAmxGFfXEBEYFXKpowoRi8oWMCXC6yJjCn0KOlnq710mCJW1m6-6lqVifmn414h9a6WiZkPhgLIs5RUbcN7gmEKCGmMQRMS0CXg9UlVhHDdqviLPmKRl8UMrhnZV2Nl6Ya7oWUXQaGqi3+i5GjYYKq6D4S+lmQcSvrEClr95vU8cZ3TFKrQaxYMpvdIHmtlBhflfj14iVZ7X-F0Re0fNJgVJcgJWHomPqk55cSJNIU60nrk6vCpQpOuwxtPJG8ohal1iLWSqSB3WJG6zDsVqoRzJN8xQ-XlFa1LRg1iFoSBdZ3Wt9vgQma13FYizw3-bPkRcSH2xSiCzMwdFUgAUJIn4atjXFEWUgHlG2gilGxSzlpzldSv4pTVGlXnQ-YmIUPqZrmQsZ55qontXhBb6q95nWYZvmXBPzXaHU9FVPCjbKeQ4g2m64jhdZ+RiE4X4hm1kiIUHKQtq1Aa8oj1WD+pOiWJI6QLRs+lsE53WuUNZRDpCkZQ9gGN0yMMjfJKMhfszo3TiI9I6lMRkBCKItGuX3WI1uLrJM0SiLlCnB81N3FSegks1lOrkIyPk34NeDWPGOGgWimbzdequh9UPrC20OAXuUMysOmPHULRhGRzWinBxlHQ3D0X3ZZ0rCZdHOxpdm+8ZAiEKgGYZ83OUNuQ2bErNzInL1zbFSRAyDlbKSwE3z0KGRYWYM3ySENjC45j5TVnYFq0JOiX1FWRRA4XxgeYXHZViiQHm48RCCyaRr6jLZHjKT0YovUiO7tg5V0Ug2jtDZ58SNTahG1pQniOuo1Bquiec20ojmHwIoi7r0teUJRlvNagR6y7EtCJloUQkOrPayotnbO6h1Ov+pQ6zXqIkM69RreGxltBaNlUKwRXKrKN3lj-WXYlTmdQZ91V0pNIq62zWqk-MgAVF2hgfRyRIbfpaKYgm9dHZgHO6yIg3tVcX2hSs3xGKXXY8+S2hbLG3ItLSHt5gCh5S2wSuG-bWk9ZzBnXmmoKihKjElo1zXKCv7nFLZXXMQiBovZw1eBOwIbFi8Q7sXmiMDgo3oQlLZpNUJRktII3-sxnwffDCggSEcn22zdEA+ToIh+GYaHHcY2x9fPtZtNyRsW98EjYbsp42J4QmzR3F0bUMYqqlCV4WzW3pHfAREi6T1qVgu2VYucVoW4xXSeitpk29W3KNejBxnJcQOUd75LZnfwB4yFRdCPdWqM7e2ilBPxXfFiYis2-Y0QknwntHagnG5qrEQGSR7w+u3xCAUwQ4f7Z2SNawroU5QLRt7TvSwuRndR+34CXdye07OgLRlL66w0DJ2dlRnOkDkQXNAtm0iEXrUOr4Z21CuhDsiB2WYr8ZxpHKCslALntJCxJkVe5HiHNnC3DPvL4bsQRZG4nCNNXcoC1Hq3uEGkhhLsg18UgkYXm+i6G3vhr-WyzFsU+NJaTH8hLm35U3VHuhyOtnCGWDEQpaj6GshVDaTvGZ0GiN5bs4fywZ4Ysh9Ir220E78VtyR6QKAnJ2IYu4oMpEUo7lLDkkOyeiQNKOi-uhdX7EEV1qNeAi2mLY3omLKQcKJL6TK4R2JPPMoVEAPxtyUh2XQfe27ovZ3KuoIglgrehRGECQbFq-N4kIdoEgtnC0MxcRyA5e0kO1Id6wfSp90QhjFncY7syIckCltMsYFppJqkO-7U22oAc9ZcYvvXuoQEdYEzGA2bziCyZxG37Xw9dnEfkBJQ6MLexik60EaKIkcYm013FFEhRiBiQ2ymy3Zyawhi+ilg0syDOhUExLWDjMVIqhtZ5Gu-13TenTdnAmA8zmajMg0BMw0UHDoEMXMNmXiuS4bPHMkKGigktHBhH+Fa3KNZTqTjEm3vPYtNr0FHwJkCnAKa1QXNVRimLSC-4gSCBosVi0pCHOwJSzBYElMWGqOmJf8M0BDMdCFXM6MBmmR28Hn9tNtDQDvd3DSmIx3aEEQ9vRdXkQF5IE65QTSazgX6i4l3XU6UwV5AqpjCZxXszbmQ5feLcMe2YTWnviX9phAilMYMh1jOSt-FBX6ell5J6YQygdUn13jm4IEdOovNX1ESgb2GwshGOjssRkcgYKDz2TTE45pnBIJ5RpOo1ZjTn5TMe39cyepWrWhgnMfPNT2iIxuyIvwXNRHtOVHYFbUPsNVa82lafGixirtT3ktS91CAjllNIjYsWkH7F3Zn1J9exiZHqwUQsTFqtbCZB3NtH+h1ULRgAe1iW9yzx5uW7EZDWG9YkOz9CMUuug+BsXndop0ZoCA3wkI+HHe2l79C-G+wXNdFVHhtQ3Vawh5Xe5xp2iL8x5K2ZE9uxL2qyQsYGC0gSLRlVVvmFsWXNf6WVSn9kGokN65m531+gjFIuKLR3emxQjhk0ZRktLpWrdkDEJkNkEpCC5rLXTzkDNO2gPjdO27qsyRsbDyoA++L51aoahvEBX5LO+G2ZUMUNYNDhQ1RuBRzmLiZxiG9Ys9QC2Gu+Uov669iqM3GR9iBUVtkAyhHW0CQQ0JnrPUhf2oUrTldvN4gOE9aQLUO0pbLViY86i-30ggEt1NC4nBekMQpWJlpMQY5p-+4GYFrfcK0encZzsdelYnDu3KNTaRkulXWn47Ewd+0kggfVJQn47AsL+wuanyNGoOCBy3UOukEmSDTgPDL8waB45RtGG-nEupY3aMJkK+E9w2LEej0F+ICq2CZ0mfsQB1vHLm3hO1JIMGjy8RIwgjBO692LNbH4urggjC-KCYbK2gO-kBOWd662wL0RrWR23GQkUgRiPDMm38ByoO8nfpJt0RKUOBzIIiHGwTOkWhrMtBf3WUSkYvsuNJsq7UjGXi63bKFX3EMFatlHU4w6yHvDMThE4Z2LMY4A4D30ojaQ-LiuawHguTMTk7XRGEGYBVtoOR2Lp5t1C6Mrjvakqea9I12Acg0B0+9KsgppEh1w657OyUgKGUYL+3Itk4xkSyGrEYpKzUO-tJzzUtFyx0iWWHfiHz3OmL6sX+-6Xp83p4WrfYidUQZJq2NcsX+453KiKhGIhsY5k2xM3MutJI-sZHXtSPYim5hf326xN36i4Yi0qhYPYtSep4PJz3o63BlAq-4PYyDQT52PKqGVlt1V1V+l0PHMo5Nft2Y0mIsJUApbvmP32w-Skw4dCXE-KN6MfhtwiwK48PuQKBlmjjfXDC5IjpBHhRvRoRkOpuX3aEWrFlB2xrdnZ1MEEXdCqy-+WqM47WWhn30TOqP3X2ipI0WH304QriP7RrMWWGwEOM+G2g2IzIOS1HlzQR2iWIGwjCZYY32Q+LZz2NHVlBjJ0jZlKxICPpl4kmxYjHa3PKNvBJRAaw1z4hymoC-qmbARySBOXeOiI+n5JI9qwXThyHx7srRrp84agdkHKPflmMxHpjvr3WyK6e2HpIM6ybX2CC8WLq0ig61A2HWG4zC2I0qOSSHfxiovzWylKnC6W0QIeSEts3aBf3Da5chUIyp3YexiPPrD4QQYe1F6ckI3rsjmxstR2hdhz7rRnTmhrOyr69SBe24NPkOiBCYcR26Bl2bPMpQdp7Y2FlCA0tN3VT5kXm0x+QFEs1gshJGUPw2-Y7ZIiqUp0FEPY+-aNAtJ7qOnZloNW+G32nLV0KKOKhvRkpkuq+H3zO12PO+qxIJiIKlyx+vKZJNV0HOS0mMR5wwQvMDn6VGD1Va2QJzWHQQTyLWPBB5qrvtnmoMmQWgsearWJ+HktRHXKrvRhcEn-DIJ8iNCpXE-eghdkh5gzN6M8za0hnKIcRrUPPNX8-YEO0nidpu0mo+qpkF9yZYn5a9FyrWPkLqRzGl7bN70wRmH95eyyVmcgpREdt6MLusIxja+JWyiImWkCWQO59MupVNSGs+0alpFle6REFqOoUbU031uy75UiHxmpR8cBS1NhQZ463UlohXMlpn2oRKQMocJ54o2FrWoyjGULYJ9hLU1I4o4KZk23CD73Nx85qMR8JEDNawRb2ONI6E4mYO4elGVtcyPuBM6o-jG6p7iBObaJ-yhPOzIIOCLaPE1CapCQ+aovpOzVaJ0Hc7VOUE6JWmPZcmqp0m7O9eJwkwIMXqoJ0DhPIdJKoAMX5Jvu1skxQYuC+R+uOK7Kj0uVGFRjAqjMBVEHyFIppPZBrz2KVF6we4vKNvLgq22YoX46c9EO9lRBQDyHNzI9non3GFI0xtMSoY4yO2kquCpgTlCp-m033GRn2G0qFRneG18pYcoR0WVgCpr+GcWuTkaNrlATnB7CQ4NU+-xnlDgJZBG8pTR9N3emIjz9lEH49iMRWZCESzzlAfHSp-q9j6liUgKHOxiK2UxFvYY20SF-rc9cakIWZuHtYneRcBAcRaCNoW9R-YoS+qyVvmUdoMM3lEXmdyVAWfclFp14xXKKvdqMtBXzTPexhYWrFFpzOgEjkmWf4x6s8WAXX2i6VPYShvYhJIUL5y8mpWPDBgbNPMONtqyjXrd9XwSsSOetuhJOAkNWeAkt3vp11lhy6fMy2p32MR9DbEDq9ViTEqqPqumgdpF9JyajhOzqhFoGKKEjCywui-WvdVYjKhPS1KVztqiFzC+BWXH+EKCLil+RvRnl35quShsG0CnV1atU11JhraZzkZ2mBblCAraGz1RNUMYNcRpqh5PUtm1VgpOCrYCKGXkmI-xUNP1Vv62aPobXVVbUxfHZZ1G1CqmeRrmc45WMyKryqkys7sQVZSpxX8Uqij3VpCfXHlZlUM9nMpXKtFWyJ8Tqvis95wquualVWFW6YYehgp8FUVGmCr3KtBIE1WGrfKjo0QPjtOztJ8qjpyLV-lV8cQy8TPq-QoOtS-6oU227OUYK7lgIwqWLtdyZDy7TOS2q2g6S8mpgUtLWMR-NIyghdq5e9e2VB64duGC33fYnlrpddU2KNSoOByTyp5u4mnApPUFy50YOViOaDMhbmr2iDg4cK56PqySbOqTEoQqkWxHfh0V18CbamhkNvtES2mOhKTsZGK2mnSOgDsMRzwIVjtCmyRlGP+R2VIilFinChuYEQG2mPry1sw+EbcrT56sMoSkERotWaOeqsn8thyKncTA4OxwUBOgR-ZlLZSKnFlLTP0gnPUcKzarpGD4RkK6DPpkdTWyPJ9PxauynH5ZAvXMTxlmjraChCcVJKU+qZlsWmOdYl1Jyy7anPEVbXpmGmOjDM4J2U2W0ZbknOX++nNwB6nOJZ7D5v59KO5GjaliB7an60E-Ppu2vHSiMsPoUw-rD55qqdJHNqQF0CmeDukWV59HPtJO4pUc3gvHlYH730Bf3u+9vWxTFClm2xfPxF2dJZWFigbVVx2NNPIuxjJHZpFxL1amAWCL+2DoJp9tr9SLPCX+0oRxyx2ng02xQ0B+9tG53AugU-LNUUM0OiSVovlOhaR3F-Ol5q4Yux9UTNWC2gPGBoFXN56GDYF4guCB49IOAqXWN9cIvnXiOQq6xwO10DUju5zfC9Z5B3p-cm3m5x6xw4ejOR2-onL+AMXttdFaZm7XPu89p4oKCUvpMuNmDjM+ku5yLUi3nAEu+3KY72NtqCVCZO1FzZEvatRXSJdtrpcwwvI1G4Zpgm-m8tcFy72CX2ciFbXwEyUvjKOUufdZ8UDQYQvc1ceQgp9nXie2UhTQcUugU0xplUAiOfdaLVJSxL1-+Kr2454IFODUpi6bk4vfYhdqAovsuLEeNVmx3f3ZGlicYSPkuul7xjD9oegDFwn11etelza1RnT6ncp2taMV6e33OPlwoENecEQLtdOgmR5TX0osHnZJRdqqSN3GIVw7UHc9ewLK38rjNFcwtB4Cu926kv453B5HaYCum+gKwfl9nqjUgurVF8T3yAoqNG01UNYF63PvdQ8vRYjZksV8UWdpvmnmV+LmqTOhJN0HMPB8yKoj4WwTBlwoExUHrrpyNcvPw1RnyU18wmI4QacDg8Z1l9N3yU4AQjl+sWRvfZmLqzMrVBEN3Bq870o0JhoMl0H1DBuWLDV2Q1WCFd3VVPUyR0+I4ZnCO25V1IduV0qqArQyllu15IRSjsv3dvcuge4506Mi4u7GHm2am2xr301tXW+-EuCzIUWxV4ops2EHTtlzIvIZurXHB9auWrTVqyXoXwPV3Kxsi6KvoU8wIJumIOEMYe04yS1X-F+lrfV+lFbEGijPF3RQIl9DPs9VSnrsiwu7F4A4K15TnG7hnZYRwar-UrKQPV03tFS9PY4E6qvoM32wEJ8cvkUPo4i1445Mi+qRXZ7JPCDXIM9O2xmo0KHrcCzGuvk3jkra+yGPs1AQ-4bKv44xJrneg6wPNPWv1lQywtSEPOhV8GgIl-MuLEVWv+1djq6iKoNzBwhi2pBSchFxavu6uuu9M66Cjs69IdZn9XZV3VI2fOe2js5-10R46u3pq59aF6avmyVznZV8KXykIcOj1+QSM5-OvbjG4hG03Ov4VxYafVNPYGl+srAMOHNwV95210d0Rcc-abs4f7YeM9oTcyyO2mkD9XFFwuviOzm2xwSaufIqJ3g7BqWavYrrHOxcHCO+JRFmBXr+WGNykl4R3pnToOMK2ZmPVHwuWYo-47UNMOqs4U7ZNyt1XDhXrW+AHOVYkYTJUCnmM4SHD-V2Vpm10H11+On60V8CBFI0OmK9RqtIiyHDCMlTgzM+jd2N4qQmNLbcD27fnTa9n1JM4W2ymMmuky6fnn6k5vsjAjrJpKbn+UG2vG4lzB99Z2uxB+br-Wk4vb1wG3JrqXXdB2xnMqpeRV0YH6eckaPi9Z8pFKKujKloEvlC3rqgWLXWR2zmgj83rW5c6CRfawJn7k05nIM4eibW3qRUY8707jP4pwtxXFa22iQvc+sqIDpEuH8xywSBGgaNvB1uFNWu8i+hwa4+IX5V0ceuxhcNuDiKNuXCDa20WG6xWt1btvNKujRpMXOA9b8pPN1bqX5RBnHk9O2o+0DEXBAtl-9U8Qu1LIxo0JpuzpCCjmtCiBerVrNX9ZQd7qsjITC5nPwKJqwgQT12Febhv1Ca716sqeuDKKR1iNEeh7Yrsoz2qPqtEQy3bdrduFEJKQB0F4gJkPQRtDWPr6Q2044p3WOXa1Kk-JOUpuiF2h-9fugHfVo3oa59vmB0Or3kN2QQzbhuU4ZpEkyD5WOF6Uo0iGoJWJAKsLt2R8PURsxAt+bzEeuUQ7SMwQCuqPrpDojaayIH8X+4-4VmONzhqpaOpkMLvO11M4WLUc2cN7-Gj-Hcp1JAkY0iBduJBEpd1YlCgL+5yrvlCWlisjTuku6R02VgJQNlMqWLq3vx+KJ1JHMlaV-9f-G91E1JIkAlvic24hGGyE2MCBih-9Q3MpAlypXKudmTt+Du80ngiFDeMhL0Ndu-ww5mDt4Jm0YjtFcPISv1lVLYKSPDvjgL8BSOgNPFdZqir02Zvy+ACg0DSShNBB+3rBAsnp9bYtUJ2wQU2Gjv9BJYuR27IgxjFwczd3qIY12B2hUmUNSYJ30h15nPzN0tIw0JvqOWIykP2xU4dCP-rxmO3xV0acqj0Ggbn41Xuk9-XrY3Q8Pat8m635avvxTm7GCiblGZTgFLCo4rL0OJoHAFWVGdAxVGopWSFsceW7ZdH5Ac2S7BLA2HhF8ToKWo6aKIqWgrm3RgrT9z1G1qNfuoALfvvAyeKTTo-uB3bbb22fo8pAN-vf92RDXqA-vJ3fONQD+Af4g1YGADwHbkpsfB4DxkGz1mAfh2RAf7RVAekDzHbMDzfvCg1dGk7RE8pAHMBWwH-ypAIAf-iZGFpxOAeYBR-kWzl9HUBT9G73QdSWgyeL6D7nawY1HiS7SmKoY9dS27RgzlRF+6LIUvIhgx8iVy58bjLNBoJg+XicY5B6h7ZD9sY9dwQTdXjIZV4qkPVPbfFTPb-FXPa4TRpMIWvhykaXsGexUKSqD6KToD9vbRUaR6wADYeKPehBqD8RAj7YJw8D6faeOc8H-904fgIquL0IG4eeKqrG3g5x67ntx7-g7x7GoWEf9Y6NYxOcJ6OoV0AuofzK+TX-bXHubwzIRLTpuMA6xTYiH5Wqp73Sep6PYxiGVZUZy9PetCDTStagGqMhfWTo4tralRLpBOGhbEXD8JVNb9HDNasTHNaZjnZQerXIJW-iUcw9XdudNEg5fYl0Rl9wRGeJGWXs+6N6WA7xRaql4R56p6DoI4DrwqBbMEBDo4w+H55jHKhQzzVh8craCEMyPlaW0Lp9SruxG2ubtn1jFKgkre1EUrbYQ0rQ-X-Q2Fb7TTxqC0nxRSl74dNPPUfVQyiQ1UE0tlAvO9V7ttUORlHOZI8ewk4xu9r0Ap5AqLu8r0sRLqI+eHp3sx502uoRa3r14PkodDOl0CeB3uWCaA2epR3i-Yk1duwJJeW8nyIaPIu+29MKF288tlq8us8w6ICSucU7OUpiNC1vhvXW8sCDJ21m-mGtyDm8QiIh44Ai2PrSEW94uiW8bCO8ffdQm8dlqplk3vk5tKOK703g2pKJWG9mpuUn46Tspo3hcwmk2eHe7lV1wlMxqfXkFz-Xn8geeXL2xHIi71Apn9HXuZ7FmK68KbMGv+CTHrIUz7CjXvjP8yOpOSGZa91T7+T5wQPxCtWv6bI+q9H+Jq96-I159PgNs6jPFRSmxe8uGAyHZXjeH61RBRfKMIw9j2r4wWd6t2YW6f9I3M5PmXQE7KJhQvrGs5KM9Z9ZlI6WjmKCERkJ04JnChR12LYJmnIct-DO04tsQ5QunGWD1DmTvqT52bbW1U4XPnKt8nMjYGnDpRs0HtJK+FNmcnFkgnPUxl408U5j9fRLYnCyZvlHRHcApJSwliykYnIE4p2iIRjWWE4PWpE5vOquO257BLsB045StK44ufAkcvHNCsjHNeuI+KUU1iNUfGtkUybHMKehLn821rVH2NraKC9HDtbeQ3VvebevvU3f4bTKZm7d99m6xbWXySo0fv+wBmMgISQCXA-oGtTkrai8lfvMIBe7YIbgffHj3zn921Gm3QbbRRUOtjbe266Dwhf+o+gZj4CacUL9vTWoyAf5AQQfgNuNHEDyRfjhMAftIK0b0INfuqLz1LF8bRfDo5OzejQNK+ypRfEL6XbMg5wf8L1uyrxmtRiL3kGmL0JfRFYuUSg35BKDx+AqPQoryREEHeL-6dAxbbiS7bd9vo0Xbfo2or-oxJeFgHxfCBa+6DIfrbbjT+6nypPJnjdU94gVph-2bQKQNZ5CofrPouKGohfjQPbFDzMH8Y0DSFgwyS6GYh6Iach6-FVecS3PPbDDwiaWY0ibcPQcH0INUJLD2JfrD4rFbD-KpZSVIBYr9R7RL+xelCvOKPDzLG-D5leOOQrG8r9xzKaYsD8lVrHClTUlilRVeyksCHXBcbGgplJzxPTJz1owoo0jw6S7Yypysj47GkQy7GIHZvvPxRp7vxdp7NDIqa+Lvp75fNIwtGlQ4DCa3VX7hk3yiM3Foz5yh+U9EQ55UE7seUkRBULwSG+6Mf3K8PGNUjgWodH4RK698QgmKiD2T7FWTCHygUexYQQx7zvwfMct0HqmeOIxKnsXlohfPvi8X7IF8d1b1JbPu7MtIhJdMTDonD0BVkBBzufCJZY3DPs-cNJYyZetLasLPk0UarodUL7ssmktNfd7s-8hfDktfFUNvceC10xF4VlcaikGsT7s2mZIzPcW6opRkWSHSETCvchJL0dCx3xHAtEIH5lJE5gpKLzp1OPc-NSNXrPsRRVyCBQLGMExxB23dCs8Syu7gfMS7viQuTJck7lB9IXiEtJLkISHxe7teNE6+QTfDndjI37587iiNhyMZ5XvIaxGqixagKBT6x+qnckOh2gdfRgiePMyWMlGdu6z-ZjdpnARkEVaU3btt3UUJt069oUYwEXz3W-tufvdRQRJr8V3Um4UQkbtSZ5r2y7KiKl5MozkSFA6GzHA3+eaZFm6k8kVH4ceXzm7bZTpbRBfZbVBf5baW7YLxu5mdMDGDo6Gcx6bLoe8OuLGII26+gw3lW3dnfcL+npC73-upAGXfho9o9QDxbA0gEXfeYAkHm71NHhcW3eG79utj4D3elo8fzYRAXeO79wrZdO3ewEDgeh7wKK45Dxfp753eugNuyxFZYDzdHABKD9Irzxh4Gl70wf6g4XaNL8Xa+DAEDx7zPfExbwfOg7Xb+g8ZDRD5Zey2dZeBgw7GaBbPpuTDEwiGaiAeGG5eV9LjHfJjkD5D6oefLyDS-L3OEtD9xsaYxwUKgbCb8KkErIobUDl7c0CoFFIA+xas90IMPe2gUEkegWOKw8F0wUr1OLBgWg+pxdleSrzBc577TLS7+XfDCoEeR+T8HfJszS9Y0UrdY5EeTGQbGJFc4VQQ4w+W8OCGGkkkfLYykfAtmcDZPQ3zSzgp7n7zcCnYyp7kQ10qVabKbMLxdYdPcUeEHbiGkHfawxjHGZu0aJPM6l5pP+B8jo9lfUsnOKjSBH-VYG6oNf069Jnrycfi4i-XiWFwu8+4IFTO0NJWchkoYTw5H9NCllmMXbSRQd56U7Irdh9-mechb8xUtOl6xqlPGZNT3FlSKTA9pKZZU2mDrNp15UZ5aYRC7hEsArmspDpMqvx7ojU4QuNEBBBOj6JcForDn55BpojUPkqeRHyI0N-G3yHOy2TU5+2H8XiCMVaPOX5EyF8wv7uG5U2EFRbV9YF5KAf7E7kXSXH+6ffkYKpN7AWoLbJyVnmKtWBKNatsby9DYz0nzP+AcUxmYSwaMCsj6BBbf5YUARVOsRpyFx8UJUyMQji39NsN9w30vKBSYeUb5iTP8o7YuhhvjkKQpn+QjjDJCdSchGYdmbZFkiNGQNNJKgEfMCRstM2RsqgPLXaxspk9pGZJRy2fTiOfw9iO1JiDXWpRSkdldckqkLH4RL2juoRcHCb4XUyGspNSwwhjJszVn+jYONebNkvLEQ9MmCV+NaKyupAj5qNZ+kCfPhk4q4xqQu751jj4RLcNZv1VOvcRmO7xillXahSNXt4sX+xqPWIhrQKwDp-amhrVdhjA8yTc+KWzx4HL0FEtAmNUuBrd5oNdg4Qo-pG2Yeaw-9mhQp6j+ruR1KgVyHS--bwMenSHAEBd78yRak+qEoqqQHSKJH3T4erWgj16lYVSDqPohqr1bqOyb6uqTFqaoSiOqjValura2vOx0M+a-9IxOq1UFOqxi3-U51RXGTd08QApKYZmCOncBpCfVB1d2iAWbehoHPeg44usd3t1FUTCO2q+XmHw9pCWrg+SnNPG2PxK1fdCs0N4gFXxxGHmFmqviLCl702QFO3oshw4sxquXxehY1eKOS-um+k1f0oANB0gGCTORjjH2oSWdHUw1Q4wNjp8ly3oH4ganjkOEaQ0z6tStbdnC+4iQARSNI0j16um+JmCXXe9rvVxKVbVwqA4gyjNCvrqtLq7FkIQSqqK+f0DRIvmO3xmmT3VGwX3VlXS1ptXw8hQlP1i66vt5g303UNtZ7Y26tOS02MkQNH80XS6nKZHUbo-aKB5LX5Sm7iRWm6PxMoHAjRSK995p6D96nfSo2BfC3ZBe9AzneWRWW6oFcBNWwM2AF4LyLPxmlxkFRXeyL-YHX93I+F6V1G23Uu5pQj5gcPwwkW1hvTiID5hCPy3e9HvIDaP7h-BeN2ymPyx-e76fT2P3R+8P4PfgJrx+R73YHYRBx-6P5PeTxoJ+uP-wr7xqJ-To7uNZP4+t3+frjro+vemPzh+-+T5h2OWsbaD8OBJP0J+FFepeoSQ0H6g6oqNLxwejP3J-EGcZf4Cs+KzL++6LL5mLhHy3bXpR+yX74ol9SPxQvXJxNx9LpLQPfK5-pT9Tf73olZg5MG3FWDLaxY9wyYzDKoTU3iW8Wh7xBb-IF7XA-sPQg+qfgO5Pxnp+N7WHhmP9ErLwqZMDSLYe1BLKTdPwc8Cv3R7vg+SaRP0R-DCs2Iqv3viOPffasQ6Ef6r2zShOdVfSlaw+hPXzTuTeEfuH389eHxdGeEgEVAHXJ7lOaI+hD+I+er7oopTf1f5ZQUfyP7A6Rr-A6cQ+Nff0qWpNequpQ2Etqr1FkPZMsWl91EGobhg6pmSEKqavBYQ+PICkPt8C+rBCBOwAsI59HKn8gMGZ5oJ5PvbbJ+O1Z9+O12DszYO6kQGbt4gwb37eNMneOJanVy7UFeoXx-kQ3xxU-7v2ypjxxNkaBHpdINNWhW7G06dUqSozGDAut7NuPB5q3KvF-uO5WBnmvv9OP7CLOPw0Fqa3tUuOEwcqRSVMANBx9QRhVAPLnYeOOQqPgQuXyNsFgjYRbvO2hhBMcwktDKNfbzafZBg2PWME2OsPsII2x50Vq-lz-ix+d3Sx-wQw7IuOkPJ-1tBKSo3DDtNY2MN4kteG2hHEFaPTK75SVJWq4G7XUAkUT4kxzhl4Gib-HKIGOc+wl0ZrWGPX1BUhsemXwvR9QQbiM6DXbDtCmMNWaHCft7TkOqxmBIz7fblz5XR1M50dtu1SVDShxmOPcqCFuSQbFvZayMARYMGW-dXkigw0FEQQdr0nDfFCRO4cWgoQV9+VR1k70kIagAbMWYtR+obU1H0+eMTKPqCEpOzdS+9KPLfcX6qSy+PgKPaHGp0VRgWkbTLYqzyFSR2--t7Hazep2R2wHgjF6QeR7GGuf5iUGYuJ0g9mIRJAnJTP+LT5SVGiz2u52hgVH4RO536DhjFjuQ13LDNMiAQt6tHzJ52dJyAvMolew5JN38P+EYpAWfCOX++TE2kYmPcMPz8reQ+MANb53V5XVJAG7Xt1diZu+OlT5WCPjEcyAKWuo4-PpwHPSgb6ivqGv+ZPSooIvMrqBZXCdE92jjEJ2gsAEILqWgY6YdDlJIWnaH2PZI8GCOxF9+zVwXIIBaNOBo5LzettYZKEd2XP4j-Oq2mVzIPAWkbGTOdlq+NFDzvmD+FLAYll2QkcZ++M2W8xjhKGv4e27D-n+QZSgJYvJoYTb2YvU4GyjakAhktf6Vckmo+6h6+C6wLqh4+oQGyhoM2On+h-64auqwGhoCqkLePmKNcrKQPzZAIr6+cgE+jMD+F36aLuDI66DWsut0cyikqCCMQcLKBMXOMfijRAbeCqhD8KROCP4h8J14mPJSeOMowhJLko-KQGDOsAy6hz4aZEIcH5JqxOaiAQHq1Eg8d3ZIujVU9WKGWjogpu6w3i8KKcAYvjVUIboszploNaCbGFCQC-CN+kHCdPor7PscVP7M+iPcrPrqsLRgHPrE+jAQpPpYlBt260hDkFT6AjZ4sFy+ImhY+t0Ui0gV5vZi+Pq4sMFQRPrYsuC+LTLC8rTWKPqWsGj67TAY+tiy7PIkjJeQHRDc8urEuWyyojTy08wzoNmgdj72YotId6A6+Kzy2LI2dCTytQQfchTyayyxZKjyDxjBDhoOO46ymCBQOSJhknyUWaTQ8qSYsPLfdPHSlc5uWk8w+6LK7mEBFGD-cmtmK9hUsIDenyhpoo5KKpQfKC9yeBzEnJ-2IPLSrN9yD-rncsSYlThXcntWUkhMmJm+93J+PsX6PxZ7ckhi1O4h3u9ovfiN+nG0sgFtckty66BlMKtyYfaw3nWo2pgvEDDIHyiUNNLuhNS8nmiBxK4+erNyPsIfKB1ydYKMoIieUxBhLANyH5pedhdeMc5rzC92vmr7XFMQMGD5ckH4nGZPASRWACL4kBbmxXITWn3K5XKY+phoEfDTdNcUUbyqkJrC0BAmAW1yrMS6pOMw6fQFTnyeQxDNLNdmjv6+ciHY5IImmiEWavghco9MqbBUnu-+myD+fOK8rnLszE56nnJZKN5y8P4egedsEMKJ8lZyvzBOemlUehBp8o-K1SiusKfMH6TnqCnyXXqBqkgIp75uMMkwlxD2eLaofvhuDu1kxGgGEsKeydRCoLP8uYa2aoOQJXr4nq3UjO5AASeSJb7ESil6HXbWkGcionhlGNas2b5ZpGF668ydhr0YtXoxepNIaggPvhRgXnqLMCg8HaDzjoOQAXol1pvGO16-ASowmCJckPZ6yqDucn68UhDhHHYg2djpgVqqRnoPvCEQxQ7mem+g0gZWerGSNIKLSCKiTQGyDkMQGu6s7L2QHQFrvNvUGUjlbGcuJJBVwiL4DiCLVKSBTLL+2MZQZHizHkv6+Th-HragAJ5sAS2w6c7vYqoQXRZm2A7Mmvo5LHFaD5r73BScrKpMbix2fuoU3sFa5SgOWnP475CWkC5aFjhuWuwI0hDJkNMUFzaGhruwq05l0lf45yh2WvamxfruKHNs04KToFio+Dh2kPdmxloHPvbWR7ByWsMgbBoyARqu4bYEeP+wM5DMvghadLJ1dPa0rWjVCqlI8aRSWkWBRWjG9l0wa9xo+Dp0igHVaDXEvihJaLGOQT74kKz+zrxZaKoM2qIVJgf+mpTT-Ga6iNwpbm5oP2x5vCvshgFbgVEwDmgDoM5od16jjo36nmjtSD5oRmgdaIRBZmg0EOJa1mjE8kFOIEHOVHeQLkik5qaY4lq6aGMwfGQ3-kCeoxR5zGkskmgfFDJokFAZjnoayjTMaOxoc6TsaGnKMpQ8aAsB-GiEaMGgJGjyMMl4FGikan4MidhBgXOByGhyqKjA+6IqoBhO7-A4aEScuJgnSIFB1UFxZG8gbO4SCNT+xdgwaHagE-A1VE1MruofqDQItfy-qJU6AGhc-ob2YmTCeNg0NXjgZLeoe3RoDF9+H1S08t4g-UFhxphOAzg7qA0Qe6jkJtHedyZZRnza4OJcgLxg4HAqgAYgQAA - code: |4 - from ipyleaflet import GeoJSON, Map #<< - from shiny import App, ui - from shinywidgets import output_widget, render_widget #<< - - app_ui = ui.page_fluid(output_widget("my_map")) #<< - - def server(input, output, session): - - @render_widget #<< - def my_map(): - return Map(center=(50.6252978589571, 0.34580993652344), zoom=3) #<< - - app = App(app_ui, server) ---- - -:::{#component} -::: - -## Details - -`ipyleaflet` allows us to create interactive maps via [ipywidgets](https://ipywidgets.readthedocs.io/en/stable/). - -To insert an `ipyleaflet` map do the following tasks: - - 1. Add `shinywidgets.output_widget()` to the UI of your app to create a div in which to display the map. Where you call this function will determine where the map will appear within the layout of the app. - - 2. Provide an argument to the `id` parameter in the `shinywidgets.output_widget()` function call. This argument will be used to identify the map in the server function. - - 3. Within the `server()` function, create your `ipyleaflet` map and assign it to a variable. Your map does not need to be created within a nested function in server() like many other shiny for python components. - - 4. Register your map with shiny using `shinywidgets.register_widget()` by passing in the id of the map and the map variable. - - Visit [shiny.posit.co/py/docs/ipywidgets.html](https://shiny.posit.co/py/docs/ipywidgets.html) to learn more about using ipywidgets with Shiny. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/outputs/map-ipyleaflet/app-core.py b/components/outputs/map-ipyleaflet/app-core.py new file mode 100644 index 00000000..1a77b20a --- /dev/null +++ b/components/outputs/map-ipyleaflet/app-core.py @@ -0,0 +1,14 @@ +from ipyleaflet import Map # << +from shiny import App, ui +from shinywidgets import output_widget, render_widget # << + +app_ui = ui.page_fluid(output_widget("map")) # << + + +def server(input, output, session): + @render_widget # << + def map(): + return Map(center=(50.6252978589571, 0.34580993652344), zoom=3) # << + + +app = App(app_ui, server) diff --git a/components/outputs/map-ipyleaflet/app-express.py b/components/outputs/map-ipyleaflet/app-express.py new file mode 100644 index 00000000..ddedace7 --- /dev/null +++ b/components/outputs/map-ipyleaflet/app-express.py @@ -0,0 +1,10 @@ +from ipyleaflet import Map # << +from shiny.express import ui +from shinywidgets import render_widget # << + +ui.h2("An ipyleaflet Map") + + +@render_widget # << +def map(): + return Map(center=(50.6252978589571, 0.34580993652344), zoom=3) # << diff --git a/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-core.py b/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-core.py new file mode 100644 index 00000000..74623629 --- /dev/null +++ b/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-core.py @@ -0,0 +1,54 @@ +# example and data from: +# https://ipyleaflet.readthedocs.io/en/latest/layers/geo_json.html +# https://ipyleaflet.readthedocs.io/en/latest/layers/marker.html +import json +import pathlib +import random + +from ipyleaflet import GeoJSON, Map, Marker # << +from shiny import App, ui +from shinywidgets import output_widget, render_widget # << + +here = pathlib.Path(__file__) +with open(here.parent / "europe_110.geo.json", "r") as f: + country_boundaries = json.load(f) + + +def random_color(feature): + return { + "color": "black", + "fillColor": random.choice(["red", "yellow", "green", "orange"]), + } + + +app_ui = ui.page_fluid( + ui.h2("An ipyleaflet Map"), + output_widget("map"), # << +) + + +def server(input, output, session): + @render_widget # << + def map(): + map = Map(center=(50.6252978589571, 0.34580993652344), zoom=3) # << + + geo_json = GeoJSON( # << + data=country_boundaries, # << + style={ # << + "opacity": 1, # << + "dashArray": "9", # << + "fillOpacity": 0.1, # << + "weight": 1, # << + }, + hover_style={"color": "white", "dashArray": "0", "fillOpacity": 0.5}, # << + style_callback=random_color, # << + ) # << + map.add_layer(geo_json) # << + + point = Marker(location=(52.204793, 0.121558), draggable=False) # << + map.add_layer(point) # << + + return map # << + + +app = App(app_ui, server) diff --git a/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-express.py b/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-express.py new file mode 100644 index 00000000..e94c472e --- /dev/null +++ b/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-express.py @@ -0,0 +1,47 @@ +# example and data from: +# https://ipyleaflet.readthedocs.io/en/latest/layers/geo_json.html +# https://ipyleaflet.readthedocs.io/en/latest/layers/marker.html +import json +import pathlib +import random + +from ipyleaflet import GeoJSON, Map, Marker # << +from shiny.express import ui +from shinywidgets import render_widget # << + +here = pathlib.Path(__file__) +with open(here.parent / "europe_110.geo.json", "r") as f: + country_boundaries = json.load(f) + + +def random_color(feature): + return { + "color": "black", + "fillColor": random.choice(["red", "yellow", "green", "orange"]), + } + + +ui.h2("An ipyleaflet Map") + + +@render_widget # << +def map(): + map = Map(center=(50.6252978589571, 0.34580993652344), zoom=3) # << + + geo_json = GeoJSON( # << + data=country_boundaries, # << + style={ # << + "opacity": 1, # << + "dashArray": "9", # << + "fillOpacity": 0.1, # << + "weight": 1, # << + }, + hover_style={"color": "white", "dashArray": "0", "fillOpacity": 0.5}, # << + style_callback=random_color, # << + ) # << + map.add_layer(geo_json) # << + + point = Marker(location=(52.204793, 0.121558), draggable=False) # << + map.add_layer(point) # << + + return map # << diff --git a/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-preview.py b/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-preview.py new file mode 100644 index 00000000..87eaced3 --- /dev/null +++ b/components/outputs/map-ipyleaflet/app-variation-geojson-and-markers-preview.py @@ -0,0 +1,5071 @@ +# ruff: noqa +## file: app.py +# example and data from: +# https://ipyleaflet.readthedocs.io/en/latest/layers/geo_json.html +# https://ipyleaflet.readthedocs.io/en/latest/layers/marker.html +import json +import pathlib +import random + +from ipyleaflet import GeoJSON, Map, Marker # << +from shiny import App, ui +from shinywidgets import output_widget, render_widget # << + +here = pathlib.Path(__file__) +with open(here.parent / "europe_110.geo.json", "r") as f: + country_boundaries = json.load(f) + + +def random_color(feature): + return { + "color": "black", + "fillColor": random.choice(["red", "yellow", "green", "orange"]), + } + + +app_ui = ui.page_fluid( + ui.h2("An ipyleaflet Map"), + output_widget("map"), # << +) + + +def server(input, output, session): + @render_widget # << + def map(): + map = Map(center=(50.6252978589571, 0.34580993652344), zoom=3) # << + + geo_json = GeoJSON( # << + data=country_boundaries, # << + style={ # << + "opacity": 1, # << + "dashArray": "9", # << + "fillOpacity": 0.1, # << + "weight": 1, # << + }, + hover_style={"color": "white", "dashArray": "0", "fillOpacity": 0.5}, # << + style_callback=random_color, # << + ) # << + map.add_layer(geo_json) # << + + point = Marker(location=(52.204793, 0.121558), draggable=False) # << + map.add_layer(point) # << + + return map # << + + +app = App(app_ui, server) + + +## file: europe_110.geo.json +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Albania", + "sov_a3": "ALB", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Albania", + "adm0_a3": "ALB", + "geou_dif": 0, + "geounit": "Albania", + "gu_a3": "ALB", + "su_dif": 0, + "subunit": "Albania", + "su_a3": "ALB", + "brk_diff": 0, + "name": "Albania", + "name_long": "Albania", + "brk_a3": "ALB", + "brk_name": "Albania", + "brk_group": null, + "abbrev": "Alb.", + "postal": "AL", + "formal_en": "Republic of Albania", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Albania", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 4, + "mapcolor9": 1, + "mapcolor13": 6, + "pop_est": 3639453, + "gdp_md_est": 21810, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "4. Lower middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "AL", + "iso_a3": "ALB", + "iso_n3": "008", + "un_a3": "008", + "wb_a2": "AL", + "wb_a3": "ALB", + "woe_id": -99, + "adm0_a3_is": "ALB", + "adm0_a3_us": "ALB", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [20.59024743010491, 41.855404161133606], + [20.463175083099202, 41.51508901627534], + [20.605181919037364, 41.086226304685226], + [21.0200403174764, 40.84272695572588], + [20.999989861747224, 40.58000397395398], + [20.674996779063633, 40.43499990494303], + [20.615000441172754, 40.11000682225938], + [20.15001590341052, 39.62499766698397], + [19.980000441170148, 39.69499339452341], + [19.960001661873207, 39.91500580500605], + [19.406081984136733, 40.250773423822466], + [19.319058872157143, 40.72723012955356], + [19.40354983895429, 41.40956574153546], + [19.540027296637106, 41.71998607031276], + [19.37176883309496, 41.877547512370654], + [19.304486118250793, 42.19574514420782], + [19.73805138517963, 42.68824738216557], + [19.801613396898688, 42.50009349219084], + [20.0707, 42.58863], + [20.283754510181893, 42.32025950781508], + [20.52295, 42.21787], + [20.59024743010491, 41.855404161133606], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Austria", + "sov_a3": "AUT", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Austria", + "adm0_a3": "AUT", + "geou_dif": 0, + "geounit": "Austria", + "gu_a3": "AUT", + "su_dif": 0, + "subunit": "Austria", + "su_a3": "AUT", + "brk_diff": 0, + "name": "Austria", + "name_long": "Austria", + "brk_a3": "AUT", + "brk_name": "Austria", + "brk_group": null, + "abbrev": "Aust.", + "postal": "A", + "formal_en": "Republic of Austria", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Austria", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 1, + "mapcolor9": 3, + "mapcolor13": 4, + "pop_est": 8210281, + "gdp_md_est": 329500, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "AT", + "iso_a3": "AUT", + "iso_n3": "040", + "un_a3": "040", + "wb_a2": "AT", + "wb_a3": "AUT", + "woe_id": -99, + "adm0_a3_is": "AUT", + "adm0_a3_us": "AUT", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.979666782304037, 48.123497015976305], + [16.90375410326726, 47.71486562762833], + [16.340584344150415, 47.71290192320123], + [16.534267612380376, 47.49617096616912], + [16.202298211337364, 46.85238597267696], + [16.011663852612656, 46.6836107448117], + [15.137091912504985, 46.65870270444703], + [14.63247155117483, 46.43181732846955], + [13.806475457421527, 46.509306138691215], + [12.376485223040817, 46.76755910906985], + [12.153088006243054, 47.11539317482645], + [11.16482791509327, 46.94157949481273], + [11.048555942436536, 46.75135854754634], + [10.44270145024663, 46.89354625099743], + [9.932448357796659, 46.92072805438296], + [9.479969516649021, 47.102809963563374], + [9.632931756232978, 47.34760122332999], + [9.59422610844635, 47.52505809182027], + [9.89606814946319, 47.580196845075704], + [10.402083774465211, 47.30248769793916], + [10.544504021861627, 47.56639923765377], + [11.426414015354737, 47.523766181012974], + [12.141357456112788, 47.703083401065776], + [12.620759718484493, 47.67238760028441], + [12.932626987365948, 47.467645575544], + [13.02585127122049, 47.63758352313583], + [12.884102817443903, 48.28914581968792], + [13.243357374737, 48.416114813829054], + [13.595945672264437, 48.87717194273715], + [14.338897739324722, 48.55530528420721], + [14.901447381254057, 48.964401760445824], + [15.253415561593982, 49.03907420510758], + [16.02964725105022, 48.73389903420793], + [16.499282667718774, 48.78580801044511], + [16.960288120194576, 48.5969823268506], + [16.879982944413, 48.47001333270947], + [16.979666782304037, 48.123497015976305], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Bulgaria", + "sov_a3": "BGR", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Bulgaria", + "adm0_a3": "BGR", + "geou_dif": 0, + "geounit": "Bulgaria", + "gu_a3": "BGR", + "su_dif": 0, + "subunit": "Bulgaria", + "su_a3": "BGR", + "brk_diff": 0, + "name": "Bulgaria", + "name_long": "Bulgaria", + "brk_a3": "BGR", + "brk_name": "Bulgaria", + "brk_group": null, + "abbrev": "Bulg.", + "postal": "BG", + "formal_en": "Republic of Bulgaria", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Bulgaria", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 5, + "mapcolor9": 1, + "mapcolor13": 8, + "pop_est": 7204687, + "gdp_md_est": 93750, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "BG", + "iso_a3": "BGR", + "iso_n3": "100", + "un_a3": "100", + "wb_a2": "BG", + "wb_a3": "BGR", + "woe_id": -99, + "adm0_a3_is": "BGR", + "adm0_a3_us": "BGR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 8, + "long_len": 8, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.65714969248299, 44.23492300066128], + [22.944832391051847, 43.82378530534713], + [23.332302280376325, 43.897010809904714], + [24.100679152124172, 43.74105133724785], + [25.569271681426926, 43.68844472917472], + [26.065158725699746, 43.94349376075127], + [27.242399529740908, 44.175986029632405], + [27.970107049275075, 43.81246816667522], + [28.558081495891997, 43.70746165625813], + [28.03909508638472, 43.293171698574184], + [27.67389773937805, 42.57789236100622], + [27.99672041190539, 42.00735871028779], + [27.13573937349048, 42.14148489030134], + [26.1170418637208, 41.82690460872456], + [26.106138136507212, 41.32889883072778], + [25.197201368925448, 41.23448598893053], + [24.492644891058035, 41.583896185872035], + [23.692073601992348, 41.309080918943856], + [22.952377150166452, 41.33799388281115], + [22.88137373219743, 41.99929718685026], + [22.380525750424592, 42.32025950781509], + [22.54501183440962, 42.46136200618804], + [22.43659467946128, 42.580321153323936], + [22.60480146657133, 42.898518785161144], + [22.986018507588483, 43.211161200526966], + [22.50015669118028, 43.64281443946099], + [22.410446404721597, 44.008063462899955], + [22.65714969248299, 44.23492300066128], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Belgium", + "sov_a3": "BEL", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Belgium", + "adm0_a3": "BEL", + "geou_dif": 0, + "geounit": "Belgium", + "gu_a3": "BEL", + "su_dif": 0, + "subunit": "Belgium", + "su_a3": "BEL", + "brk_diff": 0, + "name": "Belgium", + "name_long": "Belgium", + "brk_a3": "BEL", + "brk_name": "Belgium", + "brk_group": null, + "abbrev": "Belg.", + "postal": "B", + "formal_en": "Kingdom of Belgium", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Belgium", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 2, + "mapcolor9": 1, + "mapcolor13": 8, + "pop_est": 10414336, + "gdp_md_est": 389300, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "BE", + "iso_a3": "BEL", + "iso_n3": "056", + "un_a3": "056", + "wb_a2": "BE", + "wb_a3": "BEL", + "woe_id": -99, + "adm0_a3_is": "BEL", + "adm0_a3_us": "BEL", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [3.314971144228537, 51.345780951536085], + [4.047071160507528, 51.26725861266857], + [4.973991326526914, 51.47502370869813], + [5.606975945670001, 51.03729848896978], + [6.15665815595878, 50.80372101501058], + [6.043073357781111, 50.128051662794235], + [5.782417433300907, 50.09032786722122], + [5.674051954784829, 49.529483547557504], + [4.79922163251581, 49.985373033236385], + [4.286022983425084, 49.907496649772554], + [3.588184441755686, 50.37899241800358], + [3.123251580425801, 50.780363267614575], + [2.658422071960274, 50.796848049515745], + [2.513573032246143, 51.14850617126183], + [3.314971144228537, 51.345780951536085], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Bosnia and Herzegovina", + "sov_a3": "BIH", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Bosnia and Herzegovina", + "adm0_a3": "BIH", + "geou_dif": 0, + "geounit": "Bosnia and Herzegovina", + "gu_a3": "BIH", + "su_dif": 0, + "subunit": "Bosnia and Herzegovina", + "su_a3": "BIH", + "brk_diff": 0, + "name": "Bosnia and Herz.", + "name_long": "Bosnia and Herzegovina", + "brk_a3": "BIH", + "brk_name": "Bosnia and Herz.", + "brk_group": null, + "abbrev": "B.H.", + "postal": "BiH", + "formal_en": "Bosnia and Herzegovina", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Bosnia and Herzegovina", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 1, + "mapcolor9": 1, + "mapcolor13": 2, + "pop_est": 4613414, + "gdp_md_est": 29700, + "pop_year": -99, + "lastcensus": 1991, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "BA", + "iso_a3": "BIH", + "iso_n3": "070", + "un_a3": "070", + "wb_a2": "BA", + "wb_a3": "BIH", + "woe_id": -99, + "adm0_a3_is": "BIH", + "adm0_a3_us": "BIH", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 16, + "long_len": 22, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.00548628101012, 44.86023366960916], + [19.36803, 44.863], + [19.11761, 44.42307000000011], + [19.59976, 44.03847], + [19.454, 43.56810000000013], + [19.21852, 43.52384], + [19.03165, 43.43253], + [18.70648, 43.20011], + [18.56, 42.65], + [17.674921502358984, 43.02856252702361], + [17.297373488034452, 43.44634064388737], + [16.91615644701733, 43.66772247982567], + [16.456442905348865, 44.04123973243128], + [16.23966027188453, 44.35114329688571], + [15.750026075918981, 44.818711656262565], + [15.959367303133376, 45.23377676043094], + [16.318156772535872, 45.00412669532591], + [16.534939406000206, 45.21160757097772], + [17.002146030351014, 45.23377676043094], + [17.861783481526402, 45.067740383477144], + [18.553214145591653, 45.08158966733146], + [19.00548628101012, 44.86023366960916], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Belarus", + "sov_a3": "BLR", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Belarus", + "adm0_a3": "BLR", + "geou_dif": 0, + "geounit": "Belarus", + "gu_a3": "BLR", + "su_dif": 0, + "subunit": "Belarus", + "su_a3": "BLR", + "brk_diff": 0, + "name": "Belarus", + "name_long": "Belarus", + "brk_a3": "BLR", + "brk_name": "Belarus", + "brk_group": null, + "abbrev": "Bela.", + "postal": "BY", + "formal_en": "Republic of Belarus", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Belarus", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 1, + "mapcolor9": 5, + "mapcolor13": 11, + "pop_est": 9648533, + "gdp_md_est": 114100, + "pop_year": -99, + "lastcensus": 2009, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "BY", + "iso_a3": "BLR", + "iso_n3": "112", + "un_a3": "112", + "wb_a2": "BY", + "wb_a3": "BLR", + "woe_id": -99, + "adm0_a3_is": "BLR", + "adm0_a3_us": "BLR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [23.48412763844985, 53.91249766704114], + [24.450683628037037, 53.905702216194754], + [25.536353794056993, 54.28242340760253], + [25.7684326514798, 54.84696259217509], + [26.58827924979039, 55.16717560487167], + [26.494331495883756, 55.615106919977634], + [27.10245975109453, 55.783313707087686], + [28.176709425577997, 56.169129950578814], + [29.229513380660308, 55.91834422466636], + [29.371571893030673, 55.670090643936184], + [29.896294386522356, 55.78946320253041], + [30.87390913262001, 55.55097646750341], + [30.971835971813135, 55.08154775656404], + [30.75753380709872, 54.81177094178432], + [31.38447228366374, 54.157056382862436], + [31.79142418796224, 53.974638576872124], + [31.731272820774507, 53.79402944601202], + [32.405598585751164, 53.61804535584204], + [32.69364301934604, 53.35142080343212], + [32.30451948418823, 53.13272614197291], + [31.49764367038293, 53.1674268662569], + [31.305200636528014, 53.07399587667321], + [31.54001834486226, 52.74205231384636], + [31.785998162571587, 52.101677964885454], + [30.927549269338982, 52.04235342061439], + [30.619454380014844, 51.822806098022376], + [30.555117221811457, 51.31950348571566], + [30.157363722460897, 51.41613841410147], + [29.254938185347925, 51.368234361366895], + [28.992835320763533, 51.602044379271476], + [28.61761274589225, 51.42771393493484], + [28.24161502453657, 51.57222707783907], + [27.454066196408434, 51.59230337178447], + [26.337958611768556, 51.83228872334793], + [25.32778771332701, 51.91065603291855], + [24.553106316839518, 51.888461005249184], + [24.00507775238421, 51.61744395609446], + [23.527070753684374, 51.57845408793024], + [23.508002150168693, 52.02364655212473], + [23.199493849386187, 52.48697744405367], + [23.79919884613338, 52.69109935160657], + [23.80493493011778, 53.089731350306074], + [23.527535841575002, 53.470121568406555], + [23.48412763844985, 53.91249766704114], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Switzerland", + "sov_a3": "CHE", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Switzerland", + "adm0_a3": "CHE", + "geou_dif": 0, + "geounit": "Switzerland", + "gu_a3": "CHE", + "su_dif": 0, + "subunit": "Switzerland", + "su_a3": "CHE", + "brk_diff": 0, + "name": "Switzerland", + "name_long": "Switzerland", + "brk_a3": "CHE", + "brk_name": "Switzerland", + "brk_group": null, + "abbrev": "Switz.", + "postal": "CH", + "formal_en": "Swiss Confederation", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Switzerland", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 2, + "mapcolor9": 7, + "mapcolor13": 3, + "pop_est": 7604467, + "gdp_md_est": 316700, + "pop_year": -99, + "lastcensus": 2010, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "CH", + "iso_a3": "CHE", + "iso_n3": "756", + "un_a3": "756", + "wb_a2": "CH", + "wb_a3": "CHE", + "woe_id": -99, + "adm0_a3_is": "CHE", + "adm0_a3_us": "CHE", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 11, + "long_len": 11, + "abbrev_len": 6, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [9.59422610844635, 47.52505809182027], + [9.632931756232978, 47.34760122332999], + [9.479969516649021, 47.102809963563374], + [9.932448357796659, 46.92072805438296], + [10.44270145024663, 46.89354625099743], + [10.363378126678612, 46.48357127540986], + [9.922836541390382, 46.31489940040919], + [9.182881707403055, 46.44021474871698], + [8.966305779667806, 46.03693187111119], + [8.489952426801324, 46.005150865251686], + [8.31662967289438, 46.16364248309086], + [7.755992058959833, 45.82449005795931], + [7.273850945676656, 45.776947740250776], + [6.843592970414505, 45.99114655210061], + [6.500099724970426, 46.42967275652944], + [6.022609490593538, 46.27298981382047], + [6.037388950229001, 46.725778713561866], + [6.768713820023606, 47.2877082383037], + [6.736571079138059, 47.541801255882845], + [7.192202182655507, 47.44976552997102], + [7.466759067422231, 47.62058197691181], + [8.317301466514152, 47.61357982033626], + [8.522611932009767, 47.83082754169129], + [9.59422610844635, 47.52505809182027], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Czech Republic", + "sov_a3": "CZE", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Czech Republic", + "adm0_a3": "CZE", + "geou_dif": 0, + "geounit": "Czech Republic", + "gu_a3": "CZE", + "su_dif": 0, + "subunit": "Czech Republic", + "su_a3": "CZE", + "brk_diff": 0, + "name": "Czech Rep.", + "name_long": "Czech Republic", + "brk_a3": "CZE", + "brk_name": "Czech Rep.", + "brk_group": null, + "abbrev": "Cz. Rep.", + "postal": "CZ", + "formal_en": "Czech Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Czech Republic", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 1, + "mapcolor9": 2, + "mapcolor13": 6, + "pop_est": 10211904, + "gdp_md_est": 265200, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "CZ", + "iso_a3": "CZE", + "iso_n3": "203", + "un_a3": "203", + "wb_a2": "CZ", + "wb_a3": "CZE", + "woe_id": -99, + "adm0_a3_is": "CZE", + "adm0_a3_us": "CZE", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 10, + "long_len": 14, + "abbrev_len": 8, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.960288120194576, 48.5969823268506], + [16.499282667718774, 48.78580801044511], + [16.02964725105022, 48.73389903420793], + [15.253415561593982, 49.03907420510758], + [14.901447381254057, 48.964401760445824], + [14.338897739324722, 48.55530528420721], + [13.595945672264437, 48.87717194273715], + [13.031328973043431, 49.30706818297324], + [12.521024204161193, 49.547415269562734], + [12.415190870827445, 49.96912079528057], + [12.240111118222558, 50.266337795607285], + [12.966836785543194, 50.484076443069085], + [13.338131951560285, 50.73323436136435], + [14.056227654688172, 50.9269176295943], + [14.307013380600637, 51.117267767941414], + [14.570718214586066, 51.002339382524276], + [15.01699588385867, 51.10667409932158], + [15.490972120839729, 50.78472992614321], + [16.23862674323857, 50.69773265237984], + [16.176253289462267, 50.42260732685791], + [16.719475945714436, 50.21574656839354], + [16.86876915860566, 50.47397370055603], + [17.55456709155112, 50.36214590107642], + [17.64944502123899, 50.049038397819956], + [18.392913852622172, 49.98862864847075], + [18.853144158613617, 49.49622976337764], + [18.554971144289482, 49.495015367218784], + [18.399993523846177, 49.31500051533004], + [18.170498488037964, 49.271514797556435], + [18.104972771891852, 49.04398346617531], + [17.913511590250465, 48.996492824899086], + [17.88648481616181, 48.90347524677371], + [17.545006951577108, 48.80001902932537], + [17.101984897538898, 48.816968899117114], + [16.960288120194576, 48.5969823268506], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Germany", + "sov_a3": "DEU", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Germany", + "adm0_a3": "DEU", + "geou_dif": 0, + "geounit": "Germany", + "gu_a3": "DEU", + "su_dif": 0, + "subunit": "Germany", + "su_a3": "DEU", + "brk_diff": 0, + "name": "Germany", + "name_long": "Germany", + "brk_a3": "DEU", + "brk_name": "Germany", + "brk_group": null, + "abbrev": "Ger.", + "postal": "D", + "formal_en": "Federal Republic of Germany", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Germany", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 5, + "mapcolor9": 5, + "mapcolor13": 1, + "pop_est": 82329758, + "gdp_md_est": 2918000, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "1. Developed region: G7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "DE", + "iso_a3": "DEU", + "iso_n3": "276", + "un_a3": "276", + "wb_a2": "DE", + "wb_a3": "DEU", + "woe_id": -99, + "adm0_a3_is": "DEU", + "adm0_a3_us": "DEU", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [9.921906365609232, 54.98310415304803], + [9.9395797054529, 54.596641954153256], + [10.950112338920519, 54.363607082733154], + [10.93946699386845, 54.00869334575259], + [11.956252475643282, 54.19648550070116], + [12.518440382546714, 54.470370591847995], + [13.647467075259499, 54.0755109727059], + [14.119686313542559, 53.75702912049104], + [14.353315463934166, 53.248171291713106], + [14.074521111719434, 52.98126251892535], + [14.437599725002201, 52.624850165408304], + [14.685026482815715, 52.089947414755216], + [14.607098422919648, 51.74518809671997], + [15.016995883858783, 51.10667409932171], + [14.570718214586122, 51.00233938252438], + [14.307013380600665, 51.11726776794137], + [14.056227654688314, 50.92691762959436], + [13.338131951560399, 50.73323436136428], + [12.96683678554325, 50.48407644306917], + [12.240111118222671, 50.26633779560723], + [12.415190870827473, 49.96912079528062], + [12.521024204161336, 49.54741526956275], + [13.031328973043514, 49.30706818297324], + [13.595945672264577, 48.877171942737164], + [13.243357374737116, 48.41611481382904], + [12.884102817443875, 48.28914581968786], + [13.025851271220517, 47.63758352313596], + [12.932626987366064, 47.467645575544], + [12.620759718484521, 47.672387600284424], + [12.141357456112871, 47.70308340106578], + [11.426414015354851, 47.52376618101306], + [10.544504021861599, 47.5663992376538], + [10.402083774465325, 47.30248769793917], + [9.89606814946319, 47.580196845075704], + [9.594226108446378, 47.5250580918202], + [8.522611932009795, 47.83082754169135], + [8.317301466514095, 47.61357982033627], + [7.466759067422288, 47.62058197691192], + [7.593676385131062, 48.33301911070373], + [8.099278598674857, 49.01778351500343], + [6.65822960778371, 49.20195831969164], + [6.186320428094177, 49.463802802114515], + [6.242751092156993, 49.90222565367873], + [6.043073357781111, 50.128051662794235], + [6.15665815595878, 50.80372101501058], + [5.988658074577813, 51.851615709025054], + [6.589396599970826, 51.852029120483394], + [6.842869500362383, 52.22844025329755], + [7.092053256873896, 53.144043280644894], + [6.905139601274129, 53.48216217713065], + [7.100424838905269, 53.69393219666267], + [7.936239454793963, 53.74829580343379], + [8.121706170289485, 53.52779246684429], + [8.800734490604668, 54.020785630908904], + [8.57211795414537, 54.39564647075406], + [8.526229282270208, 54.96274363872516], + [9.282048780971138, 54.83086538351631], + [9.921906365609232, 54.98310415304803], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Denmark", + "sov_a3": "DN1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "Denmark", + "adm0_a3": "DNK", + "geou_dif": 0, + "geounit": "Denmark", + "gu_a3": "DNK", + "su_dif": 0, + "subunit": "Denmark", + "su_a3": "DNK", + "brk_diff": 0, + "name": "Denmark", + "name_long": "Denmark", + "brk_a3": "DNK", + "brk_name": "Denmark", + "brk_group": null, + "abbrev": "Den.", + "postal": "DK", + "formal_en": "Kingdom of Denmark", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Denmark", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 1, + "mapcolor9": 3, + "mapcolor13": 12, + "pop_est": 5500510, + "gdp_md_est": 203600, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "DK", + "iso_a3": "DNK", + "iso_n3": "208", + "un_a3": "208", + "wb_a2": "DK", + "wb_a3": "DNK", + "woe_id": -99, + "adm0_a3_is": "DNK", + "adm0_a3_us": "DNK", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [12.690006137755631, 55.609990953180784], + [12.089991082414741, 54.80001455343793], + [11.043543328504228, 55.364863796604254], + [10.903913608451631, 55.77995473898875], + [12.370904168353292, 56.111407375708836], + [12.690006137755631, 55.609990953180784], + ] + ], + [ + [ + [10.912181837618363, 56.458621324277914], + [10.667803989309988, 56.08138336854722], + [10.369992710011985, 56.19000722922473], + [9.649984978889307, 55.469999498102055], + [9.921906365609175, 54.98310415304806], + [9.282048780971138, 54.83086538351617], + [8.526229282270236, 54.96274363872499], + [8.12031090661759, 55.517722683323626], + [8.08997684086225, 56.5400117051376], + [8.256581658571264, 56.8099693874303], + [8.543437534223386, 57.110002753316905], + [9.42446902836761, 57.17206614849948], + [9.775558709358563, 57.44794078228966], + [10.580005730846153, 57.73001658795485], + [10.546105991262692, 57.215732733786155], + [10.250000034230226, 56.89001618105047], + [10.369992710011985, 56.609981594460834], + [10.912181837618363, 56.458621324277914], + ] + ], + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Spain", + "sov_a3": "ESP", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Spain", + "adm0_a3": "ESP", + "geou_dif": 0, + "geounit": "Spain", + "gu_a3": "ESP", + "su_dif": 0, + "subunit": "Spain", + "su_a3": "ESP", + "brk_diff": 0, + "name": "Spain", + "name_long": "Spain", + "brk_a3": "ESP", + "brk_name": "Spain", + "brk_group": null, + "abbrev": "Sp.", + "postal": "E", + "formal_en": "Kingdom of Spain", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Spain", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 5, + "mapcolor9": 5, + "mapcolor13": 5, + "pop_est": 40525002, + "gdp_md_est": 1403000, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "ES", + "iso_a3": "ESP", + "iso_n3": "724", + "un_a3": "724", + "wb_a2": "ES", + "wb_a3": "ESP", + "woe_id": -99, + "adm0_a3_is": "ESP", + "adm0_a3_us": "ESP", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 5, + "long_len": 5, + "abbrev_len": 3, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-9.034817674180246, 41.880570583659676], + [-8.984433152695672, 42.59277517350627], + [-9.392883673530648, 43.0266246608127], + [-7.97818966310831, 43.74833771420099], + [-6.754491746436756, 43.567909450853925], + [-5.411886359061597, 43.57423981380968], + [-4.347842779955783, 43.40344920508504], + [-3.517531704106091, 43.4559007838613], + [-1.901351284177764, 43.42280202897834], + [-1.502770961910528, 43.03401439063043], + [0.338046909190581, 42.57954600683955], + [0.701590610363894, 42.795734361332606], + [1.826793247087153, 42.34338471126569], + [2.985998976258458, 42.47301504166986], + [3.039484083680549, 41.892120266276905], + [2.091841668312185, 41.226088568683096], + [0.810524529635188, 41.01473196060934], + [0.721331007499401, 40.678318386389236], + [0.106691521819869, 40.12393362076202], + [-0.278711310212941, 39.30997813573272], + [0.111290724293838, 38.73851430923304], + [-0.467123582349103, 38.29236583104115], + [-0.683389451490598, 37.642353827457825], + [-1.438382127274849, 37.44306366632422], + [-2.146452602538119, 36.67414419203729], + [-3.415780808923387, 36.65889964451118], + [-4.368900926114719, 36.677839056946155], + [-4.995219285492212, 36.32470815687964], + [-5.377159796561457, 35.946850083961465], + [-5.866432257500904, 36.02981659600606], + [-6.236693894872175, 36.367677110330334], + [-6.520190802425404, 36.94291331638732], + [-7.453725551778092, 37.09778758396607], + [-7.537105475281024, 37.42890432387624], + [-7.166507941099865, 37.803894354802225], + [-7.029281175148796, 38.07576406508977], + [-7.374092169616318, 38.37305858006492], + [-7.098036668313128, 39.03007274022379], + [-7.498632371439726, 39.62957103124181], + [-7.066591559263529, 39.711891587882775], + [-7.026413133156595, 40.184524237624245], + [-6.864019944679385, 40.33087189387483], + [-6.851126674822552, 41.11108266861753], + [-6.389087693700915, 41.381815497394655], + [-6.668605515967656, 41.883386949219584], + [-7.251308966490824, 41.91834605566505], + [-7.422512986673795, 41.79207469335984], + [-8.013174607769912, 41.790886135417125], + [-8.263856980817792, 42.28046865495034], + [-8.67194576662672, 42.13468943945496], + [-9.034817674180246, 41.880570583659676], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Estonia", + "sov_a3": "EST", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Estonia", + "adm0_a3": "EST", + "geou_dif": 0, + "geounit": "Estonia", + "gu_a3": "EST", + "su_dif": 0, + "subunit": "Estonia", + "su_a3": "EST", + "brk_diff": 0, + "name": "Estonia", + "name_long": "Estonia", + "brk_a3": "EST", + "brk_name": "Estonia", + "brk_group": null, + "abbrev": "Est.", + "postal": "EST", + "formal_en": "Republic of Estonia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Estonia", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 2, + "mapcolor9": 1, + "mapcolor13": 10, + "pop_est": 1299371, + "gdp_md_est": 27410, + "pop_year": -99, + "lastcensus": 2000, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "EE", + "iso_a3": "EST", + "iso_n3": "233", + "un_a3": "233", + "wb_a2": "EE", + "wb_a3": "EST", + "woe_id": -99, + "adm0_a3_is": "EST", + "adm0_a3_us": "EST", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [24.312862583114622, 57.79342357037697], + [24.42892785004216, 58.38341339785329], + [24.061198357853186, 58.25737457949341], + [23.426560092876684, 58.612753404364625], + [23.339795363058645, 59.187240302153384], + [24.604214308376186, 59.46585378685502], + [25.86418908051664, 59.61109039981133], + [26.949135776484525, 59.445803331125774], + [27.981114129353244, 59.475388088612874], + [28.13169925305175, 59.300825100330925], + [27.420166456824944, 58.72458120384424], + [27.71668582531572, 57.79189911562436], + [27.288184848751513, 57.47452830670383], + [26.463532342237787, 57.47638865826633], + [25.60280968598437, 57.84752879498657], + [25.16459354014927, 57.97015696881519], + [24.312862583114622, 57.79342357037697], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Finland", + "sov_a3": "FI1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "Finland", + "adm0_a3": "FIN", + "geou_dif": 0, + "geounit": "Finland", + "gu_a3": "FIN", + "su_dif": 0, + "subunit": "Finland", + "su_a3": "FIN", + "brk_diff": 0, + "name": "Finland", + "name_long": "Finland", + "brk_a3": "FIN", + "brk_name": "Finland", + "brk_group": null, + "abbrev": "Fin.", + "postal": "FIN", + "formal_en": "Republic of Finland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Finland", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 1, + "mapcolor9": 4, + "mapcolor13": 6, + "pop_est": 5250275, + "gdp_md_est": 193500, + "pop_year": -99, + "lastcensus": 2010, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "FI", + "iso_a3": "FIN", + "iso_n3": "246", + "un_a3": "246", + "wb_a2": "FI", + "wb_a3": "FIN", + "woe_id": -99, + "adm0_a3_is": "FIN", + "adm0_a3_us": "FIN", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [28.591929559043194, 69.06477692328666], + [28.445943637818658, 68.36461294216404], + [29.97742638522061, 67.69829702419266], + [29.054588657352326, 66.94428620062193], + [30.21765, 65.80598], + [29.54442955904699, 64.94867157659048], + [30.44468468600371, 64.20445343693909], + [30.035872430142717, 63.55281362573855], + [31.516092156711125, 62.86768748641289], + [31.139991082490894, 62.35769277612441], + [30.21110721204445, 61.780027777749694], + [28.069997592895277, 60.50351654727584], + [26.255172967236973, 60.4239606797625], + [24.496623976344523, 60.05731639265166], + [22.869694858499457, 59.846373196036225], + [22.290763787533592, 60.39192129174154], + [21.322244093519316, 60.720169989659524], + [21.544866163832694, 61.70532949487179], + [21.05921105315369, 62.60739329695874], + [21.536029493910803, 63.18973501245587], + [22.442744174903993, 63.81781037053129], + [24.730511508897536, 64.90234365504084], + [25.398067661243942, 65.11142650009374], + [25.294043003040404, 65.53434642197045], + [23.903378533633802, 66.00692739527962], + [23.565879754335583, 66.39605093043743], + [23.53947309743444, 67.93600861273525], + [21.978534783626117, 68.6168456081807], + [20.645592889089528, 69.10624726020087], + [21.244936150810673, 69.37044302029308], + [22.356237827247412, 68.84174144151491], + [23.66204959483076, 68.89124746365054], + [24.735679152126725, 68.64955678982146], + [25.689212680776365, 69.09211375596904], + [26.179622023226244, 69.82529897732614], + [27.732292107867863, 70.16419302029625], + [29.015572950971972, 69.76649119737799], + [28.591929559043194, 69.06477692328666], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "France", + "sov_a3": "FR1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "France", + "adm0_a3": "FRA", + "geou_dif": 0, + "geounit": "France", + "gu_a3": "FRA", + "su_dif": 0, + "subunit": "France", + "su_a3": "FRA", + "brk_diff": 0, + "name": "France", + "name_long": "France", + "brk_a3": "FRA", + "brk_name": "France", + "brk_group": null, + "abbrev": "Fr.", + "postal": "F", + "formal_en": "French Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "France", + "name_alt": null, + "mapcolor7": 7, + "mapcolor8": 5, + "mapcolor9": 9, + "mapcolor13": 11, + "pop_est": 64057792, + "gdp_md_est": 2128000, + "pop_year": -99, + "lastcensus": -99, + "gdp_year": -99, + "economy": "1. Developed region: G7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "FR", + "iso_a3": "FRA", + "iso_n3": "250", + "un_a3": "250", + "wb_a2": "FR", + "wb_a3": "FRA", + "woe_id": -99, + "adm0_a3_is": "FRA", + "adm0_a3_us": "FRA", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 3, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-52.55642473001839, 2.504705308437053], + [-52.93965715189498, 2.124857692875622], + [-53.418465135295264, 2.053389187016037], + [-53.554839240113495, 2.334896551925965], + [-53.778520677288896, 2.376702785650053], + [-54.08806250671728, 2.105556545414629], + [-54.52475419779975, 2.311848863123785], + [-54.27122962097579, 2.738747870286943], + [-54.18428402364475, 3.194172268075235], + [-54.01150387227682, 3.622569891774859], + [-54.399542202356514, 4.212611395683481], + [-54.47863298197922, 4.896755682795643], + [-53.95804460307093, 5.756548163267809], + [-53.618452928264844, 5.646529038918402], + [-52.88214128275408, 5.409850979021599], + [-51.82334286152593, 4.565768133966145], + [-51.65779741067888, 4.156232408053029], + [-52.249337531123984, 3.241094468596287], + [-52.55642473001839, 2.504705308437053], + ] + ], + [ + [ + [9.560016310269134, 42.15249197037957], + [9.229752231491773, 41.38000682226445], + [8.775723097375362, 41.58361196549444], + [8.54421268070783, 42.256516628583086], + [8.746009148807588, 42.62812185319396], + [9.390000848028905, 43.00998484961474], + [9.560016310269134, 42.15249197037957], + ] + ], + [ + [ + [3.588184441755715, 50.37899241800358], + [4.286022983425141, 49.907496649772554], + [4.799221632515753, 49.98537303323633], + [5.674051954784886, 49.52948354755745], + [5.897759230176376, 49.44266714130717], + [6.186320428094206, 49.46380280211446], + [6.658229607783539, 49.201958319691556], + [8.099278598674772, 49.01778351500337], + [7.593676385131062, 48.33301911070373], + [7.466759067422231, 47.620581976911865], + [7.192202182655535, 47.44976552997099], + [6.736571079138088, 47.54180125588289], + [6.768713820023635, 47.28770823830368], + [6.037388950228973, 46.72577871356191], + [6.022609490593567, 46.272989813820516], + [6.500099724970454, 46.42967275652944], + [6.843592970414562, 45.99114655210067], + [6.802355177445662, 45.70857982032868], + [7.096652459347837, 45.333098863295874], + [6.749955275101712, 45.02851797136759], + [7.007562290076663, 44.25476675066139], + [7.549596388386163, 44.12790110938482], + [7.435184767291844, 43.69384491634918], + [6.529245232783069, 43.12889232031836], + [4.556962517931396, 43.39965098731159], + [3.10041059735272, 43.075200507167125], + [2.985998976258486, 42.473015041669896], + [1.826793247087181, 42.34338471126566], + [0.701590610363922, 42.79573436133265], + [0.338046909190581, 42.579546006839564], + [-1.502770961910471, 43.03401439063049], + [-1.901351284177736, 43.42280202897834], + [-1.384225226232957, 44.02261037859017], + [-1.193797573237362, 46.014917710954876], + [-2.225724249673789, 47.06436269793821], + [-2.963276129559574, 47.570326646507965], + [-4.491554938159481, 47.95495433205642], + [-4.592349819344747, 48.68416046812695], + [-3.295813971357745, 48.901692409859635], + [-1.616510789384932, 48.644421291694584], + [-1.933494025063254, 49.77634186461577], + [-0.98946895995536, 49.347375800160876], + [1.338761020522753, 50.12717316344526], + [1.6390010921385, 50.946606350297515], + [2.513573032246171, 51.14850617126186], + [2.658422071960331, 50.79684804951566], + [3.123251580425716, 50.78036326761452], + [3.588184441755715, 50.37899241800358], + ] + ], + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "United Kingdom", + "sov_a3": "GB1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "United Kingdom", + "adm0_a3": "GBR", + "geou_dif": 0, + "geounit": "United Kingdom", + "gu_a3": "GBR", + "su_dif": 0, + "subunit": "United Kingdom", + "su_a3": "GBR", + "brk_diff": 0, + "name": "United Kingdom", + "name_long": "United Kingdom", + "brk_a3": "GBR", + "brk_name": "United Kingdom", + "brk_group": null, + "abbrev": "U.K.", + "postal": "GB", + "formal_en": "United Kingdom of Great Britain and Northern Ireland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "United Kingdom", + "name_alt": null, + "mapcolor7": 6, + "mapcolor8": 6, + "mapcolor9": 6, + "mapcolor13": 3, + "pop_est": 62262000, + "gdp_md_est": 1977704, + "pop_year": 0, + "lastcensus": 2011, + "gdp_year": 2009, + "economy": "1. Developed region: G7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "GB", + "iso_a3": "GBR", + "iso_n3": "826", + "un_a3": "826", + "wb_a2": "GB", + "wb_a3": "GBR", + "woe_id": -99, + "adm0_a3_is": "GBR", + "adm0_a3_us": "GBR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 14, + "long_len": 14, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [-5.661948614921897, 54.55460317648385], + [-6.197884894220977, 53.86756500916334], + [-6.953730231137996, 54.073702297575636], + [-7.572167934591079, 54.05995636658599], + [-7.366030646178785, 54.595840969452695], + [-7.572167934591079, 55.1316222194549], + [-6.733847011736145, 55.1728600124238], + [-5.661948614921897, 54.55460317648385], + ] + ], + [ + [ + [-3.005004848635281, 58.63500010846633], + [-4.073828497728016, 57.55302480735526], + [-3.055001796877661, 57.69001902936094], + [-1.959280564776918, 57.68479970969952], + [-2.219988165689301, 56.87001740175353], + [-3.119003058271119, 55.973793036515474], + [-2.085009324543023, 55.90999848085127], + [-2.005675679673857, 55.80490285035023], + [-1.11499101399221, 54.624986477265395], + [-0.4304849918542, 54.46437612570216], + [0.184981316742039, 53.32501414653103], + [0.469976840831777, 52.92999949809197], + [1.681530795914739, 52.739520168664], + [1.559987827164377, 52.09999848083601], + [1.050561557630914, 51.806760565795685], + [1.449865349950301, 51.28942780212196], + [0.550333693045502, 50.765738837275876], + [-0.78751746255864, 50.77498891865622], + [-2.489997524414377, 50.50001862243124], + [-2.956273972984036, 50.696879991247016], + [-3.617448085942328, 50.22835561787272], + [-4.542507900399244, 50.341837063185665], + [-5.245023159191135, 49.95999990498109], + [-5.776566941745301, 50.15967763935683], + [-4.309989793301838, 51.21000112568916], + [-3.414850633142123, 51.42600861266925], + [-3.422719467108323, 51.42684816740609], + [-4.984367234710874, 51.593466091510976], + [-5.267295701508885, 51.991400458374585], + [-4.222346564134853, 52.301355699261364], + [-4.770013393564113, 52.840004991255626], + [-4.579999152026915, 53.49500377055517], + [-3.093830673788659, 53.404547400669685], + [-3.092079637047107, 53.40444082296355], + [-2.945008510744344, 53.984999701546684], + [-3.614700825433033, 54.600936773292574], + [-3.630005458989331, 54.615012925833014], + [-4.844169073903004, 54.790971177786844], + [-5.082526617849226, 55.06160065369937], + [-4.719112107756644, 55.50847260194348], + [-5.047980922862109, 55.78398550070753], + [-5.58639767091114, 55.31114614523682], + [-5.644998745130181, 56.275014960344805], + [-6.149980841486354, 56.78500967063354], + [-5.786824713555291, 57.81884837506465], + [-5.009998745127575, 58.63001333275005], + [-4.211494513353557, 58.55084503847917], + [-3.005004848635281, 58.63500010846633], + ] + ], + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Greece", + "sov_a3": "GRC", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Greece", + "adm0_a3": "GRC", + "geou_dif": 0, + "geounit": "Greece", + "gu_a3": "GRC", + "su_dif": 0, + "subunit": "Greece", + "su_a3": "GRC", + "brk_diff": 0, + "name": "Greece", + "name_long": "Greece", + "brk_a3": "GRC", + "brk_name": "Greece", + "brk_group": null, + "abbrev": "Greece", + "postal": "GR", + "formal_en": "Hellenic Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Greece", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 2, + "mapcolor9": 2, + "mapcolor13": 9, + "pop_est": 10737428, + "gdp_md_est": 343000, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "GR", + "iso_a3": "GRC", + "iso_n3": "300", + "un_a3": "300", + "wb_a2": "GR", + "wb_a3": "GRC", + "woe_id": -99, + "adm0_a3_is": "GRC", + "adm0_a3_us": "GRC", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 6, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [23.699980096133004, 35.70500438083553], + [24.24666507334868, 35.368022365860156], + [25.02501549652888, 35.424995632461986], + [25.769207797964185, 35.35401805270908], + [25.745023227651586, 35.179997666966216], + [26.290002882601726, 35.29999034274792], + [26.16499759288766, 35.004995429009796], + [24.724982130642303, 34.91998769788961], + [24.735007358506948, 35.08499054619759], + [23.514978468528113, 35.27999156345098], + [23.699980096133004, 35.70500438083553], + ] + ], + [ + [ + [26.604195590936285, 41.562114569661105], + [26.29460208507578, 40.93626129817426], + [26.056942172965506, 40.824123440100834], + [25.447677036244187, 40.85254547786147], + [24.92584842296094, 40.94706167252323], + [23.714811232200816, 40.68712921809512], + [24.407998894964066, 40.1249929876241], + [23.899967889102584, 39.96200552017558], + [23.3429993018608, 39.96099782974579], + [22.813987664488963, 40.476005153966554], + [22.62629886240478, 40.25656118423919], + [22.84974775563481, 39.65931081802577], + [23.3500272966526, 39.19001129816726], + [22.973099399515547, 38.97090322524966], + [23.530016310324953, 38.51000112563847], + [24.025024855248944, 38.21999298761645], + [24.040011020613605, 37.655014553369426], + [23.115002882589152, 37.92001129816222], + [23.409971958111072, 37.409990749657396], + [22.774971958108637, 37.30501007745656], + [23.15422529469862, 36.422505804992056], + [22.490028110451107, 36.41000010837746], + [21.670026482843696, 36.8449864771942], + [21.295010613701578, 37.644989325504696], + [21.120034213961333, 38.31032339126273], + [20.730032179454582, 38.769985256498785], + [20.217712029712857, 39.340234686839636], + [20.15001590341052, 39.62499766698403], + [20.615000441172782, 40.110006822259436], + [20.674996779063633, 40.434999904943055], + [20.99998986174728, 40.58000397395398], + [21.02004031747643, 40.84272695572588], + [21.674160597426976, 40.93127452245798], + [22.05537763844427, 41.14986583105269], + [22.597308383889015, 41.130487168943205], + [22.76177, 41.3048], + [22.95237715016657, 41.33799388281122], + [23.692073601992462, 41.30908091894386], + [24.492644891058035, 41.58389618587205], + [25.197201368925533, 41.23448598893066], + [26.106138136507184, 41.32889883072784], + [26.117041863720914, 41.82690460872473], + [26.604195590936285, 41.562114569661105], + ] + ], + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Croatia", + "sov_a3": "HRV", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Croatia", + "adm0_a3": "HRV", + "geou_dif": 0, + "geounit": "Croatia", + "gu_a3": "HRV", + "su_dif": 0, + "subunit": "Croatia", + "su_a3": "HRV", + "brk_diff": 0, + "name": "Croatia", + "name_long": "Croatia", + "brk_a3": "HRV", + "brk_name": "Croatia", + "brk_group": null, + "abbrev": "Cro.", + "postal": "HR", + "formal_en": "Republic of Croatia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Croatia", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 4, + "mapcolor9": 5, + "mapcolor13": 1, + "pop_est": 4489409, + "gdp_md_est": 82390, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "2. High income: nonOECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "HR", + "iso_a3": "HRV", + "iso_n3": "191", + "un_a3": "191", + "wb_a2": "HR", + "wb_a3": "HRV", + "woe_id": -99, + "adm0_a3_is": "HRV", + "adm0_a3_us": "HRV", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [18.829838087650046, 45.908877671891844], + [19.072768995854176, 45.52151113543209], + [19.39047570158459, 45.236515611342384], + [19.00548628101012, 44.86023366960916], + [18.553214145591653, 45.08158966733146], + [17.861783481526402, 45.067740383477144], + [17.002146030351014, 45.23377676043094], + [16.534939406000206, 45.21160757097772], + [16.318156772535872, 45.00412669532591], + [15.959367303133376, 45.23377676043094], + [15.750026075918981, 44.818711656262565], + [16.23966027188453, 44.35114329688571], + [16.456442905348865, 44.04123973243128], + [16.91615644701733, 43.66772247982567], + [17.297373488034452, 43.44634064388737], + [17.674921502358984, 43.02856252702361], + [18.56, 42.65], + [18.450016310304818, 42.47999136002932], + [17.509970330483327, 42.849994615239154], + [16.930005730871642, 43.20999848080038], + [16.015384555737683, 43.50721548112722], + [15.174453973052096, 44.243191229827914], + [15.376250441151797, 44.31791535092208], + [14.92030927904051, 44.73848399512946], + [14.901602410550879, 45.07606028907611], + [14.258747592839995, 45.23377676043094], + [13.952254672917036, 44.80212352149687], + [13.656975538801191, 45.13693512631596], + [13.67940311041582, 45.48414907488501], + [13.715059848697251, 45.500323798192426], + [14.4119682145855, 45.46616567644742], + [14.59510949062792, 45.63494090431283], + [14.935243767972963, 45.471695054702764], + [15.327674594797429, 45.45231639259333], + [15.323953891672431, 45.731782538427694], + [15.671529575267641, 45.83415355079791], + [15.768732944408612, 46.23810822202353], + [16.564808383864943, 46.50375092221981], + [16.882515089595415, 46.38063182228444], + [17.630066359129557, 45.9517691106941], + [18.45606245288286, 45.75948110613615], + [18.829838087650046, 45.908877671891844], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Hungary", + "sov_a3": "HUN", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Hungary", + "adm0_a3": "HUN", + "geou_dif": 0, + "geounit": "Hungary", + "gu_a3": "HUN", + "su_dif": 0, + "subunit": "Hungary", + "su_a3": "HUN", + "brk_diff": 0, + "name": "Hungary", + "name_long": "Hungary", + "brk_a3": "HUN", + "brk_name": "Hungary", + "brk_group": null, + "abbrev": "Hun.", + "postal": "HU", + "formal_en": "Republic of Hungary", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Hungary", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 6, + "mapcolor9": 1, + "mapcolor13": 5, + "pop_est": 9905596, + "gdp_md_est": 196600, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "HU", + "iso_a3": "HUN", + "iso_n3": "348", + "un_a3": "348", + "wb_a2": "HU", + "wb_a3": "HUN", + "woe_id": -99, + "adm0_a3_is": "HUN", + "adm0_a3_us": "HUN", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [16.202298211337364, 46.85238597267696], + [16.534267612380376, 47.49617096616912], + [16.340584344150415, 47.71290192320123], + [16.90375410326726, 47.71486562762833], + [16.979666782304037, 48.123497015976305], + [17.48847293464982, 47.867466132186216], + [17.857132602620027, 47.75842886005037], + [18.696512892336926, 47.880953681014404], + [18.77702477384767, 48.081768296900634], + [19.17436486173989, 48.11137889260387], + [19.661363559658497, 48.26661489520866], + [19.769470656013112, 48.202691148463614], + [20.239054396249347, 48.32756724709692], + [20.473562045989866, 48.562850043321816], + [20.801293979584926, 48.623854071642384], + [21.872236362401736, 48.31997081155002], + [22.085608351334855, 48.42226430927179], + [22.640819939878753, 48.15023956968736], + [22.710531447040495, 47.88219391538941], + [22.099767693782837, 47.6724392767167], + [21.626514926853872, 46.99423777931816], + [21.02195234547125, 46.3160879583519], + [20.220192498462836, 46.127468980486555], + [19.596044549241583, 46.17172984474454], + [18.82983808764996, 45.90887767189193], + [18.45606245288286, 45.759481106136136], + [17.630066359129557, 45.95176911069419], + [16.8825150895953, 46.38063182228444], + [16.564808383864857, 46.50375092221983], + [16.370504998447416, 46.841327216166505], + [16.202298211337364, 46.85238597267696], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Ireland", + "sov_a3": "IRL", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Ireland", + "adm0_a3": "IRL", + "geou_dif": 0, + "geounit": "Ireland", + "gu_a3": "IRL", + "su_dif": 0, + "subunit": "Ireland", + "su_a3": "IRL", + "brk_diff": 0, + "name": "Ireland", + "name_long": "Ireland", + "brk_a3": "IRL", + "brk_name": "Ireland", + "brk_group": null, + "abbrev": "Ire.", + "postal": "IRL", + "formal_en": "Ireland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Ireland", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 3, + "mapcolor9": 2, + "mapcolor13": 2, + "pop_est": 4203200, + "gdp_md_est": 188400, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "IE", + "iso_a3": "IRL", + "iso_n3": "372", + "un_a3": "372", + "wb_a2": "IE", + "wb_a3": "IRL", + "woe_id": -99, + "adm0_a3_is": "IRL", + "adm0_a3_us": "IRL", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-6.197884894220991, 53.867565009163364], + [-6.032985398777611, 53.15316417094435], + [-6.788856573910849, 52.260117906292336], + [-8.56161658368356, 51.669301255899356], + [-9.977085740590269, 51.82045482035308], + [-9.166282517930782, 52.86462881124268], + [-9.688524542672454, 53.8813626165853], + [-8.327987433292009, 54.66451894796863], + [-7.572167934591064, 55.13162221945487], + [-7.366030646178785, 54.59584096945272], + [-7.572167934591064, 54.059956366586], + [-6.953730231138067, 54.073702297575636], + [-6.197884894220991, 53.867565009163364], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Iceland", + "sov_a3": "ISL", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Iceland", + "adm0_a3": "ISL", + "geou_dif": 0, + "geounit": "Iceland", + "gu_a3": "ISL", + "su_dif": 0, + "subunit": "Iceland", + "su_a3": "ISL", + "brk_diff": 0, + "name": "Iceland", + "name_long": "Iceland", + "brk_a3": "ISL", + "brk_name": "Iceland", + "brk_group": null, + "abbrev": "Iceland", + "postal": "IS", + "formal_en": "Republic of Iceland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Iceland", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 4, + "mapcolor9": 4, + "mapcolor13": 9, + "pop_est": 306694, + "gdp_md_est": 12710, + "pop_year": -99, + "lastcensus": -99, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "IS", + "iso_a3": "ISL", + "iso_n3": "352", + "un_a3": "352", + "wb_a2": "IS", + "wb_a3": "ISL", + "woe_id": -99, + "adm0_a3_is": "ISL", + "adm0_a3_us": "ISL", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 7, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-14.508695441129234, 66.45589223903143], + [-14.739637417041607, 65.8087482774403], + [-13.60973222497981, 65.12667104761987], + [-14.909833746794902, 64.36408193628868], + [-17.794438035543422, 63.678749091233854], + [-18.656245896874992, 63.49638296167582], + [-19.97275468594276, 63.64363495549153], + [-22.762971971110158, 63.960178941495386], + [-21.778484259517683, 64.40211579045551], + [-23.95504391121911, 64.8911298692335], + [-22.184402635170358, 65.0849681667603], + [-22.227423265053332, 65.37859365504274], + [-24.326184047939336, 65.61118927678847], + [-23.65051469572309, 66.26251902939522], + [-22.134922451250887, 66.41046865504687], + [-20.57628373867955, 65.73211212835143], + [-19.05684160000159, 66.27660085719477], + [-17.79862382655905, 65.99385325790978], + [-16.167818976292125, 66.52679230413587], + [-14.508695441129234, 66.45589223903143], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Italy", + "sov_a3": "ITA", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Italy", + "adm0_a3": "ITA", + "geou_dif": 0, + "geounit": "Italy", + "gu_a3": "ITA", + "su_dif": 0, + "subunit": "Italy", + "su_a3": "ITA", + "brk_diff": 0, + "name": "Italy", + "name_long": "Italy", + "brk_a3": "ITA", + "brk_name": "Italy", + "brk_group": null, + "abbrev": "Italy", + "postal": "I", + "formal_en": "Italian Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Italy", + "name_alt": null, + "mapcolor7": 6, + "mapcolor8": 7, + "mapcolor9": 8, + "mapcolor13": 7, + "pop_est": 58126212, + "gdp_md_est": 1823000, + "pop_year": -99, + "lastcensus": 2012, + "gdp_year": -99, + "economy": "1. Developed region: G7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "IT", + "iso_a3": "ITA", + "iso_n3": "380", + "un_a3": "380", + "wb_a2": "IT", + "wb_a3": "ITA", + "woe_id": -99, + "adm0_a3_is": "ITA", + "adm0_a3_us": "ITA", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 5, + "long_len": 5, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [15.520376010813834, 38.23115509699147], + [15.160242954171736, 37.44404551853782], + [15.309897902089006, 37.1342194687318], + [15.09998823411945, 36.6199872909954], + [14.335228712632016, 36.996630967754754], + [13.82673261887993, 37.1045313583802], + [12.431003859108813, 37.61294993748382], + [12.570943637755136, 38.12638113051969], + [13.741156447004585, 38.03496552179536], + [14.76124922044616, 38.143873602850505], + [15.520376010813834, 38.23115509699147], + ] + ], + [ + [ + [9.210011834356266, 41.20999136002422], + [9.809975213264977, 40.5000088567661], + [9.669518670295673, 39.177376410471794], + [9.21481774255949, 39.240473334300134], + [8.80693566247973, 38.90661774347848], + [8.428302443077115, 39.17184703221662], + [8.38825320805094, 40.378310858718805], + [8.15999840661766, 40.95000722916379], + [8.709990675500109, 40.89998444270523], + [9.210011834356266, 41.20999136002422], + ] + ], + [ + [ + [12.376485223040845, 46.76755910906988], + [13.806475457421556, 46.50930613869119], + [13.698109978905478, 46.016778062517375], + [13.937630242578336, 45.591015936864665], + [13.141606479554298, 45.73669179949542], + [12.328581170306308, 45.381778062514854], + [12.383874952858605, 44.88537425391908], + [12.261453484759159, 44.600482082694015], + [12.589237094786483, 44.091365871754476], + [13.526905958722494, 43.58772736263791], + [14.029820997787027, 42.76100779883248], + [15.142569614327954, 41.955139675456905], + [15.926191033601896, 41.96131500911574], + [16.169897088290412, 41.740294908203424], + [15.889345737377795, 41.5410822617182], + [16.785001661860576, 41.179605617836586], + [17.519168735431208, 40.87714345963224], + [18.376687452882578, 40.35562490494266], + [18.480247023195403, 40.168866278639825], + [18.2933850440281, 39.81077444107325], + [17.738380161213286, 40.2776710068303], + [16.869595981522338, 40.44223460546385], + [16.448743116937322, 39.79540070246648], + [17.1714896989715, 39.42469981542072], + [17.052840610429342, 38.902871202137305], + [16.635088331781844, 38.8435724960824], + [16.100960727613057, 37.98589874933418], + [15.684086948314501, 37.90884918878703], + [15.68796268073632, 38.214592800441864], + [15.891981235424709, 38.750942491199226], + [16.109332309644316, 38.96454702407769], + [15.718813510814641, 39.544072374014945], + [15.413612501698822, 40.04835683853517], + [14.998495721098237, 40.17294871679093], + [14.70326826341477, 40.604550279292624], + [14.060671827865264, 40.78634796809544], + [13.627985060285397, 41.188287258461656], + [12.88808190273042, 41.25308950455562], + [12.10668257004491, 41.70453481705741], + [11.191906365614187, 42.35542531998968], + [10.511947869517797, 42.931462510747224], + [10.200028924204048, 43.920006822274615], + [9.702488234097814, 44.03627879493132], + [8.88894616052687, 44.36633616797954], + [8.428560825238577, 44.23122813575242], + [7.850766635783202, 43.76714793555524], + [7.435184767291844, 43.69384491634918], + [7.549596388386163, 44.12790110938482], + [7.007562290076663, 44.25476675066139], + [6.749955275101712, 45.02851797136759], + [7.096652459347837, 45.333098863295874], + [6.802355177445662, 45.70857982032868], + [6.843592970414562, 45.99114655210067], + [7.273850945676685, 45.77694774025076], + [7.755992058959833, 45.82449005795928], + [8.31662967289438, 46.163642483090854], + [8.489952426801295, 46.00515086525175], + [8.966305779667834, 46.036931871111165], + [9.182881707403112, 46.44021474871698], + [9.922836541390353, 46.31489940040919], + [10.363378126678668, 46.483571275409844], + [10.442701450246602, 46.893546250997446], + [11.048555942436508, 46.7513585475464], + [11.164827915093326, 46.94157949481274], + [12.153088006243081, 47.11539317482644], + [12.376485223040845, 46.76755910906988], + ] + ], + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Kosovo", + "sov_a3": "KOS", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Kosovo", + "adm0_a3": "KOS", + "geou_dif": 0, + "geounit": "Kosovo", + "gu_a3": "KOS", + "su_dif": 0, + "subunit": "Kosovo", + "su_a3": "KOS", + "brk_diff": 1, + "name": "Kosovo", + "name_long": "Kosovo", + "brk_a3": "B57", + "brk_name": "Kosovo", + "brk_group": null, + "abbrev": "Kos.", + "postal": "KO", + "formal_en": "Republic of Kosovo", + "formal_fr": null, + "note_adm0": null, + "note_brk": "Self admin.; Claimed by Serbia", + "name_sort": "Kosovo", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 2, + "mapcolor9": 3, + "mapcolor13": 11, + "pop_est": 1804838, + "gdp_md_est": 5352, + "pop_year": -99, + "lastcensus": 1981, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "4. Lower middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "-99", + "iso_a3": "-99", + "iso_n3": "-99", + "un_a3": "-099", + "wb_a2": "KV", + "wb_a3": "KSV", + "woe_id": -99, + "adm0_a3_is": "SRB", + "adm0_a3_us": "KOS", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [20.76216, 42.05186], + [20.71731000000011, 41.84711], + [20.59023, 41.85541], + [20.52295, 42.21787], + [20.28374, 42.3202500000001], + [20.0707, 42.58863], + [20.25758, 42.81275000000011], + [20.49679, 42.88469], + [20.63508, 43.21671], + [20.81448, 43.27205], + [20.95651, 43.13094], + [21.143395, 43.06868500000013], + [21.27421, 42.90959], + [21.43866, 42.86255], + [21.63302, 42.67717], + [21.77505, 42.6827], + [21.66292, 42.43922], + [21.54332, 42.3202500000001], + [21.57663598940212, 42.24522439706186], + [21.35270000000014, 42.2068], + [20.76216, 42.05186], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Lithuania", + "sov_a3": "LTU", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Lithuania", + "adm0_a3": "LTU", + "geou_dif": 0, + "geounit": "Lithuania", + "gu_a3": "LTU", + "su_dif": 0, + "subunit": "Lithuania", + "su_a3": "LTU", + "brk_diff": 0, + "name": "Lithuania", + "name_long": "Lithuania", + "brk_a3": "LTU", + "brk_name": "Lithuania", + "brk_group": null, + "abbrev": "Lith.", + "postal": "LT", + "formal_en": "Republic of Lithuania", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Lithuania", + "name_alt": null, + "mapcolor7": 6, + "mapcolor8": 3, + "mapcolor9": 3, + "mapcolor13": 9, + "pop_est": 3555179, + "gdp_md_est": 63330, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "LT", + "iso_a3": "LTU", + "iso_n3": "440", + "un_a3": "440", + "wb_a2": "LT", + "wb_a3": "LTU", + "woe_id": -99, + "adm0_a3_is": "LTU", + "adm0_a3_us": "LTU", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 9, + "long_len": 9, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.731098667092652, 54.327536932993326], + [22.65105187347254, 54.582740993866736], + [22.75776370615526, 54.85657440858138], + [22.315723504330577, 55.015298570365864], + [21.268448927503467, 55.190481675835315], + [21.055800408622417, 56.031076361711065], + [22.201156853939494, 56.33780182557949], + [23.878263787539964, 56.27367137310527], + [24.86068444184076, 56.37252838807963], + [25.000934279080894, 56.16453074810484], + [25.533046502390334, 56.100296942766036], + [26.494331495883756, 55.615106919977634], + [26.58827924979039, 55.16717560487167], + [25.7684326514798, 54.84696259217509], + [25.536353794056993, 54.28242340760253], + [24.450683628037037, 53.905702216194754], + [23.48412763844985, 53.91249766704114], + [23.24398725758951, 54.22056671814914], + [22.731098667092652, 54.327536932993326], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Luxembourg", + "sov_a3": "LUX", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Luxembourg", + "adm0_a3": "LUX", + "geou_dif": 0, + "geounit": "Luxembourg", + "gu_a3": "LUX", + "su_dif": 0, + "subunit": "Luxembourg", + "su_a3": "LUX", + "brk_diff": 0, + "name": "Luxembourg", + "name_long": "Luxembourg", + "brk_a3": "LUX", + "brk_name": "Luxembourg", + "brk_group": null, + "abbrev": "Lux.", + "postal": "L", + "formal_en": "Grand Duchy of Luxembourg", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Luxembourg", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 7, + "mapcolor9": 3, + "mapcolor13": 7, + "pop_est": 491775, + "gdp_md_est": 39370, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "LU", + "iso_a3": "LUX", + "iso_n3": "442", + "un_a3": "442", + "wb_a2": "LU", + "wb_a3": "LUX", + "woe_id": -99, + "adm0_a3_is": "LUX", + "adm0_a3_us": "LUX", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 10, + "long_len": 10, + "abbrev_len": 4, + "tiny": 5, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [6.043073357781111, 50.128051662794235], + [6.242751092156993, 49.90222565367873], + [6.186320428094177, 49.463802802114515], + [5.897759230176405, 49.44266714130703], + [5.674051954784829, 49.529483547557504], + [5.782417433300907, 50.09032786722122], + [6.043073357781111, 50.128051662794235], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Latvia", + "sov_a3": "LVA", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Latvia", + "adm0_a3": "LVA", + "geou_dif": 0, + "geounit": "Latvia", + "gu_a3": "LVA", + "su_dif": 0, + "subunit": "Latvia", + "su_a3": "LVA", + "brk_diff": 0, + "name": "Latvia", + "name_long": "Latvia", + "brk_a3": "LVA", + "brk_name": "Latvia", + "brk_group": null, + "abbrev": "Lat.", + "postal": "LV", + "formal_en": "Republic of Latvia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Latvia", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 7, + "mapcolor9": 6, + "mapcolor13": 13, + "pop_est": 2231503, + "gdp_md_est": 38860, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "LV", + "iso_a3": "LVA", + "iso_n3": "428", + "un_a3": "428", + "wb_a2": "LV", + "wb_a3": "LVA", + "woe_id": -99, + "adm0_a3_is": "LVA", + "adm0_a3_us": "LVA", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [21.055800408622417, 56.031076361711065], + [21.090423618257972, 56.78387278912294], + [21.581866489353672, 57.411870632549935], + [22.52434126149288, 57.75337433535076], + [23.318452996522097, 57.00623647727487], + [24.12072960785343, 57.02569265403277], + [24.312862583114622, 57.79342357037697], + [25.16459354014927, 57.97015696881519], + [25.60280968598437, 57.84752879498657], + [26.463532342237787, 57.47638865826633], + [27.288184848751513, 57.47452830670383], + [27.77001590344093, 57.24425812441123], + [27.855282016722526, 56.75932648378429], + [28.176709425577997, 56.169129950578814], + [27.10245975109453, 55.783313707087686], + [26.494331495883756, 55.615106919977634], + [25.533046502390334, 56.100296942766036], + [25.000934279080894, 56.16453074810484], + [24.86068444184076, 56.37252838807963], + [23.878263787539964, 56.27367137310527], + [22.201156853939494, 56.33780182557949], + [21.055800408622417, 56.031076361711065], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Moldova", + "sov_a3": "MDA", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Moldova", + "adm0_a3": "MDA", + "geou_dif": 0, + "geounit": "Moldova", + "gu_a3": "MDA", + "su_dif": 0, + "subunit": "Moldova", + "su_a3": "MDA", + "brk_diff": 0, + "name": "Moldova", + "name_long": "Moldova", + "brk_a3": "MDA", + "brk_name": "Moldova", + "brk_group": null, + "abbrev": "Mda.", + "postal": "MD", + "formal_en": "Republic of Moldova", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Moldova", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 5, + "mapcolor9": 4, + "mapcolor13": 12, + "pop_est": 4320748, + "gdp_md_est": 10670, + "pop_year": -99, + "lastcensus": 2004, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "4. Lower middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "MD", + "iso_a3": "MDA", + "iso_n3": "498", + "un_a3": "498", + "wb_a2": "MD", + "wb_a3": "MDA", + "woe_id": -99, + "adm0_a3_is": "MDA", + "adm0_a3_us": "MDA", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [26.619336785597795, 48.22072622333347], + [26.857823520624805, 48.368210761094495], + [27.522537469195157, 48.467119452501116], + [28.259546746541844, 48.15556224221342], + [28.670891147585166, 48.1181485052341], + [29.12269819511303, 47.849095160506465], + [29.05086795422733, 47.5102269557525], + [29.415135125452736, 47.34664520933258], + [29.559674106573112, 46.928582872091326], + [29.908851759569302, 46.67436066343146], + [29.838210076626297, 46.52532583270169], + [30.024658644335375, 46.42393667254504], + [29.759971958136394, 46.34998769793536], + [29.170653924279886, 46.3792623968287], + [29.07210696789929, 46.517677720722496], + [28.862972446414062, 46.43788930926383], + [28.933717482221624, 46.2588304713725], + [28.65998742037158, 45.93998688413164], + [28.485269402792767, 45.5969070501459], + [28.233553501099042, 45.488283189468376], + [28.0544429867754, 45.944586086605625], + [28.160017937947714, 46.37156260841722], + [28.128030226359044, 46.810476386088254], + [27.551166212684848, 47.40511709247083], + [27.233872918412743, 47.82677094175638], + [26.924176059687568, 48.123264472030996], + [26.619336785597795, 48.22072622333347], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Macedonia", + "sov_a3": "MKD", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Macedonia", + "adm0_a3": "MKD", + "geou_dif": 0, + "geounit": "Macedonia", + "gu_a3": "MKD", + "su_dif": 0, + "subunit": "Macedonia", + "su_a3": "MKD", + "brk_diff": 0, + "name": "Macedonia", + "name_long": "Macedonia", + "brk_a3": "MKD", + "brk_name": "Macedonia", + "brk_group": null, + "abbrev": "Mkd.", + "postal": "MK", + "formal_en": "Former Yugoslav Republic of Macedonia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Macedonia, FYR", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 3, + "mapcolor9": 7, + "mapcolor13": 3, + "pop_est": 2066718, + "gdp_md_est": 18780, + "pop_year": -99, + "lastcensus": 2010, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "MK", + "iso_a3": "MKD", + "iso_n3": "807", + "un_a3": "807", + "wb_a2": "MK", + "wb_a3": "MKD", + "woe_id": -99, + "adm0_a3_is": "MKD", + "adm0_a3_us": "MKD", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 9, + "long_len": 9, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [20.59023, 41.85541], + [20.71731000000011, 41.84711], + [20.76216, 42.05186], + [21.35270000000014, 42.2068], + [21.57663598940212, 42.24522439706186], + [21.917080000000112, 42.30364], + [22.38052575042468, 42.32025950781508], + [22.881373732197346, 41.999297186850356], + [22.952377150166512, 41.33799388281119], + [22.76177, 41.3048], + [22.597308383889015, 41.130487168943205], + [22.05537763844427, 41.14986583105269], + [21.674160597426976, 40.931274522457954], + [21.0200403174764, 40.84272695572588], + [20.60518, 41.08622], + [20.46315, 41.5150900000001], + [20.59023, 41.85541], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Montenegro", + "sov_a3": "MNE", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Montenegro", + "adm0_a3": "MNE", + "geou_dif": 0, + "geounit": "Montenegro", + "gu_a3": "MNE", + "su_dif": 0, + "subunit": "Montenegro", + "su_a3": "MNE", + "brk_diff": 0, + "name": "Montenegro", + "name_long": "Montenegro", + "brk_a3": "MNE", + "brk_name": "Montenegro", + "brk_group": null, + "abbrev": "Mont.", + "postal": "ME", + "formal_en": "Montenegro", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Montenegro", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 1, + "mapcolor9": 4, + "mapcolor13": 5, + "pop_est": 672180, + "gdp_md_est": 6816, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "ME", + "iso_a3": "MNE", + "iso_n3": "499", + "un_a3": "499", + "wb_a2": "ME", + "wb_a3": "MNE", + "woe_id": -99, + "adm0_a3_is": "MNE", + "adm0_a3_us": "MNE", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 10, + "long_len": 10, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [19.801613396898688, 42.50009349219084], + [19.73805138517963, 42.68824738216557], + [19.3044900000001, 42.19574], + [19.37177000000014, 41.87755], + [19.16246, 41.95502], + [18.88214, 42.28151], + [18.45, 42.48], + [18.56, 42.65], + [18.70648, 43.20011], + [19.03165, 43.43253], + [19.21852, 43.52384], + [19.48389, 43.35229], + [19.63, 43.21377997027054], + [19.95857, 43.10604], + [20.3398, 42.89852], + [20.25758, 42.81275000000011], + [20.0707, 42.58863], + [19.801613396898688, 42.50009349219084], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Netherlands", + "sov_a3": "NL1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "Netherlands", + "adm0_a3": "NLD", + "geou_dif": 0, + "geounit": "Netherlands", + "gu_a3": "NLD", + "su_dif": 0, + "subunit": "Netherlands", + "su_a3": "NLD", + "brk_diff": 0, + "name": "Netherlands", + "name_long": "Netherlands", + "brk_a3": "NLD", + "brk_name": "Netherlands", + "brk_group": null, + "abbrev": "Neth.", + "postal": "NL", + "formal_en": "Kingdom of the Netherlands", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Netherlands", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 2, + "mapcolor9": 2, + "mapcolor13": 9, + "pop_est": 16715999, + "gdp_md_est": 672000, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "NL", + "iso_a3": "NLD", + "iso_n3": "528", + "un_a3": "528", + "wb_a2": "NL", + "wb_a3": "NLD", + "woe_id": -99, + "adm0_a3_is": "NLD", + "adm0_a3_us": "NLD", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 11, + "long_len": 11, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [6.074182570020923, 53.510403347378144], + [6.905139601274129, 53.48216217713065], + [7.092053256873896, 53.144043280644894], + [6.842869500362383, 52.22844025329755], + [6.589396599970826, 51.852029120483394], + [5.988658074577813, 51.851615709025054], + [6.15665815595878, 50.80372101501058], + [5.606975945670001, 51.03729848896978], + [4.973991326526914, 51.47502370869813], + [4.047071160507528, 51.26725861266857], + [3.314971144228537, 51.34575511331991], + [3.830288527043137, 51.62054454203195], + [4.705997348661185, 53.091798407597764], + [6.074182570020923, 53.510403347378144], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Norway", + "sov_a3": "NOR", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Norway", + "adm0_a3": "NOR", + "geou_dif": 0, + "geounit": "Norway", + "gu_a3": "NOR", + "su_dif": 0, + "subunit": "Norway", + "su_a3": "NOR", + "brk_diff": 0, + "name": "Norway", + "name_long": "Norway", + "brk_a3": "NOR", + "brk_name": "Norway", + "brk_group": null, + "abbrev": "Nor.", + "postal": "N", + "formal_en": "Kingdom of Norway", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Norway", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 3, + "mapcolor9": 8, + "mapcolor13": 12, + "pop_est": 4676305, + "gdp_md_est": 276400, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "NO", + "iso_a3": "NOR", + "iso_n3": "578", + "un_a3": "578", + "wb_a2": "NO", + "wb_a3": "NOR", + "woe_id": -99, + "adm0_a3_is": "NOR", + "adm0_a3_us": "NOR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [28.165547316202918, 71.18547435168051], + [31.293418409965483, 70.45378774685992], + [30.005435011522792, 70.1862588568849], + [31.101078728975125, 69.55808014594487], + [29.399580519332886, 69.15691600206307], + [28.591929559043194, 69.0647769232867], + [29.015572950971972, 69.76649119737797], + [27.73229210786789, 70.1641930202963], + [26.1796220232263, 69.82529897732616], + [25.689212680776393, 69.09211375596902], + [24.73567915212672, 68.64955678982145], + [23.662049594830762, 68.89124746365053], + [22.356237827247412, 68.84174144151496], + [21.24493615081073, 69.37044302029312], + [20.645592889089585, 69.10624726020086], + [20.025268995857914, 69.06513865831272], + [19.878559604581255, 68.40719432237262], + [17.99386844246439, 68.56739126247734], + [17.729181756265348, 68.01055186631623], + [16.76887861498554, 68.01393667263139], + [16.108712192456835, 67.3024555528369], + [15.108411492583059, 66.19386688909543], + [13.55568973150909, 64.78702769638147], + [13.919905226302205, 64.44542064071612], + [13.57191613124877, 64.04911408146967], + [12.579935336973932, 64.06621898055835], + [11.930569288794231, 63.12831757267699], + [11.992064243221535, 61.800362453856565], + [12.631146681375242, 61.2935716823701], + [12.3003658382749, 60.11793284773006], + [11.468271925511175, 59.432393296946], + [11.027368605196926, 58.8561494004594], + [10.356556837616097, 59.46980703392538], + [8.382000359743643, 58.31328847923328], + [7.048748406613299, 58.078884182357285], + [5.665835402050419, 58.58815542259367], + [5.308234490590735, 59.66323191999382], + [4.992078077829007, 61.970998033284275], + [5.912900424837886, 62.614472968182696], + [8.553411085655767, 63.45400828719647], + [10.527709181366788, 64.48603831649748], + [12.358346795306375, 65.87972585719316], + [14.761145867581604, 67.81064158799515], + [16.43592736172897, 68.56320547146169], + [19.184028354578516, 69.81744415961782], + [21.378416375420613, 70.25516937934606], + [23.023742303161583, 70.20207184516627], + [24.546543409938522, 71.03049673123724], + [26.37004967622181, 70.98626170519537], + [28.165547316202918, 71.18547435168051], + ] + ], + [ + [ + [24.72412, 77.85385], + [22.49032, 77.44493], + [20.72601, 77.67704], + [21.41611, 77.93504], + [20.8119, 78.25463], + [22.88426, 78.45494], + [23.28134, 78.07954], + [24.72412, 77.85385], + ] + ], + [ + [ + [18.25183, 79.70175], + [21.54383, 78.95611], + [19.02737, 78.5626], + [18.47172, 77.82669], + [17.59441, 77.63796], + [17.1182, 76.80941], + [15.91315, 76.77045], + [13.76259, 77.38035], + [14.66956, 77.73565], + [13.1706, 78.02493], + [11.22231, 78.8693], + [10.44453, 79.65239], + [13.17077, 80.01046], + [13.71852, 79.66039], + [15.14282, 79.67431], + [15.52255, 80.01608], + [16.99085, 80.05086], + [18.25183, 79.70175], + ] + ], + [ + [ + [25.447625359811894, 80.40734039989451], + [27.4075057309135, 80.05640574820046], + [25.92465050629818, 79.51783397085455], + [23.02446577321362, 79.4000117052291], + [20.075188429451885, 79.56682322866726], + [19.897266473070914, 79.84236196564751], + [18.462263624757924, 79.85988027619442], + [17.368015170977458, 80.31889618602702], + [20.455992059010697, 80.59815562613224], + [21.907944777115404, 80.35767934846209], + [22.919252557067438, 80.6571442735935], + [25.447625359811894, 80.40734039989451], + ] + ], + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Poland", + "sov_a3": "POL", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Poland", + "adm0_a3": "POL", + "geou_dif": 0, + "geounit": "Poland", + "gu_a3": "POL", + "su_dif": 0, + "subunit": "Poland", + "su_a3": "POL", + "brk_diff": 0, + "name": "Poland", + "name_long": "Poland", + "brk_a3": "POL", + "brk_name": "Poland", + "brk_group": null, + "abbrev": "Pol.", + "postal": "PL", + "formal_en": "Republic of Poland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Poland", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 7, + "mapcolor9": 1, + "mapcolor13": 2, + "pop_est": 38482919, + "gdp_md_est": 667900, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "PL", + "iso_a3": "POL", + "iso_n3": "616", + "un_a3": "616", + "wb_a2": "PL", + "wb_a3": "POL", + "woe_id": -99, + "adm0_a3_is": "POL", + "adm0_a3_us": "POL", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [15.01699588385867, 51.10667409932158], + [14.607098422919535, 51.74518809671997], + [14.685026482815687, 52.0899474147552], + [14.437599725002201, 52.62485016540839], + [14.074521111719491, 52.98126251892543], + [14.353315463934138, 53.24817129171297], + [14.119686313542587, 53.75702912049104], + [14.802900424873458, 54.05070628520575], + [16.36347700365573, 54.513158677785725], + [17.622831658608675, 54.85153595643291], + [18.62085859546164, 54.68260569927078], + [18.696254510175464, 54.43871877706929], + [19.660640089606403, 54.42608388937393], + [20.892244500418627, 54.31252492941253], + [22.731098667092652, 54.327536932993326], + [23.24398725758951, 54.22056671814914], + [23.48412763844985, 53.91249766704114], + [23.527535841575002, 53.470121568406555], + [23.80493493011778, 53.089731350306074], + [23.79919884613338, 52.69109935160657], + [23.199493849386187, 52.48697744405367], + [23.508002150168693, 52.02364655212473], + [23.527070753684374, 51.57845408793024], + [24.029985792748903, 50.70540660257518], + [23.922757195743262, 50.42488108987875], + [23.426508416444392, 50.308505764357456], + [22.518450148211603, 49.47677358661974], + [22.776418898212626, 49.02739533140962], + [22.558137648211755, 49.085738023467144], + [21.607808058364213, 49.47010732685409], + [20.887955356538413, 49.32877228453583], + [20.415839471119853, 49.43145335549977], + [19.825022820726872, 49.21712535256923], + [19.320712517990472, 49.571574001659194], + [18.90957482267632, 49.435845852244576], + [18.853144158613617, 49.49622976337764], + [18.392913852622172, 49.98862864847075], + [17.64944502123899, 50.049038397819956], + [17.55456709155112, 50.36214590107642], + [16.86876915860566, 50.47397370055603], + [16.719475945714436, 50.21574656839354], + [16.176253289462267, 50.42260732685791], + [16.23862674323857, 50.69773265237984], + [15.490972120839729, 50.78472992614321], + [15.01699588385867, 51.10667409932158], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Portugal", + "sov_a3": "PRT", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Portugal", + "adm0_a3": "PRT", + "geou_dif": 0, + "geounit": "Portugal", + "gu_a3": "PRT", + "su_dif": 1, + "subunit": "Portugal", + "su_a3": "PR1", + "brk_diff": 0, + "name": "Portugal", + "name_long": "Portugal", + "brk_a3": "PR1", + "brk_name": "Portugal", + "brk_group": null, + "abbrev": "Port.", + "postal": "P", + "formal_en": "Portuguese Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Portugal", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 7, + "mapcolor9": 1, + "mapcolor13": 4, + "pop_est": 10707924, + "gdp_md_est": 208627, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": 0, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "PT", + "iso_a3": "PRT", + "iso_n3": "620", + "un_a3": "620", + "wb_a2": "PT", + "wb_a3": "PRT", + "woe_id": -99, + "adm0_a3_is": "PRT", + "adm0_a3_us": "PRT", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 8, + "long_len": 8, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-9.034817674180246, 41.880570583659676], + [-8.67194576662672, 42.13468943945496], + [-8.263856980817792, 42.28046865495034], + [-8.013174607769912, 41.790886135417125], + [-7.422512986673795, 41.79207469335984], + [-7.251308966490824, 41.91834605566505], + [-6.668605515967656, 41.883386949219584], + [-6.389087693700915, 41.381815497394655], + [-6.851126674822552, 41.11108266861753], + [-6.864019944679385, 40.33087189387483], + [-7.026413133156595, 40.184524237624245], + [-7.066591559263529, 39.711891587882775], + [-7.498632371439726, 39.62957103124181], + [-7.098036668313128, 39.03007274022379], + [-7.374092169616318, 38.37305858006492], + [-7.029281175148796, 38.07576406508977], + [-7.166507941099865, 37.803894354802225], + [-7.537105475281024, 37.42890432387624], + [-7.453725551778092, 37.09778758396607], + [-7.855613165711986, 36.83826854099627], + [-8.382816127953689, 36.97888011326246], + [-8.898856980820327, 36.86880931248078], + [-8.746101446965554, 37.65134552667661], + [-8.83999752443988, 38.266243394517616], + [-9.287463751655224, 38.3584858261586], + [-9.526570603869715, 38.73742910415491], + [-9.446988898140233, 39.39206614842837], + [-9.048305223008427, 39.75509308527877], + [-8.977353481471681, 40.15930613866581], + [-8.768684047877102, 40.76063894303019], + [-8.79085323733031, 41.18433401139126], + [-8.99078935386757, 41.54345937760364], + [-9.034817674180246, 41.880570583659676], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Romania", + "sov_a3": "ROU", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Romania", + "adm0_a3": "ROU", + "geou_dif": 0, + "geounit": "Romania", + "gu_a3": "ROU", + "su_dif": 0, + "subunit": "Romania", + "su_a3": "ROU", + "brk_diff": 0, + "name": "Romania", + "name_long": "Romania", + "brk_a3": "ROU", + "brk_name": "Romania", + "brk_group": null, + "abbrev": "Rom.", + "postal": "RO", + "formal_en": "Romania", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Romania", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 4, + "mapcolor9": 3, + "mapcolor13": 13, + "pop_est": 22215421, + "gdp_md_est": 271400, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "RO", + "iso_a3": "ROU", + "iso_n3": "642", + "un_a3": "642", + "wb_a2": "RO", + "wb_a3": "ROM", + "woe_id": -99, + "adm0_a3_is": "ROU", + "adm0_a3_us": "ROU", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.710531447040495, 47.88219391538941], + [23.142236362406805, 48.09634105080695], + [23.76095828623741, 47.985598456405455], + [24.40205610525038, 47.98187775328043], + [24.866317172960578, 47.737525743188314], + [25.20774336111299, 47.89105642352747], + [25.9459411964024, 47.987148749374214], + [26.19745039236693, 48.22088125263035], + [26.619336785597795, 48.22072622333347], + [26.924176059687568, 48.123264472030996], + [27.233872918412743, 47.82677094175638], + [27.551166212684848, 47.40511709247083], + [28.128030226359044, 46.810476386088254], + [28.160017937947714, 46.37156260841722], + [28.0544429867754, 45.944586086605625], + [28.233553501099042, 45.488283189468376], + [28.67977949393938, 45.304030870131704], + [29.149724969201653, 45.464925442072456], + [29.603289015427436, 45.293308010431126], + [29.62654340995877, 45.0353909368624], + [29.141611769331835, 44.820210272799045], + [28.8378577003202, 44.913873806328056], + [28.558081495891997, 43.70746165625813], + [27.970107049275075, 43.81246816667522], + [27.242399529740908, 44.175986029632405], + [26.065158725699746, 43.94349376075127], + [25.569271681426926, 43.68844472917472], + [24.100679152124172, 43.74105133724785], + [23.332302280376325, 43.897010809904714], + [22.944832391051847, 43.82378530534713], + [22.65714969248299, 44.23492300066128], + [22.4740084164406, 44.40922760678177], + [22.705725538837356, 44.57800283464702], + [22.459022251075936, 44.7025171982543], + [22.14508792490281, 44.47842234962059], + [21.56202273935361, 44.7689472519655], + [21.483526238702236, 45.18117015235778], + [20.874312778413355, 45.416375433934235], + [20.762174920339987, 45.73457306577144], + [20.220192498462836, 46.127468980486555], + [21.02195234547125, 46.3160879583519], + [21.626514926853872, 46.99423777931816], + [22.099767693782837, 47.6724392767167], + [22.710531447040495, 47.88219391538941], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Republic of Serbia", + "sov_a3": "SRB", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Republic of Serbia", + "adm0_a3": "SRB", + "geou_dif": 0, + "geounit": "Republic of Serbia", + "gu_a3": "SRB", + "su_dif": 0, + "subunit": "Republic of Serbia", + "su_a3": "SRB", + "brk_diff": 0, + "name": "Serbia", + "name_long": "Serbia", + "brk_a3": "SRB", + "brk_name": "Serbia", + "brk_group": null, + "abbrev": "Serb.", + "postal": "RS", + "formal_en": "Republic of Serbia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Serbia", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 3, + "mapcolor9": 2, + "mapcolor13": 10, + "pop_est": 7379339, + "gdp_md_est": 80340, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "RS", + "iso_a3": "SRB", + "iso_n3": "688", + "un_a3": "688", + "wb_a2": "YF", + "wb_a3": "SRB", + "woe_id": -99, + "adm0_a3_is": "SRB", + "adm0_a3_us": "SRB", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [20.87431277841341, 45.41637543393432], + [21.48352623870221, 45.18117015235788], + [21.562022739353722, 44.76894725196564], + [22.145087924902896, 44.47842234962059], + [22.459022251075965, 44.70251719825444], + [22.70572553883744, 44.57800283464701], + [22.474008416440654, 44.40922760678177], + [22.657149692483074, 44.234923000661354], + [22.410446404721597, 44.008063462900054], + [22.500156691180223, 43.642814439461006], + [22.986018507588483, 43.2111612005271], + [22.60480146657136, 42.898518785161116], + [22.436594679461393, 42.58032115332395], + [22.54501183440965, 42.46136200618804], + [22.38052575042468, 42.32025950781508], + [21.917080000000112, 42.30364], + [21.57663598940212, 42.24522439706186], + [21.54332, 42.3202500000001], + [21.66292, 42.43922], + [21.77505, 42.6827], + [21.63302, 42.67717], + [21.43866, 42.86255], + [21.27421, 42.90959], + [21.143395, 43.06868500000013], + [20.95651, 43.13094], + [20.81448, 43.27205], + [20.63508, 43.21671], + [20.49679, 42.88469], + [20.25758, 42.81275000000011], + [20.3398, 42.89852], + [19.95857, 43.10604], + [19.63, 43.21377997027054], + [19.48389, 43.35229], + [19.21852, 43.52384], + [19.454, 43.56810000000013], + [19.59976, 44.03847], + [19.11761, 44.42307000000011], + [19.36803, 44.863], + [19.00548, 44.86023], + [19.39047570158459, 45.236515611342384], + [19.072768995854176, 45.52151113543209], + [18.82982, 45.90888], + [19.59604454924164, 46.17172984474456], + [20.220192498462893, 46.12746898048658], + [20.762174920339987, 45.734573065771485], + [20.87431277841341, 45.41637543393432], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Russia", + "sov_a3": "RUS", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Russia", + "adm0_a3": "RUS", + "geou_dif": 0, + "geounit": "Russia", + "gu_a3": "RUS", + "su_dif": 0, + "subunit": "Russia", + "su_a3": "RUS", + "brk_diff": 0, + "name": "Russia", + "name_long": "Russian Federation", + "brk_a3": "RUS", + "brk_name": "Russia", + "brk_group": null, + "abbrev": "Rus.", + "postal": "RUS", + "formal_en": "Russian Federation", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Russian Federation", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 5, + "mapcolor9": 7, + "mapcolor13": 7, + "pop_est": 140041247, + "gdp_md_est": 2266000, + "pop_year": -99, + "lastcensus": 2010, + "gdp_year": -99, + "economy": "3. Emerging region: BRIC", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "RU", + "iso_a3": "RUS", + "iso_n3": "643", + "un_a3": "643", + "wb_a2": "RU", + "wb_a3": "RUS", + "woe_id": -99, + "adm0_a3_is": "RUS", + "adm0_a3_us": "RUS", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 18, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [143.64800744036287, 50.74760040954152], + [144.65414757708564, 48.976390692737596], + [143.17392785051723, 49.30655141865037], + [142.5586682476501, 47.861575018904915], + [143.53349246640406, 46.83672801369249], + [143.50527713437262, 46.13790761980948], + [142.74770063697392, 46.74076487892657], + [142.0920300640545, 45.96675527605879], + [141.90692508358504, 46.80592886004655], + [142.0184428244709, 47.780132961612935], + [141.90444461483506, 48.85918854429957], + [142.13580000220568, 49.61516307229746], + [142.1799833518153, 50.95234243428192], + [141.59407596249005, 51.93543488220254], + [141.68254601457366, 53.30196645772878], + [142.60693403541077, 53.762145087287905], + [142.2097489768154, 54.22547597921687], + [142.654786411713, 54.36588084575388], + [142.91461551327657, 53.70457754171474], + [143.26084760963207, 52.74076040303905], + [143.23526777564766, 51.75666026468875], + [143.64800744036287, 50.74760040954152], + ] + ], + [ + [ + [22.731098667092652, 54.327536932993326], + [20.892244500418656, 54.312524929412575], + [19.660640089606403, 54.426083889373984], + [19.888481479581344, 54.8661603867715], + [21.2684489275035, 55.19048167583529], + [22.315723504330606, 55.0152985703659], + [22.757763706155288, 54.85657440858142], + [22.651051873472568, 54.58274099386671], + [22.731098667092652, 54.327536932993326], + ] + ], + [ + [ + [-175.01425, 66.58435], + [-174.33983, 66.33556], + [-174.57182, 67.06219], + [-171.85731, 66.91308], + [-169.89958, 65.97724], + [-170.89107, 65.54139], + [-172.53025, 65.43791], + [-172.555, 64.46079], + [-172.95533, 64.25269], + [-173.89184, 64.2826], + [-174.65392, 64.63125], + [-175.98353, 64.92288], + [-176.20716, 65.35667], + [-177.22266, 65.52024], + [-178.35993, 65.39052], + [-178.90332, 65.74044], + [-178.68611, 66.11211], + [-179.88377, 65.87456], + [-179.43268, 65.40411], + [-180, 64.97970870219837], + [-180, 68.96363636363637], + [-177.55, 68.2], + [-174.92825, 67.20589], + [-175.01425, 66.58435], + ] + ], + [ + [ + [180.00000000000014, 70.83219920854668], + [178.9034250000001, 70.78114], + [178.7253, 71.0988], + [180.00000000000014, 71.51571433642826], + [180.00000000000014, 70.83219920854668], + ] + ], + [ + [ + [-178.69378, 70.89302], + [-180, 70.83219920854668], + [-180, 71.51571433642826], + [-179.87187, 71.55762], + [-179.02433, 71.55553], + [-177.577945, 71.26948], + [-177.663575, 71.13277], + [-178.69378, 70.89302], + ] + ], + [ + [ + [143.60385, 73.21244], + [142.08763, 73.20544], + [140.038155, 73.31692], + [139.86312, 73.36983], + [140.81171, 73.76506], + [142.06207, 73.85758], + [143.48283, 73.47525], + [143.60385, 73.21244], + ] + ], + [ + [ + [150.73167, 75.08406], + [149.575925, 74.68892], + [147.97746, 74.778355], + [146.11919, 75.17298], + [146.358485, 75.49682], + [148.22223, 75.345845], + [150.73167, 75.08406], + ] + ], + [ + [ + [145.086285, 75.56262], + [144.3, 74.82], + [140.61381, 74.84768], + [138.95544, 74.61148], + [136.97439, 75.26167], + [137.51176, 75.94917], + [138.831075, 76.13676], + [141.47161, 76.09289], + [145.086285, 75.56262], + ] + ], + [ + [ + [57.5356925799924, 70.72046397570216], + [56.94497928246395, 70.63274323188668], + [53.6773751157842, 70.76265778266847], + [53.41201663596539, 71.2066616889202], + [51.60189456564572, 71.47475901965049], + [51.45575361512422, 72.01488108996514], + [52.47827518088357, 72.22944163684096], + [52.444168735570855, 72.77473135038485], + [54.42761355979766, 73.62754751249759], + [53.50828982932515, 73.74981395130015], + [55.90245893740766, 74.62748647734534], + [55.631932814359715, 75.08141225859717], + [57.86864383324885, 75.60939036732321], + [61.170044386647504, 76.25188345000814], + [64.49836836127022, 76.43905548776928], + [66.2109770038551, 76.80978221303124], + [68.15705976753483, 76.93969676381292], + [68.85221113472514, 76.54481130645462], + [68.18057254422766, 76.23364166940911], + [64.63732628770302, 75.73775462513623], + [61.58350752141476, 75.2608845079468], + [58.47708214705338, 74.30905630156283], + [56.98678551618801, 73.33304352486624], + [55.419335971910954, 72.37126760526598], + [55.622837762276305, 71.54059479439033], + [57.5356925799924, 70.72046397570216], + ] + ], + [ + [ + [106.97013000000013, 76.97419], + [107.24000000000015, 76.48], + [108.1538, 76.72335000000015], + [111.07726000000017, 76.71], + [113.33151, 76.22224], + [114.13417, 75.84764], + [113.88539, 75.32779000000014], + [112.77918, 75.03186], + [110.1512500000002, 74.47673], + [109.4, 74.18], + [110.64, 74.04], + [112.11919, 73.78774000000013], + [113.01954000000026, 73.97693000000015], + [113.52958000000032, 73.33505000000011], + [113.96881, 73.5948800000001], + [115.56782, 73.75285], + [118.77633000000023, 73.58772], + [119.02, 73.12], + [123.20066000000011, 72.97122], + [123.25777000000019, 73.73503000000011], + [125.3800000000002, 73.56], + [126.97644, 73.56549], + [128.59126, 73.03871], + [129.05157, 72.39872], + [128.46000000000012, 71.98], + [129.71599000000023, 71.19304], + [131.28858000000028, 70.78699000000012], + [132.25350000000017, 71.83630000000011], + [133.85766000000032, 71.38642000000016], + [135.56193, 71.65525000000014], + [137.49755, 71.34763], + [138.23409000000018, 71.62803], + [139.86983000000012, 71.48783000000014], + [139.14791, 72.41619000000011], + [140.46817, 72.84941000000015], + [149.5, 72.2], + [150.3511800000002, 71.60643], + [152.96890000000022, 70.84222], + [157.00688, 71.03141], + [158.99779, 70.86672], + [159.83031000000025, 70.45324], + [159.70866, 69.72198], + [160.94053000000034, 69.4372800000001], + [162.27907000000013, 69.64204], + [164.05248000000014, 69.66823], + [165.94037000000023, 69.47199], + [167.83567, 69.58269], + [169.5776300000002, 68.6938], + [170.81688000000028, 69.01363], + [170.0082000000002, 69.65276], + [170.4534500000003, 70.09703], + [173.64391000000026, 69.81743], + [175.72403000000023, 69.87725000000023], + [178.6, 69.4], + [180.00000000000014, 68.96363636363657], + [180.00000000000014, 64.97970870219848], + [179.99281, 64.97433], + [178.70720000000026, 64.53493], + [177.41128000000018, 64.60821], + [178.31300000000024, 64.07593], + [178.9082500000002, 63.25197000000014], + [179.37034, 62.98262000000011], + [179.48636, 62.56894], + [179.22825000000014, 62.30410000000015], + [177.3643, 62.5219], + [174.56929000000022, 61.76915], + [173.68013, 61.65261], + [172.15, 60.95], + [170.6985000000001, 60.33618], + [170.3308500000003, 59.88177], + [168.90046, 60.57355], + [166.29498000000032, 59.788550000000214], + [165.84000000000023, 60.16], + [164.87674, 59.7316], + [163.53929000000014, 59.86871], + [163.21711000000025, 59.21101], + [162.0173300000001, 58.24328], + [162.05297, 57.83912], + [163.19191, 57.615030000000104], + [163.05794000000017, 56.159240000000125], + [162.12958000000023, 56.12219], + [161.70146, 55.285680000000156], + [162.11749000000017, 54.85514], + [160.36877000000035, 54.34433], + [160.02173000000025, 53.20257], + [158.5309400000002, 52.95868000000024], + [158.23118, 51.94269], + [156.7897900000003, 51.01105], + [156.42000000000016, 51.7], + [155.99182, 53.15895], + [155.43366000000012, 55.38103000000012], + [155.91442000000032, 56.767920000000146], + [156.75815, 57.3647], + [156.8103500000001, 57.83204], + [158.3643300000002, 58.05575], + [160.15064000000015, 59.314770000000124], + [161.87204, 60.34300000000013], + [163.66969, 61.1409000000001], + [164.47355000000013, 62.55061], + [163.2584200000002, 62.46627], + [162.65791, 61.6425], + [160.1214800000001, 60.54423], + [159.30232, 61.7739600000001], + [156.7206800000001, 61.43442], + [154.21806000000035, 59.758180000000124], + [155.04375, 59.14495], + [152.81185, 58.88385], + [151.26573000000027, 58.78089], + [151.33815000000013, 59.50396], + [149.78371, 59.65573000000015], + [148.54481, 59.16448], + [145.48722, 59.33637], + [142.19782000000018, 59.03998], + [138.95848000000032, 57.08805], + [135.12619, 54.72959], + [136.70171, 54.603550000000126], + [137.19342, 53.97732], + [138.1647, 53.755010000000254], + [138.80463, 54.25455000000011], + [139.90151, 54.18968000000018], + [141.34531, 53.08957000000012], + [141.37923, 52.23877], + [140.5974200000002, 51.2396700000001], + [140.51308, 50.04553000000013], + [140.06193000000022, 48.44671000000017], + [138.55472000000023, 46.99965], + [138.21971, 46.30795], + [136.86232, 45.14350000000019], + [135.5153500000002, 43.989], + [134.86939000000027, 43.39821], + [133.53687000000028, 42.81147], + [132.90627000000015, 42.7984900000001], + [132.27807000000027, 43.28456000000011], + [130.93587000000016, 42.55274], + [130.78, 42.2200000000002], + [130.64000000000019, 42.395], + [130.63386640840983, 42.90301463477056], + [131.144687941615, 42.92998973242695], + [131.28855512911562, 44.111519680348266], + [131.02519000000026, 44.96796], + [131.8834542176596, 45.32116160743652], + [133.09712000000022, 45.14409], + [133.7696439963132, 46.116926988299156], + [134.1123500000002, 47.21248000000014], + [134.50081, 47.578450000000146], + [135.0263114767868, 48.47822988544391], + [133.37359581922803, 48.18344167743484], + [132.50669000000013, 47.78896], + [130.98726000000013, 47.79013], + [130.58229332898267, 48.729687404976204], + [129.3978178244205, 49.440600084015614], + [127.65740000000037, 49.76027], + [127.28745568248493, 50.73979726826545], + [126.93915652883786, 51.35389415140591], + [126.564399041857, 51.7842554795327], + [125.94634891164648, 52.79279857035695], + [125.06821129771046, 53.16104482686893], + [123.57147, 53.4588], + [122.24574791879306, 53.431725979213695], + [121.00308475147037, 53.25140106873124], + [120.1770886577169, 52.75388621684121], + [120.725789015792, 52.51622630473091], + [120.7382, 51.96411], + [120.18208000000018, 51.64355], + [119.27939, 50.58292], + [119.28846072802585, 50.14288279886196], + [117.8792444194265, 49.51098338479704], + [116.67880089728621, 49.888531399121405], + [115.48569542853144, 49.80517731383475], + [114.9621098165504, 50.14024730081513], + [114.36245649623535, 50.248302720737485], + [112.89773969935439, 49.54356537535699], + [111.58123091028668, 49.37796824807768], + [110.66201053267886, 49.13012807880585], + [109.40244917199672, 49.29296051695769], + [108.47516727095129, 49.28254771585071], + [107.86817589725112, 49.793705145865886], + [106.88880415245532, 50.27429596618029], + [105.8865914245869, 50.406019192092174], + [104.62158, 50.275320000000164], + [103.67654544476036, 50.089966132195144], + [102.25589000000011, 50.51056000000011], + [102.06521, 51.259910000000104], + [100.88948042196265, 51.51685578063842], + [99.98173221232358, 51.63400625264396], + [98.8614905131005, 52.04736603454671], + [97.82573978067452, 51.01099518493325], + [98.23176150919173, 50.42240062112873], + [97.25976000000023, 49.72605], + [95.81402000000017, 49.97746000000012], + [94.81594933469879, 50.01343333597089], + [94.14756635943561, 50.48053660745717], + [93.10421, 50.49529], + [92.23471154171969, 50.80217072204175], + [90.71366743364078, 50.331811835321105], + [88.80556684769559, 49.47052073831247], + [87.75126427607685, 49.29719798440556], + [87.3599703307627, 49.21498078062916], + [86.82935672398966, 49.82667470966814], + [85.5412699726825, 49.69285858824816], + [85.11555952346211, 50.11730296487764], + [84.41637739455305, 50.311399644565824], + [83.93511478061893, 50.88924551045358], + [83.38300377801247, 51.069182847693895], + [81.94598554883996, 50.81219594990634], + [80.56844689323546, 51.38833649352844], + [80.03555952344172, 50.864750881547224], + [77.80091556184433, 53.40441498474755], + [76.52517947785478, 54.17700348572714], + [76.89110029491346, 54.49052440044193], + [74.38482000000013, 53.54685000000012], + [73.42567874542053, 53.489810289109755], + [73.50851606638437, 54.0356167669766], + [72.22415001820221, 54.37665538188679], + [71.1801310566095, 54.13328522400826], + [70.86526655465516, 55.169733588270105], + [69.0681669452729, 55.3852501491435], + [68.16910037625891, 54.97039175070438], + [65.6668700000001, 54.601250000000164], + [65.17853356309595, 54.35422781027208], + [61.43660000000014, 54.00625], + [60.97806644068325, 53.66499339457914], + [61.699986199800634, 52.97999644633427], + [60.73999311711455, 52.71998647725775], + [60.92726850774025, 52.44754832621501], + [59.967533807215574, 51.960420437215674], + [61.58800337102414, 51.272658799843185], + [61.33742435084102, 50.79907013610426], + [59.932807244715576, 50.842194118851836], + [59.64228234237058, 50.545442206415714], + [58.36332000000013, 51.06364], + [56.77798, 51.04355], + [55.71694000000011, 50.62171000000015], + [54.532878452376195, 51.02623973245937], + [52.32872358583106, 51.718652248738096], + [50.76664839051219, 51.692762356159875], + [48.70238162618105, 50.60512848571284], + [48.577841424357615, 49.874759629915644], + [47.549480421749394, 50.454698391311126], + [46.75159630716277, 49.35600576435374], + [47.0436715024766, 49.152038886097586], + [46.4664457537763, 48.39415233010493], + [47.31524000000016, 47.71585], + [48.05725, 47.74377], + [48.694733514201886, 47.0756281601779], + [48.593250000000154, 46.561040000000105], + [49.101160000000135, 46.399330000000106], + [48.64541000000011, 45.80629], + [47.67591, 45.64149000000012], + [46.68201, 44.6092000000001], + [47.59094, 43.66016000000013], + [47.49252, 42.98658], + [48.58437000000018, 41.80888], + [47.98728315612604, 41.4058192001944], + [47.81566572448466, 41.15141612402135], + [47.373315464066394, 41.21973236751114], + [46.686070591016716, 41.827137152669906], + [46.40495079934894, 41.86067515722743], + [45.7764, 42.09244000000024], + [45.470279168485916, 42.50278066667005], + [44.53762291848207, 42.711992702803684], + [43.93121000000011, 42.55496000000011], + [43.755990000000196, 42.74083], + [42.39440000000016, 43.2203], + [40.92219000000014, 43.38215000000014], + [40.07696495947985, 43.553104153002494], + [39.955008579271095, 43.434997666999294], + [38.68, 44.28], + [37.53912000000011, 44.65721], + [36.67546000000013, 45.24469], + [37.40317, 45.4045100000001], + [38.23295, 46.24087], + [37.67372, 46.63657], + [39.14767, 47.044750000000136], + [39.12120000000013, 47.26336], + [38.22353803889948, 47.10218984637598], + [38.25511233902981, 47.54640045835697], + [38.77057, 47.82562000000024], + [39.738277622238996, 47.89893707945208], + [39.89562000000015, 48.23241], + [39.67465, 48.783820000000134], + [40.08078901546949, 49.30742991799937], + [40.069040000000115, 49.60105], + [38.59498823421356, 49.92646190042373], + [38.010631137857075, 49.91566152607473], + [37.39345950699524, 50.38395335550368], + [36.626167840325394, 50.225590928745135], + [35.35611616388812, 50.57719737405915], + [35.37791, 50.77394], + [35.02218305841794, 51.2075723333715], + [34.22481570815441, 51.255993150428935], + [34.14197838719062, 51.566413479206204], + [34.391730584457235, 51.768881740925906], + [33.75269982273588, 52.33507457133166], + [32.71576053236717, 52.238465481162166], + [32.412058139787774, 52.28869497334978], + [32.15944000000022, 52.061250000000115], + [31.78597, 52.10168], + [31.54001834486226, 52.74205231384644], + [31.305200636527985, 53.07399587667331], + [31.49764, 53.16743000000014], + [32.304519484188376, 53.13272614197285], + [32.693643019346126, 53.35142080343215], + [32.405598585751164, 53.618045355842014], + [31.731272820774592, 53.79402944601202], + [31.791424187962406, 53.974638576872195], + [31.384472283663825, 54.15705638286238], + [30.75753380709878, 54.8117709417844], + [30.97183597181325, 55.081547756564134], + [30.87390913262007, 55.55097646750352], + [29.89629438652244, 55.7894632025305], + [29.37157189303079, 55.67009064393628], + [29.229513380660393, 55.91834422466641], + [28.17670942557794, 56.16912995057879], + [27.855282016722526, 56.75932648378438], + [27.770015903440992, 57.2442581244112], + [27.288184848751655, 57.47452830670392], + [27.71668582531578, 57.79189911562446], + [27.420150000000206, 58.72457000000014], + [28.131699253051863, 59.300825100331], + [27.98112, 59.47537], + [29.1177, 60.02805000000012], + [28.07, 60.50352000000015], + [30.211107212044652, 61.780027777749694], + [31.139991082491036, 62.35769277612445], + [31.516092156711267, 62.867687486412905], + [30.035872430142803, 63.552813625738565], + [30.44468468600374, 64.20445343693908], + [29.544429559047018, 64.94867157659056], + [30.21765, 65.80598], + [29.054588657352383, 66.94428620062203], + [29.977426385220696, 67.69829702419275], + [28.445943637818772, 68.364612942164], + [28.591929559043365, 69.0647769232867], + [29.39955, 69.15692000000018], + [31.10108000000011, 69.55811], + [32.13272000000026, 69.90595000000025], + [33.77547, 69.30142000000012], + [36.51396, 69.06342], + [40.292340000000166, 67.9324], + [41.05987000000013, 67.45713000000012], + [41.12595000000019, 66.79158000000012], + [40.01583, 66.26618000000013], + [38.38295, 65.9995300000001], + [33.918710000000175, 66.75961], + [33.18444, 66.63253], + [34.81477, 65.90015000000014], + [34.87857425307877, 65.4362128770482], + [34.94391000000016, 64.41437000000016], + [36.23129, 64.10945], + [37.01273000000012, 63.84983000000011], + [37.14197000000016, 64.33471], + [36.539579035089815, 64.76446], + [37.17604000000014, 65.14322000000013], + [39.59345, 64.52079000000018], + [40.43560000000011, 64.76446], + [39.76260000000016, 65.49682], + [42.0930900000001, 66.47623], + [43.01604000000012, 66.4185800000001], + [43.94975000000014, 66.06908], + [44.53226, 66.75634000000014], + [43.69839, 67.35245], + [44.18795000000014, 67.95051], + [43.45282, 68.57079], + [46.25000000000014, 68.25], + [46.82134000000016, 67.68997], + [45.55517, 67.56652], + [45.5620200000001, 67.0100500000002], + [46.34915000000015, 66.6676700000001], + [47.894160000000255, 66.88455000000016], + [48.13876, 67.52238], + [50.22766000000016, 67.99867000000015], + [53.71743000000018, 68.85738000000012], + [54.47171, 68.80815], + [53.48582000000013, 68.20131], + [54.72628, 68.09702], + [55.44268000000014, 68.43866], + [57.317020000000156, 68.46628], + [58.80200000000022, 68.88082], + [59.94142000000019, 68.2784400000001], + [61.07784000000018, 68.94069], + [60.03, 69.52], + [60.55, 69.85], + [63.50400000000016, 69.54739], + [64.888115, 69.23483500000015], + [68.51216000000014, 68.09233000000017], + [69.18068, 68.61563000000012], + [68.16444, 69.14436], + [68.13522, 69.35649], + [66.93008000000012, 69.45461000000012], + [67.25976, 69.92873], + [66.72492000000014, 70.70889000000014], + [66.69466, 71.02897000000024], + [68.54006000000012, 71.93450000000024], + [69.19636000000011, 72.84336000000016], + [69.94, 73.04000000000013], + [72.58754, 72.7762900000001], + [72.79603, 72.22006], + [71.8481100000001, 71.40898], + [72.47011, 71.09019], + [72.79188, 70.39114], + [72.56470000000022, 69.02085], + [73.66787, 68.4079], + [73.2387, 67.7404], + [71.28000000000011, 66.32000000000016], + [72.42301000000018, 66.17267000000018], + [72.82077, 66.53267], + [73.92099000000016, 66.78946000000013], + [74.1865100000002, 67.28429], + [75.052, 67.76047000000017], + [74.46926000000016, 68.32899], + [74.93584000000013, 68.98918], + [73.84236, 69.07146], + [73.60187000000022, 69.62763], + [74.3998, 70.63175], + [73.1011, 71.44717000000026], + [74.89082000000022, 72.12119], + [74.65926, 72.83227], + [75.15801000000019, 72.85497000000012], + [75.68351, 72.30056000000013], + [75.28898000000012, 71.33556], + [76.35911, 71.15287000000015], + [75.90313000000017, 71.87401], + [77.57665000000011, 72.26717], + [79.65202000000014, 72.32011], + [81.5, 71.75], + [80.61071000000013, 72.58285000000012], + [80.51109, 73.6482], + [82.25, 73.85000000000011], + [84.65526, 73.80591000000018], + [86.82230000000024, 73.93688], + [86.00956, 74.45967000000016], + [87.16682000000017, 75.11643], + [88.31571000000011, 75.14393], + [90.26, 75.64], + [92.90058, 75.77333], + [93.23421000000016, 76.0472], + [95.86000000000016, 76.1400000000001], + [96.67821, 75.91548], + [98.92254000000023, 76.44689], + [100.75967000000023, 76.43028], + [101.03532, 76.86189], + [101.99084000000013, 77.2875400000002], + [104.3516000000001, 77.69792], + [106.06664000000015, 77.37389], + [104.70500000000024, 77.1274], + [106.97013000000013, 76.97419], + ] + ], + [ + [ + [105.07547, 78.30689], + [99.43814, 77.921], + [101.2649, 79.23399], + [102.08635, 79.34641], + [102.837815, 79.28129], + [105.37243, 78.71334], + [105.07547, 78.30689], + ] + ], + [ + [ + [51.13618655783128, 80.54728017854094], + [49.79368452332071, 80.41542776154822], + [48.89441124857754, 80.3395667589437], + [48.754936557821765, 80.17546824820084], + [47.586119012244154, 80.01018117951534], + [46.502825962109654, 80.24724681265437], + [47.07245527526291, 80.55942414012947], + [44.846958042181114, 80.58980988231718], + [46.79913862487123, 80.77191762971364], + [48.318477410684665, 80.78400991486996], + [48.522806023966695, 80.51456899690015], + [49.09718956889091, 80.75398590770843], + [50.03976769389462, 80.91888540315182], + [51.52293297710369, 80.69972565380192], + [51.13618655783128, 80.54728017854094], + ] + ], + [ + [ + [99.93976, 78.88094], + [97.75794, 78.7562], + [94.97259, 79.044745], + [93.31288, 79.4265], + [92.5454, 80.14379], + [91.18107, 80.34146], + [93.77766, 81.0246], + [95.940895, 81.2504], + [97.88385, 80.746975], + [100.186655, 79.780135], + [99.93976, 78.88094], + ] + ], + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Slovakia", + "sov_a3": "SVK", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Slovakia", + "adm0_a3": "SVK", + "geou_dif": 0, + "geounit": "Slovakia", + "gu_a3": "SVK", + "su_dif": 0, + "subunit": "Slovakia", + "su_a3": "SVK", + "brk_diff": 0, + "name": "Slovakia", + "name_long": "Slovakia", + "brk_a3": "SVK", + "brk_name": "Slovakia", + "brk_group": null, + "abbrev": "Svk.", + "postal": "SK", + "formal_en": "Slovak Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Slovak Republic", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 4, + "mapcolor9": 4, + "mapcolor13": 9, + "pop_est": 5463046, + "gdp_md_est": 119500, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "SK", + "iso_a3": "SVK", + "iso_n3": "703", + "un_a3": "703", + "wb_a2": "SK", + "wb_a3": "SVK", + "woe_id": -99, + "adm0_a3_is": "SVK", + "adm0_a3_us": "SVK", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 8, + "long_len": 8, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [18.853144158613617, 49.49622976337764], + [18.90957482267632, 49.435845852244576], + [19.320712517990472, 49.571574001659194], + [19.825022820726872, 49.21712535256923], + [20.415839471119853, 49.43145335549977], + [20.887955356538413, 49.32877228453583], + [21.607808058364213, 49.47010732685409], + [22.558137648211755, 49.085738023467144], + [22.28084191253356, 48.82539215758067], + [22.085608351334855, 48.42226430927179], + [21.872236362401736, 48.31997081155002], + [20.801293979584926, 48.623854071642384], + [20.473562045989866, 48.562850043321816], + [20.239054396249347, 48.32756724709692], + [19.769470656013112, 48.202691148463614], + [19.661363559658497, 48.26661489520866], + [19.17436486173989, 48.11137889260387], + [18.77702477384767, 48.081768296900634], + [18.696512892336926, 47.880953681014404], + [17.857132602620027, 47.75842886005037], + [17.48847293464982, 47.867466132186216], + [16.979666782304037, 48.123497015976305], + [16.879982944413, 48.47001333270947], + [16.960288120194576, 48.5969823268506], + [17.101984897538898, 48.816968899117114], + [17.545006951577108, 48.80001902932537], + [17.88648481616181, 48.90347524677371], + [17.913511590250465, 48.996492824899086], + [18.104972771891852, 49.04398346617531], + [18.170498488037964, 49.271514797556435], + [18.399993523846177, 49.31500051533004], + [18.554971144289482, 49.495015367218784], + [18.853144158613617, 49.49622976337764], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Slovenia", + "sov_a3": "SVN", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Slovenia", + "adm0_a3": "SVN", + "geou_dif": 0, + "geounit": "Slovenia", + "gu_a3": "SVN", + "su_dif": 0, + "subunit": "Slovenia", + "su_a3": "SVN", + "brk_diff": 0, + "name": "Slovenia", + "name_long": "Slovenia", + "brk_a3": "SVN", + "brk_name": "Slovenia", + "brk_group": null, + "abbrev": "Slo.", + "postal": "SLO", + "formal_en": "Republic of Slovenia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Slovenia", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 3, + "mapcolor9": 2, + "mapcolor13": 12, + "pop_est": 2005692, + "gdp_md_est": 59340, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "SI", + "iso_a3": "SVN", + "iso_n3": "705", + "un_a3": "705", + "wb_a2": "SI", + "wb_a3": "SVN", + "woe_id": -99, + "adm0_a3_is": "SVN", + "adm0_a3_us": "SVN", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 8, + "long_len": 8, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [13.806475457421527, 46.509306138691215], + [14.63247155117483, 46.43181732846955], + [15.137091912504985, 46.65870270444703], + [16.011663852612656, 46.6836107448117], + [16.202298211337364, 46.85238597267696], + [16.370504998447416, 46.841327216166505], + [16.564808383864857, 46.50375092221983], + [15.768732944408553, 46.23810822202345], + [15.671529575267556, 45.83415355079788], + [15.323953891672405, 45.73178253842768], + [15.327674594797429, 45.45231639259323], + [14.935243767972935, 45.471695054702685], + [14.595109490627806, 45.634940904312714], + [14.411968214585414, 45.46616567644746], + [13.715059848697223, 45.500323798192376], + [13.937630242578308, 45.59101593686462], + [13.698109978905478, 46.01677806251735], + [13.806475457421527, 46.509306138691215], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Sweden", + "sov_a3": "SWE", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Sweden", + "adm0_a3": "SWE", + "geou_dif": 0, + "geounit": "Sweden", + "gu_a3": "SWE", + "su_dif": 0, + "subunit": "Sweden", + "su_a3": "SWE", + "brk_diff": 0, + "name": "Sweden", + "name_long": "Sweden", + "brk_a3": "SWE", + "brk_name": "Sweden", + "brk_group": null, + "abbrev": "Swe.", + "postal": "S", + "formal_en": "Kingdom of Sweden", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Sweden", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 4, + "mapcolor9": 2, + "mapcolor13": 4, + "pop_est": 9059651, + "gdp_md_est": 344300, + "pop_year": -99, + "lastcensus": -99, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "SE", + "iso_a3": "SWE", + "iso_n3": "752", + "un_a3": "752", + "wb_a2": "SE", + "wb_a3": "SWE", + "woe_id": -99, + "adm0_a3_is": "SWE", + "adm0_a3_us": "SWE", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [22.18317345550193, 65.72374054632017], + [21.21351687997722, 65.02600535751527], + [21.369631381930958, 64.41358795842429], + [19.77887576669022, 63.60955434839504], + [17.84777916837521, 62.74940013289681], + [17.119554884518124, 61.34116567651097], + [17.83134606290639, 60.63658336042741], + [18.78772179533209, 60.081914374422595], + [17.86922488777634, 58.9537661810587], + [16.829185011470088, 58.71982697207339], + [16.447709588291474, 57.041118069071885], + [15.879785597403783, 56.10430186626866], + [14.666681349352075, 56.200885118222175], + [14.100721062891465, 55.40778107362265], + [12.942910597392057, 55.36173737245058], + [12.625100538797028, 56.30708018658197], + [11.787942335668674, 57.44181712506307], + [11.027368605196868, 58.85614940045936], + [11.468271925511146, 59.43239329694604], + [12.3003658382749, 60.11793284773003], + [12.631146681375185, 61.293571682370136], + [11.992064243221563, 61.80036245385655], + [11.930569288794231, 63.12831757267698], + [12.579935336973934, 64.06621898055833], + [13.571916131248713, 64.04911408146971], + [13.919905226302204, 64.44542064071608], + [13.55568973150909, 64.78702769638151], + [15.108411492583002, 66.19386688909547], + [16.108712192456778, 67.30245555283689], + [16.768878614985482, 68.0139366726314], + [17.729181756265348, 68.01055186631628], + [17.993868442464333, 68.56739126247736], + [19.878559604581255, 68.40719432237258], + [20.025268995857886, 69.0651386583127], + [20.645592889089528, 69.10624726020087], + [21.978534783626117, 68.6168456081807], + [23.53947309743444, 67.93600861273525], + [23.565879754335583, 66.39605093043743], + [23.903378533633802, 66.00692739527962], + [22.18317345550193, 65.72374054632017], + ] + ], + }, + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Ukraine", + "sov_a3": "UKR", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Ukraine", + "adm0_a3": "UKR", + "geou_dif": 0, + "geounit": "Ukraine", + "gu_a3": "UKR", + "su_dif": 0, + "subunit": "Ukraine", + "su_a3": "UKR", + "brk_diff": 0, + "name": "Ukraine", + "name_long": "Ukraine", + "brk_a3": "UKR", + "brk_name": "Ukraine", + "brk_group": null, + "abbrev": "Ukr.", + "postal": "UA", + "formal_en": "Ukraine", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Ukraine", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 1, + "mapcolor9": 6, + "mapcolor13": 3, + "pop_est": 45700395, + "gdp_md_est": 339800, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "4. Lower middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "UA", + "iso_a3": "UKR", + "iso_n3": "804", + "un_a3": "804", + "wb_a2": "UA", + "wb_a3": "UKR", + "woe_id": -99, + "adm0_a3_is": "UKR", + "adm0_a3_us": "UKR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1, + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [31.785998162571587, 52.101677964885454], + [32.15941206231267, 52.06126699483322], + [32.41205813978763, 52.28869497334975], + [32.71576053236697, 52.23846548116205], + [33.75269982273571, 52.335074571331695], + [34.39173058445701, 51.76888174092579], + [34.14197838719039, 51.56641347920623], + [34.22481570815427, 51.25599315042896], + [35.02218305841788, 51.20757233337146], + [35.37792361831512, 50.77395539001035], + [35.35611616388795, 50.57719737405906], + [36.62616784032534, 50.225590928745135], + [37.39345950699507, 50.38395335550359], + [38.010631137856905, 49.91566152607463], + [38.59498823421342, 49.92646190042363], + [40.06905846533911, 49.6010554062817], + [40.08078901546935, 49.307429917999286], + [39.67466393408753, 48.78381846780188], + [39.89563235856758, 48.23240509703143], + [39.738277622238826, 47.89893707945199], + [38.7705847511412, 47.825608222029814], + [38.25511233902975, 47.546400458356814], + [38.22353803889942, 47.102189846375886], + [37.42513715998999, 47.022220567404204], + [36.75985477066439, 46.698700263040934], + [35.82368452326483, 46.64596446388707], + [34.96234174982388, 46.27319651954964], + [35.020787794745985, 45.65121898048466], + [35.51000857925317, 45.40999339454619], + [36.52999799983016, 45.46998973243706], + [36.33471276219916, 45.113215643893966], + [35.23999922052812, 44.939996242851606], + [33.882511020652885, 44.36147858334407], + [33.326420932760044, 44.56487702084489], + [33.54692426934946, 45.03477081967489], + [32.4541744321055, 45.32746613217608], + [32.630804477679135, 45.51918569597891], + [33.58816206231839, 45.85156850848024], + [33.29856733575471, 46.080598456397844], + [31.74414025241518, 46.333347886737386], + [31.675307244602408, 46.70624502215554], + [30.7487488136091, 46.583100084004], + [30.377608676888883, 46.03241018328567], + [29.603289015427436, 45.293308010431126], + [29.149724969201653, 45.464925442072456], + [28.67977949393938, 45.304030870131704], + [28.233553501099042, 45.488283189468376], + [28.485269402792767, 45.5969070501459], + [28.65998742037158, 45.93998688413164], + [28.933717482221624, 46.2588304713725], + [28.862972446414062, 46.43788930926383], + [29.07210696789929, 46.517677720722496], + [29.170653924279886, 46.3792623968287], + [29.759971958136394, 46.34998769793536], + [30.024658644335375, 46.42393667254504], + [29.838210076626297, 46.52532583270169], + [29.908851759569302, 46.67436066343146], + [29.559674106573112, 46.928582872091326], + [29.415135125452736, 47.34664520933258], + [29.05086795422733, 47.5102269557525], + [29.12269819511303, 47.849095160506465], + [28.670891147585166, 48.1181485052341], + [28.259546746541844, 48.15556224221342], + [27.522537469195157, 48.467119452501116], + [26.857823520624805, 48.368210761094495], + [26.619336785597795, 48.22072622333347], + [26.19745039236693, 48.22088125263035], + [25.9459411964024, 47.987148749374214], + [25.20774336111299, 47.89105642352747], + [24.866317172960578, 47.737525743188314], + [24.40205610525038, 47.98187775328043], + [23.76095828623741, 47.985598456405455], + [23.142236362406805, 48.09634105080695], + [22.710531447040495, 47.88219391538941], + [22.640819939878753, 48.15023956968736], + [22.085608351334855, 48.42226430927179], + [22.28084191253356, 48.82539215758067], + [22.558137648211755, 49.085738023467144], + [22.776418898212626, 49.02739533140962], + [22.518450148211603, 49.47677358661974], + [23.426508416444392, 50.308505764357456], + [23.922757195743262, 50.42488108987875], + [24.029985792748903, 50.70540660257518], + [23.527070753684374, 51.57845408793024], + [24.00507775238421, 51.61744395609446], + [24.553106316839518, 51.888461005249184], + [25.32778771332701, 51.91065603291855], + [26.337958611768556, 51.83228872334793], + [27.454066196408434, 51.59230337178447], + [28.24161502453657, 51.57222707783907], + [28.61761274589225, 51.42771393493484], + [28.992835320763533, 51.602044379271476], + [29.254938185347925, 51.368234361366895], + [30.157363722460897, 51.41613841410147], + [30.555117221811457, 51.31950348571566], + [30.619454380014844, 51.822806098022376], + [30.927549269338982, 52.04235342061439], + [31.785998162571587, 52.101677964885454], + ] + ], + }, + }, + ], +} diff --git a/components/outputs/map-ipyleaflet/europe_110.geo.json b/components/outputs/map-ipyleaflet/europe_110.geo.json new file mode 100644 index 00000000..d60f8d49 --- /dev/null +++ b/components/outputs/map-ipyleaflet/europe_110.geo.json @@ -0,0 +1,10952 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Albania", + "sov_a3": "ALB", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Albania", + "adm0_a3": "ALB", + "geou_dif": 0, + "geounit": "Albania", + "gu_a3": "ALB", + "su_dif": 0, + "subunit": "Albania", + "su_a3": "ALB", + "brk_diff": 0, + "name": "Albania", + "name_long": "Albania", + "brk_a3": "ALB", + "brk_name": "Albania", + "brk_group": null, + "abbrev": "Alb.", + "postal": "AL", + "formal_en": "Republic of Albania", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Albania", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 4, + "mapcolor9": 1, + "mapcolor13": 6, + "pop_est": 3639453, + "gdp_md_est": 21810, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "4. Lower middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "AL", + "iso_a3": "ALB", + "iso_n3": "008", + "un_a3": "008", + "wb_a2": "AL", + "wb_a3": "ALB", + "woe_id": -99, + "adm0_a3_is": "ALB", + "adm0_a3_us": "ALB", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 20.59024743010491, + 41.855404161133606 + ], + [ + 20.463175083099202, + 41.51508901627534 + ], + [ + 20.605181919037364, + 41.086226304685226 + ], + [ + 21.0200403174764, + 40.84272695572588 + ], + [ + 20.999989861747224, + 40.58000397395398 + ], + [ + 20.674996779063633, + 40.43499990494303 + ], + [ + 20.615000441172754, + 40.11000682225938 + ], + [ + 20.15001590341052, + 39.62499766698397 + ], + [ + 19.980000441170148, + 39.69499339452341 + ], + [ + 19.960001661873207, + 39.91500580500605 + ], + [ + 19.406081984136733, + 40.250773423822466 + ], + [ + 19.319058872157143, + 40.72723012955356 + ], + [ + 19.40354983895429, + 41.40956574153546 + ], + [ + 19.540027296637106, + 41.71998607031276 + ], + [ + 19.37176883309496, + 41.877547512370654 + ], + [ + 19.304486118250793, + 42.19574514420782 + ], + [ + 19.73805138517963, + 42.68824738216557 + ], + [ + 19.801613396898688, + 42.50009349219084 + ], + [ + 20.0707, + 42.58863 + ], + [ + 20.283754510181893, + 42.32025950781508 + ], + [ + 20.52295, + 42.21787 + ], + [ + 20.59024743010491, + 41.855404161133606 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Austria", + "sov_a3": "AUT", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Austria", + "adm0_a3": "AUT", + "geou_dif": 0, + "geounit": "Austria", + "gu_a3": "AUT", + "su_dif": 0, + "subunit": "Austria", + "su_a3": "AUT", + "brk_diff": 0, + "name": "Austria", + "name_long": "Austria", + "brk_a3": "AUT", + "brk_name": "Austria", + "brk_group": null, + "abbrev": "Aust.", + "postal": "A", + "formal_en": "Republic of Austria", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Austria", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 1, + "mapcolor9": 3, + "mapcolor13": 4, + "pop_est": 8210281, + "gdp_md_est": 329500, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "AT", + "iso_a3": "AUT", + "iso_n3": "040", + "un_a3": "040", + "wb_a2": "AT", + "wb_a3": "AUT", + "woe_id": -99, + "adm0_a3_is": "AUT", + "adm0_a3_us": "AUT", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 16.979666782304037, + 48.123497015976305 + ], + [ + 16.90375410326726, + 47.71486562762833 + ], + [ + 16.340584344150415, + 47.71290192320123 + ], + [ + 16.534267612380376, + 47.49617096616912 + ], + [ + 16.202298211337364, + 46.85238597267696 + ], + [ + 16.011663852612656, + 46.6836107448117 + ], + [ + 15.137091912504985, + 46.65870270444703 + ], + [ + 14.63247155117483, + 46.43181732846955 + ], + [ + 13.806475457421527, + 46.509306138691215 + ], + [ + 12.376485223040817, + 46.76755910906985 + ], + [ + 12.153088006243054, + 47.11539317482645 + ], + [ + 11.16482791509327, + 46.94157949481273 + ], + [ + 11.048555942436536, + 46.75135854754634 + ], + [ + 10.44270145024663, + 46.89354625099743 + ], + [ + 9.932448357796659, + 46.92072805438296 + ], + [ + 9.479969516649021, + 47.102809963563374 + ], + [ + 9.632931756232978, + 47.34760122332999 + ], + [ + 9.59422610844635, + 47.52505809182027 + ], + [ + 9.89606814946319, + 47.580196845075704 + ], + [ + 10.402083774465211, + 47.30248769793916 + ], + [ + 10.544504021861627, + 47.56639923765377 + ], + [ + 11.426414015354737, + 47.523766181012974 + ], + [ + 12.141357456112788, + 47.703083401065776 + ], + [ + 12.620759718484493, + 47.67238760028441 + ], + [ + 12.932626987365948, + 47.467645575544 + ], + [ + 13.02585127122049, + 47.63758352313583 + ], + [ + 12.884102817443903, + 48.28914581968792 + ], + [ + 13.243357374737, + 48.416114813829054 + ], + [ + 13.595945672264437, + 48.87717194273715 + ], + [ + 14.338897739324722, + 48.55530528420721 + ], + [ + 14.901447381254057, + 48.964401760445824 + ], + [ + 15.253415561593982, + 49.03907420510758 + ], + [ + 16.02964725105022, + 48.73389903420793 + ], + [ + 16.499282667718774, + 48.78580801044511 + ], + [ + 16.960288120194576, + 48.5969823268506 + ], + [ + 16.879982944413, + 48.47001333270947 + ], + [ + 16.979666782304037, + 48.123497015976305 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Bulgaria", + "sov_a3": "BGR", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Bulgaria", + "adm0_a3": "BGR", + "geou_dif": 0, + "geounit": "Bulgaria", + "gu_a3": "BGR", + "su_dif": 0, + "subunit": "Bulgaria", + "su_a3": "BGR", + "brk_diff": 0, + "name": "Bulgaria", + "name_long": "Bulgaria", + "brk_a3": "BGR", + "brk_name": "Bulgaria", + "brk_group": null, + "abbrev": "Bulg.", + "postal": "BG", + "formal_en": "Republic of Bulgaria", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Bulgaria", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 5, + "mapcolor9": 1, + "mapcolor13": 8, + "pop_est": 7204687, + "gdp_md_est": 93750, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "BG", + "iso_a3": "BGR", + "iso_n3": "100", + "un_a3": "100", + "wb_a2": "BG", + "wb_a3": "BGR", + "woe_id": -99, + "adm0_a3_is": "BGR", + "adm0_a3_us": "BGR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 8, + "long_len": 8, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 22.65714969248299, + 44.23492300066128 + ], + [ + 22.944832391051847, + 43.82378530534713 + ], + [ + 23.332302280376325, + 43.897010809904714 + ], + [ + 24.100679152124172, + 43.74105133724785 + ], + [ + 25.569271681426926, + 43.68844472917472 + ], + [ + 26.065158725699746, + 43.94349376075127 + ], + [ + 27.242399529740908, + 44.175986029632405 + ], + [ + 27.970107049275075, + 43.81246816667522 + ], + [ + 28.558081495891997, + 43.70746165625813 + ], + [ + 28.03909508638472, + 43.293171698574184 + ], + [ + 27.67389773937805, + 42.57789236100622 + ], + [ + 27.99672041190539, + 42.00735871028779 + ], + [ + 27.13573937349048, + 42.14148489030134 + ], + [ + 26.1170418637208, + 41.82690460872456 + ], + [ + 26.106138136507212, + 41.32889883072778 + ], + [ + 25.197201368925448, + 41.23448598893053 + ], + [ + 24.492644891058035, + 41.583896185872035 + ], + [ + 23.692073601992348, + 41.309080918943856 + ], + [ + 22.952377150166452, + 41.33799388281115 + ], + [ + 22.88137373219743, + 41.99929718685026 + ], + [ + 22.380525750424592, + 42.32025950781509 + ], + [ + 22.54501183440962, + 42.46136200618804 + ], + [ + 22.43659467946128, + 42.580321153323936 + ], + [ + 22.60480146657133, + 42.898518785161144 + ], + [ + 22.986018507588483, + 43.211161200526966 + ], + [ + 22.50015669118028, + 43.64281443946099 + ], + [ + 22.410446404721597, + 44.008063462899955 + ], + [ + 22.65714969248299, + 44.23492300066128 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Belgium", + "sov_a3": "BEL", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Belgium", + "adm0_a3": "BEL", + "geou_dif": 0, + "geounit": "Belgium", + "gu_a3": "BEL", + "su_dif": 0, + "subunit": "Belgium", + "su_a3": "BEL", + "brk_diff": 0, + "name": "Belgium", + "name_long": "Belgium", + "brk_a3": "BEL", + "brk_name": "Belgium", + "brk_group": null, + "abbrev": "Belg.", + "postal": "B", + "formal_en": "Kingdom of Belgium", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Belgium", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 2, + "mapcolor9": 1, + "mapcolor13": 8, + "pop_est": 10414336, + "gdp_md_est": 389300, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "BE", + "iso_a3": "BEL", + "iso_n3": "056", + "un_a3": "056", + "wb_a2": "BE", + "wb_a3": "BEL", + "woe_id": -99, + "adm0_a3_is": "BEL", + "adm0_a3_us": "BEL", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 3.314971144228537, + 51.345780951536085 + ], + [ + 4.047071160507528, + 51.26725861266857 + ], + [ + 4.973991326526914, + 51.47502370869813 + ], + [ + 5.606975945670001, + 51.03729848896978 + ], + [ + 6.15665815595878, + 50.80372101501058 + ], + [ + 6.043073357781111, + 50.128051662794235 + ], + [ + 5.782417433300907, + 50.09032786722122 + ], + [ + 5.674051954784829, + 49.529483547557504 + ], + [ + 4.79922163251581, + 49.985373033236385 + ], + [ + 4.286022983425084, + 49.907496649772554 + ], + [ + 3.588184441755686, + 50.37899241800358 + ], + [ + 3.123251580425801, + 50.780363267614575 + ], + [ + 2.658422071960274, + 50.796848049515745 + ], + [ + 2.513573032246143, + 51.14850617126183 + ], + [ + 3.314971144228537, + 51.345780951536085 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Bosnia and Herzegovina", + "sov_a3": "BIH", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Bosnia and Herzegovina", + "adm0_a3": "BIH", + "geou_dif": 0, + "geounit": "Bosnia and Herzegovina", + "gu_a3": "BIH", + "su_dif": 0, + "subunit": "Bosnia and Herzegovina", + "su_a3": "BIH", + "brk_diff": 0, + "name": "Bosnia and Herz.", + "name_long": "Bosnia and Herzegovina", + "brk_a3": "BIH", + "brk_name": "Bosnia and Herz.", + "brk_group": null, + "abbrev": "B.H.", + "postal": "BiH", + "formal_en": "Bosnia and Herzegovina", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Bosnia and Herzegovina", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 1, + "mapcolor9": 1, + "mapcolor13": 2, + "pop_est": 4613414, + "gdp_md_est": 29700, + "pop_year": -99, + "lastcensus": 1991, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "BA", + "iso_a3": "BIH", + "iso_n3": "070", + "un_a3": "070", + "wb_a2": "BA", + "wb_a3": "BIH", + "woe_id": -99, + "adm0_a3_is": "BIH", + "adm0_a3_us": "BIH", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 16, + "long_len": 22, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 19.00548628101012, + 44.86023366960916 + ], + [ + 19.36803, + 44.863 + ], + [ + 19.11761, + 44.42307000000011 + ], + [ + 19.59976, + 44.03847 + ], + [ + 19.454, + 43.56810000000013 + ], + [ + 19.21852, + 43.52384 + ], + [ + 19.03165, + 43.43253 + ], + [ + 18.70648, + 43.20011 + ], + [ + 18.56, + 42.65 + ], + [ + 17.674921502358984, + 43.02856252702361 + ], + [ + 17.297373488034452, + 43.44634064388737 + ], + [ + 16.91615644701733, + 43.66772247982567 + ], + [ + 16.456442905348865, + 44.04123973243128 + ], + [ + 16.23966027188453, + 44.35114329688571 + ], + [ + 15.750026075918981, + 44.818711656262565 + ], + [ + 15.959367303133376, + 45.23377676043094 + ], + [ + 16.318156772535872, + 45.00412669532591 + ], + [ + 16.534939406000206, + 45.21160757097772 + ], + [ + 17.002146030351014, + 45.23377676043094 + ], + [ + 17.861783481526402, + 45.067740383477144 + ], + [ + 18.553214145591653, + 45.08158966733146 + ], + [ + 19.00548628101012, + 44.86023366960916 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Belarus", + "sov_a3": "BLR", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Belarus", + "adm0_a3": "BLR", + "geou_dif": 0, + "geounit": "Belarus", + "gu_a3": "BLR", + "su_dif": 0, + "subunit": "Belarus", + "su_a3": "BLR", + "brk_diff": 0, + "name": "Belarus", + "name_long": "Belarus", + "brk_a3": "BLR", + "brk_name": "Belarus", + "brk_group": null, + "abbrev": "Bela.", + "postal": "BY", + "formal_en": "Republic of Belarus", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Belarus", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 1, + "mapcolor9": 5, + "mapcolor13": 11, + "pop_est": 9648533, + "gdp_md_est": 114100, + "pop_year": -99, + "lastcensus": 2009, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "BY", + "iso_a3": "BLR", + "iso_n3": "112", + "un_a3": "112", + "wb_a2": "BY", + "wb_a3": "BLR", + "woe_id": -99, + "adm0_a3_is": "BLR", + "adm0_a3_us": "BLR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 23.48412763844985, + 53.91249766704114 + ], + [ + 24.450683628037037, + 53.905702216194754 + ], + [ + 25.536353794056993, + 54.28242340760253 + ], + [ + 25.7684326514798, + 54.84696259217509 + ], + [ + 26.58827924979039, + 55.16717560487167 + ], + [ + 26.494331495883756, + 55.615106919977634 + ], + [ + 27.10245975109453, + 55.783313707087686 + ], + [ + 28.176709425577997, + 56.169129950578814 + ], + [ + 29.229513380660308, + 55.91834422466636 + ], + [ + 29.371571893030673, + 55.670090643936184 + ], + [ + 29.896294386522356, + 55.78946320253041 + ], + [ + 30.87390913262001, + 55.55097646750341 + ], + [ + 30.971835971813135, + 55.08154775656404 + ], + [ + 30.75753380709872, + 54.81177094178432 + ], + [ + 31.38447228366374, + 54.157056382862436 + ], + [ + 31.79142418796224, + 53.974638576872124 + ], + [ + 31.731272820774507, + 53.79402944601202 + ], + [ + 32.405598585751164, + 53.61804535584204 + ], + [ + 32.69364301934604, + 53.35142080343212 + ], + [ + 32.30451948418823, + 53.13272614197291 + ], + [ + 31.49764367038293, + 53.1674268662569 + ], + [ + 31.305200636528014, + 53.07399587667321 + ], + [ + 31.54001834486226, + 52.74205231384636 + ], + [ + 31.785998162571587, + 52.101677964885454 + ], + [ + 30.927549269338982, + 52.04235342061439 + ], + [ + 30.619454380014844, + 51.822806098022376 + ], + [ + 30.555117221811457, + 51.31950348571566 + ], + [ + 30.157363722460897, + 51.41613841410147 + ], + [ + 29.254938185347925, + 51.368234361366895 + ], + [ + 28.992835320763533, + 51.602044379271476 + ], + [ + 28.61761274589225, + 51.42771393493484 + ], + [ + 28.24161502453657, + 51.57222707783907 + ], + [ + 27.454066196408434, + 51.59230337178447 + ], + [ + 26.337958611768556, + 51.83228872334793 + ], + [ + 25.32778771332701, + 51.91065603291855 + ], + [ + 24.553106316839518, + 51.888461005249184 + ], + [ + 24.00507775238421, + 51.61744395609446 + ], + [ + 23.527070753684374, + 51.57845408793024 + ], + [ + 23.508002150168693, + 52.02364655212473 + ], + [ + 23.199493849386187, + 52.48697744405367 + ], + [ + 23.79919884613338, + 52.69109935160657 + ], + [ + 23.80493493011778, + 53.089731350306074 + ], + [ + 23.527535841575002, + 53.470121568406555 + ], + [ + 23.48412763844985, + 53.91249766704114 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Switzerland", + "sov_a3": "CHE", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Switzerland", + "adm0_a3": "CHE", + "geou_dif": 0, + "geounit": "Switzerland", + "gu_a3": "CHE", + "su_dif": 0, + "subunit": "Switzerland", + "su_a3": "CHE", + "brk_diff": 0, + "name": "Switzerland", + "name_long": "Switzerland", + "brk_a3": "CHE", + "brk_name": "Switzerland", + "brk_group": null, + "abbrev": "Switz.", + "postal": "CH", + "formal_en": "Swiss Confederation", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Switzerland", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 2, + "mapcolor9": 7, + "mapcolor13": 3, + "pop_est": 7604467, + "gdp_md_est": 316700, + "pop_year": -99, + "lastcensus": 2010, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "CH", + "iso_a3": "CHE", + "iso_n3": "756", + "un_a3": "756", + "wb_a2": "CH", + "wb_a3": "CHE", + "woe_id": -99, + "adm0_a3_is": "CHE", + "adm0_a3_us": "CHE", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 11, + "long_len": 11, + "abbrev_len": 6, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.59422610844635, + 47.52505809182027 + ], + [ + 9.632931756232978, + 47.34760122332999 + ], + [ + 9.479969516649021, + 47.102809963563374 + ], + [ + 9.932448357796659, + 46.92072805438296 + ], + [ + 10.44270145024663, + 46.89354625099743 + ], + [ + 10.363378126678612, + 46.48357127540986 + ], + [ + 9.922836541390382, + 46.31489940040919 + ], + [ + 9.182881707403055, + 46.44021474871698 + ], + [ + 8.966305779667806, + 46.03693187111119 + ], + [ + 8.489952426801324, + 46.005150865251686 + ], + [ + 8.31662967289438, + 46.16364248309086 + ], + [ + 7.755992058959833, + 45.82449005795931 + ], + [ + 7.273850945676656, + 45.776947740250776 + ], + [ + 6.843592970414505, + 45.99114655210061 + ], + [ + 6.500099724970426, + 46.42967275652944 + ], + [ + 6.022609490593538, + 46.27298981382047 + ], + [ + 6.037388950229001, + 46.725778713561866 + ], + [ + 6.768713820023606, + 47.2877082383037 + ], + [ + 6.736571079138059, + 47.541801255882845 + ], + [ + 7.192202182655507, + 47.44976552997102 + ], + [ + 7.466759067422231, + 47.62058197691181 + ], + [ + 8.317301466514152, + 47.61357982033626 + ], + [ + 8.522611932009767, + 47.83082754169129 + ], + [ + 9.59422610844635, + 47.52505809182027 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Czech Republic", + "sov_a3": "CZE", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Czech Republic", + "adm0_a3": "CZE", + "geou_dif": 0, + "geounit": "Czech Republic", + "gu_a3": "CZE", + "su_dif": 0, + "subunit": "Czech Republic", + "su_a3": "CZE", + "brk_diff": 0, + "name": "Czech Rep.", + "name_long": "Czech Republic", + "brk_a3": "CZE", + "brk_name": "Czech Rep.", + "brk_group": null, + "abbrev": "Cz. Rep.", + "postal": "CZ", + "formal_en": "Czech Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Czech Republic", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 1, + "mapcolor9": 2, + "mapcolor13": 6, + "pop_est": 10211904, + "gdp_md_est": 265200, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "CZ", + "iso_a3": "CZE", + "iso_n3": "203", + "un_a3": "203", + "wb_a2": "CZ", + "wb_a3": "CZE", + "woe_id": -99, + "adm0_a3_is": "CZE", + "adm0_a3_us": "CZE", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 10, + "long_len": 14, + "abbrev_len": 8, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 16.960288120194576, + 48.5969823268506 + ], + [ + 16.499282667718774, + 48.78580801044511 + ], + [ + 16.02964725105022, + 48.73389903420793 + ], + [ + 15.253415561593982, + 49.03907420510758 + ], + [ + 14.901447381254057, + 48.964401760445824 + ], + [ + 14.338897739324722, + 48.55530528420721 + ], + [ + 13.595945672264437, + 48.87717194273715 + ], + [ + 13.031328973043431, + 49.30706818297324 + ], + [ + 12.521024204161193, + 49.547415269562734 + ], + [ + 12.415190870827445, + 49.96912079528057 + ], + [ + 12.240111118222558, + 50.266337795607285 + ], + [ + 12.966836785543194, + 50.484076443069085 + ], + [ + 13.338131951560285, + 50.73323436136435 + ], + [ + 14.056227654688172, + 50.9269176295943 + ], + [ + 14.307013380600637, + 51.117267767941414 + ], + [ + 14.570718214586066, + 51.002339382524276 + ], + [ + 15.01699588385867, + 51.10667409932158 + ], + [ + 15.490972120839729, + 50.78472992614321 + ], + [ + 16.23862674323857, + 50.69773265237984 + ], + [ + 16.176253289462267, + 50.42260732685791 + ], + [ + 16.719475945714436, + 50.21574656839354 + ], + [ + 16.86876915860566, + 50.47397370055603 + ], + [ + 17.55456709155112, + 50.36214590107642 + ], + [ + 17.64944502123899, + 50.049038397819956 + ], + [ + 18.392913852622172, + 49.98862864847075 + ], + [ + 18.853144158613617, + 49.49622976337764 + ], + [ + 18.554971144289482, + 49.495015367218784 + ], + [ + 18.399993523846177, + 49.31500051533004 + ], + [ + 18.170498488037964, + 49.271514797556435 + ], + [ + 18.104972771891852, + 49.04398346617531 + ], + [ + 17.913511590250465, + 48.996492824899086 + ], + [ + 17.88648481616181, + 48.90347524677371 + ], + [ + 17.545006951577108, + 48.80001902932537 + ], + [ + 17.101984897538898, + 48.816968899117114 + ], + [ + 16.960288120194576, + 48.5969823268506 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Germany", + "sov_a3": "DEU", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Germany", + "adm0_a3": "DEU", + "geou_dif": 0, + "geounit": "Germany", + "gu_a3": "DEU", + "su_dif": 0, + "subunit": "Germany", + "su_a3": "DEU", + "brk_diff": 0, + "name": "Germany", + "name_long": "Germany", + "brk_a3": "DEU", + "brk_name": "Germany", + "brk_group": null, + "abbrev": "Ger.", + "postal": "D", + "formal_en": "Federal Republic of Germany", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Germany", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 5, + "mapcolor9": 5, + "mapcolor13": 1, + "pop_est": 82329758, + "gdp_md_est": 2918000, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "1. Developed region: G7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "DE", + "iso_a3": "DEU", + "iso_n3": "276", + "un_a3": "276", + "wb_a2": "DE", + "wb_a3": "DEU", + "woe_id": -99, + "adm0_a3_is": "DEU", + "adm0_a3_us": "DEU", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 9.921906365609232, + 54.98310415304803 + ], + [ + 9.9395797054529, + 54.596641954153256 + ], + [ + 10.950112338920519, + 54.363607082733154 + ], + [ + 10.93946699386845, + 54.00869334575259 + ], + [ + 11.956252475643282, + 54.19648550070116 + ], + [ + 12.518440382546714, + 54.470370591847995 + ], + [ + 13.647467075259499, + 54.0755109727059 + ], + [ + 14.119686313542559, + 53.75702912049104 + ], + [ + 14.353315463934166, + 53.248171291713106 + ], + [ + 14.074521111719434, + 52.98126251892535 + ], + [ + 14.437599725002201, + 52.624850165408304 + ], + [ + 14.685026482815715, + 52.089947414755216 + ], + [ + 14.607098422919648, + 51.74518809671997 + ], + [ + 15.016995883858783, + 51.10667409932171 + ], + [ + 14.570718214586122, + 51.00233938252438 + ], + [ + 14.307013380600665, + 51.11726776794137 + ], + [ + 14.056227654688314, + 50.92691762959436 + ], + [ + 13.338131951560399, + 50.73323436136428 + ], + [ + 12.96683678554325, + 50.48407644306917 + ], + [ + 12.240111118222671, + 50.26633779560723 + ], + [ + 12.415190870827473, + 49.96912079528062 + ], + [ + 12.521024204161336, + 49.54741526956275 + ], + [ + 13.031328973043514, + 49.30706818297324 + ], + [ + 13.595945672264577, + 48.877171942737164 + ], + [ + 13.243357374737116, + 48.41611481382904 + ], + [ + 12.884102817443875, + 48.28914581968786 + ], + [ + 13.025851271220517, + 47.63758352313596 + ], + [ + 12.932626987366064, + 47.467645575544 + ], + [ + 12.620759718484521, + 47.672387600284424 + ], + [ + 12.141357456112871, + 47.70308340106578 + ], + [ + 11.426414015354851, + 47.52376618101306 + ], + [ + 10.544504021861599, + 47.5663992376538 + ], + [ + 10.402083774465325, + 47.30248769793917 + ], + [ + 9.89606814946319, + 47.580196845075704 + ], + [ + 9.594226108446378, + 47.5250580918202 + ], + [ + 8.522611932009795, + 47.83082754169135 + ], + [ + 8.317301466514095, + 47.61357982033627 + ], + [ + 7.466759067422288, + 47.62058197691192 + ], + [ + 7.593676385131062, + 48.33301911070373 + ], + [ + 8.099278598674857, + 49.01778351500343 + ], + [ + 6.65822960778371, + 49.20195831969164 + ], + [ + 6.186320428094177, + 49.463802802114515 + ], + [ + 6.242751092156993, + 49.90222565367873 + ], + [ + 6.043073357781111, + 50.128051662794235 + ], + [ + 6.15665815595878, + 50.80372101501058 + ], + [ + 5.988658074577813, + 51.851615709025054 + ], + [ + 6.589396599970826, + 51.852029120483394 + ], + [ + 6.842869500362383, + 52.22844025329755 + ], + [ + 7.092053256873896, + 53.144043280644894 + ], + [ + 6.905139601274129, + 53.48216217713065 + ], + [ + 7.100424838905269, + 53.69393219666267 + ], + [ + 7.936239454793963, + 53.74829580343379 + ], + [ + 8.121706170289485, + 53.52779246684429 + ], + [ + 8.800734490604668, + 54.020785630908904 + ], + [ + 8.57211795414537, + 54.39564647075406 + ], + [ + 8.526229282270208, + 54.96274363872516 + ], + [ + 9.282048780971138, + 54.83086538351631 + ], + [ + 9.921906365609232, + 54.98310415304803 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 4, + "sovereignt": "Denmark", + "sov_a3": "DN1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "Denmark", + "adm0_a3": "DNK", + "geou_dif": 0, + "geounit": "Denmark", + "gu_a3": "DNK", + "su_dif": 0, + "subunit": "Denmark", + "su_a3": "DNK", + "brk_diff": 0, + "name": "Denmark", + "name_long": "Denmark", + "brk_a3": "DNK", + "brk_name": "Denmark", + "brk_group": null, + "abbrev": "Den.", + "postal": "DK", + "formal_en": "Kingdom of Denmark", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Denmark", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 1, + "mapcolor9": 3, + "mapcolor13": 12, + "pop_est": 5500510, + "gdp_md_est": 203600, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "DK", + "iso_a3": "DNK", + "iso_n3": "208", + "un_a3": "208", + "wb_a2": "DK", + "wb_a3": "DNK", + "woe_id": -99, + "adm0_a3_is": "DNK", + "adm0_a3_us": "DNK", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 12.690006137755631, + 55.609990953180784 + ], + [ + 12.089991082414741, + 54.80001455343793 + ], + [ + 11.043543328504228, + 55.364863796604254 + ], + [ + 10.903913608451631, + 55.77995473898875 + ], + [ + 12.370904168353292, + 56.111407375708836 + ], + [ + 12.690006137755631, + 55.609990953180784 + ] + ] + ], + [ + [ + [ + 10.912181837618363, + 56.458621324277914 + ], + [ + 10.667803989309988, + 56.08138336854722 + ], + [ + 10.369992710011985, + 56.19000722922473 + ], + [ + 9.649984978889307, + 55.469999498102055 + ], + [ + 9.921906365609175, + 54.98310415304806 + ], + [ + 9.282048780971138, + 54.83086538351617 + ], + [ + 8.526229282270236, + 54.96274363872499 + ], + [ + 8.12031090661759, + 55.517722683323626 + ], + [ + 8.08997684086225, + 56.5400117051376 + ], + [ + 8.256581658571264, + 56.8099693874303 + ], + [ + 8.543437534223386, + 57.110002753316905 + ], + [ + 9.42446902836761, + 57.17206614849948 + ], + [ + 9.775558709358563, + 57.44794078228966 + ], + [ + 10.580005730846153, + 57.73001658795485 + ], + [ + 10.546105991262692, + 57.215732733786155 + ], + [ + 10.250000034230226, + 56.89001618105047 + ], + [ + 10.369992710011985, + 56.609981594460834 + ], + [ + 10.912181837618363, + 56.458621324277914 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Spain", + "sov_a3": "ESP", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Spain", + "adm0_a3": "ESP", + "geou_dif": 0, + "geounit": "Spain", + "gu_a3": "ESP", + "su_dif": 0, + "subunit": "Spain", + "su_a3": "ESP", + "brk_diff": 0, + "name": "Spain", + "name_long": "Spain", + "brk_a3": "ESP", + "brk_name": "Spain", + "brk_group": null, + "abbrev": "Sp.", + "postal": "E", + "formal_en": "Kingdom of Spain", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Spain", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 5, + "mapcolor9": 5, + "mapcolor13": 5, + "pop_est": 40525002, + "gdp_md_est": 1403000, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "ES", + "iso_a3": "ESP", + "iso_n3": "724", + "un_a3": "724", + "wb_a2": "ES", + "wb_a3": "ESP", + "woe_id": -99, + "adm0_a3_is": "ESP", + "adm0_a3_us": "ESP", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 5, + "long_len": 5, + "abbrev_len": 3, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -9.034817674180246, + 41.880570583659676 + ], + [ + -8.984433152695672, + 42.59277517350627 + ], + [ + -9.392883673530648, + 43.0266246608127 + ], + [ + -7.97818966310831, + 43.74833771420099 + ], + [ + -6.754491746436756, + 43.567909450853925 + ], + [ + -5.411886359061597, + 43.57423981380968 + ], + [ + -4.347842779955783, + 43.40344920508504 + ], + [ + -3.517531704106091, + 43.4559007838613 + ], + [ + -1.901351284177764, + 43.42280202897834 + ], + [ + -1.502770961910528, + 43.03401439063043 + ], + [ + 0.338046909190581, + 42.57954600683955 + ], + [ + 0.701590610363894, + 42.795734361332606 + ], + [ + 1.826793247087153, + 42.34338471126569 + ], + [ + 2.985998976258458, + 42.47301504166986 + ], + [ + 3.039484083680549, + 41.892120266276905 + ], + [ + 2.091841668312185, + 41.226088568683096 + ], + [ + 0.810524529635188, + 41.01473196060934 + ], + [ + 0.721331007499401, + 40.678318386389236 + ], + [ + 0.106691521819869, + 40.12393362076202 + ], + [ + -0.278711310212941, + 39.30997813573272 + ], + [ + 0.111290724293838, + 38.73851430923304 + ], + [ + -0.467123582349103, + 38.29236583104115 + ], + [ + -0.683389451490598, + 37.642353827457825 + ], + [ + -1.438382127274849, + 37.44306366632422 + ], + [ + -2.146452602538119, + 36.67414419203729 + ], + [ + -3.415780808923387, + 36.65889964451118 + ], + [ + -4.368900926114719, + 36.677839056946155 + ], + [ + -4.995219285492212, + 36.32470815687964 + ], + [ + -5.377159796561457, + 35.946850083961465 + ], + [ + -5.866432257500904, + 36.02981659600606 + ], + [ + -6.236693894872175, + 36.367677110330334 + ], + [ + -6.520190802425404, + 36.94291331638732 + ], + [ + -7.453725551778092, + 37.09778758396607 + ], + [ + -7.537105475281024, + 37.42890432387624 + ], + [ + -7.166507941099865, + 37.803894354802225 + ], + [ + -7.029281175148796, + 38.07576406508977 + ], + [ + -7.374092169616318, + 38.37305858006492 + ], + [ + -7.098036668313128, + 39.03007274022379 + ], + [ + -7.498632371439726, + 39.62957103124181 + ], + [ + -7.066591559263529, + 39.711891587882775 + ], + [ + -7.026413133156595, + 40.184524237624245 + ], + [ + -6.864019944679385, + 40.33087189387483 + ], + [ + -6.851126674822552, + 41.11108266861753 + ], + [ + -6.389087693700915, + 41.381815497394655 + ], + [ + -6.668605515967656, + 41.883386949219584 + ], + [ + -7.251308966490824, + 41.91834605566505 + ], + [ + -7.422512986673795, + 41.79207469335984 + ], + [ + -8.013174607769912, + 41.790886135417125 + ], + [ + -8.263856980817792, + 42.28046865495034 + ], + [ + -8.67194576662672, + 42.13468943945496 + ], + [ + -9.034817674180246, + 41.880570583659676 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Estonia", + "sov_a3": "EST", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Estonia", + "adm0_a3": "EST", + "geou_dif": 0, + "geounit": "Estonia", + "gu_a3": "EST", + "su_dif": 0, + "subunit": "Estonia", + "su_a3": "EST", + "brk_diff": 0, + "name": "Estonia", + "name_long": "Estonia", + "brk_a3": "EST", + "brk_name": "Estonia", + "brk_group": null, + "abbrev": "Est.", + "postal": "EST", + "formal_en": "Republic of Estonia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Estonia", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 2, + "mapcolor9": 1, + "mapcolor13": 10, + "pop_est": 1299371, + "gdp_md_est": 27410, + "pop_year": -99, + "lastcensus": 2000, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "EE", + "iso_a3": "EST", + "iso_n3": "233", + "un_a3": "233", + "wb_a2": "EE", + "wb_a3": "EST", + "woe_id": -99, + "adm0_a3_is": "EST", + "adm0_a3_us": "EST", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 24.312862583114622, + 57.79342357037697 + ], + [ + 24.42892785004216, + 58.38341339785329 + ], + [ + 24.061198357853186, + 58.25737457949341 + ], + [ + 23.426560092876684, + 58.612753404364625 + ], + [ + 23.339795363058645, + 59.187240302153384 + ], + [ + 24.604214308376186, + 59.46585378685502 + ], + [ + 25.86418908051664, + 59.61109039981133 + ], + [ + 26.949135776484525, + 59.445803331125774 + ], + [ + 27.981114129353244, + 59.475388088612874 + ], + [ + 28.13169925305175, + 59.300825100330925 + ], + [ + 27.420166456824944, + 58.72458120384424 + ], + [ + 27.71668582531572, + 57.79189911562436 + ], + [ + 27.288184848751513, + 57.47452830670383 + ], + [ + 26.463532342237787, + 57.47638865826633 + ], + [ + 25.60280968598437, + 57.84752879498657 + ], + [ + 25.16459354014927, + 57.97015696881519 + ], + [ + 24.312862583114622, + 57.79342357037697 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Finland", + "sov_a3": "FI1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "Finland", + "adm0_a3": "FIN", + "geou_dif": 0, + "geounit": "Finland", + "gu_a3": "FIN", + "su_dif": 0, + "subunit": "Finland", + "su_a3": "FIN", + "brk_diff": 0, + "name": "Finland", + "name_long": "Finland", + "brk_a3": "FIN", + "brk_name": "Finland", + "brk_group": null, + "abbrev": "Fin.", + "postal": "FIN", + "formal_en": "Republic of Finland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Finland", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 1, + "mapcolor9": 4, + "mapcolor13": 6, + "pop_est": 5250275, + "gdp_md_est": 193500, + "pop_year": -99, + "lastcensus": 2010, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "FI", + "iso_a3": "FIN", + "iso_n3": "246", + "un_a3": "246", + "wb_a2": "FI", + "wb_a3": "FIN", + "woe_id": -99, + "adm0_a3_is": "FIN", + "adm0_a3_us": "FIN", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 28.591929559043194, + 69.06477692328666 + ], + [ + 28.445943637818658, + 68.36461294216404 + ], + [ + 29.97742638522061, + 67.69829702419266 + ], + [ + 29.054588657352326, + 66.94428620062193 + ], + [ + 30.21765, + 65.80598 + ], + [ + 29.54442955904699, + 64.94867157659048 + ], + [ + 30.44468468600371, + 64.20445343693909 + ], + [ + 30.035872430142717, + 63.55281362573855 + ], + [ + 31.516092156711125, + 62.86768748641289 + ], + [ + 31.139991082490894, + 62.35769277612441 + ], + [ + 30.21110721204445, + 61.780027777749694 + ], + [ + 28.069997592895277, + 60.50351654727584 + ], + [ + 26.255172967236973, + 60.4239606797625 + ], + [ + 24.496623976344523, + 60.05731639265166 + ], + [ + 22.869694858499457, + 59.846373196036225 + ], + [ + 22.290763787533592, + 60.39192129174154 + ], + [ + 21.322244093519316, + 60.720169989659524 + ], + [ + 21.544866163832694, + 61.70532949487179 + ], + [ + 21.05921105315369, + 62.60739329695874 + ], + [ + 21.536029493910803, + 63.18973501245587 + ], + [ + 22.442744174903993, + 63.81781037053129 + ], + [ + 24.730511508897536, + 64.90234365504084 + ], + [ + 25.398067661243942, + 65.11142650009374 + ], + [ + 25.294043003040404, + 65.53434642197045 + ], + [ + 23.903378533633802, + 66.00692739527962 + ], + [ + 23.565879754335583, + 66.39605093043743 + ], + [ + 23.53947309743444, + 67.93600861273525 + ], + [ + 21.978534783626117, + 68.6168456081807 + ], + [ + 20.645592889089528, + 69.10624726020087 + ], + [ + 21.244936150810673, + 69.37044302029308 + ], + [ + 22.356237827247412, + 68.84174144151491 + ], + [ + 23.66204959483076, + 68.89124746365054 + ], + [ + 24.735679152126725, + 68.64955678982146 + ], + [ + 25.689212680776365, + 69.09211375596904 + ], + [ + 26.179622023226244, + 69.82529897732614 + ], + [ + 27.732292107867863, + 70.16419302029625 + ], + [ + 29.015572950971972, + 69.76649119737799 + ], + [ + 28.591929559043194, + 69.06477692328666 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "France", + "sov_a3": "FR1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "France", + "adm0_a3": "FRA", + "geou_dif": 0, + "geounit": "France", + "gu_a3": "FRA", + "su_dif": 0, + "subunit": "France", + "su_a3": "FRA", + "brk_diff": 0, + "name": "France", + "name_long": "France", + "brk_a3": "FRA", + "brk_name": "France", + "brk_group": null, + "abbrev": "Fr.", + "postal": "F", + "formal_en": "French Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "France", + "name_alt": null, + "mapcolor7": 7, + "mapcolor8": 5, + "mapcolor9": 9, + "mapcolor13": 11, + "pop_est": 64057792, + "gdp_md_est": 2128000, + "pop_year": -99, + "lastcensus": -99, + "gdp_year": -99, + "economy": "1. Developed region: G7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "FR", + "iso_a3": "FRA", + "iso_n3": "250", + "un_a3": "250", + "wb_a2": "FR", + "wb_a3": "FRA", + "woe_id": -99, + "adm0_a3_is": "FRA", + "adm0_a3_us": "FRA", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 3, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + -52.55642473001839, + 2.504705308437053 + ], + [ + -52.93965715189498, + 2.124857692875622 + ], + [ + -53.418465135295264, + 2.053389187016037 + ], + [ + -53.554839240113495, + 2.334896551925965 + ], + [ + -53.778520677288896, + 2.376702785650053 + ], + [ + -54.08806250671728, + 2.105556545414629 + ], + [ + -54.52475419779975, + 2.311848863123785 + ], + [ + -54.27122962097579, + 2.738747870286943 + ], + [ + -54.18428402364475, + 3.194172268075235 + ], + [ + -54.01150387227682, + 3.622569891774859 + ], + [ + -54.399542202356514, + 4.212611395683481 + ], + [ + -54.47863298197922, + 4.896755682795643 + ], + [ + -53.95804460307093, + 5.756548163267809 + ], + [ + -53.618452928264844, + 5.646529038918402 + ], + [ + -52.88214128275408, + 5.409850979021599 + ], + [ + -51.82334286152593, + 4.565768133966145 + ], + [ + -51.65779741067888, + 4.156232408053029 + ], + [ + -52.249337531123984, + 3.241094468596287 + ], + [ + -52.55642473001839, + 2.504705308437053 + ] + ] + ], + [ + [ + [ + 9.560016310269134, + 42.15249197037957 + ], + [ + 9.229752231491773, + 41.38000682226445 + ], + [ + 8.775723097375362, + 41.58361196549444 + ], + [ + 8.54421268070783, + 42.256516628583086 + ], + [ + 8.746009148807588, + 42.62812185319396 + ], + [ + 9.390000848028905, + 43.00998484961474 + ], + [ + 9.560016310269134, + 42.15249197037957 + ] + ] + ], + [ + [ + [ + 3.588184441755715, + 50.37899241800358 + ], + [ + 4.286022983425141, + 49.907496649772554 + ], + [ + 4.799221632515753, + 49.98537303323633 + ], + [ + 5.674051954784886, + 49.52948354755745 + ], + [ + 5.897759230176376, + 49.44266714130717 + ], + [ + 6.186320428094206, + 49.46380280211446 + ], + [ + 6.658229607783539, + 49.201958319691556 + ], + [ + 8.099278598674772, + 49.01778351500337 + ], + [ + 7.593676385131062, + 48.33301911070373 + ], + [ + 7.466759067422231, + 47.620581976911865 + ], + [ + 7.192202182655535, + 47.44976552997099 + ], + [ + 6.736571079138088, + 47.54180125588289 + ], + [ + 6.768713820023635, + 47.28770823830368 + ], + [ + 6.037388950228973, + 46.72577871356191 + ], + [ + 6.022609490593567, + 46.272989813820516 + ], + [ + 6.500099724970454, + 46.42967275652944 + ], + [ + 6.843592970414562, + 45.99114655210067 + ], + [ + 6.802355177445662, + 45.70857982032868 + ], + [ + 7.096652459347837, + 45.333098863295874 + ], + [ + 6.749955275101712, + 45.02851797136759 + ], + [ + 7.007562290076663, + 44.25476675066139 + ], + [ + 7.549596388386163, + 44.12790110938482 + ], + [ + 7.435184767291844, + 43.69384491634918 + ], + [ + 6.529245232783069, + 43.12889232031836 + ], + [ + 4.556962517931396, + 43.39965098731159 + ], + [ + 3.10041059735272, + 43.075200507167125 + ], + [ + 2.985998976258486, + 42.473015041669896 + ], + [ + 1.826793247087181, + 42.34338471126566 + ], + [ + 0.701590610363922, + 42.79573436133265 + ], + [ + 0.338046909190581, + 42.579546006839564 + ], + [ + -1.502770961910471, + 43.03401439063049 + ], + [ + -1.901351284177736, + 43.42280202897834 + ], + [ + -1.384225226232957, + 44.02261037859017 + ], + [ + -1.193797573237362, + 46.014917710954876 + ], + [ + -2.225724249673789, + 47.06436269793821 + ], + [ + -2.963276129559574, + 47.570326646507965 + ], + [ + -4.491554938159481, + 47.95495433205642 + ], + [ + -4.592349819344747, + 48.68416046812695 + ], + [ + -3.295813971357745, + 48.901692409859635 + ], + [ + -1.616510789384932, + 48.644421291694584 + ], + [ + -1.933494025063254, + 49.77634186461577 + ], + [ + -0.98946895995536, + 49.347375800160876 + ], + [ + 1.338761020522753, + 50.12717316344526 + ], + [ + 1.6390010921385, + 50.946606350297515 + ], + [ + 2.513573032246171, + 51.14850617126186 + ], + [ + 2.658422071960331, + 50.79684804951566 + ], + [ + 3.123251580425716, + 50.78036326761452 + ], + [ + 3.588184441755715, + 50.37899241800358 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "United Kingdom", + "sov_a3": "GB1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "United Kingdom", + "adm0_a3": "GBR", + "geou_dif": 0, + "geounit": "United Kingdom", + "gu_a3": "GBR", + "su_dif": 0, + "subunit": "United Kingdom", + "su_a3": "GBR", + "brk_diff": 0, + "name": "United Kingdom", + "name_long": "United Kingdom", + "brk_a3": "GBR", + "brk_name": "United Kingdom", + "brk_group": null, + "abbrev": "U.K.", + "postal": "GB", + "formal_en": "United Kingdom of Great Britain and Northern Ireland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "United Kingdom", + "name_alt": null, + "mapcolor7": 6, + "mapcolor8": 6, + "mapcolor9": 6, + "mapcolor13": 3, + "pop_est": 62262000, + "gdp_md_est": 1977704, + "pop_year": 0, + "lastcensus": 2011, + "gdp_year": 2009, + "economy": "1. Developed region: G7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "GB", + "iso_a3": "GBR", + "iso_n3": "826", + "un_a3": "826", + "wb_a2": "GB", + "wb_a3": "GBR", + "woe_id": -99, + "adm0_a3_is": "GBR", + "adm0_a3_us": "GBR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 14, + "long_len": 14, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + -5.661948614921897, + 54.55460317648385 + ], + [ + -6.197884894220977, + 53.86756500916334 + ], + [ + -6.953730231137996, + 54.073702297575636 + ], + [ + -7.572167934591079, + 54.05995636658599 + ], + [ + -7.366030646178785, + 54.595840969452695 + ], + [ + -7.572167934591079, + 55.1316222194549 + ], + [ + -6.733847011736145, + 55.1728600124238 + ], + [ + -5.661948614921897, + 54.55460317648385 + ] + ] + ], + [ + [ + [ + -3.005004848635281, + 58.63500010846633 + ], + [ + -4.073828497728016, + 57.55302480735526 + ], + [ + -3.055001796877661, + 57.69001902936094 + ], + [ + -1.959280564776918, + 57.68479970969952 + ], + [ + -2.219988165689301, + 56.87001740175353 + ], + [ + -3.119003058271119, + 55.973793036515474 + ], + [ + -2.085009324543023, + 55.90999848085127 + ], + [ + -2.005675679673857, + 55.80490285035023 + ], + [ + -1.11499101399221, + 54.624986477265395 + ], + [ + -0.4304849918542, + 54.46437612570216 + ], + [ + 0.184981316742039, + 53.32501414653103 + ], + [ + 0.469976840831777, + 52.92999949809197 + ], + [ + 1.681530795914739, + 52.739520168664 + ], + [ + 1.559987827164377, + 52.09999848083601 + ], + [ + 1.050561557630914, + 51.806760565795685 + ], + [ + 1.449865349950301, + 51.28942780212196 + ], + [ + 0.550333693045502, + 50.765738837275876 + ], + [ + -0.78751746255864, + 50.77498891865622 + ], + [ + -2.489997524414377, + 50.50001862243124 + ], + [ + -2.956273972984036, + 50.696879991247016 + ], + [ + -3.617448085942328, + 50.22835561787272 + ], + [ + -4.542507900399244, + 50.341837063185665 + ], + [ + -5.245023159191135, + 49.95999990498109 + ], + [ + -5.776566941745301, + 50.15967763935683 + ], + [ + -4.309989793301838, + 51.21000112568916 + ], + [ + -3.414850633142123, + 51.42600861266925 + ], + [ + -3.422719467108323, + 51.42684816740609 + ], + [ + -4.984367234710874, + 51.593466091510976 + ], + [ + -5.267295701508885, + 51.991400458374585 + ], + [ + -4.222346564134853, + 52.301355699261364 + ], + [ + -4.770013393564113, + 52.840004991255626 + ], + [ + -4.579999152026915, + 53.49500377055517 + ], + [ + -3.093830673788659, + 53.404547400669685 + ], + [ + -3.092079637047107, + 53.40444082296355 + ], + [ + -2.945008510744344, + 53.984999701546684 + ], + [ + -3.614700825433033, + 54.600936773292574 + ], + [ + -3.630005458989331, + 54.615012925833014 + ], + [ + -4.844169073903004, + 54.790971177786844 + ], + [ + -5.082526617849226, + 55.06160065369937 + ], + [ + -4.719112107756644, + 55.50847260194348 + ], + [ + -5.047980922862109, + 55.78398550070753 + ], + [ + -5.58639767091114, + 55.31114614523682 + ], + [ + -5.644998745130181, + 56.275014960344805 + ], + [ + -6.149980841486354, + 56.78500967063354 + ], + [ + -5.786824713555291, + 57.81884837506465 + ], + [ + -5.009998745127575, + 58.63001333275005 + ], + [ + -4.211494513353557, + 58.55084503847917 + ], + [ + -3.005004848635281, + 58.63500010846633 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Greece", + "sov_a3": "GRC", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Greece", + "adm0_a3": "GRC", + "geou_dif": 0, + "geounit": "Greece", + "gu_a3": "GRC", + "su_dif": 0, + "subunit": "Greece", + "su_a3": "GRC", + "brk_diff": 0, + "name": "Greece", + "name_long": "Greece", + "brk_a3": "GRC", + "brk_name": "Greece", + "brk_group": null, + "abbrev": "Greece", + "postal": "GR", + "formal_en": "Hellenic Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Greece", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 2, + "mapcolor9": 2, + "mapcolor13": 9, + "pop_est": 10737428, + "gdp_md_est": 343000, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "GR", + "iso_a3": "GRC", + "iso_n3": "300", + "un_a3": "300", + "wb_a2": "GR", + "wb_a3": "GRC", + "woe_id": -99, + "adm0_a3_is": "GRC", + "adm0_a3_us": "GRC", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 6, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 23.699980096133004, + 35.70500438083553 + ], + [ + 24.24666507334868, + 35.368022365860156 + ], + [ + 25.02501549652888, + 35.424995632461986 + ], + [ + 25.769207797964185, + 35.35401805270908 + ], + [ + 25.745023227651586, + 35.179997666966216 + ], + [ + 26.290002882601726, + 35.29999034274792 + ], + [ + 26.16499759288766, + 35.004995429009796 + ], + [ + 24.724982130642303, + 34.91998769788961 + ], + [ + 24.735007358506948, + 35.08499054619759 + ], + [ + 23.514978468528113, + 35.27999156345098 + ], + [ + 23.699980096133004, + 35.70500438083553 + ] + ] + ], + [ + [ + [ + 26.604195590936285, + 41.562114569661105 + ], + [ + 26.29460208507578, + 40.93626129817426 + ], + [ + 26.056942172965506, + 40.824123440100834 + ], + [ + 25.447677036244187, + 40.85254547786147 + ], + [ + 24.92584842296094, + 40.94706167252323 + ], + [ + 23.714811232200816, + 40.68712921809512 + ], + [ + 24.407998894964066, + 40.1249929876241 + ], + [ + 23.899967889102584, + 39.96200552017558 + ], + [ + 23.3429993018608, + 39.96099782974579 + ], + [ + 22.813987664488963, + 40.476005153966554 + ], + [ + 22.62629886240478, + 40.25656118423919 + ], + [ + 22.84974775563481, + 39.65931081802577 + ], + [ + 23.3500272966526, + 39.19001129816726 + ], + [ + 22.973099399515547, + 38.97090322524966 + ], + [ + 23.530016310324953, + 38.51000112563847 + ], + [ + 24.025024855248944, + 38.21999298761645 + ], + [ + 24.040011020613605, + 37.655014553369426 + ], + [ + 23.115002882589152, + 37.92001129816222 + ], + [ + 23.409971958111072, + 37.409990749657396 + ], + [ + 22.774971958108637, + 37.30501007745656 + ], + [ + 23.15422529469862, + 36.422505804992056 + ], + [ + 22.490028110451107, + 36.41000010837746 + ], + [ + 21.670026482843696, + 36.8449864771942 + ], + [ + 21.295010613701578, + 37.644989325504696 + ], + [ + 21.120034213961333, + 38.31032339126273 + ], + [ + 20.730032179454582, + 38.769985256498785 + ], + [ + 20.217712029712857, + 39.340234686839636 + ], + [ + 20.15001590341052, + 39.62499766698403 + ], + [ + 20.615000441172782, + 40.110006822259436 + ], + [ + 20.674996779063633, + 40.434999904943055 + ], + [ + 20.99998986174728, + 40.58000397395398 + ], + [ + 21.02004031747643, + 40.84272695572588 + ], + [ + 21.674160597426976, + 40.93127452245798 + ], + [ + 22.05537763844427, + 41.14986583105269 + ], + [ + 22.597308383889015, + 41.130487168943205 + ], + [ + 22.76177, + 41.3048 + ], + [ + 22.95237715016657, + 41.33799388281122 + ], + [ + 23.692073601992462, + 41.30908091894386 + ], + [ + 24.492644891058035, + 41.58389618587205 + ], + [ + 25.197201368925533, + 41.23448598893066 + ], + [ + 26.106138136507184, + 41.32889883072784 + ], + [ + 26.117041863720914, + 41.82690460872473 + ], + [ + 26.604195590936285, + 41.562114569661105 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Croatia", + "sov_a3": "HRV", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Croatia", + "adm0_a3": "HRV", + "geou_dif": 0, + "geounit": "Croatia", + "gu_a3": "HRV", + "su_dif": 0, + "subunit": "Croatia", + "su_a3": "HRV", + "brk_diff": 0, + "name": "Croatia", + "name_long": "Croatia", + "brk_a3": "HRV", + "brk_name": "Croatia", + "brk_group": null, + "abbrev": "Cro.", + "postal": "HR", + "formal_en": "Republic of Croatia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Croatia", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 4, + "mapcolor9": 5, + "mapcolor13": 1, + "pop_est": 4489409, + "gdp_md_est": 82390, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "2. High income: nonOECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "HR", + "iso_a3": "HRV", + "iso_n3": "191", + "un_a3": "191", + "wb_a2": "HR", + "wb_a3": "HRV", + "woe_id": -99, + "adm0_a3_is": "HRV", + "adm0_a3_us": "HRV", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 18.829838087650046, + 45.908877671891844 + ], + [ + 19.072768995854176, + 45.52151113543209 + ], + [ + 19.39047570158459, + 45.236515611342384 + ], + [ + 19.00548628101012, + 44.86023366960916 + ], + [ + 18.553214145591653, + 45.08158966733146 + ], + [ + 17.861783481526402, + 45.067740383477144 + ], + [ + 17.002146030351014, + 45.23377676043094 + ], + [ + 16.534939406000206, + 45.21160757097772 + ], + [ + 16.318156772535872, + 45.00412669532591 + ], + [ + 15.959367303133376, + 45.23377676043094 + ], + [ + 15.750026075918981, + 44.818711656262565 + ], + [ + 16.23966027188453, + 44.35114329688571 + ], + [ + 16.456442905348865, + 44.04123973243128 + ], + [ + 16.91615644701733, + 43.66772247982567 + ], + [ + 17.297373488034452, + 43.44634064388737 + ], + [ + 17.674921502358984, + 43.02856252702361 + ], + [ + 18.56, + 42.65 + ], + [ + 18.450016310304818, + 42.47999136002932 + ], + [ + 17.509970330483327, + 42.849994615239154 + ], + [ + 16.930005730871642, + 43.20999848080038 + ], + [ + 16.015384555737683, + 43.50721548112722 + ], + [ + 15.174453973052096, + 44.243191229827914 + ], + [ + 15.376250441151797, + 44.31791535092208 + ], + [ + 14.92030927904051, + 44.73848399512946 + ], + [ + 14.901602410550879, + 45.07606028907611 + ], + [ + 14.258747592839995, + 45.23377676043094 + ], + [ + 13.952254672917036, + 44.80212352149687 + ], + [ + 13.656975538801191, + 45.13693512631596 + ], + [ + 13.67940311041582, + 45.48414907488501 + ], + [ + 13.715059848697251, + 45.500323798192426 + ], + [ + 14.4119682145855, + 45.46616567644742 + ], + [ + 14.59510949062792, + 45.63494090431283 + ], + [ + 14.935243767972963, + 45.471695054702764 + ], + [ + 15.327674594797429, + 45.45231639259333 + ], + [ + 15.323953891672431, + 45.731782538427694 + ], + [ + 15.671529575267641, + 45.83415355079791 + ], + [ + 15.768732944408612, + 46.23810822202353 + ], + [ + 16.564808383864943, + 46.50375092221981 + ], + [ + 16.882515089595415, + 46.38063182228444 + ], + [ + 17.630066359129557, + 45.9517691106941 + ], + [ + 18.45606245288286, + 45.75948110613615 + ], + [ + 18.829838087650046, + 45.908877671891844 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Hungary", + "sov_a3": "HUN", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Hungary", + "adm0_a3": "HUN", + "geou_dif": 0, + "geounit": "Hungary", + "gu_a3": "HUN", + "su_dif": 0, + "subunit": "Hungary", + "su_a3": "HUN", + "brk_diff": 0, + "name": "Hungary", + "name_long": "Hungary", + "brk_a3": "HUN", + "brk_name": "Hungary", + "brk_group": null, + "abbrev": "Hun.", + "postal": "HU", + "formal_en": "Republic of Hungary", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Hungary", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 6, + "mapcolor9": 1, + "mapcolor13": 5, + "pop_est": 9905596, + "gdp_md_est": 196600, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "HU", + "iso_a3": "HUN", + "iso_n3": "348", + "un_a3": "348", + "wb_a2": "HU", + "wb_a3": "HUN", + "woe_id": -99, + "adm0_a3_is": "HUN", + "adm0_a3_us": "HUN", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 16.202298211337364, + 46.85238597267696 + ], + [ + 16.534267612380376, + 47.49617096616912 + ], + [ + 16.340584344150415, + 47.71290192320123 + ], + [ + 16.90375410326726, + 47.71486562762833 + ], + [ + 16.979666782304037, + 48.123497015976305 + ], + [ + 17.48847293464982, + 47.867466132186216 + ], + [ + 17.857132602620027, + 47.75842886005037 + ], + [ + 18.696512892336926, + 47.880953681014404 + ], + [ + 18.77702477384767, + 48.081768296900634 + ], + [ + 19.17436486173989, + 48.11137889260387 + ], + [ + 19.661363559658497, + 48.26661489520866 + ], + [ + 19.769470656013112, + 48.202691148463614 + ], + [ + 20.239054396249347, + 48.32756724709692 + ], + [ + 20.473562045989866, + 48.562850043321816 + ], + [ + 20.801293979584926, + 48.623854071642384 + ], + [ + 21.872236362401736, + 48.31997081155002 + ], + [ + 22.085608351334855, + 48.42226430927179 + ], + [ + 22.640819939878753, + 48.15023956968736 + ], + [ + 22.710531447040495, + 47.88219391538941 + ], + [ + 22.099767693782837, + 47.6724392767167 + ], + [ + 21.626514926853872, + 46.99423777931816 + ], + [ + 21.02195234547125, + 46.3160879583519 + ], + [ + 20.220192498462836, + 46.127468980486555 + ], + [ + 19.596044549241583, + 46.17172984474454 + ], + [ + 18.82983808764996, + 45.90887767189193 + ], + [ + 18.45606245288286, + 45.759481106136136 + ], + [ + 17.630066359129557, + 45.95176911069419 + ], + [ + 16.8825150895953, + 46.38063182228444 + ], + [ + 16.564808383864857, + 46.50375092221983 + ], + [ + 16.370504998447416, + 46.841327216166505 + ], + [ + 16.202298211337364, + 46.85238597267696 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Ireland", + "sov_a3": "IRL", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Ireland", + "adm0_a3": "IRL", + "geou_dif": 0, + "geounit": "Ireland", + "gu_a3": "IRL", + "su_dif": 0, + "subunit": "Ireland", + "su_a3": "IRL", + "brk_diff": 0, + "name": "Ireland", + "name_long": "Ireland", + "brk_a3": "IRL", + "brk_name": "Ireland", + "brk_group": null, + "abbrev": "Ire.", + "postal": "IRL", + "formal_en": "Ireland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Ireland", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 3, + "mapcolor9": 2, + "mapcolor13": 2, + "pop_est": 4203200, + "gdp_md_est": 188400, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "IE", + "iso_a3": "IRL", + "iso_n3": "372", + "un_a3": "372", + "wb_a2": "IE", + "wb_a3": "IRL", + "woe_id": -99, + "adm0_a3_is": "IRL", + "adm0_a3_us": "IRL", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -6.197884894220991, + 53.867565009163364 + ], + [ + -6.032985398777611, + 53.15316417094435 + ], + [ + -6.788856573910849, + 52.260117906292336 + ], + [ + -8.56161658368356, + 51.669301255899356 + ], + [ + -9.977085740590269, + 51.82045482035308 + ], + [ + -9.166282517930782, + 52.86462881124268 + ], + [ + -9.688524542672454, + 53.8813626165853 + ], + [ + -8.327987433292009, + 54.66451894796863 + ], + [ + -7.572167934591064, + 55.13162221945487 + ], + [ + -7.366030646178785, + 54.59584096945272 + ], + [ + -7.572167934591064, + 54.059956366586 + ], + [ + -6.953730231138067, + 54.073702297575636 + ], + [ + -6.197884894220991, + 53.867565009163364 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Iceland", + "sov_a3": "ISL", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Iceland", + "adm0_a3": "ISL", + "geou_dif": 0, + "geounit": "Iceland", + "gu_a3": "ISL", + "su_dif": 0, + "subunit": "Iceland", + "su_a3": "ISL", + "brk_diff": 0, + "name": "Iceland", + "name_long": "Iceland", + "brk_a3": "ISL", + "brk_name": "Iceland", + "brk_group": null, + "abbrev": "Iceland", + "postal": "IS", + "formal_en": "Republic of Iceland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Iceland", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 4, + "mapcolor9": 4, + "mapcolor13": 9, + "pop_est": 306694, + "gdp_md_est": 12710, + "pop_year": -99, + "lastcensus": -99, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "IS", + "iso_a3": "ISL", + "iso_n3": "352", + "un_a3": "352", + "wb_a2": "IS", + "wb_a3": "ISL", + "woe_id": -99, + "adm0_a3_is": "ISL", + "adm0_a3_us": "ISL", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 7, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -14.508695441129234, + 66.45589223903143 + ], + [ + -14.739637417041607, + 65.8087482774403 + ], + [ + -13.60973222497981, + 65.12667104761987 + ], + [ + -14.909833746794902, + 64.36408193628868 + ], + [ + -17.794438035543422, + 63.678749091233854 + ], + [ + -18.656245896874992, + 63.49638296167582 + ], + [ + -19.97275468594276, + 63.64363495549153 + ], + [ + -22.762971971110158, + 63.960178941495386 + ], + [ + -21.778484259517683, + 64.40211579045551 + ], + [ + -23.95504391121911, + 64.8911298692335 + ], + [ + -22.184402635170358, + 65.0849681667603 + ], + [ + -22.227423265053332, + 65.37859365504274 + ], + [ + -24.326184047939336, + 65.61118927678847 + ], + [ + -23.65051469572309, + 66.26251902939522 + ], + [ + -22.134922451250887, + 66.41046865504687 + ], + [ + -20.57628373867955, + 65.73211212835143 + ], + [ + -19.05684160000159, + 66.27660085719477 + ], + [ + -17.79862382655905, + 65.99385325790978 + ], + [ + -16.167818976292125, + 66.52679230413587 + ], + [ + -14.508695441129234, + 66.45589223903143 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Italy", + "sov_a3": "ITA", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Italy", + "adm0_a3": "ITA", + "geou_dif": 0, + "geounit": "Italy", + "gu_a3": "ITA", + "su_dif": 0, + "subunit": "Italy", + "su_a3": "ITA", + "brk_diff": 0, + "name": "Italy", + "name_long": "Italy", + "brk_a3": "ITA", + "brk_name": "Italy", + "brk_group": null, + "abbrev": "Italy", + "postal": "I", + "formal_en": "Italian Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Italy", + "name_alt": null, + "mapcolor7": 6, + "mapcolor8": 7, + "mapcolor9": 8, + "mapcolor13": 7, + "pop_est": 58126212, + "gdp_md_est": 1823000, + "pop_year": -99, + "lastcensus": 2012, + "gdp_year": -99, + "economy": "1. Developed region: G7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "IT", + "iso_a3": "ITA", + "iso_n3": "380", + "un_a3": "380", + "wb_a2": "IT", + "wb_a3": "ITA", + "woe_id": -99, + "adm0_a3_is": "ITA", + "adm0_a3_us": "ITA", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 5, + "long_len": 5, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 15.520376010813834, + 38.23115509699147 + ], + [ + 15.160242954171736, + 37.44404551853782 + ], + [ + 15.309897902089006, + 37.1342194687318 + ], + [ + 15.09998823411945, + 36.6199872909954 + ], + [ + 14.335228712632016, + 36.996630967754754 + ], + [ + 13.82673261887993, + 37.1045313583802 + ], + [ + 12.431003859108813, + 37.61294993748382 + ], + [ + 12.570943637755136, + 38.12638113051969 + ], + [ + 13.741156447004585, + 38.03496552179536 + ], + [ + 14.76124922044616, + 38.143873602850505 + ], + [ + 15.520376010813834, + 38.23115509699147 + ] + ] + ], + [ + [ + [ + 9.210011834356266, + 41.20999136002422 + ], + [ + 9.809975213264977, + 40.5000088567661 + ], + [ + 9.669518670295673, + 39.177376410471794 + ], + [ + 9.21481774255949, + 39.240473334300134 + ], + [ + 8.80693566247973, + 38.90661774347848 + ], + [ + 8.428302443077115, + 39.17184703221662 + ], + [ + 8.38825320805094, + 40.378310858718805 + ], + [ + 8.15999840661766, + 40.95000722916379 + ], + [ + 8.709990675500109, + 40.89998444270523 + ], + [ + 9.210011834356266, + 41.20999136002422 + ] + ] + ], + [ + [ + [ + 12.376485223040845, + 46.76755910906988 + ], + [ + 13.806475457421556, + 46.50930613869119 + ], + [ + 13.698109978905478, + 46.016778062517375 + ], + [ + 13.937630242578336, + 45.591015936864665 + ], + [ + 13.141606479554298, + 45.73669179949542 + ], + [ + 12.328581170306308, + 45.381778062514854 + ], + [ + 12.383874952858605, + 44.88537425391908 + ], + [ + 12.261453484759159, + 44.600482082694015 + ], + [ + 12.589237094786483, + 44.091365871754476 + ], + [ + 13.526905958722494, + 43.58772736263791 + ], + [ + 14.029820997787027, + 42.76100779883248 + ], + [ + 15.142569614327954, + 41.955139675456905 + ], + [ + 15.926191033601896, + 41.96131500911574 + ], + [ + 16.169897088290412, + 41.740294908203424 + ], + [ + 15.889345737377795, + 41.5410822617182 + ], + [ + 16.785001661860576, + 41.179605617836586 + ], + [ + 17.519168735431208, + 40.87714345963224 + ], + [ + 18.376687452882578, + 40.35562490494266 + ], + [ + 18.480247023195403, + 40.168866278639825 + ], + [ + 18.2933850440281, + 39.81077444107325 + ], + [ + 17.738380161213286, + 40.2776710068303 + ], + [ + 16.869595981522338, + 40.44223460546385 + ], + [ + 16.448743116937322, + 39.79540070246648 + ], + [ + 17.1714896989715, + 39.42469981542072 + ], + [ + 17.052840610429342, + 38.902871202137305 + ], + [ + 16.635088331781844, + 38.8435724960824 + ], + [ + 16.100960727613057, + 37.98589874933418 + ], + [ + 15.684086948314501, + 37.90884918878703 + ], + [ + 15.68796268073632, + 38.214592800441864 + ], + [ + 15.891981235424709, + 38.750942491199226 + ], + [ + 16.109332309644316, + 38.96454702407769 + ], + [ + 15.718813510814641, + 39.544072374014945 + ], + [ + 15.413612501698822, + 40.04835683853517 + ], + [ + 14.998495721098237, + 40.17294871679093 + ], + [ + 14.70326826341477, + 40.604550279292624 + ], + [ + 14.060671827865264, + 40.78634796809544 + ], + [ + 13.627985060285397, + 41.188287258461656 + ], + [ + 12.88808190273042, + 41.25308950455562 + ], + [ + 12.10668257004491, + 41.70453481705741 + ], + [ + 11.191906365614187, + 42.35542531998968 + ], + [ + 10.511947869517797, + 42.931462510747224 + ], + [ + 10.200028924204048, + 43.920006822274615 + ], + [ + 9.702488234097814, + 44.03627879493132 + ], + [ + 8.88894616052687, + 44.36633616797954 + ], + [ + 8.428560825238577, + 44.23122813575242 + ], + [ + 7.850766635783202, + 43.76714793555524 + ], + [ + 7.435184767291844, + 43.69384491634918 + ], + [ + 7.549596388386163, + 44.12790110938482 + ], + [ + 7.007562290076663, + 44.25476675066139 + ], + [ + 6.749955275101712, + 45.02851797136759 + ], + [ + 7.096652459347837, + 45.333098863295874 + ], + [ + 6.802355177445662, + 45.70857982032868 + ], + [ + 6.843592970414562, + 45.99114655210067 + ], + [ + 7.273850945676685, + 45.77694774025076 + ], + [ + 7.755992058959833, + 45.82449005795928 + ], + [ + 8.31662967289438, + 46.163642483090854 + ], + [ + 8.489952426801295, + 46.00515086525175 + ], + [ + 8.966305779667834, + 46.036931871111165 + ], + [ + 9.182881707403112, + 46.44021474871698 + ], + [ + 9.922836541390353, + 46.31489940040919 + ], + [ + 10.363378126678668, + 46.483571275409844 + ], + [ + 10.442701450246602, + 46.893546250997446 + ], + [ + 11.048555942436508, + 46.7513585475464 + ], + [ + 11.164827915093326, + 46.94157949481274 + ], + [ + 12.153088006243081, + 47.11539317482644 + ], + [ + 12.376485223040845, + 46.76755910906988 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Kosovo", + "sov_a3": "KOS", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Kosovo", + "adm0_a3": "KOS", + "geou_dif": 0, + "geounit": "Kosovo", + "gu_a3": "KOS", + "su_dif": 0, + "subunit": "Kosovo", + "su_a3": "KOS", + "brk_diff": 1, + "name": "Kosovo", + "name_long": "Kosovo", + "brk_a3": "B57", + "brk_name": "Kosovo", + "brk_group": null, + "abbrev": "Kos.", + "postal": "KO", + "formal_en": "Republic of Kosovo", + "formal_fr": null, + "note_adm0": null, + "note_brk": "Self admin.; Claimed by Serbia", + "name_sort": "Kosovo", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 2, + "mapcolor9": 3, + "mapcolor13": 11, + "pop_est": 1804838, + "gdp_md_est": 5352, + "pop_year": -99, + "lastcensus": 1981, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "4. Lower middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "-99", + "iso_a3": "-99", + "iso_n3": "-99", + "un_a3": "-099", + "wb_a2": "KV", + "wb_a3": "KSV", + "woe_id": -99, + "adm0_a3_is": "SRB", + "adm0_a3_us": "KOS", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 20.76216, + 42.05186 + ], + [ + 20.71731000000011, + 41.84711 + ], + [ + 20.59023, + 41.85541 + ], + [ + 20.52295, + 42.21787 + ], + [ + 20.28374, + 42.3202500000001 + ], + [ + 20.0707, + 42.58863 + ], + [ + 20.25758, + 42.81275000000011 + ], + [ + 20.49679, + 42.88469 + ], + [ + 20.63508, + 43.21671 + ], + [ + 20.81448, + 43.27205 + ], + [ + 20.95651, + 43.13094 + ], + [ + 21.143395, + 43.06868500000013 + ], + [ + 21.27421, + 42.90959 + ], + [ + 21.43866, + 42.86255 + ], + [ + 21.63302, + 42.67717 + ], + [ + 21.77505, + 42.6827 + ], + [ + 21.66292, + 42.43922 + ], + [ + 21.54332, + 42.3202500000001 + ], + [ + 21.57663598940212, + 42.24522439706186 + ], + [ + 21.35270000000014, + 42.2068 + ], + [ + 20.76216, + 42.05186 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Lithuania", + "sov_a3": "LTU", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Lithuania", + "adm0_a3": "LTU", + "geou_dif": 0, + "geounit": "Lithuania", + "gu_a3": "LTU", + "su_dif": 0, + "subunit": "Lithuania", + "su_a3": "LTU", + "brk_diff": 0, + "name": "Lithuania", + "name_long": "Lithuania", + "brk_a3": "LTU", + "brk_name": "Lithuania", + "brk_group": null, + "abbrev": "Lith.", + "postal": "LT", + "formal_en": "Republic of Lithuania", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Lithuania", + "name_alt": null, + "mapcolor7": 6, + "mapcolor8": 3, + "mapcolor9": 3, + "mapcolor13": 9, + "pop_est": 3555179, + "gdp_md_est": 63330, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "LT", + "iso_a3": "LTU", + "iso_n3": "440", + "un_a3": "440", + "wb_a2": "LT", + "wb_a3": "LTU", + "woe_id": -99, + "adm0_a3_is": "LTU", + "adm0_a3_us": "LTU", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 9, + "long_len": 9, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 22.731098667092652, + 54.327536932993326 + ], + [ + 22.65105187347254, + 54.582740993866736 + ], + [ + 22.75776370615526, + 54.85657440858138 + ], + [ + 22.315723504330577, + 55.015298570365864 + ], + [ + 21.268448927503467, + 55.190481675835315 + ], + [ + 21.055800408622417, + 56.031076361711065 + ], + [ + 22.201156853939494, + 56.33780182557949 + ], + [ + 23.878263787539964, + 56.27367137310527 + ], + [ + 24.86068444184076, + 56.37252838807963 + ], + [ + 25.000934279080894, + 56.16453074810484 + ], + [ + 25.533046502390334, + 56.100296942766036 + ], + [ + 26.494331495883756, + 55.615106919977634 + ], + [ + 26.58827924979039, + 55.16717560487167 + ], + [ + 25.7684326514798, + 54.84696259217509 + ], + [ + 25.536353794056993, + 54.28242340760253 + ], + [ + 24.450683628037037, + 53.905702216194754 + ], + [ + 23.48412763844985, + 53.91249766704114 + ], + [ + 23.24398725758951, + 54.22056671814914 + ], + [ + 22.731098667092652, + 54.327536932993326 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Luxembourg", + "sov_a3": "LUX", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Luxembourg", + "adm0_a3": "LUX", + "geou_dif": 0, + "geounit": "Luxembourg", + "gu_a3": "LUX", + "su_dif": 0, + "subunit": "Luxembourg", + "su_a3": "LUX", + "brk_diff": 0, + "name": "Luxembourg", + "name_long": "Luxembourg", + "brk_a3": "LUX", + "brk_name": "Luxembourg", + "brk_group": null, + "abbrev": "Lux.", + "postal": "L", + "formal_en": "Grand Duchy of Luxembourg", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Luxembourg", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 7, + "mapcolor9": 3, + "mapcolor13": 7, + "pop_est": 491775, + "gdp_md_est": 39370, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "LU", + "iso_a3": "LUX", + "iso_n3": "442", + "un_a3": "442", + "wb_a2": "LU", + "wb_a3": "LUX", + "woe_id": -99, + "adm0_a3_is": "LUX", + "adm0_a3_us": "LUX", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 10, + "long_len": 10, + "abbrev_len": 4, + "tiny": 5, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.043073357781111, + 50.128051662794235 + ], + [ + 6.242751092156993, + 49.90222565367873 + ], + [ + 6.186320428094177, + 49.463802802114515 + ], + [ + 5.897759230176405, + 49.44266714130703 + ], + [ + 5.674051954784829, + 49.529483547557504 + ], + [ + 5.782417433300907, + 50.09032786722122 + ], + [ + 6.043073357781111, + 50.128051662794235 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Latvia", + "sov_a3": "LVA", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Latvia", + "adm0_a3": "LVA", + "geou_dif": 0, + "geounit": "Latvia", + "gu_a3": "LVA", + "su_dif": 0, + "subunit": "Latvia", + "su_a3": "LVA", + "brk_diff": 0, + "name": "Latvia", + "name_long": "Latvia", + "brk_a3": "LVA", + "brk_name": "Latvia", + "brk_group": null, + "abbrev": "Lat.", + "postal": "LV", + "formal_en": "Republic of Latvia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Latvia", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 7, + "mapcolor9": 6, + "mapcolor13": 13, + "pop_est": 2231503, + "gdp_md_est": 38860, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "LV", + "iso_a3": "LVA", + "iso_n3": "428", + "un_a3": "428", + "wb_a2": "LV", + "wb_a3": "LVA", + "woe_id": -99, + "adm0_a3_is": "LVA", + "adm0_a3_us": "LVA", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 21.055800408622417, + 56.031076361711065 + ], + [ + 21.090423618257972, + 56.78387278912294 + ], + [ + 21.581866489353672, + 57.411870632549935 + ], + [ + 22.52434126149288, + 57.75337433535076 + ], + [ + 23.318452996522097, + 57.00623647727487 + ], + [ + 24.12072960785343, + 57.02569265403277 + ], + [ + 24.312862583114622, + 57.79342357037697 + ], + [ + 25.16459354014927, + 57.97015696881519 + ], + [ + 25.60280968598437, + 57.84752879498657 + ], + [ + 26.463532342237787, + 57.47638865826633 + ], + [ + 27.288184848751513, + 57.47452830670383 + ], + [ + 27.77001590344093, + 57.24425812441123 + ], + [ + 27.855282016722526, + 56.75932648378429 + ], + [ + 28.176709425577997, + 56.169129950578814 + ], + [ + 27.10245975109453, + 55.783313707087686 + ], + [ + 26.494331495883756, + 55.615106919977634 + ], + [ + 25.533046502390334, + 56.100296942766036 + ], + [ + 25.000934279080894, + 56.16453074810484 + ], + [ + 24.86068444184076, + 56.37252838807963 + ], + [ + 23.878263787539964, + 56.27367137310527 + ], + [ + 22.201156853939494, + 56.33780182557949 + ], + [ + 21.055800408622417, + 56.031076361711065 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Moldova", + "sov_a3": "MDA", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Moldova", + "adm0_a3": "MDA", + "geou_dif": 0, + "geounit": "Moldova", + "gu_a3": "MDA", + "su_dif": 0, + "subunit": "Moldova", + "su_a3": "MDA", + "brk_diff": 0, + "name": "Moldova", + "name_long": "Moldova", + "brk_a3": "MDA", + "brk_name": "Moldova", + "brk_group": null, + "abbrev": "Mda.", + "postal": "MD", + "formal_en": "Republic of Moldova", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Moldova", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 5, + "mapcolor9": 4, + "mapcolor13": 12, + "pop_est": 4320748, + "gdp_md_est": 10670, + "pop_year": -99, + "lastcensus": 2004, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "4. Lower middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "MD", + "iso_a3": "MDA", + "iso_n3": "498", + "un_a3": "498", + "wb_a2": "MD", + "wb_a3": "MDA", + "woe_id": -99, + "adm0_a3_is": "MDA", + "adm0_a3_us": "MDA", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 26.619336785597795, + 48.22072622333347 + ], + [ + 26.857823520624805, + 48.368210761094495 + ], + [ + 27.522537469195157, + 48.467119452501116 + ], + [ + 28.259546746541844, + 48.15556224221342 + ], + [ + 28.670891147585166, + 48.1181485052341 + ], + [ + 29.12269819511303, + 47.849095160506465 + ], + [ + 29.05086795422733, + 47.5102269557525 + ], + [ + 29.415135125452736, + 47.34664520933258 + ], + [ + 29.559674106573112, + 46.928582872091326 + ], + [ + 29.908851759569302, + 46.67436066343146 + ], + [ + 29.838210076626297, + 46.52532583270169 + ], + [ + 30.024658644335375, + 46.42393667254504 + ], + [ + 29.759971958136394, + 46.34998769793536 + ], + [ + 29.170653924279886, + 46.3792623968287 + ], + [ + 29.07210696789929, + 46.517677720722496 + ], + [ + 28.862972446414062, + 46.43788930926383 + ], + [ + 28.933717482221624, + 46.2588304713725 + ], + [ + 28.65998742037158, + 45.93998688413164 + ], + [ + 28.485269402792767, + 45.5969070501459 + ], + [ + 28.233553501099042, + 45.488283189468376 + ], + [ + 28.0544429867754, + 45.944586086605625 + ], + [ + 28.160017937947714, + 46.37156260841722 + ], + [ + 28.128030226359044, + 46.810476386088254 + ], + [ + 27.551166212684848, + 47.40511709247083 + ], + [ + 27.233872918412743, + 47.82677094175638 + ], + [ + 26.924176059687568, + 48.123264472030996 + ], + [ + 26.619336785597795, + 48.22072622333347 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Macedonia", + "sov_a3": "MKD", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Macedonia", + "adm0_a3": "MKD", + "geou_dif": 0, + "geounit": "Macedonia", + "gu_a3": "MKD", + "su_dif": 0, + "subunit": "Macedonia", + "su_a3": "MKD", + "brk_diff": 0, + "name": "Macedonia", + "name_long": "Macedonia", + "brk_a3": "MKD", + "brk_name": "Macedonia", + "brk_group": null, + "abbrev": "Mkd.", + "postal": "MK", + "formal_en": "Former Yugoslav Republic of Macedonia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Macedonia, FYR", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 3, + "mapcolor9": 7, + "mapcolor13": 3, + "pop_est": 2066718, + "gdp_md_est": 18780, + "pop_year": -99, + "lastcensus": 2010, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "MK", + "iso_a3": "MKD", + "iso_n3": "807", + "un_a3": "807", + "wb_a2": "MK", + "wb_a3": "MKD", + "woe_id": -99, + "adm0_a3_is": "MKD", + "adm0_a3_us": "MKD", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 9, + "long_len": 9, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 20.59023, + 41.85541 + ], + [ + 20.71731000000011, + 41.84711 + ], + [ + 20.76216, + 42.05186 + ], + [ + 21.35270000000014, + 42.2068 + ], + [ + 21.57663598940212, + 42.24522439706186 + ], + [ + 21.917080000000112, + 42.30364 + ], + [ + 22.38052575042468, + 42.32025950781508 + ], + [ + 22.881373732197346, + 41.999297186850356 + ], + [ + 22.952377150166512, + 41.33799388281119 + ], + [ + 22.76177, + 41.3048 + ], + [ + 22.597308383889015, + 41.130487168943205 + ], + [ + 22.05537763844427, + 41.14986583105269 + ], + [ + 21.674160597426976, + 40.931274522457954 + ], + [ + 21.0200403174764, + 40.84272695572588 + ], + [ + 20.60518, + 41.08622 + ], + [ + 20.46315, + 41.5150900000001 + ], + [ + 20.59023, + 41.85541 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Montenegro", + "sov_a3": "MNE", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Montenegro", + "adm0_a3": "MNE", + "geou_dif": 0, + "geounit": "Montenegro", + "gu_a3": "MNE", + "su_dif": 0, + "subunit": "Montenegro", + "su_a3": "MNE", + "brk_diff": 0, + "name": "Montenegro", + "name_long": "Montenegro", + "brk_a3": "MNE", + "brk_name": "Montenegro", + "brk_group": null, + "abbrev": "Mont.", + "postal": "ME", + "formal_en": "Montenegro", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Montenegro", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 1, + "mapcolor9": 4, + "mapcolor13": 5, + "pop_est": 672180, + "gdp_md_est": 6816, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "ME", + "iso_a3": "MNE", + "iso_n3": "499", + "un_a3": "499", + "wb_a2": "ME", + "wb_a3": "MNE", + "woe_id": -99, + "adm0_a3_is": "MNE", + "adm0_a3_us": "MNE", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 10, + "long_len": 10, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 19.801613396898688, + 42.50009349219084 + ], + [ + 19.73805138517963, + 42.68824738216557 + ], + [ + 19.3044900000001, + 42.19574 + ], + [ + 19.37177000000014, + 41.87755 + ], + [ + 19.16246, + 41.95502 + ], + [ + 18.88214, + 42.28151 + ], + [ + 18.45, + 42.48 + ], + [ + 18.56, + 42.65 + ], + [ + 18.70648, + 43.20011 + ], + [ + 19.03165, + 43.43253 + ], + [ + 19.21852, + 43.52384 + ], + [ + 19.48389, + 43.35229 + ], + [ + 19.63, + 43.21377997027054 + ], + [ + 19.95857, + 43.10604 + ], + [ + 20.3398, + 42.89852 + ], + [ + 20.25758, + 42.81275000000011 + ], + [ + 20.0707, + 42.58863 + ], + [ + 19.801613396898688, + 42.50009349219084 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Netherlands", + "sov_a3": "NL1", + "adm0_dif": 1, + "level": 2, + "type": "Country", + "admin": "Netherlands", + "adm0_a3": "NLD", + "geou_dif": 0, + "geounit": "Netherlands", + "gu_a3": "NLD", + "su_dif": 0, + "subunit": "Netherlands", + "su_a3": "NLD", + "brk_diff": 0, + "name": "Netherlands", + "name_long": "Netherlands", + "brk_a3": "NLD", + "brk_name": "Netherlands", + "brk_group": null, + "abbrev": "Neth.", + "postal": "NL", + "formal_en": "Kingdom of the Netherlands", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Netherlands", + "name_alt": null, + "mapcolor7": 4, + "mapcolor8": 2, + "mapcolor9": 2, + "mapcolor13": 9, + "pop_est": 16715999, + "gdp_md_est": 672000, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "NL", + "iso_a3": "NLD", + "iso_n3": "528", + "un_a3": "528", + "wb_a2": "NL", + "wb_a3": "NLD", + "woe_id": -99, + "adm0_a3_is": "NLD", + "adm0_a3_us": "NLD", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Western Europe", + "region_wb": "Europe & Central Asia", + "name_len": 11, + "long_len": 11, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 6.074182570020923, + 53.510403347378144 + ], + [ + 6.905139601274129, + 53.48216217713065 + ], + [ + 7.092053256873896, + 53.144043280644894 + ], + [ + 6.842869500362383, + 52.22844025329755 + ], + [ + 6.589396599970826, + 51.852029120483394 + ], + [ + 5.988658074577813, + 51.851615709025054 + ], + [ + 6.15665815595878, + 50.80372101501058 + ], + [ + 5.606975945670001, + 51.03729848896978 + ], + [ + 4.973991326526914, + 51.47502370869813 + ], + [ + 4.047071160507528, + 51.26725861266857 + ], + [ + 3.314971144228537, + 51.34575511331991 + ], + [ + 3.830288527043137, + 51.62054454203195 + ], + [ + 4.705997348661185, + 53.091798407597764 + ], + [ + 6.074182570020923, + 53.510403347378144 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Norway", + "sov_a3": "NOR", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Norway", + "adm0_a3": "NOR", + "geou_dif": 0, + "geounit": "Norway", + "gu_a3": "NOR", + "su_dif": 0, + "subunit": "Norway", + "su_a3": "NOR", + "brk_diff": 0, + "name": "Norway", + "name_long": "Norway", + "brk_a3": "NOR", + "brk_name": "Norway", + "brk_group": null, + "abbrev": "Nor.", + "postal": "N", + "formal_en": "Kingdom of Norway", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Norway", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 3, + "mapcolor9": 8, + "mapcolor13": 12, + "pop_est": 4676305, + "gdp_md_est": 276400, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "NO", + "iso_a3": "NOR", + "iso_n3": "578", + "un_a3": "578", + "wb_a2": "NO", + "wb_a3": "NOR", + "woe_id": -99, + "adm0_a3_is": "NOR", + "adm0_a3_us": "NOR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 28.165547316202918, + 71.18547435168051 + ], + [ + 31.293418409965483, + 70.45378774685992 + ], + [ + 30.005435011522792, + 70.1862588568849 + ], + [ + 31.101078728975125, + 69.55808014594487 + ], + [ + 29.399580519332886, + 69.15691600206307 + ], + [ + 28.591929559043194, + 69.0647769232867 + ], + [ + 29.015572950971972, + 69.76649119737797 + ], + [ + 27.73229210786789, + 70.1641930202963 + ], + [ + 26.1796220232263, + 69.82529897732616 + ], + [ + 25.689212680776393, + 69.09211375596902 + ], + [ + 24.73567915212672, + 68.64955678982145 + ], + [ + 23.662049594830762, + 68.89124746365053 + ], + [ + 22.356237827247412, + 68.84174144151496 + ], + [ + 21.24493615081073, + 69.37044302029312 + ], + [ + 20.645592889089585, + 69.10624726020086 + ], + [ + 20.025268995857914, + 69.06513865831272 + ], + [ + 19.878559604581255, + 68.40719432237262 + ], + [ + 17.99386844246439, + 68.56739126247734 + ], + [ + 17.729181756265348, + 68.01055186631623 + ], + [ + 16.76887861498554, + 68.01393667263139 + ], + [ + 16.108712192456835, + 67.3024555528369 + ], + [ + 15.108411492583059, + 66.19386688909543 + ], + [ + 13.55568973150909, + 64.78702769638147 + ], + [ + 13.919905226302205, + 64.44542064071612 + ], + [ + 13.57191613124877, + 64.04911408146967 + ], + [ + 12.579935336973932, + 64.06621898055835 + ], + [ + 11.930569288794231, + 63.12831757267699 + ], + [ + 11.992064243221535, + 61.800362453856565 + ], + [ + 12.631146681375242, + 61.2935716823701 + ], + [ + 12.3003658382749, + 60.11793284773006 + ], + [ + 11.468271925511175, + 59.432393296946 + ], + [ + 11.027368605196926, + 58.8561494004594 + ], + [ + 10.356556837616097, + 59.46980703392538 + ], + [ + 8.382000359743643, + 58.31328847923328 + ], + [ + 7.048748406613299, + 58.078884182357285 + ], + [ + 5.665835402050419, + 58.58815542259367 + ], + [ + 5.308234490590735, + 59.66323191999382 + ], + [ + 4.992078077829007, + 61.970998033284275 + ], + [ + 5.912900424837886, + 62.614472968182696 + ], + [ + 8.553411085655767, + 63.45400828719647 + ], + [ + 10.527709181366788, + 64.48603831649748 + ], + [ + 12.358346795306375, + 65.87972585719316 + ], + [ + 14.761145867581604, + 67.81064158799515 + ], + [ + 16.43592736172897, + 68.56320547146169 + ], + [ + 19.184028354578516, + 69.81744415961782 + ], + [ + 21.378416375420613, + 70.25516937934606 + ], + [ + 23.023742303161583, + 70.20207184516627 + ], + [ + 24.546543409938522, + 71.03049673123724 + ], + [ + 26.37004967622181, + 70.98626170519537 + ], + [ + 28.165547316202918, + 71.18547435168051 + ] + ] + ], + [ + [ + [ + 24.72412, + 77.85385 + ], + [ + 22.49032, + 77.44493 + ], + [ + 20.72601, + 77.67704 + ], + [ + 21.41611, + 77.93504 + ], + [ + 20.8119, + 78.25463 + ], + [ + 22.88426, + 78.45494 + ], + [ + 23.28134, + 78.07954 + ], + [ + 24.72412, + 77.85385 + ] + ] + ], + [ + [ + [ + 18.25183, + 79.70175 + ], + [ + 21.54383, + 78.95611 + ], + [ + 19.02737, + 78.5626 + ], + [ + 18.47172, + 77.82669 + ], + [ + 17.59441, + 77.63796 + ], + [ + 17.1182, + 76.80941 + ], + [ + 15.91315, + 76.77045 + ], + [ + 13.76259, + 77.38035 + ], + [ + 14.66956, + 77.73565 + ], + [ + 13.1706, + 78.02493 + ], + [ + 11.22231, + 78.8693 + ], + [ + 10.44453, + 79.65239 + ], + [ + 13.17077, + 80.01046 + ], + [ + 13.71852, + 79.66039 + ], + [ + 15.14282, + 79.67431 + ], + [ + 15.52255, + 80.01608 + ], + [ + 16.99085, + 80.05086 + ], + [ + 18.25183, + 79.70175 + ] + ] + ], + [ + [ + [ + 25.447625359811894, + 80.40734039989451 + ], + [ + 27.4075057309135, + 80.05640574820046 + ], + [ + 25.92465050629818, + 79.51783397085455 + ], + [ + 23.02446577321362, + 79.4000117052291 + ], + [ + 20.075188429451885, + 79.56682322866726 + ], + [ + 19.897266473070914, + 79.84236196564751 + ], + [ + 18.462263624757924, + 79.85988027619442 + ], + [ + 17.368015170977458, + 80.31889618602702 + ], + [ + 20.455992059010697, + 80.59815562613224 + ], + [ + 21.907944777115404, + 80.35767934846209 + ], + [ + 22.919252557067438, + 80.6571442735935 + ], + [ + 25.447625359811894, + 80.40734039989451 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Poland", + "sov_a3": "POL", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Poland", + "adm0_a3": "POL", + "geou_dif": 0, + "geounit": "Poland", + "gu_a3": "POL", + "su_dif": 0, + "subunit": "Poland", + "su_a3": "POL", + "brk_diff": 0, + "name": "Poland", + "name_long": "Poland", + "brk_a3": "POL", + "brk_name": "Poland", + "brk_group": null, + "abbrev": "Pol.", + "postal": "PL", + "formal_en": "Republic of Poland", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Poland", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 7, + "mapcolor9": 1, + "mapcolor13": 2, + "pop_est": 38482919, + "gdp_md_est": 667900, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "PL", + "iso_a3": "POL", + "iso_n3": "616", + "un_a3": "616", + "wb_a2": "PL", + "wb_a3": "POL", + "woe_id": -99, + "adm0_a3_is": "POL", + "adm0_a3_us": "POL", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 15.01699588385867, + 51.10667409932158 + ], + [ + 14.607098422919535, + 51.74518809671997 + ], + [ + 14.685026482815687, + 52.0899474147552 + ], + [ + 14.437599725002201, + 52.62485016540839 + ], + [ + 14.074521111719491, + 52.98126251892543 + ], + [ + 14.353315463934138, + 53.24817129171297 + ], + [ + 14.119686313542587, + 53.75702912049104 + ], + [ + 14.802900424873458, + 54.05070628520575 + ], + [ + 16.36347700365573, + 54.513158677785725 + ], + [ + 17.622831658608675, + 54.85153595643291 + ], + [ + 18.62085859546164, + 54.68260569927078 + ], + [ + 18.696254510175464, + 54.43871877706929 + ], + [ + 19.660640089606403, + 54.42608388937393 + ], + [ + 20.892244500418627, + 54.31252492941253 + ], + [ + 22.731098667092652, + 54.327536932993326 + ], + [ + 23.24398725758951, + 54.22056671814914 + ], + [ + 23.48412763844985, + 53.91249766704114 + ], + [ + 23.527535841575002, + 53.470121568406555 + ], + [ + 23.80493493011778, + 53.089731350306074 + ], + [ + 23.79919884613338, + 52.69109935160657 + ], + [ + 23.199493849386187, + 52.48697744405367 + ], + [ + 23.508002150168693, + 52.02364655212473 + ], + [ + 23.527070753684374, + 51.57845408793024 + ], + [ + 24.029985792748903, + 50.70540660257518 + ], + [ + 23.922757195743262, + 50.42488108987875 + ], + [ + 23.426508416444392, + 50.308505764357456 + ], + [ + 22.518450148211603, + 49.47677358661974 + ], + [ + 22.776418898212626, + 49.02739533140962 + ], + [ + 22.558137648211755, + 49.085738023467144 + ], + [ + 21.607808058364213, + 49.47010732685409 + ], + [ + 20.887955356538413, + 49.32877228453583 + ], + [ + 20.415839471119853, + 49.43145335549977 + ], + [ + 19.825022820726872, + 49.21712535256923 + ], + [ + 19.320712517990472, + 49.571574001659194 + ], + [ + 18.90957482267632, + 49.435845852244576 + ], + [ + 18.853144158613617, + 49.49622976337764 + ], + [ + 18.392913852622172, + 49.98862864847075 + ], + [ + 17.64944502123899, + 50.049038397819956 + ], + [ + 17.55456709155112, + 50.36214590107642 + ], + [ + 16.86876915860566, + 50.47397370055603 + ], + [ + 16.719475945714436, + 50.21574656839354 + ], + [ + 16.176253289462267, + 50.42260732685791 + ], + [ + 16.23862674323857, + 50.69773265237984 + ], + [ + 15.490972120839729, + 50.78472992614321 + ], + [ + 15.01699588385867, + 51.10667409932158 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Portugal", + "sov_a3": "PRT", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Portugal", + "adm0_a3": "PRT", + "geou_dif": 0, + "geounit": "Portugal", + "gu_a3": "PRT", + "su_dif": 1, + "subunit": "Portugal", + "su_a3": "PR1", + "brk_diff": 0, + "name": "Portugal", + "name_long": "Portugal", + "brk_a3": "PR1", + "brk_name": "Portugal", + "brk_group": null, + "abbrev": "Port.", + "postal": "P", + "formal_en": "Portuguese Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Portugal", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 7, + "mapcolor9": 1, + "mapcolor13": 4, + "pop_est": 10707924, + "gdp_md_est": 208627, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": 0, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "PT", + "iso_a3": "PRT", + "iso_n3": "620", + "un_a3": "620", + "wb_a2": "PT", + "wb_a3": "PRT", + "woe_id": -99, + "adm0_a3_is": "PRT", + "adm0_a3_us": "PRT", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 8, + "long_len": 8, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -9.034817674180246, + 41.880570583659676 + ], + [ + -8.67194576662672, + 42.13468943945496 + ], + [ + -8.263856980817792, + 42.28046865495034 + ], + [ + -8.013174607769912, + 41.790886135417125 + ], + [ + -7.422512986673795, + 41.79207469335984 + ], + [ + -7.251308966490824, + 41.91834605566505 + ], + [ + -6.668605515967656, + 41.883386949219584 + ], + [ + -6.389087693700915, + 41.381815497394655 + ], + [ + -6.851126674822552, + 41.11108266861753 + ], + [ + -6.864019944679385, + 40.33087189387483 + ], + [ + -7.026413133156595, + 40.184524237624245 + ], + [ + -7.066591559263529, + 39.711891587882775 + ], + [ + -7.498632371439726, + 39.62957103124181 + ], + [ + -7.098036668313128, + 39.03007274022379 + ], + [ + -7.374092169616318, + 38.37305858006492 + ], + [ + -7.029281175148796, + 38.07576406508977 + ], + [ + -7.166507941099865, + 37.803894354802225 + ], + [ + -7.537105475281024, + 37.42890432387624 + ], + [ + -7.453725551778092, + 37.09778758396607 + ], + [ + -7.855613165711986, + 36.83826854099627 + ], + [ + -8.382816127953689, + 36.97888011326246 + ], + [ + -8.898856980820327, + 36.86880931248078 + ], + [ + -8.746101446965554, + 37.65134552667661 + ], + [ + -8.83999752443988, + 38.266243394517616 + ], + [ + -9.287463751655224, + 38.3584858261586 + ], + [ + -9.526570603869715, + 38.73742910415491 + ], + [ + -9.446988898140233, + 39.39206614842837 + ], + [ + -9.048305223008427, + 39.75509308527877 + ], + [ + -8.977353481471681, + 40.15930613866581 + ], + [ + -8.768684047877102, + 40.76063894303019 + ], + [ + -8.79085323733031, + 41.18433401139126 + ], + [ + -8.99078935386757, + 41.54345937760364 + ], + [ + -9.034817674180246, + 41.880570583659676 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Romania", + "sov_a3": "ROU", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Romania", + "adm0_a3": "ROU", + "geou_dif": 0, + "geounit": "Romania", + "gu_a3": "ROU", + "su_dif": 0, + "subunit": "Romania", + "su_a3": "ROU", + "brk_diff": 0, + "name": "Romania", + "name_long": "Romania", + "brk_a3": "ROU", + "brk_name": "Romania", + "brk_group": null, + "abbrev": "Rom.", + "postal": "RO", + "formal_en": "Romania", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Romania", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 4, + "mapcolor9": 3, + "mapcolor13": 13, + "pop_est": 22215421, + "gdp_md_est": 271400, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "RO", + "iso_a3": "ROU", + "iso_n3": "642", + "un_a3": "642", + "wb_a2": "RO", + "wb_a3": "ROM", + "woe_id": -99, + "adm0_a3_is": "ROU", + "adm0_a3_us": "ROU", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 22.710531447040495, + 47.88219391538941 + ], + [ + 23.142236362406805, + 48.09634105080695 + ], + [ + 23.76095828623741, + 47.985598456405455 + ], + [ + 24.40205610525038, + 47.98187775328043 + ], + [ + 24.866317172960578, + 47.737525743188314 + ], + [ + 25.20774336111299, + 47.89105642352747 + ], + [ + 25.9459411964024, + 47.987148749374214 + ], + [ + 26.19745039236693, + 48.22088125263035 + ], + [ + 26.619336785597795, + 48.22072622333347 + ], + [ + 26.924176059687568, + 48.123264472030996 + ], + [ + 27.233872918412743, + 47.82677094175638 + ], + [ + 27.551166212684848, + 47.40511709247083 + ], + [ + 28.128030226359044, + 46.810476386088254 + ], + [ + 28.160017937947714, + 46.37156260841722 + ], + [ + 28.0544429867754, + 45.944586086605625 + ], + [ + 28.233553501099042, + 45.488283189468376 + ], + [ + 28.67977949393938, + 45.304030870131704 + ], + [ + 29.149724969201653, + 45.464925442072456 + ], + [ + 29.603289015427436, + 45.293308010431126 + ], + [ + 29.62654340995877, + 45.0353909368624 + ], + [ + 29.141611769331835, + 44.820210272799045 + ], + [ + 28.8378577003202, + 44.913873806328056 + ], + [ + 28.558081495891997, + 43.70746165625813 + ], + [ + 27.970107049275075, + 43.81246816667522 + ], + [ + 27.242399529740908, + 44.175986029632405 + ], + [ + 26.065158725699746, + 43.94349376075127 + ], + [ + 25.569271681426926, + 43.68844472917472 + ], + [ + 24.100679152124172, + 43.74105133724785 + ], + [ + 23.332302280376325, + 43.897010809904714 + ], + [ + 22.944832391051847, + 43.82378530534713 + ], + [ + 22.65714969248299, + 44.23492300066128 + ], + [ + 22.4740084164406, + 44.40922760678177 + ], + [ + 22.705725538837356, + 44.57800283464702 + ], + [ + 22.459022251075936, + 44.7025171982543 + ], + [ + 22.14508792490281, + 44.47842234962059 + ], + [ + 21.56202273935361, + 44.7689472519655 + ], + [ + 21.483526238702236, + 45.18117015235778 + ], + [ + 20.874312778413355, + 45.416375433934235 + ], + [ + 20.762174920339987, + 45.73457306577144 + ], + [ + 20.220192498462836, + 46.127468980486555 + ], + [ + 21.02195234547125, + 46.3160879583519 + ], + [ + 21.626514926853872, + 46.99423777931816 + ], + [ + 22.099767693782837, + 47.6724392767167 + ], + [ + 22.710531447040495, + 47.88219391538941 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 5, + "sovereignt": "Republic of Serbia", + "sov_a3": "SRB", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Republic of Serbia", + "adm0_a3": "SRB", + "geou_dif": 0, + "geounit": "Republic of Serbia", + "gu_a3": "SRB", + "su_dif": 0, + "subunit": "Republic of Serbia", + "su_a3": "SRB", + "brk_diff": 0, + "name": "Serbia", + "name_long": "Serbia", + "brk_a3": "SRB", + "brk_name": "Serbia", + "brk_group": null, + "abbrev": "Serb.", + "postal": "RS", + "formal_en": "Republic of Serbia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Serbia", + "name_alt": null, + "mapcolor7": 3, + "mapcolor8": 3, + "mapcolor9": 2, + "mapcolor13": 10, + "pop_est": 7379339, + "gdp_md_est": 80340, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "RS", + "iso_a3": "SRB", + "iso_n3": "688", + "un_a3": "688", + "wb_a2": "YF", + "wb_a3": "SRB", + "woe_id": -99, + "adm0_a3_is": "SRB", + "adm0_a3_us": "SRB", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 5, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 20.87431277841341, + 45.41637543393432 + ], + [ + 21.48352623870221, + 45.18117015235788 + ], + [ + 21.562022739353722, + 44.76894725196564 + ], + [ + 22.145087924902896, + 44.47842234962059 + ], + [ + 22.459022251075965, + 44.70251719825444 + ], + [ + 22.70572553883744, + 44.57800283464701 + ], + [ + 22.474008416440654, + 44.40922760678177 + ], + [ + 22.657149692483074, + 44.234923000661354 + ], + [ + 22.410446404721597, + 44.008063462900054 + ], + [ + 22.500156691180223, + 43.642814439461006 + ], + [ + 22.986018507588483, + 43.2111612005271 + ], + [ + 22.60480146657136, + 42.898518785161116 + ], + [ + 22.436594679461393, + 42.58032115332395 + ], + [ + 22.54501183440965, + 42.46136200618804 + ], + [ + 22.38052575042468, + 42.32025950781508 + ], + [ + 21.917080000000112, + 42.30364 + ], + [ + 21.57663598940212, + 42.24522439706186 + ], + [ + 21.54332, + 42.3202500000001 + ], + [ + 21.66292, + 42.43922 + ], + [ + 21.77505, + 42.6827 + ], + [ + 21.63302, + 42.67717 + ], + [ + 21.43866, + 42.86255 + ], + [ + 21.27421, + 42.90959 + ], + [ + 21.143395, + 43.06868500000013 + ], + [ + 20.95651, + 43.13094 + ], + [ + 20.81448, + 43.27205 + ], + [ + 20.63508, + 43.21671 + ], + [ + 20.49679, + 42.88469 + ], + [ + 20.25758, + 42.81275000000011 + ], + [ + 20.3398, + 42.89852 + ], + [ + 19.95857, + 43.10604 + ], + [ + 19.63, + 43.21377997027054 + ], + [ + 19.48389, + 43.35229 + ], + [ + 19.21852, + 43.52384 + ], + [ + 19.454, + 43.56810000000013 + ], + [ + 19.59976, + 44.03847 + ], + [ + 19.11761, + 44.42307000000011 + ], + [ + 19.36803, + 44.863 + ], + [ + 19.00548, + 44.86023 + ], + [ + 19.39047570158459, + 45.236515611342384 + ], + [ + 19.072768995854176, + 45.52151113543209 + ], + [ + 18.82982, + 45.90888 + ], + [ + 19.59604454924164, + 46.17172984474456 + ], + [ + 20.220192498462893, + 46.12746898048658 + ], + [ + 20.762174920339987, + 45.734573065771485 + ], + [ + 20.87431277841341, + 45.41637543393432 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 2, + "sovereignt": "Russia", + "sov_a3": "RUS", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Russia", + "adm0_a3": "RUS", + "geou_dif": 0, + "geounit": "Russia", + "gu_a3": "RUS", + "su_dif": 0, + "subunit": "Russia", + "su_a3": "RUS", + "brk_diff": 0, + "name": "Russia", + "name_long": "Russian Federation", + "brk_a3": "RUS", + "brk_name": "Russia", + "brk_group": null, + "abbrev": "Rus.", + "postal": "RUS", + "formal_en": "Russian Federation", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Russian Federation", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 5, + "mapcolor9": 7, + "mapcolor13": 7, + "pop_est": 140041247, + "gdp_md_est": 2266000, + "pop_year": -99, + "lastcensus": 2010, + "gdp_year": -99, + "economy": "3. Emerging region: BRIC", + "income_grp": "3. Upper middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "RU", + "iso_a3": "RUS", + "iso_n3": "643", + "un_a3": "643", + "wb_a2": "RU", + "wb_a3": "RUS", + "woe_id": -99, + "adm0_a3_is": "RUS", + "adm0_a3_us": "RUS", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 18, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 143.64800744036287, + 50.74760040954152 + ], + [ + 144.65414757708564, + 48.976390692737596 + ], + [ + 143.17392785051723, + 49.30655141865037 + ], + [ + 142.5586682476501, + 47.861575018904915 + ], + [ + 143.53349246640406, + 46.83672801369249 + ], + [ + 143.50527713437262, + 46.13790761980948 + ], + [ + 142.74770063697392, + 46.74076487892657 + ], + [ + 142.0920300640545, + 45.96675527605879 + ], + [ + 141.90692508358504, + 46.80592886004655 + ], + [ + 142.0184428244709, + 47.780132961612935 + ], + [ + 141.90444461483506, + 48.85918854429957 + ], + [ + 142.13580000220568, + 49.61516307229746 + ], + [ + 142.1799833518153, + 50.95234243428192 + ], + [ + 141.59407596249005, + 51.93543488220254 + ], + [ + 141.68254601457366, + 53.30196645772878 + ], + [ + 142.60693403541077, + 53.762145087287905 + ], + [ + 142.2097489768154, + 54.22547597921687 + ], + [ + 142.654786411713, + 54.36588084575388 + ], + [ + 142.91461551327657, + 53.70457754171474 + ], + [ + 143.26084760963207, + 52.74076040303905 + ], + [ + 143.23526777564766, + 51.75666026468875 + ], + [ + 143.64800744036287, + 50.74760040954152 + ] + ] + ], + [ + [ + [ + 22.731098667092652, + 54.327536932993326 + ], + [ + 20.892244500418656, + 54.312524929412575 + ], + [ + 19.660640089606403, + 54.426083889373984 + ], + [ + 19.888481479581344, + 54.8661603867715 + ], + [ + 21.2684489275035, + 55.19048167583529 + ], + [ + 22.315723504330606, + 55.0152985703659 + ], + [ + 22.757763706155288, + 54.85657440858142 + ], + [ + 22.651051873472568, + 54.58274099386671 + ], + [ + 22.731098667092652, + 54.327536932993326 + ] + ] + ], + [ + [ + [ + -175.01425, + 66.58435 + ], + [ + -174.33983, + 66.33556 + ], + [ + -174.57182, + 67.06219 + ], + [ + -171.85731, + 66.91308 + ], + [ + -169.89958, + 65.97724 + ], + [ + -170.89107, + 65.54139 + ], + [ + -172.53025, + 65.43791 + ], + [ + -172.555, + 64.46079 + ], + [ + -172.95533, + 64.25269 + ], + [ + -173.89184, + 64.2826 + ], + [ + -174.65392, + 64.63125 + ], + [ + -175.98353, + 64.92288 + ], + [ + -176.20716, + 65.35667 + ], + [ + -177.22266, + 65.52024 + ], + [ + -178.35993, + 65.39052 + ], + [ + -178.90332, + 65.74044 + ], + [ + -178.68611, + 66.11211 + ], + [ + -179.88377, + 65.87456 + ], + [ + -179.43268, + 65.40411 + ], + [ + -180, + 64.97970870219837 + ], + [ + -180, + 68.96363636363637 + ], + [ + -177.55, + 68.2 + ], + [ + -174.92825, + 67.20589 + ], + [ + -175.01425, + 66.58435 + ] + ] + ], + [ + [ + [ + 180.00000000000014, + 70.83219920854668 + ], + [ + 178.9034250000001, + 70.78114 + ], + [ + 178.7253, + 71.0988 + ], + [ + 180.00000000000014, + 71.51571433642826 + ], + [ + 180.00000000000014, + 70.83219920854668 + ] + ] + ], + [ + [ + [ + -178.69378, + 70.89302 + ], + [ + -180, + 70.83219920854668 + ], + [ + -180, + 71.51571433642826 + ], + [ + -179.87187, + 71.55762 + ], + [ + -179.02433, + 71.55553 + ], + [ + -177.577945, + 71.26948 + ], + [ + -177.663575, + 71.13277 + ], + [ + -178.69378, + 70.89302 + ] + ] + ], + [ + [ + [ + 143.60385, + 73.21244 + ], + [ + 142.08763, + 73.20544 + ], + [ + 140.038155, + 73.31692 + ], + [ + 139.86312, + 73.36983 + ], + [ + 140.81171, + 73.76506 + ], + [ + 142.06207, + 73.85758 + ], + [ + 143.48283, + 73.47525 + ], + [ + 143.60385, + 73.21244 + ] + ] + ], + [ + [ + [ + 150.73167, + 75.08406 + ], + [ + 149.575925, + 74.68892 + ], + [ + 147.97746, + 74.778355 + ], + [ + 146.11919, + 75.17298 + ], + [ + 146.358485, + 75.49682 + ], + [ + 148.22223, + 75.345845 + ], + [ + 150.73167, + 75.08406 + ] + ] + ], + [ + [ + [ + 145.086285, + 75.56262 + ], + [ + 144.3, + 74.82 + ], + [ + 140.61381, + 74.84768 + ], + [ + 138.95544, + 74.61148 + ], + [ + 136.97439, + 75.26167 + ], + [ + 137.51176, + 75.94917 + ], + [ + 138.831075, + 76.13676 + ], + [ + 141.47161, + 76.09289 + ], + [ + 145.086285, + 75.56262 + ] + ] + ], + [ + [ + [ + 57.5356925799924, + 70.72046397570216 + ], + [ + 56.94497928246395, + 70.63274323188668 + ], + [ + 53.6773751157842, + 70.76265778266847 + ], + [ + 53.41201663596539, + 71.2066616889202 + ], + [ + 51.60189456564572, + 71.47475901965049 + ], + [ + 51.45575361512422, + 72.01488108996514 + ], + [ + 52.47827518088357, + 72.22944163684096 + ], + [ + 52.444168735570855, + 72.77473135038485 + ], + [ + 54.42761355979766, + 73.62754751249759 + ], + [ + 53.50828982932515, + 73.74981395130015 + ], + [ + 55.90245893740766, + 74.62748647734534 + ], + [ + 55.631932814359715, + 75.08141225859717 + ], + [ + 57.86864383324885, + 75.60939036732321 + ], + [ + 61.170044386647504, + 76.25188345000814 + ], + [ + 64.49836836127022, + 76.43905548776928 + ], + [ + 66.2109770038551, + 76.80978221303124 + ], + [ + 68.15705976753483, + 76.93969676381292 + ], + [ + 68.85221113472514, + 76.54481130645462 + ], + [ + 68.18057254422766, + 76.23364166940911 + ], + [ + 64.63732628770302, + 75.73775462513623 + ], + [ + 61.58350752141476, + 75.2608845079468 + ], + [ + 58.47708214705338, + 74.30905630156283 + ], + [ + 56.98678551618801, + 73.33304352486624 + ], + [ + 55.419335971910954, + 72.37126760526598 + ], + [ + 55.622837762276305, + 71.54059479439033 + ], + [ + 57.5356925799924, + 70.72046397570216 + ] + ] + ], + [ + [ + [ + 106.97013000000013, + 76.97419 + ], + [ + 107.24000000000015, + 76.48 + ], + [ + 108.1538, + 76.72335000000015 + ], + [ + 111.07726000000017, + 76.71 + ], + [ + 113.33151, + 76.22224 + ], + [ + 114.13417, + 75.84764 + ], + [ + 113.88539, + 75.32779000000014 + ], + [ + 112.77918, + 75.03186 + ], + [ + 110.1512500000002, + 74.47673 + ], + [ + 109.4, + 74.18 + ], + [ + 110.64, + 74.04 + ], + [ + 112.11919, + 73.78774000000013 + ], + [ + 113.01954000000026, + 73.97693000000015 + ], + [ + 113.52958000000032, + 73.33505000000011 + ], + [ + 113.96881, + 73.5948800000001 + ], + [ + 115.56782, + 73.75285 + ], + [ + 118.77633000000023, + 73.58772 + ], + [ + 119.02, + 73.12 + ], + [ + 123.20066000000011, + 72.97122 + ], + [ + 123.25777000000019, + 73.73503000000011 + ], + [ + 125.3800000000002, + 73.56 + ], + [ + 126.97644, + 73.56549 + ], + [ + 128.59126, + 73.03871 + ], + [ + 129.05157, + 72.39872 + ], + [ + 128.46000000000012, + 71.98 + ], + [ + 129.71599000000023, + 71.19304 + ], + [ + 131.28858000000028, + 70.78699000000012 + ], + [ + 132.25350000000017, + 71.83630000000011 + ], + [ + 133.85766000000032, + 71.38642000000016 + ], + [ + 135.56193, + 71.65525000000014 + ], + [ + 137.49755, + 71.34763 + ], + [ + 138.23409000000018, + 71.62803 + ], + [ + 139.86983000000012, + 71.48783000000014 + ], + [ + 139.14791, + 72.41619000000011 + ], + [ + 140.46817, + 72.84941000000015 + ], + [ + 149.5, + 72.2 + ], + [ + 150.3511800000002, + 71.60643 + ], + [ + 152.96890000000022, + 70.84222 + ], + [ + 157.00688, + 71.03141 + ], + [ + 158.99779, + 70.86672 + ], + [ + 159.83031000000025, + 70.45324 + ], + [ + 159.70866, + 69.72198 + ], + [ + 160.94053000000034, + 69.4372800000001 + ], + [ + 162.27907000000013, + 69.64204 + ], + [ + 164.05248000000014, + 69.66823 + ], + [ + 165.94037000000023, + 69.47199 + ], + [ + 167.83567, + 69.58269 + ], + [ + 169.5776300000002, + 68.6938 + ], + [ + 170.81688000000028, + 69.01363 + ], + [ + 170.0082000000002, + 69.65276 + ], + [ + 170.4534500000003, + 70.09703 + ], + [ + 173.64391000000026, + 69.81743 + ], + [ + 175.72403000000023, + 69.87725000000023 + ], + [ + 178.6, + 69.4 + ], + [ + 180.00000000000014, + 68.96363636363657 + ], + [ + 180.00000000000014, + 64.97970870219848 + ], + [ + 179.99281, + 64.97433 + ], + [ + 178.70720000000026, + 64.53493 + ], + [ + 177.41128000000018, + 64.60821 + ], + [ + 178.31300000000024, + 64.07593 + ], + [ + 178.9082500000002, + 63.25197000000014 + ], + [ + 179.37034, + 62.98262000000011 + ], + [ + 179.48636, + 62.56894 + ], + [ + 179.22825000000014, + 62.30410000000015 + ], + [ + 177.3643, + 62.5219 + ], + [ + 174.56929000000022, + 61.76915 + ], + [ + 173.68013, + 61.65261 + ], + [ + 172.15, + 60.95 + ], + [ + 170.6985000000001, + 60.33618 + ], + [ + 170.3308500000003, + 59.88177 + ], + [ + 168.90046, + 60.57355 + ], + [ + 166.29498000000032, + 59.788550000000214 + ], + [ + 165.84000000000023, + 60.16 + ], + [ + 164.87674, + 59.7316 + ], + [ + 163.53929000000014, + 59.86871 + ], + [ + 163.21711000000025, + 59.21101 + ], + [ + 162.0173300000001, + 58.24328 + ], + [ + 162.05297, + 57.83912 + ], + [ + 163.19191, + 57.615030000000104 + ], + [ + 163.05794000000017, + 56.159240000000125 + ], + [ + 162.12958000000023, + 56.12219 + ], + [ + 161.70146, + 55.285680000000156 + ], + [ + 162.11749000000017, + 54.85514 + ], + [ + 160.36877000000035, + 54.34433 + ], + [ + 160.02173000000025, + 53.20257 + ], + [ + 158.5309400000002, + 52.95868000000024 + ], + [ + 158.23118, + 51.94269 + ], + [ + 156.7897900000003, + 51.01105 + ], + [ + 156.42000000000016, + 51.7 + ], + [ + 155.99182, + 53.15895 + ], + [ + 155.43366000000012, + 55.38103000000012 + ], + [ + 155.91442000000032, + 56.767920000000146 + ], + [ + 156.75815, + 57.3647 + ], + [ + 156.8103500000001, + 57.83204 + ], + [ + 158.3643300000002, + 58.05575 + ], + [ + 160.15064000000015, + 59.314770000000124 + ], + [ + 161.87204, + 60.34300000000013 + ], + [ + 163.66969, + 61.1409000000001 + ], + [ + 164.47355000000013, + 62.55061 + ], + [ + 163.2584200000002, + 62.46627 + ], + [ + 162.65791, + 61.6425 + ], + [ + 160.1214800000001, + 60.54423 + ], + [ + 159.30232, + 61.7739600000001 + ], + [ + 156.7206800000001, + 61.43442 + ], + [ + 154.21806000000035, + 59.758180000000124 + ], + [ + 155.04375, + 59.14495 + ], + [ + 152.81185, + 58.88385 + ], + [ + 151.26573000000027, + 58.78089 + ], + [ + 151.33815000000013, + 59.50396 + ], + [ + 149.78371, + 59.65573000000015 + ], + [ + 148.54481, + 59.16448 + ], + [ + 145.48722, + 59.33637 + ], + [ + 142.19782000000018, + 59.03998 + ], + [ + 138.95848000000032, + 57.08805 + ], + [ + 135.12619, + 54.72959 + ], + [ + 136.70171, + 54.603550000000126 + ], + [ + 137.19342, + 53.97732 + ], + [ + 138.1647, + 53.755010000000254 + ], + [ + 138.80463, + 54.25455000000011 + ], + [ + 139.90151, + 54.18968000000018 + ], + [ + 141.34531, + 53.08957000000012 + ], + [ + 141.37923, + 52.23877 + ], + [ + 140.5974200000002, + 51.2396700000001 + ], + [ + 140.51308, + 50.04553000000013 + ], + [ + 140.06193000000022, + 48.44671000000017 + ], + [ + 138.55472000000023, + 46.99965 + ], + [ + 138.21971, + 46.30795 + ], + [ + 136.86232, + 45.14350000000019 + ], + [ + 135.5153500000002, + 43.989 + ], + [ + 134.86939000000027, + 43.39821 + ], + [ + 133.53687000000028, + 42.81147 + ], + [ + 132.90627000000015, + 42.7984900000001 + ], + [ + 132.27807000000027, + 43.28456000000011 + ], + [ + 130.93587000000016, + 42.55274 + ], + [ + 130.78, + 42.2200000000002 + ], + [ + 130.64000000000019, + 42.395 + ], + [ + 130.63386640840983, + 42.90301463477056 + ], + [ + 131.144687941615, + 42.92998973242695 + ], + [ + 131.28855512911562, + 44.111519680348266 + ], + [ + 131.02519000000026, + 44.96796 + ], + [ + 131.8834542176596, + 45.32116160743652 + ], + [ + 133.09712000000022, + 45.14409 + ], + [ + 133.7696439963132, + 46.116926988299156 + ], + [ + 134.1123500000002, + 47.21248000000014 + ], + [ + 134.50081, + 47.578450000000146 + ], + [ + 135.0263114767868, + 48.47822988544391 + ], + [ + 133.37359581922803, + 48.18344167743484 + ], + [ + 132.50669000000013, + 47.78896 + ], + [ + 130.98726000000013, + 47.79013 + ], + [ + 130.58229332898267, + 48.729687404976204 + ], + [ + 129.3978178244205, + 49.440600084015614 + ], + [ + 127.65740000000037, + 49.76027 + ], + [ + 127.28745568248493, + 50.73979726826545 + ], + [ + 126.93915652883786, + 51.35389415140591 + ], + [ + 126.564399041857, + 51.7842554795327 + ], + [ + 125.94634891164648, + 52.79279857035695 + ], + [ + 125.06821129771046, + 53.16104482686893 + ], + [ + 123.57147, + 53.4588 + ], + [ + 122.24574791879306, + 53.431725979213695 + ], + [ + 121.00308475147037, + 53.25140106873124 + ], + [ + 120.1770886577169, + 52.75388621684121 + ], + [ + 120.725789015792, + 52.51622630473091 + ], + [ + 120.7382, + 51.96411 + ], + [ + 120.18208000000018, + 51.64355 + ], + [ + 119.27939, + 50.58292 + ], + [ + 119.28846072802585, + 50.14288279886196 + ], + [ + 117.8792444194265, + 49.51098338479704 + ], + [ + 116.67880089728621, + 49.888531399121405 + ], + [ + 115.48569542853144, + 49.80517731383475 + ], + [ + 114.9621098165504, + 50.14024730081513 + ], + [ + 114.36245649623535, + 50.248302720737485 + ], + [ + 112.89773969935439, + 49.54356537535699 + ], + [ + 111.58123091028668, + 49.37796824807768 + ], + [ + 110.66201053267886, + 49.13012807880585 + ], + [ + 109.40244917199672, + 49.29296051695769 + ], + [ + 108.47516727095129, + 49.28254771585071 + ], + [ + 107.86817589725112, + 49.793705145865886 + ], + [ + 106.88880415245532, + 50.27429596618029 + ], + [ + 105.8865914245869, + 50.406019192092174 + ], + [ + 104.62158, + 50.275320000000164 + ], + [ + 103.67654544476036, + 50.089966132195144 + ], + [ + 102.25589000000011, + 50.51056000000011 + ], + [ + 102.06521, + 51.259910000000104 + ], + [ + 100.88948042196265, + 51.51685578063842 + ], + [ + 99.98173221232358, + 51.63400625264396 + ], + [ + 98.8614905131005, + 52.04736603454671 + ], + [ + 97.82573978067452, + 51.01099518493325 + ], + [ + 98.23176150919173, + 50.42240062112873 + ], + [ + 97.25976000000023, + 49.72605 + ], + [ + 95.81402000000017, + 49.97746000000012 + ], + [ + 94.81594933469879, + 50.01343333597089 + ], + [ + 94.14756635943561, + 50.48053660745717 + ], + [ + 93.10421, + 50.49529 + ], + [ + 92.23471154171969, + 50.80217072204175 + ], + [ + 90.71366743364078, + 50.331811835321105 + ], + [ + 88.80556684769559, + 49.47052073831247 + ], + [ + 87.75126427607685, + 49.29719798440556 + ], + [ + 87.3599703307627, + 49.21498078062916 + ], + [ + 86.82935672398966, + 49.82667470966814 + ], + [ + 85.5412699726825, + 49.69285858824816 + ], + [ + 85.11555952346211, + 50.11730296487764 + ], + [ + 84.41637739455305, + 50.311399644565824 + ], + [ + 83.93511478061893, + 50.88924551045358 + ], + [ + 83.38300377801247, + 51.069182847693895 + ], + [ + 81.94598554883996, + 50.81219594990634 + ], + [ + 80.56844689323546, + 51.38833649352844 + ], + [ + 80.03555952344172, + 50.864750881547224 + ], + [ + 77.80091556184433, + 53.40441498474755 + ], + [ + 76.52517947785478, + 54.17700348572714 + ], + [ + 76.89110029491346, + 54.49052440044193 + ], + [ + 74.38482000000013, + 53.54685000000012 + ], + [ + 73.42567874542053, + 53.489810289109755 + ], + [ + 73.50851606638437, + 54.0356167669766 + ], + [ + 72.22415001820221, + 54.37665538188679 + ], + [ + 71.1801310566095, + 54.13328522400826 + ], + [ + 70.86526655465516, + 55.169733588270105 + ], + [ + 69.0681669452729, + 55.3852501491435 + ], + [ + 68.16910037625891, + 54.97039175070438 + ], + [ + 65.6668700000001, + 54.601250000000164 + ], + [ + 65.17853356309595, + 54.35422781027208 + ], + [ + 61.43660000000014, + 54.00625 + ], + [ + 60.97806644068325, + 53.66499339457914 + ], + [ + 61.699986199800634, + 52.97999644633427 + ], + [ + 60.73999311711455, + 52.71998647725775 + ], + [ + 60.92726850774025, + 52.44754832621501 + ], + [ + 59.967533807215574, + 51.960420437215674 + ], + [ + 61.58800337102414, + 51.272658799843185 + ], + [ + 61.33742435084102, + 50.79907013610426 + ], + [ + 59.932807244715576, + 50.842194118851836 + ], + [ + 59.64228234237058, + 50.545442206415714 + ], + [ + 58.36332000000013, + 51.06364 + ], + [ + 56.77798, + 51.04355 + ], + [ + 55.71694000000011, + 50.62171000000015 + ], + [ + 54.532878452376195, + 51.02623973245937 + ], + [ + 52.32872358583106, + 51.718652248738096 + ], + [ + 50.76664839051219, + 51.692762356159875 + ], + [ + 48.70238162618105, + 50.60512848571284 + ], + [ + 48.577841424357615, + 49.874759629915644 + ], + [ + 47.549480421749394, + 50.454698391311126 + ], + [ + 46.75159630716277, + 49.35600576435374 + ], + [ + 47.0436715024766, + 49.152038886097586 + ], + [ + 46.4664457537763, + 48.39415233010493 + ], + [ + 47.31524000000016, + 47.71585 + ], + [ + 48.05725, + 47.74377 + ], + [ + 48.694733514201886, + 47.0756281601779 + ], + [ + 48.593250000000154, + 46.561040000000105 + ], + [ + 49.101160000000135, + 46.399330000000106 + ], + [ + 48.64541000000011, + 45.80629 + ], + [ + 47.67591, + 45.64149000000012 + ], + [ + 46.68201, + 44.6092000000001 + ], + [ + 47.59094, + 43.66016000000013 + ], + [ + 47.49252, + 42.98658 + ], + [ + 48.58437000000018, + 41.80888 + ], + [ + 47.98728315612604, + 41.4058192001944 + ], + [ + 47.81566572448466, + 41.15141612402135 + ], + [ + 47.373315464066394, + 41.21973236751114 + ], + [ + 46.686070591016716, + 41.827137152669906 + ], + [ + 46.40495079934894, + 41.86067515722743 + ], + [ + 45.7764, + 42.09244000000024 + ], + [ + 45.470279168485916, + 42.50278066667005 + ], + [ + 44.53762291848207, + 42.711992702803684 + ], + [ + 43.93121000000011, + 42.55496000000011 + ], + [ + 43.755990000000196, + 42.74083 + ], + [ + 42.39440000000016, + 43.2203 + ], + [ + 40.92219000000014, + 43.38215000000014 + ], + [ + 40.07696495947985, + 43.553104153002494 + ], + [ + 39.955008579271095, + 43.434997666999294 + ], + [ + 38.68, + 44.28 + ], + [ + 37.53912000000011, + 44.65721 + ], + [ + 36.67546000000013, + 45.24469 + ], + [ + 37.40317, + 45.4045100000001 + ], + [ + 38.23295, + 46.24087 + ], + [ + 37.67372, + 46.63657 + ], + [ + 39.14767, + 47.044750000000136 + ], + [ + 39.12120000000013, + 47.26336 + ], + [ + 38.22353803889948, + 47.10218984637598 + ], + [ + 38.25511233902981, + 47.54640045835697 + ], + [ + 38.77057, + 47.82562000000024 + ], + [ + 39.738277622238996, + 47.89893707945208 + ], + [ + 39.89562000000015, + 48.23241 + ], + [ + 39.67465, + 48.783820000000134 + ], + [ + 40.08078901546949, + 49.30742991799937 + ], + [ + 40.069040000000115, + 49.60105 + ], + [ + 38.59498823421356, + 49.92646190042373 + ], + [ + 38.010631137857075, + 49.91566152607473 + ], + [ + 37.39345950699524, + 50.38395335550368 + ], + [ + 36.626167840325394, + 50.225590928745135 + ], + [ + 35.35611616388812, + 50.57719737405915 + ], + [ + 35.37791, + 50.77394 + ], + [ + 35.02218305841794, + 51.2075723333715 + ], + [ + 34.22481570815441, + 51.255993150428935 + ], + [ + 34.14197838719062, + 51.566413479206204 + ], + [ + 34.391730584457235, + 51.768881740925906 + ], + [ + 33.75269982273588, + 52.33507457133166 + ], + [ + 32.71576053236717, + 52.238465481162166 + ], + [ + 32.412058139787774, + 52.28869497334978 + ], + [ + 32.15944000000022, + 52.061250000000115 + ], + [ + 31.78597, + 52.10168 + ], + [ + 31.54001834486226, + 52.74205231384644 + ], + [ + 31.305200636527985, + 53.07399587667331 + ], + [ + 31.49764, + 53.16743000000014 + ], + [ + 32.304519484188376, + 53.13272614197285 + ], + [ + 32.693643019346126, + 53.35142080343215 + ], + [ + 32.405598585751164, + 53.618045355842014 + ], + [ + 31.731272820774592, + 53.79402944601202 + ], + [ + 31.791424187962406, + 53.974638576872195 + ], + [ + 31.384472283663825, + 54.15705638286238 + ], + [ + 30.75753380709878, + 54.8117709417844 + ], + [ + 30.97183597181325, + 55.081547756564134 + ], + [ + 30.87390913262007, + 55.55097646750352 + ], + [ + 29.89629438652244, + 55.7894632025305 + ], + [ + 29.37157189303079, + 55.67009064393628 + ], + [ + 29.229513380660393, + 55.91834422466641 + ], + [ + 28.17670942557794, + 56.16912995057879 + ], + [ + 27.855282016722526, + 56.75932648378438 + ], + [ + 27.770015903440992, + 57.2442581244112 + ], + [ + 27.288184848751655, + 57.47452830670392 + ], + [ + 27.71668582531578, + 57.79189911562446 + ], + [ + 27.420150000000206, + 58.72457000000014 + ], + [ + 28.131699253051863, + 59.300825100331 + ], + [ + 27.98112, + 59.47537 + ], + [ + 29.1177, + 60.02805000000012 + ], + [ + 28.07, + 60.50352000000015 + ], + [ + 30.211107212044652, + 61.780027777749694 + ], + [ + 31.139991082491036, + 62.35769277612445 + ], + [ + 31.516092156711267, + 62.867687486412905 + ], + [ + 30.035872430142803, + 63.552813625738565 + ], + [ + 30.44468468600374, + 64.20445343693908 + ], + [ + 29.544429559047018, + 64.94867157659056 + ], + [ + 30.21765, + 65.80598 + ], + [ + 29.054588657352383, + 66.94428620062203 + ], + [ + 29.977426385220696, + 67.69829702419275 + ], + [ + 28.445943637818772, + 68.364612942164 + ], + [ + 28.591929559043365, + 69.0647769232867 + ], + [ + 29.39955, + 69.15692000000018 + ], + [ + 31.10108000000011, + 69.55811 + ], + [ + 32.13272000000026, + 69.90595000000025 + ], + [ + 33.77547, + 69.30142000000012 + ], + [ + 36.51396, + 69.06342 + ], + [ + 40.292340000000166, + 67.9324 + ], + [ + 41.05987000000013, + 67.45713000000012 + ], + [ + 41.12595000000019, + 66.79158000000012 + ], + [ + 40.01583, + 66.26618000000013 + ], + [ + 38.38295, + 65.9995300000001 + ], + [ + 33.918710000000175, + 66.75961 + ], + [ + 33.18444, + 66.63253 + ], + [ + 34.81477, + 65.90015000000014 + ], + [ + 34.87857425307877, + 65.4362128770482 + ], + [ + 34.94391000000016, + 64.41437000000016 + ], + [ + 36.23129, + 64.10945 + ], + [ + 37.01273000000012, + 63.84983000000011 + ], + [ + 37.14197000000016, + 64.33471 + ], + [ + 36.539579035089815, + 64.76446 + ], + [ + 37.17604000000014, + 65.14322000000013 + ], + [ + 39.59345, + 64.52079000000018 + ], + [ + 40.43560000000011, + 64.76446 + ], + [ + 39.76260000000016, + 65.49682 + ], + [ + 42.0930900000001, + 66.47623 + ], + [ + 43.01604000000012, + 66.4185800000001 + ], + [ + 43.94975000000014, + 66.06908 + ], + [ + 44.53226, + 66.75634000000014 + ], + [ + 43.69839, + 67.35245 + ], + [ + 44.18795000000014, + 67.95051 + ], + [ + 43.45282, + 68.57079 + ], + [ + 46.25000000000014, + 68.25 + ], + [ + 46.82134000000016, + 67.68997 + ], + [ + 45.55517, + 67.56652 + ], + [ + 45.5620200000001, + 67.0100500000002 + ], + [ + 46.34915000000015, + 66.6676700000001 + ], + [ + 47.894160000000255, + 66.88455000000016 + ], + [ + 48.13876, + 67.52238 + ], + [ + 50.22766000000016, + 67.99867000000015 + ], + [ + 53.71743000000018, + 68.85738000000012 + ], + [ + 54.47171, + 68.80815 + ], + [ + 53.48582000000013, + 68.20131 + ], + [ + 54.72628, + 68.09702 + ], + [ + 55.44268000000014, + 68.43866 + ], + [ + 57.317020000000156, + 68.46628 + ], + [ + 58.80200000000022, + 68.88082 + ], + [ + 59.94142000000019, + 68.2784400000001 + ], + [ + 61.07784000000018, + 68.94069 + ], + [ + 60.03, + 69.52 + ], + [ + 60.55, + 69.85 + ], + [ + 63.50400000000016, + 69.54739 + ], + [ + 64.888115, + 69.23483500000015 + ], + [ + 68.51216000000014, + 68.09233000000017 + ], + [ + 69.18068, + 68.61563000000012 + ], + [ + 68.16444, + 69.14436 + ], + [ + 68.13522, + 69.35649 + ], + [ + 66.93008000000012, + 69.45461000000012 + ], + [ + 67.25976, + 69.92873 + ], + [ + 66.72492000000014, + 70.70889000000014 + ], + [ + 66.69466, + 71.02897000000024 + ], + [ + 68.54006000000012, + 71.93450000000024 + ], + [ + 69.19636000000011, + 72.84336000000016 + ], + [ + 69.94, + 73.04000000000013 + ], + [ + 72.58754, + 72.7762900000001 + ], + [ + 72.79603, + 72.22006 + ], + [ + 71.8481100000001, + 71.40898 + ], + [ + 72.47011, + 71.09019 + ], + [ + 72.79188, + 70.39114 + ], + [ + 72.56470000000022, + 69.02085 + ], + [ + 73.66787, + 68.4079 + ], + [ + 73.2387, + 67.7404 + ], + [ + 71.28000000000011, + 66.32000000000016 + ], + [ + 72.42301000000018, + 66.17267000000018 + ], + [ + 72.82077, + 66.53267 + ], + [ + 73.92099000000016, + 66.78946000000013 + ], + [ + 74.1865100000002, + 67.28429 + ], + [ + 75.052, + 67.76047000000017 + ], + [ + 74.46926000000016, + 68.32899 + ], + [ + 74.93584000000013, + 68.98918 + ], + [ + 73.84236, + 69.07146 + ], + [ + 73.60187000000022, + 69.62763 + ], + [ + 74.3998, + 70.63175 + ], + [ + 73.1011, + 71.44717000000026 + ], + [ + 74.89082000000022, + 72.12119 + ], + [ + 74.65926, + 72.83227 + ], + [ + 75.15801000000019, + 72.85497000000012 + ], + [ + 75.68351, + 72.30056000000013 + ], + [ + 75.28898000000012, + 71.33556 + ], + [ + 76.35911, + 71.15287000000015 + ], + [ + 75.90313000000017, + 71.87401 + ], + [ + 77.57665000000011, + 72.26717 + ], + [ + 79.65202000000014, + 72.32011 + ], + [ + 81.5, + 71.75 + ], + [ + 80.61071000000013, + 72.58285000000012 + ], + [ + 80.51109, + 73.6482 + ], + [ + 82.25, + 73.85000000000011 + ], + [ + 84.65526, + 73.80591000000018 + ], + [ + 86.82230000000024, + 73.93688 + ], + [ + 86.00956, + 74.45967000000016 + ], + [ + 87.16682000000017, + 75.11643 + ], + [ + 88.31571000000011, + 75.14393 + ], + [ + 90.26, + 75.64 + ], + [ + 92.90058, + 75.77333 + ], + [ + 93.23421000000016, + 76.0472 + ], + [ + 95.86000000000016, + 76.1400000000001 + ], + [ + 96.67821, + 75.91548 + ], + [ + 98.92254000000023, + 76.44689 + ], + [ + 100.75967000000023, + 76.43028 + ], + [ + 101.03532, + 76.86189 + ], + [ + 101.99084000000013, + 77.2875400000002 + ], + [ + 104.3516000000001, + 77.69792 + ], + [ + 106.06664000000015, + 77.37389 + ], + [ + 104.70500000000024, + 77.1274 + ], + [ + 106.97013000000013, + 76.97419 + ] + ] + ], + [ + [ + [ + 105.07547, + 78.30689 + ], + [ + 99.43814, + 77.921 + ], + [ + 101.2649, + 79.23399 + ], + [ + 102.08635, + 79.34641 + ], + [ + 102.837815, + 79.28129 + ], + [ + 105.37243, + 78.71334 + ], + [ + 105.07547, + 78.30689 + ] + ] + ], + [ + [ + [ + 51.13618655783128, + 80.54728017854094 + ], + [ + 49.79368452332071, + 80.41542776154822 + ], + [ + 48.89441124857754, + 80.3395667589437 + ], + [ + 48.754936557821765, + 80.17546824820084 + ], + [ + 47.586119012244154, + 80.01018117951534 + ], + [ + 46.502825962109654, + 80.24724681265437 + ], + [ + 47.07245527526291, + 80.55942414012947 + ], + [ + 44.846958042181114, + 80.58980988231718 + ], + [ + 46.79913862487123, + 80.77191762971364 + ], + [ + 48.318477410684665, + 80.78400991486996 + ], + [ + 48.522806023966695, + 80.51456899690015 + ], + [ + 49.09718956889091, + 80.75398590770843 + ], + [ + 50.03976769389462, + 80.91888540315182 + ], + [ + 51.52293297710369, + 80.69972565380192 + ], + [ + 51.13618655783128, + 80.54728017854094 + ] + ] + ], + [ + [ + [ + 99.93976, + 78.88094 + ], + [ + 97.75794, + 78.7562 + ], + [ + 94.97259, + 79.044745 + ], + [ + 93.31288, + 79.4265 + ], + [ + 92.5454, + 80.14379 + ], + [ + 91.18107, + 80.34146 + ], + [ + 93.77766, + 81.0246 + ], + [ + 95.940895, + 81.2504 + ], + [ + 97.88385, + 80.746975 + ], + [ + 100.186655, + 79.780135 + ], + [ + 99.93976, + 78.88094 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Slovakia", + "sov_a3": "SVK", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Slovakia", + "adm0_a3": "SVK", + "geou_dif": 0, + "geounit": "Slovakia", + "gu_a3": "SVK", + "su_dif": 0, + "subunit": "Slovakia", + "su_a3": "SVK", + "brk_diff": 0, + "name": "Slovakia", + "name_long": "Slovakia", + "brk_a3": "SVK", + "brk_name": "Slovakia", + "brk_group": null, + "abbrev": "Svk.", + "postal": "SK", + "formal_en": "Slovak Republic", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Slovak Republic", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 4, + "mapcolor9": 4, + "mapcolor13": 9, + "pop_est": 5463046, + "gdp_md_est": 119500, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "SK", + "iso_a3": "SVK", + "iso_n3": "703", + "un_a3": "703", + "wb_a2": "SK", + "wb_a3": "SVK", + "woe_id": -99, + "adm0_a3_is": "SVK", + "adm0_a3_us": "SVK", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 8, + "long_len": 8, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 18.853144158613617, + 49.49622976337764 + ], + [ + 18.90957482267632, + 49.435845852244576 + ], + [ + 19.320712517990472, + 49.571574001659194 + ], + [ + 19.825022820726872, + 49.21712535256923 + ], + [ + 20.415839471119853, + 49.43145335549977 + ], + [ + 20.887955356538413, + 49.32877228453583 + ], + [ + 21.607808058364213, + 49.47010732685409 + ], + [ + 22.558137648211755, + 49.085738023467144 + ], + [ + 22.28084191253356, + 48.82539215758067 + ], + [ + 22.085608351334855, + 48.42226430927179 + ], + [ + 21.872236362401736, + 48.31997081155002 + ], + [ + 20.801293979584926, + 48.623854071642384 + ], + [ + 20.473562045989866, + 48.562850043321816 + ], + [ + 20.239054396249347, + 48.32756724709692 + ], + [ + 19.769470656013112, + 48.202691148463614 + ], + [ + 19.661363559658497, + 48.26661489520866 + ], + [ + 19.17436486173989, + 48.11137889260387 + ], + [ + 18.77702477384767, + 48.081768296900634 + ], + [ + 18.696512892336926, + 47.880953681014404 + ], + [ + 17.857132602620027, + 47.75842886005037 + ], + [ + 17.48847293464982, + 47.867466132186216 + ], + [ + 16.979666782304037, + 48.123497015976305 + ], + [ + 16.879982944413, + 48.47001333270947 + ], + [ + 16.960288120194576, + 48.5969823268506 + ], + [ + 17.101984897538898, + 48.816968899117114 + ], + [ + 17.545006951577108, + 48.80001902932537 + ], + [ + 17.88648481616181, + 48.90347524677371 + ], + [ + 17.913511590250465, + 48.996492824899086 + ], + [ + 18.104972771891852, + 49.04398346617531 + ], + [ + 18.170498488037964, + 49.271514797556435 + ], + [ + 18.399993523846177, + 49.31500051533004 + ], + [ + 18.554971144289482, + 49.495015367218784 + ], + [ + 18.853144158613617, + 49.49622976337764 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 6, + "sovereignt": "Slovenia", + "sov_a3": "SVN", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Slovenia", + "adm0_a3": "SVN", + "geou_dif": 0, + "geounit": "Slovenia", + "gu_a3": "SVN", + "su_dif": 0, + "subunit": "Slovenia", + "su_a3": "SVN", + "brk_diff": 0, + "name": "Slovenia", + "name_long": "Slovenia", + "brk_a3": "SVN", + "brk_name": "Slovenia", + "brk_group": null, + "abbrev": "Slo.", + "postal": "SLO", + "formal_en": "Republic of Slovenia", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Slovenia", + "name_alt": null, + "mapcolor7": 2, + "mapcolor8": 3, + "mapcolor9": 2, + "mapcolor13": 12, + "pop_est": 2005692, + "gdp_md_est": 59340, + "pop_year": -99, + "lastcensus": 2011, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "SI", + "iso_a3": "SVN", + "iso_n3": "705", + "un_a3": "705", + "wb_a2": "SI", + "wb_a3": "SVN", + "woe_id": -99, + "adm0_a3_is": "SVN", + "adm0_a3_us": "SVN", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Southern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 8, + "long_len": 8, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 13.806475457421527, + 46.509306138691215 + ], + [ + 14.63247155117483, + 46.43181732846955 + ], + [ + 15.137091912504985, + 46.65870270444703 + ], + [ + 16.011663852612656, + 46.6836107448117 + ], + [ + 16.202298211337364, + 46.85238597267696 + ], + [ + 16.370504998447416, + 46.841327216166505 + ], + [ + 16.564808383864857, + 46.50375092221983 + ], + [ + 15.768732944408553, + 46.23810822202345 + ], + [ + 15.671529575267556, + 45.83415355079788 + ], + [ + 15.323953891672405, + 45.73178253842768 + ], + [ + 15.327674594797429, + 45.45231639259323 + ], + [ + 14.935243767972935, + 45.471695054702685 + ], + [ + 14.595109490627806, + 45.634940904312714 + ], + [ + 14.411968214585414, + 45.46616567644746 + ], + [ + 13.715059848697223, + 45.500323798192376 + ], + [ + 13.937630242578308, + 45.59101593686462 + ], + [ + 13.698109978905478, + 46.01677806251735 + ], + [ + 13.806475457421527, + 46.509306138691215 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Sweden", + "sov_a3": "SWE", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Sweden", + "adm0_a3": "SWE", + "geou_dif": 0, + "geounit": "Sweden", + "gu_a3": "SWE", + "su_dif": 0, + "subunit": "Sweden", + "su_a3": "SWE", + "brk_diff": 0, + "name": "Sweden", + "name_long": "Sweden", + "brk_a3": "SWE", + "brk_name": "Sweden", + "brk_group": null, + "abbrev": "Swe.", + "postal": "S", + "formal_en": "Kingdom of Sweden", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Sweden", + "name_alt": null, + "mapcolor7": 1, + "mapcolor8": 4, + "mapcolor9": 2, + "mapcolor13": 4, + "pop_est": 9059651, + "gdp_md_est": 344300, + "pop_year": -99, + "lastcensus": -99, + "gdp_year": -99, + "economy": "2. Developed region: nonG7", + "income_grp": "1. High income: OECD", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "SE", + "iso_a3": "SWE", + "iso_n3": "752", + "un_a3": "752", + "wb_a2": "SE", + "wb_a3": "SWE", + "woe_id": -99, + "adm0_a3_is": "SWE", + "adm0_a3_us": "SWE", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Northern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 6, + "long_len": 6, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 22.18317345550193, + 65.72374054632017 + ], + [ + 21.21351687997722, + 65.02600535751527 + ], + [ + 21.369631381930958, + 64.41358795842429 + ], + [ + 19.77887576669022, + 63.60955434839504 + ], + [ + 17.84777916837521, + 62.74940013289681 + ], + [ + 17.119554884518124, + 61.34116567651097 + ], + [ + 17.83134606290639, + 60.63658336042741 + ], + [ + 18.78772179533209, + 60.081914374422595 + ], + [ + 17.86922488777634, + 58.9537661810587 + ], + [ + 16.829185011470088, + 58.71982697207339 + ], + [ + 16.447709588291474, + 57.041118069071885 + ], + [ + 15.879785597403783, + 56.10430186626866 + ], + [ + 14.666681349352075, + 56.200885118222175 + ], + [ + 14.100721062891465, + 55.40778107362265 + ], + [ + 12.942910597392057, + 55.36173737245058 + ], + [ + 12.625100538797028, + 56.30708018658197 + ], + [ + 11.787942335668674, + 57.44181712506307 + ], + [ + 11.027368605196868, + 58.85614940045936 + ], + [ + 11.468271925511146, + 59.43239329694604 + ], + [ + 12.3003658382749, + 60.11793284773003 + ], + [ + 12.631146681375185, + 61.293571682370136 + ], + [ + 11.992064243221563, + 61.80036245385655 + ], + [ + 11.930569288794231, + 63.12831757267698 + ], + [ + 12.579935336973934, + 64.06621898055833 + ], + [ + 13.571916131248713, + 64.04911408146971 + ], + [ + 13.919905226302204, + 64.44542064071608 + ], + [ + 13.55568973150909, + 64.78702769638151 + ], + [ + 15.108411492583002, + 66.19386688909547 + ], + [ + 16.108712192456778, + 67.30245555283689 + ], + [ + 16.768878614985482, + 68.0139366726314 + ], + [ + 17.729181756265348, + 68.01055186631628 + ], + [ + 17.993868442464333, + 68.56739126247736 + ], + [ + 19.878559604581255, + 68.40719432237258 + ], + [ + 20.025268995857886, + 69.0651386583127 + ], + [ + 20.645592889089528, + 69.10624726020087 + ], + [ + 21.978534783626117, + 68.6168456081807 + ], + [ + 23.53947309743444, + 67.93600861273525 + ], + [ + 23.565879754335583, + 66.39605093043743 + ], + [ + 23.903378533633802, + 66.00692739527962 + ], + [ + 22.18317345550193, + 65.72374054632017 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "scalerank": 1, + "featurecla": "Admin-0 country", + "labelrank": 3, + "sovereignt": "Ukraine", + "sov_a3": "UKR", + "adm0_dif": 0, + "level": 2, + "type": "Sovereign country", + "admin": "Ukraine", + "adm0_a3": "UKR", + "geou_dif": 0, + "geounit": "Ukraine", + "gu_a3": "UKR", + "su_dif": 0, + "subunit": "Ukraine", + "su_a3": "UKR", + "brk_diff": 0, + "name": "Ukraine", + "name_long": "Ukraine", + "brk_a3": "UKR", + "brk_name": "Ukraine", + "brk_group": null, + "abbrev": "Ukr.", + "postal": "UA", + "formal_en": "Ukraine", + "formal_fr": null, + "note_adm0": null, + "note_brk": null, + "name_sort": "Ukraine", + "name_alt": null, + "mapcolor7": 5, + "mapcolor8": 1, + "mapcolor9": 6, + "mapcolor13": 3, + "pop_est": 45700395, + "gdp_md_est": 339800, + "pop_year": -99, + "lastcensus": 2001, + "gdp_year": -99, + "economy": "6. Developing region", + "income_grp": "4. Lower middle income", + "wikipedia": -99, + "fips_10": null, + "iso_a2": "UA", + "iso_a3": "UKR", + "iso_n3": "804", + "un_a3": "804", + "wb_a2": "UA", + "wb_a3": "UKR", + "woe_id": -99, + "adm0_a3_is": "UKR", + "adm0_a3_us": "UKR", + "adm0_a3_un": -99, + "adm0_a3_wb": -99, + "continent": "Europe", + "region_un": "Europe", + "subregion": "Eastern Europe", + "region_wb": "Europe & Central Asia", + "name_len": 7, + "long_len": 7, + "abbrev_len": 4, + "tiny": -99, + "homepart": 1 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 31.785998162571587, + 52.101677964885454 + ], + [ + 32.15941206231267, + 52.06126699483322 + ], + [ + 32.41205813978763, + 52.28869497334975 + ], + [ + 32.71576053236697, + 52.23846548116205 + ], + [ + 33.75269982273571, + 52.335074571331695 + ], + [ + 34.39173058445701, + 51.76888174092579 + ], + [ + 34.14197838719039, + 51.56641347920623 + ], + [ + 34.22481570815427, + 51.25599315042896 + ], + [ + 35.02218305841788, + 51.20757233337146 + ], + [ + 35.37792361831512, + 50.77395539001035 + ], + [ + 35.35611616388795, + 50.57719737405906 + ], + [ + 36.62616784032534, + 50.225590928745135 + ], + [ + 37.39345950699507, + 50.38395335550359 + ], + [ + 38.010631137856905, + 49.91566152607463 + ], + [ + 38.59498823421342, + 49.92646190042363 + ], + [ + 40.06905846533911, + 49.6010554062817 + ], + [ + 40.08078901546935, + 49.307429917999286 + ], + [ + 39.67466393408753, + 48.78381846780188 + ], + [ + 39.89563235856758, + 48.23240509703143 + ], + [ + 39.738277622238826, + 47.89893707945199 + ], + [ + 38.7705847511412, + 47.825608222029814 + ], + [ + 38.25511233902975, + 47.546400458356814 + ], + [ + 38.22353803889942, + 47.102189846375886 + ], + [ + 37.42513715998999, + 47.022220567404204 + ], + [ + 36.75985477066439, + 46.698700263040934 + ], + [ + 35.82368452326483, + 46.64596446388707 + ], + [ + 34.96234174982388, + 46.27319651954964 + ], + [ + 35.020787794745985, + 45.65121898048466 + ], + [ + 35.51000857925317, + 45.40999339454619 + ], + [ + 36.52999799983016, + 45.46998973243706 + ], + [ + 36.33471276219916, + 45.113215643893966 + ], + [ + 35.23999922052812, + 44.939996242851606 + ], + [ + 33.882511020652885, + 44.36147858334407 + ], + [ + 33.326420932760044, + 44.56487702084489 + ], + [ + 33.54692426934946, + 45.03477081967489 + ], + [ + 32.4541744321055, + 45.32746613217608 + ], + [ + 32.630804477679135, + 45.51918569597891 + ], + [ + 33.58816206231839, + 45.85156850848024 + ], + [ + 33.29856733575471, + 46.080598456397844 + ], + [ + 31.74414025241518, + 46.333347886737386 + ], + [ + 31.675307244602408, + 46.70624502215554 + ], + [ + 30.7487488136091, + 46.583100084004 + ], + [ + 30.377608676888883, + 46.03241018328567 + ], + [ + 29.603289015427436, + 45.293308010431126 + ], + [ + 29.149724969201653, + 45.464925442072456 + ], + [ + 28.67977949393938, + 45.304030870131704 + ], + [ + 28.233553501099042, + 45.488283189468376 + ], + [ + 28.485269402792767, + 45.5969070501459 + ], + [ + 28.65998742037158, + 45.93998688413164 + ], + [ + 28.933717482221624, + 46.2588304713725 + ], + [ + 28.862972446414062, + 46.43788930926383 + ], + [ + 29.07210696789929, + 46.517677720722496 + ], + [ + 29.170653924279886, + 46.3792623968287 + ], + [ + 29.759971958136394, + 46.34998769793536 + ], + [ + 30.024658644335375, + 46.42393667254504 + ], + [ + 29.838210076626297, + 46.52532583270169 + ], + [ + 29.908851759569302, + 46.67436066343146 + ], + [ + 29.559674106573112, + 46.928582872091326 + ], + [ + 29.415135125452736, + 47.34664520933258 + ], + [ + 29.05086795422733, + 47.5102269557525 + ], + [ + 29.12269819511303, + 47.849095160506465 + ], + [ + 28.670891147585166, + 48.1181485052341 + ], + [ + 28.259546746541844, + 48.15556224221342 + ], + [ + 27.522537469195157, + 48.467119452501116 + ], + [ + 26.857823520624805, + 48.368210761094495 + ], + [ + 26.619336785597795, + 48.22072622333347 + ], + [ + 26.19745039236693, + 48.22088125263035 + ], + [ + 25.9459411964024, + 47.987148749374214 + ], + [ + 25.20774336111299, + 47.89105642352747 + ], + [ + 24.866317172960578, + 47.737525743188314 + ], + [ + 24.40205610525038, + 47.98187775328043 + ], + [ + 23.76095828623741, + 47.985598456405455 + ], + [ + 23.142236362406805, + 48.09634105080695 + ], + [ + 22.710531447040495, + 47.88219391538941 + ], + [ + 22.640819939878753, + 48.15023956968736 + ], + [ + 22.085608351334855, + 48.42226430927179 + ], + [ + 22.28084191253356, + 48.82539215758067 + ], + [ + 22.558137648211755, + 49.085738023467144 + ], + [ + 22.776418898212626, + 49.02739533140962 + ], + [ + 22.518450148211603, + 49.47677358661974 + ], + [ + 23.426508416444392, + 50.308505764357456 + ], + [ + 23.922757195743262, + 50.42488108987875 + ], + [ + 24.029985792748903, + 50.70540660257518 + ], + [ + 23.527070753684374, + 51.57845408793024 + ], + [ + 24.00507775238421, + 51.61744395609446 + ], + [ + 24.553106316839518, + 51.888461005249184 + ], + [ + 25.32778771332701, + 51.91065603291855 + ], + [ + 26.337958611768556, + 51.83228872334793 + ], + [ + 27.454066196408434, + 51.59230337178447 + ], + [ + 28.24161502453657, + 51.57222707783907 + ], + [ + 28.61761274589225, + 51.42771393493484 + ], + [ + 28.992835320763533, + 51.602044379271476 + ], + [ + 29.254938185347925, + 51.368234361366895 + ], + [ + 30.157363722460897, + 51.41613841410147 + ], + [ + 30.555117221811457, + 51.31950348571566 + ], + [ + 30.619454380014844, + 51.822806098022376 + ], + [ + 30.927549269338982, + 52.04235342061439 + ], + [ + 31.785998162571587, + 52.101677964885454 + ] + ] + ] + } + } + ] +} diff --git a/components/outputs/map-ipyleaflet/index.qmd b/components/outputs/map-ipyleaflet/index.qmd new file mode 100644 index 00000000..2fe2c936 --- /dev/null +++ b/components/outputs/map-ipyleaflet/index.qmd @@ -0,0 +1,84 @@ +--- +title: Map (ipyleaflet) +sidebar: components +preview: '
+ + + +
+ + ' +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/map-ipyleaflet/ + contents: + - title: Preview + file: app-core.py + height: 410 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZASzwBs4o6uK2Y6Ug34BZDMmQBiZAB5ZAHQiNmyAM4ALVhFxY4AD3QM4atQKEjkAV1ZKVLTdtwB3VgBMA5nApnWg4fzGEG5wDAD6rp7ekjLySko2WBoATAAUCmAAghBsnNy80eLoGQCU8RBKAAJBIeGRXvzScorBcHTIMBipJYhKkpLGFFYMOUWpxNRUDAC8qQCsAAxYAGzJc8kAnADsABxzOxtzWwCMREsAzAAs+wsbG+fL61eXJUQAXqTM0+clMc1KhFQFFw6AQKDAVH0FDAAF8ALpAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZASzwBs4o6uK2Y6Ug34BZDMmQBiZAB5ZAHQiNmyAM4ALVhFwChI5AEFMRAK6slKlpu24A7qwAmAczgU1e4f1KmK6XwD6Di5uRAzUjnAMQU6u-NJyihBKGOgB5sgAvMjmOFCuAbzmjgAUPn6BwXElCmAwGLUAlI2SMvJKHRCRdOpRAG5RJdr+FETlI0RqcGpqrOSNiEqSkgAC4V1RMSHxbUnLyN3I9eglC0v7y+EUpgwQyOInxNRUDJklAKwADFgAbABM7z+AE4AOwADneYKB7xBAEYiN8AMwAFkhnyBQMRP0BKORjSIAC9SMxMoiWgl2skqakskZMCVUulWJN+lFGkpCKgKLh0AgUGAqAAPChgAC+AF0gA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/map-ipyleaflet/ + contents: + - title: shinywidgets.output_widget + href: map-ipyleaflet.html#details + signature: null + - title: shinywidgets.register_widget + href: map-ipyleaflet.html#details + signature: null +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/outputs/map-ipyleaflet/ + contents: + - title: GeoJSON and Markers + description: Read in country boundaries from a GeoJSON file and add markers to + the map. + apps: + - title: Preview + file: app-variation-geojson-and-markers-preview.py + height: 300 + - title: Express + file: app-variation-geojson-and-markers-express.py + resources: + - europe_110.geo.json + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQGJk4APWdAGzmSggBNkeoFKMgBmAJ1IxEAHQgMAFhQroAzogD06gJZ4OUERwpYxcKDwry4PUsRVYtpddXVtBcFRRdRccMSvUA5nCkAPoAVirkWIowbLIKSqoa2rqmBnBGJmYWVjZ2Dk4QXlQeXj5+6jBQYgDWvtEUsbJaMOikYhTIEeTNre2d6ILybFoARr1tHchi3NYwsrLiksg6uHrpnS2TnQDiwQBSAMoA8gByRACyGJfVdWLIyAwAPE+LEjDIKvJaELhYzOgTCoVCs+lMAK5aN7LL4-XAAdy0PCCFBBW3602oPF8IURyIyD2erwgsksJmQAF5kIMLCNRlgAApDAAUIRCIi0HDZAEpZIiLMhSOhqMyyXAcNVqJ11MhpGA4OCJMKQgBGFUABiwQVIWG6JMIsrAYjl3K4IJEMggDweZHBlDEuBCo1IdoEYi07kpXUiECwbFIZmZIl5JND2JE01mkhCZH9YiDpgoirg3Mt1sxSbEVpAsnT6blsfacpQctGrmINTlBFzeYeco5bDYAGFSHHi5HeJIsMR5KQtMQ4MzgHKTDwq4afI3SPDx3KAiZqLOwO1uEE5QBdbnVq3WgC+C1DkOiACZmXKAIJW1brQzIK7oE0H2QAARMvBxeJRhOQL1k4eQVToMyqY1g8gFevezIDpQvgUsyACsmoAGzHvBx4AJwAOwABzwdh6HwZhKpEJqADMAAseHquh6GkUhaEUeRW7IAAXqQkgUqRpqPD+xKgcg2rhD6Xp7KQRxnMy36-jutYCEIFK2vajrOq61QeioRA8dJtYPB4axwBSIBScSOl5nKQpQMQWgULg7bEcZ-GmXKAhfOeYgzLZtByuh45aSZpnWvWnJsMcgxWTZ7aavZfmOTpcrwnAWgBIodmaUSsUPLu26mb2ABuOJ6RwhkFq2RZeWA8LfFQS4ufIbkee2crqkuDYhWF1meSgmrwVlDkyXmhVwDGUCNqMlk1BSMydjAMalWIaW8fx3Hpf1gFYGYPAhK45TMoJerLYtobpm0PydFSVy1L4zL+sQggOBAcFoVgx7quRmG0SRWAqseKrwXhzE8DMAQBFAZYGQAYiNKgpn16ZrRtW3eFdJ2UAd0n8SYmZWuBMUQAaYA2cKtAE8wFBgLu65AA + - title: Core + file: app-variation-geojson-and-markers-core.py + resources: + - europe_110.geo.json + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQGJk4APWdAGzmSggBNkeoFKMgBmAJ1IxEAHQgMAFhQroAzogD06gJZ4OUERwpYxcKDwry4PUsRVYtpddXVtBcFRRdRccMSvUA5nCkAPoAVirkWIowbLIKSqoa2rqmBnBGJmYWVjZ2Dk4QXlQeXj5+6jBQYgDWvtEUsbJaMOikYhTIEeTNre2d6ILybFoARr1tHchi3NYwsrLiksg6uHrpnS2TnQDiwQBSAMoA8gByRACyGJfVdWLIyAwAPE+LEjDIKvJaELgrfVMAIKYIgAVy0b2WXx+uAA7loeEEKCp-ttkKRQcpMSF4YiMkQTLxfDiEUiHs9XhBZJYTMgALzIQYWEajLAABSGAAoQiERFoODyAJSyeEWdHoaicmlwHDVaiddTIaRgOCgiQSkIARk1AAYsEFSFhulTCEqwGJlYKuCiRDIIA8HmRQZQxLgQqMMbxqlp3PSupEIFg2KQzJyRMKqZGeHARNNZpIQmRg2Iw6YKGq4IK7Q7phk1faQLIcznlUn2sqUMrRq5iDVlQQi8WHsq+Ww2ABhUjJitx3iSLDEeSkLTEOCc4DKkw8etmnxt0iwmfKgImahLsDtbhBZUAXUFDftDoAvgtIxh0CFwX7wbKgry2OCeJzGw8b-IAEzPsCA+2rdaGZArnQS0DxzDEsQoEk8QoL8qmAsB93JZAXlkCNT2jWMVF8AA3XxOR+dBMSIcDCIoIgsJUFQHAgLMX2QAABQlozEKCyUeZDKRzDDkDgzlaMPJs4L9IDOVHShfDpTkAFY9QANnfKT3wATgAdgADiktSlKklTNSIPUAGYABZNJ1JSlIM2TFOMozEIAL1ISQ6QMq12JQyMmweA1wgDP09lII4zk5JD3M84sBCEOknRdN0PWdAQxB9FQiDcziwodDw1jgOkQBCtL0uLZVSEGYgtAoXAez0vK6IK5swAEL5ATEGYKtoZUlJnVKatqlt+TYY4SrK1qUD1KquoE2q6thOAtACRRKpSiluqbI9QNqodcJYzKOBy0su3LNqwFhb4qHXBr5Calqe2VHV11bfrBvKns9Sk1bqomsLtrgRMoDbUYoFrOkZj7GBE32sRFo45bkFcpaPodOCsDMHgQlccpOW841YahjzPLaH5OgZK5ajw4NiEEajJMUrB3x1IyVIs-SsE1d9NSkzTEJ4GYAgCKBq2ygAxX6sOx0LPMR5HUe8PD8coUXKWhkx0zEe0hPG09zz9YF0E5c9Ly0cicN8CNTTAcqJVoM3mAoMAjx3IA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +`ipyleaflet` allows us to create interactive maps via [ipywidgets](https://ipywidgets.readthedocs.io/en/stable/). + +To insert an `ipyleaflet` map do the following tasks: + + 1. Add `shinywidgets.output_widget()` to the UI of your app to create a div in which to display the map. Where you call this function will determine where the map will appear within the layout of the app. + + 2. Provide an argument to the `id` parameter in the `shinywidgets.output_widget()` function call. This argument will be used to identify the map in the server function. + + 3. Within the `server()` function, create your `ipyleaflet` map and assign it to a variable. Your map does not need to be created within a nested function in server() like many other shiny for python components. + + 4. Register your map with shiny using `shinywidgets.register_widget()` by passing in the id of the map and the map variable. + + Visit [shiny.posit.co/py/docs/ipywidgets.html](https://shiny.posit.co/py/docs/ipywidgets.html) to learn more about using ipywidgets with Shiny. + +:::{#variations} +::: diff --git a/components/outputs/plot-matplotlib.qmd b/components/outputs/plot-matplotlib.qmd deleted file mode 100644 index bac6f1cb..00000000 --- a/components/outputs/plot-matplotlib.qmd +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: "Plot (Matplotlib)" -sidebar: components -preview: | -
- -
-listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: "Plot (Matplotlib)" - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACGKM1AG2LK5oBGWbN14soAZxbcyAHQh0GzFhACu9bOKkRU8gGaNiMaVC7xGqSgHNVNCFMVNWPKABMA+pYg27E-YeMJAAs7TUdlAEF0PBZGSlc4RhjbeXk0VHdbFgBeFlssKCs4dz0uW1cACnkWGryaDDtUVTJ3CX4ExirIWXwWHoA5dQFElmI9FgFfHpiABhiARhm5lgAmGYBKPGra-OJmppbRMi6jns35ddSIeQTxiUSAN0SKxuaYvc43lnuJCRpSdaIbY1AACcQgHSwPGOpjI2R6ERYIQkZGIVkYsDOwJYt2k0IqgOxtRx41yLg8Xh89gJRNq7F+ORJwB6AmIrmw7npEncVh6AF0rsTiXoaFYYlAAB6MmQYCSqARHCQ0iBC2qSjDI45cmKvMgYCAEmIJew0MjYbIAFUYqjglxVqvEEtlcBaZFNXDgXQACqZzCwvdZbCqALKSH5Y+2q9X3FoSrhQYZcLqhhkVKyXMB2h2O50tbDxxNdAAilD+ZojtJqcTIqkYKpFvOuTfSjKiqAq6UyNBi90YTySOLgAlUVkt1tt8jAAF8+UA - height: 500px - code: | - import matplotlib.pyplot as plt - from palmerpenguins import load_penguins - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_slider("n", "Number of bins", 0, 100, 20), - ui.output_plot("plot"), #<< - ) - - def server(input, output, session): - @render.plot(alt="A histogram") #<< - def plot(): #<< - df = load_penguins() - mass = df["body_mass_g"] - - fig, ax = plt.subplots() - ax.hist(mass, input.n(), density=True) - ax.set_title("Palmer Penguin Masses") - ax.set_xlabel("Mass (g)") - ax.set_ylabel("Density") - - return fig #<< - - app = App(app_ui, server, debug=True) - - relevantfunctions: - - title: ui.output_plot - href: https://shiny.posit.co/py/api/ui.output_plot.html - signature: ui.output_plot(id, width='100%', height='400px', *, inline=False, click=False, dblclick=False, hover=False, brush=False, fill=MISSING) - - title: "@render.plot" - href: https://shiny.posit.co/py/api/render.plot.html - signature: render.plot(_fn=None, *, alt=None, width=MISSING, height=MISSING, **kwargs) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Plot as input - description: Use the `click`, `dblclick`, `hover`, and `brush` arguments of `ui.output_plot()` to collect information about the user's mouse interactions as a reactive variable. The app below displays the values returned, but you can also call the values from within your computations to filter tables, perform calculations, and so on. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACGKM1AG2LK5oBGWbN14soAZxbcyAHQgAzRsRjSoXeI1SUA5gFcaEKXQbMWPKABMA+toj7DE+UpUsJAC0PYWJpqwCC6HgsjJSWcIzBBvLyaKjWBiwAvCwGWFA6cNYKXAaWABTyLMWpNBjEepyVtjxkhRAljSyyYKJy+M0NTcWE-IQA1kkAKox6cMEAxAA8U0XdLJYCXL00A8Oj4yzTs13d7sQAbhHrY5Mzc90Cox4ncFvnuywAlHgXzWAAwn39iC2vj2kKlUyNYKAAPEFHRgCDh0QpELj9P7SLhQQhwfZccKMW4vN4tAAiFSWdy+qx+fzegMqqGq4MhERhZDhLUWy0RyO4aIxxCxxxGYzxjxaAAlDhFfvgqWUgbSQfTrFCmSywO4DoxOaj0Zjsbj-o0WgAha7uSkAmU0ulwCGKxmwmDwq4eTXcnX8jZCp4xCDhBRuCJQ-KGOXBWWVYISOASCQ0UhPX6PAACoR9ESwtXy6jISRa-hYngkZGIOkYsBaXsevpRvHy8bejUsfpSFhsdgcRlr9ZK7GjyQWCmALQExEs2GsPYk1h0LQAul3igIaFwuH3G4OwIvl9YuLoyO5xzBZ975iiyBgJIQOBRGPkJ8FN1wKyeZBgwaiBHAuPCALKSKT5HQvTAJ95hfbB30-eFDSXFcABld3cFhbxgICQO6F9mT4OB4QABV0AwGl-XsDikaDlxYeD7D3ctjxKZMwjTek3irXp+lrBMT1CMg9EYBpg0qdNeGsFYBk7CA3no1NGAwJjKzgP02VY9j5xCOBuN4nwIDlQSQUU74xIklNsRk605Dkv01RvOtHkaLieL4rSBLaax9kDCtDIY6TZIbeSWCddxlJsko7I0-iz2cq49A8MST29OI+0CVBM3QBIaAjAMImCcIBD0HRcTAABfGcgA - height: 720px - code: | - import matplotlib.pyplot as plt - from palmerpenguins import load_penguins - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.output_plot( - "plot", - click=True, #<< - dblclick=True, #<< - hover=True, #<< - brush=True #<< - ), - "Click:", - ui.output_text_verbatim("clk", placeholder=True), - "Double Click:", - ui.output_text_verbatim("dblclk", placeholder=True), - "Hover:", - ui.output_text_verbatim("hvr", placeholder=True), - "Brush", - ui.output_text_verbatim("brsh", placeholder=True), - ) - - def server(input, output, session): - @render.plot(alt="A histogram") - def plot(): - df = load_penguins() - mass = df["body_mass_g"] - bill = df["bill_length_mm"] - - plt.scatter(mass, bill) - plt.xlabel("Mass (g)") - plt.ylabel("Bill Length (mm)") - plt.title("Penguin Mass vs Bill Length") - - @render.text - def clk(): - return input.plot_click() - - @render.text - def dblclk(): - return input.plot_dblclick() - - @render.text - def hvr(): - return input.plot_hover() - - @render.text - def brsh(): - return input.plot_brush() - - app = App(app_ui, server, debug=True) - ---- - -:::{#component} -::: - -## Details - -[Matplotlib](https://matplotlib.org/) is a popular Python library that can be used to create plots. - -Follow three steps to display a Matplotlib figure in your app: - - - 1. Add `ui.output_plot()` to the UI of your app to create a div in which to display the figure. - Where you call this function will determine where the figure will appear within the layout of the app. - The `id` parameter you provide will be used to link to other parts of the Shiny app. - - 2. Define a function within the `server()` function that creates the figure. - - - The name of the function should be the same value you passed into the `id` parameter - in your `ui.output_plot()` function call in the UI. - - - If your function calls reactive values, Shiny will update your figure whenever those values change, -in a [reactive fashion](https://shiny.posit.co/py/docs/reactive-programming.html). - - - If you use `matplotlib.pyplot` to plot, your function does not need to return a value. Otherwise, your function should return one of the following objects: - - - A `matplotlib.figure.Figure` instance - - A `matplotlib.artist.Artist` instance - - A list/tuple of `Figure`/`Artist` instances - - An object with a ‘figure’ attribute pointing to a `matplotlib.figure.Figure` instance - - A `PIL.Image.Image` instance - - 3. Decorate your plotting function with a `@render.plot()` decorator. - - - If your plotting function is not the same as the `id` you used in the `ui.output_plot()`, you can add an additional `@output(id=...)` decorator. - - If you use the `@output()` decorator, make sure it is __above__ the `@render.plot()` decorator. - - -## Plots as Inputs - - -You can use a plot as an input widget, collecting the locations of user clicks, double clicks, hovers, and brushes. To do this, set one or more of the following arguments of `ui.output_plot()` to `True`:. - - 1. `click` - When `click = True`, the plot will allow the user to click in the plotting area, and will send the coordinates of the click to the server, where they can be accessed as a reactive variable named `input._click()`, where `` is the id of the plot. The input value will be a dictionary with x and y elements indicating the mouse position. - - 2. `dblclick` - This is just like the click parameter, but for double-click events. The value can be accessed as `input._dblclick()`. - - 3. `hover` - When `hover = True`, the plot will allow the user to hover over the plotting area, and will send the coordinates of the cursor to the server, where they can be accessed as a reactive variable named `input._hover()`, where `` is the id of the plot. The input value will be a dictionary with x and y elements indicating the mouse position. To control the hover time or hover delay type, set `hover` to `hover_opts()`. - - 4. `brush` - When `brush = True`, the plot will allow the user to “brush” in the plotting area, and will send information about the brushed area to the server, where it can be accessed as a reactive variable named `input._brush()`, where `` is the id of the plot. Brushing means that the user will be able to draw a rectangle in the plotting area and drag it around. The value will be a named list with xmin, xmax, ymin, and ymax elements indicating the brush area. To control the brush behavior, set `brush` to `brush_opts()`. - - Multiple `output_image()`/`output_plot()` calls may share the same id value; brushing one image or plot will cause any other brushes with the same id to disappear. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/outputs/plot-matplotlib/app-core.py b/components/outputs/plot-matplotlib/app-core.py new file mode 100644 index 00000000..d795c626 --- /dev/null +++ b/components/outputs/plot-matplotlib/app-core.py @@ -0,0 +1,24 @@ +import matplotlib.pyplot as plt +from palmerpenguins import load_penguins +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_slider("n", "Number of bins", 0, 100, 20), + ui.output_plot("plot"), #<< +) + +def server(input, output, session): + @render.plot(alt="A histogram") #<< + def plot(): #<< + df = load_penguins() + mass = df["body_mass_g"] + + fig, ax = plt.subplots() + ax.hist(mass, input.n(), density=True) + ax.set_title("Palmer Penguin Masses") + ax.set_xlabel("Mass (g)") + ax.set_ylabel("Density") + + return fig #<< + +app = App(app_ui, server, debug=True) diff --git a/components/outputs/plot-matplotlib/app-express.py b/components/outputs/plot-matplotlib/app-express.py new file mode 100644 index 00000000..b5dac9cf --- /dev/null +++ b/components/outputs/plot-matplotlib/app-express.py @@ -0,0 +1,20 @@ +import matplotlib.pyplot as plt +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import input, ui + +ui.input_slider("n", "Number of bins", 0, 100, 20) + + +@render.plot(alt="A histogram") # << +def plot(): # << + df = load_penguins() + mass = df["body_mass_g"] + + fig, ax = plt.subplots() + ax.hist(mass, input.n(), density=True) + ax.set_title("Palmer Penguin Masses") + ax.set_xlabel("Mass (g)") + ax.set_ylabel("Density") + + return fig # << diff --git a/components/outputs/plot-matplotlib/app-variation-plot-as-input-core.py b/components/outputs/plot-matplotlib/app-variation-plot-as-input-core.py new file mode 100644 index 00000000..31ddce42 --- /dev/null +++ b/components/outputs/plot-matplotlib/app-variation-plot-as-input-core.py @@ -0,0 +1,51 @@ +import matplotlib.pyplot as plt +from palmerpenguins import load_penguins +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.output_plot( + "plot", + click=True, #<< + dblclick=True, #<< + hover=True, #<< + brush=True #<< + ), + "Click:", + ui.output_text_verbatim("clk", placeholder=True), + "Double Click:", + ui.output_text_verbatim("dblclk", placeholder=True), + "Hover:", + ui.output_text_verbatim("hvr", placeholder=True), + "Brush", + ui.output_text_verbatim("brsh", placeholder=True), +) + +def server(input, output, session): + @render.plot(alt="A histogram") + def plot(): + df = load_penguins() + mass = df["body_mass_g"] + bill = df["bill_length_mm"] + + plt.scatter(mass, bill) + plt.xlabel("Mass (g)") + plt.ylabel("Bill Length (mm)") + plt.title("Penguin Mass vs Bill Length") + + @render.text + def clk(): + return input.plot_click() + + @render.text + def dblclk(): + return input.plot_dblclick() + + @render.text + def hvr(): + return input.plot_hover() + + @render.text + def brsh(): + return input.plot_brush() + +app = App(app_ui, server, debug=True) diff --git a/components/outputs/plot-matplotlib/app-variation-plot-as-input-express.py b/components/outputs/plot-matplotlib/app-variation-plot-as-input-express.py new file mode 100644 index 00000000..ad8bb7cc --- /dev/null +++ b/components/outputs/plot-matplotlib/app-variation-plot-as-input-express.py @@ -0,0 +1,53 @@ +import matplotlib.pyplot as plt +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import input, suspend_display, ui + +ui.output_plot( + "plot", + click=True, # << + dblclick=True, # << + hover=True, # << + brush=True, # << +) + +"Click:" +ui.output_text_verbatim("clk", placeholder=True) +"Double Click:" +ui.output_text_verbatim("dblclk", placeholder=True) +"Hover:" +ui.output_text_verbatim("hvr", placeholder=True) +"Brush" +ui.output_text_verbatim("brsh", placeholder=True) + + +with suspend_display(): + # Note that this Express app uses `suspend_display()` so that we can + # manually add the `ui.output_plot()` and others to the page. + + @render.plot(alt="A histogram") + def plot(): + df = load_penguins() + mass = df["body_mass_g"] + bill = df["bill_length_mm"] + + plt.scatter(mass, bill) + plt.xlabel("Mass (g)") + plt.ylabel("Bill Length (mm)") + plt.title("Penguin Mass vs Bill Length") + + @render.text + def clk(): + return input.plot_click() + + @render.text + def dblclk(): + return input.plot_dblclick() + + @render.text + def hvr(): + return input.plot_hover() + + @render.text + def brsh(): + return input.plot_brush() diff --git a/components/outputs/plot-matplotlib/index.qmd b/components/outputs/plot-matplotlib/index.qmd new file mode 100644 index 00000000..30783aae --- /dev/null +++ b/components/outputs/plot-matplotlib/index.qmd @@ -0,0 +1,118 @@ +--- +title: Plot (Matplotlib) +sidebar: components +preview: '
+ + + +
+ + ' +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/plot-matplotlib/ + contents: + - title: Preview + file: app-core.py + height: 500 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5GKC9AG1Iu7oAjHLh59kUAM7IeFADoQAZs1IwZUbvGbpqAcwCudCNIZNWyXlAAmAfR0QDRyQuWrkkgBZHcyUyzbM1FZwzC4qap7eWHAAHuiBkiaM-r4Q6PoURIYKCoZYRukUNpICwcwAFHKQVURVAHL6MIIhyKSKyIJONcgADEQAjD19yABMPQCUORAKAAKBEGU4vBTlGhQAvFUAgshekhSkusywVePIyADEyAA81wrB7WIr4yiXN3cQ5+dW7esWpNY7HpDMZypNPl8OIlkH8fsAqoJSFZcDYoZIbLoqgBdKZfZCKOi6IhQGIwmTcChYST6QRPSRghR4klYPYrNFEAoZLAQMFEYLGOgUXDrAAqzH0cHBTJiVLgRQogu4cEqYAAChotMhVcCjMgALJSSRwZxgKVfZlGooxbhQZrcFUG6HlXSTU2M80yy02XA2u0qgAi1Ekgtwp1xX0CFH0zE+BN05yutwUhFQQp0tDAVBiFDAAF8sUA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5GKC9AG1Iu7oAjHLh59kUAM7IeFADoQAZs1IwZUbvGbpqAcwCudCNIZNWyXlAAmAfR0QDRyQuWrkkgBZHcyUyzYAgphEzNRWcMxEhgoKGOg2hsgAvMiGOFC6cDaK3IZWABQKyMWpdFhG6PoUNpIC4cyFkHKEyM0AcvowghHIpIrIgk7NRAAMRACMI2PIAEwjAJQERSVppFWV1WIUjVvNi8UAxAA8RwrzMRDh-ZIRAG4R+RVVRGtcz+5wkpJ05POIy8UAAKhS4RHC8bYaChJZoBZBeSQUUi6ZiwPaHE4A5BXGQQ-J-DGnCAlEnY-opSy2eyOYz4rEkjhfZJk4DNQSkKy4GyMyQ2XTNAC6F1JJUUdF0RCgAA9mbIsJJ9IItpI6cSRRIpVgEdseUQnhQsBB8URwsY6BRcEkACrMfRwc5qkXS+VwaoUc3cOCNAAKGi0yG9ekMxIAslIbs4wA71RqXdUpdwoN1uI0w0z8rpzlH6SVnTdqrhE8nGgARajfC17YXq0IUfTMYli3SEi5xZlBdD5OIJOhEG7Me6RbFwQT6XTW232hQtMAWnS0WdwKUUMAAXwFQA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/plot-matplotlib/ + contents: + - title: ui.output_plot + href: https://shiny.posit.co/py/api/ui.output_plot.html + signature: ui.output_plot(id, width='100%', height='400px', *, inline=False, click=False, + dblclick=False, hover=False, brush=False, fill=MISSING) + - title: '@render.plot' + href: https://shiny.posit.co/py/api/render.plot.html + signature: render.plot(_fn=None, *, alt=None, width=MISSING, height=MISSING, **kwargs) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/outputs/plot-matplotlib/ + contents: + - title: Plot as input + description: Use the `click`, `dblclick`, `hover`, and `brush` arguments of `ui.output_plot()` + to collect information about the user's mouse interactions as a reactive variable. + The app below displays the values returned, but you can also call the values + from within your computations to filter tables, perform calculations, and so + on. + apps: + - title: Preview + file: app-variation-plot-as-input-core.py + height: 720 + - title: Express + file: app-variation-plot-as-input-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5GKC9AG1Iu7oAjHLh59kUAM7IeFADoQAZs1IwZUbvGbpqAcwCudCNIZNWyXlAAmAfR0QDRyQuWrkkgBZHcyUyzbM1FZwzC4qap7eWHAAHuiBkiaM-r4Q6PoURJL6kva2VnS53FC4RIYKCoZYpBnpFHa8FAAUCshtyHJgYvKEre3EAsQA1gC8ACrM+nBEyADEyAA8C31tVoLcA3TD45PTbfNLK8gepABuITtTMwfLEO3IgpOel3tzi7cAlBUQnQDCg0NEJ1KnRqrUMjYqDF6udmIJOAwWmABkNOkQeFBiHATtxgswXl8fmAACI1dZwZD-LaA4EQKo1LgQqEwkLwiiIzprDbcVGEGTFLE4vEEipgAASZxCQLAILBjPqzJssLZHLAHlOoT5GMFpFxFwmU0JnQAQk8PLT6eCFbEWXCETAkY9PGj+ZjsbrhQa4EafhAAO50Cgedw5PI2ApFEpND5Au7teYAOT4FKDnGQQcKyAAonEEtIMOhkDk4NIAAbZXJBcOFDG4aOl9ykdMeNN+inEKC++7zDh0jTcHzWKzNimly3yhp8esSCDDvgeELSChNoMU9BQXRwLDfe4AAUCs5COEaTQ0FBGnQAgsdCsvdMxYJ1Cfdgop+VOY0cX2+RhZSNY7D0QxjGjL92g4RJkF-KxFGATpBFIKxcBsCDJBsXROgAXTAtpBDobhuCg5AYLgsA8IImxuD0IMUJgLCd3udpZCwSQOwoKhmCaVCiHI7hn0YtpmJiYpBDgbgkQAWSkaQml0L4wH4gTmNwESxKRY18MIgAZajgy4mB5MUxjmPZfg4CRAAFICjGQKTINOaQNII5AdIcIMnwYtp9yCI9mSOV9kBRaNYwEtpAgofRmDuIw6mPPgbE2YZQK7dpvMPZgsD8uNVjgN8uSCz9ssY8LIuitIMji+p8oBZKjjSvFMptfzcuODVgpw5ASqi1JYu6GwTlhWqivq3ymqKgKnQ8dqivuLqyt6xobEeHIpsJPkwAoUQEBQDabTAABfTCgA + height: 720 + - title: Core + file: app-variation-plot-as-input-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5GKC9AG1Iu7oAjHLh59kUAM7IeFADoQAZs1IwZUbvGbpqAcwCudCNIZNWyXlAAmAfR0QDRyQuWrkkgBZHcyUyzYAgphEzNRWcMxEhgoKGOg2hsgAvMiGOFC6cDaK3IZWABQKyMWpdFik+lyVdrwUhRAljchyYGLyhM0NTcXEAsQA1kkAKsz6cEQAxAA8U0XdyFaC3L10A8Oj48jTs13dHqQAbhHrY5Mzc92Co54ncFvnu8gAlAQXzWAAwn39iC2vj2kKlUKDYqAAPEFHZiCTgMQpgXr9P4ybhQYhwfbccLMW4vN4tAAiFSWdy+qx+fzegMq6Gq4MhERhFDhLUWy24SI6PDRGNIWOOIzGeMeLQAEocIr9CFSykDaSD6TYoUyWWAPAdmMjuejMdjcf9Gi0AELXDyUgGyml0uAQpWM2EweFXTxa1E6vl6wVwYVPGIQcKKdwRKH5IzyohyypESRwSSSOjkJ6-R4AAVC-oiOFq+Q0FCSLQCyC8kgopF0zFgLV9jwDKL4+STb0aVkDKUstnsjmMDabJQ4ceSC0UwBaglIVlwNn7khsuhaAF1e8VBHRuNxBy2R2AV2ubNw9BQPFOYAu-fMURQsJJiJwqMx8tOiDvuNXz7IsGDUYI4Nx4QBZKRpHyXRfTAV95nfXAvx-eEjVXdcABkDw8ZAHxgUDwO6d9mX4OB4QABT0QwGgAgcDmkOC12QJCHEPKszxKNMwkzek3lrREG2Tc9QgofRmAaMNKizPgbBWAYewgN4mIzZgsFYms4EDNkOMbR5Gh4viBIgeVhJBZTvgkqT02xOSbXkBTA3Ve9VO4uBeP43xtKEtobH2ENqyM5jZPk5tFOQZ0PE4pdkA0hzBMvFyrn0TwJPPWJMEHIJ0BzTAEjoaNgwiIhwkEfRdFxBQOjAChRAQFBirMsAAF95yAA + height: 720 +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +[Matplotlib](https://matplotlib.org/) is a popular Python library that can be used to create plots. + +Follow three steps to display a Matplotlib figure in your app: + + + 1. Add `ui.output_plot()` to the UI of your app to create a div in which to display the figure. + Where you call this function will determine where the figure will appear within the layout of the app. + The `id` parameter you provide will be used to link to other parts of the Shiny app. + + 2. Define a function within the `server()` function that creates the figure. + + - The name of the function should be the same value you passed into the `id` parameter + in your `ui.output_plot()` function call in the UI. + + - If your function calls reactive values, Shiny will update your figure whenever those values change, +in a [reactive fashion](https://shiny.posit.co/py/docs/reactive-programming.html). + + - If you use `matplotlib.pyplot` to plot, your function does not need to return a value. Otherwise, your function should return one of the following objects: + + - A `matplotlib.figure.Figure` instance + - A `matplotlib.artist.Artist` instance + - A list/tuple of `Figure`/`Artist` instances + - An object with a ‘figure’ attribute pointing to a `matplotlib.figure.Figure` instance + - A `PIL.Image.Image` instance + + 3. Decorate your plotting function with a `@render.plot()` decorator. + + - If your plotting function is not the same as the `id` you used in the `ui.output_plot()`, you can add an additional `@output(id=...)` decorator. + - If you use the `@output()` decorator, make sure it is __above__ the `@render.plot()` decorator. + + +## Plots as Inputs + + +You can use a plot as an input widget, collecting the locations of user clicks, double clicks, hovers, and brushes. To do this, set one or more of the following arguments of `ui.output_plot()` to `True`:. + + 1. `click` - When `click = True`, the plot will allow the user to click in the plotting area, and will send the coordinates of the click to the server, where they can be accessed as a reactive variable named `input._click()`, where `` is the id of the plot. The input value will be a dictionary with x and y elements indicating the mouse position. + + 2. `dblclick` - This is just like the click parameter, but for double-click events. The value can be accessed as `input._dblclick()`. + + 3. `hover` - When `hover = True`, the plot will allow the user to hover over the plotting area, and will send the coordinates of the cursor to the server, where they can be accessed as a reactive variable named `input._hover()`, where `` is the id of the plot. The input value will be a dictionary with x and y elements indicating the mouse position. To control the hover time or hover delay type, set `hover` to `hover_opts()`. + + 4. `brush` - When `brush = True`, the plot will allow the user to “brush” in the plotting area, and will send information about the brushed area to the server, where it can be accessed as a reactive variable named `input._brush()`, where `` is the id of the plot. Brushing means that the user will be able to draw a rectangle in the plotting area and drag it around. The value will be a named list with xmin, xmax, ymin, and ymax elements indicating the brush area. To control the brush behavior, set `brush` to `brush_opts()`. + + Multiple `output_image()`/`output_plot()` calls may share the same id value; brushing one image or plot will cause any other brushes with the same id to disappear. + +:::{#variations} +::: diff --git a/components/outputs/plot-plotly.qmd b/components/outputs/plot-plotly.qmd deleted file mode 100644 index 3a3db69f..00000000 --- a/components/outputs/plot-plotly.qmd +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "Plot (Plotly)" -sidebar: components -preview: | -
- -
-listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: "Plot (Plotly)" - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACVAG2LPewzgA9UjOAGcRLKONT8AOhABmjYjDZR28RqkoBzAK40I4ug2YtOUACYB9LRD0GRcxcpYiAFgewtjTVgEF0PBZhKEIyGgA3OCD9JyUVd08AdxoLbTgyI3pfFmJdMlR8qxS0jKDhCAs4RmLU9NYWAGIAHma5OTRUK30WAF4WfSwodKt5dn0LAAo5FlmBmgwDQrIrEXZU6unIGXwWHYA5XRgAI2rc+RZjhx2ggEY7gAYHoIAmB4BKPBm5vIKikvqWw4XB2n1mLTaEHe7QgciqFxE1SijEmS3yQV+yyCiLENFI70Q31mAAEKlUagCMuCWK0iSx4WxOGRJgS6XM2Dp9IY+mZiJYbJyHCy2XMRIQoGQKJomTzpBgPCIyMRtIxYNMIOzNXMLBKoKNVfBerZ7IYgvxejtjsQLNgrDBJCIrNobiwIFdDL00WQMBBhRqtSx3hhdKgdRQrOwoNhfuqA5rwtw4L0QDsKPwyDtEHswAAFQUagCyDpdO1kSBYDwwAFYAL5ff1x2bYKD8GiOhPsJM7ADCeXINxFWv4LbbVg7XbAACFrV4i2IWJNtND8IPAzC48IyLpGBqxRKpcCGhCYR10DyAqhJp1ujRsUjqtCIGAawBdIA - height: 500px - code: |4 - import plotly.express as px - from palmerpenguins import load_penguins - from shiny import App, reactive, ui - from shinywidgets import output_widget, render_widget #<< - - app_ui = ui.page_fluid( - ui.input_slider("n", "Number of bins", 1, 100, 20), - output_widget("plot"), #<< - ) - - def server(input, output, session): - @render_widget #<< - def plot(): #<< - penguins = load_penguins() - scatterplot = px.histogram( - data_frame=penguins, x="body_mass_g", nbins=input.n() - ).update_layout( - title={"text": "Penguin Mass", "x": 0.5}, - yaxis_title="Count", - xaxis_title="Body Mass (g)", - ) - - return scatterplot #<< - - app = App(app_ui, server) - - relevantfunctions: - - title: shinywidgets.output_widget - href: https://github.com/posit-dev/py-shinywidgets/blob/main/shinywidgets/_shinywidgets.py#L58 - signature: shinywidgets.output_widget(id, width, height) - - title: "@shinywidgets.render_widget()" - href: https://github.com/posit-dev/py-shinywidgets/blob/main/shinywidgets/_shinywidgets.py#L213 - signature: shinywidgets.render_widget(fn) - ---- - -:::{#component} -::: - -## Details - -Plotly is an interactive graphics plotting library. - -To make an interactive plot with Plotly in Shiny for Python, we will need to use the `shinywidgets` library to connect Shiny with `ipywidgets`. - -To make a plotly figure, we need to do the following steps: - - 1. Import the `output_widget()` and `render_widget()` functions from the `shinywidgets` library, - `from shinywidgets import output_widget, render_widget` - - 2. Call `output_widget()` to the UI of your app to create a div in which to display the figure. Where you call this function will determine where the figure will appear within the layout of the app. The `id` parameter you provide will be used to link to other parts of the Shiny app. - - 3. Define a function within the `server()` function that creates the figure. - - - The name of the function should be the same value you passed into the `id` parameter in your `output_widget()` function call in the UI. - - - If your function calls reactive values, Shiny will update your figure whenever those values change, in a [reactive fashion](https://shiny.posit.co/py/docs/reactive-programming.html). - - 4. Decorate your plotting function with a `@render.plot()` decorator. - - - If your plotting function is not the same as the `id` you used in the `ui.output_plot()`, you can add an additional `@output(id=...)` decorator. - - If you use the `@output()` decorator, make sure it is __above__ the `@render.plot()` decorator. - - Visit [shiny.posit.co/py/docs/ipywidgets.html](https://shiny.posit.co/py/docs/ipywidgets.html) to learn more about using ipywidgets with Shiny. \ No newline at end of file diff --git a/components/outputs/plot-plotly/app-core.py b/components/outputs/plot-plotly/app-core.py new file mode 100644 index 00000000..925267d0 --- /dev/null +++ b/components/outputs/plot-plotly/app-core.py @@ -0,0 +1,30 @@ +import plotly.express as px +from palmerpenguins import load_penguins +from shiny import App, ui +from shinywidgets import output_widget, render_widget # << + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.input_slider("n", "Number of bins", 1, 100, 20), + output_widget("plot"), # << +) + + +def server(input, output, session): + @render_widget # << + def plot(): # << + scatterplot = px.histogram( + data_frame=penguins, + x="body_mass_g", + nbins=input.n(), + ).update_layout( + title={"text": "Penguin Mass", "x": 0.5}, + yaxis_title="Count", + xaxis_title="Body Mass (g)", + ) + + return scatterplot # << + + +app = App(app_ui, server) diff --git a/components/outputs/plot-plotly/app-express.py b/components/outputs/plot-plotly/app-express.py new file mode 100644 index 00000000..0350e242 --- /dev/null +++ b/components/outputs/plot-plotly/app-express.py @@ -0,0 +1,23 @@ +import plotly.express as px +from palmerpenguins import load_penguins +from shiny.express import input, ui +from shinywidgets import render_widget # << + +penguins = load_penguins() + +ui.input_slider("n", "Number of bins", 1, 100, 20) + + +@render_widget # << +def plot(): # << + scatterplot = px.histogram( + data_frame=penguins, + x="body_mass_g", + nbins=input.n(), + ).update_layout( + title={"text": "Penguin Mass", "x": 0.5}, + yaxis_title="Count", + xaxis_title="Body Mass (g)", + ) + + return scatterplot # << diff --git a/components/outputs/plot-plotly/index.qmd b/components/outputs/plot-plotly/index.qmd new file mode 100644 index 00000000..e2a9e972 --- /dev/null +++ b/components/outputs/plot-plotly/index.qmd @@ -0,0 +1,69 @@ +--- +title: Plot (Plotly) +sidebar: components +preview: '
+ + + +
+ + ' +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/plot-plotly/ + contents: + - title: Preview + file: app-core.py + height: 500 + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5dAG1Io9yzgAe6ZnADOo5FAnoBAHQgAzZqRjsoHeM3TUA5gFc6ECQyatkXKABMA+toj7Do+UpXJRAC0O5kJlmwCCmEQGzsqqHl4A7nSWOnAUxox+yKR6FOhp1tGx8UQiEJZwzFkxcWzIAMTIADzV8vJ2DkbIALzmpFa2ugZGABQAlPXQmNYGrcgGOFBx1gocBpa98sgrE3RYhhkU1qIcMUVLkLKEyMcAcnowAEZFKQrIV47HRACMrwAM70QATO-9BMtVql0plsmVDpxuMd-isqrV5IMIENCvdREUAG4HTZpIjArZENHiOjkfqIQErAAC+UKxTB8VhNTqEFWyBR7C4FAGKEqjPJLLcxCgFCoWg54xkWE8ogopB0zFgS2Z-OVliFUFm8vgLUaPVEAKVypZAhaxyupEsuGsMCkomsOmefMNyAgjyMLWxFCwEAG+qd-SwenQqqo1g4UFwwMVTpZFDoPDgLRAxyoAgoxxQxwACt1DMgALI256nMByWjvLAAVgAvr7oytcFABHRbbH4yawABhVKUB0G6MCRvN6ytjgJ44AIXN3gL4mQvR0g0IjtWiOXKxEFD0zGZokFwqKkPKcKZQww6HGgXQvTPozoBIxRURJzAFFw2loL8EFDAVYAukA + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5dAG1Io9yzgAe6ZnADOo5FAnoBAHQgAzZqRjsoHeM3TUA5gFc6ECQyatkXKABMA+toj7Do+UpXJRAC0N9BwsccYsbIboehREBs7Kqh5eAO50ljpwFP6mbCIQlnDM1vGJycjIAMTIADyl8vJ2DkbIALzmpFa2ugZGABQAlJUQBljBodaiHAnZ7bKQE0QTAHJ6MABG2cikCsgLjlPIAIxE2wAM+0QATPvdED0AAhlZOXlJbMVlFZlwa5zcXShP5fKFhaJiFAKFQtFw2A0ZFhPKIKKQdMxYOMIP9UchLMCoNYlLA4HVqm1RAQ-mjCgI6hMFqRLLhrDApKJrDopiTSRANkY6gMKFgIF1iSj-p0sHp0BiqNYOFBcKRQsjSYUKHQeHiQBMqAIKBMUBMAAqtQzIACyDK2EzktH2WAArABfAUK5C4KACOiMpUqilgADCssoLMFpIELrd1g9HDxEwAQtTcMaGch2jpuoRWchzmmRBQ9MwUYDgaCPo8Sr8IIRUBRcNpaGANRQwLaALpAA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/plot-plotly/ + contents: + - title: shinywidgets.output_widget + href: https://github.com/posit-dev/py-shinywidgets/blob/main/shinywidgets/_shinywidgets.py#L58 + signature: shinywidgets.output_widget(id, width, height) + - title: '@shinywidgets.render_widget()' + href: https://github.com/posit-dev/py-shinywidgets/blob/main/shinywidgets/_shinywidgets.py#L213 + signature: shinywidgets.render_widget(fn) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +Plotly is an interactive graphics plotting library. + +To make an interactive plot with Plotly in Shiny for Python, we will need to use the `shinywidgets` library to connect Shiny with `ipywidgets`. + +To make a plotly figure, we need to do the following steps: + + 1. Import the `output_widget()` and `render_widget()` functions from the `shinywidgets` library, + `from shinywidgets import output_widget, render_widget` + + 2. Call `output_widget()` to the UI of your app to create a div in which to display the figure. Where you call this function will determine where the figure will appear within the layout of the app. The `id` parameter you provide will be used to link to other parts of the Shiny app. + + 3. Define a function within the `server()` function that creates the figure. + + - The name of the function should be the same value you passed into the `id` parameter in your `output_widget()` function call in the UI. + + - If your function calls reactive values, Shiny will update your figure whenever those values change, in a [reactive fashion](https://shiny.posit.co/py/docs/reactive-programming.html). + + 4. Decorate your plotting function with a `@render.plot()` decorator. + + - If your plotting function is not the same as the `id` you used in the `ui.output_plot()`, you can add an additional `@output(id=...)` decorator. + - If you use the `@output()` decorator, make sure it is __above__ the `@render.plot()` decorator. + + Visit [shiny.posit.co/py/docs/ipywidgets.html](https://shiny.posit.co/py/docs/ipywidgets.html) to learn more about using ipywidgets with Shiny. diff --git a/components/outputs/plot-seaborn.qmd b/components/outputs/plot-seaborn.qmd deleted file mode 100644 index a3cd885a..00000000 --- a/components/outputs/plot-seaborn.qmd +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "Plot (Seaborn)" -sidebar: components -preview: | -
- -
-listing: - id: component - template: ../_partials/components-detail.ejs - contents: - - title: "Plot (Seaborn)" - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACAZzigCMmIWo27CGwA6EAGaNiMFqigAbeI1SUA5gFcawlnQbMW84lAAmAfRUQNW0RKky2ACy3Yd9JqwCC6PC0aVjcIw+mmJiaKimmiwAvCyaWFCqcKbi8prGABRiLHE0GFqo6mSmbPI0AYxZkCL4LDUAcuowXIEsxOIsXNY1PgCMfQAMAz4ATAMAlHjZuRjERYXFqIZkVUvEZDWTOQDEADy7YuOhEGIBHRyMAG6BGQVFPnNkCz4cbGw0pOOI0wACfhAVLDLLJ8HJghRkaI1DwsADKnB4jD4TjYZGIqkYsDafAsVj4PGMLhgAkEWhYGNgbAwNWm4x2+2mZ1kwK+9IOoLBsjUmm0sUMJnM3OsGSOHPBAA8YkIqSinsDjFAyFBorieWwfOKoWACdhTMS3qZVD1OtZoncyBgICLRZyclBxRgOMUyDQyPI4FUAAoKJQsT1C4Sbaac+2OuDFcXybhweRVACyJJYGVURzANttoadpmwUZasZqAGE5uQg2Kcn4yOokfxJSw9uzjuEpV5UBlwpEaC9AtcgiwAlx1KpogAVRjqODjMAAXwAukA - height: 500px - code: |4 - import seaborn as sns - from palmerpenguins import load_penguins - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_slider("n", "Number of bins", 1, 100, 20), - ui.output_plot("plot"), #<< - ) - - def server(input, output, session): - @render.plot( - alt="A Seaborn histogram on penguin body mass in grams." - ) #<< - def plot(): #<< - penguins = load_penguins() - ax = sns.histplot(data=penguins, x="body_mass_g", bins=input.n()) - ax.set_title("Palmer Penguins") - ax.set_xlabel("Mass (g)") - ax.set_ylabel("Count") - return ax #<< - - app = App(app_ui, server, debug=True) - - relevantfunctions: - - title: ui.output_plot - href: https://shiny.posit.co/py/api/ui.output_plot.html - signature: ui.output_plot(id, width='100%', height='400px', *, inline=False, click=False, dblclick=False, hover=False, brush=False, fill=MISSING) - - title: "@render.plot" - href: https://shiny.posit.co/py/api/render.plot.html - signature: render.plot(_fn=None, *, alt=None, width=MISSING, height=MISSING, **kwargs) - ---- - -:::{#component} -::: - -## Details - -Seaborn is a statistical plotting library that builds on top of Matplotlib. - -Follow these steps to display a Seaborn figure in your app: - - - 1. Add `ui.output_plot()` to the UI of your app to create a div in which to display the figure. - Where you call this function will determine where the figure will appear within the layout of the app. - The `id` parameter you provide will be used to link to other parts of the Shiny app. - - 2. Define a function within the `server()` function that creates the figure. - - - The name of the function should be the same value you passed into the `id` parameter - in your `ui.output_plot()` function call in the UI. - - - If your function calls reactive values, Shiny will update your figure whenever those values change, in a [reactive fashion](https://shiny.posit.co/py/docs/reactive-programming.html). - - - Your function should return one of the following objects: - - - A `matplotlib.figure.Figure` instance - - A `matplotlib.artist.Artist` instance - - A list/tuple of `Figure`/`Artist` instances - - An object with a ‘figure’ attribute pointing to a `matplotlib.figure.Figure` instance - - A `PIL.Image.Image` instance - - 3. Decorate your plotting function with a `@render.plot()` decorator. - - - If your plotting function is not the same as the `id` you used in the `ui.output_plot()`, you can add an additional `@output(id=...)` decorator. - - If you use the `@output()` decorator, make sure it is __above__ the `@render.plot()` decorator. - -You can use a plot as an input widget, collecting the locations of user clicks, double clicks, hovers, and brushes. To do this, follow the instructions provided for [plots as inputs](plot-matplotlib.html#plots-as-inputs). - -:::{#variations} -::: \ No newline at end of file diff --git a/components/outputs/plot-seaborn/app-core.py b/components/outputs/plot-seaborn/app-core.py new file mode 100644 index 00000000..861e1e30 --- /dev/null +++ b/components/outputs/plot-seaborn/app-core.py @@ -0,0 +1,23 @@ +import seaborn as sns +from palmerpenguins import load_penguins +from shiny import App, render, ui + +penguins = load_penguins() + +app_ui = ui.page_fluid( + ui.input_slider("n", "Number of bins", 1, 100, 20), + ui.output_plot("plot"), # << +) + + +def server(input, output, session): + @render.plot(alt="A Seaborn histogram on penguin body mass in grams.") # << + def plot(): # << + ax = sns.histplot(data=penguins, x="body_mass_g", bins=input.n()) # << + ax.set_title("Palmer Penguins") + ax.set_xlabel("Mass (g)") + ax.set_ylabel("Count") + return ax # << + + +app = App(app_ui, server, debug=True) diff --git a/components/outputs/plot-seaborn/app-express.py b/components/outputs/plot-seaborn/app-express.py new file mode 100644 index 00000000..4565bb60 --- /dev/null +++ b/components/outputs/plot-seaborn/app-express.py @@ -0,0 +1,17 @@ +import seaborn as sns +from palmerpenguins import load_penguins +from shiny import render +from shiny.express import input, ui + +penguins = load_penguins() + +ui.input_slider("n", "Number of bins", 1, 100, 20) + + +@render.plot(alt="A Seaborn histogram on penguin body mass in grams.") # << +def plot(): # << + ax = sns.histplot(data=penguins, x="body_mass_g", bins=input.n()) # << + ax.set_title("Palmer Penguins") + ax.set_xlabel("Mass (g)") + ax.set_ylabel("Count") + return ax # << diff --git a/components/outputs/plot-seaborn/index.qmd b/components/outputs/plot-seaborn/index.qmd new file mode 100644 index 00000000..8d7fb4cc --- /dev/null +++ b/components/outputs/plot-seaborn/index.qmd @@ -0,0 +1,80 @@ +--- +title: Plot (Seaborn) +sidebar: components +preview: '
+ + + +
+ + ' +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/plot-seaborn/ + contents: + - title: Preview + file: app-core.py + height: 500 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5AZzigCMWJko7DhHYAdCADNmpGMnRQANvGbpqAcwCudEcgZNWyBaSgATAPqqIm7WMnTZ7ABbbcuxizbNqJuM3FSZDmcIXCw4AA90L3YhPQ9dCHQNCiItcXFLax0AXkNjc0ytEQAKAEp0iC0sbSSKM3YFOh9mYtFINqI2gDkNGG5fZFIJZG4bDuQARiIJgAYZogAmGfKICoABLwhmnCMKYsUKbLaAQWQAZS5eZn5ndgpSNWZYQf5C7RHSE1cYQVj+R9g7CwbVKyGQAGJkAAeKHiHzDdC7MooCHQ2H8MECcLIXLsERYW4URGkPYmKAUKDZN4iIjhI5gXhfMw-GJmNTjUYibI1ZJYCBlUGomHiTFYrCcOoUOgUBRwVpgAAKimUyAV6iKYjAK1FUHC4rgdXCCh4cAU8oAsr9kMU1OUtSLMbr9XVcMb+ma2gBhUgaSggh1grwUDTXLFgyHCiCEVAUXCqWhgKjhChgAC+AF0gA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5AZzigCMWJko7DhHYAdCADNmpGMnRQANvGbpqAcwCudEcgZNWyBaSgATAPqqIm7WMnTZ7ABbbcuxizYBBTEWbUTcMxEWuLiltY6ALyGxubhWiIAFACUodCYZlrI0Vo4UGpwZhIKWiaJ4siVyLna6BoUZuwKdAHM5ZCihMidAHIaMNyByKQSyNw2nUQAjNMADLNEAEyzyQQVVbmk9XUN6EYU7XukFJ2rlQDEyAA8V+KpEGkBo5zMAG6BibX1RFsUO0ScdjsOjkZKIdaVAACfggrRw+0SigokU6nmQAGUuLxmPxnOwKKQ1MxYMN+PFtGNSCZXDBBEIKUTYOwsKcLtdbvwqk85AiwWybhCqpUoAAPbLCZl4v4IkxQChQSLkkREEUosC8almWlAsxqSZjGyRL4ULAQFLJfkcoVC0VYTgNCh0CgKODtAAKimUyDd6gSYjA92tVVt9rMIoUPDgCnaAFk6chEmpUgHBTaRXa4A1cBHBtHOgBhLaUU6pqp+CgaHECMXIS4Ch4NjDocXedCIjJaAGBd5BZABbgaNSRAAqzA0cHuXTAFFwqlo07gIooYAAvgBdIA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/plot-seaborn/ + contents: + - title: ui.output_plot + href: https://shiny.posit.co/py/api/ui.output_plot.html + signature: ui.output_plot(id, width='100%', height='400px', *, inline=False, click=False, + dblclick=False, hover=False, brush=False, fill=MISSING) + - title: '@render.plot' + href: https://shiny.posit.co/py/api/render.plot.html + signature: render.plot(_fn=None, *, alt=None, width=MISSING, height=MISSING, **kwargs) +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +Seaborn is a statistical plotting library that builds on top of Matplotlib. + +Follow these steps to display a Seaborn figure in your app: + + + 1. Add `ui.output_plot()` to the UI of your app to create a div in which to display the figure. + Where you call this function will determine where the figure will appear within the layout of the app. + The `id` parameter you provide will be used to link to other parts of the Shiny app. + + 2. Define a function within the `server()` function that creates the figure. + + - The name of the function should be the same value you passed into the `id` parameter + in your `ui.output_plot()` function call in the UI. + + - If your function calls reactive values, Shiny will update your figure whenever those values change, in a [reactive fashion](https://shiny.posit.co/py/docs/reactive-programming.html). + + - Your function should return one of the following objects: + + - A `matplotlib.figure.Figure` instance + - A `matplotlib.artist.Artist` instance + - A list/tuple of `Figure`/`Artist` instances + - An object with a ‘figure’ attribute pointing to a `matplotlib.figure.Figure` instance + - A `PIL.Image.Image` instance + + 3. Decorate your plotting function with a `@render.plot()` decorator. + + - If your plotting function is not the same as the `id` you used in the `ui.output_plot()`, you can add an additional `@output(id=...)` decorator. + - If you use the `@output()` decorator, make sure it is __above__ the `@render.plot()` decorator. + +You can use a plot as an input widget, collecting the locations of user clicks, double clicks, hovers, and brushes. To do this, follow the instructions provided for [plots as inputs](plot-matplotlib.html#plots-as-inputs). + +:::{#variations} +::: diff --git a/components/outputs/text.qmd b/components/outputs/text.qmd deleted file mode 100644 index 58d86699..00000000 --- a/components/outputs/text.qmd +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: "Text" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_text("x", "", placeholder="Enter text"), - ui.output_text("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center px-4 flex-column"} - ) - - def server(input, output, session): - @output - @render.text - def txt(): - return f'x: "{input.x()}"' - - app = App(app_ui, server, debug=True) - -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Text - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhCbqNG1WlQB9JUwC8TJVigBzOLpoAbJdIAUqjaa6oFZXRQAeZJ2AAVOF9lfCZQgFFyOSYfMlCJUIAJOBsbYiYAZU5uUIBKPGd1UIBNYgUmSgopaUQEopMODHKyd084-zj81TyG4ohZGlY5ADc5BzcPCRa2iRY4FhYOUjy6tXUAASkBuQwu9aZB2OC-Vb71KTIFOjVJsgwg3wdeg-6dI1F0Bx19DjnRuR5MAAXwAukA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_text("Text", "Enter text", "Hello Shiny"), - "You entered:", - ui.output_text("text") #<< - ) - - def server(input, output, session): - @render.text #<< - def text(): - return input.Text() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.output_text - href: https://shiny.posit.co/py/api/ui.output_text.html - signature: ui.output_text(id, inline=False, container=None) - - title: "@render.text" - href: https://shiny.posit.co/py/api/render.text.html - signature: render.text(fn=None) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Inline text - description: Set `inline=True` within `ui.output_text()` to have text appear inline with the text that preceeds it. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymigA8ydsABU4H2V8JhCAUXI5Jm8yEIkQgAk4CwtiJgBlTm4QgEo8e0cQgE1iBSZKCilpRDDQwzKyNw9Yv1j43ggLLjg9Jn86BThc1RGIRwmwiFkaVjkANzkbV3cJRuaJFjgWFg5SXMRChwABKWm5DHbxxxmYoN8Do8mpMgU6cZWyDECfGzH1dB9MSoGwabQcTYLOS5MAAXwAukA - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_text("Text", "Enter text", "Hello Shiny"), - "You entered: ", ui.output_text("text", inline = True) #<< - ) - - def server(input, output, session): - @render.text - def text(): - return input.Text() - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details - -Text displays a character string as normal text. - -To make reactive text, follow three steps: - - 1. Call `ui.output_text()` in the UI of your app to create a div in which to display the text. Where you call this function within the UI functions will determine where the text will appear within the layout of the app. Set the id argument of `ui.output_text()` to a unique value. - - 2. Within the server function, define a new function whose name matches the id used above. The function should return the text to display. Shiny will rerun this function whenever it needs to build or update the output that has the matching id. - - 3. Decorate the function with `@render.text` - -See [Verbatim Text](verbatim-text.qmd) to display string values as they would appear in a computer console, in monospaced font on a shaded background. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/outputs/text/app-core.py b/components/outputs/text/app-core.py new file mode 100644 index 00000000..f58d85c8 --- /dev/null +++ b/components/outputs/text/app-core.py @@ -0,0 +1,16 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_text("Text", "Enter text", "Hello Shiny"), + "You entered:", + ui.output_text_verbatim("text"), # << +) + + +def server(input, output, session): + @render.text # << + def text(): + return input.Text() + + +app = App(app_ui, server) diff --git a/components/outputs/text/app-express.py b/components/outputs/text/app-express.py new file mode 100644 index 00000000..1a37d20f --- /dev/null +++ b/components/outputs/text/app-express.py @@ -0,0 +1,10 @@ +from shiny import render +from shiny.express import input, ui + +ui.input_text("Text", "Enter text", "Hello Shiny") +"You entered:" + + +@render.text # << +def text(): + return input.Text() diff --git a/components/outputs/text/app-preview.py b/components/outputs/text/app-preview.py new file mode 100644 index 00000000..96e4a31d --- /dev/null +++ b/components/outputs/text/app-preview.py @@ -0,0 +1,15 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_text("x", "", placeholder="Enter text"), + ui.output_text("txt"), + {"class": "vh-100 d-flex justify-content-center align-items-center px-4 flex-column"} +) + +def server(input, output, session): + @output + @render.text + def txt(): + return f'x: "{input.x()}"' + +app = App(app_ui, server, debug=True) diff --git a/components/outputs/text/app-variation-inline-text-core.py b/components/outputs/text/app-variation-inline-text-core.py new file mode 100644 index 00000000..4fcc876c --- /dev/null +++ b/components/outputs/text/app-variation-inline-text-core.py @@ -0,0 +1,13 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_text("Text", "Enter text", "Hello Shiny"), + "You entered: ", ui.output_text("text", inline = True) #<< +) + +def server(input, output, session): + @render.text + def text(): + return input.Text() + +app = App(app_ui, server) diff --git a/components/outputs/text/app-variation-inline-text-express.py b/components/outputs/text/app-variation-inline-text-express.py new file mode 100644 index 00000000..2926b6c1 --- /dev/null +++ b/components/outputs/text/app-variation-inline-text-express.py @@ -0,0 +1,12 @@ +from shiny import render +from shiny.express import input, suspend_display, ui + +ui.input_text("Text", "Enter text", "Hello Shiny") +"You entered:" +ui.output_text("text", inline=True) # << + + +@suspend_display() # << +@render.text # << +def text(): + return input.Text() diff --git a/components/outputs/text/index.qmd b/components/outputs/text/index.qmd new file mode 100644 index 00000000..0feff52c --- /dev/null +++ b/components/outputs/text/index.qmd @@ -0,0 +1,72 @@ +--- +title: Text +sidebar: components +appPreview: + file: components/outputs/text/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/text/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrNlmsB4wH0qqigAppYACpqKroq4CilKWQHL0JkVwAJOAAbKNJkAGUlXFcASgswAE1SQ2RqKjFxRFcLCFkAATEISQYsYORkAGJkAB5m2Uk6IM8nFKKIevqxCkMGfpsKLA9HHtlQsApcdAQUec8wAF8AXSA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKmqgA8KdsABU4H2VCZBCAUUo5ZG8KEKIQgAk4CwtSZABlLh4QgEoCe0cQgE1SBWRqKilpRHjCh0MyijcPWM0ANzkAIygKfj9YvKJkAGJkAB5x1VzVWYhZOjY5ToYbV3ciJpaiVjhWVk5yXNqIR2QAASl5uSxYhzHJ+uQFmKDfY6ezqQoFBlP1ihYQI+GwzNTgjR6MSYGwabScHbLORg0JgCi4dAIFBot5gAC+AF0gA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/text/ + contents: + - title: ui.output_text + href: https://shiny.posit.co/py/api/ui.output_text.html + signature: ui.output_text(id, inline=False, container=None) + - title: '@render.text' + href: https://shiny.posit.co/py/api/render.text.html + signature: render.text(fn=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/outputs/text/ + contents: + - title: Inline text + description: Set `inline=True` within `ui.output_text()` to have text appear inline + with the text that preceeds it. + apps: + - title: Preview + file: app-variation-inline-text-core.py + - title: Express + file: app-variation-inline-text-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UirQ63QSA+uM4WANlFxFDnWbNdYDxq1VUUACmkwABU1CmCiYIBRSilkPwjCZGCACTh7e1JkAGUlXGCASncwAE1SQ2RqKjFxRGCPTiwKiiMKX3CgsETIvgh7bjgAXhCGQzhC5GQAYmQAHjn3CFkAATMLa1sHJwDJmfnFiBWxCEkGLESp2YXZSToEzsL6iCmpsQpDBhfvCiww-12smS3Vwllo3XCYAAvgBdIA + - title: Core + file: app-variation-inline-text-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKmqgA8KdsABU4H2VCZBCAUUo5ZG8KEKIQgAk4CwtSZABlLh4QgEoCe0cQgE1SBWRqKilpFHinLDKKNw9Yv1i67gtuOD1kfwYFOFzkAGIAHjHVXMLHIohZOjY5ADc5G1d3IkbmolY4VlZOclzEGeQAASl5uSx2iFmFmKDfE7PZqQoFBnuNiixAnw2ab3WZzDS9cToGwabScXYrOTA0JgCi4dAIFAo55gAC+AF0gA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +Text displays a character string as normal text. + +To make reactive text, follow three steps: + + 1. Call `ui.output_text()` in the UI of your app to create a div in which to display the text. Where you call this function within the UI functions will determine where the text will appear within the layout of the app. Set the id argument of `ui.output_text()` to a unique value. + + 2. Within the server function, define a new function whose name matches the id used above. The function should return the text to display. Shiny will rerun this function whenever it needs to build or update the output that has the matching id. + + 3. Decorate the function with `@render.text` + +See [Verbatim Text](../verbatim-text/index.qmd) to display string values as they would appear in a computer console, in monospaced font on a shaded background. + +:::{#variations} +::: diff --git a/components/outputs/ui.qmd b/components/outputs/ui.qmd deleted file mode 100644 index f1bd7fa0..00000000 --- a/components/outputs/ui.qmd +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: "UI" -sidebar: components -previewapp: | - from shiny import App, reactive, render, ui - app_ui = ui.page_fluid( - ui.input_switch("show_slider", "Show slider", True), - ui.output_ui("uiElement"), - {"class": "vh-100 d-flex flex-column pt-4 px-4"} - ) - def server(input, output, session): - @render.ui - def uiElement(): - if (input.show_slider()): - return ui.input_slider("slider", "", min=1, max=10, value=5) - app = App(app_ui, server) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: UI - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAlSIAEzh0JAVw4AdCPrSoA+jqYBeJjqxQA5nGM0ANjtUAKfUy9WOGLqi0yYxk5UmMAI0CyUg8UVVUIqNJdfCYUkXimKCYAVQBJJjgnOHhyFIBKPE9va2JAgKCdWJ0AUWLSsgqqiHL9PrU4GlYNRTo3f0CJOrIGiRY4FhYOUnLEaq8AARV1OgwddaYt6VkFOAw4RXJxiAaMKHjEsmieg-Uh1vbKMjdVg+9JOBkLR0CA+Pw3QLGFhODg7WLQ2EaFISFIAYTYxGI8yyTAgWhg4SRqRgXHMAEYJDAoAAPckABgk8igLjg5gArJV+kYLKJ0G4jKYOHMRhpehAwABfAC6QA - code: | - from shiny import App, reactive, render, ui - - app_ui = ui.page_fluid( - ui.input_action_button("add_button", "Add a UI element"), - ui.output_ui("uiElement"), #<< - ) - - def server(input, output, session): - @render.ui #<< - @reactive.event(input.add_button) #<< - def uiElement(): #<< - return ui.input_slider("slider", "Choose a number", min=1, max=10, value=5), #<< - - app = App(app_ui, server) - relevantfunctions: - - title: ui.output_ui - href: https://shiny.posit.co/py/api/ui.output_ui.html - signature: ui.output_ui(id, inline=False, container=None, fill=False, fillable=False, **kwargs) - - title: "@render.ui" - href: https://shiny.posit.co/py/api/render.ui.html - signature: render.ui(_fn=None) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Update an input - description: The previous example demonstrated how to show a UI element on button click. You can also use `ui.output_ui()` to update an existing input. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAlSIAEzh0JAVw4AdCPrSoA+jqYBeJjqxQA5nGM0ANjtUAKfUy9WOGLqi0yYwgteDoOQg9IUIAjDV18JgSAUXINJigmEJg4ukQEiQBGCRguc2KmGCgAD3KABgBKPE9va2JAgKCdKJ1kpzh4cgSm-Qb9cbU4GlYNRTo3f0CJdrJOiRY4FhYOUgb8iG8mAAEVdToMHRavdWne-sGyNz2rw8k4Mi06A+tFoJYnDhnKL-QHxRIJADCnxUwmyuXyiVKEHKJRq9Qk8igLjg5l+GDhGieIwM0HQFlE6DcRlMHHWsw0DTAAF8ALpAA - code: | - from shiny import App, reactive, render, ui - - app_ui = ui.page_fluid( - ui.input_numeric("number", "Enter a number:", 1, min=1, max=10), - ui.output_ui("uiElement"), #<< - ) - - def server(input, output, session): - @render.ui #<< - def uiElement(): #<< - return ui.input_slider("slider", "Current number:", min=1, max=10, value=input.number()), #<< - - app = App(app_ui, server) - - title: Toggle to show or hide an input - description: Use an input control to switch between showing or hiding a UI output element. - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6cKITIcAbnAlSIAEzh0JAVw4AdCPrSoA+jqYBeJjqxQA5nGM0ANjtUAKfUy9WOGLqi0yYxYAdw4yQjYPMHZiEOCnDnU6XXwmVIBlNjjWROTUgEo8T29rYkCAoJ1onQBRJzh4ckLiiAL9DrU4GlYNRTo3f0CJcrJKiRY4FhYOUgLEEq8AARVkjB1FpnUeuoamsjd5ze9eHsGISoxY+JY8jUOjiBPn7ykyLTon6yGg26T71J-fJpVIAYWyxEmTCgTAgWhgACMNKkJDAuOYAIyoqAAD0xAAYJPIoC44OYAKztAzQdAWUToNxGUwcCZ9DQFMAAXwAukA - code: | - from shiny import App, reactive, render, ui - - app_ui = ui.page_fluid( - ui.input_switch("show_slider", "Show slider"), - ui.output_ui("uiElement"), #<< - ) - - def server(input, output, session): - @render.ui #<< - def uiElement(): #<< - if (input.show_slider()): #<< - return ui.input_slider("slider", "Choose a number", min=1, max=10, value=5) #<< - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details - -A UI output creates an output container for a UI (i.e., HTML) element, such as a set of additional controls. Adding a UI output allows you to show, hide, or update input controls within your app. - -To add a UI output, follow three steps: - - 1. Call `ui.output_ui()` in the UI of your app to create a div in which to display the UI element. Where you call this function within the UI functions will determine where the table will appear within the layout of the app. Set the `id` argument of `ui.output_ui()` to a unique value. - - 2. Within the server function, define a new function whose name matches the id used above. The function should return a UI element, like an input control. - - 3. Decorate the function with `@render.ui`. If you're using an action button or link to show the UI element, you'll also need to decorate with `@reactive.event`. - -See also: [Dynamic UI](https://shiny.posit.co/py/docs/ui-dynamic.html) and [UI and HTML](https://shiny.posit.co/py/docs/ui-html.html). - -:::{#variations} -::: \ No newline at end of file diff --git a/components/outputs/ui/app-core.py b/components/outputs/ui/app-core.py new file mode 100644 index 00000000..14e43ba4 --- /dev/null +++ b/components/outputs/ui/app-core.py @@ -0,0 +1,20 @@ +from shiny import App, reactive, render, ui + +app_ui = ui.page_fluid( + ui.input_switch("show_slider", "Show slider", True), + ui.output_ui("ui_slider"), # << +) + + +def server(input, output, session): + @render.ui # << + @reactive.event(input.show_slider) # << + def ui_slider(): # << + if input.show_slider(): + value = input.slider() if "slider" in input else 5 + return ui.input_slider( + "slider", "Choose a number", min=1, max=10, value=value + ) + + +app = App(app_ui, server) diff --git a/components/outputs/ui/app-express.py b/components/outputs/ui/app-express.py new file mode 100644 index 00000000..1ebe9364 --- /dev/null +++ b/components/outputs/ui/app-express.py @@ -0,0 +1,11 @@ +from shiny import render +from shiny.express import input, ui + +ui.input_switch("show_slider", "Show slider", True) + + +@render.display # << +def ui_slider(): # << + if input.show_slider(): + value = input.slider() if "slider" in input else 5 + ui.input_slider("slider", "Choose a number", min=1, max=10, value=value) diff --git a/components/outputs/ui/app-preview.py b/components/outputs/ui/app-preview.py new file mode 100644 index 00000000..82c84340 --- /dev/null +++ b/components/outputs/ui/app-preview.py @@ -0,0 +1,17 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_switch("show_slider", "Show slider", True), + ui.output_ui("uiElement"), + {"class": "vh-100 d-flex flex-column pt-4 px-4"}, +) + + +def server(input, output, session): + @render.ui + def uiElement(): + if input.show_slider(): + return ui.input_slider("slider", "", min=1, max=10, value=5) + + +app = App(app_ui, server) diff --git a/components/outputs/ui/app-variation-update-an-input-core.py b/components/outputs/ui/app-variation-update-an-input-core.py new file mode 100644 index 00000000..c7fa36aa --- /dev/null +++ b/components/outputs/ui/app-variation-update-an-input-core.py @@ -0,0 +1,32 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.layout_columns( + ui.input_radio_buttons( + "mode", "Display mode", ["Table", "Plot"], selected="Table" + ), + ui.output_ui("mode_controls"), + ) +) + + +def server(input, output, session): + @render.ui + def mode_controls(): + if input.mode() == "Table": + rows = input.rows() if "rows" in input else 10 + cols = input.cols() if "cols" in input else 4 + return ui.TagList( + ui.input_slider("rows", "Rows:", value=rows, min=1, max=10), + ui.input_slider("cols", "Columns:", value=cols, min=1, max=10), + ) + else: + height = input.height() if "height" in input else 500 + width = input.width() if "width" in input else 500 + return ui.TagList( + ui.input_slider("height", "Height:", value=height, min=100, max=1000), + ui.input_slider("width", "Width:", value=width, min=100, max=1000), + ) + + +app = App(app_ui, server) diff --git a/components/outputs/ui/app-variation-update-an-input-express.py b/components/outputs/ui/app-variation-update-an-input-express.py new file mode 100644 index 00000000..e7651a0d --- /dev/null +++ b/components/outputs/ui/app-variation-update-an-input-express.py @@ -0,0 +1,18 @@ +from shiny import render +from shiny.express import input, ui + +with ui.layout_columns(): + ui.input_radio_buttons("mode", "Display mode", ["Table", "Plot"], selected="Table") + + @render.display + def mode_controls(): + if input.mode() == "Table": + rows = input.rows() if "rows" in input else 10 + cols = input.cols() if "cols" in input else 4 + ui.input_slider("rows", "Rows:", value=rows, min=1, max=10) + ui.input_slider("cols", "Columns:", value=cols, min=1, max=10) + else: + height = input.height() if "height" in input else 500 + width = input.width() if "width" in input else 500 + ui.input_slider("height", "Height:", value=height, min=100, max=1000) + ui.input_slider("width", "Width:", value=width, min=100, max=1000) diff --git a/components/outputs/ui/index.qmd b/components/outputs/ui/index.qmd new file mode 100644 index 00000000..05b79783 --- /dev/null +++ b/components/outputs/ui/index.qmd @@ -0,0 +1,82 @@ +--- +title: UI +sidebar: components +appPreview: + file: components/outputs/ui/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/ui/ + contents: + - title: Preview + file: app-core.py + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrNlmsB4wH1WAd04Vi7ABTSwHUg-sAbTkkZQmRPAGV2HzYAoM8iABUGQzgASgsIWQABMQggrHFOVnQ-KF5kAGJkAB4q2Uk6ZDN-QKk3FJQK6tqIZF6+BpsKLG9fVhjW9tk+6eQANyg-ZOQAXj4IIyGxloY2-tCvceC1tY3kOD9WOGQAVimZ3qtB5qCPA+24-YBhSNJL5ChkBBDDAAEZSD4wbjLACMRBgUFUMIADER5os4Ms0ck0hAQmAKLh0AgUPi1BQwABfAC6QA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEGcKMQqcAbnEnUAJnAZEArpwA6EPRnQB9bcgC8ybTigBzOEboAbbSoAUe5J8ucs3dJoojVgB3TgpidncwDlJgoMdONQYdQmQUgGV2WLYEpJSiABUGTTgASgIPLytSAP9A7SjteMT1FPLPAGJkAB5uvVK9QYg1OjZ1RQZXPwCiGoo6olY4VlZOclLESs8AASlh9SxTZC7ereRd6VkFOCw4RUopiDqsGLjWXPVSzp6+iC9kEbeZpJVwbb6nP7-LycUbTCgvLJvD6TDZnKFeeRQZxwcx8J4BF7I0F8UYpd4tZJgPF4urIOCOJbIACsaPRyCkFE0DD+VjhwPU7khbLZZOR+TSYAAwllSIyoMgIJoYAAjVqpGDcMwARiIMCgAA9tQAGIiY7FmM0lVnogb6O2GXHidCuQwmTiLcafPSpMAUXDoBAoX1wfUUMAAXwAukA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/ui/ + contents: + - title: ui.output_ui + href: https://shiny.posit.co/py/api/ui.output_ui.html + signature: ui.output_ui(id, inline=False, container=None, fill=False, fillable=False, + **kwargs) + - title: '@render.ui' + href: https://shiny.posit.co/py/api/render.ui.html + signature: render.ui(_fn=None) + - title: '@render.display' + href: https://shiny.posit.co/py/api/render.display.html + signature: render.display(_fn=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/outputs/ui/ + contents: + - title: Create dependent controls + description: 'You can use `@render.ui` or `@render.display` and `ui.output_ui()` + to create a set of controls that are dependent on a setting in your app. In + this example, we show a different set of options when the app is in "plot" or + "table" mode. + + Note that we use the current input values or a default value when creating the + dependent controls. Without this, the values are re-initialized every time and + forget previous user input.' + apps: + - title: Preview + file: app-variation-update-an-input-core.py + height: 225 + - title: Express + file: app-variation-update-an-input-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UihzrNkB3ThXbIzWADZRcpYwH0yjwzAisAFACUiLLIYfacWAYeDFDinKTuAEbGFOQB0mAwpJKZRJkAIpys6M682bmEyMCZACpQSY5weciZAAqOpBSZALpErHBNxFTiALx1DU2ZgRYQ4cgAAmIQkgxY8SVloeGSdMgVcJ7kFEyOAcHb82Gce9EUWAdByKOjrWD1jc1Il1fzTJbaV53LD-c58PaZUGZPhzO7IQYDZAARgADD9fmEvICYUZ7linjc3ljodwccZ4Wc4MgACzojEOO7uViOTirfyQ0gAlqZABKnNYISqADcoN44KNQUQYNxRkipVBVLKUTM5hj5gyILimSy2ZliVVMgBhUjeXwCloisWjLFSmVy-YKpUqtUIuAhVVqsLsOCcADm7BEQM1xiw3r9AYJELAYf93TAMLJIldyAArCi0R7PdZxLZnomsNnbJG3oX2CTYcGk5TU+m6b8NVrmaypOzoz7Y9ywAAJdsBwVES2GcUxgO2iBKlHyxWo9POz1hBseJu6sClzsAdVZtn7yEH4tLY4nU4nytkVTAFFw6AQKAvagoYAAvj0gA + - title: Core + file: app-variation-update-an-input-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLBai5SCiprJWYEVnYQjsFOWNzonpoMUNKcpJoARp4U5AH2IRnKYDCksllEWQAinKzorrw5eYTIwFkAKlAJFnD5yFkAChakFFkAukSscM3EVNK69Y3NWekZAJQEMyGGHhQRXkp22blmZJRMFqxZ84uzqqdqF7J0bHIAbnI24Z5EK2sDcKyscRCziIsAAlIILIGFglIsrshKjtyBR9gFfotgpxrk8KFhoTZZnp9BMmi0kEiMsgmAB3Vh6PgQNZYMkIvjXLJ0rJUqlrZBDQbIACMAAYiRkfBT9GisEKsQy2mAhSzuGzPByDnBkAAWAUhKQUBQMIKGBrGAAyJQogWJZtCaM0rAsnBBm2Z1SyACVSOS-tVblArHBdHSiDBuLpuf6oAAPIO845Bc0ZQyW622h5ZGWOsAAYVIvn87qInu9uiF-sDwahYYjUZjDnOZs5cD+0Zj7DgnGM7BEIupniwTZbbYlKKlPdbPTArLRiq5AFZefyG+bSbaKOxKaKF9Il-3GWA10vZUFx7XkNPZ5WSXAtTrQvqjawTeqzXHO14E3askO260sgAJZvDnPIPMFB9d8KCLCAI15ENwz5GcK1PRxHzWK0bVfbdF3YT8wAAdXQ-9AJ9Hd2DAiCoIgyMFjnM1zlUdRMEpcR0BsDRtE4d4GHuBhzmqMAKFwdAEBQHi4FDCgwAAX16IA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +A UI output creates an output container for a UI (i.e., HTML) element, such as a set of additional controls. Adding a UI output allows you to show, hide, or update input controls within your app. + +To add a UI output, follow three steps: + + 1. Call `ui.output_ui()` in the UI of your app to create a div in which to display the UI element. Where you call this function within the UI functions will determine where the table will appear within the layout of the app. Set the `id` argument of `ui.output_ui()` to a unique value. + + 2. Within the server function, define a new function whose name matches the id used above. The function should return a UI element, like an input control. + + 3. Decorate the function with `@render.ui`. If you're using an action button or link to show the UI element, you'll also need to decorate with `@reactive.event`. + +See also: [Dynamic UI](https://shiny.posit.co/py/docs/ui-dynamic.html) and [UI and HTML](https://shiny.posit.co/py/docs/ui-html.html). + +:::{#variations} +::: diff --git a/components/outputs/value-box.qmd b/components/outputs/value-box.qmd deleted file mode 100644 index 3451d7a3..00000000 --- a/components/outputs/value-box.qmd +++ /dev/null @@ -1,450 +0,0 @@ ---- -title: "Value Box" -sidebar: components -editor: visual -filters: - - shinylive -previewapp: | - from shiny import App, ui - import shinywidgets as sw - import plotly.express as px - import pandas as pd - from pathlib import Path - - appdir = Path(__file__).parent - - app_ui = ui.page_fillable( - ui.include_css(appdir / "styles.css"), - ui.value_box( - "Total Sales in Q2", "$2.45M", - {"class": "shadow-none"}, - showcase=sw.output_widget("sparkline"), - showcase_layout=ui.showcase_left_center(width="40%") - ), - padding=0, - fillable_mobile=True - ) - - def server(input, output, session): - @output - @sw.render_widget - def sparkline(): - economics = pd.read_csv(appdir / 'economics.csv') - fig = px.line(economics, x='date', y='psavert') - fig.update_traces(line_color='#406EF1', line_width=1, fill='tozeroy', fillcolor='rgba(64,110,241,0.2)', hoverinfo="y") - fig.update_xaxes(visible=False, showgrid=False) - fig.update_yaxes(visible=False, showgrid=False) - fig.update_layout(height = 60, hovermode="x", margin=dict(t=0, r=0, l=0, b=0), plot_bgcolor='rgba(0,0,0,0)', paper_bgcolor='rgba(0,0,0,0)') - return fig - - app = App(app_ui, server) - - ## file: requirements.txt - plotly - - ## file: styles.css - @media (max-width: 400px) { - .plotly svg .hoverlayer { - display: none; - } - } - .bslib-value-box .value-box-showcase { - padding: 0 0 0 1rem; - } - .bslib-value-box .plotly .modebar-container { - display: none; - } - - #.bslib-value-box .value-box-showcase:has(.plotly) { - # padding: 0.5rem; - #} - - .shiny-ipywidget-output { - display: flex; - flex: 1 1 auto !important; - width: 100%; - } - - .shiny-ipywidget-output > * { - display: flex; - flex: 1 1 auto; - width: 100%; - } - - .shiny-ipywidget-output > * > * { - display: flex; - flex: 1 1 auto; - width: 100%; - } - - .shiny-ipywidget-output > * > * > * { - display: flex; - flex: 1 1 auto; - width: 100%; - } - - ## file: economics.csv - date,pce,pop,psavert,uempmed,unemploy - 2000-01-01,6535.3,280976,5.4,5.8,5708 - 2000-02-01,6619.7,281190,4.8,6.1,5858 - 2000-03-01,6685.8,281409,4.5,6,5733 - 2000-04-01,6671.1,281653,5,6.1,5481 - 2000-05-01,6707.6,281877,4.9,5.8,5758 - 2000-06-01,6743.9,282126,4.9,5.7,5651 - 2000-07-01,6764.1,282385,5.2,6,5747 - 2000-08-01,6799.1,282653,5.2,6.3,5853 - 2000-09-01,6882.9,282932,4.5,5.2,5625 - 2000-10-01,6888.2,283201,4.6,6.1,5534 - 2000-11-01,6902.4,283453,4.5,6.1,5639 - 2000-12-01,6945.7,283696,4.2,6,5634 - 2001-01-01,6977,283920,4.8,5.8,6023 - 2001-02-01,6995.8,284137,4.9,6.1,6089 - 2001-03-01,6987.9,284350,5.3,6.6,6141 - 2001-04-01,7001.2,284581,5,5.9,6271 - 2001-05-01,7047.1,284810,4.5,6.3,6226 - 2001-06-01,7060.7,285062,4.5,6,6484 - 2001-07-01,7072.2,285309,5.6,6.8,6583 - 2001-08-01,7108.9,285570,6.8,6.9,7042 - 2001-09-01,7012.8,285843,7,7.2,7142 - 2001-10-01,7208.4,286098,3.4,7.3,7694 - 2001-11-01,7167.9,286341,4.1,7.7,8003 - 2001-12-01,7147.7,286570,4.5,8.2,8258 - 2002-01-01,7174.3,286788,6.1,8.4,8182 - 2002-02-01,7218.3,286994,5.8,8.3,8215 - 2002-03-01,7237.2,287190,5.9,8.4,8304 - 2002-04-01,7305.4,287397,5.8,8.9,8599 - 2002-05-01,7282.7,287623,6.5,9.5,8399 - 2002-06-01,7318.2,287864,6.4,11,8393 - 2002-07-01,7380.4,288105,5.5,8.9,8390 - 2002-08-01,7401.5,288360,5.4,9,8304 - 2002-09-01,7391,288618,5.7,9.5,8251 - 2002-10-01,7430.7,288870,5.7,9.6,8307 - 2002-11-01,7459.7,289106,5.7,9.3,8520 - 2002-12-01,7512.8,289313,5.5,9.6,8640 - 2003-01-01,7533.1,289518,5.5,9.6,8520 - 2003-02-01,7535.9,289714,5.6,9.5,8618 - 2003-03-01,7598.4,289911,5.3,9.7,8588 - 2003-04-01,7621,290125,5.3,10.2,8842 - 2003-05-01,7628.1,290346,5.8,9.9,8957 - 2003-06-01,7678.6,290584,5.6,11.5,9266 - 2003-07-01,7738.2,290820,6.3,10.3,9011 - 2003-08-01,7834.5,291072,6,10.1,8896 - 2003-09-01,7835,291321,5.2,10.2,8921 - 2003-10-01,7845.7,291574,5.3,10.4,8732 - 2003-11-01,7899.6,291807,5.4,10.3,8576 - 2003-12-01,7929.2,292008,5.4,10.4,8317 - 2004-01-01,7987.4,292192,5,10.6,8370 - 2004-02-01,8019.8,292368,5,10.2,8167 - 2004-03-01,8076,292561,4.9,10.2,8491 - 2004-04-01,8088.6,292779,5.3,9.5,8170 - 2004-05-01,8163.2,292997,5.3,9.9,8212 - 2004-06-01,8147.2,293223,5.8,11,8286 - 2004-07-01,8218.9,293463,5.3,8.9,8136 - 2004-08-01,8253.1,293719,5.2,9.2,7990 - 2004-09-01,8321.1,293971,4.6,9.6,7927 - 2004-10-01,8374.6,294230,4.5,9.5,8061 - 2004-11-01,8420.6,294466,4.1,9.7,7932 - 2004-12-01,8481.5,294694,6.9,9.5,7934 - 2005-01-01,8470.2,294914,3.7,9.4,7784 - 2005-02-01,8529.2,295105,3.4,9.2,7980 - 2005-03-01,8569.5,295287,3.6,9.3,7737 - 2005-04-01,8645.6,295490,3.1,9,7672 - 2005-05-01,8643.9,295704,3.5,9.1,7651 - 2005-06-01,8724.8,295936,2.9,9,7524 - 2005-07-01,8829.5,296186,2.2,8.8,7406 - 2005-08-01,8832.4,296440,2.7,9.2,7345 - 2005-09-01,8885.8,296707,2.7,8.4,7553 - 2005-10-01,8926.6,296972,3.1,8.6,7453 - 2005-11-01,8938.5,297207,3.5,8.5,7566 - 2005-12-01,8969.6,297431,3.7,8.7,7279 - 2006-01-01,9059.8,297647,4.2,8.6,7064 - 2006-02-01,9090.1,297854,4.2,9.1,7184 - 2006-03-01,9122.1,298060,4.2,8.7,7072 - 2006-04-01,9174.8,298281,4,8.4,7120 - 2006-05-01,9215.1,298496,3.8,8.5,6980 - 2006-06-01,9240.8,298739,4,7.3,7001 - 2006-07-01,9322.6,298996,3.4,8,7175 - 2006-08-01,9321.8,299263,3.6,8.4,7091 - 2006-09-01,9354.7,299554,3.6,8,6847 - 2006-10-01,9373.2,299835,3.6,7.9,6727 - 2006-11-01,9380.2,300094,3.9,8.3,6872 - 2006-12-01,9469,300340,3.7,7.5,6762 - 2007-01-01,9516.3,300574,3.7,8.3,7116 - 2007-02-01,9546.8,300802,4.1,8.5,6927 - 2007-03-01,9585.1,301021,4.4,9.1,6731 - 2007-04-01,9615.7,301254,4.2,8.6,6850 - 2007-05-01,9651.3,301483,4,8.2,6766 - 2007-06-01,9667.3,301739,3.8,7.7,6979 - 2007-07-01,9709.6,302004,3.7,8.7,7149 - 2007-08-01,9753.9,302267,3.4,8.8,7067 - 2007-09-01,9797.9,302546,3.5,8.7,7170 - 2007-10-01,9827,302807,3.4,8.4,7237 - 2007-11-01,9897.8,303054,3.1,8.6,7240 - 2007-12-01,9908.4,303287,3.6,8.4,7645 - 2008-01-01,9930,303506,3.7,9,7685 - 2008-02-01,9913.4,303711,4.1,8.7,7497 - 2008-03-01,9959.4,303907,4,8.7,7822 - 2008-04-01,9996.8,304117,3.4,9.4,7637 - 2008-05-01,10053.8,304323,7.8,7.9,8395 - 2008-06-01,10107.9,304556,5.5,9,8575 - 2008-07-01,10104.7,304798,4.4,9.7,8937 - 2008-08-01,10094.7,305045,3.8,9.7,9438 - 2008-09-01,10043.5,305309,4.7,10.2,9494 - 2008-10-01,9960.3,305554,5.5,10.4,10074 - 2008-11-01,9820.8,305786,6.4,9.8,10538 - 2008-12-01,9730.7,306004,6.4,10.5,11286 - 2009-01-01,9783.8,306208,6.2,10.7,12058 - 2009-02-01,9766,306402,5.5,11.7,12898 - 2009-03-01,9718.5,306588,5.9,12.3,13426 - 2009-04-01,9724.8,306787,6.8,13.1,13853 - 2009-05-01,9748.9,306984,8.2,14.2,14499 - 2009-06-01,9806.9,307206,6.7,17.2,14707 - 2009-07-01,9841.7,307439,6,16,14601 - 2009-08-01,9961,307685,4.9,16.3,14814 - 2009-09-01,9883.4,307946,5.9,17.8,15009 - 2009-10-01,9931.9,308189,5.4,18.9,15352 - 2009-11-01,9940.5,308418,5.9,19.8,15219 - 2009-12-01,9998.9,308633,5.9,20.1,15098 - 2010-01-01,10001.8,308833,6.1,20,15046 - 2010-02-01,10030.6,309027,5.8,19.9,15113 - 2010-03-01,10089.1,309212,5.7,20.4,15202 - 2010-04-01,10112.9,309191.211,6.4,22.1,15325 - 2010-05-01,10131,309369.053,7,22.3,14849 - 2010-06-01,10151.4,309548.502,6.9,25.2,14474 - 2010-07-01,10184.7,309745.698,6.8,22.3,14512 - 2010-08-01,10228.2,309957.775,6.9,21,14648 - 2010-09-01,10249,310176.466,6.7,20.3,14579 - 2010-10-01,10304.7,310399.958,6.6,21.2,14516 - 2010-11-01,10354.7,310595.764,6.6,21,15081 - 2010-12-01,10392.1,310781.705,7.1,21.9,14348 - 2011-01-01,10435.5,310960.74,7.4,21.5,14013 - 2011-02-01,10470.1,311113.376,7.6,21.1,13820 - 2011-03-01,10550.5,311265.404,7,21.5,13737 - 2011-04-01,10587.6,311436.238,6.9,20.9,13957 - 2011-05-01,10612,311607.08,6.9,21.6,13855 - 2011-06-01,10636.8,311791.223,7.2,22.4,13962 - 2011-07-01,10677.5,311997.049,7.3,22,13763 - 2011-08-01,10700.6,312205.367,7.2,22.4,13818 - 2011-09-01,10738.1,312429.118,6.8,22,13948 - 2011-10-01,10753.1,312644.159,6.8,20.6,13594 - 2011-11-01,10759.5,312829.523,7,20.8,13302 - 2011-12-01,10772.2,313009.712,7.8,20.5,13093 - 2012-01-01,10862.1,313183.179,8,20.8,12797 - 2012-02-01,10953.5,313338.977,8,19.7,12813 - 2012-03-01,10951.8,313499.369,8.5,19.2,12713 - 2012-04-01,10979.7,313667.127,8.7,19.1,12646 - 2012-05-01,10968.6,313830.53,8.8,19.9,12660 - 2012-06-01,10946.3,314017.594,9.1,20.4,12692 - 2012-07-01,10977.2,314210.786,8.2,17.5,12656 - 2012-08-01,11004.1,314422.341,8,18.4,12471 - 2012-09-01,11061.5,314646.749,8.2,18.8,12115 - 2012-10-01,11099.8,314853.978,8.8,19.9,12124 - 2012-11-01,11136.8,315053.863,9.7,18.6,12005 - 2012-12-01,11140.5,315232.752,12,17.7,12298 - 2013-01-01,11202.8,315389.595,6.3,15.8,12471 - 2013-02-01,11239.6,315520.143,5.8,17.2,11950 - 2013-03-01,11227.1,315662.224,5.9,17.6,11689 - 2013-04-01,11205.4,315817.855,6.4,17.1,11760 - 2013-05-01,11244.6,315983.654,6.7,17.1,11654 - 2013-06-01,11268.8,316171.042,6.8,17,11751 - 2013-07-01,11296.7,316358.778,6.6,16.2,11335 - 2013-08-01,11329.2,316580.327,6.7,16.5,11279 - 2013-09-01,11366.9,316806.125,6.8,16.5,11270 - 2013-10-01,11419.8,317022.27,6.3,16.3,11136 - 2013-11-01,11487.6,317228.026,6.2,17.1,10787 - 2013-12-01,11517.9,317411.551,6.4,17.3,10404 - 2014-01-01,11512.5,317593.923,7.1,15.4,10202 - 2014-02-01,11566.2,317753.883,7.3,15.9,10349 - 2014-03-01,11643,317917.203,7.4,15.8,10380 - 2014-04-01,11702.6,318089.218,7.4,15.7,9702 - 2014-05-01,11748.4,318269.505,7.4,14.6,9859 - 2014-06-01,11817,318464.152,7.4,13.8,9460 - 2014-07-01,11860.5,318662.368,7.5,13.1,9608 - 2014-08-01,11944.3,318893.786,7.2,12.9,9599 - 2014-09-01,11957.4,319125.296,7.4,13.4,9262 - 2014-10-01,12023,319353.734,7.2,13.6,8990 - 2014-11-01,12051.4,319564.209,7.3,13,9090 - 2014-12-01,12062,319746.157,7.6,12.9,8717 - 2015-01-01,12046,319928.646,7.7,13.2,8903 - 2015-02-01,12082.4,320074.511,7.9,12.9,8610 - 2015-03-01,12158.3,320230.786,7.4,12,8504 - 2015-04-01,12193.8,320402.295,7.6,11.5,8526 -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Value Box - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxMArhwA6EOag4BzJdgD6AIygQA1kwC8UjhgASAFQCyAGQAUcpkwDkAHhYA3JUwAeMADYQWfRkwNjIyVEQAekiAdziMGIBmDEElSIAmAAZsyPclYKY3DjgYgCFiLyCwTKYagEYANiZGgsJfKBZA4I0OJh6AWkUVbH6tXSYCljJsXzgqmg5fX0RCSTo6SjIAYWJfQQBuNjhlUMQ67IBSfYKoOg4ofs4AEyfKKrI6STgChlmqvnyYCYAD5nKgoGQ2EwnlULABWJgNDDpOFQDAAdjhGIR9Wa-TqGBxTGx2NqZLqzUJtQAXjACXVEgAOfEYAAsAE4GiIkQ0GYiMLzEmTceiMJzWUxWYTCAKGk16hhEplkpl2ejKYz2cl0ujEmisUSajVkYyGv0xXDGSJRQ1MukmDa7cKyaLxUxknDCObdRLMizWaz6cr+ukMOdQ+l2el9VTccadUjOelqcFQZFwZDgTI5GCIVCFkt+p8-sE4G5KMQXgUYcELK6GhKCXCdV7Q2r1X6DeiKQT0ZlWf0kYl7VK6ii2Oa4XCRD3nca6hSkYz0qzfMi4Y22Q0oE3KYbyWz0YzKSvEmxkQ1EjKPQyBYzGWKj5S6qyEQSmelfN7I0xQ6z0eiMb7sarIPg2dRsNGhKxs6h51OaiTDmuoHpCyiRwnUMqXlidS6pSiQEukDTqqGmQLheop9h2+H3uaqoIqR6TMsi6KfoSrJCu+rFAXOxKsg0WIEQ0kE8UaZKHsxDZwl+GK8iGhKZA0Wy3oyFLshgmpvlKCIPlO7LNNpDoYIp7KEH6YavnRmTouakZ0ahbIERe8Fhk2mTMURSJ9nC5oBlKBGCYpGl1IFS4hb5uHiek6SJJOyIxb5cnGURaLsliaW8cZ7K2VOGIYnOtl2uaUmErpx5ieZVF0eyD66lidUFYqmKEg06ReslUqnsZy5sg+w4ChuUChgu9rDWOzouSi6khVek6JAOoZygO2qMgO2lpYObKsqh61wtSFihhhTRIkRMqvj5pFyr+so2ckupCliAbMndiHuhZ8pMAaiRNGNEpfU02nbQeKIDgKK7XYGLLEW9K6MqJwrmo0X3SbK124XCE5ioy0mTtlBKgYB0HAcVdkmoy7VyoRsXvup6HZcNcKinTUBIlOx6s5aE3ySFNmKnC6kGo12GKv2MnNm+cGY2q7JrpesUM-DRqI7zcLzZKAocurDb6WJ8GEatLIbk2MFK1tZosRjk7bkTXNslGEWrjlA748JYqIYr4mgcxiRarSY5gy52OE3CAktfuLmqg+6S9v2GL9rb-ag3anqI-x1WI4zys+WGza2TFaIxSd30TcSC687hV7GRy9miu59n0reZFQVkEZOrrxKKaO7LsimYBphmbBpnkwKOHIACUchyGgqBqNIBhGFgUBKHAag0L40hPHYEAONIGDtNgxCSGQagkOvMAQGoMR0GgW8OHfC9uFA68rxoFS3-fH-BAA0gACgAkkwMwHAyCzGCHgewH977BAACQUlKIsXwHBSBMAACK7HaHQFgYCIGQIcMEAAqqgd0mQLhMAAGoAGUmA-wAEoAFEyF-wAPL4KoUqVBIgACaFDsHb1wQ4dgxAYiEA6HMIYqhNDaB0OAvh-DIRwHgFUDQSh+hKGvk8Yo5B+hcA0UoYggw1ioFAfgHBuCaCSCWGoFghANhvDMJ8OAMjIFjycUwCeEB3FT3QPPMQqAbDT1nhwCQLA4B0HLHQfQAA5UgcAx5gAAL4AF0gA - code: |4 - from shiny import App, ui - - app_ui = ui.page_fluid( - ui.layout_column_wrap( - ui.value_box( #<< - "KPI Title", - "$1 Billion Dollars", - "Up 30% VS PREVIOUS 30 DAYS", - theme="bg-gradient-indigo-purple", - full_screen=True, - ), - ) - ) - - app = App(app_ui, server=None) - - relevantfunctions: - - title: ui.value_box - href: https://shiny.posit.co/py/api/ui.value_box.html - signature: ui.value_box(title, value, *args, showcase=None, showcase_layout='left center', full_screen=False, theme=None, height=None, max_height=None, fill=True, class_=None, **kwargs) - - title: ui.card - href: https://shiny.posit.co/py/api/ui.card.html#shiny.ui.card - signature: ui.card(*args, full_screen=False, height=None, max_height=None, min_height=None, fill=True, class_=None, **kwargs) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Theme and Layout Examples - height: "315px" - description: Value boxes with different `theme` and `showcase_layout` locations. This value box uses multiple files, see how on [Shinylive](https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACAMyhpIgGcAdCG0bEYLHgAsaEbCzoNmLAILo8LAK40BAtKgD6GlgF51NLFADmcXWwA2GgCYAKARow2o2YmrK6SdmBC6AO6MaM4QLCYYAG5QdlYARsQAHuGR6Sx8YADSAAoAkiwAKjRkNnBZeAIZkVkAJACMLABCNDY2NKQsACLE7VCM-PjVNVkAqqgsAMwADACkLABqAMosuQBKAKKL+QDyY6uzPYoAmsuVIxkSxEGEUDxwhhxcpDwYL4E80eaOAOSoNHM5mwAFoElAIABrX6qII0exkcSGLIAVhmqGSWQAlFUIjVEXB4MiwAlzCDzKF7DRKGQQVIqeZiCDUGpGKhypVIgBiAA8PMu6TYanauh4hEYcEohiKjDUcFxkRxI1csXiuiSqQFtRyBWKpQ5wzxGXqTVa7U6EV6-UGFyN6XGk1mCxWay2O32hxmxzOtpqYnENzuDyenG4bw+ou+fwBQNB4KhMJYcIRSNR6MxYCVdsiBKJWQoyVpFMlEE5LF5-Oz-sD9ys7k83mJZGIk0YgPEZDLFa17GFNlF4pL0tl8pGWciKricvVKTSox1hRKZQqhr9JpabQ6XSt7htq-nE2m8yWqw22z2ByP3vO+6uAdutZDH3D3EjP3+gOBYIh0Nh8MRxJohi2IKvi4iEo8WQsmyBqqOWfI9tcD4PLo9ZeGQxJJGQzYwF2CFVkKIpihKUoynKoFZliAhUdA6BGEo6CODo+g0KoDyMNEcCMIYABypBwFiYAAL54OA0DwNQEoAI4aBK8DkG8ZCFvgRCkBQVDIM8YbCQAukAA) - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACAMyhpIgGcAdCG0bEYLHgAsaEbCzoNmLAILo8LAK40BAtKgD6GlgF51NLFADmcXWwA2GgCYAKARow2o2YmrK6SdmBC6AO6MaM4QLCYYAG5QdlYARsQAHuGR6Sx8YADSAAoAkiwAKjRkNnBZeAIZkVkAJACMLABCNDY2NKQsACLE7VCM-PjVNVkAqqgsAMwADACkLABqAMosuQBKAKKL+QDyY6uzPYoAmsuVIxkSxEGEUDxwhhxcpDwYL4E80eaOAOSoNHM5mwAFoElAIABrX6qII0exkcSGLIAVhmqGSWQAlFUIjVEXB4MiwAlzCDzKF7DRKGQQVIqeZiCDUGpGKhypVIgBiAA8PMu6TYanauh4hEYcEohiKjDUcFxkRxI1csXiuiSqQFtRyBWKpQ5wzxGXqTVa7U6EV6-UGFyN6XGk1mCxWay2O32hxmxzOtpqYnENzuDyenG4bw+ou+fwBQNB4KhMJYcIRSNR6MxYCVdsiBKJWQoyVpFMlEE5LF5-Oz-sD9ys7k83mJZGIk0YgPEZDLFa17GFNlF4pL0tl8pGWciKricvVKTSox1hRKZQqhr9JpabQ6XSt7htq-nE2m8yWqw22z2ByP3vO+6uAdutZDH3D3EjP3+gOBYIh0Nh8MRxJohi2IKvi4iEo8WQsmyBqqOWfI9tcD4PLo9ZeGQxJJGQzYwF2CFVkKIpihKUoynKoFZliAhUdA6BGEo6CODo+g0KoDyMNEcCMIYABypBwFiYAAL54OA0DwNQEoAI4aBK8DkG8ZCFvgRCkBQVDIM8YbCQAukAA - code: |4 - import faicons - from shiny import App, ui - app_ui = ui.page_fluid( - ui.layout_column_wrap( - ui.value_box(S - "KPI Title", - "$1 Billion Dollars", - "Up 30% VS PREVIOUS 30 DAYS", - showcase=faicons.icon_svg('piggy-bank', width="50px"), - theme="bg-gradient-indigo-purple", #<< - full_screen=True, - ), - ui.value_box( - "KPI Title", - "$1 Billion Dollars", - "Up 30% VS PREVIOUS 30 DAYS", - showcase=faicons.icon_svg('piggy-bank', width="50px"), - theme="text-green", #<< - showcase_layout="top right", #<< - full_screen=True, - ), - ui.value_box( - "KPI Title", - "$1 Billion Dollars", - "Up 30% VS PREVIOUS 30 DAYS", - showcase=faicons.icon_svg('piggy-bank', width="50px"), - theme="purple", #<< - showcase_layout="bottom", #<< - full_screen=True, - ), - ) - ) - app = App(app_ui, server=None) - - - title: Reactive Value Box - description: Connecting a reactive input value to a value box. This value box uses multiple files, see how on [Shinylive](https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACAMyhpIgGcAdCG0bEYLHgAsaEbCzoNmLAILo8LAJIRUAVzI9VAeR3bdqgMpwePGqVWNKAEziNVWmgIFpUAfVcsAvCyuWFAA5nBebAA2rvYAFAIsiYE0GFLGXjyRNI6M8ZB8+CwFAHJaMABGTizEbCwAQjSRWaT8hQCMqm0ADF2qAExdAJSqLADELAA8EwlJQQBuUNHh5cQAHvEQSVssZDRkkXB+BQDSAApqLAAqewcFeDPbYuLEAO6EUDyHHFwtqdwZcxCeVQNBCIWwAFpylAIABrO4sF7ZMjiI5gACsXVQqwKwwe2wWSz8QWIRh0XgoqzIeXKjWavFxI3GU3xWxRcHgaPKIQhIUYUHsNEoZAhUkFIWIEO0jFQt3wrKSbC0TQyhDslD8l0YWjg902STxEEG7ggAkctU+jDmTliaR0qlJZGMqk+lmsRsQ+IAAnYIDkMJTWGNJtN9YlzSxaU13TxYoNEIlmaHHok7GQtIxNmwCgASEB2sgYCBxgC+9Tp7pYABFiE0oIxWomQyaPOh-Ep0LFPD4aC6nNbGMaIGAS3hwNB4NQ7ABHVx2eDkHgBqn4IikChUZDfbg8EcAXSAA) - shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACAMyhpIgGcAdCG0bEYLHgAsaEbCzoNmLAILo8LAJIRUAVzI9VAeR3bdqgMpwePGqVWNKAEziNVWmgIFpUAfVcsAvCyuWFAA5nBebAA2rvYAFAIsiYE0GFLGXjyRNI6M8ZB8+CwFAHJaMABGTizEbCwAQjSRWaT8hQCMqm0ADF2qAExdAJSqLADELAA8EwlJQQBuUNHh5cQAHvEQSVssZDRkkXB+BQDSAApqLAAqewcFeDPbYuLEAO6EUDyHHFwtqdwZcxCeVQNBCIWwAFpylAIABrO4sF7ZMjiI5gACsXVQqwKwwe2wWSz8QWIRh0XgoqzIeXKjWavFxI3GU3xWxRcHgaPKIQhIUYUHsNEoZAhUkFIWIEO0jFQt3wrKSbC0TQyhDslD8l0YWjg902STxEEG7ggAkctU+jDmTliaR0qlJZGMqk+lmsRsQ+IAAnYIDkMJTWGNJtN9YlzSxaU13TxYoNEIlmaHHok7GQtIxNmwCgASEB2sgYCBxgC+9Tp7pYABFiE0oIxWomQyaPOh-Ep0LFPD4aC6nNbGMaIGAS3hwNB4NQ7ABHVx2eDkHgBqn4IikChUZDfbg8EcAXSAA - height: "225px" - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACAMyhpIgGcAdCG0bEYLHgAsaEbCzoNmLAILo8LAJIRUAVzI9VAeR3bdqgMpwePGqVWNKAEziNVWmgIFpUAfVcsAvCyuWFAA5nBebAA2rvYAFAIsiYE0GFLGXjyRNI6M8ZB8+CwFAHJaMABGTizEbCwAQjSRWaT8hQCMqm0ADF2qAExdAJSqLADELAA8EwlJQQBuUNHh5cQAHvEQSVssZDRkkXB+BQDSAApqLAAqewcFeDPbYuLEAO6EUDyHHFwtqdwZcxCeVQNBCIWwAFpylAIABrO4sF7ZMjiI5gACsXVQqwKwwe2wWSz8QWIRh0XgoqzIeXKjWavFxI3GU3xWxRcHgaPKIQhIUYUHsNEoZAhUkFIWIEO0jFQt3wrKSbC0TQyhDslD8l0YWjg902STxEEG7ggAkctU+jDmTliaR0qlJZGMqk+lmsRsQ+IAAnYIDkMJTWGNJtN9YlzSxaU13TxYoNEIlmaHHok7GQtIxNmwCgASEB2sgYCBxgC+9Tp7pYABFiE0oIxWomQyaPOh-Ep0LFPD4aC6nNbGMaIGAS3hwNB4NQ7ABHVx2eDkHgBqn4IikChUZDfbg8EcAXSAA - code: |4 - import faicons - from shiny import App, Inputs, Outputs, Session, render, ui - - app_ui = ui.page_fluid( - ui.input_slider("n", "Number of Billions", 1, 100, 20), #<< - ui.value_box( - title="KPI Title", - showcase=faicons.icon_svg('piggy-bank', width="50px"), - value=ui.output_text("billions"), #<< - theme="bg-gradient-indigo-purple", - full_screen=True, - ), - ) - - def server(input, output, session): - @render.text #<< - def billions(): #<< - return f"${input.n()} Billion Dollars" #<< - - app = App(app_ui, server) - - - title: Sparklines - description: Interactive sparkline in the value box. This value box uses multiple files, see how on [Shinylive](https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxMArhwA6EPgKGtO3AO4cAJgHM4ZFkyj6WquQsHDUAG2JlL2DHAAeqOnBb7DTVI9P9zXqAgNT09UDTl6RgCyNksOACNePyUABSgYuTk0MI46JgBeJjSYgAoAfTKaDks4CoBKLChXckzodDLpAqkORp1K6ssoeJqSuSZujC5CS0kNWsJ3EuyNXKYAeiYZMBYybBqWDAWWLbq8MYmANygZ2vjiR1GIcefNsAAVG2umAGVrt14ngBFABMWwkWwAJMCMAAWACsAFkwecXiAttNDMckK92FANMRVABaCCkOBbAC+ZyeL2UBMIhjg+WMGGIkjIqDZZXU2l0o22qCaAGs4hAyWBTijnuw6QyyoNsKyyPlpBhpap6SxajUaGQyoRKBQ6CVuTF8lsYQAGACkJ3OEupAo0KwgWnyFqp4yqlkGw1qMGI8WqjLedEkZIgdVacxorDgdAucZKXA5ZAkipTEk17g4pDqiHOAAF02zC8zmnM6FzNDoyOdo6wBXRhVw4CU85LxnASCSYBwFl0whhXHi9SwLkt0Cs8hsAORd0iMPsHBYXGeR6kvKpaAeODAi1vzntLiSOfIz4IUGcSbBn1AsKAJoRrjtMLcYSRhdK1Mh0KD6lglPuerENYdBngAxJaABsACiABiACMV5MEBJpsPkCESF6lhnmQxAAF5xsQ2DIdhJCgWedBaPEUAlFBMJ4AhCHusCMKYRaGDAnUyFsMQj5cDQxBmmA2C2huzxvh+F61I4UCOG4JQXBwLAJDU+RwdcmqZrxqhaHQmjqZpcDrjSr4cFo76fhQZTYHJClKSpvqGZYWm0rp+kaM5momTSklWVqUAKmyJRsHA5lsMIhRQe6TC8Y+-pzMJPj4EwMBNFoXD5CshBkCUSoxWBMU4TF8RuqcXjWLq8RaORgiUdRtHuk1eAWtxEgCqgcZlNVtVgTOVE0SUzVNdxPkvK4ZCSHQTxbq02RdGIqATqgHQcJmcaPuuYCUuA0DwNQh6LgshxjvgRCkBQVDINJeCoPqt3EKgt33o+qZhvw8AaHgkiivw1iiRAwIWsDhIWghoOYVBcIAMxwhg0N4MCAAcFoAJwAOxQXgcMMXDSPY+jFpI3IQMgxawIQ3gUFQQhqMYOjiNI0xqPujCGD41BGCYXCSM8yTwMWqD0OU9TvPs4zCGWqjeBs3CVME9D0P82TMIi1B6MIVzEtQwjcuc9zMJM8rgsWnCIuE+jGBY8jCFI+jDNs9LeME3zgMC6DUHmzC0MYNLyPAghwJY472P09jUMIcboPo+b9Fa-70O86HwLy3C6MwujUdE+bqN05h-s68nVPw9jvNK27ZOoyLSNI9Cfu16j0Mp7LRdwlBwJwlHzHVzXnGM03YMy1bxfczDMJd+Dg9QSz0IMcj0PwgjLf6+H0Oo13FNT6j8Jh-P0-B33WNtwvyuT2fVMYwz8+o0DQ-4870XAuXpOT5vkO587yNsdDDu+yPVNE3XhXSewst52z-l-WG7o4YI05ljGmbFT6g1VoPQmYM+5fx5tzUO0t24ayQabSmhMM7xyRobZiQ89Yl3bkHAhntUEWmirvXmjDm4YD1lTQ249gHRyIRadG0IU7IxhmjUO8DxZQyRs-YGk8kZEOYkjCBvM07uk5hzP+xDQQ8LRnwwO4thFkIRgzS2KcNYwi0S-Qk3dUFA0UXPJG0VUb4x9gxS2Rjp7cMsUxeR6slFQQXphNmmFLYMxRhaaRYMrFvzwGYkJjMoaE0oXgRRKda6u1Jm-eR6cS7I3VjXf+djkm2wscDTe0SBG2xyQ43OuNxaKIRrXBCncK6b1AcEp+JjGYaxZjg5JsJknQwtJ40pyCiGDJxl0teDNnaKOlrzXOytN5mxsbXZhmMn7FzlnTOWUiFktI9mMypQi7YOIYpzBiTEBmN0Wbw1BicOL2KZqbUOOy-67ItDc7OqDLSazlsjKR0VQ4MTmYM4Z5NQZVzuajfONcab3zDts5JHdI77OscE72HEr41zttAhFw8pH8Jud475cI6ZYuhYw0ODM6YNLhEDIl5S4R6PxsjRuCFdbsLwHTLGpyPkVzaUQmGPsYWoyZfCrZ+K6V8tJqAxlsMlEY0lmIrlnKHG22VqAtpMTSWFNZdC7mJcyXJJ5sTflozUHt3zizQOcsYGMQ4qkshJTwmg2WcE9uiirXhJhEfcWdM5miszmaxhRC8nD2BCzHmtSsZMU5TfamGrbnBPRonDBLNa6qJLsxQ1YMUUytBnI1BUiW4RuYgI+W2bMI11RlBRNOii2w0RtCpuBqU7ZtSTfPNwNhZopiWQuGV9oVp1qQjbNDE7ZN0TcS4JSNc7huhSjaZ-Ts20sxlO8pN86ZCJvsDeFFyHkDIQkG0mKDz7oycZbOenab7Y3tfin+0rgYoOiSjWm+ib7QygvfO9qSELq2VigrVi7rY3zboEv+7bkkwmhQB81VaiaKJA8Ce2TtDWqqPY+oZrrKZM38WmiNGNQ4I39UiwOsGQ2DyZiQ7dTcNnO0ubXBx5GY6UYDrMptC9-FEb6XM9ltaK4oMLVWjuwqOPdKLlumJudMMoMhVWlt8dG6KqHljblUnkOwd7VI7JIHzGDKSYilGNNNPnydRxXTPqD6YSNeeydAmok4fIZyiNPrt7F2loi2zYK3WOcJmm6DSqfbUv6fbMhytlkvrpZJiNTLnkuJVaYpxmHllAbboimLyMGY+1UyXe2P9wtweSfROGIG4TQfdKJ6WmMBEFcIZR+iPs-aBqGXgH2Er3VMtq-QqtAi2YstFY3a2f8qt0u80m5JDdnM1ttkN1J4t06MNq0JibTd+kRvopaRGeLTEL2aaTZZcmJti36+rfhW3QkhbhDDArWn43zunuW0TiGYmLxu6Zxuii-kYyBll1VnL0Zt34-thzlGa1qYjenaGmEgt9OMchoBpNuuU0jXTfrmMM5Dzm1jQm9Flb0OiSzFmin0a8wYmzFOecYm2zBfQrV0LgTQitUZ1mfdFHGP4c6+hp6uVHr602xjgS+muMDph+hbquUBzhkz6DWMfb40+xfFGeODmDxvpad9E7pauNyzI5X-Dke0fnbOmtrX+n4w1gDvXy3G4B3ffGhG2WhcxLRl2ijh3G5ld3h-MrpueVUzIce4Gnte2NxTWmpxjbHeW1wQIwPIbp1cvuX3QZwM3ONb6bAu2nOQfWdc617tm2YeWz1us5WLHz6ir-SXFPw7TcXaMUxIHwMWME7K2o-PRNyZDyrZy6eGmK4sbpzzKX+fmIByHsCrW6sodl8K9Ngdo+O5k9Z8PL9cJMMsfFzWpl1ewaGyXn0lO6sE0D5V9Z6mbjR8pulnLmJYcHsI+b+NjGaNh6DJPXX2HVPoOz6+dZgH6e7+Qcv24682jCceLG7u560e+eS+suf2xiGGs+IetcWW5Mi6puoBriHSyBFes6lszi4SpsDET2w8vWG+OeXK6a-SgyTcdsvuTu6Oe2u6EMyOjcFW4S6+8B1KMSa+yshaBOzaNB4SGs4GPexi0GcehadOA2wha8Z2oBxitczqha3OucNa4soKTEIBKqri-iUh2Gg8zEpst+oKTcRi82bya8zBXy3W9qZaf8oKV2vqWyxqluFcha5e9hQyYcoK56+MbMk+oSoe-BBalMxh28vhpsQycst+Rq28icoR9amExh3snK4ygyWuYckG2828oRIeNaHEDupsV2tScsY69q-CYKciCeTiQMmhpsJO4ik++MzEMMpqpMNRBOKamK+e0ULW5yd65RgcTGFccmyOJOphrCRMxcbavRIu6SqeoM3R1MfRloKccMwx2RrKHRSxLqquGsCugyki8K0seio6C8tCYxc+vWDReSDM7e7KWs7KZcyskKW+6c7GxxTioBba5OjEMI0Gj+9adhSWnMN+HOlKnMDMR6fcksFsbxz+ZCmsaBkOuCjEMaPqYMiJf+VBNM+emMScIcVeo65CYKkK7uNc8Wgy56PqvSsJrR6+aMiJBRUOjhRMtsqGFy7GTSsMzqVctR28HEsRRMbEpxjEqOjEdKtMLJghTi7JDiisvS9RKR6+Ti-MaK4RAsmshBVJsC8c7oTSQyTe1i0Sxhgyb+aM5MS6rRJGTSTE0i1iWqxhs6WsmRAcGxu8B6TSQMJS1i3OzETEdc+e0K0KnElygxDOzxMMHcGpJs4ugZUOIZn6dMJhMSiM0IpJZCj+1idhgZO+JBaMZWn2Xe4JiMcMfxGcwy1iXhgZZCURGMO8086iLKmZAJTKfpJsy2Y+yMyeaMga9MAO7miMKRPqhscZEKWprEN+gZmMsIqx0JiMRR7Z56E5vazEoKvhG5c6oq6i1smsfxTKJpgsCeG5nuWWbRoq9M9Exc+5UpHJa5Zp4SN8bpZaTM9Mzyls+cmsZx3s45bs06Wp3smxrWzEhR9M2uc8vyAJYMjpr8QFfm0OTEDp8MmMd++5zxic9KAFICWpV2wpoFgcUMsILWV80F7KKagexKAZps4CsuTE3snMT86ifsHEZx1hVFk8CZjCgchF0UlsMxZZtuMaicV2Gpk8eZjCn6mh2hYZDOFhQis8jEa87c4l42zE6sxehFucAl0Gd+CMDOylmMcFYRRh-CwMb+gcQMMC6sd+ily6ic6qOFk5ZlKanqoFrEEaXMtsxcrZyl28ux3i65-CMMr5QcgJXMpKvlS5w87KpK1Z4Mp5IViKUO-s2yGyV8HErRis5MalgcWp9sgioFKeZKvFBBMV5RmRjpmSZlDijOxVtswq56ySMVrR8OVFZSWpoqbWxVissy9sLVb6MJNs1VQsXVO+zi7KQJ8M08fS5RkmgcGso1WGZlGMRqUOn6vii1X+b6KR4VJpSyXVX6llicFpMMfStpEGQc0UGpm8kl28nMDuksYMxebmlO9RFyQcN8t16laM9syeksAcmKDih+jEWlRFbcP1uJTET6r5gJUZASg1hSgcGcXa+VyRjEGl0FUOY50JelKSjEiibVTEzB+V65YFkpONZcvsJOF1EpV1KNP1p5Dp7eUO6+oVipKqMJz2IupsTNZpDFBFbNT80IAObabacSVl6pAFAqRhIu0Ik17R2yoqxco69GrE+CMtyx4Rgca8llV2Kp3socrRnSzM6+GpmqOtDOX5oFgOgirE9JlsMaf6s6FthWQZpsNBTSTMBBV2xcFyNt2hN1WtdWKRKNbM9FOq2WPui5sJYdUM1ZoCeZRFRNoFNMGsGAQyR+4sR6mNAOaNoCtZgcGhF5-iPMg5e5GJcJ7KsMbt0N7KXlKcUOkiRRyGxcMJnMwx8Oddh2LNZZzdRmXMHc0VVeXdhMbt5NbElNGGUZbdj1Vdo6LNE958DFdFoFAivZ5M4iEtzx-CdsE9AtTKMBUO6csaV2kMy6l+zElo1Zp6OtHZ6RR6pKjWGV0Zy65MuVAFz6991MAN9sHNUi+lUpEG3qOZgGOtDW690KJi4Sd+Fy9G4SSuX97tM9llKMrpbGcDwD1KhMfpKCCZvOhSUOtc087Cn5y6EdXK8yGpKCydPtoFZCccPpWDTx+MD1j6ks6lM2QtM27cM15unKTx5+RMNDplYd28bMT11aQWINptwZA2YDLl4jacXt9OFZJul6yl-S8aeDViJse15MT1HuQWC8dlWjPK0mojp51lmsJBtMbc5OoiV9xGVpVjZpQM7coFjZ+sac6FjEwZdsR6GpPmRhQMdJUOucvZ9E2O2RPsHa4SwT2toTRMSlA8VR7ClyMBeicyNMHDKW4Rku9SrWvpFpTRLDqS6+1ZyyAZAcjcmhYT5MnEKtTtmNqqdKUE20eAu0sACAyAOwewbgJ0LAZ03Yl0ZA1AGA8QLAcQ8QhIVwNwhIdwjgTAGA8zYYiz9whIaoGocATAaIEAjozoWgiATAFopz5zCErgMAAA3HIOSHIJM9MwkHM9cOs0sys1YDYHYCswlHADRHQISKM1AC2HkPs+MCsCwFYIFCcySKKLcxAPcxAHIOBI8zMy8ws+86s683ABs44FszpDs4gGwIYCUFgJVHYHUHs8iy8Ic1wMc6c+wlc-C+BIiw8+wFwNgISBwDgNyDWISMWMIGC0wBC1C9gCczQDUI4PC56JKycwhEwPK1AGyMQEwAAIRmBCCBBkDStMBoRyvAxWjwussQCqgqCcvcvYC8u6D8tsgphMAAB8TAAAVFS9SCK-KOK5KzqxK04HKwqwYMqzq3qwqwa0a60Kaxy1yzy9WNawKw686-Gy60K+69C6+F6+cD644H64q4G+cMG8YYa3c+G+y9wFG5azG2QDa+yGyIm7W460m3WMpKK5604N67K-6zm3hEG5oDEPq9aEa9tAALpAA). - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxMArhwA6EPgKGtO3AO4cAJgHM4ZFkyj6WquQsHDUAG2JlL2DHAAeqOnBb7DTVI9P9zXqAgNT09UDTl6RgCyNksOACNePyUABSgYuTk0MI46JgBeJjSYgAoAfTKaDks4CoBKLChXckzodDLpAqkORp1K6ssoeJqSuSZujC5CS0kNWsJ3EuyNXKYAeiYZMBYybBqWDAWWLbq8MYmANygZ2vjiR1GIcefNsAAVG2umAGVrt14ngBFABMWwkWwAJMCMAAWACsAFkwecXiAttNDMckK92FANMRVABaCCkOBbAC+ZyeL2UBMIhjg+WMGGIkjIqDZZXU2l0o22qCaAGs4hAyWBTijnuw6QyyoNsKyyPlpBhpap6SxajUaGQyoRKBQ6CVuTF8lsYQAGACkJ3OEupAo0KwgWnyFqp4yqlkGw1qMGI8WqjLedEkZIgdVacxorDgdAucZKXA5ZAkipTEk17g4pDqiHOAAF02zC8zmnM6FzNDoyOdo6wBXRhVw4CU85LxnASCSYBwFl0whhXHi9SwLkt0Cs8hsAORd0iMPsHBYXGeR6kvKpaAeODAi1vzntLiSOfIz4IUGcSbBn1AsKAJoRrjtMLcYSRhdK1Mh0KD6lglPuerENYdBngAxJaABsACiABiACMV5MEBJpsPkCESF6lhnmQxAAF5xsQ2DIdhJCgWedBaPEUAlFBMJ4AhCHusCMKYRaGDAnUyFsMQj5cDQxBmmA2C2huzxvh+F61I4UCOG4JQXBwLAJDU+RwdcmqZrxqhaHQmjqZpcDrjSr4cFo76fhQZTYHJClKSpvqGZYWm0rp+kaM5momTSklWVqUAKmyJRsHA5lsMIhRQe6TC8Y+-pzMJPj4EwMBNFoXD5CshBkCUSoxWBMU4TF8RuqcXjWLq8RaORgiUdRtHuk1eAWtxEgCqgcZlNVtVgTOVE0SUzVNdxPkvK4ZCSHQTxbq02RdGIqATqgHQcJmcaPuuYCUuA0DwNQh6LgshxjvgRCkBQVDINJeCoPqt3EKgt33o+qZhvw8AaHgkiivw1iiRAwIWsDhIWghoOYVBcIAMxwhg0N4MCAAcFoAJwAOxQXgcMMXDSPY+jFpI3IQMgxawIQ3gUFQQhqMYOjiNI0xqPujCGD41BGCYXCSM8yTwMWqD0OU9TvPs4zCGWqjeBs3CVME9D0P82TMIi1B6MIVzEtQwjcuc9zMJM8rgsWnCIuE+jGBY8jCFI+jDNs9LeME3zgMC6DUHmzC0MYNLyPAghwJY472P09jUMIcboPo+b9Fa-70O86HwLy3C6MwujUdE+bqN05h-s68nVPw9jvNK27ZOoyLSNI9Cfu16j0Mp7LRdwlBwJwlHzHVzXnGM03YMy1bxfczDMJd+Dg9QSz0IMcj0PwgjLf6+H0Oo13FNT6j8Jh-P0-B33WNtwvyuT2fVMYwz8+o0DQ-4870XAuXpOT5vkO587yNsdDDu+yPVNE3XhXSewst52z-l-WG7o4YI05ljGmbFT6g1VoPQmYM+5fx5tzUO0t24ayQabSmhMM7xyRobZiQ89Yl3bkHAhntUEWmirvXmjDm4YD1lTQ249gHRyIRadG0IU7IxhmjUO8DxZQyRs-YGk8kZEOYkjCBvM07uk5hzP+xDQQ8LRnwwO4thFkIRgzS2KcNYwi0S-Qk3dUFA0UXPJG0VUb4x9gxS2Rjp7cMsUxeR6slFQQXphNmmFLYMxRhaaRYMrFvzwGYkJjMoaE0oXgRRKda6u1Jm-eR6cS7I3VjXf+djkm2wscDTe0SBG2xyQ43OuNxaKIRrXBCncK6b1AcEp+JjGYaxZjg5JsJknQwtJ40pyCiGDJxl0teDNnaKOlrzXOytN5mxsbXZhmMn7FzlnTOWUiFktI9mMypQi7YOIYpzBiTEBmN0Wbw1BicOL2KZqbUOOy-67ItDc7OqDLSazlsjKR0VQ4MTmYM4Z5NQZVzuajfONcab3zDts5JHdI77OscE72HEr41zttAhFw8pH8Jud475cI6ZYuhYw0ODM6YNLhEDIl5S4R6PxsjRuCFdbsLwHTLGpyPkVzaUQmGPsYWoyZfCrZ+K6V8tJqAxlsMlEY0lmIrlnKHG22VqAtpMTSWFNZdC7mJcyXJJ5sTflozUHt3zizQOcsYGMQ4qkshJTwmg2WcE9uiirXhJhEfcWdM5miszmaxhRC8nD2BCzHmtSsZMU5TfamGrbnBPRonDBLNa6qJLsxQ1YMUUytBnI1BUiW4RuYgI+W2bMI11RlBRNOii2w0RtCpuBqU7ZtSTfPNwNhZopiWQuGV9oVp1qQjbNDE7ZN0TcS4JSNc7huhSjaZ-Ts20sxlO8pN86ZCJvsDeFFyHkDIQkG0mKDz7oycZbOenab7Y3tfin+0rgYoOiSjWm+ib7QygvfO9qSELq2VigrVi7rY3zboEv+7bkkwmhQB81VaiaKJA8Ce2TtDWqqPY+oZrrKZM38WmiNGNQ4I39UiwOsGQ2DyZiQ7dTcNnO0ubXBx5GY6UYDrMptC9-FEb6XM9ltaK4oMLVWjuwqOPdKLlumJudMMoMhVWlt8dG6KqHljblUnkOwd7VI7JIHzGDKSYilGNNNPnydRxXTPqD6YSNeeydAmok4fIZyiNPrt7F2loi2zYK3WOcJmm6DSqfbUv6fbMhytlkvrpZJiNTLnkuJVaYpxmHllAbboimLyMGY+1UyXe2P9wtweSfROGIG4TQfdKJ6WmMBEFcIZR+iPs-aBqGXgH2Er3VMtq-QqtAi2YstFY3a2f8qt0u80m5JDdnM1ttkN1J4t06MNq0JibTd+kRvopaRGeLTEL2aaTZZcmJti36+rfhW3QkhbhDDArWn43zunuW0TiGYmLxu6Zxuii-kYyBll1VnL0Zt34-thzlGa1qYjenaGmEgt9OMchoBpNuuU0jXTfrmMM5Dzm1jQm9Flb0OiSzFmin0a8wYmzFOecYm2zBfQrV0LgTQitUZ1mfdFHGP4c6+hp6uVHr602xjgS+muMDph+hbquUBzhkz6DWMfb40+xfFGeODmDxvpad9E7pauNyzI5X-Dke0fnbOmtrX+n4w1gDvXy3G4B3ffGhG2WhcxLRl2ijh3G5ld3h-MrpueVUzIce4Gnte2NxTWmpxjbHeW1wQIwPIbp1cvuX3QZwM3ONb6bAu2nOQfWdc617tm2YeWz1us5WLHz6ir-SXFPw7TcXaMUxIHwMWME7K2o-PRNyZDyrZy6eGmK4sbpzzKX+fmIByHsCrW6sodl8K9Ngdo+O5k9Z8PL9cJMMsfFzWpl1ewaGyXn0lO6sE0D5V9Z6mbjR8pulnLmJYcHsI+b+NjGaNh6DJPXX2HVPoOz6+dZgH6e7+Qcv24682jCceLG7u560e+eS+suf2xiGGs+IetcWW5Mi6puoBriHSyBFes6lszi4SpsDET2w8vWG+OeXK6a-SgyTcdsvuTu6Oe2u6EMyOjcFW4S6+8B1KMSa+yshaBOzaNB4SGs4GPexi0GcehadOA2wha8Z2oBxitczqha3OucNa4soKTEIBKqri-iUh2Gg8zEpst+oKTcRi82bya8zBXy3W9qZaf8oKV2vqWyxqluFcha5e9hQyYcoK56+MbMk+oSoe-BBalMxh28vhpsQycst+Rq28icoR9amExh3snK4ygyWuYckG2828oRIeNaHEDupsV2tScsY69q-CYKciCeTiQMmhpsJO4ik++MzEMMpqpMNRBOKamK+e0ULW5yd65RgcTGFccmyOJOphrCRMxcbavRIu6SqeoM3R1MfRloKccMwx2RrKHRSxLqquGsCugyki8K0seio6C8tCYxc+vWDReSDM7e7KWs7KZcyskKW+6c7GxxTioBba5OjEMI0Gj+9adhSWnMN+HOlKnMDMR6fcksFsbxz+ZCmsaBkOuCjEMaPqYMiJf+VBNM+emMScIcVeo65CYKkK7uNc8Wgy56PqvSsJrR6+aMiJBRUOjhRMtsqGFy7GTSsMzqVctR28HEsRRMbEpxjEqOjEdKtMLJghTi7JDiisvS9RKR6+Ti-MaK4RAsmshBVJsC8c7oTSQyTe1i0Sxhgyb+aM5MS6rRJGTSTE0i1iWqxhs6WsmRAcGxu8B6TSQMJS1i3OzETEdc+e0K0KnElygxDOzxMMHcGpJs4ugZUOIZn6dMJhMSiM0IpJZCj+1idhgZO+JBaMZWn2Xe4JiMcMfxGcwy1iXhgZZCURGMO8086iLKmZAJTKfpJsy2Y+yMyeaMga9MAO7miMKRPqhscZEKWprEN+gZmMsIqx0JiMRR7Z56E5vazEoKvhG5c6oq6i1smsfxTKJpgsCeG5nuWWbRoq9M9Exc+5UpHJa5Zp4SN8bpZaTM9Mzyls+cmsZx3s45bs06Wp3smxrWzEhR9M2uc8vyAJYMjpr8QFfm0OTEDp8MmMd++5zxic9KAFICWpV2wpoFgcUMsILWV80F7KKagexKAZps4CsuTE3snMT86ifsHEZx1hVFk8CZjCgchF0UlsMxZZtuMaicV2Gpk8eZjCn6mh2hYZDOFhQis8jEa87c4l42zE6sxehFucAl0Gd+CMDOylmMcFYRRh-CwMb+gcQMMC6sd+ily6ic6qOFk5ZlKanqoFrEEaXMtsxcrZyl28ux3i65-CMMr5QcgJXMpKvlS5w87KpK1Z4Mp5IViKUO-s2yGyV8HErRis5MalgcWp9sgioFKeZKvFBBMV5RmRjpmSZlDijOxVtswq56ySMVrR8OVFZSWpoqbWxVissy9sLVb6MJNs1VQsXVO+zi7KQJ8M08fS5RkmgcGso1WGZlGMRqUOn6vii1X+b6KR4VJpSyXVX6llicFpMMfStpEGQc0UGpm8kl28nMDuksYMxebmlO9RFyQcN8t16laM9syeksAcmKDih+jEWlRFbcP1uJTET6r5gJUZASg1hSgcGcXa+VyRjEGl0FUOY50JelKSjEiibVTEzB+V65YFkpONZcvsJOF1EpV1KNP1p5Dp7eUO6+oVipKqMJz2IupsTNZpDFBFbNT80IAObabacSVl6pAFAqRhIu0Ik17R2yoqxco69GrE+CMtyx4Rgca8llV2Kp3socrRnSzM6+GpmqOtDOX5oFgOgirE9JlsMaf6s6FthWQZpsNBTSTMBBV2xcFyNt2hN1WtdWKRKNbM9FOq2WPui5sJYdUM1ZoCeZRFRNoFNMGsGAQyR+4sR6mNAOaNoCtZgcGhF5-iPMg5e5GJcJ7KsMbt0N7KXlKcUOkiRRyGxcMJnMwx8Oddh2LNZZzdRmXMHc0VVeXdhMbt5NbElNGGUZbdj1Vdo6LNE958DFdFoFAivZ5M4iEtzx-CdsE9AtTKMBUO6csaV2kMy6l+zElo1Zp6OtHZ6RR6pKjWGV0Zy65MuVAFz6991MAN9sHNUi+lUpEG3qOZgGOtDW690KJi4Sd+Fy9G4SSuX97tM9llKMrpbGcDwD1KhMfpKCCZvOhSUOtc087Cn5y6EdXK8yGpKCydPtoFZCccPpWDTx+MD1j6ks6lM2QtM27cM15unKTx5+RMNDplYd28bMT11aQWINptwZA2YDLl4jacXt9OFZJul6yl-S8aeDViJse15MT1HuQWC8dlWjPK0mojp51lmsJBtMbc5OoiV9xGVpVjZpQM7coFjZ+sac6FjEwZdsR6GpPmRhQMdJUOucvZ9E2O2RPsHa4SwT2toTRMSlA8VR7ClyMBeicyNMHDKW4Rku9SrWvpFpTRLDqS6+1ZyyAZAcjcmhYT5MnEKtTtmNqqdKUE20eAu0sACAyAOwewbgJ0LAZ03Yl0ZA1AGA8QLAcQ8QhIVwNwhIdwjgTAGA8zYYiz9whIaoGocATAaIEAjozoWgiATAFopz5zCErgMAAA3HIOSHIJM9MwkHM9cOs0sys1YDYHYCswlHADRHQISKM1AC2HkPs+MCsCwFYIFCcySKKLcxAPcxAHIOBI8zMy8ws+86s683ABs44FszpDs4gGwIYCUFgJVHYHUHs8iy8Ic1wMc6c+wlc-C+BIiw8+wFwNgISBwDgNyDWISMWMIGC0wBC1C9gCczQDUI4PC56JKycwhEwPK1AGyMQEwAAIRmBCCBBkDStMBoRyvAxWjwussQCqgqCcvcvYC8u6D8tsgphMAAB8TAAAVFS9SCK-KOK5KzqxK04HKwqwYMqzq3qwqwa0a60Kaxy1yzy9WNawKw686-Gy60K+69C6+F6+cD644H64q4G+cMG8YYa3c+G+y9wFG5azG2QDa+yGyIm7W460m3WMpKK5604N67K-6zm3hEG5oDEPq9aEa9tAALpAA - shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxMArhwA6EPgKGtO3AO4cAJgHM4ZFkyj6WquQsHDUAG2JlL2DHAAeqOnBb7DTVI9P9zXqAgNT09UDTl6RgCyNksOACNePyUABSgYuTk0MI46JgBeJjSYgAoAfTKaDks4CoBKLChXckzodDLpAqkORp1K6ssoeJqSuSZujC5CS0kNWsJ3EuyNXKYAeiYZMBYybBqWDAWWLbq8MYmANygZ2vjiR1GIcefNsAAVG2umAGVrt14ngBFABMWwkWwAJMCMAAWACsAFkwecXiAttNDMckK92FANMRVABaCCkOBbAC+ZyeL2UBMIhjg+WMGGIkjIqDZZXU2l0o22qCaAGs4hAyWBTijnuw6QyyoNsKyyPlpBhpap6SxajUaGQyoRKBQ6CVuTF8lsYQAGACkJ3OEupAo0KwgWnyFqp4yqlkGw1qMGI8WqjLedEkZIgdVacxorDgdAucZKXA5ZAkipTEk17g4pDqiHOAAF02zC8zmnM6FzNDoyOdo6wBXRhVw4CU85LxnASCSYBwFl0whhXHi9SwLkt0Cs8hsAORd0iMPsHBYXGeR6kvKpaAeODAi1vzntLiSOfIz4IUGcSbBn1AsKAJoRrjtMLcYSRhdK1Mh0KD6lglPuerENYdBngAxJaABsACiABiACMV5MEBJpsPkCESF6lhnmQxAAF5xsQ2DIdhJCgWedBaPEUAlFBMJ4AhCHusCMKYRaGDAnUyFsMQj5cDQxBmmA2C2huzxvh+F61I4UCOG4JQXBwLAJDU+RwdcmqZrxqhaHQmjqZpcDrjSr4cFo76fhQZTYHJClKSpvqGZYWm0rp+kaM5momTSklWVqUAKmyJRsHA5lsMIhRQe6TC8Y+-pzMJPj4EwMBNFoXD5CshBkCUSoxWBMU4TF8RuqcXjWLq8RaORgiUdRtHuk1eAWtxEgCqgcZlNVtVgTOVE0SUzVNdxPkvK4ZCSHQTxbq02RdGIqATqgHQcJmcaPuuYCUuA0DwNQh6LgshxjvgRCkBQVDINJeCoPqt3EKgt33o+qZhvw8AaHgkiivw1iiRAwIWsDhIWghoOYVBcIAMxwhg0N4MCAAcFoAJwAOxQXgcMMXDSPY+jFpI3IQMgxawIQ3gUFQQhqMYOjiNI0xqPujCGD41BGCYXCSM8yTwMWqD0OU9TvPs4zCGWqjeBs3CVME9D0P82TMIi1B6MIVzEtQwjcuc9zMJM8rgsWnCIuE+jGBY8jCFI+jDNs9LeME3zgMC6DUHmzC0MYNLyPAghwJY472P09jUMIcboPo+b9Fa-70O86HwLy3C6MwujUdE+bqN05h-s68nVPw9jvNK27ZOoyLSNI9Cfu16j0Mp7LRdwlBwJwlHzHVzXnGM03YMy1bxfczDMJd+Dg9QSz0IMcj0PwgjLf6+H0Oo13FNT6j8Jh-P0-B33WNtwvyuT2fVMYwz8+o0DQ-4870XAuXpOT5vkO587yNsdDDu+yPVNE3XhXSewst52z-l-WG7o4YI05ljGmbFT6g1VoPQmYM+5fx5tzUO0t24ayQabSmhMM7xyRobZiQ89Yl3bkHAhntUEWmirvXmjDm4YD1lTQ249gHRyIRadG0IU7IxhmjUO8DxZQyRs-YGk8kZEOYkjCBvM07uk5hzP+xDQQ8LRnwwO4thFkIRgzS2KcNYwi0S-Qk3dUFA0UXPJG0VUb4x9gxS2Rjp7cMsUxeR6slFQQXphNmmFLYMxRhaaRYMrFvzwGYkJjMoaE0oXgRRKda6u1Jm-eR6cS7I3VjXf+djkm2wscDTe0SBG2xyQ43OuNxaKIRrXBCncK6b1AcEp+JjGYaxZjg5JsJknQwtJ40pyCiGDJxl0teDNnaKOlrzXOytN5mxsbXZhmMn7FzlnTOWUiFktI9mMypQi7YOIYpzBiTEBmN0Wbw1BicOL2KZqbUOOy-67ItDc7OqDLSazlsjKR0VQ4MTmYM4Z5NQZVzuajfONcab3zDts5JHdI77OscE72HEr41zttAhFw8pH8Jud475cI6ZYuhYw0ODM6YNLhEDIl5S4R6PxsjRuCFdbsLwHTLGpyPkVzaUQmGPsYWoyZfCrZ+K6V8tJqAxlsMlEY0lmIrlnKHG22VqAtpMTSWFNZdC7mJcyXJJ5sTflozUHt3zizQOcsYGMQ4qkshJTwmg2WcE9uiirXhJhEfcWdM5miszmaxhRC8nD2BCzHmtSsZMU5TfamGrbnBPRonDBLNa6qJLsxQ1YMUUytBnI1BUiW4RuYgI+W2bMI11RlBRNOii2w0RtCpuBqU7ZtSTfPNwNhZopiWQuGV9oVp1qQjbNDE7ZN0TcS4JSNc7huhSjaZ-Ts20sxlO8pN86ZCJvsDeFFyHkDIQkG0mKDz7oycZbOenab7Y3tfin+0rgYoOiSjWm+ib7QygvfO9qSELq2VigrVi7rY3zboEv+7bkkwmhQB81VaiaKJA8Ce2TtDWqqPY+oZrrKZM38WmiNGNQ4I39UiwOsGQ2DyZiQ7dTcNnO0ubXBx5GY6UYDrMptC9-FEb6XM9ltaK4oMLVWjuwqOPdKLlumJudMMoMhVWlt8dG6KqHljblUnkOwd7VI7JIHzGDKSYilGNNNPnydRxXTPqD6YSNeeydAmok4fIZyiNPrt7F2loi2zYK3WOcJmm6DSqfbUv6fbMhytlkvrpZJiNTLnkuJVaYpxmHllAbboimLyMGY+1UyXe2P9wtweSfROGIG4TQfdKJ6WmMBEFcIZR+iPs-aBqGXgH2Er3VMtq-QqtAi2YstFY3a2f8qt0u80m5JDdnM1ttkN1J4t06MNq0JibTd+kRvopaRGeLTEL2aaTZZcmJti36+rfhW3QkhbhDDArWn43zunuW0TiGYmLxu6Zxuii-kYyBll1VnL0Zt34-thzlGa1qYjenaGmEgt9OMchoBpNuuU0jXTfrmMM5Dzm1jQm9Flb0OiSzFmin0a8wYmzFOecYm2zBfQrV0LgTQitUZ1mfdFHGP4c6+hp6uVHr602xjgS+muMDph+hbquUBzhkz6DWMfb40+xfFGeODmDxvpad9E7pauNyzI5X-Dke0fnbOmtrX+n4w1gDvXy3G4B3ffGhG2WhcxLRl2ijh3G5ld3h-MrpueVUzIce4Gnte2NxTWmpxjbHeW1wQIwPIbp1cvuX3QZwM3ONb6bAu2nOQfWdc617tm2YeWz1us5WLHz6ir-SXFPw7TcXaMUxIHwMWME7K2o-PRNyZDyrZy6eGmK4sbpzzKX+fmIByHsCrW6sodl8K9Ngdo+O5k9Z8PL9cJMMsfFzWpl1ewaGyXn0lO6sE0D5V9Z6mbjR8pulnLmJYcHsI+b+NjGaNh6DJPXX2HVPoOz6+dZgH6e7+Qcv24682jCceLG7u560e+eS+suf2xiGGs+IetcWW5Mi6puoBriHSyBFes6lszi4SpsDET2w8vWG+OeXK6a-SgyTcdsvuTu6Oe2u6EMyOjcFW4S6+8B1KMSa+yshaBOzaNB4SGs4GPexi0GcehadOA2wha8Z2oBxitczqha3OucNa4soKTEIBKqri-iUh2Gg8zEpst+oKTcRi82bya8zBXy3W9qZaf8oKV2vqWyxqluFcha5e9hQyYcoK56+MbMk+oSoe-BBalMxh28vhpsQycst+Rq28icoR9amExh3snK4ygyWuYckG2828oRIeNaHEDupsV2tScsY69q-CYKciCeTiQMmhpsJO4ik++MzEMMpqpMNRBOKamK+e0ULW5yd65RgcTGFccmyOJOphrCRMxcbavRIu6SqeoM3R1MfRloKccMwx2RrKHRSxLqquGsCugyki8K0seio6C8tCYxc+vWDReSDM7e7KWs7KZcyskKW+6c7GxxTioBba5OjEMI0Gj+9adhSWnMN+HOlKnMDMR6fcksFsbxz+ZCmsaBkOuCjEMaPqYMiJf+VBNM+emMScIcVeo65CYKkK7uNc8Wgy56PqvSsJrR6+aMiJBRUOjhRMtsqGFy7GTSsMzqVctR28HEsRRMbEpxjEqOjEdKtMLJghTi7JDiisvS9RKR6+Ti-MaK4RAsmshBVJsC8c7oTSQyTe1i0Sxhgyb+aM5MS6rRJGTSTE0i1iWqxhs6WsmRAcGxu8B6TSQMJS1i3OzETEdc+e0K0KnElygxDOzxMMHcGpJs4ugZUOIZn6dMJhMSiM0IpJZCj+1idhgZO+JBaMZWn2Xe4JiMcMfxGcwy1iXhgZZCURGMO8086iLKmZAJTKfpJsy2Y+yMyeaMga9MAO7miMKRPqhscZEKWprEN+gZmMsIqx0JiMRR7Z56E5vazEoKvhG5c6oq6i1smsfxTKJpgsCeG5nuWWbRoq9M9Exc+5UpHJa5Zp4SN8bpZaTM9Mzyls+cmsZx3s45bs06Wp3smxrWzEhR9M2uc8vyAJYMjpr8QFfm0OTEDp8MmMd++5zxic9KAFICWpV2wpoFgcUMsILWV80F7KKagexKAZps4CsuTE3snMT86ifsHEZx1hVFk8CZjCgchF0UlsMxZZtuMaicV2Gpk8eZjCn6mh2hYZDOFhQis8jEa87c4l42zE6sxehFucAl0Gd+CMDOylmMcFYRRh-CwMb+gcQMMC6sd+ily6ic6qOFk5ZlKanqoFrEEaXMtsxcrZyl28ux3i65-CMMr5QcgJXMpKvlS5w87KpK1Z4Mp5IViKUO-s2yGyV8HErRis5MalgcWp9sgioFKeZKvFBBMV5RmRjpmSZlDijOxVtswq56ySMVrR8OVFZSWpoqbWxVissy9sLVb6MJNs1VQsXVO+zi7KQJ8M08fS5RkmgcGso1WGZlGMRqUOn6vii1X+b6KR4VJpSyXVX6llicFpMMfStpEGQc0UGpm8kl28nMDuksYMxebmlO9RFyQcN8t16laM9syeksAcmKDih+jEWlRFbcP1uJTET6r5gJUZASg1hSgcGcXa+VyRjEGl0FUOY50JelKSjEiibVTEzB+V65YFkpONZcvsJOF1EpV1KNP1p5Dp7eUO6+oVipKqMJz2IupsTNZpDFBFbNT80IAObabacSVl6pAFAqRhIu0Ik17R2yoqxco69GrE+CMtyx4Rgca8llV2Kp3socrRnSzM6+GpmqOtDOX5oFgOgirE9JlsMaf6s6FthWQZpsNBTSTMBBV2xcFyNt2hN1WtdWKRKNbM9FOq2WPui5sJYdUM1ZoCeZRFRNoFNMGsGAQyR+4sR6mNAOaNoCtZgcGhF5-iPMg5e5GJcJ7KsMbt0N7KXlKcUOkiRRyGxcMJnMwx8Oddh2LNZZzdRmXMHc0VVeXdhMbt5NbElNGGUZbdj1Vdo6LNE958DFdFoFAivZ5M4iEtzx-CdsE9AtTKMBUO6csaV2kMy6l+zElo1Zp6OtHZ6RR6pKjWGV0Zy65MuVAFz6991MAN9sHNUi+lUpEG3qOZgGOtDW690KJi4Sd+Fy9G4SSuX97tM9llKMrpbGcDwD1KhMfpKCCZvOhSUOtc087Cn5y6EdXK8yGpKCydPtoFZCccPpWDTx+MD1j6ks6lM2QtM27cM15unKTx5+RMNDplYd28bMT11aQWINptwZA2YDLl4jacXt9OFZJul6yl-S8aeDViJse15MT1HuQWC8dlWjPK0mojp51lmsJBtMbc5OoiV9xGVpVjZpQM7coFjZ+sac6FjEwZdsR6GpPmRhQMdJUOucvZ9E2O2RPsHa4SwT2toTRMSlA8VR7ClyMBeicyNMHDKW4Rku9SrWvpFpTRLDqS6+1ZyyAZAcjcmhYT5MnEKtTtmNqqdKUE20eAu0sACAyAOwewbgJ0LAZ03Yl0ZA1AGA8QLAcQ8QhIVwNwhIdwjgTAGA8zYYiz9whIaoGocATAaIEAjozoWgiATAFopz5zCErgMAAA3HIOSHIJM9MwkHM9cOs0sys1YDYHYCswlHADRHQISKM1AC2HkPs+MCsCwFYIFCcySKKLcxAPcxAHIOBI8zMy8ws+86s683ABs44FszpDs4gGwIYCUFgJVHYHUHs8iy8Ic1wMc6c+wlc-C+BIiw8+wFwNgISBwDgNyDWISMWMIGC0wBC1C9gCczQDUI4PC56JKycwhEwPK1AGyMQEwAAIRmBCCBBkDStMBoRyvAxWjwussQCqgqCcvcvYC8u6D8tsgphMAAB8TAAAVFS9SCK-KOK5KzqxK04HKwqwYMqzq3qwqwa0a60Kaxy1yzy9WNawKw686-Gy60K+69C6+F6+cD644H64q4G+cMG8YYa3c+G+y9wFG5azG2QDa+yGyIm7W460m3WMpKK5604N67K-6zm3hEG5oDEPq9aEa9tAALpAA - code: |4 - # see shiny-live page for details on additional files - - from pathlib import Path - - import pandas as pd - import plotly.express as px - import shinywidgets as sw - from shiny import App, ui - - appdir = Path(__file__).parent - - app_ui = ui.page_fillable( - ui.include_css(appdir / "styles.css"), - ui.value_box( - "Total Sales in Q2", - "$2.45M", - {"class": "shadow-none"}, - showcase=sw.output_widget("sparkline"), - showcase_layout=ui.showcase_left_center(width="40%"), - ), - padding=0, - fillable_mobile=True, - ) - - def server(input, output, session): - @sw.render_widget - def sparkline(): - economics = pd.read_csv(appdir / "economics.csv") - fig = px.line(economics, x="date", y="psavert") - fig.update_traces( - line_color="#406EF1", - line_width=1, - fill="tozeroy", - fillcolor="rgba(64,110,241,0.2)", - hoverinfo="y", - ) - fig.update_xaxes(visible=False, showgrid=False) - fig.update_yaxes(visible=False, showgrid=False) - fig.update_layout( - height=60, - hovermode="x", - margin=dict(t=0, r=0, l=0, b=0), - plot_bgcolor="rgba(0,0,0,0)", - paper_bgcolor="rgba(0,0,0,0)", - ) - return fig - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details - -Value boxes are special "cards" that help group information together in an aesthetic way. -You can read more about value boxes in the [bslib](https://rstudio.github.io/bslib/articles/value-boxes/index.html) R Package. - -Value boxes have 4 main parts: - - 1. `value` - text to display in the card - 2. `title` - optional text that displays _above_ the `value` - 3. `showcase` - optional element to be shown next to the `value` text (e.g., an image or logo) - 4. `theme` - optional theme to change the appearance of the value box - -There is only a UI component for the value box. - 1. Call `ui.value_box()` to the UI of your app to create a div in which to display the value box. - -Since the value box is only a UI component, if you want to make it interactive (i.e., [reactive](https://shiny.posit.co/py/docs/reactive-programming.html)), you can pair it up with either a [`ui.output_ui()`](https://shiny.posit.co/py/api/ui.output_ui.html) + [`@render.ui()`](https://shiny.posit.co/py/api/render.ui.html) pair or use -[`ui.output_text()`](https://shiny.posit.co/py/api/ui.output_text.html) as an argument to the `ui.value_box()` function if you only need text changes. - -:::{#variations} -::: diff --git a/components/outputs/value-box/app-core.py b/components/outputs/value-box/app-core.py new file mode 100644 index 00000000..6d5f7134 --- /dev/null +++ b/components/outputs/value-box/app-core.py @@ -0,0 +1,18 @@ +from shiny import App, ui + +# From https://icons.getbootstrap.com/icons/piggy-bank/ +piggy_bank = ui.HTML( + '' +) + +app_ui = ui.page_fluid( + ui.value_box( + "KPI Title", + "$1 Billion Dollars", + "Up 30% VS PREVIOUS 30 DAYS", + showcase=piggy_bank, + theme="bg-gradient-indigo-purple", + ), +) + +app = App(app_ui, server=None) diff --git a/components/outputs/value-box/app-express.py b/components/outputs/value-box/app-express.py new file mode 100644 index 00000000..b12d94d9 --- /dev/null +++ b/components/outputs/value-box/app-express.py @@ -0,0 +1,11 @@ +from shiny.express import ui + +# From https://icons.getbootstrap.com/icons/piggy-bank/ +piggy_bank = ui.HTML( + '' +) + +with ui.value_box(showcase=piggy_bank, theme="bg-gradient-indigo-purple"): + "KPI Title" + "$1 Billion Dollars" + "Up 30% VS PREVIOUS 30 DAYS" diff --git a/components/outputs/value-box/app-preview.py b/components/outputs/value-box/app-preview.py new file mode 100644 index 00000000..14c52d74 --- /dev/null +++ b/components/outputs/value-box/app-preview.py @@ -0,0 +1,264 @@ +from shiny import App, ui +import shinywidgets as sw +import plotly.express as px +import pandas as pd +from pathlib import Path + +appdir = Path(__file__).parent + +app_ui = ui.page_fillable( + ui.include_css(appdir / "styles.css"), + ui.value_box( + "Total Sales in Q2", "$2.45M", + {"class": "shadow-none"}, + showcase=sw.output_widget("sparkline"), + showcase_layout=ui.showcase_left_center(width="40%") + ), + padding=0, + fillable_mobile=True +) + +def server(input, output, session): + @output + @sw.render_widget + def sparkline(): + economics = pd.read_csv(appdir / 'economics.csv') + fig = px.line(economics, x='date', y='psavert') + fig.update_traces(line_color='#406EF1', line_width=1, fill='tozeroy', fillcolor='rgba(64,110,241,0.2)', hoverinfo="y") + fig.update_xaxes(visible=False, showgrid=False) + fig.update_yaxes(visible=False, showgrid=False) + fig.update_layout(height = 60, hovermode="x", margin=dict(t=0, r=0, l=0, b=0), plot_bgcolor='rgba(0,0,0,0)', paper_bgcolor='rgba(0,0,0,0)') + return fig + +app = App(app_ui, server) + +## file: requirements.txt +plotly + +## file: styles.css +@media (max-width: 400px) { +.plotly svg .hoverlayer { + display: none; +} +} +.bslib-value-box .value-box-showcase { + padding: 0 0 0 1rem; +} +.bslib-value-box .plotly .modebar-container { + display: none; +} + +#.bslib-value-box .value-box-showcase:has(.plotly) { +# padding: 0.5rem; +#} + +.shiny-ipywidget-output { + display: flex; + flex: 1 1 auto !important; + width: 100%; +} + +.shiny-ipywidget-output > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} + +.shiny-ipywidget-output > * > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} + +.shiny-ipywidget-output > * > * > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} + +## file: economics.csv +date,pce,pop,psavert,uempmed,unemploy +2000-01-01,6535.3,280976,5.4,5.8,5708 +2000-02-01,6619.7,281190,4.8,6.1,5858 +2000-03-01,6685.8,281409,4.5,6,5733 +2000-04-01,6671.1,281653,5,6.1,5481 +2000-05-01,6707.6,281877,4.9,5.8,5758 +2000-06-01,6743.9,282126,4.9,5.7,5651 +2000-07-01,6764.1,282385,5.2,6,5747 +2000-08-01,6799.1,282653,5.2,6.3,5853 +2000-09-01,6882.9,282932,4.5,5.2,5625 +2000-10-01,6888.2,283201,4.6,6.1,5534 +2000-11-01,6902.4,283453,4.5,6.1,5639 +2000-12-01,6945.7,283696,4.2,6,5634 +2001-01-01,6977,283920,4.8,5.8,6023 +2001-02-01,6995.8,284137,4.9,6.1,6089 +2001-03-01,6987.9,284350,5.3,6.6,6141 +2001-04-01,7001.2,284581,5,5.9,6271 +2001-05-01,7047.1,284810,4.5,6.3,6226 +2001-06-01,7060.7,285062,4.5,6,6484 +2001-07-01,7072.2,285309,5.6,6.8,6583 +2001-08-01,7108.9,285570,6.8,6.9,7042 +2001-09-01,7012.8,285843,7,7.2,7142 +2001-10-01,7208.4,286098,3.4,7.3,7694 +2001-11-01,7167.9,286341,4.1,7.7,8003 +2001-12-01,7147.7,286570,4.5,8.2,8258 +2002-01-01,7174.3,286788,6.1,8.4,8182 +2002-02-01,7218.3,286994,5.8,8.3,8215 +2002-03-01,7237.2,287190,5.9,8.4,8304 +2002-04-01,7305.4,287397,5.8,8.9,8599 +2002-05-01,7282.7,287623,6.5,9.5,8399 +2002-06-01,7318.2,287864,6.4,11,8393 +2002-07-01,7380.4,288105,5.5,8.9,8390 +2002-08-01,7401.5,288360,5.4,9,8304 +2002-09-01,7391,288618,5.7,9.5,8251 +2002-10-01,7430.7,288870,5.7,9.6,8307 +2002-11-01,7459.7,289106,5.7,9.3,8520 +2002-12-01,7512.8,289313,5.5,9.6,8640 +2003-01-01,7533.1,289518,5.5,9.6,8520 +2003-02-01,7535.9,289714,5.6,9.5,8618 +2003-03-01,7598.4,289911,5.3,9.7,8588 +2003-04-01,7621,290125,5.3,10.2,8842 +2003-05-01,7628.1,290346,5.8,9.9,8957 +2003-06-01,7678.6,290584,5.6,11.5,9266 +2003-07-01,7738.2,290820,6.3,10.3,9011 +2003-08-01,7834.5,291072,6,10.1,8896 +2003-09-01,7835,291321,5.2,10.2,8921 +2003-10-01,7845.7,291574,5.3,10.4,8732 +2003-11-01,7899.6,291807,5.4,10.3,8576 +2003-12-01,7929.2,292008,5.4,10.4,8317 +2004-01-01,7987.4,292192,5,10.6,8370 +2004-02-01,8019.8,292368,5,10.2,8167 +2004-03-01,8076,292561,4.9,10.2,8491 +2004-04-01,8088.6,292779,5.3,9.5,8170 +2004-05-01,8163.2,292997,5.3,9.9,8212 +2004-06-01,8147.2,293223,5.8,11,8286 +2004-07-01,8218.9,293463,5.3,8.9,8136 +2004-08-01,8253.1,293719,5.2,9.2,7990 +2004-09-01,8321.1,293971,4.6,9.6,7927 +2004-10-01,8374.6,294230,4.5,9.5,8061 +2004-11-01,8420.6,294466,4.1,9.7,7932 +2004-12-01,8481.5,294694,6.9,9.5,7934 +2005-01-01,8470.2,294914,3.7,9.4,7784 +2005-02-01,8529.2,295105,3.4,9.2,7980 +2005-03-01,8569.5,295287,3.6,9.3,7737 +2005-04-01,8645.6,295490,3.1,9,7672 +2005-05-01,8643.9,295704,3.5,9.1,7651 +2005-06-01,8724.8,295936,2.9,9,7524 +2005-07-01,8829.5,296186,2.2,8.8,7406 +2005-08-01,8832.4,296440,2.7,9.2,7345 +2005-09-01,8885.8,296707,2.7,8.4,7553 +2005-10-01,8926.6,296972,3.1,8.6,7453 +2005-11-01,8938.5,297207,3.5,8.5,7566 +2005-12-01,8969.6,297431,3.7,8.7,7279 +2006-01-01,9059.8,297647,4.2,8.6,7064 +2006-02-01,9090.1,297854,4.2,9.1,7184 +2006-03-01,9122.1,298060,4.2,8.7,7072 +2006-04-01,9174.8,298281,4,8.4,7120 +2006-05-01,9215.1,298496,3.8,8.5,6980 +2006-06-01,9240.8,298739,4,7.3,7001 +2006-07-01,9322.6,298996,3.4,8,7175 +2006-08-01,9321.8,299263,3.6,8.4,7091 +2006-09-01,9354.7,299554,3.6,8,6847 +2006-10-01,9373.2,299835,3.6,7.9,6727 +2006-11-01,9380.2,300094,3.9,8.3,6872 +2006-12-01,9469,300340,3.7,7.5,6762 +2007-01-01,9516.3,300574,3.7,8.3,7116 +2007-02-01,9546.8,300802,4.1,8.5,6927 +2007-03-01,9585.1,301021,4.4,9.1,6731 +2007-04-01,9615.7,301254,4.2,8.6,6850 +2007-05-01,9651.3,301483,4,8.2,6766 +2007-06-01,9667.3,301739,3.8,7.7,6979 +2007-07-01,9709.6,302004,3.7,8.7,7149 +2007-08-01,9753.9,302267,3.4,8.8,7067 +2007-09-01,9797.9,302546,3.5,8.7,7170 +2007-10-01,9827,302807,3.4,8.4,7237 +2007-11-01,9897.8,303054,3.1,8.6,7240 +2007-12-01,9908.4,303287,3.6,8.4,7645 +2008-01-01,9930,303506,3.7,9,7685 +2008-02-01,9913.4,303711,4.1,8.7,7497 +2008-03-01,9959.4,303907,4,8.7,7822 +2008-04-01,9996.8,304117,3.4,9.4,7637 +2008-05-01,10053.8,304323,7.8,7.9,8395 +2008-06-01,10107.9,304556,5.5,9,8575 +2008-07-01,10104.7,304798,4.4,9.7,8937 +2008-08-01,10094.7,305045,3.8,9.7,9438 +2008-09-01,10043.5,305309,4.7,10.2,9494 +2008-10-01,9960.3,305554,5.5,10.4,10074 +2008-11-01,9820.8,305786,6.4,9.8,10538 +2008-12-01,9730.7,306004,6.4,10.5,11286 +2009-01-01,9783.8,306208,6.2,10.7,12058 +2009-02-01,9766,306402,5.5,11.7,12898 +2009-03-01,9718.5,306588,5.9,12.3,13426 +2009-04-01,9724.8,306787,6.8,13.1,13853 +2009-05-01,9748.9,306984,8.2,14.2,14499 +2009-06-01,9806.9,307206,6.7,17.2,14707 +2009-07-01,9841.7,307439,6,16,14601 +2009-08-01,9961,307685,4.9,16.3,14814 +2009-09-01,9883.4,307946,5.9,17.8,15009 +2009-10-01,9931.9,308189,5.4,18.9,15352 +2009-11-01,9940.5,308418,5.9,19.8,15219 +2009-12-01,9998.9,308633,5.9,20.1,15098 +2010-01-01,10001.8,308833,6.1,20,15046 +2010-02-01,10030.6,309027,5.8,19.9,15113 +2010-03-01,10089.1,309212,5.7,20.4,15202 +2010-04-01,10112.9,309191.211,6.4,22.1,15325 +2010-05-01,10131,309369.053,7,22.3,14849 +2010-06-01,10151.4,309548.502,6.9,25.2,14474 +2010-07-01,10184.7,309745.698,6.8,22.3,14512 +2010-08-01,10228.2,309957.775,6.9,21,14648 +2010-09-01,10249,310176.466,6.7,20.3,14579 +2010-10-01,10304.7,310399.958,6.6,21.2,14516 +2010-11-01,10354.7,310595.764,6.6,21,15081 +2010-12-01,10392.1,310781.705,7.1,21.9,14348 +2011-01-01,10435.5,310960.74,7.4,21.5,14013 +2011-02-01,10470.1,311113.376,7.6,21.1,13820 +2011-03-01,10550.5,311265.404,7,21.5,13737 +2011-04-01,10587.6,311436.238,6.9,20.9,13957 +2011-05-01,10612,311607.08,6.9,21.6,13855 +2011-06-01,10636.8,311791.223,7.2,22.4,13962 +2011-07-01,10677.5,311997.049,7.3,22,13763 +2011-08-01,10700.6,312205.367,7.2,22.4,13818 +2011-09-01,10738.1,312429.118,6.8,22,13948 +2011-10-01,10753.1,312644.159,6.8,20.6,13594 +2011-11-01,10759.5,312829.523,7,20.8,13302 +2011-12-01,10772.2,313009.712,7.8,20.5,13093 +2012-01-01,10862.1,313183.179,8,20.8,12797 +2012-02-01,10953.5,313338.977,8,19.7,12813 +2012-03-01,10951.8,313499.369,8.5,19.2,12713 +2012-04-01,10979.7,313667.127,8.7,19.1,12646 +2012-05-01,10968.6,313830.53,8.8,19.9,12660 +2012-06-01,10946.3,314017.594,9.1,20.4,12692 +2012-07-01,10977.2,314210.786,8.2,17.5,12656 +2012-08-01,11004.1,314422.341,8,18.4,12471 +2012-09-01,11061.5,314646.749,8.2,18.8,12115 +2012-10-01,11099.8,314853.978,8.8,19.9,12124 +2012-11-01,11136.8,315053.863,9.7,18.6,12005 +2012-12-01,11140.5,315232.752,12,17.7,12298 +2013-01-01,11202.8,315389.595,6.3,15.8,12471 +2013-02-01,11239.6,315520.143,5.8,17.2,11950 +2013-03-01,11227.1,315662.224,5.9,17.6,11689 +2013-04-01,11205.4,315817.855,6.4,17.1,11760 +2013-05-01,11244.6,315983.654,6.7,17.1,11654 +2013-06-01,11268.8,316171.042,6.8,17,11751 +2013-07-01,11296.7,316358.778,6.6,16.2,11335 +2013-08-01,11329.2,316580.327,6.7,16.5,11279 +2013-09-01,11366.9,316806.125,6.8,16.5,11270 +2013-10-01,11419.8,317022.27,6.3,16.3,11136 +2013-11-01,11487.6,317228.026,6.2,17.1,10787 +2013-12-01,11517.9,317411.551,6.4,17.3,10404 +2014-01-01,11512.5,317593.923,7.1,15.4,10202 +2014-02-01,11566.2,317753.883,7.3,15.9,10349 +2014-03-01,11643,317917.203,7.4,15.8,10380 +2014-04-01,11702.6,318089.218,7.4,15.7,9702 +2014-05-01,11748.4,318269.505,7.4,14.6,9859 +2014-06-01,11817,318464.152,7.4,13.8,9460 +2014-07-01,11860.5,318662.368,7.5,13.1,9608 +2014-08-01,11944.3,318893.786,7.2,12.9,9599 +2014-09-01,11957.4,319125.296,7.4,13.4,9262 +2014-10-01,12023,319353.734,7.2,13.6,8990 +2014-11-01,12051.4,319564.209,7.3,13,9090 +2014-12-01,12062,319746.157,7.6,12.9,8717 +2015-01-01,12046,319928.646,7.7,13.2,8903 +2015-02-01,12082.4,320074.511,7.9,12.9,8610 +2015-03-01,12158.3,320230.786,7.4,12,8504 +2015-04-01,12193.8,320402.295,7.6,11.5,8526 diff --git a/components/outputs/value-box/app-variation-reactive-value-box-core.py b/components/outputs/value-box/app-variation-reactive-value-box-core.py new file mode 100644 index 00000000..7d0bffa8 --- /dev/null +++ b/components/outputs/value-box/app-variation-reactive-value-box-core.py @@ -0,0 +1,34 @@ +import faicons +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.layout_columns( + ui.h2("Spend Jeff's 2023 Earnings"), + ui.input_slider("pct", "Percent of $70 Billion to donate", 0, 100, 20), # << + ui.value_box( + title="Save", + showcase=faicons.icon_svg("piggy-bank", width="50px"), + value=ui.output_ui("save"), # << + theme="bg-gradient-orange-red", + ), + ui.value_box( + title="Donate", + showcase=faicons.icon_svg("hand-holding-dollar", width="50px"), + value=ui.output_ui("donate"), # << + theme="bg-gradient-blue-purple", + ), + ), +) + + +def server(input, output, session): + @render.text # << + def save(): # << + return f"${(1 - input.pct() / 100) * 70:.1f} Billion" # << + + @render.text # << + def donate(): # << + return f"${input.pct() / 100 * 70:.1f} Billion" # << + + +app = App(app_ui, server) diff --git a/components/outputs/value-box/app-variation-reactive-value-box-express.py b/components/outputs/value-box/app-variation-reactive-value-box-express.py new file mode 100644 index 00000000..6f08a4c8 --- /dev/null +++ b/components/outputs/value-box/app-variation-reactive-value-box-express.py @@ -0,0 +1,27 @@ +import faicons +from shiny import render +from shiny.express import input, ui + +with ui.layout_columns(): + ui.h2("Spend Jeff's 2023 Earnings") + ui.input_slider("pct", "Percent of $70 Billion to donate", 0, 100, 20) # << + + with ui.value_box( + showcase=faicons.icon_svg("piggy-bank", width="50px"), + theme="bg-gradient-orange-red", + ): + "Save" + + @render.ui # << + def save(): # << + return f"${(1 - input.pct() / 100) * 70:.1f} Billion" # << + + with ui.value_box( + showcase=faicons.icon_svg("hand-holding-dollar", width="50px"), + theme="bg-gradient-blue-purple", + ): + "Donate" + + @render.ui # << + def donate(): # << + return f"${input.pct() / 100 * 70:.1f} Billion" # << diff --git a/components/outputs/value-box/app-variation-sparklines-core.py b/components/outputs/value-box/app-variation-sparklines-core.py new file mode 100644 index 00000000..8f86d9f0 --- /dev/null +++ b/components/outputs/value-box/app-variation-sparklines-core.py @@ -0,0 +1,48 @@ +# Open in shinylive to see additional files + +from pathlib import Path + +import pandas as pd +import plotly.express as px +import shinywidgets as sw +from shiny import App, ui + +appdir = Path(__file__).parent + +app_ui = ui.page_fixed( + ui.include_css(appdir / "styles.css"), + ui.value_box( + "Total Sales in Q2", + "$2.45M", + showcase=sw.output_widget("sparkline"), + showcase_layout="bottom", + ), + fillable_mobile=True, +) + + +def server(input, output, session): + @sw.render_widget + def sparkline(): + economics = pd.read_csv(appdir / "economics.csv") + fig = px.line(economics, x="date", y="psavert") + fig.update_traces( + line_color="#406EF1", + line_width=1, + fill="tozeroy", + fillcolor="rgba(64,110,241,0.2)", + hoverinfo="y", + ) + fig.update_xaxes(visible=False, showgrid=False) + fig.update_yaxes(visible=False, showgrid=False) + fig.update_layout( + height=100, + hovermode="x", + margin=dict(t=0, r=0, l=0, b=0), + plot_bgcolor="rgba(0,0,0,0)", + paper_bgcolor="rgba(0,0,0,0)", + ) + return fig + + +app = App(app_ui, server) diff --git a/components/outputs/value-box/app-variation-sparklines-express.py b/components/outputs/value-box/app-variation-sparklines-express.py new file mode 100644 index 00000000..ea4fe751 --- /dev/null +++ b/components/outputs/value-box/app-variation-sparklines-express.py @@ -0,0 +1,40 @@ +# Open in shinylive to see additional files + +from pathlib import Path + +import pandas as pd +import plotly.express as px +import shinywidgets as sw +from shiny.express import suspend_display, ui + +appdir = Path(__file__).parent + +ui.include_css(appdir / "styles.css") + +with ui.value_box(showcase=sw.output_widget("sparkline"), showcase_layout="bottom"): + "Total Sales in Q2" + "$2.45M" + + with suspend_display(): + + @sw.render_widget + def sparkline(): + economics = pd.read_csv(appdir / "economics.csv") + fig = px.line(economics, x="date", y="psavert") + fig.update_traces( + line_color="#406EF1", + line_width=1, + fill="tozeroy", + fillcolor="rgba(64,110,241,0.2)", + hoverinfo="y", + ) + fig.update_xaxes(visible=False, showgrid=False) + fig.update_yaxes(visible=False, showgrid=False) + fig.update_layout( + height=100, + hovermode="x", + margin=dict(t=0, r=0, l=0, b=0), + plot_bgcolor="rgba(0,0,0,0)", + paper_bgcolor="rgba(0,0,0,0)", + ) + return fig diff --git a/components/outputs/value-box/app-variation-sparklines-preview.py b/components/outputs/value-box/app-variation-sparklines-preview.py new file mode 100644 index 00000000..0ba1b572 --- /dev/null +++ b/components/outputs/value-box/app-variation-sparklines-preview.py @@ -0,0 +1,273 @@ +# ruff: noqa +## file: app.py +# Open in shinylive to see additional files + +from pathlib import Path + +import pandas as pd +import plotly.express as px +import shinywidgets as sw +from shiny import App, ui + +appdir = Path(__file__).parent + +app_ui = ui.page_fixed( + ui.include_css(appdir / "styles.css"), + ui.value_box( + "Total Sales in Q2", + "$2.45M", + showcase=sw.output_widget("sparkline"), + showcase_layout="bottom", + ), + fillable_mobile=True, +) + + +def server(input, output, session): + @sw.render_widget + def sparkline(): + economics = pd.read_csv(appdir / "economics.csv") + fig = px.line(economics, x="date", y="psavert") + fig.update_traces( + line_color="#406EF1", + line_width=1, + fill="tozeroy", + fillcolor="rgba(64,110,241,0.2)", + hoverinfo="y", + ) + fig.update_xaxes(visible=False, showgrid=False) + fig.update_yaxes(visible=False, showgrid=False) + fig.update_layout( + height=100, + hovermode="x", + margin=dict(t=0, r=0, l=0, b=0), + plot_bgcolor="rgba(0,0,0,0)", + paper_bgcolor="rgba(0,0,0,0)", + ) + return fig + + +app = App(app_ui, server) + + +## file: economics.csv +date,pce,pop,psavert,uempmed,unemploy +2000-01-01,6535.3,280976,5.4,5.8,5708 +2000-02-01,6619.7,281190,4.8,6.1,5858 +2000-03-01,6685.8,281409,4.5,6,5733 +2000-04-01,6671.1,281653,5,6.1,5481 +2000-05-01,6707.6,281877,4.9,5.8,5758 +2000-06-01,6743.9,282126,4.9,5.7,5651 +2000-07-01,6764.1,282385,5.2,6,5747 +2000-08-01,6799.1,282653,5.2,6.3,5853 +2000-09-01,6882.9,282932,4.5,5.2,5625 +2000-10-01,6888.2,283201,4.6,6.1,5534 +2000-11-01,6902.4,283453,4.5,6.1,5639 +2000-12-01,6945.7,283696,4.2,6,5634 +2001-01-01,6977,283920,4.8,5.8,6023 +2001-02-01,6995.8,284137,4.9,6.1,6089 +2001-03-01,6987.9,284350,5.3,6.6,6141 +2001-04-01,7001.2,284581,5,5.9,6271 +2001-05-01,7047.1,284810,4.5,6.3,6226 +2001-06-01,7060.7,285062,4.5,6,6484 +2001-07-01,7072.2,285309,5.6,6.8,6583 +2001-08-01,7108.9,285570,6.8,6.9,7042 +2001-09-01,7012.8,285843,7,7.2,7142 +2001-10-01,7208.4,286098,3.4,7.3,7694 +2001-11-01,7167.9,286341,4.1,7.7,8003 +2001-12-01,7147.7,286570,4.5,8.2,8258 +2002-01-01,7174.3,286788,6.1,8.4,8182 +2002-02-01,7218.3,286994,5.8,8.3,8215 +2002-03-01,7237.2,287190,5.9,8.4,8304 +2002-04-01,7305.4,287397,5.8,8.9,8599 +2002-05-01,7282.7,287623,6.5,9.5,8399 +2002-06-01,7318.2,287864,6.4,11,8393 +2002-07-01,7380.4,288105,5.5,8.9,8390 +2002-08-01,7401.5,288360,5.4,9,8304 +2002-09-01,7391,288618,5.7,9.5,8251 +2002-10-01,7430.7,288870,5.7,9.6,8307 +2002-11-01,7459.7,289106,5.7,9.3,8520 +2002-12-01,7512.8,289313,5.5,9.6,8640 +2003-01-01,7533.1,289518,5.5,9.6,8520 +2003-02-01,7535.9,289714,5.6,9.5,8618 +2003-03-01,7598.4,289911,5.3,9.7,8588 +2003-04-01,7621,290125,5.3,10.2,8842 +2003-05-01,7628.1,290346,5.8,9.9,8957 +2003-06-01,7678.6,290584,5.6,11.5,9266 +2003-07-01,7738.2,290820,6.3,10.3,9011 +2003-08-01,7834.5,291072,6,10.1,8896 +2003-09-01,7835,291321,5.2,10.2,8921 +2003-10-01,7845.7,291574,5.3,10.4,8732 +2003-11-01,7899.6,291807,5.4,10.3,8576 +2003-12-01,7929.2,292008,5.4,10.4,8317 +2004-01-01,7987.4,292192,5,10.6,8370 +2004-02-01,8019.8,292368,5,10.2,8167 +2004-03-01,8076,292561,4.9,10.2,8491 +2004-04-01,8088.6,292779,5.3,9.5,8170 +2004-05-01,8163.2,292997,5.3,9.9,8212 +2004-06-01,8147.2,293223,5.8,11,8286 +2004-07-01,8218.9,293463,5.3,8.9,8136 +2004-08-01,8253.1,293719,5.2,9.2,7990 +2004-09-01,8321.1,293971,4.6,9.6,7927 +2004-10-01,8374.6,294230,4.5,9.5,8061 +2004-11-01,8420.6,294466,4.1,9.7,7932 +2004-12-01,8481.5,294694,6.9,9.5,7934 +2005-01-01,8470.2,294914,3.7,9.4,7784 +2005-02-01,8529.2,295105,3.4,9.2,7980 +2005-03-01,8569.5,295287,3.6,9.3,7737 +2005-04-01,8645.6,295490,3.1,9,7672 +2005-05-01,8643.9,295704,3.5,9.1,7651 +2005-06-01,8724.8,295936,2.9,9,7524 +2005-07-01,8829.5,296186,2.2,8.8,7406 +2005-08-01,8832.4,296440,2.7,9.2,7345 +2005-09-01,8885.8,296707,2.7,8.4,7553 +2005-10-01,8926.6,296972,3.1,8.6,7453 +2005-11-01,8938.5,297207,3.5,8.5,7566 +2005-12-01,8969.6,297431,3.7,8.7,7279 +2006-01-01,9059.8,297647,4.2,8.6,7064 +2006-02-01,9090.1,297854,4.2,9.1,7184 +2006-03-01,9122.1,298060,4.2,8.7,7072 +2006-04-01,9174.8,298281,4,8.4,7120 +2006-05-01,9215.1,298496,3.8,8.5,6980 +2006-06-01,9240.8,298739,4,7.3,7001 +2006-07-01,9322.6,298996,3.4,8,7175 +2006-08-01,9321.8,299263,3.6,8.4,7091 +2006-09-01,9354.7,299554,3.6,8,6847 +2006-10-01,9373.2,299835,3.6,7.9,6727 +2006-11-01,9380.2,300094,3.9,8.3,6872 +2006-12-01,9469,300340,3.7,7.5,6762 +2007-01-01,9516.3,300574,3.7,8.3,7116 +2007-02-01,9546.8,300802,4.1,8.5,6927 +2007-03-01,9585.1,301021,4.4,9.1,6731 +2007-04-01,9615.7,301254,4.2,8.6,6850 +2007-05-01,9651.3,301483,4,8.2,6766 +2007-06-01,9667.3,301739,3.8,7.7,6979 +2007-07-01,9709.6,302004,3.7,8.7,7149 +2007-08-01,9753.9,302267,3.4,8.8,7067 +2007-09-01,9797.9,302546,3.5,8.7,7170 +2007-10-01,9827,302807,3.4,8.4,7237 +2007-11-01,9897.8,303054,3.1,8.6,7240 +2007-12-01,9908.4,303287,3.6,8.4,7645 +2008-01-01,9930,303506,3.7,9,7685 +2008-02-01,9913.4,303711,4.1,8.7,7497 +2008-03-01,9959.4,303907,4,8.7,7822 +2008-04-01,9996.8,304117,3.4,9.4,7637 +2008-05-01,10053.8,304323,7.8,7.9,8395 +2008-06-01,10107.9,304556,5.5,9,8575 +2008-07-01,10104.7,304798,4.4,9.7,8937 +2008-08-01,10094.7,305045,3.8,9.7,9438 +2008-09-01,10043.5,305309,4.7,10.2,9494 +2008-10-01,9960.3,305554,5.5,10.4,10074 +2008-11-01,9820.8,305786,6.4,9.8,10538 +2008-12-01,9730.7,306004,6.4,10.5,11286 +2009-01-01,9783.8,306208,6.2,10.7,12058 +2009-02-01,9766,306402,5.5,11.7,12898 +2009-03-01,9718.5,306588,5.9,12.3,13426 +2009-04-01,9724.8,306787,6.8,13.1,13853 +2009-05-01,9748.9,306984,8.2,14.2,14499 +2009-06-01,9806.9,307206,6.7,17.2,14707 +2009-07-01,9841.7,307439,6,16,14601 +2009-08-01,9961,307685,4.9,16.3,14814 +2009-09-01,9883.4,307946,5.9,17.8,15009 +2009-10-01,9931.9,308189,5.4,18.9,15352 +2009-11-01,9940.5,308418,5.9,19.8,15219 +2009-12-01,9998.9,308633,5.9,20.1,15098 +2010-01-01,10001.8,308833,6.1,20,15046 +2010-02-01,10030.6,309027,5.8,19.9,15113 +2010-03-01,10089.1,309212,5.7,20.4,15202 +2010-04-01,10112.9,309191.211,6.4,22.1,15325 +2010-05-01,10131,309369.053,7,22.3,14849 +2010-06-01,10151.4,309548.502,6.9,25.2,14474 +2010-07-01,10184.7,309745.698,6.8,22.3,14512 +2010-08-01,10228.2,309957.775,6.9,21,14648 +2010-09-01,10249,310176.466,6.7,20.3,14579 +2010-10-01,10304.7,310399.958,6.6,21.2,14516 +2010-11-01,10354.7,310595.764,6.6,21,15081 +2010-12-01,10392.1,310781.705,7.1,21.9,14348 +2011-01-01,10435.5,310960.74,7.4,21.5,14013 +2011-02-01,10470.1,311113.376,7.6,21.1,13820 +2011-03-01,10550.5,311265.404,7,21.5,13737 +2011-04-01,10587.6,311436.238,6.9,20.9,13957 +2011-05-01,10612,311607.08,6.9,21.6,13855 +2011-06-01,10636.8,311791.223,7.2,22.4,13962 +2011-07-01,10677.5,311997.049,7.3,22,13763 +2011-08-01,10700.6,312205.367,7.2,22.4,13818 +2011-09-01,10738.1,312429.118,6.8,22,13948 +2011-10-01,10753.1,312644.159,6.8,20.6,13594 +2011-11-01,10759.5,312829.523,7,20.8,13302 +2011-12-01,10772.2,313009.712,7.8,20.5,13093 +2012-01-01,10862.1,313183.179,8,20.8,12797 +2012-02-01,10953.5,313338.977,8,19.7,12813 +2012-03-01,10951.8,313499.369,8.5,19.2,12713 +2012-04-01,10979.7,313667.127,8.7,19.1,12646 +2012-05-01,10968.6,313830.53,8.8,19.9,12660 +2012-06-01,10946.3,314017.594,9.1,20.4,12692 +2012-07-01,10977.2,314210.786,8.2,17.5,12656 +2012-08-01,11004.1,314422.341,8,18.4,12471 +2012-09-01,11061.5,314646.749,8.2,18.8,12115 +2012-10-01,11099.8,314853.978,8.8,19.9,12124 +2012-11-01,11136.8,315053.863,9.7,18.6,12005 +2012-12-01,11140.5,315232.752,12,17.7,12298 +2013-01-01,11202.8,315389.595,6.3,15.8,12471 +2013-02-01,11239.6,315520.143,5.8,17.2,11950 +2013-03-01,11227.1,315662.224,5.9,17.6,11689 +2013-04-01,11205.4,315817.855,6.4,17.1,11760 +2013-05-01,11244.6,315983.654,6.7,17.1,11654 +2013-06-01,11268.8,316171.042,6.8,17,11751 +2013-07-01,11296.7,316358.778,6.6,16.2,11335 +2013-08-01,11329.2,316580.327,6.7,16.5,11279 +2013-09-01,11366.9,316806.125,6.8,16.5,11270 +2013-10-01,11419.8,317022.27,6.3,16.3,11136 +2013-11-01,11487.6,317228.026,6.2,17.1,10787 +2013-12-01,11517.9,317411.551,6.4,17.3,10404 +2014-01-01,11512.5,317593.923,7.1,15.4,10202 +2014-02-01,11566.2,317753.883,7.3,15.9,10349 +2014-03-01,11643,317917.203,7.4,15.8,10380 +2014-04-01,11702.6,318089.218,7.4,15.7,9702 +2014-05-01,11748.4,318269.505,7.4,14.6,9859 +2014-06-01,11817,318464.152,7.4,13.8,9460 +2014-07-01,11860.5,318662.368,7.5,13.1,9608 +2014-08-01,11944.3,318893.786,7.2,12.9,9599 +2014-09-01,11957.4,319125.296,7.4,13.4,9262 +2014-10-01,12023,319353.734,7.2,13.6,8990 +2014-11-01,12051.4,319564.209,7.3,13,9090 +2014-12-01,12062,319746.157,7.6,12.9,8717 +2015-01-01,12046,319928.646,7.7,13.2,8903 +2015-02-01,12082.4,320074.511,7.9,12.9,8610 +2015-03-01,12158.3,320230.786,7.4,12,8504 +2015-04-01,12193.8,320402.295,7.6,11.5,8526 + +## file: styles.css +body { + padding-top: 1rem; +} + +.bslib-value-box .plotly .modebar-container { + display: none; +} + +.shiny-ipywidget-output { + display: flex; + flex: 1 1 auto !important; + width: 100%; +} + +.shiny-ipywidget-output > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} + +.shiny-ipywidget-output > * > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} + +.shiny-ipywidget-output > * > * > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} + + diff --git a/components/outputs/value-box/app-variation-theme-and-layout-examples-core.py b/components/outputs/value-box/app-variation-theme-and-layout-examples-core.py new file mode 100644 index 00000000..1537ba5b --- /dev/null +++ b/components/outputs/value-box/app-variation-theme-and-layout-examples-core.py @@ -0,0 +1,34 @@ +import faicons +from shiny import App, ui + +app_ui = ui.page_fluid( + ui.layout_column_wrap( + ui.value_box( + "KPI Title", + "$1 Billion Dollars", + "Up 30% VS PREVIOUS 30 DAYS", + showcase=faicons.icon_svg("piggy-bank", width="50px"), + theme="bg-gradient-indigo-purple", # << + full_screen=True, + ), + ui.value_box( + "KPI Title", + "$1 Billion Dollars", + "Up 30% VS PREVIOUS 30 DAYS", + showcase=faicons.icon_svg("piggy-bank", width="50px"), + theme="text-green", # << + showcase_layout="top right", # << + full_screen=True, + ), + ui.value_box( + "KPI Title", + "$1 Billion Dollars", + "Up 30% VS PREVIOUS 30 DAYS", + showcase=faicons.icon_svg("piggy-bank", width="50px"), + theme="danger", # << + showcase_layout="bottom", # << + full_screen=True, + ), + ) +) +app = App(app_ui, server=None) diff --git a/components/outputs/value-box/app-variation-theme-and-layout-examples-express.py b/components/outputs/value-box/app-variation-theme-and-layout-examples-express.py new file mode 100644 index 00000000..f4521f5c --- /dev/null +++ b/components/outputs/value-box/app-variation-theme-and-layout-examples-express.py @@ -0,0 +1,32 @@ +import faicons +from shiny.express import ui + +with ui.layout_column_wrap(): + with ui.value_box( + showcase=faicons.icon_svg("piggy-bank", width="50px"), + theme="bg-gradient-indigo-purple", # << + full_screen=True, + ): + "KPI Title" + "$1 Billion Dollars" + "Up 30% VS PREVIOUS 30 DAYS" + + with ui.value_box( + showcase=faicons.icon_svg("piggy-bank", width="50px"), + theme="text-green", # << + showcase_layout="top right", # << + full_screen=True, + ): + "KPI Title" + "$1 Billion Dollars" + "Up 30% VS PREVIOUS 30 DAYS" + + with ui.value_box( + showcase=faicons.icon_svg("piggy-bank", width="50px"), + theme="danger", # << + showcase_layout="bottom", # << + full_screen=True, + ): + "KPI Title" + "$1 Billion Dollars" + "Up 30% VS PREVIOUS 30 DAYS" diff --git a/components/outputs/value-box/economics.csv b/components/outputs/value-box/economics.csv new file mode 100644 index 00000000..7395601d --- /dev/null +++ b/components/outputs/value-box/economics.csv @@ -0,0 +1,185 @@ +date,pce,pop,psavert,uempmed,unemploy +2000-01-01,6535.3,280976,5.4,5.8,5708 +2000-02-01,6619.7,281190,4.8,6.1,5858 +2000-03-01,6685.8,281409,4.5,6,5733 +2000-04-01,6671.1,281653,5,6.1,5481 +2000-05-01,6707.6,281877,4.9,5.8,5758 +2000-06-01,6743.9,282126,4.9,5.7,5651 +2000-07-01,6764.1,282385,5.2,6,5747 +2000-08-01,6799.1,282653,5.2,6.3,5853 +2000-09-01,6882.9,282932,4.5,5.2,5625 +2000-10-01,6888.2,283201,4.6,6.1,5534 +2000-11-01,6902.4,283453,4.5,6.1,5639 +2000-12-01,6945.7,283696,4.2,6,5634 +2001-01-01,6977,283920,4.8,5.8,6023 +2001-02-01,6995.8,284137,4.9,6.1,6089 +2001-03-01,6987.9,284350,5.3,6.6,6141 +2001-04-01,7001.2,284581,5,5.9,6271 +2001-05-01,7047.1,284810,4.5,6.3,6226 +2001-06-01,7060.7,285062,4.5,6,6484 +2001-07-01,7072.2,285309,5.6,6.8,6583 +2001-08-01,7108.9,285570,6.8,6.9,7042 +2001-09-01,7012.8,285843,7,7.2,7142 +2001-10-01,7208.4,286098,3.4,7.3,7694 +2001-11-01,7167.9,286341,4.1,7.7,8003 +2001-12-01,7147.7,286570,4.5,8.2,8258 +2002-01-01,7174.3,286788,6.1,8.4,8182 +2002-02-01,7218.3,286994,5.8,8.3,8215 +2002-03-01,7237.2,287190,5.9,8.4,8304 +2002-04-01,7305.4,287397,5.8,8.9,8599 +2002-05-01,7282.7,287623,6.5,9.5,8399 +2002-06-01,7318.2,287864,6.4,11,8393 +2002-07-01,7380.4,288105,5.5,8.9,8390 +2002-08-01,7401.5,288360,5.4,9,8304 +2002-09-01,7391,288618,5.7,9.5,8251 +2002-10-01,7430.7,288870,5.7,9.6,8307 +2002-11-01,7459.7,289106,5.7,9.3,8520 +2002-12-01,7512.8,289313,5.5,9.6,8640 +2003-01-01,7533.1,289518,5.5,9.6,8520 +2003-02-01,7535.9,289714,5.6,9.5,8618 +2003-03-01,7598.4,289911,5.3,9.7,8588 +2003-04-01,7621,290125,5.3,10.2,8842 +2003-05-01,7628.1,290346,5.8,9.9,8957 +2003-06-01,7678.6,290584,5.6,11.5,9266 +2003-07-01,7738.2,290820,6.3,10.3,9011 +2003-08-01,7834.5,291072,6,10.1,8896 +2003-09-01,7835,291321,5.2,10.2,8921 +2003-10-01,7845.7,291574,5.3,10.4,8732 +2003-11-01,7899.6,291807,5.4,10.3,8576 +2003-12-01,7929.2,292008,5.4,10.4,8317 +2004-01-01,7987.4,292192,5,10.6,8370 +2004-02-01,8019.8,292368,5,10.2,8167 +2004-03-01,8076,292561,4.9,10.2,8491 +2004-04-01,8088.6,292779,5.3,9.5,8170 +2004-05-01,8163.2,292997,5.3,9.9,8212 +2004-06-01,8147.2,293223,5.8,11,8286 +2004-07-01,8218.9,293463,5.3,8.9,8136 +2004-08-01,8253.1,293719,5.2,9.2,7990 +2004-09-01,8321.1,293971,4.6,9.6,7927 +2004-10-01,8374.6,294230,4.5,9.5,8061 +2004-11-01,8420.6,294466,4.1,9.7,7932 +2004-12-01,8481.5,294694,6.9,9.5,7934 +2005-01-01,8470.2,294914,3.7,9.4,7784 +2005-02-01,8529.2,295105,3.4,9.2,7980 +2005-03-01,8569.5,295287,3.6,9.3,7737 +2005-04-01,8645.6,295490,3.1,9,7672 +2005-05-01,8643.9,295704,3.5,9.1,7651 +2005-06-01,8724.8,295936,2.9,9,7524 +2005-07-01,8829.5,296186,2.2,8.8,7406 +2005-08-01,8832.4,296440,2.7,9.2,7345 +2005-09-01,8885.8,296707,2.7,8.4,7553 +2005-10-01,8926.6,296972,3.1,8.6,7453 +2005-11-01,8938.5,297207,3.5,8.5,7566 +2005-12-01,8969.6,297431,3.7,8.7,7279 +2006-01-01,9059.8,297647,4.2,8.6,7064 +2006-02-01,9090.1,297854,4.2,9.1,7184 +2006-03-01,9122.1,298060,4.2,8.7,7072 +2006-04-01,9174.8,298281,4,8.4,7120 +2006-05-01,9215.1,298496,3.8,8.5,6980 +2006-06-01,9240.8,298739,4,7.3,7001 +2006-07-01,9322.6,298996,3.4,8,7175 +2006-08-01,9321.8,299263,3.6,8.4,7091 +2006-09-01,9354.7,299554,3.6,8,6847 +2006-10-01,9373.2,299835,3.6,7.9,6727 +2006-11-01,9380.2,300094,3.9,8.3,6872 +2006-12-01,9469,300340,3.7,7.5,6762 +2007-01-01,9516.3,300574,3.7,8.3,7116 +2007-02-01,9546.8,300802,4.1,8.5,6927 +2007-03-01,9585.1,301021,4.4,9.1,6731 +2007-04-01,9615.7,301254,4.2,8.6,6850 +2007-05-01,9651.3,301483,4,8.2,6766 +2007-06-01,9667.3,301739,3.8,7.7,6979 +2007-07-01,9709.6,302004,3.7,8.7,7149 +2007-08-01,9753.9,302267,3.4,8.8,7067 +2007-09-01,9797.9,302546,3.5,8.7,7170 +2007-10-01,9827,302807,3.4,8.4,7237 +2007-11-01,9897.8,303054,3.1,8.6,7240 +2007-12-01,9908.4,303287,3.6,8.4,7645 +2008-01-01,9930,303506,3.7,9,7685 +2008-02-01,9913.4,303711,4.1,8.7,7497 +2008-03-01,9959.4,303907,4,8.7,7822 +2008-04-01,9996.8,304117,3.4,9.4,7637 +2008-05-01,10053.8,304323,7.8,7.9,8395 +2008-06-01,10107.9,304556,5.5,9,8575 +2008-07-01,10104.7,304798,4.4,9.7,8937 +2008-08-01,10094.7,305045,3.8,9.7,9438 +2008-09-01,10043.5,305309,4.7,10.2,9494 +2008-10-01,9960.3,305554,5.5,10.4,10074 +2008-11-01,9820.8,305786,6.4,9.8,10538 +2008-12-01,9730.7,306004,6.4,10.5,11286 +2009-01-01,9783.8,306208,6.2,10.7,12058 +2009-02-01,9766,306402,5.5,11.7,12898 +2009-03-01,9718.5,306588,5.9,12.3,13426 +2009-04-01,9724.8,306787,6.8,13.1,13853 +2009-05-01,9748.9,306984,8.2,14.2,14499 +2009-06-01,9806.9,307206,6.7,17.2,14707 +2009-07-01,9841.7,307439,6,16,14601 +2009-08-01,9961,307685,4.9,16.3,14814 +2009-09-01,9883.4,307946,5.9,17.8,15009 +2009-10-01,9931.9,308189,5.4,18.9,15352 +2009-11-01,9940.5,308418,5.9,19.8,15219 +2009-12-01,9998.9,308633,5.9,20.1,15098 +2010-01-01,10001.8,308833,6.1,20,15046 +2010-02-01,10030.6,309027,5.8,19.9,15113 +2010-03-01,10089.1,309212,5.7,20.4,15202 +2010-04-01,10112.9,309191.211,6.4,22.1,15325 +2010-05-01,10131,309369.053,7,22.3,14849 +2010-06-01,10151.4,309548.502,6.9,25.2,14474 +2010-07-01,10184.7,309745.698,6.8,22.3,14512 +2010-08-01,10228.2,309957.775,6.9,21,14648 +2010-09-01,10249,310176.466,6.7,20.3,14579 +2010-10-01,10304.7,310399.958,6.6,21.2,14516 +2010-11-01,10354.7,310595.764,6.6,21,15081 +2010-12-01,10392.1,310781.705,7.1,21.9,14348 +2011-01-01,10435.5,310960.74,7.4,21.5,14013 +2011-02-01,10470.1,311113.376,7.6,21.1,13820 +2011-03-01,10550.5,311265.404,7,21.5,13737 +2011-04-01,10587.6,311436.238,6.9,20.9,13957 +2011-05-01,10612,311607.08,6.9,21.6,13855 +2011-06-01,10636.8,311791.223,7.2,22.4,13962 +2011-07-01,10677.5,311997.049,7.3,22,13763 +2011-08-01,10700.6,312205.367,7.2,22.4,13818 +2011-09-01,10738.1,312429.118,6.8,22,13948 +2011-10-01,10753.1,312644.159,6.8,20.6,13594 +2011-11-01,10759.5,312829.523,7,20.8,13302 +2011-12-01,10772.2,313009.712,7.8,20.5,13093 +2012-01-01,10862.1,313183.179,8,20.8,12797 +2012-02-01,10953.5,313338.977,8,19.7,12813 +2012-03-01,10951.8,313499.369,8.5,19.2,12713 +2012-04-01,10979.7,313667.127,8.7,19.1,12646 +2012-05-01,10968.6,313830.53,8.8,19.9,12660 +2012-06-01,10946.3,314017.594,9.1,20.4,12692 +2012-07-01,10977.2,314210.786,8.2,17.5,12656 +2012-08-01,11004.1,314422.341,8,18.4,12471 +2012-09-01,11061.5,314646.749,8.2,18.8,12115 +2012-10-01,11099.8,314853.978,8.8,19.9,12124 +2012-11-01,11136.8,315053.863,9.7,18.6,12005 +2012-12-01,11140.5,315232.752,12,17.7,12298 +2013-01-01,11202.8,315389.595,6.3,15.8,12471 +2013-02-01,11239.6,315520.143,5.8,17.2,11950 +2013-03-01,11227.1,315662.224,5.9,17.6,11689 +2013-04-01,11205.4,315817.855,6.4,17.1,11760 +2013-05-01,11244.6,315983.654,6.7,17.1,11654 +2013-06-01,11268.8,316171.042,6.8,17,11751 +2013-07-01,11296.7,316358.778,6.6,16.2,11335 +2013-08-01,11329.2,316580.327,6.7,16.5,11279 +2013-09-01,11366.9,316806.125,6.8,16.5,11270 +2013-10-01,11419.8,317022.27,6.3,16.3,11136 +2013-11-01,11487.6,317228.026,6.2,17.1,10787 +2013-12-01,11517.9,317411.551,6.4,17.3,10404 +2014-01-01,11512.5,317593.923,7.1,15.4,10202 +2014-02-01,11566.2,317753.883,7.3,15.9,10349 +2014-03-01,11643,317917.203,7.4,15.8,10380 +2014-04-01,11702.6,318089.218,7.4,15.7,9702 +2014-05-01,11748.4,318269.505,7.4,14.6,9859 +2014-06-01,11817,318464.152,7.4,13.8,9460 +2014-07-01,11860.5,318662.368,7.5,13.1,9608 +2014-08-01,11944.3,318893.786,7.2,12.9,9599 +2014-09-01,11957.4,319125.296,7.4,13.4,9262 +2014-10-01,12023,319353.734,7.2,13.6,8990 +2014-11-01,12051.4,319564.209,7.3,13,9090 +2014-12-01,12062,319746.157,7.6,12.9,8717 +2015-01-01,12046,319928.646,7.7,13.2,8903 +2015-02-01,12082.4,320074.511,7.9,12.9,8610 +2015-03-01,12158.3,320230.786,7.4,12,8504 +2015-04-01,12193.8,320402.295,7.6,11.5,8526 \ No newline at end of file diff --git a/components/outputs/value-box/index.qmd b/components/outputs/value-box/index.qmd new file mode 100644 index 00000000..2ad8cc16 --- /dev/null +++ b/components/outputs/value-box/index.qmd @@ -0,0 +1,115 @@ +--- +title: Value Box +sidebar: components +appPreview: + file: components/outputs/value-box/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/value-box/ + contents: + - title: Preview + file: app-core.py + height: 175 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXLOAD3QM4rVsk4x0pBhWQBXTgB0IygMTIAYkxbsKFdK0QB6I5zIRWWAOZwKAI1KkKrCgwxYyMU+dZH0nKytcAFo7KAgAayNlf0DcAH0wyOQAXnlOLAAJABUAWQAZAAplZFLkAHIAHlYANytkfhgAGwsUxTBdfWMjAHc+rB6AZixpKyMAJgAGaaNaq3bkGs44HoAhUn42sEnkHYBGADZkQ4XiJqhRLbtOZGvg2KDQ8IjkBZdcJrgtuk4mpsRiHIGMJKABhUhNaQAbnYcACukQe2mAFIoQsoAxOFBglwACa46hbVxyOALJifLYSeZgZAAPkq6CgFHYyFxW1yAFZkAcsOMOVAsAB2DlCrn7Y7BPZYMXIUWi3YKvbHaW7ABeMCle0GAA5JVgACwATgOAEEeQctdysBbBgrxYKsMb9ch9dLiNaDkd9lhBpNhpNDYLldrDcNxoLBgKRTKdjtedqDsFHRztSaHQdJuNkOnM3aFQ6nchhhziEmI87Jnr9frNX7guMsEiG+NDeMoyrxXHwzzjeNVe16X4mexaYplAzh8gfn9ggw5BT2nAatRSPiFmz2rkCwdnVKOeHSw3A0HK9HBUqpYLJvrgjzBlnXXs+ewkxyOSaL3m43slTzteN9SaXkOV3A0DigPdlRjRUDUFbVlQAwZ2F5A5BndYstWtbVtUdODlT2fUuSlHVxiaMsW2QBt9UFQV22guN9Rwnc9nYNtpQ7PNYL2JNBnvIDGPGPVBg5PZ3VQkU9gjZVBilcYDiDBtJh-FCHSvE9pOwpMAy5RTxl1XlBVI6V9VtYjDLor9ZX1A4RRkg5WIs2MFVg-Sdw5MihQtetpUmA5QUw7UlUNLAQyI10uRwt9DWOcLsywXzDWIStG0IrTJkFJMWy0wSDRklDuMbPdJn0uSeSvDkk2rV0ZNs3yQr2Wq-wayrJOc8ZxkGV9eQ6yqvPiuSBUNEUhss+LDUyt8hSFL9MszJM3OlSL4Kc5K1K0w0cIjEUtpmn1hWlA5xlLfrXUQ+L-wNHD72tECoAbH8s3up88wKvlgoatDX0GG8G09G8w21G9wqG28DX1QTgY5VVcgbESjh5OT3UIirFM9SiPQy4YI1tEVq11LHeKLFKvWQaNBiOJ7nTJo5wvBmC+Rva0APRms9XkomAO1Ry7STQ4yfcj10ckjkX0dbV3NfcapUY2j2Po+asvjbVjs9WTOuI4LhPG+6OQdLWoB5N94MNlMXu8hqMp9DlgujXbxJ9a8PP3IiuNFwNDSA1DOp17nY15y2OW+l1rSNYOd2ipzuNkwG9RAvcOL9sHEwMkXX3AuWzYNVsWsAiab2l+zHV433nMY-TBlDdUnyZgrxdljkbIO6CCoDHDxkva8hWvTPr0ZzMS156z1t53X-Yqxt90yjqBQ6hHyZe2Uf0tyS0Pio1sodYrss1TClLYqZm1zSPZV8x9DUNfswEHRlmUHOZaXKZQAEplGUHpOGZdIsBqKAmhJRINiFA4KQHoxALhfAeAkJIEQiDMjgPAK4VhghWDcLiZYlBgjcDQVYUg9wgToE+O0J+iAShlHaAAaQAAoAElkDZA-oQsApDSjtAACRKlWL8JonByDIAACIQnOAwVg7RmGvDAAAVXQEWSYyJkAADUADKyBKEACUACi8jqEAHkJHKN9Pwk0ABNRRoiICEFQBQXA6AEAoDAFQfgFAwAAF8AC6QA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEArpwA6EOQGJkAMSYt2FCulaIA9Ls5kIrLAHM4FAEalSFVhQYYsZGAaOtd6TqdO4AtJZQEADWunJePrgA+oEhyAC8yNJYABIAKgCyADIAFHLIBcgA5AA8rABupsgAHjAANsbxMmAaWnq6AO5dWB0AzFhCproATAAM47oVps3I5ZxwHQBCpNVNYKPIGwCMAGzIuzPEdVCsrGuWnMgXfhG+AUHByDP2uHVwa3ScdXWIxJIMDGoFAAwqQ6kIANzsODeDSILbjACkEJmUAYnCgfi4ABNsdQ1g5JHAZkw3mt+NMwMgAHwldBQCjsZDYtYZACsyB2WGGbKgWAA7GyBRztvs-FssCLkMLhZs5Vt9pLNgAvGASra9AAc4qwABYAJw7URcnYazlYU29OWi-lYQ265C6yXEC07PbbLC9Ub9Ub6-mKzX6-rDfm9PlCqUbDbczU7Px2tma0S2najYbIFNp61y2325D9NnEeOhh2jHW63Xq71+YZYBG14b64bhpWi6MhrmG4bK5q0zwM9jUmRyOkD5Cfb5+BiSMnNODlaikXEzFnNDK5nYOiVskNF2t+-1liP8hUS-mjXV+Lm9dNOrY89jxtls0Sn7PRrYKrma4a6urctktz1HYoG3RVI3lPV+U1RVf16dhuR2XoXQLDULU1TU7WgxUtl1DkJS1YY6mLRtkFrXV+X5FsIOjXVMM3LZ2GbSVW2zKCtnjXob3-Ojhh1Xo2S2F0kKFLZQ0VXoJWGHZ-VrUZP0Q21z0PCSMPjX0OTk4ZtW5fkiMlXUrQIvTqPfaVdR2IVJJ2JjTKjOUoJ0zc2WIgVTRrSVRh2YE0M1BV9SwQN8KdDlMOffV9hCjMsC8-ViDLOs8PU0Z+XjRt1L4vVJMQji623UYdOkrlzzZeMKydSSrK8wKtiq79arKsSHOGYZeifblWrK9yYukvl9SFfqzJi-U0ufAUBXfNK03jZzJTCmD7IS5T1P1TDQyFdbJs9QVJR2YYix6p04Jin89Uwm8LUAqBa0-dMbvvbNcp5ALauQp9ekvWs3UvYNNUvEL+qvPVdT4gG2WVDJa0EvYuWkl08NKuS3TI11Uv6UMrSFCttXRrj80S91kAjXo9nuh1ib2EKQcgnlLwtX8UcrHUZPx39NTs61412YmXNdFGxLZR87U1FynxGiU6KoliaJm9KY01A63SktqCICgSRputlbXVqAuWfGC9cTR6PNq1LPTZAKIy2kTPQvVyd3w9ihb9fV-yQtrNY5qMubNtkPsdC0DQDzcIvsjipL+nVAO3VjveBuNdMFp8QOl429SbRq-1Gy8JZsu0uK9hy6J03og1Ve96dykWpbZSzdog3LfUw4YzwvAULzTi86bTQsuYslaua1n3SrrHc0tavlWthknHulT8zbE5CYoNDLbQKjL1TQ+TmLGBsszD6UvLvfV9R7MA+3pRk+ymakijkABKOQ5AwdAomkBIkk4HAoHMKI6DqaQ2I8gQEKJ-LA5QoAALgDEFYwDQGgOaAAaQAAoAElkBpE4BQN4zQCD5HgQUZoAASBUiwvh1E4OQZAAARMExwGCsFwfgghzQACq6B8yjERMgAAagAZWQMggASgAUR4aggA8qwgRXoaGiAAJp8KYSAghbB2CkA6MQE47xbjRFiMEPBKiCGMjgPAc4pg-CmEcNieYlA-DcBsaYUgNx-joBwYQZhyB76GMfvIaAmAP7iHQDkF+b9OBEFYHABgC4GDxAAHLkDgL4wgqAKC4HQAgFAYAqDVAoGAAAvgAXSAA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/value-box/ + contents: + - title: ui.value_box + href: https://shiny.posit.co/py/api/ui.value_box.html + signature: ui.value_box(title, value, *args, showcase=None, showcase_layout='left + center', full_screen=False, theme=None, height=None, max_height=None, fill=True, + class_=None, **kwargs) + - title: ui.card + href: https://shiny.posit.co/py/api/ui.card.html#shiny.ui.card + signature: ui.card(*args, full_screen=False, height=None, max_height=None, min_height=None, + fill=True, class_=None, **kwargs) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/outputs/value-box/ + contents: + - title: Theme and Layout Examples + description: Value boxes with different `theme` and `showcase_layout` locations. + This value box uses multiple files, see how on [Shinylive](https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMASxlWICcyACAMyhpIgGcAdCG0bEYLHgAsaEbCzoNmLAILo8LAK40BAtKgD6GlgF51NLFADmcXWwA2GgCYAKARow2o2YmrK6SdmBC6AO6MaM4QLCYYAG5QdlYARsQAHuGR6Sx8YADSAAoAkiwAKjRkNnBZeAIZkVkAJACMLABCNDY2NKQsACLE7VCM-PjVNVkAqqgsAMwADACkLABqAMosuQBKAKKL+QDyY6uzPYoAmsuVIxkSxEGEUDxwhhxcpDwYL4E80eaOAOSoNHM5mwAFoElAIABrX6qII0exkcSGLIAVhmqGSWQAlFUIjVEXB4MiwAlzCDzKF7DRKGQQVIqeZiCDUGpGKhypVIgBiAA8PMu6TYanauh4hEYcEohiKjDUcFxkRxI1csXiuiSqQFtRyBWKpQ5wzxGXqTVa7U6EV6-UGFyN6XGk1mCxWay2O32hxmxzOtpqYnENzuDyenG4bw+ou+fwBQNB4KhMJYcIRSNR6MxYCVdsiBKJWQoyVpFMlEE5LF5-Oz-sD9ys7k83mJZGIk0YgPEZDLFa17GFNlF4pL0tl8pGWciKricvVKTSox1hRKZQqhr9JpabQ6XSt7htq-nE2m8yWqw22z2ByP3vO+6uAdutZDH3D3EjP3+gOBYIh0Nh8MRxJohi2IKvi4iEo8WQsmyBqqOWfI9tcD4PLo9ZeGQxJJGQzYwF2CFVkKIpihKUoynKoFZliAhUdA6BGEo6CODo+g0KoDyMNEcCMIYABypBwFiYAAL54OA0DwNQEoAI4aBK8DkG8ZCFvgRCkBQVDIM8YbCQAukAA) + apps: + - title: Preview + file: app-variation-theme-and-layout-examples-core.py + height: 315 + - title: Express + file: app-variation-theme-and-layout-examples-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5AMyjrIgGcAdCO2akYyXgAs6EXFjgAPdMzi9eyBk1bIArnUGCA7nQoSddLABsouUtooB9Mhe0wI9g8wwAKAJSJByIHIRiZmWABuUM5w9gBGpPJeAUEpkqQGxFC8cAC8nNzkvFgFbrzhAOZJYOh05eW4ALSxUBAA1vyEwXQAJiY5HQCsAAzo8h0+BMkpgSZw8P1gseUN5Z7ddNQUDdLr5aQN6NrM6BZwHUTIAMTIADw3U9Ps2hYW9rzEytQ5ACrM2nCTCApPwPFIdADSAAUAJLIb7GU4dUFBDoAEgAjMgAEJ0F50cjIAAipBeUGYAjAyMCHQAquhkABmIYAUmQADUAMrISEAJQAomzoQB5GlcplEgCCAE0OUiIA8QqZdBEov84gkkkDpoE0hksrl8jwiiU3hUqjU6o1mm1zl1ehIFsNRuNAdqZhI5rkOlR5FtVnBqLarrd7lrtbrMtl7FYbHYFhRSPTmLUJBQg9c7lSOM9Xu9PhAfn8AQ8QWHphCYXCEWdKWWwWAMdjcRZ8UDiaTyXK3chafSmazOdz+YKRWKhpKZXKFcYleZItF1YksxH9XkuEbijxTZUOhb6k0Wu1OkZ7Y6RmMwBMs7N5h1ui1ynBmOmQ8uJOlIzEY7YKAt4hQExgF9MzrIInheN4PgDAtfn+V0glLbsK1heEKERWskIbTEcTxAl2ysTsMLdXtGRZdkuV5AVhVFUiJ1lWtOjAChcHQBAUCYhQKDAABfABdIA + height: 315 + - title: Core + file: app-variation-theme-and-layout-examples-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5AMyjrIgGcAdCO2akYyXgAs6EXMgZNWyAIKYiAVzqDBGdAH0NyALzINOKAHM4u9gBsNAEwAUg5K5N0sNqLlJqKusjsYCF0Ad2YMZwg3GPcsADcoOysAI1IADyjY7OR+MABpAAUASWQAFToKGzg8ghccmLyAEgBGZAAhOhsbOnJkABFSbqhmAUJ6htc8gFV0ZABmAAYAUmQANQBlZEKAJQBRNeKAeWmtpYGlAE0N2onJyVJQ4iheOENObnJeLE+Q3njzM4wOg6OZzLgALQpKAQADWtWQoTo9goEkMeQArIt0Ok8gBKOrRSauVFweDosApcwQ8wRex0agUCHSenmUgQ9BqZjoaoI5AAYmQAB4hXcGuw1N1dLxiMw4NRDGVmGo4ISGgSxW5TIlkro0plNdk8kVShUqjVxkTic02p1ur1ooNhqNblbJjM5ktVpttvtDiczosLtdXcTXA8ni83h8eN9ftKAUCQWDIdC4QikSi0ZjsbiwBq3Q1SeS8lR0kzafKIHzBSLDbEI89XrovD4-BSKKQ5sxQRIKDXhaLCzkJVKZXKFUqVWqcgWGtqkiq9RksmHjSVypVeZaw7kwK0Ol0en0nV4XTu12BZgsVustrsDsdTjfgzcL8TG1H3lxYz8eAnATyZNwShGF4UIRFkVRCksRxfEZ2JYs3jyewYUsZgBzrYdsk-ZtW18CgKTSChOxgTCh13UcbGlWUq0VZVVXrOc3DxQRWOgTAjGUTBHB0fQ6CIV5mHiOBmEMAA5cg4HYiCwAoXB0AQFA5LgcswAAXwAXSAA + height: 315 + - title: Reactive Value Box + description: Connecting a reactive input value to a value box. + apps: + - title: Preview + file: app-variation-reactive-value-box-core.py + height: 225 + - title: Express + file: app-variation-reactive-value-box-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5AMyjrIgGcAdCO2akYyXgAs6EXMgZNWyZtQAmcZoOGjxUmVjgAPdMt685jFm2noArhSI26gwQHc6FCckdYANlFykdgD6ZD42MHwAFACUiILICV50WBIATJH8YADK6KrIAFJw7OwA5GapAAypAMzIAKJQzBDSAOYCYNHxid7Wwbw+dGrMGWDoxBSZRJkACurE1Gyk7MgAJADsFcgAQnQ+A+TIFKTIKuRQVJPIFUQAjBXXyJXRCQDEyAA8784QichuHkksAA3KBhOBBABGpAMGR+v0SklILmIUF4cAAvJxuOReFhsRAgrwgS0Rug6C0WrgALQQqAQADWlzcKg86MyAFYKugDJlogQuvDDhI4PA2WAIS0qS1mFAVHQFlSWHSWnAqcoVJMBchYlrfpkslAgXBMt9BQkAALKCBDLCOV4fL5wwVqZa8Q1wGIoZBvT66s3KCg2JocTIrECRG7IKlyCC2Cg4cYxZAAemQdwqzwAVMgNogsDd2ABfba7fYQTL233lp1-dyebwgsGQ6Gws06JEotGYrg8XH4wnEkYSOkqKkSUg+OUQSWnPaNJmDVkcrk8jr8mu-DwijGZCVSmVyhUQsFU2zMdA+Y2ELU6jeJTIAETOFzAprNltU6ltdErjrbLpOZ8PViX8-UFAMgx+dhQxAXp4zGCgk1TdNkGzXN8yLEs9jocgK29B1BEIVAKFwXJaDAKgDAoMBCwAXSAA + height: 225 + - title: Core + file: app-variation-reactive-value-box-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQEsZ1SAnC5AMyjrIgGcAdCO2akYyXgAs6EXMgZNWyAIKYizagBM4zIgFc6gwRnQB9fcgC8yfTigBzOCfYAbfRoAUg5N+t0szqFxSXQoTMlcYPk8IH1jfLAkAJk8wAGV0TWQAKTh2dgByXmREgAZEgGZkAFEoZghpOwEwAEoCLzjvG2l0EJNeZzotZhT0Ygp+QmQJgAVtYmo2UnZkABIAdhLkACE6ZwHyZApSZA1yKCoJohKiAEYS6+KS1u8AYmQAHnf2jpsANyhXI4AEakAAe0Q6HQodAozjgFgmqSgvzgl2+kO8klIAHdiFBePDONxyLwsMSIH1fnYRnQ7HZcABaIFQCAAa0uyGxgwoEgRYAArCV0KCJq10Rj-oCLDZghQeqF9CleMjUS0iMg3p9xZCeXB4HygXYGXZmFANHQFgyWCyHAz1Bo0TFIWKnT8-JLdMCwRCMT5obD4RMACJnC6EbUdLG4-GErg8UnkynUiYSFkaBkSUjOc0QI2nPa1DlcjQ8vmC4Witqu30e+EykLysx0FKnaBh54aj5fasY3X6iaG42m82WoGAhk9ZjoOGOjEu2Iu5qGCCCLTLAnMFHDbohIiy+VEAm8Xh0cjNRDogAC6ggQywVFBbE7Wura-EKvc59eXYjyHUFF0OoOAmFYQHcG5kAZOQIHlHAxk-ZAAHpkDuJ5kAAKmQDZECwG52AAX22XZ9hXMBvxfK8bzvB8n01btYjfVtzjgT8UGfejIX-QCYnYECQB3Cg4IoBDkNQjCsJKHC8MInY9lPUjyO7ZdjEsZRMHcYwm0PbQtyXCBJjAChcAyWhDLgR8wHwgBdIA + height: 225 + - title: Sparklines + description: Interactive sparkline in the value box. This value box uses multiple + files, see how on [Shinylive](https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQGJkB5da5ASwmQGcALD3ADZsAbnGQVS3OGKgATWWwptyUAcgBmbAXC4AdCPvUAnUjGTooFHkIBG7GOlJGKyAAqWe+-WwdOXFiFkoLmRg81lvX2dzAVIKAVwsOAAPdCMdELD0ZMjHaN5+AHc2WQBzOApMkK5CwxMzAohcezyXAEFMIgBXNi9oTAUjZABeNw8ACgB9Sc1taYBKHCh0yj6MdEmekeQepfKZtmS4WXH9ZHOdtiwOYgEu2ThJ4i4ucfXB5AB6ZF0wLgpBDosM89GB5gQzhddsJVF1HjZSMlTpwLqjfgAVOKqZAAZVUOnYnAAigAmX4QlGo86-AAkJKwABYAKwAWXJkKp3B4pEKxGCcGGNSwpC6FHQosmxTKFVOfwsRgA1kIIHBfuCOVTeDy+VxHgIoLgRRRhr8ERQJDB2ZTkOrrbN9TY5jBSDYtAL0UY4RT5n19A91FIjKIjOMOOKKEQjeGiLqXsoIPNEBqAAJClYPIySkrlCga-3ceVKjhwcaJjWouBkCCmNjPbboWRYdJyJ5cYRvAZsIbfX6V8g157Attq8sXTSlevJLDKkt96swWtcIjJE1gIJUcnIXCr9BcKDB3Ng0fncdYLoNyyPChGKDEHTIzmcmdPUixIyrugMgAMADYAKIAGIAIxWo+VLPlKVjDEBFJgai9qrhIABecAmLgoFwSeWgCGQb6rkYpQ2FA4w-gyBBAUBX4ECSDIwV+WAkj6hDHlS3LBhw6ikKu6HMdaqI+nxY5sKUZ4XlQkzJFARyvMIbBcGwjoCgBqi6jG3KFKURglMMykCLqAlgae57ro8uBSfesnyYpOkqXAak8pp2m6fpLFGWJeoGkaD6YcgPBwMJPDGpRVEsaibGoc6DyrjkvE+cgMDLKUHDDAoxAUOMxpUcg75ZQIwxZTY+W2nF6CxBQkw2KUuFOPhhHEVRDUEF+TGwT5FgsJmlXVe+vwEUR4yNQ1LUsQZj7pBQXRGJw46+v06DbB06AdhsPQxqhwYCYQqAAiwtBgFQyQUGAAC+RDgNA8B7XOA5cEOwhbWAVZUDQKBrpeBDoHeH2kOgH17geBBwg48CyIDKoOLE6EQCSX6wwAtF+QEIzBP5MgAzEyWBo9RAAcX4AJwAOw-gQmNkZjOOk4TX44-oMPw1+JLIwQP4-kB+NYITuMUfjVEMlglM-lgMFMjjot07DX4I2jzOs2LAvc9++MEPzTIs1TaNoxLDMMrLP6E0Bwvc6j2Nq0LIsMjjIHQ5LCNMrL1OE1gJMklbOOE1z-PKxTVPizbDM-g7DJo1gyuuySQEkiTXuk5zpOo9b9NS1+hMO6RRvh2jYuxyS6tMoTDKE9ryc4w7+MczB4cmznLNY6TYta-7yf47LOM4-SYft-jaO56rNdMj+JJMsXcOUa3bcMbjPeIyrzu1yL6MMiPFGy7z9Jka7aPMtjffm-HaP48vTMzz++PMnHm+n9Hk8kwPW-a0jiOrx7U-4zDs+Uz7P6M439OP8fKNy4+1drRNGntQ7zxZjTQ+-tH4yxPvjd2ECQEYyopjbGQsSZs1og-BGusZ7U0RpPEBosRax2VoPA2uCvz2wIV+QuGccaW0orPM2ddB5R2oYHOh38L5i1-L3LAZsWaWyXrAhGqc6GE3pLnV26MCaxywQrVGONf6w0fqXAhlEcbILFvnKiQtBYQOpgyMk4iCbM2ppHBWcimHYy5k7XOBtTG4LHgQmGOiN442-ogggIcyJO3safMRf9R6PxggbfWuifxbxgvzCJcc8ZfjUU-SOligIMK5q7VG1NWEEB0bnduft6YAPSQXOu2TCZt0gZ4-JQF27a2PgAgg0j6kVO8eXcmCsdHY3bkBYe-tj7wIiSSMBxD3bszQRA2pqj6GNLwZYtGNDGS40JgfLmPsdHKzFuXeZNDLHhz4cTUZtc1YczVqo3ZgyEbcIiWjNpsj3beLIkLMiFF8kHxScfSRdy8YrNdlbGhscLnTIPl+PZmiInfkNmrAFaNv6xzItspZITYbHxbgQg+lc25s0-nHc5+Sh6JzRaPZOUKll8LbrkzGXMOYk1mUXa5K8CHMg5lknG+NKK33xXXMWMN5lpIIUyaxlNXbdyAqbIRBA6X5NIuC-2wzLHoxDti-Gwq8VnLnny+V9N4HNMJujTGnciYZMUdKqV3j6na3gcMlpTJEH-I5ZykWdc2X5NFrTBVCyCGD0rrzSOat0HkXooUphZjdV20sYPHRfrkkMm5ZTDm2y1WMojb+KNVS54kl5qLLpJMKJSrfqza1EjLFrIKdRXm7cDF10oq6xGxLkkI0hS01Rfds2UWkerOtME274x-CWixBDVGws5T3F1uc62FLfo2mWbiIlMJpZW-pBdY7YzrWRd2PcS3MoXeXLNnK8YbJWXW3p+cB1esFREt+HNZFv1hnit59FN33NTbDfB4SWmIKdhvGdb9SbBq1WAnV76EbNLxuzGxb94Wf0A4UoC+ttb4NtUel2b8B5xIgVO-JDJOVIe9b2mmOi0Mkg9t7V1FqgLU3w-smeVsYnEJvUTNd5rtkR3DaB9NdGMmOMrT3E5Pt3nt28TRn5hK2lh27vGyVvTpkSovfTfBLaikqr4wbcjudb1ft5jRjFvbx0Z27ia2eJMZWEzfm++hpLmaqPKWh0xSy8kErxmzfDu6cMwwPQyeN18YJuvM9u-2usr04atlK7N8az612VgSgLqLaOfqYdTRjuHTUh1pSsj2TDta0PA0ybNjHhVAv8eapxiCQO0ZQwPAl2b8vuz8XPDm9i1mWdoR+2V580NMlw1RVTytibSJy5GujpEQ6Sf0WREOmqIkJyG1x3t0j+airVd3F2ED+v5fi7QsTbcCujtxWtwpCsC6-jm8p1R69K2kW-NRHlTit4DPprQvT+S27AP7Y7W7XNakGvRkN+d+Si0HtPl21TxGWnb3+4l7uOjR3SJTg1kFasDXFv9vbELHLT4HoLvchr3247SPM9rW5zMc0c2W8TQus8jsk2pqRYnYHScE3on6qp3XqfmoifU+L3DbWcpJPSP1Lm+aTx0Q4lOHGuPtc5eU5bwm4n5My5HCr3DaF+YjpjIXuGSYh0prDlm5WGfzelTReicu1nKwCXXQhjbuFie7gLg9TqdcrMpgbA1RuW0O8Nstot2MQ70sywTW3CMXvd26xfIB7OA-5JZklhnAPu5rMY4gjGDXacQP1qRhPn6Ychr8ZLKLY3FcYPdpLwOIWz6nwL3G3rBOpX60HtrH5pPhVC397DfOk3EnW4ogp2GkjmlqvjQrJZNNGaz17Q3izzfpat-ljBJZlEI6zyRUbfW9zZ9WZnv2-pccl9DzIvzGncemQVckWr6VCc65L8tjvRXudG-95Tjc0nrNAkF6owfBrbu44g5gfTJIvbtTDKksopnjorg4hkgAQPs2qTgasXmAVHFzCVjom7r+JZpImHuZk7MrGAd1i7iClAdRv7KnInu3CgYzEeg1puplqMpgWEqThyk7JTEskstHkbODotufqPEPlWismwa7CgVqplqRI9g+sjKTt3L1skmfi7rSi0j+GLNrJonwRKgIckgbJhlPg4rhpZponzithoWCp7JAa2gLioQRtKuXIYgXrRFRjQeagEjEvocNjBMFOjKPvQj3PYsdqCmqpYcbpRJ2hAiikyAPMCtKu6h7v7JomJsEfQvvvQuZpTPzGvt9knoES2sFGfEkWfsyD-uarSsHJ6vTJoi9sFMHFKuwUspbnHNhmfGfJYYnv2vRB3uEezpjGrBusGinPFqXO5ogp5qwTQlUkomvpTJROjKURIZXmsvRJQd-PQrXE+lKhRNktrHpvAaol4YPDTLXJOgseRDDMUrDBikPsTDrr+N+LnF0eRIbFzJHByjMUOnzgbPrksionisrNYuulvJwv7BitLotrsVUlzLYeoe4VnH9oCW4dKgXFsgXqfEwg-uRMfmibhjAUOrctKi5qERLr+LXI8bxjxinJsaWjvkwg8QXjjhQuRPmvGojOSTTFIWzDSUoWrDHAhrWswvFhimHm3CVksuZvGuQuRCweRGfgTOSS0fcviW7ORm8oif0hjJLi3IMWfPRGrEslSd8eROTpKRHFieqXwQ6ngTTDEpKmHCzpKQTDMfOszMFEQiMYKRghnFRP0vQv3m4s0sFBSlcWvMepMUmpKRRGom4rasFBykbLUexrHFks+oaYzBLG4u1sEdYuaZypygxO8q8tRILpKT3OIW4pfsEbjrUfChzDQvYvmTyUwjAW4jicEcKhocPrDhPkLGHJjJOt5gXCmcnPEYjEwkkUTJ1r4rYY7uusyJHP2XATPMvq7JPLUSmpzAatFtRO4fGpbLOUOu4YzLhn4sEcTIyKzESdRG0WifnA2VLADpRCivvnefumqkYi7IbD2W3rOe5neRHigVMWqpzKRLXK+baVbJ+b6ckm-DGZ2mFtTMjhnIbD8cHNuTbLuo6d4XcfcgTLwquj+huWsdCuGf-GhYXDafchROoWAhnq+UbBKtWimXAmheEVqYeZHKjIyMsVkjCuRGAmAvRVYVMUgjrhRMHELKMkYtaVhgfPnHxQlsGmzLnGRd-E7PsZ2XhfmtCcWY-E2b+PCqPhROZm+Scrxo7m8gfE3ihY-IOfrE7NqTzETFgPQv1hUpOpRYRXOXuYQnPPcgLssvCg4sQpdrRVahZaHmheWlBTRAVhREYqKi5WfPaUjLeSnJ4Yvqxd5sLParXKKvROpfaqiivF+clQSt5V3EIkZeeQrBKmAXxSFp2tIkuRKmcZzJHC0jYsxY1d3CmaUvORaQWfcvcjsVRtshVZMaRkTF1Yzj1WqlNoeZrFnKHC-MGfUa7BKhNU2lNS2awRKpiVjNXvrpBpOqRqtShcfGmQTOZg+fClEpHPjo8RXMcaRN6cfKWVheDv1bMkIrJktT8VHN-GtdpVXjfhkojDZVFvdZ5m8lHG-GtYOUTLxvcqYnWmMaiVRmsVHAPGtdkZUVBd5pObRLHm0pDYXMSoKhUVylxQjY9ZzAeRWm0qNRRMWUzLeZRPultZbJ4UTHrpVSGZHJHPlUzZ+uRbpVtWfp4d4tjG6m0vmk9hNbVcJcxfcvlj3JzPlsceKctdmvaYqvOcrvSCLVnOcmqrXOuoJjRFQihXqo6ZHAfF5f0vlizsHLHJMSSezGfimTalbQLk7KlQPIPAxDRGKajfmghhyu7fxcrmTIeaQiweESsere4VRn9RbXCeselUJfajsajC8vUd7fcVnWHUEaxWgYeWzAbA5aYlleKfcQaiTfAvEZHP2g+TEqLKuS+fSZPGGRjAXVjT3Fpvciom0aRmedyd0TdQ2fAmTVdaESHb+MLEPJXSPfcaRiBhKtZjrbRAaa+ozDIuCbWu3vcfJmHV+RkoJYedIouYzEopOrndBW+qvXLcKrgWffYUIsKnHajeuvQnMihR+lbcKvSLZQat3KHEZTRZHcvsmT-ZNQnb7Q1R7GLaoq1SbVhnGg2chlbaNmfTLgxMkq1W8oJsknjCmfgmmVRozLbXjNGRHL-vg-itTBxhkinVRpbAIfUlDUIkCrhRko1jssQ6-jrVbL+UwunP0k4ierrtKoyXwy-gI7wrZd4n7TBq1d0X1t-PaUplbWfPzP7vUhyult4q1Ydetvamg6FTrSuZNuzAGgxP2ng9xSskWgw8FmSscT-IeeHullvIY-Y-SuXCvcFoLScYbJY2qunDDE5X8dKsznw7VTDIPO4wXObPnK1dLdMu7imWro6TDKKfcuXIuY9a1Y8SHNOskhk9A64+3AIYAarO8k-RmbKpRGU+te4Rrj0n4jDKMgsQY1w4UvkU02mUaRI9PDcTY3BcHRavlj+A9DtAgK9AdEdKdMgOdLALM6gP8ICLdCCA9E9NQEdK9AiLIM0CAJCBYPIBwKUHDBIOgCgEBOkDAAANz6DHR9BYA2BcC2Bwwwh3BwBwwIjJDIA4BlQJAAuRRwBERGBwxPRQDFhDDHMogKBcClQGgoDVgqiPMQDPMGAQBYCNC4BwxsB4BSg5hwxRiihLOQgItIu4AoDqDaDJDosnh0s3PIBAShCiiSAACEPgrQUAlADLyAkEPANzsMAApOi5i-oDi3wE0Pi4S9mBUCS6KOGMgAAHzIAABU5L8LckVLNLdL-LtLKQzLrLUA7L-LgrwrX4YrTzLzuLsruARLCrpLLgarmrrrWr5wlL+o1LGg+rkIhryQxrbLEg5rJQVglr1rGLtr0reLBLDr8rFAirYoZL7rqbGrHryAXryLvrKQBrTLLLBbprIbkIFrLLor4r+g0zuAu0czKQCzAAukAA). + apps: + - title: Preview + file: app-variation-sparklines-preview.py + height: 250 + - title: Express + file: app-variation-sparklines-express.py + resources: + - styles.css + - economics.csv + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQGJkB5da5ASwmQGcALD3ADZsAbnGQVS3OGKgATWWwptyUAcgBmbAXC4AdCPvUAnUjGTooFHkIBG7GOlJGKyAAqWe+-WwdOXFiFkoLmRg81lvX2dzAVIKAVwsOAAPdCMdELD0ZMjHaN5+AHc2WQBzOApMkK5CwxMzAohElLSM+zyXLgBXLhZAgH0FXoEoXCIuti9oTAUjZABeNw8ACn7+zW01gEocKHTKKYmsDmIBLtk4fuIuLmWMdFnkAHpkXTAuCkEdLGu9MC2psUrMgjsJVF1LjZSMllrxSIViME4PMalhSF0KOgMf1imUKss3r09gBrIQQOBvLZEOEIpH9Ea4dEUeZvKEUCQwSmIfTIXmvMAAFTiqmQAGVVDp2JwAIoAJjePL5bwAJLKsAAWACsAFkFQZOHygTxuD0+rJBmxhqNlltufq+Q7kAABVH7C5GHElcoURWO5AXdTcCxGUkcOA2u1+v1wMgQUxsa4LcJYdJyK5cYR3GZsOYvN4x8jx64-DOU31R3maUpJ7JYMnhgtxmAJrhEZIssBBKhvIi4DvoLhQUTOMsGiuVtilLBdB6WS4UIxQYg6Alj8cO+tXUixIwdujqgAMADYAKIAMQAjD3y+veZvcVZ5heCDfbxsBB2JAAvOAmXDXtdbw0LQBDIHcOyMUobCgZYj3VAgLwvA8CFldVnwPLBZQBQhX3XHhSGHDh1FIDt-xwwCowBCi-SradZyofpkigZIV2ES02BsbR5jPVQuDgal8MKUojBKbjeLgKigNomcu0uXBmNY9jOORHiBD4gT4WE0TVL4yS30nOjZPpUYmVXICHR4OBJx4ZkkOQ3Dx3w4cYFIC4OxycjzL5GA9lKDh5gUYgKGWZlkOQXcwo-MKbHmA8qQcit0FiCh+hsUowKcCCoJg5DcoIOKAK83kLBYD00oy3c3kg6Dljy3LsJfajHT09d0goLojE4Kt9EIVBPhYWgwCoZIKDAABfABdIA + - title: Core + file: app-variation-sparklines-core.py + resources: + - styles.css + - economics.csv + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQGJkB5da5ASwmQGcALD3ADZsAbnGQVS3OGKgATWWwptyUAcgBmbAXC4AdCPvUAnUjGTooFHkIBG7GOlJGKyAAqWe+-WwdOXFiFkoLmRg81lvX2dzAVIKAVwsOAAPdCMdELD0ZMjHaN5+AHc2WQBzOApMkK5CwxMzAohcezyXAEFMIgBXNi9oTAUjZABeNw8ACgB9Sc1taYBKHCh0yj6MdEmekeQepfKZtmS4WXH9ZHOdtiwOYgEu2ThJ4i4ucfXB5AB6ZF0wLgpBDosM89GB5gQzhddsJVF1HjZSMlTpwLqjfgAVOKqZAAZVUOnYnAAigAmX4QlGo86-AAkJKwABYAKwAWXJkKp3B4pEKxGCcGGNSwpC6FHQosmxTKFVOfwsRgA1kIIHBfuCOVTeDy+VxHgIoLgRRRhr8ERQJDB2ZTkOrrbN9TY5jBSDYtAL0UY4RT5n19A91FIjKIjOMOOKKEQjeGiLqXsoIPNEBqAAJClYPIySkrlCga-3ceVKjhwcaJjWouBkCCmNjPbboWRYdJyJ5cYRvAZsIbfX6V8g157Attq8sXTSlevJLDKkt96swWtcIjJE1gIJUcnIXCr9BcKDB3Ng0fncdYLoNyyPChGKDEHTIzmcmdPUixIyrugMgAMADYAKIAGIAIxWo+VLPlKVjDEBFJgai9qrhIABecAmLgoFwSeWgCGQb6rkYpQ2FA4w-gyBBAUBX4ECSDIwV+WAkj6hDHlS3LBhw6ikKu6HMdaqI+nxY5sKUZ4XlQkzJFARyvMIbBcGwjoCgBqi6jG3KFKURglMMykCLqAlgae57ro8uBSfesnyYpOkqXAak8pp2m6fpLFGWJeoGkaD6YcgPBwMJPDGpRVEsaibGoc6DyrjkvE+cgMDLKUHDDAoxAUOMxpUcg75ZQIwxZTY+W2nF6CxBQkw2KUuFOPhhHEVRDUEF+TGwT5FgsJmlXVe+vwEUR4yNQ1LUsQZj7pBQXRGJw46+v06DbB06AdhsPQxqhwYCYQqAAiwtBgFQyQUGAAC+AC6QA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +Value boxes are special "cards" that help group information together in an aesthetic way. +You can read more about value boxes in the [bslib](https://rstudio.github.io/bslib/articles/value-boxes/index.html) R Package. + +Value boxes have 4 main parts: + + 1. `value` - text to display in the card + 2. `title` - optional text that displays _above_ the `value` + 3. `showcase` - optional element to be shown next to the `value` text (e.g., an image or logo) + 4. `theme` - optional theme to change the appearance of the value box + +There is only a UI component for the value box. + 1. Call `ui.value_box()` to the UI of your app to create a div in which to display the value box. + +Since the value box is only a UI component, if you want to make it interactive (i.e., [reactive](https://shiny.posit.co/py/docs/reactive-programming.html)), you can pair it up with either a [`ui.output_ui()`](https://shiny.posit.co/py/api/ui.output_ui.html) + [`@render.ui()`](https://shiny.posit.co/py/api/render.ui.html) pair or use +[`ui.output_text()`](https://shiny.posit.co/py/api/ui.output_text.html) as an argument to the `ui.value_box()` function if you only need text changes. + +:::{#variations} +::: diff --git a/components/outputs/value-box/styles.css b/components/outputs/value-box/styles.css new file mode 100644 index 00000000..3e8fe1fc --- /dev/null +++ b/components/outputs/value-box/styles.css @@ -0,0 +1,31 @@ +body { + padding-top: 1rem; +} + +.bslib-value-box .plotly .modebar-container { + display: none; +} + +.shiny-ipywidget-output { + display: flex; + flex: 1 1 auto !important; + width: 100%; +} + +.shiny-ipywidget-output > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} + +.shiny-ipywidget-output > * > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} + +.shiny-ipywidget-output > * > * > * { + display: flex; + flex: 1 1 auto; + width: 100%; +} diff --git a/components/outputs/verbatim-text.qmd b/components/outputs/verbatim-text.qmd deleted file mode 100644 index 8d5124ae..00000000 --- a/components/outputs/verbatim-text.qmd +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "Verbatim Text" -sidebar: components -previewapp: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_text("x", "", placeholder="Enter text"), - ui.output_text_verbatim("txt"), - {"class": "vh-100 d-flex justify-content-center align-items-center flex-column px-4"} - ) - - def server(input, output, session): - @output - @render.text - def txt(): - return f'x: "{input.x()}"' - - app = App(app_ui, server, debug=True) -listing: - - id: component - template: ../_partials/components-detail.ejs - contents: - - title: Verbatim Text - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymigA8ydsABU4H2V8JhCAUXI5Jm8yEIkQgAk4CwtiJgBlTm4QgEo8e0dDYnc3D1jNADc5ACMoMj4-WLymAGIAHnbVXNVVWRpWOWq6G1d3CRKyMokWOBYWDlJcxEKHAAEpCFk6DFi2ztWmfpig32XDx0k4MgU6CF4IMoxAnxsetWh0PVF0Gw1tDgzIZyXJgAC+AF0gA - height: 200px - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_text("Text", "Enter text", "Hello Shiny"), - ui.output_text_verbatim("text") #<< - ) - - def server(input, output, session): - @render.text #<< - def text(): - return input.Text() - - app = App(app_ui, server) - relevantfunctions: - - title: ui.output_text_verbatim - href: https://shiny.posit.co/py/api/ui.output_text_verbatim.html - signature: ui.output_text_verbatim(id, placeholder=False) - - title: "@render.text" - href: https://shiny.posit.co/py/api/render.text.html - signature: render.text(fn=None) - - id: variations - template: ../_partials/components-variations.ejs - contents: - variations: - - title: Placeholder rectangle when string is empty - description: Verbatim text with a placeholder when the string to display is empty (see Details above). - preview: https://shinylive.io/py/app/#h=0&code=NobwRAdghgtgpmAXGKAHVA6VBPMAaMAYwHsIAXOcpMAMwCdiYACAZwAsBLCbJjmVYnTJMAgujxM6lACZw6EgK4cAOhFVpUAfSVMAvEyVYoAcziaaAGyXSAFKqYODHDF1QKymigA8ydsABU4H2V8JhCAUXI5JkDg0JCQgEo8e0dDYnc3D28PADc5ACMoMj4-HJCJVAsoQjg2YgtZOj0YugU4RKYAYgAeHtVE1VVZGlY5fLobV3cJDLIsiRY4FhYOUkTEVIcAASkIJoxyiEcmEaYcmw2tk8k4MgU6Y+myDFjfQbVodBaxVBsNbQcRbjOSJMAAXwAukA - code: | - from shiny import App, render, ui - - app_ui = ui.page_fluid( - ui.input_text("Text", "Enter Text", ""), - ui.output_text_verbatim("text", placeholder = True) #<< - ) - - def server(input, output, session): - @render.text #<< - def text(): - return input.Text() - - app = App(app_ui, server) - ---- - -:::{#component} -::: - -## Details - -Verbatim text displays a character string as monospaced code in a shaded rectangle. - -To create reactive verbatim text, render the text in the server function with the decorators `@render.text`, just as you would to display [normal text](text.qmd). Then place the rendered text in the ui with `ui.output_verbatim_text()`. - -By default, `ui.output_verbatim_text()` will display nothing when the string to display is empty. To ensure that `ui.output_verbatim_text()` displays an empty shaded rectangle as a placeholder even when when the string to display is empty, set `placeholder=True`. - -See [Text](text.qmd) to display string values as normal text. - -:::{#variations} -::: \ No newline at end of file diff --git a/components/outputs/verbatim-text/app-core.py b/components/outputs/verbatim-text/app-core.py new file mode 100644 index 00000000..f519fee5 --- /dev/null +++ b/components/outputs/verbatim-text/app-core.py @@ -0,0 +1,13 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_text("Text", "Enter text", "Hello Shiny"), + ui.output_text_verbatim("text") #<< +) + +def server(input, output, session): + @render.text #<< + def text(): + return input.Text() + +app = App(app_ui, server) diff --git a/components/outputs/verbatim-text/app-express.py b/components/outputs/verbatim-text/app-express.py new file mode 100644 index 00000000..ed7a4694 --- /dev/null +++ b/components/outputs/verbatim-text/app-express.py @@ -0,0 +1,10 @@ +# FIXME: Rewrite as an Express app +from shiny import render +from shiny.express import input, ui + +ui.input_text("Text", "Enter text", "Hello Shiny") + + +@render.text # << +def text(): + return input.Text() diff --git a/components/outputs/verbatim-text/app-preview.py b/components/outputs/verbatim-text/app-preview.py new file mode 100644 index 00000000..81d79e25 --- /dev/null +++ b/components/outputs/verbatim-text/app-preview.py @@ -0,0 +1,15 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_text("x", "", placeholder="Enter text"), + ui.output_text_verbatim("txt"), + {"class": "vh-100 d-flex justify-content-center align-items-center flex-column px-4"} +) + +def server(input, output, session): + @output + @render.text + def txt(): + return f'x: "{input.x()}"' + +app = App(app_ui, server, debug=True) diff --git a/components/outputs/verbatim-text/app-variation-placeholder-rectangle-when-string-is-empty-core.py b/components/outputs/verbatim-text/app-variation-placeholder-rectangle-when-string-is-empty-core.py new file mode 100644 index 00000000..d13898df --- /dev/null +++ b/components/outputs/verbatim-text/app-variation-placeholder-rectangle-when-string-is-empty-core.py @@ -0,0 +1,13 @@ +from shiny import App, render, ui + +app_ui = ui.page_fluid( + ui.input_text("Text", "Enter Text", ""), + ui.output_text_verbatim("text", placeholder = True) #<< +) + +def server(input, output, session): + @render.text #<< + def text(): + return input.Text() + +app = App(app_ui, server) diff --git a/components/outputs/verbatim-text/app-variation-placeholder-rectangle-when-string-is-empty-express.py b/components/outputs/verbatim-text/app-variation-placeholder-rectangle-when-string-is-empty-express.py new file mode 100644 index 00000000..b00d3876 --- /dev/null +++ b/components/outputs/verbatim-text/app-variation-placeholder-rectangle-when-string-is-empty-express.py @@ -0,0 +1,11 @@ +from shiny import render +from shiny.express import input, suspend_display, ui + +ui.input_text("Text", "Enter Text", "") +ui.output_text_verbatim("text", placeholder=True) # << + +with suspend_display(): # << + + @render.text # << + def text(): + return input.Text() diff --git a/components/outputs/verbatim-text/index.qmd b/components/outputs/verbatim-text/index.qmd new file mode 100644 index 00000000..471b7fcc --- /dev/null +++ b/components/outputs/verbatim-text/index.qmd @@ -0,0 +1,68 @@ +--- +title: Verbatim Text +sidebar: components +appPreview: + file: components/outputs/verbatim-text/app-preview.py +listing: +- id: example + template: ../../_partials/components-detail-example.ejs + template-params: + dir: components/outputs/verbatim-text/ + contents: + - title: Preview + file: app-core.py + height: 200 + - title: Express + file: app-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQGJkAxASQA0BZAURQCU4B3AE4BLKsigBncRGScAHukFwJUjOgA6EAGaDSMZBIAWwiLmTCY6UoIrIlEACZxBmnXoPHTWOAqUrzlta2JugArhREocKamlFYIeEA+lRyFAAU6mAAKj4UmUSZnJTOyCl5hMiZABJwADa1pMgAyp64mQCUMRCaAAL2ToJYZcjIDAA8Y5pOWqW5ae2ImiMjShShgjIJFFg5qfOaFWAUuOgIKEe5YAC+ALpAA + - title: Core + file: app-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKmqgA8KdsABU4H2VCZBCAUUo5ZG8KEKIQgAk4CwtSZABlLh4QgEoCe0dDUnc3D1jNADc5ACMoCn4-WLzkAGIAHnbVXNVVWTo2OWqGG1d3IhKKMqJWOFZWTnJcxEKHAAEpCFkGLFi2ztXkfpig32XDx2QpCgUGCD4IMqxAnxsetWhMPTFMGw1tTgzIZyd6hMAUXDoBAocGnMAAXwAukA +- id: relevant-functions + template: ../../_partials/components-detail-relevant-functions.ejs + template-params: + dir: components/outputs/verbatim-text/ + contents: + - title: ui.output_text_verbatim + href: https://shiny.posit.co/py/api/ui.output_text_verbatim.html + signature: ui.output_text_verbatim(id, placeholder=False) + - title: '@render.text' + href: https://shiny.posit.co/py/api/render.text.html + signature: render.text(fn=None) +- id: variations + template: ../../_partials/components-variations.ejs + template-params: + dir: components/outputs/verbatim-text/ + contents: + - title: Placeholder rectangle when string is empty + description: Verbatim text with a placeholder when the string to display is empty + (see Details above). + apps: + - title: Preview + file: app-variation-placeholder-rectangle-when-string-is-empty-core.py + - title: Express + file: app-variation-placeholder-rectangle-when-string-is-empty-express.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkDagBM4DADoRGzNlx5Y4AD3RjWrPgKEju6AK4UirQ63QSA+uM4WANlFxFDnWbNdYDxq1VUUACmkwABU1CmCiYIBRSilkMP9I5GDggEoPTixSYyMKX3CrADcpACMoCn4gsD8IwmR0R2I4dlJ7SQYAXhCGQzg05GQAYmQAHlH3CAB3Tgp2NnNLCHEbO0anALSUYbGJiFlBwYABMWWpLFrBkfGDw8k6ZFrNxFvDw7EKQwYIPgg8rESgQyEHqNVwlloNXCYAAvgBdIA + - title: Core + file: app-variation-placeholder-rectangle-when-string-is-empty-core.py + shinylive: https://shinylive.io/py/editor/#code=NobwRAdghgtgpmAXAAjFADugdOgnmAGlQGMB7CAFzkqVQDMAnUmZAZwAsBLCXZTmdKQYVkAQUxEG1ACZwGRAK6cAOhFUZ0AfSXIAvMiU4oAczia6AGyXSAFKuQODnLN3QKKmqgA8KdsABU4H2VCZBCAUUo5ZEDg0JCQgEoCe0dDUnc3D28PADc5ACMoCn4-HJCidAsoYjh2UgtZBj0YhgU4ROQAYgAeHtVE1VVZOjY5fIYbV3ciDIosolY4VlZOckTEVIcAASkIJqwc7r6t5BHkHJsN08dkKQoFBgg+CCysWN9BtWhMFvF0GwabScRbjORfUJgCi4dAIFBQoIUMAAXwAukA +--- + +:::{#example} +::: + +:::{#relevant-functions} +::: + +## Details + +Verbatim text displays a character string as monospaced code in a shaded rectangle. + +To create reactive verbatim text, render the text in the server function with the decorators `@render.text`, just as you would to display [normal text](../text/index.qmd). Then place the rendered text in the ui with `ui.output_verbatim_text()`. + +By default, `ui.output_verbatim_text()` will display nothing when the string to display is empty. To ensure that `ui.output_verbatim_text()` displays an empty shaded rectangle as a placeholder even when when the string to display is empty, set `placeholder=True`. + +See [Text](../text/index.qmd) to display string values as normal text. + +:::{#variations} +::: diff --git a/components/update-shinylive-links.py b/components/update-shinylive-links.py new file mode 100644 index 00000000..b5a003e0 --- /dev/null +++ b/components/update-shinylive-links.py @@ -0,0 +1,128 @@ +import logging +import os + +import shinylive +from _qmd import get_qmd_split, write_qmd + +lg = logging.getLogger("shinylive") +if len(lg.handlers) == 0: + formatter = logging.Formatter("%(levelname)s %(message)s") + console_handler = logging.StreamHandler() + console_handler.setFormatter(formatter) + lg.addHandler(console_handler) + lg.setLevel(logging.INFO) + + +def find_index_qmds(dirs): + index_qmds = [] + + for dir in dirs: + cdirs = [os.path.join(dir, p) for p in os.listdir(dir)] + cdirs = [p for p in cdirs if os.path.isdir(p)] + for cdir in cdirs: + if ".ruff_cache" in cdir: + continue + index_qmds.append(os.path.join(cdir, "index.qmd")) + + return index_qmds + + +def check_for_shinylive_url_problems(index_qmds): + """ + Some shinylive apps have multiple files, make sure I haven't missed those. + """ + for qmd in index_qmds: + meta, body = get_qmd_split(qmd) + + if "listing" not in meta: + continue + + for item in meta["listing"]: + if item["id"] == "relevant-functions": + continue + + if item["id"] == "example": + for app in item["contents"]: + if "shinylive" in app: + bundle = shinylive.decode_shinylive_url(app["shinylive"]) + if len(bundle) > 1 and "resources" not in app: + lg.warning( + f"Multiple files in app: {qmd} - Example - {app['title']}" + ) + elif item["id"] == "variations": + for variation in item["contents"]: + for app in variation["apps"]: + if "shinylive" in app: + bundle = shinylive.decode_shinylive_url(app["shinylive"]) + if len(bundle) > 1 and "resources" not in app: + lg.warning( + f"Multiple files in app: {qmd} - Variation - {variation['title']} - {app['title']}" + ) + + +def create_shinylive_link(app, meta): + app = os.path.join(meta["_dir"], app["file"]) + + if "resources" not in app: + return shinylive.url_encode(app, language="py") + + return shinylive.url_encode( + app, + [os.path.join(meta["_dir"], r) for r in app["resources"]], + language="py", + ) + + +def rewrite_shinylive_links(qmd): + meta, body = get_qmd_split(qmd) + + if "listing" not in meta: + return False + + for item in meta["listing"]: + if item["id"] not in ["example", "variations"]: + continue + + if item["id"] == "example": + for app in item["contents"]: + if app["title"] == "Preview": + continue + + if "shinylive" not in app: + lg.warning( + f"Missing shinylive link: {qmd} - Example - {app['title']}" + ) + continue + + app["shinylive"] = create_shinylive_link(app, meta) + + elif item["id"] == "variations": + for variation in item["contents"]: + for app in variation["apps"]: + if app["title"] == "Preview": + continue + + if "shinylive" not in app: + lg.warning( + f"Missing shinylive link: {qmd} - Variation - {variation['title']} - {app['title']}" + ) + continue + + app["shinylive"] = create_shinylive_link(app, meta) + + write_qmd((meta, body), qmd) + + return True + + +def rewrite_shinylive_links_all(index_qmds): + for qmd in index_qmds: + rewrite_shinylive_links(qmd) + + return index_qmds + + +if __name__ == "__main__": + dirs = ["inputs", "outputs", "display-messages"] + index_qmds = find_index_qmds([os.path.join("components", d) for d in dirs]) + rewrite_shinylive_links_all(index_qmds) diff --git a/docs/apps/comp-streamlit/penguins/app-core.py b/docs/apps/comp-streamlit/penguins/app-core.py new file mode 100644 index 00000000..f515f496 --- /dev/null +++ b/docs/apps/comp-streamlit/penguins/app-core.py @@ -0,0 +1,37 @@ +from pathlib import Path + +import pandas as pd +from palmerpenguins import load_penguins +from plots import dist_plot, scatter_plot +from shiny import App, reactive, render, ui + +app_ui = ui.page_sidebar( + ui.sidebar( + ui.input_slider("mass", "Mass", 2000, 8000, 6000), + ui.input_checkbox("smoother", "Add Smoother"), + ), + ui.card(ui.output_plot(id="scatter")), + ui.card(ui.output_plot(id="mass_distribution")), +) + + +def server(input, output, session): + df = load_penguins() + print(df) + + @reactive.Calc + def filtered_data(): + filt_df = df.copy() + filt_df = filt_df.loc[df["body_mass_g"] < input.mass()] + return filt_df + + @render.plot + def mass_distribution(): + return dist_plot(filtered_data()) + + @render.plot + def scatter(): + return scatter_plot(filtered_data(), input.smoother()) + + +app = App(app_ui, server) diff --git a/docs/apps/comp-streamlit/penguins/app-express.py b/docs/apps/comp-streamlit/penguins/app-express.py new file mode 100644 index 00000000..8239468a --- /dev/null +++ b/docs/apps/comp-streamlit/penguins/app-express.py @@ -0,0 +1,34 @@ +from pathlib import Path + +import pandas as pd +from palmerpenguins import load_penguins +from plots import dist_plot, scatter_plot +from shiny import reactive, render, ui +from shiny.express import input, ui + +df = load_penguins() + +with ui.sidebar(): + ui.input_slider("mass", "Mass", 2000, 8000, 6000) + ui.input_checkbox("smoother", "Add Smoother") + + +@reactive.Calc +def filtered_data(): + filt_df = df.copy() + filt_df = filt_df.loc[df["body_mass_g"] < input.mass()] + return filt_df + + +with ui.card(): + + @render.plot + def scatter(): + return scatter_plot(filtered_data(), input.smoother()) + + +with ui.card(): + + @render.plot + def mass_distribution(): + return dist_plot(filtered_data()) diff --git a/docs/apps/comp-streamlit/penguins/plots.py b/docs/apps/comp-streamlit/penguins/plots.py new file mode 100644 index 00000000..0f57417c --- /dev/null +++ b/docs/apps/comp-streamlit/penguins/plots.py @@ -0,0 +1,31 @@ +from plotnine import aes, geom_density, geom_point, ggplot, stat_smooth, theme_light + + +def dist_plot(df): + plot = ( + ggplot(df, aes(x="body_mass_g", fill="species")) + + geom_density(alpha=0.2) + + theme_light() + ) + return plot + + +def scatter_plot(df, smoother): + plot = ( + ggplot( + df, + aes( + x="bill_length_mm", + y="bill_depth_mm", + color="species", + group="species", + ), + ) + + geom_point() + + theme_light() + ) + + if smoother: + plot = plot + stat_smooth() + + return plot diff --git a/docs/apps/comp-streamlit/penguins/requirements.txt b/docs/apps/comp-streamlit/penguins/requirements.txt new file mode 100644 index 00000000..efecef17 --- /dev/null +++ b/docs/apps/comp-streamlit/penguins/requirements.txt @@ -0,0 +1,4 @@ +shiny +palmerpenguins +plotnine +pandas diff --git a/docs/apps/comp-streamlit/slider-update/app-core.py b/docs/apps/comp-streamlit/slider-update/app-core.py new file mode 100644 index 00000000..97b2264e --- /dev/null +++ b/docs/apps/comp-streamlit/slider-update/app-core.py @@ -0,0 +1,39 @@ +from pathlib import Path + +import pandas as pd +from palmerpenguins import load_penguins +from plots import dist_plot, scatter_plot +from shiny import App, reactive, render, ui + +app_ui = ui.page_sidebar( + ui.sidebar( + ui.input_slider("mass", "Mass", 2000, 8000, 6000), + ui.input_checkbox("smoother", "Add Smoother"), + ui.input_action_button("reset", "Reset Slider"), + ), + ui.card(ui.output_plot(id="scatter")), + ui.card(ui.output_plot(id="mass_distribution")), +) + + +def server(input, output, session): + df = load_penguins() + + @reactive.calc + def filtered_data(): + filt_df = df.copy() + filt_df = filt_df.loc[df["body_mass_g"] < input.mass()] + return filt_df + + @output + @render.plot + def mass_distribution(): + return dist_plot(filtered_data()) + + @output + @render.plot + def scatter(): + return scatter_plot(filtered_data(), input.smoother()) + + +app = App(app_ui, server) diff --git a/docs/apps/comp-streamlit/slider-update/app-express.py b/docs/apps/comp-streamlit/slider-update/app-express.py new file mode 100644 index 00000000..d7dcf8d5 --- /dev/null +++ b/docs/apps/comp-streamlit/slider-update/app-express.py @@ -0,0 +1,40 @@ +from pathlib import Path + +import pandas as pd +from palmerpenguins import load_penguins +from plots import dist_plot, scatter_plot +from shiny import reactive, render +from shiny.express import input, ui + +df = load_penguins() + +with ui.sidebar(): + ui.input_slider("mass", "Mass", 2000, 8000, 6000) + ui.input_checkbox("smoother", "Add Smoother") + ui.input_action_button("reset", "Reset Slider") + + +@reactive.effect +@reactive.event(input.reset) +def _(): + ui.update_slider("mass", value=6000) + + +@reactive.calc +def filtered_data(): + filt_df = df.copy() + filt_df = filt_df.loc[df["body_mass_g"] < input.mass()] + return filt_df + + +with ui.card(): + + @render.plot + def scatter(): + return scatter_plot(filtered_data(), input.smoother()) + + +with ui.card(): + @render.plot + def mass_distribution(): + return dist_plot(filtered_data()) diff --git a/docs/apps/comp-streamlit/slider-update/plots.py b/docs/apps/comp-streamlit/slider-update/plots.py new file mode 100644 index 00000000..0f57417c --- /dev/null +++ b/docs/apps/comp-streamlit/slider-update/plots.py @@ -0,0 +1,31 @@ +from plotnine import aes, geom_density, geom_point, ggplot, stat_smooth, theme_light + + +def dist_plot(df): + plot = ( + ggplot(df, aes(x="body_mass_g", fill="species")) + + geom_density(alpha=0.2) + + theme_light() + ) + return plot + + +def scatter_plot(df, smoother): + plot = ( + ggplot( + df, + aes( + x="bill_length_mm", + y="bill_depth_mm", + color="species", + group="species", + ), + ) + + geom_point() + + theme_light() + ) + + if smoother: + plot = plot + stat_smooth() + + return plot diff --git a/docs/apps/comp-streamlit/slider-update/requirements.txt b/docs/apps/comp-streamlit/slider-update/requirements.txt new file mode 100644 index 00000000..efecef17 --- /dev/null +++ b/docs/apps/comp-streamlit/slider-update/requirements.txt @@ -0,0 +1,4 @@ +shiny +palmerpenguins +plotnine +pandas diff --git a/docs/assets/dashboard-template.png b/docs/assets/dashboard-template.png new file mode 100644 index 00000000..e71e79c7 Binary files /dev/null and b/docs/assets/dashboard-template.png differ diff --git a/docs/assets/file-upload.mp4 b/docs/assets/file-upload.mp4 new file mode 100644 index 00000000..43a06454 Binary files /dev/null and b/docs/assets/file-upload.mp4 differ diff --git a/docs/assets/shiny-create.mp4 b/docs/assets/shiny-create.mp4 new file mode 100644 index 00000000..26d623e1 Binary files /dev/null and b/docs/assets/shiny-create.mp4 differ diff --git a/docs/assets/tipping-dashboard.png b/docs/assets/tipping-dashboard.png new file mode 100644 index 00000000..6981ae25 Binary files /dev/null and b/docs/assets/tipping-dashboard.png differ diff --git a/docs/comp-r-shiny.qmd b/docs/comp-r-shiny.qmd index 007f65ee..4f11f937 100644 --- a/docs/comp-r-shiny.qmd +++ b/docs/comp-r-shiny.qmd @@ -15,10 +15,16 @@ All of the main components of Shiny like reactivity, rendering functions, and mo There are, however, a few differences that you need to keep in mind in order to build effective Shiny applications in Python. If you're reading this, we expect that you are an existing R Shiny user with some Python knowledge. +::: callout-tip +### Shiny Express + +Shiny [express](express-vs-core.qmd) is a new, more expressive, way to build PyShiny apps. It is not available in R, so the comparisons drawn below are only relevant to core (i.e., non-express) apps. +::: + # Getting started R users tend to use the R console to install and run Shiny while Python requires you to use the terminal. -To get started you can do the following (or see the [installation instructions](install.qmd) for a more in-depth explanation): +To get started you can do the following (or see the [installation instructions](install-create-run.qmd) for a more in-depth explanation): 1. In your terminal, create a new directory with `mkdir ` and navigate into it with `cd ` 2. Install Shiny. We strongly recommend using a virtual environment for this as it will eliminate dependency resolution headaches and make deployment easier. @@ -75,7 +81,7 @@ While R doesn't have an exact analog to decorators they are similar to [function - Decorate output function with `@output` - Use rendering decorators like `@render.plot`, `@render.text`, or `@render.ui` instead of `renderPlot()`, `renderText`, or `renderUI` -- Reactive calculations (equivalent to reactive expressions in R) are decorated `@reactive.Calc`, and reactive effects (equivalent to observers in R) are decorated with `@reactive.Effect`. +- Reactive calculations (equivalent to reactive expressions in R) are decorated `@reactive.calc`, and reactive effects (equivalent to observers in R) are decorated with `@reactive.effect`. ::: ::: {.grid .column-screen-inset} @@ -186,7 +192,7 @@ app = App(app_ui, server) All of the Shiny R functions are in a single package namespace. On the Python side we make use of [submodules](https://docs.python.org/3/tutorial/modules.html#packages) to keep related functions together. -Note that "submodules" in this case refers to the generic module which is not the same as [shiny modules](workflow-modules.qmd). +Note that "submodules" in this case refers to the generic module which is not the same as [shiny modules](modules.qmd). For example, instead of `sliderInput()`, you would call `ui.input_slider()`, where the `ui.` refers to a submodule of the main `shiny` module. ::: callout-tip @@ -294,7 +300,7 @@ app_ui = ui.page_fluid( ) def server(input, output, session): - @reactive.Calc + @reactive.calc def n(): return input.n() @@ -325,11 +331,11 @@ For the most part you can follow this naming pattern to find the function you're | R Function | Python Equivalent | |-----------------------------------|-------------------------------------| -| `observeEvent` | `@reactive.Effect` | -| `reactive` | `@reactive.Calc` | +| `observeEvent` | `@reactive.effect` | +| `reactive` | `@reactive.calc` | | `bindEvent` | `@ractive.event` | -| `reactiveEvent` | `@reactive.Calc` with `@reactive.event` | -| `observeEvent` | `@reactive.Effect` with `@reactive.event` | +| `reactiveEvent` | `@reactive.calc` with `@reactive.event` | +| `observeEvent` | `@reactive.effect` with `@reactive.event` | | `htmlTemplate` | `page_template` | | `tabPanelBody` | `navs_content` | | `*Tab` (`insertTab`, `appendTab`, etc) | `nav_*` (`nav_insert`, `nav_append` etc) | @@ -343,7 +349,7 @@ Reactivity works mostly the same in R and Python, but there are a few small diff In Shiny for R, reactive expressions (created by `reactive()`, which are used when you want to compute a value (which is then used in an output or an observer), and observers (created by `observe()`) are used for their side effects, like writing data to disk. This is a common source of confusion because the names `reactive()` and `observe()` do not clearly express when they should be used. -To help clarify this confusion we've renamed `reactive()` to `@reactive.Calc`, and `observe()` to `@reactive.Effect` in Python. +To help clarify this confusion we've renamed `reactive()` to `@reactive.calc`, and `observe()` to `@reactive.effect` in Python. ::: {.grid .column-screen-inset} ::: {.g-col-12 .g-col-md-6} @@ -392,11 +398,11 @@ app_ui = ui.page_fluid( ) def server(input, output, session): - @reactive.Calc + @reactive.calc def val(): return input.n() - @reactive.Effect + @reactive.effect def _(): input.reset() ui.update_slider("n", value=40) @@ -440,20 +446,20 @@ In Shiny for Python, we've simplified things in the following ways: - There is no direct analog to R's `reactiveValues`. -- The analog of R's standalone `reactiveVal` is `reactive.Value`. - (The `input` object in Python is a dictionary-like object containing individual `reactive.Value` objects.) +- The analog of R's standalone `reactiveVal` is `reactive.value`. + (The `input` object in Python is a dictionary-like object containing individual `reactive.value` objects.) - Reactive values have can be retrieved with `my_val()` or `my_val.get()` and can be set with `my_val.set()`. -There is no analog of `reactiveValues` in Python, but you can create something similar by using a dictionary of `reactive.Value` objects. +There is no analog of `reactiveValues` in Python, but you can create something similar by using a dictionary of `reactive.value` objects. ```{python} vals = { - "x": reactive.Value(1), - "y": reactive.Value(2), + "x": reactive.value(1), + "y": reactive.value(2), } -z = reactive.Value(3) +z = reactive.value(3) # Retrieve values print(vals.x()) @@ -515,15 +521,15 @@ app_ui = ui.page_fluid( ) def server(input: Inputs, output: Outputs, session: Session): - val = reactive.Value(0) + val = reactive.value(0) - @reactive.Effect + @reactive.effect @reactive.event(input.minus) def _(): newVal = val() - 1 val.set(newVal) - @reactive.Effect + @reactive.effect @reactive.event(input.plus) def _(): newVal = val() + 1 diff --git a/docs/comp-streamlit.qmd b/docs/comp-streamlit.qmd index 73a26614..27bfc04d 100644 --- a/docs/comp-streamlit.qmd +++ b/docs/comp-streamlit.qmd @@ -8,13 +8,18 @@ include-in-header: text: "" --- +```{python} +#| echo: false +from helpers import express_editor_tabs +``` + The idea of Streamlit is to simplify application development by rerunning the entire application script whenever any user input changes. This strategy leads to a great initial user experience, but quickly becomes constricting as your application grows in scope. Shiny and Streamlit differ in a few key ways: 1) Shiny's reactive execution means that elements are minimally re-rendered. -2) You can build lare Shiny applications without manually managing application state or caching data. +2) You can build large Shiny applications without manually managing application state or caching data. 3) Shiny allows you to easily customize the look and feel of your application. Shiny is designed to support your application's growth without extensive rewriting; the patterns you learn when developing a simple app are robust enough to handle a complicated one. @@ -89,560 +94,46 @@ st.pyplot(dist_plot(filt_df)) ## Shiny translation -Shiny requires a bit more initial setup than Streamlit, but this structure creates the foundation for a much more performant and flexible application. -Unlike Streamlit, Shiny does not rerender the application every time an input is changed, but instead keeps track of the relationships between components to minimally rerender the parts of the application which need to be updated. +Shiny express apps look very similar to Streamlit apps, but run much more efficiently. +Unlike Streamlit, Shiny does not rerender the application every time an input is changed, but instead keeps track of the relationships between components and minimally rerenders the components which need to be updated. The framework does this automatically when the application is run, and so you don't need to manually define the execution method for your app. :::{.column-screen-inset} -``` {shinylive-python} -#| standalone: true -#| components: [editor, viewer] -from shiny import App, render, ui, reactive -import pandas as pd -from plotnine import ggplot, geom_density, aes, theme_light, geom_point, stat_smooth -from pathlib import Path - -app_ui = ui.page_fluid( - ui.layout_sidebar( - ui.panel_sidebar( - ui.input_slider("mass", "Mass", 2000, 8000, 6000), - ui.input_checkbox("smoother", "Add Smoother"), - ), - ui.panel_main( - ui.output_plot(id="scatter"), - ui.output_plot(id="mass_distribution"), - ), - ) -) - - -def server(input, output, session): - infile = Path(__file__).parent / "penguins.csv" - df = pd.read_csv(infile) - - @reactive.Calc - def filtered_data(): - filt_df = df.copy() - filt_df = filt_df.loc[df["Body Mass (g)"] < input.mass()] - return filt_df - - @output - @render.plot - def mass_distribution(): - return dist_plot(filtered_data()) - - @output - @render.plot - def scatter(): - return scatter_plot(filtered_data(), input.smoother()) - +``` {python} +#| output: asis +#| echo: false -def dist_plot(df): - plot = ( - ggplot(df, aes(x="Body Mass (g)", fill="Species")) - + geom_density(alpha=0.2) - + theme_light() - ) - return plot +express_editor_tabs("apps/comp-streamlit/penguins") - -def scatter_plot(df, smoother): - plot = ( - ggplot( - df, - aes( - x="Bill Length (mm)", - y="Bill Depth (mm)", - color="Species", - group="Species", - ), - ) - + geom_point() - + theme_light() - ) - - if smoother: - plot = plot + stat_smooth() - - return plot - - -app = App(app_ui, server) -## file: penguins.csv -Species,Island,Bill Length (mm),Bill Depth (mm),Flipper Length (mm),Body Mass (g),Sex,Year -Adelie,Torgersen,39.1,18.7,181,3750,male,2007 -Adelie,Torgersen,39.5,17.4,186,3800,female,2007 -Adelie,Torgersen,40.3,18,195,3250,female,2007 -Adelie,Torgersen,NA,NA,NA,NA,NA,2007 -Adelie,Torgersen,36.7,19.3,193,3450,female,2007 -Adelie,Torgersen,39.3,20.6,190,3650,male,2007 -Adelie,Torgersen,38.9,17.8,181,3625,female,2007 -Adelie,Torgersen,39.2,19.6,195,4675,male,2007 -Adelie,Torgersen,34.1,18.1,193,3475,NA,2007 -Adelie,Torgersen,42,20.2,190,4250,NA,2007 -Adelie,Torgersen,37.8,17.1,186,3300,NA,2007 -Adelie,Torgersen,37.8,17.3,180,3700,NA,2007 -Adelie,Torgersen,41.1,17.6,182,3200,female,2007 -Adelie,Torgersen,38.6,21.2,191,3800,male,2007 -Adelie,Torgersen,34.6,21.1,198,4400,male,2007 -Adelie,Torgersen,36.6,17.8,185,3700,female,2007 -Adelie,Torgersen,38.7,19,195,3450,female,2007 -Adelie,Torgersen,42.5,20.7,197,4500,male,2007 -Adelie,Torgersen,34.4,18.4,184,3325,female,2007 -Adelie,Torgersen,46,21.5,194,4200,male,2007 -Adelie,Biscoe,37.8,18.3,174,3400,female,2007 -Adelie,Biscoe,37.7,18.7,180,3600,male,2007 -Adelie,Biscoe,35.9,19.2,189,3800,female,2007 -Adelie,Biscoe,38.2,18.1,185,3950,male,2007 -Adelie,Biscoe,38.8,17.2,180,3800,male,2007 -Adelie,Biscoe,35.3,18.9,187,3800,female,2007 -Adelie,Biscoe,40.6,18.6,183,3550,male,2007 -Adelie,Biscoe,40.5,17.9,187,3200,female,2007 -Adelie,Biscoe,37.9,18.6,172,3150,female,2007 -Adelie,Biscoe,40.5,18.9,180,3950,male,2007 -Adelie,Dream,39.5,16.7,178,3250,female,2007 -Adelie,Dream,37.2,18.1,178,3900,male,2007 -Adelie,Dream,39.5,17.8,188,3300,female,2007 -Adelie,Dream,40.9,18.9,184,3900,male,2007 -Adelie,Dream,36.4,17,195,3325,female,2007 -Adelie,Dream,39.2,21.1,196,4150,male,2007 -Adelie,Dream,38.8,20,190,3950,male,2007 -Adelie,Dream,42.2,18.5,180,3550,female,2007 -Adelie,Dream,37.6,19.3,181,3300,female,2007 -Adelie,Dream,39.8,19.1,184,4650,male,2007 -Adelie,Dream,36.5,18,182,3150,female,2007 -Adelie,Dream,40.8,18.4,195,3900,male,2007 -Adelie,Dream,36,18.5,186,3100,female,2007 -Adelie,Dream,44.1,19.7,196,4400,male,2007 -Adelie,Dream,37,16.9,185,3000,female,2007 -Adelie,Dream,39.6,18.8,190,4600,male,2007 -Adelie,Dream,41.1,19,182,3425,male,2007 -Adelie,Dream,37.5,18.9,179,2975,NA,2007 -Adelie,Dream,36,17.9,190,3450,female,2007 -Adelie,Dream,42.3,21.2,191,4150,male,2007 -Adelie,Biscoe,39.6,17.7,186,3500,female,2008 -Adelie,Biscoe,40.1,18.9,188,4300,male,2008 -Adelie,Biscoe,35,17.9,190,3450,female,2008 -Adelie,Biscoe,42,19.5,200,4050,male,2008 -Adelie,Biscoe,34.5,18.1,187,2900,female,2008 -Adelie,Biscoe,41.4,18.6,191,3700,male,2008 -Adelie,Biscoe,39,17.5,186,3550,female,2008 -Adelie,Biscoe,40.6,18.8,193,3800,male,2008 -Adelie,Biscoe,36.5,16.6,181,2850,female,2008 -Adelie,Biscoe,37.6,19.1,194,3750,male,2008 -Adelie,Biscoe,35.7,16.9,185,3150,female,2008 -Adelie,Biscoe,41.3,21.1,195,4400,male,2008 -Adelie,Biscoe,37.6,17,185,3600,female,2008 -Adelie,Biscoe,41.1,18.2,192,4050,male,2008 -Adelie,Biscoe,36.4,17.1,184,2850,female,2008 -Adelie,Biscoe,41.6,18,192,3950,male,2008 -Adelie,Biscoe,35.5,16.2,195,3350,female,2008 -Adelie,Biscoe,41.1,19.1,188,4100,male,2008 -Adelie,Torgersen,35.9,16.6,190,3050,female,2008 -Adelie,Torgersen,41.8,19.4,198,4450,male,2008 -Adelie,Torgersen,33.5,19,190,3600,female,2008 -Adelie,Torgersen,39.7,18.4,190,3900,male,2008 -Adelie,Torgersen,39.6,17.2,196,3550,female,2008 -Adelie,Torgersen,45.8,18.9,197,4150,male,2008 -Adelie,Torgersen,35.5,17.5,190,3700,female,2008 -Adelie,Torgersen,42.8,18.5,195,4250,male,2008 -Adelie,Torgersen,40.9,16.8,191,3700,female,2008 -Adelie,Torgersen,37.2,19.4,184,3900,male,2008 -Adelie,Torgersen,36.2,16.1,187,3550,female,2008 -Adelie,Torgersen,42.1,19.1,195,4000,male,2008 -Adelie,Torgersen,34.6,17.2,189,3200,female,2008 -Adelie,Torgersen,42.9,17.6,196,4700,male,2008 -Adelie,Torgersen,36.7,18.8,187,3800,female,2008 -Adelie,Torgersen,35.1,19.4,193,4200,male,2008 -Adelie,Dream,37.3,17.8,191,3350,female,2008 -Adelie,Dream,41.3,20.3,194,3550,male,2008 -Adelie,Dream,36.3,19.5,190,3800,male,2008 -Adelie,Dream,36.9,18.6,189,3500,female,2008 -Adelie,Dream,38.3,19.2,189,3950,male,2008 -Adelie,Dream,38.9,18.8,190,3600,female,2008 -Adelie,Dream,35.7,18,202,3550,female,2008 -Adelie,Dream,41.1,18.1,205,4300,male,2008 -Adelie,Dream,34,17.1,185,3400,female,2008 -Adelie,Dream,39.6,18.1,186,4450,male,2008 -Adelie,Dream,36.2,17.3,187,3300,female,2008 -Adelie,Dream,40.8,18.9,208,4300,male,2008 -Adelie,Dream,38.1,18.6,190,3700,female,2008 -Adelie,Dream,40.3,18.5,196,4350,male,2008 -Adelie,Dream,33.1,16.1,178,2900,female,2008 -Adelie,Dream,43.2,18.5,192,4100,male,2008 -Adelie,Biscoe,35,17.9,192,3725,female,2009 -Adelie,Biscoe,41,20,203,4725,male,2009 -Adelie,Biscoe,37.7,16,183,3075,female,2009 -Adelie,Biscoe,37.8,20,190,4250,male,2009 -Adelie,Biscoe,37.9,18.6,193,2925,female,2009 -Adelie,Biscoe,39.7,18.9,184,3550,male,2009 -Adelie,Biscoe,38.6,17.2,199,3750,female,2009 -Adelie,Biscoe,38.2,20,190,3900,male,2009 -Adelie,Biscoe,38.1,17,181,3175,female,2009 -Adelie,Biscoe,43.2,19,197,4775,male,2009 -Adelie,Biscoe,38.1,16.5,198,3825,female,2009 -Adelie,Biscoe,45.6,20.3,191,4600,male,2009 -Adelie,Biscoe,39.7,17.7,193,3200,female,2009 -Adelie,Biscoe,42.2,19.5,197,4275,male,2009 -Adelie,Biscoe,39.6,20.7,191,3900,female,2009 -Adelie,Biscoe,42.7,18.3,196,4075,male,2009 -Adelie,Torgersen,38.6,17,188,2900,female,2009 -Adelie,Torgersen,37.3,20.5,199,3775,male,2009 -Adelie,Torgersen,35.7,17,189,3350,female,2009 -Adelie,Torgersen,41.1,18.6,189,3325,male,2009 -Adelie,Torgersen,36.2,17.2,187,3150,female,2009 -Adelie,Torgersen,37.7,19.8,198,3500,male,2009 -Adelie,Torgersen,40.2,17,176,3450,female,2009 -Adelie,Torgersen,41.4,18.5,202,3875,male,2009 -Adelie,Torgersen,35.2,15.9,186,3050,female,2009 -Adelie,Torgersen,40.6,19,199,4000,male,2009 -Adelie,Torgersen,38.8,17.6,191,3275,female,2009 -Adelie,Torgersen,41.5,18.3,195,4300,male,2009 -Adelie,Torgersen,39,17.1,191,3050,female,2009 -Adelie,Torgersen,44.1,18,210,4000,male,2009 -Adelie,Torgersen,38.5,17.9,190,3325,female,2009 -Adelie,Torgersen,43.1,19.2,197,3500,male,2009 -Adelie,Dream,36.8,18.5,193,3500,female,2009 -Adelie,Dream,37.5,18.5,199,4475,male,2009 -Adelie,Dream,38.1,17.6,187,3425,female,2009 -Adelie,Dream,41.1,17.5,190,3900,male,2009 -Adelie,Dream,35.6,17.5,191,3175,female,2009 -Adelie,Dream,40.2,20.1,200,3975,male,2009 -Adelie,Dream,37,16.5,185,3400,female,2009 -Adelie,Dream,39.7,17.9,193,4250,male,2009 -Adelie,Dream,40.2,17.1,193,3400,female,2009 -Adelie,Dream,40.6,17.2,187,3475,male,2009 -Adelie,Dream,32.1,15.5,188,3050,female,2009 -Adelie,Dream,40.7,17,190,3725,male,2009 -Adelie,Dream,37.3,16.8,192,3000,female,2009 -Adelie,Dream,39,18.7,185,3650,male,2009 -Adelie,Dream,39.2,18.6,190,4250,male,2009 -Adelie,Dream,36.6,18.4,184,3475,female,2009 -Adelie,Dream,36,17.8,195,3450,female,2009 -Adelie,Dream,37.8,18.1,193,3750,male,2009 -Adelie,Dream,36,17.1,187,3700,female,2009 -Adelie,Dream,41.5,18.5,201,4000,male,2009 -Gentoo,Biscoe,46.1,13.2,211,4500,female,2007 -Gentoo,Biscoe,50,16.3,230,5700,male,2007 -Gentoo,Biscoe,48.7,14.1,210,4450,female,2007 -Gentoo,Biscoe,50,15.2,218,5700,male,2007 -Gentoo,Biscoe,47.6,14.5,215,5400,male,2007 -Gentoo,Biscoe,46.5,13.5,210,4550,female,2007 -Gentoo,Biscoe,45.4,14.6,211,4800,female,2007 -Gentoo,Biscoe,46.7,15.3,219,5200,male,2007 -Gentoo,Biscoe,43.3,13.4,209,4400,female,2007 -Gentoo,Biscoe,46.8,15.4,215,5150,male,2007 -Gentoo,Biscoe,40.9,13.7,214,4650,female,2007 -Gentoo,Biscoe,49,16.1,216,5550,male,2007 -Gentoo,Biscoe,45.5,13.7,214,4650,female,2007 -Gentoo,Biscoe,48.4,14.6,213,5850,male,2007 -Gentoo,Biscoe,45.8,14.6,210,4200,female,2007 -Gentoo,Biscoe,49.3,15.7,217,5850,male,2007 -Gentoo,Biscoe,42,13.5,210,4150,female,2007 -Gentoo,Biscoe,49.2,15.2,221,6300,male,2007 -Gentoo,Biscoe,46.2,14.5,209,4800,female,2007 -Gentoo,Biscoe,48.7,15.1,222,5350,male,2007 -Gentoo,Biscoe,50.2,14.3,218,5700,male,2007 -Gentoo,Biscoe,45.1,14.5,215,5000,female,2007 -Gentoo,Biscoe,46.5,14.5,213,4400,female,2007 -Gentoo,Biscoe,46.3,15.8,215,5050,male,2007 -Gentoo,Biscoe,42.9,13.1,215,5000,female,2007 -Gentoo,Biscoe,46.1,15.1,215,5100,male,2007 -Gentoo,Biscoe,44.5,14.3,216,4100,NA,2007 -Gentoo,Biscoe,47.8,15,215,5650,male,2007 -Gentoo,Biscoe,48.2,14.3,210,4600,female,2007 -Gentoo,Biscoe,50,15.3,220,5550,male,2007 -Gentoo,Biscoe,47.3,15.3,222,5250,male,2007 -Gentoo,Biscoe,42.8,14.2,209,4700,female,2007 -Gentoo,Biscoe,45.1,14.5,207,5050,female,2007 -Gentoo,Biscoe,59.6,17,230,6050,male,2007 -Gentoo,Biscoe,49.1,14.8,220,5150,female,2008 -Gentoo,Biscoe,48.4,16.3,220,5400,male,2008 -Gentoo,Biscoe,42.6,13.7,213,4950,female,2008 -Gentoo,Biscoe,44.4,17.3,219,5250,male,2008 -Gentoo,Biscoe,44,13.6,208,4350,female,2008 -Gentoo,Biscoe,48.7,15.7,208,5350,male,2008 -Gentoo,Biscoe,42.7,13.7,208,3950,female,2008 -Gentoo,Biscoe,49.6,16,225,5700,male,2008 -Gentoo,Biscoe,45.3,13.7,210,4300,female,2008 -Gentoo,Biscoe,49.6,15,216,4750,male,2008 -Gentoo,Biscoe,50.5,15.9,222,5550,male,2008 -Gentoo,Biscoe,43.6,13.9,217,4900,female,2008 -Gentoo,Biscoe,45.5,13.9,210,4200,female,2008 -Gentoo,Biscoe,50.5,15.9,225,5400,male,2008 -Gentoo,Biscoe,44.9,13.3,213,5100,female,2008 -Gentoo,Biscoe,45.2,15.8,215,5300,male,2008 -Gentoo,Biscoe,46.6,14.2,210,4850,female,2008 -Gentoo,Biscoe,48.5,14.1,220,5300,male,2008 -Gentoo,Biscoe,45.1,14.4,210,4400,female,2008 -Gentoo,Biscoe,50.1,15,225,5000,male,2008 -Gentoo,Biscoe,46.5,14.4,217,4900,female,2008 -Gentoo,Biscoe,45,15.4,220,5050,male,2008 -Gentoo,Biscoe,43.8,13.9,208,4300,female,2008 -Gentoo,Biscoe,45.5,15,220,5000,male,2008 -Gentoo,Biscoe,43.2,14.5,208,4450,female,2008 -Gentoo,Biscoe,50.4,15.3,224,5550,male,2008 -Gentoo,Biscoe,45.3,13.8,208,4200,female,2008 -Gentoo,Biscoe,46.2,14.9,221,5300,male,2008 -Gentoo,Biscoe,45.7,13.9,214,4400,female,2008 -Gentoo,Biscoe,54.3,15.7,231,5650,male,2008 -Gentoo,Biscoe,45.8,14.2,219,4700,female,2008 -Gentoo,Biscoe,49.8,16.8,230,5700,male,2008 -Gentoo,Biscoe,46.2,14.4,214,4650,NA,2008 -Gentoo,Biscoe,49.5,16.2,229,5800,male,2008 -Gentoo,Biscoe,43.5,14.2,220,4700,female,2008 -Gentoo,Biscoe,50.7,15,223,5550,male,2008 -Gentoo,Biscoe,47.7,15,216,4750,female,2008 -Gentoo,Biscoe,46.4,15.6,221,5000,male,2008 -Gentoo,Biscoe,48.2,15.6,221,5100,male,2008 -Gentoo,Biscoe,46.5,14.8,217,5200,female,2008 -Gentoo,Biscoe,46.4,15,216,4700,female,2008 -Gentoo,Biscoe,48.6,16,230,5800,male,2008 -Gentoo,Biscoe,47.5,14.2,209,4600,female,2008 -Gentoo,Biscoe,51.1,16.3,220,6000,male,2008 -Gentoo,Biscoe,45.2,13.8,215,4750,female,2008 -Gentoo,Biscoe,45.2,16.4,223,5950,male,2008 -Gentoo,Biscoe,49.1,14.5,212,4625,female,2009 -Gentoo,Biscoe,52.5,15.6,221,5450,male,2009 -Gentoo,Biscoe,47.4,14.6,212,4725,female,2009 -Gentoo,Biscoe,50,15.9,224,5350,male,2009 -Gentoo,Biscoe,44.9,13.8,212,4750,female,2009 -Gentoo,Biscoe,50.8,17.3,228,5600,male,2009 -Gentoo,Biscoe,43.4,14.4,218,4600,female,2009 -Gentoo,Biscoe,51.3,14.2,218,5300,male,2009 -Gentoo,Biscoe,47.5,14,212,4875,female,2009 -Gentoo,Biscoe,52.1,17,230,5550,male,2009 -Gentoo,Biscoe,47.5,15,218,4950,female,2009 -Gentoo,Biscoe,52.2,17.1,228,5400,male,2009 -Gentoo,Biscoe,45.5,14.5,212,4750,female,2009 -Gentoo,Biscoe,49.5,16.1,224,5650,male,2009 -Gentoo,Biscoe,44.5,14.7,214,4850,female,2009 -Gentoo,Biscoe,50.8,15.7,226,5200,male,2009 -Gentoo,Biscoe,49.4,15.8,216,4925,male,2009 -Gentoo,Biscoe,46.9,14.6,222,4875,female,2009 -Gentoo,Biscoe,48.4,14.4,203,4625,female,2009 -Gentoo,Biscoe,51.1,16.5,225,5250,male,2009 -Gentoo,Biscoe,48.5,15,219,4850,female,2009 -Gentoo,Biscoe,55.9,17,228,5600,male,2009 -Gentoo,Biscoe,47.2,15.5,215,4975,female,2009 -Gentoo,Biscoe,49.1,15,228,5500,male,2009 -Gentoo,Biscoe,47.3,13.8,216,4725,NA,2009 -Gentoo,Biscoe,46.8,16.1,215,5500,male,2009 -Gentoo,Biscoe,41.7,14.7,210,4700,female,2009 -Gentoo,Biscoe,53.4,15.8,219,5500,male,2009 -Gentoo,Biscoe,43.3,14,208,4575,female,2009 -Gentoo,Biscoe,48.1,15.1,209,5500,male,2009 -Gentoo,Biscoe,50.5,15.2,216,5000,female,2009 -Gentoo,Biscoe,49.8,15.9,229,5950,male,2009 -Gentoo,Biscoe,43.5,15.2,213,4650,female,2009 -Gentoo,Biscoe,51.5,16.3,230,5500,male,2009 -Gentoo,Biscoe,46.2,14.1,217,4375,female,2009 -Gentoo,Biscoe,55.1,16,230,5850,male,2009 -Gentoo,Biscoe,44.5,15.7,217,4875,NA,2009 -Gentoo,Biscoe,48.8,16.2,222,6000,male,2009 -Gentoo,Biscoe,47.2,13.7,214,4925,female,2009 -Gentoo,Biscoe,NA,NA,NA,NA,NA,2009 -Gentoo,Biscoe,46.8,14.3,215,4850,female,2009 -Gentoo,Biscoe,50.4,15.7,222,5750,male,2009 -Gentoo,Biscoe,45.2,14.8,212,5200,female,2009 -Gentoo,Biscoe,49.9,16.1,213,5400,male,2009 -Chinstrap,Dream,46.5,17.9,192,3500,female,2007 -Chinstrap,Dream,50,19.5,196,3900,male,2007 -Chinstrap,Dream,51.3,19.2,193,3650,male,2007 -Chinstrap,Dream,45.4,18.7,188,3525,female,2007 -Chinstrap,Dream,52.7,19.8,197,3725,male,2007 -Chinstrap,Dream,45.2,17.8,198,3950,female,2007 -Chinstrap,Dream,46.1,18.2,178,3250,female,2007 -Chinstrap,Dream,51.3,18.2,197,3750,male,2007 -Chinstrap,Dream,46,18.9,195,4150,female,2007 -Chinstrap,Dream,51.3,19.9,198,3700,male,2007 -Chinstrap,Dream,46.6,17.8,193,3800,female,2007 -Chinstrap,Dream,51.7,20.3,194,3775,male,2007 -Chinstrap,Dream,47,17.3,185,3700,female,2007 -Chinstrap,Dream,52,18.1,201,4050,male,2007 -Chinstrap,Dream,45.9,17.1,190,3575,female,2007 -Chinstrap,Dream,50.5,19.6,201,4050,male,2007 -Chinstrap,Dream,50.3,20,197,3300,male,2007 -Chinstrap,Dream,58,17.8,181,3700,female,2007 -Chinstrap,Dream,46.4,18.6,190,3450,female,2007 -Chinstrap,Dream,49.2,18.2,195,4400,male,2007 -Chinstrap,Dream,42.4,17.3,181,3600,female,2007 -Chinstrap,Dream,48.5,17.5,191,3400,male,2007 -Chinstrap,Dream,43.2,16.6,187,2900,female,2007 -Chinstrap,Dream,50.6,19.4,193,3800,male,2007 -Chinstrap,Dream,46.7,17.9,195,3300,female,2007 -Chinstrap,Dream,52,19,197,4150,male,2007 -Chinstrap,Dream,50.5,18.4,200,3400,female,2008 -Chinstrap,Dream,49.5,19,200,3800,male,2008 -Chinstrap,Dream,46.4,17.8,191,3700,female,2008 -Chinstrap,Dream,52.8,20,205,4550,male,2008 -Chinstrap,Dream,40.9,16.6,187,3200,female,2008 -Chinstrap,Dream,54.2,20.8,201,4300,male,2008 -Chinstrap,Dream,42.5,16.7,187,3350,female,2008 -Chinstrap,Dream,51,18.8,203,4100,male,2008 -Chinstrap,Dream,49.7,18.6,195,3600,male,2008 -Chinstrap,Dream,47.5,16.8,199,3900,female,2008 -Chinstrap,Dream,47.6,18.3,195,3850,female,2008 -Chinstrap,Dream,52,20.7,210,4800,male,2008 -Chinstrap,Dream,46.9,16.6,192,2700,female,2008 -Chinstrap,Dream,53.5,19.9,205,4500,male,2008 -Chinstrap,Dream,49,19.5,210,3950,male,2008 -Chinstrap,Dream,46.2,17.5,187,3650,female,2008 -Chinstrap,Dream,50.9,19.1,196,3550,male,2008 -Chinstrap,Dream,45.5,17,196,3500,female,2008 -Chinstrap,Dream,50.9,17.9,196,3675,female,2009 -Chinstrap,Dream,50.8,18.5,201,4450,male,2009 -Chinstrap,Dream,50.1,17.9,190,3400,female,2009 -Chinstrap,Dream,49,19.6,212,4300,male,2009 -Chinstrap,Dream,51.5,18.7,187,3250,male,2009 -Chinstrap,Dream,49.8,17.3,198,3675,female,2009 -Chinstrap,Dream,48.1,16.4,199,3325,female,2009 -Chinstrap,Dream,51.4,19,201,3950,male,2009 -Chinstrap,Dream,45.7,17.3,193,3600,female,2009 -Chinstrap,Dream,50.7,19.7,203,4050,male,2009 -Chinstrap,Dream,42.5,17.3,187,3350,female,2009 -Chinstrap,Dream,52.2,18.8,197,3450,male,2009 -Chinstrap,Dream,45.2,16.6,191,3250,female,2009 -Chinstrap,Dream,49.3,19.9,203,4050,male,2009 -Chinstrap,Dream,50.2,18.8,202,3800,male,2009 -Chinstrap,Dream,45.6,19.4,194,3525,female,2009 -Chinstrap,Dream,51.9,19.5,206,3950,male,2009 -Chinstrap,Dream,46.8,16.5,189,3650,female,2009 -Chinstrap,Dream,45.7,17,195,3650,female,2009 -Chinstrap,Dream,55.8,19.8,207,4000,male,2009 -Chinstrap,Dream,43.5,18.1,202,3400,female,2009 -Chinstrap,Dream,49.6,18.2,193,3775,male,2009 -Chinstrap,Dream,50.8,19,210,4100,male,2009 -Chinstrap,Dream,50.2,18.7,198,3775,female,2009 ``` ::: -There are two main things which will be new to you if you're coming from Streamlit. - -## Explicit UI layout - -Shiny requires you to explicitly lay out your UI using nested `ui.` method calls, which map onto HTML -- you don't need to know HTML and CSS for Shiny, but if you do, you can use that knowledge to customize and extend your applications. -Defining your UI in this way gives you more control over precisely how your application is laid out, and also makes the UI easier to read and modify down the road. - - -### UI flexibility - -The Shiny UI is also more flexible and customizable than Streamlit. -For example, in Streamlit container functions like columns or sidebars are called using the `with `, this makes some layouts [like nested columns](https://discuss.streamlit.io/t/create-nested-columns/18807/7) difficult or impossible to implement. -All of Shiny's container functions take child elements as arguments, which makes them very easy to compose them to create -highly customized layouts. -Implementing nested columns is as a simple as nesting function calls. - -``` {shinylive-python} -#| standalone: true -#| components: [editor, viewer] -#| layout: vertical - -from shiny import App, ui - -style = "border: 1px solid #999;" - -app_ui = ui.page_fluid( - ui.row( - ui.column(4, "row-1 col-1", style=style), - ui.column(8, "row-1 col-2", style=style), - ), - ui.row( - ui.column(6, "row-2 col-1", style=style), - ui.column( - 6, - ui.row( - ui.column(4, "sub-col1", style=style), - ui.column(8, "sub-col2", style=style), - ), - style=style, - ), - ), -) - - -app = App(app_ui, None) -``` - - -### Modular UI code - -Most Streamlit UI elements have the important side effect of rendering themselves. -This means that _where_ the ui element is in the script determines its location in the app and as a result those ui elements are deeply intertwined with server logic. -For example if you want to move a UI element from one part of the app to another, you often have to also rearrange the server logic of your app. -This means that seemingly minor layout changes can result in major application surgery. - -Shiny's UI uses pure functions which return a value instead of rendering themselves. -This means that UI can be defined independently of the server logic, which makes maintaining and modifying the UI much easier. All you have to do to move a graph in the UI is change the location of the `ui.output_plot` call. - -This also means that the UI can be broken up into informative pieces to improve code readability. -For example, if you want to move pieces of the UI code to another file you can do that either by storing them in variables, or using Shiny [modules](workflow-modules.qmd). -``` {shinylive-python} -#| standalone: true -#| components: [editor, viewer] -#| layout: vertical - -from shiny import App, ui -from rows import row_1, row_2 - -app_ui = ui.page_fluid(row_1, row_2) - -app = App(app_ui, None) - -## file: rows.py -from shiny import ui -style = "border: 1px solid #999;" -row_2 = ( - ui.row( - ui.column(6, "row-2 col-1", style=style), - ui.column( - 6, - ui.row( - ui.column(4, "sub-col", style=style), - ui.column(8, "sub-col", style=style), - ), - style=style, - ), - ), -) - -row_1 = ui.row( - ui.column(4, "row-1 col-1", style=style), - ui.column(8, "row-1 col-2", style=style), -) -``` - - -## Code organization - -The second main difference between Streamlit and Shiny is code organization. +The main difference between Streamlit and Shiny is code organization. Since Streamlit runs everything from top to bottom it doesn't particularly matter how your code is organized. In order to benefit from Shiny's execution model, you need to organize your code into decorated functions. For example, take this part of the application code: ``` python -@reactive.Calc +@reactive.calc def filtered_data(): filt_df = df.copy() - filt_df = filt_df.loc[df["Body Mass (g)"] < input.mass()] + filt_df = filt_df.loc[df["body_mass_g"] < input.mass()] return filt_df -@output @render.plot def mass_distribution(): return dist_plot(filtered_data()) -@output @render.plot def scatter(): return scatter_plot(filtered_data(), input.smoother()) ``` These functions define the three main nodes of the application, as well as the relationships between them. -The `@render.plot` and `@reactive.Calc` decorators identify the functions as reactive functions which need to re-execute in response to upstream changes, and the `filtered_data()` and `input.*` calls define the relationships between these components. -These decorators help Shiny to construct a computational graph of the application as it runs, and only rerender an element when one of its upstream dependencies changes. +The `@render.plot` and `@reactive.calc` decorators identify the functions as reactive functions which need to re-execute in response to upstream changes, and the `filtered_data()` and `input.*` calls define the relationships between these components. +The decorators allow Shiny to construct a computation graph of the application as it runs, and only rerender an element when one of its upstream dependencies changes. ```{mermaid} flowchart LR @@ -654,9 +145,9 @@ flowchart LR # Extending the application -The benefit of Shiny's structure is that you can extend the application without having to rewrite it. +Organizing your app this way means that you can extend the application without rewriting it. For example, let's add a button which resets the slider. -In Shiny you can do this by adding a a `reactive.Effect` function which calls the `ui.update_slider()` function. +In Shiny you can do this by adding a `@reactive.effect` function which calls the `ui.update_slider()` function. This adds a node to the computation graph and everything works as you'd expect it to. Importantly, we can extend the application without changing how we think about the overall application. @@ -670,438 +161,11 @@ flowchart LR ``` :::{.column-screen-inset} -``` {shinylive-python} -#| standalone: true -#| components: [editor, viewer] -from shiny import App, render, ui, reactive -import pandas as pd -from plotnine import ggplot, geom_density, aes, theme_light, geom_point, stat_smooth -from pathlib import Path - -app_ui = ui.page_fluid( - ui.layout_sidebar( - ui.panel_sidebar( - ui.input_slider( - "mass", - "Mass", - 2000, - 8000, - 6000, - ), - ui.input_checkbox("smoother", "Add Smoother"), - ui.input_action_button("reset", "Reset slider"), - ), - ui.panel_main( - ui.output_plot(id="scatter"), - ui.output_plot(id="mass_distribution"), - ), - ) -) - - -def server(input, output, session): - infile = Path(__file__).parent / "penguins.csv" - df = pd.read_csv(infile) - - @reactive.Calc - def filtered_data(): - filt_df = df.copy() - filt_df = filt_df.loc[df["Body Mass (g)"] < input.mass()] - return filt_df - - @output - @render.plot - def mass_distribution(): - return dist_plot(filtered_data()) - - @output - @render.plot - def scatter(): - return scatter_plot(filtered_data(), input.smoother()) - - @reactive.Effect - @reactive.event(input.reset) - def _(): - ui.update_slider("mass", value=6000) - - -def dist_plot(df): - plot = ( - ggplot(df, aes(x="Body Mass (g)", fill="Species")) - + geom_density(alpha=0.2) - + theme_light() - ) - return plot - +``` {python} +#| echo: false +#| output: asis -def scatter_plot(df, smoother): - plot = ( - ggplot( - df, - aes( - x="Bill Length (mm)", - y="Bill Depth (mm)", - color="Species", - group="Species", - ), - ) - + geom_point() - + theme_light() - ) - - if smoother: - plot = plot + stat_smooth() - - return plot - - -app = App(app_ui, server) -## file: penguins.csv -Species,Island,Bill Length (mm),Bill Depth (mm),Flipper Length (mm),Body Mass (g),Sex,Year -Adelie,Torgersen,39.1,18.7,181,3750,male,2007 -Adelie,Torgersen,39.5,17.4,186,3800,female,2007 -Adelie,Torgersen,40.3,18,195,3250,female,2007 -Adelie,Torgersen,NA,NA,NA,NA,NA,2007 -Adelie,Torgersen,36.7,19.3,193,3450,female,2007 -Adelie,Torgersen,39.3,20.6,190,3650,male,2007 -Adelie,Torgersen,38.9,17.8,181,3625,female,2007 -Adelie,Torgersen,39.2,19.6,195,4675,male,2007 -Adelie,Torgersen,34.1,18.1,193,3475,NA,2007 -Adelie,Torgersen,42,20.2,190,4250,NA,2007 -Adelie,Torgersen,37.8,17.1,186,3300,NA,2007 -Adelie,Torgersen,37.8,17.3,180,3700,NA,2007 -Adelie,Torgersen,41.1,17.6,182,3200,female,2007 -Adelie,Torgersen,38.6,21.2,191,3800,male,2007 -Adelie,Torgersen,34.6,21.1,198,4400,male,2007 -Adelie,Torgersen,36.6,17.8,185,3700,female,2007 -Adelie,Torgersen,38.7,19,195,3450,female,2007 -Adelie,Torgersen,42.5,20.7,197,4500,male,2007 -Adelie,Torgersen,34.4,18.4,184,3325,female,2007 -Adelie,Torgersen,46,21.5,194,4200,male,2007 -Adelie,Biscoe,37.8,18.3,174,3400,female,2007 -Adelie,Biscoe,37.7,18.7,180,3600,male,2007 -Adelie,Biscoe,35.9,19.2,189,3800,female,2007 -Adelie,Biscoe,38.2,18.1,185,3950,male,2007 -Adelie,Biscoe,38.8,17.2,180,3800,male,2007 -Adelie,Biscoe,35.3,18.9,187,3800,female,2007 -Adelie,Biscoe,40.6,18.6,183,3550,male,2007 -Adelie,Biscoe,40.5,17.9,187,3200,female,2007 -Adelie,Biscoe,37.9,18.6,172,3150,female,2007 -Adelie,Biscoe,40.5,18.9,180,3950,male,2007 -Adelie,Dream,39.5,16.7,178,3250,female,2007 -Adelie,Dream,37.2,18.1,178,3900,male,2007 -Adelie,Dream,39.5,17.8,188,3300,female,2007 -Adelie,Dream,40.9,18.9,184,3900,male,2007 -Adelie,Dream,36.4,17,195,3325,female,2007 -Adelie,Dream,39.2,21.1,196,4150,male,2007 -Adelie,Dream,38.8,20,190,3950,male,2007 -Adelie,Dream,42.2,18.5,180,3550,female,2007 -Adelie,Dream,37.6,19.3,181,3300,female,2007 -Adelie,Dream,39.8,19.1,184,4650,male,2007 -Adelie,Dream,36.5,18,182,3150,female,2007 -Adelie,Dream,40.8,18.4,195,3900,male,2007 -Adelie,Dream,36,18.5,186,3100,female,2007 -Adelie,Dream,44.1,19.7,196,4400,male,2007 -Adelie,Dream,37,16.9,185,3000,female,2007 -Adelie,Dream,39.6,18.8,190,4600,male,2007 -Adelie,Dream,41.1,19,182,3425,male,2007 -Adelie,Dream,37.5,18.9,179,2975,NA,2007 -Adelie,Dream,36,17.9,190,3450,female,2007 -Adelie,Dream,42.3,21.2,191,4150,male,2007 -Adelie,Biscoe,39.6,17.7,186,3500,female,2008 -Adelie,Biscoe,40.1,18.9,188,4300,male,2008 -Adelie,Biscoe,35,17.9,190,3450,female,2008 -Adelie,Biscoe,42,19.5,200,4050,male,2008 -Adelie,Biscoe,34.5,18.1,187,2900,female,2008 -Adelie,Biscoe,41.4,18.6,191,3700,male,2008 -Adelie,Biscoe,39,17.5,186,3550,female,2008 -Adelie,Biscoe,40.6,18.8,193,3800,male,2008 -Adelie,Biscoe,36.5,16.6,181,2850,female,2008 -Adelie,Biscoe,37.6,19.1,194,3750,male,2008 -Adelie,Biscoe,35.7,16.9,185,3150,female,2008 -Adelie,Biscoe,41.3,21.1,195,4400,male,2008 -Adelie,Biscoe,37.6,17,185,3600,female,2008 -Adelie,Biscoe,41.1,18.2,192,4050,male,2008 -Adelie,Biscoe,36.4,17.1,184,2850,female,2008 -Adelie,Biscoe,41.6,18,192,3950,male,2008 -Adelie,Biscoe,35.5,16.2,195,3350,female,2008 -Adelie,Biscoe,41.1,19.1,188,4100,male,2008 -Adelie,Torgersen,35.9,16.6,190,3050,female,2008 -Adelie,Torgersen,41.8,19.4,198,4450,male,2008 -Adelie,Torgersen,33.5,19,190,3600,female,2008 -Adelie,Torgersen,39.7,18.4,190,3900,male,2008 -Adelie,Torgersen,39.6,17.2,196,3550,female,2008 -Adelie,Torgersen,45.8,18.9,197,4150,male,2008 -Adelie,Torgersen,35.5,17.5,190,3700,female,2008 -Adelie,Torgersen,42.8,18.5,195,4250,male,2008 -Adelie,Torgersen,40.9,16.8,191,3700,female,2008 -Adelie,Torgersen,37.2,19.4,184,3900,male,2008 -Adelie,Torgersen,36.2,16.1,187,3550,female,2008 -Adelie,Torgersen,42.1,19.1,195,4000,male,2008 -Adelie,Torgersen,34.6,17.2,189,3200,female,2008 -Adelie,Torgersen,42.9,17.6,196,4700,male,2008 -Adelie,Torgersen,36.7,18.8,187,3800,female,2008 -Adelie,Torgersen,35.1,19.4,193,4200,male,2008 -Adelie,Dream,37.3,17.8,191,3350,female,2008 -Adelie,Dream,41.3,20.3,194,3550,male,2008 -Adelie,Dream,36.3,19.5,190,3800,male,2008 -Adelie,Dream,36.9,18.6,189,3500,female,2008 -Adelie,Dream,38.3,19.2,189,3950,male,2008 -Adelie,Dream,38.9,18.8,190,3600,female,2008 -Adelie,Dream,35.7,18,202,3550,female,2008 -Adelie,Dream,41.1,18.1,205,4300,male,2008 -Adelie,Dream,34,17.1,185,3400,female,2008 -Adelie,Dream,39.6,18.1,186,4450,male,2008 -Adelie,Dream,36.2,17.3,187,3300,female,2008 -Adelie,Dream,40.8,18.9,208,4300,male,2008 -Adelie,Dream,38.1,18.6,190,3700,female,2008 -Adelie,Dream,40.3,18.5,196,4350,male,2008 -Adelie,Dream,33.1,16.1,178,2900,female,2008 -Adelie,Dream,43.2,18.5,192,4100,male,2008 -Adelie,Biscoe,35,17.9,192,3725,female,2009 -Adelie,Biscoe,41,20,203,4725,male,2009 -Adelie,Biscoe,37.7,16,183,3075,female,2009 -Adelie,Biscoe,37.8,20,190,4250,male,2009 -Adelie,Biscoe,37.9,18.6,193,2925,female,2009 -Adelie,Biscoe,39.7,18.9,184,3550,male,2009 -Adelie,Biscoe,38.6,17.2,199,3750,female,2009 -Adelie,Biscoe,38.2,20,190,3900,male,2009 -Adelie,Biscoe,38.1,17,181,3175,female,2009 -Adelie,Biscoe,43.2,19,197,4775,male,2009 -Adelie,Biscoe,38.1,16.5,198,3825,female,2009 -Adelie,Biscoe,45.6,20.3,191,4600,male,2009 -Adelie,Biscoe,39.7,17.7,193,3200,female,2009 -Adelie,Biscoe,42.2,19.5,197,4275,male,2009 -Adelie,Biscoe,39.6,20.7,191,3900,female,2009 -Adelie,Biscoe,42.7,18.3,196,4075,male,2009 -Adelie,Torgersen,38.6,17,188,2900,female,2009 -Adelie,Torgersen,37.3,20.5,199,3775,male,2009 -Adelie,Torgersen,35.7,17,189,3350,female,2009 -Adelie,Torgersen,41.1,18.6,189,3325,male,2009 -Adelie,Torgersen,36.2,17.2,187,3150,female,2009 -Adelie,Torgersen,37.7,19.8,198,3500,male,2009 -Adelie,Torgersen,40.2,17,176,3450,female,2009 -Adelie,Torgersen,41.4,18.5,202,3875,male,2009 -Adelie,Torgersen,35.2,15.9,186,3050,female,2009 -Adelie,Torgersen,40.6,19,199,4000,male,2009 -Adelie,Torgersen,38.8,17.6,191,3275,female,2009 -Adelie,Torgersen,41.5,18.3,195,4300,male,2009 -Adelie,Torgersen,39,17.1,191,3050,female,2009 -Adelie,Torgersen,44.1,18,210,4000,male,2009 -Adelie,Torgersen,38.5,17.9,190,3325,female,2009 -Adelie,Torgersen,43.1,19.2,197,3500,male,2009 -Adelie,Dream,36.8,18.5,193,3500,female,2009 -Adelie,Dream,37.5,18.5,199,4475,male,2009 -Adelie,Dream,38.1,17.6,187,3425,female,2009 -Adelie,Dream,41.1,17.5,190,3900,male,2009 -Adelie,Dream,35.6,17.5,191,3175,female,2009 -Adelie,Dream,40.2,20.1,200,3975,male,2009 -Adelie,Dream,37,16.5,185,3400,female,2009 -Adelie,Dream,39.7,17.9,193,4250,male,2009 -Adelie,Dream,40.2,17.1,193,3400,female,2009 -Adelie,Dream,40.6,17.2,187,3475,male,2009 -Adelie,Dream,32.1,15.5,188,3050,female,2009 -Adelie,Dream,40.7,17,190,3725,male,2009 -Adelie,Dream,37.3,16.8,192,3000,female,2009 -Adelie,Dream,39,18.7,185,3650,male,2009 -Adelie,Dream,39.2,18.6,190,4250,male,2009 -Adelie,Dream,36.6,18.4,184,3475,female,2009 -Adelie,Dream,36,17.8,195,3450,female,2009 -Adelie,Dream,37.8,18.1,193,3750,male,2009 -Adelie,Dream,36,17.1,187,3700,female,2009 -Adelie,Dream,41.5,18.5,201,4000,male,2009 -Gentoo,Biscoe,46.1,13.2,211,4500,female,2007 -Gentoo,Biscoe,50,16.3,230,5700,male,2007 -Gentoo,Biscoe,48.7,14.1,210,4450,female,2007 -Gentoo,Biscoe,50,15.2,218,5700,male,2007 -Gentoo,Biscoe,47.6,14.5,215,5400,male,2007 -Gentoo,Biscoe,46.5,13.5,210,4550,female,2007 -Gentoo,Biscoe,45.4,14.6,211,4800,female,2007 -Gentoo,Biscoe,46.7,15.3,219,5200,male,2007 -Gentoo,Biscoe,43.3,13.4,209,4400,female,2007 -Gentoo,Biscoe,46.8,15.4,215,5150,male,2007 -Gentoo,Biscoe,40.9,13.7,214,4650,female,2007 -Gentoo,Biscoe,49,16.1,216,5550,male,2007 -Gentoo,Biscoe,45.5,13.7,214,4650,female,2007 -Gentoo,Biscoe,48.4,14.6,213,5850,male,2007 -Gentoo,Biscoe,45.8,14.6,210,4200,female,2007 -Gentoo,Biscoe,49.3,15.7,217,5850,male,2007 -Gentoo,Biscoe,42,13.5,210,4150,female,2007 -Gentoo,Biscoe,49.2,15.2,221,6300,male,2007 -Gentoo,Biscoe,46.2,14.5,209,4800,female,2007 -Gentoo,Biscoe,48.7,15.1,222,5350,male,2007 -Gentoo,Biscoe,50.2,14.3,218,5700,male,2007 -Gentoo,Biscoe,45.1,14.5,215,5000,female,2007 -Gentoo,Biscoe,46.5,14.5,213,4400,female,2007 -Gentoo,Biscoe,46.3,15.8,215,5050,male,2007 -Gentoo,Biscoe,42.9,13.1,215,5000,female,2007 -Gentoo,Biscoe,46.1,15.1,215,5100,male,2007 -Gentoo,Biscoe,44.5,14.3,216,4100,NA,2007 -Gentoo,Biscoe,47.8,15,215,5650,male,2007 -Gentoo,Biscoe,48.2,14.3,210,4600,female,2007 -Gentoo,Biscoe,50,15.3,220,5550,male,2007 -Gentoo,Biscoe,47.3,15.3,222,5250,male,2007 -Gentoo,Biscoe,42.8,14.2,209,4700,female,2007 -Gentoo,Biscoe,45.1,14.5,207,5050,female,2007 -Gentoo,Biscoe,59.6,17,230,6050,male,2007 -Gentoo,Biscoe,49.1,14.8,220,5150,female,2008 -Gentoo,Biscoe,48.4,16.3,220,5400,male,2008 -Gentoo,Biscoe,42.6,13.7,213,4950,female,2008 -Gentoo,Biscoe,44.4,17.3,219,5250,male,2008 -Gentoo,Biscoe,44,13.6,208,4350,female,2008 -Gentoo,Biscoe,48.7,15.7,208,5350,male,2008 -Gentoo,Biscoe,42.7,13.7,208,3950,female,2008 -Gentoo,Biscoe,49.6,16,225,5700,male,2008 -Gentoo,Biscoe,45.3,13.7,210,4300,female,2008 -Gentoo,Biscoe,49.6,15,216,4750,male,2008 -Gentoo,Biscoe,50.5,15.9,222,5550,male,2008 -Gentoo,Biscoe,43.6,13.9,217,4900,female,2008 -Gentoo,Biscoe,45.5,13.9,210,4200,female,2008 -Gentoo,Biscoe,50.5,15.9,225,5400,male,2008 -Gentoo,Biscoe,44.9,13.3,213,5100,female,2008 -Gentoo,Biscoe,45.2,15.8,215,5300,male,2008 -Gentoo,Biscoe,46.6,14.2,210,4850,female,2008 -Gentoo,Biscoe,48.5,14.1,220,5300,male,2008 -Gentoo,Biscoe,45.1,14.4,210,4400,female,2008 -Gentoo,Biscoe,50.1,15,225,5000,male,2008 -Gentoo,Biscoe,46.5,14.4,217,4900,female,2008 -Gentoo,Biscoe,45,15.4,220,5050,male,2008 -Gentoo,Biscoe,43.8,13.9,208,4300,female,2008 -Gentoo,Biscoe,45.5,15,220,5000,male,2008 -Gentoo,Biscoe,43.2,14.5,208,4450,female,2008 -Gentoo,Biscoe,50.4,15.3,224,5550,male,2008 -Gentoo,Biscoe,45.3,13.8,208,4200,female,2008 -Gentoo,Biscoe,46.2,14.9,221,5300,male,2008 -Gentoo,Biscoe,45.7,13.9,214,4400,female,2008 -Gentoo,Biscoe,54.3,15.7,231,5650,male,2008 -Gentoo,Biscoe,45.8,14.2,219,4700,female,2008 -Gentoo,Biscoe,49.8,16.8,230,5700,male,2008 -Gentoo,Biscoe,46.2,14.4,214,4650,NA,2008 -Gentoo,Biscoe,49.5,16.2,229,5800,male,2008 -Gentoo,Biscoe,43.5,14.2,220,4700,female,2008 -Gentoo,Biscoe,50.7,15,223,5550,male,2008 -Gentoo,Biscoe,47.7,15,216,4750,female,2008 -Gentoo,Biscoe,46.4,15.6,221,5000,male,2008 -Gentoo,Biscoe,48.2,15.6,221,5100,male,2008 -Gentoo,Biscoe,46.5,14.8,217,5200,female,2008 -Gentoo,Biscoe,46.4,15,216,4700,female,2008 -Gentoo,Biscoe,48.6,16,230,5800,male,2008 -Gentoo,Biscoe,47.5,14.2,209,4600,female,2008 -Gentoo,Biscoe,51.1,16.3,220,6000,male,2008 -Gentoo,Biscoe,45.2,13.8,215,4750,female,2008 -Gentoo,Biscoe,45.2,16.4,223,5950,male,2008 -Gentoo,Biscoe,49.1,14.5,212,4625,female,2009 -Gentoo,Biscoe,52.5,15.6,221,5450,male,2009 -Gentoo,Biscoe,47.4,14.6,212,4725,female,2009 -Gentoo,Biscoe,50,15.9,224,5350,male,2009 -Gentoo,Biscoe,44.9,13.8,212,4750,female,2009 -Gentoo,Biscoe,50.8,17.3,228,5600,male,2009 -Gentoo,Biscoe,43.4,14.4,218,4600,female,2009 -Gentoo,Biscoe,51.3,14.2,218,5300,male,2009 -Gentoo,Biscoe,47.5,14,212,4875,female,2009 -Gentoo,Biscoe,52.1,17,230,5550,male,2009 -Gentoo,Biscoe,47.5,15,218,4950,female,2009 -Gentoo,Biscoe,52.2,17.1,228,5400,male,2009 -Gentoo,Biscoe,45.5,14.5,212,4750,female,2009 -Gentoo,Biscoe,49.5,16.1,224,5650,male,2009 -Gentoo,Biscoe,44.5,14.7,214,4850,female,2009 -Gentoo,Biscoe,50.8,15.7,226,5200,male,2009 -Gentoo,Biscoe,49.4,15.8,216,4925,male,2009 -Gentoo,Biscoe,46.9,14.6,222,4875,female,2009 -Gentoo,Biscoe,48.4,14.4,203,4625,female,2009 -Gentoo,Biscoe,51.1,16.5,225,5250,male,2009 -Gentoo,Biscoe,48.5,15,219,4850,female,2009 -Gentoo,Biscoe,55.9,17,228,5600,male,2009 -Gentoo,Biscoe,47.2,15.5,215,4975,female,2009 -Gentoo,Biscoe,49.1,15,228,5500,male,2009 -Gentoo,Biscoe,47.3,13.8,216,4725,NA,2009 -Gentoo,Biscoe,46.8,16.1,215,5500,male,2009 -Gentoo,Biscoe,41.7,14.7,210,4700,female,2009 -Gentoo,Biscoe,53.4,15.8,219,5500,male,2009 -Gentoo,Biscoe,43.3,14,208,4575,female,2009 -Gentoo,Biscoe,48.1,15.1,209,5500,male,2009 -Gentoo,Biscoe,50.5,15.2,216,5000,female,2009 -Gentoo,Biscoe,49.8,15.9,229,5950,male,2009 -Gentoo,Biscoe,43.5,15.2,213,4650,female,2009 -Gentoo,Biscoe,51.5,16.3,230,5500,male,2009 -Gentoo,Biscoe,46.2,14.1,217,4375,female,2009 -Gentoo,Biscoe,55.1,16,230,5850,male,2009 -Gentoo,Biscoe,44.5,15.7,217,4875,NA,2009 -Gentoo,Biscoe,48.8,16.2,222,6000,male,2009 -Gentoo,Biscoe,47.2,13.7,214,4925,female,2009 -Gentoo,Biscoe,NA,NA,NA,NA,NA,2009 -Gentoo,Biscoe,46.8,14.3,215,4850,female,2009 -Gentoo,Biscoe,50.4,15.7,222,5750,male,2009 -Gentoo,Biscoe,45.2,14.8,212,5200,female,2009 -Gentoo,Biscoe,49.9,16.1,213,5400,male,2009 -Chinstrap,Dream,46.5,17.9,192,3500,female,2007 -Chinstrap,Dream,50,19.5,196,3900,male,2007 -Chinstrap,Dream,51.3,19.2,193,3650,male,2007 -Chinstrap,Dream,45.4,18.7,188,3525,female,2007 -Chinstrap,Dream,52.7,19.8,197,3725,male,2007 -Chinstrap,Dream,45.2,17.8,198,3950,female,2007 -Chinstrap,Dream,46.1,18.2,178,3250,female,2007 -Chinstrap,Dream,51.3,18.2,197,3750,male,2007 -Chinstrap,Dream,46,18.9,195,4150,female,2007 -Chinstrap,Dream,51.3,19.9,198,3700,male,2007 -Chinstrap,Dream,46.6,17.8,193,3800,female,2007 -Chinstrap,Dream,51.7,20.3,194,3775,male,2007 -Chinstrap,Dream,47,17.3,185,3700,female,2007 -Chinstrap,Dream,52,18.1,201,4050,male,2007 -Chinstrap,Dream,45.9,17.1,190,3575,female,2007 -Chinstrap,Dream,50.5,19.6,201,4050,male,2007 -Chinstrap,Dream,50.3,20,197,3300,male,2007 -Chinstrap,Dream,58,17.8,181,3700,female,2007 -Chinstrap,Dream,46.4,18.6,190,3450,female,2007 -Chinstrap,Dream,49.2,18.2,195,4400,male,2007 -Chinstrap,Dream,42.4,17.3,181,3600,female,2007 -Chinstrap,Dream,48.5,17.5,191,3400,male,2007 -Chinstrap,Dream,43.2,16.6,187,2900,female,2007 -Chinstrap,Dream,50.6,19.4,193,3800,male,2007 -Chinstrap,Dream,46.7,17.9,195,3300,female,2007 -Chinstrap,Dream,52,19,197,4150,male,2007 -Chinstrap,Dream,50.5,18.4,200,3400,female,2008 -Chinstrap,Dream,49.5,19,200,3800,male,2008 -Chinstrap,Dream,46.4,17.8,191,3700,female,2008 -Chinstrap,Dream,52.8,20,205,4550,male,2008 -Chinstrap,Dream,40.9,16.6,187,3200,female,2008 -Chinstrap,Dream,54.2,20.8,201,4300,male,2008 -Chinstrap,Dream,42.5,16.7,187,3350,female,2008 -Chinstrap,Dream,51,18.8,203,4100,male,2008 -Chinstrap,Dream,49.7,18.6,195,3600,male,2008 -Chinstrap,Dream,47.5,16.8,199,3900,female,2008 -Chinstrap,Dream,47.6,18.3,195,3850,female,2008 -Chinstrap,Dream,52,20.7,210,4800,male,2008 -Chinstrap,Dream,46.9,16.6,192,2700,female,2008 -Chinstrap,Dream,53.5,19.9,205,4500,male,2008 -Chinstrap,Dream,49,19.5,210,3950,male,2008 -Chinstrap,Dream,46.2,17.5,187,3650,female,2008 -Chinstrap,Dream,50.9,19.1,196,3550,male,2008 -Chinstrap,Dream,45.5,17,196,3500,female,2008 -Chinstrap,Dream,50.9,17.9,196,3675,female,2009 -Chinstrap,Dream,50.8,18.5,201,4450,male,2009 -Chinstrap,Dream,50.1,17.9,190,3400,female,2009 -Chinstrap,Dream,49,19.6,212,4300,male,2009 -Chinstrap,Dream,51.5,18.7,187,3250,male,2009 -Chinstrap,Dream,49.8,17.3,198,3675,female,2009 -Chinstrap,Dream,48.1,16.4,199,3325,female,2009 -Chinstrap,Dream,51.4,19,201,3950,male,2009 -Chinstrap,Dream,45.7,17.3,193,3600,female,2009 -Chinstrap,Dream,50.7,19.7,203,4050,male,2009 -Chinstrap,Dream,42.5,17.3,187,3350,female,2009 -Chinstrap,Dream,52.2,18.8,197,3450,male,2009 -Chinstrap,Dream,45.2,16.6,191,3250,female,2009 -Chinstrap,Dream,49.3,19.9,203,4050,male,2009 -Chinstrap,Dream,50.2,18.8,202,3800,male,2009 -Chinstrap,Dream,45.6,19.4,194,3525,female,2009 -Chinstrap,Dream,51.9,19.5,206,3950,male,2009 -Chinstrap,Dream,46.8,16.5,189,3650,female,2009 -Chinstrap,Dream,45.7,17,195,3650,female,2009 -Chinstrap,Dream,55.8,19.8,207,4000,male,2009 -Chinstrap,Dream,43.5,18.1,202,3400,female,2009 -Chinstrap,Dream,49.6,18.2,193,3775,male,2009 -Chinstrap,Dream,50.8,19,210,4100,male,2009 -Chinstrap,Dream,50.2,18.7,198,3775,female,2009 +express_editor_tabs("apps/comp-streamlit/slider-update") ``` ::: @@ -1194,26 +258,21 @@ st.pyplot(dist_plot(filt_df)) ``` -## Changing the button style +# Customizing UI -Some common web development tasks are quite difficult in Streamlit. -For example, let's say we want to change the color of one button without changing the colors of any other buttons in our app. -The UI structure that you use to define your Shiny app is designed to work seamlessly with CSS and JavaScript, so all that's required to change the button color is to pass a `style` argument with CSS attributes. -In addition to including inline CSS like this, you can add a CSS class to any element, or include global CSS or JavaScript assets using `include_css()` or `include_js()`. +Shiny embraces [UI as HTML](ui-html.qmd), and as a result it's relatively easy to implement bespoke [UI customizations](ui-customize.html). +For example, lets change the color of one button without changing the colors of any other buttons in our app. +Since Shiny allows you to add HTML attributes like `class`/`style`, and provides a CSS framework ([Bootstrap](https://getbootstrap.com/docs/5.3/getting-started/introduction/)), we can make primary button by just adding an appropriate `class` attribute. -```{.python} -from shiny import * - -app_ui = ui.page_fluid( - ui.input_action_button( - "red", - "Red Button", - style="background: red", - ), - ui.input_action_button("gray", "Gray Button"), -) - -app = App(app_ui, None) +```{shinylive-python} +#| standalone: true +#| components: [editor, viewer] +#| layout: vertical +#| viewerHeight: 100 +from shiny.express import ui + +ui.input_action_button("default", "Default Button") +ui.input_action_button("primary", "Primary Button", class_="btn-outline-primary") ``` You might not need to customize the CSS of your app that often, but it's important to have the option if your application calls for it. @@ -1250,7 +309,7 @@ def ChangeButtonColour(widget_label, font_color, background_color="transparent") ChangeButtonColour("red", "white", "red") ``` -Despite its complexity, this is the best way to change the style of an individual element in Streamlit +Despite its complexity, this is the best way to change the style of an individual element in Streamlit. How this pattern works is: - Return an empty html component with a script tag @@ -1271,14 +330,14 @@ Streamlit collects [user information](https://docs.streamlit.io/library/advanced The data is sent to a American server owned by Snowflake so that the company can analyze user behavior. This can cause legal and security problems because your application may be subject to data governance policies which forbid this type of data collection. For example, if your users do not explicitly provide consent to transfer data to a US company, sending data to Snowflake might be a [GDPR violation](https://github.com/streamlit/streamlit/issues/4747). -In order to prevent data collection you need to set `gatherUsageStats = false` in your Streamlit config file, which is an easy thing to forget to include in a given Streamlit deployment. +In order to prevent data collection you need to set `gatherUsageStats = false` in your Streamlit config file, which is an easy thing to forget to include in a given Streamlit deployment. Shiny does not collect or report user data of any kind, and it never will. -We do not believe that open-source tools should collect user data without explicit consent. +We do not believe that open-source tools should collect user data without explicit consent. # Conclusion -Shiny requires you to use a bit more structure initially than you might using Streamlit, but the payoff of that structure is that your application is much more robust and extensible. +Shiny allows you to build much more performant and extensible applications than Streamlit. The patterns that you use to build a simple Shiny application are the same ones that you use to build a complex one, and you never need to change your mental model of how the application works. This design will let your application grow along with the scope of your problem, and you can have confidence that the framework has the tools that you need to handle almost any requirement. diff --git a/docs/custom-component-one-off.qmd b/docs/custom-component-one-off.qmd index 7a6e122d..0db48645 100644 --- a/docs/custom-component-one-off.qmd +++ b/docs/custom-component-one-off.qmd @@ -15,7 +15,7 @@ The code shown here is simplified to get the point across, but before you use it # The problem -You found a new table library that you really want to use in your Shiny app. The library is [Tabulator](https://tabulator.info/), which is a JavaScript library for making tables with data. But there's a problem: there's no way to easily use it from a Shiny app. To do this, we'll need to write some Python code that will let us use the library from the Python side of Shiny, and wrap the library's JavaScript code to make it talk to JavaScript side of Shiny. +You found a new table library that you really want to use in your Shiny app. The library is [Tabulator](https://tabulator.info/), which is a JavaScript library for making tables with data. But there's a problem: there's (currently) no way to easily use it from a Shiny app. To do this, we'll need to write some Python code that will let us use the library from the Python side of Shiny, and wrap the library's JavaScript code to make it talk to JavaScript side of Shiny. # The solution @@ -46,7 +46,7 @@ tabulator/ Both `tabulator_esm.min.js` and `tabulator.min.css` are downloaded from [tabulator's website.](https://tabulator.info/docs/5.5/install#sources-download) `tableComponent.js` is the script that we will write that contains the code for rendering the table to our Shiny app. :::{.callout-note} -The code in this article will be abbreviated to show the relevant parts. If you want to see the full code, see the [accompanying repo.](https://github.com/posit-dev/pyshiny-output-binding-example) +The code in this article will be abbreviated to show the relevant parts. If you want to see the full code, see the [accompanying repo.](https://github.com/posit-dev/py-shiny-output-binding-example) ::: @@ -157,14 +157,14 @@ if (Shiny) { ``` ::: -To see the full JavaScript code, see `tabulator/tableComponent.js` in the [accompanying repo.](https://github.com/posit-dev/pyshiny-output-binding-example/blob/main/tabulator/tableComponent.js) +To see the full JavaScript code, see `tabulator/tableComponent.js` in the [accompanying repo.](https://github.com/posit-dev/py-shiny-output-binding-example/blob/main/tabulator/tableComponent.js) ## The `output_tabulator()` function Next we need an HTML element to target with our JavaScript code. When we set up [the find method](#the-find-method) for our binding, we chose the class `shiny-tabulator-output` as the mark of a tabualtor output, so we need to add that class. We also need to allow the user to set the ID of the element so that Shiny knows which element to target with which output. By wrapping the `id` argument in `resolve_id()` we make sure it will work in the context of modules. We'll also add a height argument so that the user can set the height of the table. ```{.python filename="app.py"} -from shiny import ui, App +from shiny import App, Inputs, ui from shiny.module import resolve_id from htmltools import HTMLDependency @@ -190,7 +190,7 @@ def output_tabulator(id, height="200px"): :::{.callout-note} -We use the `HTMLDependency` function to bind up the assets needed for tabulator that we made in the previous step to make sure th at they're included in our app whenever the `output_tabulator()` function is called (but not more than once). +We use the `HTMLDependency` function to bind up the assets needed for tabulator that we made in the previous step to make sure that they're included in our app whenever the `output_tabulator()` function is called (but not more than once). Note the use of `all_files=True` here. This makes it so we can do the ESM import of the Tabulator library. Otherwise `tabulator_esm.min.js` would not be hosted and the JS library wouldn't be able to find it. ::: @@ -203,74 +203,66 @@ Now we've got the client-side logic finished, we need to write a custom render d A render function's job is to take the result of calling the decorated function, transform it into the format our client-side code wants (in many cases this may be as simple as just returning the object unchanged), and then returning that client-side friendly data which will be passed to our client's `renderValue()` method. -To do this we can leverage some tools provided by Shiny in the `shiny.render.transformer` subpackage. +To do this we can leverage some tools provided by Shiny in the `shiny.render.renderer` subpackage. ```{.python filename="app.py"} -from shiny.render.transformer import ( - output_transformer, - resolve_value_fn, - TransformerMetadata, - ValueFn, -) - - -@output_transformer -async def render_tabulator( - _meta: TransformerMetadata, - _fn: ValueFn[pd.DataFrame | None], -): - res = await resolve_value_fn(_fn) - if res is None: - return None - - if not isinstance(res, pd.DataFrame): - # Throw an error if the value is not a dataframe - raise TypeError(f"Expected a pandas.DataFrame, got {type(res)}. ") - - # Get data from dataframe as a list of lists where each inner list is a - # row, column names as array of strings and types of each column as an - # array of strings - return { - "data": res.values.tolist(), - "columns": res.columns.tolist(), - "type_hints": res.dtypes.astype(str).tolist(), - } +from shiny.render.renderer import Jsonifiable, Renderer + + +class render_tabulator(Renderer[pd.DataFrame]): + """ + Render a pandas dataframe as a tabulator table. + """ + + def auto_output_ui(self): + """ + Express UI for the tabulator renderer + """ + return ui.output_tabulator(self.output_name) + + async def transform(self, value: pd.DataFrame) -> Jsonifiable: + """ + Transform a pandas dataframe into a JSONifiable object that can be + passed to the tabulator HTML dependency. + """ + if not isinstance(value, pd.DataFrame): + # Throw an error if the value is not a dataframe + raise TypeError(f"Expected a pandas.DataFrame, got {type(value)}. ") + + # Get data from dataframe as a list of lists where each inner list is a + # row, column names as array of strings and types of each column as an + # array of strings + return { + "data": value.values.tolist(), + "columns": value.columns.tolist(), + "type_hints": value.dtypes.astype(str).tolist(), + } ``` :::{.callout-note} In the code above we use types so that we can get some type checking in our IDE, but these are not required. ::: -The `output_transformer` decorator is a decorator factory (it's a decorator that creates decorators!) that takes a function that returns a dictionary of data to be passed to the client side. The function that it decorates is passed two arguments: `_meta` and `_fn`. +An implementation of `Renderer` produces a class which is intended to be used as a decorator, which is why a `render_*` naming convention is recommended. An implementation requires at least 3 things: (1) `auto_output_ui`, (2) either a `transform` or `render` function, and (3) an value type for the `Renderer` class. -`_meta` is a dictionary of metadata about the function that is being decorated. We don't use it in our example. +Here, the value type we've used is `pd.DataFrame`, which helps users know if they've returned a suitable object in their render function. -`_fn` is the decorated function, i.e. the function that goes below the `@render_tabulator()` decorator in your app's server code. In this case we are expecting the function to return either a pandas dataframe or `None`. - - -```{.python} -... - res = await resolve_value_fn(_fn) -... -``` - -`resolve_value_fn()` is a helper provided in `shiny.render.transformer` for resolving the value of a function that may or may not be async. +The `auto_output_ui()` method is used to generate the UI for the output if the renderer were to be used in Express mode. In this case we just use the `output_tabulator()` function we wrote earlier. +Finally, renderers use either the `transform(self, value: IT)` or `render(self)` methods to retrieve and transform the result of an output value function into an object that can be sent to the client. `render_tabulator`'s `transform` method returns a dictionary of data (which is JSON-like, e.g. `Jsonifiable`) to be passed to the client side. The `transform` method is called when the output value function returns a non-`None` value. If the value is `None`, the `render` method quits early, returning `None`. :::{.callout-note} -# Why an asynchronous function? -It is required by Shiny that the output decorator function be `async`. This allows users of the render bindings to provide either synchronous or asynchronous functions to the decorator. This ensures that the function will work whether or not the end user has defined their render function asynchronously. - -If you don't need any async behavior you can simply write your function as you would a standard synchronous function after `await`ing `resolve_value_fn()`. +# Why an asynchronous `transform` function? +It is required by Shiny `Renderer` that the `transform` be `async`. This allows for asynchronous transformations to occur even if the output value function is synchronous. By providing an async function, `Renderer` can then handle either an async or sync function provided by the user. ::: -Next, we check to make sure that the value returned by the function is a dataframe. If it's not, we throw an error. This is not strictly required, but is a best practice. +When first transforming an output value, we check to make sure that the value returned by the function is a dataframe. If it's not, we throw an error. This is not required, but it's good practice to do so. ```python ... -if not isinstance(res, pd.DataFrame): +if not isinstance(value, pd.DataFrame): # Throw an error if the value is not a dataframe - raise TypeError(f"Expected a pandas.DataFrame, got {type(res)}. ") + raise TypeError(f"Expected a pandas.DataFrame, got {type(value)}. ") ... ``` @@ -279,9 +271,9 @@ Finally, we return a dictionary of data that we want to pass to the client side. ```python ... return { - "data": res.values.tolist(), - "columns": res.columns.tolist(), - "type_hints": res.dtypes.astype(str).tolist(), + "data": value.values.tolist(), + "columns": value.columns.tolist(), + "type_hints": value.dtypes.astype(str).tolist(), } ... ``` @@ -292,14 +284,36 @@ This returned value is then what gets sent to the client side and is available i Now we have all the components neccesary to use our tabulator output component. Here's an app that uses it to render some number of rows of the indomitable `mtcars` dataset. +::: {.panel-tabset .panel-pills .border-0 .justify-content-center} + +### Express + ```{.python filename="app.py"} -from shiny import ui, App from pathlib import Path import pandas as pd +from shiny.express import input, ui # Code for the custom output ... +# App code +ui.input_slider("n", "Number of rows to show", 1, 20, 10) + +@render_tabulator +def tabulatorTable(): + return pd.read_csv(Path(__file__).parent / "mtcars.csv").head(input.n()) +``` + +### Core + +```{.python filename="app.py"} +from pathlib import Path +import pandas as pd +from shiny import App, Inputs, ui + +# Code for the custom output: output_tabulator and render_tabulator +... + # App code app_ui = ui.page_fluid( ui.input_slider("n", "Number of rows to show", 1, 20, 10), @@ -307,15 +321,20 @@ app_ui = ui.page_fluid( ) -def server(input, output, session): +def server(input: Inputs): @render_tabulator def tabulatorTable(): - return pd.read_csv(Path(__file__).parent / "mtcars.csv").head(input.n()) + csv_file = Path(__file__).parent / "mtcars.csv" + return pd.read_csv(csv_file).head(input.n()) app = App(app_ui, server) ``` +::: + + + Which results in the following app: @@ -359,4 +378,4 @@ Which results in the following app: ::: -To see the full app script, see `app.py` in the accompanying repo for this post [here.](https://github.com/posit-dev/pyshiny-output-binding-example/blob/main/app.py) +To see the full app script, see `app.py` in the accompanying repo for this post [here.](https://github.com/posit-dev/py-shiny-output-binding-example/blob/main/app.py) diff --git a/docs/custom-components-pkg.qmd b/docs/custom-components-pkg.qmd index 5dd781a4..f7f14e7d 100644 --- a/docs/custom-components-pkg.qmd +++ b/docs/custom-components-pkg.qmd @@ -272,7 +272,7 @@ This is the actual UI function for our component. Aka the one that gets called b Because `makeReactInput()` [works by creating a webcomponent](#srctsindex.tsx), to render our input we just need to pass the tag name we set up in the `tagName` argument to `makeReactInput().` Next, we pass the `fancy_color_picker_deps` html dependency we just made and the ID of the binding and we’re good to go! ::: {.callout-note} -By using the `resolve_id(id)` function here when declaring our ID, we make sure that the component works [Shiny modules](docs/workflow-modules) where the ID of the component needs to be prefixed with the module name. +By using the `resolve_id(id)` function here when declaring our ID, we make sure that the component works [Shiny modules](modules.qmd) where the ID of the component needs to be prefixed with the module name. ::: @@ -282,22 +282,26 @@ By using the `resolve_id(id)` function here when declaring our ID, we make sure Like with the JavaScript, the process for setting up the python code for an output binding is not too different. Although there is a bit of extra work because we need to build both the ui _and_ server components. Here's how we would do that for the color shower output binding we defined above: ```{.python filename="fancy_color_picker.py"} -@output_transformer() -async def render_color( - _meta: TransformerMetadata, - _fn: ValueFn[str | None], -): - res = await resolve_value_fn(_fn) - if res is None: - return None +from shiny.render.renderer import Renderer, Jsonifiable - if not isinstance(res, str): - # Throw an error if the value is not a string - raise TypeError(f"Expected a string, got {type(res)}. ") +class render_color(Renderer[str]): + """ + Render a color + """ + + # Express mode UI + def auto_output_ui(self, id: str) -> Tag: + return output_color(self.output_id) - # Send the results to the client. Make sure that this is a serializable - # object and matches what is expected in the JavaScript code. - return {"value": res} + # Transform the app value into a JSONifiable object + async def transform(self, value: str) -> Jsonifiable: + if not isinstance(res, str): + # Throw an error if the value is not a string + raise TypeError(f"Expected a string, got {type(res)}. ") + + # Send the results to the client. Make sure that this is a serializable + # object and matches what is expected in the JavaScript code. + return {"value": value} def output_color(id: str): @@ -338,6 +342,23 @@ This file is used to configure typescript, which we are using to write our compo ### `example-app/app.py` +::: {.panel-tabset .panel-pills .border-0 .justify-content-center} + +#### Express + +```{.python} +from fancy_color_picker import fancy_color_picker +from shiny.express import render + +fancy_color_picker("myComponent") + +@render.text +def valueOut(): + return f"Value from input is {input.myComponent()}" +``` + +#### Core + ```{.python} from fancy_color_picker import fancy_color_picker @@ -356,6 +377,7 @@ def server(input, output, session): app = App(app_ui, server) ``` +::: This is a simple example app that can be used to test the component while developing. It uses the `fancy_color_picker` function we defined in `fancy_color_picker.py` to add the component to the app. It also uses the `render.text` decorator to render the value of the input to the page. @@ -369,6 +391,23 @@ This is a simple example app that can be used to test the component while develo In our output binding example we defined an output that conveniently _displays_ colors. If we were packaging up two components like this we could/should modify the example app to showcase both of them. +::: {.panel-tabset .panel-pills .border-0 .justify-content-center} + +#### Express + +```{.python filename="app.py"} +from fancy_color_picker import fancy_color_picker, render_color +import shiny.express + +fancy_color_picker("myComponent") + +@render_color +def myColor(): + return input.myComponent() +``` + +#### Core + ```{.python filename="app.py"} from fancy_color_picker import fancy_color_picker, output_color, render_color @@ -389,6 +428,8 @@ app = App(app_ui, server) ::: +::: +