+
+测试集:
+
+
+
+| k | 2 | 3 | 4 | 5 | 6 |
+| ---------------- | ------ | ------ | ------ | ------ | ------ |
+| acc_dev 无归一化 | 87.81% | 91.88% | 91.25% | 91.25% | 91.25% |
+| acc_dev 有归一化 | 87.81% | 91.88% | 91.25% | 91.25% | 91.25% |
+
+最佳k值都为3,无归一化时,在test上为准确率:88.25%;有归一化时,在test上准确率为89.25%。
+
+在其他使用正态分布生成的数据中,都是不使用归一化准确率更高。在上例中,使用归一化正确率提升仅1%,而在其他数据上,不使用归一化正确率提高会高得多。所以在最终的代码中并未对数据进行归一化处理。在本系列实验中,归一化与否并不影响k的最佳取值。
+
+实验结论:首先,归一化并不适合在正态分布上的KNN分类。其次,归一化不影响最佳k值。
+
+### 实验二 改变分布之间的距离
+
+使用两个正态分布探究不同高斯分布之间距离的影响。先保持高斯分布的协方差矩阵不变,改变均值之间的距离。
+
+训练集:
+
+
+
+测试集:
+
+
+
+| 序号 | 1 | 2 | 3 | 4 | 5 | 6 |
+| ------- | ------ | ------ | ------ | ------ | ------ | ------ |
+| 准确率 | 97.75% | 98.25% | 98.50% | 92.25% | 87.75% | 85.00% |
+| 最佳k值 | 2 | 3 | 5 | 5 | 5 | 6 |
+
+可以看出,两个分布的数据点范围开始重叠时,准确率开始下降,重叠范围越大,准确率越低,k值也在相应增大。
+
+接下来,保持两个分布均值距离不变,仅改变高斯分布的协方差矩阵。
+
+训练集:
+
+
+
+测试集:
+
+
+
+| 序号 | 1 | 2 | 3 | 4 |
+| ------- | ------ | ------ | ------ | ------ |
+| 准确率 | 96.75% | 96.25% | 95.00% | 92.50% |
+| 最佳k值 | 5 | 5 | 6 | 3 |
+
+类似地,准确率随着分布的重叠而降低。
+
+## 代码使用方法
+
+```bash
+python source.py g # 生成数据集
+python source.py d # 展示数据集
+python source.py # 训练和测试
+```
+
+# 参考
+
+距离的计算:https://blog.csdn.net/IT_forlearn/article/details/100022244?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
+
diff --git a/assignment-1/submission/17307130133/source.py b/assignment-1/submission/17307130133/source.py
new file mode 100644
index 0000000..dc9938a
--- /dev/null
+++ b/assignment-1/submission/17307130133/source.py
@@ -0,0 +1,132 @@
+import sys
+import numpy as np
+import matplotlib.pyplot as plt
+
+class KNN:
+
+ def __init__(self):
+ self.train_data = None
+ self.train_label = None
+ self.k = 2
+
+ def fit(self, train_data, train_label):
+ # train_data = self.normalize(train_data)
+ self.train_data = train_data
+ self.train_label = train_label
+
+ N = train_data.shape[0]
+ cut = N // 5 * 4
+ train_data, dev_data = train_data[:cut,], train_data[cut:,]
+ train_label, dev_label = train_label[:cut,], train_label[cut:,]
+
+ dists = self.compute_distances(train_data, dev_data)
+
+ max_acc = 0
+ max_acc_k = 2
+ for k in range(2,7):
+ res = self.get_label(dists, train_label, k)
+ acc = np.mean(np.equal(res, dev_label))
+ print("k = %d, acc = %f" % (k, acc))
+ if acc > max_acc:
+ max_acc = acc
+ max_acc_k = k
+ print("best k = %d" % max_acc_k)
+ self.k = max_acc_k
+
+ def predict(self, test_data):
+ # test_data = self.normalize(test_data)
+ dists = self.compute_distances(self.train_data, test_data)
+ return self.get_label(dists, self.train_label, self.k)
+
+ def compute_distances(self, train_data, test_data):
+ num_train = train_data.shape[0]
+ num_test = test_data.shape[0]
+ dists = np.zeros((num_test, num_train))
+
+ train_square = np.sum(np.square(train_data), axis=1).reshape(1, num_train)
+ test_square = np.sum(np.square(test_data), axis=1).reshape(num_test, 1)
+ dists = np.sqrt(train_square + test_square - 2 * np.dot(test_data, train_data.T))
+
+ return dists
+
+ def get_label(self, dists, train_label, k):
+ num_test = dists.shape[0]
+ y_predict = np.zeros(num_test, dtype=train_label.dtype)
+ for i in range(num_test):
+ closest_y = list(train_label[np.argsort(dists[i,:])[:k]])
+ y_predict[i] = max(closest_y, key = closest_y.count)
+ return y_predict
+
+ def normalize(self, data):
+ if len(data) == 0:
+ return data
+ return (data - np.min(data)) / (np.max(data) - np.min(data))
+
+
+def generate():
+ # mean = (1, 2)
+ # cov = np.array([[73, 0], [0, 22]])
+ mean = (-17, 2)
+ cov = np.array([[103, 0],[0, 22]])
+ x = np.random.multivariate_normal(mean, cov, (1200,))
+
+ # mean = (16, -5)
+ # cov = np.array([[21.2, 0], [0, 32.1]])
+ mean = (10, -5)
+ cov = np.array([[101.2, 0],[0, 32.1]])
+ y = np.random.multivariate_normal(mean, cov, (800,))
+
+ # mean = (10, 22)
+ # cov = np.array([[10,5],[5,10]])
+ # z = np.random.multivariate_normal(mean, cov, (1000,))
+
+ idx = np.arange(2000)
+ np.random.shuffle(idx)
+ # data = np.concatenate([x,y,z])
+ data = np.concatenate([x,y])
+ label = np.concatenate([
+ # np.zeros((800,),dtype=int),
+ # np.ones((200,),dtype=int),
+ # np.ones((1000,),dtype=int)*2
+ np.zeros((1200,),dtype=int),
+ np.ones((800,),dtype=int),
+ ])
+ data = data[idx]
+ label = label[idx]
+
+ train_data, test_data = data[:1600,], data[1600:,]
+ train_label, test_label = label[:1600,], label[1600:,]
+ np.save("data.npy",(
+ (train_data, train_label), (test_data, test_label)
+ ))
+
+def read():
+ (train_data, train_label), (test_data, test_label) = np.load("data.npy", allow_pickle=True)
+ return (train_data, train_label), (test_data, test_label)
+
+def display(data, label, name):
+ # datas = [[], [], []]
+ datas = [[], []]
+ for i in range(len(data)):
+ datas[label[i]].append(data[i])
+
+ for each in datas:
+ each = np.array(each)
+ plt.scatter(each[:, 0], each[:, 1])
+ plt.savefig(f'img/{name}')
+ plt.show()
+
+if __name__ == "__main__":
+ if len(sys.argv) > 1 and sys.argv[1] == "g":
+ generate()
+ elif len(sys.argv) > 1 and sys.argv[1] == "d":
+ (train_data, train_label), (test_data, test_label) = read()
+ display(train_data, train_label, 'train')
+ display(test_data, test_label, 'test')
+ else:
+ (train_data, train_label), (test_data, test_label) = read()
+
+ model = KNN()
+ model.fit(train_data, train_label)
+ res = model.predict(test_data)
+ print("acc =",np.mean(np.equal(res, test_label)))
--
Gitee
From e4329d75feec87ba816c412d8d3b4a1fda1e318f Mon Sep 17 00:00:00 2001
From: lyukai <760492172@qq.com>
Date: Sun, 28 Mar 2021 23:21:58 +0800
Subject: [PATCH 4/6] =?UTF-8?q?README=E4=B8=AD=E4=BD=BF=E7=94=A8=E7=9A=84?=
=?UTF-8?q?=E5=9B=BE=E7=89=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../submission/17307130133/img/test_1.png | Bin 0 -> 31197 bytes
.../submission/17307130133/img/test_2.jpg | Bin 0 -> 694667 bytes
.../submission/17307130133/img/test_3.jpg | Bin 0 -> 610080 bytes
.../submission/17307130133/img/train_1.png | Bin 0 -> 48688 bytes
.../submission/17307130133/img/train_2.jpg | Bin 0 -> 798473 bytes
.../submission/17307130133/img/train_3.jpg | Bin 0 -> 703221 bytes
6 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 assignment-1/submission/17307130133/img/test_1.png
create mode 100644 assignment-1/submission/17307130133/img/test_2.jpg
create mode 100644 assignment-1/submission/17307130133/img/test_3.jpg
create mode 100644 assignment-1/submission/17307130133/img/train_1.png
create mode 100644 assignment-1/submission/17307130133/img/train_2.jpg
create mode 100644 assignment-1/submission/17307130133/img/train_3.jpg
diff --git a/assignment-1/submission/17307130133/img/test_1.png b/assignment-1/submission/17307130133/img/test_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b3ef8c56c035e5122cdfacd83b9c436051d4b02
GIT binary patch
literal 31197
zcmeFZRa9JC(>B^j@B~Q+F2M;-;|@WCySoN=cL*-Q-Gc^qw*+)|%korGO{8*OU>p(dGFMH6 zsmeJqxF}r)ijiSmZhmr{3K>l0`n)+-d5W_ql(nb(OS`LaF;aehqQVSkT$M77?W-RE zDfrw>z~OMR*!UEh(74^h3i%27y-2s=cRM8$28UBjk`&Zczq3;*eu%Ua)~4yPHMSef z4#0mvBn;;c_LRpBjfEIlzcfCU;V;|mK1SARpq z#Q %(LB(g5Yaqr7Be(Ri)lEW zQ}Om?-4?q`4=qOy0eDKPn2;XbDO8v|o%7aedZmRAwB6;|%D>5TIMkK40+ZP;_u6Qo ztE$BnDNGub03)w8`m}>LytEvY3IktvS{jFw{_Y|IAJju`!VR X>VMg zZ_ZHkOid|OfKG5~>hD+AyJzpIsVTjlFwC&q{k=T_4t$xr=#UAU=>p!8E+VwWlm^nN zDCM*pHIG~~*t>%F2R$V%chH^LlOKGxmE=vQw}%Bllah~lIh6vBP)ZnD6Vw?sMKZ^n zWcFdEaRScA3*W`b{Hv?~uqgr$`^;792W)u#+p9Hn75 )@JZ{XOrTKC$!op!@&RBkJjJ!L z?PYz}*(x_8;d?q=EPoG|Y3~06ner;8-F{{w(#weV(V92k;$v`*)IjOIzC5ENzygyH zchN?YlE{NYLzt&=K$|o-H#hJ#gzEV}VQBV%BqB_&lq^C&)mWDWU%tRcDir~+h)**% zv(jBwC5_AuX;j~N@IX5|I~(zeGF_TBZPQ+wK-(I4@f~>hh=YTfWa9nVBO{Q`K)f!y z1N>vnMT1(G@KM~TB$xsGQ?gaV*sJ}<8F zwi}If_k-f1^77s ?~Amm{VXs7-e|W zsMQSC)vU3%6x-L|U@ce{Ml5Up;8yTkL1}9xKDfk`3{D~pYA$9U(Rw>Djqub-73988 z)ZB*_Dk}GAUuNzf&Qqh#U(DwPcGh`V>?iq`A9C~en@=enCx{1y)fm_bhAtvv a;sj>Go;;<+V;>Os2%{MWa>%U;EgDfE^1{byQ4Zgw~Dl~ z0W5&^S-ID(GHk(cuw IFRZ1Kw3 zZ}o|X%~mHRO(k`A0J@-IJL#pdsMqi5T@LZQ_H!-kX~Ye$$Fxv6yt22IH8_K(x)uJ& zyL;atNZ$)o;9*P?k8GL9;jnRSj+#S)LYICfEOl(xb2e%n)?(2bk+b;YA-bV_ZVEWK zO~8FAI7T0tkOy(MQPJ*)WnMll5@SJ71a3Y@?awN4M$SRY3z2^VsOj`BygN)2G^*># z*oXJjw3rrbOZ#v3s(x~Bp=6s8ldKb%4UYBvLlFK$z*xcp%iRLYZ8;UVuQu1fz~u*} zY=w&}bsx>n&}1tA%Kcrb{aLWdCi;QzCm)Pojg6ug{bWyS8ST*E?KS*gIj^@T&qt_c z`%ZVv8aE^C$xR*%=I`*gR^gfmfyC#Qk%AMG>xZMbliT-FLnWDoOHQdvcG?nmzxKsV z-%aSEr$pKVBhhP9WWDd`%Pa_knA+Ll2I`ebmC3jI$xTB&@wnLr;6bHU?}UWT;6Y`6 zpn{~EFJDF?BJLK6Z8lMeV`f7~L(;vt8TFFE+j3GLsZ|zyRP^gqD<|=(=4h8R=&kX~ z9^(V}=VQ%St$7@22tT_+y*akq%@!>a(c~K|-_{(FVc^BrnV6OeIlo^EKy`3wjkFu* zp5sr}0!I1&Szak~Q%V9kZu#TXO%`kLf*pWbA)v$5Uw{TGJs^WJf ^hb~g* z1M{^Ct86b^d0aolnU0SxRK;-QCs)M&b;`-3{^IUFs@WC4N^IkDPI1$?qYz3=8qkuy z;9ACsVX-lbM*ZPz1G|zk>7d26{IT{X%W2!u;Kt(6&Rdxi+I!o0B)$@(vnl&BFlH 3} znSGJEcWdi75~@z5pQ?c;4`OD&jfVW>od44JA=0_wP1&>QMVm|DLKOfdA~*}Ow)H8) zg~>}7YT?Ts7vvWxiKY|C5iDItJVCp;qwjMEu>9Uu=#R4B-l~13>m#J?cSGRkbfjr_ z8GkDTwFn%n?L@l^6U`}VSl3ppS>5@VV%a2eHs==$4|WWaV8{cBE?4cWT4ADXi~cJw z;Jm*5P}IBjg*qaJ(gpt=Td~{IXxc%+FKf;plHaZ|mt6|0b{+)4>MD5d-a^TPF8vvD zvk#JlP_gcgSOM8ZeaH5UZksupRb(1gPnSxESGnhe3k#8f{eqB@(%ylUhJvr-j`HFL z)W;bClh22kw;AO4vvsl~Ncn#PjRM+r!u^*_BE`lLA+iExIuGFGY%A4i^&&+X4VKgA zp5y%`5R(%wQ4*cg&4+f2`=o>-sNa!2{%C*<75q*=@Ukf3uu0k?OT4bwxO%|Bj`O%X z-$+98o9lLVW2|Sf_^x3fRIPA?=^;=DqMziFox`cLenE4CPt8&AgYzb0L~CJcA4@7K zZ g&F=rM!V@=Vw>zr`dt;-@KL+n`6xE1glZqV2}mh z$6TU}X;G6En$eOD*>#nsn=)2X^(A63x`$FA_K61Tw TcdThgl+f4xV}Cw zA`_Cr=m-r=Ro0u%tAgj@tJ-qML+W-vLBj~-*6NEPy={j2f{`yn=KeV9*(tDU{j^gH zQ$O_zj V9!6{!zWp^~9&~ZYBux6{> z>Im=mzwmKA+b0F?!bA428GOW<>g5jB;-dZ%4dB?LFGlD|zS`ndfq|2fTt*Tq&Oa;T ztf_GkIc`k_It-`S{~*(2^1Z5%-Xvz2+ Z2ebsp`m_5u<2R@~MucT^vUR6WnOU<;FMlWC$- q);as?mv%HY&}9wb#Rn0bW&vu#?9*Ro;yHH=4?1`{~ooE2inIuk)6{x2q|_ zhF@@YFCY~O$~9EoQ$+&Jl0*Dn3!n)IJl%XMkCA^ZKvQ7j35EKy)=(6KRBBw)oFgUA zW%RGe?*EF^RHqi1tW%=;?s6p#4P~$`lseA9W@z%o_QQYB(bAn|ocWh3^Vguj?w$cp z5ZuE}_Cf~~O`bAh$0X9mg!Zmnq=~MUcvX8NFnYH1)BW&qGo4m3p5FR!@QZq+2S{6p zK@Mc#2Ynl9{E?J^x+q*LZ0C=p!7GisU$kVr_zO73C(~>1;AC5Y+duF8H%;YQi9Eu` z9jX_d+NbatyRVxcw7q4Vv|9m^X}!I%p3%eF2r1GitJY;Zr?e0BmmHhQh_YdL%2jl_ z=k6)}-b~cMtHXqh;w$Lpjo7Yg0%=Fm1%H0-wr*{dB5q;pQ)!H0I1=6g{=v8T)z6Oj zj~lqzu}68ycfv+c!14S02|3#jNlDj-0Re8Q5s#*Q=}l)aQ{UC^y&C$yMobvSy~Db& z41uH1&~%g*US~b!f%P`$2HUz{<)V1QJV1FN#^>c>H?;b>tTJWWruW}UXE>)6Ash z{(4K*q9QteXsr*7FVzzyltY4=g_zbD%8V{SGp@pfK}0{t_V(_UU3}rEZ%1d|+oa>% z*nt(QMPg&RzFu~8b|o~ZZg4OHNqX5oGL{$><021ck2~LveLkgG^jJe9^l^Fra(MK$ zwb?oNxGTo&k^SGC=skPeqb3Pf9~ZdmT@61K5i=|sAhrfjEWndw&Q!~XJ|;ZxnKdCm z>UIesAvCi_26~TGjQj-ISTYmL |61lzlz#m9!MfX*4rFen*{ z=@+dkJ9c^>1LJP1wujO$I`bB1yMfI%G^2Dq3}cOorI342NS*h39u-c9azv+0a-^zD zPc9x%0k{}JhenvX7iAz^2M03KEaqbj^Etjv6#i8O6jTtoWdWu?pYeXM3@!djI*8Tj zJe727<7=Th{_ -^oev=>n|Q4CC< gPF4&Lm-+VQe!UND h2HlL+Uz z$fZ6#@f1ZsXEXNKsk~-<&Dlfm)kA}&FmpHdd5u!7Cm!>XnRseeGvVrERxKgnb(5;W zLXjZ&!nrHe^}w&WDQMY)NWBt0rsAE|WN}LFTvg9+`b`wwCkz?I>8~*Gv>7A);R}Bv zI?FbV$zn2QuQFm^LnyoZ=y#u&8CH-ukNJX8YpX{U%k5^#8hW8ZAjbChR8gGi$nzm? zpWm!plm`6fIL*c^M|fr{cfXFou)JfD54wIL_g_e$8>MG`^r{M$D8&EJyJ7U#M5 QdFS@tP!Ju%JO3+L|oY~=?L8wxN}HqXb0bOm8XXcUO%ip>S-uh^&sWk zJK5xsg*gAm=%Ey)KO{h1<(b)n!3+MwM?8hbQj=wr!B%fS*jtI_c6XoH-Ao#4K^<_< z4wTC8^A`2Ok<0z%wEKA9rzdKQQ`7O?9+mk7*Nzn1wv`W<_z)D*60 G>#Q%wKDl*MU%npMiW@?kHULMBu!VgpK4Vd6zXD}@kgxzyW;m^V(`UZ!!;>N zqqUOc%Fe8K8kfX5>J@did{))XgP p|&KpdgGUE@Et$2`b;;46JtwKe)RH9 zo*xs{+BdfrzV`?J0whB>zqznTd?-Fmd*90jN1|f*@}AA6J#x-JkiB@(QRsY;ZU*U( zUqPw(Q{AbyFW)JSwPd*_WivZdtttwJTu~K~iLNdi&HitxflT6Nkt<^8Z_*MC;1I`X z|4+)F2#ikt@MJut!i%*7CX6a#sFQdNVV06d8ua{n-1&0l9CknaoTH*&YnO1AT4mjR zSMKIB&h6Zb6j`$kyt?%6*W8G+sy*R Qz%LT{qSZ-Rtot~Tj4=M}<16LCL)$Y|tptMX3W zm5tk_C{E @<9EHF zBq;|75LFYp?nif3S&6V%CrmAH)ZUTPV@eARN@;_94#;+Bf2KO4_34%ECzJkbh36Lw z%-~a4&Q?6lO=`jOSh^uy*W}fT*jpL~)%#59)>Hl$Uav}oi*K(^py%X;$~I-p5q8ME zDqdGfnU*xQ{w_j{%O9C4CLNS)Harqk?pq-3=!Q`-_w&7Tb_ub?{~@@Un>KC5{?(}w z7$@vEAu&obg7k~0hXxJ%mFWDR2{27)j~_54x9kM{j+_kqaqH_0^ApI}qjU>7(Iwz7 zgH`gNE6G};#NH*6$2gy_D!gxsNjQG4I=BM>Rna(AeYqC67U;1dnPu;bdVXft66b3f zOj&V4MzP*RTikhmvgN#x#w)T@BJVveZUoJ8xT*>Hddfdl#m+HMq+f-O_;roxqme9D zp*M(f0HT(Q5FtdEtrdONPl;ORxDQ-ktyLzn*&e{8fYPw)5zy^Xx}6w`j$D(T*N zrhb~!AaSa2siS1e_5-;BkEqR^z1v|JU)^uX3Vk=wVPUtPo)4~F3&+S^4pd+G5e&Da zC_^-5?0!}EzCK$}&R0LyByVhMyhyP=zvRUWDomX&^_V*w89*BS=}x|Mx!p9zh9myP zeFk0nWyXT45$>==2JxqjtYp-jNek(f<%S1W`RZ%w)JFk z+6JM9SJ5 TZqP;sA$YWlHK-!t~I18 zVZIXwVC4h5f{!ueVR0_f5}l-l-OD8=11(pUJF+-3tJexS3)}$xCfy%Mp#psW#m;JUpKC1T{B+x2VZs+DpzrAQ{UB;h-mHCDZj*|w< zp0zP=IYsi~(IlToo59zz1*a*(Tkl)JX7QNIpeqlwqpgE}0hpa6Zl~?7as^ERcgwp^ zYV1t4p5(!@u7;yTvuh6TU~B4ikM5D1(XhXkh<@w#^DFX3dy>b1YmjMdHd}dZJ>k#5 zi;QK+vi@NaUC>5v<&DV -42N5b@JlvAUThrbLgb^B|K3VPj#w# zzSxDe0cr)2jh0QNxk-^{e9 V%e>hC>B3Cpu z1ZhMYN9EsV1*=K+iDqFwJB !qiiX=*S-e|82_I$M#lCz+e9Tv|@g zCzd*gtKqeln@(Q^EyeT0d}v-|>^qOwX^G-L=85WV7N@hj`}td_CoZw!2N{(#!_KW$ zxHU{Glo@t|YvX4B@W DkT5!l5q?5VqL-De%Vu=E3$*K zpS>CW8rSCvm)5<`vq)X2>Ah rT_Nk5YrDp^aW)eq^HU*u{3bUT~*g z*>-wpECyBpTGP#Ay^O~~lftHh;>;CAx-9ut 02 z!95Fj>`KIgp^mRrYgX4dOO3x({EC~Ylpnc{xM#C2EB|wfrOn3KITd$jg=(nwN4CqO zq?VnK$l=PyS4R1q6{!y3{!K_|-|&tdRreR?@bE#y3D#J#Ap!i5h_KjzlBiVSl2M9u zUFD94p3yWV+Ep_D6`@hU4tx%LHWWZJyE*_iY%@2Wg;?%syY5g+r%2?E3H8Bjl$3KM zo3|R(lUTdeJ<(FGh{H@FPxd3h+298@n$gj0(LRSo+0q8@o#G^R_+wi|Bc|SZ3#Bh4 ze3xE3FXX-pUHd#`cC!BMCNM^QX6Qrc??k%|N-LH-S*My$`1i^?(xay08=X8Q30k&z zLFPbhPT6c~B5ljcY6Y;C%Y-8S*kOQ?LuS-CiVB!n |8`(1Yva_21qqX=0s`#qgrqwOV? zI!Qq-`hs0bRAR{{ZCk3?5N=9N=?+zt5(uS5PmJy=Smt(jS%s^8HvSkZ0(VFGnLUl3 zVfFVhnGcVy&$eZsd%DDIT1};0rGE2hz{I+oS}t>c7LOhU)>upDsn3wv1w|s*3q=t& zaS!THS(iG=dLL4V_vv_~{r($*RS7!y5;i2(Oq0AI*Xg#I&GS0(IbbD7`;I!hP<0!c znp%pVCMTMVbE=o3vIt&{&k1~A^I8% JKL`PJk5_qtv?Xkht P>Mtcl&U!SByYk(4xt}m3 zyLoj^&ZN$Ze=MyF{|QCvgsY8}DVxN1)B&j0m>P=g7YEt!SgP}2&z7gq4)&Q3jKLr- zWUYT+VtLvvZEsD@B`7_?)lDTDF?U8EE`WD~m{U)ZJBI}LBUE}@lXBwAjhrNV)=TXK z%w7*ii7$_c^r|>0-?@bc@>`{S) R85ibp6P@T{b1?$Q#2L&QBj7&8 zbOi>ZYVu@7yV>!}AE%RdFGXg!OYV!h>3N+$f#}_+JG$`voVw!$PWXgocrN6&>Hm6t zp1!{%w4g)nZoQ9oct`2asW^-ZP31zQ`Y>Tijz_vFQ^~gvf4aIL`-Q~~zl9Mq{#End zq$mW7&+h4u+D)d*%QaCco83jLU$Cn!{cnYZuZ)bSQH0)P+XfPs8T&wgYI YpIyVWPVYNSo(6 z)dS5@G1HH~Po;N-uQ+cjl^S73o4Y)W;(&`HM#`8zMB JY5izW2fMBB-Ri|eXSQO4p3*bjvx;+%FL5_E2-UQJ!>_UnC54r9oHd#>!jTo6S> zUJvR{i@Ta9U8E=`uQcCMWv$(-QB>=LL{N%SEW;!BuHDuLGX5cP8Z@H`?Kh!AeAd!D z9;K$HYLuJfIygGo|Hh;@=uP5w-EYP?Sf;$0$j^ugO_=PD?|Lp;cgmot`G>Q1hMH4Q zMJK_ZUz86QW&5o(w}IwT1onXD@<7jngsJDD>t@I%TIzswEa{YUv2mk`3JlIv5A uFS;P7djS@7# z<#zrZZD(!G@~1B~w6c 34L5u^&hw6Dg0|%z{41+P|BNeZhtE7mY?Rba3!isZ-G@FX zao5E@6Io#Gc$lC?Wb>$Mx#8mB-QB2lU|>tUu &K$rLf&UBl il95@Z46wH o14>}X%3qiz7+d*65(h;fX)vN4Mp1}Upl(E)hrpUt*$;}W9x72V8qwF!eAvW zy)>3IebuXDFkGMht+w>G7nUQJ*=7iqW3A})nb;qHHs_@%6H=DQXLA;@v}d~=)VRP( zZbb0%dn;8qGW&Ow+Fcsm#VSI)j_Z$))!%KOuszvpNYyMnl~JD+mrV`pLZe_efP8vL zntPu9E6*0R5FcX3(H`)b7dq+F1Lo7u-onF3{9Wd~hyx#yH$a~2))K(UT~d|~+1w(v z3r #G LE})33VLIrem{1;P#?&glgeer=?M-?j?lf5oa^js~=o8 zXzaACEGXtW^|9#Ar$jsc4kxzzjzC-%I4mAXTrb&6?bs)r4r$G LYEfpE72p#blxTMX(`Q>wdxCfcE<;-I&*f{6uU#Hai>B*xcVu@pJna6sBtBBv7{-O4#C0F(*30YCoa-PHr1$~%RJ)F#g9 r=ay{IkjS8am#6+oiO> zTzVrl5qAFArLk7TP(M%G6vI~oXM&y$L;d=ide*3FTcoK-HIt7d_Ky4)Szz#i-)bDV zZ1mwdm39 +V%18Y1}Sa{u(r;Dy1Befs7q~sc}LjN9D1NT%}I6{eM!)8 z Z7S{wG(TdfU5E6=3&(+D}w_LV=eKUfUz~T z89{8V65Rq3N8aN^9zl o(k#Ryi=K5Fmnodv*GCYK3|y7 zE0>Kz$=72JC%v9fCZJ^NLxLd 9z~} zkQb7|nf=(Ck}KX!!h$7Spkl H9dB|;lG%`^hH~+C4$Odi zOT?v?{g3@Xo>q1ROR`Y%Deynufi?I!223^>L#tU|h?*o ELAKE^k;c)`(K z#p2mS>=GY(euJp_@$s7qa){lc47!r8rXMP-q7n)nRnwDj1AbzbV1v0z>6LA>xx<5n zw90Vt!~hV7$I*VYl}g$~NqR%+jT|GMt*XhV`9$%(6 Bd>(OkKKdbA7XHYH5e@yY*g1 zT8%CRv+2@5i%uFs(h3{vt!NJ2&mZ1dlU+VKhvXDW9-3MGxhl_k6*{cz$p8gB4KTiJ z3ZVBS+{|z23N)xBE!3z+iJxZez?ZZuG&8CKOifPd&N;*xSfbw3rmx@8Rxth)vVAb( zp)cW8u?3-cf2L!fzVNW0$FOT63rr-p-$(GsVnZ*e_f4~UNOQUn(K$3il6D4|gP+WN zcRIREKe0ujgx&4Guy!cP{EofJo3nW89n9kN6PjbaQttN{l4PP|^ZmRsf9)9QBgHDJ z>2m2@&NS>1<|=vWG^x7O&Je|h?tUvY3LzehEvBhNp{G$H0S(eQZdTU-AK|`nV9JBM z40)JE_^xATy1j#(h}d?$DG!^{1&HO#Mti>SHtFTbKynw^wr65D$ZCGhAZ(r4x55W2 zxOrbg{Y3ShRnQ!mE{~J=Lu5<*I^DMu>T$iofH%)_si&2i$R(I%sjg^2ouf8#iXTEC z8^@ShtmgmbKR3ZjkPck8YSACJg2o0jzBDFzlO5U#qWQOud%lcN;{{A`cu-$F=2l&O z3BT2DN*6O)Jnaj@Y2n@J8o}CnI{v6{aQuDx?rW|XRW@w_lxL|QIIxwX=2-MT6gv2_ z)93K~y?VXqcf=C|@LmFdza|~nQ6w(2r?WjbpMUXKZEJm!10B6pfR16u5!^FjlEWh= zgyd-%G{!VOT*8bjOUazbMlI=u3RNRLZ>r048-YEI(c4d{qx;95h<>9Q%N;b<(6hIt z%XQQk@1n%k?w3IsoqL-=iVYm3Sbx}aw0cC|3L=Lgl~<{8=&XWM -|d8uI`6mBrwhjO|-(8x>|6YxNTIC^&|J zz!BH*{dEBR^`#&yP1%R5*f9!W_TGp!C@`&=>AGoPl9C~&>Q00mdbJIc`*X6)-X4?E zo-Qj {F{k2m*rw8ck)qj %yu|{n|^p74ajXWE(69}HXnGqy*8KDRiMhYr9h*NZhZa-`ikCUt)!hGSBc-o20 zyO?{_FiIZwEx6y4yH@2U`{k7s^QG?2*jrsJw%AUhTaDNm{;Ac)-som%!8$ aTC7?d;3? R z$CbJ7rMxlWPo9#Y(oZNNkff*D0RZ`ht@D7{WiG8{mh0~Vd+wM;MV}|m%xV?cCK{pJ^L#mJ zN5<-tIi(Sc^YKTz%#kIKs|Wc`WI{FLlmX?8`GR>e6Gl)vCbt`uUc&vBPjjs5DLqJ` zrAmkd20%u&%a4u3Iwv~ipi_>q>7madX?@~=x8@`6H-d)Ns95jlKh5eSi6+2nY#(yB zFcY~N#`?M|5;=mA48myXn{&2cOe`RfR@%80%un%6#^;3pz6K!ZaEdVwm`~69)~?-P zHq8 T%r1R}j#V7fAIDoN^8C5efMM z|!puJR{psNPknv@W z-Q@a t%!NlLY^&SdlocK`!sQsvC*Ub_6QK39yQ8Dd?p5h2OaPV4X-Cj9r zCc0} 95pX;}DhYS*Vuz6!Z57!6|@U_bqf(lb+XQogMF6 zueY@@Dk73$ggSq7QYtD(ro!>r2;tf5!gHR8U43%_G2E-ns9odxd5B$;mqWNpl?Eh_ zsf=N3Xw<$_5pM)VF5eN$x?9G} Td %8fXM>- zJ`$5wE&PtT`z|b47$(_O)NzYspp5Kw0U9U2n1Ty2o?ur$P81&qf BJEM_V z8fS?4Z-SPSt(G6nssCo-@NO(!k*wuhd3}cG@)((!TKyZl7T*1spGR+u*}aAa>0ZOw znq^Eba}`c=wN?I2p_-2UrdGCd&$ZHvKkInmAKe;Z<0DfKS_R^p(ddxvH`JQ#oojwt z3(n)MOazEN!bkUK=lI((QJ~ObU9!6;-Fsz%=h&}|AA%lq$R0}xQZWupdgwaJ83>Y5 z4`SBvySIXR{A0i!|yU=?w~VD(r`#& zb+_P zy-i6%Rr_cE_}9JX}CsfY0<6e$UyJNmk+iKQ z|H2h;U%4&Gk}%&a#na0qPeS?%O&o)^n?Tz3(27cX!7r!jgVzLAW1gh{WU2m~xE8PT z=+;U!Tsq7asZZ3SRiJ0UH9^hmY}rB+Eha=Y rlb+jS zLf(gJ8Ff}G8KxN6sQ<|cbI!y662wUkTH>uS;&~E7#n&?08Q;Js*Wti(A7beps(LE5 zUL$U{R*pu%qLW6D7oV_Pd7Cy<9`(KiIhl9UDY9PVY5lB5EC9@By|ZIGh3xC)cJY?G z6RlFqs*KSwp5x4yui{@eQ1UOCDkBTSMl|b1Kb~`_3O*X>r%;0epZAfoB>PTIMJ-%U z^wgYHF=?Sv-YFAB=?4!b^-v@$>~^ZDC0z401p_wGJ#uwrRhzSt;GiK?H4MgRe9DoR z*(zTa*zue~?uK?EZ*}{h$3?5BxatQ5ZMV~cYpjSz8c=^sm)P3sZFC^G6iK)4M7P;Z zl^3T$iBDzADtIzr)AjXerb;LqW$%}*%g=1QLShnn@KDX}Vc|y20$3;~FB?X5Kd=SV z3%d95B?A+agFBx%W7dcwZ!A AhS7E zIaM}@!SO%UB6gb+`KUPk#%+PDzY>wb4j&bjQNrz)|J1}n5vqrpR!yk7Bmwjhq{7}D z5L8MCP@f=z4qDUb>E3_kgQIv+8Bw^nny7AIkfC8RJhj{+tc&WXLM_NtN<>OPC<;Zd zW#|N8t9#F7TMT6TUIkWF7B!UvDHtu{GFpgy447%ee~tmAZ;R4+0X$6=is| wD?#Edq*41t53p`V(K^MOogt6ahKnlnsK1(x`8LQL3){nv{?^dpJ1=`x`_~ zw=A-=RxhAEAmO}Ss9xNDg_w`5+iM`jB4%|m_yQVNd?RL5uF1CHobDQwYFb{6*KY@K zK;nMg|0RZ (fOwg z(ed$#U{ 9p~d3_vg;&6JRpzhT`^>i>-Wl(72{2~YuvZ*h$}f)5R1*TVr{0An0)5e<=egMd0M^>Cn;J)8$_ztW gDUb zrx~+KeL8FZMHvR_MG&sPJdA(OJ6xq&cF6JPzr2-K7G3HM)?fnS20Oe>2nu3I<^X>K z0h;54^HBO*;1+N&35R$YP){m&*N0-LR#Es2>PQCK)PxQkzn!9=A6o`R(iotqGl8wG za{DMlZMzMnZ27@NMj%iEj9-g($iOSG8Jp^=+<^%DiJh;Zo|yvlj8dEtWSs+`DF)4| zS#K!hb^fqm|1kpp*TDD;UK(9!8nd+<1%rcF+cs*YSpmSRFw+9U5X6mADDHyi;P;Vh zLQRtY$D(}-Pl*7v9_R r5aqDw|T~H2=1yy7YVleRa#oxb#O@U*-=C8vo zb^(fq4ri81fJFyj0F *r>r(I;n0JfEKXq8}f){?&?aH1ZZqht<51eeLjQ1LltgN-`RH&8` zNykRbemrkB89eXvZhgRkM7wk6&bR#h=Ej>VTeG{#zK vjozzbyT#XCtGgi}L17N +wYozp}3fz+4!)AQ3-5zw1#iZ;AJn`{f_r#uxVX zCBv^AD{36q-ZlH(ab1a$+TX}af44hRQw?5cf4>D=5Zr2_5hjYd`T5Zr^YwKDa<>Il za!%-U!sra>rw-J)*p7^iW!BdV_fq%1!K>-=Ld?>us;LPGKTyyA@gojAWi2d19PGNj z=sEn3fB5(cdWNQ^m~MTJW7FR~exn1#hrNbM;1tX(y0t0-YblP|+BP+98_#N{fMjeo zv|ng=!_YV-7@uBNIagk$dIv-F%-3l(R$YLL$_4%D71+;quKAyY%K~NIA+RaUdrgBH zcsaj*32l5N*0VDRNCfo}Sn)wN``fom$Lu;;Wo7ta|B?i(WrQ`5gXQMt2F3qA`crp5 z2Wv6J)dmyb*)6TX`1pPNZxNe?#Y N z F7$LC9fNC;S zPg`0tONKuIG-4XOW?->|N>RAo23s&d_Z~$Iq%tuvy-`(-wVOVGQ$~U&oy@>B`7~|Y zNDejYYc+}2y$j(xXvHsaJ2D0B69~;iTY=r6ZmOg-=;Z;J&XN&i8{qC(=uHHV0jLRf z?Wa!Lp#9iUaH~TXqw8TO{UXBgEsvg!4J&Hf`~}vRvpGZq##5f ;xyd#T&UUPH zGI%Hw`z09AZGwBh{JXkj^8#1g=g<3G_QA8!&p6M17&ip8ZxjaUFG^?xkJwRqw|>+w z3jh4<71 ^d$o Su6vpRK|nC zmf4^vs0_-kb(j7@{3tL7tVa@0gj|1qNl#~cNG_mq0Una|gOd{ cTS-8`KN$%H@gFY@{QeiXK(I&v literal 0 HcmV?d00001 diff --git a/assignment-1/submission/17307130133/img/test_2.jpg b/assignment-1/submission/17307130133/img/test_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ceff6d6091c5d283fcba0023e053e079e4720d0 GIT binary patch literal 694667 zcmeEv2Ut_ b7b49lEg}K}(p!L#C`gr}AfTWiO{7MoNsV*? z>Ae%W)PxcON#Mpk=ggcr=gizaXZF7L%rpCk#Y$Og@%(?j^?vpJay)uG3pk^vrK<&? zpa1}L$UlH%G~kvd)X^RQFfag!0{{S807bYXfQtNxd m?2B z#(fxJxd)!Xr|391xwv^QToe%%6PH&|R8qd8a^t3^mbQ+ro{6d19q`?I=C%**>>VCC zI(d2f`1(Qp145pKhJ{B&M#U$*N=!al-HC#F?q6&&ix*xn@LT d;{%u|pfE$1lzYNL~Cn%{YDJiK>Qj^C?+LJ#AEgkJIgYHj*;g`Yq zb1?nuI3{0&f_x1sDk>WC?-}}2^k@Fd<9LcJT*%{b00SijS(qr90YCtWm>DGs_+$HH z4gLqp0OfJ-AM*P@@N@eEZ~g^yDUbX9kl#P#_kXPJp*-&YLw^5|-~Yk#JMe4e*Ct+p z@SSF`mvZGpK~~T(&5ENg;NjcbC;D!&w6@XBrWa{Ep%cygWBX$b{wZVtcs%&)BpcZS z;)1uN>^GyhoW}QKVYUeV#FnOZXU5b(568t;e>0buU`=@F$TOlZeglmNhI1vG3|(MZ zHHniN9-@_Pm%zNX&St$T2q0?IU`N(l2qr5)Dquy 24ZEBM_EBdR@;5ZEHiE$sy%x zNQpf+u4Cbs>iVqF<>LNcMOJA_HCdUx5oRYidJL%CZ|u@HJCM9ca7gOfhi{5fKE+oN z)S){#Q_OAr)+`g7lhS?)!-K8cmG!k>YN8BjPVvQ*!CFyfa2Dt)Q^X9@t{eM}{mqRG z+4-^$3ep3)7i;x#=)p@aK)W~rkoT%kAj1=oQI!*Dw76rtb5`R;a+F!N{Yx)WtC_^% zZJJ?I@LQOXAah*k;xQofzKd3QcTa^w$B$NzElB#2*a&bo^N16(nKQ?`gSK_awdnLX zdzDaeGqhVBBTBg^5Je2d%V1TH=xDHU=+@_0)+Wj(u@7sPBQx$bojMV(-L=&ckT!!C z6Wp&AJ5UF}6Z#;jyolLs#55*%Vb|pt5d88O5ZIWW&`a|}o&BJs@`z5Gv_%I8Y5j51 z9}Dq^MEr4U{DBdFfaUM2HLStdkh!*v9gIaoKYp!MA6+G1b1y?z^Na08VfR|NH^t$; zrk4QykhB7d&e6OMZ=}9hCZ{p|<|QQ`+-IPdLX++GZ@a-g-~&Kj)FXaMTrdXF5EmTz zft1^ <&TB<~YQL5%U)Q<7*y^|U8IJyB$j z;F$irLmP;TXoa0=oQZDFeLh2%Q|kJO>fBCU7d-q|>rk5Gp v<)v9x?sx%lb|11ny4;Mu{Altc_Z?$pc7moRfb7h79|Lf!0vF3F@R4ZH=}~Bq zX{5k_k)xgU>+vtkbv}@C?R9hzwg5Dsb^{%lWi!{q6#Urkjw!co5_Qkj0Pv{kZJLGQ zN`l(a$P91hCyYpI@~8gVbElXm%R^VvEFzw?bw>l#DUgF8I;dw;qc#6P?UfJjb>s=q z_m&I}omZ !ptYpA7boA_De!wzpys+qy8wG2njc7U|3`#ZD!W zwdu%!6+J@=X*&uV!VSUnj{#JeV?e@9ydU{6>@gstJgEFCHJj1@-VMfk44~#CuZivO zF<@=3=NO<(N9d?OO%6K5BHByV5PMjMV?b6YAjlsxb97Uh=@>8)T6q*@zEKc~cRL20 z=L{#G*En$u(3JEY1Q=^m}$XF7Se$?{L_86d*1Ai48j8do #Tt+Mn!1}s9d zhYm^!YR7=~O_=8~pjZX5jqG; p6PaB>S7FHY4T1NxY( zv#hPK$Rl0p=f{9`)}UiRroa;oU$UG*5$%~URq~w-JqGlS*N-D35wmH6+mF&2$p;Dm zcNLKpAO9(H$w+a00oJ(*K_{;?R9 >C8ux7jiEw*ouqPy09Nq3*^K6Gkk03Fd zzHu6jjOJ)nb(d72{W?SO_ywpAetM)=uvD@9 |4$u zJ8_xCS7uu)aL@~nY1K9N7=JG#}vFi`ZP%T#t{l-6oTHc2P108 A6bVQH&l*jGr1H`Ttcl-0?+vNq%_a Zjj{&B b@<>!W<2Xq6Vk$S32r~GjndW3`DNJa= z^u%;Y{M{_$@7!@l>k ats;*l(gx z{#k3eI+};XB!y*V)(Xy17E>q%Dt)h2YyuarU3V2*?b`vZH()f6SfO@{gP+Ee-m~Z6 zBz~kN?kTW=n{BZ}G73571w-k6$+KeUN3Ee39=*?ul8D~;T?PK{CI6jCt%p253P ZJrh!c>_vVHMIQqWF%@Jy(YGr10RFXM_Zw79 zAl2}x^A;!ysP(+{=aQq|l(W8#vPx%UY1k-MyunM_Pf>160?z3?@`z_gk{GIh^UilZ zPgzX*uYd1ry}s oswh$$)DwF znA*B35JFCK&@3TaKnFUNjR*pVPaKIS@z7X>jyR0ZI|hhx;6cZL2i+xPkJ=cer+w`z z{coNZ`BR?d?)2Hu=|+9U>qW5_-YDkn7o~`2NXYleMLB*zC|j!!xOpSFoN$$WWuEkT zv0ThAYj?Ul*$Ix=Qk*fSr$r)ZxX_NrH7nK%d;vR=a 6!Hx{sh!^C$5hJ>zS;yan8s)t@i0)U2dGPSjMv4!m5O1Xj zl|vEy1z2RZ=j2NL$=;$}en#rxX=?h=t*A8#?Du1U+}-b%YdH^bKxg!N(d;Mprb^#R zGLqGLjsHK#v%iONfBo9;hI#)$x$qyD_xJJZAHm6gD$I+zYxB+*#Ph8_nnJKh-*V)+ z+Pw_C#LX%!Q-rH=f9nu^yU<(l{OEWC0Q^3@?+y+(gSpKV+U~~EjKaiOWAfP$#UMRG z0qzBc5s8&UOXZ;X>7RFgh|XyBsH~URR+^970As+-s0v8aF(ATRJEF*;Pris_b$Sl{ zutPXb{Bxf2>Q&^>DTLEjs4+~n3ZIw(X)E}_0b x`Q4 z6c`ifvzmGa)a@1q6~oY_P#y8TBeatxAfdlbKy()5zz(M5AQT-rq&C9O2HsP-dvIZF zV;g87T8wD27U`?C$Z089Nv2n?Z8{r#O3)H~4U%lgDA}s_on*}#9skN|fUL!{Km8+! z{Qv5le=6kf9`cTnw)~u6I4o&fTmFh2nsfWx*F7qpzRV|T&PUucvtSZ!0Pu*S?TCHo z9`Q2XFLz}dAJEp6blEZCe% zx_6@PI_ &WgWpc2|6T(00X6BCk^4*XrI%)DW_{-v zAX0_xJo@tE7|?;zE!c7Rn@r5F&XG|Z|7zO8zb({1ISx`j$A_Yo)tu3%K}`u1so%^M zfK!swD4HW-;(4rF(-eI9R$WOV8mwU%k<(z<{Nl32AzPsfr0Gzj%5`}BUA|$=h`8Lr z$gq14yJ=@?oU}aT#yq~@S>BSK?9yWVDng+ -h z9JL=!&5_L{c2Y>KbAC{bF{ZpZOkdM<`&HVRgmyu5k{0qA&=wLrp8IsS6UhdRVm&>a zSx~}cHtv<)44&G<3vz?AOfJ9uxN*1#%=jY0WS(SYsIX5`A!nQ+mxAv9p6QqW?zR8M z%l{*N^IKF2+~Fvivtqq@_3+)Kd&p{&!tIcRGPCx#gJuisu6_4Z?5ncZnEl6nI&Rf} zmop#KlT^JNodCW?4o1cYM~S{a@pG$xfZrnMK0?r-Iow+-tFxbMghm3GSGDyHt sIsnJ2D!);?U3&JuQf@%P7vt`J|uN^M-R@XLfIy8@aqx zKSK)JGte8E q4Jn!nU6|K#BNGlzcS-R3*nkInZ{m9c0pTgHs=)zhAef~RXa zKTMG-M)aTQzg=j}hTkn-jT&ZOW`ES4ZKrZ3!O+McI#zk^_DfMsegGHSp=e>u^*>AF zFMHxXDFfwPfIR8siMME=5ZF{J{HzjgCKRlG4VkD0B-p{g{XX(FRY|8ZBzN-SfYPvs zhv2bUC?~&lRAD@LOuZ-KyYex)gG$l5@PxB(1@Q3-k`FJ9_0q*xp(FNEnc~sxu$6Xh zE%gZYb)Ri$q5R6AcfN!|)gIo`RKg_2+z=Z`&AzR@!B5bgAfA8r=ur7yd7d`lNrMtY zo}GHZ&J^%5=y?G-0{6%t6STguePkIV2LZjpSj%zhPh4+TM-Co5o{znJS7o} bY;V_5~ N&FGZ7p1_nA|`1qwfl{@GV>A{c(S!6sE0(i5G8T8g4e=b8lSdwc^+X-y3_z z?#^47Bc9 z68KP8k5XwtJ7{I+nci`}v0Hdioc)JZxsvx#uaPEuw|D6OuT1yfOO^evD?suGKd+aE zsbMTp_QMKLmRX;OdagTzm-oawlipguwYZ`URE(DLgp=Q_mK)=a1`MA~T6dg}_V}`k z |PsuX0~cvt{)|+Ap!HnrZ)r6Oiq&pU*FlD@4%>egKONM zo6g-JNK3N;A8n_rWj$vxB`DF%=MeUFAUbQS%EcbO{o}CWU4BLa=$(Vv>YXy@gLw?7 zrH2
gOm>A1C z@wbzGL7I(3TYXvAbm>dUHwHguMjcSD2md?p_>)@um9J3=i(Z &S-StMuYD6KwJv1LSlq%}4yJ z9ffK;&MJ}EJ-pdGFcL0>EiUyaa7uYrll{QVXv|c~@FYc>9x0Yos3!3dpN!V}AU`Cl zPxtWro~tva|L!!mHTOyWQ^xAFvm@(Ayt6Ao);=!&(=$R?Cf1U~;qz?8gOZ3l0X V?OjN>*XqDD|ODvkVHyJWi0ZT{T)sqQT$uoB$t*l~d zxUEg{bZZ(U4&_G4b__9s^y<&KRa&b1Bg^0o5aIHgfb@_Zwla8Di8Frj!&9~-n0MP% ziQPNF6tg3Fuk80enI$@@9yuhwT^RHjw4&<-eLD)0gi{bLYEV4h);!g+36;Fs_>oo6 zdKE##0Fw?%Fdw<> $x8%$U1d6LNkVksGuqPvt$izLmy7wj$q_b$J6i)`)3spZQA zPUP+QGf|*FDb%6lUL}pJkc&ZJM*HV}%hZek;>*kp!(ZIR_e@==vE?I>*L*U`W8fH& z2u}bn_58K#`0>|PyixwzO5cADOXa`;_ZGhZXU6-S9k?1~NU~_>7UEiqR{`5oQkt-u z%R5R`c-V6tLd|87X5*rV_AYvj(;)G{XE8kwzVdu2 K2?OtxjL08Z2o$YS x3r_Hv`~XCy}Vhka|d{B1=;RKeKb`s zS~?^Y*F5eGvK68b3iEpiG2>s`E!D&(hDQ^*V4CPLSi_}zmOiJW=j(iyCKaL@6gK9w z)_UjL@#&{xL8JO+19{u&8#DxSZOk@_sD#$(U%P$#Ml!cq8`VQUWWuiCg!7zMdR|V~ z?qvfCw|9ny6l-yf^{)6L$;laJh5b6=4%dZlc=>WULCUOAnad`N+r-$#X$&9h)(SnC z%Mms8&|P^+qJ;_KOEZc0Fp~kpuSZ{r%4W>wX=K)UqAmgNTfEct;kT#l3`%^Xbm%>Y zGFihGU+g^htkp0^y;`u+y~0_|o{oLhb^n0u)LK*Q{-<}%J@c_IJO+K`J?}nkv{?=p zu^ah1CS36DBQC=XlpNZ|f7JG*;;OvT>YSe;hmhkUxSJ@fZ-G)&E$taA{iGxjyO_Ia z`VR31uq<+_d6Y1>gv`r%i+j;@#-{H3dz-+QFMHTY%!yb-x(_^ZJ}jSyG{Sf6T^jEm zLi4Vfc-HjgRBa+Y*$qu)IVW_9BtH0j?&WK=c4wQyzHc736J7ttcbH{OapUZ~#Q7IY z%aC^no~EN74Tev6FSKe{?2buv>e$GlXWv^NZkiAXb(ef;$H1+YsaRcgUF6$zdXugK zeSR@>*@^CP%fm-lyIX0|mzl%m=j#q37J}E{1Bc_#kh${BEb9KLub7sSzDg;8n!|WK zwD@^bwdPjTUV-|Fu^kWSoN^_f)ck57xX%2j9mu(fG#*w}zPw;lJAF9_8%1z}Mr+W$ z5;gmnm~5q}!SR8YHMT%yH?Pufz^V%|I#qrS>m>cjwe1C=WPr~ebssMDLy2c3L_we4 zB$9`lcE3?Tq7mr8G}b+Xrp_2rxPD>So=VQWfs)bm@&@G2=Yl*fZidU+CCFxcrAlsO zTmGPeQAOQ4{71tWzonw}%1B?wp>Gv&$T`4gIx&B8bVlnzipc$rCMvIcW&|570;i2} zYfc?gsJUWstNz7e?JLVG`@$nBcp)4MW;iil`y=%E?W9%ZyUg_BvcQstE_gyXmh!|( zURSx)Fi@r$?-ge@DV9AyO=7IXoyWB1X2BE)zVBnsq&fN)xV!6|ou95BE1VM2{nWdQ z_wG`>5Jt;J&V4bSl+Z(Qbd_weN4^WRc$5BR;UJ*VCL`RCnBSnu27ViG?LR_th}=;x zuuSR=#`mkmSE|FpriJM3lUmn=iY0zT5wDX mfpSf11TBmzrDCN?`#G zZX`lt?tZ&oIGH74pZ %G?t@$h^>h-w0j@E2!kVF?;0Nzy3fx+bp6wUGekWOLYw(-%ruC4aM zt0ic}*4FvMc$=LaR}|M1x`JK`$QzGJj@vE$cVQa&`;SQ`PoX!ML-Mi8@AwN}x<-j2 zzxNFO*KB+wuEyX9@-~&E#Bg-4fNh+;F-kQ1@}Df06KNTCj2U(cuU5G)Y8f+qX@QFp z{Yj}rt63z=l=aH6F~qTw(dw3-W!@DLW#mMDSRmB(!6T_NYAy{l8ORLurcgohpl5J( zVAc{oA?)Ll>7ckOxy&w2kP&tfyA|mpS~kHifabYFUpIfhAl)QZ0+)*mz#FF1sWEdT zTt4l0W#^%~`}ZsC8;a%{Z$6YN#C*PPQQQ|joEV^{-D>86F|G2qJxFt7z?kt>yCRk3 zQD@0Dc=Mo&v(@Fn+cXtb*MvP8*oDrHw9GIAAIwnVOO1md`bqj?AA~<&WS3jRrw|@Q z?RpYNm_w5lPL=tO#TtdTv?VZ83&TP&HMkoX=_k_j!>;->R;|~Jq_|CEpMgh=T3?=T z;|Vq60(hTD*VF>aBBRpP{S`Ypw>!A*2CAvCkxTp88~uKFr~a3MKb4eYfJc4U6QJTT z;NREzK~jOGJ;b!-HtECp++%<^>EgeHFn@)w$MkDSCxtb2UYY|FE=L(|kEi4HA`sYl z^TdN0g6UD`W$5yCtae OKj)eeuYahDu?uiKHE9qHqy4i zqmlXWXf^IaIJp;(8dDxr&LqW+7Mg@<2yzxGOJ$M2WVo+B(T}?CT{AdXHesLztny*= zjLZ6HLtHtr_t&(y-Kx!V6(CtZ+N>&N_W2nepDF$$R(uu9_Ibm^0KhbGIfT$l6NYF| z11|Jw@RMyOHN=Vw#D!e%fiXM=9LR&h5jZBnLtgNN>Axdy{Abw%?}d?t{f!?kBDkZM zo)_;4A>=6TvY>9OfTw24IGdX=DD=ism8+MpUK`K;!L}S8jCPBvwJOH9nI@Z!xTefG za;1SNHA2easpuvBJ7)DYftpqU=}Gv6G~-agkK^0E@NgOHER5}~`XP;rcsM v zFZ)*eh`}_g>q;@Mx$0psH2u@qFXCR1?xm7T15U}FhWb|$chXSMk=-nRXa0@s;RJ^4 zZ{NIDn%ECGu_HKbEIbiuxu$Wd)R}N MEMyK9rJ%gN(0`%q$tRXu zU(bXLMv-Fh>X`l}v|C6KQS~8(8%oHw;L`!hd|#QM(xgwn2i4Ux*d1;QK~HN(#Y(TS zK94qbwvvKD2--*O0hJMZZ-^GNI?V}_EIT(EgPRvB3}7!ajylK;B%c`FONPmdQts=P z?y6~NiG(j#g-&MOeQ=|S+4S%UH7pF$Hrl~v#w+5Isxcsg*{6;uUb8A7lSD#bC-Bm? z7(~ PvYSs}uLRkp9& z7y!zn>}M#PjxOWVvpSvWgOXak;~g5l-gr5JQXn)qK2ECWvp}A|K%buDK23?YnLP%C zbDVE$#7R8P_Jm_a)`sio>cLU?=Y;FkZ`m`;w1+Wq TEoWk7pw&{(^~APZb2}F%X+j!?aadOa7x+`MmE9`n`fE8f|CQs|F>XXQuOovv z3o>isIgrFBu_gXDRw^6C-f|P-;7l#>7+}pYb13FqQ7rOTT#H}LoTm7XoCQtxWkI%V zY$2TO%Q4^?weHYsW^MpE+vWa su7~mrKXe-D1^8>}w@U8`M zw(TiXhPWd5E21~PB$vpAclik2GPe5RQXy|SFRT9|y$BG<&VIn2wMOoBrW6YkJ_c}j zOZu(z1iB_ko}G};!RD<9_jq _QRyg(Yb66S8@53 ()loDCYppfP1`#?UX;5M%j}dAxoW*~~P-YB*R}FKt r TW=4c(k$@i#|-Oa%@yx)O<|Ra>iO;K=BI<6x@E~N^LkBJ zE7*Bd(VpFB_sSI|>O`1E*K>Ld8bJW?f%NhV`%m`7V1l#D^dDOildgq)B803;^mcqs z8STiAVb5E(Kd9ql=d`XF*wHv-ZR{$4XgvKSdaxWXV?($NyI(S>^}f3GuA 4lPN7}T>zmy>PMUgItxZ{Dy2v_ zPC00OCbt)Klq~xJEwm%8jJsbW6C1k_4T^o)q@*(Cfi3k{_k(ntcH+jY?-GH8`@~0m z3MQX7H@7ESY6@&ldfbM0rI&&>k} oj!be#TP8)hWK$_PCek?J=N1tN46XGI}H&eRjr4X+Zl#T&+cC z5Bs6g?6>TYMjk#E40d!vBIu^xY1k>uGVT^W7YPIPABn>IRJtmP0^fI(-n;g&3+Lmm z7;p6X%1M;At!4~|JeL^&ph|I-kEt0Mb|}~)eYz8kIAh>-y0EI#+;Di?Q>H0b;b095 zJUTUoF}aEloRf6wF~bUhY;&h>1sgam_Lh0bo$fHC{kGtT9IXD^HV{Z6>la(x4ZJsv z%N4{=GWpsZ1TPX!Oc7~95oqE_rwcan|3rg-|D`H;SWfbLusnayi4^e3_LcmkWE{A| zyxZ |f;{N)V+PMYDgkZyAa%4Rxxs>9OebUhUMTLb#s(1ti zByv56E6d$<_K2Ny+4|mu6Gy+fRqKVQ+h&PjTC^=N=Xum V))s@DWC|q*n<|^O!a3>lv{|jK8F$XC%KS*dE8)UOuVE%=B#V_Z zoV_$~Lt`U4^nvmB!se2mN(J138xLAWIay1pGb_Lnuh#R_ m{Y7Fb0{)@ixV-D0_-IF4K0Pyls2*z(t3iVMtcYGyTw7WrH-oa_P3ONQGL(Ogz zg)wfUo1aETa_nBmey5;f(wm*19ANxp7$@uLTX~Qc9{%Reh51C+JDEttwno&4YT+oe z!OQ9q-*Sy0VS@E%THL6vY}?-5A@$O1=Y7l!Yalz@zbyO-vE{IF&NRPMJPf4*PrxD2 za9k4J0KK-8+fy{rDbA-1ZXKB9i^9%Kn9RB6knJ&Ai$~R$iWm-`#qbs8Qk}c4MY{!w zW9?D+UZl|UM%XL 6SY>1wsx-evb6R$EAF3V2VW($kRF+i*C!2r?8nvRCUqF%87sv(&s3GOU zC)C=x;OpsI)WUaOIbP|yu39QSWTt$j^PwGdVxF^U3vjg7Y+lQ;&!1u6BxpVK9L+RN zi4Kq6)Qo*o*ns kTvAiZfbVj zKyILa*4eP@rr1ph9Gx|f5l-=)b`M@K+6=2#S-CG(3~FuL{Zhz%L+qPclsOTInb`=! zg099>EVX#>DRaHx5N66l4)i=l2*^X8rwKUsH_}g-UG!Gwy{bGFcRc{y U zfwg+y{(&I(EOr2Q+eN=r<5_0C9R3aAAylwIB|1ehop;8v*}X@An}T0^I0NrOu!jn@ znnwp{ }+zH9xPpyG%>9= z7@wJz&!%5}{U^VcLf>fc@ovEtx2 eraNUR`_Yu!NIu#-USmTl@QO(lk_BM%qoMVw(aTS YwT_qy&UA=W@MI YH;P269F3c+GF(#|Zoq=8Vf4L=yN2K>;Qg#)LHLnvLN1borFK{z< zRyL21c@GH^?~s@mCy3LnZ|}h7!swFAn^mR1lPEG#9BS%>N5tFxd-7Fv m&I4>gGH4e4$bFn&u&m|r%6|Ro59>6a#@DqBW_tP9%{XbHx%G=0hVL#8 z*2s;J{g#7-)f4|WukH7E|8E=E1T8{Nl2w>CaA9;0b%-w|E84~<8nu7Z!)B tdspr Y!3@;fsDt^{UjN&wr4zoP!n&=r9SMIT2G^3y^ovr>Iy0`dYxsP zbeqg$lET~0ZABeP9nH)z`be|mSxqp)!y1A^wy~!TvK-#r>rDn-diex;1vzfi3tq}? z5hk !7W1!h7js}-58 z)3ai_Sr()>$05FbbJa{|HkfwJ8cn$2Tsh9vIOR0=H8Eb_pVNJ{*5@SZM6v6|nl$~? zFlpgur7{a-R);Gs+DZ9aN4=2gyLh1deD@{f(^rpd%3Q2U_d3z2jRv$EtCPp0>2seG zK>nlRJwoqqr2)Qjw_mJZE32ujuhg&6rFy9&Td2Ye`M&F^W_+pSUE#CKLM41rq+Zf1 znC8c|nN#v1A4^`MBTjF$yMh8nV(@puSl)VY1+lO9C7 >EFxmr1+#_1g)QxS9pQiKsoar R>bFc@o^#4s-1cM| zP0!Z2wk4hkdk#@r>@)Fj$fcXZ;~d3Z2EbP-Lv=auF~FrK@-R0{P2B-q$6_CBa4qf1 zJ40HlDlVZMxQ@Pj>9_vxKhw7&!U>R|2AGKWiZ7K8QX%ce&Q9l{xpyeOm)vAJj@< zEDCe|u xIFy1*%|7Um(YnO`b!8`?+d36PU6~5pswD_{)B&x_FyC)1L#TI2b~?Z zkxlxXVRshriN^pon3$u|SaHS|Aq|s)dD1`%DU6hca*{rY&+Kn&s4S^S59FdPk_#5r z_)16gC{pLWUDLm(>bxe#U_utVSF^EBUqa4i#pSe{_>>BTD@RpWS)`@)cq8;yJ68D( z&BCtX Ij|wUS64+J^l`M(1ke((2&bi?fG<17%Km4F*4pbxRfKM3FDZ zC1j}a2NUS?#{k<$`K4=2FW8^h8OqW#>1}p?Uj33!_62>r89HUNo@K9reWNsLGf}LP z$AHH@QJB^1#4-jY2ge)HK@z)xxFGy7AQ$#vfWd@ x#$!R7CoIiu zHqoO`=WH-7a$wo&Tjwe*k_ Zz9D2 u%O_LDSr`lGWXBumHxuxFj2 !t8d70xt5RPptR1QJBx zsCVWwDY?a;u`;uIe6>lqluv?nEw=nXo65oT6Etbfky`>%a=6dGU{*3}`q5dmW}*sT z0P%u1R#d-5o$(QKq4XD{vcIlk>tFZ|h!e&q`{dDIDLxykJ}PyCB8nt}=f~)4;?>_j zm$ >#J{E1 #K3jq1>OM_&yg%XF zf0iEj@4WZ>b}{=0zD4YJsOYBTY&IW4g_r41*{?k1&jy|A3CdDNHqVf|qLrayVIFhz z3E57vKMtLKRsw@P_o%~*;MGLuexwf~+`OeO_SSPZq5FOmAa)|&(xS^zb;9zTu8^{w z5ETyz(iB}0s%c!-?`bZv3p|fil5aNlUNLdeoT~9r&-zNH=fj2Ys^G8#1^>;AJG^r* zyBk%pkP65t_}Ouo9>y##a>JcrHq3e!NfTFuPy=wB(-y`;%26dr;dzb-Iu|MFSFNSV z<3$a8hhV>mH}(R`(2*!TaAn>y)H!ADLS&MF!I$yFU5$FO8H&xq&Hl+V`)e2Zm**cB zqprMY6A!yH8#0}p`9#iTw@cbkQlab=#pc%sU)}}I^*kYx8=v`{HlNh*%_qkfwtC13 zu5!N?i TlAG tv3mn3~?MHnuB>ldBch~BYwm=hdJKyyZH#pYa$bmNQX|86GtC2e834xZSg_TUp6 zyeKN<^C+3VLCQy}tZeO3ftsn?4jUJ671`81D%K#i?;o`&e*-<0v~9YY#bx_Wra~ zqoh BCcVN38RBz~cx9HL zvv+EaTw3=g*%2qvfDDF95#d;H3qfC1(t}Fo-nV}7f+TL6kl~tbsgunkuf)MId8qof z)Mmb*(56Q3kNPQ@6XiXRu_7BS^J^r7rT&d`VPh7wvR@PVWhF*nyafFlSY%U5_!FWT z%e_@F$2KjUgYy+jQQ>(qj33qrhVNK5%v*8jU%#2T$!AMKLq5zagQ(Y0e$?FBrX;4$ z%a%5=KBz#W4%xokvBX*{w4`lA_0(`=p+&9i#Fbm0&MK+~2ShEd9Rh~y8S$KRT5*p4 za~lG@@2 >$6Wp)F-V*VX%@9Oj 1k#uWT8cw@vW ZWrD*5Uf7MvcjB6;K_K+$~ZCC7Mn7 z)kb{FkZW(}>X!I%M ka-^X(9f>@2c>p7<4RxR@r^`K7f z1z2I^J~jKx0_Sm!a7s(3%9j@648+ZR1VE>dpLb3$r2I!r{ky!zZN^qjD$ Ow1r_Cueh!es0U{;wT>#6H86HhL@I;piuw-7gsVkA0X z!rL@X4=oQ!msKrnk3PY+et+iMZ~~Rl(T(c&-Y~lE#IdG=ygIZ;RB9RW-2Jh=qq(c0 z6p2?%dN^e0dQU1BEz$^lq9KP5pObLDS9qc96QkOX3tFI8*zF{)izqLcbcO}q`D#g@ z h>K&j_J6G15usEf^5N c!-4)`X0Jlp(B?x+WJa3Y z5Sfx@!L71pdGV$1@SB}r{x54OM^Fvn@&WvorSta#lyfq tN<9W`Z)4w^bZJ%wha}Q@8o#O$ p(MvsfQJ}rxChLN zRB0GmF!@M>{&VcQMHTqXn->cKwr8WrY;Z>S)Ht@H`V*G%&6#_dKKDXuR7#9b(hS#E z$5Ae^X6Ju&>t9`NyEFg2g563)9c q=e4j9SqxfE9VHf!g#Ns@1baA-2yhzVPeqZWtsZT4kP=&;F8a;g4 z$mrulGD2?WF(?u`V%3qN$6p(_(%F)7@eP)@0bG5{we(uvRWp7az+;PBid`rXhrI7MOn(Wn9=iOYK81_Tn955Vse~AA>;Jt@tz6;Nc0fM1Hae+1t zA6ph6H%qli!#^NQPr3^pzD{`^=%sZG7|__i{B6bIi}~Hu?T(p#U^)sw ;g-x!p% zE|wCW>!=ESKi|pTyNQlHla(~>WZ55doosT&YkVbck?Ix)!^7lP2K>fgdp`!0mr$Z> zhrIYoOpiW37p+?h%wxDro%#5L8TN^m^Y)FF^v_H!E|eyL&b&9PD 0+ z76;2uQ7KmBwW~j2-ysIQHEJ=-)n+_MS*<-3)Ff9(L1^@H9_uX{SHyMZVU{;gm^M?a zbohF$erEGPeOixjN0x}|Bm>1TN_a6!$FfECm5=h-=rhi{UUP_zCLfO=k4(I+epDdU z1%}w}X#DH~I35Nh_m-FDho