*=XFzDiEi5ihiwWet)&=_(+bVRO+so5 z*~M6g1=Fc-lwrB;*BUhWgT-SI#p^z`mfCkH|K#UR%>3c+|CX-fKHt@jRK69IM`G z|MWDn6_uXsR@5F&I<%*qW4h^7PHgzo;@RC~U!dkp&Mn}c0J4N;IH?=|1~#ehphq?3 zBl5;H8rpoAu>Ly2t2SPC%*Ec30+D~QPoJ01wtP4h@8N4G9EWv5h3w1bc zaKdwV-oqh8@@&I-m4Dpl80LmVEw L|8ORGX#z_c*YS;>`)2iq$er+^ zUi-8X>;JF1^9fVVv3c HA$ zW6FyxC$B#3?d)dgY6d%oo%m>dW&6poeBP_%iKN(8IodP7QhKnmi|^v;OM}2u?&pgd zOu2%0dD3*{hX2%*e<0rp`_%B~o$H|LH-}`_Vf`7&EpOSNmutsEF1-ldZqj=l;e9Xn z^@G)DoU)K;ReLIxM0@3S+@wn7kHxvC<~xr&C3lFJ-W#vw`nJY>l o9h$Q2c1r!f4GYh?8=f_2pFGnU+bnO!|z~0&>ZAog5gDlT2 z*SqA-8%sj8@A8g_=`qcbinm`n aik1q@K z^+YH25y-BUB}vq=n#2{U_3b+jEm!&3>&~=|mBNra^BL=}?Cx6@&dWl(1D|fI_Qi!%rdo%STeI`Xff34p=d7AY;PW=XEdHfsKB9r zsgj%#LCZl6@CMidEC3DwPk OwG7?DuVyHThh7{rW?*G`Zktl#o7YG@!eNIH_DdIBrdzGJe{Cu<|lk^DSL%v zc~+pPUO?Hjy (( zc9Pw(63rclW`t`Ohokz8@}c!9RpO4wHrz?K*9f$?k_DD-o0Kny&oLk&vlCCnCeI$n zxoM^{=QY`rLm{( ~1(+pTmuVSVKQ9GS$6CJt9^9*B7zy1H zL+)MrL0VaLEO!ezCdnL}_tB^Un0%fj9VLE-mS;<9CS}aj$}DE6j7y$=0^8|-PX~Zg z9kJ#3BS>t6f~$wp`d(e4RrGmm4`NSmV$U{4SRcjH>CzizMxM%emI@3NYX-fhl Z1ZosB|U8Ea{g*qWOq4mrx9yDxIx`!I~xOVe3LHm z3AM?89%Da4Ty5hr@wI8lRW-bR-Nj#U;XFG^fU=rT-CRAjw#@(2w8w60=m3v{V3`B| z$K~qHiY5{XOn7xs?Yt MIx%gX6mnlOhRqMeSOxdg6oKRlOtuXtbO zcTFb~&dgy#$AYTBk5_yE+RU(}*BAzuXQD9O+3oFmd?KdD+j&~rOzZP>ZQGXB4YOUW zSgPxxn#bHp9l^?KMS{J!qwc9s#j7sX!e-BgnR0<3n}yDr1LQ(L+cqC1fFQ-4*yK_@ zS%#F@8v8spI9P4ssyZC}4h!XUt#ahi$p?=Zt?CLuoWEF+u75lb7ntOh?SBqef^)&i z!6d@e#6)Z)01zV?F4h*(A#~yTDOmv)G3Pp{#6}BZ)XjV{?6>>aOv!OTqJBJnOQV&3 KiHH~&lJ##+rq5Ua literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ea08459..0f8ed25 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ + @@ -255,7 +256,7 @@ - + factoryClass = Class.forName("android.webkit.WebViewFactory"); + Field field = factoryClass.getDeclaredField("sProviderInstance"); + field.setAccessible(true); + Object sProviderInstance = field.get(null); + if (sProviderInstance != null) { + Log.i(TAG, "sProviderInstance isn't null"); + return; + } + + Method getProviderClassMethod; + if (sdkInt > 22) { + getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass"); + } else if (sdkInt == 22) { + getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass"); + } else { + Log.i(TAG, "Don't need to Hook WebView"); + return; + } + getProviderClassMethod.setAccessible(true); + Class> factoryProviderClass = (Class>) getProviderClassMethod.invoke(factoryClass); + Class> delegateClass = Class.forName("android.webkit.WebViewDelegate"); + Constructor> delegateConstructor = delegateClass.getDeclaredConstructor(); + delegateConstructor.setAccessible(true); + if (sdkInt < 26) {//低于Android O版本 + Constructor> providerConstructor = factoryProviderClass.getConstructor(delegateClass); + if (providerConstructor != null) { + providerConstructor.setAccessible(true); + sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance()); + } + } else { + Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD"); + chromiumMethodName.setAccessible(true); + String chromiumMethodNameStr = (String) chromiumMethodName.get(null); + if (chromiumMethodNameStr == null) { + chromiumMethodNameStr = "create"; + } + Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass); + if (staticFactory != null) { + sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance()); + } + } + + if (sProviderInstance != null) { + field.set("sProviderInstance", sProviderInstance); + Log.i(TAG, "Hook success!"); + } else { + Log.i(TAG, "Hook failed!"); + } + } catch (Throwable e) { + Log.w(TAG, e); + } } @@ -184,10 +249,11 @@ public class MyApplication extends Application { filter.addDataScheme("package"); registerReceiver(apKinstallReceiver, filter); } + private BootReceiver bootReceiver; private void registBootReceive() { - if (null == bootReceiver){ + if (null == bootReceiver) { bootReceiver = new BootReceiver(); IntentFilter filter = new IntentFilter(); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); diff --git a/app/src/main/java/com/info/sn/jpush/MyReceiver.java b/app/src/main/java/com/info/sn/jpush/MyReceiver.java index 41d8c21..8b233ff 100644 --- a/app/src/main/java/com/info/sn/jpush/MyReceiver.java +++ b/app/src/main/java/com/info/sn/jpush/MyReceiver.java @@ -228,6 +228,7 @@ public class MyReceiver extends BroadcastReceiver { String type = bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE); String extras = bundle.getString(JPushInterface.EXTRA_EXTRA); // HTTPInterface.checkDevicesInfo(context); + ToastUtil.show(extras); switch (message) { case JIGUANG_GET_DRIVELINE: @@ -256,6 +257,7 @@ public class MyReceiver extends BroadcastReceiver { setAppLockedstate(context, extras); break; case JIGUANG_FORCE_INSTALLAPK: + HTTPInterface.getAllappPackage(context); intallApk(context, extras); break; case JIGUANG_FORCE_UNINSTALLAPK: diff --git a/app/src/main/java/com/info/sn/network/HTTPInterface.java b/app/src/main/java/com/info/sn/network/HTTPInterface.java index cdb311f..c93a6cc 100644 --- a/app/src/main/java/com/info/sn/network/HTTPInterface.java +++ b/app/src/main/java/com/info/sn/network/HTTPInterface.java @@ -32,8 +32,10 @@ import com.info.sn.network.api.UpdateAdminSn; import com.info.sn.service.InitJpushServer; import com.info.sn.utils.ApkUtils; import com.info.sn.utils.FileUtils; +import com.info.sn.utils.JGYUtils; import com.info.sn.utils.SPUtils; import com.info.sn.utils.TimeUtils; +import com.info.sn.utils.URLUtils; import com.info.sn.utils.Utils; import java.util.List; @@ -100,6 +102,7 @@ public class HTTPInterface { int code = baseResponse.code; if (code == 200) { JSONObject jsonObject = (JSONObject) JSON.toJSON(baseResponse.data); + //白名单 List white = JSON.parseArray(jsonObject.getString("browser"), BrowserBean.class); if (null != white && white.size() != 0) { String s = ""; @@ -111,6 +114,7 @@ public class HTTPInterface { } else { Settings.System.putString(context.getContentResolver(), "DeselectBrowserArray", " "); } + //黑名单 List black = JSON.parseArray(jsonObject.getString("browser_black"), BrowserBean.class); if (null != black && black.size() != 0) { String s = ""; @@ -133,7 +137,8 @@ public class HTTPInterface { @Override public void onComplete() { - + Log.e("setBrowser", "onComplete: "); + new URLUtils(context).setBrowserList(); } }); } @@ -161,6 +166,7 @@ public class HTTPInterface { } JsonObject label = jsonObject.getAsJsonArray("label").get(0).getAsJsonObject(); String home_page = label.get("home_page").getAsString(); + Settings.System.putString(context.getContentResolver(), "homepagURL", home_page); String label_page = label.get("label_page").getAsString(); // Log.e("getBrowserLabel", "onNext: " + home_page); //主页 @@ -503,9 +509,10 @@ public class HTTPInterface { jsonObject.put("address", address); jsonObject.put("longitude", longitude); jsonObject.put("latitude", latitude); -// String a = jsonObject.toString(); -// String b = Utils.getMachine(context); -// String c = Utils.getHardware(context); + String a = jsonObject.toString(); + String b = Utils.getMachine(context); + String c = Utils.getHardware(context); + String d = Utils.getSerial(); UpdateAdminSn updateAdminSn = NetWorkManager.getUpdateAdminSnControl(); updateAdminSn.sendAdminSn(Utils.getSerial(), jsonObject.toJSONString(), @@ -665,7 +672,7 @@ public class HTTPInterface { public static void checkUpdate(final Context context, String packageName, String versionCode) { NewestAppUpdate newestAppUpdate = NetWorkManager.getNewestAppUpdateControl(); - newestAppUpdate.getAppUpdate(packageName, versionCode) + newestAppUpdate.getAppUpdate(packageName, versionCode, JGYUtils.getInstance().checkAppPlatform()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer >() { diff --git a/app/src/main/java/com/info/sn/network/UrlAddress.java b/app/src/main/java/com/info/sn/network/UrlAddress.java index 223f1ec..f1a2f8f 100644 --- a/app/src/main/java/com/info/sn/network/UrlAddress.java +++ b/app/src/main/java/com/info/sn/network/UrlAddress.java @@ -38,7 +38,7 @@ public class UrlAddress { public final static String UPLOAD_SCREEN_SNAPSHOT = ROOT_URL + "sn/uploadScreenshot"; //上传屏幕截图 public final static String GET_SCREEN_LOCK = ROOT_URL + "sn/getScreenshot"; - //上传屏幕截图 + //获取屏幕管控 public final static String GET_TIME_CONTROL = ROOT_URL + "sn/getTimeControl"; - //上传屏幕截图 + //获取时间管控 } diff --git a/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.java b/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.java index b5b691a..f770c32 100644 --- a/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.java +++ b/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.java @@ -14,6 +14,7 @@ public interface NewestAppUpdate { @GET(UrlAddress.GET_NEWESTAPPUPDATE) Observable > getAppUpdate( @Query("packageName") String packageName, - @Query("versionCode") String versionCode + @Query("versionCode") String versionCode, + @Query("type") int type ); } diff --git a/app/src/main/java/com/info/sn/receiver/APKinstallReceiver.java b/app/src/main/java/com/info/sn/receiver/APKinstallReceiver.java index 02bb851..827dabc 100644 --- a/app/src/main/java/com/info/sn/receiver/APKinstallReceiver.java +++ b/app/src/main/java/com/info/sn/receiver/APKinstallReceiver.java @@ -7,6 +7,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; +import android.util.Log; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; @@ -27,6 +28,8 @@ import io.reactivex.schedulers.Schedulers; public class APKinstallReceiver extends BroadcastReceiver { + private String TAG = APKinstallReceiver.class.getSimpleName(); + @Override public void onReceive(final Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving @@ -43,7 +46,7 @@ public class APKinstallReceiver extends BroadcastReceiver { List list = pm.getInstalledPackages(0); List uploadInfos = new ArrayList<>(); for (PackageInfo info : list) { - if ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1){ + if ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { continue; } AppUploadInfo uploadInfo = new AppUploadInfo(); @@ -69,6 +72,7 @@ public class APKinstallReceiver extends BroadcastReceiver { @Override public void onNext(List appUploadInfos) { String json = JSONArray.toJSONString(appUploadInfos); + Log.e(TAG, "onNext: " + json); HTTPInterface.SendAppInstall(json); } diff --git a/app/src/main/java/com/info/sn/service/InitJpushServer.java b/app/src/main/java/com/info/sn/service/InitJpushServer.java index dd4da52..3e8dceb 100644 --- a/app/src/main/java/com/info/sn/service/InitJpushServer.java +++ b/app/src/main/java/com/info/sn/service/InitJpushServer.java @@ -32,6 +32,7 @@ import com.info.sn.utils.SPUtils; import com.info.sn.utils.TimeUtils; import com.info.sn.utils.Utils; +import cn.jpush.android.api.JPushInterface; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -71,6 +72,7 @@ public class InitJpushServer extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { + JPushInterface.init(this); // HTTPInterface.checkDevicesInfo(InitJpushServer.this); HTTPInterface.getAllappPackage(InitJpushServer.this); HTTPInterface.getForceInstall(InitJpushServer.this); @@ -203,7 +205,6 @@ public class InitJpushServer extends Service { layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT; //systemUiVisibility 关闭通知栏和导航栏 - layoutParams.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE diff --git a/app/src/main/java/com/info/sn/service/ScreenLockService.java b/app/src/main/java/com/info/sn/service/ScreenLockService.java new file mode 100644 index 0000000..14b3e53 --- /dev/null +++ b/app/src/main/java/com/info/sn/service/ScreenLockService.java @@ -0,0 +1,70 @@ +package com.info.sn.service; + +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.IBinder; +import android.util.Log; + +import com.info.sn.activity.ScreenLockActivity; + +public class ScreenLockService extends Service { + + + public ScreenLockService() { + } + + @Override + public IBinder onBind(Intent intent) { + // TODO: Return the communication channel to the service. +// throw new UnsupportedOperationException("Not yet implemented"); + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + registerScreenLockReceiver(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + + return START_STICKY; + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (null != screenLockReceiver) { + unregisterReceiver(screenLockReceiver); + } + } + + private ScreenLockReceiver screenLockReceiver; + + public void registerScreenLockReceiver() { + if (null == screenLockReceiver) { + screenLockReceiver = new ScreenLockReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_USER_PRESENT); + registerReceiver(screenLockReceiver, filter); + } + + public static class ScreenLockReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Log.e("ScreenLockReceiver", "onReceive: "+action); + if (Intent.ACTION_SCREEN_OFF.equals(action)) { + Intent screenLock = new Intent(context, ScreenLockActivity.class); + screenLock.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); +// context.startActivity(screenLock); + } + } + } +} diff --git a/app/src/main/java/com/info/sn/utils/JGYUtils.java b/app/src/main/java/com/info/sn/utils/JGYUtils.java new file mode 100644 index 0000000..e57f044 --- /dev/null +++ b/app/src/main/java/com/info/sn/utils/JGYUtils.java @@ -0,0 +1,455 @@ +package com.info.sn.utils; + +import android.annotation.SuppressLint; +import android.app.ActivityManager; +import android.app.ActivityManagerNative; +import android.app.ActivityTaskManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.UserInfo; +import android.net.Uri; +import android.os.BatteryManager; +import android.os.Build; +import android.os.PowerManager; +import android.os.RemoteException; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; +import com.info.sn.BuildConfig; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; + +import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; + + +public class JGYUtils { + private static final String TAG = JGYUtils.class.getSimpleName(); + + private static JGYUtils sInstance; + private Context mContext; + public static int MTKPlatform = 1; + public static int ZhanruiPlatform = 2; + public static int UnknowPlatform = 0; + public static String MTKTag = "MTK"; + public static String ZhanruiTag = "展锐"; + + + private JGYUtils(Context context) { + this.mContext = context; + } + + public static void init(Context context) { + if (sInstance == null) { + sInstance = new JGYUtils(context); + } + } + + public static JGYUtils getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init JGYUtils first"); + } + return sInstance; + } + + public static boolean isOfficialVersion() { + String channelValue = JGYUtils.getInstance().getStringMetaData(); + return "official".equals(channelValue); + } + + public static boolean isNewlyVersion() { + String channelValue = JGYUtils.getInstance().getStringMetaData(); + return "beta".equals(channelValue); + } + + public static boolean isBetaVersion() { + String channelValue = JGYUtils.getInstance().getStringMetaData(); + return "beta".equals(channelValue); + } + + + + private int getBatteryLevel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + BatteryManager batteryManager = (BatteryManager) mContext.getSystemService(Context.BATTERY_SERVICE); + return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); + } else { + Intent intent = new ContextWrapper(mContext).registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + return (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) / + intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + } + } + + + private PowerManager.WakeLock wakeLock = null; + private static final String mWakeLockName = "BackupService"; + + /** + * 获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行 + */ + @SuppressLint("InvalidWakeLockTag") + private synchronized void acquireWakeLock() { + if (null == wakeLock) { + PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK + | PowerManager.ON_AFTER_RELEASE, mWakeLockName); + if (null != wakeLock) { + Log.e("fht", "acquireWakeLock!"); + wakeLock.acquire(); + } + } + } + + /** + * 释放设备电源锁 + */ + private synchronized void releaseWakeLock() { + if (null != wakeLock) { + Log.e("fht", "releaseWakeLock!"); + wakeLock.release(); + wakeLock = null; + } + } + + + /** + * @param ids 需要管控的ID + * @param packages 应用程序包名 + */ + public void writeDeselectIDtoSystem(String ids, String packages) { + if (!TextUtils.isEmpty(ids) && !TextUtils.isEmpty(packages)) { + ArrayList idArrayList = new ArrayList<>(Arrays.asList(ids.split(","))); + ArrayList packageArrayList = new ArrayList<>(Arrays.asList(packages.split(","))); + LinkedHashSet idHashSet = new LinkedHashSet<>(idArrayList); + LinkedHashSet packageHashSet = new LinkedHashSet<>(packageArrayList); + ArrayList idList = new ArrayList<>(idHashSet); + ArrayList packageList = new ArrayList<>(packageHashSet); + StringBuilder idStringBuilder = new StringBuilder(); + for (String id : idList) { + if (idStringBuilder.length() > 0) { + idStringBuilder.append(","); + } + idStringBuilder.append(id); + } + StringBuilder packageStringBuilder = new StringBuilder(); + for (String pkg : packageList) { + if (packageStringBuilder.length() > 0) { + packageStringBuilder.append(","); + } + packageStringBuilder.append(pkg); + } + + + String olddeselectViewArray = Settings.System.getString(mContext.getContentResolver(), "qch_app_forbid_id"); + Log.e("writeDeselectIDtoSystem", "olddeselectViewArray: " + olddeselectViewArray); + + Settings.System.putString(mContext.getContentResolver(), "qch_app_forbid_id", packageStringBuilder.toString()); + Settings.System.putString(mContext.getContentResolver(), "DeselectViewArray", idStringBuilder.toString()); + Log.e("writeDeselectIDtoSystem", "qch_app_forbid_id: " + packageStringBuilder.toString()); + Log.e("writeDeselectIDtoSystem", "deselectViewArray: " + idStringBuilder.toString()); + } else { + Log.e("writeDeselectIDtoSystem", "writeDeselectIDtoSystem is null:"); + Settings.System.putString(mContext.getContentResolver(), "qch_app_forbid_id", ""); + Settings.System.putString(mContext.getContentResolver(), "DeselectViewArray", ""); + } + } + + + + + private static void sendAllweb(Context context) { + Intent intent = new Intent("qch_app_website") + .setPackage("com.android.settings"); + intent.putExtra("package_name", "Invalid"); + context.sendBroadcast(intent); + } + + private static void sendwebUrl(Context context) { + Intent intent = new Intent("qch_app_inside_website") + .setPackage("com.android.settings"); + intent.putExtra("websitelist", "Invalid"); + context.sendBroadcast(intent); + } + + + /** + * 从Manifest中获取meta-data值 + * https://blog.csdn.net/yue_233/article/details/91453451 + * + * @return + */ + public String getStringMetaData() { + ApplicationInfo appInfo = null; + try { + appInfo = mContext.getPackageManager().getApplicationInfo(mContext.getPackageName(), PackageManager.GET_META_DATA); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + String value = appInfo.metaData.getString("CHANNEL_VALUE"); + return value; + } + + public void hookWebView() { + int sdkInt = Build.VERSION.SDK_INT; + try { + Class> factoryClass = Class.forName("android.webkit.WebViewFactory"); + Field field = factoryClass.getDeclaredField("sProviderInstance"); + field.setAccessible(true); + Object sProviderInstance = field.get(null); + if (sProviderInstance != null) { + Log.i(TAG, "sProviderInstance isn't null"); + return; + } + + Method getProviderClassMethod; + if (sdkInt > 22) { + getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass"); + } else if (sdkInt == 22) { + getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass"); + } else { + Log.i(TAG, "Don't need to Hook WebView"); + return; + } + getProviderClassMethod.setAccessible(true); + Class> factoryProviderClass = (Class>) getProviderClassMethod.invoke(factoryClass); + Class> delegateClass = Class.forName("android.webkit.WebViewDelegate"); + Constructor> delegateConstructor = delegateClass.getDeclaredConstructor(); + delegateConstructor.setAccessible(true); + if (sdkInt < 26) {//低于Android O版本 + Constructor> providerConstructor = factoryProviderClass.getConstructor(delegateClass); + if (providerConstructor != null) { + providerConstructor.setAccessible(true); + sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance()); + } + } else { + Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD"); + chromiumMethodName.setAccessible(true); + String chromiumMethodNameStr = (String) chromiumMethodName.get(null); + if (chromiumMethodNameStr == null) { + chromiumMethodNameStr = "create"; + } + Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass); + if (staticFactory != null) { + sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance()); + } + } + + if (sProviderInstance != null) { + field.set("sProviderInstance", sProviderInstance); + Log.i(TAG, "Hook success!"); + } else { + Log.i(TAG, "Hook failed!"); + } + } catch (Throwable e) { + Log.w(TAG, e); + } + } + + + /** + * 忽略电池优化 + */ + private void ignoreBatteryOptimization(Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + + PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + + boolean hasIgnored = powerManager.isIgnoringBatteryOptimizations(context.getPackageName()); + // 判断当前APP是否有加入电池优化的白名单,如果没有,弹出加入电池优化的白名单的设置对话框。 + if (!hasIgnored) { + Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); + intent.setData(Uri.parse("package:" + context.getPackageName())); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivity(intent); + } + } + } + + public void KillOTA() { + ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); + manager.killBackgroundProcesses("com.adups.fota"); + CmdUtil.execute("am force-stop " + "com.adups.fota"); + } + + public void openOTA() { + Intent intent = new Intent(Intent.ACTION_MAIN); + /**知道要跳转应用的包命与目标Activity*/ + ComponentName componentName = new ComponentName("com.adups.fota", "com.adups.fota.GoogleOtaClient"); + intent.setComponent(componentName); + mContext.startActivity(intent); + } + + public int checkSNPlatform(String sn) { + String secondChars = sn.substring(1, 2); + if ("N".equalsIgnoreCase(secondChars)) {//MTK平台 + return MTKPlatform; + } else if ("R".equalsIgnoreCase(secondChars)) {//展锐平台 + return ZhanruiPlatform; + } else { + Log.e(TAG, "checkSNPlatform: " + "sn: " + sn + "没有对应平台"); + return UnknowPlatform; + } + } + + public int checkAppPlatform() { + String platform = BuildConfig.platform; + if ("MTK".equalsIgnoreCase(platform)) { + Log.i(TAG, "checkAppPlatform: " + "MTK平台"); + return MTKPlatform; + } else if ("ZhanRui".equalsIgnoreCase(platform)) { + Log.i(TAG, "checkAppPlatform: " + "展锐平台"); + return ZhanruiPlatform; + } else { + Log.i(TAG, "checkAppPlatform: " + "没有数据"); + return UnknowPlatform; + } + } + + public boolean isSamePlatform(String platform) { + String AppPlatform = BuildConfig.platform; + if ("ZhanRui".equals(AppPlatform)) { + return ZhanruiTag.equals(platform); + } else { + return AppPlatform.equals(platform); + } + } + + public interface GetAppPlatformCallback { + void AppPlatform(int platform); + } + + public void getAppPlatform(GetAppPlatformCallback getAppPlatformCallback) { + String platform = BuildConfig.platform; + if ("MTK".equalsIgnoreCase(platform)) { + getAppPlatformCallback.AppPlatform(MTKPlatform); + } else if ("ZhanRui".equalsIgnoreCase(platform)) { + getAppPlatformCallback.AppPlatform(ZhanruiPlatform); + } else { + getAppPlatformCallback.AppPlatform(UnknowPlatform); + } + } + + public void killBackgroundProcesses(Context context, String processName) { + gotoLauncher(); + // mIsScanning = true; + removeTask(processName); + ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + String packageName = null; + try { + if (processName.indexOf(":") == -1) { + packageName = processName; + } else { + packageName = processName.split(":")[0]; + } + activityManager.killBackgroundProcesses(packageName); + // + Method forceStopPackage = activityManager.getClass() + .getDeclaredMethod("forceStopPackage", String.class); + forceStopPackage.setAccessible(true); + forceStopPackage.invoke(activityManager, packageName); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 清除所有最近记录 + */ + public void removeAllTask(Context context) { + List list = getRecentTasks(ActivityManager.getMaxRecentTasksStatic(), getCurrentUserId()); + + for (ActivityManager.RecentTaskInfo info : list) { + if (info.realActivity != null) { + Log.e(TAG, "removeAllTask: " + info.realActivity.getPackageName()); + //排除自身 + if (BuildConfig.APPLICATION_ID.equals(info.realActivity.getPackageName())) { + continue; + } + } + try { + ActivityManagerNative.getDefault().removeTask(info.id); + } catch (RemoteException e) { + e.printStackTrace(); + Log.e(TAG, "removeAllTask: " + e.getMessage()); + } + } + } + + public void removeTask(String packageName) { + List list = getRecentTasks(ActivityManager.getMaxRecentTasksStatic(), getCurrentUserId()); + HashMap taskMap = new HashMap<>(); + for (ActivityManager.RecentTaskInfo info : list) { + taskMap.put(info.realActivity.getPackageName(), info.id); + } + try { + ActivityManagerNative.getDefault().removeTask(taskMap.get(packageName)); + } catch (RemoteException e) { + e.printStackTrace(); + Log.e(TAG, "removeTask: " + e.getMessage()); + } catch (NullPointerException e) { + Log.e(TAG, "removeTask: " + e.getMessage()); + } + } + + /** + * 如果界面正在最近任务列表,有些app可能不会被清理 + */ + private void gotoLauncher() { + Intent i = new Intent(Intent.ACTION_MAIN); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //android123提示如果是服务里调用,必须加入new task标识 + i.addCategory(Intent.CATEGORY_HOME); + mContext.startActivity(i); + } + + + /** + * @return a list of the recents tasks. + * 获取近期任务列表 + */ + public List getRecentTasks(int numTasks, int userId) { + try { + return ActivityTaskManager.getService().getRecentTasks(numTasks, + RECENT_IGNORE_UNAVAILABLE, userId).getList(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to get recent tasks", e); + return new ArrayList<>(); + } + } + + /** + * @return the current user's id. + * 获取userId + */ + public int getCurrentUserId() { + UserInfo ui; + try { + ui = ActivityManager.getService().getCurrentUser(); + return ui != null ? ui.id : 0; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + +} diff --git a/app/src/main/java/com/info/sn/utils/LogUtils.java b/app/src/main/java/com/info/sn/utils/LogUtils.java index fd7e391..096241a 100644 --- a/app/src/main/java/com/info/sn/utils/LogUtils.java +++ b/app/src/main/java/com/info/sn/utils/LogUtils.java @@ -8,7 +8,7 @@ import com.info.sn.BuildConfig; * @author Administrator */ public class LogUtils { - static boolean isDebug = BuildConfig.LOG_DEBUG; + static boolean isDebug = BuildConfig.DEBUG; public static void v(String tag, String msg) { if (isDebug) { diff --git a/app/src/main/java/com/info/sn/utils/ToastUtil.java b/app/src/main/java/com/info/sn/utils/ToastUtil.java index 3702e8c..487a787 100644 --- a/app/src/main/java/com/info/sn/utils/ToastUtil.java +++ b/app/src/main/java/com/info/sn/utils/ToastUtil.java @@ -52,7 +52,7 @@ public class ToastUtil { debugHandler.post(new Runnable() { @Override public void run() { - if (BuildConfig.LOG_DEBUG) { + if (BuildConfig.DEBUG) { if (debugToast != null) { debugToast.setText(msg); debugToast.show(); diff --git a/app/src/main/java/com/info/sn/utils/URLUtils.java b/app/src/main/java/com/info/sn/utils/URLUtils.java new file mode 100644 index 0000000..f940db2 --- /dev/null +++ b/app/src/main/java/com/info/sn/utils/URLUtils.java @@ -0,0 +1,242 @@ +package com.info.sn.utils; + +import android.content.Context; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; +import android.webkit.WebSettings; + +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.Call; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class URLUtils { + private static String TAG = URLUtils.class.getSimpleName(); + private Context mContext; + private List baseURLList = new ArrayList<>(); + + public URLUtils(Context context) { + this.mContext = context; + } + + public void setBrowserList() { + String whiteList = Settings.System.getString(mContext.getContentResolver(), "DeselectBrowserArray"); + String homePage = Settings.System.getString(mContext.getContentResolver(), "homepagURL"); + + if (TextUtils.isEmpty(whiteList)) { + Log.e(TAG, "getBrowserWhiteList: " + "whiteList is empty"); + } else { + List URLList = new ArrayList<>(Arrays.asList(whiteList.split(","))); + if (!TextUtils.isEmpty(homePage)) { + if (URLList != null && !URLList.contains(homePage)) { + URLList.add(homePage); + } + } + Observable.create(new ObservableOnSubscribe () { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + baseURLList.clear(); + baseURLList.addAll(URLList); + for (String url : URLList) { + if (url.startsWith("http://")) { + String noHttp = url.substring(7); + if (!baseURLList.contains(noHttp)) { + baseURLList.add(noHttp); + } + emitter.onNext(getOkHttpURL(url)); + } else if (url.startsWith("https://")) { + String noHttps = url.substring(8); + if (!baseURLList.contains(noHttps)) { + baseURLList.add(noHttps); + } + emitter.onNext(getOkHttpURL(url)); + } else { + baseURLList.add("http://" + url); + emitter.onNext(getOkHttpURL("http://" + url)); + baseURLList.add("https://" + url); + emitter.onNext(getOkHttpURL("https://" + url)); + } + Log.e(TAG, "subscribe: " + url); + } + emitter.onComplete(); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer () { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(String s) { + Log.e(TAG, "onNext: " + s); + if (!baseURLList.contains(s)) { + baseURLList.add(s); + } + if (s.startsWith("http://")) { + String noHttp = s.substring(7); + Log.e(TAG, "onNext: noHttp: " + noHttp); + if (!baseURLList.contains(noHttp)) { + baseURLList.add(noHttp); + } + } + if (s.startsWith("https://")) { + String noHttps = s.substring(8); + Log.e(TAG, "onNext: noHttps: " + noHttps); + if (!baseURLList.contains(noHttps)) { + baseURLList.add(noHttps); + } + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG, "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e(TAG, "onComplete: "); + StringBuilder stringBuilder = new StringBuilder(); + for (String s : baseURLList) { + if (stringBuilder.length() > 0) { + stringBuilder.append(","); + } + stringBuilder.append(s); + } + String DeselectBrowserArray = stringBuilder.toString(); + boolean write = Settings.System.putString(mContext.getContentResolver(), "DeselectBrowserArray", DeselectBrowserArray); + Log.e(TAG, "onComplete: " + "white list: " + DeselectBrowserArray); + Log.e(TAG, "onComplete: " + "write :" + write); + } + }); + } + + } + + private String getOkHttpURL(String URL) { + OkHttpClient okHttpClient = new OkHttpClient(); + final Request request = new Request.Builder() + .url(URL) + .removeHeader("User-Agent") + .addHeader("User-Agent", getUserAgent()) + .get()//默认就是GET请求,可以不写 + .build(); + Call call = okHttpClient.newCall(request); +// call.enqueue(new Callback() { +// @Override +// public void onFailure(Call call, IOException e) { +// Log.e(TAG, "onFailure: "); +// } +// +// @Override +// public void onResponse(Call call, Response response) throws IOException { +// Log.e(TAG, "onResponse: " + getIP(response.request().url().uri())); +// } +// }); + try { + Response response = call.execute(); + if (response.isSuccessful()) { + Log.e(TAG, "getOkHttpURL: " + response.request().url().toString()); + return getIP(response.request().url().uri()).toString(); + } else { + return ""; + } + } catch (IOException e) { + e.printStackTrace(); + Log.e(TAG, "getOkHttpURL: " + e.getMessage()); + return ""; + } + } + + /** + * Gets ip. + * 通过url获取到域名 + * + * @param url the url + * @return the ip + */ + public String getIP(String url) { + //使用正则表达式过滤, + String re = "((http|ftp|https)://)(([a-zA-Z0-9._-]+)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))(([a-zA-Z]{2,6})|(:[0-9]{1,4})?)"; + String str = ""; + // 编译正则表达式 + Pattern pattern = Pattern.compile(re); + // 忽略大小写的写法 + // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(url); + //若url==http://127.0.0.1:9040或www.baidu.com的,正则表达式表示匹配 + if (matcher.matches()) { + str = url; + } else { + String[] split2 = url.split(re); + if (split2.length > 1) { + String substring = url.substring(0, url.length() - split2[1].length()); + str = substring; + } else { + str = split2[0]; + } + } + return str; + } + + private URI getIP(URI uri) { + URI effectiveURI = null; + try { + // URI(String scheme, String userInfo, String host, int port, String + // path, String query,String fragment) + effectiveURI = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), null, null, null); + } catch (Throwable var4) { + effectiveURI = null; + } + return effectiveURI; + } + + /** + * @return 获取浏览器的UA + */ + private String getUserAgent() { + String userAgent = ""; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + try { + userAgent = WebSettings.getDefaultUserAgent(mContext); + //需要hook webview + } catch (Exception e) { + Log.e(TAG, "getUserAgent: " + e.getMessage()); + userAgent = System.getProperty("http.agent"); + } + } else { + userAgent = System.getProperty("http.agent"); + } + StringBuffer sb = new StringBuffer(); + for (int i = 0, length = userAgent.length(); i < length; i++) { + char c = userAgent.charAt(i); + if (c <= '\u001f' || c >= '\u007f') { + sb.append(String.format("\\u%04x", (int) c)); + } else { + sb.append(c); + } + } + Log.e(TAG, "getUserAgent: " + sb.toString()); + return sb.toString(); + } +} diff --git a/app/src/main/java/com/info/sn/utils/Utils.java b/app/src/main/java/com/info/sn/utils/Utils.java index 24d1f55..775e970 100644 --- a/app/src/main/java/com/info/sn/utils/Utils.java +++ b/app/src/main/java/com/info/sn/utils/Utils.java @@ -1,86 +1,86 @@ package com.info.sn.utils; - import android.annotation.SuppressLint; - import android.app.ActivityManager; - import android.app.admin.DevicePolicyManager; - import android.bluetooth.BluetoothAdapter; - import android.content.ActivityNotFoundException; - import android.content.ComponentName; - import android.content.Context; - import android.content.ContextWrapper; - import android.content.Intent; - import android.content.IntentFilter; - import android.content.SharedPreferences; - import android.content.pm.ApplicationInfo; - import android.content.pm.PackageInfo; - import android.content.pm.PackageManager; - import android.content.pm.PackageManager.NameNotFoundException; - import android.content.pm.ResolveInfo; - import android.content.res.Resources; - import android.graphics.Bitmap; - import android.graphics.BitmapFactory; - import android.graphics.Canvas; - import android.graphics.Paint; - import android.graphics.PorterDuff; - import android.graphics.PorterDuffXfermode; - import android.net.ConnectivityManager; - import android.net.NetworkInfo; - import android.net.Uri; - import android.net.wifi.WifiInfo; - import android.net.wifi.WifiManager; - import android.os.BatteryManager; - import android.os.Build; - import android.os.StatFs; - import android.provider.Settings; - import android.telephony.TelephonyManager; - import android.text.TextUtils; - import android.text.format.Formatter; - import android.util.DisplayMetrics; - import android.util.Log; - import android.view.MotionEvent; - import android.view.View; - import android.view.WindowManager; - import android.view.inputmethod.InputMethodManager; - import android.widget.EditText; - import android.widget.Toast; +import android.annotation.SuppressLint; +import android.app.ActivityManager; +import android.app.admin.DevicePolicyManager; +import android.bluetooth.BluetoothAdapter; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.ResolveInfo; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.BatteryManager; +import android.os.Build; +import android.os.StatFs; +import android.provider.Settings; +import android.telephony.TelephonyManager; +import android.text.TextUtils; +import android.text.format.Formatter; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; +import android.widget.Toast; - import com.alibaba.fastjson.JSON; - import com.alibaba.fastjson.JSONArray; - import com.alibaba.fastjson.JSONObject; - import com.google.zxing.BarcodeFormat; - import com.google.zxing.EncodeHintType; - import com.google.zxing.WriterException; - import com.google.zxing.common.BitMatrix; - import com.google.zxing.qrcode.QRCodeWriter; - import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; - import com.info.sn.BuildConfig; - import com.info.sn.R; - import com.info.sn.bean.SystemSettings; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import com.info.sn.BuildConfig; +import com.info.sn.R; +import com.info.sn.bean.SystemSettings; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileFilter; +import java.io.FileReader; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.io.Reader; +import java.lang.reflect.Method; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; - import java.io.BufferedReader; - import java.io.File; - import java.io.FileFilter; - import java.io.FileReader; - import java.io.InputStreamReader; - import java.io.LineNumberReader; - import java.io.Reader; - import java.lang.reflect.Method; - import java.net.NetworkInterface; - import java.net.SocketException; - import java.security.MessageDigest; - import java.security.NoSuchAlgorithmException; - import java.text.SimpleDateFormat; - import java.util.ArrayList; - import java.util.Arrays; - import java.util.Calendar; - import java.util.Collections; - import java.util.Date; - import java.util.HashMap; - import java.util.List; - import java.util.Map; - import java.util.regex.Pattern; - import static java.lang.System.getProperty; public class Utils { @@ -1045,7 +1045,7 @@ public class Utils { } } - private static void setIcon(Context mContext,SystemSettings settings) { + private static void setIcon(Context mContext, SystemSettings settings) { try { //added:2019.12.6 //设置5个app的开关 @@ -1090,7 +1090,7 @@ public class Utils { /** * @param context - * @param notList 禁止列表 + * @param notList 禁止列表 * @param allowList 允许列表 * @return */ @@ -1145,6 +1145,7 @@ public class Utils { *在写入白名单之后和安装完成之后执行 */ } + public static String getIMEI(Context context) { String IMEI = "unknow"; String IMEI1, IMEI2, IMEI3; @@ -1258,6 +1259,7 @@ public class Utils { return 0; } } + /** * 描述:获取可用内存. * @@ -1364,6 +1366,19 @@ public class Utils { return jsonObject.toJSONString(); } + public static String getProperty(String key, String defaultValue) { + String value = defaultValue; + try { + Class> c = Class.forName("android.os.SystemProperties"); + Method get = c.getMethod("get", String.class, String.class); + value = (String) (get.invoke(c, key, "unknown")); + } catch (Exception e) { + e.printStackTrace(); + } finally { + return value; + } + } + public static String getHardware(Context context) { int electric = getBattery(context); int charging = getIsCharging(context); diff --git a/app/src/main/res/drawable-hdpi/logo.png b/app/src/main/res/drawable-hdpi/logo.png index 985e4d2ebd4b4c3027fc55c568067460e477a9ac..885554a25baa7d1db99ae42e271055faed3b1f75 100644 GIT binary patch literal 107084 zcmaI6Wk4KTvo1X7;4XtZA-KCkfFxLez>r{r6KrsIcMTHUAtAUsgG=z>?k<7g1DCze zdC$E+zVpqW>D68J)Kj&p*6ObA2z6COYz%S?004mfR!Lq106+u*00<^%s4r*yA{^sh z{>Yr)fSon%&7IvKj%ENEQ+s1G+PAh43o{Kfh^dFekeN6DfJA4d1$G9jD2tld+j2tw zk>PZ=g}!J50OC^aP>6}OnKP}inT3^|1pQfSCq1o|sRX@_fC{$?RL;!OO3BmFOw&_U z%f!>#M8uR{N|ILGUGxRO*320~>uzgf=OpSbLH{qV=*#gxr@829{}pkzmZ1MHQeYKz zS~+`1Gg<*o0S*&x9)4OO5l$Wf9)4jSc3NI;9zHH^J}w?U4jx`nZV^!)0owom(Z5)8 zG&L91kXQI`TQ4ICdP`?#s3;ego0}V_8y}~=qXid_h=>RmH!l}2FUN}nhm(h$GsK<4 z&WYha2=Zo5CXQB6XDfR<+J6us#`Z4G67(-j|H}ni=>NdlIsJE-UINDD4uNv Oq@BxKc=9fa*k#YXM0C2 zdwZMzL{Z(+-r3&C(jH1HCr8VoV`XP*@8 zJbZ72g}G( ?QLoQ^;p#Ef9JyczvBJ3uIc~Ih3|jW<$58*_0PQiKlA*b zQ!mN$&*A@M?aSbQ^4`quCD|Qcvbu;8_8WkZ-ThWxM$3KixE;ODcHtvc!>r_9$Ia98 z-yfQPnZ6c&*Z3-JguqN48xevKWZV~IPP<7 Jbczmcc*^h*t;7YLr!KxO9H^g&TJIoUM9ktJY@J&lz~-IGtL54?ayWfP1O= zsny;rJN*(M?RZ9_3AB^#eLCChdk@|DV^(@Zetm 8pCx2cXJ3XB%*FIsd=}wN&K+Y4F he=P<@wo__ihjO0xdaH^Ytf46TwRZ*{oijeImG**ey=`bH_QDUQ@-bH^<~l zTT7RUeoq@MSaTC_?PqoD%kFlIm9s;d *i8?o zysJRLUY`{4HQLD$IFHBL%MR@V*LA$YixkGkD=rR)tn2{YVmBtSZX`W1(7*+OkFOd@ z3-Usvecr>pMB3c>mj|9mg5eKtQ#8|^hmSsoG+vI4rt|$0NAom7o>|;&H$CaD8T^xS zCyO{nXK$YMaBAZp>GRKzhX 49tT>3xSj)~j$F z5&UPL(z-Ushtt~XwJje7#Wz|NWPPL&z35@P66*-p6tV;Cw7|%beM2fDx2Vkr{CnTo z7C`G+Zw2Wf^; I($DT2$y9m+m;O)u3Vp-1 z##&+cPKm4i dggB$Ia@}Q{2O8J4J b^oY1i*;o{JrZ_7@+Pu*O>HczRR16ptfY+@Wz1;J!!i$0#Q>MB(pHi4qcq zfgu#(q?aZZifAD0ftX*kyEopAD|0tQN*c{W8u%GTG|Rlci_-yt|W4;2;&Agu|2c zRgyE{endi`=q8)DQynfra_+MBy#+O>#|YYP@E4njXpvx0FJ$U2z;eWB^K7hM?vb21 zuJbmtO_Z<;UDex`xqT~Xamx8TUTkdUAs1J5r=G;?-Rk&grGoMjJKmYlFtu16akMdo z6pE|n2mbf?{)`TP)oB4^XK!z#(@TVwus{59bs0AmV$rRfQ=b!q9?s~NUP!vHKS`lK zPx{@GKFwQDOWX`R 9x{&_f26?=g znn(C1CDT%z*iDt)qUE*%0i{V>>6z?xwg#$a36xe(=-q0-xk2I5z%lq Fu zL%EFSv*{Y^T8V}j!^8FK=n!#pL>TRXSCWN(>&uQd-SO(|p8d9M=s|KPJ&jMx;@F(< zM*orO=>8U`lq>ZCx--1vyAnq2N#*^}_zXOM)v@_wW5DmxVtsD)>1gfmu2AQN-||l^ z@yq2)b)Ap%<3P$T?)g(wbRAAEKgijP%G&vuTL+=<=D;(8UYk44X~)Cr^_vxIDZ}9R zshss(7k{Z2l10}Zd+@pDM31WB7q+*ZPGbyioQooqdr$8=4UvdNt0r$~V&a)ca~!i5 z&&b7Yc;Z8+Z^w^o`TiQ%I^yD@WD2@-zMs1T8@X foR^fWn3yq1_#-C2d4IN5cYAZ1T^r1~0CPsA7| zEsMmQbY3m*RCpYaW&C+m6={4uFl@_b#x3mD)pP)Gnm+kK!hU>w+;w`&nJMAbfO6t> zzMT};D7=o*b};VE;63N|{ENh>4bvAsw|3$4Je(@^xbh=NKyOV7U{a}e(wn6Z-u|<5 z^j!Mg?l!dXskRX|{&*GFr6QCS@Id2^HYVjpEqOPj))RtB>ItPwk2<+(7NXjfkvNun zGKM#7xo^CG5K(3jETPM+8L#$HIdC62UJ+mC0WOasyvq_^i5P7`n7q5(i=!&EEjhUg zb8$Sgy)kg{ho^kD3-CH^2A;ONk^0^lwh>Fh)784A9`l|FXMg;4gD*bcTn}_?tlbXN zv^ly+)#0A`-grGs40g+0{sok*-bX#3adoRb^{$1bc0O`~*;Ttu;v_KQB=1@D+CA$P zd87J_y?!@NyWY1U=Es pW?c3;S*{wpPRMoZ}z^Ib3Tu?aS|(0@+zcqt5Wl8wmidXk7KQC zK&gk?XHw^PlYPdx|HP?_Ax?bi>^79bZay&Tq%KP`u9)r^3ec(0vkmCaw*?!_BF6YM zdEfCO?>dS76OlXaiG3JjR>i^HUXHy(x8g?i0Cf SUZn5u{n$Mx8MCpsaOR?Y= zSMM`X(0`CH>RtGWtF_PM>b1HO<6P^U?+W>`JuZ)T60hEm`{F-^ojp9c0vru-c^hnD zu8XQUeww7L2cTa#G~$0}G|#`yiDPx%Mo9s4?zd^WtZD88xt`N=?slX+PSc&vBh oaEjPN>e@Uy0wR$8}}7Eu-v>WgYd<>&wj`MBB>MyhMI)cLu#tOy-(m^&Is! z#r}?@X)9LDGw&Mou&yC)_{`)-`Se@r;_He37W(baHDA(YhrN~adc&K)(4K{ihv=A> zkiLM-&1?jyimza6Q~Nz$xB{lHj3;s)%V>hQ9;W8%FH@g)6ea(>b$^1Pl>YF%2*u>m zYroV#yN@AJ#>*|+7e%)Eg<|L1;5gSp0!u{ Cpk z fvv6(Z+S-m+Tl{88Y)~fBIW_rW^G#{|wM)_)QO+;oY#L4ez3V zrsxXU>0kQsk{n;GZ1+DrU@E;JI2_*KGar)GXV>c8-ahdU8){W5>&fZ@eOD_(^X(AK z^VOSniqnpxiZ8#@DmzZD#k%!cobOy-3dgF+^{<9lzQ~CWXG7rFKe>BD;cw?T?zK9t z`K{9D#M&! JOLUg2ec(zxmgT=qUXfv=l%3e_zFO}?Lm ztg0>@TqgJJLuCg-U7PZ(O(gFpaeEv+0I3E|_lx6_7eq4;4?mW;^xP|`CiTvQ4i#Q~ z&iSWio}kKEhYu(AeqL*UWskkA^Nh~B44 brd)q+Sok!PQFW zdPvpedqN=orz{S3cd6F1x_WSe@~@-rht?@|wr|5IL{rB}4VutKf~?Q4ruW9ZkGFFC zJy%dZl<&Ehkgpy7n{z#UA`~Z_^`k19pkce#*uMQQcrVj?7WT5gHw(?Tc;6Y*kT3kZ zel#Rmvn{X16ZkcosOsqVe`>F-1((mVb#A^m`7*oB*SQsLc@^IpCYww<=Qx`7yM`Nn z&i`{IWGMYi!tIG({Jd+#t@B#VPh{q(SQmg(@U0{IQLy-5hcUPdxZq9T JlV=uNV6Nh47ynUl1*?e( z%Tm-oSO1HWZOK8>kMGLZf5)<;LU`O(oHQ}HzZG9&HlmsQ2j)eP?^VqZJ+XF`oXp?P~n3x7j}%|lApzwZ4vq0AwsFf4(0 zuIrm2Bj?M_uku2DCF`HpQ@a0Oq2sbt-MZ&&k#^v?q!)tZ`O{4hLd~E_hG)b7L;BZ; ze!y$xk`A!5)pzLkAd=62{;9x!y?&ufu@!ZFc2JTX!gZe?rUpNcd%RI^?AmN5aaop? zxD}R63-EEZL3%j)p<7{!=~%qdC8a#z!80Bddww9f927m^L``8Is(8PfGgudM*1^AK z>6vizJ`AjyzL#!(8pS+XpyJ06%PI8NWqv6nTbFxA_c6o7hq^+)9fQm7jxEQphvG?i zhO2ca^bG0Klafvt^2IIAqV#l7G=-ae7@c*9!Jn+9_g1oA`gMN4En;@t%7l62=HD9a z+HEMf;Tsyyxi8k|58YVTuDzvBq-ogb+Z>u4)TKFr!w9`w8=+fFfmT%$qm(@=CCZxN z&EuA>^qJ>ZTgAB4DvQ7kCAP@R*rjspOi8aIxKGJ?`ko!i^l{@r)9OwCfD4~138wq~ z^418~6NBLuk`5 UU1&N;#P3%uP)=a z+;e-oC#YHLr2-GlEC1eYF|$*O;+R4))JRUc)s&iX|0S+_L!RT{XAL2i9?N(IUww~g zQ=eA3=PVWpV5=0e*=JirmUGl4Njo_f*pRp6_qpIilM$!jQIX*>%#&Ze`)+k>5zhv# z zXP>g( z$#H4^Y{lO8_|6%VqJuho3pc0r$S5DqlCxt!SV1b4@z@-7mI`M-g?QW3J&O~q4LP@O z7<8tM5{yxLZ-nmor^_IcpyE!awOX -2k}zI2q`E4fY0hRw(-A&HXqK7Lp@d; z33prnM)=%3K#y8ZTF<`1PiLJTpbzE8HDADj<@Qn|Crd6F*C9uHE=wO>4S!eZ-^|UM z!CQ!LefaBF)C9`cs45Rqes825U6W^Z++k$4T(G{}@p oE1c|Uq2`K#hyaw94jT? zr~o3EWe{VTF)6FCSS_)j@s>7Mb67mj_w>mWZ5 8@_oL{Nli`BD%XP;lP+I~AJM-fv3;g+|H;+j|%6tF^P|&4G1AzjdyzCBK_r z(A0y~0k2pI@u|8q`05z7L9-*gp6!#2ZFKVt_4%ze*V5RDe?`OG#g}J$YH4K){wrqG zs4ioSj1Q<7*^cNIfkl%Zv3=_d!eZaXI4l?>a33-K0Rkz38ng0-QWCBS94s~1$?%g5 zM69$fXIh~B2SrveR^X_oaq_X4OE-HoJ72G;cQcj}g7h%&Q25}MQ#^fF@^dtnkv~AZ z)SG&V2JqS9$& kfwV1q-t0r|XKblTJ2rodSn%xEnh)U&Y z72G8wkRoGLP3&eM2GN0&&xr(v>W>dCglVVnK96I|myt!f3m^#}QdPn?AyvPP7Q;fM zT4SndgDEp X;XoIYl~zAT6aMP?tu6cZ(k_mXu< z+-91$*fRBdyZqg^Om&I?NK+M^9a6UK`;YF&36`?ARmd||$sEg9x+336>cKIk|D7q>UK(tEQU%su*#VPCvit>K$`>IFR;VX#~Dv ze#G7*kYzy93}DwYUcd}Gb~2LumQ7|AdLE7$G2;O0t0fjhp5i0?N+$iLuZQKM*f=kl zD@{xp Coe2n$~MM?(HA2t4HT5tX>%*0gEW^49og6!RX8 zD-=5d#N3F=v?CQ%uWh}MkEl>eK@VT2Wl&W*j9X3vDdEEl5qeF*Ke=R(hd}i}dO3 8sxTAiHaVm;9P#!}FjtL{pVnv*dNW*m&ly^E?mgAj&8 zWzz2-AM$w )$F?KH42u}dLB-nxC64WaWSHtMUaVd-^|V(O<+>vTa+p@ zKwg6d`gFiTEM??~KaoEk$8@aBA+L*6VaVW=QxpK5=Un=3EeL~qkdOYg7=sj{mz2h} zQfKO&U3? w0 zRU6$r%6;*C7l|fh!l?!Qpb~F~Ua5hxjCke> #gusD(jL^)p#^w2Jf4vyg>)8a$&82l2ANcv(6?UMvIJa3VH z<5x8p_|hCa{e`aw!wVOPlMR_G68gdCSOq-ha@n0E*#Xf|aOZW)YGqx;wPOeWd{luE z2M${cyS|9TvkDDX^q%hyT#^48F=@Q8W3=J7yvb)8LZoo{RGH|nT?okX{;&Y-8ajNS z@aTj??F3r&SmwkRw#Sa4T1sDPlULs6VL<$#-Fygayci=d2}jx)00GcOe=Q}8nxwXG zN6R%q3&DEOUz$)Fht`G7x9*6tyIJ3EbY7gn?sk5j|5+K}Xae{%7JBGOh~oz3BZFSy z(|1eC%c3J-B*B;{)36rZ3Q7t!nj_E`oqGUiv9Ce%ZgsSMCku>~jCAtiZ_0~kE0;h9 znQ7DK(IGIr_? r$V3cEwDLM#g?DbU0hmsgoDWNo4CHD@)+^jpInD~(bQ zMkX!k=E*j_;xJ@q68Sk6Ml8gg>#`X1*R{&yKV(r%Aw=1OM_i8nuOTXEHFV#Jh~lYb zhg=+-Z%--WuFAx5pgcMbfecIO_;`pzp8Q`?x*zWn`t?jLr35*+DfM zvBLbDG9fa!qA%HG % zgD{`gm3w{{lVQ)NAlx(Q)3MbZb*|QVL$M*W3MYoz!?&SSs!9Nv!aBAzKr|s*0vPlz z_!7?PA0;35LHx~7BwcW#cS%}ot*j9)4*6`Fz$Wq5f=0W0xQ`p4Z=OnMf9e%BW_oWx z1cGu}QxfxnWB#1=ZE aEVR1A=X& z1}oT%MHmsQ6$+kh ){N&6}n^&Lw+thhc z7)z;xi24JF^1dhjrN74iMM|sS7c|YSCTf?R@{yMWK-F0?K!)7Uu brrPQ*7`lj;`UfDsWo11WIbiR*M73t4VF25a=DEpp zUn9&+7|HESvQL(Qr^k~3iqu*)_T{5thj+6HH_I8NH#=4+LSQvJ0Rke6EvHEpPtR$V zbcFeUO8PE@6oH2>csu=77mP+`x?9wYNQN-uIWw54yn_*JQNySnMWCg=KP_fl(VY{5 z`(yAi1tjl}*1Sy!EeTaC4&Ho6g{Wd}hfbi*)1UNqK=oJddld>MDodkYFv|nuNt4y$ zt8viV{@UcXNL1+4r3G-Cln82r$-nfG3lu<;LT+q+K1O=weZiyqvWXa)RGHc0Z;{PM zHi*1eViI1434E_wHPd8uBE$x3@j?8A)S%qMgbiI_^4d?CltJnPKB;-Z4MQAmm}`u~ z=6fvmU=$XW#LzFYrGXKW6qU_*qroO3hj@rqZPzeg*XTFc2DFRtR`dL^r$<*b)y_lm z$1A_ zF tBnqSAs>wIlpm3cSYT;8ew2sd+)9a{ zktq|NY(+r9w oQ2fcV)9c(J z-*5``BC11h3Ob`M^Mwm{Iwcp#Ebtwbm!x`TU=nXnHIEmMn0QUusxh@?E&~d2(bgym zQTked$Fsp5L9s6VpvH&ET7uXBv{97)bwuI$E+hC!cOY5>C_8Z&glCF{qNZymJI4G? z4T%pT$6{U5Y{afOZ4m~t-c#{OD~gatUcAyUz2tZgK^1ct_#*5tGu!O+`>A-TbDiuq z%kY->cJF!L`e7oxEW?E3lPHJAq_qCr5ue4FGZtzRezx=**lHivK&`@Z4f8Mvoxv1G zxGo;03QzIezURqL&wj%jJB$}AuiItJMnOI;hBiyn%VY_{!1{zs)Z =LcpN@Q?;I74Iu D9`Y>ozw-r9c2P>j>5#2CL z+H|L(&@@5$C0KoP+Fow0Su~X(Ob*#fAiX2{*DT>`TePySswO6Vl-z@5uF$}1S;2r( zOCpVFHWkw{F1|uO3T91H>^I4uoG$qz&k5+oE_i67gt0Wfk0dUp%O&!%!6l3zT&VvH zmXv-$wItV-LOI@Eh+5`zA=*etLL@CHBCrU=${dAn--NvO3W#sEX2zjsVAZ7$ rKsZO`fL8@H&+bvkiWSBtFZ!DAqpb(?* zJ}`RF>U2J&VKs)>M|6GTy0Zeg2Lh_ve I~il7q-P}aFE?@tPN{7}16s>^ucRykQk50m*}RGv0fx*ib5 B4 zS*#4b(`mX1M~*rCz(*>c2yHf9%Eu}i43x_Jdv1jE=vy?pih%d3{Az(cI)R&@X<-qg z^gvLFCYry(2^qn$w_ToEPy-z8Xc?@Kovi#QG3Q|A!b-#jUD=P&`YFq~qIER-o?baA z7@~Br{P#*H9s-Ii8W%N@xr1UK9HUIQ-!h~UWEAFUe2YMQTcpLo^2rmG5|6^V!qPxf zP(-|DNHh$ALb0UM|LyNjP?!kOEn9yvYO0FqiOb+N+6K-Rf_z~oG)H1-q5%#MvS%+f z%Hfy*5ITc;mnE|fJ{JBi75>}}jyK4(0+%9-D;*$&a%k*=BB@KA_sl1bxb(oqm@&fo zecu9->t!l0EX%J89y$(Z<6?yXQJh%QXCr3mb+lWdVVvDd9XD+25}kjFpr2g~${^SD z2r>H?hf`V$t>Ld|`}ez1z9$L_2+@X%v&|BTaiG55z!-}Tc2>z3{+$>u6i1YI%7Vfl z=>fcXFYlY}F!X2RF?x-Y#68g>Dt;rnOGBD|-8r3HFC~Hqqx^%GcZ`=o?qOG6$WO{B zdX9GItT*4LJ{3>k3yzSGVIp;vdMMiw*(6djE%4wUK{dV3SZv?cpduHb>R*H#;>K9A zOaJj|?g%cOkg-@+jJU!{chtv^;l dXA! zw73qNkSnp3MtaDq+%F<~G?zk(-C_$g)yHn TrHC#S~IenT5;KDE^7Y*9cHx zzr9*P-uY%xz=-zE+l@h*rVQVFsZ3KrmQLZKAUBc7p|r)IyeGaoon?+;(vTY!l@492 zP?v$|Ab!hPmvx2|!T=JE&YE~sADs8rmHD{(QBJFzIKL$N@Xeq!vB$1;k|k$hV)bBA zjIrIbmf*rWI6p@HI~JsEmYWa^2q$*5GIoSAk8QyM_Q{Zyz%Dq5CZ%uihoR-H pdt)T*ns4IM1|#3Jeq@-Sf`ZxW5@tc@M=D4Z7f-J} zBHmSGe~M(K$^8QD4&mjWeob#=;=P1lpmgiJliQq4j}c}By_e6kr^Vq7_aQwD?QO!8 zF8+zQX9zOJke!^5rOewtFAI}bYG33Z)*7{aS6lx^$pjINw#O)3iMwD2)9Qy-sfuhe z1SAg%5=3B3p3`GA*M0ZebE@*KLFPO3`L~*`X3UtxGA}(3#$RZ|d^-GPp9f-K42syy zIG1(f5H=_yqb!58F;?mMH~MM?29P-&5-@&<5~7wzup2KLx$YO>Ib4>IlV<^%RTT=r zi;$v7UWb`Og-?RUnISD`J#00uto?uDuci-V{6`=j9 zMC0KsQ@Op&E$Q0z*YlYzH`s{lnBuAm7jZm(OD3H>Oms7e8z%h&pgOG;5yERs$Pq1{ z^#NH70jVX6AO->J9kxDWQ~0|yLX1m0Qx`w^+yJm}01uwQ#E>p-I+-k88-c(dmhmhi zd#oZ^GzW|Jc@r(Wpbt#R!t(jmL}4Zz(&+Ij@86@C!S!BY_swXuQxBGZDalRc<@!R; z=p_?hx%Ozyzy^&Ez2HXsqGY0%ddf=iUI zGGJMCx9=ZPO>2S{BMj}9qv_6pfm3<{(RL>miZUt~x{H^>%(!eUO;;@9(pWy5{^lWD zd5pzgK$-XXCEz~i_qXVLvQYvcq(ce}(-{7+%C*W5@}U2C;!*}=Q2JpmoPZbc_S<}a zEf&a< u%i@q72&(d0ty!ViVL135v^{hodG~84|V@!dUzififf;1LIXxK{Sc4ogOdQFZl zP>(+1y=qP~IgKYz?Xqj2{_AS$^!N}{i+pQk56p`NtDI!>cjz5IK-F^+5?2%Gs>$Rj z{pVY>4Ofp;3d tUFjZTOOIZ-#(QD0*=$tE1qH>B4(Fr)TCAHObNWn(?U zMt^;Q5mY0i9xRi8{uY4Ot~3qqE?QC3>K32_4_uGm2 zV_&5+s3uMRZ2aUuXM}vx2N0e;Y0kde9628x@4#4v`&5SUL5aT`xIxyLL_|0$f4m9w zr)Zh~l|z2C`F8ZGY?1&K-8&24Xe>v@zWZnU-8GS!i~rBNJQrL>(dT&&&0s<$0DdwR z>x1&U)KDvIe38ev8f^km{~Rh@D `i BOz7!}(}Y*%V_74sKragea$O zYr%3t5{`1X*6IkybZ{yiBc7L@DayAu1{_?sqX9YI^)qdE#KhreX$yG8Cdnpzy(9Uq zhFb!1#rOK_g%%tX?4cqp;lG;V3Xn-P0rH&uyr}Z#$GF|N6ZBLHy#{Hee-0)NG62-F zZ_4w0_Li>cqGb3N_$XHSM{bb=`a=|KgnJISyS~|Y A z_dUb=0w4Q^R=0KF%Ih$1qPEoy=Af*Pw=FH6f4_6MDs)lN#*!|_JN=PAdfhFig2Q^; zGPojkBIqh9lyS2_FZfj;&7LgB0UyIZPw2N}?trc(_EFlpXMpEic%&*4&zvm~0@<$p zogLJz?pO|4c)f~99`T!=49vXkx~aSt5Q{GRfn6UQ6=p-M4?%n@9ZV!xfUHz3rT7il z2mbV>f{&x bB7&GMTAgMYA|C_HGn#@gZOPp_VCwQx=5BcT1aTg4%olp z(neTS>O 1Fa*7nx-EyOA(Q#~EhRT!gy5x;`-dJzUV-oT--vwIgd5?dh zI8(!~c~6e3G=V7)5W Z@*AdB}%&qP!#I~GLQt<0e_x; zetFbJIrAJz?fOcp+7r{7`leqAN2|>pl2l=@uQmVjL6o$Ld_iAxT#5wbmr$O;L^L09 zay3TD`W2arwP{-f34rauPL7(=v>bsxUZy5n=_X%YTtRV(p^uLEk3WlVJvJlxrxdTn zlTM)Mq+>MiJ0<2D#(PZa#r&>ZqgCXnBbNRJ^fUw5lhTzV|Ap7sGlEup(s-#7O4Ly4 zHzk1$M07A3##imP^}8t#xJR$axEYVq3+=VjIh2m#2J03np-QdUSZECG d%@U41;8NIjYYgCBER#fW3c(|lfp$zl2voDc&urW%$YL$qV4we5~Ank0z z?;8NUcKt8B4M@@(0KTb&fcEu+BjjHFZBEt{V)<^0>x2hsH}GlMdVN8v31y74f{|(d zuLadB$>#xnmpShh!=f=uOt=V52`(xw-4*f2A!P!`M6@WSs*NrgZxNNi^*d2)wu3nq z6%Y>}28UaYR!$IrC~?wVqsivH+LD_{9MeG+QAWM=>zukjR#)j}1dtiI8ed26R=Elk z>`H-JPe1`x->fnT{S; HDfNz5W=GKM3G;69{> z^TC^CV9wn^>qcEODp-Ys(v`sM7Y3HXbl1VO7imVQO}Kp9@W89fO$Uv3B}}iid6`T z(NXzBtmlkhGKBM3NKA8y0 53wEemp4UQ9MW;yo z_!baz&ERaTwmoF>41}!&;4WnJq z28M{RA61zjiN#kp9Ert6`5KJ-gU&k0uxg`8trCBm3RhK|kG>IK3wdAq+&Ds@tNSz5 zM4)BjEl`@o&>fHiPZ!(Rdj8Ay(zMN8)K&c3v>Oz?^;P;DYbL|K17GqYLd|bsT212V zYyFvM+Lxo-sgJKs6XFvcF}OW^=N0vu`OUdZ%j45lkqT^KO5+i! Sv?IHAAdjqZC|z?hS}w4Z`6PRWy<6rSBY-QrssVrHA(t#ba<}zo_sX3Q=e`Y zK9Du@oRDtbozErBg6+}5oNTO)YNd@Ckt) XPX{F??9~AfV5%zQ t6Q^Jfr6#~RHM_;2vU5A-^QpJj$)WBf`hu;4Q9KYI zk3%ONi#MN*J8z3YTRH52q41Tj4O=Yx*aDaX=q^{DC&zQG@3=SRE-{dMQA+SDMB9Ns z)1>qQ 97)Bp94$9%<$Pq(~6=%;JmPSU{b)F&}Jo3 zO)7O|HoEMgF #`JsJ#8|Yqe^| zeh;JgXHzAHdRka;RhS7wC^TXOr_B5Q;JYh%41(qD-3s6$50z8W3q$fk#jX1=H?Vz0 zuYZv8>GpO3)3{F}$M5CKEa>x(4Hf(Qq|`%8ey_*FI2pfyJZ(n&%EWJh*bB}$8wt*z zb^4MmROMYau~eJ{QNT(?7f(cA{ro&t1Idl_a)5Lzo~HQUAR9Q0+S^n?r3627`S>@9 zg-H`7*`g>M@GCpMG@kg 3wAA<)JE%DFK<=-PSevi zCU3$y9Qu*f2r#IH`I}Go4`RQ@8*NtS4y~#k^9Kg1;53*>p8=>aS$!@zom`mE20h^u z;TsaWEkqUdN()`DJc{z7jf9>VI*vw{Cc5>sVPj>1ZdL%{II9s|c|uJ& 0rjOb7~t-9%4t`f_zGWK(s0fd-Y(5A!+wh||3xoY+$^G(zl0?wsXBZ(kql zm2{AMH;?mL5M*{yN5;&6*frgRM_bUQ#`p->4?7+BX6v$Utjo8>J^&W}r2u@l7**}d z)b)o5W@6~ZruRIG=<1dtJClw?<^*FNP@_A}7DZ8$birBuyL6^IN85ij;AJ^GQ+=+` zlVJ%#Smo~i(37FEsX`l|EV;cx&(lqB*4h>yfd4ZNiLcvmhYs77rNcb@(ZhJ09htfB z#2)&xb<0$dD2}l3<5V}$fTo|)2Qe~{+f)Qu+6KY0FGotY2bIv zo@+CKTxBAW>_8)x-ZKqr3ICR3X~99{MZIxwM (4 zrhL6=vZMzX=Np?YgRM`l%>>BbkLX?9V>B8_1PhZ(jfaXa-T^tf_Ej1V^GX*YMO-*r z%L&SjTohYRegf1wcTk(|$Mom*%kN>f6Ux|LZA~y$)A7=<@)MWR*PKZ%h%7;2O8(V| z`Lp2|!mySP;UQBMg+t`O_9r(x?qBz-TLaM2emg@ORh)lGSa-$ih%u?S;qPVAM^^Fo zL$E6k!udfqdd!=8_*zQ53eM7->~zA=)#K_Sbn>XXbN&UP*RRWv-?hi `}`THTQN z0_>7?%RzSov|>s EhYeRPhn47E7#vK6c?Cpfg&>JSKg l_hq#vSt^6M& z64j)Gx`VR;@xKTn0Kh(zU!jgI56V~R&ge#0x)dw4W!pb0kLZ^906znlfhDo3aV9Hb*Aa znfFJw%u~Vm3CsuIqU6VAJipoe5&2UYj#5&@J&+lXCPgauNIC8K8a+t<-Cz*WgxtG( z_SZLwvFcvc2~AFf*T%+8CUvKZ9u&i@M*ZngZ3yje=h59H(VL8pQ7$&krZ!cJiyd`T zwO=u!P()XAqsWw?caR2=kz7_A`B|sxZptw-4^yIFcE5Cgx2t(^qQORxwBJG|?3u;J zx*vP)8^)AKnMJ^$5j`!5>1y#6>W8nWoN)hu5x>SCE0Z`eq)urKdfI?YmicgAwIFnJ zov+zpjB(Gwp)Cx|7zvhNHJgD7J!F`XwMu_n82O~--uGTkVk)!65PY8~Y8;YXsD|_k zBa;N1d4<;;<*kzeMT~qnSbWFwO_Px&
giZ_Kn@qe9$*dyc1t_VI5$|CnhJ1KG#rE|BLQUVs z484VJOz;?(k~2Mt*_tahH9f7OT1m_sTQ*4J%mj;eyN7y<4&RI_5fUFymne=hiWY^0 z^z!mZ0QBKDh>v*r&(Z;N({l*VhY!4ar3>7z#?=Q$-Q)4TX9NPsVzam<`D+M{%2`V) zxmUr~JF*PyUcJ?1a8FEB&ilIQ;V{`0L8iaC4PC~N#*-(X+|VPb_t3wUKl2VfTQoD9 z(|%M6M@w!g9bm2X&oq$MQ$4=b(iCv$;I}NAlN(q#x8$#U#9%hrlfy_eLR3q<3_|1o z4hfW*C(}_eTOveZu$9l=gOCBSSP9oI2FS=t#c6sEVPEdPZ)2tm4MczjrR^1|E5itB zw7%W4$06W|%Gav&!E_U;K-P!#L=$=_zj^r*mZav0Et&N^dbk!4esrcY-)blekTXz4 zZlOIOaqB-L680YfLS9 KtzNy0eVvxfOENe z<{nlmzR(cZV8T2ooM$m?=TB%Acwv{ZY%@a2*#i(n%{7wcz~@?~?CKpRWulmm`DsQ5*yI%PO6%Nu0b}UjYUmLl?(p#GXygR>saC8<{XEztso%C zeu1W9n;M5RJ{CbbO_xJpz%x@G9k2M@ ^D*9>woiRsRRZ=Fm5^kKOKjT}Q z=sH5?>FAeNEqFT76<{5jMSw>CUFiX{-XW_ficpa&=!2kQd{N7X>Kph?tS965ph5r> z)95+g#c_d9e9q^e2sPP6(+bO0U`F|ly2L|Tgdh@*68 1twkA#L0mxZOKS0S8CLc }qz>-fn|2Lp3@NM ?qht&m-141Nx7IN>pe(iNl`2YlU z=TL(|jgN3_x_-eXcOiL{F_ukcEX+>ON_*{E1*9L$*~17 z$R<-6=8b|e`zsft_M4xg+lNGg6D&fd2_z>mVuxTxElXx!%$ejs>>lxT<-{2%vgs31 zn &t^miBEXFi iNEy!{G 5$9Zff6iVn}VoUm77pVXT+b%Sf04t%w<^Ma*Q_0dkB+rW1@<3*sz= z2C{OR2|XnhAhqts9DpD_6*kXWkQ&v`Z8K{*<=KnPV#0XHmg}ejG&vA3uGxU(i8e6B z?yQv9ox*>Xb}G-)Q{N_HD?pfHIiC#QW^*6`sr@%uQ>++}K$5oFSf*s?{EaPGR#}mz z1sB$=Yi(FHRIlX-z7@Uwx7AFnZThMM7%LZY@u3d8o&^&<*r;79ss$G|9d%$fzyc6s zLnH|M9h=df*Zvpm!ty-9;;Wtmb8ZQ=R|SBbCD G3_Mid=wXim2=F1y{@ J@dU00uNbAXpyK3yh%>DnS(+NOLWAUkbHHaE#F?fQz}t zS}!f#h14lbVJ-N;XbezH6m)8CD=5XLT+C^h)i(=?AP7zl14|(o3}6MzfUz1JY&hHQ zM%D^(;SPfVTyzYC4UG)xr8YcLh1wy(^4o l9Az^WBdQ4! zr<=y!6>^us%OVB@z~)P1EK+}W4p_)$I@DWfJe?)^jX4^OX=6hKk@qr--OvSvRB(X= zozBnbC6ZhuDu4+B0IjCSNES(MnPe=o&YqbxQdAfSEC@ZbVGq#KfHih0$6Dm|AA0SP zoJM0TeR)2(nC{$p7;rH~uQ5Mcr0hMbxpvC1h$(;zwp Zw%=>dTo{`<;=&}=pvCC^b_SQu>kse3!5ZPrS3Uvt?_GmtcQMFbqEb+@ zuTfqB)bts1Ym*#jh$J#`#F}@dc YZi%0$qVmTw}gJxq!ADOw7RF`XvXELVO3 z(DQkw|7oF-FbG8dnOKS{U|bu7WQaqALK>gD9z>iCGu!g1rx*s0jrXcB-UB1JYIe+p z(^3ScA`)pBc5+qH*UaM7N}*{^;K_TF^~);qhso|b54SOXR2kW=9F;u&pmCr{Uh8Z zg~7lOY6w0Upq6bPmIXm)!%VpvrG#( >o;Zy;>An!-a(xu<$I z!%>PT=Uhz67UPtOV3W#FXkZ2)Z&dO<~ z$vULpyC|z9)6d7EP03y;T`tkYO1Yb)ozg^c=Ug+bITcjL478vC9?VE6q>yG>TptCX zU?tZ5aZR+mZx0a}xf_a{d7T9YlYMd)-(72IS&em{mTIDmk)XqfQ&=4Xv1UMI5OfY2 zi eogKg`2QEM`%~;0MsJ-GZlJ^Ch>bi#O z*RR84k3C+6a_zpf`0>g=oXE3@d@zh}Y8x^ULEN~fo{Zn7;S^ouYhfRHiYqkmimMF; zjRY@E9E%+)Hsl}n8#`)LJ%};>H?bmS*4@)^y@Lg9p2l|K$f!UXCb&Rrt|(&CY(@;q z=gk&86UJebiD^TUF(U37MS--DPzfolfHq>)v<(@9Dpi*u*#Jeup@a-n=0VNkAjSj) ze-V=nhXiL9Ls~r#+Z0D3mULS!oixfoVOHOmDZW-NE|(K(W 1Dli}`rkn7Y zBUNzgTt>jd0tLIzWfjDpPSEMYAkJiKF|Zc>{C3}0T5xetRdDN{`8b^Zm(RD$cLxh_ zifchp@flY}n4~coYEN-uKqKf#2zGaO;PT~5@Uf4dKU+tmk7Ey!Sm!lcI-Ro?jq|~G zg>lFg$T7ass?ULDEQf21hJc2N%(KXbL7cuM{){n?Kq7) DKRli{T?! z3| }6~lg02k(qCA8#eoMFL#+{~yEy1VCGGiMea*mJ-2SGI!P#GW zuHAlb$k`-57$j98gxX*b3&b&k5 DLL}`!`}+rQ+sj_|(f#Ys{_Pr=QsHEvj(xaj zx}Y;B1ofcBG8Rol-G$E$V=_p7Cd0&(0FjR-@pMlU9tR{&aHtwlr=5tI5ia5k71?>l z2t}Wn=nz8)1(B6yM@c#B&sZ5uY##d9T$52MqBZ_K2MS76X*AHH6)_7Dy?jj)tr(eF ztc({Iqw? 3(5$Yw8ek%1Az(k##u>f8|-9#BAJ{;0lMCEKn2#@d#k~Lo+ zSvZ6(^CHb^&`~(yCNXfabWBDE4(h;WENhl6;w`?dN!B9ReY@HsU3jF=80qG>zx~R? zr{SRe9d~@)N8rX^d8S?e6i^+Q3(D1llC`8t>I`jks3{z%FD+MwJ2j+m8%PqV@8zl43Tc|CBrmPNMxE%1!j%3%At~&@etb=Qd>7=ERwg8 zavGMSVKg?=T})*t@~j4prj;IrNK?D&M&;s&hm?iJf+B5(@uJQ~Y9=@v0UTr)Rv*Mf zBF?~i1kq;0Q%{Wq6Ud5_S&=4ZEsSBp&QQ3_g9}kDwJ~wE(?N4#Y*8{+q-+ti7p{)T ziiJg1HZ67EG8qTEga5@r`+F`wbQ)IewYd9F{{h_itIxLkI6YMSq8va@6BY7hCIdi0 zO{G5?9-$L}7sFAmUb}Yofd?LN)l^HVTt^+Nab6c@oU!m4j6Ay$0~d&@ct8{`(APnQ zluCsV(y$_oG##73i 5_ho|=s1HiT47t$8(Uxe?8&0X-EJM^aTWsawKrx$~w`X@~~Y5DO2%Xcbb^ z@XZupmFgLCJ{72hN)pWkWs1?!6j3Ot##}{+Pr5!Lmoz@6z1R$JY?>u9wH(_>r4^hf zz8q&L^dO@8hoP8R1SEK2v&iQn4s`%1-~usWF9IVGr=W7Cg4jACrPPR0>Q1MDo~39c zbKx>fFa{UCo(TKy!YSUrq8EKaA3ix??1l#wR=nxNnobP5Z|jQqP>8ED((SjsPM04# z1Irb{Jzw=fxbYq5+GS@Ha4`-BN)mTe2D<=|(c+&BYr&I3LRk&Ot5>f;&Fg-i#OaV# zDDzZPDguanJrZrqM45&msY;=+8m_8oh>Y q{C76PF|rJ{~A8##ps&IBx*))vfnnxL3lQDK>$0h8|rN?-w^`XA-< zoZh+SeJVf=XQYmxQ^FGS46bnWEj^-O22Hv9bC`@xO1GiVUX-7{GJ65#{pYqpxo=l* zBq!@N!eq-trdc4h7Oq$s2Oy5A00oTL?`sSof&+?>EfNbo*W4V-Ws>+%2-9DfkTK$P z6+QdFSPgHUWo+1EVKY8#4G|X#S=v<9Zht+P*a=qPOIv5ei9Ea7B9|UK1M8~|yyC0g z2RHuCbFja2x^q((!#b_?#SG662?MRQ*a?e~(|Hmdn><5mHoNpxY6zFh71Ufsa@-t- zCzpHmq-X+3yfnm@iHZ+|<6#l`nK0|{iM-1u2Dj8K3}Q7(cu}$tw TklAyi zN}8Yu(WI%SbIPjczx%o=g<2Gwboi)vS71g5kt;?Gpr@PCh|U7VC_e3cDKUM*WMq)f zTuIHgQq4#N3Ml_{V$$L3wM25DV{XVq&oU|4fM seAE@b~7h%7|&~#c^4N zV69K~%m@c_LQ(!IP?fT3*j9oi5P{DN<4QD_sIPk283Hyk$Mw|x2#8%*I3@ z7dwpM*s PC>>T9tvjju2=n1481Fp_3srVxz6# z{Zu;%z)6Wb`v r*%|=|-8e!Lqg*ZT%Wu-n9G@)T31w=tcBSRx&cMhT`3pm1c z8gDjp;gR|5#hlQ{)RfjKHG#P$_!xr$8)z>~IUJJAmzLlL(zH}&sD%PV*wX0^Tnsuo z@BqWr2?=2kuxY6-`=jy#&mn|j?Y~_bX~j&nd UxH;C!gv=0Uh~<1R z9BZ*M7F;ZbP|A`QE2}u0F@TDmz3>?%rUx6&^J0Iuf)`%72lXfR;Z ~} zQeK-T2Kh*N^9XVdF_N=JEX7$)ppUoxT0;#kmrG!2swb4*;!UqiD&{N}IYTcBjYA|! zGnf4w0~EF$iB1+V3N!GMB7vRYE| H~3mKv8tFP zXN}^~6IR^9*CMhQA9G47z6LV;fJXO+P%7I!0aQ@_oN}NAA pB5F z?Kb)iR5r7U8G#s}%w;5Wh9kpTC oS60#d^VgE<_Cxr<>rWSPSu2hww-L+3GD0oLgtNpHnTkc*PDZ zK5z|Q{Z;RUz2~pO{@x8k{(4h}0%IN((wkWW9(s$Z?02;E^$~@_k*7ZnAF4&&he#s9 z;7KqT>D58em+%mY02V@ 7vrvmg-6<&pMUIi(?6R(?+_KX9hHGi!?Svt9A-% zLA10oD5;=`Gb_3u1f}5v$}kYQ`XmZi!AWVZ 3JTOPlVmUE1BFf4iz979Cx%-z zWzM(;gN_tj@FzNyV$XpKQou#1Xeu-mQCe#iiAEz`g)uBu6@#~hwEs3CG}1)rrh$#{ z#mWo|k$85(cmd~XA-=l|kVwQ?g=~@9L|O_LG8w=GdJ$&_EcV?xUAgreYq)%O4SR39 z1h0D2dtq_?pamDFS?4+-l#yX3APHorJppET-=y6|JTZ_#jIrrH8-vYGy@-pQoy-)o z5dmEAY!OT=^a*W7Hss-dFcyhk&SnfBr5FbpOMy{CN!~;Y80f$xdO}IUky2cYIe5w} zkn}tMgi&@$j*gqwUXJNCW GGawqvpou22ps&z$658vTI(Ui>oj@I7m$OJ9Z!Jz5 z 0>ica+H}PCDvi= z`y7)jlVLq_;gGTQZ8|>}cVZek30e!Lvp}xD&@xF(l#a^9nl7XgfWz3oE I#_7&G&RIE4|3zN9)4hJ*>fWU~QSS^AE!&N{XOtV6L5yxzF;gxH*E#T^H6`cKv zXW+g+|G_>`w14_Ed;W1|^Et(ph?Lfp1k@0NP84nMNii5MQKIc6oAr7Sd6KX$Jx=`Z z3Y__-i-C(+Ux8}oh%8$r*$)kPXr X-O%H{r9VIC7OURgOQ6_VOKzAce0f4%U#`GRkOdQOG zE)q}?g(%7v+%TeV(ZL2~!&iC6qdfK=8@t0Kvn`tRe2qTSvoc4f0E*2WKdGdJn3RHQ z%3uVi`D##7w~42qrYuHmqQ&MTuQviV3{uC1%3K<%2`Q;QUDX(tma3(v2BBvExlVmC z)`p2X4YLMkOo!K0SkU0YE4}8Ta>dDFkBdmq>9a+URYSEPqXQTB?!wg@4BYZ}KMVK% z^$+z7&i (Z@lX1f6t8_I~T|YSJ(p0I?WE>aN zFzUE5?*JfDT3Luh^S$6*gfEHi_eY5;0Hcbl(xi%YX(TgCv@+zZ`f5^HH7@c5hzgVd z&|K +G#;`(WRd1B&fdo%kwU*zF8Gy(d9FTAhp1@L3gNDM* z>-83PzbnROthnaFI&5-BPM2Ofuoxk$Bw{I8O6qFCwpk3|f@hViJh*7rZ_oYe1AB12 z-S*DE`U$w>fBjhdyLMo8W~T)g6WL-K8+lI!8d?iTNtj s~`qxiagqE9c4r4(@BQ_L>azDXfEE1zK$e z_BBIR_WN?-TssHG!vT&1yR6e-EW7n9fGeFl=ZfIoZ~8sB^%p)1OFRY5=~{pbSw5Ya zEoKa%;{sUY+Kf13BnLN8En8wvOb0;@OJK7ed@!J#VQ};SLlV?Pd0#^=_KdX~;e?wI zbn+LzQKI$@ Ql5RR zcF9 OnKHeXD{Z4O*VhSC@E+*tqN+MkudByW&*G N9|!y#}xN`rm`I?|ZfdAg6(Lx*tL%3K$af9n6NLxpM|oObwgJH&Jr$n+zW} z=+`N 5$c^SJ9nk<8DAzl*D^rKXO%!Az9d!7paP1b_k{vJM%SV7dqNwxNbu5~HU$|o zLLH;q#vmhRFA9u>3L(>CW}%i-U@aP7yv#860=#H*5N@(k?G=VliTwjF1htF?hIG@0 zxp2BL3fE9L?ZprlvEag{nXcQOYF*ou(*;=5tZq3B%tW_*F)$81Tjanp6uzwb0{!|u zkZAvw3+k7x+kaQx=WZW2RdDs5)3EcK&%vEv|NF3e-ld^}1sCI97D@~R655xh210VJ zQ+%wrXG+~bk1fXv(~L}P?`0ijC!9d2gaZg5C}fg=@WY6|XR}A#Wu#mov^aG&w*4mN zBO#dw!E;4L!$6cwrwI+%Sk?yG%Bd;nIBXL*g1bk;7?2$$r{M>^6Gg?}A{Q#jD|BRt zBdy1wkM>2%Dv?M*)r*zMbC+O215fceY3`qSv#rv U6`W>Cl*`` zx{Dzk(u0!zvjrgjU+RHHzfKP{29U8d1PAxjaP8(DIP;^Qh1 G<|9v5pTd|%zH`&uL?fNzwpNY)(@VURIOQES?AZl1|l znP-!56Rbo`DOH+r2nB@!madx+A&!x1rZl4g-t2DC pY_0 zLJDxDRQ#E0Hl~Qpre%)ckz|g{h3dKXX+mnLdN=e?M+`0|hDewNxSla0ORO8uJTyr< zYFt*`0}D5g7cb+s;FV)10t+#SJng?8Oa$Q3gO1v+Q(*{?)RxWgKn3hP%V^Z-zb~y| zvuS&^W?|Q9fkOu |DB3V^R-3FMaXn73n|JR3%O`QPrVz>cz_gHoM~YA zWHU!LWiRv)2t}@)IP!E(U?WfzAe&$jPO_#*0xk?Bl~Osw;RTy4CDjWxLuQ8;b(%q- z-&hf+10RE5g|!Sf0$fxBYvGv+3m_WyeN{0)!NG)aECu#J!RadcWt9UL13R&H;SUEY zJlJRkm(PX!jMnwD{oEOAJ=6k;3)kV6f9q3l`j?+;f8Q=NXKJRmm;)kaFcUdO1NnO^ z)p*m7MH73Hjo}0-At4J|YsZ0-v#CDuI48x0%`(30l#U%0@G(|d6(O}o&j1I?WN4`K zbAW?VAd?tljXNbyZD{lJ3uaY}H6bV&Cg)ODDGIMmjXvj{Ij3cz#EgKRE(? *>yZDqLpDsyNV43^K22n%)V8|{%f5*8^i3sP0(WW>lyd2{i`6%uWWb( z2SCs>4fb;vE?GOKq5=z0zyb*iJQhP%#{fd?c6Pm`4TJQdj!vvu4 1KKe{%z0FHm?CUK8IVEgHe*9c zRD&Wo>peeQx6VZm0QE_0t$3;QOmiGpi-;`43*9E=jf*v1Mzl_3@r_Z{)M3{`iy `pZj z95_i3lduewI)h>+B!Yt301)n%$?-)vM21rerdw)QNezdHYfCARN>W_ic@?rkH0B4A z{lX+5nO$dN?ZqaEuz5D4Y^r5onjN?(lMZGiG!oAbECocN5s}tqn=8$g6GA#EfY)OT z#mcP6vvOe-R|VCw5#WlJp$&@wV={thb0~BMJ`I(Stz)x7$b`Q^bAdkfv=5)uU_&F0 z{cxHJvVZNlE!NO1s`js2f8Bm>_t$-1xKN6*f9oOS^2&DIn-J=M@HFiFm8W`V&ef?? z!}V%%V$H)c8Dc-kn2aJ0kZwp?$+K*)dt!Zj(_Xi_uJ`x$cKT|nK}P7=jpGcLq)r8q zJ7*y-l@hVG`64I~xH`B ;nu4_0SU#*F00oVRHU+2vHH#&eo~o257uO@_dx1*Ei44o=reo=EMzyFIsjP@( zNKmOy!Z+9UuW2%LacRoJNcIAg@JY;Y%&lJvg@EJcfMSf>8q SPjQswEuBH!a(HI=>bXwEIrjS8`Tij7?!yZ ziLIJixh#+X6v#NiX9$z58K7va=Aze9bpLu#F#v}iMASn#q**lmck1@LgPyVIz(}*x zw8wAT=ACxg>lV;lT|xEjPeJ{o&$qv@1skV#GkObBL)zm&qqJT|>xU%R_z7W_I1oPp zvL9dnUey&`zH<4@#S0hvYN{B_F;0fUpxiGf$#h`SeaIr%Faj<}4T}h-!bfVbD1MYR zO0sOl%plQG0E#@nmj4$gcr>WND$E_Dq@qcSjpfm`o@$DPW#IwNRfZK|6rv*Nhz+Nt zzXK(@49Vc|4!^`$q~gyBz8P8e0#tC2yH{D3f=JbT#LUD R!M%L? zXn7sUbWD5e331{Z&uDfJE<&03@GlDX0(@#}2$960k{&>SWgZ-hAwnSFSP7@EFfRMU zX)uD&vk!x~&_+D~kH&%vw_Q^^4F&ao&BB6;77+B?b%3G+4PD4%0Tx`CVZB9T!3Flq zJ8;ps;%5$Y?AY+m&Fv3*bq&o2t^)o$&qDQqYwd4scXFotp$$wIUQP{}%wat!yku0W zYodc3n)z-WY1eL>zZ-5i1CM;{(LeiJ@A|+m)XtMCgoBRxBoyM7k6m*ms#1`k1BV>A zC;^bD)&$0Gol)bT)n8~2Nm?&tdgjI)pNnZ86aeKkLDo)X84A7JHZlE0Kh9A>K}o)= zn_EF*y_To`b9F|>k^!Y@7bz*Q TV zp _@qG>?|^sI&H*I8TUqGvL8Xkabt6z2BH`K{E98WBf#kYxS z(?e+YuIdv>TlZF4V9FX%^g=DY6A3^)znaJs!csHJW)5XAVH<=2ie>?ve@vfRG6@ zltLts34tUEn+#~k2ui7x6*7`FLg{Z*eJ+TEAB27#HHZu%yuy!(*{ln}GLQ~zIM|4v zvvL0nD3Yd>4TnT}5zWj?AAe`kR5xMaW|m~%xape67penSEC+iqr;0+Ym4-3DjU+Sz zVeAuYLKt8YEQPcJk3uH~edxr42*X62Hgw`sPW^fiGDfOF;MrJ)gQ@`-^jeIHd^Snr zKt;EH&rTT6aICF3)1{nt`HnrfsE2Sz4^Dc$#lTp&<=uW7$7JjbfTcSo?6nx;b?yGo zFX8&XeGQgBeyuOd1*dB!44m&fp$`b>6gn&HQx?~pWzt25eJM7c>bizYm(Ifzk3W8) z*1Lz}jnU9(lM^>prS-ECGb+Vm(;VT%k~ 5& z5>qzSGa29&h&fD{8W9Shasr?{wm!y_nubz&^*jS1n(NFyC;}UpVPh}@09Es#bjQOZb40~s3 ^`h8mi6${WJ=~^{BE$j%o;wq8p*Ow#lU20D^H5=#f$x))Bh}h)vUL zFydgqv4%)c4Uxodol CAX2?Dn7=@6w+KV_Bmbs`}V6kJFh%RJdLnH&Z z7&I8&cUU+b#{fEDu^z%FEw}&+E_#pZ_E@{G9jw2f`C9-N|Jy!C2CBWP|J@>*n_(F? z6>CmqKW4BQ95Cb#86_qZnCWA~MdSzURaHUFf55<=;YpoGzKNlU_a)ab(F6{`1Ba5A zDdn@|k&;nW+%Tt|b}k`TAGMQU5Gd&oQuw5GR&qOCY^iA_5QV%J^9)K>Bv~5OPhM84 zBT|BmI=_{7^3*}ad;p>x%O@gbSRvjKQ@L1Kv<_10vnKZEnGR&tS&?O*a6=!Yv ddoVi`qCG!20xC#QffGku &D4^Eh50t0S22L5?nchmZD=Vs4~_h%Z5TK z$6PelXlvL{&u;h>)U^$B3_1>4xOtYTu$dy{vPSw0k@jbF``j5o#{ez{W~926VDa!8 zF8!{7C%&_S%fA7A%A`4CG9i(ftiq(_N2SjYqugSaN$FfpE>7W&Ub_~eV=jEB|DqUf zl} LE z#ILXo+22d*_jDXZs_tMi8l))?I~8Wn(2f*B7t_(}rbw4EVWQkM&uAnxAdw9l0Zh$A z;eZh|{|zJssdLtZG7J-mMsV)vV9GO580}346%(Ek#i5x>RHlTSqZuO#M8-mhM5=F4 z=rE)nBhp=jFbH_h3$|Xxd@wAa0H(VDyFOGLPz1KZX)egI6t!bG2F9TeT~tHZ1KhSX zvQS7fe6JmN7ytzLbkmS6(uYi1V1ey6W-(-%4B&$L^XvXS_23HDdjwB@|1LcK-4(2t z26j3S((SX!)=r=BJWdgHPAGJ?G05Q0g~n8D^4=UzpN 6JalSwt|ci@iHAm z>4hg@sV!=rMz!Q}pLJKWysIK)JJnqAtxORt5te{tJq9E&&CbAt`H=s{`-&Nq98i#q zi;`w3_sf4fjx!LYjD_(mkm(wWTsURCklGYU-3*Z@*9RlTQG^IEK zfu2@ z9Gk>v##Zp>gjnc|QH+6|Q^Fm@f1D6^W*EY$Yz4~j7jDuh&xM=$QGoK(#8Hv&D zQ8_mR0V {5`=>d2PPm1huG6|+6Xf+5@1+bDcTO7uTur*PVdB7yU!L_IL4zM zG#7m~i3JQ~!ySW2(}g$4emDKTI qC8)x9z zU*7FIxZTqv#wR&1i8;^GCZJ&|puri(p1MtQf&e4@&N`|9cI*@iDGfdP7DR?Na<@tX zi%mYuMo|MAkr-QatTK#H4o8rZx=6wh3X<=BpYB|d3ZNnmiO3ol4nSa})gZMV2?r<; z{Z1$(7E__A)}1%wm|;1D5ie7`FnFpgQ8vYPJc)1&fG8RZBw+{6?g3Kd(uv5NN>RGT zlfTwpgqe_WqyPxUM97ecT@_InccG{tD}V=LdT+w0DFzy;$r!}jtIaAE=f!Pt#(UsU zStI2%)MPn9CfuP{l2HK!3$G-BBP@qpVowW9eJ&6qF=xZXnbNH@`tE!#tZ;L1=!^kJ zAL1~Uk+7h_nQ1vc400?+?XpIK&ccN~`f!KURP^(CxT79`g#!+b%@_oo0aQT0d;lpu zuxO8Eb_i~G@Br4kYxwjJoP|&P?VDi#N)3DMd78a;-3Dg>fDLMiOky ?%932f>AS3M?nC;&dD(u!TvP$k;sKc@kl@h6p~jd665~f%|083Y4dqIw7%{P0N%Vr_W;RohMl&Sxg~@0Hl$Jqj#Ez*zL+{+ivlj#y zV0r`95*%YQs-SmBLomcel#@i8pfeoFV1{(Y0Y%mcii{Lg3aB}NOB&b|=4F_Br$$&N zi50PQ?`MuSamosqZR1JWZmS^-g V`m{dEvt-&NQn}FSP>B%IPy~D8yxd*mW9fj^#cNf=%*nn`CQ_^w}Qu01~hU>tg{P zbl^_Yg9@_1#Dzp~VYL_SK2F`S54-nYhjZ^a4Ilb%Zi6R&^=!Kvg43thwq*ERCgKo9 z%Z{Nk>MU&rpQm-F$H*Tz%s>>=jVvm4GBKJ+Pk@jJ(Nn;ow-%|&A_pcEGD(Qo#x1YY zf?E10n?@Q%U7%U=tw=j c2m=c(4-_|8Rp=FU&v&d6vvsAcke6$ zgy{JiA5ACO8*+OA08sXdL?RrLc@9vwJWr^coM_Vl1QgcaDEv1t4tJz4fm}xEpqc|C z+3Aby5)XKZ3h#cVv6iF+DcYh#4Sc4kao9R0H!wscQ-lox5~4+fHYh>DY$qD4As7yx zg>RTH#QJ`D(=8LMz$r>Wg&^F-Al&qxVU `ihzuxEKHk*pLZYFwp@LtOqbbi{Z~K1|YLIy@H!wa~1Zl1AORv?tl;fojc*$ zY6s5LOE9}+fyErh&ADvGrVRcj!qP)9B#NBsI2jBSpX<<$P)v2a$P;ESBSn(WRKA&$ ze#W2kU_y4VdS*r3fySW|oA@Qd9$G1G4z>bVh&3Kf($U9Z4J}iGlw)fw1u3J^6aeHH z=?pnMfw6$1(bl*pf(8)ELeJbaN;*H*nWNNHu 1s3c^9kjV6iLn6uk zBp`^`3vpZqLU=71ud|?7d!vRt)bvsc;GBemtI%AOGw(^_m2_R4+CJyPCmW6!U8aTF zZl@)Ki4-?b6o7$gCV&cH$ADrm2&$o0pJvIgvI!X_PFE2a4hk# ;Ov#CMpV^6 krhYuGbiEEUeP v}JHk2x^?z4$PF$^GJ%4~&0W`-@Y zM4)@#j=997*+5!$1bNS~qD(B?c1+iJf_Lp+&`FEl7&~ghdR43JuK2D3(H~O7HX) ztp@RQRk=SD(haG@VD{pa*Jya~f+n{8Mia6~9BV-#)l`~jIXwnvFo0_(Y&ZmXc*HUh z{r8GI!01CC-8pn1qH _0*42M|^HAZlU`V5f{ zSeU-%NMl(Pg8!enH;=t;JIlk~cb)V5ee-t*-@(3~XFDY%DaN=4+l)$pD5R~Ls*$3q zQmYPsRH`DiRimh_6sfAxluSh+NU#&YG{ht{5EEi-zyn|dp3MalPuJ6(zwf)>{QI5t z_ME- +|mn`|PvNp4PLT_j#Y^%zd}v(krgPQ=dN%zxlUb4xj#+7sAPU z#h1_AUM~w3t;H^M6Ep%a)XV$3E6t28o2d2RunX_5N+beM1JhtY_7Xo7GeO Gu;J9KFSz;8dLss;dYT;>Qm+wQk7_63Uh znYRG-fgNDTyKpXJQL!(lp^H$lMpY2umA^bD$CmayV=+Hvm7MJWE85JbD6^aA=aCU) z$~+ik8VIAQAhN&%iN)`D9U-K=epIPM11Y4Q^FUo2?y)6*7RckQ$+@8;*ug$Ug$&%3 zDX4M=DZ{LwF`2UBM#VaCd+t#;L#w&SQ-|QWbF#WS(^F`d&a9zGASn>jRIvA#m^Bxf zmB3`0m0D4u(_Ubkth!*f;9dD6fs1yTRx{DQh8<(kG8ota4eY=~BhoygPNNZ +;{#)i#Ma5spE*r z$F>Grb4w?4BG`A~ow0wbaPnBh?o<%wIr}e>kYFm1C4pE5K^IcAnqq9{2=(r2?0H;k z$@IJ_LZ_MFcH8`UdK|EOjCQ$D{Vw@0h;=$bOxBJn)`?Lu3XYbfn($)H$^0<2I-7xm zOvp412AUau59l#Kpx+D%^~{@>Nsx@lv2K_}7E~%gV1Ngd*3x!aEy`5PgmL3^tl<+F zL+)eZ=y{aJLVyL7U wZRGpQ0&PVQKnhBB*LpO8AR}?^$jTKN*V#P*;X4|)|MooGuvvGNvuQ{Xa*e{ zkr;~xpd7UT0y3k4x%(qA7K 3(QRwHM@ZdNFce)Kq+C!Wk7(7 zo_~ye00j;_mLh;!E`JXQAmf^M0V&&W5P(D+CnSeqAb(J*q^EkFHCUlCkYLayw6~;! zGJc)XfX9gm11d-|SXBFNze5O>=~!VVs18=h*D1K~5y@84KE@-n3cUSQzFziIr8Gw! z0}|9wNe(d5j2tiXP#=9oYP{| j(Uk(4ajO~ufzGc{n`wy0r%dLO3# OI8->$X%05WB<*o+Z zjFRO-k3q88CxsD0hw%`K*$M?t4!cmwB&j4&KF8MK5e!tb?#4PJLA5NAU_lKxz|q3E zj>VwlDWL1L>D&k?SqpCc9Vjc0bN7c}E}*oaA~VPet4^zt^cRp>3+ggOi0LdE0I_H- zyKxzFN@@ZXu-FJVV-uggVI)>Z)Y*G)7?RWG@unQofQ$8aAD_Pk55Me5xP1rVw|?&R z@a~^_BmBu1UkDfA4m|(Dm3B%R5hk^hRuV<043pEApZb}7unymtMA(EI%B4nGgF%Pf ztUTDRucp}DB%`U5>xNR*4br%U5rZP~acK!7XMTgmzrcD-fVz=ZSPL 7oqWyt6E`6{wgA j_B7a|=R-kKbHPDI`c86~10+T~sOtxv zNmL*Z9U@THjmlZnbH3Fg==Lk4>hvHGZQ)os2Gsd1RJ9HuBdgt()B+wT)CL?b&{X9K z!qOeWojVB~kP*Pfr89s*$^=WW8aDTYY6e|N|AEASM_2YpBGkl2q%Iq5TTipEMW8J7 zOdulZDJTPukUK$IhNA!tS{6p5iBMm(ZKjK+q|u5$8}EuHQzW*+&0G#?nTxOi6>C7T zShfIT^Dl-7$7gTDLoa@O{hLnVcmB<*;g{a=X87nwUjs+5f``stfw0*I8frHtsAkD% zaSu&p4RD75V2; g= zH5w?gNr0(5`2330q(zxuA-EYK+&dtEYW?Jcd}1Zg0~=CnA^k3_2S#B!QjTKGS_=2O zFqLM!fz;-z@X`#JebA$OsCZ^nt-K9mK_ku+HL%kZ%?7z_jUKGXDS23+!%9uu3Y+_2 zC>;pq!J1?_fmG_~AbY|YktlT?X{JED)tevt$bN6MKn}^2ERdB`(A8N0NbeR<9VnpA zKfc`>gz^iXl+MS|SD;f4Q6f(oy7zkTb;pSU`uFDm6_BAhv6@b!COSpKWTY+;(N@Yj zN2miD>Gg(5D5$m7Ty(RQMo+;2g ?`*1%!~M`!N9LytVM{(BQX@;k4BfBCcD3Ge^F zx2|Eu5*|Fh3P)=&5~*)Y>eEp;A{x<&RQu>$4a6=wQ+BEUn9Hi{P6m r}A-=MyTe2?3K1izDy9;Ak-V%U-@N0tP`q|F-G-h;_oO2b&EsYCzh?-AT!1{u2Ol z{}!fSxvuik1s6xMR#A}^BGz4W6rA}0=>E`5R)p)Tj%FVWS94rP2a;%eTUWiA zrY?PAP4t-t=CQ#~UY{Cn(Rk2rCs*GbYaOn27tEWz0~QSV2NIwHm@T+2hvZb$SzZ8`dppG zT+lEDoQ%5OE2$6U TNj 6Va(AhSTW?RUVu22b4rMoOUetcaDSn3QB zR3>ho5Ly6RZ7wzxUN)3;D{OQ}-Vm)Z&G`E(>cfF`;6SK!9JVM|yCQrYhuTBN;FCFu zCRQUyty4)y qJghMDL QwmuFi{(lC`eFkt?!rUQe*!LDeilCY>6gGSyz9@yum19z z;HlMp@Bm(e`_4brOx+@dEeGH^z@)a!wmBu+xQFh8(KvAFgpv;i=M4@Z@-zd|$RHL3 z+o;;!l(GNNc1#8+;8CknYx{4gC7+^v92|d&fT}crlC=m<=>S#htL k1*`31R+` z11KD@0LGk60tM+Ts{-^$F&3y94ibRE0By9b*LmNOVltFl>=1)t*enF~n{oKcHvutN z0K!;M;)R+S!UUyW!vh?Z6d? SL#?$$5yNwT|`q3S)6tqBBzb0le!Yf22?cQBCLVNncML2 zLyyBf_dE-q`Rohf|M`di3H-}{^;Y=W-3Q?TxC$@5@OV27qbURMmdpT7o#4*}8rz1U zjhtwY22_V(Gs@kKnz(jZt~x-QYOY!9o-9!e;mb?2Z=ER8)FP=Kbw+AEUR~LCusdZ5 zv{ufRP4IjvqILaL?1kA+sO_WecWdUs&SE9t0CZd{2ecObjK%P&?^V+!wJkN6wdTXV z@t{5dsMsBmDnp2mSf)oCkRf^Da0~>H)5M61X(C 3j77>&d>=uk54 zN@}$ju6;QdeVXORfDEf`X@5WZM;58L_hJnskmE}+a=f5!!1ns02z|{&-b}P%W>c^Y zflRB@j-@F>BrsnO?%ElOJ_8do!R*2*1B(t!pkyp^X`}-iz^uMEEJb5ruxQ&!!=f#D zEV{qTrsT0%{-m`HZ#qIwo9DO&78Fk5=(qzGm!E-8{qc+8AO6H&fnWUP?}jhlexv~w zuekWtMq}p!3vV1J+TQ@5MbtQP9G=sivg_sNuo-(UkMI%+>4d)nY=Q~L(h6}Zx11IvG+n@#5=B=xwmI(^fBJ`gFx(yfEd7L&g48%MJ zeQ>3whXNbq`(h!8GZP$KfC(5Ao$!QCIhJ`+Oo8B7)|tLLTYrZVb)5yA*mizI ZM!t>U^;*}S^(){j7SP#1M z476sm0wb6Q;`f4GMy_w8<(N`tnagJEkwxfkN6YL*MD=pQF26T418i)hoeu8d*MD=K zh0f0+wWdnf48~?;y3_`owa;UBe?cf6ECp@xh_t}o3#q#!4fGuw5!el05B4E-av(5} zP&z&W6JUml8CR&Zxdzpd64>&h^91Gl;JSoHR*I=Of>wltwjGu#uj|{c_3+Tw64q+< z?lSekTqK?%iPTST9at+HbuFE;lZ4y|cj?^e0I}4~5h`X^!q7@~qL|JS5uV1=Q6;eO z5`H<@7mraHkD+GlIG8~PSgF^7ZT+s5%cNNrqqjUU9=5KN^;s#(QzEeE!9%^O1d@PD zP_3%n^L&fMo-zn2Ukq%ihb+ca#7Hh{bR9@ua9L?f?aCcUjRR)}56D|lS&-S1O6+ 2&*nvWYvf^8`h#JgRGh|2rlk6rI6#}Tkyi?KL*F=ufQiC zeI>l}SAPWl`LBH+eE!x3SX_fwUHo!4hNEQ;W)H%1guTw-Yy52VInnq1V+M2D0yJ#% zJ%?j6xU_<(?7k&-EEQH3-XDwM?+nrt+pz+Td~*c_Jpg(IYv>JpI<3+Zb{4vMlv}6k zhf!l8BuMaW$LqpQ7YtxUxLGZ+SO5WRACT*hK~=`ePUM^@@G&83eWwHVOaz1ufc?Xf zTsmhC^q`0Y<8&nCbX;%|D#`6rujTy~?D0$cC^*7jAAr$_zfM<)uwx$TC~`_D+$RKk zielJLRa4#%l^bavqfQlh1vz;n97qu3UU6t}Ko+*f$1Gy@-}Z49cqTs!-Zj#dJT~{| zD3VZ_ffjapisWh0X)`jr(RGqw$4pR@ZW=qA?^SD#)jU7#fJNH{5*8;}$cc@3bNvrb z;N02k@W{h!@Nj$$KJ!PfhPS`_KZAe%>)!`oy7Pjj6k>rz&9j0O+M3%DGz1JPK*PPS zkfX)fMrW~0t;Lk@;n)9u#&%9hAe(nBNsHz8ticG~O)%=&AF`k_lqg7M95FK;74h6W zLwN_m3VKC#VsoLV^@w1DEXwv(=vWSPSPcFg5?g^@X@nfRZ$G;vctFI>Kp`h49t`Lh z6U*e**cc!j12P7JLTt1I)H+>y%JHUDKqD_+-_ry1Ie`w_LE5#FitYi)#=aXc$1TCh zwxMFlCgDH^E89*$1}s~9caO!e`U)>^$Aq7O1DFt8V=mj)TGLn1@ZX>gzV@l;*+kM> z3#gPzgrKu4ZS-Ct6|*e W69|IlOW&)kAf zeEN0pj$ivP;Gg}*55QMWABKnES$Oru$1G#v4Su*S)jx*;sgyaeuT;7#5$aT6v`q=* z8>GcxU%5O8VIkNNa)ff!gE|qwD~mJ$Upik1`DX_Nh@4Cl&mI}T7z-JX3#Uaj1B^)l zWf~kfmf|oW2o1Tx7ua=I{((~>kTv?6mP9cT=C)gFho#~3eGFmcs64THjw?WbBbL`p zLZ6-j!C#JNg1EXB<)h+iBjmd5cLDg_K&s;@mxpS877{R{W*~IbySSH WY?g8&9&%i0=@Xi%ZwW9$ZD-*W^!EgeXFFXqu9{du( zY6Tzp{XYXg{cAr2@A}a9z!UI1c>Wq#yzb%`+B1(3rgwYH1r1XN`UzzYZNi0Pyfe0G zH68lQ6b%T#sP3*kU<>LdO-pUyxo@ VFkhW(1pPTU0~VMMNjDH7W+g5p}wN1DIVn8Q+W{ z&`_-=BRB)2Q}S^27Aihno$8@-L11sGL=U=SPWvAAK&-R>dgVcO^0_1WR2qp|No7zZ ziXI~YE H!GhR_Zc@;5^_VZYp}cJ6lR=gb69MSdjda zja(oBAZ#-c9d?5cnBG-VOXpE`c-)!O3s(yac<^krz;Z?yb5UMz!NrEHh@C@c>tPYQ z#~n-2y#|d@)~eH0FkrE0fkorGxd9cSEsKQ3UAXVkQ?PvCD*(3ve)9uwfPeg+zX-ql z(YLH2#Xa!+@HD*c{1@80J0Wb>?a^1F7%FLu0TL6L0V6Y_iYH2+-eOJ|+7S5iW@KZ0 zF!n_ppu6QuT3 4PZMnNuDst*^7L2!b8-AnEZd zZr&Mel-`sC9Evcsdz=Mnk?AqG?t(Ap2s+hZ6WHJojMhT8!CJd;0}#-fZ&mHP(P1vI zzeE5%86@M;vZTd_0@3
mgN5a?X{a86kfkM$J<#k7nxHb@t{l-O(H6rw zY3Yq<*`lH!iauZp4v=JdF1iI8Ji|F5=u{Ewq}Kz+2LyR^dbJ$Fsp-fS*Mhk$1HCGZ z(Ad)tZE~tsSk^?J=#@?!a6~?vK?bj|nJ|=KGOoKQ0#9W6ic%^e-fEiIjz!E`i&jU` z1&*zshegs;q>hkPTkhC^iq2^h@wC-hEL+wBa0ScdZMgT|#{r)A6u^}L|LQ$&fw#Z+ zFT$^V=1p)5&cP$gr{UqVUuw?SjX@Twvl-{I4~8TnwV!E36#KT}W)+H*1_+CtZPP3z z1boBVQ;D3Z95!LQWX6I$vKS?#D|W+w04wi~tPiAAmfP0Qt}N1k`EqpACsOBGB-R1K z&JH=iMn&6}%!hI_j+r+p36)U|?(O$1JjYJ~CZI`AO-v3}7zj`$kKlHJ$PN-2WCn`O z(DSWI$pfuuP{z80Z%sV{2#f+24jVH3fm#}D#k`8N7C^1u1aordPkmES13TJM5F$59 z<1MdIMWXWz88T%#zYJ4+J1mo?$~_STQ1DA4U`jDMqo=*_bgVoI=TR_aGRp0?^4`L3 zM~HUDN+o3#fH_)f8)NCkb|}GrJ-z zogUZ%M&Wz0DRE?RXUP|7_J8Mp!Cz}wi_nQT8(@+ADq7)YW0JM$1PQAw-o!@0d8g4< zH2R87tLf2AIDg-l0q(g0Cr=#1JKyz#@Q&a5Vfero|NUlPJaYULoLm3fusW-q3Lr-e zo+kZxm)eLCH!AP@s~}@fZM9o#Gxl2};rGd Y;B8rkm5`Pw-43LrWX?^MY78+=&Ff-$FsykVt zFn~fq1w@e*VnB)T(dZG+m_*r-SxiC>KFDV!@?lm?!h$gsc|POZ^m1z}XHj)Gh!l}h zt!#o4T<{3^^3}1^QJ{!hrvyAhG07qZHZZXn*&vHp=Sb`V$yV)W8h~-y*?G63%?vKq zU?PN*rUbHieD=(BSU&I=z?l 7P z=~T28!O1)EN>=FEn=>IUS~04dapReyVUO7sO23Oz(piCwU3GLJs8|rx`-i8XMzF4( zs$0bPO|V+H*F{1M5O5H{6PU!T6Qw^la$_w=rIbE{Ea|y+-ge~=f+Ex;o;4B};0O%- zat{kkWe+MKi?y33fU)^}+x3yULN)**7SU#AE!xK$P|<*ka2L* 4>Jv=nP0nL=CHbu!m zP^E-I72)Rq(}BYTA&tqjLcerjSp{#fCduMpjn(iwMzHdFy}Lwanjq9VKWqvsigiae z$dgmDvfpR*HF}?r0@q%b2&jZrS*G!$*h!hC>8uj=*li~sbJOV93l1W@8;kkdeLG=A zkAd|VQ|dm4PFaK)j7O{tI;G@8yz~=Ht+)dbF+T@xrWFdHApY8-HO8V4J3tXzfU*G- zVU=|jMYws=f{&&Qa?)rm7I+tqFFyrv{}TWw03Z4I>*4Jm_#ybE-~Vp-%IaabAFje{ zE_|V3f@4z(38Tvp{T3us83ptw5(2=YV!vwZJOneauRyk`ZLQt~vi}?saX)CfNT8fK zZ5d$ST_ml@F?2c#IiW0;-mQCQ0*1^dp1Au3KcUGQ=BQi}tkmw&O<9%UQfO|{PzL%Q z_M!$R>Ly(v6Iji9BGXrR##}XqLTXJ6fItU;RD_Mz;HlmzGF;Cb=o)baUusn~7Q* U_$iJ9vz}qqi1O_Y`T}67m4Ij&ZVq=Qc2sqdO@C24ew_$Plae#ZT06d5A zD<60hyyF8u48Qh=|G^qkT!M!;9U-jMG)^o7=%gs`lAku4pU??1TX4C97Fd!4>;9wK z=lst7vKR7KwAb6RDKhAmslAm+xS~CZ3%BV4Ar1wI<${FFb>vPE(nK5MNRYL=HSY&G zNFwI4ht$1d?gjzi#zI|52T@v#_kfAS)<70vLLG1j>+k{p3b!;
xq?<7sCQDY-<@#%ki2^*; FnA_si~Bm>0TlQOaZuUOhkGYCgzu%%|8YGNRTn_g?_$iKP- z0#IQvI$>r4A_SJf(85jkJd=4MpkwF*+eeE8&^neTl+s5ECnJoVz9MynB&MPOjofA$ zT08FzOVPHOw!+PT8{y`SHK_P1z{Q(z>&c7o^Y8va_?Zv=1$h5s-v+Do7d>+HB)s6v z(<*?>4tm}gj_$mC96e8l8O7OS%V=i6wJ4uskcIwE5Wz{iOk5q <)kZnS02)(%c!Le6RC5*0Rzt$#-IkpdFh#F40GXQAXjU<9ssM !L2cAl 0Zkc%^1!P>rYLU#ETj zlj!)Iu&x!NI F^FY6`0T zRMhNIZcgNT39BcbYqZ5d6VqL^S{szh oEOppaqk-6Kn`&$+eOC7k)Mkt#mJJOUvP!qrW?=4=h#e C7 zsX&q;V_oWKZr|sON%vTkK&Su*4iH5K3R-X?0a7Z75X&o3Wf3fTloF{NGdPzm*xmZ5 zyM_V^b2ACzBfH1OLNEnzm 2K`}dTMk?it5{5{*KDuy_89}0BQB7831{XYv9gvLUWLu1pbag6Qq;FebF-1bO zY(xe)s7o3EFi=wQv=_l~eYC(K7DFZ^C#22qk^wPDsL~4BnyJy743tFtTD!NbE_rCG zQRxB9;4jB4<0#o%lAt
?>LOsF z>tLlevn`x8;XW5)Kd^Hr0BBJvu V)^+lUQEeci{|@1i?{c|}y0 zJE+8zw%Ca|c$SNZ#h0dTkx)6wNwuS*^1UeCASDg8+m9Go;wg2&qBF?~r8^}3LtHgl ziWXS3%thO7x@zAGC$PBqB*4920l0(kn;-vk@b=&R^YAO5`c8N ZfGHvUf@r^E>pkS<* z?yO+X00SwR{`xy2H$t%hG*QPS-;>=pLXxL6Iw4GMeuMHd2zfxMb!>18aIlf*0&plp zrEVr!Z$|}_jA^wL #cWLEH6$=-7s9 z=T6k+CI*-S8U2E64d&oNwH+F*M4heRpQE6tGtE|Lo4CyfgfE6V@vw5!M#Wn2%|r<} z@&MPFW96uI{&xc&mQ-{ZfxR9IfJojIE#O#nti}qK;WpsquLE3s0^)NQ;9Vd5Uic>; z{sDOJ=e`|o!C830vbFLq!p&{PgjAooyH|Yw>|9Pi=5$R^51XMtstY7wz`$$E1XQdr zwKY5Po$Q0di99zI4_)=xJU==*+LTD-JNqn;n558+7|Ll&Eox+~O72()R6X+QR2A*W zgyQDu&B(>TinZiO6@}hos- tECd2_0puA)R0CPMq#@ &M1juu?BC6mNjBsSx;0UXQaEr82k z1vvK%JpJTD@be$~58<7^|NZbgU;mcoYaTiCG@L(rqG>UW?#z6~pgmg)P#*-TqR+5d z*faGRG@=Bt^OD7geTZI`&Nl1p3sBp?{vv(zA_O=+UBQ(r*Ul^t$6Y|q3<
fAB`HE^Y>F|9!X3 zROvgAcXtG^39Y6?VT16B2Ez(JQFVjl?vTu=L~&jjP=c`nfWYWdKnqq;vLu`#0u8nu z4Gc2dbL{P~=*kpEcd-$h2iDn9A<; Hp@P#kG1m5w{ zzXZSV@$ZIDUwt{8hdc1H^N+*P;uK;Gj(^3rsiV6nYiQ;|XP4MJ`S{L>0YfYkhPP`G z=E&u7Dr2+@|Bn5GjLrX_IeP}KUAqFG{M0k&mWP8EB_E^l!60Jlh>oqut*UJgIi^-r zroTXl&Y;IKNz%3KTD>ZZV