From f9a06031a3e12923451c198865440057f07964b9 Mon Sep 17 00:00:00 2001 From: John Harrold Date: Wed, 27 Nov 2024 16:46:10 -0800 Subject: [PATCH] Added Word placeholders to ASM_preload(). Created vignette to describe how to load data into the app. Created is_shiny() function. --- NEWS.md | 10 +- R/ASM_Server.R | 44 ++- _pkgdown.yml | 2 + docs/404.html | 1 + docs/LICENSE-text.html | 1 + docs/articles/included_modules.html | 45 +-- docs/articles/index.html | 3 + docs/articles/making_modules.html | 5 + docs/articles/preload.html | 227 ++++++++++++++ docs/articles/run_workflow.png | Bin 0 -> 19732 bytes docs/authors.html | 1 + docs/index.html | 1 + docs/news/index.html | 10 +- docs/pkgdown.yml | 3 +- docs/reference/ASM_Server.html | 55 +++- docs/reference/ASM_fetch_code.html | 5 + docs/reference/ASM_fetch_dlfn.html | 5 + docs/reference/ASM_fetch_state.html | 15 +- docs/reference/ASM_init_state.html | 9 +- docs/reference/ASM_load_state.html | 11 +- docs/reference/ASM_mk_preload.html | 5 + docs/reference/ASM_onload.html | 1 + docs/reference/ASM_preload.html | 1 + docs/reference/ASM_read_app_state.html | 1 + docs/reference/ASM_save_state.html | 7 +- docs/reference/ASM_test_mksession.html | 5 + docs/reference/DW_Server.html | 55 +++- docs/reference/DW_add_wrangling_element.html | 5 + docs/reference/DW_append_report.html | 5 + docs/reference/DW_attach_ds.html | 5 + docs/reference/DW_fetch_code.html | 5 + docs/reference/DW_fetch_current_view.html | 5 + docs/reference/DW_fetch_ds.html | 5 + docs/reference/DW_fetch_state.html | 5 + docs/reference/DW_hasds.html | 5 + docs/reference/DW_init_state.html | 9 +- docs/reference/DW_mk_preload.html | 5 + docs/reference/DW_new_view.html | 5 + docs/reference/DW_preload.html | 1 + docs/reference/DW_set_current_view.html | 5 + docs/reference/DW_test_mksession.html | 5 + docs/reference/DW_update_checksum.html | 5 + docs/reference/FG_Server.html | 55 +++- docs/reference/FG_append_report.html | 9 +- docs/reference/FG_build.html | 13 +- docs/reference/FG_extract_page.html | 13 +- docs/reference/FG_fetch_code.html | 9 +- docs/reference/FG_fetch_current_fig.html | 13 +- docs/reference/FG_fetch_state.html | 5 +- docs/reference/FG_init_state.html | 5 +- docs/reference/FG_mk_preload.html | 9 +- docs/reference/FG_new_fig.html | 13 +- docs/reference/FG_preload.html | 1 + docs/reference/FG_set_current_fig.html | 13 +- docs/reference/FG_test_mksession.html | 9 +- docs/reference/FG_update_checksum.html | 11 +- docs/reference/FM_add_ui_tooltip.html | 1 + docs/reference/FM_app_preload.html | 1 + docs/reference/FM_build_comment.html | 1 + docs/reference/FM_fetch_app_code.html | 5 + docs/reference/FM_fetch_app_info.html | 297 ++++++++++--------- docs/reference/FM_fetch_app_state.html | 47 ++- docs/reference/FM_fetch_current_mods.html | 1 + docs/reference/FM_fetch_data_format.html | 5 + docs/reference/FM_fetch_deps.html | 5 + docs/reference/FM_fetch_ds.html | 5 + docs/reference/FM_fetch_log_path.html | 7 +- docs/reference/FM_fetch_mdl.html | 5 + docs/reference/FM_fetch_mod_state.html | 5 + docs/reference/FM_fetch_user_files_path.html | 7 +- docs/reference/FM_generate_report.html | 1 + docs/reference/FM_init_state.html | 29 +- docs/reference/FM_le.html | 5 + docs/reference/FM_message.html | 1 + docs/reference/FM_mk_app_preload.html | 1 + docs/reference/FM_mk_error_fig.html | 1 + docs/reference/FM_notify.html | 1 + docs/reference/FM_pause_screen.html | 5 + docs/reference/FM_pretty_sort.html | 1 + docs/reference/FM_proc_include.html | 5 + docs/reference/FM_reset_app.html | 5 + docs/reference/FM_resume_screen.html | 5 + docs/reference/FM_set_app_state.html | 5 + docs/reference/FM_set_mod_state.html | 47 ++- docs/reference/FM_set_notification.html | 1 + docs/reference/FM_set_ui_msg.html | 5 + docs/reference/FM_tc.html | 1 + docs/reference/UD_Server.html | 55 +++- docs/reference/UD_attach_ds.html | 31 +- docs/reference/UD_ds_read.html | 5 + docs/reference/UD_fetch_code.html | 5 + docs/reference/UD_fetch_ds.html | 5 + docs/reference/UD_fetch_state.html | 5 + docs/reference/UD_init_state.html | 29 +- docs/reference/UD_mk_preload.html | 5 + docs/reference/UD_preload.html | 1 + docs/reference/UD_test_mksession.html | 5 + docs/reference/autocast.html | 1 + docs/reference/dw_eval_element.html | 5 + docs/reference/dwrs_builder.html | 5 + docs/reference/fers_builder.html | 9 +- docs/reference/fetch_hold.html | 5 + docs/reference/fetch_package_version.html | 1 + docs/reference/formods.html | 1 + docs/reference/formods_check.html | 1 + docs/reference/has_changed.html | 1 + docs/reference/has_updated.html | 1 + docs/reference/icon_link.html | 1 + docs/reference/index.html | 1 + docs/reference/is_installed.html | 1 + docs/reference/is_shiny.html | 1 + docs/reference/linspace.html | 1 + docs/reference/new_module_template.html | 21 +- docs/reference/remove_hold.html | 5 + docs/reference/render_str.html | 1 + docs/reference/set_hold.html | 5 + docs/reference/unfactor.html | 1 + docs/reference/use_formods.html | 1 + docs/search.json | 2 +- docs/sitemap.xml | 1 + inst/preload/ASM_preload.yaml | 7 + inst/templates/FM_compact.R | 54 +++- inst/test_apps/FM_compact.R | 54 +++- man/ASM_Server.Rd | 54 +++- man/DW_Server.Rd | 54 +++- man/FG_Server.Rd | 54 +++- man/UD_Server.Rd | 54 +++- vignettes/preload.Rmd | 131 ++++++++ vignettes/run_workflow.png | Bin 0 -> 19732 bytes 129 files changed, 1554 insertions(+), 418 deletions(-) create mode 100644 docs/articles/preload.html create mode 100644 docs/articles/run_workflow.png create mode 100644 vignettes/preload.Rmd create mode 100644 vignettes/run_workflow.png diff --git a/NEWS.md b/NEWS.md index c52f329..eb15d97 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,15 +1,19 @@ # formods 0.2.0 (development version) -* Created preload functionality to allow modules to save to and be loaded from yaml files +* Created preload functionality to allow modules to save to and be loaded from yaml files. +* Updated the `ZZ_Server.R` to include save/load of preload yaml files. * Updated the save/load functionality for the ASM module to switch to use this functionality (this breaks the previous save methodology.) -* Creating workflows to automate analysis initialization +* Creating workflows to automate analysis initialization . +* Updated FM_compact.R test app to use the preload script in an unzipped saved + analysis. +* Created `is_shiny()` function. # formods 0.1.7 * Added word placeholders to the UI so the user can change them when generating reports/saving the app state. * Fixed issue with `has_updated()` where zero values from ui inputs were not taking effect because of a special case with buttons. This requires an `is_button=TRUE` argument for buttons. -* Updated the `ZZ_Server.R` template to use `has_updated()` +* Updated the `ZZ_Server.R` template to use `has_updated()`. # formods 0.1.6 diff --git a/R/ASM_Server.R b/R/ASM_Server.R index e743cf1..c8e74fd 100644 --- a/R/ASM_Server.R +++ b/R/ASM_Server.R @@ -389,13 +389,18 @@ ASM_Server <- function(id, if(state[["ASM"]][["isgood"]]){ if( length(state[["ASM"]][["ph_uis"]]) > 0){ for(ph_ui in names(state[["ASM"]][["ph_uis"]])){ + tmp_value = state[["ASM"]][["ui"]][[ph_ui]] + if(tmp_value == ""){ + tmp_value = state[["ASM"]][["ph_uis"]][[ph_ui]][["value"]] + } + tmp_uiele = textInput( inputId = NS(id, ph_ui), width = state[["yaml"]][["FM"]][["reporting"]][["phs_formatting"]][["width"]], label = NULL, placeholder = state[["ASM"]][["ph_uis"]][[ph_ui]][["name"]], - value = state[["ASM"]][["ui"]][[ph_ui]]) + value = tmp_value) if(is.character( state[["ASM"]][["ph_uis"]][[ph_ui]][["tooltip"]])){ tmp_uiele = FM_add_ui_tooltip( @@ -1006,11 +1011,40 @@ ASM_preload = function(session, src_list, yaml_res=NULL, mod_ID=NULL, react_sta FM_yaml_file = FM_yaml_file, MOD_yaml_file = MOD_yaml_file) + + # Populating any word document preload values: + if(length(names(src_list[[mod_ID]][["docx_ph"]])) > 0){ + # Placeholders defined for the app in the formods.yaml file + fm_phs = yaml_res[[mod_ID]][["fm_cfg"]][["FM"]][["reporting"]][["phs"]] + + # Just the names found + found_ph_names = as.vector(unlist(fm_phs)[names(unlist(fm_phs)) == "name"]) + + # placeholders loaded from the preload file + l_phs = src_list[[mod_ID]][["docx_ph"]] + + # Setting word placeholders + FM_le(state, paste0("setting word placeholders: ")) + for(ph_ui in names(state[["ASM"]][["ph_uis"]])){ + # If the placeholder was found in the preload AND + # if the name exists in formods.yaml then we set it + ph_name = state[["ASM"]][["ph_uis"]][[ ph_ui ]][["name"]] + if(ph_name %in% names(l_phs) & ph_name %in% found_ph_names){ + formods::FM_le(state,paste0(" -> setting docx ph: ",ph_name, " = ", l_phs[[ph_name]])) + # Updates at the ui storage location + state[["ASM"]][["ui"]][[ph_ui]] = l_phs[[ph_name]] + + # Updates the default value as well + state[["ASM"]][["ph_uis"]][[ph_ui]][["value"]] = l_phs[[ph_name]] + } + } + } + # Required for proper reaction: react_state[[mod_ID]] = list(ASM = list(checksum=state[["ASM"]][["checksum"]])) # Saving the state - if(any(c("session_proxy", "ShinySession") %in% class(session))){ + if(is_shiny(session)){ FM_set_mod_state(session, mod_ID, state) } else { session = FM_set_mod_state(session, mod_ID, state) @@ -1118,6 +1152,12 @@ ASM_mk_preload = function(state){ mod_yaml = file.path("config", basename(state[["MOD_yaml_file"]])) ) + # Setting the word placeholder values + for(ph_ui in names(state[["ASM"]][["ph_uis"]])){ + ph_name = state[["ASM"]][["ph_uis"]][[ ph_ui ]][["name"]] + yaml_list[[ state[["id"]] ]][["docx_ph"]][[ph_name]] = state[["ASM"]][["ui"]][[ph_ui]] + } + formods::FM_le(state,paste0("mk_preload isgood: ",isgood)) res = list( diff --git a/_pkgdown.yml b/_pkgdown.yml index 26fffb0..fea64d8 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -50,6 +50,8 @@ navbar: href: articles/included_modules.html - text: "Making Modules" href: articles/making_modules.html + - text: "Automating Workflows and Preloading Content" + href: articles/preload.html - text: "Functions" icon: fas fa-hat-wizard href: reference/index.html diff --git a/docs/404.html b/docs/404.html index 771c6cd..dfa04c1 100644 --- a/docs/404.html +++ b/docs/404.html @@ -41,6 +41,7 @@ diff --git a/docs/LICENSE-text.html b/docs/LICENSE-text.html index 91b5a25..720dead 100644 --- a/docs/LICENSE-text.html +++ b/docs/LICENSE-text.html @@ -19,6 +19,7 @@ diff --git a/docs/articles/included_modules.html b/docs/articles/included_modules.html index f3565c6..7b81267 100644 --- a/docs/articles/included_modules.html +++ b/docs/articles/included_modules.html @@ -40,6 +40,7 @@ @@ -102,38 +103,38 @@

