From c1e584d739ffa1682a3afbc0181efbc1de51583b Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Tue, 19 Sep 2023 05:12:44 +0800 Subject: [PATCH] feat: lots of changes - add BuildConfigWrapper - add project promote - add ci version tag support - change app analytics config item show when available - fix system api compat issues --- demo-app/build.gradle.kts | 2 +- .../apperrorsdemo/ui/activity/MainActivity.kt | 8 ++- .../ui/activity/base/BaseActivity.kt | 2 - .../src/main/res/layout/activity_main.xml | 1 + {app => module-app}/.gitignore | 0 module-app/build.gradle.kts | 2 +- {app => module-app}/proguard-rules.pro | 5 +- .../ExampleInstrumentedTest.kt | 0 module-app/src/main/ic_launcher-playstore.png | Bin 0 -> 12363 bytes .../application/AppErrorsApplication.kt | 0 .../bean/AppErrorsDisplayBean.kt | 0 .../bean/AppErrorsInfoBean.kt | 64 +++++++++++------- .../apperrorstracking/bean/AppFiltersBean.kt | 0 .../apperrorstracking/bean/AppInfoBean.kt | 0 .../bean/MutedErrorsAppBean.kt | 0 .../bean/enum/AppFiltersType.kt | 0 .../apperrorstracking/const/ConstFactory.kt | 59 ++++++++++++++++ .../data/AppErrorsConfigData.kt | 6 +- .../data/AppErrorsRecordData.kt | 16 +++-- .../apperrorstracking/data/ConfigData.kt | 0 .../data/enum/AppErrorsConfigType.kt | 0 .../data/factory/CompoundButtonFactory.kt | 0 .../apperrorstracking/hook/HookEntry.kt | 0 .../hook/entity/FrameworkHooker.kt | 27 +++++--- .../service/QuickStartTileService.kt | 0 .../ui/activity/base/BaseActivity.kt | 2 - .../ui/activity/debug/LoggerActivity.kt | 12 ++-- .../errors/AppErrorsDetailActivity.kt | 10 ++- .../errors/AppErrorsDisplayActivity.kt | 7 +- .../activity/errors/AppErrorsMutedActivity.kt | 2 - .../errors/AppErrorsRecordActivity.kt | 4 +- .../ui/activity/main/ConfigureActivity.kt | 0 .../ui/activity/main/MainActivity.kt | 38 +++++++++-- .../ui/widget/ItemLinearLayout.kt | 0 .../ui/widget/MaterialSwitch.kt | 0 .../utils/factory/BaseAdapterFactory.kt | 0 .../utils/factory/DialogBuilderFactory.kt | 2 +- .../utils/factory/FunctionFactory.kt | 43 +++++++++--- .../utils/factory/GsonFormatFactory.kt | 0 .../utils/factory/ThreadPoolFactory.kt | 0 .../utils/tool/AppAnalyticsTool.kt | 9 ++- .../utils/tool/FrameworkTool.kt | 32 ++++----- .../utils/tool/GithubReleaseTool.kt | 8 ++- .../utils/tool/ZipFileTool.kt | 8 ++- .../wrapper/BuildConfigWrapper.kt | 36 ++++++++++ .../main/res/drawable-night/bg_dark_round.xml | 0 .../drawable-night/bg_permotion_ripple.xml | 0 .../res/drawable-night/bg_permotion_round.xml | 0 .../src/main/res/drawable/bg_black_round.xml | 0 .../src/main/res/drawable/bg_blue_round.xml | 0 .../src/main/res/drawable/bg_button_round.xml | 0 .../src/main/res/drawable/bg_dark_round.xml | 0 .../src/main/res/drawable/bg_green_round.xml | 0 .../main/res/drawable/bg_logger_d_round.xml | 0 .../main/res/drawable/bg_logger_e_round.xml | 0 .../main/res/drawable/bg_logger_i_round.xml | 0 .../main/res/drawable/bg_logger_w_round.xml | 0 .../src/main/res/drawable/bg_orange_round.xml | 0 .../main/res/drawable/bg_permotion_ripple.xml | 0 .../main/res/drawable/bg_permotion_round.xml | 0 .../src/main/res/drawable/bg_red_round.xml | 0 .../src/main/res/drawable/bg_stack_round.xml | 0 .../src/main/res/drawable/bg_yellow_round.xml | 0 .../src/main/res/drawable/ic_android.xml | 0 .../src/main/res/drawable/ic_appcenter.xml | 0 .../src/main/res/drawable/ic_back.xml | 0 .../res/drawable/ic_baseline_bug_report.xml | 0 .../main/res/drawable/ic_baseline_close.xml | 0 .../main/res/drawable/ic_baseline_eject.xml | 0 .../main/res/drawable/ic_baseline_info.xml | 0 .../main/res/drawable/ic_baseline_refresh.xml | 0 .../src/main/res/drawable/ic_batch.xml | 0 .../src/main/res/drawable/ic_clear.xml | 0 .../src/main/res/drawable/ic_copy.xml | 0 .../src/main/res/drawable/ic_cpp.xml | 0 .../src/main/res/drawable/ic_debug.xml | 0 .../src/main/res/drawable/ic_exception.xml | 0 .../src/main/res/drawable/ic_export.xml | 0 .../src/main/res/drawable/ic_filter.xml | 0 .../src/main/res/drawable/ic_function.xml | 0 .../src/main/res/drawable/ic_github.xml | 0 .../src/main/res/drawable/ic_global.xml | 0 .../src/main/res/drawable/ic_home.xml | 0 .../src/main/res/drawable/ic_java.xml | 0 .../res/drawable/ic_launcher_foreground.xml | 0 .../src/main/res/drawable/ic_notify.xml | 0 .../src/main/res/drawable/ic_preference.xml | 0 .../src/main/res/drawable/ic_print.xml | 0 .../src/main/res/drawable/ic_refresh.xml | 0 .../src/main/res/drawable/ic_restart.xml | 0 .../src/main/res/drawable/ic_share.xml | 0 .../src/main/res/drawable/ic_statistics.xml | 0 .../src/main/res/drawable/ic_success.xml | 0 .../src/main/res/drawable/ic_theme.xml | 0 .../src/main/res/drawable/ic_warn.xml | 0 .../src/main/res/layout/activitiy_logger.xml | 0 .../res/layout/activity_app_errors_detail.xml | 0 .../layout/activity_app_errors_display.xml | 0 .../res/layout/activity_app_errors_muted.xml | 0 .../res/layout/activity_app_errors_record.xml | 0 .../src/main/res/layout/activity_config.xml | 0 .../src/main/res/layout/activity_main.xml | 53 +++++++++++++++ .../res/layout/adapter_app_errors_muted.xml | 0 .../res/layout/adapter_app_errors_record.xml | 0 .../src/main/res/layout/adapter_app_info.xml | 0 .../src/main/res/layout/adapter_logger.xml | 0 .../src/main/res/layout/dia_app_config.xml | 0 .../res/layout/dia_app_errors_display.xml | 0 .../res/layout/dia_app_errors_statistics.xml | 0 .../src/main/res/layout/dia_apps_filter.xml | 0 .../src/main/res/layout/dia_logger_filter.xml | 0 .../main/res/menu/menu_list_detail_action.xml | 0 .../src/main/res/menu/menu_logger_action.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../res/mipmap-xxhdpi/bg_payment_code.jpg | Bin 0 -> 125294 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_yukihookapi.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../src/main/res/values-night/color.xml | 0 .../src/main/res/values-night/themes.xml | 0 .../src/main/res/values/array.xml | 0 .../src/main/res/values/color.xml | 0 .../src/main/res/values/colors.xml | 0 .../res/values/ic_launcher_background.xml | 0 .../src/main/res/values/themes.xml | 0 .../src/main/res/xml/locales_config.xml | 0 .../apperrorstracking/ExampleUnitTest.kt | 0 136 files changed, 357 insertions(+), 101 deletions(-) rename {app => module-app}/.gitignore (100%) rename {app => module-app}/proguard-rules.pro (93%) rename {app => module-app}/src/androidTest/java/com/fankes/apperrorstracking/ExampleInstrumentedTest.kt (100%) create mode 100644 module-app/src/main/ic_launcher-playstore.png rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/application/AppErrorsApplication.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsDisplayBean.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsInfoBean.kt (79%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/bean/AppInfoBean.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/bean/MutedErrorsAppBean.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt (100%) create mode 100644 module-app/src/main/java/com/fankes/apperrorstracking/const/ConstFactory.kt rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/data/AppErrorsConfigData.kt (96%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/data/AppErrorsRecordData.kt (90%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/data/enum/AppErrorsConfigType.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt (95%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/service/QuickStartTileService.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/activity/base/BaseActivity.kt (99%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/activity/debug/LoggerActivity.kt (94%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt (93%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDisplayActivity.kt (93%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsMutedActivity.kt (98%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt (98%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt (79%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/widget/ItemLinearLayout.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/ui/widget/MaterialSwitch.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/factory/BaseAdapterFactory.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/factory/DialogBuilderFactory.kt (98%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt (92%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/factory/GsonFormatFactory.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/factory/ThreadPoolFactory.kt (100%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/tool/AppAnalyticsTool.kt (91%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt (93%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/tool/GithubReleaseTool.kt (96%) rename {app => module-app}/src/main/java/com/fankes/apperrorstracking/utils/tool/ZipFileTool.kt (96%) create mode 100644 module-app/src/main/java/com/fankes/apperrorstracking/wrapper/BuildConfigWrapper.kt rename {app => module-app}/src/main/res/drawable-night/bg_dark_round.xml (100%) rename {app => module-app}/src/main/res/drawable-night/bg_permotion_ripple.xml (100%) rename {app => module-app}/src/main/res/drawable-night/bg_permotion_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_black_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_blue_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_button_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_dark_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_green_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_logger_d_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_logger_e_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_logger_i_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_logger_w_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_orange_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_permotion_ripple.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_permotion_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_red_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_stack_round.xml (100%) rename {app => module-app}/src/main/res/drawable/bg_yellow_round.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_android.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_appcenter.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_back.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_baseline_bug_report.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_baseline_close.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_baseline_eject.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_baseline_info.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_baseline_refresh.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_batch.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_clear.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_copy.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_cpp.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_debug.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_exception.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_export.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_filter.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_function.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_github.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_global.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_home.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_java.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_launcher_foreground.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_notify.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_preference.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_print.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_refresh.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_restart.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_share.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_statistics.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_success.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_theme.xml (100%) rename {app => module-app}/src/main/res/drawable/ic_warn.xml (100%) rename {app => module-app}/src/main/res/layout/activitiy_logger.xml (100%) rename {app => module-app}/src/main/res/layout/activity_app_errors_detail.xml (100%) rename {app => module-app}/src/main/res/layout/activity_app_errors_display.xml (100%) rename {app => module-app}/src/main/res/layout/activity_app_errors_muted.xml (100%) rename {app => module-app}/src/main/res/layout/activity_app_errors_record.xml (100%) rename {app => module-app}/src/main/res/layout/activity_config.xml (100%) rename {app => module-app}/src/main/res/layout/activity_main.xml (92%) rename {app => module-app}/src/main/res/layout/adapter_app_errors_muted.xml (100%) rename {app => module-app}/src/main/res/layout/adapter_app_errors_record.xml (100%) rename {app => module-app}/src/main/res/layout/adapter_app_info.xml (100%) rename {app => module-app}/src/main/res/layout/adapter_logger.xml (100%) rename {app => module-app}/src/main/res/layout/dia_app_config.xml (100%) rename {app => module-app}/src/main/res/layout/dia_app_errors_display.xml (100%) rename {app => module-app}/src/main/res/layout/dia_app_errors_statistics.xml (100%) rename {app => module-app}/src/main/res/layout/dia_apps_filter.xml (100%) rename {app => module-app}/src/main/res/layout/dia_logger_filter.xml (100%) rename {app => module-app}/src/main/res/menu/menu_list_detail_action.xml (100%) rename {app => module-app}/src/main/res/menu/menu_logger_action.xml (100%) rename {app => module-app}/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {app => module-app}/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {app => module-app}/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {app => module-app}/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename {app => module-app}/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {app => module-app}/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename {app => module-app}/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {app => module-app}/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) create mode 100644 module-app/src/main/res/mipmap-xxhdpi/bg_payment_code.jpg rename {app => module-app}/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {app => module-app}/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename {app => module-app}/src/main/res/mipmap-xxhdpi/ic_yukihookapi.png (100%) rename {app => module-app}/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {app => module-app}/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename {app => module-app}/src/main/res/values-night/color.xml (100%) rename {app => module-app}/src/main/res/values-night/themes.xml (100%) rename {app => module-app}/src/main/res/values/array.xml (100%) rename {app => module-app}/src/main/res/values/color.xml (100%) rename {app => module-app}/src/main/res/values/colors.xml (100%) rename {app => module-app}/src/main/res/values/ic_launcher_background.xml (100%) rename {app => module-app}/src/main/res/values/themes.xml (100%) rename {app => module-app}/src/main/res/xml/locales_config.xml (100%) rename {app => module-app}/src/test/java/com/fankes/apperrorstracking/ExampleUnitTest.kt (100%) diff --git a/demo-app/build.gradle.kts b/demo-app/build.gradle.kts index 302d279..af7410d 100644 --- a/demo-app/build.gradle.kts +++ b/demo-app/build.gradle.kts @@ -66,7 +66,7 @@ androidComponents { val currentSuffix = property.github.ci.commit.id.let { suffix -> if (suffix.isNotBlank()) "-$suffix" else "" } val currentVersion = "${output.versionName.get()}$currentSuffix(${output.versionCode.get()})" if (output is com.android.build.api.variant.impl.VariantOutputImpl) - output.outputFileName.set("${property.project.name}-v$currentVersion-$currentType.apk") + output.outputFileName.set("${property.project.name}-demo-v$currentVersion-$currentType.apk") } } } diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt index 10081f8..71fcd9a 100644 --- a/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt +++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/MainActivity.kt @@ -19,19 +19,25 @@ * * This file is Created by fankes on 2022/5/10. */ +@file:Suppress("SetTextI18n") + package com.fankes.apperrorsdemo.ui.activity import android.content.Intent import android.os.SystemClock +import com.fankes.apperrorsdemo.R import com.fankes.apperrorsdemo.databinding.ActivityMainBinding import com.fankes.apperrorsdemo.databinding.ActivityMultiProcessBinding +import com.fankes.apperrorsdemo.generated.DemoAppProperties import com.fankes.apperrorsdemo.native.Channel import com.fankes.apperrorsdemo.ui.activity.base.BaseActivity class MainActivity : BaseActivity() { override fun onCreate() { - binding.titleBackIcon.setOnClickListener { finish() } + DemoAppProperties.GITHUB_CI_COMMIT_ID.takeIf(String::isNotBlank)?.also { + binding.titleText.text = "${getString(R.string.app_name)} ($it)" + }; binding.titleBackIcon.setOnClickListener { finish() } binding.throwRuntimeButton.setOnClickListener { Channel.throwRuntimeException() } binding.throwIllegalStateButton.setOnClickListener { Channel.throwIllegalStateException() } binding.throwNullPointerButton.setOnClickListener { Channel.throwNullPointerException() } diff --git a/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt index 2e9e5fb..932b3d8 100644 --- a/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt +++ b/demo-app/src/main/java/com/fankes/apperrorsdemo/ui/activity/base/BaseActivity.kt @@ -19,8 +19,6 @@ * * This file is Created by fankes on 2022/5/10. */ -@file:Suppress("UNCHECKED_CAST") - package com.fankes.apperrorsdemo.ui.activity.base import android.os.Build diff --git a/demo-app/src/main/res/layout/activity_main.xml b/demo-app/src/main/res/layout/activity_main.xml index 12a565b..7f5a8a3 100644 --- a/demo-app/src/main/res/layout/activity_main.xml +++ b/demo-app/src/main/res/layout/activity_main.xml @@ -30,6 +30,7 @@ android:tooltipText="@string/back" /> if (suffix.isNotBlank()) "-$suffix" else "" } val currentVersion = "${output.versionName.get()}$currentSuffix(${output.versionCode.get()})" if (output is com.android.build.api.variant.impl.VariantOutputImpl) - output.outputFileName.set("${property.project.name}-v$currentVersion-$currentType.apk") + output.outputFileName.set("${property.project.name}-module-v$currentVersion-$currentType.apk") } } } diff --git a/app/proguard-rules.pro b/module-app/proguard-rules.pro similarity index 93% rename from app/proguard-rules.pro rename to module-app/proguard-rules.pro index 825bd6e..4b94992 100644 --- a/app/proguard-rules.pro +++ b/module-app/proguard-rules.pro @@ -64,4 +64,7 @@ public static *** throwUninitializedPropertyAccessException(...); } --keep class com.fankes.apperrorstracking.databinding**{*;} \ No newline at end of file +-keep class * extends android.app.Activity +-keepclassmembers class * implements androidx.viewbinding.ViewBinding { + *** inflate(android.view.LayoutInflater); +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/fankes/apperrorstracking/ExampleInstrumentedTest.kt b/module-app/src/androidTest/java/com/fankes/apperrorstracking/ExampleInstrumentedTest.kt similarity index 100% rename from app/src/androidTest/java/com/fankes/apperrorstracking/ExampleInstrumentedTest.kt rename to module-app/src/androidTest/java/com/fankes/apperrorstracking/ExampleInstrumentedTest.kt diff --git a/module-app/src/main/ic_launcher-playstore.png b/module-app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b36f23f40e58cc0b995dddb04383cb217bca25 GIT binary patch literal 12363 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 M=g*X$a=rWi0IRRCQ~&?~ literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/fankes/apperrorstracking/application/AppErrorsApplication.kt b/module-app/src/main/java/com/fankes/apperrorstracking/application/AppErrorsApplication.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/application/AppErrorsApplication.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/application/AppErrorsApplication.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsDisplayBean.kt b/module-app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsDisplayBean.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsDisplayBean.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsDisplayBean.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsInfoBean.kt b/module-app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsInfoBean.kt similarity index 79% rename from app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsInfoBean.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsInfoBean.kt index 007a9f1..8b80d3c 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsInfoBean.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/bean/AppErrorsInfoBean.kt @@ -25,11 +25,16 @@ import android.app.ApplicationErrorReport import android.content.Context import android.os.Build import com.fankes.apperrorstracking.locale.LocaleString -import com.fankes.apperrorstracking.utils.factory.* +import com.fankes.apperrorstracking.utils.factory.appCpuAbiOf +import com.fankes.apperrorstracking.utils.factory.appVersionCodeOf +import com.fankes.apperrorstracking.utils.factory.appVersionNameOf +import com.fankes.apperrorstracking.utils.factory.difference +import com.fankes.apperrorstracking.utils.factory.toUtcTime import com.google.gson.annotations.SerializedName import java.io.Serializable import java.text.SimpleDateFormat -import java.util.* +import java.util.Date +import java.util.Locale /** * 应用异常信息 bean @@ -130,7 +135,7 @@ data class AppErrorsInfoBean( * 获取生成的 Json 文件名 * @return [String] */ - val jsonFileName get() = "${packageName}_${pid}_${timestamp}.json" + val jsonFileName get() = "${packageName}_${pid}_$timestamp.json" /** * 获取 APP 版本信息与版本号 @@ -170,39 +175,46 @@ data class AppErrorsInfoBean( * @return [String] */ val stackOutputShareContent - get() = "Generated by AppErrorsTracking\n" + - "Project Url: https://github.com/KitsunePie/AppErrorsTracking\n" + - "===============\n$environmentInfo" + get() = """ + Generated by AppErrorsTracking + Project Url: https://github.com/KitsunePie/AppErrorsTracking + =============== + $environmentInfo + """.trimIndent() /** * 获取异常堆栈文件模板 * @return [String] */ val stackOutputFileContent - get() = "================================================================\n" + - " Generated by AppErrorsTracking\n" + - " Project Url: https://github.com/KitsunePie/AppErrorsTracking\n" + - "================================================================\n" + - environmentInfo + get() = """ + ================================================================ + Generated by AppErrorsTracking + Project Url: https://github.com/KitsunePie/AppErrorsTracking + ================================================================ + """.trimIndent() /** * 获取运行环境信息 * @return [String] */ private val environmentInfo - get() = "[Device Brand]: ${Build.BRAND}\n" + - "[Device Model]: ${Build.MODEL}\n" + - "[Display]: ${Build.DISPLAY}\n" + - "[Android Version]: ${Build.VERSION.RELEASE}\n" + - "[Android API Level]: ${Build.VERSION.SDK_INT}\n" + - "[System Locale]: ${Locale.getDefault()}\n" + - "[Process ID]: $pid\n" + - (if (userId > 0) "[User Id]: $userId\n" else "") + - "[CPU ABI]: ${cpuAbi.ifBlank { "none" }}\n" + - "[Package Name]: $packageName\n" + - "[Version Name]: ${versionName.ifBlank { "unknown" }}\n" + - "[Version Code]: ${versionCode.takeIf { it != -1L } ?: "unknown"}\n" + - "[Error Type]: ${if (isNativeCrash) "Native" else "JVM"}\n" + - "[Crash Time]: $utcTime\n" + - "[Stack Trace]:\n" + stackTrace + get() = """ + [Device Brand]: ${Build.BRAND} + [Device Model]: ${Build.MODEL} + [Display]: ${Build.DISPLAY} + [Android Version]: ${Build.VERSION.RELEASE} + [Android API Level]: ${Build.VERSION.SDK_INT} + [System Locale]: ${Locale.getDefault()} + [Process ID]: $pid + [User ID]: $userId + [CPU ABI]: ${cpuAbi.ifBlank { "none" }} + [Package Name]: $packageName + [Version Name]: ${versionName.ifBlank { "unknown" }} + [Version Code]: ${versionCode.takeIf { it != -1L } ?: "unknown"} + [Error Type]: ${if (isNativeCrash) "Native" else "JVM"} + [Crash Time]: $utcTime + [Stack Trace]: + $stackTrace + """.trimIndent() } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt b/module-app/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/bean/AppInfoBean.kt b/module-app/src/main/java/com/fankes/apperrorstracking/bean/AppInfoBean.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/bean/AppInfoBean.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/bean/AppInfoBean.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/bean/MutedErrorsAppBean.kt b/module-app/src/main/java/com/fankes/apperrorstracking/bean/MutedErrorsAppBean.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/bean/MutedErrorsAppBean.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/bean/MutedErrorsAppBean.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt b/module-app/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/const/ConstFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/const/ConstFactory.kt new file mode 100644 index 0000000..ce5e4ef --- /dev/null +++ b/module-app/src/main/java/com/fankes/apperrorstracking/const/ConstFactory.kt @@ -0,0 +1,59 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2017-2023 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is created by fankes on 2023/9/19. + */ +@file:Suppress("MemberVisibilityCanBePrivate") + +package com.fankes.apperrorstracking.const + +import com.fankes.apperrorstracking.generated.ModuleAppProperties +import com.fankes.apperrorstracking.wrapper.BuildConfigWrapper + +/** + * 包名常量定义类 + */ +object PackageName { + + /** 系统框架 */ + const val SYSTEM_FRAMEWORK = "android" +} + +/** + * 模块版本常量定义类 + */ +object ModuleVersion { + + /** 当前 GitHub 提交的 ID (CI 自动构建) */ + const val GITHUB_COMMIT_ID = ModuleAppProperties.GITHUB_CI_COMMIT_ID + + /** 版本名称 */ + const val NAME = BuildConfigWrapper.VERSION_NAME + + /** 版本号 */ + const val CODE = BuildConfigWrapper.VERSION_CODE + + /** 是否为 CI 自动构建版本 */ + val isCiMode = GITHUB_COMMIT_ID.isNotBlank() + + /** 当前版本名称后缀 */ + val suffix = GITHUB_COMMIT_ID.let { if (it.isNotBlank()) "-$it" else "" } + + override fun toString() = "$NAME$suffix($CODE)" +} \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsConfigData.kt b/module-app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsConfigData.kt similarity index 96% rename from app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsConfigData.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsConfigData.kt index 898c675..450b57e 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsConfigData.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsConfigData.kt @@ -74,9 +74,9 @@ object AppErrorsConfigData { if (packageName.isNotBlank()) when (type) { AppErrorsConfigType.GLOBAL -> showDialogApps.contains(packageName).not() && - showNotifyApps.contains(packageName).not() && - showToastApps.contains(packageName).not() && - showNothingApps.contains(packageName).not() + showNotifyApps.contains(packageName).not() && + showToastApps.contains(packageName).not() && + showNothingApps.contains(packageName).not() AppErrorsConfigType.DIALOG -> showDialogApps.contains(packageName) AppErrorsConfigType.NOTIFY -> showNotifyApps.contains(packageName) AppErrorsConfigType.TOAST -> showToastApps.contains(packageName) diff --git a/app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsRecordData.kt b/module-app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsRecordData.kt similarity index 90% rename from app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsRecordData.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsRecordData.kt index 74c4119..37ee934 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsRecordData.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/data/AppErrorsRecordData.kt @@ -26,7 +26,11 @@ package com.fankes.apperrorstracking.data import android.content.Context import android.provider.Settings import com.fankes.apperrorstracking.bean.AppErrorsInfoBean -import com.fankes.apperrorstracking.utils.factory.* +import com.fankes.apperrorstracking.utils.factory.appCpuAbiOf +import com.fankes.apperrorstracking.utils.factory.appVersionCodeOf +import com.fankes.apperrorstracking.utils.factory.appVersionNameOf +import com.fankes.apperrorstracking.utils.factory.toEntityOrNull +import com.fankes.apperrorstracking.utils.factory.toJsonOrNull import com.highcapable.yukihookapi.hook.log.loggerE import java.io.File import java.util.concurrent.CopyOnWriteArrayList @@ -91,11 +95,11 @@ object AppErrorsRecordData { e.versionCode = it.appVersionCodeOf(e.packageName) e.toJsonOrNull()?.also { json -> File(errorsInfoDataFolder.absolutePath, e.jsonFileName).writeText(json) } }.let { result -> - if (result != null) { - Settings.Secure.putString(it.contentResolver, keyName, "") - result - } else null - } + if (result != null) { + Settings.Secure.putString(it.contentResolver, keyName, "") + result + } else null + } }.getOrNull() } diff --git a/app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt b/module-app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/data/ConfigData.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/data/enum/AppErrorsConfigType.kt b/module-app/src/main/java/com/fankes/apperrorstracking/data/enum/AppErrorsConfigType.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/data/enum/AppErrorsConfigType.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/data/enum/AppErrorsConfigType.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/data/factory/CompoundButtonFactory.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt b/module-app/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/hook/HookEntry.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt b/module-app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt similarity index 95% rename from app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt index ecfa62f..75823c9 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt @@ -19,6 +19,8 @@ * * This file is Created by fankes on 2022/5/7. */ +@file:Suppress("ConstPropertyName") + package com.fankes.apperrorstracking.hook.entity import android.app.ApplicationErrorReport @@ -33,7 +35,6 @@ import android.os.SystemClock import android.util.ArrayMap import androidx.core.graphics.drawable.IconCompat import androidx.core.graphics.drawable.toBitmap -import com.fankes.apperrorstracking.BuildConfig import com.fankes.apperrorstracking.R import com.fankes.apperrorstracking.bean.AppErrorsDisplayBean import com.fankes.apperrorstracking.bean.AppErrorsInfoBean @@ -47,8 +48,16 @@ import com.fankes.apperrorstracking.data.enum.AppErrorsConfigType import com.fankes.apperrorstracking.locale.LocaleString import com.fankes.apperrorstracking.ui.activity.errors.AppErrorsDisplayActivity import com.fankes.apperrorstracking.ui.activity.errors.AppErrorsRecordActivity -import com.fankes.apperrorstracking.utils.factory.* +import com.fankes.apperrorstracking.utils.factory.appNameOf +import com.fankes.apperrorstracking.utils.factory.drawableOf +import com.fankes.apperrorstracking.utils.factory.isAppCanOpened +import com.fankes.apperrorstracking.utils.factory.listOfPackages +import com.fankes.apperrorstracking.utils.factory.openApp +import com.fankes.apperrorstracking.utils.factory.pushNotify +import com.fankes.apperrorstracking.utils.factory.toArrayList +import com.fankes.apperrorstracking.utils.factory.toast import com.fankes.apperrorstracking.utils.tool.FrameworkTool +import com.fankes.apperrorstracking.wrapper.BuildConfigWrapper import com.highcapable.yukihookapi.hook.bean.VariousClass import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker import com.highcapable.yukihookapi.hook.factory.field @@ -241,7 +250,7 @@ object FrameworkHooker : YukiBaseHooker() { onPushAppListData { filters -> appContext?.let { context -> context.listOfPackages() - .filter { it.packageName.let { e -> e != "android" && e != BuildConfig.APPLICATION_ID } } + .filter { it.packageName.let { e -> e != "android" && e != BuildConfigWrapper.APPLICATION_ID } } .let { info -> arrayListOf().apply { if (info.isNotEmpty()) @@ -309,9 +318,9 @@ object FrameworkHooker : YukiBaseHooker() { title = errorTitle, isShowAppInfoButton = isActualApp, isShowReopenButton = isActualApp && - (isRepeatingCrash.not() || ConfigData.isEnableAlwaysShowsReopenAppOptions) && - context.isAppCanOpened(packageName) && - isMainProcess, + (isRepeatingCrash.not() || ConfigData.isEnableAlwaysShowsReopenAppOptions) && + context.isAppCanOpened(packageName) && + isMainProcess, isShowCloseAppButton = isActualApp ) ) @@ -322,7 +331,7 @@ object FrameworkHooker : YukiBaseHooker() { /** 判断是否为主进程 */ if (isMainProcess.not() && ConfigData.isEnableOnlyShowErrorsInMain) return when { - packageName == BuildConfig.APPLICATION_ID -> { + packageName == BuildConfigWrapper.APPLICATION_ID -> { context.toast(msg = "AppErrorsTracking has crashed, please see the log in console") loggerE(msg = "AppErrorsTracking has crashed itself, please see the Android Runtime Exception in console") } @@ -343,8 +352,8 @@ object FrameworkHooker : YukiBaseHooker() { /** 打印错误日志 */ if (isActualApp) loggerE( msg = "Application \"$packageName\" ${if (isRepeatingCrash) "keeps stopping" else "has stopped"}" + - (if (packageName != processName) " --process \"$processName\"" else "") + - "${if (userId != 0) " --user $userId" else ""} --pid $pid" + (if (packageName != processName) " --process \"$processName\"" else "") + + "${if (userId != 0) " --user $userId" else ""} --pid $pid" ) else loggerE(msg = "Process \"$processName\" ${if (isRepeatingCrash) "keeps stopping" else "has stopped"} --pid $pid") } diff --git a/app/src/main/java/com/fankes/apperrorstracking/service/QuickStartTileService.kt b/module-app/src/main/java/com/fankes/apperrorstracking/service/QuickStartTileService.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/service/QuickStartTileService.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/service/QuickStartTileService.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/base/BaseActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/base/BaseActivity.kt similarity index 99% rename from app/src/main/java/com/fankes/apperrorstracking/ui/activity/base/BaseActivity.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/base/BaseActivity.kt index 96b4dee..db5eb43 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/base/BaseActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/base/BaseActivity.kt @@ -19,8 +19,6 @@ * * This file is Created by fankes on 2022/5/7. */ -@file:Suppress("UNCHECKED_CAST") - package com.fankes.apperrorstracking.ui.activity.base import android.app.ActivityManager diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/debug/LoggerActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/debug/LoggerActivity.kt similarity index 94% rename from app/src/main/java/com/fankes/apperrorstracking/ui/activity/debug/LoggerActivity.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/debug/LoggerActivity.kt index 65e7b67..c768088 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/debug/LoggerActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/debug/LoggerActivity.kt @@ -31,20 +31,24 @@ import android.view.View import android.widget.AdapterView import androidx.core.view.isVisible import com.fankes.apperrorstracking.R +import com.fankes.apperrorstracking.const.PackageName import com.fankes.apperrorstracking.databinding.ActivitiyLoggerBinding import com.fankes.apperrorstracking.databinding.AdapterLoggerBinding import com.fankes.apperrorstracking.databinding.DiaLoggerFilterBinding import com.fankes.apperrorstracking.locale.LocaleString import com.fankes.apperrorstracking.ui.activity.base.BaseActivity -import com.fankes.apperrorstracking.utils.factory.* -import com.fankes.apperrorstracking.utils.tool.FrameworkTool +import com.fankes.apperrorstracking.utils.factory.bindAdapter +import com.fankes.apperrorstracking.utils.factory.copyToClipboard +import com.fankes.apperrorstracking.utils.factory.showDialog +import com.fankes.apperrorstracking.utils.factory.toUtcTime +import com.fankes.apperrorstracking.utils.factory.toast import com.highcapable.yukihookapi.hook.factory.dataChannel import com.highcapable.yukihookapi.hook.log.YukiHookLogger import com.highcapable.yukihookapi.hook.log.YukiLoggerData import java.io.ByteArrayOutputStream import java.io.PrintStream import java.text.SimpleDateFormat -import java.util.* +import java.util.Date class LoggerActivity : BaseActivity() { @@ -124,7 +128,7 @@ class LoggerActivity : BaseActivity() { /** 更新列表数据 */ private fun refreshData() { - dataChannel(FrameworkTool.SYSTEM_FRAMEWORK_NAME).obtainLoggerInMemoryData { + dataChannel(PackageName.SYSTEM_FRAMEWORK).obtainLoggerInMemoryData { listData.clear() it.takeIf { e -> e.isNotEmpty() }?.reversed()?.filter { filters.any { e -> it.priority == e } }?.forEach { e -> listData.add(e) } onChanged?.invoke() diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt similarity index 93% rename from app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt index 4d1777b..0d43ab3 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDetailActivity.kt @@ -36,7 +36,15 @@ import com.fankes.apperrorstracking.data.factory.bind import com.fankes.apperrorstracking.databinding.ActivityAppErrorsDetailBinding import com.fankes.apperrorstracking.locale.LocaleString import com.fankes.apperrorstracking.ui.activity.base.BaseActivity -import com.fankes.apperrorstracking.utils.factory.* +import com.fankes.apperrorstracking.utils.factory.appIconOf +import com.fankes.apperrorstracking.utils.factory.appNameOf +import com.fankes.apperrorstracking.utils.factory.copyToClipboard +import com.fankes.apperrorstracking.utils.factory.dp +import com.fankes.apperrorstracking.utils.factory.getSerializableExtraCompat +import com.fankes.apperrorstracking.utils.factory.navigate +import com.fankes.apperrorstracking.utils.factory.openSelfSetting +import com.fankes.apperrorstracking.utils.factory.showDialog +import com.fankes.apperrorstracking.utils.factory.toast import com.highcapable.yukihookapi.hook.log.loggerE class AppErrorsDetailActivity : BaseActivity() { diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDisplayActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDisplayActivity.kt similarity index 93% rename from app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDisplayActivity.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDisplayActivity.kt index 1cd6cf2..4345c64 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDisplayActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsDisplayActivity.kt @@ -31,7 +31,12 @@ import com.fankes.apperrorstracking.databinding.ActivityAppErrorsDisplayBinding import com.fankes.apperrorstracking.databinding.DiaAppErrorsDisplayBinding import com.fankes.apperrorstracking.locale.LocaleString import com.fankes.apperrorstracking.ui.activity.base.BaseActivity -import com.fankes.apperrorstracking.utils.factory.* +import com.fankes.apperrorstracking.utils.factory.colorOf +import com.fankes.apperrorstracking.utils.factory.getSerializableExtraCompat +import com.fankes.apperrorstracking.utils.factory.navigate +import com.fankes.apperrorstracking.utils.factory.openSelfSetting +import com.fankes.apperrorstracking.utils.factory.showDialog +import com.fankes.apperrorstracking.utils.factory.toast import com.fankes.apperrorstracking.utils.tool.FrameworkTool class AppErrorsDisplayActivity : BaseActivity() { diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsMutedActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsMutedActivity.kt similarity index 98% rename from app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsMutedActivity.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsMutedActivity.kt index b2d4bc4..411e24e 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsMutedActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsMutedActivity.kt @@ -19,8 +19,6 @@ * * This file is Created by fankes on 2022/6/3. */ -@file:Suppress("DEPRECATION", "OVERRIDE_DEPRECATION") - package com.fankes.apperrorstracking.ui.activity.errors import androidx.core.view.isVisible diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt similarity index 98% rename from app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt index b866199..a18d491 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt @@ -31,7 +31,6 @@ import android.view.MenuItem import android.view.View import android.widget.AdapterView.AdapterContextMenuInfo import androidx.core.view.isVisible -import com.fankes.apperrorstracking.BuildConfig import com.fankes.apperrorstracking.R import com.fankes.apperrorstracking.bean.AppErrorsInfoBean import com.fankes.apperrorstracking.bean.AppFiltersBean @@ -44,6 +43,7 @@ import com.fankes.apperrorstracking.ui.activity.base.BaseActivity import com.fankes.apperrorstracking.utils.factory.* import com.fankes.apperrorstracking.utils.tool.FrameworkTool import com.fankes.apperrorstracking.utils.tool.ZipFileTool +import com.fankes.apperrorstracking.wrapper.BuildConfigWrapper import java.io.File import java.io.FileInputStream @@ -58,7 +58,7 @@ class AppErrorsRecordActivity : BaseActivity() { * 获取 [Intent] * @return [Intent] */ - fun intent() = Intent().apply { component = ComponentName(BuildConfig.APPLICATION_ID, AppErrorsRecordActivity::class.java.name) } + fun intent() = Intent().apply { component = ComponentName(BuildConfigWrapper.APPLICATION_ID, AppErrorsRecordActivity::class.java.name) } } /** 当前导出文件的路径 */ diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt similarity index 79% rename from app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt index ea1d068..3a6325e 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt @@ -25,8 +25,8 @@ package com.fankes.apperrorstracking.ui.activity.main import android.os.Build import androidx.core.view.isVisible -import com.fankes.apperrorstracking.BuildConfig import com.fankes.apperrorstracking.R +import com.fankes.apperrorstracking.const.ModuleVersion import com.fankes.apperrorstracking.data.ConfigData import com.fankes.apperrorstracking.data.factory.bind import com.fankes.apperrorstracking.databinding.ActivityMainBinding @@ -35,10 +35,18 @@ import com.fankes.apperrorstracking.ui.activity.base.BaseActivity import com.fankes.apperrorstracking.ui.activity.debug.LoggerActivity import com.fankes.apperrorstracking.ui.activity.errors.AppErrorsMutedActivity import com.fankes.apperrorstracking.ui.activity.errors.AppErrorsRecordActivity -import com.fankes.apperrorstracking.utils.factory.* +import com.fankes.apperrorstracking.utils.factory.hideOrShowLauncherIcon +import com.fankes.apperrorstracking.utils.factory.isLauncherIconShowing +import com.fankes.apperrorstracking.utils.factory.isSystemLanguageSimplifiedChinese +import com.fankes.apperrorstracking.utils.factory.navigate +import com.fankes.apperrorstracking.utils.factory.openBrowser +import com.fankes.apperrorstracking.utils.factory.showDialog +import com.fankes.apperrorstracking.utils.factory.toast +import com.fankes.apperrorstracking.utils.tool.AppAnalyticsTool import com.fankes.apperrorstracking.utils.tool.AppAnalyticsTool.bindAppAnalytics import com.fankes.apperrorstracking.utils.tool.FrameworkTool import com.fankes.apperrorstracking.utils.tool.GithubReleaseTool +import com.fankes.projectpromote.ProjectPromote import com.highcapable.yukihookapi.YukiHookAPI class MainActivity : BaseActivity() { @@ -55,13 +63,15 @@ class MainActivity : BaseActivity() { override fun onCreate() { checkingTopComponentName() /** 检查更新 */ - GithubReleaseTool.checkingForUpdate(context = this, BuildConfig.VERSION_NAME) { version, function -> + GithubReleaseTool.checkingForUpdate(context = this, ModuleVersion.NAME) { version, function -> binding.mainTextReleaseVersion.apply { text = LocaleString.clickToUpdate(version) isVisible = true setOnClickListener { function() } } } + /** 推广、恰饭 */ + if (YukiHookAPI.Status.isXposedModuleActive) ProjectPromote.show(activity = this, ModuleVersion.toString()) /** 显示开发者提示 */ if (ConfigData.isShowDeveloperNotice) showDialog { @@ -70,7 +80,21 @@ class MainActivity : BaseActivity() { confirmButton(LocaleString.gotIt) { ConfigData.isShowDeveloperNotice = false } noCancelable() } - binding.mainTextVersion.text = LocaleString.moduleVersion(BuildConfig.VERSION_NAME) + /** 设置 CI 自动构建标识 */ + if (ModuleVersion.isCiMode) + binding.mainTextReleaseVersion.apply { + text = "CI ${ModuleVersion.GITHUB_COMMIT_ID}" + isVisible = true + setOnClickListener { + showDialog { + title = LocaleString.ciNoticeDialogTitle + msg = LocaleString.ciNoticeDialogContent(ModuleVersion.GITHUB_COMMIT_ID) + confirmButton(LocaleString.gotIt) + noCancelable() + } + } + } + binding.mainTextVersion.text = LocaleString.moduleVersion(ModuleVersion.NAME) binding.mainTextSystemVersion.text = LocaleString.systemVersion(systemVersion) binding.onlyShowErrorsInFrontSwitch.bind(ConfigData.ENABLE_ONLY_SHOW_ERRORS_IN_FRONT) binding.onlyShowErrorsInMainProcessSwitch.bind(ConfigData.ENABLE_ONLY_SHOW_ERRORS_IN_MAIN) @@ -81,6 +105,7 @@ class MainActivity : BaseActivity() { } binding.enableMaterial3AppErrorsDialogSwitch.bind(ConfigData.ENABLE_MATERIAL3_STYLE_APP_ERRORS_DIALOG) /** 设置匿名统计 */ + binding.appAnalyticsConfigItem.isVisible = AppAnalyticsTool.isAvailable binding.enableAnonymousStatisticsSwitch.bindAppAnalytics() /** 系统版本点击事件 */ binding.mainTextSystemVersion.setOnClickListener { @@ -101,6 +126,11 @@ class MainActivity : BaseActivity() { binding.titleRestartIcon.setOnClickListener { FrameworkTool.restartSystem(context = this) } /** 项目地址按钮点击事件 */ binding.titleGithubIcon.setOnClickListener { openBrowser(url = "https://github.com/KitsunePie/AppErrorsTracking") } + /** 恰饭! */ + binding.paymentFollowingZhCnItem.isVisible = isSystemLanguageSimplifiedChinese + binding.linkWithFollowMe.setOnClickListener { + openBrowser(url = "https://www.coolapk.com/u/876977", packageName = "com.coolapk.market") + } /** 设置桌面图标显示隐藏 */ binding.hideIconInLauncherSwitch.isChecked = isLauncherIconShowing.not() binding.hideIconInLauncherSwitch.setOnCheckedChangeListener { btn, b -> diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/widget/ItemLinearLayout.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/widget/ItemLinearLayout.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/ui/widget/ItemLinearLayout.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/widget/ItemLinearLayout.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/widget/MaterialSwitch.kt b/module-app/src/main/java/com/fankes/apperrorstracking/ui/widget/MaterialSwitch.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/ui/widget/MaterialSwitch.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/ui/widget/MaterialSwitch.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/BaseAdapterFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/BaseAdapterFactory.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/utils/factory/BaseAdapterFactory.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/BaseAdapterFactory.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/DialogBuilderFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/DialogBuilderFactory.kt similarity index 98% rename from app/src/main/java/com/fankes/apperrorstracking/utils/factory/DialogBuilderFactory.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/DialogBuilderFactory.kt index 426d173..fd6702e 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/DialogBuilderFactory.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/DialogBuilderFactory.kt @@ -19,7 +19,7 @@ * * This file is Created by fankes on 2022/5/12. */ -@file:Suppress("unused", "DEPRECATION", "OPT_IN_USAGE", "EXPERIMENTAL_API_USAGE") +@file:Suppress("unused", "OPT_IN_USAGE", "EXPERIMENTAL_API_USAGE") package com.fankes.apperrorstracking.utils.factory diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt similarity index 92% rename from app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt index 8ed00cd..66a7653 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt @@ -23,8 +23,16 @@ package com.fankes.apperrorstracking.utils.factory -import android.app.* -import android.content.* +import android.app.Activity +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.app.Service +import android.content.ClipData +import android.content.ClipboardManager +import android.content.ComponentName +import android.content.Context +import android.content.Intent import android.content.pm.PackageInfo import android.content.pm.PackageManager import android.content.pm.PackageManager.PackageInfoFlags @@ -43,9 +51,9 @@ import androidx.core.content.getSystemService import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.drawable.IconCompat -import com.fankes.apperrorstracking.BuildConfig import com.fankes.apperrorstracking.R import com.fankes.apperrorstracking.locale.LocaleString +import com.fankes.apperrorstracking.wrapper.BuildConfigWrapper import com.google.android.material.snackbar.Snackbar import com.highcapable.yukihookapi.hook.factory.field import com.highcapable.yukihookapi.hook.factory.method @@ -58,7 +66,18 @@ import java.io.Serializable import java.math.RoundingMode import java.text.DecimalFormat import java.text.SimpleDateFormat -import java.util.* +import java.util.Date +import java.util.Locale + +/** + * 当前系统环境是否为简体中文 + * @return [Boolean] + */ +val isSystemLanguageSimplifiedChinese + get(): Boolean { + val locale = Locale.getDefault() + return locale.language == "zh" && locale.country == "CN" + } /** * 系统深色模式是否开启 @@ -107,7 +126,7 @@ fun Resources.colorOf(@ColorRes resId: Int) = ResourcesCompat.getColor(this, res * @return [PackageInfo] or null */ private fun Context.getPackageInfoCompat(packageName: String, flag: Number = 0) = runCatching { - @Suppress("DEPRECATION") + @Suppress("DEPRECATION", "KotlinRedundantDiagnosticSuppress") if (Build.VERSION.SDK_INT >= 33) packageManager?.getPackageInfo(packageName, PackageInfoFlags.of(flag.toLong())) else packageManager?.getPackageInfo(packageName, flag.toInt()) @@ -124,7 +143,7 @@ private val PackageInfo.versionCodeCompat get() = PackageInfoCompat.getLongVersi * @return [List]<[PackageInfo]> */ fun Context.listOfPackages() = runCatching { - @Suppress("DEPRECATION") + @Suppress("DEPRECATION", "KotlinRedundantDiagnosticSuppress") if (Build.VERSION.SDK_INT >= 33) packageManager?.getInstalledPackages(PackageInfoFlags.of(PackageManager.GET_CONFIGURATIONS.toLong())) else packageManager?.getInstalledPackages(PackageManager.GET_CONFIGURATIONS) @@ -306,7 +325,7 @@ inline fun Context.navigate(isOutSide: Boolean = false, i startActivity((if (isOutSide) Intent() else Intent(if (this is Service) applicationContext else this, T::class.java)).apply { flags = if (this@navigate !is Activity) Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK else Intent.FLAG_ACTIVITY_NEW_TASK - if (isOutSide) component = ComponentName(BuildConfig.APPLICATION_ID, T::class.java.name) + if (isOutSide) component = ComponentName(BuildConfigWrapper.APPLICATION_ID, T::class.java.name) initiate(this) }) }.onFailure { toast(msg = "Start ${T::class.java.name} failed") } @@ -377,7 +396,10 @@ fun Context.openApp(packageName: String = getPackageName(), userId: Int = 0) = r * 是否有 Root 权限 * @return [Boolean] */ -val isRootAccess get() = runCatching { Shell.rootAccess() }.getOrNull() ?: false +val isRootAccess get() = runCatching { + @Suppress("DEPRECATION") + Shell.rootAccess() +}.getOrNull() ?: false /** * 执行命令 @@ -386,6 +408,7 @@ val isRootAccess get() = runCatching { Shell.rootAccess() }.getOrNull() ?: false * @return [String] 执行结果 */ fun execShell(cmd: String, isSu: Boolean = true) = runCatching { + @Suppress("DEPRECATION") (if (isSu) Shell.su(cmd) else Shell.sh(cmd)).exec().out.let { if (it.isNotEmpty()) it[0].trim() else "" } @@ -399,7 +422,7 @@ fun execShell(cmd: String, isSu: Boolean = true) = runCatching { */ fun Context.hideOrShowLauncherIcon(isShow: Boolean) { packageManager?.setComponentEnabledSetting( - ComponentName(packageName, "${BuildConfig.APPLICATION_ID}.Home"), + ComponentName(packageName, "${BuildConfigWrapper.APPLICATION_ID}.Home"), if (isShow) PackageManager.COMPONENT_ENABLED_STATE_DISABLED else PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ) @@ -411,5 +434,5 @@ fun Context.hideOrShowLauncherIcon(isShow: Boolean) { */ val Context.isLauncherIconShowing get() = packageManager?.getComponentEnabledSetting( - ComponentName(packageName, "${BuildConfig.APPLICATION_ID}.Home") + ComponentName(packageName, "${BuildConfigWrapper.APPLICATION_ID}.Home") ) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/GsonFormatFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/GsonFormatFactory.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/utils/factory/GsonFormatFactory.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/GsonFormatFactory.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/ThreadPoolFactory.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/ThreadPoolFactory.kt similarity index 100% rename from app/src/main/java/com/fankes/apperrorstracking/utils/factory/ThreadPoolFactory.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/factory/ThreadPoolFactory.kt diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/AppAnalyticsTool.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/AppAnalyticsTool.kt similarity index 91% rename from app/src/main/java/com/fankes/apperrorstracking/utils/tool/AppAnalyticsTool.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/AppAnalyticsTool.kt index 8200811..e88d3ef 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/AppAnalyticsTool.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/AppAnalyticsTool.kt @@ -25,7 +25,7 @@ package com.fankes.apperrorstracking.utils.tool import android.app.Application import android.widget.CompoundButton -import com.fankes.apperrorstracking.BuildConfig +import com.fankes.apperrorstracking.generated.ModuleAppProperties import com.highcapable.yukihookapi.hook.factory.prefs import com.highcapable.yukihookapi.hook.xposed.prefs.data.PrefsData import com.microsoft.appcenter.AppCenter @@ -38,7 +38,7 @@ import com.microsoft.appcenter.crashes.Crashes object AppAnalyticsTool { /** App Secret */ - private const val APP_CENTER_SECRET = BuildConfig.APP_CENTER_SECRET + private const val APP_CENTER_SECRET = ModuleAppProperties.APP_CENTER_SECRET /** 启用匿名统计收集使用情况功能 */ private val ENABLE_APP_CENTER_ANALYTICS = PrefsData("_enable_app_center_analytics", true) @@ -56,6 +56,9 @@ object AppAnalyticsTool { instance?.prefs()?.edit { put(ENABLE_APP_CENTER_ANALYTICS, value) } } + /** 是否可用 */ + val isAvailable = APP_CENTER_SECRET.isNotBlank() + /** 绑定到 [CompoundButton] 自动设置选中状态 */ fun CompoundButton.bindAppAnalytics() { isChecked = isEnableAppCenterAnalytics @@ -81,7 +84,7 @@ object AppAnalyticsTool { */ fun init(instance: Application) { this.instance = instance - if (isEnableAppCenterAnalytics && APP_CENTER_SECRET.isNotBlank()) + if (isEnableAppCenterAnalytics && isAvailable) AppCenter.start(instance, APP_CENTER_SECRET, Analytics::class.java, Crashes::class.java) } } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt similarity index 93% rename from app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt index dd3ec11..4628269 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt @@ -19,8 +19,6 @@ * * This file is Created by fankes on 2022/5/12. */ -@file:Suppress("UNCHECKED_CAST") - package com.fankes.apperrorstracking.utils.tool import android.content.Context @@ -28,6 +26,7 @@ import com.fankes.apperrorstracking.bean.AppErrorsInfoBean import com.fankes.apperrorstracking.bean.AppFiltersBean import com.fankes.apperrorstracking.bean.AppInfoBean import com.fankes.apperrorstracking.bean.MutedErrorsAppBean +import com.fankes.apperrorstracking.const.PackageName import com.fankes.apperrorstracking.locale.LocaleString import com.fankes.apperrorstracking.utils.factory.execShell import com.fankes.apperrorstracking.utils.factory.isRootAccess @@ -41,9 +40,6 @@ import com.highcapable.yukihookapi.hook.xposed.channel.data.ChannelData */ object FrameworkTool { - /** 系统框架包名 */ - const val SYSTEM_FRAMEWORK_NAME = "android" - private const val CALL_REFRESH_HOST_PREFS_DATA = "call_refresh_host_prefs_data" private const val CALL_APP_ERRORS_DATA_GET = "call_app_errors_data_get" private const val CALL_MUTED_ERRORS_APP_DATA_GET = "call_muted_app_errors_data_get" @@ -249,13 +245,13 @@ object FrameworkTool { * @param result 成功后回调 */ fun checkingActivated(context: Context, result: (Boolean) -> Unit) = - context.dataChannel(SYSTEM_FRAMEWORK_NAME).checkingVersionEquals(result = result) + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).checkingVersionEquals(result = result) /** * 通知系统框架刷新存储的数据 * @param context 实例 */ - fun refreshFrameworkPrefsData(context: Context) = context.dataChannel(SYSTEM_FRAMEWORK_NAME).put(CALL_REFRESH_HOST_PREFS_DATA) + fun refreshFrameworkPrefsData(context: Context) = context.dataChannel(PackageName.SYSTEM_FRAMEWORK).put(CALL_REFRESH_HOST_PREFS_DATA) /** * 使用系统框架打开 [packageName] @@ -264,7 +260,7 @@ object FrameworkTool { * @param userId APP 用户 ID */ fun openAppUsedFramework(context: Context, packageName: String, userId: Int) = - context.dataChannel(SYSTEM_FRAMEWORK_NAME).put(CALL_OPEN_SPECIFY_APP, Pair(packageName, userId)) + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).put(CALL_OPEN_SPECIFY_APP, Pair(packageName, userId)) /** * 获取指定 APP 异常信息 @@ -273,7 +269,7 @@ object FrameworkTool { * @param result 回调数据 */ fun fetchAppErrorInfoData(context: Context, pid: Int, result: (AppErrorsInfoBean) -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_APP_ERROR_DATA_GET_RESULT) { result(it) } put(CALL_APP_ERROR_DATA_GET, pid) } @@ -285,7 +281,7 @@ object FrameworkTool { * @param result 回调数据 */ fun fetchAppErrorsInfoData(context: Context, result: (ArrayList) -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_APP_ERRORS_DATA_GET_RESULT) { result(it) } put(CALL_APP_ERRORS_DATA_GET) } @@ -298,7 +294,7 @@ object FrameworkTool { * @param callback 成功后回调 */ fun removeAppErrorsInfoData(context: Context, appErrorsInfo: AppErrorsInfoBean, callback: () -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_APP_ERRORS_DATA_REMOVE_RESULT) { callback() } put(CALL_APP_ERRORS_DATA_REMOVE, appErrorsInfo) } @@ -310,7 +306,7 @@ object FrameworkTool { * @param callback 成功后回调 */ fun clearAppErrorsInfoData(context: Context, callback: () -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_APP_ERRORS_DATA_CLEAR_RESULT) { callback() } put(CALL_APP_ERRORS_DATA_CLEAR) } @@ -323,7 +319,7 @@ object FrameworkTool { * @param callback 成功后回调 */ fun mutedErrorsIfUnlock(context: Context, packageName: String, callback: () -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_MUTED_ERRORS_IF_UNLOCK_RESULT) { callback() } put(CALL_MUTED_ERRORS_IF_UNLOCK, packageName) } @@ -336,7 +332,7 @@ object FrameworkTool { * @param callback 成功后回调 */ fun mutedErrorsIfRestart(context: Context, packageName: String, callback: () -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_MUTED_ERRORS_IF_RESTART_RESULT) { callback() } put(CALL_MUTED_ERRORS_IF_RESTART, packageName) } @@ -348,7 +344,7 @@ object FrameworkTool { * @param result 回调数据 */ fun fetchMutedErrorsAppsData(context: Context, result: (ArrayList) -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_MUTED_ERRORS_APP_DATA_GET_RESULT) { result(it) } put(CALL_MUTED_ERRORS_APP_DATA_GET) } @@ -361,7 +357,7 @@ object FrameworkTool { * @param callback 成功后回调 */ fun unmuteErrorsApp(context: Context, mutedErrorsApp: MutedErrorsAppBean, callback: () -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_UNMUTE_ERRORS_APP_DATA_RESULT) { callback() } put(CALL_UNMUTE_ERRORS_APP_DATA, mutedErrorsApp) } @@ -373,7 +369,7 @@ object FrameworkTool { * @param callback 成功后回调 */ fun unmuteAllErrorsApps(context: Context, callback: () -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_UNMUTE_ALL_ERRORS_APPS_DATA_RESULT) { callback() } put(CALL_UNMUTE_ALL_ERRORS_APPS_DATA) } @@ -386,7 +382,7 @@ object FrameworkTool { * @param result 回调数据 */ fun fetchAppListData(context: Context, appFilters: AppFiltersBean, result: (ArrayList) -> Unit) { - context.dataChannel(SYSTEM_FRAMEWORK_NAME).with { + context.dataChannel(PackageName.SYSTEM_FRAMEWORK).with { wait(CALL_APP_LIST_DATA_GET_RESULT) { result(it) } put(CALL_APP_LIST_DATA_GET, appFilters) } diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/GithubReleaseTool.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/GithubReleaseTool.kt similarity index 96% rename from app/src/main/java/com/fankes/apperrorstracking/utils/tool/GithubReleaseTool.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/GithubReleaseTool.kt index fb04c63..a22258a 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/GithubReleaseTool.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/GithubReleaseTool.kt @@ -29,11 +29,15 @@ import android.icu.util.TimeZone import com.fankes.apperrorstracking.locale.LocaleString import com.fankes.apperrorstracking.utils.factory.openBrowser import com.fankes.apperrorstracking.utils.factory.showDialog -import okhttp3.* +import okhttp3.Call +import okhttp3.Callback +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response import org.json.JSONObject import java.io.IOException import java.io.Serializable -import java.util.* +import java.util.Locale /** * 获取 GitHub Release 最新版本工具类 diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/ZipFileTool.kt b/module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/ZipFileTool.kt similarity index 96% rename from app/src/main/java/com/fankes/apperrorstracking/utils/tool/ZipFileTool.kt rename to module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/ZipFileTool.kt index cf9b143..e010d00 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/ZipFileTool.kt +++ b/module-app/src/main/java/com/fankes/apperrorstracking/utils/tool/ZipFileTool.kt @@ -23,7 +23,13 @@ package com.fankes.apperrorstracking.utils.tool -import java.io.* +import java.io.BufferedInputStream +import java.io.BufferedOutputStream +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream import java.util.zip.ZipEntry import java.util.zip.ZipInputStream import java.util.zip.ZipOutputStream diff --git a/module-app/src/main/java/com/fankes/apperrorstracking/wrapper/BuildConfigWrapper.kt b/module-app/src/main/java/com/fankes/apperrorstracking/wrapper/BuildConfigWrapper.kt new file mode 100644 index 0000000..06238f2 --- /dev/null +++ b/module-app/src/main/java/com/fankes/apperrorstracking/wrapper/BuildConfigWrapper.kt @@ -0,0 +1,36 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2017-2023 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is created by fankes on 2023/9/19. + */ +@file:Suppress("unused") + +package com.fankes.apperrorstracking.wrapper + +import com.fankes.apperrorstracking.BuildConfig + +/** + * 对 [BuildConfig] 的包装 + */ +object BuildConfigWrapper { + const val APPLICATION_ID = BuildConfig.APPLICATION_ID + const val VERSION_NAME = BuildConfig.VERSION_NAME + const val VERSION_CODE = BuildConfig.VERSION_CODE + val isDebug = BuildConfig.DEBUG +} \ No newline at end of file diff --git a/app/src/main/res/drawable-night/bg_dark_round.xml b/module-app/src/main/res/drawable-night/bg_dark_round.xml similarity index 100% rename from app/src/main/res/drawable-night/bg_dark_round.xml rename to module-app/src/main/res/drawable-night/bg_dark_round.xml diff --git a/app/src/main/res/drawable-night/bg_permotion_ripple.xml b/module-app/src/main/res/drawable-night/bg_permotion_ripple.xml similarity index 100% rename from app/src/main/res/drawable-night/bg_permotion_ripple.xml rename to module-app/src/main/res/drawable-night/bg_permotion_ripple.xml diff --git a/app/src/main/res/drawable-night/bg_permotion_round.xml b/module-app/src/main/res/drawable-night/bg_permotion_round.xml similarity index 100% rename from app/src/main/res/drawable-night/bg_permotion_round.xml rename to module-app/src/main/res/drawable-night/bg_permotion_round.xml diff --git a/app/src/main/res/drawable/bg_black_round.xml b/module-app/src/main/res/drawable/bg_black_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_black_round.xml rename to module-app/src/main/res/drawable/bg_black_round.xml diff --git a/app/src/main/res/drawable/bg_blue_round.xml b/module-app/src/main/res/drawable/bg_blue_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_blue_round.xml rename to module-app/src/main/res/drawable/bg_blue_round.xml diff --git a/app/src/main/res/drawable/bg_button_round.xml b/module-app/src/main/res/drawable/bg_button_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_button_round.xml rename to module-app/src/main/res/drawable/bg_button_round.xml diff --git a/app/src/main/res/drawable/bg_dark_round.xml b/module-app/src/main/res/drawable/bg_dark_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_dark_round.xml rename to module-app/src/main/res/drawable/bg_dark_round.xml diff --git a/app/src/main/res/drawable/bg_green_round.xml b/module-app/src/main/res/drawable/bg_green_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_green_round.xml rename to module-app/src/main/res/drawable/bg_green_round.xml diff --git a/app/src/main/res/drawable/bg_logger_d_round.xml b/module-app/src/main/res/drawable/bg_logger_d_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_logger_d_round.xml rename to module-app/src/main/res/drawable/bg_logger_d_round.xml diff --git a/app/src/main/res/drawable/bg_logger_e_round.xml b/module-app/src/main/res/drawable/bg_logger_e_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_logger_e_round.xml rename to module-app/src/main/res/drawable/bg_logger_e_round.xml diff --git a/app/src/main/res/drawable/bg_logger_i_round.xml b/module-app/src/main/res/drawable/bg_logger_i_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_logger_i_round.xml rename to module-app/src/main/res/drawable/bg_logger_i_round.xml diff --git a/app/src/main/res/drawable/bg_logger_w_round.xml b/module-app/src/main/res/drawable/bg_logger_w_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_logger_w_round.xml rename to module-app/src/main/res/drawable/bg_logger_w_round.xml diff --git a/app/src/main/res/drawable/bg_orange_round.xml b/module-app/src/main/res/drawable/bg_orange_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_orange_round.xml rename to module-app/src/main/res/drawable/bg_orange_round.xml diff --git a/app/src/main/res/drawable/bg_permotion_ripple.xml b/module-app/src/main/res/drawable/bg_permotion_ripple.xml similarity index 100% rename from app/src/main/res/drawable/bg_permotion_ripple.xml rename to module-app/src/main/res/drawable/bg_permotion_ripple.xml diff --git a/app/src/main/res/drawable/bg_permotion_round.xml b/module-app/src/main/res/drawable/bg_permotion_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_permotion_round.xml rename to module-app/src/main/res/drawable/bg_permotion_round.xml diff --git a/app/src/main/res/drawable/bg_red_round.xml b/module-app/src/main/res/drawable/bg_red_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_red_round.xml rename to module-app/src/main/res/drawable/bg_red_round.xml diff --git a/app/src/main/res/drawable/bg_stack_round.xml b/module-app/src/main/res/drawable/bg_stack_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_stack_round.xml rename to module-app/src/main/res/drawable/bg_stack_round.xml diff --git a/app/src/main/res/drawable/bg_yellow_round.xml b/module-app/src/main/res/drawable/bg_yellow_round.xml similarity index 100% rename from app/src/main/res/drawable/bg_yellow_round.xml rename to module-app/src/main/res/drawable/bg_yellow_round.xml diff --git a/app/src/main/res/drawable/ic_android.xml b/module-app/src/main/res/drawable/ic_android.xml similarity index 100% rename from app/src/main/res/drawable/ic_android.xml rename to module-app/src/main/res/drawable/ic_android.xml diff --git a/app/src/main/res/drawable/ic_appcenter.xml b/module-app/src/main/res/drawable/ic_appcenter.xml similarity index 100% rename from app/src/main/res/drawable/ic_appcenter.xml rename to module-app/src/main/res/drawable/ic_appcenter.xml diff --git a/app/src/main/res/drawable/ic_back.xml b/module-app/src/main/res/drawable/ic_back.xml similarity index 100% rename from app/src/main/res/drawable/ic_back.xml rename to module-app/src/main/res/drawable/ic_back.xml diff --git a/app/src/main/res/drawable/ic_baseline_bug_report.xml b/module-app/src/main/res/drawable/ic_baseline_bug_report.xml similarity index 100% rename from app/src/main/res/drawable/ic_baseline_bug_report.xml rename to module-app/src/main/res/drawable/ic_baseline_bug_report.xml diff --git a/app/src/main/res/drawable/ic_baseline_close.xml b/module-app/src/main/res/drawable/ic_baseline_close.xml similarity index 100% rename from app/src/main/res/drawable/ic_baseline_close.xml rename to module-app/src/main/res/drawable/ic_baseline_close.xml diff --git a/app/src/main/res/drawable/ic_baseline_eject.xml b/module-app/src/main/res/drawable/ic_baseline_eject.xml similarity index 100% rename from app/src/main/res/drawable/ic_baseline_eject.xml rename to module-app/src/main/res/drawable/ic_baseline_eject.xml diff --git a/app/src/main/res/drawable/ic_baseline_info.xml b/module-app/src/main/res/drawable/ic_baseline_info.xml similarity index 100% rename from app/src/main/res/drawable/ic_baseline_info.xml rename to module-app/src/main/res/drawable/ic_baseline_info.xml diff --git a/app/src/main/res/drawable/ic_baseline_refresh.xml b/module-app/src/main/res/drawable/ic_baseline_refresh.xml similarity index 100% rename from app/src/main/res/drawable/ic_baseline_refresh.xml rename to module-app/src/main/res/drawable/ic_baseline_refresh.xml diff --git a/app/src/main/res/drawable/ic_batch.xml b/module-app/src/main/res/drawable/ic_batch.xml similarity index 100% rename from app/src/main/res/drawable/ic_batch.xml rename to module-app/src/main/res/drawable/ic_batch.xml diff --git a/app/src/main/res/drawable/ic_clear.xml b/module-app/src/main/res/drawable/ic_clear.xml similarity index 100% rename from app/src/main/res/drawable/ic_clear.xml rename to module-app/src/main/res/drawable/ic_clear.xml diff --git a/app/src/main/res/drawable/ic_copy.xml b/module-app/src/main/res/drawable/ic_copy.xml similarity index 100% rename from app/src/main/res/drawable/ic_copy.xml rename to module-app/src/main/res/drawable/ic_copy.xml diff --git a/app/src/main/res/drawable/ic_cpp.xml b/module-app/src/main/res/drawable/ic_cpp.xml similarity index 100% rename from app/src/main/res/drawable/ic_cpp.xml rename to module-app/src/main/res/drawable/ic_cpp.xml diff --git a/app/src/main/res/drawable/ic_debug.xml b/module-app/src/main/res/drawable/ic_debug.xml similarity index 100% rename from app/src/main/res/drawable/ic_debug.xml rename to module-app/src/main/res/drawable/ic_debug.xml diff --git a/app/src/main/res/drawable/ic_exception.xml b/module-app/src/main/res/drawable/ic_exception.xml similarity index 100% rename from app/src/main/res/drawable/ic_exception.xml rename to module-app/src/main/res/drawable/ic_exception.xml diff --git a/app/src/main/res/drawable/ic_export.xml b/module-app/src/main/res/drawable/ic_export.xml similarity index 100% rename from app/src/main/res/drawable/ic_export.xml rename to module-app/src/main/res/drawable/ic_export.xml diff --git a/app/src/main/res/drawable/ic_filter.xml b/module-app/src/main/res/drawable/ic_filter.xml similarity index 100% rename from app/src/main/res/drawable/ic_filter.xml rename to module-app/src/main/res/drawable/ic_filter.xml diff --git a/app/src/main/res/drawable/ic_function.xml b/module-app/src/main/res/drawable/ic_function.xml similarity index 100% rename from app/src/main/res/drawable/ic_function.xml rename to module-app/src/main/res/drawable/ic_function.xml diff --git a/app/src/main/res/drawable/ic_github.xml b/module-app/src/main/res/drawable/ic_github.xml similarity index 100% rename from app/src/main/res/drawable/ic_github.xml rename to module-app/src/main/res/drawable/ic_github.xml diff --git a/app/src/main/res/drawable/ic_global.xml b/module-app/src/main/res/drawable/ic_global.xml similarity index 100% rename from app/src/main/res/drawable/ic_global.xml rename to module-app/src/main/res/drawable/ic_global.xml diff --git a/app/src/main/res/drawable/ic_home.xml b/module-app/src/main/res/drawable/ic_home.xml similarity index 100% rename from app/src/main/res/drawable/ic_home.xml rename to module-app/src/main/res/drawable/ic_home.xml diff --git a/app/src/main/res/drawable/ic_java.xml b/module-app/src/main/res/drawable/ic_java.xml similarity index 100% rename from app/src/main/res/drawable/ic_java.xml rename to module-app/src/main/res/drawable/ic_java.xml diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/module-app/src/main/res/drawable/ic_launcher_foreground.xml similarity index 100% rename from app/src/main/res/drawable/ic_launcher_foreground.xml rename to module-app/src/main/res/drawable/ic_launcher_foreground.xml diff --git a/app/src/main/res/drawable/ic_notify.xml b/module-app/src/main/res/drawable/ic_notify.xml similarity index 100% rename from app/src/main/res/drawable/ic_notify.xml rename to module-app/src/main/res/drawable/ic_notify.xml diff --git a/app/src/main/res/drawable/ic_preference.xml b/module-app/src/main/res/drawable/ic_preference.xml similarity index 100% rename from app/src/main/res/drawable/ic_preference.xml rename to module-app/src/main/res/drawable/ic_preference.xml diff --git a/app/src/main/res/drawable/ic_print.xml b/module-app/src/main/res/drawable/ic_print.xml similarity index 100% rename from app/src/main/res/drawable/ic_print.xml rename to module-app/src/main/res/drawable/ic_print.xml diff --git a/app/src/main/res/drawable/ic_refresh.xml b/module-app/src/main/res/drawable/ic_refresh.xml similarity index 100% rename from app/src/main/res/drawable/ic_refresh.xml rename to module-app/src/main/res/drawable/ic_refresh.xml diff --git a/app/src/main/res/drawable/ic_restart.xml b/module-app/src/main/res/drawable/ic_restart.xml similarity index 100% rename from app/src/main/res/drawable/ic_restart.xml rename to module-app/src/main/res/drawable/ic_restart.xml diff --git a/app/src/main/res/drawable/ic_share.xml b/module-app/src/main/res/drawable/ic_share.xml similarity index 100% rename from app/src/main/res/drawable/ic_share.xml rename to module-app/src/main/res/drawable/ic_share.xml diff --git a/app/src/main/res/drawable/ic_statistics.xml b/module-app/src/main/res/drawable/ic_statistics.xml similarity index 100% rename from app/src/main/res/drawable/ic_statistics.xml rename to module-app/src/main/res/drawable/ic_statistics.xml diff --git a/app/src/main/res/drawable/ic_success.xml b/module-app/src/main/res/drawable/ic_success.xml similarity index 100% rename from app/src/main/res/drawable/ic_success.xml rename to module-app/src/main/res/drawable/ic_success.xml diff --git a/app/src/main/res/drawable/ic_theme.xml b/module-app/src/main/res/drawable/ic_theme.xml similarity index 100% rename from app/src/main/res/drawable/ic_theme.xml rename to module-app/src/main/res/drawable/ic_theme.xml diff --git a/app/src/main/res/drawable/ic_warn.xml b/module-app/src/main/res/drawable/ic_warn.xml similarity index 100% rename from app/src/main/res/drawable/ic_warn.xml rename to module-app/src/main/res/drawable/ic_warn.xml diff --git a/app/src/main/res/layout/activitiy_logger.xml b/module-app/src/main/res/layout/activitiy_logger.xml similarity index 100% rename from app/src/main/res/layout/activitiy_logger.xml rename to module-app/src/main/res/layout/activitiy_logger.xml diff --git a/app/src/main/res/layout/activity_app_errors_detail.xml b/module-app/src/main/res/layout/activity_app_errors_detail.xml similarity index 100% rename from app/src/main/res/layout/activity_app_errors_detail.xml rename to module-app/src/main/res/layout/activity_app_errors_detail.xml diff --git a/app/src/main/res/layout/activity_app_errors_display.xml b/module-app/src/main/res/layout/activity_app_errors_display.xml similarity index 100% rename from app/src/main/res/layout/activity_app_errors_display.xml rename to module-app/src/main/res/layout/activity_app_errors_display.xml diff --git a/app/src/main/res/layout/activity_app_errors_muted.xml b/module-app/src/main/res/layout/activity_app_errors_muted.xml similarity index 100% rename from app/src/main/res/layout/activity_app_errors_muted.xml rename to module-app/src/main/res/layout/activity_app_errors_muted.xml diff --git a/app/src/main/res/layout/activity_app_errors_record.xml b/module-app/src/main/res/layout/activity_app_errors_record.xml similarity index 100% rename from app/src/main/res/layout/activity_app_errors_record.xml rename to module-app/src/main/res/layout/activity_app_errors_record.xml diff --git a/app/src/main/res/layout/activity_config.xml b/module-app/src/main/res/layout/activity_config.xml similarity index 100% rename from app/src/main/res/layout/activity_config.xml rename to module-app/src/main/res/layout/activity_config.xml diff --git a/app/src/main/res/layout/activity_main.xml b/module-app/src/main/res/layout/activity_main.xml similarity index 92% rename from app/src/main/res/layout/activity_main.xml rename to module-app/src/main/res/layout/activity_main.xml index ff9d086..cea83da 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/module-app/src/main/res/layout/activity_main.xml @@ -582,6 +582,7 @@ + + + + + + + + + + + + FNK3;8BL^}VDBVcI zD5bkQ|MMGfzrWw_{ny=R&vTv|=bn4wKKD8I+>?QmAArkhN~%hLQ>OrcQ{*4uWc<{C zs=U1MGaW4@)u)QT7c>IM>C6KFz#if3q@(=gralCE^W2Z$Tl^|BF+;xib^kYsjCZ^5 z7j^)koB!X``LD7sm|Gyt$Q4$}|JzRF&dJ1HCBs*(euwY=f=z#irGLS0&M%zFb)Nl# zo%D3%$*?&YzH9Y2u<75xW-pw6)&D@QBW-Wz@~f|3=@-S9ED%6l^8Gyd&jLUKbO6eL zC%?u|ekLb}6ae7i763r;@vnKNF#tg6I{@Gs>92XWKLY@?ZvlXkj=$#pl_xJuoJ@X0 zcZPgDZD|PrtY-oM)DQrG{yPA05%yad`SNdQyGbr$A=BkR{#gO+02Y9o09612Uj8uv#_zV{X%kz-1OYpb2R7A)39BoyUO+-r<1P$y7Lsg zXYwgdaR5%!ouZ&Sby5pp{iRN4C{F!3R`UG3fwGI9tBi-_y!flP|JIG^Y`xx5Ms zzb*RE^v&Dk;&0a!%*-uZ(P`COcND>|FL2+LPf7i$^sZakGJSlthTIto*&a?&{xXWc zq%-8Mf008jRiPu3a{3e{^*M6pSu#M@6f!Avlvi#EYCE2#XAl;7tfL#2T=1>)Dx;8z z)2pB7IKo#&IiD!#nWl8Dy&jimx?NbkenJ9VA`ka89R(dg4v^Lh0+nDKe)cBrt{fu| zc=M8Mk9{B$iC=);JifatlJf>Gp;XR!%?9(H65CZXy@@h&9rzP~Y|h$>k+VAEN?u=P z>hDcP;}48C<~!K7W)!t6tDuP}pS-;-E0ia4$*%(|jqFdj?C`HDD=;r?WzWu#P5?ac!Y^=Z-xZ zl?7gjPsi7RO?y@XAxT@d@Rf$|PRc7Lo^Epo+NN=E#y*v!pE3Pvdu%9g?A{a@<%FCv z?%=6FMyuVIZ$zX*s^p;C3B!BfjpjU-shuQVSr6dEFo8~pIm@A=kC^Ev3-VsaHk3)M z7tNrJWLlCLoS3sR4v*k&8&g(fJYEt1(1a}Z-*Cjo??HaUIivVAYMyyxD|@U1og|G} zTh{c>ArlhnG^=Rf|E~)a8WG84x)Kh5L%}vV)7+5=bl(wp`}BXK0dHkhTBe&U@NgO1 zAmQ^DRC?q-$aeqFeE=H~DRKXb-2YRmrZ$pzj@^J0@dRz%TLk}KJS5AaeZB%2@t1<% z+5WG&PL{_%7tsHK>EB7?pXB%dufabJ?jJ@SJ^H62{9DeFW$}Mc5q|05NC(${8GMM9vC3^yNQ6(Q=hY^1g#lNy z4<;%WvR!-sc!e5E#U!lVRZ!qRAMlcc0}v2!n&amG6Y%14$9^&1ZDLk}bEjm7-s%WS zDqq`V2|E~AzOQv8JDx#$$NSLV-k39-K{(A!dHQE1RE~OipNzmV!G~^Xnbezj?xVulI zazty4(km)OSih*hMja$P@MJ8`Y*%>`bKwIpFHd{f3V?6>G^@oRSfR2u`n&W1^g2LUu5eI{t713~@LNL+d32-EF%guDP-Xjt| z`t&IHhh~k3fuD|hlnl5!V+FN=!w>zbbl&r7ZnepDmy7?2Qh`RZ@Dxk=OFF6|s1b9= zQjd0-m#2wYt{RDb-GPJVSAQJyE6QKnLhA1v-g5%VFeqwWsdKI6(}U2a)qnSbC{H!NW9 zx5EKCfXIoCPBq6C@bK8&RAruURqtx{R!|W9KU9j}Wd0Y!xbs(&$tTKf9t6d~ujY(j z$9tnx0*IG;|3PdF`HC(iF^^Bf44xMW?9kC3-mm)6&z9@>6u@I@ z1{3(rO1<8VbTLQLz5_4(_Zlpefi5(QI(3SkJ&Q$Rujy~$>jaX5S=Fh~$%d*xMZJ0G z09R&~6(I;zhJtrc>(S??cuJWjGiK6a($(8;l)`yf?*9Y2w8j(<_2j`osBL&zO|GF*mARbcrscc=)%JS~}* zuU@tpC*?1b#IV4Q?g{rg^<=x-g*bfTY^0i6A5R{p4FWxXVE#5=?1@ua_ona6&q zVG6+m6sBxZu5J^)+G1!BwTlYPw!2+V>tde!aS23dflw#i#<&16;IoR_ym%jRCWEbs z{hm*PTtKDfsJ%D?DHo}UAy$}>L$XJCTcqL|ipKhu56rCK?x2wzqA4eWgeYE$x}c1g z`_SMLKl+VIvyj(NG5o;L3gdfN93d&R5_zu7X=ExJ=Gs{fBF^6siXO-yULak8&ptlFk7$~1sK zZ+3`0DAs13zjoW9ioKaV%O%RNO$cUR_|vw5=hjSYaL@4afbw{)a;eAiz12>OhN!KQ z)V!Kfu?U@{gQ;C6I1PuHPBoM&(_%{n& zpv3q0mhIw6{@2UubJiPx$2}T1`Xw^a#YLT<9&Npba_uvyAkfM=1Tpi8C{?mS$2Vk| zxpxgha>t<&&^C7(Y`XpJHDf|ngRHuRJ)&-gH zf*><+e8%`b6_>D8;=?^`&7`e3q$%%4Ysim1hw0~D+_;Go0LUsAxY~wl_+Z`>-OLx2 zyZrK_sf+NVu(#Gw;Pv;dxThJ@q<8m9`5~31zE(?>UOYziJWXO+k!HKS8r#H8O;kL^ zZ9$cp3Xy~hz52ZF*twf|$%!b8Skt97g2Xk?CC(>|H(1#1N!CK}AJW$o@v*7YNT7Hc zfqu=fsf?vJMLkodzvt`SqR9&OEN13mA^3=M|Bu$KoLlB8F6|rgh$|axUKkYh(TJPd zSO(@&@w%e9Cv-*>@}^f?A~&W4Y~3E@9%gmw+jdrnPh`!c@=E5OY_HGV_l+H65Fh{4 z)SvTeJ62cb54wA5cU@km-ff)AagM0F)JyHUFg@B?p4<-Z-7t+_P>d~HkeMI6?fg;J z3Lo;3>1?U-DtMHlU_KrukWwji6P2a2a(rHAd7+|u)Nm!&yftNDpcEqo}Qm%7_~@unk;Jtvsc26&2sFtY$YOWN@Y5` zr`Ve7d8ET+#m$L)8HI)Zp4=H=e*&>u_}KN*$-g*`}dZqc!F0r#AH za>BV)j?Ozjl%>*=xr!DQFSIUg>~Ryp*Wq?Fq|zM?bJMbI-8}lRwG2B6m`Ypiaf8qC zh4stkGK^C88slr~HmQO^vDs%Fk;;ftojmo?MyCat6wI7He|2muCtn<%M&KroQp?SR zIOTkqo-JzY9ETF;+b&V9OF*1&+scx4PwWNvs!gi299gZ)cN8R+&cC zt4!;1RxK%5#XQ`ZMTv zRTEXIXe!yK9&6xm9l=0vffT}(bemag!(bv_lV9yZ(e22#+n&*^s^b?YpK)1kZ&{`n z6u&myztd!ENayvq7wV-_lT}zQJb}E<>dh~Zo^@y`m9O<2i)UR{%b}M&mll?brh;du zW(RhvMJtN5E6Lttztn~_{}4sQ9qKSK7?P;Yc(ko06KH(HYF%9O-DB1=g)nD~8I40t8SX##D}3m`;cMx;UIPx$?SlEbyv)KeuGI}vVd)JTYRyNSaNltGNxu_7_}0L-xUN0%`*6ZX<-6$# z;ma3wMwYtsnxT6I^S48sZg<$LXXXz*E|b>sM(i;yReCRVlC)V1q;|~`I=xKB`@=If86&`v+^*|&!688w)Rkp2 z33;Dpq1>f%7cX&sVuS~}#p3~wrMWA6!m!x=` zdF&#i)$Zu@T>KQrEjS$)F7nW}*&Q7X(~x1X>j64`nt3%9UN9D3XIF>EHY{q+K0KBt)%lC405h?W z3fn7CH5T)|tcHFn3&nVl&30{cPV#=mlJ16QDC5)|zPo2rGh$a%x!UXmFqITl+TqCw z)Yde*W-yb&Bj9phLQFookXtpq>d}bL;eM1HEYL7d-f~5AgJ0HOMsvaMO^w8?0x-I8Af=Co|>1Wd={enKU@=sCj>H zIFHrWcsW_d!U*cUX!W$eJeG0g6+sljndYKI)UNf*PO41nHH|FJYmC`8lw@im&$-l8@e>u_h)Mtg!cDiB_(4$-MVXU-|xVYORxx2Z=*Xmf-Z#!1b|1z@u-1c#iFh26mNTy78le(yv9cXTaDOTM= z@H9MI;dxl?i08~aRow_g_YENo`8&de&wt$jlCug6g%L1Sp&JsF)*+rl{mh`xd7dr zwR}Dre&NPgW%$hB+d;VS4^MHw;sg%;FAH@4A+kOr56bw2fHhf@^qP!P$|Ul3J80 zoOFxQ^?h#+)Oxw_;BxcQT>nkkcn1ysL{56osWvl%b4#b-shS(|Q5|%Zx?-%Z3qmW@ z$1I5(cYiYLBg9`zvAIMi@^IRPWJdd>h&#ZQP5?{##M}{EXmDZdg?YGXdd7z~>Gks| zffadPsF#$K>y-)$PP5;UMSVR$e3*#|^FkEja&G>|a z0H)iL+SOld(-PBdPJ<|qmh4l$#kvUJnj;vP)_SCevZ0CeR>fsTob2y}TzQ(Mu4QK>0ndD$EO;U*Oyr`ZCbdlM~RV<-t-r-5L<5EkJCv z!?hL}IK5{mh2&j#Nrdmao>w1y=4NoJvvTlR{5zu{Ji_Qwzp6+wV zKkDP9%Sn_Y#o(e>DkB^(_7KYt?TpIvk0L;=KOw9%z))QyYpSyN8fC%Zf-hbf=$s+9 z-2tMT$-$lMYY}1J@wyOkmpr@TOJ0n#n8b?^s!oS2doC9lgUC*h*ahf@)_oSImo6i2 zJ>VF|(8n{EJPR5pr^N_s#TA}IFLfq6%L;`sg6)yX-}1cQ1QgAWNN460C`Pr#=q*uP zZxgzx%Jq6qzv)cafeD4m_6PpMN7>Ab)#)vTj2imY3!=oI8!Jv~$J$J}R!6Dks0O}H z#mB7)u6gKU*MX$QxrEva$JSH4PIWHoIuKA}tSsD9Mk=lLry2&`XvS}@>7waZC3LC# z8n)70zpgzIca5_cBBbuIN*kqF)3%6Au=>}@OhM2MEcW@YktzFj;U@J@^U!mJYC4k@6djhuhRsi z_j4Mw%T9{nvmmq(DMeqa4;M0a3VrI4Ah9ZVm6PU%p^oU@Z!embw>CosUT2ipm^vcf zwIYX~3?AWBh7b+Qou$Ji0gvRitUK1Anab+g5QvtdDsx75R#?H4Z~b1VSC4B)r;z$c zFI>Wk_cL4dqt=CQh`QEn0SHSQp#7)1)?Ubj+xA{G8~siYfoIVvJRYBm0)uS_!-c+g zNI+~a6+T8yh#iQq4MyhsGkIq^m5t@B9;j6QN70lA<}v2v!-PEtsES^I{|#pI*@30Y5_6Xm%>Uskc6(s zG>bs(isfd}!@3un&Fv?E^^~Ov))T;LpBNv!2dr{%bVPM;D$`j5ITJM>*mVM^T|WV= zojR^Q0n8fv?VJF9gN$%7keOpW!wR#i;~UP+9ddtS>Fp2B@$*ZL7KqM^K3+Lg2a7gu z*9CUU1AP*^FX=X#S_uY*PUyexgdSLo22C)ZL8WD(TnmO#e3G*ul_5>tkLHZQ-s163 zN@`euT&+=V;e#|YWfRu=1-A2SWvhUTmfA zGy4&TpYM+;=Z;Eh>C6q>VM19%wdC{@D0I1G`(#t#ODn#<(J* zmeiylYP;d*tNd7*Q36b5X+CGse*)O!4@t21U5K=F21y2sUcKD2vZBtCR#u)PZ~~x= zTrd9+wxQ)VFik4hRVNcLfrtp)QfwH?iVDv~7CbqF+A6aoilv&Yekj!_Z@<5UK;yL`^e zTy>cq$;MJw8}11iEGI@0ls52umf4+jd1CxXdDt+tyh%DBs1*3Hl@PC!ofFpYG%alT zO;8^7vlW905UZS2R3IgaiLYJXf4y#xpO(%9^l8)w4+wCPXcQwiI|;6*za8>Dnss@Z z)Y3LfNlXZ&7L99jxGKYWIi&cSX^BW{i+l2?As0L%^guH-Vtr{VkI0C3Z4YfI?Zc;9 z#&PB~%}o#tCK(qD-gt6+zf|NVbqXS3BnJ*Lp0_K#3*~-!07e`@^gY;QQ&P(>$K)vI zctp?aiiR(vaOat&Bm3ZoWar{^4YIW5W{~7QxFX?3Uu&1zraC9bhbB%^y?Er8+0)%^ zXgpEKaS5<%y}_SE`qFP%29Qpmjr-1{Ct)lxT?_gQa2MFGEv< zb^8w&<_tCz?}X5c8!2Y<2J6=!^MZRbva_M@IWYPg!&XcNno2}SgdGV%N2er0-aq)$ z?|tew5bWyLn~SYtf84}QM2(a65(@+S%DxGg^J4v1+a$Q(w?cm3K4K`S8~tgY*s&i_ zxO++VCG^wEi;@njBL#@}S@uT)>MrpHUV1A#lnpKUxpP_FhEhRwS%a-QJ?alyg!~;U zs+5LBD2#jZ@K#e^vIXYR+Q__EViEEd+ebZw_~ZTPdy2A~Tjjl36|>P&he|Qrrce>j zOrbK^So~^2>=VBuL$qHlZT9nu8DL?#_0Hi!^`QAocLsXK^ z4_DCu`jt`*@7q4T-@lKq>dF}2#;hFQO|;?)`oRD!Nac8yqh}}quT+$}@HM5(6x6&C zG3i|IX(<=;&5%$J7yVAnV3i)vZG13>PC5ZN%BI^aaa-;72?q2U%w?7#YpAYkvV)h@ zTV5BtO4x*NBy_$fPG7v$A;h};W!(A*vuQT-S}kkFAhI$l(=y^l3j>#eo={f`(LRBV zNT7aGpEKTIX938=;i!=bZSbk-a8_SDQ2KqC6N|ip^gAa_Ph#^_SEhI45HnqfI>(LV zVnm)p<&71g&pgMS1Y)JTZAJ4-qET>!a)C7M>DoQ>DxKXV&jz%`9s9!VMpCDFDXUzU zjA@B^W6n1sHKr39q^MTlfahx_FUNcp7HK>uliX7yxQwT^ zbqcyGcSurxA)ea&+ZbMt{JK1h#jF z5po#12|FZS51Fk6$+F}&KIx#QIqkQ!hdf&MB3AeaMfq8s@pGwdiff-c7*-b~52tdI@WM@k^0Ee!ku0(Y&=0 zBfH)==fBt`S{1b3+w-&Frwb0~&&z9{c>;jH7#JRyzENM2;;iS>Eq?rQVi?l>W?95~ z>B^*wwtt7=(!CQv-1&os&}}~TH;~jup>m%TkD;rgv|KZVH%8Qz`#^o&@(lda&Z`9l z4a^kRIvWAwr%Xm>JGv- z;x{z4TEzQud@mn8rfHB>oYBWxmCJmYLNO@2h7Yi&&bSdiqMm)l>lHufd3HNO^iYr?7N2plalu;p_3IyVzd2@~1XM zhS|N~5sYawqJ#tmeZ8cK^hn&;nmDfOE%gqn^J=g*EgrdNYi{uz8Fwj;MBTvm8NQ|! zKj`Pn^-`>BUqX04`dQ_<$L*`Lv*PL!vgvV`%o%{Q+e$elUPyO3$7~+!e0-2QoDv=}7&i2G*h?BRCeFUmZ01 zj$J1^9jFZnQJ-|H2j!DJT-UfY2|FQ?&wn^VS>$q>cF^GKHG+!>926_V{5cl1EK_eK z6&#HN3qpYJWSPXSp;=q2dZj+dzGp)vzJF@koc>Ue$;ppcl-17+TT zbMCVR?==qwP5@uYeJ==3x=L9-wii3d5r~cd^04?}h{`grZMqUIDO);2t0Lc|_nNaK zG(!}bcQo@v>Avy@4O!sTtUlP2g~h*45YWM6q~WJJRaOg1QEo|MyG`KK&`|RcspQ-T z{TCQ)0&a8{lj?0!h^!gO$OEh~S?8A;x_r`m=smY|b!|}F{-`~ZG8AaqgIz>BO>v}e zSg*<#o+mH7QHcqtD4WFV^vuoU?k{1$SNfdw1wm4}RED?h`m915KCXQ^?hV+L8MtS= z0t7d|X632~_!+F_G(#hPT$fn=eL1Si8+~smnc$kBIi8;u#DMjUw$$(!CbTxX9w3~% zOCHuGPk_IiT8_^<4k8^`s7?$m=(E3l)GzfW^zd6^d~hl2z!IsXO&j7AD|sVR$xvOR zWvTcCFwJZDzFSq}YPWh=Y#)AaJ6iq&ND(39@SOHDZV z2<&cN5*04hPp4<9Tv0%8#`tIqu3##jIr`&J?e-MG5=Q5yj3#d` z|25p=+h2C3^|<~LeWH{**)dRgrd1r>u*Dr{Mvl!vki%OS4Do;NR=1~RdaKdVQ9b#) zjdH5V#BHzO`QLV`GX;?%ahY#u4`M9)^B&U<;-9yb+SOPc<0A+_AMGhCBi*wI;RiQEPN2XV_ZcaD|us?hXV{TJb8?=96G1nO{n9mB}?j zde;-Kp8&dUxL4ub23;jSKn0Xa!ZRk1Ov0HI`Erpg4f*+RmOv%avd&Ht_9Q30@+h1? zNTsALN%IYuc^Npp^mzo;ewMDiXLv4SMjGz6m$l_&zy zlP=cQH$}x(}D+jXeiWPL16bYzWCO_R?D9y<$H$VYD^!elfO$UbHRM zRLVHJcU)VQk&?>1+fS##Xovwo7@f7pWm|~L=n1je9V6ut4+nd&sA$&=foG=Afv7236v6lEe!dnXftRjO-0j4rk)p8MiS?glHZa_K0pr zwXF1N^yXj~1OK)Tt}SQjLaS}+;BdRmjW?~_2iRy0`&7TFUgZd_d5EkRURLf+$%_7< zAtful`A5O>j+-Jb(VRRC8&`UcgYBdsMnBYE$Pw{{*+prick1vC-wJ%o<6$#E-V$T3-# zBVoJWwvp6wMiaXU+cl51h;_T|5g)?#U+R}6>QX8Qi;u|P^zzg0Rmh3jx~|%4?MPY} zFS9wWQ&<$Yh?W!|8M86_hC!X}kx1}=`0>JW6#Dfp=mfx~@6G0*8kGHQd;|Q^^19*l zk0q-tdx>LP=A}1KhWqav)<)ico8J7Csn=4a!`mrw*dD=1! zQ&4R3=9V~>h_GXmf7ot@r50WZS{~*6b+r5R5ibalt6g1tj$%to3sizE9;VRUE~H2SuSXI7PGS zSYh!nhD7S;4^PIP02)pJ1$jeo64!gtqM;vkiwEO9WZB9Q^J*z!Dixnt}6ZUC}x>)+!#w9 zEjmBRS=rED_7uXQz+dm+?w7GTJJ{hKAL;b@!$&gBJzQZWg2fQQi^uN`66g3_?)Q!$ zpH4Kd9ga4FJN3lG2lr+70%7rW5G}DCNu1iWB4JRLM61+^-463NHdNF_kEEwY8zHkt z$HRzk4%hlY-$-mu=SrHFZy@xYH!d~?gk{M$yMn_HnI@4P`UJRvE#PdE2 zd=&=Vu?4B0bo5vyKKPg_H}f`B(+gSzvxupwGI#REBdk2%hpm8>I+0RFOy;64?_>3v zur}Fo%hP_?LQuvelh?cb4Q;owwl+A172CMO&mPn{aLOE$aBpH1TB<868Yp}zT}>sy z4P#?4pCr1MC-?(w*(g9fPtu6ZG`xPhV&x9;eaQFR+fY}jTV$`P^nPq|&xROi4n9oE zp%rljCQgd6V3F znG)BD(Fl~a^7>*msVa=WWj}&62<58m8Cd1fr?{6;uI-qF65Cf8NB87D%lcyye}x zQ-79_s5Rh1CCTu10e8w}N7(vh9`o_XW3PgA2Q@?4C zL(MH{08e}iQob*gf9az`^V2c6F=!(VmP#Xa!?mN))( zbWFv=`mtJ*6Ts0z&f~zJ;)~>vox*-CCZWt1*3N|pF|cM2mOD zeK^jfbuQhyDzfoyQDmLdK3yblEPgU;O$`H2tDPSQr$z|PE>4TB(cXgo3|+F~Ejil& z;REX{LzBz%j<$0`LhavN`+}%@VYgjoAYsAWdAw_ot4RUVO5(mJ3pprGm|~pICsho3 z@MaH|Z(cLA9x*cZ796#B46Imoha=VN6s22ZFYqMpjxpnHU+EcVds5%v(Jf%oac7ec zlwiauYKHG7F;#YW5FqK{FrfFQ!$<24`eFg9ufb9S{Tb@vvx+Ei?P3Oh^rT&4)1ZvS zYu+{`EknTCXj-E$&8CkA0l|f+-Tj6U| z-y+YcBjQnBZwd~#k4)^$bs$dV0Hnt|pAwwxf`Q!EcQrueJ4}$u#vW(H9(RU?e9wzL z(}o9={@hqDhc@ShZWqO6(Y(Pvv(2c9g9TnYBbJg`R^O^o+sPE9o6Wr`zpJV1@AzTY zi*?PlaxhpI!-6!~8_Kkc9*58KT4N9F>K0e>zNic&e?Sz3OnEGbCWEimX3yXF*jXU3 z?8UXs-TM5Cj0NwAZh%@=-|W-$lHQKbsY|-Nmi!@=D)H1lngu#Vd*nze=4N~d2zklB zin~%3i92k3?r>Wh^@xFa-jI>n|KO6CTP?wdM%>xG|3c455(Sbwd$|FdU|aRwptz^2 zr|^kfENuylLjIF87=9`L*;8s(R=&_IcektI^JBK;IO;>t7ryu3b|%j4e@Kh~u{ill zaJa}9 zQ=tnEqWz17RO$7gCS867XjJjpS(fhr@Q)sRWZ-Qb?!^v=hQ~Tv2W<{#iN6-+(*jk0Y`Rb^EVVGCO&49e6~Ddy%KcgFP1X#5=p`xhQA? z@-ybM|1I8B{y4)WWk*aqgv!cG^;*bF(*9+5Q^NX6(93qCSwk9*`HVVGz4FRYE6z7! z?|K<=FrhISIkUc{0CTIuDQ$8xyhb`zl7HtB&Jj zL1Q|&=W*H+vZ~ZcpEIIkm3B6a+-cc*+?a&H0wVb`TyXOtxti4CrCE+)l3tO!Cw4h% zxA^Egq3A$H@dR-B3uJDLo(uCqFvA#$`<(O0l{0Ma(8Thn(5E-1NUEb?5mC5#ukCTh zb2nj{k}KarfM_ z*I}T>c|;+Pr9x$B;kAi0loE5Eg8hvh;~kJxS!a`dS?^E=zjI_4ftw(!%$PtEY*O+n zet7Mo|Mh|z;N$yvR5l)#JGv*pocRR5zN0Syjvab0H0{0hY;Q-rwA2kn5Xhv&;1i2^%!-H`M8v^N{K zUzwI`*p`jq==7AE72-8ntxD&476#hC52`deVi$+<=b2UYcD#}{5&L~l+Xb0HFvMk0 zk(2ee2YL^@+(Ub}1laB|UBu|m51`;1gHpO}w9gW6H(1Aso(XCwja?Y1RI{CuwTWw! zcHZ2hY=>C5+d1M%(e#a{2l&nod6o>AF&(6BZLJ?)F|uBoZaAzzQVT8$iGMcUkc8#3 zaOwVVp;W|NKEHk|0zNo-jYyZ0?2I(xcK8v~e2YEOttUI6r|2^JUe>3mep};Cs{9~{ z7oS)mfoi2a7_0+Or}HO8WC^&4AtfU4tvd84`RlWzFMoeZB)mf;qIE}=9Gc`cyrdpD z#pP&-VpSkLymII081B)2KTz%p#(DYRPMQ#7^-4a(iRaimQc<0sKFvcqL~t!>k;@_^ za#B=62J_P;p0R#@?z-0XDf36-kML-_bLZGn;NFs2irB;v)~j}A7{6gmfJ-^5b~+rS zombrhBLSrSx=cj z1sGi85=86$HJXFK@9VXU%eNTru*l#CbgvQY<7_V40e3B>ZfCDz26ZPb4a}W2g z46@-L2=AJcL#E=c9U>Nhnco&BP90Nnr}aWx#TvL2&*%*-38zGw{2U`dU0&d^k)`}k>YfX$Ux-|J z6lgo~^S+;H-_^|Vd$3?Y(-Jq9bZD048o9g3QG-g3ujnr4zW(i`2;=#H*Z-BHWB7MR zhxwo9c>jlvj@_SF^=D;ekt5Q~SuNr(zirzCE31pQwVnM}iiY@~N?s;`6jtRJTA9<> z`xyENjl)5;dNS4M#$EmCSv~oA4!*aqyGduM%-Zh8G1PM_>Ry(v#&D*EC9SdRRExL0 zx7bA5*oXViU04W|2tEPmyD@F&#wuR%yqf_l6OIi!q(PMp>XgbBw`O3p7aimh4f}`g z*$m-O-o19RC`{(-A1)y34A^Xu`pu{youBFtq&7P~QN!{Ur8O6FKN+)}n$lK+1bc7mE#@yc@~aP3)z>YQlRt3nlO<1kQE7?gIr*;?+m6@^$IgBj zzxi`_xGmQNG#-2$%iS7U&cvZ3Sh1&=6A-NAksSSyZ_CQLf13K>5w_f~u;b$r)73&< zfT3O!MO7TzhWf|>L-se)8obZ~d?SunALY-~c~*2o^$Uwz?^5g%PlpYOHFm*1JGuN> zWvm*!p}Rt6_4M|~pD84T**^4*tr9=ss+zHHFcmP>dM&A1114LW_g zO0uPNnY&o^*Dt%qKC*AFd2&IdoZ3yAR~~$aPL1N9&6B^P_-{?UFg#!-nY+7G5(XVJ z!c)SAy1S8gLYCnk`dZJofuIagtg^AtE#>je_Ielxp%o52thZ@)buq1^YW*sC37qY+e;{{4{6tO)9tN0Q7*5?#+_tir9B%?T@_;l!@v7 z0;Z#Pv$c2)^ZFZebMvhVr=$IA)T^jdJ|w!DOrginZaqc(&eZV6+K$fya?aPh1tl{W zkEdX;CwVg4R>D#JC4O45P>2j~jFwxPjYwDG6IuDn6uc=e5e{vd<6$lrxgvQFM#L?U zoTW`Hy{+u>wkeF|-5h79_yz56HylpReU^)tT)2=WTByjAI+*Sp-#5o&Js&0Uc{e`h z1Ry6Y_Tt&GNTXD*T*3mD><{RD^KE(q@9|J0r3)9pd^DMGml%6un znK11iIyOdDbPwk`%0nK6<$hGH5MlLU=qxm-VJumkZc=>F$Y0zmsC%|jf(Oddovn8% z0^v|HhP`XQ?Wwk}&tA@;YkPJvb^G2G$(ZkgT!v6F?~t~qU+f|U#d7z;=%36GDMyIT zg`LK>^Pelf$(#G%tr-u87wpRK_dUGwu8^ZhYdG-n*QZ&w$!^Qj#KW$J(05k4Q4Z9y zZ=xviLkl>xeM+g0I#}<>fa4vZVz%i1`9=S4-ua}|V#6%k5eCaVJ7Ljf>tSAMD0Y6y zP0b5kDbD~Dd95<6eD5Nc6TTa>;f?Zh)(U#6IbVvfr~GL%DBx!FLz3p+^>vKZCAk9Q zFUwz3Os<$SWvUOp4lGaI8EH5Q+D|4$v2yu`Pry9W(!$;4M>LIzoU{hk4|}m6?WY@_ zcC|3zFywPM0uEp6<={~tI~4+OF2~0z4yiTyJYs3#GOT!qVSlaqMb`?ao)(Klba8Q5 zIP~kdGk4?~uEk=$(>XCEaRix$iA@+P61pxQO#6Hm54%qSK_W_2c$Qh_RE{|{RCmSL z7Kojo+{!}C5QNpD5(8KB_X;#|G=U4;?Za>~e@ctX&kUSxCy*&OBQwZae(1_}uEGK#mDY_qZ5t(Hge z!JLqi{su}qt`AQ%wH?@j zH#njm`Qm9}!Ws`_7#oqF_(i!io;2u{sM`=Lv>02rwa`OFYE-%N=kLzWrU`pN{TpY> za{%y`I4BZQ^z>Ex zxHnhQU&N)anLK% zTkV`y7=})l`m0>(`Ea$Hrsk8#ac9bun_dGSpQp8=R9m%5Pj*;v`m+KAO_LbV6%#e0 z-tnbZ&mZ()1yMcGC&2at6AyF56J(6da%mUEKy(KnC{jLF{^d;!1L%5SPqRf5TS?hW zY=y0dj`{Tk z+R7h;JJS7#Y3@4@_5*e7lq|w@b`n#W zbaoPXFW5HD&xvEKA7@s{?={`TyS3!2S$}81NoXp5u3f z7tLp!R~%>yp5fdc5WJ()mA|N#Tr0chVaD7a6qd9l)l-P#{V=!|#N7q8`S8?Z)GK~{ zMrI@eQ|RDj*)S(+Ul@-2d2?Z|HRiyepkAYR5wpq446iGU87}B@q#yC)`OeRFKhQG9 z3AWKT{NCsj>eTC*jHj80MR^ERjp@w_Xl7Z9o&SW|{(yhsqrp>Q#P8XIuD8sZA?%9T zi8Hlb9O!UHnb_^~&|HeiAQO@M;S#Y+(?ncnn@j@vP4mItmJ7dJW7xXk@n0)A_uA09^0Z_tHrV($V;`OEJZNcx zc&$2_nHqJTWHi&DclM>PYw#UNNkcG5Gz4d1L6C2$Vmml@oH3s}Qat0j5b~N?@%2vz zU3feGe(;(Zi&s^yMJl%bie(Ka^1ftd>@~qla!6dJi-JIVEFErUp!C6fqcr>RgR1PR zE-H533DamPpCl0%`!3uKHD6~hk2GBOhcaw(9dt&!F+@EVC4b5b5>PwCAAUHk`IENi z@@iwnf)U7m$W=Sk=*1`!Z#cWa&7l3isC&z}sMW$G*-j&#*iZo z{EoynFN|nt$P=NGRJ>1i2eWiYaf)74o23y4u7I5j4JZ`(piOID4xw?xLNn?N)3S|m zZ0lFzn`j*#8*;^j!Wf~dt(XoL%xTIV_xcf*PTysqG&^ZhP z6i0grNbOZ57)DtQX{!nXE6G2$o21xEXS)!Qt`-g$jXHga>lR>w9Q0r2j(xH?czMo? z<3y9JFp=iM6;D*-*cL=(dzd;LMwEBx=lnK7LQ6VQBdXG@Uc-G;v@xZTBCF13l*A(` ztc1q&OKf+&mB~ThW$wykQf~>N15;M5*5mhfyz(6!FInpl%OGnCWY6+6qLV6?_%`FsNq={FJGfaD;%tvdCfhf=p0>QFT-D1R$)PTVX=XcF& zI<|M7K4`BZMod~%)p5$qF6#%=4CTg-q7I3jh?kv8#>mn#rA4_b^eX_ZzTi?_p+BaU zlUw}obp0WPN@4u;$fWX1H6m$Y6K(Fa>C|yqvZE={T8fX8$;Kr@=BswdLrx}hZrR(c zMvgb-e#}Jgme~myq^BxeTyk=z2v15>F|u~^#CK$G$5T4FTN$8>mFbmP zec-7>_Nq4JM0wnJQpQk2C^`@y`^4lGagd!75;aSDH-L>=uLet(?cCGyS0B=KAPI+|Fva__J#+Dy(h>FN1ccNsVmi?E_wMTS+VJ zjNPm+sdZCzGb4q}pOiNqijHL&mif4+l;8JRR11n2mFbjChCUjoC2suSM@Oyxb}uF_ zr_4Stv3}wl&7|qwq*I#$9XOPYU zyPa7RS1$tQCv!_n66nayU&O^ zQx!&^l@E%y?_GxJX4UHG1t!?sL6WZ!dPGsHEfX|bdY!7r>S$INz2z8+KVdvgSRBn8 zQQN}Zs**7kib~)SIltAw0zl5^t)G|*Yci+#8W*6;`?((;gme8%yaMwgtyO!kA zwC{aADoDcC=FG9tPWWYSj-=+nsEbx>}YL=I{12PTLJDXFY+6J^kjoz22_w-U(Aq zoPA_P(wpg(^2PA}I|g^5suCPpFk51CT}@ky)Yd)ci4Hj_MJ>5>%iXbVXk=t9kl%BF ze!)@L|F#HQ`#UE}%OsE;9$k3l22bIB@*n(ed$FpP3At;5+Q6Rvwd^p+JXDXcqnTXOyw$m@i-f-TI#^E`^-mF_QQ4=ute-pV| zU?|#OYyHKfQq%B)qmA_CTU}=gdC1Tw-2VBG_6qh-}viEl8zk*)M)|4k=%xcI))+!FTT)wfz zn`k&Eppq|leT-Y#Is}&O3{6}6z67nC`3o%`Ro_SQCv(pK$XB9vtotDTmak;|Kk}9Q z)aL%{&*!h*`IpBEft0^I$v;EsEv(o*Ml=45vahWAH)J%xi~v}Meg?e#?@6Wpug~2VZM}Y!Qg^86yQojRUDMM#cFRWg zM|RsWl|}PSQd~HC>Z9g9mT&PSN{!R%Gg`z}C7!V|bF&4Ei&j7{cwoCxZx{@2Uv@r( zNWW7abGmXF*mhzS>qcMa1R0)eGx$<+yi%mpow3ej95nTZPR3VIM}3WuL1IOT`&EM# z_s^1AeIE-`MobZdvkPZWeYDQU@{JhD0iD4eTqXq|8dz8Sxw@`denTD8tS-u@l4d|b zR`+n%t;)AB#ETi~9*?f$OL(O#$)uz4<+d)PlVF@22V=L}E}9u!Z@6!MYhOX+ziHq1 zXAYT?!kr9tw!V!}xxIJkRy~F^n4z!2?|r$fttn>f+EaL4IUMiXt`**P?Xvac)KTAR zws5q3C!n>*Or-S!V`5a}bU4pLPZ`J9E7O!=kX9HYVx}waU1lm-s8Q2@+8I!DzkFi1 zaPDO&#~SOJLLm3jLyVPM^EUzUy-MmTIXlOa84lMq-LIhog3rCE5*NFi5DO zE$N$97XXGgk+fv4ZmP3rt@{)!XnTqILf!drJgYRgd&6L>TPN1G?(Poppw}_ejp*^u z*9ZJ81%9jOFEc@^M#t+U%&5^h<|~NoV&iVK{Z!}W;dSf&_V?+NahdzC)92Si_A%qn z=u0ccWandcnf#xt8-AY>DjYwWlyp0b9DrG5F!Tkd%tZ`wq_(Wy`RR&VdC3hh-}JVJ zNpf3D@V4!Sg;)>R!fZanm5L*a)7G)`yIvAW%m&D_krU zU!jsb7rC3qGHI{+CHi2+Le`*KcgUqOs?K2UiB5S#OY4prsvPhg>KOifOa>aup|fHv zaFKqQ+jF8Fbxm38q&fWK1=34cTbdJmc`%zKS3&*hnbPCc8nQPz{F}CKJIlsXRiGZ+ zvNier29vr&nm{#tF$Nys!W)$@x7F2oPkkVM53Cd)`&yaJCpA2rWo!I@)~jMzGE=m{ zH{CUt)Lqh$KJG#1Y=K*(G1vH`iEfn4W^C(G>B)VOyYDA5rKjm+_rRyhvD>wD7n1ge zm02a*MH_7MU32kmbYqogVJ4rP{l9|9YdKoXIen$s_}WsV4V75y{E~GTcv9#bLR=Uf zG!w_fz&1rW`L=p?eyL9n2R^!Hn9&TWv;{Dy)@r;G7FIhWVJ_fNCg=%Dd`d>&@@=vI z#rE~I;-B{7I?J8-IqP`Nnt^dSQH-SZ(^od9h`V7dYv|9H(!$N)a<9PFQ#Q^ z3Qhwrp4l<3%JrzR(T#35&|ZKY53>qHJ}gQct1X*QvFoLIW!*J31HZ7YP3r5lKH8v( zwA)pQ{0hpItx5cCK)#DOZs%6Sw`1QPRj2;(WgWyLApTzmJ(1$jT+y}++?#1_QgMcmNhqHd{;~LwN|bCSyR2E z>@|bRxVrg6J3lKIZ$>ZQ6+@mdEfs1u70aV{WrV1I*YeOo9ZzhA8B!1 zX99scb3=CL#@(ctQ1f9kFYB|4=&><==0g%hego6IcnAre6RK}AbA@uGRp?Ybg{x## zXSwW~H^t#k|I;o5tW&=&S${9Wo=h0F)rB2pTv9RVBIt$$`8)a#&~<+34{;$`lRS~p zsYh!dz(F}cO;PGUQ@;2Z8qlzSvvv67kc`@p`^SO?q&WU-UgHli_K$guztcZC zzhSMv>H?&HqSkMa_jbYk4VGd3P7ewEMp{LCGlA1a?|z>tfetS3^0_Wc9Cks2nwzXU)fB2=HZ9vnL<;y6lJTt4#F@b*4=u!MUnNcONso5fP;x z|B>-Y_dKtbXLGY1P`I(4D(@s6+x?YzQvXll$?w#DzY$M@|4KZG_}J3ytm`I?Djl2U z*Q_ZWI_RA;`yiu>Jv24d-lik8VAxX-*;Qzk?`p8jkL}tuskSP6OjPdr>@0>Z(j*y& zveiNEiaWkRd`;yMdPtY`qs?`qy|PMKvdG<{I=H%%=#6El+i0y7pmV%-(+s^Y6XUSF zH*6(OYn3;Vlo|2m;pvoS78HD{m=aSzG|LN>t*Nxa@KVf}J*V4M(l$A9mnL7QynP`> z9Ft8Q3e#ce($8IsrU07dL$?eV9J)6XKOO*vDJf^O$h9}1W+)H9|^L2#)sd4-kCDzB5 zzGoA+5E1rcJkr^C@r`YR{>tV8;z6<19-8w5!z+-r19mc-vy+gq$S z^e0xFo{|1VTCVrc`sr^_qRW+#JH5v7c7fcL9p#(;+X8t>y_p0okj~~B5*CM%ro!0; zUqSa}%Ujt1%gIWgl-_bgaT{X7Qq5RpNFUw!fJ=jkIq|dOdB5Wq`q$*}Q*374d>y+C zC=9{1s1f;MIve?04t&*ZFAwT=BQy;vg5q8exKx@zt|B)6{JUj|Zo;?ip_JI*oq7t( zSnYx_GJNAbd#Px7D4r#>JDXEYM1bBz){6AIleYmR-l1>D2W#&Kq)|2mj_0j$|a{n}9 zJ5zB$tf#Xr*`I|OI9V5xQ6R$bpBiF5GJZ}z_LuTc1&#lcY`9VFej78lub|(Cq}D#Op_4cf{`=p58r7oPdG%$TZ~Rug&fnX5`fCE% z67Sqj00CgL`Ez`~i?{wOs8QDP(N;_`pR~Y_r)`P1zRebMSgN|P%}aoT!|hX0p-#&& z>sL_9sr&7i|27@}Ccjyrk*R?EbV*EVm{};IyH?B7ocio|J{f8HWOIE5VPiNij-MgT zy;g0n$*NwT-IML#f01liEJ~0R$*5l+)|sh~cx;OUO&fAQ*#W3o8$Hki<1xwMLf54xrF)wuSPXzkow-bPjR(EzrzC~0aDS&KK zH?Lzo{s!H>ft)0j%+KaGKgI8zGD zjRYG}Vb<FnE%OaYk@2ZuXYYI!wTuF>ZE0IpgtI7#b zHk-OHo}!kSOh>y!%xJN1o}HNT30rCiz$Wd{XBOwX zs>(l$2Hqj&BV;Ov4%@nS6bW{pE`OWH&YMR3ZrY^ZfbHKWGBs`yS>(%j(>qte0t%Sg z*{(0(TWx3J^*C6+ zM8p{oTx1JKk^cQW(Wck@!jlW32ccd%Jj$AjM4JG<;!(XVD8gV`vd4zn;11y4r$A}i z{{kV}$*62+8S{KI_v4 zxpQC-d{mUbM1DDrF5BM86$UV}WTe1+=-fD^)yR@?8ApKskZT*ezCFoYmd0 z9;M+zEQPO%Ep-PQq7Rj{)5Pr#MzINI1i_HoQ3Xg48#@Boa34QtWp{^^Sb}0}wt5ne zi_D#ngyHKW2<)(@yf_;Mt3_8v##zDCM7~Tk;)nX*0RHXuKEgYX9hbkNy4V}_= zvaq+ubl0w=I7Oue{0EQFPWwoPDu=N>hBE|)Vn7N+dKy%WgIA^C1Q=DBC!UK;tpWc(`{1PkP@k^+SiX#wxa?B!f`~P)z3dMc~p53m7M7 zuY-+kLNe1qT;Nq1c>|xx-JQPtBD<0gtXe4)?}${sUwkS*0Y&-|7;KM`T1PNQFpJ7<+sA7`~ zMCbbKHljjrVlppPa$%yi9hW_JlxO3v^z=M3jO$0U@5@g;C!#BPanqW22~Qm{>l$hP zB%{x!41~h0RJp^n*zouoQS}5xUb{3bIN0V(9n&-$j5NDsyGfp_a21TXv8jIpJ;i8ziAOq=ODjb3@z4Zo^mow8~g7q z1M7SaC)sbd7S&r@OPHhgfR47`H~oTJ7tk;Ef9MyP9!*7~%eK;AK?n`H5n&PN!dwHt zY#smLO8(|A1YF5HLBjyoSyfKOdx^eB@v0rmZ-NGq<$f&I=;$zS&p7QQZTH14AjHep zinAZNEy}Dr2nj9#1q1g>SNo*6GL8jG{0?E++xeBp6aMnrHxH8`fzD(Mlig8TJh@v; z{*5OgnwI_6JVEmNyLtKbB)2L=GoV5+64<%AuoI_MF_Hlrn@Z?ZCjox%8*cP4AY9EM zLc42V+OVb1;%4vLrF9lSesnL_NfVQI3`}SX!3R^EfVPSpgbq!VqQip^#o`}O~F$?=G@pms{t5Niab=GPj{Yk z6@xr5rB?;TW#P~Dd90d*A}(z0Ba3dLa>c5|+v#iJd&yphxfYhm;Eus+$?U1!CDbCR z=lu{i4A2se(zU>{QX@D=kGlnONHWwcc1$5AtUcYwhu2Ev^g3uVc@_Jixi>vxO{_Q$ zD*GIiVPQc(H<4sA#^Tghta8tjjp7K0dgb#DSQ%yZLrzv^9OtA{7L&`;qZEr!W;txb zAAJS?>R625xMtaz0aLKaW&g=ulEPVA3K>DlIlRfP`=gr-*M0Z$xy9*F42qL2Z!)vP z@Vb8Ag%lf=O)zfc+>Q?e0V(Cewuy?|j)hc~`6r~&Y zm;&QyC}T%VXH1{RkTjKs--S9q5;~f)z@OJ(ukZuow{(mVB$;f&`=#m-Z<< zoZvY#7E=P2P{aaEXw4`!L|txZ(RK@@;%liEE!>2Icz2g{Ml+l71`_>b&T=aX>d3$s zvG3JPe99JL*78ux_Rdr_3=JEGury+3c2tDOZOv?HH4+E5_MOu~9&by>ijxsFrof!s zt4M)`@E?a*#3}^AS1g$NVv`2p%zvDIOnO{qA_4m%<)emS)Q3i!)M#-c{5F|!&QlQG zIP0JgVrHC}D1lg^%WTS>ElM#CxJ`+PGm#hl(b4bou|h{`m_b(cS(&Ba-HsbHX3@l4$!#?@35x!wfn@xD+F04SUU7 z!s9bXG0xXQ?6ydCEn!Ew$>R9%D~M)B{9^BvW+ayMfp@YUy7N9>9X##fd&6r{9oKsn zg83h;3Z{HC=460_f=u+>I<#W2FT<;uw58$u&4;kAKL`Yi-P(zN(+mHE)2{ytr@L?A z^!Rr;P5*D;^v{!>QgV0uookC7^?1A3EFQbJ0w-f76bj_2_oC8kIFrK>7k)fL4D zG2v(GM|1}29Jo7qi{dTSTJcI}KOl5r)DP`YE$-RCLCBQfk@%k3?%iY8u(|0O#LcaN zQ;`8oo~1fDIY%k?a7DClVA{J$?~4}}W&fj1g^%7h22?3ZBC1LwN6Yg~l&9_PT-!Mg z9nL_y1!mG~`McWtowZ9J*Wr0bt`>FYX|n>9MiO!dkVR^2z6gZ6t0@^MwK(UMIok5S z6O^>u%E6z9iQMjbGvktr=;718ahK7dJ{{tEPqvhn{K;-M!wm*WIvNHVPCH1=Tcc}e&WBP4tP^T?6@hzN9%j>w zKcpq&3DYL~Lg_kGpD3-`iSAmWJWMYZ$tk4X*px#|WZFl@Wfn|oWE5@!9*z{Hk*;>w!_B(mx9{N5jWC-LlMPv&+tI6B#lG8V} zxHb2*w|(27as#w4$F+x#v*S^0w6iHN;mTG|w+JT;c5yAR&nckuJZf!9A7U^FJVB5) zrI!ouj*qKnWA{pC?%eHz1!ua)*{EDgBzmhTAq{mHCnp=f$ziD6$7HouXMSJgsM{#Gs>|)@Ng==VPY(B(94NU1T zc<*Cg5p!p8`%4_Z_Hd1aBOy*BGkyKYp4rZ})P9uQ9D8FUNbY0O@g@W&UJoCH2caa! zon+k%3ex5^CG2A&I%~qDAPZzLw>1q<&)x}_<<>_z9U~IDYy$}XR5T7ol`RO;RX16{ zz+$=8XvRw#NMrlRJ7@|Eb3)p5iMce^Bpp3)-61HQ+qj->6h^s;{+z`oo*<(_Tjb@6 zjFvWBoN=#a;YY1NmBozA88{)F-Me7F;{d)MeFq46(lcb_oFE1FLVjgU+lY3IbeE}b z`!^BjPN4*BP#HGg1oqR8=7b|i4l*)6)G4xTP_&-Fq?4@I^spCb{$s62HgoIx$jA@B zwO`s^HkcF5nm~xq2fyRm#5Z>CiMr)wkJ7j%%c>jPPDt^Hh}IfzpC`y}T1(g2 z6boC{vpRNf}R&V;3wH$!@=$>WT3|P{>Ub0L_c& z&&I@wFPA@PtF>)vEs2wY?7@T16(+1x?0|yu4X7(j>9)E{Utkw)6QcMG+p)-pk~~059-=JMfDm)q6+@Kn zssn@uip#EJq2Gm>?Pn9<1pZykuC6F&9~E+kH=Q6ufUbW9zd+e~yJ(3C|C&bjBt%d` zXT+V(+G5~X;N=P~U}QgP^qAB1IDI#gWG22?`S==D@q|&{|3iNmFV6K!C6I9y0z+@~ z#`9>#9Y%gGaaDtP-V*yr>*s|vb_~|ge08Jww3L7c`6d|yxDltKnV)UjBavy6%lYi- zm8lj_3;$~!?SHcJ|F2Q_-vc_QeqnH<-wb~uA~?)p_il2`>k;Oq^4;Fr$=dI4)DLz) zvb5L?-S`~xC7QqUBCFQXcHU?uJrmfb*ju=r_x8&!wG<=J&HJ=+7iLw}UHNY=qf0F5ZuEqaiy-^ZgH94jSGa z@19{Eb4N+3Av6oyhF}lsQ8L%Z{G==vgBZ@V+>Sg~&Ib{dB7(H3LjJbz4zLq(J$;HcQi8W_8_=Ar}xUNp|&s}AQMaDGXif)zEcx7 zZrTLD>4{idb%lu+0zUfAg9fL=$Tc~~Px&b5QD~AMf~Tl6L-y?AQrHR{DH5AoU}5P) zM81NeBToZY00xYXiAAVkUAtI$Isn1%9(*aMhpSIgdEF(60He!Gbg$N_v619#g=q@z zuAw&{-%yN&qwR6Him*&~Bob7joh<~Pm{}H0^Qh_GmbrVgjlHl{x~*Tk3O*hWm@1Yh z@@b8u{F9K+r*YV2unb`XuaAAPTldaouCq~G4+K`yuNOMRB+wQK2`C?dR<{c_vVaBh zltZf2L@`~7S@6h1@?DJleAAu^AhfI^xf(@`DwXw@8!A3XEhSVBdhXID3(P17^SukQ2xgle>_m^#OgOVZi=$G%bh6k9Z$ zDZJd+CVxi2*>fP76REi|_0nhnpQusy{ON*jdi;8|MHXTf_P%Wo;gAq!@DltrE9B`J z-B%E`7TuRfHynne1(&OYQW7}BX)(`W8OP+qA@_qn|7bt+?7l*M6?H{nc~YYqZt{2p zha|qMGTArz(6;9a&Mgf)(31N`!O_7-`g%^e&XxWvC^FOVGx-j#=im)oLze^kP3?7; z-D8Qr<6qz8V=N~C|H9_w{w$U>wpE&-(>d_~XAw;jb6J{;uw7JLC+rQb9yUUq^>E^!!V7q7&6lvm?ee%Vb z3f&ynr(`r@^^HFQlz%_x^yk5y_?3|YFV8SO%&C%$BvFO|hjapvajW3h$*|nezn%<> zn!7q#uk^=uSlT_Gv9BO_TizaUb(ft=6J6Yj$t=>o%!Sj#XJcKystmQZ4wO}MBKMM$ zA2ZvK?d-Hl06aFznmPIa(i}l3EISVZ;%4+H z*dmR?X5Xxaeg&~amd+@&-xChQ#YH|G-xWWfaSPo%AN;6SaS}!oHs%@N@$#H$aH}$+ zb5ogD5wBzNt%lC!-O&OwQ;JCO$DS5pITDp(2cgqbyqN+TwidWMb!lCC$0=NM7tjKd zO=h=PdAu+?Aq#+hm^34jyu%cw-JHSfZ~~nE7DOA{zJofJYC(dp&wA(DMBo`IQvsi@PFiRH{7Imzv3nq|XcAR8=p7IGUneD|0l9UU#o!p|T13G^XUjiEAit;UIlQcOJQcDWgpy z-0KwhkXzWt*I_Zn^+%A8{G8cd)Yyi`7<-0q>r9U)>v)V3d{5zN5I9&{FL1}uwlEC< zowVePj5FLIm=$@WOB5|F+fto#cQd9OrQ$7qk)F1Bii+B_mpBLsYuxwm2s@>WL}on> zR9vjnlR<)*kHr8Q02VsbqZ|e!wAdg-FX57Jqu@?(O`II)IxqxC9ujP0t?uInady(` zGM|y2(An{J3B2w;OIyam-~^Aelx&R`dGFwRp3N9OHXhMCwRA<1RoGca(Vl|LM@nug zY@X$$y>M9yC@>mWpoombZ)>bV~oPIL`r||;Y zG?j3uolP|NfbhwT@hthgEGa~T!k7ZedPkJDI#<#KBRNOd(i`39x;E9UMsC*GqBIoknJ0D!S|X@ZRfsHj0SM zK*gnxOXfBj-32-QRAR3I+1!l4`x~)_HyECdwMw)H zot{JNNu`DZS6_NKh%3*rb5LSCG^Cj8kgGsXtdNl##9uBMdK|*HW9p!(2xt}%6LN~= zybzd${{dMuWQE%syhZOEFzGLL4(v^=&YxoBA)mo*o6QMISV{p&%rSdLg`^e_J;zyJ zf+U@4t|9}Lx?6M;F#mH!P?+5ICuSI!XK+^~DX?6hdot}J{*Ix?}m6 zF3jL;P856apwr;PEN+|D#>^TwR1owKh1pgio$=dmax&wYk-C&&& zixWI{NTfK?=G1A;umb+r=pTSuROLA;mf6hDyRUm1J%7E*3Rj#;cBkL!hAFv@r>D#S zpz~U-x`Iu+y?7;H`LF04s|Wka%C#`?ipFUxQL>+TZf0&Y)MRH0`XGHOIZcIZ=Df5^JV-Fx@oeGd>`zzT&j9hm5Q&@P`@X&$z^2nIQ4MVsM)NU4-^+ zP6%U2!b)EYqq1_Uk4oGd5obIO4qNU#_YKAVO75E3KEr;NPR2FH-Ggz_HBsNU2PMi; z7^jR;6!jH`pC$+!%4>j}u^v&{cMdApx#z*jH$S^*5|CEBcmc+q!(ZFh zW!A%A;~LXQ!5_?_imeu#hX<4Un^!57)D^dN_j1|H*n$A#u~J&ish;J)9K#gg2=gfg z{FX9)Gwv^x7qvHk78H<|FwIfy~+hZl26q(8q>2h z6fK`Yt05O}{Vm^}dGg54O2LjsS&E%W&p z^ZWFwjSdhs!V$pYwBqBQn0~2}L%2Y_#_>G1G;VPmk#`x*BQ7n>`}7C;Pq*-?Y(cTO zAodW2!6rOaE^2ypeOPpZV$;t!yZ>%EPP}+L&T_T7#fzh`4rk< zQH@EMIm#Y{ea{C>?tR-!z*z>*`apUW8m@|XwmA#wh)56ps?pCHG6UW4t{{Mpsf+Jx~u?oaPvF=%4^@RKJ&M7iWb;uj7 z$&Wf>yK%(YDku9N;)ZrnxjeJt0*2z)cm23(=PvrBF^v@3<>?Colej1V8+*Cut&P3T z4tr|^jb9_k&DDz4#jq2xS==_<^FT2mxWE)<^{HF-tJ5;i{3MnMa%lzIFBnOXDRu2qT#;F*zY4UmL)LI!X({X~OnW z20nhWQ~pe2wG5UEQ`=@%weRuuVLC9!68mN~KLocy0~aI}wtK-&gQQ0*kNX0~L} z(WXg%wXW|zaf6o-$AIy<**u@Xqgm<;OT{B=^8;6LTVzzm_uw*BO;IU;2O$x&-vL9d zb82yKvH~}0Ow*C&Vy@;dC_jSDlKt}k3=PBi+V{% z&w7C+MZhmCzl^}^OR-Sp6|?b*zI@5@&|2LmR^;I>iO6=HeDg)SxfyZ2Bz0hyp%OM1 z_#^j#@%U$f#(BM7U|Q1fEz4LUPWz>?DZpYdfL_}O>sP^uKH&o$91&~lXD_rBfw>~q zsSk2IQwNkKss2ymQ%`iSaX!Ez)JzKzS;_Tlw7JqTj^&1;st2>4a?=>Np&{#0K?1JG zxj@v&^q(cKvaCq98fLN-^wT(AGaV+jcocpGSto*_plslc@~X)&z^Ohpzshvhs#R}j zJyXItfMyx2r%7x0G$V2rdGAsFM_jIeT=(-J7wu7L>cI7hh;rOn1Wo#)*e&w0&FT>{ zvZ@v!cXfu03=@b2rTuBq_sOf}-8{UF45uFb7<-BHDbeq+>L&ew-nqzE`ZnzvQt`ve ze?IbdFW@QJBfx<4En89W`|kE5mRp;y#(!aC_CkO=*O@+;>}F$!&c}+insXFKqBc36>ufpaYyL zcSL3I_}SO)Rh)kd`%vfw19lxJODb%j+2FLdAnu!i?5w7IoVHbLL+(MHv5ICMz5xb3NyTF1fcFuu+G@-6i4Q#J|2^PureJ^+s|ucY5VAhd(w;dTZ!sGkKdo zPtm^CY#}G?T-i+@eLm54yNAA;0o~D2#%AN}6KR(u&yT?_POqvOt`+3reRE%-%c4U4 zkGypG*=$|%onf{D(;bRPyaAXZ+Mp}$Mptt~BR~W@MnyhQep8m&0f#n73#K>B$ngkp(^Tw8fq}i3%_Q|+C&fbW-94+p z6f3B*+TtX8LyIc;wfapuT;>`_H|yEm6I}B$1xd=n_xXB;fNm4;3Bq;A~^YZ!QlL7E5|_ zAm$=|(lEOe;F7T$h$cB-Od;`uwfDnJDUZG!OxhI||Vn-jSa&9S2 zW6BRI3q-BO2r^w~R-N-)gMWL$yC?7Qi)u(8?fv}L9Zk90orBEOScf$rX(6#hb$vD| zmLTA>r&!MrGbZ<=lBAnzV|{q*dLvBF)#rN5$9vF-yg5%_!pRnFCJYAjQ$U1*$`R-= zYgJ!CIQ`$v`PP6r-y>-4_S9rNV4ao>+_0GWTnWh}X^1#R$4>w3_4m-zZ<*jf4^{gM z&%)f|KZE`s>+`p;*4s?^_kWM!BthA%0TlCF7|#O0_=QT<_R<%dJYI{GQ~skyJ2{2+ zZAY)l9xjEcdcxE2?vd3-eBw$+Lm+?pU`6K2A4XJ5pl6d;GcqBs-dKJyEJupBSfQmI zO#Vm@pUoy=07MkEvbIIiZ#MTNsSHlYCdvW0TmG1eOVzb6t(8O}X3ia;#GYNk+miWF z5EQ}r@#_Qbg&V`$w@U5_sNJ}j9|Rv~{V1f6Z9Qj=GM)B&cskTK7PRt+qD_#**Cayc zp_$Fe{rD%qtjs_11dSw{6rs46z#dU2t$85Yomk63JOTC=ylg8sO%NG~3ruW2P9gsa@;aKDLsQdBS}jjqo&|Hm>}aKv`0yD# znvgLcQ+~QeK&j&Sj7`9smOdw*WfQjp|5QS@90?BUUVu|QqMFuXR0v0`+bA&NS?|b5 zA+nxif~oRzz&vt9MSb?U(X6Vq2_7k0<3Z+=%EvKW163ea zJ~zyiaKfP>82GoCa9aB>vvRyGs!U58>E+p1o7U=lQ>=&;RE{mnbJHWeD_%})zIO>B zV1?+zB{x5DIg=B@bOH6O=$k^OO`VL9L7{)7?u=pp*665ZVmU22JPfb3L$9U=3Go{` z_cIL-D$|Y=YVoOJBb<9Qc-ZqFIw@V$+Gfcq`?z6RoVVN@mB!`AEZw^|jA=h-CrLc^ z6UThrXSEu1Ar^Ix!&+I$#J=n?7cYrDd~?33&*aYW~E%7t&x=S>7QzqmHF;u0EcfZ|}tL7LMz!U$AiT z)?gfb2p<YnY)i*`WA*8e78sj(EwOo0a#WTd9&k$)vqrWxRO-oLvhe$>-`gx=A>E zy4UbAYRQ{|`Z5R?UqNr}2?fTMFY&OiEK?!Lji)RSe61xjM-Vc22~ouH@pK{Den9g| zoL??Gd%;SdtqjQho{YlNNW(I|_(G6(7lNP|&RuF+(gkGyUU|4;k*RhZzMV&D`?4#P z79RJzYQ*>5d)2zKwU!{^APTr7(ZQxR>eSDB?>Y%hA@L%!h#D{?zAuA~mUEMY5Q*pu zJy)1i;oE!dE6CPLG`@}{|b8F?aHb1WXRH{dy+tM z&Nywb06+4~Xe@YNy<+C&0=!>0!(HH&%?fKzKZ9l*bVaGc^z`vLVR_(4A9cv9gdK5* zVJiYlz_*W8igj>E7!Rt_NI(FDjso`SB931lE#i;6xVmar?TD!_-ZnHV8YQW;B8wuG z@I>Uh+!x4Z(&Z64$NdVjBz-jgPU2I!!R^VT?&TRAD`$F@Eq%Jjb_KK&i{{z<*^H{2WegKp^m6!+>Nh2>oOdxO`b z_EdnZD8^RZ7ex?j9wD2YbkKv2WB!qABc*@X!tNl#aTb+Q~ ztuspRx5~42UshoJa>DYe;{Y6rBDb(I}9~6FkhJvfZ7OA+( zZW6E^!}&gR;m)$l27tl?@WE6v(wNb&)cF~&u#X6sDk`6C>F*$8(T^nQ?=mWD_8CuH zF`jg!phS$FHw$Y5hPPU2OocH$JX`ZPFg-_f+tA_~ceEgAD@o+;gA^cwH#{ubbu-6L zvN~pR?wmsdXak_Wa5SZtaMTMC;I08q*a0?*6D)(XXk`MVuy)36h*(Bjs32(jkd%^x zsq>&FSYZneXUi1YDNgsjtHUXGl(DTB&!x<4=3my7hv3KH8+yWTOOdI|=oyZQCodGc zKRJIPdCyF$eIX`V{EpVCTn|2eFPO*w4Jny7%=qN0KoQAxmNejZKOi8e;>%v%rcP-( z(29#^FHus`J5_rhxO8VZ;!7B^o=6A&2Bm@?5% z$DVjr_wfqCbSbCB>7T8LkvL^}U7A6Ssj2jEftVexHfBI7+5odM^NfxZDrqQv=+HTl zX%0kVs-u&lWe2phBJboo!WG*Zb=W8JatX%Drpj~GTU!n*0SBjxyf?oH+H9*wpncya zQEDGFPonS^Ih8F9rapXd|9;JU58ak^KF`M8$gZX1T=oI$9vv<0b4+!tjJ@0ZgWJ%f zDo1~OSn9b`i)2$L7utqWah^;@j-9ZB0uJ44I_3X|wYQFnYVX_s2T?#8q#Nl}x&@>h z5Rh&V>FyF#q+1wDQlz_cDCv@hp}V9@N|f{c;JMHJocp0m^*em0Ru}6CVf(vo${jQ+P|{hm$p-NjX$fK_A6Gi=h(gXu+yym&D#%2z_j1%r-UL zoeeecl>Q22k)@3Y%~(eE_>!LR=*2>Ulhtd;d)&xo_!;eVls z{m0IN;bAC0kMV}Y2?&Ko>t6HB^^3k zQM_m(w=EFOQb+_fdE-DK*&p{ml3hmvpibg%31H z?oV>F{if9AC0A*higx||rD{(D_`cves4x2oy{VT_7knhit54(D#}EXzUW~9UUSF{y z_|6MGErq;x+T-^o_5_b5iBb24o_z)}L^WNdHWGAm*zgFn9X61=7ds&Y)~Hla1|%-U zf;<<0JyGd&2`XYsl{am1`mg5B$$q52Hsxq|+&t!h^8WM2R48|MmfD&8hro$XXG zp|3e4`Y#$$J`#Cip;F~21J_sPv!J1{MC;K}@N-EX!Xvr8nT3rPFoiEJR@4dp?z2QD zTEgVNNhYT4JX~1goOc{Q%V0naSdix4!{CV$GVxxpiRLSDq)+E;ABjRAQ6xqa6^6d@ zCYk-EkU9oAk20Vj*-AHPHFi?qg>g+i>qy?hM_b$FxLQ$ACKnXnL`hF8NlAV4IWm3D z;QYj@+qcgzH*E;Z_E<2T2DyFDd$#-b_IArV$xNY)I)88=vDvw&_RtRT@Z{I>2;c5b z-EbhK8`tu$k0Gq9+~i&h^U*d3DSe+MOjooNPD9@LFo})*T%}$@r_4;R)w%05{NjR2 zVoDI!*pRliu65IsLEjOWCXKVao5U5{xkbkK4Y}>fk6UOc72){4J#`gX2Eh##O)cz< zPkds&#$$8$wfC!|eR0F0-YKCE*e2onLTJLczDY#t602l0nJyn_aPGNB5*Rva6vsIR zc0^1nYw(G($Hs!q;EbZ7X9<++-h^vhA~Z#0qcb7 zrzyCiJcxt3*ZY*pl>ZNiO~XLxwHL20SKFgct1B3xP)%zcWNXt!*T%N2qemM|p-9aX zEXi9(K7(Y4#0PfnzF5j|>+tkH&kgm?(*?{#CK}S;(|a!?y0^j?Dt6S1i1L|8zg)f4kgpl2=WOU0lKnK_>^)JyNZ)}%A)UAJ7k1u1{+4d=N(c;um2qI`5eOfGmRg<6I~34antyQ|o%O zx3|DdZVYfrq>cCzPd@xwP5u4H(f9{06cUlxYOm+G~ET1x;5nZ(synSAn{WP7G zA4+FpLQ3M2Dggn4M$KBI1Q3~CGMoO1p>lvXPK_(363!$v#7+Z2u3_4dkclEY@A;?; zggBtClevAfErNZjU3&w#bW(BJe?Sb{A2nr0uQUX~BQ$|s08Zioa0_rz&Jse6R=jwD z@143q;`&kXT+o>uBipSugR8hC1oqs1ToH#gEMup@T3Y3a6}@+zE&`?yDk^~uFM@`d zb9HYs^gQ}%BFX8JZw5i?hc2uexw``;ryvgXuM&mxL5Vkl=~myJZzRE%DdnJ)s-yDA zjilz(XcV|;aq6ncC=8m}K97u8bV-F^L7ZT(+f^M`n7&;5cr0%=VuFblW&-jal^Y&o2{R~YpcF5 z)GWGt+qAn(1(e@FY@5N0-5}B=uO$XF^3aMuAdi9%S*b?2ZRLyZwvLS%?Zr+g+T}+v zXBGo;Ji;ES1hNAa)xCRHQ)bvjY1T817xru!QIQQ>^@313mr)=S^lkHeeOp*W+1RFx zHIxiBgN4afM1nCOzN{}&Pl3Ulc$f2Q#mu!cH_!b=bW8h*u|eKyRlW!lGb@+WRbB`L z%J6Jx#JTvXLAoiIRLt}zwh|2v6CFJ~C#TR^z-vt+Im;xzauKVLgUy(F5AA}sEYxYw zs;TK(HjMfu@fJTL^2k*+Enuw(uLWR+ANe7sUVlKUU;cF13S^y=iac5N=*=`qzZiLr z0MbpUF%Sh3rtlQHdP|in@Ig&&>)Q>tS|v~}Ct&IYb=;jEa=*4KPTX&QA+gi;FURw{ z9N@n+uiow`gl*zUUzztfRCISI3LR#~p}g;h(uE?irGKr!$>A5j1m~1X-T>F@*oD7b*o0h0s-djj^lpB5A5pU3;|kkD(7Q3rdjT*A~nn7;1p4+z3ULIM9F z4KO|UkCGUuLyvuaZ7-T-aa_<^IT>(VrxNYEc3hl1$$U7Giu~(g->UHmBhBU z?giEVIU(ckF0jV`sEhyUAfVxRQ?%Eb{qkD2q~4-|vMc}6Ljz%i1E96qmGpHFVk~%z zSPG8HJTX(EHMI(EG!nfpDk%fdWtuGFOSlFO4qp>xjj*z+7dS@e2kepaTgC^Z@JT=f zef%<;BRPeU3M70`W%^07lVy7zP+S02ZM8LY57KgaA6Q~A9mK!3<-FfL^Z4XdG}7yw zso78cHApsnW=%2=auTKtC~N^ao9B6}J@DLKNdPKPu9jOBD9IR9%=b=w6fW3@Zhpan zR%%$S&S#bR>#OoOXsa!eCy#mrz+`>BP49hRNH`?0hv^x(I+a^*38yV1%`nL5F z2P*IZ2m>fCIb90ok!3H}=mQm|dAWOPzj7Q#?%Oz22X%xsiWT73PzyK9KTmsT)UJmlm={eNR|S=J1ds6_mi0TRJKeXA-Lc$Hws@4 z+~pGcdc8}DS9~?!HF&E>HJbX^M};C@ZYr;F(n(|wq{uXkRoi__-ELRz=Sb!hT& z)b)evO2#_d8$lh#2bUt|iU6=4sS6RLzA?ci!)f!rl3WqbG5G^R$g<8{zWhbXQ^MH6 z34)RRI`+pzj!P$X!iS4?WNOEh-$>EGriz&|X3c|I5;`B4;5P(UcKxUPdo22ljG@=a zgCu<eg`MMvM< zqulzr15xUe9ai)m-NGcxS-K$7|%P|TEN~&qyM=zIoo~y0$!vJa2G3BW#e#sa-(t?9H4N{%`SiN zuyP9daDzI;Q@YjU;T>gO?UW$Y6Q{4DWRGei&4R^B$m)Gj^^2kHKP*4B4L`CmHD*la zfH?lFw#33)F8le}v25&CQ^_HdcMnG1j)MX4N&S=prmIrb$YI>Ky5dV{*puP)+ERRS zsHrVz55dnP5-dy=LVvOeL3AFgKh-CjA=#pmpdc2a=oau=N16cw=5K_D)fYI7?+Tm} zM&13G6!~gvNoK{WmXMQyq8Hs*`Ur+>YRnXkdM`rome|nmJ?r|dvJCzWU$p)SUxY<0 z{*5+&cITg(%EFz0KKxT&DgQ6>%J{xN-AZWj2o?V3T=?5&ne}{FxUtgH^eu?3T}VIk z_?w%aVuz6at()He!fNEt(e%Ho8#Q>7jMvC(ur~jcHD3KmQA~Y42+d%&GNHIaCIco~ z84%}!gctiCqUX+#Q>AoS>FCqzYSGlsTXFk8j$N1}z8vA>uu^qC`M>@5J}qle8~3JMNE{#6mW3YRNVA}H|&d&27ByFQRHxC*e)-x zL+-28ZIWbU-xk6N-zq zDcPC~m?GPEAj?MUXz&<0Mqqsc!9@3ZtCO5?;zCq4YEdG zIB-mn6XCKHWsuw*sSruwiv;G}&n@u#R{A)`6<;>=P`Igp%7o_&M9>;K3eD9?d^Ox@ zA5%qJ({S)P4kawt`W6Ym6YWjEl2)_{?;GL8f{F#|ki6BD%_3{Uef@KbsesGAbl<|@ z-9B^62#af;_rtm_x_L50CkCj{Aig1WuSnHMwpwrJ#ALT)V(j6E!#^L?B8TjopfxO3 zqF*=j$uM+|RaC>cN;vQ;X45ufOH0{YoSUjhKas*Ev3|_ZSE_skCMxXo_2s^|_8UR1 z=RSIz{LLSiUN*d#Puq%88q>{n>?qETBS*ifPI z&%eH1An5#xK!Zl;oQ~EWs zPTt}-dkz?u*v#vyJvruZOClE2o&&qcL=yciuna)CT$_?%Elm)#dOlXq74dt54LaW! zL^or;+eWe8FK{Gpg`D(MTMms8Ck0xwng$VyRS^lyl^7=LZ!!xaZza8q#1P1&jM_t( zbqvAtM==Krx2`L(KvP#!RX|GQ{VGALCc>=!H`0MaVJ5#-MWL)zV0)uST_S_m;oR02 zW#AKklXE)luJhe~cfAa(as1fJh!SMGuqCZva%lh=?*{cApP^zQ%J-^1CI8D(07PZ6 zS&-C1{Pe@+%a(sw6@0&%`f(w+1 zsD!m|Sb^B_!dMwcfRD%WyF-S?>#x?MrmD*7w1H7RAKvZ)pwWpb64s%qo>%*N(!Qx(W4k_Zh#+5Z20S=&vO9GOWHWX|xS3b{TWV&a)ABC-aN0MX zveAG;)mDwiRDg`Bcb8JzM2`o`^s!Mwa6&VYQkhh;^xPjP+P_!)IIh0wM5SDt5wGzv zk^-zrcgv}OP44!u5X=v4e$Q4`kb)H0BO@al9^a~dctvxbDJ|La|40ilul`>1y-JxO zs-&WaV$dah?LjpJxqy|eT6jA*$Eb;l>>z!bzeL#eb!^E^d_H;)iZwKJ$7Eq5)aAFB!T<;Y&!OempGd$4qiX?}2NAM1PY}f6#Yga80DT{BbG@Ptd-E z#^reTUDj)43gIbNP?svaF?|j$J+7P(?1S*Gg1vZ_d8W%t@l9Xn@2tv4DrWVEuy?PJ zX^*VqW9+stVODw+cJNO9EfEQnX6L%ofPJ@nhF?y8SPS=ChXv2|MhWKFq^~tCN?_;6 zTnYoXLH$oBf$cr!t4lJy=!y5_S$}Zidd6$mF(~qhx+!xju-luE3B_JP$?i3!GTMA& zb4UHCI;J_UuFTOe7{#1ple(4n)Ma(g-?(d-C88``SwZ*R!7D<{3iS-&vJf zosfviJJ?TaK_3JY2`w>!GS%PtN`e24&C>Jfs+&f2Ji)~A#4{uIiUh9K_pxy?8S0DZ z`uY!##tuJGSG`_LCq6Jjx=_PJi^Bn}#bOp)s3FSjX-x zMs~C)^_xEA*Xu{3c*-g?VQA|KQlK(}{*shuLiczKhT0IC`Z~er`4TqTW6+;;!flp`$RnFau#WjRuBm zhC;E%KETVY)*(pUZwj7fORqs9l4o&-*1r2C_FGi4`KXEp)l~2T7IsudCLHB!QrwH) zpSmXq{)&M5(N+n89_oj2;d4|!g=_gMhP?BsMn(ktHZ4Mtr2DJbHGRx?m9b^4ea1j> zDm$A?EYuYML1}{Lx0SRzUuZtxT+@0rP8aep=BJ6_YLQNPaSJ9QD%aNfkOFUBhi=`C zu0t2BTyC|F&-bsoDXg|vNX1fnbrC@>YkX4@ytiP9_BHC)ClL!jV{QTMqtxcaS=3gt zM!w8UZfN#fUk9851-5mQSKRf!U-;-xkY+S5hst|!5oY`rLOl}qO!&lSeJ{*{^;LJ? zO>BHe58i$QZo0V`>^qvfw_;JLy_U;^ojXN=XC}Xwv4uL$_8Fz`vKX!(W?Eo-(+zOo zKijN`CL5{4l6kj2>?*n~_NyG@jv)`nUnEYaIW*4)YsO~FB1sNXd*5!2TbhXQC@ zVGVeUF=zH16~igueucK?;E1Ps{^f|(iak;^Hj~C@?RjfPA0G&PKMAfW9XGg7`Ih&d zq~{@?u=RcIFBsn^vvx723mTB>g(EubY@|=FRp=V%P>)-h2?=N&7S~c|uYUMNYcyf4 zVHjkk%^>e;5>j!s^#=|oNHz6w`+Br5;PHVuLN`5@kIKaab&R?ew*_V|iaMUIax zH*V7UWLx2Kcy}rWB*9vHExzn4;1n=)&v9sxLEE%DpcK-W(%|Vnd&Q|N6mvdTJ&Udj zbt=})5JWjppOkjBk?Xa%jDJr}aTbp&(Jc(!p#tRAny8Oabt%D~nZ}Ty?p7b}1{kT5cClU(;yS;?tix;NuzZ2I4=i7Jv5Ob9h}bR1geIVQ1eVXDs_ zI_)}G?Fa80dae>&AV|7*DIhd#pLl{l+EFt_q`eDHv^m2oyDTjV{NzEA-TIh1h|J?$ zh!1_huv;_N?aA2Cj?hX$=v<{Fn_0v;1sbhGEt{j+6lF$zMO%Aj+6Q{~XKN}OZlC16 zbf>(HJ4Kq!>hy_AYetRLHQ72o2yEWTjp>0sGeA)5DdS;q%JcCMqzLPO?f>M~tjpmd zMcBQj0Hxo0rpNm^NUE!^>=E;?!i*a7;Odx;PkXgGR0ytkSOXZVK^Xj1HPE_;EPA}} zwNQ$GW&DmFrkHm2=G8A+oLqu*^Q2q`t>A@iD`!3F@c}tDx?3-l^wqIjJR>U@wf$rk z?8>z?A{R39f@)dl6XfM;iY*;)2^R_ZVp!Kbu4Idvn2JUKf%pO#O!LXR#MQHp96zFB zX=;X5#A-7IGtCqzw(7f=$xxb1(;3FAF_&;skXodOlr3OdbGbI!v)%YgD`ZH85zU_l zD9EMD71<-B7!9oE!GM(PZV5ficZ(D6ql=tX#6s`H@oCmC`6}O4Qbj7amqkTA2aalO zE_pB=Bl+{12-^~d&X`Wf-2#E^!K15)#~raV>$kW~WU(JeXeX)M-(R)IMsI3TyokmtiwyNmkA9hAFjvRY-?K5~=?RVa-X#Nv7m--CHRX@E!^eT??^;98at}z+P@tJ`UIgb5^dY@v0v^@k;Mq zjm#PL23QRcBpbijcF~tDEF{ylO&H}p6{`RM&9wf-gACC3Kqd6SmH%}9Z@9Nt>EHO0 zfA|E~{L?2`@;}eK|2>7`FAyB#zqdvFb81fbpA8Pn4~p4avuVHxz2SC*-eF(%!MtO_ z<6hs!Z199kyVol};$hKjqi{>wUCCI9PPUBQR9J214n<4^MD%dKfh2vd9`n)ro zB5E)CU)!7&T4g)h&_z`W2z8$MqDH>p-zKQqb9n5BmYuA_KFMKf3!1>^_Nx%*xVy@v zrgTzty$3}d#zQvzJ;BWfST+voIh|<`ipj!2l}J<9qbIM!?;%LCtX!5DC?ajZCOakr zJxvjF@f-P%w13^Pwhvy4%0DzlW9y& z=M8H5MHU4HXEK9q1CV1w^jKec=1dN=_GF=O71Q% znKsS3?}p6VCxi!L5sI~yC1++P9ruuXD3hlyLntSkDQHgg-HVJHO2qhnO!1ECSnKw# z6-5p?ai!BBO~j%29~q3^{u9}Z`I*w@_8fXSk~K`rgL_2t#3-q>3e9w5FuerVCL zZ^RrZK@2pvz$?97lCZ?Y6u`9(UoaWCzWng(n#ZjdohwERFphBxAY6gpd%NYfR6`1j z_GYv|cXC4~zN;`&*{+10GI#ii?XSu9x9)*KP_H;U2U6hM`nKlzw>>-!MJy8;QK$O% zY-#(hlzr2hVbS0$c1U28*lkhPC6!Jag~i z;90S8duHVfkjr*OPmVp2lH8XvwPKp9iiZEGH4~4J4z+gdzuI0HGgXDNc0he!y)L+CeseR_z^4TY?i_Wv zzZ=QY-IC&&gD?DCA5Fd|N(LBwqbm%410x5C?H+W=Xzm$)Xy=0tOa?Y}=p3PqW>-1) z7@zzo3M@V9X$g%YKdl&~d(D$^K5LCe<4j$kAMQeylhFTcx70naPEMb>caJn>7jz?& z8uw(|c+f0&ta8%Mx6o!D%x=ZzuOmmwMj8r5k4gLpDB`lVQ0vf1ls&<8 zX;Y}17tSp7T=o+QS6Gi(DX|agcDm6~1k0y8iPk|YUAPWTKPpv5mwLsY{&--{XqpnP!DadkR+-(kcv zJ>B(%m^d0RP8*XB;ux%9tm!yOro24kgQ`209i$i?>F+RyK*#NZDH(%83c0*K``+E+5WimrLP| zlDq)8+Fg;)k&}ymK&TnRc-FJvJ>=Q2go+4o7G(j)qyo3x+gJX$UEq+=pS0*|>ZDO| z;Ngf|ph=9u$%)+%L(N5P*@+V4$QZK~ut|?GFS)fK+q$Dx@JJ=)OX8K%s`%8q2Bqvi zh&u54$uAoA9sEXU@VCba*nEvILiPHVDtxe>-zr`I71ie`mzE~_durK#pKkTP&8+;r z%)a+;&N({;*#kHv3;7Pbe+CNl{^0l@Tkbh)sYXCwomBAsp zukfh)kxx#EowO-zA41-S9*c5{@sPXKsTklm+ZmMc4&GwzC?)QCukJeG4IjUrJcAfv&_<83CwHba-~MgeR~qVb{QioCm}Bnfz_ zJWSQ{Kb2{1pVkr+ll#m8uU;_^FM`a)l}8wTi5i7$`*EENkJfMduWG+TumIp*d^R%2!9DuWGctPo<yi+8y8eB91f)R%NUmt=B?O5!O~16gYJ(oO6|6zD$Se zVF+bqyVOYmtMtCywD{IPAlFZdFKjpm4qY$84ea1rix|`W`IHY*7fnbeP$8}pRJ64-}&W}lzS-*aT>c}pYYQpP1DIjWI2;EnT686(~qY?KG zN$*`4bEWf(=px99^ z{mU3{`X)Y27oQQd(x|aWzo%lBdO{Mzl$mzZ#H|F2(l@J*)xs_! zD)6|0(q}f3eU5>Cf?T7C^fQ;si0K^M2^r2uJ*{CKl-bAFZM}c0|8i@MHs4k_a(P+y zQ(35aI^Hya!1dk4LXx>rVNF0MP(;|nqYeUYx{M9oy)3$Fy)-}aG=zqe2C9Gr&wv81wgv`b31U)ycdmW-FG zGR8Y5+k)r&F(s6CS+_Qvs#mq=ZNYnVvG7@#a0%+dboA3oyW3DgtzL|6hgNDTk3@{5G3P} z#dc;dSw=XNlW)&kimnLgT?J|}y5e?j=Kv}n$t8UsVoB-zy1#Q4#U)VDe{m)FQ8|?E zo4JklK!kKX=xUJbNAL_DFy$BEwu7Rm(G5(g>p>cX#^Fn$9_CJmMaf46u6sAypNETG z6zS+f!D8j2=^MiLxPYlVM>UqeozeA0NBr8D0xgyaxnn>>=P?B3f>c5_X!!A7ckq** zqN0k%Nj?s-v1FaigecicetykFq0UGM1RttOTTQWr`N^UI6L-TM$^e^G?dGZ(g>3;D z0g$j5&3coLjWg4h+%Oi=Y~KX#(5-u4EbK4zzy5|(F2z1xNus??@9nRRh*St&hq!A> z%$(z;NTtp&rVzFCkh5jFr2b%mKt!ElGwb;6j{QH}#Q2Y+>*ur!YQ)8%V^CA$x?L~uGO&{5{VF1Zw@oO8rmrfq$d{qL)%mx+Qij{|6uSPUGBY?D4;8eAiEaexSN` zY)Zr=sY(|k)oJGl0(9;RJNqEJ<%)=cl7)47u9TQ}VqA{=5y8f=HyRfCT10Gb4#Ct2 z^`BnpmGv@h46+?O&uBtV`maS-BEa-;4esenkt6eU`s@eECtid?oKrcm&|!|Jjl?b} zneHgpOHZkY7<(0wYAJ0A52!-$??C6lXGnZJ5d1a;c<2;8#up-7t01KdwiOH*7rQn5 zVN1WDM3#t$1Jn?S!H1S)Yfpq12*pp$3bBCl0ZbTWjHGsNOw?A>c2qA2Z`xFNXoJq| z6137tx-}j*^przH&D2?$f|5~(!84)$T4JE%lrxR(^$i>J9o4L|n^s$bzCiF_Jkx(} z3Vg5B!yI8YpUR(4R#Z21j|y5Mt19g@DnX<0e!jCl>HTH37fU{_^kKHC6sQhq2U}W= z-m72cy^gz0^DpZKjOwPwe>i z`49~?(E>ci_LT6UC@s*;vkBg6=CupI+0DZUbPT$T@R zRc4Xc&|g)C?qh!(z4HCx!n6Kqj>%WGuN9xYk^S~$G~3x*_2$V?xT;ZjSbx6|`-hKX z^SL(6OOI+FKj2J>+7nT{uihL{Y~4^8!h9?o7V&T^exe$lo?ePBs661EF0e39@u_S_ z{c@Y~o`UrSub(EILyqy(mFb#-sBiIHC;El0{L0Iq9Zvhe!DMvM^=~)Q85BKRn}}R> zV={O>%TDL!_ck7jaa`-cjG-xElzmL&o1B!a3%Nb*kJgt9<3A zj%m8LZZ1%O7`1r(yGhdu#E8Q+JCw3hOlDVBdS0pQ!q+7x{>r zg@%-$Up9-ThI%&!v~-O8O3l``4H>BXhvb{vS@cR!E3EtXB~dySdY!= zTyU&(#^RILGF@0mdQWV1fp=J#TX08vOYoNj72kegL2mZ@(@A9l+$u21J3>Tli#|j9 zvfQkopsDPuh2%XcQ<$6sHe)p<^ninLxy%}_TYDX*wZJhM$LlyLHa4Ly z@of!2hGdC?5W(*hmN==nR)tpeGOt`F#s@IjlkK)ZxPmj0g>aJhjDo82lBMur zvX)9UUrdt_nDDP7c?#+n*d-d`%qZR~T!R|u@jeC!Zmum%9Jom&@EOu*YGRwd5)?I8 z>FyCb_)Nx^rTPx73%1M3Qed^9q9yv`>989;5a)VlAG3N_K6gA>+BehzYDY>R^!(k2 zD?Fin;EOZyI@J>9hTH)CMviiJ^NbCvjxy9EBR^^OpodU_Vl89h8`8w_okFxb8Cwg| zhD|6AlKoBph5yjMuD^D+(LxHf|7KqY9{v+`i@*QRJ(x<77Z31c75U$%#Qk~qJotR+ zCh+#d5M1l8q%8F@v;QjR?Q_OSL81yNBXSB?srRwM0Pt61j0AdU+yeV<`k4Kw$3VF% zTkQn%MnCB;*GFLb&8a;2T3#Tk1@WOABUr*a^IdJEeC1Sh!%jaW72I|N zpuw85fVZB&xuxPwM4zD>V0-&jhM|Z*?wQ@}9+9knhiq4Pt@k z5BSUs)Q7tq?(jDsaPoc_!Gcc3=$76q<)C{i^z@E)*%bmuEUJZsd-pD^PmvB3G7mu; z_Y8t{z@7E9>%GPEmXYSmw@(qZp95m;;~)aTry5ls#EM(z7B5h0YEEbMTT+sG~IG-PyV~-@KwsMXZN9h{{6e#!+73b6~S0U0v}g1OCZflh%%QWXItg; zzU?;mp-jbD)HydU-(}C%9nM%2*!(wL8^j88vxu6cFg2oEpw!?r2A&K+iV5-Ec-dC< zjC%*Y;h1gD^%!iyHs0L*9QiUDe^mkKTg23JrycmcC)osf? zs?%^tRyEVE1v@M{ceiQ#_VJY&?#5K|PnI_faYaMOPIfA^ZicVFv&$ zRLC>XWM8@O>&;oIreCsW*{El_8Qp{}AP`q~{!O#e$o;U!xK)hsR}8TA)SflRADy0v zs%&tFwm&&j6HRDZJ(j2Y7{vW~BH7-*(~UzIXS%o_Zq76utoUqwiQS^vU)-55 zUp!Z2Ps{;zSN>GF&n~Sr;(b?U_oN%qKyyPPxtN)lojB)DW$e3dJ;W0wU+1hx_h#9i zYm7p56b;z2kd5px$VQ8TO|A917E}zf153-ke<1rlnWo18TyJ9J=&pkoYzb7ZdSfg z>q|?4sf=D=ktlz$M`O#IDwY!dupi$Fis*S-lGDccX$M~l*H=>tzTep6$W@}n5MHk)-ZJLtai1Ciq3T8Eo3mtk_ z+epM`gTnH~ClDy$oEN6EWr_;~GBKb`lg$CW52_gwE9rq8pO8fgZmS%@%jU!1*9s??(jo4szBgZ+iy(h! zq`GprAzhG24cp>{swhhJ^D!_7vCJN@UOh?f)f36v0YZhmh+^Joiqmd&m*yzc%>{R`okWnQof zTU9OS$HgyR1KbIXp)55k7XugS&(AlN?)15W+Cc(MHTJy9X7yRZR< zyCopUBBalW0SpqJ_}lX9f9ZAfSJ1kH6aTx(lA=~> z$$>pEUHhlkk)BQ`kM(U6^_sQ>4EjF*%hK%MR$fQ{sv7xEE3a-HQlR?R0z1;2-$Hq3 zm^Vhe$T8i=5&a7kU%@_6`Odj6MYi)tNqq6R4c!A888{U0{G4--0^zeowX{j9D)ad} z)@Id8(<@=_&4*4_BPjj_tlWWNH$v=nj~Lz+ASoD0(#5F1MtZZ)G0n5D?r(Ee zh!p9aL7F^Vdu6Vhl>LNTFv&fj;m{E&%TQJM;hj$2_)q+wy5djM*q+#lhqJzzk-E#7?4?8S90U$IVuAQD2^rb80_&98uPj4(A9;-|`xt^_ zQ}~`Op&=UP?hPh)CkoCKLLk=4)vWshyZ5Pk+?QA_N?d|Y&C_Muux9;!TY##zZ&7`L z9B0s;ff#~&LwWIFr_&BG0QrX=_oq!$UXsS~9=GUF+k-9M*y=5SC8YjxLdSti_A0k} zs)rn<6xdZjC}GbejC_b%;}{8lDE@Xo67PKC@&l!8FEy*tZwZiEtLEwLm%&5t zBqo1>_y&23W!_2ogD;-7)B$gA8-2La&I0XOk_-2JX>>r}UCc^%~pn z^6grCMicLkotb6CROpvh6MUfaD#_0`xlb8Q;U%O=^WlD#Nm5|@p#qkeM%0Q1p^r+Z zq^qilPVXQ3rOHM_kbZVj)u;=O7uY9h++ zM4qb*P1eHPc&mE4^32MprroaGs8uVz6}g|Lc&K>ukaKE`y3T!!_GHS2g#etH@<9(A zdt4@p8x!RdN5lAxKNd$i;(P+mABh;G58R3^MM>WN`3I!HrUtm4>2##>C;CrnsLV_w z^mYmg>1-oRJ0jAi?u=m{k*`UW;rFEouRtZP73sYq3q6Yj{H=GbW`&~f9*a9V9b@q! zpD_=h3UHI&tf2PN(wxhr6muhXM&wbocZus&SS?^#%ApQidx5wfqf3oW-li zs&BUK_S4to+-t}6_s=l%vx)*^CE0|idLX(h3wH_qFP~QI&(-#@4p6WZ9PlZnzY@!q za!a)r^*<{JDjz?%uRh6j6yCAKAX;Ks^ftTPR~-4_5*5K8kiIS6UnGZuS{q`sgDPw^ zdGHs5boI%-J3z>>d{5hlr8RcQD$j;;3k?f(Ire9kV zNp4hD~*-npLDON6yf__o%wHt_^dk!^u!&t*RPZ>ZJI zi>1UoZ33u1aArnRm~gTfh=Bl}Nk7_TixJ*kqMXUz8m=mjfe&ojzKtB>nGUs|^s(Ae zaAz*qb-uED4z9xfy5h)8EX>%Y80G3RbwBx`pJ9S?&Q>nzV-WJv-S}ovPF5?UwyDRq zF6~=nvX;ngOh;dhJYN{>o$jG>hhdapj=|@bfeUezlgJ=Qx+F=CLorykhpy0t)Rhcw z-5j#U!Vu||5%wrRH>`|%2sixlCVCgr|RUJYj^iM4!L-0hqzruM>3s{!$1Eimh{HssL|EXnY zB1Oj7)7Y~FB03<*XjoudtnWYP7I*>{)C&`m8h}i7G>cr1!g>F zELvIAUsmo~UGiVWH&eaye3wEJa_sbm7F|wcbdvsgEq~2Fr}8 zeJo+49JxaJ4ofoPeK*v2ggLk2rA`s6wfS2P4_o5{C#M{DUu(}Rf~>kH?euX^=PUcS zDfUO&vhT$~PyI8yN*@IujSYy$*C8?$BVanxPUX!9!YJ>-B)QZuF==MK^O41mSkNrU zhd*gIi>c^|2SVp)M70Jlh-HoUcHx*Zo(e|J=fCO|A8n99u=$x+CyABj<`FhY-PMSB z^7qyt+vVY~W1_JDnYo#}g}mKZ`D5^Q4$NhfZ3YVOJa(EPr?PSY{6Iw=Nh;8N-St<^ zfwy^88x|O-Sk#Yeb&=OmT+-uUx%+;5wtF0iQ^Rzrp6%p!x}~@F2c#+jIFo1od^e|b zO)^5x=TwxNk(E$dX)bwJkrUAT$a1FfdHN68ld$y?Cf50{Q{xf6;WC6GN)vbD#%*#($g)Te)o1wXU$bq<|)|u?4ydUDQc-v;rW?&%;hVEQ)~h9vF6x*kNL>D zwkfG0_i%>`o*E9%8vf%*1@9u={j;ZzJFkNd`WKmaqclSI7ZdhJ-0t&gR}0}N2=Us9 z)!XZM_b}LLq;K#EP@R6H+^4=8TxVl!GkCJ_GH8^YV#Bpct&hh#sfXZwSIL6o#@%nc z2kab1(w7)1*q^g^Gl!aR4{K*d0u3MAm3@nU`~9E@HQXt3)p*a+O}xY;UPX-su1Iyt zA(}D)CuomH?Cffc>FS1j!cxbXPY}RDqqRt73t+Uct{9t{Q*cOU)g~uUeKy{lL5Agd zd6^)xLUArvi;bvUh}Yd}x2IjD0-+ zNBc9@<{GFwPnu%w^jpM!qg2M03qiEOvcpmSRnq(fm1bkCOzfE^QGG)Hamco1fr&3t zmJSKUn1wrZx7fpT4nKh+VYL!&-jg(ty6p63WaT@4k$zDHPoW+EUBZH& zB39P)L+1t>6!^j6z9nIs_^c)eQ$6G!VWu)`IG}=E8+w{Q|b4?Sj0btYl%&jcC5H zR>x~i|9;ON{KyE@JA=zZ?6HHPizcD*qe8=OUNFpWEc$=AjY)D!R4ED*N>Gs+@csv^(@~;N}%2WQq748A!5kk>8t-*rB(n z@UwVDF(1SodN0Txk&UuJ>9>1*Nd(3Q3Gj z@B}%T{w+|5s$cXL^AzL%G56MCQMY@z@6akBASfLY(ntpS91q_H~{AL~;1V@SErR-1q&tk(Sc8)j^=9 zR-nj16UKP@mZHYvHFBA6DY5H*&+drg656q;g5{Ac}S+ z1{z6?V<{{<2kT^UN85tN!1y`TaEmy?C{Ceiu5%dOh?|MT4QI;LpV8Umt7eg>U~xin5iU z9rsN<38S?hufadRkLqLq;3(>rXI>t;{-*|__TQ8Ge?#WC!Q=0Uz0QF0-@gWKzpm+} zg(K+Un{T2sCzh#3YNQRfG%tz;*Pi}dO0T^`%JTlg+}=fQ1Jyc~siF1+6SMQ!z^UiU zRf~SIYs`mTC!YBj-WRyqxnw_L+CXl}*`Ku>f$ITUFv(iAt~= z1yK08uk*g#(#L(G(;Ln;bFhtQ@HHekT(C)DjQL}|Djf6=G6G{JPY-CmBclr5Zja^cK zAQ1eH5g8P+gM(_b=TVTyL~h0_o^#s2AuV4n9ae90y$s*%m&i)p2z=5>71J|?!ZA=& zfSqx1KhhEe@X6&O<7q?8{D_^&!Ekxv#k-YOH46)2v9I!jUMh?G{a zi3@R3146x_$@f^_J6WP{_%&c3Kg^K5-=f)JdW^E59`k|Bndo<}D4{=0E!rVm_N(Hp z;QJWMBu(|($Qh_mst(#`&^{6er{vr)SwUQ1K;tX)>Ny*a*+8xF+3mCd_IdWN2?~Z2 zWf`ajWGO0t4t<}$Am}O)ArZwZ*%0Drv2_r*zCMUhper4AY z898VwPNmlkcLQ($;7v3Bl+lj#7%iKVw6?c!-?!mBb(UkeTLx>$L>t3Ff38L@))X(> zR6(Am!|;vX2;X{&R;D^NV4>RP<@@ptC8C0ger8HU%RXZC$E3B}u26*3$MOAnZKt{k zJ+57%$;W-)jXHY_6hvspsy$+#>gDuq>mx@T=$oHU8x20VW#E~epcBE&%`K_xgf2}T zP!{2>U5;15QE#$dJeaT2`qHUSKeF;&N*az#zsRL+-c{|Cx{f?VkDJ4gD zd8ltd&~Hczw4mM;PqpA>ITj(9@NtYL<{qCrO9zMLe6BXXngX~ryD zoGQnIvBM({@A;D?({}pYgu@&QCHpBYA+kNog3WDTgwC)WTv~~J%Xa3-a9v<&Ux=pT zaOiaxWVEDw@|GnrfXQ-VHlz;>p>^&fsy;m#_v8$<(cv@iIj(LxeiwE(K}T~$fof#5 zUm;eCe|2Ff#dBg))~!lQq3ilyMTDC%gL@@)H(5G2{=!Mupxw$@$-e9$q-~zvc;Z&g zw&4vRzi=Kb%W!Bo`}VDxhq;DVeFmVLFs|l%k9)z?(#+1u+!8eI z_SWgUeFdDIJ{*vQ#Ser)TrBGi2ajG*8ucUat7)R_4k0DW8hREpk^{9d&3)6$Ulan3 zv_A*!9$7_Zts1LNMN<-HO7bR3>VKAFXbKEomt!bm{PCUT%8^LVGR;TqXYyD^5dUqd zOyYn&EML+acz={shvXoTY$N6g)*m|fT?G$gL=rhp+REnNjh9-l)u{!;oF&5EJ@L}tiiimn-#t;eM^$33iqD>gWpay>laaI zOY2B|P{Zp1eV8;{OH zXc5}(!>9k-#S`DZ4iFJ(RnpV{BlLsQ4Cj~0{B^fz6Phj>;=a>ZW(^b)(x?benSFllcBO_rcpWW_M;c9G;Z=tq0F`wefZ8tG z-Lb~+%`2b|GN-?9*qNB@(~#btCyrv)eq_h9zrjqFf`mJRUcs$@|keDP7^E5UEHvyG6zm~UGC}X zp$j?ES4TI+6<a57jb`^l8%pv&8on6`LBl7q>30Ci>fPWw4QBi*Rc^fK!P2SB#E_U~j z2cTkrs`xsc0XozTyn=?gSzYWJdDfwVil~A3)@C=evmgJsY@pp~amwcayojM+Rqo^V zv(`BU8gmQ`bd86hZcVBE#$Fyym1LPd<;%jj48Z)b0nbJQDGlEO^hrR%zU)0}9GIVDFMujMAvy5ar%!75H(tI+7|!gxulIm+vLMFq@xd?q;^X z)*jW>``SC^+R=2B^h>(lcNXkV^8LbgAX+hHn}-$?Cv@0Nw1!cuL$fR#C>^?Y_h@Fu z%);F8Wa74p`~A-^tGsr9L!OA5wLk0iy$nCI>{ViMnJ*G)LR?v<+I9WWJ@){r6mNB^ zLm4DWjbWR2{zU=tw55JY$RD!PSr<7t=5L7Hhc<0|Ezy`-UMZ2C z$%w_0+TwloCS>k=?G9WSzp;DB$MS|86-F&i)}xY$KREVW*0A%oHcKThI346w2&5xV zYkbH3i!{B}_0`zS#k)T7E_9XZsmNhrX(DzatW1ozduCE@5aAFP3SEA-t^n3>HW9C~ z+4&7;SA8~0h`95RfaFq{y%_0PG$jPD!pWw?YxCzgQt09C702{^&Ypc&vTR?$1N$Kg zuh0__Lg^J+jjpNTd)wAbMbG3m8NO@3s_SL9tx*ikanhU4dd?f5YDTuhkJW!A+GUPR zO+SE^BeMMu2Szic#F4G%d%0BkRpu3jh*leR>Sh`oVxvhc&EhNRPqT+P`YeEqZ<(fy zU5YRMB#ljgChxfI0kF_AJJLrq?I(=Xo!Dz_usgMv73tiEYP#HYN7&9#nDx9YuQl^p z(=Fez5NJ-o_5C;oW!7w8bfbFiTegD~h_q!!c+HC)HS1HkbGeKG#ME=D{3Z*x@gQE7 zJahZ<#t8c5j)}-pqq};iy7YWJFKOY79ZM0+u-A9_Sbc0ejNk9HD-qIqQ zX60pjI&J8NXT$8RIW^i>o-HwSz`AZuxDFMzKHeP&XuLABUXvh6{r~TC*i-iV5)tMF;OPxhp8H zr8p{e9Lh+@MeCx=4L|DTEKe^hd#x+nAqau}%N@(Q^uh(}CUJ$uw3plzXDo^yjP zq%6XxTm&S}twDr_4(&8=x?p<2OO2$8&-A=2Jv{rHcU~4Sb)jlGGipC7;|kX}pnrK* z`&4kofX%L0Z2T_q<1UcbDhD`$4|4u#=pfL<3YozkI(sECSboczkK?6&R+Uz{(5wlO z>xZY#Acy8ICEG8iIi}i07e3Mp3T^-n2273YsoB*-Rb!^Qzaez7V~wH`2oazCPBFk< z$}9z&x&z_X1Qan^xtb27R^!CHH~7R}=$iwfqxX&M0CN;t0lFacmH+zL+)B4|?bAer zf#QqJY^0a$k}sYoS@-&O!TbNcD3Oaj`;%+He98NlzvRar8N>$s#~j;G@vE5A==nVtIe-YSNyAj{PBMf<_!PdMrbSXcT42o#J_QChl&*|L9jhu_#4vD zRdV|Guj@2F(K{k;7Fe3|A4=#OKL?J9x&d)N9JVevahY*mbwjX@&h$RX$lUrMz?mZQ_10 zNJ2shhhWRcEx6eUN&-sP^6fDnfH}pJ8h7$K4$U{lsA;^%YW30wT?xh$Jej)SAV9i| z2y55%!5;o%H{&T6@e~lAea7$Eec=9Rd)}>lR+U)}AO~EB^PD5XMHapcV6zH8DJ%9$ zJF-Lo8Ru@R=;-#|H3ncX#IC%VoX>cKb^izb!|Ge%f$LG4 z3!E{1SK=~y9a?1rE^}g17$pS{SHh2a7{W`yZVOtbhTEXEi$Y*DWvSo!`E>P0mp%pls%-!sQCuxo42g zA<~{QJjeFTP;+1@yZX2BdMm4WiY>>SJ;EKRMpBFKMCN1VIMu;*3tP@IIva4s$Ps#p!4GHDf2^XLu4N5Bw_d8HAS9q-BTie*l) zjrL4U>V*)$Ug_AZS6gmD#awz|B9ydQ(W)xV1q?qSs?RBp>va4Y0u4#fzV{sEg9&G{P;DHss1ha)bvY zALE2S5=)qUqn^Z+UJxF>hPpGSo8<&p>AxZE(0h_I4#ystJt8Kqko3SJ^~xp@;~SxHGi z4QH;ELXQ#ge8{guu60A`Sne5GPi16)cEpuZD=l$eL8W0@VEi2?7$@J%@ORRq7=8`O zyFH8S?Jl|+O&jk7D)?hB{f*N*2+2kRN%+QgF}MQ~$R8w~Q1C=o*8N!|lh;{LwwQ0T zsIF~Y+k%T-5(Dl{W<5ZiycvEPL8=bB7XAQ@0|L7j-KE*jIH-&UWy5=HRCiB&2Ya!6$V_z(Obs*B4-T z^jK4Mn$c@LOhlj<#qmCIZViEb7hd~_vWg6~Wg5)Gei6~?andg3%IeFv;t~}UW+Ra| zw&zS3%Mt`KlO*Fnvg^!QvufVKkd6l)I5V#=Ba3&GWR)K{-0}HI6h0_&5$dAyjjuCg z{Z>tZB$)OgsY$l4Xnu#y%a$YD4sHO%-S9hnLPO`kqu0iIJ1q~Xa33#%730IVwhmQ4 z7bIOKJY83HV#4$7izsp@f4&c%s!ye2a}O3iUB+!Ilh_?_)abUfnh_`1vc1oAlCa$X z>9hmkPS#tB{}nVkzWd+14uNzy^=C2RKfLw#;er2}G9SnP-@DhH7j#KM_j)wwUcUm} z>-qol?)5*xeO%kLZ#AE9{@BU>XIG*2P>!Bw`%KWW{5OYvtW%#qNqaj(=Z}W&hQ6GE z4w{!u%F{SR2=C`c31qAhG43PP>`SxpUCLn=0JT`RPbZLO3;QEm?h9QcOGW|=0~NOi zI4z*UvGIE=OwU>`+g1436H!WIuMwCX$C<$@jMC*Pvtw~T34~LA=?GE*of_=w%l$5P z{+KR=kME3*vRl2d+1;T04GC^Lj~8T_;Tp8)aEz8ktVTwkxB}L24?TJ@n(9rff<;M@mz)lcu|(@hp)$qd33qThyqm301k` zC38?!fRs}3=sUE|0*r#TirxKGjBQx7OR}z5Lapa2(_V7yYv3jidxy6Vkd#*1W^uBA~Q}1LPM`tnE zX!?^sh6EkH?sm(CuL|o%H3kD`=tA@jI=k#>GtoqdyC>jAw}-1=aTJA6O;Z1F$Bcz0$?I^O!uy|1@IH9 zs}UILVkAdOR5B*5!o`e&q2+R++P1Yy4k0Nqy>D#Gmk@pvR||66yKGC+wYJ2Gc%1qhRp7YkQ`g@B2N%!TV&YQqnG$I7=-}+5#EqPk_U^aJMY@jLm$7oW+^XD=p^;;R?VlQ{Jbt@^gJNAq?j@;zPALQl5 z)kZO5#;lZ>Q49v+Rq7cr-QqfEclZsdhdsl$SzXgo{&kbN^`UbMaaMvNxj_d{ed3+b zG&Ievv)GEQY%m;pkfXv^9g}i@iereR<$#pqK?a5(XrlNxAnNzPbcwqvTDdv4UqdS< zCs#->!SwPy3t?l;WXABslWD-k5e3oKcm!_Ft{jDHn7y@7OC5On;8;^CO#hU__07rc zE7Is^YPKv3F9DzE;Q1r4rtVI~r>z4;A_bNB%dzD;@RdNTBS8_EXe0-@?ILbQ!HcKe zgG$N^CN=TJ2q)Vwn4*V;z!WGF1B0OTD28wB&RS=G4Wnfg^DR!^FW5(`__02nVs_3R z#PlLNBfD-?OnnDK)jREcay9=^<+zXlKXkjYB}|3?7-ZuHV_EWc&>Y zQaRUtZZ#`5gC*f=o|o5p#F7zF&kQW3iWEas0*w2Itn|4vs)O6i<|G#>A=k5A&t^A> zmf>p;YKoDZjA&^oOo4gynhWwQ<}nE{KXIxKmX4i(=^?A84}ea_2SC3jWQ~mExGU&j%u#!uv&uQJv@FmQ3xr8 z-Du&l_ZXu>Eb+uh4$0YtYhr!%$7frpQ?#b$x*mWI+UA+NlrR4|%K{VjxV&ZC&8@Y7 zLu5X9ODve_ydl)m)`cPv%>82J*z&-1hpMR*6)7q#b4am@gPXM$+HqffB^fd&xzo=P zr)CHGnYin&!7bZOcE&DxuSde92(28wX0~SKSwX|JpErFL)bq6f?n!aG0j9`&Q3)K!=< z07}i9{-*W}f~DWc_%y-y^}35RRgB`5atq+Txrn&?srR<*EjPHdBF}@WYU(vW^@MPy zRz79;CsmPc6N*Ix^oLMftEMm2eO$2O#Cwl==UKf|RS$-Q3q89Tq7~F`n!KZ0JmLQp z(wt=E z&WA53!uhu$0Wcz}%YU>INVac9ZeUl{%%CbTge$bdor8%ODo0%!puS6 zBN+T{gH$cnLbq5^2y)FS2Ia9+ZC!bpcI#Y?gL|~uW}$1vdVJptEzJYQ#x3+veG;rv z@qFT{@XZ`KnFhlAuy^7DoI{zjxSZulf4lDR)dT&l+=vGztW@XC zycEOza4@^laV+?mh=R6g-OB{krBeIa*;;@ZA3wRP6<4NR+s%Ja_b<$NP3qn!@vOt* z(<1%Wf$G2?)W_Jex~k_0D1?%Z@z>pVw-<lRHk+7Fb> z_HfTO^Sq>@;2MR{d4@`BT75RPdf`ZqnaMSt%Q4B;ZpJ9y2X%vD{+SxOnd#@WN!p&d zFQV?KwYKhA<}Dp3wkf&P^z!BFQFLvXeL(RrZWqeda`%H_@?bhQK3c9f7Gw*tEAa_f z*;+PzJJ+?1Sr@XujNR?C@!nzs!Z}!FpOuQaI8Ie)td+Os490p^{TQq%>L+a zV&iY6hTPepz!;6AZdtptRC)?r%^b0C8iOUcsHgs89dFu=#Nk&a|i^;dHr8pc>o3eg{)=_B|V1e9I zX{9AXW=tB9s1&?BUQ}K8|IQ2!G%h)?_GnV$`^4pNd?l~K)M`PlclQcD=z^k&8S;`6 z9}o4^)s%1~NOIE}5`m@24Rv(%8@{>)5F`_i5!TD5KBabK!iKA9w8d`a^+CGTLfiRY zz3V8Z(U?!^7~lcESUroa1SCau>f<9LvSJTlG&x+?C{@JvZK2a(#h?Mo?-4I;QyPHswuSj6)L-!_|DBe<;Z_ivgQ^DgZqU z_N-Z%qv#0BVNCWe{B_^%gOG0Qgzo%XOSnwLg$%>N&Zyo@5UJ2egOp&v#nb7MS885q z`N>3$@_6n8GjnEvPIg=ibeN_Cj}-Af}PmAoMUlVv;5Jr7}@bH(I1_J zJKur5<&mxQiqaepHFnz)i+U=Zt!uF12>=^zNhz_;1Pw&~h7|20b;eb@&m#RM%$|!V z8deVqJUV&SNrJ*SFRT*+&x>jZ`;!nD$kvw){`2@bUca*+wC1sZ1_R3{esKK9ra}IJ zA%5{(Ei7n_WrI}s@t7oGWA%eXu|{wr3r5F$GCh8fbtfS z69d~}FUe2<4m;(guBnj?p%e_MRmMF3w$n3RTaZ6}VX95xa?lR6zoEVfkdOq< zW=t&NoQQ#6Nz-D*c^>H%nZF@BqRjDCa_ZBL!!Lu38{>Q5%<|6Q5yHf#eAk6CZBR&M z2>1|>!%S(b>`ztUyC2G3ApxVJ=%~)mszuVFH%MW!__tP(r^L}1zxynC6|Qk|VHObA z&py*N)xUwd3qn2UiOK%EB8N*FmspQ*BeE5d+Ld9q8z}13M=Yv?x0$nJgfcCZlu&d( zjEaKr(en9>oiU4@ZbQEcT?-E0v9T{|YLr}R#WN3wdM9J*bPn(l z4(Q3Eo!eIJ4~g3D4kR6kj}4#|->C%k(u5%6LMbcuvJKdBGh?$~4!ciI8GY-f-q!eh z@iZsH{n0mj7g=(j2$vy#w0tIm6#i=Wlb+r+6)Aaa>WZSHw;WZvIxEj#ys&*yo0Xu? z`hlY3Ejmp633`RfVZtjmqtqHPR8sZh+HJF*VrnC)9~!nuK!hMd zgw29jw$WVY45UCwih6^3g-Y6J8`Goj;Va*`2BKUq8r4;2GqFjryQ^TH6Co!$rM;+U?O!kkzcw~dY8vF!y z@DtEra<3{I(KD^iFKvD52N}V9uTM#-F=Dt%?1!;4jz%d89dp2?#i{0gVX8PVM3<0> z-89-l`R8cGZ;Lv0mW=5i!u)c+&-3<;A%xYdzUf%%)k+X_cIU z@`6QvZt1&9h8HyJgcJUgj45|#E8j5{O#i$@BAHnL@{fUg$-=oKm9%1PcY&Z8_$`MrB z&IWl$&lyC%JvFfaF}oQ7hc>`t<)U==@rKf5)^e$FjY$;BIHVE_f4XWi`MDtb{BK_Y zQU=8j%4Ug=k)v9_-fNU(WWIjhIYD%3n>u<+dx+YdAVesIao^0$8qCMw$u(~Fvu4h| z+}``4x%L<++Oj>nFwS(HZ<0CIXB#{3a|Qy=H`o1xLY zSv+Kh-b!Giwc&Z!(nO_Q4{YTIfm{n`&HJ#^90(H(vE*K7DA$&O_9rM~-j!vC+#pLy13sB^61^0eI?vYTYP82) z9?OAB>U?H_i9Pb-N1}3-uE3NjWd^nqgKR_t9=OBClq?@ zj7gd0BY#?avHY|{zGacun{1+1UGNX=w~J(zlmQz@0j-}D<$tli`mWs~u8Y&xia^|C zMkvyeQvnEZBtIw(wLnWVBx8!6qjS!wmydFc-o7bmu=wjP5wHjLb&!Ed9f{YV9E~y6 zaY5={kh4>T(O!dVI~OUXkvlabDa#_q@o2NqsuL|G=(+Q?fWf+5YHo}E%=!&6jGXWb z+rJH+xm2k)J-r)ums_(F0H|ObTy_)!t0it@M%jhy0eQAdIc8YE?*iVBZ*VYGn z7Pa=04>PLgHrWavR4a6u=B7l($h*HbxSjP=+IkYZP{AK}aN8xQ^0;sWrPl<}KUO&qmRfPl^TQ7S; zOK!Qgz*%uos=U&>`! z-J`m{<(MY|xu$So^oO89_l%($ztw|4Im4$V8Pa%$Ggb}nc* zS|=HoYlGjjqE9UvqpnqZSNBTmXA3s1(~&Y9r`#e!Q^KL2#|J?91v*As%gaR**_u9y zlJbxoB$DkXV8IKASM%ta zpVGQvU!0K{P&|e!6T{z@Fm0DU?ewr69?IpCpylMtTm)<@TDtNzfePF;O`kj4T zMy(Zt5K)pIE!8t(d|^y6B%FK!p0c=!{=QfkL=MTYD+1ZN4k%^E}1j z{#hkjscTaQ;FUC|C1dZ{yTr#iO z>x!-A*b~*Jxw=z}KmL$3xcgA?m8aEu;Bxn>PwiR{iZnc;I04$5zA;@VLm)OCoLqM4jR7SUHq&!&_th- z{XW?J7xaU80!@$MC$!r1|Ls-NxY!$Lei)ZL;2DS>bFwqQAs2mPow46p zfuGUolMZyE%L!fqnNbPnSS~gt~bwIKY)K`f9GytbMW1l+poUN zA=&E0i>ai#kf5ne1>aDkmwk(dq5~(uQ1yey~mFTttLD!0Csd7LleqRn1?KEL{2cY2JyBUx01*GK81i?C9{p-EU`XZ5YJi@V# z3r1gHj2K#iF{?_E#L86uM5?jh59KTC1_#lBItaiBv#mU<07-xf1%CAxcxH31{|NKFjnaHfn=>7XG2Mr3QJm&a)JbLTJn6PHvo zEt22XoT^P%-EjyIvYULxNDvwn%pXlOAoI0lW7F7wj^AopW@{E@a#>mU9 zSET`1Ih}Q8_!Z}jwD-GKr*^wz=F523JJZOaz3JkNHIu-_{JbqkZZ)x^p{@y8N^`pp z=Xdx)FRG+QG|O341?01Ms+pgEmm}(Tb@a7;ueIAnJksl+_p6IMoEUko-iQr2gJOzG z9>M9KAI|u+I!P6nQ)*2YKiUnz+o4X-2ZJh zJl59gR8gbMM(6^q=z97E(}nw|dE|C2)aEcW{8xO=l};L)I6E|YqV?foLGZ7vE&a-H z_cNkbN6eRTr7D_O)EL{_+2-6bwdpmZztDj>(y9)Px+E2} zi$a|a{jdL;@Xle{FuXx2z@QjuPErX(pzIpeuGJ@?>cA9CM%q0+?^(7O3ks5=T8IH7 zc>`pr!2Zvz(d?Oo{_X9I?3@9fi`@9-XaM%;MFL9zzSm=-` zOf~mcTvC^rx{ufTZX*$?bZH4T=AehK1N8`FR;7b5!9EX#|8bQD;?!sxwZ9>xg9|C^ zfXnghe>is8{XdLd|3uGIUpw=vOMdv`FupwdZ=HFf1v?Mlww#5-od=(ZhN>U@trP06 zv5Vd)&sQg5MsH)+RRG1eGdo=d7fe1p=JtNp=3*O z*d1EM82a^Z%N@H z*C}1qT<0%p{S~8ajc>z6&#Nasu|!U!P;`1b*d4w5X?-Jj(`dBn6v?!Z{p#RZMsdz; zHMzJ7(5Q3?a z`PVRp>e)9{gD%)tayOWN@@Yjnhvcj`-0G(fNPVfRzl}lBVY~ADwjabVQUdpzxgp)h z&K}@2s|5xq5wty{NsXJWG|P^$roxRblOuKe<=WUmJtF|M_zqv|NxxO&sK98iU1?w# zMcsa`w+sLrtQhOnZQCT{8BXZaJU8grRtnw$`*iN*!c1}U*EPDJrA#va#S2o`J$I{M zfR|gq^ME&szG}0`tDKYvv(`iJtvL$pw{g)Ku}O6^WG4KrWUC;#x|oKKQKF`gMsNq5 zBnYae7oa}yz)6A%sNVcx*y7EG;ur`2b#+Zcha<%uvo=bqT`p$zE;RKZziu%yOp?6cdsk<}g9O zA;Jv7c`p0u11p11BdzNLSs-B)w}WP_*uCTl-7!)-l2Kk3E}bnVm*H@8aBAC-QU|S% z(yCjw<`F^w;*dqhPf!$xDcb8)`>2hvQk$o&u>@S6=ZZ($(rX$vtr_*>&P%@`3F@$z}9`zn18G^ z&_lCL02s}|uv{u45C%#dydjv_N=x~SF3v%1<|uQXAq+??FY$k5J2B%HT;8k|Su1OU zt1t#3IVZ|>VqW3XGE;<~O_lb06jvDfQ@bdG%C-wlyQUU!1`g*p(w*wvqMC}SNB+QQ zBYD<$NTuQy@f>wsPai5&8{sh3SF|^bmD6HLfs!Z=>KlRtmsHv4*<)@)^|r4uc?9Rh zzY1j5E27hikh}f)#&V9CM|tWv?<(6{kJSwep zoLcvVW?Kfi>7k(Uw=?(BdWb^u^J3(i1Uku4wVw;x03Wy-V@yE)#zpReW*fQ>Vy-}q zDIZq7LENI!%6A6|_CbPU)fxd>GxNJxV^%&_$f0FHeC5I1CUf);mGF2x*OWN`!lA#V zW0y5eiB2MC^ zLJq=%fOe+qw~)<4)LRH8c=^?O-W}3yyLQWoykDidC`={xqy3z_6P1;&xw-FQfC!R- zIj144?CQI6%szNli9p=Hj%)o_M!KjvFjm}uW?YXTNTtrAr_Zu^T}I13MjuqVxh||=04m8YYdp|vPNki$ zB^sso_Q^J1ZMpH@M-0kXT;-2|?r$kx5NG`4uDEI*LBYdOVn^0>{$aHpf)Q_UduE_- zW@XY!=sVq}bV+3B)nlUUfBPRI8hbLE*ebsv_=)@Z9ANGLFjwz41QZMyrq5LO=Ojga zNuHv;UQJhBFJ!H63?^ELs)Pu_xUgc%!mtKhi%0w*068!W_N$$Mh&dao#@5(Quq?B^tW5tu7LFZJkn0%qA+S|6RK+Ys5jT#e-#344u zLz<#J30i_2!aL^*0$Fd5Dc6nau{O+yHD{B>2JKxs39r|o7#fO|DOD*5fiEQkE(g*> zuZ;lR(Z#|=!q9k!M7wET4&|^xS>Wrf5HVt*VJUd#vM67$jxzm zy`r#Crs`hyHU;9TOiDg+BV>(6V79z$^Ds z3|-(=Sht-bwZ_MWRqzPEn1JUcumcaFtujVI3^3l=SJ-e{PJ|>m8-_>mt^%WT@kmfm zFdAcuFu#s5w!(nDNml-^;R0hijQ8>vnSFj)7X72x4FUZ0(~=Kgu-(5V$iJs*W_|F5 z>)?-07-Jk?SvUalzwd&uRJ`o=cyGMIZTMQ{r5STRnsm!$d4;FF@q3N#lv4ulpR|H$ zT9(UKY%`C@jS9RzhMu^{>!TLEV%UDmV9~2w(VYJ6C7NK`VhDCls1oFl_V|gP_7Q2W+_zoieakXs_IasHeQ!?X}j~Ef{w$X>)QLt2}j4;vZ3ODhdyGzOIJS5KyTS z|DZKU%}-wZr^9My;tt>?Q=~CKD=d-~vV#l|VWbQpWHZJWw2pBC#Z>08xrAEthyZAK z`0L(bTc;}9c!w-&5AP_Vndx7BdAXl+gOaVGY=~eu36Bx$A_L$&SOe&vH-wJK%=)n! zO14NqkoJpBguGt~4<8={&UHZfVa%KT424%B?0>ars|S2_k-j^EfB{klAb7q;>%?C>g-q*2ujdP*Pkq#(ALc2-nysgJ*+-j3e5sXOzCc>D?Jwt=+? z|IzHaxl397wP#LbO>P3G!Xa(OwUBdUE68LskCltCUtL`sFD!y(<^U`U!yypjg1B2f z?^s#Q3ku?+rNLwYl1V^mW_miG?I3R@;4RU`%37gBGTQ5y0!E98f0Xg%;Rc8o+qd(i zZF~po&WK>y9pe!E+}-VE6E$hjJ}@qz&09@&KV%v8D<@@VfHoGR0AYC__lszL+{>O} z^%DlL3UMwjm`N$o)6`xjW+hm!T0}Iu#5Z)h;HLz#Ci4M-kw|A`H@5h{n!V> zzdmICQCKyfdiqzrY_jC`#Q0)l+Ska1PM80VgYh>p=YQHXTPN1=__7$k+DCaEFfdME zoqOF~_}iDHY|pHMS{M*|2p0@?0# z!blur6qdpA)b+y*K)k$6mC_F zMwmiS>(i6_McBs|-;T`qQZWc@f&t+>akJ1qrVDsPY5*xkpg0=Tn4#%YF)an6MuVwL zOoInQL6I?j5lDhX8a=7s5XTYULap$Fgzx_SzacV%n|WWCejcv9d6@!`>iLw*oQD|6 zzuu+}OUd8<{7dv8a&+vK{WymRIzJmTln`)u8o5x7LWwi-U@shk*}ux9*!Uc77y}jB z=Xdgs2nTT!#xuw`TI6?4f?qThYQrTbh|JE{Z8P%?%LLIafL5rnqUv|sn&ho>w#dPY z{#SAhBetPBb$y<$FiaYHLSpK>4#ach)P}b~$D6`Uw%%oeLxK;#{0py`Sq_%I=&S=* zB7RIpR{8yBrY_zm))X{GS^;~Pt4{e-L3S!CM&JoCwLMGa(laT%&jVUJL}L6x$@DoQ z@W3)Wk`SLFrlFqJHovssm4=IlPjWvGKDJt>q_M1cx5SVU!QdkjkxC3uW} zq4Y950Q=RCiTqn)0J6Plxk62aL!Ebn+)J(Xh?CrZyU92Y?aF zw?fOu*(N&LVFxb(*nFnl-=Pfj0z2_65e@pt{z=2l8{%f7fPgZ(l&+!)%tnOBoSUX# z$NiyC7^n3QyboE$o69nASx`XLA3gqgqkd*@Xc~=in=~{~MWsIX^%)$iJ|o69SL35x z7tN%?YQH|%>RuU_>l@R}Tk+n=Dz$&&{q*|+1eO&@4A-x4NcNc@BifeySNPJ|$r(Vkak$&)Lg!V+( z=`C)xgzD`&S9&w#u?h|N_`W&@5|(}fi>I_{c|QX~cnv2)w4}~ms*aDN$}t{OwQ+t!l`0^QEU7g!pzaxLVh+}6vhQ5Tw0%;^{0BH zJZSLc2dAUQ^moy-Bj7gC(O*iE)u+7? zCVn)cI&rJ>juAQJ<;|_nTg9(#;>nhv_4BFaG5j>ve&Bjb#JX?fovE2n?|h~dh;r$- z5nn(pX$T0;-^G~*$kWHF-a8%Bo})ejrs4V*h+w)myewG+-jztcc5oYSK}86j?-@D8 zHjMf8iroaIG^}&-m*37=$KK~nEx{dXM-LL)*O37QEVF}%rh~e)SLh#}MP;S@e>ZR4 zhrf9w?fk#!S^Dn>1hi9QO8SoC3rC}&B>i| zsM*!slR4-gD8VUd5@j{|2RPl%4C{BSv)oE@vp#eZ#a|7K?r2%KI+(3Kynj%!uG3Tf z=+TP|J579Vik>8jv2yzS!+(Z&jM)EKprWylk>yEQki*T zsq2wLdYR`^TKSK+KFrNH@ZQNXxoIBCTpJti#bh8 zTGxjcRpN_Ls5z}I1|S;?4f1cnQb0*tS-#-1J=|EG{&k*HjWEQcvN^>Iw zMRaGg%=B=`UBdh%ZPA%rbgNTYtGY$s*oRb;Ds0d^02{w-YEH8n)8m$sM)FEY)0TON zcu*+FhA`Z?7X>~rwLG+TU)!wb=nCFwj51ab`+TNbLpDt_dcSM0LMhOgoXTCjZh)H_ za+@L!i{2q_@4*cd{#xyQA(Y!|q!w5PbbR^ww6u6{kX_@O?Ys;@I7w;W7^e*Wr^w*x zR@RbWUGiMa2eD>Kx0Uo0GAt5_l8yxX?bl-&6S zYfqiyx>$4yRV?aS>xU6nWS6w3Yk5i*xPrtR>AEn_hz|olUMbiVg4N41Q$65Fw$>38 z%2PS0sjkB4@~FE7<*dTkVUqWn`ZXr7O@F*{3w^$IEhHIQuB8T;ZS3Kq*U&ab8^&MR zto+_u(_cWfgET_l9HA=^T~?*SG{7tcWP(hMT=NE{-2aQcw+^dnd-q3CL{JG4=~7Z! zIwV9&Vu8e>7NK-^FG5j5Qo6f4*P=nXq@-KAyVE2G2pEz=Ir7JLXcIJCSmrtITRegTxytZ&d$yn4KjvKEKS^m`_DkX@SCTz$f2e|{bppUe z0o51at*O)Z`541>_fFl-R3GF-db62sc?7c@A0UMUBzlm&({rBmIKawG;`#REZW|hg z8b8UIm?MASo zx8}SzaRh&;K)*F-s(7f}`g6#FUL1&D7qvd*TadPkg88#mfs;;>3fH1;`A2`v@W zH66J{6q;yK9nW@zj?GaoNh$>Zd=N^s8mi3Q$6iJ~j3?5Gl=kVV=>$cfyI+*KOSM6~7M{g((F**MkPxBd&+d}Ltf&A)8vH6t!) zC&UM54MN7yn(+`Z}LN&~zXR7TT zzG*~{{z8xUA87^t-Q>j$m(5^Y_>!Z`x^#F1qdq@INNwj_mL@pQB`YZCKvUw5ZJKB1 z%b2?Da?>e1@o%%kOrwp&YZ1YvK{?wqq}&s{CUnaoV;@TL8cZk*_=u{VVm>r7sK-d< z*^ej=V4L?k{V&(F6gAc?Y@l6n$^rf+G4wRz%Xg#~V7IVv%Rh@*ByZ1LQ`-vlM`-IU z-jZ8a1n=F)-$C_sad|_jeQ6Q3rJfG?(ARR?@|?m_OhOLTBUpp>aGGTT_Ojwmk}vw~ zq3Dd?P2NhuOXoM_S;m6Hx#FkNuFnBCDrMzR$;Qg(lFYQ9ka(5lzU{oOZ>-Q@Ht}cbdJ^ND1*8JBM#?RN*j~=x^(kftGQ*d&8x8VT zWlF_HXwP+na6a`Y7Nd9FH3C4elko%{6ToI}t_5jH-b+x(-IKOQAav=W3~?{e3(>$h zKx~nTV`s58qKt*sU|MXpAPWo1+w8hY*PEPo@V-hwVApbRD9L2_O-+QhE9vzgUx#kx z4TI!B_p)*Ty5`rwqX9fyZhCttK9wrkX7(Cn2WWJbcx%gU#K^iq89}xU07xH;s9-n! zS}rE%JCcD=??ZLehqooaRZGqxdtn`?d(3B0T8U25W?}CG&HxwX7|i@2YvcgA~?5;ewf`slJcXIadLKULb0L<)gVxg1mrsb@g18S z@i{uMq=PqF0DegPou$g1F@x-}+qx(mY#@fMLUcWIX4{}NU!+pO zw?Q0_uv2f6dvk}pZ+%^TMv|D(1jRT{r0o-kTtJs0s@utcsv{C=H3OfaaA||tymFX>+;XIHZ2!Lfb0f6^0ShXm;d^;Opc6jaeUPba(-zT26 zfx!Tc_!-&AQ;i!yJ_^fdsg9p1moB%GU%yzP56~zAh{VNrSIC}>Yy00%f`0>|Fa*nUOd*neJtZa*4 zPwIe@jcNY$eWsN;Lq(8c;|8;5Y${=<8w0W$adSMPtmHnCK;zxa#IO&_w2ELrBB(QS zCRD;3*3h^}0^I5~8Vr_^QuSCd_5w`v)BHPWMtasm0E@?R{vy)4lBwUlw?ub|k{<3T z+`aeqI}$5Gx9Jg^;VlziIwvt5MTA6CsWSkPYb>zbb#|6qRL};wmnZ=w2(bqi00{!H zo0GAPcTdL55G6>i#5(xVQ|Bcvor&?O@Z5pYU=KP|0d*fxcS8Q&gYL;4p#gkRM7as2 zUt!|UauW}Qo#(g!YaPWA0F=T6FTLnH_p3ccpLwVDdI17Mi>OVw!2dkdcJcR=21A+w z!4;l#MCquN-R8S~f%BGcgW1Z}4RDk_e{xUhmAiP#`+oVlW*vB{Q0fof2k~&JblHMBvzP=Q~nH?!*S;kcG-%N$=O}#M|gnT541~V3vfW(!fgp9);zU;K ze-yB7`3gwDSqyQ<{`7Vhf9lw3`Bc-qO_?QK_k7=^d*~VMg$buEMS#0_SOL}`+u%nx zngj2K?zjd?TKkQqzJboZJO%&^p@S`{+hw|wa`qa%7Ff=YI_9ySo(~0xzy%`FR578i zQSCeuIc?WEOB=EPG(sfj4dQ89hqObYqs8^K05gB%PkQjG%qC0Lc2YfAXaLD`R8Of8 z%=kElb7=6Hu3{EV*LC8;wdxQ`AM}b zNwXRwA+&KQ^?>J4BG6|~S&js_4i8+%Q?uZ3=fn{)lE;14i-1xRICiVptS%ikUKf7f zjxsKY+DiX*0Ny%UzrR`a`?sSL|b4$+8YhwAN*eFjD+HtOOy98h$ zM3C<$>SK2b{up{EHRF$1Z`SkFF1HYKw!}NMarbH^5Cq55H~Kk%EQ`con7)Uc8JX%Z zsEezl4C2jgo1D^P7QqP+v$vwl4+C{bwrB{w#+PVl@C6j*V&+0dAs}rsoIAJ14Ud1CL^46=;9H1g2S{-meLvIG(tqU>dL(9lUSQ;IW(6Og{ z3qY@uneqjVa`tPK4g^YCNi}4l@lJ0si6WjXm_b;O^ZZ%DQ67FUveQ^giOo#qbE32h z?Lhbg3IL-%+8yB@ctx31KHC{cE_Qq|7Gf_#scT471yGHlZpc@Z^#y3y9>Q2AIl=2( zV&&^5&h&Jiqej3Pzl-?v;Bpxo0coC}eh;F$Kb9UVaho+T&luP+p*RmK zHA+iTgJlALxEVm7sDO&Z2=v{QrakPwf`T+yky6JKpfQ35y+c4|)|JhfN4fODinvT% z*1D0-fFo_52PE==!l44dNkbow#yv;Wfpd&Zc#9%1Rk~J4ZhFa21bEucog8%f z_PYX1qR{+=IBTG|hJ1@a;AzIxjntd76P*0RP8i3Lk+jnMLpW?)K!weG6VhGoT~O54 z?SZ)Q!ciHi4M|}M?T1G=-IxJCZ^6$<5wu_!$DvZ_Fj%VNwO7Xe%Yz>-i-4D(Lolo$ zX2c92aZ69{*|b#xStRl-=qpOc1Kk2eSI8B-6YhP5r%c-eX5Hps`=iJ;;NL==N+$xm zgLp9RNgnf-7NkLrTYWT4i!WdT)Lg|i z(Jm`glEltbo!S`C-nsjV38FF%YlDYQi^Pu8)356Rh%{0~>GTi)`hi?1`REag-v7*t zntYQ4_(i=@fM4YL%P%ToZmQ?p^hn|!=XG&`;y|yU0g_1 z41MJV#iL&wYzXz)a+u@7DlY=mi(`1Du3ocuND^`}hA7Q%1;Or_@_3tTQ-)Hoh;l~# zMPD8H$*$#k;ym38fQD%(yL*QgT$x9E*CiSxMcgq+Do)59l~ZUCMGl%uFP^ z;5*VCIan(%Hs0nkBiQP1II#aDW8?j;@}on_(chWM8S4K29l=~a`fYme=!1J~)?rhq zKy^D+4bc~!k3pdl<0i2qz`f%fSB_-g71)b;3!@gGzC&W+SPUCEo|E#=r3*f5(XPLb zePh$*JJQ6nq)?%u#P*`Aw5l`8D=F=><+v4W_fuKt%%4ZuH=ehD!(Lk)GAO%OOSb1K$Q$M&~AVC(>fZ@q$=xo(UQNA}aUb zCf~o|LiOFfY3svfDAjb@5UIC?>pVu$MzHN6gP=M$DyWD}KV)^NNV*o8&XE8!nB| z(jl3#*ERjp3;+)}{SUQGTqCOhzD<1ID^#G|UZMeIjMfs3pS90hyc~#%GxA}XEIqoU zI9$6EzcvAooj*a#^CrxtHA4uA0Xt!Y4luA;%?|@C1buIzDmtjPjotQxCJtdCscA_n zYi54@mzHQUOudh8*ct#!Mveq7$1IQkNfR>JZi1gWLas;nVQANdZZiR(s@N{yflB0m z?oYiOi{B@2Tm&eQYMjv}j#N~?RJ=u#1#O1#>$iVG#ZYFMvqC-NU6!~4C7HF{dZQ@D zzYiyJO5zCqfnNeJUTUVETksW&$z@74>x$uluVU(&RD(^cV~t;C+cf5ql?v}|V@w|7 zX^5yZhpbBu%2EJ=so}fN-nZ%2a9B9ZjDn@rlWNk^xL;|dIr@16bnO?YTa0dok?RqhkvMi6MwE@@CqCG3rfFp7S%?UB zhDi~PR6daMw*@I4ID1$n(_qFP836U{iqqLN5mO*Ndq&$}E9AC1dz@xDZP z9U3?a1-Q306k3~Tu|idoh*2OX@yn~I-?T>|vrXPkq>TscrZj==DM9_H$fIajsCT6^ z;0wj*)qa!K>G`>lfvG&NV@h8h^r*EEVP<_4pMB1T;gs(vMCFmAJ%tlL0FLT(MS*AP{*}Cbonp%xpq{rU-k6sJI7R(}r7yD9?FOXC?^fxAy&ush zQ7GB5N4rsAMRkqs_Y}k_DTEqzau+#Ip|lVA04N7=AfIEq3h>9}OLQo&>VFB8VjJJk z*Fpspj-Fxd#t62F-ag&UM!rlu5E+953CR9lG#@SOXsZp|$?Mh)Hy*{C+gLGa>UXT+ zHP3nF;3oaoX#KLi*iO(S^gv62hJf;SJ95t@>%d|HjLZPI>)XfrwS9gBzHEPRCV!Zn z>n;>_3sE{Rq0r8Ag2X^z)qV{+1IUYnQBQm$19oL>Ax)H6ELNssx-hD>tZ#{L!$CJ& z;~Cokl_WM^=N7j#JlU04%XqPiIh}1h_RrUt<6#gE3z`o`$UaL1Z@A(Pa`rnSrKQec> z1I*oeU{`u~Al@lm*3=958CN?Dy zm6221mWXrOkCK%7pM-4otI$-VyL3UV$FL&2Ubf&vQ-mz7;YbEW5D z>GdPP^SST@-~j4eS19*I`^&E`|K+deQSjE1g1lCj)JV;Q#Z6sW-S`zqdOs3^@S5{J zIV!=TwjG-9T`dTD*?ffwVuK0*n+OnFEdcc4proyArfbTa7t=G|D=Qq*f^8la99)?J zzK?C~XJ%_MbS6;feC!-1_R#(lupzE~P6Xs#Xk|eUWA#ELxj3yn2>@u2!po5opq|~h zA4O60mcn7w#O$?(KKbsrn^d09rlU#unPz6HTjJt?7_J%M1Xz5!U5*f34UwXML?RUu z3)BjbI|H=>`#nGk<40h;4Jefg1#8~Nh6ZdxO+FcLb;TS*!z9oh(b5skIT7J|gm7gU zgQt3c)SBEaIUqEzuS+nHV+)ABVs_ zu;cc}wTM0OeVb-r1p<2kn3y@&vLAafQ+r#)MijG?o~zg`cuO|ySqXS(^McwB&BAV9 znsV#w?UDij!ea;MxTK%mf5<}w!J3?67RE7P4R=%cAQM6-zdPm6>6sdN)Q&%!gbCBf;xtg ze##QWM8LLiFd4Zt&-ZNrBaZHcVtQ{r3=9$MeB;URfhAO8auLH+q!B=vJxpj5y4^1x zFKi= zUrp(g)D?scW$53>mj0@3>TzZr?$NAw#89RSp_*{3FdZ{*n|r%xS8i9aPMDPlaShb7 zh65Ya_?JLIkK}oH6a|v6FP1?2H(b)S8T~W>{AtPg>kI3}+w#i7$gAFa4ij%K5K5aS zvS@Y3xO+vqmuK~z-NQ}z3p#T%j}Pzen=veCb)Fr#g+U})`HT(ek1oUustl`0TmMcEY-;WjnOmbb?uCoX0U)68=*LpL@$i9!7^*i6 zfS!du2aq6z;Rq%v9xi#9aA%oJ-!-b@2~LLWu*d!+$9JT6LszYgMsGj%MmzJ= z|BavV2TBui0XB}v@vKYCtZh0S(OU+a&kUdv73N`BMU{ZH7}L|UYQJ`J9E`6MlE^&Z zh~jOH1#+PDG8)|8UT&f&3Giy7+^yiHL#}hl+&tRSVToJ!MYXAdS$S^50J2H`=P1dO z$m8_`Ta%{E+xYyb3~8yJTgWSkseP}2@)WD#UfUSpmRE|PKznV85<6?(7(2QfKxLQpQAPW+QC5PJG+G7m&MT@uS;>sS(9?vxVj)a_Z;lDbrJnVEd z4mYy@j`Rj$^OtV}3o)Tw6V!PYs$Oj?@AQ>8lun+^a*Bacffd4NG_cne33-FT@l*y< z$Zh^%DRKjZ0d})HgcJ{cZCcY0ncM<^SGU5BP(ng(5c87(k^-g%lO;qKnJ5th^1`+N zsfm(0J!KHrQFr_@66%Oj=_wXI>5yJtDkk25pgeeHg{ zoR8=-@sZqvpu`9WcqkE=VDgJUW>}V6pIFIw$ZV9I{JQ-g?w}xM^b6hz(madPgr*%& zeU67um7_oaLv12Y8c9#H3U3b*hTW0^7s0eZ$CZERBi8miP)+;EH)`h9gO)i(g^4~6 zL@q`$p&eVtdx-0rQh(E^3kY76nV;ZR%{NP?Rc-Q8# zE*5fQuLpB!QTrZo(IfI48`0ZLbK0g=GnGP1T-}`2rAwOpuY7ZI9@&+4i0*||w|UCl zr}ec#A?+C#A13ZB)A;c`JS<7QNz13SrSct#sZ8#aRBlS!1^D)Y4`SfzvB{TInep*H z_F5yVVa!qR2U!;Tx^HKkrJk73Wf(XzXUN~3m6!C_ zWB6@UT6b9D8Bnw*kxyF;5dq)Z3?1oXnUhFBObcts3m*vSsx$zFLKzS@eVZ+bg}Y~S zLWeMjG$$%eu#OYsgh)dMEFj`;lSCDZB( zvsOHjNw`X2GeA{|2v9w1 z5qzg8G^et@&qwne>4SDr2av^2iC_H_Abdk}{5z6z-kJA@F`gD2~WTXTbMX^|q|=6)vZ8KGfEat^y|^#k3K zplbzlU%R7*IlAM@EDDP0_|~q%Kjrk$Pbe#4#19@<>BsaknL@OY<5!+N7pPGlX4^8s zAU{sPr(K%d&=6l&Uy*4QT^4v|6>Rz_iq1UYt|tpx%|wl%s7IDz0m{tiBp>C~GXc}c znWO>5+S&OvTH|f8Iee(L*=q3N=23FZ#Kq4;xw8(HEcfif%1H!_v<`^E*@gyK-H+^GdUZ?@c$Uo@8KKQ z38kia_@^giRpEd5JtoiJCju@`zM=K2?BJAt^MJpK*{W+w{r@9pZ~AQ!;Xg0aQf@W- zpDbTvD7Nq~rrR?9VLD*&rgDfG+B(YJL9|}@HE+PR{e9jP{|`-PvXy`zY*_HOX@_O~ znD+C2%>n_$v{#Je{V;s+FT-p8ycs;VfYyi^hW$D3e})X|n*R8?9wyeytlU|=(PBN7 zJ+&b66iIg4tx@fD;2MK1b2!CF57A)5360mv8By`94WcXzV4Fzqce=ZF_j-)HjgtR? zHjnb%1~}@TZyyk2c!;hNB3S~0-?$bh&$$b5COzFr#Qu&X1wRM!jXrIp2Tek2%Cl+) z$%_MEVb_^6!GO|68OLf96EnOlhplPrI(uXw&grw0LVk z@H^e}6A;LsZ_mFZNEt{vuhZZ~AITpq*_bQNQ!t>>k{R@U8d^3x!_Wv(q`o^X%iojq zIOogwK2a5gUUGH3bDW@vVocd0r;TW*uszQKm#cRcyJ3gP;>S?Wb!$XBS)haAP8@2K zp#?;#;oOVPrUZA}Sl}tFkVlbkaEzrL3Wy}-itiPO>?Um;L7f)M>xNdB0 zMqCR(|1AajPwwH;m`Yn+@WJv0EsF}8cA&qHlTSar_9gw5mW1f+uK&>)!5Q{Lk%V7~ ziJKIU7;64n2m)|^734LL3wM&&{kNQ7`pg(tikg697z;RtVEq44ZbIBYXafq|0XGeJ zw%He9+=Tn;RTK}a+O3nQb1M5nhdb|UEC8QFQ-+-;i@wa(h))aPKpRnfo^5WR0WqQh zdd6Q`--~wydWj1-W6}sg>3s%#g4$do3txJ!kOH5X-+ugk=s)lE_b~pOjur%^Rj7n* zy@5|fV7Pg)kGlT-QT)+3=vU*=N0p+YPjIh_g#yH#sOqiq9{^EBSDp56p=V8_^R<2; zKMO0Y{ijzi=GvMjZ^klBlNQ(w3a$G8NQ_ZUDCsj*mz5L<-yM3?W?7zlG7;;k>t!D`DC~5 zl^37cN%hQYc^=c@yxXXba-a(y(8CO?d9lSPsQKVWZ*TTj!->1gYH}QPqOb6t zuRSYg{@T1WK>MpJ?vF0_#?t;r9gq#a5GriR=C!~N(J5}^Joe*r7~+8oOn6J?`7G!1 z5fVk&f^psiX|R>j81J!gFP)zL^Z!>2n{_Lt!-9~|PBNc=B#&{JF#2qjLsu3|ZTWX#P^p@;N?1SY5U;&pqsQ z(o2>8k^!wNx`V=Dk)@Cxk^Ii_UNFpN2-;6%yOwgS z$tO7Ek~0SK$Oac!nqVTgRQr5K!aZdCpwccCzXE&etY`c+i+4*&P>skcfn0rNh~cwp z@T;BqdaoeAQ)1d)C>SeJJZN0p_D63&$D;Ulj~UPiYIVCuimOZ8R>U*3+vt>Kh82@B z04w!bM_tYp(v%7kmzshz4K6;9z4OSWR6Lj7_KB#N^M{|(qIiEvMB^fssb9YN&$NY@ zt!^|I=o6&1X;_%#u-Dq)B9~w=dpkD@F=XI^O^EmID)XwZ5dkQ5F6(bcUtwe&8rijH z^s1{x?h%BeCdvC9{bp&vWs#{7ReV@IA308O{F`;e?GeWPX&tP8vQC3k0AO2$b<+5L zbo0|XB&Z+lv91|b)zE;MB5eO-rmX*BoZs^_{CnlCc2Qap$o1)_R59o*)<`1%qGny) zUrPT*<`^HI61+gW{>qy1MZ{q!XDKIG-noC`TcwyCcu!!r3LBSwT*d=Nj!61^NBTN! zo)>09PT<)0N4TRj1+h6pmiF5pchA^E^UWaI{R2JiWd;z6)oG5^vL@=k08b|#IqCo? zws4afnJfQqpk`+c4+W=4F_osQouGrljLBb0I98=Go(9`141jUvExcbYxmrk+m}P6baXWZT?k!ro4XxFbGtUN7`ful9 z*i%F)cV?K zO<$#+?;50}X_A7C`{Dkd*z}*~`O8Z3%#ry|=`Jq4N zr9j5}z`9{-v05_=XSl0>w1a45orr_PFW#^HNwaFXFR%q8!Fz9BV1{}hHg_#JN7XjiEQcZMKOlh*pM!-g+YmDTPv64+V*@# zE1I=HpdPqKd2!=OC5O3BQ=+^}Fzdb}b-GEnX9hV=_MI8kuVZBYc^uCB9KOu&NDoOk zeeHLyrPsAIIcy7moKi6}$R0RewSK)!o`)|i*K$v|S=9$9K3uHNSQ?bz1J0TM`P<0d$J}mBY&RvOleCz1}SA`wfe0sPT4bM2SjcTM^$Zg}r znDsM~+`QhZCJKfxjz1RI$BgtI60zpkA-2tXT#NbF5mQrO=YjMb7VwRLjn3 z97<61@WbC7c|6*1#**V~_q7-5{2hq_e_Hm}@wq*s-_~Vw8d^~?bV#A!kwVX-qCg}Y z6-oOg!19rn;BauQ3_SNkvY6@XahI>Ges?v{Tl2FkZ5JcMUo*)157zweXC^CiO;gdf z5@b~v6+6_sb*5cSoTH^D##A7l5gW<56Vhi>)ol;lwHfcQ?;~FIzzd50zgSOY{&hVa z{}ny{59{gQ?f=iS@_+Kzf8NJ*FS;N0{wuw5>Oavd|0It5@su(A%-f+fQ9OSB=X!^D zN#g@)ygBUq$$vh|Ka2l=Lk<3XRDbsOSDOJyYDc}@j>|4iOB(mqUD`Lbg+e*}(qwsa ziYM*PqY7KU*e&brsh`ci^7U2!`_hd1|8AJ~eT4-W~x>V7rG0J&x1{N?6r+^Do=s7uZ64A){13$*92s>`#W3=zD z7TrFRW^4=Thm($LlD(Up_L7+_WHoHrhqz&cChRtI(sDpGDU)g)J2vuHN-u9lq2SKP zF3Cgs;=J0FZ*Ol~Iy}qkEKi7*H>fZ%4HTOx3>?}e5P59+l2X%t0b-x(SVlpq$Z*l? zxbvC3(fEOQ+;;86(I)5DcJC$bF1%57GZ;9$mx@cZ+ir-(QQGWe73Q&})5Sw(>9@J< zIp?R5yP?g5+vZRXkFHVPF~M!&n)5W?86~H*37Rm0(r83#*;NybS!u99LD#NP2N{EG z(d-#;=%M=Dg=zwm?QH6B1I(Y-Zuj%yXq-lEVApq~a*dqA5f{^h$25t#c->^X{o7U5 zUa@>c&VqMvp#pb4S(u_{gI{KW(`~m^dDKmJ5F&B9eVK*)WkT zjGP|YBRwu_irGw+liv}@9H?dNCjm^$yYKSkj$ZW*b{S6V4`pC9aj8@``>I$75g z+D-!IIAoW`Iji-t^X(gf<&?5cHheId;X5;aoEoXVBHE=~9HYq`_pZ*(Uir2q^s_;; zCAPfA-pLT3w?PYlW1XLG?!5Agu#>Tm$PGMrx)6=Q4~LSBZN@Tw^gvco;c8}&s~w}U zbyw77$f;j4ziz8%*aJ$v4P#7mjO$XmCdU?wH6F9_YLaPzLeE*2y;Bc>?EqI?Yxpwz zQzKs#}9z(QB3Czl@*7TtGX68vzf?n(U5BcP!(HP^G9 zslDC?70&%KBbQm?Dk$(t+tb|olgM*(_0VLn;trPh%nE1V8#-^Pv4L?F>D7wZ2pQQv zLE%uyX8HM!vMj+0R;wXH-?~W;F=V_A<4r65&Zkxt%UBxkRuUYOaVmb0#m12q*}c=5 zE0BYVQZJ3Eq{Pan;E~*M*uyxP399ILT)E8hv6N+)ZQHbcjz^W{I#JR@dNZ;@;`(IO z1jaS7cS*EK)m~b9*qqq)RSy(`>|^FZT>Z_V+P@rZHMNw51LDB3sF}QYjm8I49loG1 zgd0YhIi$`>Lr~gY?CVgMq7iO)$DNOKX&No%ln%WbP&x=NeZD#$6F3_4U>f=DdBmYo zlnP_uKy;1mDMea_diIXlh^7n3WtscOPYq)7Iz!L0~Oqf_ch_M4$u z)cT~bLbHIZpbtDdK~>H+Ob_z$I?C#2(tW-$hhZr*60)T(mu3YX5@qI%i8EPuZ+}(a zvdlEw`)uII4UOf%G}>SoHL9Ts#%?vNgI_Sc`M7EH@vt#vvKKku9cE@$!|Z>zW3i@F znA#{by!p#GrK)(L@hiuKZBeuFu#4=)LCj-5xR~aJyxq$3g+`T&m_b8S+3CvF&>C)> zyH?*q(uuO=c%k}bH#zrvGq-wn_W8izaQ;f}qL!O5_PP><`7<$)Pjc8ubwd7Z1dQqR zaI;n=1YhARtM3uGbnB3B%}NH3K*6y}J}meVYm{^?tUwKWdbD$ z6;SdIy-X@fdbu_8cq53t9MZF59AU4zEAdA3S`Y;IU~!VX~Xac6V7%s!n8y zZS4Xc&sso%uPxsS&$=_-lZ6cBya-%(=Z>KvRrWc%+);XpLMY$J@-~yuzDKyO9>pU9T`PtZ>QNGPN4hyF=Jmx)78Y$)S>JsL=tx zjDDlUT5V*?#-K?m;+T?M;7teVtZf%a&hNaI3mVN0TLc{yfwNxsR!pxJB0pL7j!flk z#=v_UN$RfdH$k`^W%(}M$Ck%m&!n1vQgJBTpoYGQ$;oYENy0QD;^B}@H%`^MNZNbM z1dkk3fU7NWbRgcQez2$NV_v2!$sowlF;+b9#xj(UXM{-`x_XxL(CR=|zxTDJ@%d2h zIao|We5x}`xMCXb_6dWwG!dmd`$UJDlkB}u2KSZv^z|8HWOh4w%O~UYwF$i2_N6pp zy`e|Aa8n2sO{SpJ%y6{>E~=iIw^)#bwph?Y<`K0>97jq4H2(ALB)`%~x}=p+#!zq1 zHBXR;7<)%-T67ohCuFTkRl2k+8%|B=X3sbA#_ZxwLgGaUhMgR9_ioY}@o`XU1wm*M zPVpq2g$0ybkE+Z*Wg?L?0JG&Fne!>6Hvc@*eF9^CPq&@is$_!PzQ8QN)Ocd_fv|(m zRKB*|#E6GQnj5(N=ELwFB0;qn2BfPLsXXr(@{15f9fMtNg1X!I^)q@(5Dyr;BefsR z=VB)M~xLBhTQi)^6 ztKu5raiW#Cs|7C!pQ0dvWlT$5TNPtf@H-Vrv0Y-UG|Vn zfxds$a-WX`iIMLWw^HAfaV}G{d*4$XtgGSjeb?zcu&ufi9XrD?H3!HWEpJ&*#X4PQmfMs?X1%;mx5L@}>3;eZ$qht#7i%9DS%&t!8@WL<7 z1aIVryy6fbuW0&$;;}Ta-2+?`VBamI(?yKmoUbO3J0~z7E1BV$X2UkF(R0HDc5ECV z9HqSkR|0oR5z6Xg1s3oJ8L4d;Mw<%~ORC7B*bSR!hrg5wM0OO;QnPhBrs>d8)wM~F zDc9I?r1O-NXE&kN;bS~Et2!p&Hg#aIcoucftq{Kzm9OMnP=aR%pI4Dd)j`fS)vtaQ zAiT?rQs^Xtq?PkA&LwPq4W_S;D?d@sHS~qt*E2IFke- zU=U1;4S(hNK{-S31+!tU~1lO=hABm#V+-3~`|vzFD*dcknz$K{-TCjyE@m?b_&| z#X}9ucu#+*obxz7FzVwHRCWB!KgEb_Jn0&|ku<-jAIa?1twv2LS`g+IfXN3lVJPut zva<*h>j3d7Cdv2D#U+GPYUD>!sgdrkf(MGChq(m`Mkkrxws6_|Xs|vrchgLkvQPJ+bjDGNCgzNb@t1XgN15CYZ*r zV%jiHZT4SK=<*GrjP|Xz$g$gIe@z_Yi2_dO2?2Ac;ZsAEhM+QbNBHOTYTTOWFzc4( z9cU*0YMJbSgU3g;-MEBa&#}kZS#SAht5Zd)?a!x*&@6d~0URUv^en!?KADeceuuA6 zlP1}FmN5$d`Gk0d8YwHu7l1j-+=7!ov~3yIBf4C@!v3ZvHpB0Z`U>lMHD2e1D~Nx{ zLA{FU?F48PJ-dmyc#^>^bc8P+&egOU5PK!9ozS5I@fl^(Gda?MPxJ}4?q<&I!?`+w z8~8l7WL?_~q0uyZ`fkhY?k_Cyl*hi+iL2G#CKt{v#pk~o&eJHEDfbvYUJx*zQ zaz!`r9ck0Jh&65>$Eh^F&9VbD-!)aPbOLiJx@bW8j&z+=ajknjd)*d$K-ln@+n>Qd zEdqdJyqxVdhD7I+*1dJGRw-K2Ic(|yRof>TwAQI_m`0JE;4{tBiwl@`!oq>Kz2{Dq(oQoOx2GFeft~2p6Nr47f}B?8Q2B+Kjx3e*Zd4 zSxM3{RjWHM24k7?gJ5nBRr*I_qC(JMf~D!CvGe3HC|F6yj!osDhuSIAbe+aefzu(j z=G7Lsq?Ck#sFPGp6AWRJrZc%mEbf*(bt&(JgH`pGs5pw;P2C z+FKUAF`pYN=wryu&VW_NlqwbrTn@Kj+^y!5)o=ce6l1cteUa;5#@`ri-&R;~e4=dI zqVtsak;S$TxLB3z`DPTU_wG9W0GG~I$Lu5Peo{{Py#R^(X(1XdG65Za@FN-vC|Z*> zK}ab5PSvnHOImR=Db42&r{yRt~(HOS)yn$Fj`HsAwwAbO>&G zrJn&;GjSe~HCPjqR=?Mvs=WL-UTd4TZeGTv9mFX%RO+s)s8~}uHa2486~tGoxyKkJ zYNEbc6{gZBAE_Z^yP0h!1GbszN~%(Mu?}(&wEI+heEhyufbXRi6e>KQSjd>i-?Qgp zWMWCMl=@`(Q`_gRrg>Ta0YFA$%4W(F>Lyki8TlmVOY2^3s9Q0Sb#`xI>*U?O@L?0% zOsO!4w}tcY9Z=|^%K@_jLAT)emc?T;@9M%OxmV+c*qkA(J^a9Z=UF;pKF9h5Z-Ysw zD^cRQEuVT+^EL*U2}CbVKdrp-xLS(mNnXOOI|iw=ebMJ-Bdn#HE=3p>{;fEZ)^_|O z#;Fki31MZ&u+DVU!V1NgH9E5XbyX~WrHy?^=Y>Yu$WY7*^; z>*1XCJpI{)%y(Tu4cvXg4O4}LSY;qJg%(?R#;7wxFlXi&E~&seJaLk8InB?I4Zn7; z7CAFZY+lVhOoztAD3g$D`||bWy;30oN4r3euX1Os8<5+&<>)4ydevE-ZWu~&5v_VQ zb;aZO%d?93bB9(MHZ|b-g7~kAsTn0*BQ>CJ%32d-y(Q9I__o!rUP(3Djz3jSCQgHwn4-7S?;O0L=kKSIFW_cTW+(mE^bFVr6qZ~v6L~0=rNsA%SPUV z`X@)-S6drVrxsI!7=B4O=B0O~4v)yer1Be5syEx1wyAi(nYkk!+9)U?W|{)%5z_fcLVq*Cd6f=Z0^$MLJYN`_*c? z#rAvo?Hc;I36%8%opKQsy|U^Jg|kWGR1E8Zbe3m!9_INuO?Q zdUJ8oYj+W_T5oPrO`N!Cv_hUfVIU_*!~?Mxlpiy;zvhLbXpO;f^g3CqyDoYN;sw)7 zQDNJru_IoS9upS2D7gkx#d{KR>@o(Dgp{c8dsJpkgZ&y0hMymAcRa$1+JM%THIxHv zm5((^SY*q24XAubkXy3DYWw&@XgrZ}vD3blxBLw(VPB4uS?;?t4I z!7WiR>+d3r|CLHEDwy3#$MKT)6St?2jF}(?FNl187wN`th=uOILnz@aa@N z9&g}2Df1K57odxnns~5KxJRn5FeZx)ZBD5s9>_G^K-UjxrMcc-b)>s8S?Ve#F{P)~{6~?48%}~9Y8~UB} zrsju-1Jbw<9gD-@kopafOE*|HG{0eORu)Q5Tk24S`*3pZe)gu zt({auHh}f(Qy!>cIT_0cY&obodW&sA8&HwS%FmhAvzKKF!p=5${~Z3Fp%}7nN(G1J z>DhB+WXyAKCsLp-TuF_LCuGjP?k=4K6-Jbozmk;F)wQQoM58vR&q?6O32!LhwANrf zg2_l~)O=koWf6$5P<%Sh6__iO*?@Yr7Bq9E&ZuuS&ehMrg3C?zPNBUg zH$m_lK+~?WV^r!s;82A}9@?pI?s6f4Zx92)hy->FAMNo2DfwrMq{MJq!m*s_RB$*hb+_YCn+sNStI!0b*D5mj1 zbkO#}%h9k6RTld3Yk7YlT6H9hAwc&@EYF1Cn%fc2py_x3Pa^Eq`0Zz$y!p1V)b_8e zECNTv#3q|O=C6|uKWO=n@Xq@=MT)u;Z~zK+szWnb3LaCR3w zXl0wuUtXiJb=2hOwd}O@+ix)143WwX$prO9*SQELFw;$D1l;TF zWfTcZ=OWL0t?hdB_60L@U1BO`PVA>vaNi%Jh=geGgm8}fhb!Nc#InOknCI@0EeLQC z)6$@_S)Me*XfviqHf07;m}6#q!qlEwyvp+cViti%J+N|jEO184y!x%YkQiP%y-VDl z$iW`BI!&(knuNEPG6YHrNvsE+UTDuc!ms=zr*~8~@ED}QLEVh@mIZnitinBaj7?$l zSHccvNo=Xrb0b79Icm6V2Gude-WL@w1WL}m-)oQLjrXdVG#7+u6fUPlOFsQzOK{S= zhe_#w#F!JhZeLd5ZUe!idx8t00exNHwgdNOvX2?4#A>sh=gRnHma2;n5E4*lU}Ibz z2bD>vDIZ^a(i^*?P8pjzx?k;_Zq`O`&790F-<5YN`?aLDe*MBcD~WfWrz)>1pZL9_ zCVmlL&t|llU2yF|Kdu~8aI{E6+cO4Y^~5hZ^#*GmO2H)7nPdgW5lU;b63zu`%!ctZ zjQg*&^Gp^~BYIdK$a6h?$ro&1jhlxKXt>(#im%bc%!L%Yv(i4tdo#)Wb+5MO{wgRd z2_(Va{&;z4>AiTa9IA!|L$BTiOl0Bd1QJwdBSy1j)cvz^&Yoo$CDCP3OiQ2G7U!lX zZ>03WY0Sy}a&E%rY$o~g4x=@ZmjNbPTbvFFfNxW;<2*for0o#(pqBH<9y7Wk;f#~P z%!2dN(|92&afv6^xo3J?W{lVsE}~A?Y4_rV_!@t$*K6+tO_^m@=b`sv z-n?Uae7)o(m6je`-%255k1yW$G3}1GFjN|Y}_K8+oKp};XM=-`{LVmO+`}N8Ema~RWZ?w zC3Di^K{6RD%Y(KuBi*~s%{~64+__`^7WmJ}M1o0P?U&@KuVZfR^Wnj2O7U6inp@!4 zNl)SJL1Py7SPQj$Xvw-RJD;$)$v0mWkFdL{Jd0kbpq0bCKGW0K8d!IRPuv(+evYN} z>8zPXM( zpxaZq>i-ve?-|$B)~Ng18=?!PNL6XlkuKGx2q;xbLJ0xsHMBqw1GpA0K)}!w1f=&s zhy;>AXiD$B1qdj;B}ngh;@kGS_r2%dv+tMv<$g;UnPdFMoSAc!=lMT++;;SA-0W+5 zpmZdo8+U^5j>4mwazO!RL!G$9l;9P3vHUW!AJF;26agw);Z??I+>iau6q4YPe6eBY ziMl}iSPQ_Unc>rDd$IcDrTX#WntPwsqFz>uR5UO)#AP(tI`2Q@JI&ugU2A-UDLajO zN9D-T6VR2OD;}A)GX|SSz6A11A_3?sRC}5-1{K9aqXY#VWP-^8AV2j1Ar0YuaL*o(($M&XFmXz8Rkl<7LO*?9nkiO+$Y&jI#f!BKj(ukAX z9PF{jpeafh{~XfLTxd21vOm!(uy_%a^PF}byJDswLe@7#*!lUBCNRv2L*C)FWhUB| zG}T9V&k;Z7*nFuUh(M7p~m}cVul_0cVB$WuP3>!52iQm1qy8tW>!b zySnA?btI>WR%4ZlV<9(Xj8O&mYp$0ni6FVW#Y=YkRCczL>AdPp5^F)+NIo zK1yUX{q8R!aMWQ-%a5OCsJ=Zkn*Uwu0%*P*|8_${1zyx~^P*EGYj*egKyUykf>~0hph6TOb59tjr4X^lbhM_ zs)$zwjIdR6GJQ2sVKrSbQhwG288^g%(yCc%JSiG2q4$7$!-0F7_~`gJ>CVibE&2}Z z(5Y`AvbljsE2K)iig1)85cDVxx6HZc$CqG~X=~IkUlomDGD~sKkns%p8c}~eEIb^?Lz^3>{!YhMvZ!Q*?`HtJqgV2Af83Gx@c`~5469Z#wuFIv{hnMgv=;t0yB|Rv zS;q42t+j;2kIHL!W`}R_+vG5K}tlz3IDpRCbG2ah#9G$M>!TMa#P1U`wM1R zbgJ5q{Z-v$$QM`DFO!#Wa6csGW`0AacJd;W>$s!Hfi%4^EXKk8agmv5@#ee3pOX!F zgjOa?abOSTV^2a^xdNw;(S z`pw4Vhi2M0mEg)^0|Q&mQzv`+qst_@RWTi~srf0cX?W^ji+*pbjGdH!chlO@ecj`z zJJ~aka*^mAwi&2=ucc_Fu%=(bfEhb!mnw6&^$>a1N$u9S?~MV2p59F0buf&{Q~)fk zBT!0;QK8(p%X-)1^D}fIYVbroNj7zJAb3L`qA{;}!*RIdM|>6rgRMO87^mtT z1k~7A8Uows!@l|MeEJ~pVNNcxn?lzT*7tZ@8j6Lo(5$?hJE;D^3G;hdNi4Y`V_<`4 zhd{#l+ZAFqo~+^J`B6qFvoSEs?uM5G1UyimIr6pZTX<@^6Mq^)nbC4#Y1x0w2oMxk zyQj?EGAbq~@h5vCmNu~|jfn1d_`1u+k3Qp> zO6NyJ@4Xy6yDxZmxb<+jxPeW`ow>|*JD!+okc+oAd36LlEnhJ0VL}dAmB9Ra??Hkb zlqc=Z8$j48u_x*QJ_E)>(g|;2K^stPyUgD55%;8=FV6Hx6u`u*+urThP067d!pMPb zVu`F|F&Tr~^J(3QtydDp!%ke&$}D4qYQd!sr_mw~kwRum2bhOZF;;3C0Sf^^1-C=4 zmNw)PvgS(`q&zo5`@@{%EphqTDWkohZR(A;@=^Zpi^ukk&JkaC4<4;;iO0p23Ptbc zX{?-11RpY(LaHtq+GFv!uZAjO$awYuq>TMg$W*6xv!a9n%1Y>>z%Dvp+sc`zU*KWP z#LbiY?l+uL$z_Vm*`&y9SM^Ul4y=2>ndP`03@3?|8xB|;Ea_c*jyxU_@2@6(BaHE7 zI8UsN>ZjH7I4P4HHKUPJBZal#Eok8J2k$2@RQ-ZfFFu?~&(>`IO*M&|b#!15_cf|j zPs@Oxnw?9D7HTB~xV`>^JO1Cu|#E#T8np@Qu=p(z;^-AyhU9kyx<)DQ)KtZYD z`$ZLpO%I}RrkTPE(|QxarN#CQBjD`k?GVI{0muQm@=Pwe;8wQ?dZ9Rjip0Z{=JuWy*TuTfzI;ja3Md- zEBEw=u+-GH%T-0^cWY1c0xN6qvV-b;OjW`Q@9n~&L)*xTt!CbO;Q%UnPq;?Vfx}$* z@MxfYDQ3gUiqYizC}{WvmwT9C@W2d?pdMu=x!EW_Gr=6QMM3?Ny?(n}UZ}!LTMqf7zmEyL zrHV7$+GN4Aqa6+ZxA3lEdE0o|oj>GyLNv80v`+ovoXH)K zeeTp)GI-fL`A{s=yxa z*Y%^nr}7dT#MW+32a&&4U_3>`77qNqWL+`T>SK#Z+2h>DuEXtL`4eofqx2+vUZ>6L zz8tiXRzJ7kX4*iPEjAFTQTN{}_ZyiBIU*;@S~+z?d#qjM2V=j=#?m#F&HNr>P@ctb z+0sBB4_0RyKz=3CEQi#=@U6&eHeRjzvNwEpJ(R8N0F0CLX!&{O#s?q8oOpxbQSkYR za9lMxFO-SxDFuqn>Sz^|6lAByn#_y1&{@>_-4Cuixs9e0v^?>hF2q(Au(~ZYWp7=U zC4LLuG;$qSw{hWmiiId(w6})vn^fFskK^RGB77_;u z9(1TW)-Nq!On0&Nm)`}Oe^8)r4=yK+IhF$^gfb&-2NqivSE>5--%{^&3VU0mCKP00 zF@DB;*C8?r?H#f(;|^c-h1f;s>M3&ccf8*?gtg13TynCbx3ubX&A3elp{+XGjp zynXNFX=w6s4R$){lC|Fx)P;Pf2q&Cvfr)Ph^LL0#Q|fa$Bh@4y8|$RfP1`iZhuF^1 z04YoCXY6rmef%NMpAEu4jzOdEy5J21%2*6fG)Q zG+I_uW?_dZ?TaBP*x)KHgbWeC$@f zlusL7cADr04#L{zK{epS)RH z#hrKmBk>Q${$CRRIUGhBlz`RU$j=K@g ziI$LGG6M`boHlcO*9`mr2Sbl2)BB2 zh*J2@nP?A$pD+@JVTDfwl(5;g z*YAK{JbFrk2jsb56ibqkZ zK+X2uzch2W{SzDal6n%WpB}2Li$tx9+iEB|Yx#eIyOaU*Qd)N(J>;tkxszQ_^-w5TzrG;NQ z6WHkxMtBCr_4`88tmbD*?Bm6sD&Cr=)h8DQSOZKm25z4eqkO*X;+-Sk-D&=wi76@x z^xcl{u;6H;WO~$(eTJD1gBQ2ydnL~EYvgwBhZ_sg#y;;ere5Al>(_BCMQ$l}Db=}Z zFUm{qi6>Q%5#?4AK<@NWu(%x8x;ba|^#osT%3=kN)k;OB>|`uZ-bO~nEPma^0Erjx&cN40W%?Lg_aq5&k||RKE-KjXl{t0psS_y&ofDE| zlxX7AU0AgSa3!gQS5PVBYvy4H39`H5%4s6sc0N?)A>opzvN5SY)9j|lHak-Dt@2u8 z)rG_`loaMpVk=!ZpXFEsK;sEkCFU2Dk_IQ_M(C3WA_b?t&M|Yqx#=8jLL2Iwma%4Sd=%@gQHqmcaygQQidXT z$MC4p*u^rC#5Mw*>n9r{Rn-K46`YrTXt=hwwB~f!R3G4$nH>+CmwP$qMeP}~{cXLh zib>LaZ(B~0l}uj)UhHo>&i1TJ6WR^f_IWInx?VELE?=>}{op7WH0bGi$dN)P1RJhx zEzJcRDopDq!j%sd?9X-2UrHbK?is03iF)+@DqYCiiTW(~25rrtN)1tjO4>|!*Z){~agt@3#P#lC9$HS02s$sq5VW!N%DWae{;S_5MHBW=U9zk~SU>4KKCBeV7m$DSwh;iDpjL}v z^D7isqi6Xh#KLkuEr`ufI7!7R3vlVuy;Q?MkMMVvMf!zP;YujMQG&HyW7!jb;_#$X zM!H?pi>X!xt-D28=GDR-obMe?_AHWWD-7(iiWz4G!edVhBqqao#>M25(UKL!a`l_v z?fvv#z}a_VElU>RA^2Ohx1K>cgFFeIi^Lq zaQNf4$TvEfaXa4K?rp>RgTL9owla-}@CjAgnO<>D31dbFz< zW0KopNfZ$uwW|7|~(@d&*Q;BCa#YeF!Y(M6Qf?^cjhsVa{?{*mbN5Ttiv7rzY$%JqCLa01V*n6#a_BPLt{hC$1Yp2`e;b+zPQh`Gn19Kblc96F${_7XjyzqkT{2|T@ zVWwKL1~(B@SZJnNo?%Yqaz!Wa63WTSs zYXSI`jtC7i6ads|BsC4@=@^Cz%cTLEMcew+?Fr{&a+OOta1J69<>XI&GqPOQg;8)#hzx{`=}|Jcc^V)72x#-JR#okZ zKQO)kU;!{~)p$errG_TYsr@w^{B9PHT~3>WRIm>6KsVl% zMZC!BMq& z&5k!|-wi~IcsNd`z&B=gA&yyzsfyLZFSIV&@&2XSr$^&I+xQZ2=>*oWd6I0Le9B;P z!PobP6rBhj7A>gRi=r@-?V*+!NQJdxA3%S%whLhqiKs=&?qx;no_F$_aA~NNRZ5|B zi@Z3b)QtT+Qx3rGp|425BCGv=AK~~2zI_zUaaRdXFb>xUox$WI*Mb5UQ%Aa{v>ty} z%P%%|JbLc1<(kw9TDh88EY8{;aQ3}3_3>j$a9(5@rvazgiNrmdvevLc+|^TI7P?P~ zAh)~hS%?RVP?5i1U3T!5W+J<8V!|e9J+6{BcMWacrHr=nP{GQoLu*{2^*sz$sPyd1 zzaJy}yS(nyu?t*$T4uak8afi*^vsO$_y6#G{GE>TH#3}M+0g_%YN7WK{|}sV+2sEX z!rA6OOg0z4<5WVTI6Jw)-pTz&YRMZl_&f>>RYHB|$gJqglF(<|d);L43Nh~tTbkV5 zi5rk>0q>;7$l-f!&9@Iawta5iU+W3$_DaT{qyARyBuvz>o)9Ik>35I_Ce8Veb78Yg z6f9D-_5JK9ToRNifu7aVJOp*Gy1Odcp^gfEPQF{W+bHF@v6jZNN^F~!@6QR7D$dP| zK-?8dQZx$dDu34^roXWfG_SzuCuU-p8#zRRPAFnp*sTpCv_I#h#S^;yh&C^FO%sCz zY69Fw*`>P*{HFI%8}pukXcT*|GkA99sB?DLE{&C2Oybvpgk2vV1?o~=7%M8f2X|kL z&Dy#9sOel}j(=3un@>+S5LV7|70@EYd-nQFOsE(clZ9V>blzVc8)Xc*;yR>QduY(B z=9e{Di+WKvg#VXU+Y?KRv_L7Y$dI?&UXSAtI6?@Wn+zy1q!y zkx>PwyeGee>dyM@``1%6x}LKN2psA(G?x2H3ykNH*?%-_eV?2!8C-1ut)!2=BEC#d z7DBat>+=?2yL6i47N};R5!p44zXVqE^9w4CKN7z$MN>+~vAT6ll%|LYpP!D<9?PAg z2A*2Hj71tYzx#5KHSOs>ts1xxP?%MaGIr$lbwTp4Ce0dnt~2I?o71ByRaoS*dt?!w zNv_)^KC74Gk#hjRYM~?C2G7*mjd+p?wRp@`4ej|%Yc2HY2waH-)rxN_J-MDj%8S3` zR((8wDW3iAg$}Zhp=^Op&A6#aL&rysC26Fuq*i5RrOwYYOyeqIhZkQBfBM@Si$MAt zvkBI+ai8ni`C;oiy)UH`Qsk<8Jb8}b4256OAidCatZsV{r#_o+q9>+hFH9UcGWfYH z&V5vSjlL$fv3WAL3=V;XrmI=k6s-duXiy?nz%-uwBQo^GSUDtXw{IzZ>9+T-a~HYv5hu&08!Y;x(pz8t8&KxI$~tPfCK$z7^0Q`M?`9d6b$OeYnO zSQohy+B{en*Jj9ky3B}(Fhx+IoBFt~|85C;1;~#Zt5gMY=4Iag-1eo#^A=|@C)qTJ zr&)4Pb1JZU;+v<$s`}iH*hkX9@L&tBJvJ&$#=1)WEY% ziC!Pm6HqTGB#n`kYX=W192Tn!I9lM+CDF4)hHiIhc{6+a76oEl*Ns=#iap1IN>v#l zE2SQ7VS-JMn_;&5C*|xD{IE`A0VYo6yZ{t(}2Z zKn?DXmYmC>62kd0#ECFPZuq=CO$M5q7fqpy%EH}%>ORbuvi~W%a9LQ>G=$@vNn97+Co=k8sWR0|Li`q4)eQci@I_Xz!O+yfC>c<-{&N2#CaS@<8-F z{Q!q4Yr=H$!j5!OS?-44ByjqIeU()8I1^`o7jz;&@Y(@r4UJu1BucH31r2zlkXKzT zPoZchsgJU5S;typR6HYhdFR5Xut%`^T#gA5KgEl3?^Oe`y5%<;PFE zo5YtG3bS{kDf75w!CIkp)m4YW#>Il+99k&mGd4=(Je{UG+{weGEK+Y@#n|)Jvcn9~ z<7|JfXhX5NAZfg$HPmjy?$MgOv#Ud4H17<5LPV>P!F~xqr^4*>(ZUlq`3RAAQm@*6 z;q^VsATJXUMW^_DrvX8u(puAlv9TH1?Y{m&4Xb%qIWa z9BqEU6{7cs5=!`UKi$G}1JBu;Gt>`|xj6On%t=YFDW)XJKZU(o$X}+ZRC1LNNvBBk z0drc{AvE#Ny=h&a-8x%EodvhA4J{nSVkXhS?Q9G0{5>i@6X&dz<*G&|cViIprN3`z z-BtRceBE8&+|z>|+mdwS;O02qCMfRMo(x~Dy)4#Gd>f^G`s+j6<~t*{v2sQB-80X> zDZ^b`?T@FUgJTH+ga|(10uJt2-i9wQS_o#xyOVQMchbfQd(1 z;C%E$rFplfGzW3e>}`3Jzt%q1-NOqsX}}OxEnr13Sv+u63}oXfY?L05pXW=^lG{n* zkrE(*i$IPQU-@OFEzOqf5}q!E0AUlCn=y+uZ{M3eaFnkOwSv1y8TM9RRCh$SNRN~u z%%|P&vJy+_{;`)9*X;x<|6S*Pmzn;~XgAb9d%TzXG)U z3&Ydrihbi+ySVu}{W-@j+6pARRvzyLf{cCrYx|99H+utSPn&C7$ee|fSOCtcn^H2j zC&Q0vGK=E{L!El<7p?4sKwBy|>PRBjK%p1##*dS6YPL_HF(3rGJfNtI3|Yrk$)}{F zq!n^~E%k<$M;N%N65n;HCAPq^Sp-hwB{|>g)s#T1UuMQoX*UL-q5hYFxhk_ zE3|Z(bg{bd3GC_CQkHZ%Rc8f9mWbxicycLY;6?Mou>JKZOHYZ0LbKMZi(`b7Aq%)irb_Kk$6Lw*<^HxIVOV>&eSj`e0tFqcvFA zr7tvH-ZY)-ok%Tc#lc@DUH>&PJXqJ60q_7)d3|%JJ;D5yv`WnPM5;&b&ojAq&5XTV z(!z$sWe;#AMHM5o_~goFJ~tPcVu`5I>B$B5XBrbcw*O%veoDAjT|QO1W_71mI!lDs z`=+|=wVld8Jj{aM|L$St{eSl`-wn?5UK=4?yH4wu)AjDu6PrnQ)c&%-+D?7_6*w+} z_W`gOrldQB0oy)xLSc5SZUQnNAen>){Vk$8uSab{8$QF6U7%i|J6Rmd$^9QL+JuE4kiRV4tuJEj#5lxC0bis4^Gsk~c^}7? zvB~of?Yb6I_pu_mUYU=N>I>F-|3G=AA#C=gN1%?p12F8N498AyPDvAQm}yQ1r=t!Yd1J2b_SrtQ@C23MX@CEdWxBglYL;%y_P>f zE#-oPGIzY9#1za61u*V-#y_+;8})M^t+q~DgmO-E5_8}w>xrWtRYCEt;Ry1B6wTwL z=a#r;%l%p47FJO@%6DMUSV>O96g@3$+R;LvmI*2Q_oqw?BOZ6$plmx5JM7HPveZo* z4$utLZ`PV6=_%jt>q;IWJNu{@&Dupbn(D8#>Dro_$X1BSu6vmd8O|qfmKu*NloD?h zmcF5TG736c1}EjS!qpL7Leko7z*gO7jQ7&)ug}a3;tH!J#+wQ5b}5ckEL^7QGACFW zit@XJh%C2wVM{&1ev$y#QS~Y8F)r>rAM!ecKI%iK7&p&fS!ekxws9W+MVJjJ0 z`eUrh6X`$Cyt9{ItY8o`%L9jz!Hf8`iKW&*cwJJl6CELKnWU%L$UtGHdjWGjK)0Vd>PXtADiXUQ zM?Jr+QZ>=SqHbgN!!A{_`K(wzrDuY8j=+INhYSd@r|4=;!;#8W(t7(_1vt{Sd8bqy zYDvFr3j#`Ch;kjogPd77v*TSy0QS80TP`vS(=Y@V^VSSZ`;V36Ck}yYvrIDj^kh4g z&_9<}9^@8r3Tc2pAEX_9Q{<_C`a{DMzxggEs zwUNFQMBbO(9OpV)KLv)wxc*VlE9p`7F-D&Ko=)wNwd^g!SbMqA6x5aZ;>4PVjORJ` zvyA$|s>Ta$7Br77dA?`^YX;tgliKf0%ussB$G;#Rrm%k}H2!xuy?>Ahh5!SD^oiM$ zkgG*2pH}>F!0;FdEdbb-EVgT5G$_DGO3O@>v)AQ$g=Y%%C&0F9as9Thc}+XwMK_@q zBgbi0S4j>H-^}9qeWsR(`0Avlnq6dUzZDG8Z=nFSP;zQ$sm1KsL{E7$2oc>YW1YEL zmguN{)4Ks~Gh*eh5(hQgrr~m8$!*&c1(|?b7SC47Bk-y;cr1qPSD}{VTAGq7?ZhF*^n9zgdU#kVe-S)>N z88xOXeAgNtsajQ;n*$f{)k9G+9--d82v!v&F&Eag)}XAi56-7`a9j~d(;ZQB zeA@CDcw|hiH>!B_`y6n2ZF@vX`(puGjxoiClUS8tag(E=IObN&rNs$u(+b5E0w^2Q zGlxzaQL?yeZ~uHEn-{ZvQj(&3^7YHvu#x4hy+biTNw~|$;jkS;SFBuEKBL0HC(cGh z=H@9L1BusEfGOI0E>wnY^hhZ8NI>h1k?|frifFJbmLw_dxZeBC{vAxls2`VprJto{ zHKSS~;`52(!=Gn%lj1Wh3TKsHv}}rY0aM?qL7PgTsonP|9I|d5_~anBsGv@w;Zag9 z5G@B_BUYAxs<2wwwHT8{9Z*e=ioo^~3w>OLx%+#G)(3kwT@Qlxgl>PMp_pZNkFU+? zP&GhX;O~#d`5#LJ-$ziFqT008#8j2?6iZ|FAO}x;OJs9*mT%Bn=+>Z<0u`YUkM~)| ze}c87w%;jvX8Ob7uE|uBlow54wE7nzY`jO=MrRIU`NnL=ozP+a?!E7m zI#@c}>tMM&b(j8Iiz?rL6b14=xY)m=xAvs5GRbOvt^jx7gQ=NBO90m0&}eL#lzX&W zwKy#5!bdsz&7~PvIe<9a5_w~3H7F~-XXlNaryH3uV_e>el~d=1%FwM5`TVC}*y*OT zcUGkGH?RAGxQppjchqfq63u#i+j@_;Xk@rS6dpB}xVOCdE{Hfr)Ry<-8W%sB?!miRYrm?S87GZ*N}E z^V>A+?Q{jry*#8?RYD&v=e2|VEybzfa=9M=p=)E7sV-)-Qsb@WozuG~E#4#>57gU5);oU^*B6Fy~3?`o$|(ZjHu5==pXbD@1)MBeq$01}UNxA{w}HH&xs@K^SZ4Ovmxr(-ksXi(XP)eV-6kYv+{#B}$R%=AZYI zWh%r#gtZZ}K!|QI*^~vKVVokueVdrf{ARV2EP9!y@Oil1RcKF!`4&M-73_(Oj{1#K zG3=$ps)^{(vD)jNRF2#y*Y(*q7Uk#27p^QXB&4)0JobV3o=?~jh zNdycUY9~A;c;iv7T(E5y={E7ip5nsLc&(TFt+I@KQ3&&+!1{@trVIy&t`Ts!?F+9R zUfkJBxpi0UYTXHC%9%RdW6c_t0gYg$A_vepz5>-U6n!)nCaNl$X)iSFV-7qic6$(k zeDv4~!<_U214!&^1sll~6szEF)L0k2*_}?;ddc6sw&kf+O7-nNdRWHr!tPzlqFlFf zH#ES)v{`XXR-$CLK>XBN_3b+#Wxzz{#xAQsUEuEUfhy~GN2*`LwG~BOfGq81L@SQ9 zkt`qQRN5$ljjt**dD)BsNYqU}4>)u9DS)+-x1OoN2HS4B@N3OL>ec>)I4x|m@-%ltED{@P@Jn=|L-^;+@n9%%J%aA+r>i*rj?VhG z$1+n8_ptYDr93G185sf-NxtXL>6id})Vm6c#JE| zA2-Bwa-{vUGWf4n7=Eb?{{@d7pttj%hyG{D^j?KublLyE5gh*mJrO=&{g{ie@>txK z=p!a6+-m1bgbV0CRG{cm_+$1a(D=T#q3V>PU1P3Fu)TOkp#HP5yqfn>?AU)&EdC8> zL4W!0Ji3NoBS{_8V6}JgkKz9nt@d9NAN~!k7V6GqiPB{gt8O6+xhHJhqAYaE$A$-Q z7W?LPpW5ls^?1|ojmmt$d~|*_F6t5%S*07=k;+_VXdNUh^Y-IFfbs1-LC-A?0})$d zsL(G2Y{DPj5?Pc;v-jA##N_%e7nP!jfdqvE!~>+%Bcs3JanI86xG-T`-nv6Wx`_B; z-X@_yTV;AdHr=G@yY?>(@1x7NR=CIV-bWrSzeqi9N$B{P_Rq@xR!8PHE}cSuTNJP8 z`adi8&80W@#k{UQbIvMg{M~<}4MvXioc7$!{0G{)|C=^w(c6$j|C9Ysx8YYm2yOkn z)Bh*>;s5AdSc}*m3?w}ovB5&Dl48X1WVZo!V+VjLefrUTuO-BTalu5yGv zH=2!$CkjXT9&jAk#IxDA4QmWlh0yt$_kV4}{t7k={kIDr`1Sw6qC2U8{67s_{Ff`^ zuv9#S42pGvMVXY`dLphRn_LjrUsl~DnlcQHE9!Cj8zgBW57+`6Lvk3fY1X-lUDs<@3T>Xx=oOdn@^^EHA9dVw(jFb_HuXeF^a8XT-T)kvPM*6@&J^ zW5>g`$_NvE)Sam3({2I2Dk&upuw9Lz6O2J4L#RtcH+qq@EGnw=%|ZF`?a4oM(wd4> zpB6Sqnu@5v7GtHS;d#Yj+Qtk-r^u&IJU&@}z`@l^YDTPreYAnKT>xMXfR#KfR?lzr zy15FfVyr8L5oxl4Tl?&e>~<(Aeo1$PN@&5$qQroUb;bN8tuwx*B{`u9dQ{cSo1?yN z3vIo|{l0XMGwv2mH&18Ftdlsg!O}wEEZOKX$dKDl{6ta|2k3PEl6a}!)ziuEJ6d6RTQa=F)4|D+1Oer zvHR7mgQz%SqCfpL1JAk%F-)Dax z2iRLtPmINpb74+ihZiX|lppEaKRm?tr6btgN-?Q@wbl(9Ubd+5gJe&?Zm7_9GcP@V9mgS8@M`=P@hs?aG3U+y;_={991CFCcZyhkZr1< zJ*Jq$drqixaf&uE0QU^IGA#~EVy9%Rl_w%SGJ$*DSt>PJ$9rMb&y z_fZFdtkk1W<0mt|Uo%2n4ku{!ww+Xl+NlxnU8s`n4Kt<=ln+`#wc-Q`W#?H2v0Nm* zIWQNC`^p~I9Vxw7dA9VA8%C985)}%a8sZ}q1^Ha`hZnbx#6@pe(h-`<2n|lLRKubL zY1W8urSP1DgKj~Mxv+khyuZ|S-cx~BQrns3G%!binDJaKr)R|JzNR&OV7r4Yh`#GK z;{?zwn}ba>_bhv41;(V0J`5`e_)AuW2tK=t)|mRP@u&NtHg2WJCik6Ls;N|9FFfY9 zPK>p2b~(ZNhJAO&`0B>%HJ@G|RCejSc=y1%n$z>wEsM}2R;OMkK1jFUqJWMi23eNv zgde`GG%>#?-Q0oWxW>NfdX?!bXKwJ)5be(*tH3u@tw8!l$&yaDs^wEN;zSNnyG;54 z_2rlZ*MVL*AtNn!Axu$3f#?q|jVR+wtY*fyg1B=s9jAI=zWNF2Hy2l%+s90_L(Q28 zAa`+xH+8--_uEj51~l6r?LKgD$W+HlyKY=v_M}MY1i2|t>*m9Fr`3|aL(dd zAP!{?8H{|_Q*tbp8{5Z8104ZbicqUZfk9WWO|BM;bp2J70i`f)!8^CmK~ENN{enF3 za>XNOUp~Ne!L2W&niPQ+4**IfRe^4Q85?(*jmP7pHZS8p_0h^BJ{3QD*|P6)Kk@~) z=-3x-zACHV=S6g-i$_Mv)Z#IN=$uqHp2TP7?O(m)LNrlTS>0ZJAyvHR&rn+(wzo|Z z?8hjN!i2sCK{zkt&u@O<&M30E`|}J1xMgr#Fk(YBv+PU7yS675Hp%0m;o_umy9-)6 zMhnj#_ivUtdvm~A=HSNC>E5Io5hee;XD{qwX?fgCtQE8W_LTnT%fDGAA>jSP8_!SH z{Qnyq@_)|Iu1(%tGhekodQ^ZPR1c^dlm{hD)G|ve80xESw!rUIwEFiJ+I>9FB9E82 z9E;kJbN?~JA))U3F)d!fS| zj0{}Sd6nY<6`Ru9WYx<1J@z?TJ}iPMtR2OPXw*>B)>B45&~iTuLZc3EaBLHJ)fIJl1Zy_@t5@ctBeg>P6d-Q^7p(%E`ba` z^v_D!Rr$@_6Dg`njt}ym7eB+c=hugp3u2Kq_vl$_HZJv&=fIFxRLk?YnsXJk!cYqI zaddBYvf-@*r16?=Ar>WP;%IObu$7I@c6w%=)>q@bmeL8&@&jCa^)MWDUR3wZ^4N{R z2tZak`=1Nat%9GbqlfK^sVT$o2^k^U_HQGMjAydq$uFANovHhMui zRZtwL%JtiM<+%bRm889Pn*FD;sZt5@HB*_nQ-Xmkw<$MwLLx=0$NoPfYmtV@2(}O2YI*T`R z3AQ~!vI)Eos5;B_@ho3IeQ(v1b~Ctp*cs%qwtC~xz-1G4I2?tve}vGK@-E105p`MN z&y6eVSiS$sF6u@&+&?0)8FyX#x+D3bzLdGjS}p>oJs})?^zKm`EYkFn44)`GI3p>G zAuMlNTA{_6ZXNJSO_3q|(}^xu&`2 z>>~KbKE829yH&ByoL2hu&hJof>;I==HyN+Xq> zu?$w|_ocO^1fBZ=V@R|$r=ca{S#A8P-!a>zCqbFGYYM>R%c{d#I;^w)zd})c(3$jI z`~@;;U|;u2##>VV7?nlA^?*UxCAnVM%}+_pC5$j?m_CsaJuT_S zyzxY;DD2yE&(AYvE_Di~Ic`aB-gKUXGv56R0(LjRyqc3*_mg=H&6y0Yl9V z727462gzW$IM!X=Jq-Z90wN8dXI>_H0lpZ>q(9tcW4!T~>!YOT#lS2A1%nz-dM+X% z2^Vez(Ko7xR^D{H6HC>*tztZ2`>9F!`QBUx+<*0OxCmLTr06K&@o;vg!lb*$_HuVu z`+_C>5dGwL^4&BlJ}G1Vq{`xx;f7{p9BI#B7gLe<^UNhs{PQu2)h>|)5KQGIbO)D| z%N?2+HF9C071!?{r?6<%gNkV%KY;JHVie$s22-+_PpxN^mJ6ZvDJ9RnMcPVtq zln&pfRkx@;Zp*3H0kfjT^V+T`12_oR#OVnQ zSNWoN??GJSLGfcr@t){wM}8VC#us9HIdk9!;9TdY8R53K47Foi7Z&xLU8Oz=a%rcT zZJ$hb_C&hONNV&%Ycn7K7t#;(l(Qv{2eY@ZMs9I!(R$Zj>wcgo1(E0p7?q#@6Sn_v zi3a~!-J?`fw*UV{-Se*i1Z(((bfutT3*7>JS3yKZTGu2XvQ~b4CCaY@^L@J zf4mY^sdzS6y?;C+Q6^7SN5INKLjl3UaII}gy2K}C!_&V4NmBi5qh+I`aVOLg46=;Y z$)b9E4kZQn>nXeUaU$aj zY@G$=Ao+e4uSKHyvWQJ#E$iKH+dDBgqS?7mQi{txtJwOEv|u1Zbz z_nbCU9q;Q!uMK>6bI2l#gP(cE6CS*%76|O!dsee+%ANKdkZ5|>KKcHiqrtC)mt9`% zMFpOZ7lgf4bcn4x0B(eCVm)Ue(!J81D5Gt(I-$jQ_rEdd~Ng=6&>s z%~qM$>4S&Em)-j{@3-W-LvHSBXcQA)pY((MUXQ3pFV=E5abDP6E%^do5)58)tCwgb zul?2S?VcmjX2oBr<%$Pg@MCR#cAg?`Hhb&&l|3;fZ@&=$bVR@w4|rSEeoM*8xJ2K! zI6;0o`5C%RgbKH5=XAmWtx9EH4rp*atdN&~bUDo-VDCHv+KNlH5)bH{uenAbp*Ph7 zLY3!t8`7n<@Ym`MUXMfWh@rni{5BEi(L%KD2<#v>X9Ar!HrMTrAJraLP3>|ZnQV3c zjygHZ2wU<%oJ3uwX=u2XB7dH7UARB5SV|JDKyP?}tZkjB%CG zQFncG9sQr*`99_~BNF3YA-#(G5Q0Q<&2p=5qJx%-K2&Ebg`Awf42`qzvLKy+Jp+?g z`NVcO=cHMO<%2*Y0*w)7WAmB-#O$!_?wTh0I|$^DfnSK17n*g6MYV0dWiE+E6e38D zxcpFlwJRwtjv#xqRp(n2L>+B@6Nm5eBb-tfBE*==j^rD+IwZ6 zvwmy+?z2eWw&x*J{NXopesXqqdt2Y)ZX&3i+@oCCYp6(Km;EwQqCQa#p1snl-C`$Y zDAACEo2(c^wbk3P$|KcJcy-<-ln}jMU7AS~KFo1`<#T`C-rnsUQ*W(9w8ERRwEHRm z2k;9m336TObJDdMq&Yw(Cic(3$bEo13?5ZYKvmqoE|xd7>>wPtJXBdFgGrgZX%%#< zR??}`3H&Pk%4?${t-yL%ZzAbgQ0D!aOeyS?YIt&S&00vThRn45#!uo!LA{B|qmq~s z5?vBiM7Fb@(E2Zg#F4POe3iS&yr7{3Y-}*s)Ma`+GhLq;3JI50jFMFX0TzRf=@QSN z&faGKj2oC`gfE=$Z0YLum+4@2u<_MGFI(rBQU@QMAMHxWv&2X5vvHh!Cn>jwcrPaU z44=p@0xz^ptJQJKx8urh%E`nY9vE{Ul+;9HR70n1!F_GB7gvHIfqk}5R3`VHxJ4ru~- zD(&Z2{q95Om8`8#2{-uJ$CXcg?Zbq%ixBTofXiU^*HH_+XH>- z^$LU5ce&s;yiaS}xi_Y5jl->Xa`*FVUQBoBNCJ4I`^w|twq^?Ys@g^HclEz~O|zM+ z+n~PaU*CF~)DSEwyKL|XjKlffo3l{PuZ!&RpiDLP6IBsULjzr{6xSmRFCNN#9iZQ+ z#|?Qb+%=QZ>Y$P~0x@8ojJj!GX^@6SR#aK*clbQHPFZ%e_bm2LKy}+aPZix`8A0N% z(?TN)CsxEFj9di7hxK+nkcc8dNO`TQB_JwU@0=W@cODQE1H;`$TT<4L{nN)$yb`oo z#dWYwAecXLf81^W${!BL*XcMmjcTQa8FdV5`_9;i?_cC9<_FY9%f1Q`pl#(79IG79 z+gq;W7AG4p#HM?lAyEL9L9EXanowqWswCNE(VI{`(G|MfT9F{t!`05LJgcmFPLsMT z&ari!)_b3CKJMt-H5)nxK1|^ED=QXZ!$Z>YB8OZj%m=^|hgpT~HhU)bztpd|YtvU) z%~uU6Cqa9Aj6yMKX_bnP(N7n-XzLV!SCL7&X@=Xf6rzX3+>xz83K1|<=r*T}Mo^$Q zT;UoFJrXv#19d@&^{_SwEELBGXCRznTbh(Fv$w6>j7=!^y&pa72T?(mNi(151>eXc zGiRaRx_ML8^Yh9@+p4WRpK&8x#-QmJ=#}Diq2gPou!pXQob#>;SN_MijW=Zslj(3k zbG=)ge^TuHaakgPK!Glb5C{h@o4IuGc+p8n&#!?knlqdO<5durGbIapkXynMd%s2B zD!2|+>v#7KEmBpAqJ1H_ANhT2b^>d5q7WTa2HeS7KWh&Q@7k|pmcDm%Oe&XZ_u{hD zt*&FZYFDh{gQ{WUuo30wL$;*6zO3dhYS?25_N@b{N3GOx|l#-mn{jD+J8D?7JY*Rs5>f$C1X(m@Zki!|oHyS^Rl30Prgf zpCHIaoc(PS?fC~z_0JS)rxSbLZ?UPv))ZKF9?f=Y9g9!w-hKWLBFWwc!s#_CD;)?5 zI>EGxB29Osep~9y9W12A6xH`=k>Akc#NO3xoLGmsxp+{zhY9Dw+#VfgMgK5JId|KP z(2s0=O%&*C2X;6PAAG0=NT&z@d}RE!%1n7<@DsMQqa3Tjo`@|Fh2h}C{_gGZ*e>a6 zIhJMLIyg~nZ#c-GAZ;d&t#KL(=|ji!fH=BQ>W`)xM|pC-jXpZJ9e-M1dQtR!(Bo7b zHDJVU|96ZY4BU-ogF0jqR5Flh!cQ;-Azk&4U&{frdx89W*!ly463&%2cZSf-U?^{Q z*fw`yGXF5wup;uLiVpFWn~f8qM&pHFL1{Qc$G459eJ?*Ib=Vizc_kSlU)M8!s=6#; z+4Si%k+&!(@iF%5ifC=f_C)IxdTkSC!ivw1_1+rgmNQ5Vd5Ua13&@%Ascmn2c=Ezv z(&e13Zb;G@QEjQu~2$FENS2N*}Y= z(#hpS#T>BrE1XM!OiOXiejX_Ib9Wf8T{C#}M5eLkbj-$fNr`Xm0;zhpa^tjV<2(gL zD>-8a6YxqU0c9)5LdqyNdjY^{(`;C|QqfbT+#UIKMcIpl4_S;y3y_2Jo@`{EYTzyp zCI|?5iOU8Bl{;L4wJS2|bT9{fyhP<>!}Wu~i|`F9{bE+sF}~UCKh8yq=1h{ivk*Yw z@{*IOc4*rSpu}fUGKDGR@)lS_uDYMsoV>GYqczhtxiS6BU`g%0epwUPtTC6=Ej`v)+GaI079T^8OE=g)cyJg|Q$RqwJ`ZT4PinF9S}2Qh15*~e^l#t=Z2 zZ-oc9*gmll*9o$^B6HG!+iovXXc(Q@7Ni|E5LT$j9K=3|(^u|Qv?^6H(xyDpyjVth=YjC4sV6O}wgg->_o}9w2XQcc5FfufKQ5>=ezL~b zzyy{J@4(XXv+~N484DVsv36yN87Y%AOqlPW?ZOP-#Xu?S27YT^N}lC$H~EQ45ptGF z#KZ5hU;~I5HbLL1f^a5Uq13eg?5IWDLm-W+P=c0BsOn|lMnf34I#cYu%WQtf0+lcf{1CFn>}`@&t}Ay>`@;~NO7%g zZ;_Q%2Tjxvg81Zgew4`3RH75Ww<>G|6)vkZ+~P2zPF+v7?Hk~}fiKl=kvL=8FF})0 z_jopsxXK|{CBgdHaVQ7JPuiNeLy68g1I5ZG1fy%-()9^cUNlVYf$_&1k{&j4yHLi zLRLY5@nb^Us>!m+4#Bndm7GeY>q`AuRhA6v4EsQ~Hrr8v{TlCSr|1fDcM0iKlgyBo&)@2SE_;y5|>7;^`z+}D)_Gcf_T>KvI(c94e{5ZG5^)koG zMkj0>s%_UMcP8Z_B8t)&Wm)Ug*XyNTSezCcQU6S<)9?+C__lqfLN*u#V?Ml zVWFL=JOLsT?qWS2Qw&d)OhDVtpkUdSdrf zEqiIvG_0gUbpnnbJac7MleHaeb41A`#HCF9G?V^*%MWcTgjzbdw6GW^uBYR)m&UaS zyQ1rOb?0sBPQn^fw+AJCpBC$Bpk%qiv8BD=LOP(O4kE$whL-iBY=M>yihW+NU7~$x z&g~jWXN3`es1aR87`&x>&0!^xE!*hzM%>(d2z$N!@CCUfWv8!Nh#Fx1RBzD*I~&n| zq_EB8vnSABQSn`)<~*`{l56+X=1?>qrl1!#3Qvi#Rv+$WgdWm7GzTf3zjeDPDm-XE z07BldiaD08i9lh26V~ZueA*gt0{Ie;(wgL{-!yiuiWP5(N*_8$sp4ZYO$1ye=5114 zOIxVsU6b#KqgNcAk47)ZL#=SB9GuHpAxtVX{&s_}UFAdd276<;*9=BQKOc%cme^Zx zH_FR7r!{*00)VDm><+IpHo5og*Rn{zIaF-|^8ovav&;B;@!wQP`s?iVUrtzGg-TBOoH7aie5- z^O}LdH=r8wbJEIJU-+awzl!}2o{@zl6HuEl)30{ z5qW*>@0r%$B=WV`(SJLwztZRLvesXiR{lucXKUqZ{&EZvqlY9hs3H1N&PwPNUNhMkp5o%njqJFy$uXPqg`#qr>9UnptcqcJz++bmV5NF z)I8zq9HJX8r@F_$4?pIHyJ>8Ha`Q{*Z>m%v1PsrvpBSE5QFp2~2%9n2j}>X{{;VSH zmiTzbC!gqM!To9hi06TAg|dMbdn)PX;a+#Wqtgf(&LuZ=`^!?*63k0*NTe}R+@%%j zlOE)p8SU!8cmd5Ow%PDi=1;=kv4Qo zVSz>P{&}39a5j5Nf4z*8E!d(;)_O|Q3ft!LZNr~EjZHfryRxL}X1wf}UBa6)n&bM} z55M1H7qBVsmnj4eDp9K0K*UwyYeAqAfkUw95f(^dv^L4u6wb=ATc24nU0?q)YR!cS ze9Rc!l%#n2jzGAA^-+#%%^e;Ac$Pi<W5we(rG z|8H9QY{Ea#((@1Y+E`gq&pmnK-l+x4!ygwP{*y9q{c2#phHPkrr8!$BMIsn(nDDws z`eOBbe*Yt)Nfh}aFSw2!D5KT+I;8E=tQP#nL)pQXuk0DRudP@6EFMsSMlN?IP`$y$ z-Rpz<_Cb@6eEByLBy@csaTbI;#J`0M%sEA<@A5;P&qVk&Li!s{=J`n0rW<;`6*)2N zB+kfFNEMJ(uZ=d$U?Z5(fY`TlAkIZlTJHQYV`J4n#`gYwt$)IN_koW2SK>R-vey!% z=oIt##=XqXzU9}s3EabHB*({}N8N538wsYZwr}5WxvK>z;(a?m-nz42R#r#=+Pwb7 zH+@EOY^K0{gxxFu@IRanf~DGDuckk*;4~coMk8|J#KF&C{(r5Y`1^u*X1 z$;a|ffAFZPpHM8^M(VU6n{CLRb^a4^_3zNt9~AU`!M?qi8?v96y^sFzzq9d2Hu+Br z>-Wn4)lCahG3)g?JnE~Y#s7Y;66kGIptnju(*eT|dQ