diff --git a/README.md b/README.md index 57dbc3d..7440f11 100644 --- a/README.md +++ b/README.md @@ -9,11 +9,33 @@ * SDK工程所有开发文档均使用markdown语法编写,需要使用markdown语法解析器进行解析,方便阅读,如:Typora;开发工程师建议使用vscode安装markdownlint插件进行阅读; * SDK工程所有文档描述路径时,"//"双斜杠表示工程根目录; -## 1.2. 编译 +## 1.2. 开发环境准备 + +  工程的开发,需要预安装一些开发工具。例如:cmake的特定版本,llvm工具等。 + +### 1.2.1. cmake安装 + +  cmake是一个跨平台的安装(编译)工具,它是由Kitware公司开发的一个开源软件,可以用来配置、构建、编译一个工程。 + +```code +# 项目根目录执行: +$ make install-cmake +``` + +### 1.2.2. llvm工具安装 + +  LLVM是一个编译器工具链,包含clang编译器、llvm核心库等。此处只用了clang-tidy和clang-format工具,一个负责编码规范,一个负责代码格式化。 + +```code +# 项目根目录执行: +$ make compile_llvm +``` + +## 1.3. 编译   架构设计上支持去平台编译和运行,本仓库源码可仿真运行在ubuntu系统。 -### 1.2.1. Ubuntu系统 +### 1.3.1. Ubuntu系统 在项目根目录下执行命令: @@ -24,7 +46,7 @@ cd cmake-shell/ // 在中间文件目录进行编译,把所有中间文件 make // 编译全部输出构建文件 ``` -### 1.2.2. 交叉编译 +### 1.3.2. 交叉编译 参考: @@ -37,9 +59,9 @@ make // 编译全部输出构建文件   交叉编译请参考基于IPC SDK作为子仓库的工程配置,此处忽略。 -### 1.2.3. 小技巧 +### 1.3.3. 小技巧 -#### 1.2.3.1. 代码阅读辅助工具(基于vscode) +#### 1.3.3.1. 代码阅读辅助工具(基于vscode)   为了方便代码跳转阅读,除了安装基本的c++插件外,结合cmake构建工具生成的compile_commands.json文件可实现代码之间的精准跳转。 diff --git a/external/ffmpeg/CMakeLists.txt b/external/ffmpeg/CMakeLists.txt index 908b680..60a3a81 100644 --- a/external/ffmpeg/CMakeLists.txt +++ b/external/ffmpeg/CMakeLists.txt @@ -7,6 +7,7 @@ add_custom_target( # COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/modify/http.c ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/src # COMMAND touch ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/src/http.c COMMAND test -f ${EXTERNAL_SOURCE_PATH}/ffmpeg/Makefile || tar -xf ffmpeg_6.1.1.orig.tar.xz + COMMAND chmod 777 -R ffmpeg-6.1.1 COMMAND cd ffmpeg-6.1.1 && ./configure --enable-cross-compile --target-os=linux --arch=arm64 --cc=${CMAKE_C_COMPILER} --cxx=${CMAKE_CXX_COMPILER} @@ -27,6 +28,7 @@ add_custom_target( --disable-outdevs --disable-ffprobe --disable-ffmpeg --disable-ffplay --disable-debug COMMAND cd ffmpeg-6.1.1 && make COMMAND cd ffmpeg-6.1.1 && make install + COMMAND cd ffmpeg-6.1.1 && make clean WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/ffmpeg/ ) diff --git a/test/support_test/audio.g711a b/test/support_test/audio.g711a new file mode 100755 index 0000000..bb40a24 --- /dev/null +++ b/test/support_test/audio.g711a @@ -0,0 +1 @@ +UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVQWTWUUTUUUUUUUUUUUUUUUUUUUUUUUTTTTTUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTUTTUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUTUUTUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWVVVWWWWWWTTTTTUUUUUUUUUUUUTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTUUUUUUTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUTTUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUTTUUTUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUTTTTTTTTTTTUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTUUUUUTTUUTTTTTTWWWWWWTTTTTTTTTTTTTTUUTUUUUUUUUTTTTTTUUUTUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUTTUTUUUUTTUUUUUUUUTTUUUUUUUTUUUUUUUTTTTTTTTUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUTTWWWWTTWTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTTTTTUTTUTTTUUTUUTTUUUUUUUUUUUUUUUUUUUUUUUTTUUUTTTUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUTTUUUUUUUUUUUUUUTTTUUUUUUUUUUUUTTTWWVVWWWWWTTTTTUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUTUUTTUUUUUUUUUUUUTUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUTTUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTWVVQQQQVVWWWWTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUTTTTTTTTTTUUUUUUUUUUUTTUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWWWWWWWTTTTTTTTTUUUUUUUUUUUUUUTTTTWWWWTTTTTTTTUVS]\]RQWUUTWVQQVTUUTTTTUTVPSRRSPPQVWWTTTTTTTUWRY[X_SWUVS\_^\RQUWVQVVTUTWVVVWTUTTWWTTUUTTTTTTUUUUUTTWVQQQVWTV\XEE[^]PVTUTQR_^^_\RPVWTUWVQQVWWTUSYZDDZX^\RSQWUTQSRRRSPPQQVWTUUUUTTTWTTUUUQSR]\_^YYY_]QTWQSR]\\]RPVTUTWVQQQVWTUQ_[EEEZ[ZZZZY\QUUTVQS]\_\]SVUWVWUS^[ZEDGACBB@GX]VTUTVPSSSPQVWVVPR\^YY^]PQQS]RSPQQVVTU]XZ[YYXZG@BCFXSUVPSPQVWTTWVQS]_Y[Z[^]SS\X[X^RU\BuvqqvwwwwwJBYUTTTTTVS]____\___]SQWWP]YX\WUEw~edde{y~|st@QV_[DABNJuuKMGYRQWUV\D@AD]I{`mmf~J_Pu~eeysKG]TErdafzpB_T@ajbsHye~u]WQV\J{bhkiaqSWXEGGD^VrmoAddrRVQ]DKtuA]TSGKvuLX]_EFESocuSvzfet\YXFIttFwgcayMTS^Y\mjj`J@segxu\Bwsrq@Rt{`l`|VZttO[WS|`lmxSVCqzBEKvssJRZOw~zgeJVDIIMF^Cdmle^Yu~e~[QYMv}MYNp}|rqu[SFKJLZTsclcsMd{OFpy}ORt|vN@GDSTXMLCDZ^PxmmdH]vedsEWKsstETDutuJNOJN^SEDFLLZU@ao`yGLd{wCS^KwssJ_QLvspwHFYTQ^GBC@DSSzm`{tS_KsrvLP@w}vGVPGNttqxyKSRIt@SV{lbd}A^Kzxq^QBwqvuDZv|u^T[MF_Pqcbag~Aux{sJ^@wvtOEWXu|{puFQ]Vra`mlfwPOp{dzwZ\NvtNA[VZMuvvJB[Qw|gccdpE@v}|rqI\P[MJtHLAYY_VQRR\^[ZZX\STusgcazrL_Cw}|stL\RBttvqqJCE\V]]RSUE}`b`fdq]Op|~x|tDVP@u|zzy|v@QTQTqega`ayJD\O}xxyvD^trxddxruZBHv|zypwtXUEBusrqtI[WEJqr}rqu@_TJJuprquLMYV^FKtuuK@^WWX@ItttJLF_UJuu}|pqHMZP[ANHJKCGYUW_XAMOOB@D_VVIBwy}r|wKFPW_ZNuuuIB[STWP]XEEDDZYRWDZt~r|xrwKDVV_LKJttIMF^SUP\]_^]PWTSYwrp~yrqwC\TVGMIwwttKMD\VUVPWTRtpv~pqwC\VXACHuHuJOCD^PTU_uwv|ppwA^TQDMNutNNLDZYPVVUTPXKww}}qvt@^W_G@NJIHHM@D_SVUW[Htwr}pwJAYV_D@OHOLMFZX\QWUWVQQT_Lwwqspvu@_V\EDLuJLNNOA\VTPAuqsrpqwOZQT_ECIKIOBFGE^RVTWWURDIwr|}qtLD]]GLKutwvwJCXSU]ELJq}|pJF\WW]Z@NJJJKNM@E_PZNtvpr||}vB]QZCLNIKuttKCYQW@tqppqppqwLY\FNJuuJJKICE]UEuprrsspqwNETPX@ItwvwuLD_VFw|}sqvtOETV_DBHtqppvKF]TTOr{{y}vJHLF]_@Kwp}~~|qO^TTTUUWWTSveaagyqH@D^TVGNKHINIHJHMZVT]YX^RVJeblbd}KD^RFwssvJOM@EP^OttN@DDFFXV[elilgqGPUB}{~pNGXYSwefd~J[QUQ\]WW|mkhcE@}ee|H]^Ks~|qO^Q^XX\SVU[{moa}YMsp@WYCBD\\@uwH^PG@XTUSxlicrPA}{HW\LuO\GwwL\\ZZ]TUQW|bn`p]_qx~u_FwwLRT^CIIL@[\SQVQQTq`l`sR@rys@TDuvN\VCp}v@RUVWUWT|`cgtQQw}sJYWU^HJMZPNzerAWQTRFGV@z`frXIspuA_PSCL@FE\ArvBYRQ_Z^W@eadsGRQuqtJHB_P[ALJN^Erx}KXVT^EYTUUKegxqNAUS@MOwqLVQAKJ@R\q~suMERU_\PQQPTKzex|vMUPGHpsORUEAA@FYWYJuHHNA]VWUVWV}zzx~qE@wqtOD\T\GMCXPUTUQXACAGEZ^PVWUH|~zd{wWW@IKtvH_W]^EFGYV\@Z^XDD^QP^_VUWUIwrzdxtPQ_AwqHDXS\ZEEZLtLZ[XSVPQQ\RUFLvxd{pB]]BtuOM@_WRYFJpqJICYTUVPQVUPGu~dd~qNPRCwvuJODVQCtwpsvHF_TWQVVXwzfgeyqX[JvvpvKEQ_Nvr|}qJFRTLygggdxJSEItr|stMXYBts}rqtM_\v~edge}IGT]Atr}rquFVWZOtvqqtLZPDtp|x{wNAT_LtvqqtB^WPXALHJHBG_TTNvq}|pNF[PFIJttKBZ]TW]XGCMMAZ_VWOpr|sKGYPDNJutJMG^QTTS_ZFA@GX\Q[wr{xpODRT^ButwwKBDRWV]XFAAAE\PDwr~zy|pHFRT_BtwqvJI@YRQ^DF@CGY]Dtrxd{|su@RT_AKwqvuHLFXQSYZGFDX\T]Nq~dfzqIE\AHtqsqwHAD_TTRYDGE^]W_HqygagzsHDWWAts}}ssvHART]XDGD[_V[trydffd|KYU^Mq|}ptHODSUQ][F@FXQPt{edggerBTXLtvprrpvKF\UWRXZEZYRTFs{eeddd{pAYKqrspvttJB^TQS]_Y[[\TXp{ede{{yrK]EJp}}pwuHO@_V\_]SPS]]VCdgdx|rqtBVQ[Nv||rwLZSV\Y[X^]PTu{fagz|ptIEQ^FOup|~~}w@RWR_[EDZ^SUC~fafe}tMZR]FMHuwpsrswM_RXDGGDEY\VOz`caesKF^Q]MJuJJutuN@YWPYDA@GXRMz`b`epOD^QQLvqvuuuuIDSSY[DCNutJC^Kdccg|N^WPKs}swJHOARXHtuNCBNKODTJgonbeJPTH{~pNZ]WTHzxsIZ]PWVRRTq`infvQPt~{}OSZtpqwHCFYV\[EYPUpam`~MUMqstFQQDOLDYZAM@_RDA[PUWufobxA\v~}H^USLJOZSW]EGZ]VPYGG[RWWQVtgba}DUVH}}uZPUXNuMXRPWUPEMLC[]R]PWZzccxFQt}rK_TTWMuHDSTWUBppuGRQPTS\VF{af@QZvpwL[]S^LBDY\SW]MwwKB[QR_]VJegxIWTUtpuBE^\SAA[ZGZPV_GOJtH[WQR\SUuyxrL\YT_uHAACZPTRYZDLB_^IvvK[WW\YSMyrKGA_PBAZBJL]YANCR\BJutNG]VSSPQq}wHL@RXYBwJXR@CA^PQV^Z@uqtA]]^\STXsrvwtuZPDKwLRT^ZX[FG\UYOttOD^VUVWVVTIpqvqwO]OJIGY]UQ\ZCM[QVYANuuOESQPVTuvtqspM]LLFF@XTSZFGX\RVT\GLHLFXRTAwvsyq_XC@LuKYQ]_XGE^VT[@B@C@ZQCJw}x~vYV^DLwH[]VU\E[^\RQT]YYYED[\PQVZCu}{ypB\WYFHJLAXPP\Y[D[^]_Y_RS]RPPSRSQWTXEJzqHAT^[@IJLD_RUQ\[GABCC@E\PWTWVQVUW_Dwy~puKGTR]GNNAEY]TV^GBONIMG^SUTQWT]\As{~pttEWR@JIBBAX^FLKtuN@[]UUTT_vxy}psHYNINuJB^WU[@NwqtHCEQTT_q~~||HSVSEFHwtH@ESVYLvqqvuMXWFvr|y|BDXVZHuuuKMXUPAHtqqwKCXP@JqryvIH_ZCNtwuNG_WVXAHtuKKCXS[BJvr|qJuGTQ^FIJuKMG^SYFBBOMFZ_VYFHwqrqJu@PPY@OIIL@G\VWUW]^Y[[^\SWXGNtvsvJu@]VT\GBNKNOBZ_PWS\YY^^]QUUEFItwqwKJA\SQYDMNNIOAE^PVR\_^_]PTZDLttvwHKB^\UV^Z@OLLO@G[]QUTVVSSPQTU^XOuuvtJJFY]PYFBBOLFGXRWTVQRSPQT\_@JKwwJuMEXWT]ZFCLLAAG^SQUTPPPSQTP]XOHKtJHNG[RWRYEG@AAAZY_PTUTTVR@IHwwuuL@ZQP_ZGC@A@GY^]WTUUTVDLLututHMF\QUSYEA@CBAGZ_SQ^CCHtJtJNB[]VUS^EF@M@AF[\RWVGFLtuutHNFY\V\YEG@@FAD^^RWT[ZFJHKtHNC[^WUS\[EF@GFDY^]WWU[[DHNNuIO@ZYPQS^[DFGFFXX_QVTYYZNOOJNL@ZYPTV]_XEZDDXX^SPVS__CLBKIOMGE_WTS_YZDEDZXX]SPW_R[MAMIMO@GZRQTWS\^[EEDDZ[Y_RQWUU\S[CGBLCBFDXSQUUVP]^XXZZXY^]PVTUSV[FEBMCBFGXRSUWQS_^Y[[XX^\RPVTWPQ[DECC@CFFX\RTWVR\_^YYY_\RPQWSW]E[E@FAFDZ_\PUWPR\__Y^\_]PPVUQWSZ[Z@FAAGEY^RTUWVP]]\^\\_RSSWUVUSXYZAGAFGEY^STTWVS]]\^\__SSSWTUTWW^YYGGGADDXY_QWUWPS\__Y^__]RSVWUVWQY^XGGGGDEYY]VWTQPR\\_^__\]RPVTVTQY^XDDGGDEYY]VWQQS\\\_\\]RPVWUQTPX^[GGGGDEYYRVVVVP]]\_\\\RPQWWVVYY[GFFAFFXX_QVTUVPS\__YY_^\RSQWUQW\XXDFFAAAE[XRQVUVQS\\\^_\_]SPVTPW\XXEFFAFFZYYPWWVVPR]]__]\]SPVUVTRYXZFAAFAEXXRVWVQP]\\^^__\RSPWUQW\X[DAA@AAEXXSVWVQS]\\^^__\RSPWUVW_[EFCCB@@E[YSWUQPR\__Y^_\\RPQWVPPZEG@BCC@@[[_VTUTWQ]]_YY^Y^\]RQWTQ_XGCMONOM@GX\QUVP]_YX[XXY^\RQWURR_GF@MMMCAGY^SQPS^Y^[XY^_RQWUR_XAMLIHILBAX\PWP\YZEEDE[[^]RQT\\ZCMLIINBCG^\VUQS_X[EDEEZX^\RQTP_^AMLIKINBC[\PWPRY[ZEDZZX^]RQT\_EMLNJHHLBD_SUTP]YZEDGDZ[Y\RPTY_[LOOJKHOCA_RVVR_[DFGFAEZ[\RPTRXGLIKuuKNBDYPUVR_XEFFAAGEZ^]SWQE\AOMNKLLFD^QTPY[GC@BCFG[^]QTS[ALKuuuJNME^QWS_XZGGGFD[Z^]]QTTQX_CNLIJNOAG_QUP[[ALBOOCCGX_PUTR@CNtttwJICE_WUQ\XZDFFGGGXXYSPPU\Y^MNLKKOLFE]W][ZCLMNLB@DX\VUUWXBBJttttHLFYPVRY[DGGFDEDY^^PPSUTX_EOOOuINBF[RWPY[AMLLNM@FE_RVT]A@IutttHN@Z]WUP\Y[DDDGE[E^__PQQUTUY\ZOOOuHIL@E_QUPYXFBBMLCFG[\STT\AAIuuttHICE\VTS_X[DGDDD[ZX]\RQQWU^RZLMLJNNMAZ\PUS^[FBMMOM@FZ_RVUQZFBKJJuJOME^QTS\^X[[ZYX^]]RVQVTTTUU\SYCCBHNLMAZ\PUVR_DA@MMCAGZ^RQV\EFOHKJJNMAXRWQR_Y[[[ZY^^]R]VQQTTWUUV\]FBCOHLL@G^RVV]XE@BBBMAGE_SVWREFLHJJuHOCE_QVR_Y[ZDZZZX^^]RSQWTT\PEC@LHLL@GYRQWP_ZG@B@M@GDXRPTPZDMIHHJNOCE^PWS\^XZE[DEYZY]_RWQW_SXC@BHLMCF[\PUPR^GF@MC@@G[^]QWS[GBOHKJIOCEYPWP]^YZZ[DEXEY\^RVPTS\SA@AONMMAG_RVSRYGDAB@A@EX_RWTRYDBMNHIOMF[\QTQR_^Y[X[ZYYY]\]QVW\Q[AGCOBBAGX]SUVP]EEDBCFCGZ[_PWU]YEBLOHIOM@Z^PUTVS\_^YX^YY___RRSQVVTUU_SX@ACNMBCFZ\RTVP]EZGCAFAD[^]QUS\XABMNNLBAE^STUWP]\_YX^XY_Y_R]SVQWUUPSSGGFMM@CGZ_]VWP][EDA@AFD[_]PUUS^Z@BONNLBFZ_PTQS]\^^^[Y^X_]_SQPTQSSGGGML@CFE_]VTSRXGDACFGF[^_PTQ\YGCBOOLB@DYRVUVPR\\^^^XY^Y_]_RPSVTTVRPEGDCMA@GZ_RVTPPXZZAADFEXY]PWP\^G@@LLBCFZ_SWTVQS\\_^__\\\]]RPPVWWTRQ_FGFLC@@GX\STWPRYZZDGEZ[^RSV\\[@@BOBBADX]QUWQS\__^Y^_^\]]SQQWUURP[GD@MA@FEY\PUUPS][[[DZX[^]SVV\\EAACM@@G[_STTQPR__^Y^^_\]SPQTUUQ]]EFGCMA@GZ_RVUQR\Y[[ZEY^^SQQ\\YFAAB@FD[_SWVSS]_\__\\]RSQQVTUS\\DAG@BGGEYRQWPS]XYXZY^Y]SSWU\Y^ACABBFGZ_SVTWP]]\^__\]SPQVWTWTUWTTTU]]_GFD@FEZYRQUTVR]\XX^XY]\RVVWU\\YFGG@GZX\PWWQS\]\\RSPVWTUWVQPPPQQVTTW\Y^ZD[ZZY_]QUTPR_XYX[^_\SQWT]YYEFEDDX^]PTUQSS]]RRSVWUTVQPPSPPQVWTUUUTTUTUUUUTTWVQQPPPPPQQVWTUVVS^\_[Y__RQVUWVP]]R]RPVWUWVVQPQQVWTUTTWVVVVWWTTTUUUUUTTWWVVVVWWTUVSS\_\\\SPQTUTVQQPPQVWTUTWWWWWWTUUUTTTTTTTUUTTWWWWWTTTUUUTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUVUUQWVWVWTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWTTTTUUUUTTUUUUUUUUUTTTUUUUUUUUUUUUUUUUUUTTTTTTTTTTUUUUUTTWVQQWUUTWP]__RWSAIO[W]ZFDRTR^X[XSS]\]SWUS]RPWUP]RPTTQSSQTUWVQVWUTWWTUUWVVTVKrrHUT]AuuAT_EGA@EVWYEZY\PWS_RSHpvAUSEOOEQ\Y[EG[PT[@FYQTU}clgYT]B}z}XDNHIJK[FuJLEXZ^QZZPtamfCQZq{BYCNNJtC[JttttO]YBDWam\[qfbdDAwsr|}@[q|sJ@^PAMESUfkjaWP[wda{[GtvqpqDAr~|wKI[]NO^dnNXvgmaJ^Jp}~~tUwx~pJ@U@JBRgiJXwdm`w_Jp|yywt~xysJBPZIMRgiOYwgm`wRIq}yyvKxy|pHTAuO^~j}WIemm~Gurxz|XEp~y~}vX^IHDQ`oDRwfl`tUFt}{zpWFq|~~rt^^ML[QyksC{bb~_Np~z~@Sus|}qOTY@F\Qfl@SJdb`vZKsy{}_\Jp}st@UR[[\RVdoNSNzb`sXHp~{|EQMvr}w@QW\X[X]{ijmNSC~afpXNv}~}DVMwr|}wCPT_ZEX]wlkorTXpga~P]Bts|OCvr|sKV^CBDXReonf[QByfdK[OwrqREuvsrswER@MGYR~mna@WF|geu^Bup}v\PMuqpvNYP^XX_V~bogXTEre{ITX@IvswR]CJwvwO\PR\_^\V[dbmyUM~e|DT^GNvpNRDNtwwBQPE@DSTVQWv`obtSveepVPXAursFU_AKtvuZRG@XWUVQVs`mf@Rqz{tT]GurqEQZNtqtERXYPTP__PufbfHWtx{tURDJsvZQYLtvtETZAZRPSRVtefeLWK}}HVU_LwK_PEMJtO^TZ@ZPWSQQ{bm{SGe~CSCprKTV[IvvMWVXE[XX^]T^szxIDvpJ\VFJKDUPZOJNDYZG[QV^_V_emm~O{gyARuK_IvtEWTSAJJATVWUQQCqru_RMJNXTXMLEVSENuIAX^XXPT]Rcb{]@~d~BVN}}KVRLwuEV_DCBG\TUTUWPSVYNtKEPYAAXQP[D[RPDNHMD\P]\PWTrfa_Zs~pDBqvMQWAHB_QEBCXQVPSPUQ]]Q\AOMZ]QUT\[[^SVWQ__]PWTS[GGEZEE^WVT^|eewQMspK\POtO[T]A@[RVQXDZ^\RVTR_]PTSFLBZSTU]ZZ^RVTWR\]SQVTURXDDEXYY_QWTLr~s@PTVLJOG]QQ\GDY_]PS_\\_]WUQS\_^\PWWTWWWQ]X[YRW]GC@Z\PTV_Y^\RQWVSRSSPWTP]YDFFDZX\VUUSt}rKX]Q[MCDZZYWWR\_XEYVW\XX]TUS_^_\RPVUUWPSSQVWTT\XX^\]RQUTPSSSRRRQTUTWVP]_^^^X[YRWUWWWWVQVPJsqHBGYS^_XG@GRV_X_QWSSSRRSWUQR\_^Y^]QTPY[YYY_]VTVWVPR]SVTTTUUWQSR_[EGDZ_PTTWVQVTT@uKLLMG]Q^ZE_QVVVTVTUWVWTVPPR^ZEX\SPVWUTVQQVWTW_Z[XEE[]TUUUQR]SPSSSVUUTVQQQR\Y[EGD[]WUUUUTU][[X[Z[^PWWWWUVQVVQPSSQQQVWUUWQPR]_\RPWTUTWQQPSR]]]]]]RRRSPQQVVWWVVVQVWTTTTTUUUUWWTWTUUUTVTUTTUWTVVTQVTWWTTTUTTUUUUUUTTWWTVVUWUTUTUTTUUWTUTUUUUUUUUTUTWQVWWUTUUUTUVWVWQQSPSSQQSSQQQPVUUTVTVWTVTWWTUWTTWTWVVPPSSSRSSPPQVWTTUTTUUTWTTWTVWVTWQTTUWVVPWQVVTTTWTUUTTUUWWVWWTTTWUTWWUWWTWTTUTVTUWUTWUUUUTUWUTWVQVVVTQWTWWTTUUTTTUUWUTWUUUTTTVTWVWWUUWVTTWWUQVTUTWTWTWWTTWVWWTWQUUWTWUUTTUWTUQTTVUTTUWPQQUTVUTQTUWWTTWVVQVQQVQWQVVQQVQVWVWWWTUVR^ZDGFFFGEZ[XYY^^__\\]]RSPWRKpqwtuNEUUSXFF[]]\]STVS]R]YEFFE^\SPQTUTTTF|eyvMZP_DD[[E[]WPSPP_Y_QQ^EGDZZX^]PVQPQUtzer@SXMLF_PQTV^[X\SPQTRECMMCGYPUUVPQUEyd{u]\OtHZVW[AA[STQ[CLM@E^PUVR\SWS}gev\_OtJEUQZCCZPRGONMGX\SVTWQ]\PUR|gev]XItJZS[@AXVQ[BOBE_RPVWTQR]STTrdevSYNtK[P[@AXWUQ_EA@GZY\SQWWQSSQR}d{tPUEKwKYRDB@XWTRY[EDGGZ^SWTWVPPQW_dxHUEuvI\SGBA_Q_ZZX[DFGXSTUTVQQQWUpdev]\Nwu[PEB@YWW_ZGFAAFZ]WUUTVQQQWuedrDPBwtAW^AAYWSXDFAAGXRWTVQPVUtzzqXROwtDTWZCF_UR[ABCF[\QTUTVSRPTFye|BT@wvMSYCC[QV^GBB@E_QTUTQSSW^}z|OPUFuwO_U_A@ZRTVX@BCF[\PTVSSQKxxvZ\IwuGSWTVECFYPWURE@@DX\PWUUVQQTt~}I]^ItOYQWWRG@E_PVTT^G@FZY]QTUTWQQW@}|tXUQCuIESQQTW[FE^]SPWU]ZGD[Y_RQVVQQVWTt}qMRUYOH@^SSPR[Z^]]RSTS^[Y___]PQVQPQTPwrvCSTXONF_]\S][X_\\RPUW]^XY_\]SPQQPPVUTupwC]QW^BMDY_^RP^_]]\]PTWR_^_\]RPQQQQVWQuptC\SW^CCEXXXSP\]]\_]PTUVS\^_\]SPQQQQQWUMvtL[\RRDAE[[Z^TVSSS]__RWUTQS]RSSSSPQVQQWUTNwJBZ^S\EE[ZDD\UVQQR_XYRVWQSRSPSRRSQQPSQWQItHCD[RU^E[XEFG]UTWVV\[[_QVQRRPQPRSPVQSSQTFKI@EX]RX[[DFF^WUTWQ\XY]VVS\]QVVPPVWVSRPTZIICD[_S^YXDAAXQTUWWWVRY^]P]^\QTVWWVPRPWXON@D[_UP_^YEA@ZSWTVQVVS_^]S\^\PTUTWTWVSRQWQCNCFE[SW]_^[FCG_PVQQQQP\_]]^X_STTTTUTVSRQT]CM@GZ^WQR\^ZAAZ]PPPQQP]^_]S^Y_PTTWWUUWPSQWRABFDZ^WVS]\XDG[SVVQVWVP\\RP]^_SWTTTUWPSVTPD@GE[YQVPR\XDGZ\PQQVVQP]\]S]^_RVWWWUTQSQWQZGDE[YQVPR\YEGZ\SPPQVVPR]RR_X^RVWTTTQPVT_DGDE[\TTQPS\[DEY\RRPVVVSR]R]^X^SQWWUTQQWT_EDEZZ_VVPR\YEGDX_]RSQQPR]]]^XX_RQVWUWVVWTV^[[[X^QWVPR^ZZX_]RRQVWQPSS]^X^]PVWTUWWT]X[[XYSTTVQS\XEZX_]]SQVVQSPS\^Y_RQVWTTTUP^YXXX_QTWWVS_[[Y_\\RSQWVQQPS\Y^\SQVTUTUP\YYYY]QUWWVQS_[XY^_\RSQVQQPPR_^_]PQVTUUUUR_YYXYRVTTWWVQR_Y^^__]RPVWVVQPR\\]SQVWUUP\_^Y\PWUTTWVQR_^^^__\RSQQQVQPR\\]RPQWUUUWR_^^Y\PVWWWWVP]_^^___\RPQQQVVQS\\]RSSQWWTTUWS\_^^]PVVVWWVQR\_____\RPVVVWVVS]]RRPPQWTTUVR\_^\SQVVVWVQS\\\___\]SPPPVQQS]]]RSPQWWTTTWS\_^_]PQQQVVQS]\\\\__\]SPPQQQPRRSRSPQWWTUUQR\^^]SPQQVVVQR]]\\\\\]RSSPQPPRRSSSQQVWWWTUUP]_^^]RSPPVVQPR]R]]\\\]RSSPPSRRRRSSPQVVVWTUTS]_^\RSPPPVQQPSSSR]\_\\]RRSRRRRPQVWWWWWWTTWR\^^_]RSSPPPQSSSSR]\__\\\_\\]SSQWTTTTTWWTTWS]__\RRSRSPPPSSSSR]\_^YYY^_]RQVWUUUUUUUQR\_^_\\\_\]RRRRSR]_YX[[[X_]SPVTUWPR]_^^^^YY^__\\]]]]\\\]RSQVTUTWVVQSSSSSSSSSPPQVVVVWWWWTTTUWVVPWVQVQVVQVVVQVQWVVVVTTTTTUUUTTVTVTWTWTTUTVVTTUTUUUUUUUUTTTWTWUWTWWVWVUWTUUUTTWTTWTVWVQQQQVPVVPVQQWWVVPQVUTUUWVWTUVVQQWTV]Y[X^SWWTWQP]__ZXD[X^^]RVWTUWUVVQPVRRSSPVVTWTTWTWTUUTTTTWWQVQVWVWQTQTVTWTTUUTTVTVTVUWWWVWWTWTTWWWWVWQWWTWTWTVWWTUUUTTTTWTVUUTWUUVTWUTTWTUUUUTTUTUTUTUUUWTTTUUWUVUWUWTUUTUTTQWVWTVWWWTVTUUTUTTTTUUUTTUUUTWTVUTTUTTUWTWWWTTTTTUVUVUTUTUUUTTTTUTWWVUWTUTUTUTTTUVTUUTUUTVQQSR]\]RRS]S\PQTUVVWVVS]R\_S_]\\]_S]PQQVQSPPPVQVVPWWSWSVWQVVTQWRQRS]P\WQWVWUVWQTUTVTWWRSTSW_^BJMBEVWWWVQSRR]RSS]SQSQRPSRQPVSPVUUTUUTTUUPWTUQUTWUUUUUTUUUTVTWTWWUUTTTWUTTTTUW\[GBOKJKILCGY]PWTUWVPPSRSVUV^ENtqpwKOFXV\EMJtwtKMD_P\Aw|xz~}ptM__AJp|}qtMXWRFuegdy}vNY_Btry{x|vIDVWUSBwxgaae~sHXXNw}xz{qHEVVRRQZu}d`caz}wG]LwsyzzysJFSV_XYSTMqxaccaxsK^ZJqr~xx|wM[WW\ZDE_UAv~gcb`eruZYIqr|y~}vMXQQ_E@AD^TAq~gcc`esKX[Hp}|~stC_TPYDCCF[PTNr{fccaxwCQTAtr|rvNXVW^DMINBER@pyd`caeqMRGur|}wL^VXCHttKMZPZvzgafepC][Hqr}rpt@RRDLJwwuOESPHszggzsB^RCuqqqvuC_]ELJuwtNA_TQIq}xddzsB^S@uqqqvuB^SDNJwvwJCYV@wp|zde}H[Q[NtwwtuMYPZBHtvwuBXVYItq~zz|JG\URFHuutuNGPVXCHtwwuOD]T]Luq~zeywMZPSGHttwwK@R]GOuwvwK@YQP@Ot}y{uCXQQEHutwtHAPRFHwpsvuB[PXAIp~{~wNG\UXLJuttH@]VFNtpspwMD]YFIszyvKF]UYNutvwKM\^Otsr}stBXWYAIszxqHG]W[HtwvtHCRSMw||qKAWWECvxe}tOXV\CutwwKMXTZKp||}vKA\[MwzdxqHZQ\BwqqqtOETYBus|}tBYVR@IsyzeruAPVXNwttuLF]YFHttqvuNXWPCIv~yz}HFPVXBttuuMD_]YFBOtJJIFZ]UUDIur~~tA]^DHtJKME^UPYZ@@ABGZ_S\]QWWTVWTPSVTXIJvrr|wF]\EBJKNMZ\VQYZGADE^PVVQR\_XXY_RQTQEGBJuvJD_TP_[C@AD^SWW]_XZY^\PVTTWVVPPR]]\\RRPWUPD@MKutKE]W]XECCAE_QUQ\^X[^]PUQR\^^YX^\SWUREFCNHJMXPTP_YZGD[_VTP]YX[X\SVUWS_XZ[^\RQWYFACMMLG\TVR^X[EZX\VVR_YYXY\RVUUWVQVVWU^ZEGA@BE]TTP]R\^^^]VUTVPPR]SPTUWQPSSSPQVVWUTWVVQQQVWTSY[ZEEEX]VWPRRSRSSPVTUTQS]]RRSPQWUDMLNHKJBYWP^DEZZ[X_WQ]YX^^\SVWP]]\RPQWUTVQPPQVWUUTWWWTUUUUTUUUUUUWQPPVVVWWUUTTWWTTTUUUUUUTTUUUUUUUTTTTUUUUUUUUTWVQPR]]\\]]RSPVWTUTR^XXYYX^RVWS]\\RPQWUUTWVPSSPWUUTWWWWWTTUTTTUUUUTTWWWWVVVVWTTUUUUUUUUUUUUUUTTWWWWWWWWWTUUUTWQPPPPPPQVWWWVVVVVWWWVVVVWWTTUQ_[ZZX^_]RQTUWWVPS]]]PWUWQPPQVTTUUTWWWWVVVWTUUUTTTTTTUUUTTTTTWWWTTUUUWQPPPPPPPQQVWTUUUUTWQQQQVWWTTTTUWS_YXY^_\]]SQWTWWVQPPSPQWUUTWQPPPPQVWTTUUUTQR]\\]RRSSPQVTUTWWVVQPSRRRRSPQVWTTUWR^[ZZ[XY_\\RPVTVPSRR]]]]]]RSQVWWWWVVVWWTTUUQ^EF@AGZY_]RPWUQR\\_\\]]]RRSPPQVWTTWWWWTTWXCHuuHMGX]PWTRYEDE[_SVUUQ]YZDDZ^RV\CuvqvJBZRTW^GBLBFXSUS[@NKHLFYQUDus}}stMXVVXCIJKLD\UTRXFCMM@GX]WRMq||qHEVU\GOKJNF_V_GMHJHLF_WXJryyqOYSZMKuJMZPRZBHttJLERFv{x|w@SW^@HttK@_Q\ELuqpvKDTXtzzypL]\FHttJC^TS^FNtqpwNXWWUEv~eeyqCSWYCJwwJ@\WP\ZCKwqwHDVVPVZwzz~qCPVXCHtuHF]VR_[FMHuuKMZQUPRSWSH}{eysLRRGOutK@\TQR_ZALHJIMZQVPQTRIrxzysN\RDLJuKC^TQS_ZALHKIB[PUVQVUPLpy{~sN_RDLuuKC^WP\ZALIILAYVUTT]Np~y|qM\\FNuuH@_TP^DBNNOCE\WUUUU\Np~}vCRV^@IuuNF]VR[ALNNBD_VUTWVVWUWGus}rvL_URZCIHOF_UVRYGBONLAXSUWWWWTUZKq}rvO^PXAOILF_UWS^DCLOBG^QTTTUUU[IvspwM^PXFMOBD\WP_EABBAZ\VUUTTUU^MtvvJC_V_E@CAZRQ\ZFCCAE^PUUUVEIwqwHGSUR[ABBFYQUP_ZFC@G[\PWTTTTTTUUTWVQVTSDNuuIA^WW][GAGXRTVRYEFFDYRVUUTUUWVVT_AIuKMD]UQ^EFFE^QUVR^[ZZY\PTUWVQQVWWTTTTUT_FLNMFXPUV\XZZY]VTVQS]_^^_]RPVTTTWT\AHttIA_TV_EF@GXSVR^[Z[^SUTWQPSSRRSQTUSXDAFE^SUTQR_^Y^]PWUUUUUUTTVQQQWU\AHtuIF]P^EAAE_VUQ]^XY\QUTQR\^^\STUTWVQVTUUTTWVVWTUUUUUUUUUUTTTUUUUTTWWWWTTUUTTWWVQQQQQQVVWTTUWP\_^_]PVWTTTTTTUUUWQPRRRSPQQVWTUTURE@MCD^QUVR_^_RQUTQSRSQTTVQQQWTUUUTWWWWTUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTUUTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTWWTTUUUTTWVVQPPQQVWTUTS\\]RPQVTTTWWWVQVTUTWWTUUUTTUUUUUUUTTTUUUUUUUUUUUUUUUUUUUUTTWVVWUUUUTVPSSPPPQVTUUTTTTTWVVWWTTUUUUTVQQVTUVS]\\_^_]QWTUUTUTWVQQWTUUUTWWTTTTTUUTTWWVWWTTTUUQS]]_YY^RQVWTUVPPQVVVVTUWVVVQQPPPVWTUUS_^YEFFDYRPQTTP]\RSSSSVTWWWVQQVWUUUWVVVWWWWTUUUUTTTTUTVSR\^YY^\]]SQVTTTTWWWVPSR]RSSQVWVRXDCOOCFEX_VVS]^X[[^]SQTUVPSRR]RSQWUTQR_[ZEZY^_RPWTQS\^YXX^\RQWW]XAOLMB@FD\WWR_YXXXX^]PVTUUTTWQQQQVVWTSXFMIJOA[]TPYEGFAAEYRVUWPR]RPW[MKwrruG]U_COCAAD]P\YGCCF[Y\VUWYGBIuJD_PRXDDXXX]QTTVVTQR]_\_Y_SQWUUDNv|sHD]^@LOOLF\Q\Z@NIMFE_VUTXFOtqvCY\]ZFFGGDSWWUUUP_]_X[[^RRSTXOq~}vB^SGLKJKMZQQXAIuJO@[PPEMuvsqA[\^FCCAAEQP^^[GAG[__]WEJs~yqB^]@HttuNDPSZBJtJOAXQSELuqpwGXQV[A@@AA[WU]^^XDD[^\]PTFJp~ruFSXBHJuJC^T\GMHuKME\WTVTURDMHtwJD^VW^ZDGDEYWTWTWQR_R_^_\]SPV[Otp|}t@\\DBNHIC^QUR[BHIMFZRTUT\FOKtwuF_UQ^[EAFDYSQUTQSR\_^\]RPQUDHws}rtAQU_DBHKNF^QW]DBLMAZ^SU]FOKuwtBYP^XEAAGXSVUVPPR]]]]SPQTFJvprrwAWWYFBHJHCYQV\XG@CFZ_SWRFOIIJKC^RXZZEEEYPUWQQWWQS]RSPRRPW^IwvpsqH_RDCMMLBDSP^[DGFG[]V]AOOMOOA^PYEZXYXY]VWQSRQWTQRRSPPSSQUAwspqqwLS\CIICGEYPTP^DAADX_RVTZBMCCB@EPPYEEX^_\RQWVQPPVWVPR]SPQVWU]HpsvvtHEUYLJKBE_RWVR\^EACA[]QTWWTUXMIOC@FE\W][DDX\SPQTWS\\]SSR]]SVUPMvpvuHMDPW]EBIOG\VRYXX[ZEZX]VUVQQWUYCOM@FEX\TUWP]Y[Y\PWUQ\YY_\]]RPWWAuvtHLAE]TP\[F@FXSV]^^Y[EDZ_VUWTPGNIBFZX^STQPP]YXX\QUV\[EZY]QVTUTZOJNBGZ[_VTQSS]^X[YRTWS\___^YY_PURGMBFZY^\PTVQQS]__]VUQS\YYXY]VURGMMAEY_]QTVQQS]_^]QUWP]\\]_^XY]T]GMBAZY^\SUTVVQS\YX_SWWP]\\R]^YX_VPEBBAEY^_RUTWWP\YX_SWTS\____^_]QUUY@M@GZ[X_VUTP_YY\PTUTVQPS]]RQTUQSSQTTWWWUW_ZDEEZX\PUQR\\]SPVWUTVPS]_^^\SVTQXGFGGGZ^QTS\_]RRRPTVSRRR]]]SVTUTWTTUTUW\XZZEDZ^PTTQQPR]]RPWUWQS]__^\]PVUV\Y[EGGZ^SVUTWQSRRSPVWUWQPR]\]RSPVWUWR_XDGDZY\RVUWQSR]]]SQVTTVPSR]]]SPVTUVQS]\\\]]SQVWTUTTWWWWWTUUUUUUUTUUUUUUUTTTWWWWWTTTTTUUTTTTTUUUUUUUUUUUUUUTTTTTTUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUTTUUTTUUUUUUUTUUUUTTTTUTTUUWWTTTUWWTPVTTWVVUTUTTTQVUPVWUSVWUTUTTTTWTTSVWWUTTQVTWQVRUTRTUVWQUUUWVQTSRPWQPPPQWTTVPTVUTPVQTTWWPQVVPUUUVTUUTTTTWTVWWQWPVVTVWVWWTVUWTVTTWTPUWQUUWTTUUUTUUUTTUWTWVTWWTTTVWTTVWWWVVTWTWTWWWWUWUWTUTWWTTWVWWVVVVWQWVVVQWWUUWVWVQQQQVQVWWQPQPQPQQQQQVWWTUTVPS\^_YX[[[[[Y^^_\]]]]RRSPPVWTRYG@FCBADDX_SWWUUVPS_^^YX^^\]]PQPQVQQVVWTTV[GBLMHBDF[PVQS\YXX[^]RWWPP_XY[XYY_RRVSYGMMIHC@F^SWQS^Y[[X\\STWQ\EAFAFZ^RVUPE@NHKJO@G_WV]YZEDZY]QVQ_EDFAGDX]ST_EBIKtHMCZSTQ\XEDDZ^\QTWPRYX[Z[Y_SWWYFMNKJO@FYQUP\XEDDX^]WTP\YZEEE[Y]PTTYDMHKtIB@[PUP\[DGFEX_QTTPR^[EEE[Y\PT]ECHKuuOBG\TWSYEFAGZYRTTQ]YZEDD[^]VV[GOJuwKOBESTQ\ZFA@GZYSWWQ]Y[ZE[X_PWW[FNutwuNMDRTV][F@@AD[RWTQ]Y[ZEZX^SWQ[AIutwuNMERUV_EABB@G[RWV]XEFAAGZ^ST^EMKJwuNLF\VUSYG@C@GE\QUUP_[DFGGZ^RVTYEMHKtKLBERTUPYDA@AGZ]QW^^DB@@@[Y]U]YENIJuNLBXSTURXDF@FG[]PUQ\XEFAFE[\PUQ^ZMIHtHOME]VV_ZGAFFE_SWV_[ECBAFE_RTV_YMIHtHNLG\PV_ZG@AAG^\QPYYGCAFGX\P\[ANKuuIO@XRUUSYEFAFGX]PP_^DFGDEY\QUS_ABOJOLMG^RTRYEGFAF[Y\QWUWPR_X[[Z[^\SWRGNuwqvtKME]W][FBBM@DXSUV_[DA@AG[_STVRE@BIOMBFYRUW]YZEDDX^\PWTUVVQR]R\]]RQW]DCuttvJOCXPUSYDA@AFE\PTSYZGAFGZ^RVQYFCIHNOBD^QTRYZDGGZY\QTUTUS]]YY^Y\SQ^[@IIJKOMFYRTP_[DGFG[_STWRXDF@@FEY]QV\EABNLB@E^STP\Y[ZZ[^\RQVVQPQS]R]]RRSVTW^ZBHHuJNMFYRTSYEGGFDY\QV][DGAGEX\PTTSXDABB@FE^STVR_Y[ZZZY_^\PPPWWWTWVTTTU\YFOLHIMCDYRTQR^X[[[_RQWP\^Y[X^_RQTWSZFCOLMBGX]TTS^XZEZX^RQWUTVPS]\_\]RPWQSXGFBM@AGX\VTP\YX[X^\SVUTVPR\\__]]SVTV]ZG@BCAG[_PUQ]^XX[Y\]PTTQS]\_^_\]PWUUQ][DF@FFDY\QTQR_^YY_RSVWVSR]__\]SQTQRYDG@@FG[_STQR_^Y^^]SQUTQS]\_^_\]SVTQ][DG@ADEY]PTP]_^^_\RPVUUTVPR]__\\RPVUVSYEEFGE[^RVTQR]\\]RPWTUWQR]\\\]SPVTVR_ZDDGEX^]QTWQS]\\\RSVTUWQS]]\\]RPVWTR\XEEDDXY\PWTQSR]]]RPVTTVPR]\\\]RSQWUP]^[ZZZX_RPTTQSR]]]RPQWTUWQPSSSPQVTUVQSR]]]]RSPQQVVVVQQQPPPQQQQQVWWTTTUUUUUUUUUUUUUUUTTTTTUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUTTTTTTTUUUUUTTUUTTTTTTTUUUUUUUUUUUUUTTUTTTTWWTTTTTTTTTTUUUUUUTTTTTTTTTUUV\XZ[^\]SVTUUVS]]]]]]]SQWTWWWWTTTTGKJM[RPWT^ZX\RPQWWR\RPQPVUTVQQQQQVTTWPR]SVUUUTTUZMBZSURX[]VTV]\RQWWTU\[[\QUUTWU[wqJ[_COGPREG[SUS\\PTQ]]SWUWVP\Y^PTWWWTTOvtFVPECF]T\[YSWSRPTUWQQQP]XZYQTVVWTUQv|sBU^CKL]UTP[GZRUQR]PTVVWVSRPWUTP_XY]WUTWWTUI}rIWRDNOYQQP_EZRUUWPRSTWQPQQR\\\^^\QUQPPVvx~KW^@HN_SRRXGE]UUTVQSPTWPRSQPSPVQR__RTTVQVTB|wRT]ZMLZPRS]YYRUTWWVQSVUQRSQQS\XXRWQWUUSpy}AUPY@IBQV\]RYEXSTTTTVPPUVRRPPSSSR\\RPWTWVQVU]v|pFUSXAL@STS]]^X^QWWVVVPPTWPRSPQP]Y^PTQQWUTTFs|vYUSX@LDUQRR]Y[_VTWWWQSPWUVR]SPQRY[\WQSQWWWURv|pFTP_GBASWR]]^X^PTWWTWQQWWS]SQVSYZ_WVSQTUUGs}w^TP^FBDWP]R]^X^PWVWWQSSQTUQR]PQ]X[]UPRPTTu}sMUV]Z@@_SRR\^^RUWWWWVQVUTPRRR]]]PTTQSSVTUUZvsu^TQ\D@DQQ]RR_^_PTVWWVSSQWWVQR]\\]PWTUUUWWWTRtsvGV]Z@FSUQPP]_\PTWWVPSVTTWVPS]]]SVUUWVVVW]upwDV]ZAGSUPPS\^_STWWQSSPQVWVR\_\SWTTTTTTTWWDwqK_UWS\ZF[WWPPS]_\PUTTUWPPVWWWVPSR]\RQTTVVWWTPOtK[UTVS^EZRWSSPR\\RWTWWWVPSPQVQR^^SWTTUUUPOtJZTQS^EZSUQPQSR]STUWWTTVPPQVVS\_]QTUWWWUUGJJAQWQS\XZ\UQSPPSRSVTWTTVPSSRRSSPWUUTWVVTZIKAQVQPRY[\TVPPQPPPWTWWTWVPPPSR]]SVTUTVQVTUEOODVUVPS\YY]UQSPPPSSVTVQVVVQQPPSRSQTWWWT_BO@]WPR]^Y_VWPPPPPPQTUVPPVWWVPR]]SQTUTWWWUXBBEPUWQP]_^RTWQVQQPPVTWWTUTVS]RPWUUTTWWTT[@AXVTVPS]_\PWVVVVVVWTVQVWTWQSR]SQWUTWVVWUV[FG^WWQPS]\\PUTVQQQQQQWTVQVWWVPRRSVUTTWWTU^DE_TUWVQS]RVTWWVVVVTUWVVWTTWVPPSPVUUWWT_DD^VTWVQR\\PUTWWWWVVVWUUTTTTTVS]]SWUTTTTTURZGZRUWQR__RWTTWVQQQWUUTWWWWWQPSRRRPVUTWVVTUSYX^PTTWWWVQS]]PWUUTWTWQPPQWUUWQSRRPVTTWQQVT]EGZ]WUV]^_SWUUVPPVTUUUUTWVQPSRRPVUUTTTUPYXYRVTUUVR\]SVWTUUWQPPQWWTUUVR\]SQWTUUTTUW]^^]PVWUQRRSQVWTUWVVVVVWTUUWQS]RSPVWTTTWWTTWS\\]SPQWUUWQPPPPQVWTUTWVVQQPPPPPPQVWTTTTTTTUQR]RSSQWTUTWVVVQQQWTTTTTTTWWWWWVQPPQWTTUVSRR]]RPVWWWWTWWVVVVVVVWVVVVVQPPPPPQQVWTTTUUVPPS]]RSSSSPQVVVWWWWWWWWWWWWWTTTUUUUUUTUTTWWWWWWWWWVVVVVWWWWWTTTTTTTUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUTTTTUUUTWTTTUUTTUUUWVTUPTPTTTTUUTVTUWVVWWTWTTTWTWTTTTUUUTTTUTTTTUTUWTTTUUTTWUTWUWUTUUUUTTWTUWTUTTTUTUWUWUTTTTTTTTUTTTTWTTUTQS\_^XYY^\RPWWUWQSR]]]]RSPVTQYGAMIOBAD^VQ]^ZEE[^]VTP\Y[EZ[Y^\SVTUTWVVWWUTP\XXX[X\RQTTVP]__^_\\]R]]]RRSPQVVWTQDuqrsvwIYW]Z@LOOCZ\TQ_[GFD[_PQ\[F@FDZ_QT\ZBOM@@ZSUWS_X[XY_RWP_E@OIOAE\WWGKp~}tBXRZ@OHHMZ]WQ\XEDE^STV\[DGFAFXRQTQYDABLCE_VQR\^YY\SVUUTQPR]_^Y[DA@AE\QBwsssquZRGBCC@D_TUP\__\]PTTQ]_^^^_\R]]SPVWWWTUUUYAC@FAD^WUP^[[^]SQTTVPRRRR]\^XEAMBD]WLp|}vIF\PYFLNM[PP__\RRPWUWP]\]SQQQQQVWQ]^Y^RQVWUP[AAD[Y_STTPPSR]\RQUWVQVTTVRYAIuHA]TNsrt@XVVXDGGFGXSUTVS]\]QWP]]SQVWVQQVVQS\YXX_RQVTUT\EFDX\RSQWVS]RSQVVWTTWQQVQR_[DA@ADYSTUWI}y|uDP[BOCE_RPWQ]]PQVVQVWVVWWQPSQWUUWQSSPQPR\_\PUS[FFZ_SQQVTTP]]RPVVQQVWTVSR]\^[GFGXRTTOr~}uETPDLOF^VS\RQUUTUWQPQWUUUWWWWTTVPSSPQVVQQVWUW\[DD[_PVWTTUUWP]\\]PVWWWWWWWQS\YEDEYRTZKvwHDPPXGGZ]WWPSPVUWVQVWWWPR\^[EDZ_Q\MtwJ@\UT]XEEYSTTQSPVTTVPS]\\YEGGXPVPVWZOKNA_WUWS\^_SWUTUWWWTUTTTTWVPS]^[EZYSUWQQWPZBNLF^VUUUTQR\\]PWUUUWVVWUUUTTTTWVQSR_X[[^SWUWVVURZA@FXRWTWTUTQPSPVTTWVWTTUUTTWWWVVQQPS]_YXX_SWTWVVTRYED[\PTUTWWTUTVQQQWUUUTTUUUUTWVQQQQQQQVVWTPXF@GYPTVVWUUWPR]RSVUUTTTTUTTTTTTTWWWWTTTTWWWWWWWWWWWWWWTTTTTTTTTTTUUTQS\_^_RPQVVVQQQVVVQQPPQVVWWWWWWWWWTTTUUP^ZZY]VUTUUTVQVVTUUTWWTTUUUTTTTUUUUUUTTUUUUTTWWVVQQQQPPPPSPPQQVVVVVWWWTTTUUVPPPVWTTTTWWWWWWVVVWTTTUUUUUUUUUUUTTUTWVQQQQQVVVVVVQQQQQQQQQQVWWTUUUTWVQQQQQQQQPPPPSSSSPQQQQQQVWWTTUUTTWWVVVVVVVVVVVVQPSPPPPQQQVVWWTTTUUTTWWVVVVQQPPPPPPPPPQQQQQQVVWWTTTUUTWWWVVVVVVVVVVVQQQQQVVVVVVWWWWTUUTTWWWWWVVVVVQQQQQQPPPQVVVVWWWWWWTTUUUTWVVQQPPQVQQQPPPPPPPQQQVVVWWWWTTTTUTVQPPPPSSPPPSSSSSSSSSSSSPPPQVVWTUUUTTTTWTTTUUUUTTWWTTTWWVVWWVVWWTWWWWTTTTTTTTTTTTTUUUWTTUTTTTTUTUWQTQVWVTUWTVWWWVRVTWQTUWWTUTUUUUUUUTTUUUTUQUQUWVTWQWTVWWWQWVTTUUPPUUUWWWWTUTTUTUTUWTUUTWUUTVTWVUQUUTTWVUUTTWWVTWWUTUUTUUTUTWTWTWTUTUTUWUWUUWTVTUUTTTUUUTUVUTRQTVVVUTTUUUTTUWPVUWUWPWTUWWTTVWWWQTVSWQUWTWQUWWWUQTVVWVVTTUTWTUQTWTUUUTVUUTUVWTQUWVUVUWWWTVTUTTVTTPUUWQVUWTTUTWUUTUUUUWTUUTWUTUTWWWTUTTUUVWTUWUTTTTTTTWUWUUWUTWWTTTTUTUUUTWTTUUUTTUWWUUTTUUUTTUUUTVPPSR\_\\\\___\]]]]RRSPQQWTREFFFAAD^SVVQVTTQSSQQSR]PVWTTUWQPR\^Y^]SQVTTGM@CLLC^UPRSSS]_RVUWVVVVPPQQQR\^^^\\RQVUXHtuJJHARPY[Y___\STUVPSSPPPPQWWVS_XZZX^]SV[IILOOMEWURXX_RRRRWWQSPQQPR]__^ZCIHBYQUDw}svuLZTQ^G@G[_RPUTWQR]RPWTTQS]\_YZE[\PVTUWVW@tJNIIL[VXFE^]]\RVSSQWUWWTTUVS\YECNIA_WRt~rqtL\U^AILFX_RWTQ]_\PTVS]_YXY\\_^_STUTVWTTTU]w}vuuJN\RALA[^^^PTR\]SQVPVTQSR_XDAFDXRQAr|pqpqNV[OOAEEEYTP\_RPQQVUVQR_[EDEE[^PTH}}pssq@VGOMFFAF^P\\]]]]PUUWQS_[DGFGZ_QURwrqqpswYPFCAA@BA\WR\\^^Y_SWUTWP\XEDGGE^SWFqsqr|rKQ]DGGCOLDPVPR^YY]VUTP\^XEFD[]QWRtpwq}}vXV[DD@OHMYVUVPR^[ZX]PVTTTQR_YEGDX\PWGtuup}sOWP^YZ@LMDSTUP^YX_SPVWTP_[ZZ[^_SV]JtuqrrtY]_XFMLA^PWV\^Y^]RSVTTV]X[[Y_\PTMtuwsrqAUS\^DBOBZ]PWW]^Y^\]RQWWS\^_^Y_RVUUBtHuqpwFU]__ZACF^QVUUV]^^^]RRQVTVR__\\\_RVTUSMNLJvwN\TSR\ZGG[RQVUQ\\]RSSQWWQR\]R]\\SWUW@NLHwwHXUTPS]YEEXRQQTV]\\RSSPWTP]]RSR]SWU^DEFLOCYVTTWPSS\YX^RVVWUVP]^XZZX_SPQT]EDDCM@XQTWTTPSRS]^^_]PPPWUTTUWP_XXXXXX_SQQQVTUTWWTUS^^XEEXRWWTUUTWWQQVVWWWTWPPQS]_]PVVVTT]YYX[X^SVWWTUTVQPPR]]SPPPPPPPSSPPPPQQVWWTWQPR\_\RRR]RSRR]RRR]\\]]]RSQVWTTTUUUVPSRR]]]]]]\]]]]]]]]RRSSPQPQQVWWTUUUTWVVVVVVVVVVQQVQQQVWTTTTUUTTTTWVVVVWVVWTUUUUTTTWWTTTUUUUUUUUUUUUUUUUUUUUUTTTTTTUUUUUTTTUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUTTTTTTTTTUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTUUUUUUTTTTTTTUUUUUUUUUTTTTTTTTTTUUUUUUUUUUUUUUUUUUTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUTWWVQQQVVVWWWWWTTTTTUUUUUUUUUUUUUUUUUUUUUTTTTTTWTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUTUUUUUUUUTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTUUUUUUUUUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTWWWTTTTTTUUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTWWWTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTUUUUUUUUUUUUUUUUUTTTTWWWWWTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTUUTUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUTUUUTUUUUUUUUUUUUTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWVVWWWTTUTTTTTTTWWWWTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUTUUUUUUUUUTUUUUUTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTUUUUUUUUUUUUUUUUUUUTUUUUTWWWWWTTTTTUUUUUUUUUUUUUUUUUTTTUUUUUUUTTTTTTTTTUUUUUUUUUTUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWVVWWWWTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUTUUUTUUUUUUUUUUUUUTTTWWWTTTTTTTTUUUUUUUUUUUUUTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTUUUTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWWWWTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWWWVVVVVVVVVVVQVVWWWWWWWWWWWTTTTTTTUUUUTTUUUUUTTTTTTTTTTWWWWWWTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWWTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTUTTTTTUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWVVVVWWWWWTTTTUUUUUUUUUUUUUUUUUUUUUTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTWWWWWTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUTWWWVVVVWWTTTTTTTTTUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWWWWWTTTTTUUUUUUUUUUUUUUUUUUUUUUUUTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTWWVVVQQQQQQQQQQQVQVVVVVVVVWWWVVVVWWVVVVVVVVVVVVVWWTTTTUUUUUUUUUUUUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTWWTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTUUUUUUUUTTWWWWWWTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTUUUUUUUUUUUUUUUTTWWWWWWTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTUTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU \ No newline at end of file diff --git a/test/support_test/video.h264 b/test/support_test/video.h264 new file mode 100755 index 0000000..db50cf1 Binary files /dev/null and b/test/support_test/video.h264 differ diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index b24fc13..04cdd65 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -12,7 +12,7 @@ add_subdirectory(McuProtocol) add_subdirectory(ModBusCRC16) add_subdirectory(LedControl) add_subdirectory(KeyControl) -add_subdirectory(MediaAdapter) +add_subdirectory(MediaBase) add_subdirectory(FxHttpServer) add_subdirectory(Servers) add_subdirectory(TcpModule) diff --git a/utils/ConfigBase/CMakeLists.txt b/utils/ConfigBase/CMakeLists.txt index 8fb7242..4b3d6cf 100644 --- a/utils/ConfigBase/CMakeLists.txt +++ b/utils/ConfigBase/CMakeLists.txt @@ -58,17 +58,15 @@ endif() # build libconfig before make libConfigBase.a add_custom_command( - # OUTPUT ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs/libconfig.a OUTPUT ${EXTERNAL_LIBS_OUTPUT_PATH}/libconfig.a COMMAND echo "Build libconfig-1.7.3. COMPILE_HOST = ${COMPILE_HOST}" - # COMMAND tar zxvf libconfig-1.7.3.tar.gz COMMAND sh build_libconfig.sh ${TARGET_PLATFORM} ${COMPILE_HOST} COMMAND mv ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs/libconfig.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libconfig.a + COMMAND cd libconfig-1.7.3; make clean; WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/libconfig/ ) add_custom_target( libconfig.a - # DEPENDS ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs/libconfig.a DEPENDS ${EXTERNAL_LIBS_OUTPUT_PATH}/libconfig.a ) diff --git a/utils/MediaAdapter/CMakeLists.txt b/utils/MediaAdapter/CMakeLists.txt index 48c919b..02285ea 100644 --- a/utils/MediaAdapter/CMakeLists.txt +++ b/utils/MediaAdapter/CMakeLists.txt @@ -14,8 +14,6 @@ include_directories( # ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs # ) - - aux_source_directory(./src SRC_FILES) set(TARGET_NAME MediaAdapter) diff --git a/utils/MediaBase/CMakeLists.txt b/utils/MediaBase/CMakeLists.txt new file mode 100644 index 0000000..7c1e51d --- /dev/null +++ b/utils/MediaBase/CMakeLists.txt @@ -0,0 +1,68 @@ +include(${CMAKE_SOURCE_DIR_IPCSDK}/build/global_config.cmake) +set(EXECUTABLE_OUTPUT_PATH ${EXEC_OUTPUT_PATH}) +set(LIBRARY_OUTPUT_PATH ${LIBS_OUTPUT_PATH}) + +include_directories( + ./src + ./include + # ${UTILS_SOURCE_PATH}/LinuxApi/include + ${UTILS_SOURCE_PATH}/StatusCode/include + ${UTILS_SOURCE_PATH}/ModBusCRC16/include + ${UTILS_SOURCE_PATH}/Log/include +) +# link_directories( +# ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs +# ) + +aux_source_directory(./src SRC_FILES) + +set(TARGET_NAME MediaBase) +add_library(${TARGET_NAME} STATIC ${SRC_FILES}) +target_link_libraries(${TARGET_NAME} StatusCode Log) + +if ("${COMPILE_IMPROVE_SUPPORT}" MATCHES "true") +add_custom_target( + MediaBase_code_check + COMMAND ${CLANG_TIDY_EXE} + -checks='${CLANG_TIDY_CHECKS}' + --header-filter=.* + --system-headers=false + ${SRC_FILES} + ${CLANG_TIDY_CONFIG} + -p ${PLATFORM_PATH}/cmake-shell + WORKING_DIRECTORY ${UTILS_SOURCE_PATH}/MediaBase +) +file(GLOB_RECURSE HEADER_FILES *.h) +add_custom_target( + MediaBase_code_format + COMMAND ${CLANG_FORMAT_EXE} + -style=file + -i ${SRC_FILES} ${HEADER_FILES} + WORKING_DIRECTORY ${UTILS_SOURCE_PATH}/MediaBase +) +add_custom_command( + TARGET ${TARGET_NAME} + PRE_BUILD + COMMAND make MediaBase_code_check + COMMAND make MediaBase_code_format + WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/ +) +endif() + +# build ffmpeg before make libMediaBase.a +add_custom_command( + OUTPUT ${EXTERNAL_LIBS_OUTPUT_PATH}/ffmpeg/lib/libavcodec.a + COMMAND echo "Did not found ffmpeg libs in output_files, now compile ffmpeg." + COMMAND make ffmpeg + WORKING_DIRECTORY ${PLATFORM_PATH}/cmake-shell/ +) +add_custom_target( + compile_ffmpeg + DEPENDS ${EXTERNAL_LIBS_OUTPUT_PATH}/ffmpeg/lib/libavcodec.a +) +add_dependencies(${TARGET_NAME} compile_ffmpeg) + +define_file_name(${TARGET_NAME}) + +file(GLOB_RECURSE INSTALL_HEADER_FILES include/*.h) +install(FILES ${INSTALL_HEADER_FILES} DESTINATION include) \ No newline at end of file diff --git a/utils/MediaBase/include/MediaBase.h b/utils/MediaBase/include/MediaBase.h new file mode 100644 index 0000000..a5df302 --- /dev/null +++ b/utils/MediaBase/include/MediaBase.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2023 Fancy Code. + * 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. + */ +#ifndef MEDIA_BASE_H +#define MEDIA_BASE_H +#include "StatusCode.h" +#ifdef __cplusplus +extern "C" { +#endif +enum MediaHandleType +{ + MEDIA_HANDLE_TYPE_READ_H264 = 0, + MEDIA_HANDLE_TYPE_END +}; +void *ICreateMediaBase(const MediaHandleType type); +void IMediaBaseFree(void *object); +#ifdef __cplusplus +} +#endif +#endif \ No newline at end of file diff --git a/utils/MediaBase/src/IMediaBase.cpp b/utils/MediaBase/src/IMediaBase.cpp new file mode 100644 index 0000000..5a36544 --- /dev/null +++ b/utils/MediaBase/src/IMediaBase.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023 Fancy Code. + * 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. + */ +#include "IMediaBase.h" +#include "ILog.h" +#include +static const char *MEDIA_BASE_NAME = "media_adapter"; +const char inline *GetMediaBaseModuleName(void) +{ + return MEDIA_BASE_NAME; +} +std::shared_ptr *NewIMediaBase(const MediaHandleType &type) +{ + LogInfo("Create the midia base object.\n"); + MeidaAdapter *impl = (MeidaAdapter *)malloc(sizeof(MeidaAdapter)); + MeidaAdapter tmp; + memcpy((void *)impl, (void *)&tmp, sizeof(MeidaAdapter)); + impl->mHeader.mCheckName = MEDIA_BASE_NAME; + impl->mIMediaBase = std::make_shared(); + return (std::shared_ptr *)(((char *)impl) + sizeof(MediaBaseHeader)); +} \ No newline at end of file diff --git a/utils/MediaBase/src/IMediaBase.h b/utils/MediaBase/src/IMediaBase.h new file mode 100644 index 0000000..092899e --- /dev/null +++ b/utils/MediaBase/src/IMediaBase.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2023 Fancy Code. + * 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. + */ +#ifndef I_MEDIA_BASE_H +#define I_MEDIA_BASE_H +#include "MediaBase.h" +#include +class IMediaBase +{ +public: + IMediaBase() = default; + virtual ~IMediaBase() = default; +}; +typedef struct media_base_header +{ + const char *mCheckName; +} MediaBaseHeader; +typedef struct media_adapter +{ + MediaBaseHeader mHeader; + std::shared_ptr mIMediaBase; +} MeidaAdapter; +const char *GetMediaBaseModuleName(void); +std::shared_ptr *NewIMediaBase(const MediaHandleType &type); +#endif \ No newline at end of file diff --git a/utils/MediaBase/src/MediaBase.cpp b/utils/MediaBase/src/MediaBase.cpp new file mode 100644 index 0000000..9d41dc0 --- /dev/null +++ b/utils/MediaBase/src/MediaBase.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023 Fancy Code. + * 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. + */ +#include "MediaBase.h" +#include "ILog.h" +#include "IMediaBase.h" +void *ICreateMediaBase(const MediaHandleType type) +{ + return NewIMediaBase(type); +} +static bool ObjectCheck(void *object) +{ + if (nullptr == object) { + LogError("nullptr object!\n"); + return false; + } + if (*((const char **)(((char *)object) - sizeof(IMediaBase))) != GetMediaBaseModuleName()) { + LogError("Illegal object!\n"); + return false; + } + return true; +} +void IMediaBaseFree(void *object) +{ + if (ObjectCheck(object) == true) { + (*(std::shared_ptr *)object).reset(); + free(((char *)object) - sizeof(MediaBaseHeader)); + } +} \ No newline at end of file