Avialable modules - - + +
- - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + + - - - - + + + +

Module

SN

htmlOutput

Other Outputs

Module

SN

htmlOutput

Other Outputs

App State Mangement

ASM

ui_asm_save_name, ui_asm_save_button, ui_asm_load_state

ui_asm_msg, ui_asm_ace_code

App State Mangement

ASM

ui_asm_save_name, ui_asm_save_button, ui_asm_load_state

ui_asm_msg, ui_asm_ace_code

Upload Data

UD

ui_ud_load_data, ui_ud_select_sheets, ui_ud_text_load_result, ui_ud_data_preview

ui_ud_ace_code

Upload Data

UD

ui_ud_load_data, ui_ud_select_sheets, ui_ud_text_load_result, ui_ud_data_preview

ui_ud_ace_code

Data Wrangling

DW

ui_dw_views, ui_dw_key, ui_dw_new_view, ui_dw_save_view, ui_dw_del_view, ui_dw_copy_view, ui_dw_add_element_button, ui_dw_select, ui_dw_new_element_row

hot_dw_elements, hot_data_preview, ui_dw_msg, ui_dw_code

Data Wrangling

DW

ui_dw_views, ui_dw_key, ui_dw_new_view, ui_dw_save_view, ui_dw_del_view, ui_dw_copy_view, ui_dw_add_element_button, ui_dw_select, ui_dw_new_element_row

hot_dw_elements, hot_data_preview, ui_dw_msg, ui_dw_code

Figure Generation

FG

ui_fg_curr_views, ui_fg_curr_figs, ui_fg_new_fig, ui_fg_save_fig, ui_fg_del_fig, ui_fg_copy_fig, ui_fg_fig_name, ui_fg_fig_notes, ui_fg_add_element_button, ui_fg_select, ui_fg_new_element_row, ui_fg_msg, ui_fg_slider_page

hot_fg_elements, ui_fg_preview_ggplot, ui_fg_msg, ui_fg_code

Figure Generation

FG

