From ec7d8f7b5f03438a52c00987dc66b30804aaf69f Mon Sep 17 00:00:00 2001
From: MikkoAyaka <3401286177@qq.com>
Date: Sun, 24 Sep 2023 11:03:52 +0800
Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E6=AC=A1=E4=B8=8A=E4=BC=A0=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/WIFIRobot-android_code_public | 1 -
src/WIFIRobot-android_code_public.iml | 12 +
src/app/build.gradle | 26 ++
src/app/src/main/AndroidManifest.xml | 44 ++
.../java/wificar/BgPictureShowActivity.java | 184 +++++++++
src/app/src/main/java/wificar/Constant.java | 14 +
src/app/src/main/java/wificar/MyMainFrm.java | 104 +++++
.../src/main/java/wificar/MySurfaceView.java | 380 ++++++++++++++++++
src/app/src/main/java/wificar/MyVideo.java | 186 +++++++++
.../main/java/wificar/SettingsActivity.java | 16 +
src/app/src/main/res/drawable-hdpi/icon.png | Bin 0 -> 81689 bytes
src/app/src/main/res/drawable-ldpi/icon.png | Bin 0 -> 81689 bytes
src/app/src/main/res/drawable-mdpi/icon.png | Bin 0 -> 81689 bytes
.../src/main/res/layout/activity_settings.xml | 64 +++
src/app/src/main/res/layout/mymainfrm.xml | 40 ++
src/app/src/main/res/layout/myvideo.xml | 69 ++++
src/app/src/main/res/layout/pictureshow.xml | 26 ++
src/app/src/main/res/values/attrs.xml | 6 +
src/app/src/main/res/values/strings.xml | 5 +
src/build.gradle | 17 +
src/gradle.properties | 4 +
src/settings.gradle | 1 +
22 files changed, 1198 insertions(+), 1 deletion(-)
delete mode 160000 src/WIFIRobot-android_code_public
create mode 100644 src/WIFIRobot-android_code_public.iml
create mode 100644 src/app/build.gradle
create mode 100644 src/app/src/main/AndroidManifest.xml
create mode 100644 src/app/src/main/java/wificar/BgPictureShowActivity.java
create mode 100644 src/app/src/main/java/wificar/Constant.java
create mode 100644 src/app/src/main/java/wificar/MyMainFrm.java
create mode 100644 src/app/src/main/java/wificar/MySurfaceView.java
create mode 100644 src/app/src/main/java/wificar/MyVideo.java
create mode 100644 src/app/src/main/java/wificar/SettingsActivity.java
create mode 100644 src/app/src/main/res/drawable-hdpi/icon.png
create mode 100644 src/app/src/main/res/drawable-ldpi/icon.png
create mode 100644 src/app/src/main/res/drawable-mdpi/icon.png
create mode 100644 src/app/src/main/res/layout/activity_settings.xml
create mode 100644 src/app/src/main/res/layout/mymainfrm.xml
create mode 100644 src/app/src/main/res/layout/myvideo.xml
create mode 100644 src/app/src/main/res/layout/pictureshow.xml
create mode 100644 src/app/src/main/res/values/attrs.xml
create mode 100644 src/app/src/main/res/values/strings.xml
create mode 100644 src/build.gradle
create mode 100644 src/gradle.properties
create mode 100644 src/settings.gradle
diff --git a/src/WIFIRobot-android_code_public b/src/WIFIRobot-android_code_public
deleted file mode 160000
index 7b77e15..0000000
--- a/src/WIFIRobot-android_code_public
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 7b77e1557b2185a361eb64db6ec6b173a679a10c
diff --git a/src/WIFIRobot-android_code_public.iml b/src/WIFIRobot-android_code_public.iml
new file mode 100644
index 0000000..b6afaed
--- /dev/null
+++ b/src/WIFIRobot-android_code_public.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/app/build.gradle b/src/app/build.gradle
new file mode 100644
index 0000000..a2f506b
--- /dev/null
+++ b/src/app/build.gradle
@@ -0,0 +1,26 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdk 34
+
+ compileOptions.encoding = "GBK"
+ defaultConfig {
+ applicationId "my.wificar"
+ minSdkVersion 21
+
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
+ }
+ }
+ namespace 'my.wificar'
+}
+
+dependencies {
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'com.google.android.material:material:1.8.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+}
diff --git a/src/app/src/main/AndroidManifest.xml b/src/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..4f2eb3c
--- /dev/null
+++ b/src/app/src/main/AndroidManifest.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/app/src/main/java/wificar/BgPictureShowActivity.java b/src/app/src/main/java/wificar/BgPictureShowActivity.java
new file mode 100644
index 0000000..62709f8
--- /dev/null
+++ b/src/app/src/main/java/wificar/BgPictureShowActivity.java
@@ -0,0 +1,184 @@
+package wificar;
+
+import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.animation.AnimationUtils;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.BaseAdapter;
+import android.widget.Gallery;
+import android.widget.Gallery.LayoutParams;
+import android.widget.ImageSwitcher;
+import android.widget.ImageView;
+import android.widget.Toast;
+import android.widget.ViewSwitcher;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import my.wificar.R;
+
+public class BgPictureShowActivity extends Activity implements
+ AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory {
+ /*
+ *
+ * ʾͼƬͨgalleryؼSDָ·еͼƬ
+ * һһʾĻϡ
+ *
+ * */
+ private List ImageList;
+ private String[] list;
+ private ImageSwitcher mSwitcher;
+
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.pictureshow);
+ try {
+ ImageList = getSD();
+ list = ImageList.toArray(new String[ImageList.size()]);
+
+ mSwitcher = findViewById(R.id.switcher);
+ mSwitcher.setFactory(this);
+
+ mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this,
+ android.R.anim.fade_in));
+
+ mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this,
+ android.R.anim.fade_out));
+ mSwitcher.setOnClickListener(new OnClickListener() {
+
+
+ public void onClick(View v) {
+ //Toast.makeText(BgPictureShowActivity.this, "", Toast.LENGTH_SHORT).show();
+
+ }
+
+ });
+
+ Gallery g = findViewById(R.id.mygallery);
+ g.setAdapter(new ImageAdapter(this, getSD()));
+ g.setOnItemSelectedListener(this);
+ g.setOnItemClickListener(new OnItemClickListener() {
+ public void onItemClick(AdapterView> parent,
+ View v, int position, long id) {
+ Toast.makeText(BgPictureShowActivity.this, "" + (position + 1) + "ͼƬ", Toast.LENGTH_SHORT).show();
+ }
+ });
+ } catch (Exception e) {
+ Toast.makeText(this, "ûͼƬ", Toast.LENGTH_SHORT).show();
+ }
+
+ }
+
+ private List getSD() {
+
+ List it = new ArrayList();
+ File f = new File("/sdcard/demo/");
+ File[] files = f.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ File file = files[i];
+ if (getImageFile(file.getPath()))
+ it.add(file.getPath());
+ }
+ return it;
+ }
+
+ private boolean getImageFile(String fName) {
+ boolean re;
+ String end = fName.substring(fName.lastIndexOf(".") + 1
+ ).toLowerCase();
+ re = end.equals("jpg") || end.equals("gif") || end.equals("png")
+ || end.equals("jpeg") || end.equals("bmp");
+ return re;
+ }
+
+ public void onItemSelected(AdapterView> parent, View view, int position,
+ long id) {
+ String photoURL = list[position];
+ Log.i("A", String.valueOf(position));
+
+ mSwitcher.setImageURI(Uri.parse(photoURL));
+
+ }
+
+ public void onNothingSelected(AdapterView> parent) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public View makeView() {
+ ImageView i = new ImageView(this);
+ i.setBackgroundColor(0xFF000000);
+ i.setScaleType(ImageView.ScaleType.FIT_CENTER);
+ i.setLayoutParams(new ImageSwitcher.LayoutParams(
+ LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+ return i;
+ }
+
+ public class ImageAdapter extends BaseAdapter {
+
+ int mGalleryItemBackground;
+ private final Context mContext;
+ private final List lis;
+
+
+ public ImageAdapter(Context c, List li) {
+ mContext = c;
+ lis = li;
+
+ TypedArray a = obtainStyledAttributes(R.styleable.Gallery);
+
+ mGalleryItemBackground = a.getResourceId(
+ R.styleable.Gallery_android_galleryItemBackground, 0);
+
+ a.recycle();
+ }
+
+
+ public int getCount() {
+ return lis.size();
+ }
+
+ public Object getItem(int position) {
+ return position;
+ }
+
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+
+ public View getView(int position, View convertView,
+ ViewGroup parent) {
+
+ ImageView i = new ImageView(mContext);
+
+ Bitmap bm = BitmapFactory.decodeFile(lis.
+ get(position));
+ i.setImageBitmap(bm);
+
+ i.setScaleType(ImageView.ScaleType.FIT_XY);
+
+ i.setLayoutParams(new Gallery.LayoutParams(480, 320));
+
+ i.setBackgroundResource(mGalleryItemBackground);
+
+ return i;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/app/src/main/java/wificar/Constant.java b/src/app/src/main/java/wificar/Constant.java
new file mode 100644
index 0000000..7fc268c
--- /dev/null
+++ b/src/app/src/main/java/wificar/Constant.java
@@ -0,0 +1,14 @@
+package wificar;
+/*СRƼwww.xiao-r.com
+ * йFPV-WIFI˴ңwww.wifi-robots.comԴԴӵȨ
+ * Դûѧϰ֮ãϽҵIJ
+ * 緢ȨΪСRƼͨ;ߣ
+ * */
+
+import android.content.Context;
+import android.os.Handler;
+
+public class Constant {
+ public static Context context;
+ public static Handler handler = null;
+}
diff --git a/src/app/src/main/java/wificar/MyMainFrm.java b/src/app/src/main/java/wificar/MyMainFrm.java
new file mode 100644
index 0000000..336184e
--- /dev/null
+++ b/src/app/src/main/java/wificar/MyMainFrm.java
@@ -0,0 +1,104 @@
+package wificar;
+/*СRƼwww.xiao-r.com
+ * йFPV-WIFI˴ңwww.wifi-robots.comԴԴӵȨ
+ * Դûѧϰ֮ãϽҵIJ
+ * 緢ȨΪСRƼͨ;ߣ
+ * */
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import my.wificar.R;
+
+public class MyMainFrm extends Activity {
+
+ public static String CameraIp;
+ EditText CameraIP, ControlIP, Port;
+ Button Button_go;
+ String videoUrl, controlUrl, port;
+ /*
+ * Ϊһ·ؼʾٰһ˳
+ * */
+ private long exitTime = 0;
+
+ /**
+ * Called when the activity is first created.
+ */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ this.requestWindowFeature(Window.FEATURE_NO_TITLE);
+ this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ /*
+ * ǵһ棬ڽпͷĻȡƵַ
+ * edIPƵַı
+ * Button_go ť
+ *
+ * */
+
+ setContentView(R.layout.mymainfrm);
+
+ CameraIP = findViewById(R.id.editIP);
+ ControlIP = findViewById(R.id.ip);
+ Port = findViewById(R.id.port);
+
+ Button_go = findViewById(R.id.button_go);
+
+ videoUrl = CameraIP.getText().toString();
+ controlUrl = ControlIP.getText().toString();
+ port = Port.getText().toString();
+
+ Button_go.requestFocusFromTouch();
+
+
+ Button_go.setOnClickListener(new Button.OnClickListener() {
+ public void onClick(View v) {
+ // TODO Auto-generated method stub
+ //һIntent
+ Intent intent = new Intent();
+ //Intentһֵ
+ intent.putExtra("CameraIp", videoUrl);
+ intent.putExtra("ControlUrl", controlUrl);
+ intent.putExtra("Port", port);
+
+ intent.putExtra("Is_Scale", true);
+ //IntentҪActivity
+ intent.setClass(MyMainFrm.this, MyVideo.class);
+ //ͨIntentһActivity
+ MyMainFrm.this.startActivity(intent);
+ finish();
+ }
+ });
+
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
+
+ if ((System.currentTimeMillis() - exitTime) > 2000) //System.currentTimeMillis()ۺʱã϶2000
+ {
+ Toast.makeText(getApplicationContext(), "ٰһ˳", Toast.LENGTH_SHORT).show();
+ exitTime = System.currentTimeMillis();
+ } else {
+ finish();
+ System.exit(0);
+ }
+
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+
+}
+
+
diff --git a/src/app/src/main/java/wificar/MySurfaceView.java b/src/app/src/main/java/wificar/MySurfaceView.java
new file mode 100644
index 0000000..d8d3461
--- /dev/null
+++ b/src/app/src/main/java/wificar/MySurfaceView.java
@@ -0,0 +1,380 @@
+package wificar;
+/*СRƼwww.xiao-r.com
+ * йFPV-WIFI˴ңwww.wifi-robots.comԴԴӵȨ
+ * Դûѧϰ֮ãϽҵIJ
+ * 緢ȨΪСRƼͨ;ߣ
+ * */
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.os.Handler;
+import android.os.Message;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceHolder.Callback;
+import android.view.SurfaceView;
+import android.widget.Toast;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class MySurfaceView extends SurfaceView implements Callback {
+ private static int mScreenWidth;
+ private static int mScreenHeight;
+ public boolean Is_Scale = false;
+ URL videoUrl;
+ HttpURLConnection conn;
+ Bitmap bmp;
+ InputStream inputstream = null;
+ private final SurfaceHolder sfh;
+ private Canvas canvas;
+ private String urlstr;
+ private final Paint p;
+ private Bitmap mBitmap;
+ private boolean isThreadRunning = true;
+
+ public MySurfaceView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ Constant.context = context;
+ initialize();
+ p = new Paint();
+ p.setAntiAlias(true);
+ sfh = this.getHolder();
+ sfh.addCallback(this);
+ this.setKeepScreenOn(true);
+ setFocusable(true);
+ this.getWidth();
+ this.getHeight();
+ Constant.handler = new Handler() {
+ public void handleMessage(Message msg) {
+ if (msg.what == 1) {
+ if (null != mBitmap) {
+ saveMyBitmap("snapshot", mBitmap);
+ } else {
+ Toast.makeText(Constant.context, "ʧܣδܻȡͷͼ",
+ Toast.LENGTH_SHORT).show();
+ }
+ }
+ super.handleMessage(msg);
+ }
+
+ };
+
+ }
+
+ private void initialize() {
+ DisplayMetrics dm = getResources().getDisplayMetrics();
+ mScreenWidth = dm.widthPixels;
+ mScreenHeight = dm.heightPixels;
+ this.setKeepScreenOn(true);// Ļ
+ }
+
+ public void saveMyBitmap(String bitName, Bitmap mBitmap) {
+ File f = new File("/sdcard/demo/");
+ if (!f.exists()) {
+ f.mkdirs();
+ }
+ f = new File("/sdcard/demo/" + bitName + System.currentTimeMillis() + ".png");
+ try {
+ f.createNewFile();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+
+ }
+ FileOutputStream fOut = null;
+ try {
+ fOut = new FileOutputStream(f);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ Log.d("MySurface", "bitmap is:" + mBitmap + "fout is:" + fOut);
+ mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
+ try {
+ fOut.flush();
+ Toast.makeText(Constant.context, "ճɹ·/SDCard/Demo/",
+ Toast.LENGTH_SHORT).show();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void surfaceChanged(SurfaceHolder holder, int format, int width,
+ int height) {
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ isThreadRunning = false;
+ try {
+ Thread.sleep(300);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void GetCameraIP(String p) {
+ urlstr = p;
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ isThreadRunning = true;
+ new DrawVideo().start();
+ }
+
+ class DrawVideo extends Thread {
+ public DrawVideo() {
+ }
+
+ @Override
+ protected Object clone() throws CloneNotSupportedException {
+ // TODO Auto-generated method stub
+ return super.clone();
+ }
+
+ public void run() {
+ Paint pt = new Paint();
+ pt.setAntiAlias(true);
+ pt.setColor(Color.GREEN);
+ pt.setTextSize(20);
+ pt.setStrokeWidth(1);
+
+ int bufSize = 512 * 1024; // ƵͼƬ
+ byte[] jpg_buf = new byte[bufSize]; // buffer to read jpg
+
+ int readSize = 4096; // ÿȡ
+ byte[] buffer = new byte[readSize]; // buffer to read stream
+
+ while (isThreadRunning) {
+ long Time = 0;
+ long Span = 0;
+ int fps = 0;
+ String str_fps = "0 fps";
+
+ URL url = null;
+ HttpURLConnection urlConn = null;
+
+ try {
+ url = new URL(urlstr);
+ urlConn = (HttpURLConnection) url.openConnection(); // ʹHTTPURLConnetion
+
+ Time = System.currentTimeMillis();
+
+ int read = 0;
+ int status = 0;
+ int jpg_count = 0; // jpg±
+
+ while (true) {
+ read = urlConn.getInputStream().read(buffer, 0,
+ readSize);
+
+ if (read > 0) {
+
+ for (int i = 0; i < read; i++) {
+ switch (status) {
+ // Content-Length:
+ case 0:
+ if (buffer[i] == (byte) 'C')
+ status++;
+ else
+ status = 0;
+ break;
+ case 1:
+ if (buffer[i] == (byte) 'o')
+ status++;
+ else
+ status = 0;
+ break;
+ case 2:
+ if (buffer[i] == (byte) 'n')
+ status++;
+ else
+ status = 0;
+ break;
+ case 3:
+ if (buffer[i] == (byte) 't')
+ status++;
+ else
+ status = 0;
+ break;
+ case 4:
+ if (buffer[i] == (byte) 'e')
+ status++;
+ else
+ status = 0;
+ break;
+ case 5:
+ if (buffer[i] == (byte) 'n')
+ status++;
+ else
+ status = 0;
+ break;
+ case 6:
+ if (buffer[i] == (byte) 't')
+ status++;
+ else
+ status = 0;
+ break;
+ case 7:
+ if (buffer[i] == (byte) '-')
+ status++;
+ else
+ status = 0;
+ break;
+ case 8:
+ if (buffer[i] == (byte) 'L')
+ status++;
+ else
+ status = 0;
+ break;
+ case 9:
+ if (buffer[i] == (byte) 'e')
+ status++;
+ else
+ status = 0;
+ break;
+ case 10:
+ if (buffer[i] == (byte) 'n')
+ status++;
+ else
+ status = 0;
+ break;
+ case 11:
+ if (buffer[i] == (byte) 'g')
+ status++;
+ else
+ status = 0;
+ break;
+ case 12:
+ if (buffer[i] == (byte) 't')
+ status++;
+ else
+ status = 0;
+ break;
+ case 13:
+ if (buffer[i] == (byte) 'h')
+ status++;
+ else
+ status = 0;
+ break;
+ case 14:
+ if (buffer[i] == (byte) ':')
+ status++;
+ else
+ status = 0;
+ break;
+ case 15:
+ if (buffer[i] == (byte) 0xFF)
+ status++;
+ jpg_count = 0;
+ jpg_buf[jpg_count++] = buffer[i];
+ break;
+ case 16:
+ if (buffer[i] == (byte) 0xD8) {
+ status++;
+ jpg_buf[jpg_count++] = buffer[i];
+ } else {
+ if (buffer[i] != (byte) 0xFF)
+ status = 15;
+
+ }
+ break;
+ case 17:
+ jpg_buf[jpg_count++] = buffer[i];
+ if (buffer[i] == (byte) 0xFF)
+ status++;
+ if (jpg_count >= bufSize)
+ status = 0;
+ break;
+ case 18:
+ jpg_buf[jpg_count++] = buffer[i];
+ if (buffer[i] == (byte) 0xD9) {
+ status = 0;
+ // jpg
+
+ fps++;
+ Span = System.currentTimeMillis()
+ - Time;
+ if (Span > 1000L) {
+ Time = System.currentTimeMillis();
+ str_fps = fps
+ + " fps";
+ fps = 0;
+ }
+ // ʾͼ
+ //if (null != canvas)
+ {
+ canvas = sfh.lockCanvas();
+ canvas.drawColor(Color.BLACK);
+
+ Bitmap bmp = BitmapFactory.decodeStream(new ByteArrayInputStream(jpg_buf));
+
+ int width = mScreenWidth;
+ int height = mScreenHeight;
+
+ if (null != bmp) {
+ float rate_width = (float) mScreenWidth / (float) bmp.getWidth();
+ float rate_height = (float) mScreenHeight / (float) bmp.getHeight();
+ }
+
+// if (Is_Scale) {
+// if (rate_width > rate_height)
+// width = (int) ((float) bmp
+// .getWidth() * rate_height);
+// if (rate_width < rate_height)
+// height = (int) ((float) bmp
+// .getHeight() * rate_width);
+//
+// }
+
+ Log.d("bmp", "bmp" + bmp);
+ Log.d("width", "width" + width);
+ Log.d("height", "height" + height);
+ if (null != bmp) {
+ mBitmap = Bitmap
+ .createScaledBitmap(bmp,
+ width, height,
+ false);
+
+ canvas.drawBitmap(
+ mBitmap,
+ (mScreenWidth - width) / 2,
+ (mScreenHeight - height) / 2,
+ null);
+
+ canvas.drawText(str_fps, 2, 22, pt);
+ }
+ sfh.unlockCanvasAndPost(canvas);// һͼ
+ }
+ } else {
+ if (buffer[i] != (byte) 0xFF)
+ status = 17;
+ }
+ break;
+ default:
+ status = 0;
+ break;
+
+ }
+ }
+ }
+ }
+ } catch (IOException ex) {
+ urlConn.disconnect();
+ ex.printStackTrace();
+ }
+ }
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/app/src/main/java/wificar/MyVideo.java b/src/app/src/main/java/wificar/MyVideo.java
new file mode 100644
index 0000000..b4d64ec
--- /dev/null
+++ b/src/app/src/main/java/wificar/MyVideo.java
@@ -0,0 +1,186 @@
+package wificar;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Message;
+import android.os.StrictMode;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.Toast;
+
+import java.io.OutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.URL;
+import java.net.UnknownHostException;
+
+import my.wificar.R;
+
+public class MyVideo extends Activity {
+ public static String CameraIp;
+ public static String CtrlIp;
+ public static String CtrlPort;
+ URL videoUrl;
+ MySurfaceView r;
+ OutputStream socketWriter;
+ private Button TakePhotos;
+ private Button ViewPhotos;
+ private Button BtnForward, BtnBackward, BtnLeft, BtnRight, BtnStop;
+ private Socket socket;
+ private long exitTime = 0;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ this.requestWindowFeature(Window.FEATURE_NO_TITLE);//ȥ⣨ӦõֱҪдsetContentView֮ǰ쳣
+ this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ setContentView(R.layout.myvideo);
+ if (android.os.Build.VERSION.SDK_INT > 9) {
+ StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
+ StrictMode.setThreadPolicy(policy);
+ }
+ r = findViewById(R.id.mySurfaceViewVideo);
+ TakePhotos = findViewById(R.id.TakePhoto);
+ ViewPhotos = findViewById(R.id.ViewPhoto);
+
+ BtnForward = findViewById(R.id.button_forward);
+ BtnBackward = findViewById(R.id.button_backward);
+ BtnLeft = findViewById(R.id.button_left);
+ BtnRight = findViewById(R.id.button_right);
+ BtnStop = findViewById(R.id.button_stop);
+
+ Intent intent = getIntent();
+ //Intentиkeyȡvalue
+ CameraIp = intent.getStringExtra("CameraIp");
+ CtrlIp = intent.getStringExtra("ControlUrl");
+ CtrlPort = intent.getStringExtra("Port");
+ Log.d("wifirobot", "control is :++++" + CtrlIp);
+ Log.d("wifirobot", "CtrlPort is :++++" + CtrlPort);
+ r.GetCameraIP(CameraIp);
+ InitSocket();
+ BtnForward.setOnClickListener(new OnClickListener() {
+
+ public void onClick(View arg0) {
+ // TODO Auto-generated method stub
+ try {
+ socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0xff});
+ socketWriter.flush();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ });
+
+ BtnBackward.setOnClickListener(arg0 -> {
+ // TODO Auto-generated method stub
+ try {
+ socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0xff});
+ socketWriter.flush();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ });
+ BtnRight.setOnClickListener(arg0 -> {
+ // TODO Auto-generated method stub
+ try {
+ socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x00, (byte) 0x03, (byte) 0x00, (byte) 0xff});
+ socketWriter.flush();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ });
+ BtnLeft.setOnClickListener(arg0 -> {
+ // TODO Auto-generated method stub
+ try {
+ socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x00, (byte) 0x04, (byte) 0x00, (byte) 0xff});
+ socketWriter.flush();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ });
+ BtnStop.setOnClickListener(arg0 -> {
+ // TODO Auto-generated method stub
+ try {
+ socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xff});
+ socketWriter.flush();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ });
+ TakePhotos.setOnClickListener(arg0 -> {
+ // TODO Auto-generated method stub
+ if (null != Constant.handler) {
+ Message message = new Message();
+ message.what = 1;
+ Constant.handler.sendMessage(message);
+ }
+ });
+
+ ViewPhotos.setOnClickListener(arg0 -> {
+ // TODO Auto-generated method stub
+ Intent intent1 = new Intent();
+ intent1.setClass(MyVideo.this, BgPictureShowActivity.class);
+ //ͨIntentһActivity
+ MyVideo.this.startActivity(intent1);
+
+ });
+
+ }
+
+ public void InitSocket() {
+
+ try {
+ socket = new Socket(InetAddress.getByName(CtrlIp), Integer.parseInt(CtrlPort));
+ } catch (UnknownHostException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ try {
+ socketWriter = socket.getOutputStream();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ //Toast.makeText(this,"ʼʧܣ"+e.getMessage(),Toast.LENGTH_LONG).show();
+ }
+
+ public void onDestroy() {
+ super.onDestroy();
+
+ }
+
+ @Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
+
+ if ((System.currentTimeMillis() - exitTime) > 2500) //System.currentTimeMillis()ۺʱã϶2500
+ {
+ Toast.makeText(getApplicationContext(), "ٰһ˳", Toast.LENGTH_SHORT).show();
+ exitTime = System.currentTimeMillis();
+ } else {
+ finish();
+ System.exit(0);
+ }
+
+ return true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+}
+
+
diff --git a/src/app/src/main/java/wificar/SettingsActivity.java b/src/app/src/main/java/wificar/SettingsActivity.java
new file mode 100644
index 0000000..92b0b3f
--- /dev/null
+++ b/src/app/src/main/java/wificar/SettingsActivity.java
@@ -0,0 +1,16 @@
+package wificar;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+
+import my.wificar.R;
+
+public class SettingsActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_settings);
+ }
+}
\ No newline at end of file
diff --git a/src/app/src/main/res/drawable-hdpi/icon.png b/src/app/src/main/res/drawable-hdpi/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..09ae62c48e49cf1b7c1be668fd1424a6d4fef47f
GIT binary patch
literal 81689
zcmV)zK#{+RP)nVId_F~y1PfE{LLW@e})
z#az_|U0h)(=Z~yC@EgfyiI<}munz`TejOs1r_-LPfXzjJv
z`)-;Q5GWFu{rUUf1+(Y;n?NuNNBsTof1f>j_Oyro+rRzWtXWKY9Pw}eI-6|%T_B*3
z)aGcoe~SF6JdMu(uhg|!kl&bVo~=8>-v$3Ro4tDW^KbuCpuHYC4gW2fJg+&|X_SWN
z`teleP$#GF#q@JVK3w`)b4;XRo-_AwnWt_df4p@
zAPf|WMbjFRk@Pqahm&*pv$=4FKPT@G2oMT|Vv~lS=)HG~YL;H})qt=??
zZQ%y#=Q+*&GS^JM-#`=TaRJ%~i${yxsSh4IbvpgA)84zmd&ixKBw7b3HC@d~owPyAIf&2f1;jS+PfkGgg2D+A#3`+6;f%|HKe}HgC1~%l1
z(X`Z#1YBa4-Sy`}dE|^?eb$)TLwCT`>`ou9+eQxh4|qUFmJGX-5A*iLdZRO;*_~!h
z)FV2>1)KiR+{+z{orc$=Pc<#Wu~%-I-6vNs+6s+&FU(Wa87`js;F)ly-#z*I@idIs
zo$tI%jmbV(^VywyEX*xxEr7dXwx*?C5$P|r7B-Kf3a9fnTV@$1F6I5*U44T*r3G^rFRUN
zlJ{6s0)P|)9`xwnKbL?OLbP}Q&J6EMuOv9_M&F25%rU0G0
zXWqT`qlY^yQuQALEKvJ7NKFZM6QzI;?kt;{F2+nfHj~d(aMu?DQ#s;96xw
zH4S#55GW_Fp2+K|ZRWlrlOZ8{0QKJ!+;#3RQ@;NgN6iZXHJKvR1dV^Cn2J+rW%y6eRD7>s#
z*GhJ=6k358UFhi#&oQYF9xWO1kF&%
zKtSP9>$STUqbyPl#0gcU@kK~!__7tK&KT5cO)Q2+H)(o}%f-sDVHiYX;%i2}7ZOZ@
zo%X!+vF2DWK2D}Rz+0-`mJWXB@>n`WpDOyBXJm8=L~}Qwo1$xa-eGUz>r8
zuL~j2O&~Z2+w5W7hGUe*z>k_v-y^qa;LerQ-+u$}(R=Z{+qhmGYK@7XxVeU|=gY%g
zq@^fw<8&1_`aG&m_i%=J9OBOb$N?Bh!OC(64=XeID`WUlmu{3Q&1eZk#Xah}8YL&?!
z16bpFI5UR(G~$g`cQm_GH7f2`@4C=e!ijZeLnme?(*!xhsC|Qjpq9CHa>+<%bIB-y
z$~+RzXy42z;K(Pfjm6CGPwE_r;?iFd?nZ%2zSl!P8pBH8B=qqh;axF?4MV16{vgi`*X_}`#sw4fG3j2o+R2~@8TkO@UU18%_ZzeiN@omr
z9?ea|-GHsxkOmWiGr|B@w?=ywF0o3?m
zJw3Zmc7n;ZarBQ0fX-i^-hkbI72GLjMMR&AcfUj?))~#L(?BVmY1#4`R8IJvGsVghK!`1C#bRcHEQL#L1W8ib$$M(pFb{ussQxa8;UFX!u01d(9=9&2}8|o(6mHFd-VHBv6)U0
z@Fid>BKBB`R9;rb!rdIk{ms+hSsOurnpb7$O8)k62kdzW708~9_}>ujlwN1x$eE#@
z2Gg>9Z}{9;_MI8rO}n-CX3q-#kwn5Y+z)5pJAO{q1ASsubR
z2kv}DWpbVzyXy{tB9d^1b8%)^15nNYmBw_auMxBKfGbG^1%gRLXu*Sez?`6
z4>9Mx^QGa#l~g7tB|JzTTvk@GcJ2BZiWyqlQDV!?;JrC;=hO5Cu9zuz#}MuSE)zK+
zK%q;g$ydd?k6>Bm!yHM$7mv)O@j=`W%KGwVPI{S4ilV@Nr1VKm<~fC<%+*MEXngtb
z-IrPWbv$Bp4JKNvyt-Z|IW@v0Wg6GrpzXtB6budNG
zEZpgjoV-XG|JC9r?q%~qnGcZ$#YvwJPOAN|g^yt-V%)iKAYEngvOdpc8x))AUc?k{
zYNqGKyW?`3DML>S7{cEs{40}ipP?Qy)ONh#GM?&=h5Pi?mag73yf!BEMvRX8>LOoE
z@QZEfBxbFNDJK{C$x&IQWQ
zDKrCd!dD~F*NG6fV(-R$52~S
z+K$$FyxUZ?fyFwxO5WFlUy+6txQ2yBAH!fO8BYH(Z6d@+WiXD|9FZja5H#f)QhHh{
zl^Z})_xf?oa(OUkxI9Co>Pv{p{q+4B6esFYpw1;GqfUe~(&wThIoLn>HnEc?6qEM?
z>@u%_y*2KnWP^qseZTa6<_g(knM`n^`vSR;GnJt?zkVWa@eH!JUAW0GCEQ4KIWHHH4kEU|=WpF$WJb
zO~YIBn1@NN8Vmy5%NV%Nl-++#dait%33o&4(rar2ub*lQnJL_H8G3!JD}lcg+-d0W
zZJPsk+QZ{W2yG(yABkC~ZpSfpBogmT9>2LEoJ820jDD=;j>D0WSz}FJ;Ay
zIi=*+q?ufKP0r28jib<`_aJGQ8o8cC{2;nAeSF<8=1u#cMl7iH6d8!)g~}MOP#&aE
zgm6Yf+(_h@)EHb*!HI%{Lrt0?)bvO-$e&gA#Q16nTAUbZZjO}|!J*R|ii6IKDgphU
zC=9wQ;fgDtKR^@|XY`*&*Ub49M(OphjLOI8bdzr%cUne8sdL4^s42&^#)St%>2f0$)aiA=9qt74F@ifU)OZ+|PR|E-`aPKg
zWnNK4$#J>}(fLo0_25w4JNYn$Ual1|M%bdSfe&`(F!W@Mat^Uci1Xc-ksm@TIuy>z
z|MhS;SpgYWxCV`XdI7@+cbd`72?*+;ZwPmzD8x&{-6RB2mbhvG38sKMVNF!NbWK8U
z%ZW9#gjxV}guY
zor++bc0c3D;tCMzL}3HJ;j!Y?A|<{_4!R%`0u)-)otKrol-^(uB!`Cp?g|BC1ozyA
z0sETLDhi#yNK)cY&bV_i*T$ov8Cb{}167*^ci=>4az&^KR53Mx_BM^Kjk_0Pe?aHv
z8ttDP9U`YQ5O|bVZM1)iiiMQzs>+&;8#fDP6g&nl&8fVmEyT3$M4tT3H++3jXeF=j
z5@Sx&5AiZ};TPt9AWuPGC|Y1(Y#_`)qM7(JMy*aujxR4SiiwL9%KSs*VL>uQNJto-
zHRAk{k&zmWCMhW?IyxdMDk3~w84;l*wLjYpfa%gp2BsodstaGBq%po7!}cKn3iAmG
z3Bexb$p(jEcd)J)n5+a$!jxrVy&2RDlt!luAT3Tz=ZPx`37e5kTZE=aU=r5m)I!sq
z6lEqjR9RJ3wPC~h8N!_nN=)mTyae2};=w4AVA!k4(1q3ZEitG0#;DPrD-{Ia_y)Lv
zHip9Ga+OMzn3$NFnwplD78x1k=I-d`Y=8RT{!nipRhUXHlZS?c1_TNV3JSu*!;v^T
zIwm?gG9e)@Elrb^l~Gt&h@bFHHuBj|US1wb1+tBgkB^OwjfsiDfk1g^D5xDSDT97^
z#9?8|urO6&RD3wY8F(V@*Jw08mR%5@Lo12xD6&8MV%lR=HP*rqGF7R2mPXd
zYgSg~;>C-}suC6!+GRq>pL6HVwY0Rfv$Jz_baZxh_VDoV^Yg=aXMh`L0nh<=oCW8~
z$;rvh&8?}aLBYt*&c@ELun@LYSgcY3@nNV&CL15!(kTt91&X0babS&Ki|c9wh7@PW
z?!P8IQy@(Ri+)X>IF{rY5~`|xIk*#ntBb|L4|qw_@(hs{S^>?-Xhz2qgMg;k9sJ7~
zCk)u2FV(+AC!nFEc|=+;)HcSZBWejefpIh04>quviI0yDU}|e?OCamyWwh-QB^#!QS3BJ3F(zy|u2cnqZezILrq%
z01-%DUS23d_V)J38TrqdGY5y`bSM%i4@eUqpHN<2Qe9nu#ym#3YK@NF(rzo=eTs%V9gU&(2N965f>+tDrEJFB!Rd
z;mjNhOUM{oTbt#}mn>Q|3WkJ4$J}qp$;qf3cJ11=ZQFL#nA~S@a1i7T+K!5fg3yPU
zLD8zOuOAv3YHe*r!6+&!g1~|9S14qDem?H*u91=9MMVXztxc#6Scw%B76u#x^bkHu
z7>8N5ByFhQceUh>n~!!hZxXF
zNJxNqfQ*ihhgK1TkFBj4$wBxPDFImkaoMtE`}glZeE9H*6DKZQxNz^@y)$Rdyz%B6
zb7u?w>6f3erj@g^D-_GETQ@2zYamRzySp+o)5gZe{>y*)FD)%CK>W^~JMmb%ySpJ;
zfbx`-6!-v`49SwIHtmN$U_56NNHZx~(Jz=T{
zJn(-naA%wD$OnxAdbra8O1iPyq?lm^4CC_=rxQSdI|vX%TEOp&h=>4@L!a2#Flxfv
z+tb(A3+Yh|PzD+s8&|GedFeS`Sm*0HzO@RK!jq8B;fBf5@
zq2%rC?6H0Q`jwKB^4Qq8($bQgoXo9Tx1K$F7HS@F2Z-Sn0jU)g6*xOiiV_7k03Vbq
z)F;@FO9JRo?W|q9ZrQRW%a<=5A72LCkByBC4DHSn{_0#N*w?qF+{kVpi+E;M_pZAA;%$CY;0_x
zRb((Wgm1O5HIm6cU(ZEcW4Y%33ob;iO&7)7Hsz@0<3
zR?JLtE@>9z!{2WOH9o<^m%maK@mrnRWIo6rw~wDx5m9w@EZk=%W{CUDHjywkGhqYf
z)g6dTxYjtsRz|vIj_a_&Qa0Uc!-#V7AxsZ_j%^Z8EH4M|#uC2}x*VJeZxXQ)DDuwE
z&gSOk+}ym<(o#Sip%S9qkr;F;;cTEzAmMo?dZ@!
zor`l(@TCK1T>O=7NY{%T!$wLi+=(+v#5#x^${1+#_xC5^4(!1Oz}MT`3-@vF-o2n|
zgusyow5nU&*kBo56bz6(+!{dh>eZ`&JC549Yv-Pw+uyi*8!S6#4g=OZcW$p+x3Q(A
z4PI|@aso;bu-?(pfzpD8Cx9E76RhJKSrJ#5z@2O$6F9H^{rxCos1Q)4tY5z#7m4rX
z%a=nJEm+Xg+S*)MS$_ENLDXgNaaqs@!Rs=OHZA=#l|U#3YdWz>xD)>4Y+9^OLCMpe
z%jg1tb?$WG5mCRnA%DOfryy|Ox^?^i9=IE|0{$Afv(1wsOvErg9v-2uuP=l}6^XH>-fOd!Lxqsi@UE8;Q^1-`!
zTZG-;c;nSgn}F}m?CdPGtKuvpBO?GVR6Dd25}?>XJK;mJ<#10#JOYspY90tJ)H$e*0QbqL1-_M((QuzuEdZk&=9qfl
z48}z=lcjzGTS~03D$fe6L=;8X^ah8r~{V(nQS@y2S=G1_}V#10c4yw?jH3
zpF4N%Y~HkS-|iik&z?fpnpv}$HOoKv;N7)rH*|G%Biw>ePhA~?I`y3$9f-r=S7ZWj
zfnc3G3x|8`!H1j<2wt#Y0ZJ4$fOQ0hp=3V#=%aJz&h6Z}&B9_Lor>=9i55O4rWw~HQjuWVB4m_+&WHX9aO6rC2>3TQlpg>cXNgwFHPkn5
z+qUC(VRwCFHPiKyb7xuY&WRZ`4(p8VdB+*u{e$a~r|))0+Q~UXrcfrJNuU8@1_GV5
ziNfy#qXRdP;D9@T4v7NL0L@SuTyqa6uL%cpZ9r%f1;s)a?cBM2%a%jTyLJU3c_ctX5@I{0#f5csH62~uF0LN<6<8+@1I|KDL`a>qw&H`6g5ZgoLYe&J
zlTYvyR1@G1cAuDl=eh>v8PJFBLMeUy^?O*16@j4G*aVj2!$9-s!4Rg@>uki@IGa|G
z7_s=TQ4wa=1{}&KGde-}OsO3Zp4O0Uj5-eA>e%?k#%2cYGj0FZw{r1ocO$rK8}kfX
z@@U-C9Ze1UMd>@BvR(PK-YVORkaQ6Vg{}qA0cCtQG&DdE6Ac5bBa#TXBSbhbFo5!a
z7JGmXI0GCB;AkKcCdP*#9zcY!?(6Fd4D>&L{_Kt&+fJW8VQq~DSBCr7uU`ZCfzY_N
z2`NIkaA@yTv6dnY2AZY-4
z&^fkI65w^B-B*eq*ijPl(ut6C^93FygT3An!fP*R0&=BN*9LTI{|=g6No7E!^W0nwnY|xW9ZOt$D60Y1n2B9iQ|)?6^J>M*XV!
z;7;$S`-gzAA+-_I>*?tMpux&m$PO_?039K7d=U2l{tyNMM4(}aQU~S;xVe}K0VUZ(
zgf-%rBO{}3ZZ1cU9^SNR!`7{vX3s_mVSeiB>Od*N84+_tG9Pb`BS#L`)YRc8l)7in
zo`I@8Jw1^dPDI=Tk~86ZB4&tcLJ>t{76PEd!^40$DhVY-3rt
zZ{NOiW@3hmT57|QJcAI>_Nq0er?DQWY-bNf&lvWLAj1f>#s(|3%+0eOVn*AU1X+XR
z06QQ60S#|&Z?se1zI_{5LF^oeKYjW%Xt=Jf4icGos3;z;u5M^B0-F
zLbW5*jUYOr>1gOdhppFNfBnM`KLlcK+_-TGtwHC{LjgmUa2*)`?
zew-0-|KNiUP+B;klM+QhPbiVis9k05s_+Q
zQPFY4BBSDy-V&jscqT}P@Q?z2{SHay>k4?Ug
zqijD+eg6%@@xP9
z!}CLw5aj{b0x$l@|M(xi{PK(2w{L;L9Ual9Kp&g|77^3r!sJK~J&iH|iUs?^NdQvu
zC(eSOfJOX@Q{!ULb_8+1XU|UThl~N-Z{EC#zzY#bbk)Hjo;36#Jv0oi7MYU}B(RPT
z3BW_aqk4gQnOM1W-~L_b8w{{R!sO=W0QbN&qAQ&IrP((EP-6`n=D3n1lgW_fD+W{O
zdoB|W<%SX^Ix;Gj7!7wI9!zW!?sPHWwn6Q{G=VraxMG718t(WNaL0Fif(GoqW5=#v
z$L_xo+ztA8nCj%M>k6xdJN_XffUtoYA0bFkBNz{I76b``CqM_g;{#Aa1fz!|u!TU!
zfBw(^{KXevUcP+A!^4wMH5Z8F!X{)V#1EWNpcYt%djO>bWrClG9EX#D6G2))9vaBQi3YvzapYBr={}%9}g|$%kB+A>y@g
z2jV$;1_93q?yLi9kPnCWY2f}6uIjYoR=95UMwy$_H=6X@CdN6r+)l#oWE>D=24WOI
z1~7q83|J5Z4;_p^`?YJ=&?brxwt*o?0(5l*ypZ7k^?(1rKl|*DJ9q952oQqc0Xv8a
zB4CIMOQ4AW3#txMCkzcOL_mvlSSMPX=oyqWoLZwvh1yR`OF4At0D7Kb|Ce8Wi9jI+
zb`a^pHLuc$2fHIBswOnVqJ+Q=KsN+H9B?Oy$2R0UG#Cr_g~q?A;>g9wJ!84Y*r*IIOpR?J}IHx@I~c60lc3G^MHn7-XQBmDt_AarDtC1A+OcEzo;~|Y
zO3L!{i_i^-#2*27IIM70@eLUD_4J-RaRTtNbFlyW-~aycA3hyhvdq=ZgNsGd-YVf>
zB!(M`5WcUkcV}li+mBd?{w*jEC?WU`2=H@tb=tpw4>|#$69W!`hXB=t15qs?7|L~o
zBy^5*k#fSdWTDUk>xddbVxesnT`38#lMmnyF@wkqYOU?tw=P^b6om*wY&=Rhdc7m`0}f#O9W^9XodmekD48+rxoxJ=_hu|I=`1x0Qf
zir(ztNO+1+?cjBM1N7IgUq5vCaDVTDO&d3QdU*khM~|I6a`bp=TE?u|7DPaEjr^Rp
zA<#rHhp3deICXHa+|$$D%gfWv%@yGs^gBblEyg5a(l((0$n>Sz!2`}=*OLfgFDItniSE68F0s7xjlRKA31U?Kff?DGaFJHsvQsqsT0IQ
zyW@NHij{4xt$qFd03y82_=F@-yQLMH`n7#pI9!q#If)NKxv>XA0=OK~+0)C-
z)()|AYd?Q)4-YqtJYvg3FML^`7TfTW0anNuY?A;#32PF)L_$D>{vp|cR7f)D8FV5*
z4+4CMs|qoLZNl#8x&v4rK70Tj2oe%7U_1lJ=DKYH^pIPq_@bi`jnV6MlVZjQyEL`)
zL4QVYpPb3Rceqd6W0Q2@|6Pq8rK2^2{vK3GP@?f%8IHc@-Q68v_l+AjV=0o1j4Y5V
z;0}Bv=niTp3jX?y>pQk>Z*OZK86EKt3}E7q2(CCdSy=;oq{|HBL=r?2I3fUokPA@T
z*Vm816_`iE-Q5k;E(;PxM24lLCU|+fVmuT&0ifp#(hm$UO{!={MYJC6tSEKJ0sBGu
z*h5C9lE@~$LB=Rc=<)^M0FA+W_Us`Y2Z&xrX(5Qm2f-gCKo`!@(M1XIac~mA?yB%`
zR0||Fg$e-&5+8;RK62ZUhTRM!c-rb|eaxYj^fobRCL1^jopZ+i$+YvcS|x!97*IPM
zMd932v)P?iFVnL-)DhSnnd`+2U*Bjx@;0YPm`sBV>0W!<&e^OSH|VaU6X=A+O&UlM
z;uXRgVMlaIN8klI8}0U>LkM>S0fBhL-3i>W2V;~Vf-5U3;Q65gJcD=}YXWuBIgzLr
zf_1pTV06|)?GKMoNhN_EZcgrQPL2-fM#hZL@b&cx2=Heyj9$J#GlO`H$!Ke9@$^Ik
zmH>JKU4r2~1BDRrC}HI*T;b
z=fnuIQE)VMd7`M8)cUk1O6Z&zCt8f$M?+WAIQU3P3y+952r`<}%tW#xt*Y8Uq&Yq2
zUK-*?2O7Ygc0K7~0n~mjJ&FWn;f
zg^cWmuz?qgFY)|-sIEW{AmPtzVv+ES7-?GHT_HtcM^Ls2ks{0@mxHI{7QEsFah_OcI=!{dZRws
zG<@k%Fed37a7T9$&M-J1k^mf!=mf$qAVu`Q#mp@rLb$46cc2{K06J(M1pptS<54^i
zt%n#uw*usd*dn1`bhAP47f>>h-~$5-G@4{|Ld3$_KHhGg9xnEFRu1-P4Mj|bF{mIU
zV_i}ke}7-ZAJMRiZeaQOxyzT2BisqNlP>tUPBP32@&hUyln-R1u@)3gy2p^_q>C3X
zq7x1R`2anBB0Yi0gb2Bqjiw+!CpQO^;Am1b87aweF)_GVgdlM^>Y}jFaCLM7AKYn4
zjj`mMf%0hKVG`~fwMX;!&gC+pn?gx5(6naMFMwdwOt`aQ854SjgfBU`b3G!paG&W2
zlo>(XII$__2EJ+Gq@n~29gP9jxsnhO5e}^58|Xx!9aN$b87=^i
zJ%H4!ufB?K2S#9^_W|1fAuZ5E1@;ArqOULD3;M?h)RdGYbcBR&;P2<_?db|71FYNI
zSvop7*xF&hE405Y`j|nDvw8+I#$d({J1{+R0Dq$bLCGP5#1VTz)E@yB1nGfeco+D9
zxk>m18&EIkW`kdu0DMUaoK$EVd{D{YSfgy_gP2JSiok#i_FfFlKWBb{v`J(U=RWU_c5C4^5@aIKyu!!o2K7}XNL
z72I`!d8X?x@`Q?uiH+C7ecC=oW{z+%r?Hw&!;}QJi#9iYmXr-L5Jr1aCIZ8dI@7yb
z*D#I^xT*+5;2WfvL
z$O0kJlp^Xe8_Z2bEpvnPY^DIq(Srs*NO9j)JZR2C>iK=ARd2Wn~^s=wyj#Z
zVhQ=BCEt(!7Ggywp?;M%I#<_i%&YdkuD_rlx14W4p4Z8lkr6*qHDrW(Wg=azjC4
zz_{u-HDw4!(=14r3cdc;>7N)wp-&E+M6OzGjduHKP1pFZ@3U^$L4eN@L
z0UFYG03R?qTAeU&3~^rZfxLnEK^efWP!8zk^~M`-;QQ;ZzuvrlLvmsqW~~d7`N|}L
z{(fG*ejXlPE^e-lV0Ra1d&qZtP&-?lbUf+!g%5fe;CfKu
zp!NXMqbQQj4n)I{$Rjj5sGWq{SFc(%v1;AWqS2D_s*>{RqN41KOkh1bCkNSNlZhtD
zBqC5UC{BoAR#sOfCMUrygm$2r(ojR|VNJuG*1miUO^Y9+JUPih=R+8sV4YSnlhIG$
zZt^J#Te6&>LEth(S
zD+A;b?*KnHZ!cGLcBkQPXKPKo3Ycn#6~tb1l}PYJh*P^CKAz2zG~1fyW7l0c8@P
zM~wu3gZQJkHWHk{&Zfqu{Ji{v{DQdHcrR~fS&*=xFeeMJ&&(tfO5y|11MYBI&@Cc9
zDKS}-0)l7ZuGJfpG_)2LsL;_U%NhRU=$Y2LdY0v{4LF5O+Hp8zTlE>Z1Ilsn$(-R&
zBgAuXpX_n|zHm2(-G8ezTpws`@Qq*8k9onc7s@^5dijwu0F8iOS%MG2RJ(nB3!0i5
zQ33!9&^a7dBHzKFkm)2=LqhVGE?&ep{6cX2`|rOGV$I0R!ix_IaEl5Rh6npfg?8bp
zz~CT6WPIG*z1_89#uj46-VPeZ%E7@7UaY657g|m+?F>6&2~&|dy0|!@TY-yc|kOkF$-tw{w6H
zHH>>^R%%{eKB>Eab%J=XJ3JPkJS`)Qr7#0+P4_LqZycmzfli%qJK^*3>TjKVSDVuA
zBxefl_>&jzMr1#k-RWzXVQ&Innm57j=Jba)r`ym>d*0FMXPQ6P&kn(0Kp(iTt*!6x
z9|FN6#saq$6J~(R!RVMu;Ny=!2D0%d&<{F4bN<}rYgga@=!5--4i@KS$3=&W0z7@a
zoWjJuDzQggh>am(ZK<|23*{2ovmm4xY~svr7SQY(A~$|
z#m;uFm!}Kno+SMr(ch8uaVOnlxG_^0s|}A9ea}!N&>2B04v3CY#>Ga(#YGk8WTh(o
zQ$jsuBG;^Nr{ZwCs(5dW$~(Zx+QZ!~KrHfboRgRwhuKmyGczD*&~E}gg$fJvu_rM}
z1B;F^R?_4(8&NM!!w|EEbW1a|R+JkZZW4kRal^FU1rpenJ--8r;(nU-Q_g@3w867)CPdamY=kfLHU?)sx8d-pNRQF_V
zBZR%d@tF7yVHu1S!jxbTGx)Q=e;_qANv)0wl8F&X^!0EH@bU2TaSiZu7kj&h2|ZO}
z=O~FoYN%bN(mOxOvnt)8J;lB#%2Vd!=;Py|R!YJZfguu~$lyS!%-_ey6+s)guw)Kl
zD0MRGkNc2Wt;q+y(a?PcHpgN%u#SL_pRcD_}>5nz69Q3up?*aFjiW$D5NGc!3RZU3J!hNP<=GUY*rxzYy5i)A5CUqH8
zaB)9uYyyTEDb(s1fF4dE1TM4<;vtw;8Zk$7-a@Dz4Y6n?MISGBH)kIoPah9AFLxKA
zzn7n{o4>1TkdJ#*kY|+CIZkMu73N%-;$D$#Q=Md!8|e`x@d{UnBSQisf&-&MgrO2I
zi4?Px`MA3}SX<3OeM0({ad0Qy!bm?HeAsDi=GoiZ1O-X4rVS2pbg=gI@d)q(;)RyZ
zZm}r|%}piiN*y+oSnqCjUsmZjKg+#6$-Yq|Qc8V%eO!a20bcITQL31%%7b|j)CXiZ#R3+eEM_LN
z`xKC!_9wn;!}a4XaCkyua!U&)-qG`hzJ%2f|vV?{5}1B
zG3|^1v*;1YPUejvy?nv+Wa1Yc`n!38q
z`nK-c+=dKsLrUPP8n>}B=bmhb!5m+yw_Bi#b$U!#YD8FMgg81fI0Z9P#;4HHKpM&>
z8J(Z$jp(0deUsZMhWX=9ZL;`;6q80Hp7^X}OdZ!UI;ESTFN*Ye&8Tgd139?2wzhBI
zzDr;ZtoVZa)D!A#BcglWbcB=K`nirivko=HKDX(28exnoAKLwbm_T4Em>=n&-Z6cZjC8xg7w
z4~@ZOMj;|qh&UuDKq2)L2YTCBGTj`}SB#A1LuVL7MWNIIZUT3*!S#zI?zO
z{TyW84hd?k3MTjS@U{ncTg(ph^;Cw+g5@HK$Tu*+%g)LI{R^C(9MC}$eQy9|f@U(Y
zHK$=nV4jR%BJ+x216m)73la;Tz(4KGNP#79SXdDw|XzG)db
zg#{_OImwuxFHWsWOh}AFpj{mk6&t0V4(>*bJ{{Hxf~SYCVLtlwp!sRpoj_mb)aoJ2
z<71#I(5B&oyHW8r%7;j@q-0H7TgOyzH%ZdQJ?6}q+J=vzX>r0ebC5Q$Y0b!a=L$nS
z$~sH%_)b6@Ok#3E0vyvgY!nt2*VQ#tRn?T0msD1kRg@P;hKG1r38F-t{JiIsKktTO-gipd{k^^
zUU~s~qp|0=V5USxFZ+ZPO=?zRf`;)}662!agQ@jF44MKUwK?X)`{ob;3CkG`S!zGv
zuAxj1<%C4+Cx2ptt|FNI_!Tw<+_|6)5);I$V+|rg+(jCxvT376EZp_?%ic>8XGzJp
zV0@)&;m(JxDLQ$+oLn*4ABaP$$v7+B3dncc1{yA2Tge*hRDekxhw&fP)tJt@7Cl%n
z^I~;PZAz-z#c@us&@n>n5a{6^CJs!A4$s#hF}hn})}qj;NFX~QJ1ZkE7hg~y8Z`Gn
zgpipc@xg={fIECpxT7TS0&N3B*wNBzuC>)%#ADD3>*?X<>gM3+jMgZ$L%D$9$>B~;
zj<`qk?aj!@PEOV!O#Z(3>w+Lhcr+=(aP>ERA?BDYU&mO%#a9*1Qs^~R^CX^7KU
zPfSYT41gd%VT0Y7th3a_B&`9>WIHK2jW)8AAbzq-O7_r{PyW=&8+}BGkTkhFb7~>V
z&(`OU`DEB)$rvf0xHg;%7u?>_#f(*b3Aj(ozI?8vgm;^o%XC)B%*n={6lUmL
z0v=luh!&KL4!uOZfUvW&vJp*3OdaDxnDw4)tRbW8DN-
z5Im7IBw_nI@Q`&jTk~_|h18=-j(x^a*8rI*(&1BZdIV!J2?OYmho{^bo;>21Wq@
zJ7=b)W+o)3$0cag@hR$fygvw`B#e|JAvs1^CxJqk=}7Sh8t@^v(Up=gG!!|I?c?Kx
z(W~h7?(600?ct8Ud^|mTygj`<-J$K#k2oOE83%{@ywB|
z>?U)_u$sgHGjm|2NFd(N(*x#!*$V8@od(?}=P`@?SIN^0*oxq(o
z{6xTKwBO{PTs?rAhlV?9p-EDT(Nr|t=^BX^RJc6O4B^gPHaK3-?xv$0hCSWPjB!q#
zY?23UvQ-b#jf&&OCdbFI7K_AsooA%&@YE)IVBDi2*yRj;2=$hP($5e-d>L$z{n#M6
zksRoAkv+gY45SOt1F(Q55RCc2&|QpiL)kKbZetjgjUXf(S2DK@KIk{*=jV@VfgyQ!
zcl?RT4#3~Y2Yv1X1BL$nJ{VSlNj~D@V$##mHzt+TOI*RjRT)Ag8A?rS6uVR6TYDFi
z?}bkv(~zQ}Mt}|jfS55=I^%Y7peN8bDe>tVz)*E)iwZ%l(Xl4~G=x5RgT}_x&>ED?
zWKC*%ch~$~yY>k9Flt^a+Vp*n>EI~wMRdkRqYPf5fm;)s1ib+R+!1RbZ<^HUoS77S
z99YRiF@QS*ZU)nQ`w86X(!#xU{Z6K?NMs_28V%y;WL{s=^AR6xki}}qgpvr$0NL08
z#4#wFtfGSsk^nuvu@gOnQFtJ#G#Zp5=3m5x0CZyLv2me<4>A0z3o_coYi{omk
zoh5jaa3{R3s|59-2JGY>#IJ-q{mLmQ0P4(QNq{>XUvwe>z9GuFe!pb(4o0jvI+FcJ
zgWw~^c>wV!A?Ue@p2-+72+(8HEF5S!6>I<=jse<$QFUO5o(}GYQ55cR@m!n!-i?Z`
z$@F|Xjh-P5aXz^7&@dx`$WKJ#PZl}Y$<-caZ{QGprEPK>w-2~8%&cCPxog=>ly)vlQim#HC>UQ(^`Y2_3r=YM;!$Mz7F_-A%vXNn(bUG&&i>T_;-c
zQByJ>kTD<&OhcIf)6m@b0N-Q-d$1oLqyfG$mk5SzGhKItLVOd@V+QsxEKUa
z7C}Zdli(inyCOQ2oRkhKGHE8o*cA2n)DMK@hFj3(fDJm7t`~b~W}r1Xwl%4lM#jhb
z#IGgF2Pa~q0E{IjF&s~fK9DVn>~EE3ve!=@IvY4M(UNB}
zx`drZI+Z{f4~1p|$TiM5xKF{9DL}JHLos0YgZ}m92QNT_rvEI!9oibq4ctPMqd`MybGLuJ{vuA@KpwLqdYFtXO77jwU$+8q;K<)2Y)(0rnWD@b&nteP?*
z@bK^fcgU3~3_u6mQ_{0oxaTmgD&TImBdiU(nxilIGy^9*3^g>bSI+7@69x%LF2jhz
zX^7K5k^M&LjaZZKzKHZE#VJ*jMhuS|9bJHRY~6ocXJ5|mMem!p&<%%wuy{T
zhK9(aF#QYGu!s!D64-gUS@m_*i3xELsxUG|H3Bls0)3gNc1sX`g%+jMfmBYa-94M)6($-
zO&E(LEqXXu8`TC=M76kc0pFZK$-qGH=)>F8Si58UmZHKuO-e$l24PcmVL_feNQwp{
z7?zho4;*wctFNmmD=kKO0Nn9m;2si!PNwM@S(#Zm?3HscVhVt%Yc}YfMc}2A5PG=N
z_oBaew(v|gMCp=KOhjFfErnx{I`?4Fqeu^T8jc+FjiAg2Sw6TMW`vrWSHQ#&{Zfqu;3n3btXMl*k0bXaH*I3B$zv7)t9A_CSSSYROd{M>9{y|}0VKSjsH0PYwI
zg6?0qFmhGtm=Z4|hco7MrmlH%G{Xq)q#`o1>2BOO-a;x3LzwEHHhrCZ(5H{(gEgHG
zU!J@*0L$Fw7=e3F?}EMi4$N505U3HGDO0k?YR!;MX?DRjF~*fi(HU37SrN&cJuRJu
zAVue(Ny>m8tr18O^l(O`!n8(!LUJIC&KahDA=}xQ&?zOZvZ6RX4qb-B6>=H64a=lr
zl?t=4GwhDZgu(hb*_o{^P0FwkbbExDL6;bGCr)LrKO-|61kXYwo0!RKW(%HHIj|a+
zuseBNv_3YtFYXph76Uv?I^akbCk|@39`0cp6-zD+@Je4B2VXwCVt+r)R;w{Rai+dB^(FPvc{zOvwtWJG+9`AOK@M
z8s%1NoZ6u|2-_w_2vb}sIv{!KB$K`fO@2WDA2P%<=bk4GM?jV{?59yq(43i-XO3lM
z=W|AC@e&MCl>69*0)5=`q-7$unO0-C8PSg@LYta`Wu
z_q1lp5&F$I5whN8iM%A=ubcmduSZfu;$ywQ6`~J7Xx$h1j>o!
z<`wn#zZBff2DeFJt%tio#fQ3*Gg>fE`{~zg_)N7Z1o9|EVyB*UFfE=DQpuluP~&P0
zQjoaBI(!q9WA;Y8NLU`+&W_()7+9Hs!)u>rUP>p9u!9qr9&
zsY&S1O#0jd?j|qHXeZxw^67iR$HeGkC!dS`6&$ZmZ=|_(yv_)Z$u)1Ay;C+
zXije7w1#9{dhS@G4K58|0_-OzV&Pt_h5HoJYVuD+Q*t&_=u=vdAq>tk(sI&umXU!`
zMXW)AQ2UMGuHzWcJo82~v!H#A;LFtj+BCY9U?44m$x*B^MMZ1;#lVQ#vvWW~n4&ko
zAP;K|fZdam64jt{NEhHcGb0rQ53CcoXJw`q}ue-_yc_uc$CGOkd_{7ukT4^zVpAXA{OHC4pvZZV!ItU`L3SgFCi4qsst?R039$
zMyKbiB}f5d%b1ScX9Rb)QZuXmHT9GY;;bB1K$&3tTNcQYG31|{jwj1JT!a05`p=xo
zkvM|n1?wmo?*@P3J!wsU4F+lO7WKyh-?SmCoLoFgX6AKGN@8|qT5eWyEEaQ)41<-H
zdAi(&Z%C7fYD*$JbeZ_c(k
z#en34Q{#+%5Hkl43uXv+iUkeAASM*&WW=++j+WFp_-5cq;q|bF4f+uq?$=U?QI(3P
zJe?ZE%ww0AouXDp
zL`HqLRRaq0-nUl1Ls)Fj1MmY0+k7xXXaM#LS>RB%(l@kyHG+5+z9R*`w~Vc$i_Df
zcMj`Qz#aKai+;K`pi3jI-2wOga8>y{U;h23b+8#4)Id+`T@6F1fo^s6BWCZ{;tyDy
zqQaU&z3F~}Sb9IfdTt&BVgcr1&CE&%+zWD3
z6XIhCyO)<0DkK5%(W=qK#o0+$rQJJhX
zGJSS#|D+PDt+kAbD3y<13>bpn9NhEFi6rprMLk2)7}Y5mjQS@6gVdpbJF|xv$5KXayForwFbh!TEGJiw
zA+7vi;hvqtNy9?SzQma!h4bQ%#dQ=(KA{V91|WA
zr3#LXRwk-rGBqg$*_i`9-SG(tm<0jrV`4!YMQ8~6MC9ccu@|E~7h4n!G>raF6k44j
zJy9%%B8@qat#%mW9s*l?AU#SZV>CS>2MY8iYXe4?bBe`~dPs319^qsyu9YzyuhWd4
z4{f8fg2GbH=rnw==1W6g11FP^^T6QH!9zy`W>BMPU%}`=P8b-9MFTxYGY8*o7zCRb
zSA#RH@X)0?DB%J3$%M#J6kkrm}Y=dm{Vk?B$vpoa`+$TPp72ummx
zhki}d
zZqt4+*#Kf#I{#M@uHdW$I#(kM(re
zDh`jLxTL(Kq`a^QFfBq^#msF5cs|Ti(z~bJc0oZ&Zc#}t9viHv1b=cr5xC<|f_Rf=
zQqWKK0m#K8D=pk-TBfJ<8;lYdJ=U2XK5crw{An5{xSVVSg<2LN57+ctp(@z|yg!|>
zKxh60i{%y7V4AV?cx6hMPfDmqsuFbWnH21r5gU{f8>E)HBnG={g51(Vy;DMb5@a5E
zsd0_fWouWhP^ls@?M+lvWKj{Sb#3|4UMK$4nZf(kv%X<5plX0AiYWD1OvA_=3NWnw
z3X4n1U`55HXwJoqJoqjtE`bXKpo8E6`h49pB+SiOUU6AIYuKRolWp=+jDk7bJDQf}
z>6j0)0^AufGcBHs67a!-uhQWY2Iic1>T^w<0}Xc&Fo$)ZlQR8NrYl)`+we8uZD|b|
zVjFNTDk{kiGSyL0NohHBKl*hB$wQgmJ}D3Ruz|37ME9)RFs#N
zmz9=PmXy?%mNu7{*A-UO7nIeM7gwTqA|+x<#f9X_Xdj4PY_LK?TgE8OonMHPRODvk
zl1j=-s*{r9Fl
zc^%9vDArv7cNt^@`*9Mj6_*v1loQJ@(O)xn@!YXS6$Oxn_r7r9q9aF+3CxTQ(NBSo
z2&dgopNqRDQi$n4xqLXbGoU?GjyksnsMTS;gatSK6!dT>;GT?TI(5azmyF^h6F24P`vVoVIC-i}5y
zG5R@UdQB`Y*x$bZ3npW|+ta5{R=p&tjh7Nx6-Q0s=5MnJc$Z~hDix^
zC6*fM6(8hQl^Lb84i9$s^$&J+l}AQ}qVlMyMA6bdH1Zbc
zXUn}ZmLRzrpq$Jmi?NIttf6JD1{L@+GD36serXlW+P$6~GO8#iuYWHbi#mX}v@
z`C|hQpPbZ)YslMSe!{)$7~N>Yh}0(+8@l|IlvNE6FFtzoI4`^NQ8nLbX1afJX(oH<
z>*jx#V&_XV9;Dmy+dJGD}LWvlp=13@1j3I5=S;{8L?_YR8Q
zIUam>ujJ0Ipu0Q$y9<2NB1M?*qqq+JHPX;`0n59Vl`xNmAP*bN^G6wDOsh1sdV_g2
zx~knMT}}KgI7>eQaQYE
z5d-&`!qiCbPJK8HUsBO%HJK@{oy@-U9#Y3~PltIHhQKW?n+C^7k2K{KfGJ~uX=PQ7
z&Z?`b>%q{lippAI06o4dD{87L>Z>Z6YpdD|tE)?^Ys;&!zox3TzN8$hwAbLss>+(m
z+BW==tPFr+iI@9CN!?XJ9tl$CWU-}KF;bI_j8o_xdeJS1p2@n{oL)aN^5Fz
z>|cI-F*?{&lpRx=6P=Np0?C~d6P}t@lv7k&QdV7=pWjwl+*eW9+gh-xru4v&=ICP0
zrB!KX#^c`G8vNOz$S==Ce0w$OhntEQH^ZM@jeBx2>6=S2FJ2G->2<{q_adHM3BG^T
z_r0V3qa^~3A}m^+=HMmvb#=_I$kL>w)>pSM#hATW81sk#KAjb_;3E|v=mUiuj8juv
zj}Zx&SOIIq*hf_
zA|;N60@1_0rnV7AK#z^;ng$mA_0=`y)j)JjWp#B$ZGA;uZB;`}eM5C)c|(6?{etR-
z?ur_y=lY!Ds;b8Ngp}w2XMwkaz|UDA_7Dg~_Q5{0eVqh3$-xQX5+CQeUQTnpT&&$3
zExcT;qye76lEAY^cU?YtG(R;iUlZ0`6jNVU(L2zemzCU-qI_+A#vir^e{ojxXut9w
zZUq1Is_*~xUf92UtoYmOK|fpzdVD_kqr>7ic8hOq4mz<+czPuG((1rB_Io_MC;2a*
zNzX2G+R);?vekL8)UP(tu{Ond<$P6uhojuj!PCVuJ|$KqQG_eywYc5ty7CGJ?&OKl
zaMuAH?-9=&yk1&c*MKNHW&&()ZwJuHTxi?}(=LG2u@l7r6Q^N<9c%;i+|1y$wKZ7J
zytTEXx~fj4io)`2%a@O@UArEwY+3?r97g
z>B?=ZtZ1$rs4S~1&8uuEYwWI@Uzw4apIRbyckyr#_`BP>*w1luw#L$bu1=P|o-W?*
z&W$zI8`n+rcXh^w2j`|nlxS3o7LKf0y|SS^wxc5S`L+0ee%0y6*S-GoR`l`3;)C7M
z+lFQ5Rw-XU693t)K(dPb1?7VJ(#nQyxsrPP#7PLGmMQByxUw)FUkQ+jp>o@k*$
zdk=iPJ6$Nlz(F)p&va2C)S_jVDcwhshO2*ReA7CF5g`=xx$TO|I)Bu+|s0!yhwCtjEjm&P^l7?mGQ#HoPhospOFsl<4Zj+
zZxY_w9q`W4z)y|`eS13gz<_YeNWt-Sv8PtYogY_UUzzyImNpe||Oe
zAFnDO92ft$_f>y?J>uu
z5};2%=H9_~S6BDFS6@AK>J<9-<0q`sW^0R;POLFKGL}|$adGtWaz{^!@4kPCQ=qkk
zsd%gF`OrKq#7!ostZf9`Pn&emVLN4
z_~ypIOB;Q@+2g;wHB2fBN8d1O%K(AEN-&FA{=nAGLoAYG4XBFZj74RNRjskx1~t1D
zWt?83zO*Xg(wewyn^Rxk9)Dm|xVT;(FZ8L1bRVs9`Ik?Vies#O0u`8=2Fuf6g$67D
zj(%uyQDI5y@W@a_c(5#3A{6^!^?F}_KX0tc?c?p{=i~0>=^_#Pi$wu3ak6<%-nBL5
zow-3HHNo+koSL%w%F4#Fs+y|Grn-vO+LBrjLPc4Bb$xn6eQQliWf!zgN7Ha4$i2wZ
z!$ln%je$2#j!u9zXBX}44|xBi=H8yL4~}HtJe>5#nXI?YW!^rTczeI(#$Nf2-60n@
zOZN;*sw2IdlA;&a#SFB@HRP)ky##4dQ7DfH`U(BK6p}!3fLEZeyEwpG66h`R^N|Gj
zN`?N?KtF#!FOkqsDhZT`1F#OgJV*q%W07t@W>pb~AV0@jN7~Dxl^JP?kDcd
z^DF8KN*c<_x(cc~Y6_}Xw}u{Q4c?k&yEM{qU6^1r&Dqn}53?#@*&a-k27uy&X
zv89d&N9@lIdR`oLzqr)ym30nRx5}?>m0a7Zc=KTTwf)IgcctFioq6|Q=Gk?sOuV6kZIv=j+o&WA$ny3$Z~Ke5fv`3!lIv%GzP_~x~`Hj2%h??
zs#>^Qy?ul6i5jellpSn;eSJ=Pm{n!CeV0bOFgs{*p8wi%;qp@Zp6oeoX-+K}uB|z~
zWl5d|@m?iKqPPITzD2QD*Ql=?%Gf>{w!Tk2S|2`;A983Se7MrJQ5}{l_Ex*wtZGPI
zRw>R``n9E|E+|S_)S9|_LBV);`arFExIU>s6H%3)nWT}*|poV?w=3o}a6da3tp8!HcyI66EMvjqnD
zi+p^AkTGNyZ-5>X+XL>9C_p@hXd%{)xFirSmjx+;#mfzFyv#-WStUOZ`6Pk0t)Xu(pT_^AUuH1_TB;y4bq7xi~mtg)(+Fti*0%v8_5(HhY$Pd_+`jU7b>;lt{!_
z&z}2`K-DHZ?c30xQ-w
zSl!pk-^)F~-O6UJw}rsV&c@B%#mCEC6c8v530J6M<@6
zGhSqPxB|dUOi;tE3k-CGuEpH$p&_ye)}ISk28RV>he#$9qiqr_7|sgcyu55Id)(BB
zN~yHBw<|`iM5F!i@DO^ZU{XF?J4;tLN8FK}y%k8_9?NXog6XZWa3v_87!dF1U=tVs
zl)9nn@b+|31xt$y(n5sZxtVb#McHLl&Ast1%Ti`K9cU{MG+7(8tBKG?E#8;}WQ!Yfo7+v^cVGs93S
z8d`L4=hM*iev|MuiiG?c=BD9`u(wGgP=;ZHFAe-qE=_ff9_}@@O>oHaa~D`
z5{t3Z@}PJ%W}Nm44+{
zr@uE8ve)9_QlU3$a9dALmw-SYAAe6ppjauD%lw5QBB??qSA{Agl;OzsH0V1A{ls;rdc1XUb3JQ-5h$jt9;CN6w2|Gfv6C%eqKo52&G*1wZ
zKMCTI5^gIdixmk2fO`y1N1ebryHIgJyboeZxMq|n^pmS^YH8`{<`8cLeH!Qh^c1)^
z4R>Ig7BgI<`s4r~K{gWb2@gK#^QEWZUfZMQ$eDCVS8uW`~~yn3W+*45(Mw%5#%)3*Bix(Ybk^Dc
zE#BI$wdRfnoz*q9Ph~W_&yl*QMQ+-`?C4y5moi%lx74;p3H7(WHu5W2*YDA4}X={lf
zU5Hc|%!KCv?EpMwHjd$im9H78?(V__#~ctEv&I6FSlX8u0GE@SSzb|$z6TPq1Zp!X
zIwCqc5(a^RIYThJFXs4dZf>kbyKNP^1fv@_(+M9XA}1#+HZC$y=o6}xmsga^6;6QQ
ztl4t~Obpsmz~CAA&%&RxEoRN0Z86VMU^mahYVI7{d5+drv*ym5Gi%no#FXIS;YH{`
zhLKb4ZLQ0fEtR2rS^s>dsX*upC4?qU=m^Zf8Wjzptim8Ej2*${;X5`?U5=>{3JZ#g
za+?}U(^JEtqw;byIy;)xh}lPndwRMGEas*MyH-ZJR|U91T1S#Xu
zT{uF?&G4#<2v%S$huF`_#SX*f(E*rDbc`T6L_EAzARZ`3NCt?va&F8x2wCawXLhMsjU&T-O$p&8na=DAF_X1!+}jr?a=N_
zAkrMT)8c_)O3G6t+t|r3Ftp-?G|Nv5cibe6cwM%*tHy?gCKwP8tds3V{HZhiS<%#9
z)zXAtn(JB$Yv)(h)OXetk2dADHK8%KskE{!tGckaf4Q5t576sqJ(sv~b1ei`mUHIK
zoio>BHuw}9Si{=NY95RL-NwcWabf(Km5miUQrp^EySlo7X#lzm{RyioFs1>3#(a+e
z7KUp87Nk!s5CDz?KrxRV=D5b5LC
zPQLoa#wNn(49X4I9oaHg-`G6Ay1BNtr>wfCvaD(G0?p=SNvGCHFRZgYxzufKqyOsG
zge8rU!yN^3xxbyWi<5)33!;6Fwm>{wIufw6u?GC$%FaXkHc*a*+wpC0Z;L=P774DZ
zF4bs~T3cJN4mWze5qji(~LQ7TOlfvlayUxw<&djfwKjD+;X6Q^kf_?AVrY?rd8B7-FV^;1JQ+
z=!)dzMC6b06B{euW$J*9DRpwBpuqg_%%?+}R_nli8?^m84AoEp+ha_S)
z5!@rYz7G72C@iDKTso*iAb^s`%4<fF=ls)J%3BMo1?9#I3I;_s1#x?^lfnW
zMm7lI*)qeWZ*6Kqm87%A<|dsrG(n{_HR8LmrM|Pepn86PSJjnG$~QL7y|KpX!i4Sl
z6^>_?dYl}yJw7t;$dKUJh)Y>!$eekuPHv9go~{s!t}gcOZjKK2h+x>k5Z`cO!W_1Q
z)Cs!-+$aDIO*LwD6go(PCNneBfGwaI@G3=@`;sDntg^BkoSK)1PObR}7lQeKPErgo
zgHlyhHCBQL+}*vsLE)|rg4=fr_8!nI92VWaTN4#(b?}6G>GI&V4*$AFkAx&YvBbmC
zi75~^4xssYvY>z^%lgr71Gr;=+>#}unc1oRgFUr%6)76@Dp13~?m#5)jp_wt44TJI
ztl5goC@jo_c=i$Q%(BZ!hoJvu4}d*;`vN9l!kjeNo8S!Vm`66QIZHgV+GU
zlMg&p_@kto4JrXL1O$dXm@^;Zr3LS^trI~QM9P`?dLv{E`scA=VB`wZoe8L5^et;N
zbxsRBM$B;R&gUBP?dPL;BDg1;A&WCK+|-OaL50;}(&&FhFxlOxV27C9dsbUM`Ucxl7vEGYIO`~
z8~OwUkJ_WFt7HEB?zA)wK{ok@y1)ijng_K5=+q`QqNGit4JcupASlJedbD_NzlVC!_kVQ&J&<4T=J;}iRXmiCj7HUh$$Z6~9
zZD>Jb5Yrw+8bq1kdJ}8x2Gc2^k+YVXMy;8nO1L!OP4t;zwEIlq&X=CAkQr7+z%Fd>@vsGV~)p$
z9ghszA0BWxw$SD5$lQ?%$t+6;FF!|54|f0*Mn;{XQpN`P6W{nVAi$6KRlu~9lVd|;
z4W{?Ps$yefOBnwzHs;Ww13)u49%$aSZ3{>jVTziXn)D1!b4$HENCwVB2P%M`Q4x7L
zC>5w2L{fJE#n~C6+$t*0zqV7BS_+^$dAJJR`8a9&R^O%l!uEw84b6_F#oo#Y*XCMZ
zTiaQ74sQJeXr;vx@+oa?Ez6fLh1&p8-qX_!ZoL9yGzCRjQ?9K0=LvHF%xG8R;$ndh}CWVn|C9KwoEu#wOHEoJK9&`84!zwck*v
zFxYKwfii1tY3(#=bTMG-0TV{2X=!eUm~L*GUs2t8bw}u{>jam3+)hpiE{wYnte+fl
z0M?HT+8^o%;_XikICW=xM5vQgk->QQfDXP1G5`_40`LU~L!m;HqYQxHLH2lySoyuF
zxi&c^p|GG}@#4jBI&mym7CHwhQ71ssL`O4WIOq)@U(ZdO*S5AcL&SrF8yoB4$bx7Y
z*yUtKgvXNDVpM`?e7{9%NhoNO&a71END!f+*nb@X{ee;6!_JqIzQSpsMt)H1+2Ku^BG4Zu2jJK_W9
z6>US_Q8@FEBj91NWR12Q1KNu&ir1!#s`Mx?U5q9`Ln1HcUr
z4+C?M5Ca2!$N>g|2g|bYnarf5M6~{tmKS2wCJGEZGvYM@h%5vXW8=c1#b*heN@^pH
z9CL)Pdj3*OMWH_mz{Uyj#wGGq>lJI3gdEu}xqLG4)EV~;8)ChEtY*))sm6eY@={*7ML_
zyLfm}w8S${GPh1DXo{TE9yxm~-C;|G-&nHysc!G>rFQRa3oEp=D)F()7CXoIT8D+o
zF|xKOFDpDm9;=Qtn>%{8nrU{>Ls@s6w`CvNJ{T!@~4&w8|`5_T$S_UZY~=hk_g7`HjR-15XyyW<1)
z=LX%5w0iDub6->L*pocFUOqct>{MKVS*k10L=X0buZh<+G7v0@zX0_P!4f$oH$--&>M5gkwJu>?RLowU>u3GvZV
zX-Il%OmAmZM`L|wTTiM=nkf|2hYGq?f}sS)voMTZ6}u~I`qNPNli^fycS&`f%t}o
zhTJ@607r96JM<^mT`ORk5h`WE>Z~W)qBk_ZK(qkaTEjN6X1*p%Bj1uFL(WVG;8SM=
zGlex@dOld2#3&L2>jdK5hS8rmkbs_SOfC}GgP(ACZByHxjVo3cTkcD?ySl{Zm7U_-
znP-Lks)R`(V}TafIH9V@fm(HUM;75(&fO*06zs3e|z&W2`znAt5F#
zNUTwZ^v-XsYF*IQ)>E6C(v{*fl47+?C>MVx^MZ%>W`J4OmkMxBdX>q#J
zEA8)QZudzH`?zg!?otmhO3Xv+reiCM~4H*PF6EF=9hIiwr|*aO{rjGiT&dESzRHs=F6=s
z0t7|g)`fu%#Zt>GrG2=kO=dx6Di$nG(-27w1BPG#3TY~W0jX#tB5o@-0BaNgxSIeF
zGz|C^FoKMMt^m{!_ZS))fVYZ0-QArqxUHxJ@QnnhKtQg@85{6i7cE-Ev>P!WOSTos
zN-%rw?AdOJYP_Id@ig=&iF6@Lbwj|wSm%)0X6}pan1$6aHJStr6fcPlS=e4z)z}9Ar=_(W
zj$>ncH`GN-=lljJ$=06s-j34tMMVt@y5@IX8;u%CwYxl~I6Z7}Z@1{p@p1V=
z{WpX=4Qm?uCSi)iz_&@bcXco5?COOf0iCBodO#nC!`i$17A`GsXc)?vGp4XV+Uan5
zBJk)^_lv`xCx<+CwK|U%ICRHYzypi46NJ0W&QS@X#Wsj#YYNhnV-2<|*6ZnH1LRKgb%;a`?IhY>~S)oF}
ze)1De0oN8oIx+hSkb#bbAo#g+t?=)>xi<6W*#P&|<*xg-g&aB*c>SR0;NGB#m9pMG
zpNSE_+&o5VC#A$UH#Oio;TEGH4Gs4dm*n>k^Z@Qex&Z5BPA@eJeP|mt5Q#Dni*~N~
zIA9We64CS%9O&&*ml%q^_zT*hAiA0u7pt|IG4$O)d(VQF#s$rt-7Ot;2*0+r4OKVK
zA022~Tot`EPq|(r*j(Vexy*MrE
zY;~I`wjR*T?TisrM>rM)*vB}|ixXPSvIeTq`z1R`lZ2&x!RXM|&>_GO=jwqb2`Pr5
zD?n%vdUgm!ewEdw@KynO{My;sjtvwNf@4(H2smI4M|An9C@Idt9AE{QmOK{(3|yl1
z9@+y%0@5F<29cbeo*n?5#roWN^YDd#@EagO-
zN!hktak%VoRbER=J<23R5yI``E0!cB$Bm8+1MZm_X)r`$;5(vsnldz)?WqPe7Jvv7
z20dY12s&Vfh6G`)C^(I-PV<(QD)vP=e6TLKvbn3Hy{DzAvmNbt%^f5X(Aw77)`qH;
zsZ?3b+0)wI+uAwM(lyxBGuAYJq-p-*rumCnIu^Be4|VtU6qe*9M5`0ku}N_;@zLQZ
zVfY|m1gs|};@Kvbl~q8mqg-M9JFJ1~4@0od!JWSoxPB-PAKWMRu4S71iFOCO^TC&I
z|I|31{43$<$;Pp`5!{WSZvydnw4JEN2k<_IS1w0;)@dYXUU%HA2Bn}P)T&5qoh5QmIL^Wd2;c_fmzAAC8a~+;e$WtzDS@;ck@y{G
z66_ARqXQP;Uf)oKUQLKCf;$1U;8A922c6Py~1IR5bEWq*F4~8LGSOiODB{?1`ajtch-h+M8iSe+B5Ad
zocA4x#%0Sw#BHrDxI)w_h~FMu>sIy08u!)BP&DD
zb)F5&L}CR@EQOhumxVsVYpNqQ#o2wlO;y{{0YJAjBPsx;L9nj%mk11uUSBhQWepo0
zoeLPv+1cLN-JYMFi)F&mYauNKv440GaGetoiiwIs(^!5x^g7$#LRu0@!?{s&4Pkc<
zviOr$EPUe}jP`Sf5T?hUXl9z2SaAl;OnmS)$*eE2lZG$7-95i=TH{OK*S(;%wRdE6
zsZ`-#B6Vm~%w1h%eQK%esl_g6NIKB#vZK{@qQr3^)v_&mUVWHlmD0LQI=eX7F2>6O
z0s^?n&&vV6Nh3cP8axdn@|}oaV4ZCh50#8sDfR=zz&$t}!EZ<%
zyjOT;sI?Q~6Jir%lhcx!r986IFex>FPP)(_F>!X`{-RW%y9frn=?I<$Jm5atHa^y6
z=iY#Z8c}|Zb5{DSoB*0YWxq_Tl6?2ZYM=4(#90DIzd#|vov4U#&44?)L)O${YP;O-
z`R!Sm>6(-z7@B(keXR3};2?IEqZe2S#xLb!y#&noo17Gvo09?1TRPcos*2v4>-6=(
zPzY%Nyrr$Xu?+zeE!H`IiO5JAC!L-1Ib+KMgg{4IM`wQ@!m_pK7^aTJw8qQ_QXbvK
zFr_Q7j+5xveHysag2bG$5L2Wlhoew2V^slnJ_MVDDH2bMQ6!-AoZr*W8Q-ydMS|Xs
zOvvHbXo2$YU)tK-tqvA1jIW{mSr=+w
z8)j7-A}Ci`=d0Z2SlJ3@%|=iLRX-6hfDYTI1x+=K(k0rR#3IpPBoCH|#QtD+2nGz1
zfB;1YDI791Gzjhl_%H)sHilr-*T?7Ns4(SqbR;u7H3o4cCxOm^btHyEO#0HGfT4I)
zRaK#(5v2~D#aSt%{Rjk(0ltE-AF1{n@m{rDzGzU?+u>VP=$xqb4DexkNVCX33$elZ_3d4)Y~+`O2RIjtexV)EpPgNp;*?m|
zd^CM@c66dV^dgjw?z;E#r{IomYEdlw9vw4UAp&Iq7Q8kc54-%xF9-zz8g
zjU`zx4z=7|>4^E_jtp5I>vufRZNH`7VWMzeSG-+olx2g`qA|>}RyDU;Wmy?Iw>or=
z+D{vT@5w)Y-|H`L`uzRx
zF~07Cc@B1nKcdW_uE0b)eG9s)F+c=;SN^7{-C2TDWFxK&GQpdw3W#U@HP5
zDl{lDDIqdS6&D{F6C38>?KxN!^vZa|!;49)`%7yZ7Pq%!;D5UTi?c$Mkd6W3J9`0o
z7Wchv-Fjn$E8~nU=pR^&MRCKGDlDSV*VD_jpAeL@*&tsgWCxD+~on{_^GddVfXw6O|AVKw{PCqTQ=w~
zm`JlYwMck!sr#wL4#)Z(cDLECEw@{oKBqm_wmD*6L)h&4FpGMXMV)e9Wtc@ph(&tH
z+-%vLjPSth>=LZij(A0Ob`~7fjPw+&^oteT)6g#mZq39epc
zMKM+khGrNV>Q7A4lvh-YFCSat>v2#bT<2y}VI#Pcmy;I}nqF0&nw$g;0~#j1;R(A#
zG6C)=W0;JE#3J?Decrq|w#>-|mN9k8@D?hxhJa<-p@2y0UpQEk4
zprWFj9A6>rv~5%j=p3+uK{(I+=)>5#o)oZp4r6-MySqKP~8)--FQz
zT^(KRt)O*%Ga?uNV7vvYBMIHU&Ie_q{=g)e$(>vd1n%&^SFTuf4nwo2WoR1W1hOw@
z0P9Q-*$KX_}Lp{ZBGunpI_;Ddb#82g$_si9JV*wEzh%A5NpvK
zY26$?w?PFxGpi|LUSq^OAihdDw?HZ=QwY)(t_67on$)C>%v5ycO-t8+(V5o$Sd1>k
zs8SVp9R`9#Km)x>WKv;zS_vw{_!Mp+N9qYxRVk_08&n
zR)l?mBqg=A`FRYl1DB9A2&4e(FsK?#k&BQ8nq8PSd>eEywqyhFAa^UrS#xa#ZpEce
zQYpG`S=-KIhEP!-rhj}@HToW>BSQ>nh0osB+6XNUxI;amh{8}QB_RqK9g(PxO2njJ
z39)GjF*%y}Y>gUI{$k0_b*i~F(z&%#L9)LId-o+x!IOh-6#CS?H;b&*1BZAr8-Hvsou_Ed2?VAuI>~wZo=H}RC
zVbue;3j>-uI@8&RJ5&cao)I%x>=EJ0tPIRG5Fej_!C8h-CVw$qfyoCWO`P1E{6szx
zaZ0q8rl%+N4>siG#2-3*5bO>^LmlBoX
z(Mj?MwIoz64G9y3p#rAhCex@58(?s)71#=4f6%T4Vyj@JJK4R-ej{TBo^R)@#1B{
zOd0pL1^VRNOkU4|1%q7+7WMWv4-HRfs#_No`0uE*++AXIXSMv+Mwc6FU9YZ2|3{ls
zeQw+9Y?fqN^+sE?gwJbM&1qK6Zi}4L88dsndTx98oMz?h43VHXA)vRXQG?}$im>K=
z3L+c1d6{Uh!3MsoYRXH>3ene>SwONdCqE0(?098xkR~y%tT;O{KB~AlFEKe5K3P^)
zI&5O&x)HB{4sX9!nPen6ZYU#fq_GJ@KCr?lI?o_t$ZB_Rdv0b9MmlA~cZ^g@v4p&%
zvqNHPYJxfxy>GC3A67-Et!`e>+uPaQ)YDhnR@2tq)LCCv*V%yC&MGrgGqQ8?6E$gA
ztfsT8J1sp8vz9OH>|Z&yy15o1k)7`{jH%Fh7<0t34Lda
z>WhPsKb%c`elhU#1A#x>O#0(F`SZQ-L?TYi_xNI)@XFTQ+SZ}g{-&<(L8E9GVH~5H
znd~w0vU+;@yA}*^#-|!4i)SL1i~`W4Brq-OT|Jx`2FKCRZo)7E(8!RitGj3Y`i&PZ
zT$-NUep3@d0=*Jv8X#H{*6|JhsuLxn2XL6^T574VKWu
znq?3_7#38NQ;MlayIR`2+L{+GUW~;@*u_J0GfQ*R3v&}Qv(=icgp9)Y^!%8VoUEcM
z-TxvpQNkVF2VpMKZO>bmqVs=K|uD0mQD{^kFiv4VF>bJMlPhXGu<^8a~eI)+J
zkK=!NKm1ScDqg%PdU{9n;F|ya^S)mmb^XI`-*>kJe0NO!;U4jq8$G;je9kTsez?Z{
z+ODj|_K}Xhj``gTh&kgRJ6VX53Yp+uuQ~e$=j&`*)xhPz#oXwK2l`0zl$?L7`}?DV>~&Hc_6_iJk%PY>DcYe$C}tHo*aI>P65M9%4sw&;zw8dM9K
zqiiSo8~aC=_Y98p^rO?tl8p51q~zG_oOJZEf)YqciqRyg(>3w%Co|KNG|5l{kr-l+
z_1(k6f`TOeVZoBN=95GcsU57OQ&t9&FDxhwRRl*dBP_BqbINjas>>=DB_>yBG=;f2#f9;yW$Bux
z($x0a^u_hQ%iHB^7ldzI7`vn1_i&fjttIYnuC)K?T*L<_L%zG6@Q3r^KYbGN@U_4f
zulhf~--}@cB)}!%IO=uc{tjm41Iw_~@$i!6orm=RCeT?)CK%|3B{W`Qw4Wch~!V
zx=r@cM&B>jxui&BhZY8Wy3Xg711W7?%X%PGdl}b=Hmc}%uNoa$E&3C!dqM>ZDw78nE=JD%{qqq+92#C&)6|rri3ia03gEwG
z6y~NCjFz4EyGq{F@uHhi8MIT~$817WDLv;{L^uM>iEuUX_1)Q}pzL
z?9qAI*B;CgSr^YwL(r$?*~
zcH3;K6bz@>Eshm*YFq|m1q1Q!%Z5hV7B6faWZpyf@RHtz!_C!Ixp}F12
zi}M>Qire$k>dOH8qN;}S%GSd4uCk2Lww(3D<;PYeoZp!I`XS9nCpF*PQh#+L{L#Je
z$FGL{_)h4buPJ`Ito-t-^2fUo&u)i5xfTBSX2hf0@`tzN4{x&HH-d>hx)Ji|w&LMU
z#RHHxzOTt2T$kU!Cjb6w&|@rFb3<|eTF`@A@;~2=`(Sa<*>c~X?#REpptyfYasRUH
z!4>Iu=cV7B5`J|ASP%I2i0F@d{J-2C^v&*wulKqwO7q#YApWgovp(J%-7_@OH8_H|
z(ciD99`bg`TNoT#%o$BjOjDEMDQ!wZ)55BK)>^(+`!+1T2rPEx046(lC*)-|*zOQJGD;xj|yG~&nzMYLM3
zN{}j&B;r&r_f#KG1Y3%Ng6iXa7UYWh^If-eN>+A9?p_*u9;pS
z9^8m}bTf#v$F~%mJp#~gY7Ic=?BNZ?gX=H`@sF;^9$pQ)e@*t|o65r-eur`#M?`ZU
zpUe9GB4mu>!R4U)msq%;6n%A6`0Zig_s1k(?H7H$NAdmM$UkgyIn^6ho8kA$M8NqS
zDFZ{p^9Pp>4NUY8YVl2A$6=j@HN9<63>Gf#H)VK(CXG%^=R;0CxehT>0n-W-k^pe;
zA6T?`%eE_5uM1`hQ!~$DG8uijCTRorZ1h<1n6Rh3s`0@GufIC(bfekklZo&*R=dBm
z#`o^1l|8;AdVE#&
z^t$r-_0S)#hkSiQ`TecX2e(4LzY+Z622{1=>22xLTft9m$)Dd2d3r7A$rb7SYXN_I
zPxGg@)Q@flJiUcqiAkQ`lItu8hj8}rMi6I@uY=L$kFEzjx-NUDgZqouL*LyH_5N_+
z`6`#s_D0;l6!iT?`Ta|>`WdwLuP*V<%LqBS
zBz|Pkf`vVcdxi&w7cq?*9P&6)$6KJ`NMm>5@F-`4i$+b_@S-u3Mkl88A^GEs_@*&q
zB&dwwWb#jBf}@bnmaW^bUb``4xRXgTnz1X`r1c-
zJQn)y3fpgQM}Ga9&x1Pw4{inid^hChSCs#7MfLeEueUb3f4oEbhclk{wz*xOaL1Uv
zoyAteDT1MB!FW&ef&tW(6AKo0EEwt;8d^ToyQFDg9f#4UnWDoC39^R2Wx-EWmOT>a(^6ZBA#SQUK*TP?14+GF2+?G7NEq;7E=;3wQ
zpI%ko-6Gvn=-VR_Jh`6q;f<^yr%O@l`ny
zGf(a*?ko#`t>5A8e&H)CM1cGK3vzJ$_blAMJ0^g!sWR$@fPk-yW6$?)UdceYI2Z
z?RM|ru)r(Z`)Y@mEFS<3ELu3YL@zd2q9L%Ov1qhCJUq(T;NnreQP4+VfP?#@MPoW!
zLc<+tw6=K3@bDOO79Hp*{WCH&q&2$u@oj6dG`I-4ZQZv0+Vz_PzDjE9%8TGt>zC;K
zaT9+I!ZpZLrOz(Oe!MFG{+9o<
zn*smuTJR4y0W!sNfbv?eMjwAs3gUgK6d3a8C|BUSWlTtXW4^K)S9+!W%P4xU&{1Egx2mW+%p
z)7r?g;W51}8e7KM@aR&`h8B+vjVvLykTQDb;Nr1qZD?c+S)owjz+Jod-ne;NU`{D9
zs>rl|!inT@P3Zl6I**SqD6${z8}45^zC1g<;PLgSueLisxhVhgjL*YM0WU6zpP%u6
ze9-NO{ceA~ocx!2q0g`T{__pxdq*ta9T)%caNzl6j(aL>22%xV1_nD8EgKqII5;#+
zY|%oDyB}y@u>PYB-XCoY{CZE&$D7@r9hW>hCVYBI^!&8w$qB!Qr^HXrN}gX1`r)el
z!JUv#mW7`wv;X>}kRkQ!iYM3PEZl=Yv@mQS0!Wz*SU0vCC>wINYy|!Is{GnOV7HB+
z*U9Dm-LfaQ8D;Y1Iw}O&OyLfiCy0M~Tk_$Sm@}~!$J0G8HF-a|4H<)2qy*mT!}F2{
zXQkhtlze|e^6;ei;R*Q{J4DZp#(uj`{*TA~v!s5n9IYN1UNW?JF^GBbqLGD!Sy=<7
zO`;!ACU6IoX_zt)*O?yTqsvCemUFgv$#Rp%2Yot!dYdi=Q*7f9Abxms*{R4xpxsMEY4{U#HweM%!WZ&)!`FMldqr;;6heeN%Ngf{;Jv{37;DqS$S+KkO`DNLU
zcaoP#1lOzNf7}aj2f;f8)}LLUG2FrH1ny5?k$%2iHR|R%?rU{i${kSF9#>n?}dghACwm@S*}Iu
z5(8L|Eg9!*$;V9~Xar!t3cV#ZPCdU)=Wl>s!J5674VaIIpUkw{m#t!X>Ll
zhKKc7A6`7Ph$-#!7w&m|!sid0CEx4~{&=JNv*SVc4@vJImOMBtdU#m)@RaQ7dBw9!
zipLkle|x3i=3>!}zQ8*pE`NGW1-OIYpWh4xsXt+;-8^=OssY>?*&Xy4F6q(eAv?Dd
ziGI6s?En03_=Bs`r#FHCcd$Ezib>;20u6Vf<5_}-&yajR!~WBL<(_oQpI#3m?EdJQ
z;_)TPqYL7Pfcq)Yqf>!TPbukhJTiG
z#7wg?&DOv%`Dtuy`3MW&k!9o9Si(Xa$j0~5Wh-C=<;#|@B!4bjwqk62C2R?64DOe+
zW>^Mj=o@S^C(;>JJb2S1&9Vs~9{KOyv+wpRcLjVUm~X$f7GsqeL>pgS!|kWF9i!w%
zmeLQ7Y*XjLpOAWtjgF2DEn7LZXnb&Z!=j<+yPG|(Zwk1$&hf2%F0b$Py0_itojo=m
zA9VcmqSycZRmU&avVS=2{KwTkKfK~|ZMD~Om0;mm%ko9*kk7!#=;DzvU7kya#}_Xd
zTiw58_4Or+&$o%c-V^-s2A});<&TdEA0HJyJRJB4a6jSy_>}PJdFk_uvOm34Vd_!-pm;j2tFQD?G1DO
z^ZStyGmo!H5W{(X8_^rnhB82?-H_n5f(lIk?4I&Mu+N(l-scisp1+~`{*vs`71Tx2
z2Nz`zE=nJrlRP*ldT=V_hYO0Y_XR#V6!G{};?KMM-`eEYUX^}%XZ^tF`q8n)OGhR~
zmnbQW*#(aONQ~t7EcT>-PGTcc4v$D+!~jw+a*VqEBabg
zYx)v*3`kF{@OXcZ;L{^6|MXtsceh2Kt#SKcht&uB!FC7B*ut^ptJycV
zY{^peOkXxOzHHf&)&1k^t}coAWQ+gz2SPvJ8u0x-8L{ClpM#OUvhvy14&lvy>!83)4f4ZG~A=3M;1)>wN
zHb1=^!NOhotKbfQ_v5%@kuI-}JD-cR)x!O%>@i$b;Qo^I(FI5v(W5hp7v~k<9TGl0
z9P#{g(sSVcm{JoVe)nwK!qL@uLdzI3UaqrceDE5dShI4~y0z;z0rWr;yTPDmY6S
z*KF9hY3q)idv@>Hzj@2{m8;f{Em@8~vAt&PhSh7KF0!86^SsuD3(*N~bH
z##M8)s?%+Ak9+y((uw6`6C0#Bg<8e=q%Kmmrnxv3@d81Z*fO$W`HBq-w`|@69vPol2`(9j;cbj>7+J`g*hTauO1gU0mHAom?(lyb=^F
z*Y@t8C9tw~KzH^XJNK@@Db}o?Y!j#%)}VecVW<;K8cB?w)~wwKxWD$=8-mHT!_<4Y
z;*O08UD2m^@@*qAUES~{BTP(e>9TRudP|os-@IjKO>;(iZX(8eHZ^o$2CB-+DnCDe
zd2nd&{Fchxs69>Ax7Rwov0e1~GQr*shlT|`%a$&wudBtpvpqdsYu2n^xpMXHU3+)!
z+OuKPhP4yRhu3UBJyG+?8tX6jD!
ze|RZ_G9-XEd{z4JjPS>cil--~PoUY(Bt1PQ`=|5b!F0vz
zSMm<799gnq<(dht(jai;}&2PGvZrYGi#h+bs7(McQS*B
zy}b<D({H@_wty5_^NrLFTtVln
zM@;UgAx`H*ogKB(YR>SiLH1}Mz=RF?ITc{_va-BDA=V%Wz%)j^y%-#wpjIX3#fNRL
zbvnP;<<fdiK9|e(-w^^+Ph=hh6AUsZfyQ&
zmDN}Kl%MT!|9ZRl5&YC6j6FUoesTgac*&D9vZrUH|L|7Ai4xDxmxy+196sJ3_~c^v
z)2qVA7Zrf}()j)-5JN&4}u
z>OY*5tt$^Wwj=%Y*4~MAt5>hyxO&Yx&Y-h7Te}uId;R9kTbC{!$5X{5;2s`sSc)4k
z#mx7ZHUx%0$(mM}3fRfX86XCf0eg%<$2LajVj%;G6f0v|dw6=xn$1ka0L0tcVg-9E
ztkC4=A7E?mbm-X0_3JmU->`+Xt2{Kz^tNvOW%wH#g4cKX?rz3Ri*|Db*0bkek|IpxVrgp&rg6Zmcigx*J4?%eh{TQUiC=DZ`f^Vg
z;QrNC;p1bX2MEi6_Kt}kALrmM`{}jtd;P)>7X=(Gakx6>`@{9nr&lCTE{mUCmA@q1
zuSx#=p8BJO-VaWR->kO%>S)jpuS7h#74!q*JTDFR>#`r;3q4*U`e2>U8$B*JmWY3T
zB^Z+Z$+Zw8xW70r|KW_{@e%RQa8=KR{=-Sd8!IJa-AT6(*Q{B)a{Z>AYr&>0!mzP^
z1AwBlbsIKq+OlQKww|5^c#>G05a0&rUEQ4g1AMSHpe@!D7Q|&@fl^Vg@pX*tBBi#Wl%`_aeVp
zC;R%0&o_ggZQfYa$N
z@!#%-Ah`Jmz2VUsbzRD`yX5Ib+4FNjKb#MKazygylgU3^R{rgH=#xXz>g8p;Eq8OkcC*Y02DsQVm2nt#6rq4xj0bd>+0@A7WM($
z@u(dgo#xD$1H^;Z@d5fl;do_Os~*$CV-PSF#`5;|!IGUoIXE8+P0q2H8z`0@IC^6J
zdWP4DZQQh3cMZ6zZB#M9He-M?sRv9M19TSd+qH0~D~sQM8_dC(z5-$yg)wGh-3HW{
zJ9g~awrvMy#lTp)TK0pPw=lG>yu1Rd!Q8lZXXnm6cy@jLeWf|o`IVKY7x`UXgUKIV
z!6aDE8XSZ5!|+xJ;-Mf(y@~I6Hdaoy?pVw;E5`5n-hj`yhkSX^_wz0OPmW3+ACWvb
zD1356_TZ%O;YrbxGt$SWB!9XldwW;nJKfH2ZFN168TsUW@28i7U!Ym%lH?g&K&GFT
z^u=}gi)%VFL%aXwji^6v5k1>2dVizmXJcN^-w*lWw(9wH`42Z_Kiq`RisoBr7~U8>
zX>xjc6P;(6UJQ((q`e`(yHI(%!{-m1{Ez2*{QN=mqe}r#uPGm04MML6l*}hrf_}It
zdwN#<{Hzq+C4M>=^QW`wpU;K<%T3RWxTr5K*KF7|v17yLjexbzI9dhfSmbTpvwJUw
z57}E=`g&sZZAoNUSX6j$c6xGzQX%qZ7LLT)dVnvmiw`s3y9YDlJCQV4fYJqCs+$w0
zb--LESSH)k%f-Xf+0)C_$=Mb(Z)