From 1352e756f5912645a412ee5fee27b0997cd64ec7 Mon Sep 17 00:00:00 2001 From: NEU-lab <2942375747@qq.com> Date: Sat, 12 Oct 2024 19:57:36 +0800 Subject: [PATCH 1/5] =?UTF-8?q?capstone-4.0=EF=BC=9A=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: NEU-lab <2942375747@qq.com> --- thirdparty/capstone-4.0/HPKBUILD | 62 ++++++++++++++ thirdparty/capstone-4.0/HPKCHECK | 33 ++++++++ thirdparty/capstone-4.0/README.OpenSource | 11 +++ thirdparty/capstone-4.0/README_zh.md | 9 ++ thirdparty/capstone-4.0/SHA512SUM | 1 + thirdparty/capstone-4.0/docs/hap_integrate.md | 78 ++++++++++++++++++ .../docs/pic/capstone_install_dir.png | Bin 0 -> 16523 bytes .../capstone-4.0/docs/pic/capstone_test.png | Bin 0 -> 41158 bytes 8 files changed, 194 insertions(+) create mode 100644 thirdparty/capstone-4.0/HPKBUILD create mode 100644 thirdparty/capstone-4.0/HPKCHECK create mode 100644 thirdparty/capstone-4.0/README.OpenSource create mode 100644 thirdparty/capstone-4.0/README_zh.md create mode 100644 thirdparty/capstone-4.0/SHA512SUM create mode 100644 thirdparty/capstone-4.0/docs/hap_integrate.md create mode 100644 thirdparty/capstone-4.0/docs/pic/capstone_install_dir.png create mode 100644 thirdparty/capstone-4.0/docs/pic/capstone_test.png diff --git a/thirdparty/capstone-4.0/HPKBUILD b/thirdparty/capstone-4.0/HPKBUILD new file mode 100644 index 00000000..bb95ddcb --- /dev/null +++ b/thirdparty/capstone-4.0/HPKBUILD @@ -0,0 +1,62 @@ +# Copyright (c) 2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Contributor: wangjialun<2271411@stu.neu.edu.cn>, zhangqian<2371418@stu.neu.edu.cn>, wangyihao<2471389@stu.neu.edu.cn>, wangying +# Maintainer: wangyihao<2471389@stu.neu.edu.cn>, wangjialun<2271411@stu.neu.edu.cn>, zhangqian<2371418@stu.neu.edu.cn>, wangying + +pkgname=capstone-4.0 +pkgver=4.0 +pkgrel=0 +pkgdesc="Capstone is a disassembly framework with the target of becoming the ultimate disasm engine for binary analysis and reversing in the security community." +url="https://github.com/aquynh/capstone/tree/4.0" +archs=("armeabi-v7a" "arm64-v8a") +license=("LLVM Release License") +depends=() +makedepends=() +source="https://github.com/aquynh/capstone/archive/refs/tags/4.0.zip" + +downloadpackage=true +autounpack=true +buildtools=cmake + +builddir=capstone-4.0 +packagename=capstone-4.0.zip + +# 为编译设置环境,如设置环境变量,创建编译目录等 +prepare() { + mkdir -p $builddir/$ARCH-build +} + +build() { + cd $builddir + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" -DCMAKE_C_FLAGS="-Wno-unused-command-line-argument" \ + -DCMAKE_CXX_FLAGS="-Wno-unused-command-line-argument" -B$ARCH-build -S./ > $buildlog 2>&1 + $MAKE VERBOSE=1 -C $ARCH-build >> $buildlog 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir + $MAKE -C $ARCH-build install >> $buildlog 2>&1 + cd $OLDPWD +} + +check() { + echo "The test must be on an OpenHarmony device!" +} + +cleanbuild() { + rm -rf ${PWD}/$builddir +} \ No newline at end of file diff --git a/thirdparty/capstone-4.0/HPKCHECK b/thirdparty/capstone-4.0/HPKCHECK new file mode 100644 index 00000000..45087f23 --- /dev/null +++ b/thirdparty/capstone-4.0/HPKCHECK @@ -0,0 +1,33 @@ +# Copyright (c) 2023 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Contributor: wangjialun<2271411@stu.neu.edu.cn>, zhangqian<2371418@stu.neu.edu.cn>, wangyihao<2471389@stu.neu.edu.cn>, wangying +# Maintainer: wangyihao<2471389@stu.neu.edu.cn>, wangjialun<2271411@stu.neu.edu.cn>, zhangqian<2371418@stu.neu.edu.cn>, wangying + +source HPKBUILD > /dev/null 2>&1 # 导入HPKBUILD文件 +logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${OHOS_SDK_VER}_test.log + + +# 在OH环境执行测试的接口 +openharmonycheck() { + res=0 + cd ${builddir}/${ARCH}-build # 进入到测试目录 + ctest > $logfile 2>&1 + res=$? + if [ $res -ne 0 ];then + mkdir ${LYCIUM_FAULT_PATH}/${pkgname} + cp Testing/Temporary/LastTest.log ${LYCIUM_FAULT_PATH}/${pkgname}/ + fi + cd $OLDPWD + return $res +} \ No newline at end of file diff --git a/thirdparty/capstone-4.0/README.OpenSource b/thirdparty/capstone-4.0/README.OpenSource new file mode 100644 index 00000000..242e23a8 --- /dev/null +++ b/thirdparty/capstone-4.0/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "capstone-4.0", + "License": "LLVM Release License", + "License File": "https://github.com/capstone-engine/capstone/tree/4.0?tab=License-2-ov-file", + "Version Number": "4.0", + "Owner": "2942375747@qq.com", + "Upstream URL": "https://github.com/capstone-engine/capstone", + "Description": "Capstone is a disassembly framework with the target of becoming the ultimate disasm engine for binary analysis and reversing in the security community." + } +] \ No newline at end of file diff --git a/thirdparty/capstone-4.0/README_zh.md b/thirdparty/capstone-4.0/README_zh.md new file mode 100644 index 00000000..b50ccc9f --- /dev/null +++ b/thirdparty/capstone-4.0/README_zh.md @@ -0,0 +1,9 @@ +# capstone-4.0三方库说明 +## 功能简介 +Capstone是一个支持多种硬件架构的反汇编框架。 +## 三方库版本: +- 4.0 +## 使用约束: +- [IDE和SDK版本](../../docs/constraint.md) +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) \ No newline at end of file diff --git a/thirdparty/capstone-4.0/SHA512SUM b/thirdparty/capstone-4.0/SHA512SUM new file mode 100644 index 00000000..7b66efd3 --- /dev/null +++ b/thirdparty/capstone-4.0/SHA512SUM @@ -0,0 +1 @@ +4831aaa1eba6841946da736b4bad9772c9fa9c8f3c35035df61215cde0c8849cebdf2080ae0c87fd380b5acb2c6f0d8516e215e80090374763454ac8255ef558 capstone-4.0.zip \ No newline at end of file diff --git a/thirdparty/capstone-4.0/docs/hap_integrate.md b/thirdparty/capstone-4.0/docs/hap_integrate.md new file mode 100644 index 00000000..ee131c20 --- /dev/null +++ b/thirdparty/capstone-4.0/docs/hap_integrate.md @@ -0,0 +1,78 @@ +# capstone集成到应用hap + +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 开发环境 + +- [开发环境准备](../../../docs/hap_integrate_environment.md) + +## 编译三方库 + +- 下载本仓库 + + ```shell + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` + +- 三方库目录结构 + + ```shell + tpc_c_cplusplus/thirdparty/capstone-4.0 #三方库capstone-4.0的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── HPKCHECK #测试脚本 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md #三方库简介 + ``` + +- 在lycium目录下编译三方库 + + 编译环境的搭建参考[准备三方库构建环境](../../../lycium/README.md#1编译环境准备) + + ```shell + cd lycium + ./build.sh capstone-4.0 + ``` + +- 三方库头文件及生成的库 + + 在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + + ```shell + capstone-4.0/arm64-v8a capstone-4.0/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +- 编译出可执行的文件进行测试,[准备三方库测试环境](../../../lycium/README.md#3ci环境准备) +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件拷贝到该目录下,将编译生成的三方库以及依赖库全部(动态库名字带版本号和不带版本号的都需要)拷贝到工程的libs目录下,如下图所示: +   + +  ![thirdparty_install_dir](pic/capstone_install_dir.png) + +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + + ```shell + #将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/capstone/${OHOS_ARCH}/lib64/libcapstone.so) + #将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/capstone/${OHOS_ARCH}/include) + ``` + +## 测试三方库 +进入到构建目录运行测试用例(注意arm64-v8a为构建64位的目录,armeabi-v7a为构建32位的目录)。执行结果如图所示 + +```shell + cd /data/tpc_c_cplusplus/thirdparty/capstone-4.0/capstone-4.0/arm64-v8a-build/ + ./ctest +``` + ![capstone_test](pic/capstone_test.png) + +## 参考资料 + +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) \ No newline at end of file diff --git a/thirdparty/capstone-4.0/docs/pic/capstone_install_dir.png b/thirdparty/capstone-4.0/docs/pic/capstone_install_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..f459f2f1327646a85ed257298d29decf1b9532aa GIT binary patch literal 16523 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 AIRF3v literal 0 HcmV?d00001 diff --git a/thirdparty/capstone-4.0/docs/pic/capstone_test.png b/thirdparty/capstone-4.0/docs/pic/capstone_test.png new file mode 100644 index 0000000000000000000000000000000000000000..327fb21aa00993f3182e4ed2fa7ca4cb75b89b0f GIT binary patch literal 41158 zcmagFbzIZ``u~rFlprZehqQnwJsKpWK|wkdkQm*J77z(Zl}19O8zcsZq|z}$kQg{% zAT@IEeGPrT&-|Kp z;41J=QU*l@@Z*ZRuChE<`5-+4c!6sxry+-hRTWQsW{C&9CUj9TbjQM?@WA}LGXIRp z2Ma65SXEK(k&hX&Rki-0C20a(&$1o#I>vH%A2#xT>M*Q- z>d*h0HgY%k)L!{X{hi4CgfhMDZm`r)-BW6E7JK8=K*(`e(68&~`Dax!s2&JpqXDw< z{^&#kZNkraI)~WZ+c-GeLm$8;_}ALnf(EC|gCHcng=^5ZA(<(20huDnicZ%UqbC1j zY4d{e$)+*(S~gyR`fa~+vjPUfekb^X_1Z@!-g@O*3oPFbrZ$F-{nHB>@mb0t=z}#k z9+R|W2RP+yn%Q>M0ONBcmj8g16_l~%paywOX8Iszj*WEJFCSg4ubf{}CxzrhRE^m; z6&69^h$YvOKw-Zbhf^o>3z&ngJOLsE8AU-ovrt9)hqXl28_Wc`Lm6Xz3sE z`k)qgTzxi8arWYZkl6}&Y|vQeAWE!vLkEPVCI&4ktX77U|%Te?GDqPEG z;NT^w5;;NneOIHLI#*uox$4$%2x3`=)~_X53Z#;}_V!~Nx3+zo6BcA(Uu0d3_Fy%i zl^>|XQygHbic5QJl4~+9Ake_ayi^ry%8$RCGfisV^d7nPg;K!p8k}A5wiAJCh(j1z z_5&EslI++W&pjfUd|pDw*wcb*;x}eo`;bcq;7QUZ{`@A*sY2BAk+J#LXzPkhLY91d zqD{iLWLgr_=d>JTEb5hYAt<4u)^n3;LQ={t_G|ls0t~-Af5qo%azfd^Wz<*G;ys7^ zMN{gSc}d^usa1Qs(Z{RI0nP_;RfcH3@(l9Xyn|T6%`6mH^*(OOhl^~^?J83V2|^t{ z^gL`VTaraGMW{=*k&}}&Z{|*uDmOJ$X47c3V39x4quu#(`y+obfxj&MPYvl{?MRF4 z(TEoPwcFA}XwePt0Z(ybazrezQ%~aRe(a|otHSwO&df%Qv!KSHeVDkJ0s%{_wnb8W zyU`W4a58yj45!tnZ+wzy6Fk?t-PaV4VSn;lO%nJIIu_m&) z;hP&= W`q+lbpwp7($l}~s8u563&qwWoLVlj+7G2>`dRFXq80BtUi`!g$){y_6 z10vQtkE_yB2=_WfR`!~KU{nCeZ>dg7gK(8&nIG$&Qd+0+S9)=dh=jIP%enPk*J5(>OD2m|*54bhr=sm*2m z>)TvHSUm*CW$j9I^}Y);(Cl^t@m7%z z6%1crBRhi4^@6}E@bIT_OzW|Zg>7^{w)&T3c02gHPKJ+S-8*7+t5Hw9PORRS|6t5s zA)^<59d}Y8au6w7joTjnBN zUHILoA^+w=k7Ah>@)P!aImfP^q{JIuGxbij3kl|P75KkASjx-;c9{>7+Q`Rd{Ha@a z)^bZ2v=|S|d`8}wrsYyfjT*-bZPVeuGx&hN^w^5Z^WjYLB%NzwSAcyB&w>XX68URe zLh18DE`O{1=h^uY^!uK{m77w$urgQ4B}AGjVvGJT-m1ckw@MV6IREo$V^EDp@AglU zAJ({DKUK1F9L2G(Mkig9c&4F<3ck`PW~uSiOkwS1SY?|@lXFSoXXdsQJ%2*Is~K`Q z{%r*hI6lbxx7%IBS)iOg7Qt3mk8_-T zZ`M*+BTnPsvyDJc7#3_3?A~oIfb^2|p6fZOTl&JI6=*ZapR{8^1HQdt}*pa#;>WlJ@rNJL&fG%VP!k%v79$^ zhN&Fy7(ZguDT#87p3zptzAitqvSnG2l2tDcy|ZFUhpTkrO_dlV-Pr$p`ID0h4QIdS zr&1hh2{p4pJE);mw}kTqm{IYbx!+Pn8fK}H=Gki9u}Ud&&AR^eFg~n>akQ|ri3)*( zw-A&)#Ve6mB+L&&JIwgL%Rmu2n)??(!cH#tXdKMaZQz(Ksd5dUsdTBIwr7z^8R}8w zFFPkg6zk-lm4LdnEFar?T!3~G@ZPBq4BB@K3Spq#B-bKSA*@M}ysZYH%W0qq5V?NRCzq412JB zCa8jdJYYEsOu3j%KUF^VzRd_KVhDIF!zTR@<)ne7d{&rLCxx{JH#+V@!LgTacvS$0 z*L@BLjCKSyJeZJLVy=iZIASp^L)y!z#%F2{2uq>)v}ocFiDI)*GmzP-%gs*eZt!Hx z-)Y(fKh28&F=GUMm3(=$31^JgmH9wVHv1|HMNw{D(DwB5w9nYappH*EtAaPBqFRh> z`?ynP-#NxfR6N^s%M1-O5UG?wMsAd~>=EKRsdLH-JYVx{Pea8jDIIwWVd|=O{bMFV+&@e2jyZFh@daf` zvI14!_+UZuI#rcpm~=H~d8vm{!x|YZ%WJdlK0^6ylA=#)xv|FFZ_IZI?+F6cjb^KI zG_8h4N*$*-&VSZ8+jt}6XHVpKtE+P*xS_P{>J@dy5A=gQa$w3=x$h_1Y+jG?7=WBz ztaz|Ht6D=6btz$0fe7MTE?xnPZkn8wou9T6`P0c#-N!8M6@a6cC`J+YXV?6z^^}f9 zLq)8Ht3vA{#eAGL15D2x3Oa0$_9F~xZ)GZ=Z!SMg5$V<*-5P-yUtRRfSWSvcoxMRe zf3#8XJ&q>oRH@}>)xnR7%ld1l&{y(2SZr8G?fYmSi%eRg77sV=q1r9CJGD4kb(06~ zC!!9KCN!g66=DVds=*vo7%3F$nONf=9&(i)4MYp3oRmt$fldlQ-*J}CM|@WIvKrS% z@vTJj%})!{jE}vO_~|(PxrsKXwR4As364BNRANZh1T~EMR5Vr!_LECa!Kp%Ztxp&| z5=+y#5w}%RQJo`AlnFEtD+Xv@<4QxIzr@ojODR(l!sI)Re6#VW?F?N?{W zCB3o+hdg7P?sNPULT8?Fh!8Reucie>>T%{iNu81LI`Rp)Zzr@_9r+BDCAJm9X(pQ? z8GIz~$k4BO^}BLci25Tp(q-7a8a91u_4zK#KU6VIwVil9a$-2lfoaoD^VRaB_O)J_uQ&4mHtt-@bFr`SF%Y2;XUK zRmuvE;@JBo3!&{BLzr^*J+L{$(dWDF&(8>=^V3mw6?YXwHxZgaK{5m85czYr<0g{| znJGjhjbcu>L!zXAKN4<;S5H)_y*f7;<4ZYSy?3aJd?j_TP#pMKV**}_CJZ|0_%x^1 zDDpjKVfp$>WZmO>UFh&CyVHk-=?~`5(j2&Is2kWn%`D#Wu0^-h_9J7%UZV|0 zLCbG}P1;ZhkqYS(Afls|oh1}4I2fB{RT4ySP=26SEANDHy;T>Y&PN#dUO=D49F#Rw1*d=wja# z!AVaN^mFVrnVzjvWK`*swI;||RWW3Z8`T!d-0}>r)ZBIE^0itGs4*Gsa# zDkdP%Ms-T9nW4>1d3GqK!9P@ZyY=8?_va5yAo2kfeiIztU! zsd^s|I%hn2oZr=F!g&fHy2t=;k$!m^*PGpH(axc_&YDb$IN@D7AtaC5C(w&kHTjfR zZmcH*fF3#2$bJdvkuaMXnrpk;$`#A9NLoBYfX}D@!RPqkra)J+y<1~JQaiwdc0~$+ zX{L@lrKB$*yEAu5fv4jf4w2(7x%LzCb}{B~GPmnom3^~p0&l*>|61@La%ii|R}UQe z^}gu=NSYh-amgD*j+loknf%pVDr`D|n}q^_z^Mh^*!?JJVlnXk2Qd^!?eYWjI2ho5 zC9YU0YWfg>?Xt67E&Ih90~11n<{vdydkee1Rl8;r#wTeQT<5%7lvOx%0?_uU%zfR% z757|3!|~y8`T{2+Dz80mp`}&nit*hj(aeZCKP10Fn_SEfvo>)Dv`Z8|_kHShaRJoC z6%1p4`J1uHcHfqo^Jq?Aw4T~tVI|*Vov}s-Pu^#f`A8!~a)Zql>26_mxN=x5k@qPS zeGr>1*Zp1fJM+AUc)^5&7DUVzoudF|2!>Qy{Qu(hvgxKW!F1kVOr5P}vq^;XVGrTc zYN&ajvhgM@>r7flxv@T~H}k`1;2UHODmEw`xS>WChvO`X#G{Wa!dhh(<`h(M51EmT zCi2padR-MW4}Kj!-gI)xZHfqzi6DpgUuB$#^R8lIv58@?bm%dUHlTvBI@j!o)W1I< z9=+kedwQE;=WYlIhNz7osn%D@5hTeKWA+mx?jf(Txjo|n>IpEGb*x`RGLR!QVU|n#THrLDhO&w*Evu>$gPhQkGvHoC zCJ;TH&Dg;_B!(Cc|14b{V4oA}lk^#um9Q()CTz%ufs)e|)I;Gdl)f@pjU%n{?YG^d zi=bDwk4Do5@0X`^yAlD{+UCyrgva}ywPs>RdjkCg`jm2b(ea0bF5Fw&chou?BR{sk z7$K2MFlXzq&F5`{8TNW#CnGOmCib1W8Umbxh~$*(~RDLx(i5+>ZI+Qn)Q4(IwCdSLsUFPEgC!%wBOxO96=$ zQ4#oyS$gu5B)|Bk3~;$H(-VtI&=)?eM#^vatD%8qaskN;OISA3X60)Ab-Ptpe`OtQ zZ|Suk`L>r@a;vUM2^u?N}LsvLpZ1MlJi4jaVG8iQ&}h zKCq5%hwnE$T!`A=7yZFtZiJ9rHY&a_THd=)x#93_(JFG#)dvh=^X%e7gF;V-W0)4hz+$o3sOi2iAPITzvcB ztk8derrckkY3aIsXNnU4vP57#rh^w^Zetd78GE9Cw<}o2yHM>k@S$|MA!68DjhJib z<l3L~p!euMOa#Bbc%24bv^jeT=I1BZaMcBNoYB8Z> zG0oOs=-4wIvJ3|E#*DE(#kTV1eBQa8!LYvMHujflDn&!sJPS#g_xhpawd7%O)TL5g z9S+uO8%yTAB+}4AftI{)Kk3(dZVHst3cg50y+Y02BdAyw%J!(8tNUhES^)Q3u1NC& zFnKEz?zfb~S$;dvQDLc>UQ6`sIC-FXw(b|VyX=R*FR?vmR5d=?Jx3(%Yy_PG8?S_ z>0Phd&MLmg#ka)5dYXYS&E$i7?3uXHS98evzhwru{G!}AqW;1TMb3_K!)mux4HU51 ziJb>f@6n*5>vGYuQaqI*Ubyj@)|poL(Vm)$Nglo0MgIpc3jZ4~iUWIx`XcwWC$6M! zA+a_>#Aj)GpoUnYu*Ub%CuOpY8>&5(^oL?w$hAR_#7Xh2b+NX5@xb?xM#Jj}Z%I#o zD!c7_t4hWdv$K>2S!Z3{(Lpqh3?oax{z+AQs*j?7@MtS?%h?rTU*o<6kOGMmd|$fm*vDiTKGe?lPe z1_6r=GZpOeKjGKHvD1I9Me@Vri`TN>((N46Vycz|?}$q_c<*cQ(U(p($UgI=po z`x_5oM_sHCKPkwXUYjqsK+F!i;AOEx43wAwZMs1{foyf?X!+{ls*da3civHJ%DenXpvJm)72rl9C1Vu@n^|nSSq?@PmF_g& zY=II2#|=F@VV!eTNgh(AJ43GCM@T4HR^dMY&$q zUq+a-beG&|EV+>W8ktb^5IheC4kcv{z>|c#08ei6rh4>A zBX3!|rAU28Y;W5h$N03GKz?B_dK$4$(hxQHqLOFTG%SqA!7AN^j@10HLdx0aP?PC@ z5Tybg|JeL4)keV}z>}t5ws-J%KSK`RtQtk(6r0=aC5ns>eTweebR&6Mzf`Yi0Ls9a zx-|W!UFi;!)b5IIH%XL3RAj;CqU&&F_A2#ygip%N2MkF7$HHm2tqplMA*#SOw`p5w zS?tDiD&c7d2Dxr+w(XP&lEJ2w}>QUpcLbPyp?rz%)H=(tT!20 zSa(7X&K-8}6_q|1IP!*jI8$b4hQ%%#ldGs1k!yD>@anL`%zddAfoI+_awd1;suhSjN`1Wnjc6W*zg44L7+}SQ%YkxNWnSzpvaUaIDBw z^WvR0Lpf<_-SZeoaN2$+Gm~e>J=I@yyD|-3e+z#pkJ_LW9#^@**aFX!sx0Z&YC6*a z_E#XDCcb@g8Kpsw*;{~#6I4Gk-&Lcub&`+mBuKLMYrDOgWoq#rk{bAn1bGJIVpcK2 zZtfX;ETiuzAZpH{VINV+i2rmaDeV%4v*_Z@{?glQjRPbXe$Mpq^`B{m06ar^A5H*rX2YIEAV_S8?eI^{UdI)&L1B&hqP zvN=aaEY~o-R(=6Rz+zLV@C7A@PZXNGhv>)_U^lPuk_RibUN&7Z{T7e3m?IKVnO)w3 zZqN6#i&fc^_QhI$8W3mc>>l-~!18C5^1aJIUnrO?5j}~>k1D(Rh0uq>buF*-*o}4b%Te@XUr67Zg=FKcC!LBBf=qk2LskzE0M@M{y>e&VsnQIMtP4V>+YglhMZ%` z&r%J2vbXQNPFt~lWO}E^!ZW0v_-=@bPtnXETbd~QCZ-(V%w_I;5)-(tP zT8Rld7!MtcosQ+p<90sDi93cO#w;U3n3d;sYbnz%L2F%^?P8Mw7(7Ax{erQ)+3nyR zaPcF5+iJ{;qs3DBRN%Jx*Wdj}aQkOGkwbZk->Xe0dnNq7H8pug(2LTw8q2!v`T7A3 z>82ZpkKNc!HbaLdz6A}~ZuI+Wf)VDxZ>(gtXZXF7-tgxSu)Q#R{fRT1SOfYE8aaPv z_|t*{6N`Tk@_$LX1^uCy0SZAUd@l@7>B(BM&RPI1{Gr?;=o@s#K!jirF7t{acJ8Djd360? z-feluYz;v}oI0^B1U7ALMbqH_FaON85;zi3d2m+jzP=GtDt5gsu{{;9#?kew#A*Sj zO#Hl$sEM)SX!hnea_d{!{m*adU=Ufic+SXTYTbyHCco)Jsgw1s2Y(3J2Gk=wN7Z|Q zcNR$PZ)|M$Z`K+3sw!MBbQoBc>wOT<$K+2UL!HOq)(xN$VEWqR`{8@R-4xe>&@Q<)+Z9(STBpCVI9 z#hOyKRFfEgtp7UcM3uRFj~k!E0mg^izxU?xndm5#4bRJYZFC?7<}b62d^cKfek6_P zKc}uDXVQ9T1S@t)x;y+YVAfjp`k1{R`(|>!V^|!YbkWvt zr)(Y@n3tR2Cl!9SY5MJ%>8*9=6#&tUYx0E&C`d!68*7U_7(JMUsV1fnqh{~ zA3FeV!{UU$JC&xG=4COV3#jI>4~ffic21}U@!wT9XsZ?8?Nu5W7vjgDfO%*x(DUkj zb)a`JpLAE7t{N(YN6Rt^U8T5(ji8yn83L%~5e=(}`*C4ykS&e1TT>60#qdyUxG0~C z=butB0=-=+@?*5Py-MSN3P=M8|GXO#I==0l$`)?^*y8igZpC;12GvO=%wbwQVeKjx zaq{cQ*UPK1o1E$Xg6hz~*uliK`!nD_tN3-+w*pcC|6`VLCh9{e_`|owNOFO|~nwyLK z=fe9+0t$E{v||+JiQTsn>fHF`a=qz$aOV4)JqJIQlB>v6rMMT;WMS?=#sqH=!}>2_+@dsh+W#1Or(Pg>^);~WYHh$N zVccvS*z(SD0A$<6F1ODLNFiF5-=)N1` z5Yw&Id#_M-?&${l26j`I85h z<(eaqsB>+m9=3VN^ux7{G*rO8AGR^(Uj2)}g^X5Gf!+XF2uYO%`rh?6-#6#6gOil6 z3f$E4R0c`jR4yjJYoA{x5F_W^EJ!INKhT%?F~}75sM7QHfB0d^x^!wL_S1TfU^Yle zbT-f($cDA;pS12wYoQ!>MB_7d;P%8qjq@(YjkjdgAx!>- z4gjfhRmS#l-0KAT8fhC;^ck8EpQ>_g8Q$%HP$jxU_2lPkbutg*+u7L8K(xhrxpRAl z0~1$#=Re4u%H6M>=w~c0VCEXTY7Jl8dyRLimU%g>_v-iP|d%2;Plvncg`bp z{&qx;k5=w@bF&QBT`jkS3nUAv86Ai-wD)1y&@TjWh24FL$VtKO0UoDUx#P;1 z{#@sV*f&lFK2b_Fy?-)1XaKK3j`~%6SUp-uKh;N_Gx98BTp&I-fhkKLS(Tj}(Kdeb z{oBFS=`krHUQPE;J+7EE$6lPnv>5+XgwW2$Q+x3t(tVO{sd4do8Jb*-02RpdQaGst z`!%Hmi6Xq>ieBfnXOU17nT7>t^W1&>JY7kZ&WO^NJIjsj)5SAYz1bMJ9A}^3+eFP! zMI3Dc_^PI?+0i}?ezZjB&LXtajBa_ljDVR2lQE42VM_Y8?j2TiZUAdR(}M#RDXybXB-p?0Y^gP9#f;!CuEBOy8$~C}TerF+Pl?zgZs)w~3 z$N7-lZ)!8z&>9`+SAL();g_=%rbw4m&PoC5QZ&ctvlfT}R=unA&;vs>~7<7Fgranl&Tgx{C?^@?9*e<@;lFh&vAA}$s2XA;FxK)(G7f4_J=Py&0T2ub#u zdP8ywEFm(nE%{~Mpi!{5VM+1d4Kb8a1kw}x*ei@;cH|{*!$Jo7P#*$BOm{Q1Eo^@h zadPOE%0~1Jk>TaAU%NZKmR+Ow`ctO%f!Jt6M7N3@#SXz{ROz~0&b4v{P5xBbT0Nfe z7Oz1(EgQCe=EPU^f%xQg%FO)_%PeQl8XrRqOF7`F{R)sLO&akB!@qU$h9!B`g36+hu2%!z7;D&VQG;X>9>WTQc+Wpft6p}%qeBH-+icRzm{x0-J{HaCpk@^|)pqkcd&ejZ zq##Mwap(U3Qm$n879#q{Dc=iUsSgh+Un!PN>*+2UyN<$6GpKZuOSo^85G<7x(8tfF zV!&Fq$882EYW?cg&DpFhn-zbs-t%+qT>VD50if~DO}N<@>HRsR(eBG*a1+~R15I(s z>mt!|zcYP_RQG><I8m~yUVC}YPOCDpd3U-QVWLhv8alGX3-IvD`FV*e( z1&=s*{~Ny_Y}n3vJf=}LDL@!Ol4}2X&N*$YWGp+w#KK_u1%o@f*7u8;IzVH-p;^ z5xN(xDGQiq9}_0n4a9!rMzk=FcoYcw1mON|(KgXsGIrp~9^2W0SBN*;f{|`vo9)p^ ziy8>{YyijKo!k{}ToJRo>gJ5Bm#y8E$G(m2smdK==@-9Sy)6>_A$-{-AEPWz_3YcI z5i{Ok|A8;I6^#_-ULn_4q3{|{cP67Wm8TB?sDBKX4`wRuPL^|nU0M32d z=6#`V!T4&SwgDo$@pgpic-zkt$K$+iT`N_{T`-vKS61!P{isA#9N5y@o z?QkvKpDX$YV?INgS}(r$%Ol}dg7dbQt;-sU{d{Mq+^>Gk-v9N%t0e|az+!wS#1wS? zuqChkhHLuJnjXjq%IsA2H)QikW?u3&fFwQGCS!D5=0#&4%bVJ}85-Etl|zE>)D_{^ z`S%t@@x4?&G0^AKp2UwT)PeX5#Xs+9hQ*Uv=~2PJl`52fdFb*>4;_yUQX98U0GH;O z8JA3T2*&kv*10`}tA(5VY|%6P6zU&Pt>iMU_=zY?yFseF;0evGr#*l?$nI zDzhPHT2+JY=t65f^xz^`oYDE3$X{N%g6#0^f~$4Pmq15l-tsxf=dp_6g?*pKt2hC6 zMYX&d{%lb4-LETXEQ=0>)kK@Yomb24ptk*jy;lweJHgne#e3iP1Y>G6$yxzPVb{g1IVBcaz+^VKbkB(CAm< z*12cbQ8qrjzlJTqvXlLF92}RPx=yviWAGzyI6ourGC!}kizYW2%B7RXiI$5bJ$`?i z>$!AgyM^~lV>uU`gzI1Ne&??1PUMV~FST$q6f-mh98_k~m;YRxLymwdWaVwuiCXNW z7-`FL3}@z!PX{SC+_b~&*{deF}kgAPF} zr-^QtndzcZli=zhIoZC8r+=yJe`Tg;WEk2V+8zR3s6W#IAzkoC%Ev*CRbQ>tZR3t ze-PsrTrF5jU`$G)R|6^iw5t;^T&eA!h@;DR^D@}Q5uB4hj$1!Y>}}g&U&BQ(7$;yd zh)@(O-QY*u>!{60zna7ys795h@<8eK|Dm@Pg$(U~-I5Mmq&`qs)0XM>F)WA`Os@5> z1s)MT3`OaWwYj~WYHm8%H~o%F+s6Bk57i?+^2aqk9IHFyu(zhGUgmy}=0H;*?fzEW zam{6IBjRzOZW?ci?Z(ttd^b}SN~l?C>fYwhGpRtN-SZ%Rc?>L?DXM)(p2EFTr(7ZK*!|gmitZ}sO13T6Iq|mrR|@lx;^hv^Oxua&2uJ?H@i>w^r*+^B zol~nbSj)tBmy(Y2+_X|yKL&_?j~~&yI+2UNytzz>kF_iQ75g;jC!m!6NyEUa-{WpW zCpz#dsmDW_K>qG)o3i`ilIe^bzzz2SWWKC%{@rV1I5#{YMB9QAeKx%BTXW;2Df4i? zM}0o~fK!?{+q++yp)h;ZXz6_8^mOg^u?v$J@Nr=(7~$k$me$cUTr@*+xq)RTH^9C^ z&tii(3@F4rN45e? z2uw~q3h(lFM<05=ksX>=j3E>|KR=hk>nrO&AaKm@APV}XFN<=wPC30|g`B?xaMGPS zTGq6_Ig-as^Gc;*x~=(4w|QqT>&iR89(l-{qMoKEcvNe!et!3=3YmYBNQH7SgYZw? zwbx3jB^dY7NVL^zYOTeskBTbJ@F#Mlw#apMH=c^$VdDc05Ic1Y!t^dOXGCk46E~}3 zKU|-Ln|0O|N3H+S<5y?NOT`jSa4u zJv7+S{i}?imEEc3)|1vb4!C?N-}#Wavzq;}HM!>uDS7ckvC@gej!hg00ZcheNwj&* zbTJ&usKN|h8-9i3c)vh3L92UXS!Lk{?cog=7x+NsOcNV)X~X$u9c-)8El*qM?XxWx zwp}P~>YCu!4NZj|(=Ubi#HA1)^5Y)5Y^MW8T!AskUb1Ly|KjJAK6)}xHe&boXc8w` zQ|#E2&%#BBcS0nX;}(Y99IXDa+V5$MYQ^0IRZ(Z1gtLC^+53X=WVgke8l$3^`{LHD zR`vIZx>Er;UDG9|-wZFI;OuFee<_ofQ)8BzbU9M>$f5$!;sq-T0%eWs+}_FPmKDKi z3Yb2~E$9hyBIRf^x`$qdY${L?$il7!=KeP0xNIC6dI2KgA?mA10ECYe>AlHmu+ki* zWv%EUkV^zg-lUulmeD=$6@lzF?;j37CsVCdv$Jlql_*$^H#sUBd=1E$uJKc)65 zpRw-z&6KDX?^7nn>%ifhiUg**DJ%G}9xl1xA9)ddCe#WmNCFbwqg|%y!|u=FTW}x? zsQMx2Y|ocMivfsqH?<&l^%5#%`>l=qo<^5Ur`p*+J|2R&VN?b5Hx9TKb}E6 zc`id8;9%T^K3aX~@fn!hM%ezS{XMx|X?rDY7XD+v^Uv79^(N+W!c7<{%#UBM-s`4o zu=U#o5rh?552_KE-+)Q%Tt?8}!nDY)k=X*7ZwZH_m9xz6ci*lq@OIyB4zLv^O0sv$ z<}lCfN)vLQ>0UP|GZCm6?(OGyO4A-0)+81bmIuVQ%Wv_W7pyTxv-jC{F42w7%lTNr z@g7q7>ha z%Ll(^B{Go>o=~3eQGko~1q$H5>^Elh$On3_#{|DSs%`?94ETG2`Y%1G?N(6{fWx0n z-`jchKRCSB?A{*^pYZw3;hc5AiNdrjJx#EUrSGp&b)3BAxsaX$INTV%nr+7$=)5tO zpta8KrI($2_;G#|8ZODUq4g_8y5b3wd0QJa=-1xQqdP2zA(Xq~7L1Y@Jcq)H#0s|h zY#)v-h`_=`p<3e(4?_6ld2S+UNtUQA3d|qYR9+5Wi`oIh*IjnMt+!{uU`$}3JhnLb zwdZ4=bX$w&@>%2zpwteApyk==5^yX~sUU3cRRJq!VhyB8^6A3iR(ABhD6JXN_;7a? zYYZ&-b*4xB!q{h*u6W8UdYwo_->$9dAr6iNJu`2S9{%plvRXeRH_ciplg-Yg@B`?R zO7%wj`4cvlhHP0r@|Lv!8pU3ohd(zr@2TkW{JD$}+&;<+1bQH3F~`qD5KIz9sG+eT zC90%~+m)Uz_qw5(?w>?uwtY^Vf$Vs`jFgFd7~kC6ta{2f5#?r6oRhjub?vBeVf-tv ziAE)FqRs-`1^%APws=YlEd=JWJ48F?C)wT_A06u5Tx_uYp@VGnZlc(T-Sz9H$y5i< zcva=!vK-e*RSL{L{FU0m>IH5t!O=S znJafzdlQF!<;ioc>k@Vm0WV>YTmLnwt(3}(S#`TY=I`gEt*68b01Iw1H<6=t%HBlO zavzX0pE+uAa%)IJ}^5I(@1-zZNhfw$Y|?rAZzS8&-yd%HvYI0HD^6fkl;R3Y zpz5wkf2=*>v5=pBrSY;)*Znq+fAi+3d*|>qkGYwXVkIre{7!A;;`z5x7U+A?Up*>xmOQ@fyN!Mwh@BO&; zE@6+4kD@mM6+8kM%gtHsig%f7aT(*vaqRVq%E@tT40n+~W)KGdM+P0=m8&PrV(#xD zZSdTXNS4(DbVVR@>=gTVAu_E4IrMHCz3>9}RacT3=l$2fIES!m5X(x^>+{T5@+ZF% zynPeTS8nx$cn2WV{`NEljd^Iidy$~^phuYcG4U*?`(?G>I40gx7m$S| zA+2ZOze`s(wY6lf0N!^~u~1{HS$@9nR)9hO)PB6woMBMh@)dJR-h#`aYxoB4B8L43 z33AChZbNC4X+@Y23p(Qg7A#8~&UmkzSN@*3E-u^jN!}Q}(%aiZ+wQ+q5ef9M@Am`( zg-Pb9`v}wT;-IcOjUB>VerlDP;LW*hz-P3KxuUW>=3T!%R1QH70e1n)1#sv;-n3_3 zdt@zqi-j44nxh(^?wRS({!|$GuF7@rd65MH9$JnV*SPmSZdlzR{xx!1jUZU3&tGwM zwL87C0TVsvMMHvTaJHCb-0ZY83=bWvV=CZg{(M7}Z!*#)9h2KR4d%2s% zEMa&EwOV)p4<>F zlutRcYVy-js^bY21W)Jo+EsO!%R>!|ZCBikC{X<r^f5WYgclRneW7>sFHSe?3s1jdBq01AEFHTw(Zls5^Pjc%};>c(g7 zu>Yw>wnO*R`j3eGx_2@rk0`hcHs0Fqdi?1OtS;*n2Qo??AG|8^7hf{3^oBUNiiYqh zU1zPBG<183-ORe{w{Dd8dyqQmq&LPh;>6Gw%&|4xJyyK1h?%5LMM3{eQomo$J=-(f z_{cC7CH!6?O~P#+H3H%NGKwi>Tyq}c|4OXb1xAb~NWo3w3SV5b$mF5yu-lXl0=2>!f>L{sg7tXRFMw(fIm|18oSp`j4ub> z_`H#nd<}e+K#&15y+U{ReECZ}BIjLp3^KTE?H*jGmKV-!g#G3Z7Fq`L<}Qd&}KRMJg%Gl;+-C`dObAvtsn zF`Roq-MaUF-se4^bN&=zX064r*8RKg>-t_q(mvu;*DqGLEOUswi|Of?(z~lt^>c^Z za3nxdTUB=c;6e2tasZB@7M_OX@J@OTgU?Hx3X}aVv~IWgYg(|KA?l0hD3U08-c-(+ za!2%W_Jc&UGL$Syalh#nnnsz%(@67a&)~PIwa>4+3fpNDk*+}BJ*}5dRIV_2G5W*8 z=tY1W%C$@5uOEbJ@31dszHKQX;0ONqZN~`ue$M-g1iw^)wTFl`=Fjs~TOZyk$-!_D zrsu#$`RLD$a=J_J2CQc$x;Fl@2x(Pqx}+j>Dzej%Vo(NgEC*cv_G-3Id7o8n%%T^uBJcu)^Ak>n6LT5^A+CgRW|soPC=N zt6MNU49?x2B`%wQ@9g7)1fT+2A=&1KSv%6kCTFy8ii!=2^wEL9Rf!mGBqx}7CnhF# zXVUo9+$AOOf)+PD@;55%OVH`_z6MIr?8&R#6V}qXvw>9ZUsjx0oswIshA$M?UsA+u z+It-D4YO)q(^89Cl9$0*IE3sA6pt3jv$gw;6A$(auUBFw{iYk0E}~LF-;K1ek?y0n z=-RzYZ!cVFa&Xu2b9K&h`V;~UYi=!AXTsOgyF}(32aMu=SlVBLJ5m+ti}R-V?8Lv; zv{kSTkm8ZVPIcE5}S8~8X6A|R1;+ck)r^QpSxuwJ6KX37@u(6|vC z_Uyb$&aOT}Qw(EWf!{$iN}MZECeB@Y0QsXzPWQe`H7d z){yYvrFwFo(sc6E-Q7346d_D8Q?c~fe4#_IW7wGJ*h>W_Pu=fvb z(o6L0rM%*{3y@L8^ZJ#BybHjU0XvV$joTXWeR!dmkQ<7379&uA+q{+to{fJbt?XX; zmrI;-&lD4Y&68#Q0m~(dBBvU8epu7((gz~*9!L)78HC!F<1+n=;INbavK#gd{49oVY$r;7w{3Tc5}-c6pX}(?M=^ zx>bDX8wo1N6E7>_icN2MQ;e(MQ{>_x&iCNrn;(VzeeioraupW@0*V{*l}4jLCVM(M zFYu);we;VH{x(K6fe&HQJ#cbwDIa4mLZuVufFujXIUp{fXx{utr7CTyBCs412aW3= zBaIP9%DqGBb_9wHYkO~2zfFmDUE7S%f*NIAgUH9Dz7!)C4sJgANcQIT@uvV7Yfdq2 z=qAYBl`LjH|JXMXyIL$&9OTd`D{Fm`N!c<4q+du))ih;sbi*9|KZ(F5%N#yhGmk71 zIo#^?b6@g&sY-Uutx8P-6O>iwAZ(Im&v$R9F@%e6?xrypGKZDW2$$KVm8LN6jZ`bI zCk@Xa>4sTEQwGgnKn{M%A9@`gl|-I({O-w-Q=xeXMEG>4FXGY zwUO#r>?XEIZ|z&VNS!U?=54k+JGm5o_WXnozm6K??6UzIVciUE(FE-b~go z%mfGeSs#QrzF#OBZ5FMg9`w8yU3X~gkZ-t?Dc-oXd%Z1hGKyGIj|Lcdl%=*G-zSBk zu>J9_Ek9E8srbA?fhEf6!rd%D!D5!;*&fj#3p@zer`jX}gLTmpAP(@l^=BM_6vP3r zTQTc~F7&$;i~8&0{%b#tBN=gY=oNCnSow5lJSB*vGxuO-DRFcdeso}EJS@WE#63;9 zk4WyAW9q+f>#lXg=c-<7|DtFhvt7nO;cR){q`$?|zJMQ%;F!#Gm~U4R5%$LuP?WU8 zYHE+(izUT{DEbafFOm<&+V9Xap0?r^LkAehLl6O*PuXkgiCN5Q_)$B*i6jMICw_<| zW)|9JRsOMa0T3e^usLK_WwAfgcrRQDi;MGL76tIP3E66%T=}cPx%`g*@=NPwIw1<= z)$%*zm6tW6z2&jzwt5EqSZZdC274ek#~i)71Dy!^M0CT4N%W;Ov$_uA%0CuebAF&r zBH5Y+@DmJVYk0n=Cpi@5=oPP)$>T<+WnLgt6_7Xb)v6bzVr?`pPGS*!m0+Za*MC?4 zE)Z2Vnv!Cz@Jz=7tJB{PDBq2~#)2ZjqRM`jv;V=^RGt#YGO<2^PQoHCW~9)eoz5tl z-qQ$rBCTvkU|s)*v=VTZlnAH+bvWwTk)Cp-vGqp5bfn%RXes#n$8=R=SdDNq?H z+8i#<)4l9i)vh|?a@I_+eAzO8b$6ghn-U4^2J)DEfdR!}z`c{lHr~H=7k94~uT0nC-kzlCi!4jbL z#?P?>6SmT}*%!v!456L(>VOv$6o*TyFI5vzjrPP#R>xel?W zSq+a5gVfk8QC}?-HGar+8xk=Q=UwKX*)Ehf}o1w#Gw z3dls#?tsTwcQ^X+N^18+@h>#+N|!Kdwiq zvqHxcyZkodDvTbuz{4(q%WZrtEdMX0o_di>ZLr+$ z@&B%w@fw=qE6K5@N<4h;F2OE-Vx>Zfc6Jg^>ZRMb4BlzSH*UT*Xg8a_&!u5B+*lpQ z7T1tZob&fbRo-leG4&Y1SMzLF=@-r-9JYv815A zmZGy;h^EI|&En2~&8SPZbVlk~KV&P^)fgbn0IuZYOH!atGPpyn{}k1?*;2!+XmE#T z(OCLYdHp0ika}A3;@HWa#gR7`^qMqGeRJ$Cxpl1b&}(Ap(D`%D-&5C=R$gHBxzw5E zc-8}dDbCsb@~7*k#ed`@?pOVaM?_NAaxq*mVvq*-jxXnF9kRj?=AxdN{TPS~s;;MX7aj`hE6&1k!fuHtUWXPaUrlxVkW|vN> z;GS$EtV!d>@&_T_p$5`HHWilMceM#Cd|XQ#V)jdw37K=r~2Q&-& zB3Lyxp60;hkvKkQSm{kQHBZ}uYkAXhV_kVjb4~|C=wqZ=?c%jyEIy~$r1s^R#&>?r zuwYy(JNsvYOHl2YKJBXw2- z)USaSL+9(JsyjdUoCb?C>0X?S)dlX^Mgy30B59s|C!>sHA*)NA+N-)_KZxR26hEn_ zOm#POIZBc#h3)j;ZV-ve7eSg87v|SHvCRLb^nLv6-Ldl$Qnt|_4}btCBX_9By>=B= zzvk4RE36{iGfrtr*`{1~%LvQqGV?}{UP_ky+KM?1ja1`$-;|V_# zmr!1q&-`Ljw(08&WVCQongzzv?o!?88U@$}-bs4^Fr*Jf4VDDf><)aPs-vbDWVSy| z5*6J1AMuNOhW;G5y`%4iGj0ujz{@E$e|^(Zq8px;jcSmz!R{!=%8j^OAyBwvabYs; zfZ`l|`?ftMa~Z+^Y^O<|2&_!hgFL=$2dWr6Pjyc3J>Z(XLxaqNxa)Rx$k&2%;Di+Q z#K6+qJpmW7_!k;BM-#<>rBWX5g@TAwGC6xz2@GjbY zUB|9%@;%>_u++J}=Iw=D6&~@@i__;ndy0FZc8g-C3Bu^Jhc_;3S`SZz{idqSGMudgGj<3n{t z)z2t5;d{(SeF$>@z~w$$z^-uP+lnXM6Ci;6hEI5WVnI>;s=*5bflvTECRoxwkA0Fb zi7AKdVS~$0DE9IbozJm)alzRNV+743pIjBl6-`MUd0Q9X#;5w zMSq!8lu%A+0ex7{qfzzmC^-wy;F#{M%``DxG4ypTDpv$0H&7w36*9>l5Lokv(~u5! zMJ5F|5mUSrIAQz6YttUc3IVoXB4_kchch=_4 z*Ueh<G> zg?H9-8)(M}Ax%QOqr*`{kr`_d&3eo0dYNsKC&poV1zudkbvLU9_5w4L@>TW^WQBdpmDw-UCL6^&EYXRh0q0 z6WBcaXk!%pMb#LJauISOePQzM&^RyxA^2S81DA(c`BdNEq+pAQBdus+k}u z_P}6;wV(4P!tI3zxO=vzq8DjYoT&A?lN&GaVP7iO&m{2b3^(-|8~k?EHlJ>#Q2tPVRVTSHIIxA-%0E{2>I3Gr@D4PXw>#u@EbL8gzt(rq7&*o6v8xJm`7KZ)?mBhZt8p*N zzqX*YObzO9hl$pkVh9lO^{ded#6$gdud?Y@b!W6=*kMKNxR%0*6abvD>DpL@dmFx{Itc!~IQx)Hj{>6`Dz3a2(KMmrSX?(cLIV;z;5C$DvlN z3D0J4E*>z9bH}%L&Rk(Z&Y!#S3rUy((zYCT?#b!Smg{(PeH`!Y<3Do@DXgf<+b)lZ zOPTR6H!xj#cchHeHVfP{&|PNMNm~BJllWHfrz|Qy&_0%}?8tcf6uR$x37D$z{AfqP{6?=R zZ|~*MFpGrfIjRp8jGJ+#YflWe?2}>$ipqE4oAy*@z&~U7Z~sivVO_MY5me~OPzE5z zcw(R!fy~Nf))@axkAs%8jTk~;G2u0;pi_3DA7^_(<4Sxb15Z9Pm>c(g1Xg5oIXI0t zvOrwr)pyup_oJLV;_hPuO$70vnp=j2OjHO7F){|9zaXXAIsmz0pZ@uY2eNM?4)WNk zukgXKAf*!Lq(o=P@DO*Q_?l&zy80xgckg-$NWpmNrlwPyVPJ%_ z0G^3anuseB%#_xKh|lt&09b-n7N%_IJN`mg-Xf@$lnGnDqXcisF{AT0ohjk#j|Cj(vgNV&mM4wBOp1*Tn2ZmKhbYh%| zPETgXeU`{0$2z|0DgQ~lpn;1ZNV}H_hcTVG&|~SRq%;R4rDj6aFJr$+O0f8cQd29% z4cpBQd64g0Wli=RSy!jIch~-+LIL@x)dBobf5GdbI3>OIN~tuVRi!6HSLC+MMvZ@i za{HLVyRZ%6G)_hi{DIJ0ZJ+%JZh3Uxe%*Q`x|BS^`LaS+FNmY*wmeVYfhy_!B>S*E zO)OD37o%iK`mK}mp-Xg7~dE-VbNSRp@OSdmbcITDN)$@uxO-Vh) zU!=t6!>((_N(LTN!YvAD{)_C(CQAwHNgJ@Xh&j8F*>`#1-c<{*KV*DGF#1dM9gW!6 z7>gu^xF@j3p#_&34FNy#B1_M-s8Y8`FgM^xw4BI3CB&_5<>d-;!=JdARZsolreWdT zz%(5E0Z@$i2~ec-cl#5ds83KQd^SiS$mEdf(9DTz{F2a==1vr1@tdG1&ARq5v9Yau z#k$Q!G&{^jS`=f50t8!6?2-lvw!Pzh8Lb~U3CwfnglfBIG-4_i-U;AEn&paOOe@`l z;J;u%20GS*7|yui`-D-RN3n<>|J&^xro}+jc3YnP_<<#XK_ZnzMa%;c-*37H{(k*8QS&ABrc?Xq&QEh|ZAtp* zs$o@Fyw?+eNs!V6!i_Qy`RU9FM_m@WgD{&eEeJ=HQJ$VhdmrC#j+zuX2fd|5GRE_y z?_d8YGnl@-*5uH+JBfO8SyCbllX)qC-#Sxt37&EEbmJ>{r>#5M8k-*?nv|xlb*JFN z|Jql6s9p%KU%Sy-DSA!x*2K0xm3-Jxz34UYZf(uNi{~_-4#a#B;2^V3tQdFlcMzl) zyzcs6wFbaT<32ScT90{9+DO9F# z47t27lfHU5Z@4iUPOkTA?h2X355ff2zb!OT2p;0|>)xlm^_$1nSQuw0(1#agc9EA| zABryPf*Ykr3nj^@CKSd4-uFG}VA)hb6FdINyUCmGYKOZll&McfHiQR^8q*(}XZ&D4 z#Fj-zEn!->EVr-WBcz#W&j49;{`NUeYWZ|FekxL?EaFrKaZr;DcF z8es-!fLH1heVv!of`pB{gLVrV4c~(>5&oz;xU!R|o{$Tk(!6%8PATh4!KR(NFTcm@ z5u~dqHA=SBT$M0J4er!ceDm@v+LLEeqbC6 zxLr7q4GTHcNellr(Qw=S<@Dglf==$-+PG`D6;~K{h)so;MR07_q2EhtdT_e_5r^D zzmJ?MHmYrBK&ipi#8J&{M_0f>8){1l z%%&S#UEm0CI{Ww?U<3V5dwjI~rSK)ia zWY!)XbH<8gn!I)YQOM6Ujf+l6x2nNPI}tDMPAaR=12>+#%vzCXfJ#)=S%*uu;h4fslMhc zQ}--2Fp7!Rmv+0gly!SP4(sgvG`{v%Q|bXR5mQC;7$#N2R@i>FoJE<}T9${Roim70 z*feH@Ao)I@Gg9ZmAU?Z6hAiO;5E7mr`PmP?;gxkQ?Ld??BBf_9Z}L-6#C@+BR}(Cu z$qKf)+=R~dvh`qOI|$C6^#yLE2M905w`(q%2K$p$rk*~!ccCRq{)=n&y?F<6tv47B zGx+L#OZD^jR5R#gw5Al&WAaT?KlU_F6)+awUUBVv%L?gZ9Vw!OH%HMe&IEbC&uf{w zgXJM%id}I@qDm%|R!T3gWID!w!d+77U0`TH44B{P#+19-;KdW$BBpGxYk=@U`sDN47H2YkqY1mj~ z{0XFxZ4%E1$!wGkQ|gAreS1+2UX4(N>7+OkYtKABTsO+!lQ!#U>W>J1_LOk40n5$}~125?r%+168$I0{hY?FA>uZT+cJjKF7T^GwJ448hu&Fu{2fo%xC+I zsQ|wFB*Z^R6yZoE{nlqCQv|9GA|!;1)e6;$Je;!zCCr$lO(B-RNzle&?~BZN5w*f? z;&TOIDP*cfC#3{8|0pF0?}COnDMHR<&E$K%oyoVNu!6-chQalQk*?#F>QvlN#dCcJ z$%3iIwXWbnGy4GQfPR1?5x3qKD~qKxXEK8GX7Z(c&dTt(I2_S$2m80ZhO0D-2!h|~ z+DE3Icd&V>MJZ^Qzc|8Oc4@o~p5%Cr^7ap^VXS16||N*P+dz62(jcQ*N6>_KD#j~OqCdHIOr_l5dUBUO3 z->DDV?VBwXLDepkkUC-%{;EgDi9A@~JlyUfpp}=gG9rsNA z3f?T*jW!mWOkQ^TzxLVO^pdc2u-+0bI$wYD`1Okc7UH(IoDoT+`a!7>w14-4^y8mK z8eB`a+xO~6lD)1#KO!HEnt>`AX+lHO z=nGY5k?L1+=}J%!|Hm2vXW~~xgN$||_9n5_rM@)SyWa;pV0PZJ$3KvD+*?3QWR|40Cq*yHkAyGqH^nNT3WMtY9ZeCqQp_YbdU zBy}+E6ap2YE9fs-ObnSFV9fXV6_fcs?Mm$WA2FF`UAXNHLUZ`5mG=^&*b)Lg+x~!yk ztk6p@9GC4weTLU8r+4eqY{Qb@`4j5KWg|aBF(Gj1^(J+}M+|!1tT2%ZSz<2av^{9eOjXf#>w zrvMuDq{Q$XhqmoR4h^_%-EcfSMvY?V<=28r5;drmF2>RNAWz&O?e)lcd6|>6OX8(= z@c6ohXF0}gX-m%q-bZ^G_xOEo#?2fJMW>D09E*GIAYU_g)q>#DTb>+zc5<177jlM{;Gv$!-HdFc#xG}kHsB2^R@uv3I#5#i~+9u`MK6qhrGQ$7*(>BL=9`7 z=)ecETI5k^B27SMdi{D~-)s6>QxZXy#&!wi6u;+%_|f*q@fOfsfJehf#D zzJ7@=sMQvC>7U^i{J*vcqWT9o9|Ech$xgn9xCRWJQ=pS@dXY(?8a#Ja zV*%Yo&mBp6XcS_ftUZazB}mEvw?1b0=3&T*49(Fl3wA_(U*7g;CMG;aI2JI{zo>R2 z=Sw>*REJ$h&_vu~M@lgE$)*0F>j!HJ)8#(PU z_qiZraXc7PTM%3or9oj!V;ihdr-$H?8;C^7LxjE?{CQ?{ptXf>=r}G|R1hOwDA=P$M7iQ4iIy*}S-6w@8`5}Em|%pr zG`yxhNsdzNPhN>b+m0=z<>1t(u>&BwHm0cO@Q&`;$T&ZA!Oq$!}-aL@%(GL3lS^P`AhmF zRBLPL>C)QeP+FwmH093XX)#^7MM}^FckDrU1C^n6pX$7$jvcf)P)E47#OFKGObxqR5_$*j)rU6_Zr|Du6_&nvYnIHv z4z)EGcICriQpO#qtj(!Fz*j5WE_;D163@z}J@eG9%gpDr@|gq!g`fQf#h~AydMuGJ zdh?|Ul3DSx?OCN!6a^uPZ7fy5AIXwZ^e8jLBt}nnNNHFP|AFZ>!IsFfOghb_)N!*`yfj7%C zrXSlcBLy`t@LR@V;-mi{F{1b8Z&g>nYqP%PG^w$ax*Y*bh3TQ2?SBIpG2{qg>x7Lc z-Z-%vBF;k_ex(Hu6qi49)2Qs&pG?1RK#KHZ8m8tT)*?0oLt(7%5APPv$tSKJBz#tr z`)?b-94Eo^v1`^i?^Dbqcqsp87l3KRe(K(gNn-R3@bC`&h^V5-v!ez($SNRXZUr`%l>ep`7Ps zes1gcDx96nS%!8BZD`ArgI~vU4w^a_iHR6s; zjqfj4lzR7i-o@2qI;`PQ&ys`Nhfa|IZR76jWx=}}U5j{@c?J9fAv7Y0Z*{1!FJ@7g zkO*)y8w=B5h!F}iaZ*vqR6Kta9tiwa!Ke4n3clYFiwgdu-*wagq}o!StI&p*_(UYQ zZF3l@H_6fjU8VzJ^_Iv82MX~iSLKr(_)j<7s$CBrVGBgs74V!86=%DEjbn{_HFMD< zxgjq6A)x@TJF#0?$IA!TD+E4<+3NjsiuFG`>?*P)s)MX0-0emWwEozI=N_E#?5~cK z^2T%?{0)jAeE9COLVercpa>5n<4oK27H36C8sOd+4&N>b_?ZJqaTzV_p4V8_!Wt=d z`iQ38o>nh*1CwgO8=|jM*@D|&E)Hh5YA)ZGe63DRPo9gn^rh>mesQaLYz~c}5byt3 zdhiCSImWE}E!>4xG4nVEBH~4H50$zUqlylD{TnY)pYllS2Nl9f=5H#*o*4!l1E>(F z^t73BoN__5yLrXb&{TaVR~Ps8*ANE6FqAo8zc%gp=^t zR3%0;0))f|G*f>v62D);FcRs`{R;^3TlnMbX*lOS(fd_={891U5Av7cn%%wIMs8m| z*6U@aN7Hwmx+q!YRulDmK^{)hw)p&0xz~^1TMa==y_s^}0DwuaObZr$ELA!0THi@6>M2(Lla8oDz4Lm23uFim`3&V~FR8@wo{s*!pd;%E zsW}DaP#5_fT%$2YHT{rEgx&0J_YFcf#D)K2BmRnf9J3K6Cxos51mu6Q5y4UdmqGkT z+re?7<0OPz0)6OasnS;xZNqu3WTk7g?*CQngPZxt?cr3=N`it80DaSAivu2`68Z#x_p94P%L zIEc8Fx(puj5>!EfHrAp{ezkbVh{Ov0@#y1*0|h^$5&4;!TW)Tvn7X{@8Y$bfFK&em zT>a5-u=x30o906PR(U(feLQ+*n51mE*j$VEbV!p{{M_G^MEUJF*xB7i*B-q6G50uWIby5)(n&U*CaIWoO!KW_qHitVu$NxMtbmggth zu;CzKK|CB|?bBt?kWXs>va`%9sNDMrkCfg*v$wn$`~75E5o;ed?)Qr97j) zf`za(41?L_&9%hCH?7|Af^xi|XKX=FUa^@JH~Q7(()Xz)%0z}Rfh}z17(LNhU&fd5 zOk`Dn06~907q1!+AiyL1ga8q9Qi%|xqJ><=a4Gd#y`U#GdqTYwEx(SL3WcR~!OPeqwuv_Df;;C_a z4>=quWr_D#y1~WzP-_22)?slei<8DF6vrsWz6uPA@gDD!k!zG#Y7*Da_YcG`-QRc< zsHU?OBiaV_xYRXa%~@zM;EuFxQFtH6)Q+PEdi74<(p00d?ur1jOaDECb3CWw_4400 z8RNyr@q8htCZAi^pop-VQ8h7doS>~R1A>GFDUL|d(AIU`8@@seTG3YF107ClMOJCY zWX8EThLLf8@7^X2y?pgca$*4@uc(7Uz!AiWHbTWimu#vgx-|+=rT$qk4`gjqz%~i0 zhW@2&9M#(1KoVgu&i3H(=MB?KdB*iNM;wL@(R7+7dj08ZZbipbJRUyqy8(Ff484kM zS$vj*xQ68-hrS5%k+k!#``3|h=QS?5;kl%=wE~l-3pigdQm<4vE<123YSKecd<3` zMpW!ZZyi6gUG=`>`bK$nd2pf~e;lYez#>>OO z<+IT`+;JD8T-=#@jb{hL9}N$dr_+esF0gttL!tKN3OWdAy63WI-a_4~tPF`Gtd{ud zg0A!c+wDn(2v0TK910$nj9id`J2^UE%Qs@U^7W3c>`9x$H@?`Xppju`?vV|q{k&9o z03wlakLMafK1X7xJ!|4Ba$7Vfp|^h`ySa&+RXXLh315&2a}3KXIS_V8!gGHjO0p=? z#;oL|VwE7pOM;0#vhG$x#GK$_AB$zE>R<*lXz zK@Cm-DWdaHtUn_KVTh2CepmN`(2(HUM3;4lCE5yFuHTnEOGqE^gDmT zg5;>X2?{4LDlYq)tq*5}R#wIMNiOn)K@stgFLUoY7wH3aVM+kj+U&0`>~J4<-6Vf@Ey-?aEixAV2?hf>t_`lY2k| z^3~8VPj4b^lo}KeMuGyuV*+HmGKMrkYY1vVi!@rku1lVBG`t2oMStEEO&_kD{gZ1v1pqXysGwjFyM50Qy-=39IHGvDVZPscqPx@l82 z@>ec8T=I-J-j!O+@YHG+61b1XzT~?LByZt?U%LE?HOK;$D+`h&?A}bZ-*}9fS&hbP#6$ z=paN^#-~g~{hvArKWNEW0Q#d!H(?;QK;ilGwo0E3iSzOrYNe|vFzCm$Su84-(TY)r z&|~x?O{t`W^ioZ4lyh7kUW`*AXF&rSTs%>>Z0Z$~HHXuN7T$Sw^4oq3!R6_C;ED8k z)MI*jZSO9YC?;~g6Z*kpBWFI$WvZ|tj+~9;;Ttlg6lwMQ?H!~DAzFe6t^oqyG?woF zd4pT(+~4tm4otm*Y47{m+qlnnYb)4ua#9Ck57`%}|Fc~IDclE8Oo|pOk2YIif%(p$ zP+f46epoYgRWZ80-$}Q;pHmSXL?wKVA+oftBz)X{c2n0mb^TVg!IY!^oK<@sct#SM zv|Sa?co$y70FOEh8cj_lUs5{?3k`+H50LCECgA@z-q+J#X;^&#+Tr^)Wr%)__e2Di zk%TYj==piieW?<=EnKa`4MzJjUK|@&MAVa$H#6W)Jmw;b-2fU9f5xQYBTH@Fw6@mc z$#;r85ycK+RiEyueeQ6ORUT$XkZQkWx{HV+tW1w3yfR!`efjcIg$Z%DGyTzn+zlQ0 zJSIONEKG|%{^VDF;71oy$a4czu{`|4JBu`)&rb{MFl{9a^X*%{5dSQ@ACp=#a=%eK zKOI?o!^q`DtSij|bz5Uu1$zZj-=-SqC1T6U5|?`;TD@AQ&I6Pr)aT|aS+PUP&~S*- zZ1Dd5162cvq(Q_^L8irgnBLi3gTNOb4FXPkRei|8@8xODO37?$wfD%zx4bk)jC~Rs zm<&nr_uM(fTZLa7>0(9f8k1rnm$Lqzf0S*SjJaEyp;S5E>9yqFG5}@`k(B~nR8aYW zxtDFO6C{kAlCz1=AwwALlzLCkx|_wao7XxEfIdkYt^6K%o!#qMNg4v)BNiW_)+ zbT3za_Ti#l#A{KV*~ZF>`QiL;voU8jm#QiMC?8`MeSzo`VORO8|o)jxS6G+YMdq>;bvG}Y2>46O{^o5TT z#Cq91sN9)_Q?+?8ex7(gopG>-{0DbpY~yDLCTKrZD4Pb>X=(>67e85QR5-K}9FD3+ z6wT}%j8L7+a{!BsDx%226-pbv1sEX@!HM84329{INZUGllGrK- z?wL5nJNo-T|EW53Im=M-&S|_KzC&Fr;9So&b0RvBkO9%*i#x(Ox4WgB8F>i_?nHVc z+?b-pa-P)_7r)KuPLof1gb7QzG6;uO%AK1(&;iZWJ|i6us%Pv>gOCO;7Ldsw3#mwz z@M~%NQIu=qMmfAL;vUtq3}~~KRQOSNIK~1P}nsHpeILDN|Ar|f@kZz9Q zQ2fEC{8NtLy0`P5!+fcZXJnB>CVu3(vef@w|6)b)jo-MGtWMFGriP$3p|#9o9YTJO z&HGB|_YFS0=Hgy-(Fep-((Sb4Mys_?cHk3OmJ(g6`HIi5Rk#Vo$3j20kbI-QZl+^i z{CH8;s6sro;mPNwba=!vBXYQ?EV$41;Sxkvuh{vvM+ z8R4mEhscjE&*oUCyXGF76yzG@`ma7t2CZbqRUr*5(_LUk#)Z*~gDT=%pjx5tVQ9`P zuor6%zFJ{=n7uxj`j;uI_f@?o6KPc*YfDI1$HVEOrOPXlS50)0vgu$6woLTP2Km2% zE|0fx_#!n8?&uuvH-g2V{rO+j)PL{!{4acrAFIg!P6nK86P^A4^~EMh2lc(D7iTMu zdI!F{PA@Jl&I)=j2tvGfT`r~{DhZXd>WUqWc-sqyFQV@;sH|U>TRO07dT#?o-`gFy zd*ekx!3wNrW^ZG$0FFPUx|3qo+h8S zyQ16c(C$z)b^i_n2rP{VQaqZjdapz~scKzsO-+zRz_L=JI8Ll)s<;pv3>!@FHJc4< zTME=iicKHPkYW$d%)Ur^+l3_>1PQVzos#t73|%eQ;~XV!_QXG2T6DylwR0%h-4dlu zYi02hW9TEd47w6zNYaAibGRkz`xWmk>x*wphdL^*PN&N)YfAzws#y+Le?AyHWG9Civ5K@w2RHt5I;@S9L~ zI%-LJ{bL*a9Of-wP0fHo86+xvnelU&-YQ|s#jS|DKCB|HiXfGMF&9oC;2B~T&fbrc zNhIaM?qG@H(=O^<&#s&2@Cozod9)(_+Ed}{M51i$em-b4Lj;c|7IJ<=;-F}&pxhDH zDMuxDUyDzKXW_ya3nxCq%fu9rwXp?wVD}l|w8~vI*gx4T2~pydvyR<0P&q=hhoShz zgBmWNYZ@0Q-0=aBf<8FeTg7ED-(~hvTOQwb z&LHsiKvM7MDpV6gD#!=-5=IgWP1d=Wj`A29PkAUfoG*Iqi#KDIXd!1@*Tl^ITsPiv zaNoVkuT&nYJ0r5bL5!@p&TSN&)?+f{!ERp8ohPkI)#KXqP{DC)PSW6q5clRd5-J>aWHGug*8A*K6F3CREu_+usZo#5ogJ^GlQ9Y^&ytW#!F+N zKyDc+-Y2>%((3_{1a3*QS$wK8if2w=S&Yk4fIlYb(PT%C+k>U>GkS9EH#EfMJzI>P zhVar*vz_$w!f}0l+VF8lT2Vy8d%FXg#RD)aFmjtel9Idla)5r)=!#dcg>Gghfl)iE zIKDu~8>;uz2=CLjVq2tfZ1v=Ust>ZlArwc6^{viAt%^bXMtd9oLB_!H257rHWaKW1eS;x3pqI~yGEmKqK+f+E%Q2>o{NO1WHbbT`8vYjnfyFCFiuVAnN6 z==qFA>l0kFDK>T2SxSz14&Ug!+7hpX~RWsf!YN)MN* zUfD3oYFKXXR8Zgu#wDEXv3Dvfw=}N$p55R)thoTo2*I+607H-I2U-jcZHIVpd{0^n zJ$8pvrRY%Fm`~Syr|Aqp1Ndf<4$j+Ev7}ReMm_g2dCi- zi2)c`*YJ5XuQdA!yHbPW9g$!`a@%9Zr}wVP1I_X^zM65fX$$HYI|3JXUHW zGQplSNp3KHP+N+f5F|p4s5V@dMSd}iP+TcMrUbnsNy^6GpW zo&Td{a71^(5ruEvn8HHXTrKorPFL{FITz6|9t~Lth^_5*srJCpV25z?emvoH^V&LtFI>e^Bl=fOxN}i+K^SumSVmh)Fk}L|5 zR|Uv?Hs7AcZwu~J~g2gAEVjtR|#j1H&FbaOpiNsc_ zq}y)7aRy5ygH_&ju8RXAP`_fEHY8kH9B3`rNl$OC%G zXlDcF%Lt(WIBqNk(Wwc9fXn73ZQ?_Sp2``)uwz+PD^ZG?-hE7nJ zj@Yexx{YfJiTRQGK$uKDcp9{txS_dTGE$VTN|m##)FXSlwu9RsfBnk*c^^QvO(&Ri z&QHUI^fCwO2CdQLG$l^lx1Qf0d3S+1tn`9MAJV;ivMnSFs(0jmZEs*Tsh+hk{qkD= zDR8Rz0~93dBA>84A_qNj=y}3(%a6-TL;bM!Kkwf3@eO4; zX^Rn@9Pr zpSh1PUxi`5I^TJm(4D12fAHSjpgfw?ze#p{QpA$O2kYGEX83NEUIFB28g>v3^FD|; zTIu*oVAP+(#zA-YX2(GS|pB2UluaAI0w7 z{QHlg2afh;_0jF#*RZGnX7>2(i(&d`B>b=fLOi6=+@cnRdF{VmMIO75h`T|v&dv&Y ztP_qBJd#l>VkkZu*59{yB6)J*Xz|y7QTIn;fp|Cc zE7y!_%!PVP%~&{fT|i0zRJ5tlYp8&%Cu-jbdvO3*NbQAR&0@sY_0)rP%!#6WT3hri zgO=c173jEEt3%HQ_asuF%2^woDEq^zRQPAdX|G)geQ&O;S>gflwLo|8`<@G7U$$lk z^u5XRznwK+xn3`ZQ~6Xv*o~w0v*OEbxhjmZO9DmN9D%EL>#;F8=7hE<&?9~FN|h4m zqKe)%u)&9&|3+CB`xATVjv9v*{2)2CGK^RS;GpiP9J~uF;4WK-`t?Zff4Wxc5?+v! zv#YPq>V~y?NMmirr#638Lh`(d0D6ybfQBs|{2qiQZyN-D#PhXC%;hnZIsJxg0Lq)$ z_&E2TNVTME`?mXKtN7G|dX-sN`|16$GrQB8Y6T8rYk@am^xIN%=<51ch2d_&SR*3w zMngMby(<_Fb1(+N^|V_djsR^Li!TFt^4I-ZZ@OH?gy-svLKQLq?@2QCqMc3ELF7^;p^=Dpqn*?s=9475JF^2_*@3-%h$K+XU1;eWr{(F=B3o4@1g~C(dG*cjftwTl+g{)74sPiqZ>uq$Lwu6+ z#L|}j9`(poH|hd3Z?*LidQiq918Uf&SLoTlM7W zp1MeqR|aGZJjROE6UA3zGl#y%+dnjzy*a{;C16#sEI5`Pjbv8%f10`$Z??}c+-bCx z(=)U(ip;&KR4&M6zv$WJ`wzbFIq&nl@B6(Mm-^XTdN+z>GGR9`viZ_p|9OTi3jMa+ zv9a(>NbN4`SfpfKNHbBqHH?L}v-Mqs$Cx+ieGSSsDK}8rFtao|6iDFa&%83ff&|C7 zdUvAb3zV^%btLlyM?5Vc!Kg{DJ;N#6n-QEgL_CdLqyEU{ZE>M&zF65Wjxii1^AXic zrdx=d0BgZm)SN2>ZbUJQ4s*P~8JRS-NOHg&%&>ejNnf-?m82b|x-C-BwAEhL_q_3@ zQ&Uh2=?}R&ZcX*w(Isy8m6@Ybqq38rHJXU*a%u-qQZfGf<}^Zmz~XiK%tg^P9n((y zl26|ntm5L=1rGi7#0#C1q_%it0blccYc~*U%+Ho=o11=6oo1P&VsU}bb7Kp=PL=6VRjn!@f|n#5iDRr~0N6#}J`?d;Z*)R#V?;Uf zlyIjURokNLVe!^IyWshVQDaqusI8_{k z)WDHEA%YWaJ__B0v%2`4pmP}$iaEXjxL@Lk957CF9!5Q{QI@+4t+R+igYj(w^M5ux zSD05j+T2-#@l*JgL9a76Ihuq`K6b7wQa99E<~3M*cmh`5@mLlgk}9wgTe6X|duA~u z^)wsy@=RYSFSHvImPoAF(e6~2|A5t{J~7+TVr{~PRfPGp7&6q$Ikp42+OA8vC&)Rd zu1?<+%Ed%bLis58!n*Q>&pP_-YAltW*?4&%@&-+64w9X*sHj&0Q`Hz+OfZ_kxN+scnUN|4W z-(MV5dh6ZpcMy4SP2o6r5Njyx#$VP!E#F+*7OGb zXVLHy%O@gr34qVGSQ8iQY&YKE{l#C+(??|wl1l}#>yBy>Q}<>tzP7$j0zzxYpVO<&B={G72gggwmJFQ1p0T zbJ3leJgG!5+Sm840>JiYdX-oqg3g;=c67Lo9dO)gD0gTc| zCcExz3E_|;C1tG_!nJM>;`9H>tXQKKYr0I#>-_)CA*ue6c|;-RgL7)y5M$xIeb1*1)rf*ouCcgO WcQ^2tyU5%f!147)c`-dBvi=76-Ru(p literal 0 HcmV?d00001 -- Gitee From d51998adf9247d11bc8fc6d9a18f899cb99d8965 Mon Sep 17 00:00:00 2001 From: NEU-lab <2942375747@qq.com> Date: Thu, 17 Oct 2024 16:22:34 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: NEU-lab <2942375747@qq.com> --- thirdparty/capstone-4.0/docs/hap_integrate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thirdparty/capstone-4.0/docs/hap_integrate.md b/thirdparty/capstone-4.0/docs/hap_integrate.md index ee131c20..eb02ff5c 100644 --- a/thirdparty/capstone-4.0/docs/hap_integrate.md +++ b/thirdparty/capstone-4.0/docs/hap_integrate.md @@ -45,7 +45,6 @@ - [测试三方库](#测试三方库) -- 编译出可执行的文件进行测试,[准备三方库测试环境](../../../lycium/README.md#3ci环境准备) ## 应用中使用三方库 - 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件拷贝到该目录下,将编译生成的三方库以及依赖库全部(动态库名字带版本号和不带版本号的都需要)拷贝到工程的libs目录下,如下图所示: @@ -63,6 +62,7 @@ ``` ## 测试三方库 +- 编译出可执行的文件,使用原库自带的测试用例来做测试 [准备三方库测试环境](../../../lycium/README.md#3ci环境准备) 进入到构建目录运行测试用例(注意arm64-v8a为构建64位的目录,armeabi-v7a为构建32位的目录)。执行结果如图所示 ```shell -- Gitee From d524557489cbf860e4c902a1c62a36b6fb129a7f Mon Sep 17 00:00:00 2001 From: NEU-lab <2942375747@qq.com> Date: Tue, 29 Oct 2024 16:33:53 +0800 Subject: [PATCH 3/5] change Signed-off-by: NEU-lab <2942375747@qq.com> --- thirdparty/capstone-4.0/docs/hap_integrate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thirdparty/capstone-4.0/docs/hap_integrate.md b/thirdparty/capstone-4.0/docs/hap_integrate.md index eb02ff5c..6a38ba13 100644 --- a/thirdparty/capstone-4.0/docs/hap_integrate.md +++ b/thirdparty/capstone-4.0/docs/hap_integrate.md @@ -47,7 +47,7 @@ ## 应用中使用三方库 -- 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件拷贝到该目录下,将编译生成的三方库以及依赖库全部(动态库名字带版本号和不带版本号的都需要)拷贝到工程的libs目录下,如下图所示: +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件和库文件拷贝到该目录下,将编译生成的三方库以及依赖库全部(动态库名字带版本号和不带版本号的都需要)拷贝到工程的libs目录下,如下图所示:    ![thirdparty_install_dir](pic/capstone_install_dir.png) -- Gitee From 27515108e44d2cbad8008cd2ac2efb687443867a Mon Sep 17 00:00:00 2001 From: NEU-lab <2942375747@qq.com> Date: Wed, 30 Oct 2024 16:21:33 +0800 Subject: [PATCH 4/5] change Signed-off-by: NEU-lab <2942375747@qq.com> --- thirdparty/capstone-4.0/docs/hap_integrate.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/thirdparty/capstone-4.0/docs/hap_integrate.md b/thirdparty/capstone-4.0/docs/hap_integrate.md index 6a38ba13..59db9567 100644 --- a/thirdparty/capstone-4.0/docs/hap_integrate.md +++ b/thirdparty/capstone-4.0/docs/hap_integrate.md @@ -47,7 +47,7 @@ ## 应用中使用三方库 -- 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件和库文件拷贝到该目录下,将编译生成的三方库以及依赖库全部(动态库名字带版本号和不带版本号的都需要)拷贝到工程的libs目录下,如下图所示: +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件和库文件拷贝到该目录下,将编译生成的动态库(动态库名字带版本号和不带版本号的都需要)拷贝到工程的libs目录下,如下图所示:    ![thirdparty_install_dir](pic/capstone_install_dir.png) -- Gitee From 87794baa7fce59e12633f01aa1653ae8b1f05cab Mon Sep 17 00:00:00 2001 From: NEU-lab <2942375747@qq.com> Date: Tue, 5 Nov 2024 16:03:30 +0800 Subject: [PATCH 5/5] name change Signed-off-by: NEU-lab <2942375747@qq.com> --- thirdparty/{capstone-4.0 => capstone}/HPKBUILD | 2 +- thirdparty/{capstone-4.0 => capstone}/HPKCHECK | 0 .../{capstone-4.0 => capstone}/README.OpenSource | 2 +- thirdparty/{capstone-4.0 => capstone}/README_zh.md | 2 +- thirdparty/{capstone-4.0 => capstone}/SHA512SUM | 0 .../docs/hap_integrate.md | 8 ++++---- .../docs/pic/capstone_install_dir.png | Bin .../docs/pic/capstone_test.png | Bin 8 files changed, 7 insertions(+), 7 deletions(-) rename thirdparty/{capstone-4.0 => capstone}/HPKBUILD (98%) rename thirdparty/{capstone-4.0 => capstone}/HPKCHECK (100%) rename thirdparty/{capstone-4.0 => capstone}/README.OpenSource (93%) rename thirdparty/{capstone-4.0 => capstone}/README_zh.md (88%) rename thirdparty/{capstone-4.0 => capstone}/SHA512SUM (100%) rename thirdparty/{capstone-4.0 => capstone}/docs/hap_integrate.md (91%) rename thirdparty/{capstone-4.0 => capstone}/docs/pic/capstone_install_dir.png (100%) rename thirdparty/{capstone-4.0 => capstone}/docs/pic/capstone_test.png (100%) diff --git a/thirdparty/capstone-4.0/HPKBUILD b/thirdparty/capstone/HPKBUILD similarity index 98% rename from thirdparty/capstone-4.0/HPKBUILD rename to thirdparty/capstone/HPKBUILD index bb95ddcb..f6732898 100644 --- a/thirdparty/capstone-4.0/HPKBUILD +++ b/thirdparty/capstone/HPKBUILD @@ -14,7 +14,7 @@ # Contributor: wangjialun<2271411@stu.neu.edu.cn>, zhangqian<2371418@stu.neu.edu.cn>, wangyihao<2471389@stu.neu.edu.cn>, wangying # Maintainer: wangyihao<2471389@stu.neu.edu.cn>, wangjialun<2271411@stu.neu.edu.cn>, zhangqian<2371418@stu.neu.edu.cn>, wangying -pkgname=capstone-4.0 +pkgname=capstone pkgver=4.0 pkgrel=0 pkgdesc="Capstone is a disassembly framework with the target of becoming the ultimate disasm engine for binary analysis and reversing in the security community." diff --git a/thirdparty/capstone-4.0/HPKCHECK b/thirdparty/capstone/HPKCHECK similarity index 100% rename from thirdparty/capstone-4.0/HPKCHECK rename to thirdparty/capstone/HPKCHECK diff --git a/thirdparty/capstone-4.0/README.OpenSource b/thirdparty/capstone/README.OpenSource similarity index 93% rename from thirdparty/capstone-4.0/README.OpenSource rename to thirdparty/capstone/README.OpenSource index 242e23a8..54c8037e 100644 --- a/thirdparty/capstone-4.0/README.OpenSource +++ b/thirdparty/capstone/README.OpenSource @@ -1,6 +1,6 @@ [ { - "Name": "capstone-4.0", + "Name": "capstone", "License": "LLVM Release License", "License File": "https://github.com/capstone-engine/capstone/tree/4.0?tab=License-2-ov-file", "Version Number": "4.0", diff --git a/thirdparty/capstone-4.0/README_zh.md b/thirdparty/capstone/README_zh.md similarity index 88% rename from thirdparty/capstone-4.0/README_zh.md rename to thirdparty/capstone/README_zh.md index b50ccc9f..dffe627a 100644 --- a/thirdparty/capstone-4.0/README_zh.md +++ b/thirdparty/capstone/README_zh.md @@ -1,4 +1,4 @@ -# capstone-4.0三方库说明 +# capstone三方库说明 ## 功能简介 Capstone是一个支持多种硬件架构的反汇编框架。 ## 三方库版本: diff --git a/thirdparty/capstone-4.0/SHA512SUM b/thirdparty/capstone/SHA512SUM similarity index 100% rename from thirdparty/capstone-4.0/SHA512SUM rename to thirdparty/capstone/SHA512SUM diff --git a/thirdparty/capstone-4.0/docs/hap_integrate.md b/thirdparty/capstone/docs/hap_integrate.md similarity index 91% rename from thirdparty/capstone-4.0/docs/hap_integrate.md rename to thirdparty/capstone/docs/hap_integrate.md index 59db9567..6f722fb7 100644 --- a/thirdparty/capstone-4.0/docs/hap_integrate.md +++ b/thirdparty/capstone/docs/hap_integrate.md @@ -17,7 +17,7 @@ - 三方库目录结构 ```shell - tpc_c_cplusplus/thirdparty/capstone-4.0 #三方库capstone-4.0的目录结构如下 + tpc_c_cplusplus/thirdparty/capstone #三方库capstone的目录结构如下 ├── docs #三方库相关文档的文件夹 ├── HPKBUILD #构建脚本 ├── HPKCHECK #测试脚本 @@ -32,7 +32,7 @@ ```shell cd lycium - ./build.sh capstone-4.0 + ./build.sh capstone ``` - 三方库头文件及生成的库 @@ -40,7 +40,7 @@ 在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 ```shell - capstone-4.0/arm64-v8a capstone-4.0/armeabi-v7a + capstone/arm64-v8a capstone/armeabi-v7a ``` - [测试三方库](#测试三方库) @@ -66,7 +66,7 @@ 进入到构建目录运行测试用例(注意arm64-v8a为构建64位的目录,armeabi-v7a为构建32位的目录)。执行结果如图所示 ```shell - cd /data/tpc_c_cplusplus/thirdparty/capstone-4.0/capstone-4.0/arm64-v8a-build/ + cd /data/tpc_c_cplusplus/thirdparty/capstone/capstone-4.0/arm64-v8a-build/ ./ctest ```  ![capstone_test](pic/capstone_test.png) diff --git a/thirdparty/capstone-4.0/docs/pic/capstone_install_dir.png b/thirdparty/capstone/docs/pic/capstone_install_dir.png similarity index 100% rename from thirdparty/capstone-4.0/docs/pic/capstone_install_dir.png rename to thirdparty/capstone/docs/pic/capstone_install_dir.png diff --git a/thirdparty/capstone-4.0/docs/pic/capstone_test.png b/thirdparty/capstone/docs/pic/capstone_test.png similarity index 100% rename from thirdparty/capstone-4.0/docs/pic/capstone_test.png rename to thirdparty/capstone/docs/pic/capstone_test.png -- Gitee