ui_fg_curr_views, ui_fg_curr_figs, ui_fg_new_fig, ui_fg_save_fig, ui_fg_del_fig, ui_fg_copy_fig, ui_fg_fig_name, ui_fg_fig_notes, ui_fg_add_element_button, ui_fg_select, ui_fg_new_element_row, ui_fg_msg, ui_fg_slider_page

hot_fg_elements, ui_fg_preview_ggplot, ui_fg_msg, ui_fg_code

diff --git a/docs/articles/index.html b/docs/articles/index.html index b8662bf..74362fb 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -19,6 +19,7 @@
@@ -43,6 +44,8 @@

All vignettes

Making Modules
+
Workflows and Preloading Content
+
diff --git a/docs/articles/making_modules.html b/docs/articles/making_modules.html index d798d1a..30a0bbc 100644 --- a/docs/articles/making_modules.html +++ b/docs/articles/making_modules.html @@ -40,6 +40,7 @@ @@ -426,6 +427,10 @@

Helper functions in formods#> → ASM: source: file.path(system.file(package="onbrand"), "templates", "report.yaml") #> → ASM: dest: file.path("config","report.yaml") #> → ASM: State initialized +#> → ASM: setting word placeholders: +#> → ASM: -> setting docx ph: HEADERLEFT = left header +#> → ASM: -> setting docx ph: HEADERRIGHT = right header +#> → ASM: -> setting docx ph: FOOTERLEFT = left footer #> → ASM: module isgood: TRUE #> → UD: including file #> → UD: source: file.path(system.file(package="onbrand"), "templates", "report.docx") diff --git a/docs/articles/preload.html b/docs/articles/preload.html new file mode 100644 index 0000000..598a269 --- /dev/null +++ b/docs/articles/preload.html @@ -0,0 +1,227 @@ + + + + + + + +Workflows and Preloading Content • formods + + + + + + + + + + + + + + Skip to contents + + +
+ + + + +
+
+ + + +
+

Introduction +

+

Sometimes it is useful to be able to preload content into the app. +This can take a few forms. In the most basic you may want to save the +current analysis and reload it at a later date. Often you may have +standard analyses that you want to run when a dataset of a particular +format has been loaded. Lastly, you may want to set the app up so that +it starts with a bunch of preloaded content so the user can play around +with it. The following will outline how to do each of these tasks.

+
+

Saving and loading an analysis +

+

This is the most straightforward method but it is mentioned here +because it is the most likley way a user would set up the other two +scenarios below. You can load a dataset and populate any of the modules +with content like normal. Then you would go to the save analysis portion +of the app (under App State) and just select save. This should push a +zip file to you with the current analysis saved inside of ti. To reload +this analysis you can load the zip file and it should repopulate the +analysis for you. The key here is to refresh the app so it is +“empty” before loading it.

+

If you open that zip file you will notice a file called +preload.yaml along with your original dataset. This yaml +file is needed below to create workflows and prelaod the app.

+
+
+

Creating automated workflows +

+

To create automated workflows you need one or more preload files. You +will deploy these along with the app. The first thing you will need to +do is create a copy of the app (or your own app) in the deployment +directory. You can do this using this command

+
+file.copy(from = system.file(package="formods","templates", "FM_compact.R"), 
+          to   = "App.R")
+

Certain features of the app behave differently depending on whether +it is running locally or deployed on a server. If you want to deploy the +app you need to tell the App it is deployed. This is done by creating an +empty file named DEPLOYED in the same directory as the deployed app +file. This is optional.

+
+file.create("DEPLOYED")
+

If you look at the top of the App.R file you created you +will see something like this:

+
+formods.yaml  = system.file(package="formods",  "templates",  "formods.yaml")
+ASM.yaml      = system.file(package="formods",  "templates",  "ASM.yaml")
+UD.yaml       = system.file(package="formods",  "templates",  "UD.yaml")
+DW.yaml       = system.file(package="formods",  "templates",  "DW.yaml")
+FG.yaml       = system.file(package="formods",  "templates",  "FG.yaml")
+

These are the configuration files for each module. The workflow +information is stored in the formods.yaml file. You’ll need +to create a local version you can edit and fill with your workflow +information.

+
+file.copy(from = system.file(package="formods", "templates",  "formods.yaml"),
+          to   = "myformods.yaml")
+

To make your app use this file you need to edit it and change the +assignment of the formods.yaml object:

+
+formods.yaml       = "myformods.yaml"
+

If you edit the file myformods.yaml you will see a +section called workflows:

+
  workflows:
+    example: 
+      group:      "Examples"
+      desc:       "Example Workflow"
+      # Set to true if the workflow requires a dataset
+      require_ds: TRUE
+      # this can contain an aboslute path as a string or R evaluable code
+      preload:    "file.path('.', 'example.yaml')"
+

This is be a pre-populated example showing how to creaet a workflow. +You can create as many workflows as you want here by giving them +different names from example above (copy/paste example, change the name, +and alter the details). The group option will allow you to group your +workflows together in the selection form. The description +(desc) is a verbose description of the workflow and +require_ds indicates if the workflow depends on a dataset. +This should probably be true. The preload field points to +the yaml file that has the workflow details. This is the +preload.yaml file you will extract from the zip file +created when saving an analysis. You need to copy that file to the +deployment directory and rename it to whatever is referenced here +(e.g. preload.yaml to example.yaml).

+

Now you should have the following files in the directory:

+
    +
  • +App.R: App file edited to use the custom formods +configuration file.
  • +
  • +DEPLOYED: Empty file indicating the app is +deployed.
  • +
  • +myformods.yaml: Customized formods file to indicate the +available workflows
  • +
  • +example.yaml: Example workflow.
  • +
+

If you set this up correctly and it finds at least one workflow yaml +file specified it should create a workflow selection element and button +to run the selected workflow in the data upload section of the app like +this:

+
+Workflow ui elements
Workflow ui elements
+
+
+
+

Preloading the app with content +

+

First you need to unzip the contents of the save analysis into a +directory. Next, in the same directory where you unziped the contents of +the analysis, you need to create an app file and also create the +DEPLOYED file if you want to deploy the app. This will use the test app +that ships with formods:

+
+file.copy(from = system.file(package="formods","templates", "FM_compact.R"), 
+          to   = "App.R")
+file.create("DEPLOYED")
+

Now when you run the app, the preload file will be detected and the +contents will be loaded into the app. This is done with the following +code in the app:

