From aa62dda844662cc0ce0a5e6a1231d5e78ebe7f4b Mon Sep 17 00:00:00 2001 From: hch <16607480311@163.com> Date: Tue, 23 Jan 2024 14:05:33 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9F=AD=E5=89=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/activity/WebViewActivity.java | 2 + .../com/yunbao/common/utils/DialogUitl.java | 19 ++ .../utils/JavascriptInterfaceUtils.java | 5 + .../com/yunbao/common/utils/RouteUtil.java | 6 + common/src/main/res/values-en-rUS/string.xml | 5 +- common/src/main/res/values-zh-rHK/strings.xml | 4 + common/src/main/res/values-zh-rTW/strings.xml | 4 + common/src/main/res/values-zh/strings.xml | 4 + common/src/main/res/values/strings.xml | 4 + .../live/activity/LiveAudienceActivity.java | 2 + .../live/dialog/LiveGameDialogFragment.java | 9 + main/src/main/AndroidManifest.xml | 3 + .../activity/MainHomeCommunityActivity.java | 43 +++++ .../MainHomeCommunityVideoFragment.java | 175 +++++++++++++----- .../views/MainHomeCommunityViewHolder.java | 40 ++-- .../drawable/background_community_video.xml | 14 ++ .../layout/activity_main_home_community.xml | 13 ++ .../res/layout/view_main_community_video.xml | 29 ++- .../res/mipmap-xxhdpi/icon_back_community.png | Bin 0 -> 2725 bytes 19 files changed, 313 insertions(+), 68 deletions(-) create mode 100644 main/src/main/java/com/yunbao/main/activity/MainHomeCommunityActivity.java create mode 100644 main/src/main/res/drawable/background_community_video.xml create mode 100644 main/src/main/res/layout/activity_main_home_community.xml create mode 100644 main/src/main/res/mipmap-xxhdpi/icon_back_community.png diff --git a/common/src/main/java/com/yunbao/common/activity/WebViewActivity.java b/common/src/main/java/com/yunbao/common/activity/WebViewActivity.java index dcafa85a8..aeec0100e 100644 --- a/common/src/main/java/com/yunbao/common/activity/WebViewActivity.java +++ b/common/src/main/java/com/yunbao/common/activity/WebViewActivity.java @@ -410,6 +410,8 @@ public class WebViewActivity extends AbsActivity { } else if (TextUtils.equals(event.getMethod(), "androidMethodLookToLive")) { //看直播 gotoLive(event.getLiveId()); + }else if (TextUtils.equals(event.getMethod(), "androidtoCommunityVideo")) { + RouteUtil.forwardCommunityActivity(); } } diff --git a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java index a297704d7..e2d3f7056 100644 --- a/common/src/main/java/com/yunbao/common/utils/DialogUitl.java +++ b/common/src/main/java/com/yunbao/common/utils/DialogUitl.java @@ -95,6 +95,16 @@ public class DialogUitl { showSimpleTipDialog(context, null, content); } + public static void showBackDialog(Context context, String content, String cancel, String sure, SimpleCallback callback) { + if (context instanceof Activity) { + if (((Activity) context).isDestroyed() || ((Activity) context).isFinishing()) { + return; + } + } + new Builder(context).setTitle(content).setCancelable(true).isShowContent(false).setCancelString(cancel).setConfirmString(sure).setClickCallback(callback).build().show(); + } + + public static void showSimpleTipDialog(Context context, String title, String content) { if (context instanceof Activity) { if (((Activity) context).isDestroyed() || ((Activity) context).isFinishing()) { @@ -351,6 +361,7 @@ public class DialogUitl { private String mHint; private int mInputType; private int mLength; + boolean isShowContent; private SimpleCallback mClickCallback; private SimpleCallback3 mClickCallback3; private SimpleCallbackView mSimpleCallbackView; @@ -393,6 +404,11 @@ public class DialogUitl { return this; } + public Builder isShowContent(boolean isShow) { + isShowContent = isShow; + return this; + } + public Builder setCancelable(boolean cancelable) { mCancelable = cancelable; return this; @@ -471,6 +487,9 @@ public class DialogUitl { if (mLength > 0 && content instanceof EditText) { content.setFilters(new InputFilter[]{new InputFilter.LengthFilter(mLength)}); } + if (!isShowContent) { + content.setVisibility(View.GONE); + } TextView btnConfirm = (TextView) dialog.findViewById(R.id.btn_confirm); if (!TextUtils.isEmpty(mConfirmString)) { btnConfirm.setText(mConfirmString); diff --git a/common/src/main/java/com/yunbao/common/utils/JavascriptInterfaceUtils.java b/common/src/main/java/com/yunbao/common/utils/JavascriptInterfaceUtils.java index 33048d9ce..781507ddd 100644 --- a/common/src/main/java/com/yunbao/common/utils/JavascriptInterfaceUtils.java +++ b/common/src/main/java/com/yunbao/common/utils/JavascriptInterfaceUtils.java @@ -683,4 +683,9 @@ public class JavascriptInterfaceUtils { ToastUtil.showDebug("网页跳客服页面"); RouteUtil.forwardCustomerService(url); } + + @JavascriptInterface + public void androidtoCommunityVideo() { + RouteUtil.forwardCommunityActivity(); + } } diff --git a/common/src/main/java/com/yunbao/common/utils/RouteUtil.java b/common/src/main/java/com/yunbao/common/utils/RouteUtil.java index b81b0855f..281357214 100644 --- a/common/src/main/java/com/yunbao/common/utils/RouteUtil.java +++ b/common/src/main/java/com/yunbao/common/utils/RouteUtil.java @@ -49,7 +49,13 @@ public class RouteUtil { public static final String PATH_SELECT_AVATAR="/main/UserAvatarSelectActivity"; public static final String PATH_BattlePassActivity="/main/BattlePassActivity"; public static final String PATH_SudGameActivity="/live/SudGameActivity"; + public static final String PATH_COMMUNITY_Activity="/main/MainHomeCommunityActivity"; + + public static void forwardCommunityActivity() { + ARouter.getInstance().build(PATH_COMMUNITY_Activity) + .navigation(); + } public static void forwardFansActivity(String uid) { ARouter.getInstance().build(PATH_FANSACTIVITY) .withString(Constants.TO_UID, uid) diff --git a/common/src/main/res/values-en-rUS/string.xml b/common/src/main/res/values-en-rUS/string.xml index 1a4af54ee..b98e1dc22 100644 --- a/common/src/main/res/values-en-rUS/string.xml +++ b/common/src/main/res/values-en-rUS/string.xml @@ -628,7 +628,7 @@ accept whole Album - cancel + Cancel camera Picture selection/Preview Preview @@ -1447,4 +1447,7 @@ Limited ride And limited avatar frame Mute Cancel + Are you sure to return? + + Sure diff --git a/common/src/main/res/values-zh-rHK/strings.xml b/common/src/main/res/values-zh-rHK/strings.xml index d10050f16..2c04fb7e0 100644 --- a/common/src/main/res/values-zh-rHK/strings.xml +++ b/common/src/main/res/values-zh-rHK/strings.xml @@ -1445,4 +1445,8 @@ 直播通行證 取消 + + 是否確認返回? + + 確定 diff --git a/common/src/main/res/values-zh-rTW/strings.xml b/common/src/main/res/values-zh-rTW/strings.xml index 1018b7ee1..6698c9652 100644 --- a/common/src/main/res/values-zh-rTW/strings.xml +++ b/common/src/main/res/values-zh-rTW/strings.xml @@ -1445,4 +1445,8 @@ 取消 + 是否確認返回? + + 確定 + diff --git a/common/src/main/res/values-zh/strings.xml b/common/src/main/res/values-zh/strings.xml index 7649f4799..894b5492a 100644 --- a/common/src/main/res/values-zh/strings.xml +++ b/common/src/main/res/values-zh/strings.xml @@ -1442,4 +1442,8 @@ 取消 + 是否確認返回? + + 確定 + diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index e40c4c050..015c07bf9 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -1451,4 +1451,8 @@ Limited ride And limited avatar frame Cancel + Are you sure to return? + + Sure + diff --git a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java index e36ded9ed..934bcb316 100644 --- a/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java +++ b/live/src/main/java/com/yunbao/live/activity/LiveAudienceActivity.java @@ -860,6 +860,8 @@ public class LiveAudienceActivity extends LiveActivity { if (!TextUtils.isEmpty(event.getMethod())) { if (TextUtils.equals(event.getMethod(), "closeLiveRoom")) { onBackPressed(); + }else if (TextUtils.equals(event.getMethod(), "androidtoCommunityVideo")) { + RouteUtil.forwardCommunityActivity(); } } } diff --git a/live/src/main/java/com/yunbao/live/dialog/LiveGameDialogFragment.java b/live/src/main/java/com/yunbao/live/dialog/LiveGameDialogFragment.java index ea5cc7968..6bda7e903 100644 --- a/live/src/main/java/com/yunbao/live/dialog/LiveGameDialogFragment.java +++ b/live/src/main/java/com/yunbao/live/dialog/LiveGameDialogFragment.java @@ -161,6 +161,13 @@ public class LiveGameDialogFragment extends AbsDialogFragment { .setLiveZhuangBana(true). setDialogClose(true). setPageClose(false), "androidObject"); + + + /* mWebView.addJavascriptInterface(JavascriptInterfaceUtils.getInstance().setmContext(getActivity(), mWebView) + .setLiveZhuangBana(true). + setDialogClose(true). + setPageClose(false), "androidObject");*/ + mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setDomStorageEnabled(true); String appCachePath = mContext.getCacheDir().getAbsolutePath(); @@ -417,6 +424,8 @@ public class LiveGameDialogFragment extends AbsDialogFragment { ); } + }else if (TextUtils.equals(event.getMethod(), "androidtoCommunityVideo")) { + RouteUtil.forwardCommunityActivity(); } } } diff --git a/main/src/main/AndroidManifest.xml b/main/src/main/AndroidManifest.xml index f5524761c..eff290185 100644 --- a/main/src/main/AndroidManifest.xml +++ b/main/src/main/AndroidManifest.xml @@ -159,6 +159,9 @@ + + \ No newline at end of file diff --git a/main/src/main/java/com/yunbao/main/activity/MainHomeCommunityActivity.java b/main/src/main/java/com/yunbao/main/activity/MainHomeCommunityActivity.java new file mode 100644 index 000000000..084ac2870 --- /dev/null +++ b/main/src/main/java/com/yunbao/main/activity/MainHomeCommunityActivity.java @@ -0,0 +1,43 @@ +package com.yunbao.main.activity; + +import android.widget.LinearLayout; + +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.yunbao.common.activity.AbsActivity; +import com.yunbao.common.utils.L; +import com.yunbao.common.utils.RouteUtil; +import com.yunbao.main.R; +import com.yunbao.main.fragment.MainHomeCommunityVideoFragment; + +/** + * 短剧 + */ +@Route(path = RouteUtil.PATH_COMMUNITY_Activity) +public class MainHomeCommunityActivity extends AbsActivity { + + @Override + protected int getLayoutId() { + return R.layout.activity_main_home_community; + } + + @Override + protected void main() { + MainHomeCommunityVideoFragment communityVideoFragment = new MainHomeCommunityVideoFragment(); + + FragmentManager FM = getSupportFragmentManager();//获取管理器 + FragmentTransaction FT = FM.beginTransaction();//获取启动器 + FT.replace(R.id.fragment, communityVideoFragment);//替换碎片 + FT.addToBackStack(null);//是否启动回退栈 + FT.commit();//提交 + + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + +} diff --git a/main/src/main/java/com/yunbao/main/fragment/MainHomeCommunityVideoFragment.java b/main/src/main/java/com/yunbao/main/fragment/MainHomeCommunityVideoFragment.java index 0727bf0ca..f2db90261 100644 --- a/main/src/main/java/com/yunbao/main/fragment/MainHomeCommunityVideoFragment.java +++ b/main/src/main/java/com/yunbao/main/fragment/MainHomeCommunityVideoFragment.java @@ -10,8 +10,10 @@ import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; +import android.os.Message; import android.text.TextUtils; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.webkit.CookieManager; @@ -19,6 +21,10 @@ import android.webkit.ValueCallback; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; +import android.widget.LinearLayout; + +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.NonNull; import com.alibaba.fastjson.JSONObject; import com.lxj.xpopup.XPopup; @@ -48,10 +54,17 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.Arrays; +import java.util.Timer; +import java.util.TimerTask; public class MainHomeCommunityVideoFragment extends BaseFragment { WebView mWebView; private Context mContext; + LinearLayout back; + + boolean isShow = true; + + Timer timer; @Override public View createView(LayoutInflater inflater, ViewGroup container) { @@ -118,6 +131,80 @@ public class MainHomeCommunityVideoFragment extends BaseFragment { } } }); + back = findViewById(R.id.back); + back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showBackDialog(); + } + }); + mWebView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + back.setVisibility(View.VISIBLE); + if (timer != null) { + timer.cancel(); + timer = null; + } + updateKnowledge(); + return false; + } + }); + mWebView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + back.setVisibility(View.VISIBLE); + if (timer != null) { + timer.cancel(); + timer = null; + } + updateKnowledge(); + } + }); + updateKnowledge(); + } + + public void showBackDialog() { + DialogUitl.showBackDialog(mContext, getString(R.string.community_back), getString(R.string.cancel), getString(R.string.back_community_sure), new DialogUitl.SimpleCallback() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + onDestroy(); + } + }); + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + requireActivity().getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + showBackDialog(); + } + }); + } + + public void updateKnowledge() { + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + back.setVisibility(View.GONE); + isShow = false; + } + }); + } + }, 5 * 1000); + } + + + @Override + public void onDestroy() { + super.onDestroy(); + getActivity().finish(); } private void copy(String content) { @@ -143,64 +230,60 @@ public class MainHomeCommunityVideoFragment extends BaseFragment { @Subscribe(threadMode = ThreadMode.MAIN) public void onJavascriptInterfaceEvent2(JavascriptInterfaceEvent event) { if (TextUtils.equals(event.getMethod(), "postWeakBalance")) { - LiveNetManager.get(mContext). - getCoolConfig(new com.yunbao.common.http.base.HttpCallback() { + LiveNetManager.get(mContext).getCoolConfig(new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(CoolConfig data) { + new XPopup.Builder(mContext).enableDrag(false).autoOpenSoftInput(false).maxWidth(DeviceUtils.getScreenHeight((Activity) mContext) - DpUtil.dp2px(34)).asCustom(new CinemaTicketPopupWindow(mContext, data.setTicketCount(event.getCoolConfig().getTicketCount()), new CinemaTicketPopupWindow.CinemaTicketPopupWindowCallBack() { @Override - public void onSuccess(CoolConfig data) { - new XPopup.Builder(mContext) - .enableDrag(false) - .autoOpenSoftInput(false) - .maxWidth(DeviceUtils.getScreenHeight((Activity) mContext) - DpUtil.dp2px(34)) - .asCustom(new CinemaTicketPopupWindow(mContext, data.setTicketCount(event.getCoolConfig().getTicketCount()), new CinemaTicketPopupWindow.CinemaTicketPopupWindowCallBack() { - @Override - public void onCallBack(String data) { - if (TextUtils.equals(data, "2")) { - DialogUitl.showSimpleDialog(mContext, mContext.getString(com.yunbao.live.R.string.live_coin_not_enough), false, - new DialogUitl.SimpleCallback2() { - @Override - public void onConfirmClick(Dialog dialog, String content) { - mContext.startActivity(new Intent(mContext, MyWalletActivity.class).putExtra("p", 1)); - } + public void onCallBack(String data) { + if (TextUtils.equals(data, "2")) { + DialogUitl.showSimpleDialog(mContext, mContext.getString(com.yunbao.live.R.string.live_coin_not_enough), false, new DialogUitl.SimpleCallback2() { + @Override + public void onConfirmClick(Dialog dialog, String content) { + mContext.startActivity(new Intent(mContext, MyWalletActivity.class).putExtra("p", 1)); + } - @Override - public void onCancelClick() { + @Override + public void onCancelClick() { - } - }); - } else if (TextUtils.equals(data, "1")) { - ToastUtil.show(WordUtil.isNewZh() ? "兑换成功" : "Successful exchange"); - mWebView.post(new Runnable() { - @Override - public void run() { + } + }); + } else if (TextUtils.equals(data, "1")) { + ToastUtil.show(WordUtil.isNewZh() ? "兑换成功" : "Successful exchange"); + mWebView.post(new Runnable() { + @Override + public void run() { - NativeCallbackModel model = new NativeCallbackModel(); - model.setUid(String.valueOf(IMLoginManager.get(mContext).getUserInfo().getId())); - String nativeJson = new JsonUtil().toJson(model); - mWebView.evaluateJavascript("javascript:nativeCallback('" + nativeJson + "')", new ValueCallback() { - @Override - public void onReceiveValue(String value) { - } - }); - - } - }); + NativeCallbackModel model = new NativeCallbackModel(); + model.setUid(String.valueOf(IMLoginManager.get(mContext).getUserInfo().getId())); + String nativeJson = new JsonUtil().toJson(model); + mWebView.evaluateJavascript("javascript:nativeCallback('" + nativeJson + "')", new ValueCallback() { + @Override + public void onReceiveValue(String value) { } + }); - } - })).show(); - } + } + }); + } - @Override - public void onError(String error) { - ToastUtil.show(error); } - }); + })).show(); + } + + @Override + public void onError(String error) { + ToastUtil.show(error); + } + }); } } - public void onPausePlay(){ + + public void onPausePlay() { mWebView.onPause(); } - public void onResumePlay(){ + + public void onResumePlay() { mWebView.onResume(); } } diff --git a/main/src/main/java/com/yunbao/main/views/MainHomeCommunityViewHolder.java b/main/src/main/java/com/yunbao/main/views/MainHomeCommunityViewHolder.java index 6145f2eab..d1f7c1869 100644 --- a/main/src/main/java/com/yunbao/main/views/MainHomeCommunityViewHolder.java +++ b/main/src/main/java/com/yunbao/main/views/MainHomeCommunityViewHolder.java @@ -120,7 +120,6 @@ public class MainHomeCommunityViewHolder extends AbsMainHomeChildViewHolder impl ViewPager2 viewPager; private MagicIndicator mIndicator; - public MainHomeCommunityViewHolder(Context context, ViewGroup parentView, MainActivity mainActivity) { super(context, parentView); mContext = context; @@ -198,7 +197,11 @@ public class MainHomeCommunityViewHolder extends AbsMainHomeChildViewHolder impl @Override public void onClick(View v) { if (viewPager != null) { - viewPager.setCurrentItem(index); + if (index == 1) { + RouteUtil.forwardCommunityActivity(); + } else { + viewPager.setCurrentItem(index); + } } } }); @@ -225,29 +228,30 @@ public class MainHomeCommunityViewHolder extends AbsMainHomeChildViewHolder impl } public void onPauseVideo() { - if(fragments==null || fragments.isEmpty()){ + if (fragments == null || fragments.isEmpty()) { return; } BaseFragment fragment = fragments.get(viewPager.getCurrentItem()); - if(fragment==null){ - return; - } - if (fragment instanceof MainHomeCommunityVideoFragment) { - // viewPager.setCurrentItem(0, false); - ((MainHomeCommunityVideoFragment)fragment).onPausePlay(); - } - } - public void onResumePlay() { - if(fragments==null || fragments.isEmpty()){ - return; - } - BaseFragment fragment = fragments.get(viewPager.getCurrentItem()); - if(fragment==null){ + if (fragment == null) { return; } if (fragment instanceof MainHomeCommunityVideoFragment) { // viewPager.setCurrentItem(0, false); - ((MainHomeCommunityVideoFragment)fragment).onResumePlay(); + ((MainHomeCommunityVideoFragment) fragment).onPausePlay(); + } + } + + public void onResumePlay() { + if (fragments == null || fragments.isEmpty()) { + return; + } + BaseFragment fragment = fragments.get(viewPager.getCurrentItem()); + if (fragment == null) { + return; + } + if (fragment instanceof MainHomeCommunityVideoFragment) { + // viewPager.setCurrentItem(0, false); + ((MainHomeCommunityVideoFragment) fragment).onResumePlay(); } } diff --git a/main/src/main/res/drawable/background_community_video.xml b/main/src/main/res/drawable/background_community_video.xml new file mode 100644 index 000000000..bd4dede01 --- /dev/null +++ b/main/src/main/res/drawable/background_community_video.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/main/src/main/res/layout/activity_main_home_community.xml b/main/src/main/res/layout/activity_main_home_community.xml new file mode 100644 index 000000000..d985944f4 --- /dev/null +++ b/main/src/main/res/layout/activity_main_home_community.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/main/src/main/res/layout/view_main_community_video.xml b/main/src/main/res/layout/view_main_community_video.xml index 4c0f7fb70..489591c49 100644 --- a/main/src/main/res/layout/view_main_community_video.xml +++ b/main/src/main/res/layout/view_main_community_video.xml @@ -1,5 +1,5 @@ - @@ -8,9 +8,32 @@ android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginBottom="68dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - \ No newline at end of file + + + + + + + + + + \ No newline at end of file diff --git a/main/src/main/res/mipmap-xxhdpi/icon_back_community.png b/main/src/main/res/mipmap-xxhdpi/icon_back_community.png new file mode 100644 index 0000000000000000000000000000000000000000..936cad37b1899d5301d6821fe6c4db3c0683bff5 GIT binary patch literal 2725 zcmV;W3R?AvP)Px zbn7W1QqRz5gdf~AZ4|VEb`af=3%E>x*YnR|2pQy#l~B0EC$Q?Gbfp@A*Uo zc1?c_y0sdbt|{;WPylrU_!vNs3pn4lD1hbpLI9)PpFEonk--w+hRH9$9CjawNNpe+ zNqBq!Ad=^%UU6>%xWNrGFB16@P+`+lu@oAu1Gxbq;H8ouc3qzU7Pp=QMhrreAtlsM zWW4|-8-q)t$b)U(1YWD03EO!UL_-w_iRpg>_$Vd54GoCKPQr0oq5C>uhfe^ykSGNB zRuJ6=qNy-6ONESAiIrTE+!&LCcs>NU4jRg4oPuFpk=*pS3qBF&Is-kyO&BreaX4@G z(8GtN{v;Q_e7BAx#|vQSBVgleAS{Q^7^4zCwFqP~_|-0vOxN-v&@%f482YzWV-mnp z7T-y+yeQdd-y(XfeT!Fkr;%Dca~=$P6?ET?AQWT`FCjU>&58aScoE>HStTHD0_g<` zyd>(IsluCqSZoWHwJmnjdN3T+y}Z7n29EtOG;JOL>7@Br6M@WEfS9j1TYfCH8oa4dk- z%9PUsfjJ9cVH-js%3Sb5B3Uj8hy*)ndHb!GggV2+Twl5jnzcHqU{$QS;IB`imXknZ z$v#*GB`SHvZ4&#bb({zY^&Fy=9bdWJ1Qgy4wcmsm{u5%UAp_u+l)jUV00#mFoX4Zk zM4)7ASl$G9)#Qb+3SNT4F*wc;lz;R0E~2v znUz4>yeZK74kF|x@4K$XN!2%bc!1Z<=!DPua#D7P_K(>BQzv4PSK!bKw4zOfNXDi5 z$I;_2Lic?uUa|mnt{d;>VpampRgb{O8xVB>(Iy=k-tR$xpPgTT^XCpj)1{xLFC{CO z;qY15k$PIbe{EJ0PfWTQ1tZ%)G$Ki28lXZeD}lz67vURnA8c1`3IR8o(vmnw4)B_? z>tUK5AdJeHBR&o2xv(FM`Lwb_H0^-JYfBnn4VkNyfYiI`ULI&HZGh>IKOjus$U-0z zJVeXeGbS;wFP{JyZ6Fn~xtDk(+`9welMATss041>;$PR!0fn0sc)@d5h>I1y3t2BP677OIMaKj)nqM z-EXYIm%{_AXO+X!cDQNh1wTG%i^Mk2qpvL)K!91pQ?qPndYpjxTnLK?qM-(=-d8Kn zBx?*emp=!?d?1+vA`~QAj zMis;Y`U?Qm8)Xm{VN~uhh)BuTv^fGdPH%)Yv`V>666YU-%K^EY*G}((ub}wisY@nt zVm&F(k!>&wSK@s5DAl#5DxTyB@=Z-MKxW2-KG^gJJ$0%rP)W5bHY+-S-Drg-_GNJ2P558TZe9<4ZX6 z@f$ErD|wU^8ZxnveDo6#hw5NIA$S6sboNCxNW5n2b=b zi6PE0T6$34;JNt8vW3vhXFxPO?aX`~pfXBH5$6~jV-i(0C%bpL2PAn$|F<5XCF%*e z+L>}9%9DU6+I~0is>v_HKkQzB(hIj(eNxKJY;Q#ORgcm=+mdIr0kbrIZRSMSdaD`$ zCWcs&3lhhdkpS1t_M_052Aj9T@{NMs??@?sCJy#$IP9E;!?US+x13UvE8{SbTgsk- zWi3J2iO1dvclN28NOmohujRRZRyiE|CoqgVp=mT=%#x@)SGfYt(t%*lI+}Z6dH+4K zPBXcA<~uOWo05%0hPU09Mu4BHnFPCcBXoTVhzhfgRYVF(=~N&0L~ewRQ1xCpSPod( z3AD_(8IHCWx>1zesEdFz!A@F{-`RI5*FD2$uh8L}W@Q`X$&&bF&lRUshfVGt>dY8V>N# zhuBT{Z!fXvR7fqV;A?`yQa>8Ua%QZ;nv=c(9lVL3~vZ1079zz>>0J}>11cNN3w?n2n@ zXVZr;+#&v4!;X)L<=0F1Hm&VG1Ry~ f6`5sqzJ&e