From ddb7b5f2ed4790872ffea78982307d8058fa84c2 Mon Sep 17 00:00:00 2001 From: wlh <646507849@qq.com> Date: Thu, 21 Dec 2023 17:01:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E5=BB=BA365-=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 10 ++- app/src/main/AndroidManifest.xml | 1 + .../java/com/zj365/dc/activity/LoginAct.kt | 6 ++ .../java/com/zj365/dc/activity/RegisterAct.kt | 8 +- .../dc/fragment/DynamicManagementFrag.kt | 7 +- .../com/zj365/dc/vm/DynamicManagementVm.kt | 5 +- app/src/main/java/com/zj365/dc/vm/LoginVm.kt | 35 +++++--- .../layout/frag_dynamic_management_header.xml | 4 +- .../base/act/BaseTenCentWebViewActivity.kt | 22 ++++- .../com/xty/base/dialog/BaseDialogFragment.kt | 85 ++++++++++++++++++ .../java/com/xty/base/h5/CloudJSBridge.kt | 4 +- .../src/main/res/layout/dialog_activities.xml | 2 +- build.gradle | 27 ++++++ .../xty/common/event/RegisterSuccessEvent.kt | 4 + config.gradle | 6 +- gradle.properties | 3 +- health/src/main/AndroidManifest.xml | 10 +++ .../com/zj365/health/act/HealthMainAct.kt | 21 +++-- .../drawable/shape_bind_device_history.xml | 2 +- .../res/layout/act_blood_calilbration.xml | 4 +- .../src/main/res/layout/act_blood_study.xml | 2 +- .../src/main/res/mipmap-xhdpi/icon_add_1.png | Bin 1306 -> 1315 bytes .../java/com/xty/network/model/MainBean.kt | 2 +- 23 files changed, 224 insertions(+), 46 deletions(-) create mode 100644 base/src/main/java/com/xty/base/dialog/BaseDialogFragment.kt create mode 100644 common/src/main/java/com/xty/common/event/RegisterSuccessEvent.kt diff --git a/app/build.gradle b/app/build.gradle index 99ffb5b..dd90890 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,6 +9,7 @@ def androidId = rootProject.ext.defaultSetting def url = rootProject.ext.url def imagePrefix =rootProject.ext.image_preifx + android { compileSdkVersion androidId.compileSdk buildToolsVersion androidId.buildToolsVersion @@ -105,8 +106,16 @@ repositories { flatDir { dirs 'libs' } + + project.afterEvaluate { + com.android.build.gradle.BaseExtension android = project.extensions.getByName("android") + android.getPackagingOptions().exclude("META-INF/*.kotlin_module") + } } + + + dependencies { implementation (name: 'ycbtsdk-release', ext: 'aar') @@ -121,5 +130,4 @@ dependencies { kapt rely.GifDrawable kapt rely.xutil - } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e2b446e..1bdbaa7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -152,6 +152,7 @@ android:launchMode="singleTop" android:screenOrientation="portrait" /> + () { mViewModel.getWxLoginInfo(event.code) } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun registerSuccess(event: RegisterSuccessEvent){ + finish() + } } \ No newline at end of file diff --git a/app/src/main/java/com/zj365/dc/activity/RegisterAct.kt b/app/src/main/java/com/zj365/dc/activity/RegisterAct.kt index 0e7a4f0..4871ce5 100644 --- a/app/src/main/java/com/zj365/dc/activity/RegisterAct.kt +++ b/app/src/main/java/com/zj365/dc/activity/RegisterAct.kt @@ -23,6 +23,7 @@ import com.xty.common.TimeSelect import com.xty.common.arouter.ARouterUrl import com.xty.common.arouter.RouteManager import com.xty.common.event.LoginOrRegisterEvent +import com.xty.common.event.RegisterSuccessEvent import com.xty.common.util.CommonToastUtils import com.xty.common.xqr_code.XQRCodeAct @@ -189,11 +190,8 @@ class RegisterAct : BaseVmAct() { timer = null } mViewModel.login(binding.mAccount.text.toString().trim(),binding.mPsw.text.toString().trim()) - runOnUiThread { - RxActivityTool.finishActivity(LoginAct::class.java) - - } - + EventBus.getDefault().post(RegisterSuccessEvent()) + // RxActivityTool.finishActivity(LoginAct::class.java) } mViewModel.codeLive.observe(this) { timeStart() diff --git a/app/src/main/java/com/zj365/dc/fragment/DynamicManagementFrag.kt b/app/src/main/java/com/zj365/dc/fragment/DynamicManagementFrag.kt index 9d36000..9557e38 100644 --- a/app/src/main/java/com/zj365/dc/fragment/DynamicManagementFrag.kt +++ b/app/src/main/java/com/zj365/dc/fragment/DynamicManagementFrag.kt @@ -914,8 +914,11 @@ class DynamicManagementFrag : BaseVmFrag() , EasyPermission binding.mHeader.tvLanuDate.text = bean.chinaDay // setWeatherInfo(bean.weather) - binding.mHeader.mBMI.text = "BMI ${bean.bmiInfo.bmi}" - binding.mHeader.mBMIStatus.text = "${bean.bmiInfo.levelName}" + bean.bmiInfo?.let { + binding.mHeader.mBMI.text = "BMI ${it.bmi}" + binding.mHeader.mBMIStatus.text = "${it.levelName}" + } + binding.mHeader.tvWarningNum.text ="预警次数:${if (bean.warningCount == 0) "--" else bean.warningCount}次" binding.mHeader.tvMonitorNum.text ="监测次数:${if (bean.healthCount == 0) "--" else bean.healthCount}次" diff --git a/app/src/main/java/com/zj365/dc/vm/DynamicManagementVm.kt b/app/src/main/java/com/zj365/dc/vm/DynamicManagementVm.kt index 78b56a3..b1859ee 100644 --- a/app/src/main/java/com/zj365/dc/vm/DynamicManagementVm.kt +++ b/app/src/main/java/com/zj365/dc/vm/DynamicManagementVm.kt @@ -589,13 +589,14 @@ class DynamicManagementVm : BaseVm() { uricAcidData.time } else { "${ - RxTimeTool.simpleDateFormat( + milliseconds2String(uricAcidData.time) + /* RxTimeTool.simpleDateFormat( "yyyy-MM-dd HH", RxTimeTool.string2Date( "yyyy-MM-dd HH:mm:ss", uricAcidData.time ) - ) + )*/ }:00" } } diff --git a/app/src/main/java/com/zj365/dc/vm/LoginVm.kt b/app/src/main/java/com/zj365/dc/vm/LoginVm.kt index f946b7b..ce6f21d 100644 --- a/app/src/main/java/com/zj365/dc/vm/LoginVm.kt +++ b/app/src/main/java/com/zj365/dc/vm/LoginVm.kt @@ -56,14 +56,16 @@ class LoginVm() : BaseVm() { } saveToken(login.raw().headers) val bodys = login.body() as RespBody - - MMkvHelper.put(Const.USER_ID, bodys.data.id) - val deviceType = bodys.data.deviceType - if (TextUtils.isEmpty(deviceType)) { - MMkvHelper.remove(Const.DEVICE_TYPE) - } else { - MMkvHelper.put(Const.DEVICE_TYPE, bodys.data.deviceType) + if (bodys != null){ + MMkvHelper.put(Const.USER_ID, bodys.data.id) + val deviceType = bodys.data.deviceType + if (TextUtils.isEmpty(deviceType)) { + MMkvHelper.remove(Const.DEVICE_TYPE) + } else { + MMkvHelper.put(Const.DEVICE_TYPE, bodys.data.deviceType) + } } + bodys.getCodeStatus(mLogin, nowData, loading) } } @@ -82,15 +84,22 @@ class LoginVm() : BaseVm() { } startHttp { val login = apiInterface().loginCode(account, code) + if (login.body()?.code == 500) { + login.body()?.msg?.let { CommonToastUtils.showToast(it) } + return@startHttp + } saveToken(login.raw().headers) val bodys = login.body() as RespBody - MMkvHelper.put(Const.USER_ID, bodys.data.id) - val deviceType = bodys.data.deviceType - if (TextUtils.isEmpty(deviceType)) { - MMkvHelper.remove(Const.DEVICE_TYPE) - } else { - MMkvHelper.put(Const.DEVICE_TYPE, bodys.data.deviceType) + if(bodys != null){ + MMkvHelper.put(Const.USER_ID, bodys.data.id) + val deviceType = bodys.data.deviceType + if (TextUtils.isEmpty(deviceType)) { + MMkvHelper.remove(Const.DEVICE_TYPE) + } else { + MMkvHelper.put(Const.DEVICE_TYPE, bodys.data.deviceType) + } } + bodys.getCodeStatus(mLogin, nowData, loading) } } diff --git a/app/src/main/res/layout/frag_dynamic_management_header.xml b/app/src/main/res/layout/frag_dynamic_management_header.xml index 6e614ac..2cb0a4d 100644 --- a/app/src/main/res/layout/frag_dynamic_management_header.xml +++ b/app/src/main/res/layout/frag_dynamic_management_header.xml @@ -36,7 +36,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="@dimen/dp_14" - android:text="BMI 24" + tools:text="BMI 24" android:textColor="@color/col_313" android:textSize="@dimen/sp_17" android:textStyle="bold" @@ -59,7 +59,7 @@ android:paddingTop="@dimen/dp_2" android:paddingRight="@dimen/dp_8" android:paddingBottom="@dimen/dp_2" - android:text="正常" + tools:text="正常" android:textColor="@color/col_D9BD" android:textSize="@dimen/sp_14" android:textStyle="bold" diff --git a/base/src/main/java/com/xty/base/act/BaseTenCentWebViewActivity.kt b/base/src/main/java/com/xty/base/act/BaseTenCentWebViewActivity.kt index 57457aa..0c8fce5 100644 --- a/base/src/main/java/com/xty/base/act/BaseTenCentWebViewActivity.kt +++ b/base/src/main/java/com/xty/base/act/BaseTenCentWebViewActivity.kt @@ -17,9 +17,14 @@ import com.tencent.smtt.sdk.WebViewClient import com.xty.base.databinding.ActBaseTencentWebviewBinding import com.xty.base.h5.CloudJSBridge import com.xty.base.h5.IJsBridge +import com.xty.base.h5.WebUtils +import com.xty.base.utils.ContextUtils import com.xty.base.vm.BaseVm +import com.xty.common.Const import com.xty.common.LogUtils +import com.xty.common.MMkvHelper import com.xty.common.arouter.ARouterUrl +import org.json.JSONObject @Route(path = ARouterUrl.H5_ACT) @@ -41,6 +46,7 @@ import com.xty.common.arouter.ARouterUrl override fun initView() { super.initView() initWebViewSettings() + ContextUtils.init(this) getWindow().setFlags( WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); @@ -64,6 +70,20 @@ import com.xty.common.arouter.ARouterUrl } binding.webView.addJavascriptInterface(cloudJSBridge,"business") + val userId = if (MMkvHelper.getLong(Const.USER_ID).toString() == "0") { + "" + } else { LogUtils.e("CloudJSBridge","str") + MMkvHelper.getLong(Const.USER_ID).toString() + } + + /* val jsonObject = JSONObject() + jsonObject.put("statuHeight", WebUtils.getStatesBar()) + jsonObject.put("token", MMkvHelper.getString(Const.Auth_Token)) + + jsonObject.put("userId", userId) + jsonObject.put("isAPP", 1) + LogUtils.e("CloudJSBridge",jsonObject.toString()) + sendDataToJS("sendBaseInfo", jsonObject.toString())*/ } override fun liveObserver() { @@ -195,7 +215,7 @@ import com.xty.common.arouter.ARouterUrl java.lang.String.format( "javascript:%s('%s')", functionName, - R.attr.data + data ) ) } diff --git a/base/src/main/java/com/xty/base/dialog/BaseDialogFragment.kt b/base/src/main/java/com/xty/base/dialog/BaseDialogFragment.kt new file mode 100644 index 0000000..0f17a89 --- /dev/null +++ b/base/src/main/java/com/xty/base/dialog/BaseDialogFragment.kt @@ -0,0 +1,85 @@ +package com.xty.base.dialog + +import android.content.DialogInterface +import android.os.Bundle +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.Window +import android.view.WindowManager +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.xty.base.vm.BaseVm +import com.xty.common.ReflexUtils + +abstract class BaseDialogFragment :DialogFragment(){ + + + protected lateinit var mView: View + private var dismissListener: OnDismissListener? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + getStyle()?.let { + setStyle(STYLE_NORMAL, it) + } + } + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + dialog?.requestWindowFeature(Window.FEATURE_NO_TITLE) + mView = onCreateView() + + initView() + initData() + initListener() + return mView + } + + override fun onStart() { + super.onStart() + //设置 dialog 的宽高 + dialog?.window?.let { + it.setBackgroundDrawable(null) + val lp: WindowManager.LayoutParams = it.attributes + lp.gravity = getGravity() + lp.width = getWidth() + lp.height = getHeight() + if (isBGTransparent()) { + lp.dimAmount = 0.0f + } else { + lp.dimAmount = 0.5f + } + + it.attributes = lp + } + + } + + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + dismissListener?.onDismiss() + } + fun setOnDismissListener(dismissListener: OnDismissListener) { + this.dismissListener = dismissListener + } + + protected abstract fun onCreateView(): View + protected open fun getStyle(): Int? = null //弹框样式 动画 + protected open fun getGravity(): Int = Gravity.BOTTOM //弹框位置 + protected open fun isBGTransparent() = false //是否全透明背景 + + protected open fun getHeight(): Int = WindowManager.LayoutParams.WRAP_CONTENT //弹框最大高度 + protected open fun getWidth(): Int = WindowManager.LayoutParams.MATCH_PARENT //弹框最大高度 + + + protected abstract fun initView() + + protected abstract fun initData() + + protected abstract fun initListener() + interface OnDismissListener { + fun onDismiss() + } +} \ No newline at end of file diff --git a/base/src/main/java/com/xty/base/h5/CloudJSBridge.kt b/base/src/main/java/com/xty/base/h5/CloudJSBridge.kt index d87fc87..36fff99 100644 --- a/base/src/main/java/com/xty/base/h5/CloudJSBridge.kt +++ b/base/src/main/java/com/xty/base/h5/CloudJSBridge.kt @@ -2,8 +2,8 @@ package com.xty.base.h5 import android.content.Context import android.webkit.JavascriptInterface +import com.google.gson.Gson import com.xty.base.act.BaseVmAct -import com.xty.base.act.IBaseAct import com.xty.common.Const import com.xty.common.LogUtils import com.xty.common.MMkvHelper @@ -27,6 +27,8 @@ open class CloudJSBridge(val context: Context, val listener: IJsBridge) { jsonObject.put("token", MMkvHelper.getString(Const.Auth_Token)) jsonObject.put("userId", userId) + jsonObject.put("isAPP", 1) + LogUtils.e("CloudJSBridge",jsonObject.toString()) listener.sendDataToJS("sendBaseInfo", jsonObject.toString()) } } diff --git a/base/src/main/res/layout/dialog_activities.xml b/base/src/main/res/layout/dialog_activities.xml index 94b4ad0..5f6ac44 100644 --- a/base/src/main/res/layout/dialog_activities.xml +++ b/base/src/main/res/layout/dialog_activities.xml @@ -15,7 +15,7 @@ + ResolutionStrategy rs = conf.resolutionStrategy + //统一第三方库的版本号 + rs.eachDependency { details -> + def requested = details.requested + if (requested.group == "com.android.support") { + //强制所有的 com.android.support 库采用固定版本 + if (requested.name.startsWith("multidex")) { + details.useVersion(MULTIDEX_VERSION) + } else { + details.useVersion(SUPPORT_VERSION) + } + } else if (requested.group == "com.google.code.gson") { + //统一 Gson 库的版本号 + details.useVersion(GSON_VERSION) + } else if (requested.group == "org.jetbrains.kotlin") { + //统一内部 kotlin 库的版本 + details.useVersion(kotlin_version) + } + } + } + } task clean(type: Delete) { diff --git a/common/src/main/java/com/xty/common/event/RegisterSuccessEvent.kt b/common/src/main/java/com/xty/common/event/RegisterSuccessEvent.kt new file mode 100644 index 0000000..6f13457 --- /dev/null +++ b/common/src/main/java/com/xty/common/event/RegisterSuccessEvent.kt @@ -0,0 +1,4 @@ +package com.xty.common.event + +class RegisterSuccessEvent { +} \ No newline at end of file diff --git a/config.gradle b/config.gradle index 37961cd..152818f 100644 --- a/config.gradle +++ b/config.gradle @@ -6,7 +6,7 @@ ext { appId : "com.zj365.dc", minSdk : 23, targetSdk : 32, - versionCode : 2, + versionCode : 114, versionName : "1.0.0" ] @@ -29,10 +29,10 @@ ext { release_url: "https://auprty.com/app/"*/ //测试环境 debug_url : "http://java01.zhongjian365.com/app/", - release_url: "http://175.6.39.20:8181/app/", + release_url: "http://java01.zhongjian365.com/app/", h5_debug_url : "http://testbuilt.zhongjian365.com/", - h5_release_url : "http://built.zhongjian365.com/" + h5_release_url : "http://testbuilt.zhongjian365.com/" ] diff --git a/gradle.properties b/gradle.properties index e1dc032..b2dd0f0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx5120m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects @@ -22,4 +22,3 @@ kotlin.code.style=official kotlin.incremental=true org.gradle.parallel=true android.injected.testOnly=false -android.defaults.buildfeatures.buildconfig=true \ No newline at end of file diff --git a/health/src/main/AndroidManifest.xml b/health/src/main/AndroidManifest.xml index 9f248a3..43c5bf3 100644 --- a/health/src/main/AndroidManifest.xml +++ b/health/src/main/AndroidManifest.xml @@ -259,6 +259,16 @@ + + + + \ No newline at end of file diff --git a/health/src/main/java/com/zj365/health/act/HealthMainAct.kt b/health/src/main/java/com/zj365/health/act/HealthMainAct.kt index 6dd9f71..927aaf9 100644 --- a/health/src/main/java/com/zj365/health/act/HealthMainAct.kt +++ b/health/src/main/java/com/zj365/health/act/HealthMainAct.kt @@ -65,7 +65,12 @@ class HealthMainAct : IBaseAct() { super.initView() val deviceType = MMkvHelper.getString(Const.DEVICE_TYPE) - tabName = when (deviceType) { + tabName = arrayOf( + R.string.info_1, R.string.info_3, R.string.info_7, + R.string.info_4, R.string.info_6, R.string.info_2, + R.string.info_8, R.string.info_11/*, R.string.info_5, + R.string.info_10*/ + ) /*when (deviceType) { "", "U32" -> { arrayOf( R.string.info_1, R.string.info_3, R.string.info_7, @@ -79,7 +84,7 @@ class HealthMainAct : IBaseAct() { arrayOf( R.string.info_1, R.string.info_3, R.string.info_7, R.string.info_4, R.string.info_6, R.string.info_2, - R.string.info_8, R.string.info_11/*, R.string.info_10*/ + R.string.info_8, R.string.info_11*//*, R.string.info_10*//* ) } @@ -87,10 +92,10 @@ class HealthMainAct : IBaseAct() { arrayOf( R.string.info_1, R.string.info_3, R.string.info_7, R.string.info_6, R.string.info_2, R.string.info_8, - R.string.info_11/*, R.string.info_10*/ + R.string.info_11*//*, R.string.info_10*//* ) } - } + }*/ statusBar(binding.title.mView) initTitle() @@ -161,8 +166,8 @@ class HealthMainAct : IBaseAct() { private fun initVp2() { listFragment.clear() - when (MMkvHelper.getString(Const.DEVICE_TYPE)) { - "", "U32" -> { + /*when (MMkvHelper.getString(Const.DEVICE_TYPE)) { + "", "U32" -> {*/ listFragment.add(setArgumentFrag(XinlvFrag(), id)) listFragment.add(setArgumentFrag(XueyangFrag(), id)) listFragment.add(setArgumentFrag(BreathFrag(), id)) @@ -173,7 +178,7 @@ class HealthMainAct : IBaseAct() { listFragment.add(setArgumentFrag(UricAcidFrag(), id, sex)) // listFragment.add(setArgumentFrag(XdFrag(), id)) // listFragment.add(setArgumentFrag(BloodFatFrag(), id)) - } + /* } "A3" -> { listFragment.add(setArgumentFrag(XinlvFrag(), id)) @@ -197,7 +202,7 @@ class HealthMainAct : IBaseAct() { listFragment.add(setArgumentFrag(UricAcidFrag(), id, sex)) // listFragment.add(setArgumentFrag(BloodFatFrag(), id)) } - } + }*/ binding.mVp2.adapter = VpAdapter(listFragment, this) binding.mVp2.isUserInputEnabled = false diff --git a/health/src/main/res/drawable/shape_bind_device_history.xml b/health/src/main/res/drawable/shape_bind_device_history.xml index 522a19b..1d89b35 100644 --- a/health/src/main/res/drawable/shape_bind_device_history.xml +++ b/health/src/main/res/drawable/shape_bind_device_history.xml @@ -3,7 +3,7 @@ @@ -94,7 +94,7 @@ android:textSize="@dimen/sp_16" android:textStyle="bold" android:text="@string/blood_align_history" - android:textColor="@color/col_02b" /> + android:textColor="@color/col_02c" /> E|HP)Px(-AP12R9HvNSY2!sRTTcd+b#zDON&q+{CNP806|H_Dx^ERNkcKw_yFw_JZNHz zNOuQh5d<@?(Oa5Ck<*Ow>Y43<}D&_n7%vq06>2 zZAt8TnwfL%x!*l=&OJZGNGZ2vI#hLBQ4%7UN#Gs;w+Cu23GfSv(^{B^8pxwz^^YUj zf{}#3>Wty9%PoXjN#Jn+(bfT4L<&OHfn49m$YgZbe&LFp>>@%s2+SBl*?9n00^URb zQ!2>`@QpxL!7vNMff^dn!7US2v1&7bmDei};AaB6^ni3>623;g*#km683A$Fnu^PK zSXHr6fEEJxl>xA|zT*`npZU8Iu*!hCtU6Y6KZ%D*i$vt4fa@R^_ad3;4>P^T&tFCCdoVE1FLtnL0EoAmxklc9O&%0yQ2e z!Ex#7dlW4ju9idx0aAIp6GUrpf<7s-0gb6sp~BHaXP1HbFg ziFE2lKn1Hw3HJpI(U3$~M0m0VYl#wm=ss%AW+YSI^RVPtaRuf}*M}Cykw|sBYkUhy zM$xG`Lt>iuu4SE0ns0>Zb@{4bw?mK(PMgw+bVsChIqP*OZVdj$DKXM>TqHiAg0)Nu zcX&+lq%`!+1;Z~f4^Ylp1w|i(mUf*q-;DyuGeURm35s~pr=gd?SpAU)h>m@TK)uJH zEJfVh6G`b<0G0i25y?x!OcI}Onx?96`QA63oD;*m-;c^@G-?a^>Pg4?iQv8No*HTz zk+)kF(do0XNypPKM}y)^jS-ORgKtCN-cisBZB%({2gqgK2aP9?OqU`p60WfVLe5^S z6h8HXLUxjleT2Y#4^Z`lIxKv?ClZoCNICWk07{O$N*n3-MzS6UwoO(2SG^P>z)>p4 z{uRL80M2V8U3Y{36zr$ffVls-G7)i*&A|zGLoj4E*Ht`+c>0qvMJ@&xkXt4E=Du74 zaGRG~jP&3VBWJHr3fo3>;t*jCSpmcJeKsIE_L(4e{y8oIjjvxe{+zmCe*nR9FUr6s z7^%-j;xl6odnda{LG}mt;0_{hJ*UX+!H56%Viai|PpJdC|DWmOC%FQL#YjIke##HZ za>UJ@l?ybH*L1>sD~fZEx8b_#h4TbO!o61w(CT??Y}fK$O3K~)LVO$ zz}z7F_KMa^kzDN-(FS=tx?O9GZktkS6bAsT*QZZz z8dIbA;H(!xW&p&3!=9C*G?aI*m0RgTb_zxI6PQ;r%S~;ifn!28A)ayv6@zG$!v@){ zHM=lTj#V5sT;V*Wq*1`;3d4r2IySHt3)Yk-CJ_OZ#6rh0(j(v>euT)K0H;=RHUZ8E z*dCTE!{500001b5ch_0Itp) z=>Px()Ja4^R9HvNm|biXRTRhn=gziBlqhPc52$H&rZE(|v$b?*OK509EG8NsN_m18 z6OkbBq-a!P4Qe9#qE!s|CT}PSh6k-7p(&v|TbAxD*v52btpbUmh{iOgl_M=A3iqo^uIH9O0phG6|^zz-A&m0bng`ta8-|OaZvYj2{6EkR%4o z4b49VH9>&{Q>hv`CvAtIJ;aCu2(*p?8_a_Q>NERKokDM~y_mhSN@d-68bBWbjinSZ z;|9Rf-aA@Jgu0S)z-1C*ui4f-xDe2SFl&c~R^B7-{fNMOiWf7}6(XEqd-hCT)EX19 z^^+iCSB9Ayl0U4G?At1d&=zKFC*sHE8t0F5(+|A(CY$&{9^>ZX}h=8WMYdABDP}hX^}b|A1*sr5?6tr6B?- zzF>}tdo3ydAzE8=fgt7!rBXHFoOFPIcZf)God`BXDBnKb+WK2Td=AXI(b3x6)a~KB z9-*5IJZotYeOVCm7KL@AlNcw7u-bdY8S_eQ8@4yyb~CP6UeVJ>0ovt1`<-ELvb2`5 zav-v9yui#-HXi+=yzIz2f;b1@L5~N0W?bDr2S!dBUBvj#SH`n>d-KG`mIX7vU{ujZ zx&iUEr`PVWv=(>1*l0LE(h-uxK*1SA)G;25obx=xEEL@s2T|CkJ!r<&cgrbt-iMRM zKEe3JncIy0*|^#lWSx>Q-U8u}AFeS|i>`NJWZl?7z;Tz0Flx0$nnASa52|1=JY?(@ z0xp1UV_&vi{WJ)S;{bU$bBWmBWsGhYM$ru?L1Ug0+Gc8zlYtaEo>?x8Yd6ykupeR` zAo+YMOj5}5VvehprataXgN;gHoG+Jk;}-%Rb%Ubl>0JOF^_+skW=wr87=|ZRAq4i(7?|zI9=gq%jP}1{Y=})n_A-$v_mo zkgTU)CXk!74Bl&L(a)B$KAg#{5!37*3yx=gCEyV-ZkTbkety2ldir^`$%$#nL4rF7 z)Z@c^#WpQ`DhqMd(we`Sr-+n(#n8sh{g)df>sVXCqO{*r*5UIL=a($w$E#=S_O(yi^3wFLCLyD6MVzbJ@~x%&V2 zpI-GG2VQYi4F@HFWYv@q4D2jfTru&RRxJ8{kVIZ?aV00yZxGXat_|j_si}>3YT)9s zlYu-jZ8YPNWI3Sal$}Z<6Jz4@1bCeSVXGBW`xhz5oz5WN@!u5W(jdSOc^}HhOfCA7 zx0#EE->O^ysM&i=H<|5iRy^ty&lL~HBM^KVTxfy$Qq8K`4P#9uS{27ygRa+0SaGh< z#4&T8fw!|Y`NNeoadKXIm6&<~)ObHwHuIR-G@)sCy2_I6tvonVM=L}>7}0_|{?+!D zkmeb?%j#&kQS9zzHU1!W>XtLM5b08lzp(8n3El#xp81VGgO1#?|9a(Gd%J&gaTllJ zD-i&b4E*UQ;QavBlu9lJ#sTbG?CdKG<0@X}Ws!GDf&^?nV%6kNl*_rl0e9@GH{j?q QHUIzs07*qoM6N<$g0uN