+
+if(file.exists("preload.yaml")){
+  shinybusy::show_modal_spinner(text="Preloading analysis, be patient", session=session)
+  res = FM_app_preload(session=session, sources="preload.yaml")
+  shinybusy::remove_modal_spinner(session = session)
+}
+
+
+
+
+ + + +
+ + + +
+
+ + + + + + + diff --git a/docs/articles/run_workflow.png b/docs/articles/run_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..eeaa8964c1c53725837a1e31816bd5d5ded6aecb GIT binary patch literal 19732 zcmeFXWmH^2x3Gx?C%6QHdvItVSffEgg-*+YVWFZ>ZyuUR+Pa)Cq;*YgTs=Ol~RR+gD(Km>!`@U z|FNWiVK_MSDl17zWjRSnDrF~ob1NG&I5^qJPsu26@U@5omLOiA=|gDfPh(vWWYKb- zD0@}mCcx!{Kye7#!&tvJN9EE4nY|)@LSRFHOGd=X8r8tjO_TjS`U%;K2e|Mbbq`k$ z54RWT{1<6L7Ypu(La@zw_<-CF!ssz0dN^(=tpo>udubb8VMKnUA7Z%ify|t1Cwayi zmX@4irrHmB;Q1%RA&q9dxVuYP4{udAG4h1rvXw*duT=GsTf06S2Qns^!UqUOOk*XP zM>1X_w}Q|Ts9Kwp98L)QQT zC2(6kQN2w~O;2#`WTpv@acPBdvr;aTU-tM%r!d9!Y%uhB7ADEH+@R*Ky4Vdq)RI5w zaF3deS(DHPr_-RJ%2Ylrx40PN4qj({oleX>AaS4fK=-8^A-5of(X2~}CuXJI30BnOypb&Zwdwg(XGnZ4wdv&o8JiPcCbjKX8quv%Syc z9~iBS$bLpyJq_)@$>%HLoL`EVwKt&)c#$X6XNrj|J zg}fbr;S_(P*&ftCh{xKO$`qBsJoo`MQLUVWb-faeupY=V)6$rfC5`%H!x@8SsK z5S>($poxwSM!-$v@$qpYPqo-Ogj^0TU>an?qlX$WN(GlZ=gBR1{t-*Wu?3FiL_HfG zi_Qdbea`U7UI4xWqJA?mQVIa_<=1^D)C&tqt z+LcfT?s}xbP>f|PhbOvNlp$#=&PTkLPvPq zFGN+3EtKZXo>k8Hs`FKUoMqesM5OSFXIR6M-vv$(eL#{!yi_VVn`H!Lc;Gk2Z=K)Z zQ`Bpru%MAvO+#I-=MYwgXB7l$5zJlVhN+yyT<)BRP;5=sq*&e-K@-Fuj?-`UoNUnC z7^`u;iROa$yJA-zUSg#`86+nTT3ao52(8(#39jL(NvnaMXB0*&jsDqov$A$f;{$Gd zZV)aS(-cYB9*6r8RT}B71ZtpCH}yxnbKF_fDKx|ou3YYskl%{$=?d_sa9AR++N0aM z+TH2!;K_-DKT2Jr+IK-G@vBQCuC-cuGCF zHreBgWUL{Dk@}cmy#7T2avi&V+r0am@N}ee$K0xiySg z96xEiP-o6i{`Cb^2vM(Af2uO5%&ziXtua?PFG!6`<5+#Ah~VpUe6IbX1nL$ssX(TpuHvd3qoG%zo$vL!DmgZnY)s(P#f$ll>5ly_ zI<=ZqULm_$zeIe$U{>Z#Ye#%g6C1W8n9#qv|)moKgy+5%tN;)w)ay~_5Z9fGry?Y)0eJww+u;SHL z<=_u?^(o1>U+Z37yg$GQdlB3rYw?DYom2X>@)Y6J)XV$y*IDPO!s+Kz*csVb76}d( z6j=^g2U8GJ8q*bPi*)nZBpDb)L&6oK`o8*^E2%Gtk1Li--(uca*fiI!m8*yM8^5Q` zYpyepp0T#A*BqvGCrF-W&dROrIiEX7iK~>m$qruUr4}lioA#-uF{>WytE7pfi{fq# z)*_oCuOhJZFV`QgjjqvWyE9=GYZmsY3j#NFF`pHF4S>^Rs$WzGR$o=yR@?9Q?|ZnZ zyZzi}KKDB>+SA!zda3ym^|_nCynCMDpsViI^vdNx&y3va_%dkE=6CvXecKg9Vkf3q z5+_HUp>DmNMr~!CkDII0fRo71^_R3yI;lDtbHmRQ1%d=_Hc#tz>zo%ZYA(Duh4F;_ z&VQec!`8htyumQ;qgC$-53KTj&2PoQ#Z!xXi+G0&hjBJ<&(Y7dC_lzEDSc4-SsG>k z(LVoBP1Lu^w8^Up*I(vgM#_D*mXS2K5XWmzWPGM!oJB4P708Vkozis*^9NJ;VgqM5GjNw<6#3d zQ@)YdAH!dBnVktAlcARJ6FnAv9izP>h2k-US;>>$6oVzyUKLT*{fi$2LvAjMFOwp1 z5gIro+x?PS6*oVU-E_y4y>Aa!Cjz6RL0&i6Mvt2YEn!@idRxNEnh47(;g@MaIi;!Z z48@H4OjeRKhe$QVGsRNtZLH_ub$W|#)4V~_=VVxt`}+1qNzblMi*}g>eI>V}S=WnT z^(RHh8aJijA7M2NwgaVCd{<^yhf|%!wk*T!ntHvYCAm-WJrbSb_vr*8b4%art<^hjr2nlL{(lNx&; z+wPLEyEBZaGbxwt@F)ACSN?pC&jsHq-%Ryl)N<71e%Ktp-Gg?Ds^^#9x0je^NO-xO-~ey?uG`y~&$mkSQ*x;4%Fb)5A^7WEgg zO{IV5br*2sz1z98R{N>u4s+ewE#cR-t32!97VsT|ZPx05f3h!Z&NsSQEM{cZskk35 z={S^LfFJIMgHKWHDa=Kmdskj_Z90zN=QD07Rb^^Cn4jyIl&T$m17|gUx4<2uID=gq z+_T@^?TWQH_rgxZ7g}bi>vGPGnpVg-Hk(L1nEeFK3y-ijMBVE7e0^_~N=56Wjb)G* zWf$K!v3Y(uwtMgnzaamd^I1vM)Q99o^HgqaEO4lQD8s;BmCFh@CDh3|CNSY z2g=~Y)gBINaUc+1+{A?VT(* zxC8_QI5@dExVhPYJJ_5(?OcpJ*zBBX|0?+}JyK@QCQeokE>`w-RF8U%jO|@rL}+Lp zEBarbzjm5=Sp9cRcFzBr1vHT3v4n$*os;8#C+1>h{(mF(Sn^lwPrLqBC;X^PP}$1E z%tlkn$`ZAm{@AZ(scr{?EeyDfp*Kt^cl) zoBQQ|R{0+#{~`I<1VL3ZXL}ph$1YU2vvL6gmj3T9|4%8c{}uytfk6L+{`2bpl+gU& zO8n>5|0$v5WCiqt(W7Z#u75TB=e2+L3v)cW{y#$DZ=C(P3IrM$U6|v41uYmIWzca1 z4h|e3Cnf&I1AadP1xnU&)w$)f71Z)3xCIov-Ed*7{afU8SP~6M_IDr-)h#s+)wr@G z8jjat0}5)xg+3-Sq=Jjxz477x{B~Q~nZ+t!rzhd?E_2K7ZC!=hqSkxBiabeMcvf01V_B?kn)IViA z=vpqY9uBu5EIlBA_hrmxNgRo3{%&y?@mQ zM93ZfF+vP=oDhM{Rh>+|K!%3XZvN#(3kqe;$Y+_l6pPH60p2Oy@3pnHGR8U581U4~ zx{^3!ZP=oFu|fwmy8cy_l{Gr{4HF7N`<1oUg5SsyjQk-y1E7P0xsG& z8~8cGhD4imEOSEV%lp{L9?U}Zb#&6mc+4UCZfjj}LpR0PRgzSDab+f5NqR5yD%+k4 z)nxhK*Y;H)qC9nJ@H$h?au=5-4iOs?%ce2@wfntp9%#=t;G7%bkBzq{@)wtDaa~h> zXGI3JK!fHLMDI>LtqMM3e@S1Qa=+)s!v6=SMaW$om&1BW4B*%xli@L2$@4>s9r3bfQ z6zl_5M|1)2!-k7__a)zCYb@;$IuV38;S*W?)fDs8p8d)(#n_8?DP~EI2EJ$Ni+9ow zM^{@}TMZnV&*=ac($OjtaT$ScU|A2(u_=0HHVpKPBkAXDDh87L9nr7aF*Q}6AposV zBeu2bWBch+w^uID-o_jQJ#Ae7rNJnXO^0BHi+@jtOlUBvX@d3hu<@o7>Gb~Qux`$- zZop_K%_7rt9*r@5IW;x)cD>fw2gAPc%KVn!s1@mFGXh3UD6#&_*xp|H!lU)IIMG;G z$3PqK=Y8p7gE#R2Zb`VsaM;U1&Nj^BifGpIh~24DgS~7Sc~SwVyqnE5`;(K^ zXRzdc?mpHhbK;~s7C{`LZZ{{LWcKS|yo|7=!Q`KdUMw7%hKrtCu4)RrpR(xAuNq*3 zLb0MdLQ6id4%-y(gId_=42n+(rQc>@c$7g9a<#Ox_ zW%#`tTKJ2I4(+#n4a(OShliH@``IEJ=%i?ejE7V$_=f0q>tyKrc?}E|gMvkpCOlWy zyQQ$}zV~@J@(4FR;x$(cZ(}xZ;rbt$u(0on`SI%m|CWZXP+X==3GQ9 z6J2isUFiUExN0;hSJVKAobEPAh#=@&pQuY(yv{Q%5#uE*fyL^9uwCN%e&v~ z|EwER6e@{!PUC=gyIi_Ea4&-iu@;S6bg!2B-xYaZZ-1$yqeptygac11*Gjwz7#54h zTtC!&n%s0tPw~}#-m&Y*?e7MUmMzn?F6}c~U?*I+vW8C}%2Fa#f za1SE3a6D`xhLrckB&(0w4!QgM2N{S|cZT2f_AymrpXF%Ji=yJySn#zazvXaty^a$2 zDi1d2Fl`iGOQ@mQvfpsA=-Jp#pRCJ$Seu8%^=(+lU>LHKrhBcaQ_>5lKa{f2hvA86KqumsWcHyY0^f zx7hR4bk|9(gT|YKia0x94948$yRDq`ak#%V@U8N70ixlX(D}59bJiXHVp`rWk(<4W zSkaK4$c(v)Pp3H|WE9u}>+$oZ5k1I<%S#XU?(TPIQ(Fnf;7}+KM-1*j=xu!Gp0nf#18KehCZPfO@^Mx94u<9W=x07~7_$kW zqeKzE=ap_j4n9UW=b_ctt7`*iN6t|2H>JDVUXh_f?8M%UhMJ>R447=BOO8h7sSW+q zJuutU00Hp>gZTro_0;|O&nESRlFXD=T&8F!XJlwlL135*FkAitCJzStVazdZwK`zP zw)N?Od4_Rbe$e1-5qHZ;;qsy22^r|$r$FT8SvGDh{s7O8LG6UCmc`K#5$OUQfka_N z^`DFtGa9Qp+#Yuc9Wl{CO(dI8%~kqMLqnc%(FIsdA|+DIk}>45hH^vKv&EC}K&p^_ z2BYyTd$+s+=!s8@i`gL&!?$4qv}1F6t#hLsK|R0$dUl^u9b7!AHlBdA{bRH*Nlc_) zmSK(kb{>+<&QE7Bc{=CNhP5DaF`sxr!a-r$N|}l`i&8*l@I%A|d}LO;k>q@H*yO+0 zN9}c(q+{2!5XPEh;CD5@Wz0CG>m1_^5MpOJ&KSc~E%yc21>lKAnfT!f33}Ify;Bt1 zj5)bPhdT)Ph$zj1FD^%n;UrH{j)a9F1%goMNw)3+SWVryOP zJ=EqLdnP0m{XUg8_9e}t+{&zVsjJlM)NJulXjP>k`5n%;>A%M~vdH8xLbF zxT1}~+(u#jhJ=%Z1K}4fQ}=r*d28x#^$3S*?!2wP*P7dG(m4b<-FEXsq}#%K6`0aa(2~W6uT+(S=3 zAW)6aAnZz!v+k15yc;nqOdy6DPhVT-r97v&_Ob1)48ySzv1;ND&Aa2NlPZ66(J_ocq2GcHn8uS^f=?txvj!$> zV$MC0bG<+ zyv_xhSsgMR6|22$8O}R;mKw0MTiSG>q31f`fg@#o#!HJVAMtJ2d%!iKhw@EN-FU#D zcbKl{#;4!j{FKxUq z&8M$C97N`*x34Z=MC853LsrT4!I99AG)hK&h=U(YmU!wTilrSi^RO>y{zBA%YTg`xsybTC0a&8FMyE z;ACga&;7lg)o*6=z}TPJ5+#27a$_)}EGsqMdq-{BN;t%X+RyRE-e>O`l&;s4`a<7e zLk7+l=@v@QtBUVpCcc-Rl!_n_;wGvm5@S}SAL-u`-eWF|LQ{GH)gT_jGK&{iL4;1r zpUXnmHH-HS<}pyDWfQdO&=5es-KeYdTb$J;1zByXvoQ2Ns-E7YxOEn+}y?@hxlBF>DoFu4-i6I0F&1JFXD>tP_ zB{-MLvJiYD@=y-G%aGL2tb*a%t4{O~gsAS&`qJTn0QEWGW9`M&@q^7C*tpOs?p2-yDd_ov0Mm5g2dp+#%RsKFCICK;>5GSylmmxO;^<6VD z{_I?eYuHL15e`lQoH@S6GHm1GK{otZ!T65~O(Dmd|p~*yIxBqYBopB=82OxkP5gqDqlu>g``+peXv--_IuIiN`4G;$PG2 zwml)zLSs-S%D4uLBOi0(RS0cd`BF@htEC?vVg}PP@wYSWA>QUPK@e<<HZc@6OYCJt4{Fv{wO))UN(CH0sX6$yYm6U7S&!qV)t&6%)cxVe zr4qFCrG=^rc<6PhD6xF6F|Jp~34Y3B9K?62^#o~&1hMeY!bp#Zlo;382RD+ST_D@yw)|} z6%jPv6=mzQn`VY5&lSc_j~Nf0A|jcD4K!=|4;8S;_*f@fIU|(@!Ii)0t%mnZB_38j z!|q(p-^WT&StF@hLwuOICPIUlk;XFj12>i|r0s(#5%;;eo+oa(m?8JilJbR_iJ7>? zz*1zv{*D%-?07cbCc93Wv@7ARYABUlM0gV1dxmg1+`$(E;p5EPUr>gTQl6a%pDhct z<|t4xMTb>b=b2+!#K(jOuO;hTc_x33sZC^dW7;9|!!*$P>lrRr zSLZh^)OI9hYMU7X#L3Q&DoGslr5e& zt5)J`?(iz9B15qg11EE+jgqQO4#O4a%?9y1h2eq(^Dlm!aCuudID0ck-NgOaN}ehk`-r5sJRzQh-kYyx`n90Br9R6>2epBf~nI5 zb?UpC!ESq$yM)S>;wn#XgTwEoq_6^No+01R0iGpI<6hO2ewkH# zxnz)W_JZHdJ~?SBmWHtW5elg)l=vcnsK-gHWh`xJ6h(K*k##v z%Q9XeIp5_(+(2$>jdjX*#kwpEod@?9(YTeS@8#J$L92P|y z)ul)oZVMguTgqqdQ&M`iV$r1gxP(fj$x`;tSJ+ZPHnO>{kB9zD@Ieeck>R1aCGr+R z6dq#SFEku7$!r<#qKtN6~XV!jX>BB&BO z5vhk4hWTtXlmK1CU|_d0R8}+=$9)t|XW*owyDlAU!9p{OA%`ogyr~>*(To6`uk;8s1=_hK<^NRC z0oeo`=Dhk(fHtv>XlVUY^_Z25`1p@Sy^9Qp_?Bc@#QIki(_@xS>h&MJI0#iz z0CbYCR8RV=>f>V;kB0sqlKQ_icUYDCReW|s!ve7Q?2UQG(-}j?KUh^&^@RCU8G;`TrO$P9&Rq_07sX2{W%Q-I(zKq6q$yovu<91c@hfMdty@me&! ze0_2%lvO%+lqtG>)b(Gh3uKYrv%DATwK9EY{DM&}pYYKyfUGhz;HlRi#+?6U2?4jN z2dbx_!#_4hEFXx07q1kD{yAM8z=7&dG|XQ7wfxg#un`D|F#gS|ivzwP)co}AudCif z0ghB%KTZFaeFAu0-B7*Y|NV*slM2@hA&f!@hxM>nGJd=CG_Rd+3&S~*jNZOGWe7|D z4-LSod1$q806-0oQDLSI>*Hv0;b^?fB?J4^JYuN#u-7al>wdt}QnwL!QrjOe7WDP% zMuv)EON+IGLf!5G;DF6<+>ZM5cW(3}pL9gGHM>YX>t!je;TaO<8C?IUrs#;lUSqg} z`2gU&UjQ}gyAmZ^sB^b>Kbv?fB)WvJ__Bo!U{K#+>JmWjrx)oM|JtvfnRekP1BpR%;tz0K)JuxQx}_T`Y-m4FKR} zMc;eBO0(kSQ8Oa`*!WlnKs$e7aMW|kysjAFOG|T`wORmp)o&`sNWe`ClG%2V+W^dT z83Nzf6i(XKA9sEmWma)R1@ZEBFt9?5pv`VGX2e~*2D7uX^BL}o+a%o|GTdf+9^t27 z!sYFV45cfj&yjc=gk9hN&h-L_{0>(Gz=Q>Ol;^|w`+B6`Fn|EalLjj4v2Ov8nZaqa zXxDS+%N|#KTBJ?jrFJ@*+q@q-ZSxX9V4I(A0lc^+8%bvQs;IQlOP{nGBL=-?Xbkn_ zY|3D(u=e((kJy*r8O;?S;$rWRNQ0o~3+@KKS8DE7`*`d>nh_3G!YN}hq}s3|wH2JldwXT=?rR!f{E zoK!pRvAQhyYCW+AlPn%1U;Y=^XbHSHhwhY$Bd4R_~ru`NNel>%GoJclCy-Qhd;biif2L1!t(S+a<40?HSFz`{=} zuvu=kD4#Ztt_{WpzvQpEen#PUxl)#82A~D^KK8oeo2jPz4SkQ5Cl^3axA%le!9Sa` zZ)%_ofeJHI`u74ckH2JZXXggMu#7o?HT<#+c?5EG0GXW+fJdCK-OAjxtKA^FXhy_t zXW*eIu!C}@oI>kMG{&E-yT06U{35`BI78i*dhjYmv z;FkDI>(eLYJq&3z0Bz##M8`|FDo9z~y>0s$5|4cq8Z?9XoJxS!={gzb5}ET z_lN!u&W|tqdqW6y07Mb(j61S3&GJ2WB(tl@q37_ZKOL2KCS3verM1j&e%Iq;!S#5_ z)r%MiJ3y|-Td+5(cd`91gKy5~>`mT#3`q)XLQS5x_X)WkcM#WseXrN)%iOar!frx- z%9B#UUw>+P9a0wA%}E~Vl5?zEPVEpfm3TALKUl9_WN(;=@qh2U7ULZ5lq##dQ#BR2uq zmTjVMkgD4-hNMMPWcVfXm;C&W6cgpJS3P51meiX{kFiO` zmPk5!l&tZ>ir8GWSFB=#{33MM^7C^~#>8AL1F!A;%X`*}ej3%27V9I}>z@44t#?nR z2=cku%DZXo9s!I+w~q>?_a4{J%~b17&HF9Uhe(vy$g<}BMB-s_aCp#nh2K_NEWYI@ zMOoxq^7h99P=3Ip;CeY2`&SI#EK`}maAiC&kMUB3L<-jdI_81-gB)A8>EZ5h?FMsI z$F9~)c+MY~gq?#$wdKp62_tm{wDwiD1FUP#$v@%Ki+8T0o)zmzGM$Fp3Y! z)6sYOhmj*`_or&=oM&;jUoj9xeM2?mkaU+Ceb+1pH@%WS4mkXDc3i#pbjL}{6pNz14(QV&}0;mzK4-JV0Rs3rbp{Bn5teL*v^SX@ut1F zln(U&RBa6)+E`vM&R`G7+!vBX*Y9bZGc*loz-thC>kV55!#t@&5E7Sd z-F|hXJ)X4;Nw$xX2o@C25a>TeCP97&%2D|&-C-`ovLyPw z{-oDYwtOEFP`jTU{4@&19E2cCU^^f??awDHgV@Fz0Yn4$(~`CjEdkPL;6Xz;^nFB{ zGno)Sq6cZ8k&Xe`IYcfPH!=SUdx24yHm0wIcDKF%&0NjWo&bn*Qt|F;$Uhdv6hu=g zoMxjb7;E|Vl=kuq?jqTwMNZDKpGw%upmy=&F2Lj@D+jXIBv<~Y*K-^AScmVGAUL?K z>p|{;PZ}FJM>yr-&XOUXsCo2Xq^an=zEDFvG4bU5MQ@KJllkAXd5~!0BBuaUZc)#% zgYXzG%-$rN-0k-XrZ#G@BGaY2%`$J3GBj)mvk}bf7?aY_ln94pnAh$b;-tXION56y zf-ED7wMmbUKr@P}ou1Nx$@m}uk^x~LWxZlPM(gNzf*uX$;`q4S<1R&|(6NbJ-1$K7 zL;>V^>}(lDX7fYb=iq_XAc8RPh;xn}ZDrd^4h;)KRRShi0bY%uef{peoEg!t$qctZ z#MEba(n6%Twq+ee$G(-y4|PW3jF%ZUxj2mDP0Z+ls(ETVej`%edt|bDg~mgzxQsQjY?U8!#9skK{*jyu@V-!kOVN-EZ$c7LK`XUXy$y=iu8&B#)grK_$F)%#_ zPDmiD+>aJXLn-?!9tBZ0#J9DomSR;tN4_pH%}CDpd2+)Nq(*QuRCtr&g!rR*xRvCn zK`Da9!8h^UrcubzkK4y(wI4y2?l@ujjID!*21T?(Im`rjOAoJ58|@d%Enc4m=GOs_ zD{?$%!L`4E!X3*wYjFK8GKxbpfo)CNex;}o}ugG zmU&3!3uMoBf7(0oSQXLmICOVV!qtXrMGrfrsjt$uY!BI_1QJpb`K5ai!bU>OTP4oU zdVYM2Wa;sNek{esXAqRlT!yC`e>vSh9uavHkG7h2e7UEDaO-?Amqius@FmLW1as`#_IRkxC3H6QD&by|Y{NGc+W+1nuMG*)xO^9aa8yB^#K5YQ z^+g!zeY$0e{~{Ax22CUy7D5wVkN_52gw`#vKQTrh5ctE1mi|`C#W-Q6ghGfQ5i6J} z!A*zZ`MM$e_H$s{Trc8Rf?FzOYzt92S4_{Xd=g_;Bm)Tl+toyCgdi;cC_S`7hvI(3 zM_sqi7zLSuriW3*kS{pPh8qQ_jF_5JJUUx@rk%<)gf zE7%ERps&b2$=p#5M}(OE=9M}MR_EKtWkbory3Yfqc@aM9W7cS4$;7G0O%RJd;>_+} z($w@X2KuMlDNpybM@NtyAi{i>^!Y4XsYjO19P7b-$h#9?BWnV6g6C*c8RR*;W!Imkw2Sp-2L;;WL z`>=Mrdfmr3oNm%U=2+;FD~@2y5Az6FVGPgCy;qiHXo#7ibZHd}2afG!Hhwq{UL`|` z2pm*I7<&N_v}h&TJ!K=r@mIup1Zkn8!f#oz6g^-U%U>ilAKF+Kh(Xwuc_e7? zegwwC&mz;(v=56Nsf%gYC|-Ao-gEH@bzm!Y`U9JeVZl-n-K|XlO94mD(d|0G)>EBL zlj$a7zgc6acy?e(SL4GruKmpvoSLiFHN(}F6{#cF8WG77(EDLcyDTf zO^A#g+Q!4>LRuokGxq&({5n1YsR(iGRbz&y)DXoScBzSnFXjNopl?ksKTmO))(PtWqqv=j`|k3QP9tLsj7 zpK^2kB0&zdMqQDW#_%{v;8TvPDPLBfhmZMXwA$=o ziIZxJ+m=Vvt3ZeGu)rKvmNgisQF+4kBrP(2fg8f}^X7SCrlbkY^UT|k=C;t@Pt|?B zyrTG7+fAHb1Kk&z%t=3rlzztf>W-9}%i&e{M6jA<)CcWs@rToHIR3LSqD>a$*28$Jq+5LD1w~7P2`SuLKC?3KyPWBtN@7^*`4AQvhA}(f{z3E<%7-2#z+fKoA!m{{;;12@{yp{p5#e;7i=^y6dMF0R1iiw4H#gEt` z`yMww?wjIG1UV|IX0wv%h^wo%y80iu7XL_2AS?asJVa9OR7~AGUN8cSc2X4hloQe~ zrEk=LOo&*Vm{|Kb?JupEKXrkg0wSH;EE8`Y(aSI`KvT{l>@;XYA2Co&Fn~)OuV3^2 zK{KbQ0EiLEO`DMYqi2nZ%J^M+qpHH6TSX86loI#boLBXao|gcm`F~uctO8_3N#_F9 z1voklSO}myRQMZ5m$g_YZh$JCSIn<<#;`E@{{uvU6cGWAud=|ty>`Cuj8`ohJ^;tM zgiKn?<;VV=7vt=pg_CI}>;@K!y>|9HSq)S$;QdiR(_y{)!*_!wzheV=`5o5Y@97l( zkR33;04wYmav{EZ;Lwe;@6CBh1T>Y#+*)bQ2A%v7y(#{m(c9}s^!AB~12}p#+-hQ} zXwvyU5)EDBL70%Day^pdWyz`k({liN zAVHvEkd%=5*LVz|n_Wk+3Pb)vs{g<6|Fa%qb5q@^Iqxx%ryueCFYoE$cwBb->3t`x zql)=PBKYecXyknyvCiG<*?*lzAPHnK$rtedj^|WbfJzFizfgW098^eAz#+&NVX+7Q z5az%m0)OsA_z%8z0Ar9)Qs&|xx88h2;7@DO|4j|XKsGApv-dw_=?nx5Z@BK0e{hrw z$aV~mi2MsB0fcWCy+xh_Zw$qeym$rpEq^iaJESu3tDT0wf4)HR5Oeu$p-O@E@~hn+ zyLKpmLA>CuBJ)ItX2Go^XTYxNiC68Xt=)}+jKbjf)}1)gxr0nU|J<8HZ~V_DY1XzF zYQHP~OiGQ9ZE$~h`P-r-G;M*xy1J%ij4|=UQV9HA>U=4Yb?igqZBB>YwMUWnu_XGYS_+?w3T2w2?FJ&j;-Gt?9(Mm9eL}LKMbX8)~hblckC#MGk}c<L!TypvSsrZ>(RngG{7^{g=MSrMV~h*!p$k4EpjEF0k==1A2F}Yzes(Ru11(r7{{9 z5|tCK*PYW0JoQ&5^*mmSJZKkUs5$gMK(#b1@H#DMSm2g?EvoeF}0^0JJ=&90uWvwJZ1Nxv-RvWkB& zU6*o)!Fn|DHvOBu$UXf;3l{W_O^ec|p-1f{4+AgQ^kjPsJ?}qPM?gV&Bou-gu>p&@ zy=8r;a{V^m#UC1l4tz`4WM02P3R=}BHKq|U6FFDBc2(Tv7}+ae`Qa9I>*GmHGr;mN zx1)boT-N^*XHPJiukPMgP#dNf!Yq|WN5($0HyPV{`9a0RyHTWqqwe zL658H*=R1~;jWz$&nd3-OM^+YH@E*C>MYV`W+)2(FeW@lx3)u84wn&H8vAp zXEGxc4K4``o25E_=x2gO%38m8dw;czbkT$@1d3e5{kh@}^$m*+ZHVq)9C?cT1HbxU z->uOh{f6EtmOrYV5O+*fB_3`yG0Nbf7KN`v(eGha6<4J}G`GmDDnLdvh61&jNV5@? zD!n(Qw{;dHwlC9m-Dy%j9@}s@ZT@vqB4vP(K**`mIZH-G^VX=b#l`(b-uB?)ZLIrS z(S=lNJ-z)(<=HRL0o&e)x@+cchy<1rZDCq;vjN5iEL6- zS(8HKLbFXdRF2JT35jgPd)lQp7n{U-7F)VP_mgO~HpAw8n)S8WOOf0tuYwPcD9gzV z**%MS&m}cYR}fTW%S0>8b@KHSJC6=&g2;Fpt!I!h`*%`!!~K^si8%vA2U|1!DW+Bo zK95*hMZY2?+imWYxxHNB$6p{bsH__qxev73*k8G-kznQUNq?xfdgGTVFJ;Eva)d}m z(j7iHDyP{2Vz@TG|H>-y%^mj=cqffn-9qD9BNoI^xv4&?r|+zNabbBbiT>XSHbuwC9t#9rUGruwEvmTjmHjVy<`??=YIgV(-qR99}W> z`gil0w$sW?oi1pQ4e#pg>0-8fCdcnq8SMqvhuv}0hCP@fb(XW+0sa$i7o4Xr_Z;qD z{=7yQIDifaeJ0$e-lgsKc(A+@&k@6wKcr-_;>Rbw&an7UK?%h{Np$hqx%HoxZg3`w zxR9x=Yv70`;lsJ!qZD%E6bxw`d!jdn6!+T%3-@>W;KUDQ!cTDlSV337ev_80$JVD) zi~LMBb+_vTLA7ho`%C$$mKq+jiy@*IP#$2;E?-10vZN}FyX?Wbt+$Xw%UG1X6HLKT zc<7pZZial+qi^hogmb2S=PiiaJ8YKPRmgv;(QXbQPs;OhkA3m8Jv%7FIur>(z@^Pc zm8L`~DKs-QDt0!{J@zA2n%ZGz{5y9qP{;Nc_K(g}yPvAbY>&={gc#BK`b8ph>S>0n zZC9H&ay}5fOQhq_8jS0%;>eBsnAeEIw6?2lK={^n2R~4K%RbhhrT1MpWnn5eC$|pP z^I;VPGZEsH62JGYW&H0WqLzv!sPNo$o7OhI&uVogUOiBgVMvQ(oR~4&bNV=Y)REy@ zK^Snxs)nW+L0@A}Y7?ZMT6*3~OkCv7+7y}vG3Fl=*sY+bRzja%5q`6Da&%8g#Ool2cP=} z*w?u+jGh*zqiuY02azH>k0T;Vt6sylw3n)I_k)fg!EkuaC*=~auj(V}$ldayp81~#M;;7E#CKQto4%O0&meMdwMA3>6f3j(VDfoRMptyPL8FtD+b#HV zpfE!c{^b=$*s<&JR8EGXljW=Y3`c|GUmg>^8E!uphWw^C&oiZ(FTWhET#dxb?OrBf zM4;`@81yO^xr0!G6kpQ}U-2bD3XvuxvIzu!e3n!_LIgiGaPZQp;hUny2%?OV`&OQq zx!^Qoshk0-+mu(Vb?%>LL0|4x^0i%``bzh3tNYr&waevU_ln0D5)mgAEaLr(dYr4I z9{(yxEQ#@wj5Os?|E69fGXsA;Kn(8k4JSv=H(bBretJ8n0fk((-3#9@U8p+;wj%A&#! zYl)+H8Mh*1O$=*$D;T3I>M(eQkUkp;zGciD}6E2G=kF!&7d?>t;$af?l{ zIyOej_1?Q}J{PKrXIva$q-TNg*jwju=Jt=$kpr{&frs07IdM4Xy8g|)z$BekCGk2U zGc||5AQw$R?1$LE1n*0ge&SH%4eZR*6XB6q90q=osmaifdy7>gG?NOs3q-7M(zY6} zxoR6;UQ?n$G?J7?KV0mGl-#UC46&XqdY-tnio41O6T)9qU&|UUzt01qE zsHj?E_ZG>Nt*rYLb{@q@kL2RRz3qGS`33dr?Y5q~_E(DviEP;12ld$AFE&UHAei&- zDx%(gFC3a7-`s^h4p{%YD!b%QTPXS;>-78h8??GFjGbK+pX*0V7MYANej!!D7Ph z7Q!GeMM~d7jJm14Yk}IuZ*i@iNco(aM<2!Q?A)OJ4Wr1((uH7?O;w?4zF8)I=r*2y z-;#mdApgxRLCWxpJAu&RIgv85`0Eijm?9106321WR@-r8sDo`KnRggp19?bfxDZn| z7css;QI+z6@%GsKoY4kR*Q83LO`Wm4o#92Pg=?mIoz|2^#EN%C04C3xih=Cx;b*gO z7t2ZrD$xmW*oMn&qHbn0@xk0Y?WYq9V&Io0dzM=0=+NM#)5l+%OBX{ak!t4jCwD{a z-&s6`pQVi4+Qy&;{0PiVsNda4`T03Q2%pb5)aE_(=*bm4-lZ_>b^IAbGM6p-NIoS5 z*R#5L`XD@O{}=hd`z{NA_|k=;9oY;tz0#zReN55t4Wf7ae$@U-l4Ak=^8>yM@hVVn-19x;^dFOW0zE&d|H(#43U#++u$4;Vz4}XY3OknG-15T@?3n zcy0>2WgYp-HfqJ6;{4*coz~|%KJ>q}y|3uVly^RyWV${~vg~qB)YGu;;W?Z+V~y3S zp5xy#0-N2ij4=$@hooF@bmxWRNW>N(aiwH?$^nmqLH)v^>$9)gWs@}Ndc+6;Gt@$Y z!ak-=mvPQ%Ttr@--_@jRzPBByJDE1uZr3WRcBEI?RoXGh-NK7lt zD`osqBF=}KhV`5Hq{xV#{<70Z z%1Yy*9nF8fcd9bfKyx%TGw(Bdo)ORJd849#e|L}`7m3X82O11g_E; zaZ@ryFl?!Md#r<*a#N*f$PX^$6Iz(Pg7z2F|6|uJoOZm~BH*>7?&Q1pcdojRrYGH2 ziEnP{DeEswZg}EzqVJj-TR`Zt|{VDa+vX2 z@p@nR@%)+g5u!B;M|m$#`6F;kq<`wvmibEelV(nv^LT!*=lia8Klin!FDm$y$X&{_ zEyMk}YxPmv&yKTaE8Y^Eb#(Q%4;$Ast)6m&zhHyX2l3w5PvUpW$V=XMK4;6klX)%w zRCk~2d;NXyEwT3>kDH3s{>wgZ_c5-3=lPp?@ABJQR=$nDc<$}hDVrCyZhdpweF8%i zhqdp9#vDtds+{z!ZKc0bQi|`nt&ZIGd*_Sgcfz9;>hs=Co_dvqSL+Hxt?#KzFC*+Z zo_x>xdu8?U>nuz+&7=6ITzekEWAI5~ebywQr^#8r(zhI+#W}Hgf3)>|o%a0GX&aU# zv+X{oBx`>*amf+C8}n1%JlSqFwK%1JN8mk&)0_95)H`$fyYbDvNq@`hQtYbLK7F3? z;DCE~O1HxNDHjSNe{`K(JB#U=x!rBgy4P;@#`|kFWIL_=^!EYJH$$6*yBW-P|AZe% zz4}f?eq#Qy&AXQQroSwm^9NW=sMX7htYKunRCn<_=bVb)EjDWxKVUw{Ya%*Nwg26$ z_Z))$$}Wz!Kl7d^oL+PD|Hi%7UR-kw@AZ#)edNH2f7yS0nk^sS{Plb~=TBxMM%HbG z>c(F<=O$;)(pu){yi#$a3aed2+dj>n>3Ob0_Q&S4w>O-F5%r ztFXnPbs1i=_97OB*Q7o!HJK&w#p#62#g@f&iQEgfH9hmcWwsR91^cyf z+E>-89WsK3Q=7x)E>WE$CC|dhwr!@WU*W$SstW|!H(ND^T?LI!b8$@Z_L*B%C91Vp zXLU2f!gVfkKQFpp)%4s69-_+XZ>aIvdOSuII$$LT9I$dda8VaJU}Xy&ExDDvP6#qG zx_|@7ReJCOy3q0pXn5+aVR$EW?284+6)Y%$t}6wa+_Cc8jMXj>qcoa;Tn>v}&~>F- zLF04PXF?Z2$LB!n0$F74Lf4hv0*%kvKGTA(OzZ*