From 59c346536efb660bfaa8952586932ca54e1aaa30 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 4 Jul 2023 18:30:17 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E8=BD=AE=E8=AE=AD=E6=B7=BB=E5=8A=A0=20?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E7=BA=BF=E7=A8=8B=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/model/CharterPassengerModel.kt | 22 +++++++++---------- .../BusPassengerFunctionOrderPresenter.kt | 10 ++++----- .../TrajectoryAndDistanceManager.kt | 9 +++++--- ...rModelLoopManager.kt => BizLoopManager.kt} | 20 ++++++++++++++--- .../module/manager/loopmanager/LoopInfo.kt | 4 +++- 5 files changed, 42 insertions(+), 23 deletions(-) rename OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/{BusPassengerModelLoopManager.kt => BizLoopManager.kt} (70%) diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt index dd5ffce344..91c1194884 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt @@ -30,7 +30,7 @@ import com.mogo.och.common.module.manager.loopmanager.LoopInfo import com.mogo.och.bus.passenger.bean.response.* import com.mogo.och.bus.passenger.callback.* import com.mogo.och.bus.passenger.constant.CharterPassengerConst -import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager +import com.mogo.och.common.module.manager.loopmanager.BizLoopManager import com.mogo.och.bus.passenger.net.BusPassengerServiceManager import com.mogo.och.bus.passenger.utils.ToastCharterUtils import com.mogo.och.bus.passenger.utils.VoiceFocusManager @@ -186,12 +186,12 @@ object CharterPassengerModel { // 2 、打开空调暖风机灯设置页面 // 3、车控页面、 // 4、打开选择线路页面 - BusPassengerModelLoopManager.removeLoopFunction(TAGLOGIN) + BizLoopManager.removeLoopFunction(TAGLOGIN) CallerLogger.d(M_BUS_P + TAG, "结束登录状态轮询") // 启动订单轮 startOrderLoop() } else { - BusPassengerModelLoopManager.setLoopFunction( + BizLoopManager.setLoopFunction( TAGLOGIN, LoopInfo(3, ::queryLoginStatus) ) @@ -337,7 +337,7 @@ object CharterPassengerModel { * 启动订单轮训 */ private fun startOrderLoop() { - BusPassengerModelLoopManager.setLoopFunction( + BizLoopManager.setLoopFunction( TAGORDER, LoopInfo(3, ::queryOrder) ) @@ -348,7 +348,7 @@ object CharterPassengerModel { * 启动订单轮训 */ private fun endOrderLoop() { - BusPassengerModelLoopManager.removeLoopFunction(TAGORDER) + BizLoopManager.removeLoopFunction(TAGORDER) CallerLogger.d(M_BUS_P + TAG, "结束订单轮询") } @@ -489,7 +489,7 @@ object CharterPassengerModel { * 启动订单轮训 */ private fun startCarStatusLoop() { - BusPassengerModelLoopManager.setLoopFunction(TAGCARSTATUS, LoopInfo(3, ::queryCarStatus)) + BizLoopManager.setLoopFunction(TAGCARSTATUS, LoopInfo(3, ::queryCarStatus)) CallerLogger.d(M_BUS_P + TAG, "启动车态轮询") } @@ -497,7 +497,7 @@ object CharterPassengerModel { * 启动订单轮训 */ private fun endCarStatusLoop() { - BusPassengerModelLoopManager.removeLoopFunction(TAGCARSTATUS) + BizLoopManager.removeLoopFunction(TAGCARSTATUS) CallerLogger.d(M_BUS_P + TAG, "结束车态轮询") } @@ -548,7 +548,7 @@ object CharterPassengerModel { * 启动时间校准轮训 */ private fun startCalibrationLoop() { - BusPassengerModelLoopManager.setLoopFunction( + BizLoopManager.setLoopFunction( TAGCALIBRATION, LoopInfo(120, ::queryBusinessTime, immediately = true) ) @@ -559,7 +559,7 @@ object CharterPassengerModel { * 停止时间校准轮训 */ private fun endCalibrationLoop() { - BusPassengerModelLoopManager.removeLoopFunction(TAGCALIBRATION) + BizLoopManager.removeLoopFunction(TAGCALIBRATION) CallerLogger.d(M_BUS_P + TAG, "结束时间校准轮询") } @@ -656,7 +656,7 @@ object CharterPassengerModel { * 启动路距计算 */ private fun startCalculateDistanceLoop() { - BusPassengerModelLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance)) + BizLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance)) CallerLogger.d(M_BUS_P + TAG, "开始路距计算") } @@ -667,7 +667,7 @@ object CharterPassengerModel { * ③ 到站成功后 */ private fun endCalculateDistanceLoop() { - BusPassengerModelLoopManager.removeLoopFunction(TAGDISTANCE) + BizLoopManager.removeLoopFunction(TAGDISTANCE) CallerLogger.d(M_BUS_P + TAG, "结束路距计算") } diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt index d7bd2cb1ac..633384e64c 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt @@ -20,7 +20,7 @@ import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse import com.mogo.och.bus.passenger.model.CharterPassengerModel import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener import com.mogo.och.bus.passenger.model.OrderStatusEnum -import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager +import com.mogo.och.common.module.manager.loopmanager.BizLoopManager import com.mogo.och.bus.passenger.net.BusPassengerServiceManager import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1OrderLineFragment import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg @@ -187,7 +187,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : CallerLogger.d(M_BUS_P + TAG, "onDestroy") RxUtils.disposeSubscribe(subscribeSelectLine) RxUtils.disposeSubscribe(subscribeSelectSite) - BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) + BizLoopManager.removeLoopFunction(TAGLINELOOP) CharterPassengerModel.setStatusChangeListener(TAG,null) CallerTelematicListenerManager.removeListener(TAG) } @@ -230,7 +230,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : mView?.hideDataDriverRefuse() } RxUtils.disposeSubscribe(subscribeSelectSite) - BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) + BizLoopManager.removeLoopFunction(TAGLINELOOP) } } } @@ -270,7 +270,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : } mView?.hideDataWaitDriverMsg() // 启动查看和司机端链接 - BusPassengerModelLoopManager.setLoopFunction( + BizLoopManager.setLoopFunction( TAGLINELOOP, LoopInfo(3, ::checkServerStatus) ) @@ -284,7 +284,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : private fun checkServerStatus() { if (!CallerTelematicManager.getClientConnStatus()) { ToastCharterUtils.showShort("断开和司机端连接、请联系安全员") - BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) + BizLoopManager.removeLoopFunction(TAGLINELOOP) mView?.hideDataDriverRefuse() CallerLogger.d(M_BUS_P + TAG, "endAni666") } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt index fffccac800..3f7a678324 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt @@ -12,10 +12,11 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON import com.mogo.eagle.core.utilcode.util.CoordinateUtils -import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager +import com.mogo.och.common.module.manager.loopmanager.BizLoopManager import com.mogo.och.common.module.manager.loopmanager.LoopInfo import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil import com.zhjt.service.chain.ChainLog +import io.reactivex.schedulers.Schedulers import mogo.telematics.pad.MessagePad import java.util.concurrent.ConcurrentHashMap @@ -190,7 +191,9 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{ * 启动路距计算 */ private fun startCalculateDistanceLoop() { - BusPassengerModelLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance)) + BizLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance, + scheduler = Schedulers.computation() + )) d(SceneConstant.M_BUS_P + TAG, "开始路距计算") } @@ -198,7 +201,7 @@ object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{ * 结束启动路距计算 */ private fun endCalculateDistanceLoop() { - BusPassengerModelLoopManager.removeLoopFunction(TAGDISTANCE) + BizLoopManager.removeLoopFunction(TAGDISTANCE) d(SceneConstant.M_BUS_P + TAG, "结束路距计算") } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BizLoopManager.kt similarity index 70% rename from OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BizLoopManager.kt index aaacdf7319..ff512902fa 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BizLoopManager.kt @@ -4,6 +4,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P import com.mogo.och.common.module.utils.RxUtils import io.reactivex.Observable +import io.reactivex.Observer import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import java.util.concurrent.ConcurrentHashMap @@ -14,7 +15,7 @@ import java.util.concurrent.TimeUnit * * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等) */ -object BusPassengerModelLoopManager { +object BizLoopManager { private val TAG = "BusPassengerModelLoopManager" @@ -66,8 +67,21 @@ object BusPassengerModelLoopManager { aLong?.let { if (it % loopInfo.interval == 0L) { try { - loopInfo.function.invoke() - CallerLogger.d(TAG, "${aLong}对象${loopInfo}正在执行方法${tag}") + if(loopInfo.scheduler!=null) { + Observable.just(tag).observeOn(loopInfo.scheduler) + .subscribe(object :Observer{ + override fun onSubscribe(d: Disposable) {} + override fun onError(e: Throwable) {} + override fun onComplete() { + loopInfo.function.invoke() + CallerLogger.d(TAG, "${aLong}正在执行方法${tag}_${Thread.currentThread().name}") + } + override fun onNext(t: String) {} + }) + }else{ + loopInfo.function.invoke() + CallerLogger.d(TAG, "${aLong}正在执行方法${tag}_${Thread.currentThread().name}") + } }catch (e:Throwable){ e.printStackTrace() CallerLogger.e(TAG,"$tag:--$e") diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt index 88aba91287..a6c0cccf5b 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt @@ -1,3 +1,5 @@ package com.mogo.och.common.module.manager.loopmanager -data class LoopInfo(val interval:Long,val function: () -> Unit,val immediately:Boolean=false) \ No newline at end of file +import io.reactivex.Scheduler + +data class LoopInfo(val interval:Long,val function: () -> Unit,val immediately:Boolean=false,var scheduler: Scheduler? = null) \ No newline at end of file From ef60b02b887e3d0c1ac4ec6cf417df0f96551bfe Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 5 Jul 2023 11:23:04 +0800 Subject: [PATCH 2/8] Rename .java to .kt --- .../model/{TaxiPassengerModel.java => TaxiPassengerModel.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/{TaxiPassengerModel.java => TaxiPassengerModel.kt} (100%) diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt similarity index 100% rename from OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java rename to OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt From fba5cbcdf881bc5b2f9933c8c7d2567b77bfbaf7 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 5 Jul 2023 11:23:04 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...TaxiPassengerControllerStatusCallback.java | 15 - .../constant/TaxiPassengerOrderStatusEnum.kt | 2 +- .../passenger/model/TaxiPassengerModel.kt | 1513 ++++++++--------- .../model/TaxiPassengerModelLoopManager.java | 6 +- .../presenter/BaseTaxiPassengerPresenter.java | 59 +- .../TaxiPassengerServingOrderPresenter.java | 58 +- .../och/taxi/passenger/ui/OverviewFragment.kt | 4 +- .../ui/TaxiPassengerServingOrderFragment.kt | 17 +- .../passenger/utils/TPRouteDataTestUtils.java | 2 +- 9 files changed, 712 insertions(+), 964 deletions(-) delete mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java deleted file mode 100644 index dd4b3336fd..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerControllerStatusCallback.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.mogo.och.taxi.passenger.callback; - -import com.mogo.eagle.core.data.map.MogoLocation; - -/** - * Created on 2021/9/10 - * - * Model->Presenter回调:状态控制器监听(accOn、adas ui show、voice ui show、push ui show、v2x ui show等等) - */ -public interface IOCHTaxiPassengerControllerStatusCallback { - // 是否vr map模式 - void onVRModeChanged(boolean isVRMode); - // 自车定位 - void onCarLocationChanged(MogoLocation location); -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt index 1e3ec5ccd0..19dfedc935 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/constant/TaxiPassengerOrderStatusEnum.kt @@ -35,7 +35,7 @@ enum class TaxiPassengerOrderStatusEnum(val code: Int) { companion object { @JvmStatic - fun valueOf(code: Int): TaxiPassengerOrderStatusEnum? { + fun valueOf(code: Int): TaxiPassengerOrderStatusEnum { for (value in values()) { if (value.code == code) { return value diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt index f95bba5744..b707158df8 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt @@ -1,300 +1,231 @@ -package com.mogo.och.taxi.passenger.model; +package com.mogo.och.taxi.passenger.model -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; - -import android.content.Context; -import android.content.Intent; -import android.net.ConnectivityManager; -import android.os.Looper; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.amap.api.maps.model.LatLng; -import com.amap.api.navi.model.NaviLatLng; -import com.elegant.network.utils.GsonUtil; -import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; -import com.mogo.commons.module.intent.IMogoIntentListener; -import com.mogo.commons.module.intent.IntentManager; -import com.mogo.commons.module.status.IMogoStatusChangedListener; -import com.mogo.commons.module.status.MogoStatusManager; -import com.mogo.commons.module.status.StatusDescriptor; -import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; -import com.mogo.eagle.core.data.config.FunctionBuildConfig; -import com.mogo.eagle.core.data.enums.DataSourceType; -import com.mogo.eagle.core.data.map.MogoLocation; -import com.mogo.eagle.core.data.msgbox.MsgBoxBean; -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener; -import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener; -import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener; -import com.mogo.eagle.core.function.api.datacenter.union.ILimitingVelocityListener; -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager; -import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager; -import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager; -import com.mogo.eagle.core.function.call.v2x.CallerLimitingVelocityListenerManager; -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; -import com.mogo.eagle.core.utilcode.util.CoordinateUtils; -import com.mogo.eagle.core.utilcode.util.NetworkUtils; -import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.eagle.core.utilcode.util.UiThreadHandler; -import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; -import com.mogo.och.common.module.callback.OchAdasStartFailureCallback; -import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager; -import com.mogo.och.common.module.manager.OCHAdasAbilityManager; -import com.mogo.och.common.module.manager.distancemamager.IDistanceListener; -import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener; -import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager; -import com.mogo.och.common.module.map.AmapNaviToDestinationModel; -import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; -import com.mogo.och.common.module.utils.PinYinUtil; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean; -import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback; -import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback; -import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback; -import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback; -import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback; -import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback; -import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback; -import com.mogo.och.taxi.passenger.callback.ITaxiPassengerVeloctityCallback; -import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; -import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; -import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager; -import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils; -import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager; - -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -import io.reactivex.Observable; -import io.reactivex.disposables.Disposable; -import io.reactivex.exceptions.UndeliverableException; -import io.reactivex.functions.Consumer; -import io.reactivex.plugins.RxJavaPlugins; -import mogo.telematics.pad.MessagePad; -import mogo_msg.MogoReportMsg; -import system_master.SystemStatusInfo; +import android.annotation.SuppressLint +import android.content.Context +import android.net.ConnectivityManager +import com.amap.api.maps.model.LatLng +import com.amap.api.navi.model.NaviLatLng +import com.elegant.network.utils.GsonUtil +import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager +import com.mogo.commons.module.intent.IMogoIntentListener +import com.mogo.commons.module.intent.IntentManager +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.data.msgbox.MsgBoxBean +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.startAutoPilot +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.callback.OchAdasStartFailureCallback +import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.startLoopAbnormalFactors +import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.stopLoopAbnormalFactors +import com.mogo.och.common.module.manager.OCHAdasAbilityManager +import com.mogo.och.common.module.manager.distancemamager.IDistanceListener +import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addDistanceListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addTrajectoryListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.removeListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.setStationPoint +import com.mogo.och.common.module.map.AmapNaviToDestinationModel +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.calculateRouteSumLength +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterLatlngToLocation +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations +import com.mogo.och.common.module.utils.PinYinUtil +import com.mogo.och.common.module.utils.RxUtils +import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRemainingResp +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrdersInServiceQueryRespBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerQueryOrderRouteResp +import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean +import com.mogo.och.taxi.passenger.bean.TaxiPassengerStartReqBean +import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback +import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback +import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback +import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback +import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback +import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonValueCallback +import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst +import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum +import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum.Companion.valueOf +import com.mogo.och.taxi.passenger.network.TaxiPassengerServiceManager +import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils +import com.mogo.och.taxi.passenger.ui.leftmenu.OverlayLeftViewUtils.transmissionIndexGet +import com.mogo.och.taxi.passenger.utils.TaxiPassengerAnalyticsManager +import io.reactivex.disposables.Disposable +import io.reactivex.exceptions.UndeliverableException +import io.reactivex.functions.Consumer +import io.reactivex.plugins.RxJavaPlugins +import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.ArrivalNotification +import mogo.telematics.pad.MessagePad.GlobalPathResp +import system_master.SystemStatusInfo +import java.io.IOException +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.TimeUnit /** * Created by pangfan on 2021/8/19 * * 网约车 - 出租车业务逻辑处理 */ -public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback { +@SuppressLint("StaticFieldLeak") +object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { - private static final String TAG = TaxiPassengerModel.class.getSimpleName(); + private var mContext: Context? = null - private static final class SingletonHolder { - private static final TaxiPassengerModel INSTANCE = new TaxiPassengerModel(); + private val TAG = TaxiPassengerModel::class.java.simpleName + + // 获取当前订单 + @Volatile + var currentOCHOrder: TaxiPassengerOrderQueryRespBean.Result? = null//当前订单 + + @Volatile + private var mInServiceList = emptyList() //进行中订单 + + private var mADASStatusCallback: IOCHTaxiPassengerADASStatusCallback? = null//Model->Presenter:自动驾驶状态相关 + private var mAutopilotPlanningCallback: IOCHTaxiPassengerAutopilotPlanningCallback? = null//Model->Presenter:自动驾驶线路规划 + private val mOrderStatusCallbackMap: MutableMap = ConcurrentHashMap() + private var subscribe: Disposable? = null + private val mLocationsModels: MutableList = ArrayList() + + fun setMoGoAutopilotPlanningListener(moGoAutopilotPlanningCallback: IOCHTaxiPassengerAutopilotPlanningCallback?) { + mAutopilotPlanningCallback = moGoAutopilotPlanningCallback } - public static TaxiPassengerModel getInstance() { - return SingletonHolder.INSTANCE; + fun setADASStatusCallback(callback: IOCHTaxiPassengerADASStatusCallback?) { + mADASStatusCallback = callback } - private Context mContext; - private volatile TaxiPassengerOrderQueryRespBean.Result mCurrentOCHOrder; //当前订单 - private volatile List mInServiceList = Collections.emptyList(); //进行中订单 - private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单 - - private IOCHTaxiPassengerADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关 - private IOCHTaxiPassengerAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划 - - private final Map mOrderStatusCallbackMap = new ConcurrentHashMap<>(); - private final Map mControllerStatusCallbackMap = new ConcurrentHashMap<>(); - - private ITaxiPassengerVeloctityCallback mVeloctityCallback;//道路限速返回 - - private int mPreRouteIndex = 0; - - private Disposable subscribe; - private int delayTime = 2; - - private double mLongitude, mLatitude; - private MogoLocation mLocation = null; - - private final List mLocationsModels = new ArrayList<>(); - - private TaxiPassengerModel() { - } - - public void setMoGoAutopilotPlanningListener(IOCHTaxiPassengerAutopilotPlanningCallback - moGoAutopilotPlanningCallback) { - this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback; - } - - public void setADASStatusCallback(IOCHTaxiPassengerADASStatusCallback callback) { - this.mADASStatusCallback = callback; - } - - public void setControllerStatusCallback(String tag,IOCHTaxiPassengerControllerStatusCallback callback) { - if (tag == null || "".equals(tag)) return; - + fun setOrderStatusCallback(tag: String?, callback: IOCHTaxiPassengerOrderStatusCallback?) { + if (tag == null || "" == tag) return if (callback == null) { - mControllerStatusCallbackMap.remove(tag); - return; + mOrderStatusCallbackMap.remove(tag) + return } - - mControllerStatusCallbackMap.put(tag,callback); - + mOrderStatusCallbackMap[tag] = callback } - public void setOrderStatusCallback(String tag ,IOCHTaxiPassengerOrderStatusCallback callback) { - if (tag == null || "".equals(tag)) return; - - if (callback == null) { - mOrderStatusCallbackMap.remove(tag); - return; - } - - mOrderStatusCallbackMap.put(tag,callback); - } - - public void setVeloctityCallback(ITaxiPassengerVeloctityCallback callback){ - this.mVeloctityCallback = callback; - } - - public void init( Context context ) { - mContext = context.getApplicationContext(); - initListeners(); + fun init(context: Context) { + mContext = context.applicationContext + initListeners() // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with - RxJavaPlugins.setErrorHandler(new Consumer() { - @Override - public void accept(Throwable e) { - if (e instanceof UndeliverableException) { - e = e.getCause(); - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "UndeliverableException"); - } - if ((e instanceof IOException)) {// - // fine, irrelevant network problem or API that throws on cancellation - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "IOException"); - return; - } - if (e instanceof InterruptedException) { - // fine, some blocking code was interrupted by a dispose call - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "InterruptedException"); - return; - } - if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { - // that's likely a bug in the application - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "NullPointerException or IllegalArgumentException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - if (e instanceof IllegalStateException) { - // that's a bug in RxJava or in a custom operator - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "IllegalStateException"); - Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); - return; - } - CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"Undeliverable exception"); + RxJavaPlugins.setErrorHandler(Consumer { e -> + if (e is UndeliverableException) { + d(SceneConstant.M_TAXI_P + TAG, "UndeliverableException") + return@Consumer } - }); - - startOrStopOrderLoop(); + if (e is IOException) { // + // fine, irrelevant network problem or API that throws on cancellation + d(SceneConstant.M_TAXI_P + TAG, "IOException") + return@Consumer + } + if (e is InterruptedException) { + // fine, some blocking code was interrupted by a dispose call + d(SceneConstant.M_TAXI_P + TAG, "InterruptedException") + return@Consumer + } + if (e is NullPointerException || e is IllegalArgumentException) { + // that's likely a bug in the application + d(SceneConstant.M_TAXI_P + TAG, "NullPointerException or IllegalArgumentException") + Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(Thread.currentThread(), e) + return@Consumer + } + if (e is IllegalStateException) { + // that's a bug in RxJava or in a custom operator + d(SceneConstant.M_TAXI_P + TAG, "IllegalStateException") + Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(Thread.currentThread(), e) + return@Consumer + } + d(SceneConstant.M_TAXI_P + TAG, "Undeliverable exception") + }) + startOrStopOrderLoop() } /** * 订单轮询 初始化主Fragment的Presenter init 调用 */ - public void startOrStopOrderLoop(){ + fun startOrStopOrderLoop() { if (NetworkUtils.isConnected(mContext)) { - startOrStopOrderLoop(true); + startOrStopOrderLoop(true) } } /** * 关闭订单轮训 页面摧毁时 */ - public void release() { - startOrStopOrderLoop(false); - startOrStopQueryOrderRemaining(false); - releaseListeners(); - if(subscribe!=null&&!subscribe.isDisposed()){ - subscribe.dispose(); - } + fun release() { + startOrStopOrderLoop(false) + startOrStopQueryOrderRemaining(false) + releaseListeners() + RxUtils.disposeSubscribe(subscribe) } - private void initListeners() { + private fun initListeners() { // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 - CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); - IntentManager.getInstance().registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); - MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); + CallerAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener) + IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) // 定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,10,mMapLocationListener); + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10, mMapLocationListener) //2021.11.1 自动驾驶路线规划接口 - CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); + CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener) - //增加限速监听 - CallerLimitingVelocityListenerManager.INSTANCE.addListener(TAG,limitingVelocityListener); - - AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext); + startLoopAbnormalFactors(mContext!!) //开启自驾后 异常信息返回 - OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener); - - CallerMsgBoxEventListenerManager.INSTANCE.addListener(TAG,iMsgBoxEventListener); - - TrajectoryAndDistanceManager.INSTANCE.addDistanceListener(TAG,distanceListener); - - TrajectoryAndDistanceManager.INSTANCE.addTrajectoryListener(TAG,trajectoryListener); + OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener) + CallerMsgBoxEventListenerManager.addListener(TAG, iMsgBoxEventListener) + addDistanceListener(TAG, distanceListener) + addTrajectoryListener(TAG, trajectoryListener) } - private void releaseListeners() { - MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - + private fun releaseListeners() { // 注销定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); - + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) MogoAiCloudSocketManager.getInstance(mContext) - .unregisterLifecycleListener(10010); - - CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener); - CallerPlanningRottingListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); - CallerLimitingVelocityListenerManager.INSTANCE.removeListener(limitingVelocityListener); - - AbnormalFactorsLoopManager.INSTANCE.stopLoopAbnormalFactors(); - - OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null); - - CallerMsgBoxEventListenerManager.INSTANCE.removeListener(iMsgBoxEventListener); - - TrajectoryAndDistanceManager.INSTANCE.removeListener(TAG); + .unregisterLifecycleListener(10010) + CallerAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener) + CallerPlanningRottingListenerManager.removeListener(moGoAutopilotPlanningListener) + stopLoopAbnormalFactors() + OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null) + CallerMsgBoxEventListenerManager.removeListener(iMsgBoxEventListener) + removeListener(TAG) } /** * 订单轮训 * @param start true 开启订单轮训 - * false 关闭订单轮训 + * false 关闭订单轮训 */ - private void startOrStopOrderLoop(boolean start) { - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "startOrStopOrderLoop() " + start); + private fun startOrStopOrderLoop(start: Boolean) { + d(SceneConstant.M_TAXI_P + TAG, "startOrStopOrderLoop() $start") if (start) { - TaxiPassengerModelLoopManager.getInstance().startInAndWaitOrdersLoop(); + TaxiPassengerModelLoopManager.getInstance().startInAndWaitOrdersLoop() } else { - TaxiPassengerModelLoopManager.getInstance().stopInAndWaitOrdersLoop(); + TaxiPassengerModelLoopManager.getInstance().stopInAndWaitOrdersLoop() } } @@ -304,775 +235,667 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback * 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时, * 才更新最新进行中单到本地 */ - public void queryInAndWaitOrders() { - TaxiPassengerServiceManager.queryOrdersInAndWaitService(mContext, - new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerOrdersInServiceQueryRespBean data) { - if (data == null || data.data == null) { - return; - } + fun queryInAndWaitOrders() { + TaxiPassengerServiceManager.queryOrdersInAndWaitService( + mContext!!, + object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiPassengerOrdersInServiceQueryRespBean) { + if (data.data == null) { + return + } - //1. 处理进行中订单 - mInServiceList = data.data.servicing; - if (data.data.servicing != null && !data.data.servicing.isEmpty()) { - // 1.1. 当存在进行中单时:对本地currentOrder进行更新 - if (mCurrentOCHOrder == null) { - //1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新 - updateNativeCurrentOrder(data.data.servicing.get(0)); - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } - } - } else { - //1.1.2. 当本地有currentOrder: - //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新 - //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新 - if (!mCurrentOCHOrder.orderNo.equals(data.data.servicing.get(0).orderNo)) { - queryCurOrderStatus(); -// } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) { - } else { //todo 订单拦截放到各自实现去做 - updateNativeCurrentOrder(data.data.servicing.get(0)); - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } - } + //1. 处理进行中订单 + mInServiceList = data.data.servicing + if (data.data.servicing != null && !data.data.servicing.isEmpty()) { + // 1.1. 当存在进行中单时:对本地currentOrder进行更新 + if (currentOCHOrder == null) { + //1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新 + updateNativeCurrentOrder(data.data.servicing[0]) + if (mOrderStatusCallbackMap.isNotEmpty()) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderStatusChanged(currentOCHOrder) } } } else { - // 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更 - if (mCurrentOCHOrder != null) { - queryCurOrderStatus(); + //1.1.2. 当本地有currentOrder: + //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新 + //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新 + if (currentOCHOrder!!.orderNo != data.data.servicing[0].orderNo) { + queryCurOrderStatus() + // } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) { + } else { //todo 订单拦截放到各自实现去做 + updateNativeCurrentOrder(data.data.servicing[0]) + if (mOrderStatusCallbackMap.isNotEmpty()) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderStatusChanged(currentOCHOrder) + } + } } - recoverNaviInfo(); } + } else { + // 1.2. 当无进行中订单时:如果本地也无则跳过;如果本地仍存在currentOrder,查询此单(完成or取消)并通知ui更 + if (currentOCHOrder != null) { + queryCurOrderStatus() + } + recoverNaviInfo() } + } - @Override - public void onError() { - - } - - @Override - public void onFail(int code, String msg) { - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"queryInAndWaitOrders"+code+msg); - } - }); + override fun onError() {} + override fun onFail(code: Int, msg: String) { + e(SceneConstant.M_TAXI_P + TAG, "queryInAndWaitOrders$code$msg") + } + }) } //仅用于轮询时查到本地有mCurrentOCHOrder但请求结果无进行中单or orderId不一致是复查本地currentOrder - private void queryCurOrderStatus() { - if (mCurrentOCHOrder == null) { - return; + private fun queryCurOrderStatus() { + if (currentOCHOrder == null) { + return } - final String orderNo = mCurrentOCHOrder.orderNo; - TaxiPassengerServiceManager.queryOrderById(mContext, orderNo, - new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerOrderQueryRespBean data) { - if (data != null && data.data != null - && mCurrentOCHOrder != null && mCurrentOCHOrder.orderNo.equals(data.data.orderNo)) { - if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.getCode() - || data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.getCode() - || data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.getCode()) { - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(data.data); - } + val orderNo = currentOCHOrder!!.orderNo + TaxiPassengerServiceManager.queryOrderById( + mContext!!, orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiPassengerOrderQueryRespBean) { + if (data.data != null && currentOCHOrder != null && currentOCHOrder!!.orderNo == data.data.orderNo) { + if (data.data.orderStatus == TaxiPassengerOrderStatusEnum.Cancel.code || data.data.orderStatus == TaxiPassengerOrderStatusEnum.JourneyCompleted.code || data.data.orderStatus == TaxiPassengerOrderStatusEnum.None.code) { + if (mOrderStatusCallbackMap.isNotEmpty()) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderStatusChanged(data.data) } - clearCurrentOCHOrder(); - } else { - updateNativeCurrentOrder(data.data); - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } + } + clearCurrentOCHOrder() + } else { + updateNativeCurrentOrder(data.data) + if (mOrderStatusCallbackMap.size > 0) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderStatusChanged(currentOCHOrder) } } } } + } - @Override - public void onFail(int code, String msg) { - - } - }); - } - - // 获取当前订单 - public TaxiPassengerOrderQueryRespBean.Result getCurrentOCHOrder() { - return mCurrentOCHOrder; + override fun onFail(code: Int, msg: String) {} + }) } // 获取当前订单状态 - public TaxiPassengerOrderStatusEnum getCurOrderStatus() { - TaxiPassengerOrderQueryRespBean.Result order = TaxiPassengerModel.getInstance().getCurrentOCHOrder(); - if (order == null) { - return TaxiPassengerOrderStatusEnum.None; + val curOrderStatus: TaxiPassengerOrderStatusEnum + get() { + val order: TaxiPassengerOrderQueryRespBean.Result = + currentOCHOrder + ?: return TaxiPassengerOrderStatusEnum.None + return valueOf(order.orderStatus) } - return TaxiPassengerOrderStatusEnum.valueOf(order.orderStatus); - } //更新本地currentOrder信息,并保存订单到本地避免车机重启丢失数据 - private void updateNativeCurrentOrder(TaxiPassengerOrderQueryRespBean.Result data) { + private fun updateNativeCurrentOrder(data: TaxiPassengerOrderQueryRespBean.Result?) { if (data == null) { - return; + return } - mCurrentOCHOrder = data; - SharedPrefsMgr.getInstance(mContext).putString(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER, - GsonUtil.jsonFromObject(data)); + currentOCHOrder = data + SharedPrefsMgr.getInstance(mContext!!).putString( + TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER, + GsonUtil.jsonFromObject(data) + ) } //清除订单信息 - public void clearCurrentOCHOrder() { - mCurrentOCHOrder = null; - clearAutopilotControlParameters(); - SharedPrefsMgr.getInstance(mContext).remove(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER); + fun clearCurrentOCHOrder() { + currentOCHOrder = null + clearAutopilotControlParameters() + SharedPrefsMgr.getInstance(mContext!!).remove(TaxiPassengerConst.SP_KEY_OCH_TAXI_ORDER) } //检测当前订单 - public boolean checkCurrentOCHOrder() { - if ( mCurrentOCHOrder != null - && mCurrentOCHOrder.startSiteGcjPoint != null - && mCurrentOCHOrder.endSiteGcjPoint != null) { - return true; - } - return false; + fun checkCurrentOCHOrder(): Boolean { + return currentOCHOrder != null && currentOCHOrder!!.startSiteGcjPoint != null && currentOCHOrder!!.endSiteGcjPoint != null } // TODO: 2021/9/12 - public void calculateTravelDistance(MogoLocation carLocation){ - if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size()>0) { - double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0); - double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1); - double distance = CoordinateUtils.calculateLineDistance( - endLon, endLat, - carLocation.getLongitude(), carLocation.getLatitude()); - mCurrentOCHOrder.decreaseTravelDistance(distance); + fun calculateTravelDistance(carLocation: MogoLocation) { + if (checkCurrentOCHOrder() && currentOCHOrder!!.endSiteGcjPoint.size > 0) { + val endLon = currentOCHOrder!!.endSiteGcjPoint[0] + val endLat = currentOCHOrder!!.endSiteGcjPoint[1] + val distance = CoordinateUtils.calculateLineDistance( + endLon, endLat, + carLocation.longitude, carLocation.latitude + ).toDouble() + currentOCHOrder!!.decreaseTravelDistance(distance) } } - //监听网络变化,避免启动机器时无网导致无法更新订单信息 - private final IDistanceListener distanceListener = distance -> { + private val distanceListener: IDistanceListener = object : IDistanceListener { + override fun distanceCallback(distance: Float) { - }; - - private final ITrajectoryListener trajectoryListener = (routeArrivied, routeArriving, location) -> { - List routeArriviedTemp = new ArrayList<>(); - List routeArrivingTemp = new ArrayList<>(); - LatLng temp; - for (MogoLocation mogoLocation : routeArrivied) { - temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude()); - routeArriviedTemp.add(temp); } - for (MogoLocation mogoLocation : routeArriving) { - temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude()); - routeArrivingTemp.add(temp); - } - mAutopilotPlanningCallback.routeResultByServer(routeArriviedTemp,routeArrivingTemp,location); - setRouteLineMarker(); - }; - private final IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() { - @Override - public void onIntentReceived( String intentStr, Intent intent ) { - CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "onIntentReceived = %s", intentStr ); - if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) { - if ( NetworkUtils.isConnected( mContext ) ) { - startOrStopOrderLoop(true); + } + private val trajectoryListener: ITrajectoryListener = + object : ITrajectoryListener { + override fun trajectoryCallback( + routeArrivied: MutableList, + routeArriving: MutableList, + location: MogoLocation + ) { + val routeArriviedTemp: MutableList = ArrayList() + val routeArrivingTemp: MutableList = ArrayList() + var temp: LatLng + for (mogoLocation in routeArrivied) { + temp = LatLng(mogoLocation.latitude, mogoLocation.longitude) + routeArriviedTemp.add(temp) } + for (mogoLocation in routeArriving) { + temp = LatLng(mogoLocation.latitude, mogoLocation.longitude) + routeArrivingTemp.add(temp) + } + mAutopilotPlanningCallback!!.routeResultByServer( + routeArriviedTemp, + routeArrivingTemp, + location + ) + setRouteLineMarker() } } - }; - - private final IMogoStatusChangedListener mMogoStatusChangedListener = new IMogoStatusChangedListener() { - // VR mode变更回调 - @Override - public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) { - if (StatusDescriptor.VR_MODE == descriptor) { - if (mControllerStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ - callback.onVRModeChanged(isTrue); - } - } + private val mNetWorkIntentListener = IMogoIntentListener { intentStr, intent -> + d(SceneConstant.M_TAXI_P + TAG, "onIntentReceived = %s", intentStr) + if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) { + if (NetworkUtils.isConnected(mContext)) { + startOrStopOrderLoop(true) } } - }; + } // 自车定位 - private final IMoGoChassisLocationGCJ02Listener mMapLocationListener = new IMoGoChassisLocationGCJ02Listener() { - @Override - public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { - //位置变化时,通过围栏判断是否到达x点 - if (null == gnssInfo) return; - if (checkCurrentOCHOrder()) { - if (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.OnTheWayToEnd) { - calculateTravelDistance(gnssInfo); + private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = + object : IMoGoChassisLocationGCJ02Listener { + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + //位置变化时,通过围栏判断是否到达x点 + if (null == mogoLocation) return + if (checkCurrentOCHOrder()) { + if (curOrderStatus === TaxiPassengerOrderStatusEnum.OnTheWayToEnd) { + calculateTravelDistance(mogoLocation) + } } } - mLongitude = gnssInfo.getLongitude(); - mLatitude = gnssInfo.getLatitude(); - - mLocation = gnssInfo; - // CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"mLongitude = "+mLongitude+", mLatitude = "+mLatitude); - for (IOCHTaxiPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ - callback.onCarLocationChanged(gnssInfo); - } } - - }; - - private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ - - @Override - public void onAutopilotDockerInfo(@NonNull String dockerVersion) { - } - - @Override - public void onAutopilotRouteLineId(long lineId) { - } - - @Override - public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { - } - - @Override - public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { - } - - @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - } - - private boolean arriveAtEnd = false; //乘客app专用字段 - - @Override - public void onAutopilotStatusResponse(int state) { + private val mGoAutopilotStatusListener: IMoGoAutopilotStatusListener = + object : IMoGoAutopilotStatusListener { + private var arriveAtEnd = false //乘客app专用字段 + override fun onAutopilotStatusResponse(state: Int) { // CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "state = %s", state ); - if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); - if (mCurrentOCHOrder != null - && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.UserArriveAtStart) { - TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, true, - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); - startServicePilotDone(); - } - } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - if (FunctionBuildConfig.isDemoMode - && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { - // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态 - if (!arriveAtEnd) { - return; - } else { - arriveAtEnd = false; + if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { + if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotRunning() + if (currentOCHOrder != null + && curOrderStatus === TaxiPassengerOrderStatusEnum.UserArriveAtStart + ) { + TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent( + false, + true, + currentOCHOrder!!.startSiteAddr, + currentOCHOrder!!.endSiteAddr, + currentOCHOrder!!.orderNo + ) + startServicePilotDone() } - } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable(); - } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { - if (FunctionBuildConfig.isDemoMode - && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { - // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态 - if (!arriveAtEnd) { - return; - } else { - arriveAtEnd = false; + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + if (FunctionBuildConfig.isDemoMode + && isPassenger(FunctionBuildConfig.appIdentityMode) + ) { + // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态 + arriveAtEnd = if (!arriveAtEnd) { + return + } else { + false + } } + if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotEnable() + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + if (FunctionBuildConfig.isDemoMode + && isPassenger(FunctionBuildConfig.appIdentityMode) + ) { + // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态 + arriveAtEnd = if (!arriveAtEnd) { + return + } else { + false + } + } + if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotDisable() } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable(); - } - } - - @Override - public void onAutopilotSNRequest() { - } - - @Override - public void onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) { - if (FunctionBuildConfig.isDemoMode - && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { - arriveAtEnd = true; } - if (arrivalNotification == null || !checkCurrentOCHOrder() - || (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtEnd)) { - return; + override fun onAutopilotSNRequest() {} + override fun onAutopilotArriveAtStation(arrivalNotification: ArrivalNotification?) { + if (FunctionBuildConfig.isDemoMode + && isPassenger(FunctionBuildConfig.appIdentityMode) + ) { + arriveAtEnd = true + } + if (arrivalNotification == null || !checkCurrentOCHOrder() || curOrderStatus === TaxiPassengerOrderStatusEnum.ArriveAtEnd) { + return + } + } + + override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {} + } + private val moGoAutopilotPlanningListener: IMoGoPlanningRottingListener = + object : IMoGoPlanningRottingListener { + override fun onAutopilotRotting(globalPathResp: GlobalPathResp?) { + if (null != globalPathResp && globalPathResp.wayPointsList.size > 0) { + calculateRouteLineSum( + coordinateConverterWgsToGcjListCommon( + mContext, + globalPathResp.wayPointsList + ) + ) + startToRouteAndWipe(globalPathResp.wayPointsList) + } } } - - @Override - public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { - } - }; - - private final IMoGoPlanningRottingListener moGoAutopilotPlanningListener = new IMoGoPlanningRottingListener(){ - - @Override - public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { - if (null != routeList && routeList.getWayPointsList().size() > 0){ - calculateRouteLineSum(CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext,routeList.getWayPointsList())); - startToRouteAndWipe(routeList.getWayPointsList()); + private val mAdasStartFailureListener: OchAdasStartFailureCallback = object : OchAdasStartFailureCallback { + override fun onStartAutopilotFailure(startFailedCode: String, startFailedMessage: String) { + TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage) } } - - }; - - private final OchAdasStartFailureCallback mAdasStartFailureListener = new OchAdasStartFailureCallback() { - @Override - public void onStartAutopilotFailure(@NotNull String startFailedCode, @NonNull String startFailedMessage) { - TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage); - } - }; - - private final IMsgBoxEventListener iMsgBoxEventListener = new IMsgBoxEventListener() { - @Override - public void onBubbleReportClickEvent(@NonNull MsgBoxBean msgBoxBean) { - - } - - @Override - public void onBubbleV2XClickEvent(@NonNull MsgBoxBean msgBoxBean) { - - } - - @Override - public void onBubbleOperationClickEvent(@NonNull MsgBoxBean msgBoxBean) { - - } - - @Override - public void onUpdateTipEvent(boolean isShow) { - - } - - @Override - public void onSummaryClickEvent() { - if (mCurrentOCHOrder == null){ - ToastUtils.showLong("行程已结束"); - }else { - OverlayLeftViewUtils.INSTANCE.transmissionIndexGet(OverlayLeftViewUtils.OVERVIEW); + private val iMsgBoxEventListener: IMsgBoxEventListener = object : IMsgBoxEventListener { + override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) {} + override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) {} + override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) {} + override fun onUpdateTipEvent(isShow: Boolean) {} + override fun onSummaryClickEvent() { + if (currentOCHOrder == null) { + ToastUtils.showLong("行程已结束") + } else { + transmissionIndexGet(OverlayLeftViewUtils.OVERVIEW) } } - }; - - public void startToRouteAndWipe(List models) { - List locationsModels = CoordinateCalculateRouteUtil - .coordinateConverterWgsToGcjLocations(mContext,models); - mLocationsModels.clear(); - mLocationsModels.addAll(locationsModels); - startOrStopRouteAndWipe(true); - showRottingMapView(); - } - - public void showRottingMapView(){ - AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi(); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.showRottingMapView(); - } } - public void startNaviByAmap() { - if (mCurrentOCHOrder != null && - mCurrentOCHOrder.orderStatus == TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode()){ - AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi(); + fun startToRouteAndWipe(models: List) { + val locationsModels: List = coordinateConverterWgsToGcjLocations(mContext, models) + mLocationsModels.clear() + mLocationsModels.addAll(locationsModels) + showRottingMapView() + } - double orderEndStationLat = mCurrentOCHOrder.endSiteGcjPoint.get(1); - double orderEndStationLng = mCurrentOCHOrder.endSiteGcjPoint.get(0); - NaviLatLng startNaviLatLng = new NaviLatLng(mLatitude, mLongitude); - NaviLatLng endNaviLatLng = new NaviLatLng(orderEndStationLat,orderEndStationLng); - AmapNaviToDestinationModel.getInstance(mContext).initAMapNavi(startNaviLatLng, endNaviLatLng); - AmapNaviToDestinationModel.getInstance(mContext).setVoiceIsMute(false); + private fun showRottingMapView() { + AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi() + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback!!.showRottingMapView() } } - /** - * 实时轨迹擦除 - * @param isStart - */ - public void startOrStopRouteAndWipe(boolean isStart){ - + fun startNaviByAmap() { + if (currentOCHOrder != null && + currentOCHOrder!!.orderStatus == TaxiPassengerOrderStatusEnum.OnTheWayToEnd.code + ) { + AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi() + val orderEndStationLat = currentOCHOrder!!.endSiteGcjPoint[1] + val orderEndStationLng = currentOCHOrder!!.endSiteGcjPoint[0] + val currentLocation = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val startNaviLatLng = NaviLatLng(currentLocation.latitude, currentLocation.longitude) + val endNaviLatLng = NaviLatLng(orderEndStationLat, orderEndStationLng) + AmapNaviToDestinationModel.getInstance(mContext) + .initAMapNavi(startNaviLatLng, endNaviLatLng) + AmapNaviToDestinationModel.getInstance(mContext).setVoiceIsMute(false) + } } /** * 设置小地图路径的起终点marker */ - public void setRouteLineMarker(){ - if (mCurrentOCHOrder.startSiteGcjPoint == null || mCurrentOCHOrder.startSiteGcjPoint.isEmpty() || mCurrentOCHOrder.startSiteGcjPoint.size() < 2|| - mCurrentOCHOrder.endSiteGcjPoint == null || mCurrentOCHOrder.endSiteGcjPoint.isEmpty() || mCurrentOCHOrder.endSiteGcjPoint.size() < 2) { - setMarker(null,null); - return; + fun setRouteLineMarker() { + if (currentOCHOrder!!.startSiteGcjPoint == null || currentOCHOrder!!.startSiteGcjPoint.isEmpty() || currentOCHOrder!!.startSiteGcjPoint.size < 2 || currentOCHOrder!!.endSiteGcjPoint == null || currentOCHOrder!!.endSiteGcjPoint.isEmpty() || currentOCHOrder!!.endSiteGcjPoint.size < 2) { + setMarker(null, null) + return } - LatLng startStation = new LatLng(mCurrentOCHOrder.startSiteGcjPoint.get(1),mCurrentOCHOrder.startSiteGcjPoint.get(0)); - LatLng endStation = new LatLng(mCurrentOCHOrder.endSiteGcjPoint.get(1),mCurrentOCHOrder.endSiteGcjPoint.get(0)); - setMarker(startStation,endStation); + val startStation = LatLng( + currentOCHOrder!!.startSiteGcjPoint[1], currentOCHOrder!!.startSiteGcjPoint[0] + ) + val endStation = LatLng( + currentOCHOrder!!.endSiteGcjPoint[1], currentOCHOrder!!.endSiteGcjPoint[0] + ) + setMarker(startStation, endStation) } - private void setMarker(LatLng startStation,LatLng endStation){ + private fun setMarker(startStation: LatLng?, endStation: LatLng?) { if (mAutopilotPlanningCallback != null) { - mAutopilotPlanningCallback.setLineMarker(startStation,endStation); + mAutopilotPlanningCallback!!.setLineMarker(startStation, endStation) } } - /** - * 限速监听 - */ - private final ILimitingVelocityListener limitingVelocityListener = new ILimitingVelocityListener(){ - - @Override - public void onUnion(int limitingVelocity, @NonNull DataSourceType sourceType) { - - } - - @Override - public void onLimitingVelocityChange(int limitingVelocity, DataSourceType dataSourceType) { - if (mVeloctityCallback != null){ - mVeloctityCallback.onLimitingVelocityChange(limitingVelocity); - } - } - }; - /** * 导航订单起点到终点 获得剩余时间,里程,预计到达时间 */ - public void initGeocodeSearch() { - if (mCurrentOCHOrder != null){ - TaxiPassengerGeocodeSearchModel.getInstance(mContext).initGeocodeSearch(); - TaxiPassengerGeocodeSearchModel.getInstance(mContext).setOCHTaciNaviChangedCallback(this); + fun initGeocodeSearch() { + if (currentOCHOrder != null) { + TaxiPassengerGeocodeSearchModel.getInstance(mContext).initGeocodeSearch() + TaxiPassengerGeocodeSearchModel.getInstance(mContext) + .setOCHTaciNaviChangedCallback(this) } } - public void destoryGeocodeSearch(){ - TaxiPassengerGeocodeSearchModel.getInstance(mContext).destroyGeocodeSearch(); + fun destoryGeocodeSearch() { + TaxiPassengerGeocodeSearchModel.getInstance(mContext).destroyGeocodeSearch() } - public void startOrStopQueryOrderRemaining(boolean isStart){ - if (isStart){ - TaxiPassengerModelLoopManager.getInstance().startQueryOrderRemainingLoop(); - }else { - TaxiPassengerModelLoopManager.getInstance().stopQueryOrderRemainingLoop(); + fun startOrStopQueryOrderRemaining(isStart: Boolean) { + if (isStart) { + TaxiPassengerModelLoopManager.getInstance().startQueryOrderRemainingLoop() + } else { + TaxiPassengerModelLoopManager.getInstance().stopQueryOrderRemainingLoop() } } /** * 查询订单剩余里程和时间 */ - public void queryOrderRemaining(){ - if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.queryOrderRemaining(mContext, mCurrentOCHOrder.orderNo, new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerOrderQueryRemainingResp data) { - if (data != null && data.data!=null){ - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"distance = "+data.data.distance+" ,duration = "+data.data.duration); - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderDistToEndChanged(data.data.distance,data.data.duration); + fun queryOrderRemaining() { + if (currentOCHOrder == null) return + TaxiPassengerServiceManager.queryOrderRemaining( + mContext!!, + currentOCHOrder!!.orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiPassengerOrderQueryRemainingResp) { + if (data.data != null) { + e( + SceneConstant.M_TAXI_P + TAG, + "distance = " + data.data.distance + " ,duration = " + data.data.duration + ) + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderDistToEndChanged( + data.data.distance, + data.data.duration + ) + } } } - } - @Override - public void onFail(int code, String msg) { - - } - }); + override fun onFail(code: Int, msg: String) {} + }) } - public void queryOrderRouteList() { - if (mCurrentOCHOrder == null) return; - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "--route--- queryOrderRouteList"); - TaxiPassengerServiceManager.queryOrderRouteList(mContext, mCurrentOCHOrder.orderNo, new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerQueryOrderRouteResp data) { - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "--route---"+GsonUtil.jsonFromObject(data)); - if (data != null && data.data != null && data.data != null && data.data.size() > 0){ - if (mAutopilotPlanningCallback != null){ - calculateRouteLineSum(data.data); -// if (mAutopilotPlanningCallback != null){ -// mAutopilotPlanningCallback.setLineMarker(data.data); -// } - mLocationsModels.clear(); - List locationsModels = CoordinateCalculateRouteUtil. - coordinateConverterLatlngToLocation(data.data); - mLocationsModels.addAll(locationsModels); - startOrStopRouteAndWipe(true); - } - }else { - subscribe = Observable.timer(delayTime, TimeUnit.SECONDS).subscribe(aLong -> { - queryOrderRouteList(); - }); - } - } + fun queryOrderRouteList() { + if (currentOCHOrder == null) return + d(SceneConstant.M_TAXI_P + TAG, "--route--- queryOrderRouteList") + TaxiPassengerServiceManager.queryOrderRouteList( + mContext!!, + currentOCHOrder!!.orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiPassengerQueryOrderRouteResp) { + d(SceneConstant.M_TAXI_P + TAG, "--route---" + GsonUtil.jsonFromObject(data)) + if (data.data != null && data.data != null && data.data.size > 0) { + if (mAutopilotPlanningCallback != null) { + calculateRouteLineSum(data.data) + mLocationsModels.clear() + val locationsModels = coordinateConverterLatlngToLocation(data.data) + mLocationsModels.addAll(locationsModels) + } + } else { + RxUtils.disposeSubscribe(subscribe) + subscribe = RxUtils.createSubscribe { + queryOrderRouteList() + } + } + } - @Override - public void onFail(int code, String msg) { - subscribe = Observable.timer(delayTime, TimeUnit.SECONDS).subscribe(aLong -> { - queryOrderRouteList(); - }); - } - }); + override fun onFail(code: Int, msg: String) { + RxUtils.disposeSubscribe(subscribe) + subscribe = RxUtils.createSubscribe { + queryOrderRouteList() + } + } + }) } - @Override - public void onCurrentRoadName(String currentRoadName) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentRoadName(currentRoadName); + override fun onCurrentRoadName(currentRoadName: String) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentRoadName(currentRoadName) } } /** * 订单结束或者取消的时候, 刷新导航标识位以及缓存的数据 */ - public void recoverNaviInfo(){ - SharedPrefsMgr.getInstance(mContext).remove(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS); + fun recoverNaviInfo() { + SharedPrefsMgr.getInstance(mContext!!).remove(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS) } - public void calculateRouteLineSum(List points){ - float sumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(points); - SharedPrefsMgr.getInstance(mContext).putInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,(int) sumLength); + fun calculateRouteLineSum(points: List?) { + val sumLength = calculateRouteSumLength(points) + SharedPrefsMgr.getInstance(mContext!!) + .putInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, sumLength.toInt()) } - public void checkPhoneAndUpdateStatus(String phoneTail,ITaxiPassengerCommonCallback commonCallback) { - if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.checkPhoneAndUpdateOrderStatus(mContext, mCurrentOCHOrder.orderNo, - phoneTail, new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerBaseRespBean data) { - if (data != null && data.code == 0 && mCurrentOCHOrder != null){ - //乘客验证成功,更新订单状态为 "乘客已上车", 立马弹出乘客开始行程页面,不再等待轮询 - mCurrentOCHOrder.orderStatus = TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode(); - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onCurrentOrderStatusChanged(mCurrentOCHOrder); - } + fun checkPhoneAndUpdateStatus( + phoneTail: String?, + commonCallback: ITaxiPassengerCommonCallback? + ) { + if (currentOCHOrder == null) return + TaxiPassengerServiceManager.checkPhoneAndUpdateOrderStatus( + mContext!!, currentOCHOrder!!.orderNo, + phoneTail, object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiPassengerBaseRespBean) { + if (data.code == 0 && currentOCHOrder != null) { + //乘客验证成功,更新订单状态为 "乘客已上车", 立马弹出乘客开始行程页面,不再等待轮询 + currentOCHOrder!!.orderStatus = + TaxiPassengerOrderStatusEnum.UserArriveAtStart.code + if (mOrderStatusCallbackMap.isNotEmpty()) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onCurrentOrderStatusChanged(currentOCHOrder) } } - if(commonCallback!=null) { - commonCallback.onCommonCallback(); - } - } + commonCallback?.onCommonCallback() + } - @Override - public void onError() { - ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!"); - } + override fun onError() { + ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!") + } - @Override - public void onFail(int code, String msg) { - ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!"); - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"提交用户输入的手机后4位、并进行状态扭转 后台结果错误"+code+msg); - } - }); + override fun onFail(code: Int, msg: String) { + ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!") + e( + SceneConstant.M_TAXI_P + TAG, + "提交用户输入的手机后4位、并进行状态扭转 后台结果错误$code$msg" + ) + } + }) } - public void arrivedAndScore(TaxiPassengerScoreUpdateOrderReqBean taxiPassengerScoreUpdateOrderReqBean , ITaxiPassengerCommonValueCallback commonCallback) { - if (taxiPassengerScoreUpdateOrderReqBean.orderNo == null) return; - TaxiPassengerServiceManager.arrivedAndScore(mContext,taxiPassengerScoreUpdateOrderReqBean, - new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerBaseRespBean data) { - if(commonCallback!=null) { - commonCallback.onCommonCallback(true); - } - } + fun arrivedAndScore( + taxiPassengerScoreUpdateOrderReqBean: TaxiPassengerScoreUpdateOrderReqBean, + commonCallback: ITaxiPassengerCommonValueCallback? + ) { + if (taxiPassengerScoreUpdateOrderReqBean.orderNo == null) return + TaxiPassengerServiceManager.arrivedAndScore( + mContext!!, taxiPassengerScoreUpdateOrderReqBean, + object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiPassengerBaseRespBean) { + commonCallback?.onCommonCallback(true) + } - @Override - public void onError() { - ToastUtils.showLong("网络错误请稍后再试"); - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"对订单进行打分 1-5分 网络错误"); - if(commonCallback!=null) { - commonCallback.onCommonCallback(false); - } - } + override fun onError() { + ToastUtils.showLong("网络错误请稍后再试") + e(SceneConstant.M_TAXI_P + TAG, "对订单进行打分 1-5分 网络错误") + commonCallback?.onCommonCallback(false) + } - @Override - public void onFail(int code, String msg) { - CallerLogger.INSTANCE.e(M_TAXI_P + TAG,"对订单进行打分 1-5分 后台结果错误"+code+msg); - if(commonCallback!=null) { - commonCallback.onCommonCallback(false); - } - } - }); + override fun onFail(code: Int, msg: String) { + e(SceneConstant.M_TAXI_P + TAG, "对订单进行打分 1-5分 后台结果错误$code$msg") + commonCallback?.onCommonCallback(false) + } + }) } - public void loopQueryPilotStatus(){ - if (mCurrentOCHOrder == null) return; - TaxiPassengerServiceManager.queryPilotStatus(mContext, mCurrentOCHOrder.orderNo, - new OchCommonServiceCallback() { - @Override - public void onSuccess(TaxiPassengerBaseRespBean data) { - if (data != null && data.code == 0 && data.data.equals(true)) { - updateAutopilotStatus(true); - startOrStopReadyToAutopilotLoop(false); - } + fun loopQueryPilotStatus() { + if (currentOCHOrder == null) return + TaxiPassengerServiceManager.queryPilotStatus( + mContext!!, currentOCHOrder!!.orderNo, + object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiPassengerBaseRespBean) { + if (data.code == 0 && data.data == true) { + updateAutopilotStatus(true) + startOrStopReadyToAutopilotLoop(false) } + } - @Override - public void onFail(int code, String msg) { - updateAutopilotStatus(false); - } - }); + override fun onFail(code: Int, msg: String) { + updateAutopilotStatus(false) + } + }) } - public void updateAutopilotStatus(boolean isBoarded){ - if (mOrderStatusCallbackMap.size() > 0) { - for (IOCHTaxiPassengerOrderStatusCallback callback :mOrderStatusCallbackMap.values()){ - callback.onDriverHasCheckedPilotCondition(isBoarded); + fun updateAutopilotStatus(isBoarded: Boolean) { + if (mOrderStatusCallbackMap.isNotEmpty()) { + for (callback in mOrderStatusCallbackMap.values) { + callback.onDriverHasCheckedPilotCondition(isBoarded) } } } - public void startDriverReadyToAutopilotLoop(){ + fun startDriverReadyToAutopilotLoop() { if (NetworkUtils.isConnected(mContext)) { - startOrStopReadyToAutopilotLoop(true); + startOrStopReadyToAutopilotLoop(true) } } - public void startOrStopReadyToAutopilotLoop(boolean isStart) { - if (isStart){ - TaxiPassengerModelLoopManager.getInstance().startReadyToAutopilot(); - }else { - TaxiPassengerModelLoopManager.getInstance().stopReadyToAutopilot(); + fun startOrStopReadyToAutopilotLoop(isStart: Boolean) { + if (isStart) { + TaxiPassengerModelLoopManager.getInstance().startReadyToAutopilot() + } else { + TaxiPassengerModelLoopManager.getInstance().stopReadyToAutopilot() } } - public void startServicePilotDone(){ - if (mCurrentOCHOrder == null) return; - TaxiPassengerStartReqBean.Result result = new TaxiPassengerStartReqBean.Result(); - result.lat = mLatitude; - result.lon = mLongitude; - TaxiPassengerServiceManager.startServicePilotDone(mContext, - mCurrentOCHOrder.orderNo, result, - new OchCommonServiceCallback(){ - - @Override - public void onSuccess(TaxiPassengerBaseRespBean data) { - - } - - @Override - public void onFail(int code, String msg) { + fun startServicePilotDone() { + if (currentOCHOrder == null) return + val result = TaxiPassengerStartReqBean.Result() + val currentLocation = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + result.lat = currentLocation.latitude + result.lon = currentLocation.longitude + TaxiPassengerServiceManager.startServicePilotDone( + mContext!!, + currentOCHOrder!!.orderNo, result, + object : OchCommonServiceCallback { + override fun onSuccess(data: TaxiPassengerBaseRespBean) {} + override fun onFail(code: Int, msg: String) { // ToastUtils.showShort(msg); - } - }); + } + }) } - public void startAutopilot() { + fun startAutopilot() { if (!checkCurrentOCHOrder()) { - CallerLogger.INSTANCE.e(M_TAXI_P + TAG, "no order or order is empty."); - ToastUtils.showShort("当前订单不存在或异常!"); - return; + e(SceneConstant.M_TAXI_P + TAG, "no order or order is empty.") + ToastUtils.showShort("当前订单不存在或异常!") + return } - - if (mCurrentOCHOrder.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.getCode()){ - startServicePilotDone(); + if (currentOCHOrder!!.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.code) { + startServicePilotDone() } - - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { - ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + - ", 请稍候重试"); - + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().autopilotAbilityStatus) { + ToastUtils.showLong( + OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + + ", 请稍候重试" + ) TaxiPassengerAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent( - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo, - OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason()); - return; + currentOCHOrder!!.startSiteAddr, + currentOCHOrder!!.endSiteAddr, + currentOCHOrder!!.orderNo, + OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + ) + return } - - AutopilotControlParameters parameters = initAutopilotControlParameters(); - if (parameters == null){ - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "AutopilotControlParameters is empty."); - return; + val parameters = initAutopilotControlParameters() + if (parameters == null) { + d(SceneConstant.M_TAXI_P + TAG, "AutopilotControlParameters is empty.") + return } - - CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters); - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "start autopilot with parameter: %s" - , GsonUtil.jsonFromObject(parameters) - + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr - + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr); - - - TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, false, - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); + startAutoPilot(parameters) + d( + SceneConstant.M_TAXI_P + TAG, + "start autopilot with parameter: %s", + GsonUtil.jsonFromObject(parameters) + + " ,startSiteName=" + currentOCHOrder!!.startSiteAddr + + " ,endSiteName=" + currentOCHOrder!!.endSiteAddr + ) + TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent( + false, + false, + currentOCHOrder!!.startSiteAddr, + currentOCHOrder!!.endSiteAddr, + currentOCHOrder!!.orderNo + ) } - private AutopilotControlParameters initAutopilotControlParameters() { + private fun initAutopilotControlParameters(): AutopilotControlParameters? { if (!checkCurrentOCHOrder()) { - CallerLogger.INSTANCE.e(M_TAXI_P + TAG, "no order or order is empty."); - ToastUtils.showShort("当前订单不存在或异常!"); - return null; + e(SceneConstant.M_TAXI_P + TAG, "no order or order is empty.") + ToastUtils.showShort("当前订单不存在或异常!") + return null } - - AutopilotControlParameters parameters = new AutopilotControlParameters(); - double startWgsLon = mCurrentOCHOrder.startSitePoint.get(0); - double startWgsLat = mCurrentOCHOrder.startSitePoint.get(1); - double endWgsLon = mCurrentOCHOrder.endSitePoint.get(0); - double endWgsLat = mCurrentOCHOrder.endSitePoint.get(1); - - parameters.vehicleType = mCurrentOCHOrder.businessType; - parameters.startName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.startSiteAddr); // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) - parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) - parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon); - parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon); - + val parameters = AutopilotControlParameters() + val startWgsLon = currentOCHOrder!!.startSitePoint[0] + val startWgsLat = currentOCHOrder!!.startSitePoint[1] + val endWgsLon = currentOCHOrder!!.endSitePoint[0] + val endWgsLat = currentOCHOrder!!.endSitePoint[1] + parameters.vehicleType = currentOCHOrder!!.businessType + parameters.startName = + PinYinUtil.getPinYinHeadChar(currentOCHOrder!!.startSiteAddr) // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) + parameters.endName = + PinYinUtil.getPinYinHeadChar(currentOCHOrder!!.endSiteAddr) // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) + parameters.startLatLon = AutoPilotLonLat(startWgsLat, startWgsLon) + parameters.endLatLon = AutoPilotLonLat(endWgsLat, endWgsLon) if (parameters.autoPilotLine == null) { - parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( - mCurrentOCHOrder.lineId, - mCurrentOCHOrder.csvFileUrl, mCurrentOCHOrder.csvFileMd5, - mCurrentOCHOrder.txtFileUrl, mCurrentOCHOrder.txtFileMd5, - mCurrentOCHOrder.contrailSaveTime, mCurrentOCHOrder.carModel, - mCurrentOCHOrder.csvFileUrlDPQP, mCurrentOCHOrder.csvFileMd5DPQP, - mCurrentOCHOrder.txtFileUrlDPQP, mCurrentOCHOrder.txtFileMd5DPQP, - mCurrentOCHOrder.contrailSaveTimeDPQP); + parameters.autoPilotLine = AutoPilotLine( + currentOCHOrder!!.lineId, + currentOCHOrder!!.csvFileUrl, currentOCHOrder!!.csvFileMd5, + currentOCHOrder!!.txtFileUrl, currentOCHOrder!!.txtFileMd5, + currentOCHOrder!!.contrailSaveTime, currentOCHOrder!!.carModel, + currentOCHOrder!!.csvFileUrlDPQP, currentOCHOrder!!.csvFileMd5DPQP, + currentOCHOrder!!.txtFileUrlDPQP, currentOCHOrder!!.txtFileMd5DPQP, + currentOCHOrder!!.contrailSaveTimeDPQP + ) } - - return parameters; + return parameters } /** * 将业务订单信息保存,鹰眼可取用 */ - public void updateAutopilotControlParameters() { - - AutopilotControlParameters parameters = initAutopilotControlParameters(); - if (null == parameters){ - CallerLogger.INSTANCE.e(M_TAXI_P + TAG, "AutopilotControlParameters is empty."); - return; + fun updateAutopilotControlParameters() { + val parameters = initAutopilotControlParameters() + if (null == parameters) { + e(SceneConstant.M_TAXI_P + TAG, "AutopilotControlParameters is empty.") + return } - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "AutopilotControlParameters is update."); - CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters); + d(SceneConstant.M_TAXI_P + TAG, "AutopilotControlParameters is update.") + updateAutopilotControlParameters(parameters) } - public void clearAutopilotControlParameters(){ - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "AutopilotControlParameters is clear."); - CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null); + fun clearAutopilotControlParameters() { + d(SceneConstant.M_TAXI_P + TAG, "AutopilotControlParameters is clear.") + updateAutopilotControlParameters(null) } - - private void runOnUIThread(Runnable executor) { - if (executor == null) { - return; - } - if (Looper.myLooper() != Looper.getMainLooper()) { - UiThreadHandler.post(executor); - } else { - executor.run(); + fun setStation() { + if (currentOCHOrder != null) { + val startStation = MogoLocation() + startStation.longitude = currentOCHOrder!!.startSiteGcjPoint[0] + startStation.latitude = currentOCHOrder!!.startSiteGcjPoint[1] + val endStation = MogoLocation() + endStation.longitude = currentOCHOrder!!.endSiteGcjPoint[0] + endStation.latitude = currentOCHOrder!!.endSiteGcjPoint[1] + setStationPoint(startStation, endStation, currentOCHOrder!!.lineId) } } - public void setStation(){ - if(mCurrentOCHOrder!=null){ - MogoLocation startStation = new MogoLocation(); - startStation.setLongitude(mCurrentOCHOrder.startSiteGcjPoint.get(0)); - startStation.setLatitude(mCurrentOCHOrder.startSiteGcjPoint.get(1)); - MogoLocation endStation = new MogoLocation(); - endStation.setLongitude(mCurrentOCHOrder.endSiteGcjPoint.get(0)); - endStation.setLatitude(mCurrentOCHOrder.endSiteGcjPoint.get(1)); - TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStation,endStation,mCurrentOCHOrder.lineId); - } + fun cleanStation() { + setStationPoint(null, null, -1L) } - public void cleanStation(){ - TrajectoryAndDistanceManager.INSTANCE.setStationPoint(null,null,-1L); - } - -} +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java index bb3ebec0dc..2fdc5a9d10 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java @@ -48,7 +48,7 @@ public class TaxiPassengerModelLoopManager { .map((aLong -> aLong + 1)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> TaxiPassengerModel.getInstance().loopQueryPilotStatus()); + .subscribe(aLong -> TaxiPassengerModel.INSTANCE.loopQueryPilotStatus()); } public void stopReadyToAutopilot() { @@ -77,7 +77,7 @@ public class TaxiPassengerModelLoopManager { .map((aLong -> aLong + 1)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> TaxiPassengerModel.getInstance().queryInAndWaitOrders()); + .subscribe(aLong -> TaxiPassengerModel.INSTANCE.queryInAndWaitOrders()); } public void stopInAndWaitOrdersLoop() { @@ -101,7 +101,7 @@ public class TaxiPassengerModelLoopManager { .map((aLong -> aLong + 1)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> TaxiPassengerModel.getInstance().queryOrderRemaining()); + .subscribe(aLong -> TaxiPassengerModel.INSTANCE.queryOrderRemaining()); } public void stopQueryOrderRemainingLoop() { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 3a0e4215c1..35e5aa24e9 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -18,7 +18,6 @@ import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback; -import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback; import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback; import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; @@ -32,7 +31,7 @@ import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen; * @date: 2022/3/4 */ public class BaseTaxiPassengerPresenter extends Presenter implements - IOCHTaxiPassengerADASStatusCallback, IOCHTaxiPassengerControllerStatusCallback, + IOCHTaxiPassengerADASStatusCallback, IOCHTaxiPassengerOrderStatusCallback { private static final String TAG = BaseTaxiPassengerPresenter.class.getSimpleName(); @@ -41,7 +40,7 @@ public class BaseTaxiPassengerPresenter extends Presenter mView.switchVRFlatMode(isVRMode)); - } - - @Override - public void onCarLocationChanged(MogoLocation location) { - // 速度不用展示 - // LeftMenuOpen.INSTANCE.callCallBack(-1,-1,location.getSpeed()); - } - @Override public void onCurrentOrderStatusChanged(TaxiPassengerOrderQueryRespBean.Result order) { // CallerLogger.INSTANCE.d(M_TAXI_P + TAG, GsonUtil.jsonFromObject(order)); @@ -169,11 +155,11 @@ public class BaseTaxiPassengerPresenter extends Presenter{ mView.showOrHideStartAutopilotView(false,false); mView.showOrHideServingOrderFragment(true,true); }); - TaxiPassengerModel.getInstance().startOrStopReadyToAutopilotLoop(false); - TaxiPassengerModel.getInstance().setStation(); + TaxiPassengerModel.INSTANCE.startOrStopReadyToAutopilotLoop(false); + TaxiPassengerModel.INSTANCE.setStation(); } // 30 用户到达上车点 并通过了手机号后四位验证 // 40 服务中 @@ -222,8 +208,7 @@ public class BaseTaxiPassengerPresenter extends Presenter { @@ -232,7 +217,7 @@ public class BaseTaxiPassengerPresenter extends Presenter mView.showArrivedEndLayout2Thank(aBoolean)); + TaxiPassengerModel.INSTANCE.arrivedAndScore(taxiPassengerScoreUpdateOrderReqBean,aBoolean -> mView.showArrivedEndLayout2Thank(aBoolean)); } /** * 开启自动驾驶 */ public void startAutopilot(){ - TaxiPassengerModel.getInstance().startAutopilot(); + TaxiPassengerModel.INSTANCE.startAutopilot(); } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java index e0e6edf5e9..d02ce81490 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/TaxiPassengerServingOrderPresenter.java @@ -18,25 +18,19 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerAutopilotPlanningCallback; -import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerControllerStatusCallback; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback; -import com.mogo.och.taxi.passenger.callback.ITaxiPassengerVeloctityCallback; import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; -import com.mogo.och.taxi.passenger.model.TaxiPassengerGeocodeSearchModel; import com.mogo.och.taxi.passenger.model.TaxiPassengerModel; import com.mogo.och.taxi.passenger.ui.TaxiPassengerServingOrderFragment; import java.util.List; -import mogo.telematics.pad.MessagePad; - /** * @author: wangmingjun * @date: 2022/3/14 */ public class TaxiPassengerServingOrderPresenter extends Presenter - implements IOCHTaxiPassengerAutopilotPlanningCallback, IOCHTaxiPassengerOrderStatusCallback - , IOCHTaxiPassengerControllerStatusCallback, ITaxiPassengerVeloctityCallback { + implements IOCHTaxiPassengerAutopilotPlanningCallback, IOCHTaxiPassengerOrderStatusCallback{ private static final String TAG = TaxiPassengerServingOrderPresenter.class.getSimpleName(); @@ -54,18 +48,13 @@ public class TaxiPassengerServingOrderPresenter extends Presenter mView.onCarLocationChanged(location)); - long currentTimeMillis = System.currentTimeMillis(); - if(currentTimeMillis-startTime Date: Wed, 5 Jul 2023 11:49:52 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=B7=9D=E7=A6=BB?= =?UTF-8?q?=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bean/TaxiPassengerOrderQueryRespBean.java | 15 +----- .../passenger/model/TaxiPassengerModel.kt | 51 ++----------------- .../passenger/utils/TPRouteDataTestUtils.java | 2 +- 3 files changed, 6 insertions(+), 62 deletions(-) diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java index 27fef64839..1d38df720d 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/bean/TaxiPassengerOrderQueryRespBean.java @@ -63,19 +63,6 @@ public class TaxiPassengerOrderQueryRespBean extends BaseData { public String txtFileMd5DPQP = ""; //轨迹文件md5,默认“” public long contrailSaveTimeDPQP; //上传轨迹完成时间戳ms:用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 - // !!!接口中暂无此字段,仅用于本地实现逻辑使用:起始站目的站距离km - public double travelDistance; - - /** - * @param distance - */ - public void decreaseTravelDistance( double distance ) { - travelDistance = ( ( float ) distance / 1000f ); - if ( travelDistance < 0 ) { - travelDistance = 0; - } - } - @Override public int compareTo(Result o) { boolean isEqual = this.orderNo.equals(o.orderNo); @@ -97,7 +84,7 @@ public class TaxiPassengerOrderQueryRespBean extends BaseData { public int hashCode() { return Objects.hash(orderNo, orderType, orderStatus, businessType, startSiteId, startSiteAddr, startSitePoint, startSiteGcjPoint, endSiteId, endSiteAddr, - endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime, travelDistance); + endSitePoint, endSiteGcjPoint, carNumber, createTime, startTime); } } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt index b707158df8..acdfd49851 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt @@ -106,7 +106,6 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { private var mAutopilotPlanningCallback: IOCHTaxiPassengerAutopilotPlanningCallback? = null//Model->Presenter:自动驾驶线路规划 private val mOrderStatusCallbackMap: MutableMap = ConcurrentHashMap() private var subscribe: Disposable? = null - private val mLocationsModels: MutableList = ArrayList() fun setMoGoAutopilotPlanningListener(moGoAutopilotPlanningCallback: IOCHTaxiPassengerAutopilotPlanningCallback?) { mAutopilotPlanningCallback = moGoAutopilotPlanningCallback @@ -187,8 +186,6 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 CallerAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener) IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) - // 定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10, mMapLocationListener) //2021.11.1 自动驾驶路线规划接口 CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener) @@ -203,8 +200,6 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { } private fun releaseListeners() { - // 注销定位监听 - CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) MogoAiCloudSocketManager.getInstance(mContext) .unregisterLifecycleListener(10010) CallerAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener) @@ -308,7 +303,7 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { clearCurrentOCHOrder() } else { updateNativeCurrentOrder(data.data) - if (mOrderStatusCallbackMap.size > 0) { + if (mOrderStatusCallbackMap.isNotEmpty()) { for (callback in mOrderStatusCallbackMap.values) { callback.onCurrentOrderStatusChanged(currentOCHOrder) } @@ -354,18 +349,6 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { return currentOCHOrder != null && currentOCHOrder!!.startSiteGcjPoint != null && currentOCHOrder!!.endSiteGcjPoint != null } - // TODO: 2021/9/12 - fun calculateTravelDistance(carLocation: MogoLocation) { - if (checkCurrentOCHOrder() && currentOCHOrder!!.endSiteGcjPoint.size > 0) { - val endLon = currentOCHOrder!!.endSiteGcjPoint[0] - val endLat = currentOCHOrder!!.endSiteGcjPoint[1] - val distance = CoordinateUtils.calculateLineDistance( - endLon, endLat, - carLocation.longitude, carLocation.latitude - ).toDouble() - currentOCHOrder!!.decreaseTravelDistance(distance) - } - } //监听网络变化,避免启动机器时无网导致无法更新订单信息 private val distanceListener: IDistanceListener = object : IDistanceListener { @@ -408,24 +391,10 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { } } - // 自车定位 - private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = - object : IMoGoChassisLocationGCJ02Listener { - override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { - //位置变化时,通过围栏判断是否到达x点 - if (null == mogoLocation) return - if (checkCurrentOCHOrder()) { - if (curOrderStatus === TaxiPassengerOrderStatusEnum.OnTheWayToEnd) { - calculateTravelDistance(mogoLocation) - } - } - } - } private val mGoAutopilotStatusListener: IMoGoAutopilotStatusListener = object : IMoGoAutopilotStatusListener { private var arriveAtEnd = false //乘客app专用字段 override fun onAutopilotStatusResponse(state: Int) { -// CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "state = %s", state ); if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotRunning() if (currentOCHOrder != null @@ -467,7 +436,6 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { } } - override fun onAutopilotSNRequest() {} override fun onAutopilotArriveAtStation(arrivalNotification: ArrivalNotification?) { if (FunctionBuildConfig.isDemoMode && isPassenger(FunctionBuildConfig.appIdentityMode) @@ -478,20 +446,15 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { return } } - - override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {} } private val moGoAutopilotPlanningListener: IMoGoPlanningRottingListener = object : IMoGoPlanningRottingListener { override fun onAutopilotRotting(globalPathResp: GlobalPathResp?) { if (null != globalPathResp && globalPathResp.wayPointsList.size > 0) { calculateRouteLineSum( - coordinateConverterWgsToGcjListCommon( - mContext, - globalPathResp.wayPointsList - ) + coordinateConverterWgsToGcjListCommon(mContext, globalPathResp.wayPointsList) ) - startToRouteAndWipe(globalPathResp.wayPointsList) + startToRouteAndWipe() } } } @@ -514,10 +477,7 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { } } - fun startToRouteAndWipe(models: List) { - val locationsModels: List = coordinateConverterWgsToGcjLocations(mContext, models) - mLocationsModels.clear() - mLocationsModels.addAll(locationsModels) + fun startToRouteAndWipe() { showRottingMapView() } @@ -630,9 +590,6 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { if (data.data != null && data.data != null && data.data.size > 0) { if (mAutopilotPlanningCallback != null) { calculateRouteLineSum(data.data) - mLocationsModels.clear() - val locationsModels = coordinateConverterLatlngToLocation(data.data) - mLocationsModels.addAll(locationsModels) } } else { RxUtils.disposeSubscribe(subscribe) diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java index ac5ebd9dc7..a7d355ff95 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java @@ -37,7 +37,7 @@ public class TPRouteDataTestUtils { builder.setLongitude(s.getDouble("lon")); list.add(builder.build()); } - TaxiPassengerModel.INSTANCE.startToRouteAndWipe(list); + TaxiPassengerModel.INSTANCE.startToRouteAndWipe(); } catch (JSONException e) { e.printStackTrace(); } From 50c0d1f36f9938a2d51b9510b07d731bd69d82f1 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Wed, 5 Jul 2023 14:31:03 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E8=BD=AE=E8=AF=A2=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=88=B0=E7=BB=9F=E4=B8=80=E8=BD=AE=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/model/TaxiPassengerModel.kt | 76 ++++++------ .../model/TaxiPassengerModelLoopManager.java | 114 ------------------ 2 files changed, 38 insertions(+), 152 deletions(-) delete mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt index acdfd49851..e3d4d2d926 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt @@ -26,11 +26,11 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02Lis import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr -import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.biz.network.OchCommonServiceCallback @@ -44,11 +44,11 @@ import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceM import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addTrajectoryListener import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.removeListener import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.setStationPoint +import com.mogo.och.common.module.manager.loopmanager.BizLoopManager +import com.mogo.och.common.module.manager.loopmanager.LoopInfo import com.mogo.och.common.module.map.AmapNaviToDestinationModel import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.calculateRouteSumLength -import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterLatlngToLocation import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon -import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations import com.mogo.och.common.module.utils.PinYinUtil import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.taxi.passenger.bean.TaxiPassengerBaseRespBean @@ -75,13 +75,10 @@ import io.reactivex.disposables.Disposable import io.reactivex.exceptions.UndeliverableException import io.reactivex.functions.Consumer import io.reactivex.plugins.RxJavaPlugins -import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.ArrivalNotification import mogo.telematics.pad.MessagePad.GlobalPathResp -import system_master.SystemStatusInfo import java.io.IOException import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.TimeUnit /** * Created by pangfan on 2021/8/19 @@ -95,6 +92,10 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { private val TAG = TaxiPassengerModel::class.java.simpleName + private val STARTREADYTOAUTOPILOT = "startReadyToAutopilot" + private val MINANDWAITSERVICE = "mInAndWaitService" + private val MQUERYORDERREMAINING = "mQueryOrderRemaining" + // 获取当前订单 @Volatile var currentOCHOrder: TaxiPassengerOrderQueryRespBean.Result? = null//当前订单 @@ -132,32 +133,32 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { // The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the excTeption has nowhere to go to begin with RxJavaPlugins.setErrorHandler(Consumer { e -> if (e is UndeliverableException) { - d(SceneConstant.M_TAXI_P + TAG, "UndeliverableException") + d(M_TAXI_P + TAG, "UndeliverableException") return@Consumer } if (e is IOException) { // // fine, irrelevant network problem or API that throws on cancellation - d(SceneConstant.M_TAXI_P + TAG, "IOException") + d(M_TAXI_P + TAG, "IOException") return@Consumer } if (e is InterruptedException) { // fine, some blocking code was interrupted by a dispose call - d(SceneConstant.M_TAXI_P + TAG, "InterruptedException") + d(M_TAXI_P + TAG, "InterruptedException") return@Consumer } if (e is NullPointerException || e is IllegalArgumentException) { // that's likely a bug in the application - d(SceneConstant.M_TAXI_P + TAG, "NullPointerException or IllegalArgumentException") + d(M_TAXI_P + TAG, "NullPointerException or IllegalArgumentException") Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(Thread.currentThread(), e) return@Consumer } if (e is IllegalStateException) { // that's a bug in RxJava or in a custom operator - d(SceneConstant.M_TAXI_P + TAG, "IllegalStateException") + d(M_TAXI_P + TAG, "IllegalStateException") Thread.currentThread().uncaughtExceptionHandler?.uncaughtException(Thread.currentThread(), e) return@Consumer } - d(SceneConstant.M_TAXI_P + TAG, "Undeliverable exception") + d(M_TAXI_P + TAG, "Undeliverable exception") }) startOrStopOrderLoop() } @@ -216,11 +217,11 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { * false 关闭订单轮训 */ private fun startOrStopOrderLoop(start: Boolean) { - d(SceneConstant.M_TAXI_P + TAG, "startOrStopOrderLoop() $start") + d(M_TAXI_P + TAG, "startOrStopOrderLoop() $start") if (start) { - TaxiPassengerModelLoopManager.getInstance().startInAndWaitOrdersLoop() + BizLoopManager.setLoopFunction(MINANDWAITSERVICE,LoopInfo(2, TaxiPassengerModel::queryInAndWaitOrders)) } else { - TaxiPassengerModelLoopManager.getInstance().stopInAndWaitOrdersLoop() + BizLoopManager.removeLoopFunction(MINANDWAITSERVICE) } } @@ -278,7 +279,7 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { override fun onError() {} override fun onFail(code: Int, msg: String) { - e(SceneConstant.M_TAXI_P + TAG, "queryInAndWaitOrders$code$msg") + e(M_TAXI_P + TAG, "queryInAndWaitOrders$code$msg") } }) } @@ -383,7 +384,7 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { } } private val mNetWorkIntentListener = IMogoIntentListener { intentStr, intent -> - d(SceneConstant.M_TAXI_P + TAG, "onIntentReceived = %s", intentStr) + d(M_TAXI_P + TAG, "onIntentReceived = %s", intentStr) if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) { if (NetworkUtils.isConnected(mContext)) { startOrStopOrderLoop(true) @@ -544,9 +545,9 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { fun startOrStopQueryOrderRemaining(isStart: Boolean) { if (isStart) { - TaxiPassengerModelLoopManager.getInstance().startQueryOrderRemainingLoop() + BizLoopManager.setLoopFunction(MQUERYORDERREMAINING,LoopInfo(2, TaxiPassengerModel::queryOrderRemaining)) } else { - TaxiPassengerModelLoopManager.getInstance().stopQueryOrderRemainingLoop() + BizLoopManager.removeLoopFunction(MQUERYORDERREMAINING) } } @@ -561,10 +562,7 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { object : OchCommonServiceCallback { override fun onSuccess(data: TaxiPassengerOrderQueryRemainingResp) { if (data.data != null) { - e( - SceneConstant.M_TAXI_P + TAG, - "distance = " + data.data.distance + " ,duration = " + data.data.duration - ) + e(M_TAXI_P + TAG, "distance = " + data.data.distance + " ,duration = " + data.data.duration) for (callback in mOrderStatusCallbackMap.values) { callback.onCurrentOrderDistToEndChanged( data.data.distance, @@ -580,13 +578,13 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { fun queryOrderRouteList() { if (currentOCHOrder == null) return - d(SceneConstant.M_TAXI_P + TAG, "--route--- queryOrderRouteList") + d(M_TAXI_P + TAG, "--route--- queryOrderRouteList") TaxiPassengerServiceManager.queryOrderRouteList( mContext!!, currentOCHOrder!!.orderNo, object : OchCommonServiceCallback { override fun onSuccess(data: TaxiPassengerQueryOrderRouteResp) { - d(SceneConstant.M_TAXI_P + TAG, "--route---" + GsonUtil.jsonFromObject(data)) + d(M_TAXI_P + TAG, "--route---" + GsonUtil.jsonFromObject(data)) if (data.data != null && data.data != null && data.data.size > 0) { if (mAutopilotPlanningCallback != null) { calculateRouteLineSum(data.data) @@ -656,7 +654,7 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { override fun onFail(code: Int, msg: String) { ToastUtils.showLong("当前网络异常,请重新验证;若始终异常,请您在手机端取消行程,给您带来不便,十分抱歉!") e( - SceneConstant.M_TAXI_P + TAG, + M_TAXI_P + TAG, "提交用户输入的手机后4位、并进行状态扭转 后台结果错误$code$msg" ) } @@ -677,12 +675,12 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { override fun onError() { ToastUtils.showLong("网络错误请稍后再试") - e(SceneConstant.M_TAXI_P + TAG, "对订单进行打分 1-5分 网络错误") + e(M_TAXI_P + TAG, "对订单进行打分 1-5分 网络错误") commonCallback?.onCommonCallback(false) } override fun onFail(code: Int, msg: String) { - e(SceneConstant.M_TAXI_P + TAG, "对订单进行打分 1-5分 后台结果错误$code$msg") + e(M_TAXI_P + TAG, "对订单进行打分 1-5分 后台结果错误$code$msg") commonCallback?.onCommonCallback(false) } }) @@ -722,9 +720,11 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { fun startOrStopReadyToAutopilotLoop(isStart: Boolean) { if (isStart) { - TaxiPassengerModelLoopManager.getInstance().startReadyToAutopilot() + BizLoopManager.setLoopFunction(STARTREADYTOAUTOPILOT, LoopInfo(1, TaxiPassengerModel::loopQueryPilotStatus)) + CallerLogger.i(M_TAXI_P + TAG, "startReadyToAutopilot()") } else { - TaxiPassengerModelLoopManager.getInstance().stopReadyToAutopilot() + BizLoopManager.removeLoopFunction(STARTREADYTOAUTOPILOT) + CallerLogger.i(M_TAXI_P + TAG, "stopReadyToAutopilot()") } } @@ -747,7 +747,7 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { fun startAutopilot() { if (!checkCurrentOCHOrder()) { - e(SceneConstant.M_TAXI_P + TAG, "no order or order is empty.") + e(M_TAXI_P + TAG, "no order or order is empty.") ToastUtils.showShort("当前订单不存在或异常!") return } @@ -769,12 +769,12 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { } val parameters = initAutopilotControlParameters() if (parameters == null) { - d(SceneConstant.M_TAXI_P + TAG, "AutopilotControlParameters is empty.") + d(M_TAXI_P + TAG, "AutopilotControlParameters is empty.") return } startAutoPilot(parameters) d( - SceneConstant.M_TAXI_P + TAG, + M_TAXI_P + TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters) + " ,startSiteName=" + currentOCHOrder!!.startSiteAddr @@ -791,7 +791,7 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { private fun initAutopilotControlParameters(): AutopilotControlParameters? { if (!checkCurrentOCHOrder()) { - e(SceneConstant.M_TAXI_P + TAG, "no order or order is empty.") + e(M_TAXI_P + TAG, "no order or order is empty.") ToastUtils.showShort("当前订单不存在或异常!") return null } @@ -827,15 +827,15 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { fun updateAutopilotControlParameters() { val parameters = initAutopilotControlParameters() if (null == parameters) { - e(SceneConstant.M_TAXI_P + TAG, "AutopilotControlParameters is empty.") + e(M_TAXI_P + TAG, "AutopilotControlParameters is empty.") return } - d(SceneConstant.M_TAXI_P + TAG, "AutopilotControlParameters is update.") + d(M_TAXI_P + TAG, "AutopilotControlParameters is update.") updateAutopilotControlParameters(parameters) } fun clearAutopilotControlParameters() { - d(SceneConstant.M_TAXI_P + TAG, "AutopilotControlParameters is clear.") + d(M_TAXI_P + TAG, "AutopilotControlParameters is clear.") updateAutopilotControlParameters(null) } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java deleted file mode 100644 index 2fdc5a9d10..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.mogo.och.taxi.passenger.model; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; - -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; - -import java.util.concurrent.TimeUnit; - -import io.reactivex.Observable; -import io.reactivex.ObservableEmitter; -import io.reactivex.ObservableOnSubscribe; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Consumer; -import io.reactivex.schedulers.Schedulers; - -/** - * Created on 2021/9/10 - * - * 管理轮询逻辑(订单轮询、新单轮询、新单抢单结果轮询等等) - */ -public class TaxiPassengerModelLoopManager { - - private static final String TAG = TaxiPassengerModelLoopManager.class.getSimpleName(); - - private static final class SingletonHolder { - private static final TaxiPassengerModelLoopManager INSTANCE = new TaxiPassengerModelLoopManager(); - } - - public static TaxiPassengerModelLoopManager getInstance() { - return SingletonHolder.INSTANCE; - } - - private Disposable mInAndWaitServiceDisposable; //进行中、待服务订单列表轮询 - private Disposable mQueryOrderRemainingDisposable; //心跳轮询 - private CompositeDisposable mRouteWipeDisposable; //轨迹擦除 - private Disposable mReadyToAutopilotDisposable; //轮询是否可开启自动驾驶 - - public void startReadyToAutopilot() { - if (mReadyToAutopilotDisposable != null && !mReadyToAutopilotDisposable.isDisposed()) { - return; - } - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startReadyToAutopilot()"); - mReadyToAutopilotDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, - TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> TaxiPassengerModel.INSTANCE.loopQueryPilotStatus()); - } - - public void stopReadyToAutopilot() { - if (mReadyToAutopilotDisposable != null) { - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopReadyToAutopilot()"); - mReadyToAutopilotDisposable.dispose(); - mReadyToAutopilotDisposable = null; - } - } - - public void stopRouteAndWipe() { - if (mRouteWipeDisposable != null) { - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopRouteAndWipe()"); - mRouteWipeDisposable.dispose(); - mRouteWipeDisposable = null; - } - } - - public void startInAndWaitOrdersLoop() { - if (mInAndWaitServiceDisposable != null && !mInAndWaitServiceDisposable.isDisposed()) { - return; - } - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startInAndWaitOrdersLoop()"); - mInAndWaitServiceDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, - TaxiPassengerConst.LOOP_PERIOD_2S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> TaxiPassengerModel.INSTANCE.queryInAndWaitOrders()); - } - - public void stopInAndWaitOrdersLoop() { - if (mInAndWaitServiceDisposable != null) { - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopInAndWaitOrdersLoop()"); - mInAndWaitServiceDisposable.dispose(); - mInAndWaitServiceDisposable = null; - } - } - - /** - * 轮训查下 查询订单剩余里程和时间 - */ - public void startQueryOrderRemainingLoop() { - if (mQueryOrderRemainingDisposable != null && !mQueryOrderRemainingDisposable.isDisposed()) { - return; - } - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startQueryOrderRemainingLoop()"); - mQueryOrderRemainingDisposable = Observable.interval(TaxiPassengerConst.LOOP_DELAY, - TaxiPassengerConst.LOOP_CALCULATEROUTE_2S, TimeUnit.MILLISECONDS) - .map((aLong -> aLong + 1)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> TaxiPassengerModel.INSTANCE.queryOrderRemaining()); - } - - public void stopQueryOrderRemainingLoop() { - if (mQueryOrderRemainingDisposable != null) { - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopQueryOrderRemainingLoop()"); - mQueryOrderRemainingDisposable.dispose(); - mQueryOrderRemainingDisposable = null; - } - } -} From 09fcca106cd7bea959e51fc753bb0c5a732ef076 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Fri, 7 Jul 2023 10:48:43 +0800 Subject: [PATCH 6/8] =?UTF-8?q?[feature]=20[3.4.0]=20[=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=B7=AF=E5=90=8D=E7=9A=84=E5=8A=9F=E8=83=BD?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IOCHTaxiPassengerOrderStatusCallback.java | 3 - .../TaxiPassengerGeocodeSearchModel.java | 125 ------------------ .../passenger/model/TaxiPassengerModel.kt | 23 +--- .../presenter/BaseTaxiPassengerPresenter.java | 9 -- .../TaxiPassengerServingOrderPresenter.java | 5 - .../ui/TaxiPassengerServingOrderFragment.kt | 12 -- 6 files changed, 1 insertion(+), 176 deletions(-) delete mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java index d800e68e66..f89ebcb8ef 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerOrderStatusCallback.java @@ -15,9 +15,6 @@ public interface IOCHTaxiPassengerOrderStatusCallback { // 当前位置距离上车点的距离(米)、预估时间(秒) void onCurrentOrderDistToEndChanged(long meters, long timeInSecond); - //当前路名字 - void onCurrentRoadName(String currentRoadName); - // 司机已确认开启自动驾驶环境 void onDriverHasCheckedPilotCondition(boolean isBoarded); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java deleted file mode 100644 index c43702af78..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.mogo.och.taxi.passenger.model; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; - -import android.content.Context; - -import com.amap.api.services.core.AMapException; -import com.amap.api.services.core.LatLonPoint; -import com.amap.api.services.geocoder.GeocodeResult; -import com.amap.api.services.geocoder.GeocodeSearch; -import com.amap.api.services.geocoder.RegeocodeQuery; -import com.amap.api.services.geocoder.RegeocodeResult; -import com.amap.api.services.geocoder.RegeocodeRoad; -import com.mogo.eagle.core.network.utils.GsonUtil; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerNaviChangedCallback; - -import java.util.List; -import java.util.Timer; -import java.util.TimerTask; - -/** - * @author: wangmingjun - * @date: 2021/12/6 - */ -public class TaxiPassengerGeocodeSearchModel implements GeocodeSearch.OnGeocodeSearchListener { - - private final String TAG = TaxiPassengerGeocodeSearchModel.class.getSimpleName(); - - private static Context mContext; - - private IOCHTaxiPassengerNaviChangedCallback mNaviChangedCallback; - - GeocodeSearch mGeocodeSearch = null; - - private String roadName = ""; - - private Timer timer ; - - TimerTask timerTask; - - public static TaxiPassengerGeocodeSearchModel getInstance(Context context) { - mContext = context; - return SingletonHolder.INSTANCE; - } - - private static final class SingletonHolder { - private static final TaxiPassengerGeocodeSearchModel INSTANCE = new TaxiPassengerGeocodeSearchModel(); - } - - private TaxiPassengerGeocodeSearchModel(){ - } - - public void initGeocodeSearch(){ - //通过经纬度逆地理编码得到位置 - try { - mGeocodeSearch = new GeocodeSearch(mContext); - mGeocodeSearch.setOnGeocodeSearchListener(this); - } catch (AMapException e) { - e.printStackTrace(); - } - timer = new Timer(); - timerTask = new TimerTask() { - @Override - public void run() { - if (mNaviChangedCallback != null){ - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "roadName道路名称: " + roadName); - mNaviChangedCallback.onCurrentRoadName(roadName); - } - } - }; - try{ - timer.schedule(timerTask,500,2000); - }catch (Exception e){ - e.printStackTrace(); - } - } - - public void searchLocationInfo(double lat, double lon){ - if (null != mGeocodeSearch){ - LatLonPoint latLng = new LatLonPoint(lat, lon); - //第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系 - RegeocodeQuery query = new RegeocodeQuery(latLng, 200, GeocodeSearch.AMAP); - mGeocodeSearch.getFromLocationAsyn(query); - } - } - - public void destroyGeocodeSearch(){ - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "destroyGeocodeSearch"); - if (mGeocodeSearch != null){ - mGeocodeSearch = null; - } - if (mNaviChangedCallback != null){ - mNaviChangedCallback = null; - } - if (null != timer){ - timer.cancel(); - } - if (null != timerTask){ - timerTask = null; - } - roadName = ""; - } - - public void setOCHTaciNaviChangedCallback(IOCHTaxiPassengerNaviChangedCallback callback){ - this.mNaviChangedCallback = callback; - } - - @Override - public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {//更新频率几十 ms, 暂定更新UI为2s一次 - if (regeocodeResult != null) { - List roads = regeocodeResult.getRegeocodeAddress().getRoads(); - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "位置roads:" + GsonUtil.jsonFromObject(roads)); - if (roads != null && roads.size() > 0){ - roadName = roads.get(0).getName();//当前路的名字 -// mNaviChangedCallback.onCurrentRoadName(roads.get(0).getName()); - } - } - } - - @Override - public void onGeocodeSearched(GeocodeResult geocodeResult, int i) { - - } -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt index e3d4d2d926..4605a4ae5c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt @@ -86,7 +86,7 @@ import java.util.concurrent.ConcurrentHashMap * 网约车 - 出租车业务逻辑处理 */ @SuppressLint("StaticFieldLeak") -object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { +object TaxiPassengerModel { private var mContext: Context? = null @@ -528,21 +528,6 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { } } - /** - * 导航订单起点到终点 获得剩余时间,里程,预计到达时间 - */ - fun initGeocodeSearch() { - if (currentOCHOrder != null) { - TaxiPassengerGeocodeSearchModel.getInstance(mContext).initGeocodeSearch() - TaxiPassengerGeocodeSearchModel.getInstance(mContext) - .setOCHTaciNaviChangedCallback(this) - } - } - - fun destoryGeocodeSearch() { - TaxiPassengerGeocodeSearchModel.getInstance(mContext).destroyGeocodeSearch() - } - fun startOrStopQueryOrderRemaining(isStart: Boolean) { if (isStart) { BizLoopManager.setLoopFunction(MQUERYORDERREMAINING,LoopInfo(2, TaxiPassengerModel::queryOrderRemaining)) @@ -606,12 +591,6 @@ object TaxiPassengerModel : IOCHTaxiPassengerNaviChangedCallback { }) } - override fun onCurrentRoadName(currentRoadName: String) { - for (callback in mOrderStatusCallbackMap.values) { - callback.onCurrentRoadName(currentRoadName) - } - } - /** * 订单结束或者取消的时候, 刷新导航标识位以及缓存的数据 */ diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 35e5aa24e9..523d6efa48 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -21,7 +21,6 @@ import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback; import com.mogo.och.taxi.passenger.callback.ITaxiPassengerCommonCallback; import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; -import com.mogo.och.taxi.passenger.model.TaxiPassengerGeocodeSearchModel; import com.mogo.och.taxi.passenger.model.TaxiPassengerModel; import com.mogo.och.taxi.passenger.ui.TaxiPassengerBaseFragment; import com.mogo.och.taxi.passenger.ui.leftmenu.LeftMenuOpen; @@ -130,11 +129,6 @@ public class BaseTaxiPassengerPresenter extends Presenter { mView.showOrHideServingOrderFragment(false,true); @@ -222,7 +214,6 @@ public class BaseTaxiPassengerPresenter extends Presenter mView.onCurrentOrderDistToEndChanged(meters, timeInSecond)); } - @Override - public void onCurrentRoadName(String currentRoadName) { - runOnUIThread(() -> mView.onCurrentRoadName(currentRoadName)); - } - @Override public void onDriverHasCheckedPilotCondition(boolean isBoarded) { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt index 74bfa2740e..3bc1fcbcff 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt @@ -144,25 +144,18 @@ class TaxiPassengerServingOrderFragment : mProgressSeekBar?.jumpDrawablesToCurrentState() } - private fun updateDriveRoadName(currentRoadName: String) { - mProgessDes?.text = currentRoadName - } - override fun onResume() { super.onResume() mMapRottingView?.onResume() mAmapNaviVIew?.onResume() - TaxiPassengerModel.initGeocodeSearch() } override fun onHiddenChanged(hidden: Boolean) { super.onHiddenChanged(hidden) if (hidden) { //fragment 隐藏, 导航取消c clearPolyline() - TaxiPassengerModel.destoryGeocodeSearch() } else { //fragment 显示, 导航开始 e(SceneConstant.M_TAXI_P + "TaxiPassengerNaviTo", "initGeocodeSearch") - TaxiPassengerModel.initGeocodeSearch() } } @@ -177,7 +170,6 @@ class TaxiPassengerServingOrderFragment : mMapRottingView?.onDestroy() mAmapNaviVIew?.onDestroy() AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() - TaxiPassengerModel.destoryGeocodeSearch() } fun showRottingMapView() { @@ -264,10 +256,6 @@ class TaxiPassengerServingOrderFragment : updateDriveProcessLoading(meters.toInt()) } - fun onCurrentRoadName(roadName: String) { - updateDriveRoadName(roadName) - } - private fun updateOrderDisAndTimeView( remainDis: String, remainDisUnit: String, From 34431a0d6f0fe673af6d071542121bb5a5f6bd05 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Mon, 10 Jul 2023 10:42:35 +0800 Subject: [PATCH 7/8] [gradle] [driverpassenger->driverPassenger] --- app/script/flavorfilter/flavors.json | 6 +++--- app/script/roleFlavors/driverpassenger.gradle | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/script/flavorfilter/flavors.json b/app/script/flavorfilter/flavors.json index 070560f032..6bd36f89d9 100644 --- a/app/script/flavorfilter/flavors.json +++ b/app/script/flavorfilter/flavors.json @@ -15,12 +15,12 @@ }, "taxi" :{ "driver": ["ochDFHQ"], - "driverpassenger": ["ochDFHQ"], + "driverPassenger": ["ochDFHQ"], "passenger": ["ochDFHQ"] }, "bus" :{ "driver": ["ochJL"], - "driverpassenger": ["ochJL"], + "driverPassenger": ["ochJL"], "passenger": ["ochJL"] }, "charter" :{ @@ -58,7 +58,7 @@ }, "bus" :{ "driver": ["ochJL"], - "driverpassenger": ["ochJL"], + "driverPassenger": ["ochJL"], "passenger": ["ochJL"] } } diff --git a/app/script/roleFlavors/driverpassenger.gradle b/app/script/roleFlavors/driverpassenger.gradle index 35b44c718f..79ccc6c1f0 100644 --- a/app/script/roleFlavors/driverpassenger.gradle +++ b/app/script/roleFlavors/driverpassenger.gradle @@ -1,5 +1,5 @@ project.android.productFlavors { - driverpassenger { + driverPassenger { dimension "role" externalNativeBuild { ndk { From 4c8ac633d7869f84f21f76a5e62f0a8f985a480e Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 11 Jul 2023 18:37:22 +0800 Subject: [PATCH 8/8] [3.4.0] [add taxi BottomBar] --- .../module/manager/loopmanager/LoopInfo.kt | 6 + .../passenger/model/TaxiPassengerModel.kt | 2 +- .../ui/TaxiPassengerBaseFragment.java | 88 -------------- .../och/taxi/passenger/ui/bottom/BottomBar.kt | 96 +++++++++++++++ .../passenger/ui/bottom/BottomCheckView.kt | 92 +++++++++++++++ .../passenger/ui/orderinfo/ItineraryView.kt | 70 +++++++++++ .../charter_p_bottom_softsettiing_normal.png | Bin 0 -> 3442 bytes .../charter_p_bottom_softsettiing_press.png | Bin 0 -> 3492 bytes .../drawable-xhdpi/taxi_p_bottom_bar_bg.png | Bin 0 -> 55163 bytes .../taxi_p_bottom_bar_select_bg.png | Bin 0 -> 63659 bytes .../src/main/res/layout/m1_bottom_check.xml | 28 +++++ .../main/res/layout/taxi_p_base_fragment.xml | 81 +------------ .../src/main/res/layout/taxi_p_bottom_bar.xml | 109 ++++++++++++++++++ .../src/main/res/layout/taxi_p_itinerary.xml | 52 +++++++++ .../src/main/res/values/attrs.xml | 15 +++ .../och/taxi/ui/TaxiGrabOrderFragment.java | 8 +- 16 files changed, 478 insertions(+), 169 deletions(-) create mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt create mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt create mode 100644 OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/ItineraryView.kt create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_normal.png create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_press.png create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_bottom_bar_bg.png create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/taxi_p_bottom_bar_select_bg.png create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/layout/m1_bottom_check.xml create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_bottom_bar.xml create mode 100644 OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_itinerary.xml diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt index a6c0cccf5b..a987ec2d5c 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt @@ -2,4 +2,10 @@ package com.mogo.och.common.module.manager.loopmanager import io.reactivex.Scheduler +/** + * interval 轮训间隔 + * function 轮询执行的方法 + * immediately 是否立刻执行 + * scheduler 轮训执行的线程 + */ data class LoopInfo(val interval:Long,val function: () -> Unit,val immediately:Boolean=false,var scheduler: Scheduler? = null) \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt index 4605a4ae5c..c1b148e1c0 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.kt @@ -242,7 +242,7 @@ object TaxiPassengerModel { //1. 处理进行中订单 mInServiceList = data.data.servicing - if (data.data.servicing != null && !data.data.servicing.isEmpty()) { + if (data.data.servicing != null && data.data.servicing.isNotEmpty()) { // 1.1. 当存在进行中单时:对本地currentOrder进行更新 if (currentOCHOrder == null) { //1.1.1. 当本地无currentOrder(已经完成or取消),则更新currentOrder,并通知ui更新 diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java index 42c739cee9..98ba9732ff 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java @@ -58,8 +58,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment mArrivedEndView; @@ -68,12 +66,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment { - if (show) { - viewPassengerMsgBoxList.setVisibility(View.VISIBLE); - viewPassengerMsgBoxBubble.setVisibility(View.GONE); - viewPassengerMsgBoxBubble.isShowData(false); - } else { - viewPassengerMsgBoxList.setVisibility(View.GONE); - viewPassengerMsgBoxBubble.setVisibility(View.VISIBLE); - viewPassengerMsgBoxBubble.isShowData(true); - } - }); } @Override @@ -136,45 +109,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment { - IMogoMapUIController controller = CallerMapUIServiceManager.INSTANCE.getMapUIController(); - if (controller != null) { - //切换地图的远近视图 - if (controller.getCurrentMapVisualAngle().isLongSight()) { - Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(true); - controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); - mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium); - } else if (controller.getCurrentMapVisualAngle().isMediumSight()) { - Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(false); - controller.changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null); - mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_long); - } else { - controller.changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); - mMapswitchBtn.setImageResource(R.drawable.taxi_p_switch_map_medium); - } - } - //OverlayLeftViewUtils.INSTANCE.dismissOverlayView(); - }); - findViewById(R.id.iv_temp).setOnClickListener(view -> { - OverlayLeftViewUtils.INSTANCE.showOverlayView(getActivity(), 0, true, -1, true); - //showOrHideArrivedEndLayout(true, "北京北京北京", "1527481606997577728"); - //showOrHidePressengerCheckPager(true, "开始站点开", "开始站点开始站点开始", "2", "京A888888", "18811539480"); - //OCHFloatWindowManager.getInstance().ShowFloatWindow(getContext()); - }); } private void initArrivedView() { @@ -191,9 +126,6 @@ public class TaxiPassengerBaseFragment extends MvpFragment onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState()), 1000L); - } - @NonNull @Override protected BaseTaxiPassengerPresenter createPresenter() { diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt new file mode 100644 index 0000000000..ed6fc91156 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomBar.kt @@ -0,0 +1,96 @@ +package com.mogo.och.taxi.passenger.ui.bottom + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.och.taxi.passenger.R +import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_overmapview +import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_roma +import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_setting +import kotlinx.android.synthetic.main.taxi_p_bottom_bar.view.actv_video + +class BottomBar @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + private var checkIndex = SelectView.None + private var overMapViewApply:ApplyClickLintener?=null + private var videoApply:ApplyClickLintener?=null + private var romaApply:ApplyClickLintener?=null + private var settingApply:ApplyClickLintener?=null + init { + isClickable = true + LayoutInflater.from(context).inflate(R.layout.taxi_p_bottom_bar, this, true) + setBackgroundResource(R.drawable.taxi_p_bottom_bar_bg) + actv_overmapview.setOnClickListener { + setCheckIndex(SelectView.OVERMAPVIEW) + overMapViewApply?.onApplyClick() + } + actv_video.setOnClickListener { + setCheckIndex(SelectView.VIDEO) + videoApply?.onApplyClick() + } + actv_roma.setOnClickListener { + setCheckIndex(SelectView.ROMA) + romaApply?.onApplyClick() + } + actv_setting.setOnClickListener { + setCheckIndex(SelectView.SETTING) + settingApply?.onApplyClick() + } + } + + fun setOverMapApplyClick(overMapViewApply:ApplyClickLintener){ + this.overMapViewApply = overMapViewApply + } + fun setVideoApplyClick(overMapViewApply:ApplyClickLintener){ + this.videoApply = overMapViewApply + } + fun setRomaApplyClick(overMapViewApply:ApplyClickLintener){ + this.romaApply = overMapViewApply + } + fun setSettingApplyClick(overMapViewApply:ApplyClickLintener){ + this.settingApply = overMapViewApply + } + + fun setCheckIndex(index: SelectView){ + if(checkIndex==index){ + checkIndex = SelectView.None + }else{ + checkIndex = index + } + if(checkIndex == SelectView.OVERMAPVIEW){ + actv_overmapview.setCheckItem(true) + }else{ + actv_overmapview.setCheckItem(false) + } + if(checkIndex == SelectView.VIDEO){ + actv_video.setCheckItem(true) + }else{ + actv_video.setCheckItem(false) + } + if(checkIndex == SelectView.ROMA){ + actv_roma.setCheckItem(true) + }else{ + actv_roma.setCheckItem(false) + } + if(checkIndex == SelectView.SETTING){ + actv_setting.setCheckItem(true) + }else{ + actv_setting.setCheckItem(false) + } + + } + + enum class SelectView{ + None,OVERMAPVIEW,VIDEO,ROMA,SETTING + } + + interface ApplyClickLintener{ + fun onApplyClick() + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt new file mode 100644 index 0000000000..4d8d70e314 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/bottom/BottomCheckView.kt @@ -0,0 +1,92 @@ +package com.mogo.och.bus.passenger.ui.view.bottom + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import com.mogo.och.taxi.passenger.R +import kotlinx.android.synthetic.main.m1_bottom_check.view.aciv_center_image +import kotlinx.android.synthetic.main.m1_bottom_check.view.actv_title + +open class BottomCheckView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + companion object { + private const val TAG = "StopSiteView" + } + + private var backageViewId: Int = -1 + private var bottomTitle: String = "" + private var selectedDrawable: Int = -1 + private var normalDrawable: Int = -1 + private var bottomTitleNormalColor:Int = -1 + private var bottomTitleCheckedColor:Int = -1 + private var backageView: View? = null + + private var isCheck = false + + init { + LayoutInflater.from(context).inflate(R.layout.m1_bottom_check, this, true) + try { + val typedArray = context.obtainStyledAttributes(attrs, R.styleable.BottomSelectView) + backageViewId = typedArray.getResourceId(R.styleable.BottomSelectView_backageViewId, -1) + bottomTitle = typedArray.getString(R.styleable.BottomSelectView_bottomTitle) ?: "" + selectedDrawable = typedArray.getResourceId(R.styleable.BottomSelectView_selectedDrawable, -1) + normalDrawable = typedArray.getResourceId(R.styleable.BottomSelectView_normalDrawable, -1) + bottomTitleNormalColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleNormalColor, + ContextCompat.getColor(context,R.color.white)) + bottomTitleCheckedColor = typedArray.getColor(R.styleable.BottomSelectView_bottomTitleCheckedColor, + ContextCompat.getColor(context,R.color.white)) + typedArray.recycle() + initView(context) + } catch (e: Exception) { + e.printStackTrace() + } + + } + + private fun initView(context: Context) { + if (selectedDrawable > 0) { + aciv_center_image.setImageResource(normalDrawable) + } + actv_title.text = bottomTitle + } + + fun setCheckItem(isCheck: Boolean) { + if (isCheck != this.isCheck) { + this.isCheck = isCheck + notifiBackageView() + } + } + + private fun notifiBackageView() { + if (isCheck) { + backageView?.visibility = View.VISIBLE + aciv_center_image.setImageResource(selectedDrawable) + actv_title.setTextColor(bottomTitleNormalColor) + } else { + backageView?.visibility = View.GONE + aciv_center_image.setImageResource(normalDrawable) + actv_title.setTextColor(bottomTitleCheckedColor) + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + parent?.let { + if (parent is ConstraintLayout) { + if (backageViewId > 0) { + backageView = (parent as ConstraintLayout).findViewById(backageViewId) + } + } + } + if (isCheck) { + backageView?.visibility = View.VISIBLE + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/ItineraryView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/ItineraryView.kt new file mode 100644 index 0000000000..0effb501b0 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/orderinfo/ItineraryView.kt @@ -0,0 +1,70 @@ +package com.mogo.och.taxi.passenger.ui.orderinfo + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.appcompat.widget.AppCompatTextView +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.och.taxi.passenger.R + +class ItineraryView(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : + ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) { + + // 速度 + lateinit var actvSpeedValue: AppCompatTextView + // 速度单位 + lateinit var actvSpeedUnit: AppCompatTextView + // 终点站 + lateinit var actvEndstation: AppCompatTextView + // 距离终点距离 + lateinit var actvDistance: AppCompatTextView + // 距离终点距离单位 + lateinit var actvDistanceUnit: AppCompatTextView + // 剩余时间 + lateinit var actvSurplusTime: AppCompatTextView + // 剩余时间单位 + lateinit var actvSurplusTimeUnit: AppCompatTextView + // 到达时间 + lateinit var actvArrivedTime: AppCompatTextView + + private fun initView(context: Context?) { + LayoutInflater.from(context).inflate(R.layout.taxi_p_itinerary, this, true) + actvSpeedValue = findViewById(R.id.actv_speed_value) + actvSpeedUnit = findViewById(R.id.actv_speed_unit) + actvEndstation = findViewById(R.id.actv_endstation) + actvDistance = findViewById(R.id.actv_distance) + actvDistanceUnit = findViewById(R.id.actv_distance_unit) + actvSurplusTime = findViewById(R.id.actv_surplus_time) + actvSurplusTimeUnit = findViewById(R.id.actv_surplus_time_unit) + actvArrivedTime = findViewById(R.id.actv_arrived_time) + } + + fun setSpeed(speedValue:String,speedUnit:String){ + actvSpeedValue.text = speedValue + actvSpeedUnit.text = speedUnit + } + fun setEndStation(endStation:String){ + actvEndstation.text = endStation + } + + fun setDistanceInfo(distance:String,distanceUnit:String, + surplusTime:String,surplusTimeUnit:String, + arrivedTime:String + ){ + actvDistance.text = distance + actvDistanceUnit.text = distanceUnit + actvSurplusTime .text= surplusTime + actvSurplusTimeUnit.text = surplusTimeUnit + actvArrivedTime .text= arrivedTime + } + + init { + try { + initView(context) + } catch (e: Exception) { + e.printStackTrace() + } + } + + +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_normal.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..8d3c31d0d46d7b8af67fce7a8a839df96fb9cf3a GIT binary patch literal 3442 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 Zryy1x<>Abd7VN+O9Zf@cnTB2PzW`k5b0q)( literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_press.png b/OCH/mogo-och-taxi-passenger/src/main/res/drawable-xhdpi/charter_p_bottom_softsettiing_press.png new file mode 100644 index 0000000000000000000000000000000000000000..07ab27a462590c794e35b3cef7012c66e6483766 GIT binary patch literal 3492 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

bTYaY>ZVzeTyou5VvGg)LQWwhJ$)5=*^bt!-I5# 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 a{r?55fqN?Sz57c50000=d00001b5ch_0Itp) z=>Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR92XP^TB1ONa40RR91Z2$lO0G?w}RR91$07*naRCod0-OH|RNp{}%we~*e zWM*X*i}xD@nScy6sHR__UP7-R1Ad7jAHoLg7cgMz5d@HIx}hf75DZv^1Qsb$yc8?1 zXYalI`+u?a$tzfy4_AhVzeSLX+f4e+9etda&`111b)zjti`gnPK^KiLdp4Iz% z|8RN4@ZsUDc8;IlTpnKVMfdLVa(TSHT&`F3T0CAIzufm9l-!;#Z&W_su4=1S_o3`X z-Gk%X<%;&rbA8;<+TtNO`V`pQ`6kwOp8Oi{gdif`{wOh)V?1 zI(%;rZ}t8{h*wK9!bE+Hj6udS2i){IudT+~m*7r`3UYBQ^k_=;SkhnMG<7uMSGz8%)t z?UoY-Wh`IVIR;qoOWn&0kzZb(kS3gv&U_4^KmBX=oS|2Fc_sqm+`oyo_{x4GzCJUfV4;1b`9Dt+gyri^$qSFapd(g2-8et1-4u2FGS1u2PN&tR z6J#+KkmAj^_Ad{1lKlFVMHD=f&++4XvNIg>J+bxm`cxNazxI`Mt3#ojXt&FgzMt<3 z;dOb^bEYq_6Fc#rboSIhRPl0qdU$zwLs)eEMI`!0j~BzwJ5PlTfyk95FV8}eYtH^_ zyKSq>{d-5Ir_1xlcxD2) z`utV=zqmaAlJ>tv#?1Z3*FL}YSC{L5&1;`rt{*9R`>U7Ro6mU5h>tHlah27bf9!R3JOk+H1$!jg;$?i37Sn0;nP;AcvIWFDA8W5FNm6^b&V{9tdbM(MD7~ z7G~-Jnfhq7wF9y73efdQhatc?9-8sg&troe@f$%_lsc&Q;(Py-Yd|Ovg;Noa#$I$N z`rLT?VHl&Y1|EGkMCc58Z{cEcYXub^p0AGv+Ko^}Q?_Yt5%4&nGKIbvXa(qvSj{r@ zXdKUJ3~AB{E{Kr;Gn~1{xZx67tG>Rs#cEb)kkP-XFULJ_Rm!qdLgyKzp?&Z)In(U= zKx3c~Y^3R3UVYS9_EX z>48HrNPdBEasq^FI)uSMAT{egyy2r~Cer?qayRzB!WeQ8hXnaDSqoDIgcIJ!UFjeq zinbJpI%~wNFuKJBO%b0Q4T-CGA#2VHPFXINL(A-VYfMoiM`i~-Q$!@Lyhxv!QU%Z2 ztBZsHp*s;~k^nvv6AU0eaA^G>dq$GE$fomj!b_`kct+DF^_%f9&$isszzej|SHHg+ zYk279&!Z7j@*u4sHd^4Oy?SMJq|*$OLoy0QGrjUNDd<@HG6quCQRA_}idXvY*dg-* zVSR+4{UMTQ_`KDRy2g9iBkYXm8Zf`L`@Eo>OQODf`SIoUiMH>*-r?orpS#@t9PMxY z)#dWTAL`@xfB$zb|NDQqJpSoBeSg6Mv&$A(+ni4&r-8Q3BM&zd5az{$UlD^d7(Q9#7@u zS2|!ob2OSJ>rL>div2nzk*b$rkC%jh_o1(+q%dH`pVD~7 zFWYdwZ>nT9scjKmSW6TZXolH_c9P)VuoQ)=^wRmu)z?NP-VMB?1=6&h=eVT|7gz1) zmvp9^d3aKZAALQ_qSfb<&5D8{ zzMV4dRIPNc03-j&%%e?jK}ql4m{GLenskLxS}MnnFIw z|B)IbYjK=|mwzB2M3HxZMT#pjooYvdl1E32Gub$fiBJa4A^EtY99_Uqz%#Wl09w7V z6Uov8)9`kkF>G8N;ww(vYd2;F7<5mBT^%+Bf?ycArXh^+unv z;gky+wP%v(NY%EQp+#Y>Rwg|g)9H2s9BuLwS)l6^wU}A9yw*7kBZ9^K1b&l6LME+5 zW*W$B)u(Xtg4vT!#rqt7%5iE)l`!R;_%)IZjQj=gZOfei^fapc+5THclGa<9!}G_i zA&vm^%O@XQZeO#`(`RJ)hR2XaP;9GiUnXYwI|B?ko9-52 zX%Y-S+}KdMdOF?sDJGZpJ~;s`uni^>HxhUY&rSfylOnh`+_*8D-X!S;hSH;lqM{Jw zY^^49H{K%%*c0eUS6VouWuqh~RbwZ`l`-)`X??X=P;(;STmS9TGx6-tBV~icKfi~1as5#>LSDlqA+GqYbQ*1qJk4pE-`C1c>R^ERspPfb#ogbdcB5{a4 z8N%xXcxd^deKXW!^KWC1GyS1eXE`C$TE4IXLfIFm(NC>`WGdY-_(1!~iG}(HNlPcX z*>Rv*e@-Hm;rY~ZL0}x5>lXk$#YIG!>B*BEjFn7^2e!!@53=VP=+hvO$uegcRXD%A zmw^k%Iwow(C03*WFMc8XXwbjWM|wZMvpxeav+Qss&ma3u& zc&a|!{ql=L_@}>dx&E*J2G0&V__ZHxS>y8Y_b~e#9ejDY{zNYRF(!y!p59Ap(0&aP zOMwU6K>8iTzh~tn6S5hiY+7g_OKG8$TePDXg`O>Ybb`EN^+IRDo&@I1Rz(0iHkJ#o zf=^r)TMV#$ym1auwJ!M7u>yV$XY|&GH*)p0)27<@9|?pok(@{?-m^oggV?!PR<{qB zn;B!5qX^*KLV%H?Zqx;CeUhuQabuRCmpAVPZQ>OBbrI%a+(1u_LK>&~8pdcHW+g=f zVDl3rV;)vwt+1pC+-CSm@x9ze5xjt2Nn;iLh7Hmb|93t~3_VPsWp8lX2H2D8!H$ zB+AP9FMGb#pt-c#$3Z}r^vS;(^bvN`pixwLuALjR009U_EQV3NUXuJkVaCdkNu|2| zz=z^@bH1r`t$|VK=}5P%O;G$#Xi;QY)(ra$8>&$sAZmwb!CmG%FO}`*#31chH8FJi@Z8cs0^^?;ng019qv{Kz`V9|C zsEWoctrT&`>heM3TbW4!J)FV3;A>26oVElJKpXFx;Tv+P1D-EHwb;JBe9c2-NlA3A zBj2nR1n7<2Ru~GZml_1p2H@>umI@=^Syh0ImpAuB_e+QZYA>Jq`}U_~`FDS}>EEXV z7X)u_tabd<=O-9JbZfiU$ImafFHpZD*q15CFkeCFz_=C2VC%spzm_t_G)8FrZ(znF zgQWEUCc~wa4etJ#lp6?PlET)Y3lL7rB)pihQ9(Vb&MAdwr$P{daVx|B{;AC|{=#Np zi^4~6)_2}qn<6pZ%Jc+&@;oX56B1)t*;{2#trj$Gr-s-H8K~FU%>quF68X~QB4~ubQH?t)LMT9 zSPaspmeL&>DC{3|(mUVM0#B-0nKQ)XFFJ2JjRYunbtFWAA3%|*&=f6CxYHrFtQGD* zTwD|(oTwy77YdTe=~1hw)+utp@~MVfsmU&MR!GZ6EjC37RU67VS~68PIU-jufk`6# zV}<1N)p*hqj@ie~zH?%K2Ulu6S`lXtXDtSD`e>-GKrm~=_&Vwn^U#eef+_5Rw4K6G zcZ&|XEa>NiM4go!B2KnlOkia(h#RKsrY$2+M}}tuRctK8+a)g*D|L{Si@*1^_Q}54 zZ&$t5^Gw|<_w^o+0j$1hLt5vaO;s7&U`dApP~|hgrD0PPD*6_XEQmoDK#zREd|<3K zzAwgwUK&+sg(A=cvzc_LDr%WxfLsUyS5;aH@8YM#q+^QQ+?ddXyUzSyB$&I{W-L)P zIg>@(_K#OoDXTv4#U+4dt*~`je&JTT(Zj<`k}Ue%=PEmXZ@D5Y)c5tBi-2Fqj3qa> zuIcr81L$uu=f6Yy{ol}+)e4ZiWOiqcU>g!VxLpM4+rW~ zUDvHTwE?`H{fBaktoje0rXJp3%SlTE)13YR^pZINwB=GOf8wJH(VbW~5Ngd1P2qUK zL)sbCL08__{}$IkCABhwA@QD3I!iNpEZ#Ck3X@RDV%Ry9RJPouGD@l~%=Dq-7&_+^ z86luNHz_lHBg2u|1wVD`5qX5iak(JF5QPYa`Z+WCIytV_w`tvdEx5tv>q}ryK8AEz4d0DA45v5J*`OgWvx$Ru! zbjb@b!8@<0gBFZ70pKbK?U%W#pUa{vpU`oJDU`#FC3ubhU3soQ^m!m20A47&{!p%= zT)UPsGD#UV=EFEvA}^jWPk6sLuQrz)fG$hVeQn?3_x#D_TK%n=s(+Oj}*aa@%Zk{U86g%bWl7)#c&WzQ;9xX(+j!?$ggLYcQj8{5K^(PnIfV z&X3n0TYfg)DfZZ{bOvg$S!(z2^tG{NpJ3&3t)1d8aW+3Q%o~g3Wsr|DFly^ZIfbIN z#EFkFT{)v~zp=>xqZOg`$vj}8Fw`rf4{%ww8_c#(r=qZIHxOpZQ^%rVO;h;f3q$ZZ z?Z~X3@x+v?h7FAhO-duC3vu#m__B%MO<8_r;=ZVkI~*upS}fLettmG-+Vxj#pPdd) z5A}&x!Hu*Ysw>*XXNIM?xB>7ugpQOgM8+Sw)`OYI$2||ViyvO46yi~{o#>=6epAXe z9#Nuc1&zfT`N?LSJ3a;zf65%T7?}bhG%;)tif^Y*E%Pz9`6E*Fw&Ft6nl*EpNjhwJ zTSNa_!y`;9L0OMMQy|S8;+shEr|JHV4F!ecY>*Sd`fT8etBD163G04p1BMRd#BgLErCKd!sW9u0FOg2|XYM29UuDX@OB1)%soB z1N!xv$?Mz9nCgw-f~~q`oN2(XN)m=pY|Uv6htpYmQ&fwc#xWyaY>phyg#!9G+Q(0A zBKUMO5(|)R9Y^AmO@cEHAl><25hltoNYDL49Qvdu9##3DPgpJm8&-j9x&GjoumQK; z3SL?E5e)h}#w4kp`1`4K1Fi*sE$P%evDP-z-H+$S?GvdSf+P(75CqbltB8|5RWV*K@MrA$-PyOr)EeBZR*{GJRSU7p<&_44jJm)oZwp-GNExmM@1j34XlO_?6#amP&gppg#z|ka zO|yW5^&8OxSOg;~<^fyohcJ!*M@lswA`s03;seISVz`z%8nDSzH)1Hv4L@dHU}0Qu zEHnlOkh08_ATfa&>mOQ&G)0qsVq%TT=r+dhL%C=s_>^L-OgcxnmB-ocWRpB5h!sT6 zfbH++pbAd?B8PvAUMCP+z&CEGt6%B_$VFgl8?BE9+yQu3i{H|tONAYmS!c}|KmY2M zI%ZG0uiRFl?&CJ66%@%{bg<7xTl>0Imc5nR4pY!()-v4ysj^bC>T6pj+)lyLLTC_B z{!kDGOnuKWY{|PI_(ULlk#-On@ra5-mUYvY(B2> zNI=`Lb6K<^(;9ecaX7~d!%p*5cc(~)%;?_$kMJ@Di#nOVb+FDMjQqxu5E+=VQ}vy< z2AqN`H(Q^MOQ5MOk%ks*H@*op5rvivclE;dEO!L?Fe8_un-{3L_SDf2>1ocLg;m$f zo?E`?I9!Ntf!ZKzNd%LXD~om)4aqk5Z~%a_ZaTVC!~x;{K});Ruq>&JiBfzL;7=jhhB_TNgs-QIk04|DfDudG&K z_j_#~tg8g#)^XB2!*sXQtsAm)n6bIBQ=Q}P0Z73tQ3marE+v7zc3li+Za7tJF}UT9 zlB*nC)?8uHx1=v7>Q0I2!-{b+KH|pI?u-kFa-YSgrwq|)Blz}x(uR6 z!9pTg4nFF0Cu^jC%#F2(1FP7u1e&65@!mo9DYdo+ooRjSYJ)?ujY|;T4iS=~j!MQi zm^)X9D#aTysms|$HT%~sLk(0JPJMEin@t2ky>`Z4^WcSHp*G+>ry$q2Elviu+NGjp z5Z||V+VzY|S8m?}Znx3lDID~*Rd!Y^1FtU`#;#ptfVaB*I!W_64W?eY`pgMbQz(=W z*Rk4_w#w@+Swg>1qJmKB z`NgOd9U#aS0p(gAP?RW{4?mWpLvhq(^~6*(3zw#~D6RadTPFm<|pJX2$Y z@jZA=nuN&`R@rP^UsyxSaF!P`PTlE&N{BLTBD93Q0lA3+NeH#TL6cd=wg*o$X#qbhG*p?Sx-N;! zB?ENPG~%qQa#q%6wDfq+JXx)}%ImSMPz+}X3z&1UOjcPdhdnS7unxR^=c8rJ>jORs z&*tTQUV7d`g4%d~bj44qn+^oV3r2PkGi!+gU}>LjRv<1H3(Mi^7jV;EahG4d-?0(d z>!1=D7o8Z$ z0IYK>8_Hlk*wPG#WNXeT)*$5Z#%rUfo5BmnfZZf5CW{p~kSEYLlVyn-b72YLfC0)!Gi#a0Z@t&Cvxd9TU+_G%_t-EQ{hBLVf8nvk!R<^IKOH`@ZtfSK6jbwxd$U3q!L@;L*4=OU~NyDkk;B z9SIg?rM~@3J7u%7wa7kQeRG}_qH-6fsyB=7zU3yH=J3|Wv#{3Tz582mq3}wKsmhRA z$|xNnQFZH`LbfCh7$Yo8DA(3x<&DAGkFL7PJC28TSZeF5q0?Aa-$Wv5K;x)-p>t$` zQw^og=;R{nmp%jR+6|+!Sr}GAsVtk!my%GK@h%A^gjKDZ3w`T%c?~*uzIB(=xl;ou zHy--DJ&El(xPO25*VVsf&Rr1vO`ZMqZ(nYo{pZU=8S%%`Y=C}qS@HITi-SLrI=_{V zcMFKT$nDC2*uyF^TXJWS-74}}DnFkA^8vH9q)rn`j=I{(h+W@df8))5j$nxgK>z$y z+@!QWK-tN_&iWNDzO*wI@XIorUu~N@IR>vnAn05j{)ZxK61b_G_18 zljTb}SXnZONMR{1tB}_sBfR!``z-sFmm4k5ZWONd8yR+MXZ&CGJ-Y6xZ+7Z5r=^d4 z?S9QTyWgH}MsI`U{0O2b9Y@NN9Nxgn0MUN zOsqv=G^F`Ow9o)>urr0=G?*@eoU)- z4zCU1hH1<+{wz1$xInqGEWUx%zOvT6D{s=Ul#zoriMHH}HjuaE&=>27;}o+#y*n~2 zJ={J;|Ctc^`islU$AABRI_Yk2s;-Ei?5zFYTSXV;xE)&cx-TyGL{LpSZklfIAM6APi^$LzBWlbEdncW&iEd) z`W4#-xhW+?DQY1~GS5&=hepmUQ~6s|ExA8Y>=@G1b<*9Fsnh7zlR}NrmN@u>D7>~y zwD#)a>mZt{0_K6^- zB#sfml5EWA!f7+A&cRQJVkg#`qS08-V_hfMH%yK;&G>5=zLL;zFALSmkul69j=AaUtYF%~kxKZPvl{|s$Fh*+ z5rVMR>KYDa$$?;uHa@Y>fM^H}OUY&Y-+If1vg(A#?zY(3L3IJAGTY-CjEw1M8vud0 zsxo(Ofo;|x>MIZyTy(Z=K>KWYqkI!+hD}MbPfMWUY^hdtUr01R3Rwa39^TVO$*zlm zH%|fX_T(D&EJ=3#75h)_lzWBNo;xXNo?Y!c{t@*){qMXZ!-c;$Ke{~p?Js&H`y)+1 zqkb7G+3}lA-3co>OSNb#JJf%#_(y&k;SGt50o; zHj$TEMaljILaG0w#qr(6!AN^VTM_xZ=bW^-UfvW3^DbOshM$Zfu$MdaFad_YI}LeMta+Muh=@i}1CFUK~iyiI;Q`9(a4O>T702aj74?TB4E;U<(} zU{f#%{ooHWY+h<8o4GXe_vm0M+;eo)ChP58uX&_8jTy#et29p7@ls9ehY+T|H zRbmCqbv6;x+o+JJ6|Y6RBoyFD8Ds**szEA*8A(&pMHS0r!^xLq3<-XS8}KS*-&uVT zFaSzR)|iy4YlR7r&~}|?U-4X1b;b#=GGwxB>lCQL*|jtG)dQ7U6Y3F;B|P94C${j& zH?lKrO>%Eda${fS4y}(~?HBzNRhvJMtAqONJcZ??q1k*%EDN z)8(%_NI43e>pC+7yHZVTeCipygMaITi8zTN!+w@%uK?C%<{8}8e@5mWQa7C{>Em0| zO$ZF8&Q#P47RL@xNFZyLA4P>)*~~EL;yuR$d*if~k!(|NCwJ^Y5+xK(%DJw7$yS1x zjZy%3>89nB6B3>w`rEqVfnV7qzp+zzL) zs@;OF)5Z$3p(wFRm$q7R`1wO4*1YnF<`Adyvg64c`Uc*$w#94hg;-#p2Y1DX?7J|S z92Cw0ofFk}tM#4e@>tTQ?B#1uPnUJ;N}2lYD>LAqJL7xng-1>C-Abp;^MKmc!zZ_o z)5Qyq-dXZ^`1JDpN#LyQZ+)u#k1sDj{2>`Kc(>B!VU>^X{sge{%isF@?E4olFtel> z!UN4Wp8=y!fHq+EFv|5yKrGYkofeOe05w1knEmSxtLuB9K41dEl(8x@rMy@{aG>k# zsV#BN+!TP@5BMnDt#||NGGj*W4vm&VM#~~CJ9heBDD9TGjv2CXe*ich+^^eGVmSBB zHYqt{Wg@6H9*)4Fw&(-b4}hNBtt>SR1LNxXK6x6^qJb2-dTru68TogyLdk-&M#RbO z^^%UoN;8t~c@~K+{A)Ljjc(&6{uxdji3Cd$MV?|E3M+N^^vs8mu|~=_)RMK>i$HT$ zj}IL%tSHXz011YFy!&cye`r%}DD5cV)inK|SvJD8Z`3 zsb&0eL%RvAuezc-Ccqc7dIZ23SPCuJ*oHR(W?&Dzxsj#4H|P%Lnm4=D^Z;Uh;t~zm zs0_Fit%v#KEN2obwg}!*N9i*{`*badZPaStc1iQI1{#}ETu4UcWn4uhHubwtVtGbaLd1ye5V6ro*vEeBPHpNhaY4|EG|fLD88gmGjz z>9b6k`wGnX35lA{8SJYtFNIGTnRRZx@xj5q)0{2NH+xL7LX~!j#L)Vpo-gd%!XEP0 z13+V@1N4p!Av|YUhK7Dm{95SNTg&^Dk_l{?La>}VrCBbC4G6tted?4=YmjF4q8*Kr zql|4{&AtuYxi23T^ewlK573N@=0Lv?sUE0S#)h4F44i9|3_`ca7{B(LPP%?poqxNH zj&TOc5VW~&{0GjgB75#>ZU(x%d<1l#KVL|8^7Zn`&wKLl$CsDy;osdFm!G>lw{jsl ze!k!5tgFBG`4ocxCC1(J0r{maG?6u1i@vqy{8h^vU3sKqYs?M423V>6%Gy%gql^5` z$bz|xg)-j+53Cv!0mC`jvkj#T*xZygOK8{xpNw5Sei`X#j=MhZMh}IG@y27Pf8uBc z4)uj%Le>#_Gtbf z@g%HRDcNpN*JWpWH5ZbP!U1NND^VIrX}(-n6} zzwSx}4YAn6fTr)t#dy;AGic~9wIm1&n#ZR>SIAFF1O9x88h|@Qfkh7Ege$D%o|^ZC$o%M z*DgW89d~M+xYI)Bu#3xXERJ#}8h`gf_2lD5Fi{&Fovd{VGf++zdKyjI=vWk3hT_kR z9g-wr0Y&g^=fj_wKAy~#^-%VILpx{8Nm-HMFwR;L;u$x`!?*OoO9P`iQ$$m47QoS& zESy{YOzK{W43p(s;dGP{WX+}JW;yBz3Nk(SVkUh`dDOYQ#;2{rCO|CC%o5n6#=DDk zEV!|{45Dj{T#E-|S~Vy$!j5<)Tx}AnHCfGY^;BVcDNb|EfFl+%dFLboY|{ZOE}~{9 z%T~r^7fEQ?6i-P& z)^G`>3w>z66dRwwOv&u^E0}3%qv!kfk^EkIzufERpV|5A`@tXB{{9c=tKWI}_ihRK zr5-@xk56RDpR;k9@z=j#U)?7btDinU+3+*xxM%P31#q#v(dlNd61~3f%@h6=v|VuN z0w1NWkEAgOT8Tm_bO;-b5c4I_wMqHTg2lr;83AoqE|`tfoX5lXW>6&u43uTzf;w=> zKz1AG2u9nNFjY~*(;lj5?JMFo3YEF)@?()p-4_wa8CRBq)EWpGDTBe1EMDj(mBu-XN?^8 z*Mk%duz_>l{wW%6Ik~ko{J{>V-PdXvL#qw zxm%>d$H|=>VPy}2x=EM*lqP2~b!%37G;=X;_ufvQIXW~=W-4^oNBfhd#aNc@f=$|w zm%99t4T_ql*17CuTlHC6C9ZO}%7tRLuvK#IY-qW`>gi%H&LYT+`wf+?zc7>60 zr)i~Su~fDhoJgdr*QNl(zFeqKVs2S%$3rS1pvt9bTy~$wo5hXnt=^`MRa}HZ=Um`p z&iXR08W;MfPxBR(a<2%jFXl`056c^=+yf$7u3mK!R+yqQrmI<-_5#+%R%M4*4?yLQ z#{V8rk-5LLT%n|eqAj)4t5IVEulm&@mWak>4;9|n8(&tC)L zPyg6~%068e{0NkP-&R~+KK|~x)2Y|meGVuzyuG;M=-=)M{>Ze@;y_m|De@xoX|bSn zmEHIJ6u{=tFC}gVY-6dz%nhP>R zd(C@NnA2T^G;!V>(_PWw^2TNr(byQFJ0VaeXjvj@1jc(P8KGl(&gIwFi959$=4H=I zv|94O&pMtvHn6o#5?M?3+@e&^D5{$L{5wCWHCpuxgJ@g8rN(F6`M9q#}Wo(Hk_{yWb6Had<4d zofR(5OeNyUFO?E3g$B7bY^ef&vI)^_84Twna->uz_6XoRwFuDo&N3SKvYR19e_Hgi zYbD28=tLrI3*7|Y#G|gsh81VnbQ?|W+SgaA75goVbfdycCz^L~3};r?%?XW3^{oTt zn-^Fzz|3A-a^S;_OJh&0HV)&{^4Z+q4A^bKweOumtr{fz>w0stc-8W`TLZ?y*V|VO zK|II{AuJaM-uYICy-%YHkMi4FZ~n|Yub=Pz-Ig_Of1%)qKg=Es-37s}5CYhTH!hxA z)_C|^>U|_sJXU!9%+{>(;9(QK@sx{)LyV7I5LD2KRx6hevg8L3rtGn8Y4v^$MFlyv z1tR?Uh=0+3)}m|E;L^U#lp(qut}EiB7th9bT{%2lIWZYt&u+EvOaOg=ja^CVnGhW(4eA zzrdIkTl^at^ps*+uT32>qgbTZl{8YxhFj>UtF-{cG6soRLoAnb3@F5xF?)3 zQA_{r=7l~g@~i3;sKB2NyWXUIEN2Og)@_^uD|)_JWN^?X3!#))#}gPD_br(wt#^v} z!mFF&t;|+_?(nlO*(w&ft5RGt z{+R?SAB-8qfjBnnD=EMiM~y*4D7edofpTA*QR8lW8_*?IAczZdw_;A|Nh}LCtJuc| z)OQs$%ol|U{h1XDW_8-&ia`tY2{ypYR-_624Vo?5lQfVgbYp;!T@_CFcxIu7f#bxt z+si>oY-a%1H~OqAX-n` z6yfULle|p0*7{%8JXs5CW&AciE33V7f+Sm75Zr)?C&1KC?MqtLf9uKaW*DDj?hZ3D zWbs4i!XEqrLv9@|(M%IS8*NLs@90$~ZCRt2D>a788(-e(-vUB3=Va_Bmlul>FYkYG zd|p2GQn_C?#3isVUupXvessD0Ao>LU1AqUroo{{iUT2RCeg@qEjvq+zm?8B4*k!TT z`<->%gJ2shU6nLrw0zObvuvi>!{ti2l3$lmciPYjVv0ATYYde0I}JOz3iM~iA`?h6 zWTU*YuK5-iyZ@QNJy|508ZL+gLH%y34wecAjRMm`po@E%a)VP@LC!lvwF0ZP>H@F6 zlBto=Y4f?-73}0>TYSL|+1LVI`<0^BIirr&@Lz7yRLakz} zGqsFEESlPKNR`!BdJt__T}FehTV-O`aaWvclOfMNEUStsJ1}V;=#%YhMBaMX*A8={ z!@52Yrji%4AhwEIS~&D^iq>WoZSk#rpKb8C6V*DL1Y9)|e&ud=akBP|if4VF#(YT7 zuBdf6Vvj~~X$R$xWxHGV3*xxV6H{VSH)lc$I_@BSFE7aCCMWULL-8qIca5kBO+dYO z$NjnDNEI}mvtP!$@t~a+VK+W-K$GJ6ERYmU z{$(*^^#o}dv_l%#Um5h4FASezGawb-G{v=kDywhADcibm%M&b-ep~M9C!_|m$Im^|FWsV7 zQetVX_ptVoq%P)kx)J~vcGd5_r$I*9GiL}9M$;FX!n-gH>^jdffJIqDfiW{ePC_)p z4xk-J$B8)-WaEPhpTHPpBimkb*S`{Uqg42iF1db=Q_t}Yw}3yrkd99TjXp^Tpu%^d zj$l-E8g(A_p;L;~=M+kQ_G`6nRRMfEqLE!NJN*wO+Yh*PNN<*Dald23$Q{RQ;`El{ zOy=$trY)db4D!$A@z~YGmc*J8Ybvx)8uYVPQ@*;4)|c-)*|RJ`P4?NxQ~?7VQaT(< zaPDncU`@uZCh7v_)^YnZDIcV6OQ{eG&*+L=n`O&U*ZaD&?IPo5RRz0cdW`90JLhPb z1Tk1wX?VKCi5D3=m!D5Y(QkeDH}@dv6DU`fv-i2vDVl5rWb6)mKDr;X_6P(V0$>~L zP@vQ-!7A;Op=-SSxVHBY(S+%9=qs2nMGl8z2c$KU4Ub=0f2#$-mM-p>1G9j&S4LGX zt5R2F7cK{ox~J>STRc2*6Tjmtp#HUiNLmy4tk7w!h{>n*5V*a5rbWZ2kNQ9?Rnnw! zygXrJ2`|kCd;}}g)F&FU1dw<({!hEwM%!^9pIL1AarIo>3CC`6W92$eZ>#F|wPEVU zUF8G#vQ_lE8j_V%5`gyt zBRCYNWy)3+I-kD1mnglpru?z3gy`mF&9{rIe}5~f{j{4R0QxQ%>T^#5{>s7Iy>tVM zK7Y{H?`~=Lo;m;ZI=X)U$DUgGl;}R+e#eHJq+j0r*pSj;aVNwPTz>wHb*QcDicYLn|9D4GvBz6JHvZ(L+U6D=y~c{8bRlxl%RGVD_+a znQbv^q@Vk&1JE3+Z8CL1X@OCn_%L&4-UkZ|*TURgVS>T_j>W2gX!y6R5ofV7XsRry zBul3|MuWg}9I&d`geRgF=7`VmL69Ux>SQ`LQQ{+vVyG%qxjzVk>CvrIZc-O4J-f2I zny81JeAVS{;u>Z5J3MQ%i$Y}AV9Ou`C}l3Yo;V_}5sPIf7n*0aJ9dzJ%SO_bWYdi% z$?eY=&msxyD5Ds&E(Im`#yN>Oi=;J;Buz6-PV?=U5d$fFiuUnb{V{f`m$3Pyq59f3 zN476CirBdK7|k;2=@G9;JEf;$Gxju1hK9D!olANwW)hRnH3_xSAoQekENWA;l#bl~ z09c!rLKt`=W_nnJW@OP7gK4OsQ^UB#NCh)weBc>b=E_s54y#UAlmadl%PO?sAgn}Mj$iJj2r&yO^ zo5a0~T_9|_n5s#GFI9wAy)8#wl}RhQ(e|e!|F`IqucKaM%%w_Gave(>P53PQcr?*#$z{r)}+)J+spuQaK}b=L)+-VcCl2^CSUHk^?z&w+Faep%K z^S^Zmhh>uQ%cuip*Y<7~PigwG^zx6Ijk^P-~*f@RMCQ3Y`S2cPcZP;v7DBs~i~ z9Rh0ijhyzKG6f6)_TA9^DC}cvF$}S>@tRTNkS#r6CN_#Cg0;X-IX(dP2%JWE0*sw2 zP@lm9Wq*NSggIp^wCk@W5Jdi;Ssb9D^`%G$om$jP@GL{Fl*6`Op7Uz!c>UQ~;8$PY zl?%c~;_?v3o0ahrrgOT8FD6DSb&Syh;tUPPea1(XD75RNb+<+6!>r{i5bha7yg+cE zf9T?+Ea=!gu6r_D*x9}FPAl=K^WLJ93?l?|8)!Wny_sNQQN|dz7AUPVs&!qRD(KKD zPh+b@QKQZ{l03W30WItfHLB-6QtuRP3PjzEShkQcGk((Fb?-3svS@@QIi1S%Ur&xA zuG8(zVYQ8>6lHuIpR9W^MuKCW(?`UPL)TM~)c(HteCuc{4!Z0A$a3=i17H)HF89K1 zMi~7XjoMo6>B-UX?l41s{w-RRB~KV@x0q$}BFApsBxBt8wj{Oeppx|FAn`qRRBL8j zH|xzn2%54rqc!!KW*9N_hQMZJ9m=xvrII5>>!fx)Kt13gRu!w;Sr}92J00Yt!!y}@ zipAG>*I<6)tIBi3=C=-2b-pkjsXUTslsg_!q9-@$88d%3{*IPQ^tOzEN9NZAO|-Rb z|GqVz2by6(W%#%JTEckxiB>G)Q=p~AE3ZBEhjjc5m`#FY=_%$d{Y($XxuV#9eMe9L zU4me!mH}_bm3a12{rJe92h2Te@_c`bT>FIU$-wI;+SI;}?0QM=m)}utrQ$#S$lV-& z#_D+ef%+f%d;I<1|DDUHe{s3~=&$`$mCJj>!X`aZG#js1+tb5|{`8G45MIyA^y{iVCZM{V-07g?E))Ao z@#V{PMWZG9WZfhq4km)3vM7wjy4BNGAhQPC&$^8OVryUi85Q}_3-EHEjljyPnaZT8qPyEI1Dhki24Y!H|1L8hgn zStyWnU#xFC zZMCtlJlgojto{m{_V-($`81)O7Wb$?gJelv{rfi^U`73hF@foT6*gt^aHMNj#Z#7B zl9nsdZJ3b`=sfPYZr#b%?+o^qf(^yCWz(W_TkF)VOK-ioTj(x7K0jpQUCy_wyE8s! zr=NJ)(J$%qm;TCiz3;)7e}1|B@xR?9aJl>*nSR0FhtGdLd(!Uf_gYtW$42WUEphIO zBVkMQ%H{iXG4Sg$UHg_PZmv4+9JFlO!zlguVTiWV2k%elslwYEk2X3*Ehow(8KLa2 z#rf_xT^6ijXM5cW;#I;$;RaHU3-}rS+(u{8Xe~m3cUEXsh~1C#wm!_V+0!+BG`97n z&z(XgS)|n$Jk?Vq;0TIC;4V@GA4X}_06Yp0{Ka?V`u}Big5Hno`IK`ghUM$m+2T&@@Y{nUQ^F`6E zBf=0Q$RUQ6k)%5J+bRzafG@6HPfdxWR??8R9d%6Vb8*Tr7H#VPXjRuv>VTAzo?fALpI@ zQ7ZZ7^I@MNOjus2qdG}y?HiOjZ$eDaTH5-bzmkc$_mw(Z&(B`)p^05pyuOhI`&3hw z4%%%1o5C5E1xk2NqxuZV;zN+xeV|mVXZ3u38~{N;zQ5=ItEM}JMP|O!lmG#)C{$YQ zz;27mCbNaaw2iw}E)zs{FU>3*nT$J$-X;BL! zKmbWZK~zoj>@k{G%XK4A)(D^{7kAdhz!KmMRHrgH`NId^{@sr~YjXPh zP#lb2{UrIPN+`$ERsZ(Mnddx*S_$AK`G70f~z>9NIe0Q~ag zwmL6F3SQ=>PCFX?-Coyik|}M5JIfiij(rPVWJL&LKkP{t$Fdu?w&Ra=+izJUP|o=S zX_Xl?@GYMxxv8KOBCxM^Guq0~6*L7|^(k3-f!$UhmK}86sb~5<+pG?)O1L+ruXhT#%oRU0&euFo2aT3iorp90 zmHsA4S=Jf(_17JCz5|yAoFUi96Mp#-!$t)Hd#(!A)xA8^CWd2#iu)4#Ed-@g-?401 zWF@v&kWF7dp#&p1Y_+`!C*EnL?^mAoW+j5%d15k)Ye~#*^TD`CK-xUX<}@IR!Ddtc zS-WfC0iWH@-N&C;eN;|EyNV~_>$bz!eIBksD(Fl_qcR)lZ+e*zC+kdtXMy6kWy$BPIcq>?_NW{w900Wy0B4zigpA(2a-k=t>Z~e>waqIVzD1n1>rljy4=>se+3Q z=_RCL)PT9GhAn4g##Va!>>3=xuPvwa-sWzc*j*Za0K)t88plrX$ z-J9!DB$&w10drU6#9Gl4QXE5bNJi~`=Q8Mw*Lrba9RTOVMS9?%NwXqfDd*&dtFp$$ zMvovV>+2N_E#>vVaGq(V9$4G2UGP&oq7QI74ki0^u_OI@g{Tl$p6rJ%*9~Iz(PuV6 zQScpOozfwHMFrcaQaCjl3P*=Ti`{NOLTfFY3WbQfET~nWZgtUM3d^KC9^qZKeUb|E zpYkGcT1(ArTU=o<7(_Ip&6I$NFe^CJ-{#qTOA8Ji49GaoKa@YBCkT$I`Xw z12yZd`waG}J{9L0MxOE_D}Xx-B&Zh^(RtfeO!C~n^4!k1-KvCDY0=|Tx%@Xm!A`d6ma`Ui{{q{ zX*-Mg6}^IoVyxb4N2_Cyhu;3*uxzclt!6G+M2N<*4byJu=6Jxg09Xbl^h=zg$thA< z+o<(59*r^e_o1Kh65?dahrgD0=OM*|2o+7%Huc_hxjDL{>e0>l>MB^SrLdkCxb3TI ze+b_J*$dQoeh6^KWeCMp8rrLWq1RCAG&70R4RFhPYJ1p>GX9m7CTvf{oRaKScnxdE zKDt7^hBeb~z5ARH4TEdEO=B&J4QoaVSWZ|g8WA=LmT{%9W$O2qRVNe)Oce3F%M^@G z^LoGUkJoIVjq;EJx71kg4Vctm8ob6Rp4b>zL`-yY&0>w9G(;X!Hb5J(nI?X=O)4AA zKeZ2}S|d)yoxaNV)~2j#?JCbJ>~B50`>Cc>TB=7ANTqSA);n<}aLEgDW`o&*ocH8- zoawoa#^u;7**Q-01#OcjrX8;X@=V|2%HHW;q$Tm_Cc&x8emgIkWV$X+`;(5Whq6l% zFT}L3Jc|N<*-AIiZ<*mu>uZ4_Rg|%+3|g9!Z)jF{HiI9)ZE9b%(;*jicAQ1Xi9T8< z#w=2s^FS%B4j7Xq8DengYi}QYicgkwHny|mEAR4-2IIz1QEwB4f|UH&_5F;k{4Kh&o7f%B3?l%QvPO$IwtfD4Paj+2#z%HDg5b@w>8)?8jw z{51h|Auuc{31ywup9ApA`_`R(+={oywtvBk^&hP{ce~xsqyOIjaJl`3J3RjNzaq;I ze(*cj9{}gSaQobE0Nwxm6ZcmG=U?#?Dqcr=m72@`nafgzU*irhdwiNMyi-V+9rSti za7se=Xh>-;Jsnhm*T6au2khN}QM7p>^%`22>B1kMQdm)SfVC4d6}B<8ZAKOuEt#Hk z44}BWPOs-hblS&f+6RHhFbAkJax(dU;(vXvZOX*9=8cKbRB#WF0DufxwM`AjtBI)n z9ACdV_=vE!HE68m_yYztMuKoPh)o9pPBWdpdDgTHXlO=|>5;hd_T);i#+CBq^f8RE zuwTdtG^0)UGG1tZ(nxgkleQZX%F}_Zyh$3K&rn0q;X}juU-yd$1dNs*6{|(YlPm?Bb z&c7U&1kwB3etR0~JDRkgNfmw5&%A_W2A|A{lJN%8$(hovZ;@C3xj~(HX~(~Lrk47_ zzuG3ZyzQfLlo2JvCkSDzu=V4IIx%y>8R6{*)Ph4L`V4vi$#>4S{_iTx#-9Q zmMHjgz*St=-(1j$i+%WlZ(u%IT1ZL0z0f~;y!Z$J6(WHx!d%zVM&LK?iJ)8jW@2q1 z1^QGBbZ0+3*WW-A?Lc*P@w@+vPkrim0IR=NvEqLGZcFfZ1P9yC(Dj|(1M9P&yp^Xz zlgBwTFMGCMzy7s;JbO(x;kdH{y>)MMZCZ{EY+JT1YwkVwjeifk+;;n%TZ_Mfo&9>$ zJK1p$o&?I>?`);xrf$!XeAnF?KmHqQ(8_*Hs$Ww7oiEV+*5&pC;QVi05Zv7wzx&6R z>#qXm@BLR9vO6w*!d;)}0K?0t{+=vW_oIPd`RkXrJ=T5c&JC{^?MWHGYJq8)F<_p* zA#>{pT?hn2195Mp+OKA0Fxl=>Lp0rb*I7YUTkP4{WYbp`D}yd-`fESyL;e7UH-RJBLJGUH=q~zL^Hmg5(as%}xc{mR)$W zKq-H1!LEyk3lwDyzXDX{MBl&&gnhIsjA|-tsi*ssUz9lMfO?0ovN4j%dKap&BtTjIV9lk+X1n1vmy>odjvt`LX-*8yp_co`l z@AEhF$C7NPr?H>^W{2@Pw0NURtq-*Ko*WMhkJS$IpVGf(vgz=!ae+l{^S@o%cFYq= z6J2h%zre!N5NRf^-?^skFl}#7M&4v}WIVuirnbPlCjihER9g~41#G!g3;hYtj?eS2 z4yrqY$usfVlc0sSWRv|aM#MQ2>#x|(`ctX>t|(Pb2XYSBh&!M*rqV4i24nT$IL3Ai zsjgD(gs1YxEL{t=2uu5F*HUHM`W?^uYFzfub{85OMayvY*A!z6Z|P$bhvN+!ZJKrP za~OjG`j#=`Gg}@Rb3$49mi=|2>(d{ZU;2%~uC=jVpq~EyMBmAf@!yh%GqLV%UbdV( z5n7+FtoxuJ-DcM{J&N7_QgZu!nRBZW|KjH_xBmcx|2u__^j=Z7 zd|W+-c=Zr4+epW|&$(>Ztsvb9y>%3CtgAypUrXchZwaKgHFkk;?dZ~{b?EMUE)x5F zxqfxP+5Az)qmR4e!^R`YPD%6$i2C`eohJ08jrKD#fSqAQL3dvWUvZ|0vHkCv)fq0i z`zi7Qsy-udKHF$ePaf@B@a>V$Ajfa^*gx5Lrz~BG%BJbi@QOcQI~ESj+=8Lw_!MlU zbJy`X190M8nvqe|b!N~-#X{G3H1isQ4Tipic(M)4#nW<>)_ElYYWx)_)wemLq_Aa* zI^}$tdFX)Bm-#dh!invHo_Nu z2a4NfFxzyqiT(LZi2B!TT%z?qTHWbbO(r{^e1z^azw=o*CMI{hapDOu^b$Q2!m*{|fKa%9Y(G0Tm}ZnEZE&tTUPJ@`4(6 zx_5a@!ZY|LL~vcO;lxjeZY%hDucHCn1Q=MB5EOhlu>xmh#G8D(_ahzh-+b7z271H* z8Ma2&U?9$cmI9Js#ulym{WM{LzE`tAb@Ut)tTIg@SvFlPgn*$e8Bm{p$=@-8nx#sU zT74Fbm2VtP?gPs6!s-*nkSaO5O^GVD!qOI94$4~#qaHKP~X4X$)= z1}v){&6YvJrGOqCmIL^fhD+Q;gDxT-@l%3f*( zgwv^E+H3hX{6pXZ2-ufkHr=-@5xBIryfXbX%SKirxhM)y8#Du8#w>R1FI~{KrIQ6} z_GS(K)cDxH{W8!V*DmKM*lV9dTe}Rkx@9g{Yy_WLg~J!NP}BDT`9s$!Pvef5K6mhG zOQ&H|sr?qIY8lve(zZB4pa%%v*lew>`j*0$LGD$oYomQj0BWi2?4!7P}%vU=6 zIn^6pXZN&^u)S}URkY72#&vsrZ716MF7KSO*ZymGC))N~eJlVseE$L1*!fgJDMg0$AM^;+}O=7 z@k`EdfL;V`jITZn37qNKD>$~qb|&9xuNj{U6&m&MBxg1`6S_-n+a@u5ZOtz`Ukp=UajmGd4+2) zI!;etHa+&MYcj2{@{AR;2BX3;Q>3K+@gyCNPF>HXo@(M$FS?2M_LEQJ3(9fe7F6i>K` z0>C5tZFf=QJFq5{ZkyJNzR6ffV$)1p=+6i3$5itWHQTSg*M_P%;0g$p4hUNciJZV`f@l51d!4Vn*Lg2Mvb539sJMCK z)(^e9-+4Idcd#xWw~paG&zZFhT6*s{-w16TnlM`y=oFykko~F(1KbU}YlL)5?aCfx z&K+jpvgX1m1s|;MpkNTo2`y8!-(tI|sgvVgg8tBxiP7uO4@+|b7q%?Yns*aJZD=I6 zcM4aOb$-SL>d*q}f*gQQ zzE*#GyEyrFLHn;_uKZOW2j7T=;tKy{rJ>#oNXr8WH>e`s|JPxW!JY3_-Yd_Bp&a!!s$P1E+k+>2ce6V+hNIqT ze{0S86Ys|V63+g)m+pTCcYo=RFSp-B|C|5ja{Hk^cR}!f`Mt}-uX=>rql2OL^_~6h z*zhd)Ld35{Tzl6Y;jiB6zqMx__ZrZQeSO!t4#7$)ccl_cbrZIG2e;G_5H?G`$2$iB zEx!Xta$aa6Y6i;f@$ddZUR-wW7gzeFfxxk66IdDnS(?EFhtR`AqhxU0%o>jL@&01p z${hC6e%@8pK~d13;{|tgVNb!Udd<`qd<%-$I4+cT3UJs4p@qg7M3mA;K{!v3pE~VE zgL@t0S7Ge70!X?Ys~lZq1{+x3pi6iFTIYbYxLiV1m?IF!DllxEu*IRNqqsE>trxS|%Hl}fR{H?mz`e+Y*L}&lLJ^W^= z4|Uo5r|9By{wCvn|Fvv`{!Wp)|MBIh5}z3PEv zF;sxQwqIR+tnz^6EUxU8{`e{O^^wOcOXN8pF)M*sz={N`QT|1*O(t8`*=J)ytFpY>jpooClS{f_VvdKE@ zd&i?sms-@>Xkt#5;)gAY>NBR$DIa(@oD!mc_D5@+9sbH*_w~JrDkTlz!ymA0e4}25 zoMBF11Lo?=q~lfybV0FOf-5VD8pedK#`SKO3+VOJ(nfgY-OYm}&w1=u7?(W*>Ag%} z`?6-6+Z%wa&BZ&3k_)jie9M}91%}^Vy?xgz#QR@?b+GJvJ>~a<%k2+;cX{09@|ro< z`1SLtx6`>>BXur4#@)78h}vvFA>3;B;1^PE%M4W{z}BL9Yne2KI$eO%``GsG)7Exd zcMgn;+g(m;4T-inc^3+Scc(qAAhbpVNyg{QPKBHxWu)DgtW6g=qG_qBjB!su>7s11 zSYB3JMjrn%>tqN{3cP|!+cN0Ii2mX)KIzJ7oYQ)CdaIe;6DK(fb$h7Pb9k}Vk3c@U zI=bbUmWADaGn=h9q9Ky&^s>Iu?18Os4PBOiu7!w$!N9f60+8 zLIX*CA!~P*H5`&j5+!OksL61mk-WuF@?vD0x><0;g;LWiR&mNy8E1MXhuV%B6EMSLe0ie#FS$rf*ahR8-&=-k3k&vh zQ^xsOW6stm6NjZ_ZXaD21GjbTbrqSVm4ao@?eFG@z>fI_(g1kx()d2$x8e|f!qN|) zey{cGE)@Q~&maBX<@$g8@LZp}bnvgfMesdo_MbWRe)l7VZl(K38t#dfEB^buGaIzy zj)b%NtF12 zPs7j8$*FtqY|~9aY5^$&F1GQBeUD{(i=U!_ahPm&a6j`2bQUutEe8h0%cfYVOY9B8 z4AuH_vq!+)C~9My&;|~5_L&-rsHxwKlknthJEG(Bh#T0#xZV4AdzJLp_v`WN{tE82 zDfdnJ;qqGl|FV7Zo~HZ$|GfY7|0(_*{A2Pb`_b$l*Ppa4IWR1mO_uHWa1?LY54@%o z|1>{l|EQH__DFl2-<@y3d*Nb|tUCYm8=w=~dT2Lr6cXK*c6e~4cnA!g+84rT_L4%e z=k-iI4ExZdaPNiU{rOr%dp||}ZQas4p^GOtp1`wt0<712s8p@*tWiWFt6N9POCgMb zt#!Z)Lsh-8-MML z@%DZ<#;2~~ftSe|uRfo3i?Xut_S+8$mMnj`TjL+goFV&=zlTx&PKNwW`u!PT*2$h6 zT<70Af^;*snd9=2WruISb7N~V1OV3kfWTvSfRwdnfB`lbW4MQYsPmn*nbK?k{m?I{ zWb3raQ;NL@Xj$t4Q~L^AnVRj(iji)*X+Ge|K(4M@jaZh}x^@FC`S`1M6trR%;GWd6PgIEzpgTtG+-$^vfsLpM#JlgsY!Jx%M!MRy|P@pzY3$ z1T1+D%&nztX@J2qP;1SFQpk7p3cWqNLi4NhhQM=~bXN%tX#Wjr`>jLoW~A@xxH>WuVP$C4=*-fF9#Tzg_j974K;Atxun3!5y1KR-e=BtFCjPV-|Oij<4-E zOvWRiJnsfMpqYLjn3qDYO+fj*$tYCXp6WEtEfF}>J0ICoPH1|?uw$vZ629X9Ah+dG4~9RefelT%qdx1>+Gk! zT>UO^ZBtQu)%~SI|6j{qkB@@)I-8$5{wLEu`(y(4I69@U-EwNXN{_A21gKmc*kw31 zPWDF5tHZ+OboWNU3)4nG%N|_dBHnzwwq|_Mi>55PUhi9T=8|}DoU3xbiSGC&^MQr^|l_|5=L3KS!ZJ^egQOHw!S=kv0sd0 z)d(0cmjI@9XP+@{nC{G5l4u+c^tIV-aPG>mW}R zwbt4-wcg?3r~CHcNh=B8LG!iOf4ZSz>&=qUi+i9izhSB4C(!wI&G}b7fbs+4{KE@^ zmM31p`PYA4X6}vsEp2RhqYHcl*wccg!DM|>=bfe32Oac6X{QZ)q`MTqV58Huthh@P z96S#;Z@1=b!ma3RvsyO?im5!+u+tU7rHa5X3{#qT`xg%X05YRheh7o;7KwcosX^t)urRHL$$B_-`+;q zU*E6gKa2Kfl|}#mr}la2+cqKpR)LGH^q&_$XoNQ77i#%K=w#EWoMV+7do898yqMwV zk9Bh*Gng?~2fq5~g5b8T_X*OiH4hAdy8p1N$no06-hihdhl@QebA$;Nf5D44{>)l4%)S1R7x25Ku7^>sJ<{T0 zUvKX(?Di&qFEzTo?@2;e9MkndcHh*ze#xMceUto)}1rn$;=;BP+A&)}YaBE0{y9 z?)qqnA;0V|Y`g>V>hX`J+u(LO=D7Iom&G^BYq!Nc{96-GhJ}m))Nsi*MZE=v{TAh> zPx2(6YEj-|xlg!Qu^**qnwpUoQ7xn3KVkc z2Gm7+RG&1Ci}ps_kXI|bX;c>uT3&S6*BKcoBcTgpHy{QWcy7YHYnYDpbG|z2Q^~Qx zxA#W3nnRO?()_jj&g7q1`!jE)<*S~wUhp3M?^=&6{}diJ`9B|;3*n4yh<^#%T~sJlmejgsNwicD&7`R_ZG3>Du-F3`0cs%U6fpVrGg8Jx%Tj`4 zt7{Yg(Go~mauJjl#js!lg{gMl13fPfI0G}|V|4m2^DUl=uRyJb)b60G3&4hUZ;Qjb zI~w*6y_kQo%(|DF;IPXX4DUi**bH-4=4lf=csz)<{mUj;bqOCv=992eH)ja2>ia^ zo@%-CT@UF=YCpE5;kM+jUYy82MpLn@!1tB@;e5!_l!OU!#Ae=MHe$Jf2j<&K+mDkETe^ui;zqs+*# z=`2~?fjKJ=7;-x+c94;KtUF+8rqa)rMmnVd>NmIDwR|$*t_jZ+T8|mHD0WKH?R$l2 z2v(r9%(D36ye^ol5-@rM%p^eYzKhfqn_z^Hp?`@7n<=oF z5o@nnn{c9y$N0s+_C}Td(W$Gvf`C@SG;FaR99AUC%IP;Cu1$1pyU*Ff za|eh6U~R{tC?$f@8qka~F5~`>?I=&n2yXj_UHYUy*V{ z#mip+=5W+&F>XCa@|ooKd+Z%;pRGAt_UQB9e4lfOe({qjG58zIe*S)2-RqCO_8VA# zW69$?6p2}&+;&$gf%s>@@*{xFF<#xk`M~iDfGHckS+CybIU{%>e+ZXhSbnb-Epz74 zmNi;OY8`uZL5Y5HU@KnvWX|FYcfX6D93&kvlXkH%V=rs=lQPlnTnLCiS6`o~p8p^A z-fh{E+e*)!=ebT*#S&RfQcb$)4yiAiS9|LLtc(2$dLD(IM=wEL`l4^_pd#F2*rLhc z!Nqf}!#vOZeLsL)xn|8(EJ|{OMH*FWW+pIzL?VG7KL!SnT5f2eVTJ@5z*sinNJNB| zst7y|$-+Ybgg09a>+o2ipOy1qb z!59;ALM0=^g$5xL;1+B%VTjHscHm}=1 z;W0>%f0B(SS+G$eZ35hjtPznmiI=g8^O~oPRPo27{4e!D`Glu2_vEU7((1>@-}~^- zyO#*{I{x~#`{Vz26~C0f&s55<<=@BTX?+$^+UK;s@Tbdr^Lv4-g1Ulrk_X>i_(VI&D^}5l^%6A_^#n<}9NI41m+bqe zh7oT?&;*@_d6XXrC|Ggug+fxMvID?IS;3NEGp3`XYkln*VZtIrY+-&*@@<+%uso zzGx@h!^l-C_qd5B8-w4L&`;j9%CFU@0y2ZE}j^h04}t>7*SaIZgZoV0nda ziG-6kLaEDXI-;G>4JU5Pt0l1ZzubwrcWMDmBcv8DBbk=UJN<#$$k}#@FC&&4kRuwH zdh2qe(&4xl*J07teIJzyNp=w=F88CQC12cz2T<>3d3sy(V{~txhRaW2kaS2L30%sd zNE>D&PXY<7GTpiHizBo3%tMQBa){dpf=jBS;&-?$q#4p8WXP=6jT9dMb%2uZsI>UG!;(h#-0u)Q*uFPP6Z3NQZG_XMwryGe3mLrl_x*um%L{}j+6z} z_{R?*q-M#~t(mEFR%g`;J`4Z+FS*ILhG~1b77%H>KH{GFt*Ax3zm;7ThCtkEEOTA^ zW{qL4z1D_}`^#!$Mu*P2*e(OQA$x)^fFhRq&A$LEWx*B{0cOjERef3g97_$(aeFpz z3yz6*L?`RT8DDebs5G!`me95^S6xGPU&@i@t&>*Y0q742)10n4Dfu%tLh>Q_w%|a3 z_VZQQtqxBznI+xyCQ)r*b`mR&YtbCp-OW>EHUJ(+(#DD;Ku$$QIlv3|IZVsS=!?Wb@ohoWGZO}wy$5;nT-~u@ zD7&#;<`oiT7axOd&#hH78+sd`nvn+}O-86@fc=-lQHne7T@yIS(_{npU*$eQ+~X?1nb4S2#xkV_(G!XS7n9c)rKRMBskBTvVZ|l zpiH=>N`T2!)dH=~M8X@aPQZT9a_wr;L`HP}5Xva1S3%Fy+UN!CGqr^NCVJ5ioCI$~G0B z)*pdd!bYvN3mC*QgY;WRfZ1CB8qkbQv{O1=I;KZl)01V(h#lgq-*%0KpxeULC%fjN zsWeb$1bDS$=4{~3b7L^?+W4G1Pqq}CacT?1AHg)+R4~aGkgU7IeZgfjp}S#@j-BXs zS>)#el%Mg3b2qvHbA8Rl&RN~Y?@Co^{@pREjjy-_pij|Wn{XG%NmX3RtiJ(XMk$Eg`C`mzoiV&M{LOhS`SFh)juVYDs`x8Qye2 zp9i%i*p38FQH_jJ!RP?EwP}z&Y6hdogyTm|03(q{Z;_f}Z-pdu16-zJque8!)rqvN zYc>qpC=I|y8#W|hn+Ds;*_&|64LBh$huZ843GAY^sM!-)ev z0#1cuB72cQQ_{6#xyo-|c>kL8Y;<}ZhV{g{(?c1{^hX!JD>qJ3x$5I{ndk4qOLTm9(UK*-lZOi>6Q2|EkZHPSghljP#HK{v}m4pOG zP!@PC3GTVGz53h&oDA8@=zsH=FcMNF;wTxG99jIGNaVR~F$H|BuLMizEV)cPVi^_? z_Fkm#X7~k|0c2$a<_6S)Dx_2Yfon5v0A$&+;RGeWUN87`ANW?(xGuRSkR9tnRNErG zHWBE3n``@NcpZGL0iXQ)VEFTzzFzn0oS8Xvd%NK?K1^8S4ua}t;y-piIjM_M2I!u{ zbnQ7PN6nM{QmwO>vEH!2z`2ww794)mb=Zz9h18|i0I+^BB~>`A8956|khCDtL;Hp8 zBm~W-=5a4r@RFk(l0243I8KP`9i($N}a_*BkPmQdbYujlIv@~nGEi-AFS+pQjb*`zcc-j>C5Besa2u=i5DArx@E?{k6 z#0B{yivFI}W6C!nLbxH8BqHA&5!0KLr!HAJxshH%NtG^67-3AURygq%$(}XhPguFbv>o zH*6)O-V;YW3eYhv1fJX|DImqBA(%W67a5M)N?S0LU@FkiC52QB-b3nb zQEO<@Rve=-O!W+_>I#qQH%!lE;M_bI!_hR1pY*8UA;`$?SZ+DOkiEzOiKZb#aMF;Z z0+Uq2eC@@_!@^CFHxA7p5lNelLF5Bu%QM>?TOsXC+^F0JHETS`npg&S<=F5nEMM zDwd;QKyHZW-5lqtF}H!q$K>SY5fQ`rYZdML7rz8|Kh3WlTR^*RNB#TfFOuua_T%)= z|IdtHD+vW0#gxyS&QX8-0O~Y*^$f1q;3Wv6rTpo>ty=b>ygYkSj?^kUbYC8|uy)9v z8(H1~z*;%$;Dy*1Dl7M;XaR3SiCTGm;>zY}l<71Yg>l@6Sb_NJ0Ck;JhGxX7b7jp_^vl4b78-je0R`qSz62IErPFS%Iwu1ARvLOA zW6s?Q!6$4J`t&KL9lrvQ*;Dkv|G>I}m4brs9(%oqJhnPu^~nI=(3LJ{_{o4>{emuL zc+N``pk<~aqgMIMi`JXo$8|%q@IskN*4rUPCTQousy(r1x3r)s3)``#cTVJyulRxR!~&QJ7m&pVjTvsh0G|*u;4IO0 zOHqM4lYkuMsA7${L_BFx(t%}XRiI0@+4*zeXQ_04H;~;xi_ZDO!QjagzLN4T3$}k3 z?L!f|?>EdDdj2tb=W2piZ1n(g^u}@a66BkrDb9@A-P8%fq2?l2gz`PYJRqNb4|r$z zAVBjVGH0>R7uM2|Sp&wJ*TpO?I9PCuH_pQoK_X92=r*SIruq1+g^k;97nCD30v-0= z&&|_2TfTPQMF(Av#Iquqe_ts7$pb%D$fyIZIra6Yt&iZd4b3 zH&h!zYD9~nj^PIs0#a1)YC8Nx#X$q5Iax08Rk|zhSGK-J}9U9Ld;Wjp$)VCMxeci zv7;J^{j%U05Ut^0Xj1O$m(>o`UFO1=1&-`A$9+_1$Rbr&gfWYExNrQyHP&3Nib|uM zf6U4Ghy2uuz~=AK1t{%Wo%6__=5g%US6UmcDM*uZyHKgS*D^-#9ZaTbDCTgaFLO8+z>$#u0@ELqGbQ(Rj1lE%Pi)3(Bf7z#~2Wj8Ch}Y&QaF zFl5Sx!o0du>n_jYw)zRD9tCD6hiulcquQ`*93+q-U3s<7=2765rWL(msrPsrAL%s4 z5(l4p51w3k<0?;@cf!1Ge*HKH=RcYFlx51vvZP!*r|@pek8rOo^OOni&LNZU#6MmY z1)8!>d_1%q(yURNWyWBNa%S3G=O_nNVJ0Lyxd#SPFDvL$g9%WX!30a{7-&j8z~Ih` zg}nb@ANJQy%Bfrv$y0yFBR-co8E>Z`wC%w9K4u%c5&Tp7F=oSl@18tT&jY%&Gatk@ zWE<1ZYtPBEoyL}JFS|BvTa2u6kX85WwJHpcnCjlPeXt-n0bYm)jFt#eCgMv?0l_5q%$6T>1xK<1xOg^|L2A=<{+)ux3r|b#NiNJDp`>X2s z{oBjIAN|Nlby{msuEi0sf4_&^nA9b)4-Eb%(4PIB{jQ*w{Tum}6#eWioE#jW0@2By z-DuiRw8VpMMteZd?U4j%S#L~KxK__YZdRBkmts%p zi*E6qowc$H;J%z(b5ur+XYqMFKi3sGz6Iot6=PC;LKpO3?>bNw8()&SKbzXP$MQ@ zsPVZL#N(evELS!?!4_R3Qsjp$l!i##ux0xkX{a_h(`%rsGQ@DQR*prlX(9qI#|jE6 zP4x3#l&xW;;oV50$SJE|yY3&AOIpUSaeh+q1zO88&yR|sm0vAOJJnWx-TNS{P!Y>o zybIN}6IIcLA9X5!dB0tJ>kajQdJzlMdQWAjRbXu1ANer8b;sA3&Yt?~h3SL4fF`>h zrUFrCkyWQg9=ku#m>OIDtnY?dpHu%ix1Gd~w$l7$%C;r1+qvycLL~9A%~D2tHiqA- zlTKSp#!DPk7-7nU+5TOqCI;B{wYm@s1X!=d5AP#mHeENyH;%gGs5r!-DsNbSfeGr0 z4xo*rEkwgFuiZPt<2AVFG1&JtX|o#8YjM$aAz4|?QS5B^*(ba)zA(Zc27^BShB@m$ z_#FZ7mqZmB{9AknpMAxR|AfiMvyuUQKmD|Xc~f-MgC&`HR@w7_%w5s@xok1!b=vXa zRGQ~RfChwF1|D0%6b9$l3?Wp&JCv|cQ?SUX_V7>OHom=Gn-#Ut1xO3omy`7Qfu*NM zRW2`%mm)w%mUCY$J!0v>@lP+zvCRsTkPO6)!Lzi}aKYCKBSXl2sUR}$#06;W@kcCI zk*$*7q$wMaDOTUV?#uopAwu6Veg$vP1Mm}9{~{o7DC zt*csUSl5Ydz0J7*24nW-cJXX-Lo1kU$LoBpDs9E~Ae***oxqaQeyD%6{j?L?rtxh{ z$`~%2R*j&a?KW|0dsJSP1v^{PAJCRtdlw%n7APYg2-Y6Mj=_U~_JS~Q1{JWYmIK%U zX5uOfBk|KzA&=@zufV5ZmVr1&`~hjOO#&(x4c;ZRkkn_G+2vAn{v34&ta(w*kYnGB z_XptW`+uyFD&Be}NfwWFJV&vqgGLXa*u(d@{`JoX`%iq;xQkbFqnvx4PkHz3ot=qX zGJ!Z?af+K9p^Ay@H9bo+uT!nTjY@_omFmjA&t6b^$q1(abK*O!Ks1~7E5eJ41&G4{ zSwN=03$J;1)CXQX6Ol&$E73gw06+jqL_t&rI0aAY4(BWh$4i!-o$Z{Y^y7=H=y9pG z2I=ai2d*BX;uy!?T#axnLg=o+KEOvUv*}^EVXsaNGH?4K&qD=b=g(9un+#yZ7Dn73 zKXt(zQh9hVHsRQ4a!(ve069!Apxbly4O?%RSJBE;paW|Or&VB>jO{2zfsHaf6*^=k zya`puh9p}-`@uW}gHrM+wlbb2-qh)Nq_@;*{uiyT&q6%7iJ}5^GD`W`P|aBWdxpys zs@g1J?K)Ybd*Y>%9k#VRfWdsBp-mhS)Vjn#BI1Jbq=(8u z(&uT|vT2AhIm(`qn}B7G=A(A4Vd}r5W5!=#&OXf?ji(dmVx2);71<%G&c)FIgf&aK zaly@UT7G}Yfw?@Ldm6pR@rf5bNA_RdiTYO$2Sds8o9a-`=~dWALx9$*V~KT!>J3fn z+!#srJgu7}+1oHFsj`2_1fDxL?fF1#Oy5LWRuQ^^e|c!GbvFR!sfEimwv8!pa4nW0 z1jkmoqPjXO2rT!bE=Bc0g=X$ex1Yl9HvqI?Bmi6BzCgF`{?;! zVy5TY4S-J{qME|#bmONdkqYQ<3PLDf4H&JM2&8pspElgE6p2D+r*iW{o#acZUQku7 z)LO=o7{r2WQiQn_ii3her3aOXMgwuSnbGXn)Xv=^sqiG{GgxuCrY({$svnjYG&*kV zgCN8|f!+)=qo}mal;DgjddAZ{>A6#`~C`@odCD z)%XYHXZ9yl)FSZ@^#teIrp(@T#q}&Jq%W$+UfW zWzn!|UloZ#uXlc8idt6y*HInAE}61`4(?I`X?$kP*+jtCN|<~*{=%Ve27FP=X@SJO znGt6?8-4SV$?p-%zKOn@VC4ZrO+4gj3)y?w_}0V`I1%ucJXN`*ZJnlNs>X00YeoAd zuBwX0h*c@Zd`@;9f6}mJ5kHI=7;-`>d2L@VF>RT$`00oo`2e<{%!fj9t*+V8y_h9d znP-ACf0ju=&mm|s<~G+R&^rHScv}r<9LcDzAu`6l~NH0H-Y4YeCwFcYV5Bj9MT|EFl14!{X-T z?nY)z7=^jN)KUVcjigN1VT!=0IiGQ;4CRk|(8I5yQn* zD^T{Mj*beJ4O50Ka3AVAOSl8D-k)ATTjacSG9*d@c`O|Di?p1RxJyl0WI`sm|8@o9 zriH*R2q$A|H&BDgt~H)^ixJctF4tm$Tx~B1>wX{EkkJMLG;=4x+zFr&7*2B_&$KNH zfGonV@E}*QUP^4)GOflq$k8%HP$PJ*Mv}&8599p-*gOwGfIJPdceF)Y@Qyuo#_}0# z#9o6IBC;RiB>=O-tj|%G!%!hGQ)epm`I% za>Egmeb~;DO!Oa+BIpjz4{vKGDpQ_O|80-FPt_pS z728&TJvpT;V4y}K9mHrhg0N$~nBW?sGcG_XX6WHL?MeKIdNb$5Y3d7sS()Gh?YmQl z>POfOxFK6MT&oVCX%8XHyqCbtX>dq225U6R>Ob)dCu4pF@|qWc*$zWMSCu>aN8)P! zap2nAoOqc{j!=d4_04_pC;wXR-}m#?XQ^P{^F`;mNfqc@ZrEE4zAU|m!S*O!uTtf2 zd@vr;ONR*6J31XYs!k6r$<0hDg-RJkH^eBRD_AW$0OctBO~bcSNBEUw@o)~8o5smYyN_3{%9CZYK*pP@XuLm)20Em z$wK`6^~JU?+Mbnoa>-Lt`i?W{yAY& zk<$~Et~ghh@rq66c-MZHza z-}i57gqfCIDjl!q@v}}OEMq^4*joeDQE{lkAY2;Y`&3q34hU<3Pnswgdn+|YYzTZ1Br;dSr%3|`F3mz{JP0N0-p9PHJTjHd_QwG^4FgZ zh9>sqXEe`a?sJ&$>xDg^px&SZiJa;UH%7|xZaka*+1`h(?TSi+)2KMm4QFx?b;1ND z?jn~c>p@^w6Gk^gPG!gzY-bZq7(HMLQ?yp40Wj{@qPviUJWIf>uG9uzcHQO9PFs2| ztIo`?-F#v7PNpOc(U=;j4m#r=ekCEMlWk2oH6M0v(TizQ4Rf{v+DyV~((|eG*xpbT z`7{9~BZE&Q7NodY4QL!OV3edqWZIcch|KTMv`Lo5V2(t_0uM?g!iulbVFBFUfQHDm zw3udW9P{M`e}vPt0d+!Xswppi;AZ|4k!|01T|6RL{M&Uq#@BR(gd^^b9O3P{9sh6q zlz@sel3LV!v!8OOWC#~1C7V-)HDZvaN%TL!ePMKp?lxc=;+1vmze*(XEB zoKBynKpHC3NDjs<0Q)&g%;QKo3|Ybep|O&Yu7m>61Zt_^VZ-{nL!3++JNzuORz;$U zV!NJNnaLUks5u6hqx;o9nC9jnsjMXspoybyL4qZtHH_xY^bF?!ZLFDNnWlTm|)A@|Nvk%q*HABYb4s~STUYNyHoI~p)ItFxxg zSOd(m=C;;DU}jUeqGINx5Pl$KtD;;!{} zNugoRD!$Q-rn!k5A!!!!7B~0Hgg2kF(-Hvv6!iv*@O=K8UF)KM7NEnRzlqK``smHG ze3uYw8Jyr*hYkzQvo|UQ*#Wd~3nzXu^zhxPe~#lt?9?5pkB(lN0#V(;ms=9Smkjtu z_v~#PdWyJ-OVi7Yt6h`5Fu*eZy@v)Nt~qqEDT( z>$<>IHGw0R&kCfFCe`7J^G8O-URBCCQU=Uj^9O8--2ycKd9H-}eERv!I)Cdk=el}R zs$BA9)#Zx9(0NN4S45L&@qgLh#5Wo5{Zoja+EPm=6^eIF`K5F%gShUbdDJ5{vbhX| zxJZ3;WJGmAaV46P7IM|kb1Mx@-O6BH;1V@*xwdBbe+max2F3uqJGbHD5kWlQiFup) zWUj4V0JQtr0-N$6vtXZK=Jq>A!Q<&PS}*m;sQB2tY#P8;P+7q?L8_!YxqNmDm4vi>9ok6&)xml`#OUX}v642FvUw?!dGV^Yx*E#UC zfpYt(>oK)P%1H(Eb9(1Lkkp$c5fR>mJADbtZzl%3n;kh(Io|Zo?m`z!4wV1)JpQ>9 zJbI@ZH`|QzfR|3jQE*Ha@>Hep1ZoMW1ss=Lm(%zK8EY8lVu<^6$WjS+J-uvKuuUP+ z8yA?dQV>plTroII4^Y!i8oZnpZUz;;SOO=%Rh^SW`r7%h-TV0tyejgrz*+mAJ-MMd7=Esxdqu=5-26uyzV_( zW{BRYD|asLjadSI6!Gip@`-q!xVp-@UiA*5Q_s;AYo$Sv@lz%wti(>vl{bw(SMU^l zHARONFwCOv=w~nO;tsXTJ7rg>)5BHCnAUuYF!Rm|wxqo4~wo2)Wn%JwEW)fVCbz+A5BRN!mb zpslmWsCg2YWy`2C3Ogr8+ifoDjB4Nf8vf3==>p6gvjPXBOw z**^;u9RhQ{WA%gz@$a{y?w<6eCUd{M_50XUdIuhG@CsF>O%AGm{sIe$*D%8qpcPZS z0oICVUEB2Gv4R+?=E%gLss#%Rvkucdk%=1#7c~cwRp4950c;AHEl0&oUCi!OSy=YW z&U&B5q%%a4rH37JXeM~b3>YH$87;qI#>6w}6xBmO7k_(r8NQo>H9#Db#W z=*POvHj*^ZfUK=GTPM*-Y_#Gqvb4bbr)6?Y1TOirVbU^^2ZKnK12TXIpe*d;SMRIg~I76m2d5Zdk254bZ(_kr!^2hAt3Wjj5|Pw~VR< zWkEYY05FReQDM}yyuQPh5p8o|P1j5|Q^pcW(`_rC#j#kV;TP)+u#QLRobzy>R&|D2 zk2|dSPk8i!xyBN2o2o-E@mRu4F?4p$rLpOu`vdlO|EZ`pq~Pzvp5G`Tg+Y6he*$#< z2rRD6O!m#|@OI;*Je+9DgK1(HGdqm8yVZo1ferxb{Ru2L*Sxh&0d3QFZ;TZl z&y^J+1$cl7k)fZzGCga?ctu_2X8YBOyU^`!QC+Cgz{!$*rrnf>*q+gZXbpQ*A1n&T zu1KS1ItTV=W}rzNHs#Qtc^NK6#C(MydT1$()_44;CvdNRXbRLPTcHzzMJqd7qa$$% zIO)@7IHpWE7knK{sAHzV+nC7;;sCz+q(lM`PP!mX+ZF^0sFMbv#OKIk8^6YgUoJ`m zE;4vTwjPUY&kxzYUoL*M@mpE({Fb9-Yw1+rNrz~00II3KqAf!?WdvsXMc-XYEG*dG z+nPs>Ng)EjT5V8eV8xE3P*=zTsB+Ommx;jgzPSZ;0>o7Y+hxt;WZ0O_kqUM{*cn+x zHURDnU9_x7U0UiSS%<`Ich}UlGq*AzpHxx_2uboFjQ?l|sXs0%n2|Qw%+M~+79j3e zH0`wk8+9tH`(Vmx$2?cIY@od2QYI+@{2ir|E!#IPz73GWnrX``^}niJ2^YxcV1<{) zgV+rwn7A=I&mI{H$&@o6Mmuj78Tx;#IWU0Sbj&t!{TncQu9KJs11m7=cg#XV5bjhO z|3X@S7z}>@uS(xKf!V8ob7Ri$mL=T0)8d-W*{gT`feEAc?!xto?cPI9+QO92$te0~ z&FlQyEITk|1)(}<73fp8%d5izC-a7GvzH~`6pFxiN7aFDdICUuA0540Q94sXD)Q|a z-4$wvs=+1UXS@{s)In!ixZ+%^tBPK_hVyO<73Jw|AgVnCVpSgjY2w9MI>Z62QKeDW zs7$I#(oJ(tCCpdAwSi{yQbvKRfVL_R0glWOjj3sRk~JBgY|b<^HH=1O0_)-EhK2y- z3a?85J4AT927%?sz^o0&`UTI0g3x)`C;?7@68N^6Ib;ps(nuTx+xmfRH6S6?rGX$# zwYK@w-ihs#6OQ&;rbMd-hP{+6e`V3DPiIHeoaqm(soO}1bsTZDMu zgp-CjHBZs*N~*5 z&ZwlRc3jaVH^7Z*lV&3;Ztc4RWys@k;+#W^n8XC+D3is|#vKfAr`&VIw$AAeKx^t;Zxfb;ETIr}{a z!8o6-`h-{itE?U@f#^)$XqFr8<{x1)0u_D}3H2?MT~r(zW&qNxFd+>}Ee{8Cc9KxT zY;2%2LAc^Wu`XQEMb!b=N#2MrofTsIq+Ju$@TndicjcVpJ5+?%T;gISLoJXq6 zq|8Pxtc3@NO?y(S7#fCefHRh;#$x7B5QZ4Zin*=WS5zCoHdIIjhbaiwU;__i)l*@E zuxiJQL-hh3NK6qgXw+nok8BA60zdJ>?1)fg5EC0BUw;am;8|pWgRt)IC^P&?#JBuX zz?Pfk7^t<=qcC|zc7+Jg^HUr+bQ`IQ)CfWe2%?st2x~N9$8C}8NYa`l*lTla&&>dh znodIim;q{DIEkZEwsN4_aKn6AGf^GN85`J-6GL zx)LfjaxmqY1Y|lhFTDI!-oKBv(m zzZ(Hdj=={6wwpG&7+RAtuR9e-4Xi5&yBn*snZl}lctx@VQa^i5oIRa??#bbB!(oPh z7Hr+zdat3l*eqja$l``ZW#bY&?Nv?3mq|g#&QZVakGNFXos$L1@B-XY(Ci`XbdZv3~Z8>Q?L)I zJ}M6UX$(v?3cc!>%gi}rO*o0|a)g;v+9$I(fG-V!21b*%;Zd8NyOC4V_#na6L-6F> z2_gI)z6uaTpmNe?%V3iK6s*>!*VB~0#SycQq%$Z@ZP8(%-J`+r@SzE!q= zZ0AkR>;7N!=UILv@oV|F@=KXw)rJl!<=2(H$|uTJ%;eAK*F+94-eqjwfw|zg`Ut8n z?>?#uWUOg)-vG7H4jQ{=iBroT>tgMh1In4MCV;&#)HyQ?NS_T`M%PSz3yZc+^05rU zndIJ{ZI|X_#3o$SXBmeK85D8Un0n5n3vFbU&B{ z&X}IqbIo6y^b0mI(if|mj#;_3Z$=-O8{P@b%3Mh{aSbEI%jTL&qg{KH3?FmpOb!DY zbME`MM4RP?Vcy(TgDSnj#No&IwLPEB@C_e$RmGv~7Y@GAKRde_D-OKm;Vs0Ye!6~mlS=?UfA8_F_oW1RbCg4Ue#(wg zFVC+(Z?2Skd8v+_)b`i+0Z@a_f^*{MJ+;1(cT2s}ALh*dFH}6g!YMfykR4-D!uG5j z0C}gMdHGZ^?vTkpUZkTf&h5adJE}JrLa}**lZqG-q0OT)?NPjGnE?s{@*wtTMgXm7 z=Jkx}>}BkGskV7az{Q1N*(U?gO#=~(WBOLr6S7>}ow*C}qJzxtaU3Bu0R~6Ap3>yA z|ApsU0H+eNqPB37D6;W!3h&UGJ-3-A}qPYV9Y}d)GDkvSoXID;as- z?b_OX0CTdRhZT(B7eoFe$g+t15iZlf%E&1`nE5K<$~ci?!*GW>mvPHpXj44~%}jdY z+kj-vX@SDC?V47Lut!a#+R;WyW6i{Ll_O9=f?=!C zY>@X7t{TGzOXIzbFZd)}f8{vF&!hRS{`z(PEe`TO+W0&>h{QWcd1s_!xs^ryx8;|~ zyp%6$1dpmFET3}Z-1ka{F6il>8C?KYM(sMgR+f4HEFWd#fase&TEFlo8yVF=q6=tK z=d2rmF*4MtanU!Ai&~@BNk)9BpR4_ZZwU&_Vav1u+X1)>*`AUIgm^~%Y){V3j3(6o z4f~YCnr$!H`qy~0C;w!|wz2%xHWqe_OjH=8(Nr1AF#0ZSSWrg3vEEPgoQ*JsZesRPWq2Fe`{RbWma6K&3)Wfe3YjWvsJ;+%LVF+Ju!`-*2p+i=JI zTe%Wr8_qV|?aNWVFX4VwWJLZ3&?>i`9Bk}a344u0`{yv|^P+=xk&4Q9bv8~eW}%9O zpdK1s4li;44HJl%<;8SmrCl_B%#@ZrIq;WBKY%e?;A{0sf;Tc0z9xCjMZ`{;jy+a* zhS6!~OW;(TGBL;trf1FM0ZC>O(L-1>H?%jW6F!QeZmfMYbO5q^a(pPk`{CZy|eaAV=SXpYq-A` z>;{NsRGLA3*iiNn0rec)MsF;ymc^Prse$u&2;-bE+at`I>D32-nGN zi7%T~<3W6If`dPe``MKz9e!~jdkOKPq|(BT6Eq;bFFPm!F>G{Sjzp|7+e79rPq?t|`(B&mi z7a#*#VyI|#$i#%S0M9=*Msk5EU)#2}h_Qk;HAqkf(R0L7gB&X@pwBQAS`E$s>J?cy zg=8?D)ZasMDU&HS<6k6%EF;Z;6awweV5%sX0w8XlEftw7D@u=f;o;8MwUq zAuLrBINP!%2O!5aK)%BN5jddwB6iAxFKOu-DCa_da3bgY#0bF)@+A>$z?>C-cuN}Z zux0Z0RC(MXFt-(e$Mno@w+zlb=YIb4+q^s%*zacJ zcmNum%gNjHD%FC+9qeu@KvPbt0+{&&XhFa`Y7POK!s30DUG1t)TJyU{3>93sVj(kW z7ZDY4SP`6D|JyxhVH&egUHRmN4(r zkJCRl?8gw_j?9iwhen}0FJ5dEfulYnwm7Wl}5oz!y@PuKjtHcb7d%d`m+ zm_w=}$WH_1wqV3+9Nn>DmL^TE0X0})SOMh#4!0DbRbf;>HeF5Rl9iqsL;p%3Gva4i zc3glNbw*>%4VVWX5qzM^C^2q-kEt~L@=0UPx01JK9e&+<-JTh-eLAJToVx+E?0N9U zVBo$RP5Iq+t}_)g{}#t9L0TQn>!s(>%+Bz`#VS#A0K{?jtWAN z(a88_$urw(IO!4f%yu&eP?s(Xcl|ZwhDj4@&J|#-4s6VE$R0_?A7lHhf@QzIrftoJ zt4&r3!lKtS2IuiGehTW*WHfAb0-iPpt)X42`zSoh@h8m=fQA>-s7vn2kQN&NwM`N~ z!rYS-L_psxg)7dHaWYC+;@$#@169LxOXiEoIcf{#X=9BkH$c{#==*PA@3C2SRF0}bKf@dK&Gsc~ zm)+)s#Vrdk&avBqbf}nK<96G00pd_tE6PLcO_@yDEx|_46c z14#{f6G3$~PClgfM(Yy~fNnqrV}nc*~*^%<<{pAwl~E z74bxRknWtd0suGH8+HIYq2^6b!-B`QeF53_BB~0;oI{W^smH>yvV7Wb8@bJaW7sk6 zEle2QZh*>RcOQ5mWB9}cm}SPe0J0}_qOY0h#sULSj*P(E(3Q&z62F+A_j zp?Up6_s5?3@e2j-59Hn1Xp3u$QM}@NR-M1w+5NhR3_ke;|6i4hrhoS8lBM0h_+|0$ zv*%`3vUqfx-YZyfMDq0l&?Oe-u01sFwO2U@l$*atbxdXj!xsY^Bvn zYmsNOlS-ATB4L+v+8_;Iu0vH0a7&JnbxArv$RJmc_Rpp-o0e}G)cm|KEQfk57sW6B z{Mc)JpL+?B?@QwEGQ1+`@w^jgxpXq!NfqZhUd6w3VoiplZ!nCU%IaJKojyllm^bNL zwCk*FSvmat(n-`AjB>0osx#Q33r}^>02CD`%$da|7``#l4TgibV>Zd3Q|q?u6N8@5 zO^?{p6L5wN4;G8T>A2{ZS59(2IH{9-H?ZSV6mx}gjsa-Ni{`F9bwyV+ZNlEI7$QT6 zeh~nb1@TUp6WOp}{TLa+Sl1Y`=bbK@bKsyeGDw)l2-O_}c$rgP=Cr5wkWII6kIgI(-dp^s|D6n#XUy_U!qRq_>KF>r z42iP1=9-H+4BX1t0DH8*q53a|5b6EuasgtVIHTgS@!?3-3KgA|gG{QQ(>$KhOh8sy zJlo^?i3x30*@SK|Hx8|1wOh%LpkCHknj%~qlAV5T6 zb_xi9Kupdf@6uR~R=9KPQl7YhYG0k*e zV<87H+skW-q^wG{v5QNb>~qo&#ypZSQz@zE`>7*M0Fy5b74?JFXL_@j2rbtz=k+y{ z%8VliTP|m`+XmRka0|(`7F=v9U!N+w>`SV*)E+H=l<|fmCxm_PScEC(vAD9nieb&F3`wSiQ8&*5q za{!IM08Kd!8c5qCfwiSl;%~vI>Ue4b^mH=m*EpS%Ze!9-FC8$Z@Er;HNvv1ei}2;D zyYOW-hcNo-AUI%6=1M@DNc1X`iGa6JWAV`{1lNMH=x+yn3JBt)YF*Q#cygn)*FjpX_hgUsqx>0+8Le!trID z)Eg{mM^+<2SwOx7j1OHOgc=i$I>R;yAonNsltp8DS9M|Aw{g-?o8`q+paEQh7d@3} z)E5AhlGKP#270dyXMj5ig>FW&a$a?L}x)iqwn0e;JAOT`zCma zLpY0B!lu23QM)v}IMKGb2G~JWK$r%J#mCTl^d}Q3l;p3eMwB~&@mgWjI|J%*ot)Mm zRwQ}~=gl`8Hij9TF&T10qr3qGVKxLai2~7C1TZ(33!2}8MKoaLWQKafYXE{ZvXkMO z_QA(AX@E;WoT+h)MQtc-drMkwOUh_6s$bf@dOtUmM!5m?*Lcu#cF$IK zs88S>kRkE{HA3FD9ZXQ49ZtfNCX7i$9**rIsR7YA%g>yq@-d?SBTI6wl#^kpNDXY1 zZB7Yi{3}3lo;V4v@w>3YYlV#Gz`eyc2hAPG(^-|UTiGJ{g7^ZmgO&*16Q6RY{0^Sc z2u;2{Z+*5X7epizCuItpaS-vzops5mo<;ejknwpt(Hj$Dc}8tP`TG$lSN^#$)b2y| zg^DYUo_T@VP?8?!ydfAe-82I&e^qD+>#Ra`l_?9Ic$F|?`u%9l{LVv+=>Ta#R+Ywr z!59Ow6USYIxlo_oyr{>pWtU+C%2Y9c9@Pf*dNev^iT7!-c912Xo$appTs2MD>Vpi( zM_Xx=c`|A@vgZ)jfLIwvwE}U+oHF2I@Pfk5b3O(IiC0W*Oabv2Me8zli+dpZb_f>z8m zH?8UnZJlX_G=AdpN?h?vj{%TVPWXb)L>IV?Lvpb4SV4;re6Uuqh-{H4LvPP({2aM& z9Px9_MaPQuK~_AA^Gat{^5(efk@)6CeY?F(P|5C1=RI`o{tbNf>)ju^4Ho%qq~lQw z2w}8$|Hu>HY-lvxkKg6rafu<#aZM`TDWGi#XY+oNDyJEAx5P90%*B~V&jxzMmp@(aeTDYr>IL0IP+2-$HgE&yYiT-r2;uKhPKjvs(b z)Z|6gMH`)Wz}!IDo})S!m2~HvG~8-_9j2jUj>Q@QpVh!VFgN-Bk-5As?Y{r9bJb6` zl?sXeq~PGUWkZe@@i&|_)4Jx@pCHt)G3XY4Sy}Wi@aRtz8XhM7c9R54D?m3NEj#Sd z`XJrHJT|pQ-_X0MKboAIEajXR`53ScFxSBTc>`;M)LDCM%o$cq=K15;O!Zora?Nel zm&3uu1(SA<_mt4;wxL4?;XPeXEHAjq^hBH*eH#DKq;u0%5 z)DV1qlcvUz0p>#W2FeT69oES0nl;|YXI7D)`$n)mjDEps^LOJjjK-!$1igIu*4|wD@eLmaM@Gy{<8AWF9!Fip(c zrMCxA1!LK>A@rV^8s_Df&5XcY-~I^nWnJKI<~fsqY^#r1J>To$n*KNHj8ppRO#azt zhb_MVP+kEds-6|b1MJI{(eO)J_YUdM{f431C8WuJDNQPVpop#JnN zEc9x+<91H-?OcDai{{w?*^zZtAw!H>n8yx`d!C1*c2yW3xA2e3$$h}A8l%samA(Va z|5oPbT5=vGxWDgtWL4nrZaw;wf%?7}oR#4Id zSY7N-P;p57w*qzC1>jsj+F5D6)}x|>W>p}%WBvf==$=nc(08v!Hv%<(8!V%3a=Q@& zP4?f|ZLsJ7u%XXv9>!*ms4ket6Tr2Qv&qA>3Q*J3%EA+X6TThr){jOGQLdn;kYhU#c>)AY^tC-Ligt_Z(QWp^)JX zgk{6c^(XS0Uw=YRzkqRV=K*B>UIfUJJY3)M!t16>ev9*u_4w#{rmT0LEq?%xWeW=f zaCbmikG}wzjdlpmT^lg)IrrPU%=x+S>Y)Y4;9mxV{{GK>+4>+|V`&fCKsvpXT7Fz( z)6Kf$Q~U(zR;aS+{*rLxG_{B4E^Ki{k09+es*Y~6B`>>|Ty@b|HjW*&VLIn4tSAnj zbZ%z~QSCkq(65IN&1D63K)pp&*oU2owswsX7)CF&bvX(M*W` zU?>2_@ZUy!lJ*^dBnr7Ds$u+^3p4A@v+|H5H3XnS0zlVP3xJ1ZD_dA1BA(Ng01T4> zYs4UM=Bt!{tzg9Gnw*ga#v$elxeAau#}Cy+^uK0Mb%RL@L8vwiiu%HIH4pQc2T=%_ z8`J5ejJXnu!``F%5V+|HKwV?Ikc1St zf${VQcr6LhpPItf`S?>XfHZ5s?Veetg4GY*ITV@L>X(apjNuu;ENey&%?DYT58h!w zB(sKl&v)loWCWzS*Ak#cjkSNE86BS?;i&;=svCww&i_s3)OBpzPA(qgd7cAe)D(yn z`!)^%S__kIt}*J)`lB*z z)DL?Wy+mg%qt*%}U|scNQ4pI5j9M44M%N|@lu=KX&oHWg;D{4sFIiwhq*&8~8JgO$ z1wmz;SJ*?JxbHc8J`1zp3>J2_RrduG6J^i~^ucqG2J{*&*`JiX2^hVqVqm*bbOBDx z>-dNYp5VSTIsk`72ZWZifSlD<6^Cpa2!bTS(ULtHyMX4H6?U#3QjqmSv_ga5h{N23 zIAkyK{0I=Fp|2wRW&#mt7)}K#T@8yWq5&h``9zV0mBl~afqQX(U0*QF5RCy)BJ&2q=K_jOLGo_-+z&u<&xv zI~&^)ADyVk*Yx6yF$Bw!Cy6*Ih?kTjuU0cSI@r#U{zg4Mj{V|NKCZ|Z$~qB6RmHOi zyZ|0+F^x35l}66*dk+$NW+rV_pP3>XhdM{D60?6nqGC$Lqk=afgta|4(S}X!+T*LvrGX($zuXV&&i~Mz{naOu zuv&>rT6c8Lz2y6gQq(=GJ7II^J8>2N>kD~31M zfZ76U`kuz7-$LkP3iL4xT0Z4mM%{N&eW>yPxEB}C=j{nWPx*TQSUVJQu}fY!$K}V! zdtF`kQQF?(7kl_CK%W`m?z!*itqCvs>hDlbz{@)KV6ZuPHjE!SkL|puIb_dU_0S9o z*CW2f&9%B`|2C^7^L{K`@p?UGdtFo-d?;nXBA4mr3eGeKfCzJM^c^aW=$|!kRlOl+ z5}?Qf^L06QM-CB#|LUm)V~~8r*I!^>bSeNJI00s}T-=W)0?3=FA!t!J!Ax)@6=51S zN_;@0fCJ%8f2<0_lvJ7M>Y>Ch*YaonQS)HYporL}Q#2}ynFI2oCc(J2lp}G*-k*5T z!jZaGpG&r?L!E;hd-~z0Os>lY4<%fG)DKSh8Bdw8V2*{a0;~X?eqpGBr|OF8jH9}u zPRNx}g9V11{ctBMs5eVBVNfHJX>~c!PI+2 zrwrKA2_|o{XC^sf!I3x3vc96;kOeT|r&Y$*@yD9M52_7Fv~rXAIV7D=_`sgoSdJBg zSYwQD_+xptz)Y4$ptb6ZGLdbSID;{J-%G46&SB0KkORyZ(7}+!I6v+5S^=BJpixE13_$`hfdjWn7 z-loO5Nm~zN3_1j4F-oWHa>K6TbD+vNqQ+3JKl#@%Gr-Bk;l}!hDh=cFn(l(Lp1NZo z{r>w@ChyX7{ndj#@3N9mk6+#THWq#BQ_g(wKBI2o4XE37J2tRx*A~1kdw7)7?l+T) z-PP?$GuLZAzWnAEfOmk}p1KFvjcqr%wra6mdt5KSp%DV({9iA=MVAcxR2Ffz{H_2r za_XO*Fx<|83EXON!xkK@F#HbFiy1hA2?m?XjCPj*IKUhrW)&eD)c~@7LZVC(GG>hq z+M_aI#+c@L&c-z8pj})7crm+}qu`5E!GV2V&IeQ2D|+kz1V|7d5hMWi=s+`kHzsWI)b8Is9ARcR5qNn0Z#+t7g_xIuZDQL=3`PRYep+Qoi)9)Z;N8^lrdG-km{kq4Dn@YmHD$Iwjfo~%@`gKgW->x`6sk&l`)1f;AE^7P59Pa;fg0p3 zuKOU}sX=POZDJ8VxbIIaKC260B4%ZAn5FL8FOK70<8SUpPt^(3tpYZ`=&#Y$dAWiq(XeVqAj}V_dqZ`>O-M`3 z4p385mX-}3ysP0FT^W5AzL{j*jI}w&a(V5`<)y=3ha0~0$CJvSRhJ0v8`KyxJ~KaN zi_sOkbTKX~0PP^dW!bAsbgryoJrSHKB^dMI3JuHTe9zY8Va$T^;Jfcoe5tyC9^vsR_+*k zZt;()ISh-cqY3qnhahcGSab!%i2kw{p`P}Ex*vMTsQY1URbt<-oj1VFwQ7-`J7m}f zsTS!(8ndS2EzfTKS2thZ%3vB&7vsL$ zDWldEDh_1UFlkgArXqu8ISMKcR2}1M7Ho4pxqvC65(M_s6)R$iR%F5bV)K;7HkyoG;Fg#k4>2p1}K#{n5hSBqc({ja@>O#-2vHf$vJWsv1%nZ zB3dK6fgSU?2EIgsDud4Ah8AnOVa@84(?I~jOVk&b$;ozy%<@IQEC9orS8RH}8N9;q z;s$N>gB@Kzz)Tz`pPeWKoaqPna>#afp*05J9Cd~!atr5T?H34-`r_M8pWFc1@Y(g_ z?16koU5I~H;VE$7?f`LR!+ntsjH{?j~tm4)HXhrKi?8v%EW zF&~=B70LR04{J8`Z^oQM%YSp+isRTsp*L?2a%dCX?~xi%r;vIKm5y`x3lr(N!@_Q0 z-57OG^p5q%c|U;j#<1^HgsURd06Pp@uO4W(o<5Q=0KwWy=qkor_jtcP`>FsIz`e$d zK|5*;oXc5*uW29Q2u#Jc5UuFlh}vRqacH>&^*lXi_0ZU!># zwyY(jp^iq}9J1_$Ap>kp=+rn2(OBEg9Qp!R#)Ek|b6&U%dQc>1*vX<_7Ki~4_5fyO z;Y?7N6n4!~7cQ=$2X5m2kj~j-m@SZuiO=4PH7sh8PPGwvei}$;c4;a=tD@lLPA8~B zNrR_^!IM*vT?Wi;0VS+XmMCmkzTUta$$&AFe6r(-piDw=XJp(b1XV_5&|W|90B}H5 z8VdwvR6r30s9mDx!Xhmbc5A1tkYOXuGw#0wfbqxb1Ry`#4yJ;uwio!z#y2SM)$NX% zXgz_gGNngv%|lE!#3d=;0Z02pW(krrSaY(sVI!g4l=4J&f@OrIpYaO1ugnCn|K?=M z4u|AdMHKWs06pYR!-e{0)C@3CzT5zA3&^l#&>V#_+Ae_FYdVo33!U5@=!_4*#=d!W zvLB*X)@%+i-%lO^%xocg15i)TP-{Hx)068n}F{{oMX_57%WJO{)oyL;{s zBMkb0Khsf{+}{JEKf%|>B;#}rrmX8U0_F0heq+!4$CnblBlLrrbBo=dAZ&gf!R@%i z#VXaiJKV>n6=*=+3D*-@weCxq^$|vGSOaR$?{i_;E%5DjQjUiUVeW>Ot8U`47kG?e zFR#C#Dd}DttZ%*=e&vV6a2vLBW=dhOJ^Pm9D{LpQM&q>1V$%Zc#%8JoV&!u~w^H+7xn%<#RWbxRBQS13&IlN)C%48z6 zlI93%sm@?_k%kSpfGIY6K!K^Y2|8#&Qq~&Xb!EvD^%S`A98eZLalkbg$qstRY?(!3 zmE9PN3_?*GOi*+Klu2g_fIGQI*qF&o`#K-Mn(V6tqy25)4vJ3)D1B-#- z1RHLFnVtaq6+59VDiDBYD%`1~=Gm|W5AyNjwKArylUK`(!>VD*6b;3P4hZwZ05RaV zv2ZyK_pH=J9!)Uj<)<#a3<#?xpjUJvK+``=8aEi&s99o*S1dBTXVO}a*(LVsCGGO4c`TSWRZBtxC$G`^KBv1_{+Xw1#V#E zBp{r4JRfh@H-feA!Ox(b5%wL=#Ka&>nXgvClG!r@4h{*}e>=X$66Are4FG4q7x&f> zoMFu1II`cuoG;k3nWsC!`hv+lR&i5SX#Dn%ch>1CE4aO$U%s|~+P)X^4|J@TPvYM= z%^d<{gz8jDNRpmo#ve6_a(oVqYp@_}n?DA|5vdIMK6b3ky?|Wr(a2@JymRQA$w7{v zbB7B}4h8OG&C1;i&izF0Q*ktz7pXdwxo^_Yu&`-Qe&x?`cOO{yrL$$J9{-y_+oTT{ z#^|SOEW2FY{w}Vc4o}XW>@&fL_a}@022i{@SUmX`}oXR0m897N|XCQ>H8MMGFnV8Giv;b%c6pAs5i}uYleh7R@$1fDNrX zVCvB*MJ2&XNK(r#4Ul%h7P}KnMM_#2JhPJ@tQ1%iY)A7l3COf3pw2bGD%%4X1M+Ud z=6wwVg6$9j+@KdCfVW^?UCAFecfEAfG0Pc8;|&*b4QL2mq~!=$TxE_AGaKA7N|Xl z;}Ytk;=uBQ-GrLDW4pUS_e57+uc%C{^lBkpeNf2dS*8(TAji9VbbPqJpGQr5EFp{ zGXOmWoTu#5d~0oi8bhm!XpvQ42+mqVJstexc>!kAne!E-PdNTFAZ+`2PBrn7Qn&6t z5LV)aKnw`WjCFlhTzu~Sz7ULGf+4?0a?Z8gO|^FgN*|l}>q*?J%IM4dO~Ba%zYn1A z(?|C+bEx*{hxO0z18bSJYLPcyz^q$3FT=2v?Y@cFD$(0~JOF=ps%mKs+NTXL?z1B5 z)|a0Trx&m9U+t}Id<0lqfgfJbzHVU0XIgeV9&A3xs^b*h^U3332hIIWhUv;wyAMN8SRpl!Go7lkDQ*uc0{A5*Uayqs&OqG>L=2vh}y zl?&8RVHh@;CuEZ>cENB!(^o%H-V;$dwczMkfJ!JR7a**gSMVzklOzp}IIv|69~fP1 z0aPd|Swsg767Ppg_CSGcv)wCz4Z;mwgLg>>L;Cy;wln5+(P1%R=(3OjuS8Ji+kb3m z0z+QU1M28bZLt23Jv;S@(t0~SL2HdhYPM!b^8mYM_DOWF5>_GkQ;n6k~;Qdk+?JNdo+xt9&!iVXaKYHRmB@8?cm2*^rTQ1 zkm3=0H-9?Xt{$=Bk;YIrO#TgrPa?M*Wj~JTh`l(NOoUg9t$dD{29D*zgiVqLUyU{s zw7(;EzFYI@Rz8mra})H{d_RkJty%!)?bhlX$4od**}jiujoGAMQ!Ys@`)|NbPr{A` zTJRXU3%CPvsvYE?`cDB~bk%&UmS@Jvhyfwg4l`!>Z-|9*dk!;3o}o9L0`X8k2)=w& z6aZ(2iG;vE5Rv&Pm@q0>^(`*0K#Ps-0ie5|PzV4mIp&G+lN}S^okT!?ybBE} zy@~*?oGuFFdhQSa)~q*F)4hmb!c%-$-$NMiX{QpP7T$x)ZtjE{Kv}}@B7M$*TW-Ra zX;kI2IJZ_VH_y|f_h z12!go-y~wvI{4|BwY}U6)F3U|G0=XOK-slNo#%G|Td=Nrs=kV(4ViAxZ!P)!mT`5m z=;r$8`hCG1(V}O;q2J~9tAJSp=FRKh4wu`>=xlL`&Y8t33kLmyGtG8By+(~8JJwR; z2IdNz9IwZVlM_~Ap;I2iFcARy;EmWlj~}8UxkASbKw^2Zrj>h7c;P6(tOj#*299jl zyWqN6=cYyrRT;R+H~anBj0%I`UV{YXarA=m%JAIC4N{`hl_Ho?{u{~y?Kn@>9gXMxyuelH+btay>$xa8>W zuk2Wi^4Kuzu0**)W-rctpKe*{hM_M5%*wwMb5^jqmjdV}%<=ow9X-+Rv;lYL@jWLm znp`{<^%!U$%C*YS{Qm>JcUCk~Yo7hTwDabuR9E$rUJaaO1FAZ1PT!2&gOkFX7tab) zUd~?|Uah|wt!LkL>73oXlJf;B)y?#ZIj$R)YA;6TOnc7&=Nmp)wVs0n+9ILphTeh~SgWZ)3C$?T)UtRjqVivq<7J5q(T zX&W8X-k!r^7hndJjz!)fg7h#TsR)S*1(xhXkR$fyn+V{H+mXWrP@`u%1)z{2Jmmx{ zce#rt;H;k53|13>k7IjJK}&&KCqR2!z&Q|sR5=GPiVp{L9W4Bii6#!+UZ^u*MSjsO zAPT>wpdiie1IM@2!Bzk@mKhql4c%D;e`ogqR#PjW?Ifa_X%ggZxa+Gn)aVraK&yj|FS(d71*!f+E14lLAN!mIUy7IyPj)N7Sp&-< z!i-MnC{7(>kj`#<&4%EZy6+|c?`XR~ONHFYYh;B^1Gmsd83ps%Vz$MSlhK!|4K~f6 zUlN}qoz7_dPjn%e-@~pK=S(OPZ??hC83z5}^p&J@rAbH3OND6|^!l~^*+=-H>-g@^ ztgeM6f1D63F$CwH`*S@%?J;P*-i8a*puYAYUWXh_5SGNfEHgHd_xOAAA|0|qhYp7M zeR}1?C@%}jE#40XXCwYlfHsc3i^rF7_Eb8aKkAT|QGp~v@269VG{3{Q*!&NU0=K|? z*hBZl+-2|PL3y5cYJh3qrZ?ho5mrGzi%UktC89|8%kVSSu`)3g66vYmiFk_zuI<-21`QcdU{S~S`RLhT&OJIhSD6nAD zg>_@)Av!{dm-YtSYOy;(hocR)tQ>_1Y@08(qo`*fwiyA?yg#fgT)z!S@2_~`=^m@i z-GaqSsxp`|-rfMt52g=yOBR)&;zB2lsU2A#^R=G!?wWby6P}!HL3eySg1;qCI=JBa zTT~(QHwb%%W{TbK^w*pX#HLT!T~QpC^?dWQ{WBP~=VkK*YR2kz!tj(uJwN9&RfhiO zBkGR}mS;cyy2fvMVcRn20`PmB{+hp+b#0{H)D>dP4{qw|e_3Ou_sq1n1*ABGJA?u)jtd$tiNKy z{S+(K<@i!i7NE}-jC4n%NBb|KSX{3k0>*rF3RS?_$j$drg{(HTDVBjRXHEiwmd+pSIiOwRK{!_$vOrYF3_k7!a4q8$_8Hqz{7&G?H$m< zc1&7*kU9Vj>xI*UvLFgjKVrs-=YdJP+?OntlDAx&{TOx#r<{rC%80WpuQOaQM_a>eDv#kl7!%kqpbVgc-T*fJBk;);eE_tT z1DVtM0~HByubvp)^p1%?{85Hr=L}ebuSiXu6i8H7DluWlq#_m~YxKz)%q_7Z88b%W zslaGZTKhPd^$ZpB7#6)@-;2@a5la{~fsuFiyUE4w zoc@Io6==(Ske3P1wvRB)aEBO-a+usSZ7oQ zz3ee(Lb`Pmp1;T6ulc*ry+=Tw6(7Tt`{L>^R=p_v`@;SbP;P1dRp8tb`Aa~$#qA$| z2)pjb^IXtwz2afm54je+|D7KBUpTgSU;lrcL#G>Ke&?MQa`*VogHK17U%ojk!2ERJ zCPmsfKRfw4;Cnv)c8GDsaB_3a^*<)^esc{6Js&W4Hr(7?V}^Uq^6hJw@?yA}jL_Ad zqT(#zoyFI?XJ8ZX04BmkrDCWdFy+9Hl@Zx}QZ5VnFaVzc_S#D?v52FGVg3ka$4UnH zFH2OW05*sTV4h$K!eS2+8E?+PR8<#qKC~8XaI<27HQug6RstMST&hSXF+)C~;}jscB3uH$CV&`a z3V=uD!F_TaP$sU}ucYrzVGcNumHXMq2#tpiEf5B|$+Flh-l@LG=e>3_z!!B5P|Q(Q zjoO1mR9K+3U{=;(K$NU9@rFv6Ywi5X7M&_B_=*kJq)c?OW+L_g0C{v8sz?BH0J7Z1nMaN?XTDlY%1~F9cAsKlvY->-g^`PI-OCxUe#kXu8Ek}v znrn9>Kr<;Qi{9_fc1w$e&R}|e$;YhNis0(=;qLVH6!C7$cL(GC>)?hiYqop1zk2Et zZ>GK<{A@S)Uo2vIP+rGFvfvVv|MAURHBO1yem~%(&!GGI$$4MWIoBzuk zWyS8m`PTw+yVqX>%%<@-0cR8XKLMbdI>h|weuz5cy%_jh>|FNz^onMKd*>ZE z@Y9cnSErv3C;xnk-;){x-QD=f5RLBe9AsEwZuiE|nD7%ja98Z3K{Xr9M-MQ-a_dIa zBa8nvI-wP5SutELM$5?=3*r_`;9-Grx{U4aZgYv!5mf~kx4xNU7qR~T+q;`3ORlTX z1m3(g47oBvb!1!3X(L&Y2%G{QBRB-Av+0Du(w%ilE7&Gw?RcjW=xB9!Z+SDFXMq3 zbO(N;Q*K^&9Yh35!lrhiZjpjQk%U7H55g*~G&^V~Hh>ln*;1Bnfy(CqS6nGfQeULg z=Cy7l5+}G4LF4VXEEil84}bG3L*hwFt|qwsYTLV&br<|kl1(RUOR^1Q*f`fhYWfZ} zGdl!#Anv4FgbUdGs!E_08nVPvMI<)cP+tuoDRIR ze#rql>U+&lr$dnP!Oe+b!z1y}Bt;Uma5s;XkEO@d#WI!V!SOvhbSu_zyWV}S&!+ak z@576Woo~GE?&~nFsZKC|cM9CcmJ{7S4PUXm#3EDeYm>$xr$<4y?eF& zg)!&d?)NXAS9dm2^woBEcnj*k;}V?P?gF~=KYzBs{nx6Ay&|-$|GDkARag9bsr*;L zT)bZ!oWGpOuM5_{5$}6+*Y#|-J=||x`+q#yzt(&iipiRlu6Jdjsi9QnrD+h#;V;DI{92xapM- zuWrsv@?-J9!kJ<)iz`wzRfK^=5}erxR1fBKGzmrP9_g1Ut|op>p>V$#F(r}QkP*nr ztm8hnk-}ueQ-Yzf{|u#BYDHN<9?Omt)>>Bnf^-seG=o!|@>fr=z!!!1!c^*%g|#lu z!qn1+++}7+bV3>zwh!TDY5v5I+dP#ITVdou{QNHGJUGCTI*-{<4?}ZH9g#)> zpZcFfYvV7b`ETcid`|o0>f$fS89+(Y$*m=syGAr{);~q^fipz`f8#&Gt2*;2h1GMV zkf+ZTj!LA|KvfSx{H{waZHZJwMsE}UG4;oGb6MQrymSNx2;jOU2lFTS%?WcIlmll4 zmd|dZ?wJIg6=Qj1W#fir%5hB{E=egJXE?$j^621xwjsX8&1!>YT8uz@d~g?b$sA_zkTpYX|?^#7}b|s_HyOx zhVK&V^7rci@!k0L$KM#7_X+Ix-w3Stk=y@E2%KYtOdr6uE=A#F~F6s>WKa%t%TdyOF(CZ#B zHr1@?sXq>x(BWc)^t0*Vk+;u!1V^eW-OSD>9v30hGbLY}5GHfJ?8uo+o_#gi` zf)N=PgF3VYVgqtx7szoS@9t6?1W~3FgK9y?&#wj)1N%hSyFy-4eHcEozfM}FQb_XV zmgW_F^Ny?H^pzZ{_p?z^AEtPgiSjF3!B|+HcaPEi0{9K9-kb#Za+Yq2r@9zGRik=p z0y7i19XQujY#y?7yyQbJSYcM^?csd`k*b5qo5_Yi?5o>XR5M2px2CI*qZxOqnWSm9 znmVr6Q2j*EFEU^Rboy?2IdpUZ)LKJw|L)8&sodX(H;*2kmTxJy4s?6v5k5seoz2bL z+aJvJmujHvpQ+u4ApO{{bCXu)ddGkJm)!oWBk!%jSp%*Ozxb2I?_Br>|9n$GzMJK5 z9nKZ%n+EmW0j5!MSVmO*YyL^9;$=xez9MQ%8AMY>XyQq)_~hM})JqC~ z)8|8757s=wDV8+q_XhF#B&{igIQ>j76Fx8=l4{?GSd*RKP!=0 zQ_yCbONCK7+N?1#@efnIhQ!hOkLiG+k7Jh3?sS!5#sU zFS!uqxX8PINwKyHzB07cq>!$O*y>Itkd2!_c*)oDe?;6OB1H!)TYcZIMVgB8u({l& zl-45ck>l(PB_f8TW}RJq7it5af6AP87Q9Kjqi&(<5S4x@#dCR;4TfxS*=BQa9>?Z0|z}S>O3k#Gh>J0Bzv*e&Sh}X;$NzqFC#*jiuFv~M|m@VY?9+e9-WoGl& z@C(F;Pe!sn7}OT0ulMwcADN)=P^!c21DK`;^JcK9Jp%5d)zhhy)7>w};sw5M8dOZe zKHSlD3!fC7^t|71Z$7(uXbtn74;D*}0rPDu{@I5= z?S9Pm;&%Ua?Cvt_+ko;u&)*uH_X&P^|E+@h%ZWRGamVea@6juNFi;pc{{)!3d`3$C zA?f&;pOq)pPqe6C9{i%#zxok*?(@yd&FSWC=TC@-s}0!`hCVU3%>W<3(pPNm6G`5z z-X_~>!mt0;*W#asF5otRR$B$B>+3TqB)w{}q}tRLE*NpTAQd~*hK^WYX-u2rqsMEF z#~3`AZ!Lc&rVVRX3q-PDHoOhm*>7#Yh~+p@F-qgS0@EEZnhlDjRX<3 z_Uo~S!Fn%SxCeqXCGmt?kqofw52!8#5_&ir7!`7kc}wLn(2e7TQCB13x?jO%q~-P@ zSltw#36MPcIRH}q+Q7J8FgVwrN^mm9L=Th;rw}q%Kvo#V3*?|Z*OUH@6O3t})d$6M zFI`5Q2IhLsG+8a=WNA=6AlfRUl#<51XL+D_H;AY}<<&}u@)@ufsan~bGrwyv(<1%b z)i2g3tNQ>;SIs}GYwK{7IUSkfH>;Q8Ns{)pZu0SkspU!0773U=dkw2#Q>pO#smM>6 z;~hK}EmA+Z`IH3xdI(&=jbIUM=~s;SnILNl^X^8+dp z1_B3H_YC)49~;nn!|E*HJ(f{yOmUdk;D~5Akc~@GxkNSY^u&OV)zuZI8rj0HBD0TI4g;{0XeZ64P*gLH z@(AHDMGTyfi$Advs}XqVc!Vvpks)S@FG*e;>InWMkRe$@Fh@N^RCK586V3D(ev}#u zSP9i=m&Ksy91TN9S0a=y!(^1gscV@w=*BEgQE|s7#<(d0i1IqB4mB+6MOZ|RmWx56JuqyUqhVIsDl_lH{}p8D+3bKb>*EVTKd^j zORx%XL$9rnN5Qo@5uo&w=%;)lGW~^{h_}bBh%_CA$^1U0?HO{1RjB+Xu3P3x_yz`J7VcE$Woj?yNgu^{L?ekxEEtSnySV0$rt zzxvNzru=sU_^Wfcxc+|$=l>|fUAqhK|C`@`@A```UHIvpNixrVvf2dYynOTkh~cW^ zKLlk)aOg(2?5RIlzg(Z}ezbdiaB7;yW7DYN8k&J4ee#HM>(vQ0#TQ^H-0G>R*sm>n zk2@42w8&?wM5O1Bws0qFHuVUSh{m@QzWsUMncKpOzM z#`%QTN@c)^Qzou6O$4lB<(uF=k}J{2`3PzJF0=D2)PrRC4{j}bpxr^FJjo}zB`G(p zTOKomvsZePA8w>8wp$=B(sa6GNoiO4(-9ExaHo7=NPoIUSv&nx+~%YF$a{M40eN+o zoa-zFhqnX1C*4uAaH}3lLj~RDGhVqX0^UmY6Gj4qH8CNZfMio06&7V3HWIO_$u+Pw zz^Bhxpg2HG6_HI_a%%cogbcX2t}61O@K)9khYj&uf*ePRB_EwQ9%)=5xq&kWJrBkc z7N`4xzQkM^cWpFL(loqCv7mk@U&U4Ugx-LgRmXbw&~!;_c*viy=IS&cIjiXje?8Lh z*iM(OxPrJYO|cIWjm6uJG;Q(O-Rj(VB?52Oj!D+MIPY<2m_na?D^UagP3jLFgZ!kQ zF0M*bN8(G~yQ?jJTD8QA+@Q;XTDc4y?w${vX`9^%Lx9vSE$d+@5UgL3yBBqb6s5OV zN~e$BQgb|zi+=!V>8#R2zdG;u!__m^BA@;IPshD$BR#(-Kkrv1GSu;Rbo)-i`M0g> zJ=6=ozP)+-xV{R`NzAM+)?fIg&UlA)gU_*o;AepQ%!&PsAF;t0v<%oz z*=?i*ILxpPpc~jTRt<=$Dq0BW)l9Lz&gibsyIKXuRBC>i(g~M7**slPC;ZH;J%esc zT)`1^wC*&7p>f5Y{-*C|xTd91+gwh+8+}bzwzi*eDeJRuyzN-HqM2BLHGljXW=WUcRHsL6|0Y+D#gkXYlE)?Ct9+O zDK~Xh2hgTo{CFwNmPyJfe&iJQ+-lhI$1llQ2|yycxdK*a;n2X~i zY->o*z@f{N-otG=>2m{^rX9(&Z+QW3#(a+l^j6neojbqTKJqQiE7JDW>hadFweUY@ zKlGFBvXKAt8*1s@{}PAKR_wIVoi>`8UFo!#89{kDc28!T3%AGLwVf9DyKP?sdke|G z3Vy2(*B=Gi)sI_(Ha(*j-9Sii{sA!mQ(uwe@9^O2(IcOm>Jhy>xLz@FJ7E$>cX+~7 z<6!mV;H_hp7Q!3N2BG5i^%K??9!~MUIXt|+Z~39j(Jn19bRU?4F6|qkq}c--1C30L zTt81?D2fE5#}2HFAU+UlRv&f*;B!Ew4~BmdQ-C8uTH%>GL!{6cr!x77!CnalWl6#@ z##t}ThkcR>6k#^qvOV7jq8+EilE->J{R)H|o;Ve>j(qr8laa3$V+6 z6_ECWyeDkB>QP}N>6$JFenYkj?-$Sf$-dC-798|~66tdEy+>QNg^Gs1mO*v^Y<)SP zr8C$U3oEq-;XumEjLU8!SS7qphrm)NiLy)yW4Wg?pVY2&i+w^m@)6zDxSY=#-Ms4{ z=!|J;O~oe!%aSTBCuO(;?YnCzW zxoUz7aGJ3Mr_^lzsLh0so=HgzoL_OY=Je_LtpUIAo6s$g1 z#;d6iRvqeVKA5J@FcBT>6L5lbTErt@_Vp^m)J*kP|11sbe*p7|cGq>0_O+lLFl(D1 z$iOy(aB25hy3XFIKI*3_D1|iEg?v%;( zn9xXK8yHYU(jSu%YuvRxUNAKtCB4!@Bt>^kK}67+XSg&=5?RwD4)__|3d0hf<@6)e zoNG_QlNn(lNH5?9=>hTdG`fTtnN*5MJayFqPh*pY>go=Z?HBs$8>ao%l{Ad03}_XY z6+kwt;<&G>63z+Gyz5`e5|V-D6c#X$Yi>*K0k}$){s_f71*C1DtpPn?AE1x4o46Sf z-K?U>WUbKwCT^r^y~tdbH$mRCinKTgvZ+%JXW73xCm^51gt5l;+I@<;GLGdk%5;sc zmqg7|Z$4dXD)~}596K&qM~bkyUze2ck>9JHBiZv7S1Nw{?bpXfq$M|5FWRJN`(e1E zS)q_457n+fZ6sX!qw-S z3;A(Ve0%(r=-Eblq?%1zyq|!*)kl0CyruoWKilu%{1x{)`{s{t*QI;1`X^HH!TKfJ z=GBUl!?Ry+zn-;_n?{h-+(Q(geS~uam1!d$#^lo;=&PvE1KPvwA)jOCH4)l6gM-n4 zq*0T?xo%6sjipQyZ{PJ5}T?0=%0VYVji9ii+dt4YT^l~8ekv4}X^k9!h$ z4C1Hi3dOEz=+(b{b=}X={1z#Xzr^IQtsD(vio+k_z>Ma}p5~^ENY-(^nZ091-bvf} z3F@HRWs2vP zo6)g5?7EF)?zvMgr;@MewsKLiXfe?6&vj?}w`o=$qf2;~&r8mKXnIZIML&o{vk@vU@U4JwzE(S*L)+ z@DN;Ca?Vzibk3l>1zw}p_F6A>f?a!VNyjyuB#&-G(sT{W+6VR~ZOpk>Vyy_EC&`*7 zDTGFJbMU}>@u)R4p|}$7OuO~4dtI$jf*IS?)@deeQn2U%QjL&M8Umvn&^U=$iOjFz z!FP%hG?VOPDth?rtqEmvIx!M1h-vUIBAvdslCRM_G0=#w3Ldl;UND0!P6 zvB`sn=nyozg9sBX+;8; z2|0y2*0vt69#30ne5dV|cG!w|2dlStKOUFmPi^*(SMN^RciQu9Uha7OjvapQ;r#X8 zuX9nQd0w_`Jd-pToCmweQiGm-vllfvKLO;d=4=CxEt&3+xReGUouMvQX17-Y1;?SI)Nx$ zRab5vNYgwfB^SZ1swkSvK(F}1L`)EGjS2xKysS>JrCjyHDn7Sh51?hVkfllHl_&Bi z2mUxFX$q?W&p_qG8%`mCd#177BtJmRlGLyH$Fd)GZne$xw1UOV^P`8BbGM>G7E=PfmvkzCJZ zW^v2b;BJc;W-(%NX!@Eg0u2D)m0Iya_IZ{6MKo@b+D{@!lCgY!3h>szBB zyn6-K>cB}~=blcM`(hnZ$(!fbGv&Q3y|cUDJ@rQAH~}F& zQQ*zb@kq~=HMk~mTNHZyySO}$YOtr4Hp@M4aBxv=%!9yfza@}_mQtYQcC?qU_dfpP keVxFvvCc4j{{7tk4atij?26-NaR2}S07*qoM6N<$f_wl4UjP6A literal 0 HcmV?d00001 diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/m1_bottom_check.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/m1_bottom_check.xml new file mode 100644 index 0000000000..b6cd6a1a9a --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/m1_bottom_check.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml index a5533567ba..e9488c88d9 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml @@ -18,28 +18,6 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> - - - - - - - - - - - - - -