From ad326cb0be536d3765b9f9e1e45b23d9893e4bcd Mon Sep 17 00:00:00 2001 From: Eric Christiansen Date: Wed, 19 Dec 2012 14:28:59 -0800 Subject: [PATCH 1/8] adds desktop java junit tests --- modules/java/CMakeLists.txt | 7 +- modules/java/java_test/CMakeLists.txt | 80 +++ modules/java/java_test/build.xml | 70 +++ modules/java/java_test/lib/junit-4.11.jar | Bin 0 -> 288666 bytes .../src/org/opencv/test/OpenCVTestCase.java | 495 ++++++++++++++++++ .../src/org/opencv/test/OpenCVTestRunner.java | 44 ++ 6 files changed, 695 insertions(+), 1 deletion(-) create mode 100644 modules/java/java_test/CMakeLists.txt create mode 100644 modules/java/java_test/build.xml create mode 100644 modules/java/java_test/lib/junit-4.11.jar create mode 100644 modules/java/java_test/src/org/opencv/test/OpenCVTestCase.java create mode 100644 modules/java/java_test/src/org/opencv/test/OpenCVTestRunner.java diff --git a/modules/java/CMakeLists.txt b/modules/java/CMakeLists.txt index ee1ad30813..372bf84d7b 100644 --- a/modules/java/CMakeLists.txt +++ b/modules/java/CMakeLists.txt @@ -295,7 +295,12 @@ endif(ANDROID) add_dependencies(${lib_target} ${api_target}) add_dependencies(${the_module} ${lib_target}) -#android test project +# android test project if(ANDROID AND BUILD_TESTS) add_subdirectory(android_test) endif() + +# Desktop Java test project. +if((NOT ANDROID) AND BUILD_TESTS) + add_subdirectory(java_test) +endif() diff --git a/modules/java/java_test/CMakeLists.txt b/modules/java/java_test/CMakeLists.txt new file mode 100644 index 0000000000..e912b0d459 --- /dev/null +++ b/modules/java/java_test/CMakeLists.txt @@ -0,0 +1,80 @@ +ocv_check_dependencies(opencv_java ${OPENCV_MODULE_opencv_java_OPT_DEPS} ${OPENCV_MODULE_opencv_java_REQ_DEPS}) + +if(NOT OCV_DEPENDENCIES_FOUND OR NOT ANT_EXECUTABLE) + return() +endif() + +# TODO: This has the same name as the Android test project. That project should +# probably be renamed. +project(opencv_test_java) + +set(opencv_test_java_bin_dir "${CMAKE_CURRENT_BINARY_DIR}/.build") + +set(android_source_dir "${CMAKE_CURRENT_SOURCE_DIR}/../android_test") + +set(java_source_dir ${CMAKE_CURRENT_SOURCE_DIR}) + +# get project sources +file(GLOB_RECURSE opencv_test_java_files RELATIVE "${android_source_dir}" "${android_source_dir}/res/*" "${android_source_dir}/src/*") +ocv_list_filterout(opencv_test_java_files ".svn") +ocv_list_filterout(opencv_test_java_files ".*#.*") +# These are the files that need to be updated for pure Java. +ocv_list_filterout(opencv_test_java_files ".*OpenCVTestCase.*") +ocv_list_filterout(opencv_test_java_files ".*OpenCVTestRunner.*") +# These files aren't for desktop Java. +ocv_list_filterout(opencv_test_java_files ".*android.*") + +# These are files updated for pure Java. +file(GLOB_RECURSE modified_files RELATIVE "${java_source_dir}" "${java_source_dir}/src/*") +ocv_list_filterout(modified_files ".svn") +ocv_list_filterout(modified_files ".*#.*") + +# These are extra jars needed to run the tests. +file(GLOB_RECURSE lib_files RELATIVE "${java_source_dir}" "${java_source_dir}/lib/*") +ocv_list_filterout(lib_files ".svn") +ocv_list_filterout(lib_files ".*#.*") + +# copy sources out from the build tree +set(opencv_test_java_file_deps "") +foreach(f ${opencv_test_java_files}) + add_custom_command( + OUTPUT "${opencv_test_java_bin_dir}/${f}" + COMMAND ${CMAKE_COMMAND} -E copy "${android_source_dir}/${f}" "${opencv_test_java_bin_dir}/${f}" + MAIN_DEPENDENCY "${android_source_dir}/${f}" + COMMENT "Copying ${f}") + list(APPEND opencv_test_java_file_deps "${android_source_dir}/${f}" "${opencv_test_java_bin_dir}/${f}") +endforeach() + +# Overwrite select Android sources with Java-specific sources. +# Also, copy over the libs we'll need for testing. +foreach(f ${modified_files} ${lib_files}) + add_custom_command( + OUTPUT "${opencv_test_java_bin_dir}/${f}" + COMMAND ${CMAKE_COMMAND} -E copy "${java_source_dir}/${f}" "${opencv_test_java_bin_dir}/${f}" + MAIN_DEPENDENCY "${java_source_dir}/${f}" + COMMENT "Copying ${f}") + list(APPEND opencv_test_java_file_deps "${java_source_dir}/${f}") +endforeach() + +# Copy the OpenCV jar after it has been generated. +add_custom_command( + OUTPUT "${opencv_test_java_bin_dir}/bin/${JAR_NAME}" + COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/bin/${JAR_NAME}" "${opencv_test_java_bin_dir}/bin/${JAR_NAME}" + COMMENT "Copying the OpenCV jar") +add_custom_target(copy_opencv_jar ALL SOURCES "${opencv_test_java_bin_dir}/bin/${JAR_NAME}") +# ${the_module} is the target for the Java jar. +add_dependencies(copy_opencv_jar ${the_module}) + +# Copy the ant build file. +file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/build.xml" DESTINATION "${opencv_test_java_bin_dir}") + +# Create a script for running the Java tests and place it in build/bin. +if(WIN32) + file(WRITE "${CMAKE_BINARY_DIR}/bin/opencv_test_java.cmd" "cd ${opencv_test_java_bin_dir}\nset path=${EXECUTABLE_OUTPUT_PATH};%path%\nant -DjavaLibraryPath=${EXECUTABLE_OUTPUT_PATH}/Release buildAndTest") + file(WRITE "${CMAKE_BINARY_DIR}/bin/opencv_test_java_D.cmd" "cd ${opencv_test_java_bin_dir}\nset path=${EXECUTABLE_OUTPUT_PATH};%path%\nant -DjavaLibraryPath=${EXECUTABLE_OUTPUT_PATH}/Debug buildAndTest") +else() + file(WRITE "${CMAKE_BINARY_DIR}/bin/opencv_test_java.sh" "cd ${opencv_test_java_bin_dir};\nant -DjavaLibraryPath=${LIBRARY_OUTPUT_PATH} buildAndTest;\ncd -") +endif() + +add_custom_target(${PROJECT_NAME} ALL SOURCES ${opencv_test_java_file_deps}) +add_dependencies(opencv_tests ${PROJECT_NAME}) diff --git a/modules/java/java_test/build.xml b/modules/java/java_test/build.xml new file mode 100644 index 0000000000..29398b4b14 --- /dev/null +++ b/modules/java/java_test/build.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/java/java_test/lib/junit-4.11.jar b/modules/java/java_test/lib/junit-4.11.jar new file mode 100644 index 0000000000000000000000000000000000000000..4d552a6f3fd0be2b7491c448bb255862282bc836 GIT binary patch literal 288666 zcmbSy1yo&2vNplp-62?TcXxMpcXub)!QI{6-4on3xCZw?aEG7FotZax-hG)_|5@y_ zHtSS%ckTYF`s?c2@=_q6&_FKm8tc0kDk}|D~=#|X)n6wlP?F^h04dvwcRD&Y@9Mk5W zqz&u%m_skDMcmcEJ}gni5u8$IBDmENLW>RCrBMtXYX-5}ZTNB6sO4Rv%ATAdFBFa*H#Q)yVKR=-FcXp0u z|03~g68`z~`^~R@e@U1d*cdsQIQ`Ck-^isiT`gUBLim>Gdo8Mli$rK&i}1%W8nT9s|fyY#rJ3K zV(t99UVo?jH>mthnehMa+1cFWKN!0TR5f6T+Nc7ic{zK8m&e-I4 zKKCEg9bK${>lI|b@7>Ay-L-zX=I<={^UVGiPx)7H{S~(Uh!g*5h`%EDze@jy0E_=u z;x-1h7WOXI2F~wc|2MAwm%6rg&K9N??=j~0y8j5U|1j#;Fn{;dF#lqlPIP~sZb+bC zYl0IfQ3eqR5YQeN5D?6}mb8SBh^&$bt+Tsxl(J0BHalXM*r*@HgoWm4eHF*J!JRR( z5Or`+QSbr4>^ReI8DR5@%7}azb%#;%!m9V1G(%LF4G88d~#P*h$nJ=A_ z*G)dTb}=zAew#a9f(KU~7c194%!@s?221t6LQTR$r@Y;$}r<%-hsedTap86xuR-g@a~w!73(@V?P-n@6EDSr>q@I@xw7W; z#98n7VV|m(fkgmLF;u{{x)rR+=DffrlUK%erT0}beHhPHQ*&`^*&=<*z&3Yghh^$) zJ;hc5)>c#y%F;FeV=NG&*qye}odo3lijk2Q6YU`rm-^Z1_a%c0t|rXhbIRQBs6by} z%nw$S>;P?T6MJ&PXYyEOcBV`#`|K~$Y~v)2>tP5Wv{7&}U)Y(uE;KJsEcuV71R+-p z`Esv;w+5lK39hZ5W%(OEGC8*f+c5`px;5lUp_`xPLVJlopwjM>yQNO~HZSVr9ZfX) zs!bceKu7sXZL(93Gp`GuXj3T8OP;6h23@JD$`S8i(cBd}$yzk6OVv%X?5V^#l!Yc? z*-Ft2)GwgXexVPZq|56b^})R$&>Bg~myBPshWWtUEv0JNqav6u9l?pR$4NveuVF#i zFKW&`tAecVXA@CiDS|^gi~Dt15moRUWJmJwTS8U$p!rxKx`htC#Hyw()xZeOSdb(P z87sHeXZ*ze9QU#v@x4k4UaTrt(iGiiKW$nL<$9AII_W+9-1w4}r?%{E$OS}vP;{s= z8o6M;p9HwBscYnF@&j*W7my;OOMt4j{F*lcXh4uMeM)1pcOb7Ia=9)gjdK-8RRtxC z1{H0N@aX(^Wo6zMwE1xI+-Yih5MYBm?Gbj(1<9Z_;j*^G8`X$%@9tPPad1j3&jv($ z74Vkf(s-|!VVy!eGmn4n)$o)?r6lDEE&p&c0?=P;x#oYga(vw zK7C!m2Z;Pm>)B}kCiv=?%-j>lPOUYP$b|lI^;?q8pC?AtpOF_$pvsCoaCI1m9^YX8 zK?os%7T>v(sjqzH-3K6`m3MEVc=x0~eDz-lp@5OIg{z73d#qP-v2ZpaVW2g#HgIyv zQj)Qo2OGAC!tZ8<G%40i^os!G)7-rCax7%#VC2GY>%LdQUw#<)GUNu#GuuN`lPlN(II>|T0m=6Z0U}iPOj8H@1?PRX{8Kv8RFq1?XW&QNhJd<2AL%a^M+iAl< z3=9%^H4EJDaFdx^B=KkJxn09@-J3LkWm)c{SG`4?t5e{Nt3Dm4O8Oh56yoe*h868K z6lXo=J`3%uBl& zg{EX|_pEuvU!qm<$H+BB&X?389l?H3B}3;D@)q1f%?r@p`f8iDTB7HTKu++bEz}Ah zPcN7O#2T;bf`=9v-7d$mZB2Ar>IAB<5W1x7eokhB*B`L`89XXp>@F$qz`=OmIQ?2S z{}Xur4jmO8B`p9&J)VP(jPvs|E0f6s0ek9|8nT zz3L2~Q#^&(#y|c@vn<GN6f8f5@N9Z8R0_e_Fpc6W z*z+8y;JFdh^A*d0Qo0HAYwBDj5f}K%%4vRoldE8kp>6jlih(xhxTkYoq*m(DBio}$ zCE4>qY5q2)ceo5F_;jS+?lxL#$`xX2N|?G?=seh01;LL}{2_jEdH{?VuKJ0~-z=Rd z;Xu}bgG(#al+$TJ<`9C*l@Ezt;L+(=d27&OqDw&XEl%Dp(R~RPwR+dnly@e|bYiLX zb@~xHWinjZK9n2>+Re)deX1gno|R{nD+9$`*44HE+tMxq;$sc>cW(mBug&8R*2*{N zfy?_N(VI!#hxFEGSY1um?fG}GU;9 zIJC6-<0A00w6-6|kofF+Yo;W&7vaA+D4=)R)g9|k3>Zn|uxB(yoRe5yb`nGHbYWv< zy~J|8`Q5)&GpzdvLHoe%1b21`v~3;oY@yUU61&?tsj0cg#;zJ$%d@@SW(;V;DS3bS z7Ta>1*O3qAi@n3X~ZK*7#&x#BN+{JHJc123$_v}y%r|j>L$$2${yq`%dLkW@MQ?x%esEKFW@x=TFwP0#c_!f-5znNvurCd9 z&gjth`WfZv9KO%9stlvNf#FZ3Y!ZhC0WI@|nxKlqMuX*TVOmJ{PNovBk8ZHs4dLKw zc6fx#q6E#1#SB3m!uS2e2QiMC!xrQD`oV=ZQJ4i!Kau!S9Y)*Nu`%!@Mt1#*;z3|v zU{fNV#`ye_?(VRd`;iOW$tiu}xS-y$8{KwoSFA%Id8M)G)uaA8*J);uP5KT76y-sN<#=5#jx z{Q9&*{uzr~WjfFsHkdseS}^rcnC)zMw=m#SVj&w|Uu1ynT2fEt_5OA%`C9|STFlmm z!1gX%=GKnU3~dZp>tG^IJ9U7%@$f!X2Yy?TjhNj}x8|$j#z`Fo-A~r^!pT3d%?_(E z(f#&Vnp+#H?a~q@R8PxoZ4aY~b_lVMxBz4H$Uv7oJv588G%a&y<5s-&)P;OP$J>*_ zlTfK-<;`YLX*vr!vP)au{=*@7Q~A6YOnQ6OX5saPQ?LY5gRpHC2AwA zKbhmh3OTmW8|OYCHvtZyZ6d59U{)H1JqzpxDt%caqF{>Ah`r_H(Yve;oF@Vlt+zp>Q1dKR;D)?x{pfYFmJ1$H@xS=2HkGzFLu%3F@ZAo_~%Vhll1{!yAB z_LFR5w3_ouhFEB32FtbS$E93xH_g#If zEKOlbK|11tv!%c+2OoH%AS0#MQUEgCL*eSbgw0$wdF0*e`X0M1;> zh!yI!9yDqp!c5!pWw18a=k!xzr_cQh`m1$AMQ_bictvz_DLF(1Ef`%Z&`r}l?jZ4w$uZIm?AQK8x45&c`K%7X$Zi9`sS zRL=1l;AEAwG*`QY96lhUCc)r;4iOx;RkaPxAN}TT=DNSi)bMn0Uh^F&dn*hMrbCL} zVX6oDOsc^w;i-F2h?{XM?J)HxR=F8D_XOqw#140K{YDxj?R|-G=AE&3PLDg5!t-Z? zS*^@(944jL33r)!yrG7#tY0x59gtzkQ8n;L4Cp!Fgh_nxDvb&96Z5J(o}C7Fm?gKB zKj>Z2BMBsj`lOZhYxEID^%iiOn$xH{^v`-T&Kp8DnJ#_#l#qu`=8-uf&nM1t^vNrW z%{Z8Qa5R2LTKFO~Z_5RIXVYjp1N5SlElRPCV|&@zSthO4-Tl@fJ|dPt)Dr#8B{V@q!O*Tno%6ZJeiEeLwk{19|Ho@ z>9?!e?!%(#wIUKv3GgbNHDaxg=ZK__K&x+1`)+=@*HN9w$HrC^2~|paj7X}(z$dfT zm#QC{+GUhQ30z9kd?uWq&naALr>g3X^4|V3a~>Uc_wWfo2rxyms$BXNifO zXoQM+TLhlY_t_g24L-fo2~@R+?c`C*H;_LAYBpr=Z10_08^2SeU%9&fMUVc*s!g0- z?Ek^4gB2CtLnz{FGmqyU_o^bQWKV#6E$(nnLC<|aYN|5n=T5sAuxfm-i8K74Ez+PU z1kWE{DRxeiru+LnQ?k;s9!&Q$)?aR(hU9>_ma>B)NU5^DD2$ecV5n3ZtJGcU_P2v0 z-~-(T5}J`YrC|F6TXII0g3QA8!cUZapkjhqLp+>Q@{DN>*EjID`lFB(hsx$Seu}4B z>pRpKg?}+v`Vk2dZPo1CyLnnv5|FnNRdk=Ka~s6D-xb7tV~c&U8&t7$cAgbYIs^p% z)|DvugH+o}AbSB5{s&(E3B0nUu<#WIS948^A4-^iojArxBcCJ_T9{j%jgrUk`tcQ& z?DeflVj*Yp0YOlkxSS3sFKg{l-;fajKK?^#?$%BbnieZ!zJM8fG@8(aDgp}aRG(az z@1*VP`4uPTCH^EIkEHwN)bz6(2DX|BsK)8@IWbuyeGZh~nFF3!2y2-&sG8lZRT!zK zu?gpm1ga$q7cGCfX-SBBu8KfXK1;ps%op)?Z0ofEu#6T8(C-S*=^!QI$&irT0$GJQ zt18k);J1oqGlYpWPW&r_={;<JmS)X zaLeSgFw;=f=;shuBZQ}*_ z?x5X)nZSw)Ei)?zy$gbL(@R>Kf=*KS8IeW+x8)3&wi>T$vC%IAMx5{h>gGtZ_p!eZ1j|J7P#P&&dd`;kTgPt1?gLkdX6*hUnVT!R-^FQ(CSsQ?^Arpt#AL{+u=DAR3W3Y8t8#F(5SADtGianDa zW?yT1bCTKuMy!R5|F4AX*C9tW_@kobJ3c($ufHT@_69~)24*HS7Ph8#e?W!n#%_@p z92{H-+|?Ca)fJpo6uf%#`CI<3a?5z8vM6{@K>zM(|F!b^cxR(`S7m>_uqgO)<+sjp z4>{-|yD?_8i-cE)x&7D$gHszCUH}Wqa&>rPBtgg+Dhp?|H#)-ufWRJ2(=k z%Uzfkn*np-z{)-_f#7rr1sAiKh>&x=t%NOkVPX3m32^jQ?X%!M9>A*R9-J^^p&mSF zeQ==Tok}8aeUPBb{w5zqXTKML{UwOb>4-`66=kNJukG(03eY)hRiSsF6*Lpm#kSW@bW z0#CMSG7=9uMyY*TVAM;o!xNqcBgWF9p{dmo9xfArk(P#fk11MKei<`6qJo;D@KGLM zid2fATeXX3f7vWP1=t2;A7+Q?zouCH8-=KA=>~4_la^BByb7LADR+Gi5B@J z{!lili_kGEVLl;Q&ed>jz>Yo9#AJ42i%3QV|}gXSvmBY#F_Y;?tO#Hu5T>i?+0m%29!kNzPp5lY2+Tz;>Lm zrS{Y?oJQ|NvO-z;#OWjPtYYrf+xn~RkkW~isgjT=^Prkwn8$UE8P~BT6Pe;*EbVgg zTC$9>;m%;TI;ZI3P_r;`+RTG8ibj!)yQ_2pL6!N{4(s*9Oc2#_A$75AW8{P+D!9D{gYL^I?W!;otn9cASdOxl*M^j^2iSB>b(+o;Z=Q zjOK73$nF$BMHD#0XI8AmM-7BTCGxv;v_G+erK2=Tu|a@0q;(_lbbZ7 zW(O4bu1zTLO^#%BB9qr)4Vz-9mw|N zKqvcn!PY6`Wn~KKmNXt9U-iu=a9pEH*M&U-)`eX==At{3!Ib{ci-qJaqQ?z*Jqpih zp5i$imGLD_&{M?f?y%Y3GHwEf& zoG=Bf6#Y^VmupOm4{!5*ePWrD#$59YO0p2B!CRj~4@zr+6eL+j1*RAfM(tseo{N#1 z3j!|vVKt(x^g1*ax?X~a`x3v)K-f5gg^ltl{66*Q-vSSC70|? z*kQ-uYLx8~Nxd|v2xk?LdZHuD&`%}u&T&rRU3d8(t=SZoY{}}PSZAQYhVz+V)XBZf zZGytPY87lq<7|v&G3prQ;@QU*nY96Qj%m0St)PBF#>iiWN|9|tcjdWHv{^WSHC+g* zycmL0peRS0Om=adz@!{*rqyW&g1pGq6~WjAWbz6&ly?xAe~aGA|u@1~8tY)-b4 z3}cIY6q5(Q6PG|x9T4{7JhBtTg^Im@TBg1Nzf$o5ZXH0ht3y>GB|FnOEzswRoZJc{bwJo z==$bD99#FPJyZy=C$?6~dzs|)9o(_^UT&0HqpuM6oK&mhdqIqcd#Ek&i6CN#g}(zd z4tkTF4D#6tvtUpLKC~4Zc*jZx#~-*3Gz6NnTMrn@)Q%?f5tn$8TeLq};}obvXB=b( zPc%&R;(w~7+Dfpb5u#GtlkbVH)@F$p+B=>t&WU(Zlg$giQc3K%e;|~3MwH0zCFYh6 zc|^*{AsU-P+=7+l6AEIYa1ab)Dn)k?-*W!OK6n>~2HV(wv|oT4!opOr|KD2|g1K+zM_iMQhaI zDfNeFhn-~B(;;1q!EZA}xJx4q>4d7$Ur0`dxfj7)R0uz7>TWwkxN9SkYlo?EnCOvj zv*GsdpkK5S%eEudm~OLVqFi8OY_o;kS9SKIpkD+Lf9XqV-T3sxiu84dFuOLC9Mxeo zn0>gPXflj_SMb@5_*G1IyHO-lwI54uyH@EoNBEfz!eND2R%)9Xe#*;q+Nivz?8ff$ zfX^u#OKg`s9xZy(>vP);q5D%9vU?E0Snvyyh7}QklhBt;g0_HIs+!NF zA`TW`l2Hn`PG_c+M7gib(B?O@3C}@0zW*tMwE;E|-O55XdC-kgR(#Xf+|M(ZVz3-M z6(S}pbj2UhsuKy+Htfg=J^_u5Tuod{JBIaTB3h?G^{9$LX1ioUT?$|4N?#iWFIhzN zxJKA@47BK6pdqGV1p<2l)o+CSG_ZI=@{oe^M!hHa^OkqC%q=$deK*tfo=5prCh^zQ z@BP?V)WE{p#8|}9@gJF#s5mLPUVhZzDRB>VNGuVZZjw6*!8+sb>B4chsjM$ud|!c<1ZRYSoyfLR7ncR0BP6Iv z>&9cRg5uX~A@?K}+qij+^~qt4AgXsB)-G_?;DvDmV;D$o3qQX20MsqIdh~HyZF*v> zq{K48Uy9{1IxUn)_1v_A_CQN~l$oEYjuy~;tf1)FQ_agm5Z@@Gs^FLL;vxy zNV{o_UZwo*9c7otTnq34ug0-J~u5TZGA8q=9ZLVfM zS<~{eK{4wM4Gj7qH7b2o1DYs8;QU);KmFDGjS?c>3+8R*G73!&KqT%}Q}8R#eyni# zHpLH7ePU4#tUMN>B%APE(2L8DOF|SQ-z*j9D*Txp6E#4P2ICOkb2h~MNr{?Vnj7xD z!ygU55@8)@!x07h(+3<{BP#_l+++y1W(~`=KZh%Cv<51Cc>^WuEqG=VJ3`FEn+Pgj z{HT%<@;f~*n2_KuPT~eL3DN{gW)=?2g z*Xi|LV)oTpN02@(F5oJ=<}UNVyA#Im?QTd9Xs|YK8`M;DCQwV-mPw*Q_^h-w0@kTP zdOvjy#y~eXJdOVB>fv)&110)TQm2S8` zO#%BJs0KsMMKluRBLsi%QY>|4L~)g?pfVaG)yOtYkAYhB>!kReB4sB}3xyWx*aOP?wt6OfP|+Her;| z32baioaQPFxHx`oR~gj#>V-;Ntbk;LMM+dbd6CQbeg4)a250{nPPsBR@mA3 zg+x7hW2Lb#bpT3R^ZS4i65F8K>Mbm4IM&jx*SI(&uxWXtd8bZ!`~8ouf!KN>&UPjf zn-6aIo$MB?01<$Go@J7Y;TiLC?065q46}?F%G~1O06eVU+{Q?96dV8d)sFZz`}B`| z8Xe7sQc7mTS+?nXr^;O?aqS+e7zU$cEMJ3b6kGLeRa(f(Uipc6Vht-MYt}dC^A_Ei zX9~ATGmC2$p&q3HGf}#kK>~jzg$bX1v$EW!br`Z+9+im&9xN-uY=OITYpCjQJ(^R-3K1Vqd zJ;IS|Jiu2qjDv=z;oxGMhVbNeK|-~P&4~OsDn{>z(nl!b5umGZBiNk7-$dm_i|P~~ zX!}e~5e~C7B&PuUnw7p;(r`~c7jkY-QEanAzY_^-TM#vA&Rg3V<@#;VP`KH_IJt^% zv$a!z#W~iX)HZS zPZ=F=ogC9I2FJ6IH-3qVdW1kmnB=dlHxBCKq9iH$9i_Prb+l_P2-|d^aZ>GcGhmk} z$ohnSRUvVmf{bU`KBp)tgkIc1D^lOjq)gnL?!FgBB2C#5X@;zbodeC0Cjq(2yFGq- zKnrk8x<{=x%Knmdv$2t4ud>$5@}VVg@}%Fv?ud%YA4i$f?zNTeXG?zHmmH*Myj5YT zQ+9+jpa&i)Ux;;EtJU?M#UXsuJX>hYbR5;*pBHR8#oi*T<9IA53A;SIOJj-yN>w12 zY@CDZ;{Q&W(HI0wR-gX^FrEL*WW|;zKANnrv=G>8*qQEq%Mvof24e(6m9H~1rUAF;j6W4 zlI6{9e5wYZ7r!<5(lcPA1Snfj_)^3_mM!DM=mvM}>(1pANl=B6y#o0qI^5=(0~yh^ zt*0#?c$k`+{VK}<>88cE5a05Jc3Mgt13?3WgAQl37PpcbXbwjf+RycN*7jI8SB*&@ zy0P3bxk3Y}V4zmk9ztkEX>_MUb%>u}EcDr0?p#F9w(FS8Sb^z1Bd34H6e?GGaVD$e zZlz;th(^%>1|9aTlV#230u`?1vH1RxK#*i<1NKo3-OSPd|!v*pT1 zx|IuB+$HBBO6WkJA1Twk6cZqIH+zD`xtWbs%)pDe8xULcvQu4q#S-vYT;6e|yAG;s zr1Q>k3u7f8z5vxUnMpz!SC&%PF3T z0@YFtFU1lL#$+jzlohX+vugvjiw4YUnjQf>s}mD__$y$bE~hxBnzFuOrg~Zfeyp)N zcCols&}(H0`!m)mMkrPhO#fHm$dg9X{3|q);n`Zr6{|+z!C0}4sKcZZhlFbl<8@*x zbd8pgaHT|B-^4mWN#v$SywO$X1@@B2gHVK6dT?>y;75;4POJ}C3YOUf^sI}ikX_aM(4$6n{sLgK(Z2u>+ZQyx>EQ(0eMA8y!yQg*aa z-FC7m7KCC9LC7rIB*P3Cp+S@kQ_)w`D5PJ;B(5uX$KAtmQsD~93 zu=?g&j3QQ_d_;;XA$2ddTb_nJr^Fo7i6wPae+mhvl!iK;3MGKRWzRZlfFD_HC zcxqRIkHsx9b-_bkzrS_GJ0cP6jyf6^ghE9|t_u=a%mFE-ZM&YDzwTN6~N#b&WIRdKo&>HeUqmnoQ&z2cjDC=bf_w2T|)~UC}6w^~Ot5 zksGO#U}~sk^kV1b31cqJW1;@&5n^qX$962S21ZSqPcuI7X&aGQH-q)XW~WT8`(QsP zubh)S$b1ML+AMYl?wnoPnv?t#w9wg!0pyw`hmWUL{Wx_zPNS&gMLVmcD4fQKiB1|dgkPJ(+Q{-r%N@#8p-!Xr~R4A1_DWTf>`*AAJ zu@dKHc};wHH9Tt8w)R9Djq8W`x~c=D@PVn1)N>2Fx!GdIvQA9BxN5UiEdAOMo|Oe~ zCq-yD-ie)PHvVXaE^v62l(i)`**uGmO(0#k!8~gA=-hEja_?!gr>b3~6)O^-gt`44 zVPKnQrGZI)-_(ULcV=i0-#mBf5Oesk$vyvPpymR9@NuwO20PD>j}BSPJD#wh2JPVu z@?}us#FiX$Su~6^y87wpxev4({40d6VCrGr1N3#h1B9zE{JmHFt_g!foIjlqKJ}h@ z^2y$es6PWI=g>ITXD}RpvajdmkCb0UG#dEId~phq>SwRk=OM1ok_mYHh&?svWWF+F zAOcS%*6!Ow3N5?CNSluK9G#4pr*0LR?iQrg$5H7C(WEtye>48o&n~N>IO_)3l(Sbl z;w@Tqzaqlm%pli|aXb)q20yy@oA1iBkW@k=opiP7X@Z8$o+l{V7$?psxfR9Ff;hDG zsiaWoHv`}pS1<+3&>DU%_=>k6Y|cP=7YCIeG@%MY_#H&us`R5U8k#xRPBIR!@g^ru zxDWxm2%zZmgD?G6G}U7-s2wK$5j@d>pj`bfp;uMU@H@@jwT7E61Km5IytP0-f3ylc zx|Afgo$&p6@uF%Ib)0%9OuO$380}vWrvJ5g2^qY<`tXl~_b6o@rCEMd9w{jhqHoa9 zmw5r`<}j?NNd3g&(*d#rSo|9)rWS!j2JxuRT9f=)7d-@TS%6)8RGs|>;El%5eiLiJd??x}^g0pCk%8go)MD!}<}gF6NzOo$l9$X+xI zmdtUS)euK`06)`>AOYq*jRUHC=6bCi-rtF(^m;xyTE%n}uPsIyU@?PWHpVo|V58r0 z3nVLNT=X+JN8;yHde~~BrLZf71?(hWV{cT6Yp%O`Uv*PEes{L+I>QR8z}4<9UJ+JM zar_>!t&YtD27~HJD3^9U+N+Ogm;aTvGv5k4mA`qYm64vi4M(1DGkQu#54w~~c7P_l z^Ai*MH*UHkA>ZCISdI>Jj%Mqy-*Zz;UJJXrXBf)&k{ zp7w^*;!Q+#frTDP7wh#WnWG)z(S0pu(RmR#qLVIoqYmvJ(G4;dfl_4F1+JlaTDjjU zRukZ8TQCE?N&KVLrEe+tnOLYbdanoUbMPa1HEHrdh|&wnj+|=e#yL0@`H&uo@(xQF z1f%(}5zOZTTu>1%ATI~7dg(nR(&>c130&zPM?y|^7gs>4%}6K}Lhpsk!mTl4c5Cx< z$Oq1U+Oq^L5Po3~O{8V@kvn2$NtFjlYvSH7hkG zG1PSsf0!+3NMK^r#(V&ws8)q?X;lCrwjo2P$P;!isWvRz^#)GTm+$8XVowmy;XgFx z$1GFyR{3U{9)&FLqz&Ck2mu4!Q${&FX0l}OxtpgPpy;g736nur40Y(LA>zoG|)EzTcC5o%tTqLGlPB+%0rq0*4j+Yn+2e-woq z2d%?tP9Fz%0Qm&sB%KM8(d1Nrl3j#KvJ)tvZjGY{aV?7bC67TdP$EZ1sS z1jtYrV6Mm6=mV)Cf|RmI6~L(&q_Ql+NmLLiV)&#f?rMy5hvQ^>lB=CCt@hUQed^wW zS@CYC93LZt(G7Is-SQd-jXd@-E(YXvNr`zbnI)GhH4~dfn~@{qKvKIorvP(&D*F@- z_%l|9e4xY_L2a=K*&a-gP?p@Lj;E!{rZ7diYeHOQeujdyFgP{c*2)!c-#JZV*|m9| zrKO5wu8kE{P`W+Mk(Ne@Nf;Iv3#q)J8{}#D}WeG}`Pyk=A| zM70cPFs#rbAFq{WZGUB=H_7|@y|}!Mp@u$lm|pwFn;>NeVOq0Hu?^I)YF6s$_9U$j zLhqdN^gB4XKQuXk!XnBCXj3^BORD%7-dE$RPAa&fb4}ktmqBO8dGs^3>ZyU?2eAjt z6~a|DZY$YYQIj=U&Uo8W*HU28ZbSQNGju#w@?^V- zMV*}=r#p|5=r3qDloZc1?tuu>?;#0r?)&>opl8kQGe_Fd(8#h?TEBLu0B5br@{o1k zQpyc61plBy(c8fR`JR3c{~czoCVLTUF$w0l6z*AnTg(^~-gc_7dosZ2V7{Tty*ave zT-T^eybw=sCE9If+k<)cl9e>ec=y|GWztWtB;_M-07hxaur1OdVhFiAKRb9p& zkMmLWP6MfTzFE`h#5!uNl9OhI7!9^enV$78mMJW`fO=+TUgfeZ2U@WRf1eL zuS*OYaFgo9!sWXdz7j}S-K@Yddpv3}Ygr)#Roi*aS;3g!Jfe|7GhArQP5R}6dQJO- zc*o<;H3(%k<9Neae88PQPV)BUNl>z# z=i=YQNTe>u7{^}cZ0>yH7~udl$2vUK6gI7I%&IPTa@Bppf4 zcd=&;Bu}`4*qaXRXIm!?A+^AX%OM92;h!}tKi_Q+I}TnhnVmuupn=q#LXx(~v6(W(KFMcGjmc-x)~O8Jfb(C&Mn3OPW|Mzz1GR z1?d?}HF~7yT+WU&;;2e+4}ykLbZqT9;3ouAW<{D@0&Q+ZRrrH^lbN$rBD&G{~I#_q7mbkVW`-R0hNhNA4{!FhJ+dVOW590dZU-Ce|%6`T_uw@Cp z(;A=mJkVbqsQeGD5i)Qx5j8L}F#bm>NJ-~C6@<#u;7v_UHJ7ZZRj1Ranw!)#*bgD2 zS5AVhn1C+fjhp-d!ypB=!}pn-fO&>>M)>=S!eGakWL&Z(D;L+VGVCcHrl+gL#d9Fn zx(cEw9E(DGr2+$`J{s$?)+|8@Az%|UG_+MpSLHQ>X|9-o;rQF>2AvRtuCvkVy=d_iey?qat7>$PYVsEqsuB1#A`08abU|Mszzl8`Z-%$W1tIa zq*u);QlF~N_;Q>#;YRyq)59rP)j3=L@an-wg&lM|nD}@LIVw4ivp8~_lCfC2q!XT3 zK!(qm^MpgfBuPim=X7## z@mC0HO&=Fil1rEU5h@ODwBWG6#fhkdL`!il)aCWgIe<~YT9y33SB$yk=k_oQD}4;i z?AqbdXAj;uKc{i?sG1L1l1{u7#};kQw?Shvs7JjedHh1)&SStOhdJWY86wfdFw7M* zUj+549D!ArUxD{fs!+Az6&SE*LqFb!G4=y7vI`qQc@SpOpimWrRK~EM2U`)UaEP8_ zUc{gb8e>icOFv?wFfeEjSSEf&*`vBZU`mrxN*g6{f?LcV=TXExeggE54eUbA5ir40 zIki)4da5VUD)yU*QX(f!$(w3XNJB|T2VoMG-{bt5U^9-#tf#)Shp+D!(O<9#c}F{E z6C-B>L+if-@PEqB@Lj=WUBPKZ!EXcdpX29tkww8x;U?%s!D$!6cjp4)f7O|}g4+`E zv43r(;FzajB2S7FAOy;1XZS>}LPu3c9Tz9SS;0)#Ak0@q!NAtU{gpzCKmtl0L_E${ z)=;FNZi0&PR}sASfV^^z}eGz1_gO4Zt3R>2RUT{?=sR@c&k< zw#ci>k@Rj(>-&ZM7iRrRcl|+yY-G5g-%ltrF^mj}Lxa0)zO|}rK?e{*Qr>3#Ozdy< ze>q&I=KdUl?B-RH>i{&9kx^_Uh~6tgMG#N_#6}`5M9EoJZK&6zy&A+HiikMy ziovky657ud#C(tW@^8lY++{0MyuT3Jg$D%m>&@MNKc@R-%&$1{he28DQ0~g}XuNie zOm?Q1{E^U*kO>s@S5 zP)bz+O)e+pu8Y-{S}B%VO-&IiZ)scjxY-}ayO{oFY2_};qiI-R~xMC9Z4Rb z?&3+wk9Hj!b9;65IVOAmpk?Vk4ag_s3reop5eETJ%`A+zpF+twxH+{?%+?d<3n71! zwnZKR<8$a1DIf(a+rT||YY3Ll;QmwJ6sGUwPZ)q6W9R5k?7kXI--(|%fbWdY(OY-0 zHB6m7Kgs$CFkgp%k^{K=v|#O+I{SXo_T^x07`f+c(ZTwe+~dgIf)Mx&M+6**alYu3 z_#Ix?iDpM9A4)0}gctA4sLZ4bGcRk*rppW^WX-Z%PKJ{2ET>^71(QuI4(p^?h8!8l zTof+HYqiZuw}_;W^=~Rur>7Fg47JhXtS_5fM2Z%qCm--D&c*?9&XhexWHQo57DSlH zaBfop`sSadKz8EEqz(= zsT}xeP`LLrlFW3#(3DKcd^ZGkENQ9L7rv4g6FfgHGHtTC$SIa<%>V-6!)Ga&eqrY1V2mg-0Js##=gfE-ZrAPH!TLRMh_S~<&$DmG7Yof9Vb-XRLiIBv zU-I$aBtZ4Qqjj5_GkCa!-s?XOYskqi# z+MuacS(_wfRbt}=t9;bb*dtOsZ7i&(X%iNdpa<(XlnJ~1tffdV4Cox7qN*a6!E?5p z_rV=ft;>vX9YWMNfw8d@qwHdYMss@oj_EeKk{y|rwOBOEmlt%Ekd*1YoM@6a6Gt@U zz{v=3!8}a+qL|B)BsDY+U^lxa@=3dQ$G4g0n6sQ-X2xjCcOGOu1lF{kM%EntNf-E~ zw_qFA4dwO@G91+WLaD>Vpu~A}}@>gycTB z%SM1zJkG$Fkb22y6;tr9o??0ZktotQw=Werx!aCBO=^+N3pl%M*Zu*-US3 z(i&%g(+9tilL6O04}3aD>)IBfbGHA@mUdkf2ChA;!i|1S!VSxrU_D|0ev1u?qiQY$ zL>9NnD%l+bX+_p3JfKqlJjQ|dXrLvGou~GZIG*|?>YRHC zY>I99&Ttat>XIg5FXQ?sf4oRyT$UNgh?nJd2x~&n(Z{(RCTvvCf)iC`E+u9}R&pme)>~5oeWPE_I zt|ea3@YBfwy0^;!dURO4n|01KSEr8&aYIZ~-78YtOTlS|dsAMUD0Dv|13flpQY37+ zwsOXiHha8Lo{>dAam+NFon8m1ctBs1I2E9^5FaKLk&8eib1?G|-=I0yv+X;*e;JP6 zz#k>$*vb(+8b?0j@sOQcAN(}jC5Dwljd|W+*3ggdSDYDzbVe$t#QsfcV;J9rw_-#H zL*On2X5UDh7UAfcG#vV6_$c0`*!V`2zk)zJ=d-y^h(Zd6y~mHHixq8#)69sr#sr0{ z+!_Td;4}n2K3{(?b4#aPj!R{>b)l{OW3mbw^Ab@NO7AGYb8e3#T7#7}pE zjzCIWnWJ0u`~?@dQYy^43s#%f%$oNez%oTj)4G9*Q9Mxt%)st&mWzh{WRc6zUu^VG zdvq>Eu_ab}?0KrQ**=?5wYKH+CbwFJdF! z`oE&8-e1*|nNMb0sZb)>iuL?2c)B)s`vau*6PPpM4AF7n+?`aQq02#TKpHO}seiN{OOjIVpSL)>Tfx9uOt| z_#uKEaI3RUd{$RQ_Uu@)1>nEd!5IwThc5b0x)Sq35UXSU>?&vq#mu5ENS#yCt2$Br zHNz35FG1Ct)>}?i0xDurA3khU4BP{2i#~K>(8*Gs<$QaEPyy!V=9C*Q2lN5R&ZdL9 zX%v_EJtmKaGm(_=Tj^l@8Z)V6U%4E8=VQ>{b%huL0;D2yFj5UuXDC$-45496VFD!S zOeNHPQbD>U3(wl$E}N_zq$Xe|iU>#w8u`Kaj6lQpiaY2j+{)SRg9{?nRX<7&&3uyr zSQB2X{GM6D`Gt_|HO>yBapGe1T-+2L8j(}mKVE7^XU$fE*d3~(GKc@AL_})r_fotL zk$ReCRKY-~V6pp1g}anwrlnLSHL1=KNu8!Kt{|RuDUp3Ot$lT3tE$6f0C?6jA-DaU zxLh__g%j~eNfe5cew^(`vp8SqGGv?&LJhLg4RM!ayeYbxIJ)D`N<@jRpczT?liQ+D ztW#CJ9;TOnig1{_cK$%8O`m7cfwfQ;>g(TOJT_iA7Ajke&N!e$UM&t!b$a+ADfzSe zTD-5-elX|n@@O79Ir37tV!iKTv`hT?_>HDVhi^J`xYQ@Aj3weJ79Q?uMmh5GMkanw z&C%Kwvyeg2vL_2Jn##wUXxO7ulB6a)eFiPah$t6zt3;%lQ}nii;REw<$t9RDT2fLI z>o5%o&nm38g4mkk^2&Px`)(ozOR0&mk*+C)y-})F1M%OAihE>Qdt{Wi9^_#;N*Y`Q zbxLuqqsgrjlAV1Ddz4ffP)Hq;k{ec18#JUg_VF+7Nln;DYSc(<>qu-;VOqGPvPz>% zf_v@pNS;<R7 zk0#<9W#St)QX6z6dlu(*4_U>En*uhMQ~3q9CG1S8J7^_|yh_Hc_y%|s_OaKAB~w+= z2Hm-ekAf4tVhk;u5ggjaEAR~9Kj*4qfRaaw)Dth``R~s?qdisPR5kX7MAFUOOWD;C zIKY{7p(5^OJ%i-RB~_`WvHfR&4LsH@W4~n4D(Q^Y>U2FiN3|s-)i6Nv7VqfgEBDw< z404T0c@3WbeK*(qy0C-f@`7lMDJi4s>6Uw(&^-nkb zcMZ@rUaBA;Nzl+YVIneDMkUufh`Z-s(8@S^S;rTopmBA2@3;z?B_7GN7E3d~9LT4r zFW!uuHOs~^BsjxH+u2p73Pe}lWHx> zR^8B+w^JOBVS>7$h&W7>;RWQ_xut3ke&5+Kp6Y3JMb%nEGzth!wRXc#nk)iFSNERh zF9wB2?M7r*+-Q_)+@=z%B1TYjy+l=S(A>eQKwPk~{9Lz1CWKf~C(!)WZF)KroHw7EpPT#-GJxix zt@e1mCQEZz$7P4?W1}PS*o%SezpaB$UT;ay2 zY`<%uG`jXovy=Zj_Pd;xd@|9hyq05Lq6dcjc&=HWba_XB zUV?o>s7N^0FnEx##pX`|)XJuTOJ&3ZtZ=i1rZEU5QGb&b;>>KTg^c$&r)H|*s-hdt zS2;Dmj4bS%qKW+=>p9pA#|$5t$YS&4mS~-5Mn1FmT0Mot#1+R>KOwBKSA`nsP0vm+ zDhd+roT?(flW0U3|5yrh$b7>xIe9iLlnJ#ZtJF z2M88_z>%@jLt0xIe5oTN3m})2hR42Ki+h`e=D-RPlf(b5S#g%@knQJ3$b=aUzk5jv-P0ctgo)#y6( zE!qcuqY%m^1_2pI>!Mnawz@f8^9&EL%r0l2z84vL+TM*^C#bHSY;B8GgD28+r*|k~ zz4DrG^_ZcW#VTiUPvbJv5gk!MO9;Q!WYeybYUeof8Peq(J;=5sOnsdaV^5jEsRbP>fA`@1<13~3UtWFxn*#M#T$jaW zK;V&`vr=!~w1Z~;Jw}>XOQ5I|i%<$5RjN$cRT|~yiYCOWZFR5-3ZfeXqP*t^zf*v) z4{K2#J`hjuXfic{xeg!W`V7EY#~Y}Y$~4Y}?LM)t-kTpp3XKXq4ilt=r)q#W2y-Y( z9w+ddYvDsZlk&4;iKKIixUN4oW?ew}wfEP(!GatjslL^o3-Fzf(MmNO)P=5va}J@J z8n}O-HHe~@RJ4{Ln>#g$QDdGL-jyRR#yjQ&ra6qBUAH);6VHJH2}BxpZf?DVK^1b9 z!LHKvYI&LEb=LbH30z_%O(*$#iew`_FL-g}Iz06ZK`YmpnkDBOq#O}MBfK9jA4mg9;UI^oB90cAAgO9-uY1(h5n|ePr zBk@|b+jRa;iuq-cPW>Gj;AIy60C%dKmaMQ$6`C~>*r>DwRaP|@qfW=Wc;{8gB&pTk z7K~anQ4XG*o(#50tu=%y4c<<7iX1t#MU2r+di1E7C5lWgbq9S>(YMWU9J}nGAv1N6 z8?|L=34PXpRl4%xQE3f_ot1a(E|Nk*Chf}V2QQt$BeOKNG3F4%@LBV@awtb5&Blxw zEhS^n=vJmf?Xmlk=SGCqhf^A|sz+P-I_c9$jG8@oYY68R5$CtO^`~pB_0zTYj!aZQShDbY zL`O%P$NAC9?;(Rx2T2<*tT{T&u2Q%Q_4@GnL#H)5G^RrwTRHSG*)`s@BxSR*#20-9 z(>)z80U<3?wEbv9?Ih`6al$=eiJ=0BVs=ANX?JWb{!TA^(U@?*TL^y(NvE1Tqu`$G?af(+5 zc?$_10VAWwvesJd3Dq^(ay3mXAz?&0t65*LgYh!nGEAkh)9*>eGFMDT*k(bE6rj^F zAgfrmYFDq8|BU#Gi*r=z*nZgTFj zm0T*{E8s%g#Qa1EB$81tx5TXr)$!39cokUy(1r@sMF-9dvP->Jp7g4<;2q$g7LU>p z_G)&BSrl`}H--C)0~ipdVivXzFm5aOMrseXDw3)H)XCpc@d%G|QDd zeG5IhyXNL-@z%wE+x6Anq5bIn(yZvRMrmEHJ`>^0Bb(+OM45hLUkBN+fd!G z;Tw_q%OP!y;ef`RH69bj^j`Zx7Z`H8_|mR9M4*+k96xJIf^~s<+`VfEjV+<({+zf= z%E2eZ%%>H+V{Vcy@^$e!V~tr{B~M~AqP5Vy{HeDUGP1I?9AtJS^g3Dq`^->yo3K{7 zHKu0}hD*Y$yLc-`${9;Da)&!Iw!cvA8kk?d@|o+S$W(V+-ER~wdJU;=@t={Vv@!3b zc4@>ej~5u7)qAd(c~=zaCp?LSyFaHLG>arR{Kzo0 z4s<6Ph?`Uh(c~(7czl67xz!Slx&8w~2gXjIdH$yb828t8%EES;B$0i(h+|7II8uX> zuhhg`f@jWwrQy!J@qp-qpB&et9P9JgR8*G(thb``ce@CXOk-h0t+vs|q0-v$2jG@* zSJyD|HPZ?HOuVt`c8Jvqew~=tMa!%q_j&Uy$<@R9iTO5p2~Q42qDHgc?I`ItD#t`y zDvrbnwvLxgM~B3RmP&Nki^^@{^&-P`#bp@kMUS5eFWknTJbEGcWlr}dsEW;gD8iBh zAV;Bxy8`jsq3{3kQpIE$R}cAlmR0^xx`h9iEBQZs7QGduU+yyg-g)7$NVyD5t8yGl=uVRaBa6}O>ZAKT zg<^|=q*5c|u$r#CM|Hsx*nI@c#(0yy(Y33Ye*Y^CqJ7R3Aiyy%aYiNOy*qb8@{*P0 z+(GL;8^i6b+Kcuh7jKN;N~N@Z|bDRl6MY{Q2UniM7(d6WXaAZFNw;*-QF`!%MbF7n#BD<%VYL<%9xcz%Eo zq4VFu6M8rt1mR>7(N@2LPV-g>FN5Q#c>KEvz6y-QF3=c+3y-{ZgDvbQghw5*d7OTA{I69&NMYx3fP*hq8CGIdIVlIWzA)(0R) z*eoWalIZ}nc{0dzjgS)UC6>7oSkHXVUGDeH9`Qna-uGKS{NH=d=Z53sVGfTw9)Aia zjv#(FR_{GvCxSmbJ=pE>-B$!c`i&xjZbD2-&BZDfNiKf zTmP5l*bi$2U-VvA{}&qwXE&BV*Pyqb06qx4+u%3w{x30rA4&+e@cP7G9DjTv^_g^F zc65bS!tsM|Y+qc{2)Trczlj6UK8~q?zEg6)TOxf(3YJ069udC4`QY}*0Y8`n={hMA zzOnyK+xam=eJF=Rl#`TtG47{S)r^!f=Z+b15X9)oSH+LU&LofbQ>dX@G;uE_7AU9$ zD<_qs#bdozqQ-N&SEBZ&2(P3FS>WnWsXdkpoM0W!q9~sSSOiEXk3Wm%xohL;!tXsH zELF&S$nUCHG^`0CG^qeW4e2qO7lR|sN)Js?B;w(Q$!0(;3blyDh;bp$9@I_ET5)D` zH;d(6oTR3Wnq)5iX3aj~HXEuhV^&j(8j2w;SpA*8PAmoS7Hl(4y1zPAV7`|lUSxZX zQpxkVfe~IbX||MT8^l9PH>Fw0BPC+~2&QxcUr09UGbzt)9(_<8lX_Zr5*N5cjv7G* zCpvHc+Dwk>o1uL|TsHgL%3@_gwur2zjmc!nXuqs5*QCkJCS$|xfVF(EiMD#Q&xj0L z#$;b%^%(5L4zXym0Mdr^);^pB#Blb3f$6+h7bIOgbvQq)tL|s+tzrJFluFp*c@|-l z6i$j<_1ww%%BPtx{Q3zY1i+v`Hd-Ak@~)EyQ7T#!1@v>eB<0}wA`3kOWsKioADS}2 zqjtSj6V*j|a~=wxg3*xXE#o|g?GT|wiaWy0S%njkkI8Jg;(F;ik$43>6%(BVhLn~m zf)&^nR#aJ>gw47nu?dmkh#JQdQ-xDz<+o1Umc@f5=``8(u3Go;Gvrp`oFRJvkoBPc z-Rz4eYBx=dc!|QP;qz89*=tcptzn)PJR5(z&O5Cqlh#fS3h8Lx=gZ7556yzX?lNXq z5(NuF*eX$y2x5xo*C}RpQNxf-;)N~b^GK!yC=xR2r0}4#3n90Ys>4}Omb=$fnHO6Y zV38oXe5%7mcwFfi_%lifMZBZ9YZr{DuWn4Vj!|R71mgk=RJldz>72DBT3v$H z5vG23MUE2L>|0Pcc#cw?`k*FNAs9Wkkr~{~>0?EPM_;Xtm=#&QTa*}J zSARDn^COtexpl&Wx;fG1q|?oTpZAwf>}Z`=NWYG+W{LW3<-5SNAy8E1Nd@KhmmD?^l5 z*b!vNlveFFG}!u)B6czKJ^H!V{?dYN`FWmPs|Gc*&Dh;VIu8xFV&|uzSt?ydkUm(6 zry(^5DsKmVphDddKJsn8h~nSql@FwmXs!6vJxDFgLEFlvUw(>%;6utFU& zF3odtByU=0dfHu~``@vKRE-V#74(j!BBdwVLUz|BTF%c6?H3CqI;6Vwiv9MJsG`+= z`7LV^nTYwJb==PE$JppHHsaG?=}|*A_)=nnaF0QoS5kkj-rXhdjOFuo7mPm4Hl*j< zqwqwwbPoNJ`7kOsE8miCC$^+Tzr^?f3m2cesbU?JsJtuZp}fZQixXx8y}crf=Qzs- zk>91C3e6qoH1oK*cxF^PF_aOEm9KypDqa?79Eu#{rUtHy-34bS%&tOZ+N=*NOnoei zg!!4%B!}EfnmOU|<(~7ix$zxB1}t0(2Cr-t(046*%TuQ6n|3u=|86W#t`oL>p2rMU zr6G?*jk8HQ@T5x~A|({8F2Kx|`h{|xgdsB{A2p^W2ABG9a52H7J)>_7A(LT8jl*&e z&`6sy?cZK3FtQ~HCFj_%Hnce@-f_a0mcbS89qiy|uoE;5b`qn@7}a8W|Kev+_{+Cs z^T$@zaSC^KA7fcnB5Uu3BDdR5@e8m%&xm7{3Yh0qAsXu<%~J10ekG(8h#cVG5-R#f+WZJ#8aO}$HW6Oo#~>+%o+nQR{)R1V)9jgWTpU` zq8?QE6$*~(n!`vD-{0rt%H-^(?jN!arqmLeZy75^>FtDq@190agA;%@VMJV%ZYlBejVN68_+_8OqrVa*QNyGb>;+Tl0 zY`VY_>Gk%7AB#sY1CN>0e$mZKDNN1)(GJ&~q{2z`ma+P0jnj0Q4lV!dR}N-vC1S}+vt521zlpt?Hb3dPz8ag7&1)#!r0KC&UbY@Bq+ zp><|Cw2r39HO^;r0;`fEa9GOshB1Cq<_idxk3 zLYwSIbmcJ9QiMC2wNG#0n$EvRadAV^txt7x1Jo{DWl;ZS1{zA6vKx!nYHezPSjZ7sUgYnl~;%a8cLM(bL!w zbq*-iD?BoE56lL=#4F6BGW#Q$UJ-6`QY=6>_@1`c)93IC2)1ckr|c6d@wCpoE0oDI z+7ogE!5gW;9XbC3kv%My1yb`@H4B=w5N1z+2=wIM`r{2i<{hs1+jcKNy34aJdj#Le zY=j*QP4IL(s_*@ZR9l@97lZ19V;`yYB(@>`A5G%O_2* z{$dwb8sAv;5Yso3c#Hi~uU)f+k>)l2e!>0PjnGHXc51jwo=G zzYD+6hZm|V4AD(9V$CE%Q*cf0#{=VCu7R=+-2=R31Wo;FDo9bnJtO@@%(>u!jfzxqsIPsZ$B`k+ilckPK zOB1xrUZ+BK7%+>y-wKu1&AJ7&V+(Fd4;!?t8e|aB0TA#^Idm*H0IiW&Sk#~T_`_dm zDbnnqAXAhBGfnt;+#e*D6tNL`56&`{gh5YvF0RWqQSQ2PL&X(-5q-3)AM z-N$PTvQoPlKj2B?MICWYGle=JnmT8Q$psDNvZq@;9v1Jt3cxqnF~@n&ymzRKXarW5 z07uucazqG}UmItEwOx-3X7K{3+ClKq@uib?#j-HDmJO4;zw7G>?3*Jp@z>BtNzvVg z8&uaFuN{*1)U0oU^8>sTOJ`aPTnFP4-5DtJf*IrxF|LCEhF0Pe;u}gitZ_N6N;&Xi zIdaq)l9hrsdv3dZ!djG2Ie5YuV^wcaa%^;rw3nZ0_Z%@ti`0X7v>ZO|8yYUWk6MGx znIo5+^9Dy>&&YPlO{VoGA(zRSby7v?A+1%DEYVI*(6-veqmJ6g0$2UwdVSIeU!B!K zKdS>1BK#dEI@-HR%=G?JLg}H~o)SBAO#e8;nJa^Z3kC~UJgfCu zFd69Ds5G86WzEB<%^J4_d1E2OC3BlZan?j&8kaW!(3lWEq6ny#dzjfwRk~u9C{<`X zbVLVr2i19XM=QLmv)Y1j+@Q9=%J=Klq>+gO^~#q6{UmDh6>c@9~=@rQ9h zbqO2w3FliEcbDhG6WuWJyVH|l4ltIb!!m679+W$yQ#A^dl4`k; zar*CK?8E~L_jJOP+#x2|@8=-FECRq@u%iB9j{pAiqRRqyuu1ymck9jh zd~S8hoqL}thy%oq=8wCbu7IUO|I!$ ztVFE37OjPu2@MD1G8FBinI>&Db5#SMqrPj)X>mbrD_aBD!e*?uzd1B9A?> z{G2@%G-1h!HLY>33flm)Vt8z&V}aVK;*Ws2R&uI^5Zx_5C#w~%L=k+`*pMXYhAIim z7K-#dW3u)Etp3pw(E|*!|eLSF;=zgJDFTmrikoV$!^_yzF)&%@q9lXogpKuD<0;qn>?Mo~7*`jx5=t zG|j2qKA>P8q0(Kt)GP6j0n$8 zQyq3tb%H%GRS8>>7(PA^gj79Z4%Z;9UPkHsDgmSpM9SWTv%`@n8EAey?YpQ=YGhJm zRC5nDr=pGq=GfuGNk6q0-4Tm)!7<8Zyk9wnzD!zxP?s34w>U4&ihf)Lh10&sqQMh< zBZEI>trXH5WulpW{O>*>_SSN!Ow>a zTK~QQ(=sK=?ji+7Ej^U4vhfVy1h&th5T!K0lx$`Wl+W%7wrF7Kw72JrsFtQ7`EVTI z;BqqvQ;X~~Uyn&6G*2a9uvTMV-_(=XLsJ8(0~Rzxwqh+_5`H+md}Ns~7U3cC_}!ev zi2W0xEL_j9jNu>(OGlrT>C9XX%SY;Xoq;9{tulblZlEZ&(U~0LLc$+-)en#`l}ls- ztciHXkPAu`?FFF%vm`FXIC_VXC?zt4s)Hu1y!E5E5aoh%qw4FUn;sF}H9akF0g;9H zBHXWpAvbd&?}__X<0v#P6_&`{{jIz^kV^t%R+)9vlp~F)!41m{k(bOn_UhNEOZ(&j zv#B&z(XdQ=+7`Us?b+y`2;puM1+C<;@wMj@(Bd~&f3F1FSgaf-meAY4@^Z|x-`oS;C-$u)1%|ywi&X1pq&td56irCl(%oUULkI_p?aKNQZP&{$ zz+~Hhmo2?2Mq6$#F_srhO6z>o^}RpsSPhr)YtMGYxVF^%^Ebia@@XrXUjw{C0*8gr zln!D}tmRh#`#rc+@WB@e#a&P=m|kVOrS{=bUpG76%|G-Lu8(3;z2JROIF>V|+c*sF zhF^3Nz9O?hHw@Y+By5V-n$v!!FYHo*RzCe7DcF!YC8QHbypBA1u5CfvHwoUIo zsl+oX{nT0Ymt+3Gi&}v&S>KhMv_Kd|j1IpBj^-SJOTPhZ63M{>$!TfU-XnDB%}G6Q z6X2X=*dVSjzv^rJf=)o4Da>4FjGy)_O8_Tx7$>FXmtOs9m3ZF!8*^hyhE#^($l{~C zKb`)8k)x;i0vF1m;7jVJ+S>*&K+?f$dUx!;a4`G|jpaLAm@{`z_6h%K2Sp5SEo}Hw zKZG3-NJw>4NbvW3Z{=(*KmJXXcZ^&w0>p}#0Bk;Td5MlXAqh_Yyb06!%tH1wo2jAs zpvX9y--UIH5z^2gU@aWCPKx!n4Xa65JZ{oFt$}QW7Afsi(c zo}U01ty6X41by6SSAGq}bqqk{4rQ1v!LHAufova)9)R-3wD!fIsOU{qAj7-%q$M5u zxO!15`~D4QOoN&X<{(s?3}(7%Q1RS#_K75(*dM@r{&GHE1aMIaB)K9dSL4W0VeQDL zptT}E@XQJQ_6=f1ykA$CRB128e;zXPJ1IVlGEeKc73Sj~MP~fTV7o8R$YC*!k7R1I z1Sy$j|9G0Xm?fC1f>l~J)Cm_G5v0}rXeAABgqq=rwG=fx$1sxdIZQoh3ZA1!w1_CT zq3@#7SCLZ&DunsUJK&a$#PEq-meY#6< z@ij)tnVp?zwEr&7Bo1kT&{dpmHjqB)BoOuO36L{AHG&I=i<*Hi%VZJDindIInf2C~ zWTj7d^!_EtmzR1QQn*(-p55i<4wXUZLujh)mGlPi7V{Y&y8w)o~PW+CGqiT7xn8X71%`Ra z7(KtK;AFCC z>7q*E5*w>z#@dIw`M5B)Z*=nUNj^{*9tt|TRfJouV3$nE>d3IB^R_>ClUX2R>$aS3 z-aG|nTaP&P4h`g>cP~l4B|^CO$o{9Y2)JE6zNylVf!{R1FY{QsT*BS~fi>ZfUKYOx ztYQq(GWZQz$$bwHMaIOzZ$l@H6Bm?SZm^YBI0!r7!mZHW%|N|PX+w(H`P>&Qgd6bQ z9&|r1KA^8Ir~^+}%}@Gx!8rpEEZV>Y`u$4ybY`J@hLbK-)HhVlpc0ygByxPW#eGP2 zKw0N8#hyYz-lDDCnsUx`*&YyUI7qX;Cnjb%y61i!33hz%%__5yGl`&X(^Kr%_WKIq zDy$MIv@MnhI+??hyE-pbaOI&bEqPZJ_gj?*6rLz=eD8#8`_)gbEw9$$wgxX5?SoS> zbKgQ6_gY#p>KI~s`IQP$^9q_ORVmR|b4?~m^zpGD&vf=Xr!3oVLw~APV*Mq;N$Q;3 z$39q&H8)F+n0T-=S$B{3xMB&Fb+dHA3dY<-z|3^m&NAS+z(0&te}Y;6^n)epu#LIH zL)};m(1EQ9pk$?@tCl~{wjc=HigVkVWp>MK`}rB?ek!^B<_@*}y?nqz=K%Wmp2s6i z_}ag>aiH8w}{TbPpI)Q&FtK#`Vh)Mtct#UL#J%5uw94FBeM?vVYm_u z*FdR5pAeH?WSN^jBQ>kM9u%+V*Mkz&MW${s`af^7i$zPgT@7SH*e0K;=w?H7O8CN`Gd!)MS%OEPkM?JY#gQ8sXkS!G zxa5;;lHGR+q&T`%JM7bkW+QT1bi+;6rluerLuH=B8f&ZAaNWl+m+6hm5@Ei8{l1e- z&;STNg;)iIJq2wOcp>`(v*VbN`LZR~tAt9RZyj0h0j3)Y_-CvBD2bouA+q&wTm=^!(3M6uMxCHNPxBupYjnkZbgSUS+x? zX!}2}cjYl3rF&;$RDPw*@y+m+U%e~xwk3DSF5+%JC5yg20->K>u@fBo?q#Rw^Al8~ zMHM$Vex(;5kLbGAn`c%7iN36RIg<;>iwG<{d1?C5CD--$P4fl`8pH#F9;IRrns2G7D7nvH-LVm?d2f}Q@BU|K1}s?LAqhQ+n<&|yha zGhRdJ`H3X>f)O;$CG&|^Pts>+Lafo{_XE4}&}f2Fu>N~pV<3k7f*k<_Ias|62$!8#v=gfn~ZxQ-?pIH9Ec3kIon--iz0IAK`LmaA8!cGy^-SYCYGK z{N)1)mM$0IT8#>3kzz!by26qn@hhd?1M%(@^}vwhAVhE9R__tY=)jVFm;BK%#qyg` zMGeBZ)}cO?Iy;wz9Lge%962sy_h|XFFZ6>#$F`aTy&a?CC9FS=1A_ z%j+9bcrV)<0TKm?c};z@lmtXZyp>lgo)-YV zWV($Y3n@#nkvJGC)XKJ1jXAcJ<-hOw& z$5eV3t~pPVk471}MuiLi-_{8-ra2`Xh{KRyH*gIZ)uV++v2A*w&nhQ680(k~^)b9BBC^ApovFy^NjTf3P( zgaWW(TAjUcUchA;7l;3*5&FkczRIIZx&ADpK=xzJ02k#QWC|44IO#SPcFfwtg_1m2xvawkMBM^>6^s2Ne< z?*?%lRda`$$lVrM4K-1&G9Qm0rui&7ks?N=1<;JE2M&)kF!@Hk2&1E%m@$_JVKEbC zJ~fdQPaVV=^lG#wl8>P#(URm*)U)?w1(P9~Do8|#5oZ*PGA-QB?IO5${mpRn9mymw zO1e}zG_m&ILQwy)UFyaNcP2kLr_0ayw;1SO+x7nj=p6kg(3wBi*||XEZ3Oxcl#}%T z2g=F5T}a3NlhLaAlgLf*GtGbMm7IQ3ex1$f|EU0%clfV>_J5wMDAiYA6jRJ^+4@mg zR^;d)yWsjT)=iS$A0KBqK}tX*h(h@UP!M{u3<-?(w6KN-{-$KS1q+@t>oT!2^ewcY zpyr<}*NUyBciwMc-)5g2R}=WZG{$^6?oZy^?pxQ6eAC?DJtf(IwRqpMJE|M={*$e0 zBi@kl??IVJcYk7AAl-lYwd~_^;>CZv4&7FRz-$!kZ{B_5?YgO}Ud!xwyYaQqun9m#+-+w?WeJKqYgLNdua)Io&7O=PcF&xekgUHm{_qna+!Adu-|T&NCVtmIXa49iUzY5 z7P==}ultceeOoF4Ac0Y=A-gvwkF{<*%-@slW z^9bIEu5Lp*#O8Ns_EOUA_K~uw43|gg9OWg zjGAep^bWbadDh<9)i`C$NqdYoXwL9GrGXkkJ;O}X#?5X71Kh}f<)Tzrm1ho|5w^l; zBga)dT@^gbncRgUiQBJb`B9w5w03Qrh?oT9m%&`wPE`{e#4>YeMqkP??qM=jp5bep zSsveCU4i5pm&9fYy;Nwlrbk#Cq%zDM9xgiGc$h-%Xx?5TYkhWfP$28Pg554#x~V?Y)7y>`17uyd$a zfRIVh%SlpR#Vfoh{b4c%zjiceJt_8H=DKx^b%rfUy)Bl z!8TQPi{un~F{k%HgEh29FF5*WYwvPShrh-z-NZZ&EZ*zHL3WaO4A3oY*(`}ICNyFu z=%Ba;7`UQj+?kdJ2*?U{k}A&fdEmL%1MtG` z?}#*#9w(hNEt1mg_(DPx7jE!Vn*WZ;#)@%PlRi}iv+EthfIPh1p@RU|PCRI!Xlo68 zqOue0(h&l*JP#zik&_-$L^(m?l}Z>V;L^h}~^$sT3g_1hkRJ7Vfd9a6i* zU~Lusn^=^Yinu*DVN1A(btX5ekZu3*BqRzjbLV@rRRoh9C&V6CXV@b4fLnv%p5%2q zS8iVQX z#Yx+O`~W}V1$Ctg{*Y9d4Fq4tf$Q?y9EZ)v2aF)+6uSV2-ySx0uD>>2m&7m1|Mfd? zsyUEth(>=8^qqwncJ>dk>?{5n&%hBQ&O{(+u~UW+P+Ck;1@a7 zUb+gm1B;zCYHM??wb@-8=3nClJgb`HS$1@j_TpidpkG+rD1XNb4$!ob#!P_`XPwQu zv=X?(!Wki7D5wrVqIX*@ddTfeN$!dv4v6Anw1Mw3Q17(t)IvK2c4wj;9V5FchD$uNvE9!ndc>oWsNUdeOf1 zve0ysJzLs+@4o+&1h%bXZA$pb3xP!g0Qm7E`p;L#|KwGpe!Pfqj4^%4Jts`KWabJb zGUf~`8jCw*=7|bZ7l@)L3rWn)>8B+;)rH0&QP!uTHXN6?3~Y-s5jSe{Fw$Hi+r^TtNIm)zsjq9)=Z=?vLW+ zMF|9F8$0M1sQfE)h~q6hEEWKs|m7wmjvs}x`x~0C{?nI+N@1gSW!7$EiF&E z>7Yw3P7f9{T&&`jqIk@8>9vdr;ibEoc7n~d1}@Hb)@Eu>jd^C}Mq6{s?V0tu?v7T? z;=UfLse4t+8)ll-!oKz7a1AUfu6>CLF0TK@+B*hU+IHK*-C@VJZQHhOCo8t?q+{E* zZQEwYcG4Z|RK#PBp?O;bjku{qf^zhceUDR3hhyD~Fu|nnMVgVYtoes{w(7Z$K~|fAe4pK#o66yy?mEzeNGm_ z=1I>?e+$!7kSSUZZ$u2aL?#a_ChG};rXo>e{1r15haN@{n1Dz|Mrl}E7Zjkxtg>s0oTRWSn(e} zxe-Tfekh&q5zw<3&Tim1_2c5Axn`2i$reCsJm`l{L!g=z<0mOMhTcF_Osv^B-hSRv zk^L6su!l0JfYV5eYzt%rVM^Ai?Ci@{X2oe*9wxb_A`9?I!!F*p1nZ850h<>1tvO8&KwGY=YA*4zk5 zLmq3+3p5FUeFwIkJI!|R+yn+X9uNR9f+3!@&xmR!qhNP(3<8{i3jY+GeH*urkR-X`+_jAB1Pg6T6ZaM%kkn9b5 z)TAY7QnC@4780UF)5d_;f;3I??lnCNk36tA50qn)k{h=S)^vh{awt?jp9IzR9p1?| zX%NSZaPr*H8<&SPnBvkFbCw^k8}pgrOv(&NOQy^|mgBCKB7SM6WpFQqn>fDn>t?~8 z!mfQpI(p~`iG@;`S_i(iZ)4*E*yd)R%8l(D8k*2?WrJ+$=P^(rZuO+g-OKf1vs9WZV|V78AxX8kM_nrnHHWDU{gtRb(~}w#I%ti#Z}IY1hWmkqGM224}d z4+XN6R_@~4m>CZ%yd?gNEB;EnXlcMM!_z>VSgzcTN^b$kqan$-Jpckw`x9eO6f?AL z2CzKA(|19bQ%e6%52O{Q#T&f?@V`&|*_LjYt&)H3^v3{cJ0nJ8t^ZM#WR}%=@Ik^* z4STq;%7~tmXcxN}FV#3)R++tlmIfki+PqJ(y7m@xXG z_2>9|uooDRQ=kw1h+~olu7)Y`)bd%YhSO_o@Z5DBJ6o z7&>sH-OR4WE`&$|PDBKpOweV%!*KD(C{^ZyPzxD|x*9zhoNy?|6ab3Y=AXy`$pXV4 zoW5Brni#Q{!|nXAO}lLzi!8F49jOZ6wW0CmBm1C#uL5jL8Spyleh``MSzkJ7=O1vU z#EXX`A6Tf`=a$V49ncYtLmI9s*JG9-ny?jR#;gsl$-tl)fIZkD?@(U*MU$F$lgtBh z>fyEm-9-R6{TJA0Y%%>C&hkEd{4iCFBXRDqb$+gQjZ$sDZLV~te@)OssgZLC4Q32I zZrr$-jID`;nNo3(AZ-bJygj=nh)(P2rt6eA(M%a!@t$niPyW8~MPAYgrO&B=a`^Gw zO6UMeA5(&I07(_onNo3W^q?K3sV$`CwQnP$ zuy^Q&b{`LKK@LEt>wk_f=o0VtdkazQs;%%aXen7cH-A`qAryPqZx*k*ZaiB#xLMCo zxUznT-ji%{DAz256|256&pfUzwM6b%TsCY%v3JpYyZLL#%`Bk7^=GGr>$^helj(}-x?ra1*F+4YDdhfvNpf11^MTmc(6NKwMq^;Q{UstC% zy{75Cj;{MDT%frQPSn|0mwbQx2iQRKDH2t$b&KqGI4})w9&P5l^ofTaEL9lY8}q2r z+qhdct($B&TzEBl?yi5v>8dw$vewCs76xgH!FL-|^sPSnt^^fRKHz=Y^*|GDmK`;8?W>!eJxT+>zJLP ztDHiPeANe|V$lvsl)QJ7DzXn{IlY;+2jZJF<~NK3rfAMLzxRAl#Bd$D3j>xXa^w5Q zuW5OoS$6*9U`c#U6wqOh?M`BL5`-qB+IG2~vTG*c9CJ7iD=99;(68j^d-0Ybt7n0e z1ID;Xf{I1eDC~`i1>Hu~iab(MHovQ+cn#4eZ*MS4EIy*0U$@EPF`=^|vmU5uI9c_$ zr-yio`V>%?1&Jy!2CgO6oUNc{yjXxcI|$9V4izL`uOU+VB1~K}J4R_xaIgG(OJhb( zlInlbeE;Ck{(q(U;=jbV=cWHY(tIq%r~G{d`3h8DG@l>x-yFQHgDIVvfwhst*RBt` zznU3^O&pCJ%-u=<%v&*6vU&Z$dV2`CCG zGEoCtwO{OASp``%)rnS>rRXl^H=%jvRdoq#r3{wd&#PKmzjAxuDSd`~z%*TRFhO(G zu9eE&0Uu{RPrJJJTzehAPT%c*>iRLMoQKu+-?4a~5-2@V8==vh1^h3i$gX$;vSCq51)*mtN2m={{B3*_>#*iig{8BAFA zzxb1ygv&UBSQrGZ$iT#4RlL8qK>~JB<|f)V?62%m?>L?rT~rnMt8HacolPrEos-vS zL}~07WWdp6WD+)BJ-`|iC(eKW2%>?>fRv02{L+b=qpf4ArjHJ%wn*EpDK&so%rU#S z4+3;W?Ck}tYA|Sk(M7`2gltkcx!an&Tu`9M$bEJ9fy3GEq7|hfA_Jo4NKKyQ>an0H zcNxe){)d6})-X*2gXNeaIot_9_kg%2sO(OHyeMB$jLBCTu%Ih4oX)UNoF&OL^&?n= zEO2tMj4D^DkJGn)YRV0QjgxusJ-qM9c)qd0JRXrph^=yY?o~sl@FSmB#!Ga_J@LIc z3H1t@t+6;ZC?Evr05{<3aBFM=Gdu#bJ>Yh1{Wi!bYV0m-Z$IT`Z=XnS>t zGAp9BK|ZoT1S;lcKW@S;Kc!xE5rd?f-;s{3Cf{MzaSSh+>Th6+F z@N~)?!J^z+yhZ&e+_%nDx{Z!@z0Iz@Awlt7zD0Xe5l}NQ{s@ZoX23gs<&56_84l<4 z22*qT1n;Xht4v(vbRp6c9di>B?Yol$Jr#$_Ks*$S3LLnqeGzuRWn4l{q3&BpZNkWL z9mHTsJ`^f>u=h-T*FZRYVV6VUb-;kuBr$O%mx?jxOZ0pVA+dQm@jXQ@%Jjfr5+zh^ zGrFkdTU1$nT|`TSBoX+edE8}OfNkUq)4DGFXwLhIlR z74Jg*4J=*7(*mZ#$lmYIsIbI`2Qih8UX*g`V-gv`CED2DIXkBKFTh$)5j&jZt3!CK zOPLzB?7A~GveS^qj7A9KRN9FQTS2okPF#w8k|A=x!cBZVO)_PM0H0`)iwcSJ#J^+QSx+s2ADr3}N0as<@p|+A-P0ojvTT zie<&)x9qgTd*ihuz{2kU@&4=%tan$&nrl&L{&@#_Ag*v+*H>yjCV=F`5*jW7g3}L_ zO(1m0ogSHv+ovy#mIq}zprW`BVWWn&4m)-!v{_Bjs6*A#fze_I>-^h{zTdLna^QTr zz$Zxh9Bt0d?EAUe_|l*7nZr?RF`|*EANok;wHTJQ!4;^DhE%@wx+`Z)HR0l+=O)8M%heWYba%??J0256>ddiB}1(Eq;va6hcoJaR_5(#6c15 z_y6FapUzV;z_U_^Fvf=y9|iuZ_XKg{6Tpf81c-U@gB;d^8z=f+bkN39UkA?WQu$?$ zJj8|c5)ww3X+a!LbCWmWCThY-R)H6Nb#_S&hJx5uaHir|2`~FACuffjg(#|w8#@1ly>SQo0IQ{Y+ir#PJI-MF>$slDE|4<+%6iPfP3yjYj*ZTQDKtVv2s zlJ*f*3PRfu^bk^k`wa!p(jKU1+LN`i?%L*g&&!Rrzm&q}$oC!SMl=@nqsajpBUeWE z?b|{Hhk54rvyFrlMC9_s+Q>ESRmQESCS#8Bs%Ud$y|4r?VWU*`_5@9hH*^+3HOVaQ z6$n@H5u!w1QQC``yOxK7OzB>wT=HYL0?Ts=m1%HcpZ5rt6xnwLmEtjVo!rw{Zs}yN zAPvuDosgUtyLf<3Q{(G)u``*^e;V-kE7T|>!GqNLs!#KO$;$k-X#77y4H*NcFL|YZ zCW8EyxGaf6$k;qBm;b zT1{H}mF`nEkxH~NfOlEZRZIMHM16a;Qu5QYWcOopXPg%5l4z^uB)ns+HWaiaMjpJZkKcG|;M#uG$k8vh znL*CjnaE{I&fK|UoF%E>o^Q3$D;vFlk$ndoII;oJ6(J^HYXgnMGLa2I0PhP!LyenL zsjYj5BuTP}qFyNu8EQRPR}a&+d2C*A%dv95r95C9H#IZ4z}!l{1X2!fRy}jOQwtWn zdhcwxpuW0u3(~}J;+opWj(}y;C(>om%uPw=dA`d`P>)G$GDO9QGC#pi<>aYKv@3Rv z&ujm@y4zKs>?Lxo4ziWa3Wh0J#8EEZwPx@_L;WLY4bhf{Gr7@iQujI|lcSZmB$LzS2`8QUU4ecvt{_Vek>Mnz>cUOX zpDl=aHXvjbtr+GkafGt{mnn*9;w81N{?d@PWL?bV-wY?K z=AVUy7#8}^ak+5qPP0vVXSdA{`?e+Y1K?Z4BXeAR{z>WRFSESssr#MtWsZ|y-~TX6 zAzK?`^S@%>|JrzG9Vr0WPY*BhY1X6};X*>I)5`h>TBI+y^#+6i##&MuKMZ#|82m=w zFnnj6ZxWAp^0nr1A0k&cn@}bWp}wJugWyq8s=u?oSXDry;qoa936+be@qV0H3`0|^ zBo#q*nWgejZMP8aBGgI}=*M#(`YGj9S4y`09}#KCh1!Lp1VZ@a&u2rN)9>Aw!vfL} zqPL{zVmZT8dvNzyL`Da~ef5bP zwoXfgA;)ueXEr>pr8G@%y%P8Md_F)<>(ZK8?0X)T9nY&V05s&1v)P6_^UvIsWKu&oSNLq=C`v5Y>o?r@qNH_0Z(bm=hg zNTTt-O)A!+vPz2zw`}U_2d>buzf3k|!+E(+u^M?m1%X@(3@ZROWd+%bn4-L$r)oB; zvSwqYX|b|dMi~MORobRj)7(!RY;M$V0KJqGo2Y;)PDC5EML0M7YBo!~0MoMKRM8U5 zx(10oH*?*3topU7^!byfju=XsKCNi>RS`mkd7}*Cp#E324`WMfiR^i{)XLtZly2p2 z2Fg?|{i$Ko2EbYmiHie-RB+#=Z6>7Qc4{|~d7`oNiiJ9Rk<2 z(lxtxEc+H{q3fb3qEOSPn)Y}3AFq#{R+>Ktk8Hf*W)d3C-0*(AcfK%A$ak6P;j0}Q zZIfe%cm8NiD_T2}W!Nq);?q8!3FlMRErv8}4%wkVze&=_gAF1_4-Fs##fxG^MMo4N zV{X((93bUxn1fMH8^T%qmAdqR$(T3&iB=0ffQ%Gcj*Nwyr|EX$YS&l34lEsEW}_Mz(FZ#Sh6H!#qYmzk0{oY-c0i*amxUqz4eHi6XxNX2Ao~94F&P z6tbmX?9qqp`6YO>6Nwd}_Y=k1UUiZDSLA!oK#CIBmv-;`F-&BMOud4e1G~|A^XWdq zG`V{MKhSl_BNknA7oL@R9TMMqH}LjqXrrhGyThrgFAXd}q+v3T(&XncGA|9kUW!)Q z{7&5^l_pP^yr&}Pxw=B-1P6}&WP2p}YIfcSPrva_8DciZxUP``Y0-Y0YS0@Xmruzh zb(~N=5vBda*_+_4r2qvy(SA>zPJhyw`(n!j7VOhd=8^q%GUWKrzv-DA9{AuGZH~Cp zmYks%nO~v3fZHj^YLMQ7|4*6gFUKT1x*Ssfg2K@+DEvz`_g|p!e;iZR*6Ck-GgwLB zFHHPMCI*3rQmsnTv__$l*DB>hk;ex@P;^Lv4eUST>a&+ZYVSk!s(;ciHVTM&oVH=tCUX zCpRmFD~W}Bk0o9_7jDZ7H8`CT%h%>}WI9jikR**iH3d*1^Y@p|3(S~7ahTz&E*{Vu zj@AN2rpz->rn)$GC2H2sxJj6YaM0;iiG=y-=zsE9aDQiK_WS;Twv6*etDmRoIJWcM zQ}CqGRFlV~k=>P56H5a8x~oDMm{<+_*{KjcHm-CtCmwC;O#m{mobTlwx|mLOXN7l8 zR#QFdv(4MU**&LDep}BcYpDZpUPR|NG@5&WzBNSBE3Jmt8>rP|D^MP;2Y*a9Z$qjv z>Z%)J(oQdS1(ipYI5DIEoUVBE)w*9&6&<7K2wj`@HKMET%ZegqQQZV9Ui>N$_3Z?^ zEffEm<6J=&0Y{#TjjOD6B=(6d!KX27+u#pbwvzY9QYXyFSQ``CoTZ^gitc?CjuT|f z^U4_Tps8aGu=+{TxzS4W8)9<^vI1|hTwz+mik*B_gw!QTrscJ_O z3nEI4F6|i9q|NZ(emkc5v6I-yWP=MbcW^0g38IdcC?jJV?`q}|tUW0|1XOX9r`7Ts zYa%~3O{dC3#rhpR--wwyN!iiRi4`51$kUd!k%n6Yf=XPlQut4DDI9+2uqQuKpZ7Lh z%)6iD%#F+%`W=z>_TJ0=tMj@$Iw6>Rp(+K$w{O`0&-3{QnyP9kEy%-v$eJhU60#w* zZ4b>uf}$v3Dv;xg`zt^az3c?V`_o&mO9U2tj)Bi&q{dx!RI7GIEVhAQKDfKW@Tl{Svh7ZODYlx*>&n;7ssZ2 zuFOlG6fV!bwk%ei6|3GP#t_t6_peSJ2^pt%YzWTeRqQ4Y%go0kW_^ratW3)!q6?@z zP3IVyg~!>*b5jiVzFSFLc5>cl?GG$cN?&F5jT7W~}o0HVxA|TR8o=rB7wQ#r~8ZfrD-mtY!023)`pA_yA zKVXrJb|-t5*vhWzv(fRrV+T!KD^Bgio>-<8DiM3(zVjQ37jdLP3Ay4lrvJ0FAO2bb zRKeL~rAvWYrRkP5b@bEV&!F_DEcpQ8k?44?=IH^Jluq-ec%?X6+iw=^ka4?RVup?GuP3w(SN9j~WyE|t-8Bg- z0aPn_#0OT>ZAke|M3qS%ZWVS`#!Dtqcvqq;`ygsbv;MLWf#~t{0pN)1b}{KQL|`RU zt#e=lJ5gv@Y6omG)*>NCXJ)7Ucak}<(peuS>Rl>iOBF%BvAPHlZ*?aJUa?jsX>gCH zEVuUkWO zRMQOZnf}OBHgHZdfS^tGvzJ!ZhoD8>mP#~1?I-3rU{#GdOgMS^zB@?x0a-Rv=O&FR zce7aMCI;>B83*;VqmG?Rtd?^yuO6N#b(jf?FaU$wRj^U2?@?Dh9UIV$(P^FqSrhk% z0|l^z(yasrZ^!Y2e|Q4&Tgmd^L*@o2(LvZ}AykkH#mkM{j}nzMw)kkAMXJu`1Mc+7 z!M7ls@9BX%zHaGb1>*I=##Cb+f+zo!X0m-@tH{h-LCcqGp3wZ=Tl;U=>R|GZG}G~K z4_(rL@WM7h@lCh@#Gl$VCN|g6H2b9&SQi3m)`JLfCJr%I*}xL0W?GSsHD>&BGHqtf zG(@P>3)(Y#Id$u!dk3FwH zKd!y6y?;*~gbl#)f_y9KGXPcX7ei+M@fiO^9u^b##2)r4zA3l&9dvjXi5QpoRsu1H z@YWm=F3wHeUu;JKF^1v>!%f?NrvDiEiQCJ65KV$xU{4Ct3!__buL9BwCY$)y8Bs3o zDFkRc$d=;9`Uy7dn(~I{i8rhS<>@;%;jIuNAK|SLs1Fby$t@G84{VS8PRb1xXtuxJ z#0?fkc2X`Spjf6uBw)P##Rh`VI?YEYV1Iq8aV`$)im5)!Ll5$L(sG9QUb!Wk<+R1~ zYe!;QGDyS*(^_9Kfj4^^3w1{sO#;jExr@W-sOA)+@V&CdfFB6e**e?##-HNEY+S4G z4bf!!^z--TYMgWxxDI&4Ni+<}+Fm(xC*y!+3x6N!6SC&|hK4rKPbv8XdhmtztO-It zgmdnSZ$?7f03vg?mY+bWAZpmUkyDbh$}3c`eDqXMz|h3%l-c%a;~T%Ro&U+eB;aB(;?RC#T=FkQ{`lHqXPHL{l>D>J4kHdD%W)20>+C)MO` z??=QK8Gx@DhLj1tF+9aXwk7QhwE(R%(hE$d+MUOH;<>{M=0qFG^E4B^uJgkD%Ocr# zKdYC^1o6a$aI@`P73JA4kIB&Yr3~32ozLv3O9beTIBFQBv1~_gxV%WF&MhvgQ|hZR z#^c~nyYyJ4@?PJL0&^B@)yFE=O#ifS2FH@c*ERq==yUHqA~3+Ssdey(n$si}Mp6jT zTERB{C`U`)f_$gP1t#V5Ofo!Y9!{i?`=bz5H#Hi)muI6MprWMp5s)j>_`96!WN>K+ z`+lUo|3XEluS9#!An`OI1M;PNNgmDcFyBh!&GLvwlB8H7fC)Gmj7-Y3h3E}T2eY=D zp0T+F6dbiqOpLy|O$7DNVMqs?e@!KeXuYUnOOy}9UV@sjzrFchQt=X{084k;s*w5s zB6T?waW|npB`N;GWL5J9q5o>W59FZ??mSJ24k2krC7cd+KG3x93O4!vuSROIB^%;Z z`Y30EhxXD_brBB@R}hk1Hf=C&U5mbIL(t=b%=sPgobzG1DF*_2Ps)0`pnV$}bZWaa2plHp& zVwy36=lDEtjF2*!Yl$7nCK2T)oi}XSyIb#2)<*&TGPbT5DV(8DX*GpT-KZ;!bow0R zpYQQL)PPZ(Sy)|99uvi}}-Ps}=g1CD|? zE0Lcu7)?d)BtH4bjkQ85Qg>dm|^#`&piz_*KopXFO-2hQ=_0_i$;&quil(?MK%Z_-0Ahlo9cmJDJ!&Wj>B z%N=Eel8px{=6FmenvZd;v`C?JL*6%USk)9P#`e8ibOg<6d@qe1lN#Zd&3(3jbN*?w zG-WWxu%mXy0>5;VYGL_Yh`*TcoOY-F1pH037S7^fL=e;J*>@#~3onRd6giHnQ^w&@ zIaoyr^V{S2euyy@cSh~4Pcbn4MA`PzhLJ0h-4h+y7YH37j zkKJl(jIFeER&6>};bn#P*@fLU520QC3%(xnHi#Zsr4{UPBd^?^Fwe!z+ zQ~9Z4ZH#T4y}}W>avGgHB6aIVflD`ZC{h56ErLGKS#+dfk^T20BpG%ECh}Y~<(y}< zG#qkbR}%{-)FRtDv(DQ74|j9(7rxml~d}34UZY zXw4%l_rKkCUcGd3KqE|40JNDt%>>6TU1wVug0o?fwgc!l>U2MMLAI9myU|4>4AFz7 zI?-uG)V-wOd#8^La{lz`ephp-Rom%i`tFGmh*HNB7s|tIKJ3Z8%Eq*cV>UBDyJL`Z z-=`aeavj=*S>1QuWQBr#(?ZDJO#s18chHxUgXo6))pw!2N+Jy`7rkHmQ@#jjaiDsL zD|Lu=CBMv1{8Hcshrb9D522(SJJywOG}X>PuUCX<>4m?VN^|ub67@mnYqqU6!hQ8c zVnY76{&rN_$co(e3q)L(D7Xg?D@?wN`={JAKX1N36r7BdyIOm^3mB1&MHtYH#i-Pv zjG#82uuz#7eOub`%PH-J3slq{D0g)#tboX zX4f_n+*h@PY{Wf9blf0Ug6Fe9bz0R@o0Z%NA49dHya@^E_QJST`Hgd8Maw?ya(?&uzdV1lb+z_z7&_nMy<3_*iBGBieD!So>tpBsV(qDYaLfX;N^H;js z^_7<4|3^yZ?C4}`{V&A@?|E} zMa~1djL8=tefeuW>`Z}z9ti8TXMgWA?4t*FY;m?u@gMmRXwPGx9oA5<0}#T+sRr`J zj}wfQX?YM~P4vn0bxjZtt`AVvcR0z7W-Xk6ak;#g{s)W)%LpXL^O24VYFnm*_IVX; zvF{AqmK%@97jAPs@XnQAeLSOXQsru zC%I?a#I>SVE7_zLcVRi% z=qGe%J3N|=PijQHcoy;*lK7{nc|Etf3Twt3vsZ3oquN{1*{L%{gVd$DB`l^pKK_%~ z$zNtux*wqM_GLEvUuHx8znhJ+yPb)W0pP!qhQD)$C?zdRBmv|P(v+j-CTk12;X)e= zx;Fm6m~{Bqa(rR$QN&yO`ZSwjE5HCib#DeSF+YG8@`L>Lf^-!G>;7;ujl;A1nhVd= z_wDTsr59MaLA)SUkRmFO+ORc601^Oef?aIK7fci~1;v39NM>mG>QGr!f_|4J^^we` zU7aba_NvGs6VjBdtk{C#Lg|}a!4opr#s&|Kg;O>-p}&aMJ@i`rW0yOlgXe1EhSyj6 zBrlU5+nIaY9Qt|mVMv&5Ixy@(bh)GMU zmpmA2C?|Lp%z+)i-dXH^)!x5*WwZ?;DtKC=q%~PZNh8i824emYTt=?uf1WHvJirgO zhAa!6nJ-xT*&Lhq)Z&i5mo(e>u97`h`hN{5tPH^3VVvIWN`GIq;2k)5>qepOCrTY2vz_WbFK4OnH9yvlhSNJD*kf~vePjpl% zs)0U|7JuSlScE~wU97okhs-gm%gH&0YfO7TZ-MTs-vL?W(9KIa9oAB`#Q7Ld=xxRT zesmWJtkEG`7A1+nkuUng$V`=E#}47nc;O`m}mWM8h(*92o=P5-#(rs zgu#7$^G&>+zLG>$PfosJ#B;skc$`d&;q&!<2lK;Ol@dhOCDA8??XY*l2_^Jb*I;v2 zAjmCk1M@%Wb{_vht?HbB^FW&(xnjQ1E8cF=R63Wdo#IG`j$+y#wHC@V@YH*Oy3!%o zA`MgqykP9Lo!dM`PoUT2CdO5OMl)@d_pHbkl1l=Fv3|+;dl8M>0?Dlc)?qPq&P6G` zeU0L9Se1XcP0Her{FNp-sDGhWTlq!+zgAWDf>b%i;)NMYpUF535qN;T`67sObFQ{{ zs95Wd$&E@W4iwZ8BtdI8{b|7L;$f~Nh$uJ`%4rJlW$}T1vL~w@@mM9bD>jHJGNAoL z8im6a*2mpQMcND|Zl+-Sj=IAt9v4x2;J>Yp7nl0>NN|uHsBN#tQ;7Y`zfp-Ec!E6v z+gdJpBJYV^5>{+Z=iYu(M0YRp>Yl1{PuyNqqcuj$dv=9}2#%rtC=$=$f`L1&^z$A4 zT`p@KWO;W@I6B6NXSMg9YBlH>iRX#C2%JuoTmBXIfWFxs<}=3h$hTY16UvCrVB@#V zMu(RqC!>|_fa^VSjT;E0Y(*cW!SuYoQthrS0mW}R;>SD3|UH! zPyqe|GY+8-)LG@G4({G>O}Jhx$AgatTj50N6v*s z=!M_Xzy-xsXP0rXqUj8Gz_7@2eW>SckfHxRoL~@kfcW}8$Yy;nXQWo6^h>OZjl+!=@^y(=Ib!t62Wp`ZOiR8=#f2|?wh zjmq(Q@P%%nHKZ4&G1gHAsFxa^UJ_>%c=5*3e$t6mGJBEh6-eF`+4M$N!*>j>is-q7 zeL#fcm!T)W&Z4Lz2b!a;O5y*r(8yo^Igw}R-Q?GQKJ*2L|4}X$Ha9S}v2`@JG5wcF zDk)w{Zi63w&uYYe=3Q6SbH*!2MLK1vRlmDNiGMsySy<)cMZ95u*UuJmST0+ux>j;gc85x z;$ICCM`yPW%h=%U1M@g_d|bZZ?gg)DO1EZ?&=12br=7;OG3J@VHI)0$FPl$wH*=%k zej#yXKNfQxHA04n;@s*kB6QNs-~(U5Cnu@fkBE~LR^>Z1AnW(G5uqzw(cWE=+Jl?O z-eXG&QeA#GuX(cRZKs2I?S!SSC3T@i8OnLZS@bQnCD~9F1`N zp?A5hhY;ATU5o>iM)iLG)uSW9M)-herw_pGgmcr|#>@FuZI8T*-)|5^koRd!m2xX= zP6|!R_PmuUxjrk;GR!2f7 zcyW$zUaUez6Q;9+f;g_K%h)3V%0qI2nsTarckDO`_QjM(Zp9g1jmDsYs^+ZZ`DnjMuanBt34J@3?-Z zVXE%TA#|F&y!qTJRW&^G(g9-YaEJ2> z=S^j_&~R1B5mSTy*Mdm-TkQ#R1V#+}2|z}_s8q6%I~DX}!!EUK2)p^13dZ7+Y~Y@Z zjRq{;<2uU~CSd9)K)A$aU1gzZkcYl}t9!|$l{wRKz|>{a?@ukAGyP2u=Xjkl`cN)S z#jXmdHJ7!uX+W}yOvi|8I`m3CaBtSSQo0?3>--@63}Om4iBakoZTl;H?cf0_L{L1^ zpdPq^`p73wBh9(SbbY{)M|P>Xoe^~4Vq~A*EO3aPTv)y`U@udjD_tm`0EWfJ$;@jF zLH|svo}qNut;`18P^o_J*?z3mwLZQJeq-DYmjGmLm}SC>Ba1f5T>sASB22R6c=^;3 zNiz*sbtL|0^)9s{Cg8Rp#5{9>KJYgt?axEV>fxJ&5E`oy`Q_R`F=#8P_~DX;#S$dlVP`e&v=AO=P+R8kYnKhH5T$?cZ7*mflbH^;aG zimV427)3p0z9@~qR?f+MAeEOJ8RP8a@V}g|=nnj>9)7 z2NMKBZujRZp`6cJ~A+1&l)TNTo@dN&EFM&TbWkXcK4c$>&)2e)GcX z5q85<$yMt~##;PpbqF5QOgBcz8l{GpbB=A@@eU$ZvE%j+8uXFr>LKBH(V6_i0XU(N zivz`zahL+}+8aDpjs4x8Nksn)-bhvkq4Mm;{uKE7F^uCb$OfD^gkr2iEzc)bwPz^kchGf80+->tIP! zh?0wX1M>_hf<)G26XK`7`sl$n<~LnpWlqqJxnqs#yhdz!?FgM~MommD#pI$+J-LM;A{|mA6k3$x4bTn~r`o{&Utfhvifc^_Sw$DIVh{P5JfOfSy zr97*+I4+N8yf(iy@r@`F%AW17&2`NwQ}D95qaN>@*Vsn7ez z2XHS^p$Rm>k)ZZ4KH!(JJLPU#B=6v+TQnN&J$sOr4 zlV62VJn)-Fc7>GgQ3mu?DNUCz_Nq*b7R|z_w(apsQl8~`za1A&=p#I$3@CLNAaCB*;(52wX7JHTM;^rjwyFc-WnWKY*$9 zQW}A;PFk+C{7k@|K0A`y;}%$*@(RA@7u`TXTXszFRiX_<`>8-{>iX?ks(O}kgDZnn zKq)Hc+z##&C=urFB78v4S9eJHeCwSPGPZVT23Ap4lc2oLLlhX0I|oQdZn6OzTBFcH zzH-q9g<5Y#^rs8xmxPb_Q^u7mICnEenoHx)kuHKThB_hGowDBsR9zzMk7Er8X0sbA zl3=T1FQQOFsqamiXu3$<7zS!{NTF$ma>8h=^L1JydlzU zwf436yJpuin~a`CZrKDzsz ziM^%ZOTh=LleSJ6^Q0t@8WxXm*9_Q(tBC4#t_Gbw@c0;I6@qZwd>lQu%?-Zb5!+oA z0uvlBKUsHj?>nv{7|RF|H>$i+06Y?x?C7!}Imr*5r#IttNQwScUa(Q-c zc~Dl%B5uMX_JZ^RC&ii}r)|Q!1VIM&F$i&J|K8K%50PjU{uQCre0~2TQc*Io0{orQ z8GeQLe>)P_z3mDw7#Nrkn5+w!iwhX6C|Gsk;@(02WZ`10mnfJ9OwL=r(|hFL=0X1A z9-=o|t+s#!z$d#2fG%%u=VPwmP_6}#r6dZpv$K%J6c$kg=(g*s8fp*{1u}&`=*VUK-l!-&$H7_y@YLzX%t= z*M;yOIf|0g*G4MS|Hw|i=sG#fFS<_jOFVCg&=94m@gX20{BhZ`qErG&Gr_{jOItsY zrL|&0@ipc}GeOltX8rM_wAeHm1?`s^p3B2zo7Xm*>Ga$4>u)qa2`h2*gg$y&BEQN= zaCEph76JoBH>=0QNb|`bmaLH+oryP+{a)};jGVRP+ER$g7+#`NhT;csOL7*?`Dfs3 zOZ!IEDT{)^bc`U$%sLIKV#JJtccKba7v;sI577&@ zNllbOl(wnhYxN$=%J33yrDhtuV*E24YMx8w!0ik4iM2Qd@9x>)Wz#_45^sWnN@ zp~K01I89g6&ZijtEa6F-*btqfzLSyp!)RY&y`LYH_Xs%Dl&MH;#Sp;eF_aL67h)Tj z{nY~B2dOLNhSc{Bxei)VJ!*$x8NHoHc68Qv>MgHWYaPKAG=ZZ)m7>ULKr$;meMpIf zO$D3dd)GAmY`%p|l|u@tq0Oe>L`%~Qz3(=5qp+4()w$-q>TWEW`OCg;!wCIu_aAKy zmX>FUsB@7mMl+fjk=s56^6P3U%H)(BL4a7C4yhc*9mT!0( z{K9P@8x;jru-h1y8?#as(!SvY(sJ*4)@yAiLOoFuOuIW)ip8TzNt|zzM_lVQ3Y=lU zKl@{7gT$lwC7J7Shz%f|Blno;V2`*De{`Ra01?Y5P9t!Oome8V>xY7C&*!7}6TO7S zTJ#&A(ivWk!;P{HY%j0pS5pQ|JoC>RsaWM>(^ z)O@;S)hfw&3}4k#*@{-9#tc~3u6%RP%{rKhr=PZ3ou_GXZtthKdJLB|SBdD#ACI_c z&&jon#FibyNCjpXE)}iD7}Zh)3Fm+b)=uxxw-WGo6K{V(*=CrUwt-*HMj2Xi7~z_F zn*+nN1c~|HDyb%_pE+X9oGWHT%$33qZ7B3gt#7^&fz<{{Yu~h)ptcEXIuY?qYBPFSM$4|I zZ7Z8%D<-PC0<+8_T}!km@+V)}J12=`-f%q#lmR&8d6QM_@|lJvt9YK9Jr51Gf%p7xX&@3G3Ge)|ax= zx4P#|>E$w>?`x@lNu!6b(se8-YZ#~c$p`K%M$zpg&&zn)WKcUwqJ2)L;=F_A* zz$+TRoU-czXsf=1Z)r$i=#jd&97kGqm#-H?Kp*Sj$1AiyAsTYdXmmp^GAwd(?-I0+LOKd>zN=(ee#|cW+&GncD3#v8O3TOTSpD9b7e3HW&->T|CZzc3sugMmclfuZazyGF0n?phvIx?3GTw0iL_=XNMBrsxVUDTvto|ocD{iOB zjso;^!GAPw1pnIw|F`!@qN2I|+RwE%M}jn1McWfT3rJY7g6^aDER0TR6a6p&TM>mO zc6_q|uBc_e_%)X*rTtWpc{=P=^tWujJuc=qV$o;c)mG;}j8%Raw2NL5Baodsw$RZ`H zGc@&!gx9*!lEc6WBw_SYy_s7GG-Zk4HSIMoH6+KexxuVQy?A21KQ z^o>u$ycX#$wKn$U+!Y5K969P5h9KjfOFvl1vtq6`7Fn$yAdsU&%R5I=wPl}mPn(t> zFr+a`^s5?z70w}pm{w|%9-GY4y*|m7k5$%bS;i4-Su8&o2{uF7K1Iga>#RU2yN5#l zA@Plz8^?d(Dk)wR07;$q>sdm$b>`Hbx;1O}9Av79l4*)F?=)$Pb#w+9X?B;qMm#Jqnhy(vGPd2719I2!5mCMNxn z!CMR}xqVhF$}k1m4|C3hA+e#ddBFZj;b2$}*7cOq?LOrB@H%3l=A#}E?C}0H%ptO? za{i$br#Hg{eQi*%+6Sb+QA-Fd&IG?sgLquCj$W;QOz0;qFJ|`yb(di-jY}X@DLRf{Ua@_0DFy88{?WiU^lj;nyPX93I2}Zx zqYyoe34tIZv}y82vFb|<;>9uVi5{@|F57|PZdSiDA`A^Q(a^2ux-UeOH|=DaZ`?S2 zyn@L(&*k7}n6KKXi@r-u)9(3UqJCo6Zn|hd zWbW-v>-haTpEK^mCcu9JeVNg;{(}7Xw&9nv?{n=>kFAUR&mgvcV}JFn?F?yoEi9ys z{`pu~R9?47R7Cr>OqEdGHus^Hx*}+q3LbHqoxM#u!xszk0Eia4@9{} zY&bWT}>fUyqIy$fR z{=6ad@oYin;hcJ#jR?gfv84$im#80hr8V-q+2MmjwH*ykUU^|icO48?_LT8VF_br@ zW%zBk3^1Y>rFyS*^1ETj4o*4dUXRz$nwNS0K20`ZhQUp>v+U`3;X}iFYyrxVr5IZD zM*76wby0(X3H;sM0v(4M&HnTLjBjlw%;-A>*}BEq&W?=N8-c6eO^X!~VJ*Lr!9iNo z2AA4^?Bht5yE>AVdctgoNIf17hq_>KBf;$CVl&Gj{hnhtGJ#YI6{_-Y>Uidq+*FfY zccS2MbAHx5-7w`Y4|NRe&Ip+cH9olV_ZnESF|E0&eaVKm0A&%h=j;OHYwi_f-||k2 zIT3*hjc0VpOkC+Pm5GsWr6@3of})g?M&}5>_=*;;Z$RexY&_h^&1U@?5%C(bW-#O_ z+(ZHi(Fn!75?_bY>3Qv95GiOmI5CS{+S)iv{m5!zM=7m|yqj#X%BV+|P8pPIZ5h(= zB2#H6!@!w)Ez4D#!`eApOj@IIz=QD_SZ&q%TZV96V=vQ)=+v3eY{9zb!d#$-5Z`@T zKYJPK>g#!VirY@{o>*sF^?tK0F%46JK>pi|@ED$|6}N#HW^wxq+zAVrAE~+ugT&j1 z$19lPN(&$BH*+9Hw}vXoy7V{vDhtgiYP8CnP$13OxWvidFHk<~4lw@4RmG2(^D~Vu znT30MFB$Qs34g^U5qw?bgnd(>{>a-tlI9!2pNS8!WHoDb)!#rpcM&aSssVAs2!a3D53 zeM@t&Qgd_*$WP_{Po6u2k#JUf7>+*Y^+_{GhMp2FZHqZUV$JO|X0UmijqSBIk5rB> z_hz;l>MX7fXD=JBUvqmvCjiMSggDGHc0+Pnn)Qv)I z4@=3dApn&IL}41Nsq?_+U2>f3=NY3yQ5t%?T*P>E1QTK^f9Lk5xlnUVODo@m!Pz2QbrL9}x-SrxOQI^prKV4Kx(niwSs zp+@?yXo}QkUGKgnZKd6?akI{Xy(v#cD!t4GNx7NVJIQ}+{%Wo`kxr_-gg56DIO;TT z+$DFb>*$uXNF7qR;A~NvCDQG1Mz#Xa-o-<&3&`F@cM#s-F28BJVdvO`f2Q!D3HU4r zYoU`Azf}ZEpK&-Y@AkIchOcR!_b$Cyi0--n5O{9(==XQ8~fTK@uLV2a{x|%g9eKZlj7K zbX1dhD375E&T*A*DAX0cRO@1aY^iYU63v}-2y+jRk%LAmI)r4)IcV#kCL5Ep=chg$ zOFY}9#CO-BIWk8hcp*1XMRZwrgHzh)zA*I890|pX+JBDUvERwErG;s2y@4}s(|jxM z9i=A;e`VU|nI*>AUprh80^pt;nW;)>&^ls{YCJojn(#!a*G=$qc*i}ddqgSTvRmE1 zZg%}pThYlcHSNZXd&x5ldr`CJXoeRR<;l5#Rl1aQ4zEWiThsH%bAyZe(!skvI&3|X=FkX_Kx;d#L|K;6n*mWSz$L4am9mg2FT|LlW)=(=zBo=m--clAs01C*h_W& zYECNS7wQJ8h98_eg~g&^Ng>~gd)|>Rw20rxW1gAjF*OVj&C)?ZfxE z5Y*`>iZ-PG0q=nZDwQ|urRK=NowMzf+-{FPiNB}UtdVY!Af^7rSCkM#PHZ3so+{TQ zF@ZrSUi1P^lM)Q66jl^s5*G6R9!UizNe=slbL`pS^KAXYsQ=kPQ-Ro}$NuOXU=aV; z|2iwz|N5_+RMwP75=QFmyqNH+q3Erys1uSDvH7j+O!t#bR{|diNyNvLN5V`67@=!i zv5HTec-?UuvmI01L993$o}!Xi)^Wr<{fh1?dFUW5eGStN2_HcWJMUb4&HbFg$hbL) z`~C5T37=WiZn`F@JYO)&DcUwPZ0ASv5|SRzG??#<_@I?0=g=8nWEzBuckC(j7IL}b z6*}A7b;o^=SYKno5gu6Hb(m^DzH}3c8L@}D=^8$pRd=ZpPr1lGp1x}z(Kc>1sL`eC z#_~;VJ@iT3K18PO)H&D}r&{TvG)b$VF-;M{UM>&W9}%ZGUrnWoGxyYJHg>{;1D-gD;zKx_7n<`vl0&vDSZeA%OaF-si#^qFrwa*mB}V`UEcuQJUvzY( zitPO|Kt*_DH=b66R(M>gHdudLfo^c{me)xW+WOvg$&n|0?C}Yb&wm+@Zc5@DB%Aw~ zzj**o9XXLAsysNL;8)MeFwnfB?^{<(aA{S=iYpc`K= z;D2ShU7smv+ZMvjHb`5XPl}w{bHZoduXdB7WyjrJx2Nq;Zr?=6@(`owh5;!!*k*AL zsHq0`XOy0?A^pjqB$y3$d3;8;%}296atLU1Vg}TKlD}GpHox=H(`4d)La__owr3S+ zb7}^AjQ;FXnyNOuiLHC`4p3t`2!}2A#3<4kfDHz4vbgJLvnfA%y@S&Yw|Vl_l_SXh zjb_g~bD#wsDWB#eZ4j-$+e^L-rtfS4g@fpMDqi6e;#DfbJA^v)et#~K z+-mU?gRbuOef&Yzuv1>es^5Q0Z{i&?w4!!MiM_(QfAj3VSnD6ymkt+fj#bBh&4b)k zgWvqZBmT$*8A-4SETF6=;4C@sZwX={HAok4AtgJ&mED6UW_2QGaS#Py#69i1eki8_ zjHS_-$ho+qHsYi^!jV5);wU5qx$BlOjF;PE_(5Mb zqKTORbjOIiK02hJTso*gT{0*u10C_w(Ik6c>I*!h*0|dl6z=lirjuN1Hk#VK%zIK$v^(++5I`RGf(1Z56B_jlKKykbf;o7TB%G`5*W%Pk(BX6g`!*> z(IS9eqAP`v?Pn%}fktFZ{JB5blrknke3$@gIvXnawwn4L`$^}Yl6W>y7Q}$(38l2p zy&SE@y1r%`Vl-ieS;EOR1;c6<6uWi~=mjq>huZ)CZi%1EJKz18$ZG#EB7gsr4f#Ls z7Jh5XpD~B7p2dG@dWrtuZ}_YoO#Y23$&_EWn&&~vn4BD7u2e6ux zp+Jf%4?%@bmRyg^EN2OdvJUFkXa(iUOyWfA^Xfm^uHnh`adW3;t!0D=-bH?aEukmh zo%V}N&5t9xl!{WucZy0bz#O`|jNBY(<46(ux`YW-ZXXVQzZUUgidMUUwpS8<#kO~;lGk}+CH;PX#wH_G%P^iLIb1NwVv z(W+`~n#~)M&uacYQC`R+OG`MUzEnBa%X9aAy!Dze9 z_q+V9(P+;%G#IMz{~%~RRAKu3UiSww8n8vhYc3c>IW4%F+CWT zn9~~YDWDVje{w(tn!&nYK>}DwL4d|0Y>jSNEU&R!H~`tRkvNfFdc4s!J$w)#Oj;;V z&XXoY%1w`kj0_yP`ezIRjwa+0aZi+gk5BfoIBA*VaGhh_MQ>o<)Er;F1QUp0RMr!N znA2jE@^mD)SzMtHk-CLLV@6wO@CE8Rf?#5JuL>cvqGO=Gz(Gx!4nqa5xg}poq*g)k zco#GY&gM<@U~x;7%V!jaNzdk(EJpX7VQ%YqhGN+SZG~W~^%c&f&FFxNtu-WG4wC7MM-XxF7fXAdYoAz; z@N>>5E6c~qLf}G@3reZC5}_l`SH1GV$0spj8RQGxsU^o; zsIV_y);J!?JV+6*6Qj%=i3!O($kaM&)35ANq28XQR^Y{OK7B64TwlI04#HX)Q66g; zg0fInr1B18j0U4HCW#up$}V>~QJQ8pNlz5lyF|i@-UsOxD4{uCj^SOWO>3J^W~0aJASMxJqEyJv)w zfUU);GeUGvn|PfdAvs%?`Zy=9)l?VBg3_wWvcN6A*m!YZZzs{{qRF;t7nNIHmB#X` zU&oyi3VR?}mq~Qbg057LHo-;K7)>-QSE9>N`2)C5rU9Zq-wB-CSgYzJNz;(hSon!R z6ynsNI@+&AS)NL3w7jTMaQj!kgL;)y$uo6hQYtIdArDq<{v}z+bV1~p#Ejb&l`>F& z@%P?E`U+IC!>;}=!z&u31&G0i66eE*Sg+9cAL07oN@C9CCHdn6Vv|Fzn}MM&qf*DN z(lmSQUBiC4Ii7!f~F z;R3!2#V03U_nbPY)x1k0(IuWlx1{U{T4A%7aQekI@I|Wrr&j+~N;B&Lesp{$_=dBs zH_>|Eo6Q+(z?|?2*sk%z8m+uA*!)rX4P~@w#FXFHyxWX0i@pK9RXw_+g^NW{>;Msd zm@0&6-<>P8dq==h!mxRo5o}DZ?9H0PK7KK9GNA^z?s#;F!8I`%j(>3;zWWQq7J&jO zM%^U8lPvmYP1pXLR_;cK{jI)(6)s_2rWkJCIovG2NVkhh=F@AeJew^nX;f-a$uRfz zKo;(!v+0u-=fM@C0sF7lslr(Pyw{eIzp+TIVp#dc?{Lb?MFJk*J&l#64cu=xQgy?n zGNfdi&-6T}ck!7wB}5t&ngx&eKU$=BHT|rmnBvEn1}ryKic>6{*ruFj0Xa5oZlP-y zPYBP+*_2vxHulIh=4g3U6iRy{?0MW>{pXF2&Sx~pN;>-A_MPZPhX8cp&~(^WX9!7_ zui%Bk0}KMvq*gJ7T5*6P9U%W+)UM1h8qR)-8ad>zUxfc-QTvyC#L$5EU$F{>N|VZ% zib&s*2yrp!YGS?!WGD@|uYL*?izpFtWYiD|aUz!RYoiCuP$Z1HMtr^1XLFJ6%~l&N zH53ge>^RF=`&->Yoz_NR_!4Z~!;|Bk*PG7Q*IV!H)_2E$yT4#|96gYEk($+J1J^xL zLwC44aQpC-jRYrjv&5YVRC+eSP+||oY5ZVoi1u*)9GrcE;pn86?)E;yd4v z0kQM_xzi=vki-Wf*>Uhq4a-%cQe3vH&>$a0xpbPS8c(-tBQhU!SYlA9WFx^-NTN23 zLB>Z7QGt>W50MjM4YOEy;3dwd zr$7sDgVb0ta#DHR)#%{BW3(!$YNU{ORi^dI3Z#NLaVMJ-i*FV>DXUKWXD>9k{REBD z=jG*CSMdF?_Gb0M!T8akhDlt;Iv3vt@_mg99?uNybLUdHNH1_AVffd|?utC+HcOaRXJvl;U{gf}F(yiHI{Zvmw1E`!r3X*}cO5&9E>ELME64&(qtC@R zfpooX4vyAev#&V;%dHuGVahg@MXJV$Bn5fmJV}!@t5Gh``;h~w@vuV7bq8{;s)P;R zyJ449q0U;|E^mGoRsIJNrD_a_bS3t|_4605iA+(pXi@OalXx4H&xamSmx#Q8-%vp{ zB)Vv(;MIGLa0*tnIDNwiVr1eoIl(fqHNOdgb;bKw{>0vp|B1h0cL3ME zF$9z*(g4*x`|C8rRs<=~1X+7H&cCb_XA3TUTj-NzR0?4tE7m6T>NvEgg*bn@i1XVx ztwRr>YC&GlPLie0B7cl2Fmf;&J(}>#EEXVIu~Nr54y1k1fh2_K4}auF{=}r&mc!xI z%7nzm`Qx=Ii^76ktDLSHzHmQ<&Wiu$?S7VTQeLhy<%i}SjK`UdwNO2o^cby1EOdPA z+D*pga6XqH=mNs`1XIpkR$kC>=q&(N}_k0D2Kg2qn#N~510jv1VovdM3| z%;TVEjCp)tYkx-hM_teCZfp#i9xw5t)5_iQK*Nce6K-S%oFd@k5N5te0?E@206Mk&Z8_B|UJps{SE>{M%d;p0dVYj0>7V;B+W7 zdacNL<)g12PN}<5MU>12psmR?8u`S$B@}dZYcei?e8u|#t@(^Nx?u0{y)sj`?&vFE zw|3k#p-Y?0rtT4(Hq2f(ec^mlb#CtG)!)K9XfKD|Q0coA#Yj7I&)7G8p@tQ3RRwPe z!FsuU`kx+}b|cemyq{8;{xgmL#{#4OJ~tC|GW;*&M52=VKZ@j+6vBvQ4wERkOpYui z2ta{KB_9C_gh^sJi!X$lV;t1312JPos;KfS`5UOmF7NVPU7mUC+eYvgkz+PvyeS_^ z3GI&^VC#K-yG!D3uX_6%s0N5R2p%a<=7txmUnO#%e*`mw7&WUr|tzq0A`sc`>aIJtYv@2q11xV-~ttA^Zv*^)GR^uY1t+dbC9TZ zVIN;RpVRSLkvdX-DQb?6i+^kh9ZlFn4_8hcqbZ`?n z=mOCyw%^JdxqrbfU7Goxik9%Yfs@m6UFw;UqUCn$0e1e7&=1@0P9J$uztU@{CSlbp z?~kIrqhj?T&Pp12%-yCI3sbq?oqRf`o7Yo_@2cNAWqs!zVx=CUhtIa22s^E0`Z9KK z6Mh{|IocyfX)L02F=hh(>P}KbHDIi6o;MQ|uO3O=>Uni$e7hG^=J2@bP??;}k{C$8 z!V!Yun0dzzh3v!>2kKMloRJAOV_UU>|7U-GWA9EgOXmOG^Pll_lBQ! zTtJr(y7$V$Pw|6k89ddMT!vOhR;bKkUzej)u$didm9REQHs-pyXi`Z+gMlRetF?Kg z#~^@fZPQqUiLz{-97o=2peLAbs?A0Ki7{y4C2Wa zZio2auZhhz?l z@jH?nnn$QXJD@#Y=y7D?O0?l|s zCfG&TA%p^5KbkqVO(ASci5(C;>8R(?s%G+Q>O*|#`B04UK~K>xP!sLxCOCr?O%wcq z8|ElKTh`P6C`>JZtxzEwt2S{qx7W=g80(TL~N(P2?GRyyF@CnzQme0 zWbhr5T0jdVmwVK2pb7jGhcnSQJvkmKF;m!}vTyD2Ii7XmcTEn|DjT^H>`vDJgyss3 z?KJs>cjyV5ah_4TuiCbU9{^GUdj;5)Q8cd6c2ftZp0wp*l(r{88V`mQBi!HrVK~?= zE)ZP$QS$xz*^l<$3RZimfwb9J)ve1OZ5ub;=*^-DWpzutY=w#PRre)Mwdp6lJC>;0mB z_@6E#Xs&si-?&AweM%s>yZcB@j4QoW9tj18w4t7n8`&l=NQUh168*;|M7BLK7WT_* z$SnPfV#8J_Qm*SYf%_;hT<)>>n#}1a&hAY*Dq&D-6^mi&NbK#VYDMjXH7yvK7MB6| zwd2eP#@x10>!!?s_C5~uT z5jkRG%Z`&#g(9g#Jv}y_c69xRUR!|kvTtY*@MlH$2t|}@P^(SZ`A9><2DQtinOg-g z>>Cx_ILWoljYIO7rnfD|tw!n@DN&-ut(L0T$>M?gl{M4Q&HCMWf~_U~X+*9^#MX}` zl6wLME^NAh2N^UD)Ds()w!^6r5-kgvQ1<$iC7=c8IyQ*H1aC~0L~TuUEtD8ghoXYf z8eE>3x_dsnQ7xwyj9ei?(8U|OQD~y&ik#f*aPLJOF{5?$H1;Pc!?{u6EeQj$QOmac zx<7s|zF|bH^OC%xed-M(m5{c6240p>TE~o?swl+@;#-Ab4Vga(1<~UCQ)FrQitRX>^=OjmR<+?q|NU?=)NbG7|Ug zXP0m@ssplaj&WI8!*SbILojk)Mt{_eyzKzU2YtS5Mpqgpt)gbMqY)ZQ)im0eLMiPicFoFfD04jU2F&KI4?&4cL;z7DV(>BXej zPYm5S)clnUtdL>03Y1y>l{kp$Vh@%GEweEG=ZtfVg%<&2u0TBESG z9evpPL0#CpL+!!OCKu&@Bx79GK516g6ui4duZWiLGBt^#6v-?HGv6_4MQ zL>0N(p()m$5qTJ_|2ecw3>8UC`Vqo!{0uJto9ypj)qvN^)xqTdO8O(^&82@*E4b?y ztlBH`I)H!E()zYjnqm;@yMksiCBc{+Cm zAlN;z(fPb#KehFcWSo{e zPAQ{2epZ8&tw(>i(-_tao&ed=TR_=0@a0ZK3d-17hkMcc44tpFsXEK*D%p3D-8y?y zCF`3JcBEb4f%LOjo4mz6P>`cyZ%!I|G-h}XUv*>_{2~ZbOw6*S2#sxdj?YFbKixdm z6#QZRYbgCdJ&aeiR%o!qZRc~GXtm#wI<=q`9;;0mgD>kzsIAblw*1LLEmy8y1BEUn zLm5PC2T}*1qzeX`%spC1OJA59{d;1oUbce7lDBcedl@8ujP$pyfumL&4kyu0wET%j z1@kqxIcu7opPD2d^i^nzLb;%@r6t{6RXqXtx}kf%hZRI((B zrgLH7$LP;@+4-bL`?qJg>t&C>T}i#L>hSDLeA&!f5cdPK@qGd+J~UP4WISX2kGuEw zpY2uSuaD#9;a_jJnn0N?D?sqpg0oTLvJ*N<-dj<73{^~fnPgRbd;WZcVIFj-L0Gxa z_wZCY^iafpC>r5=nkDcFIk$~=XyP56I6+f0RONP}OA{RiD5!>MCmCetkg0;D3JZq) z6KwaYK}Dj5yzvu;nno*^=1dMIW)$g!^FjE6@)KD6T)Wqm&S|`8C#^Ol;|I@bc@x0sOBt(=rZJEdx~gg#o=8h*#9N7=E6$-X>=#ws&#ao!=GVzC zBogB=taI`cAc7jtl!636Qx zL*G|gdOI_%%*x5h_zY<>8o!neN915Ckj?rc9CAVvR<%i)6 zOt)&9W(kVX%TAx*Af>-Hsz(nR0wA! zogXo9Riz!%hoF6E|0s9Eea6#6g@Wg-kq-zxq_YZX2}Oo4ccG0?C)gSW1!CJo9114* z(>F};r?(i2voK4nweYHK9tS>qmxW)i-Wn3LhBIPX(8Cv>V<=25*ilpMFz%2-Jc@9^~>|stkDbij=`_uOl4_+lx7BodM+${WCq)oojC zIXkoCp2DV&9&$}<|9sFeB(NOfTIji|26$xRV%fsF= za{tiIDhk4~GFn&haD*>zv&i#X`YZwSA|H21>Wz|^_y&{TGDGOMLvHL_f&Q8EyoB%C zug2H|z#4-yV<4{rSvdETbqVSkY=Bo2J}7t71yl9>V1k~r)vfGuHTNyeb34Lo(!T{x zq*sV{n>?0(Qp79qN9f1~0-3>}oasm0@zWrPz4`EP)cE;*iun6JuiD|}Eq9rjKx}5U zB&u`C!SJ20Pp^C5X&wN9(2)M{?6iUNg!y0*%zZLp5E1AD-9h;tCD;KKq*K8V_`><( z2+_s?CH1s2-8W>BP;@whc`D6K;raI?Rr7IQ%N;*`(mWC_xWm)VCd+qU6mTV(g{w%g z#WD+o$`L=qk00O}{y80Wp8!Vcm-W*<)@<+@%-E4su#AdF#W_Q2^r$?A9}suwTlca7 zWKw}t9dEtN0jHI3+OZuqZYyb2g_1eC@Khz8h(SDRKon}|;}WQsF6bbQGdWzt44uxf zAv`Q2*zBcrSqyzZ&4f&z>>+H>5c}iB(~Umr@n%coB5?xO);+xC5Nu;Wm$1jPhwoP# zbeXWc4$%JmaJ|6aps3?Grwgb|Hm_`|kz=7%NEoLndcj*>cnRk#9z!ODP=g|O112=e zkLi0|h?6|}>+rR}(Fh%3$$YBxLB&?Bk`vCZLaJS9zlu$(8sB{g|2^1VIBE&MeHmTXAiFPJiSv{8-`Q;08JrT5AByJV#}S45KTG!gGx;Jl`wq1*C4^s4MR7D45T%-Ky&@il?iSLz z`k;gTHgYLo{DA%fwQ*`pqHPQYy*|vS|4}rrS~Gv0XK#P~x*_SBp$o#K_}Qa7dm{zG zTHCAK{8Cf8%hL2>mJWMu<^s#<(bA87ZBDjh1@PQr&FTw_1XWK8t#tb%sjOg5^FGFn^wuzIC$RYD$Erdq#SMwT$pcA!l_8equ;tL1iCecYjHK@jx1lSh2>0%F)HSF5C_%?2Td zL*ZX_=NIaEeQtxbta%4Yi}k&_`NAO-_L!*p7nxzUsgo387T8k9SO<@YV2-ET&?w;-Cg157-|5ma->@TrVBGEQRXSJPo#hJ_72m+BT7r2h;OA$>1*ZyH0^~Fe6iD;a4(0XXU#x_I*+T zDR^!e(|sfWjx0mZxW7V6=Ag@RfzdMCI3RzEh|ZV3t_#8eNuseJbzOR>4|9(J!R{$0){ylzy_~o(Nn1Ho}{lYc9p+q)8;yxhw zjyjZJbayD(^w%fn(s~XupIbVSZDf^hAW;p8$}t!%-#+F8sqeip-f z9GkC~-|m)}6~x3&U%Z0yjZ%_rpo(9T0ATNDRBZ5rnvnO2>_tAzFJxul9))DXpral7 z3K{m^R&zaEm1=#(3G@GaoJDEObe8;-nBX6(hUkAOF``!X4!TzQhW{ljja1T9$5e## zVii?oq591S4y=YjrYAyHtJa+sa;I8KzJO4=5bYL+6*o9()z)4r^GSHtsoa_4N!9q| z`te)qCEg>W9z0#ThLzL!C?nPNIFr5o{khxw3wQ^^3qlX18A)Ql9*>(r&r#hsViK>( zMtJBL0?A^mr94M^#1i^0C2AKw`X3er`&HzY>;Nv|39`Bo85dmpp*O=-v< zZ^*VBbsKzCASh#H3bJtql15)Thir^Y^yC;6Im_8aSJ1eLT9>ST8mG2kDnf6LxsZr# zU2RrJYH<%?s`cGO_*B$9=!hzgzk+aYBPyULOf|;_5PfndebFvT zU3HflKZE{WVp}(fUY~ce!GWFUxtO#`q(AnYUvV#Qfp>&Ls)*QklEEAj+jw^{gDZv{`*x%_^rBEW{#M?dr@}l@rcP>iIY{=s~A+zvrCZH!fPI?xIYwwFFe@=AF^VeD2jlHE5kj{t(iJJEmzn94_$Tk%@utc{_~maw zj1(t!v2Sx0{}>s1RP%vG4#^N+)tR1U$gcBAHt`1&z_KbT=%K(5P=otJpO>jRS`YE` zH&mrhn1*)ivUQMQrSBO_Ijq%&A_u!v>kx`=I+6kOBC~Bp4xd2Qg_;{CFX(Div?l^QvJ>0ft>tmoLe6*dpv__kj!g| z)$(;vHScv!(K@u8m7d8&?kql{*)>zvD0UF-a1Gli-A9jdbpJc%pc9`s$V#w;E+Swv zv4$c4@S2)Sn-8l?e;jjDR6Zz@Z9eO6A_-mi$fXKFxy?~|qffK_aL2IR>~tLIA&vIryNCeV-jn4F#+wy?S>p+o3{P9;Z zJYRxY8i7{P?e8j`%$5m+C#=j8xHsTxg7HdtNoF;x$dYB3OcgiO>)EK1TjjBR(pC~; zFMg9hSgxV6xL2>)1Kz@Twh@rsc=XvWq4c;~x*pHKBz>sSwxLcW(YC2d!y#EMKv^x| zKo_EK)4z$?gw;ZNpb;{_^PEFRG;b5d5Pe& z><|%naCu9Jz0V9`+KS~K$`hSWz)T%&gg=pw!9jmO9u+PZ8}Ak{3o!)x0E0Yc7l=I2ETP1F?L)&6G`K*KWO6 zckFK}9`yWC%tQRjHHI_8U}HE_eX^L%sim+sE3|sGsk<9LY3DNZULjpnBxHX>Wl581 zri^Syc9d5FXjGzEJPiX+2$qru3{UTPD9tnNMb)YdhMIJy0$qAindP}f3X!p0Tt#F= z`N&9&tzZu$x_n9zdtv`HP^CRUzZ0E) z3!HEYpfo_}ArTCnKt{B$HeiBgB(8hrQL?OtK{vQxc3l_vVh!@9t?KmML zL6suq-Zzbu`<*w`;-m!9e~n;VZ;ux2y};;1e40H@%D&n6WF#mmDUT3^tJZ2iO4)hY zU-d@E?m+)F_l0~wUZj(36(#{ruRxX*;-0EWW>1r><5+ShOaJ=&KQ=4D^OOo!{9Kmc zABO9{ts49nyY-Kt*ni%Ze`=56xYG+9_khG8JNZP_twhz*P{@)=C@3l^6d?}h$iTK( zq7vKeE=HW-J_)p3e2P(GTm<*>;p&^#SEN4p2re(Cve@m7j6RRAqqTo6)shqX%VCVG zR_t^ID58@m49F$b207Nc-bU$_HpweVh*Mv$gK}$D(@6vZO1B;NzOIy*b!x5V z$&~hEABq%0#Rsm@e~*lFu&x~{PwFe$QVhaEO(2bdRG}RtnNcP!DVztS&<4m~wmEAG zGe(Ayajc(lf|P;#p)-J-n%i^=15Y4@>7IxyR}t$3tF7-yO%tq$K~->+s3UQ|HyN|3 z30s;p33;xuK+W$Gv|m0kh%^i%4>w4WkqPJcch%|DXmWBiUy4;MB=8gJqTz?#P zCh8(g?P>4QTkTBEBPiBqn9#E_35q~tuML5Mv_gvc3SD@YkMM9repsZ{%~}GoBDj7> z(FhuZ4C)BaXUW!mfRanlp$_uFNt3P-Z>A!^U+Fpa%`LEnZ06^O&*C)bq;du|c&c}? zmrkCFd2$4)?|8kY0^fFr1ztw^&-Ql*mMtmw2j@@!Q+VvZa4xTFY54CrKQFMoWFtpX zTbq%)Dgb9fGHF#zY*8#j;vrCi>#)pF+@q)^T<3iV-U$Sa;VHqp{q2FIw`42NDM>Ui zK6P=C!ES8S(Ea`K0<44m?D+ps_RT?-?Ms(c)n(hZZQHhOciDDz*|yCtciBdFb=kIE zbMCwMec!ux=9`I$I6GpW6X&lLxqmxzW#(FznoIeGtT9gLfX*1c%>rNvzCy)EZ-_4J z+v+lkdM~5S`tGGi$v}?!z8R+XX#Ub!>OgQ01*USTRKjHH`EnoofbKP?Vas&9-wr#K zcd0ecj@XY?#N06)JR&IFX!nz~rhPu>(%{x}7SzhxUzN?CzivVZRB3;qr0D$^?hK+l zOzM5#Ao4IHwvKMLmuV4mDyD9k_);sI#I7Hi_8nR=@od+ zZ8T?lOX*l0?!g?qom8neg3xA?a5K+|B=vTySWl4!DVdp%W@n#)5WCwtfIkw1FjD_i zc?s&Kv1qqhI>zUO%dw@LK_Jf&ySA;q<@E|W4t}1#6LY;Lb!Bo9jbz<@@W3Z?w(Ml| zyU*>XDc%>)HTHaxiTG%RvhtnSKsa0MwrFoy+Y}?C`9ialjJd~j*cBV4T5F?udr2aI zr0xRikT>?VwhvQFZ&S|CBip3tDfn5}jpJyfr>E}W?KZ(r#iCE?A0qNW)j}L#T(SuY zH3|Mf#Bhz!THSYe)v6!h`!MUuoKhCKw4*XAaByWupa&4YU3lO^Hu7I|ckKM0QgN8` zh#Y{UU8MC{cBax~3<`V#GCv|*P8Q;ML_7&6ku3a1GbD^gtwKDXBa#4uX2fCUgNl?h zrSS3Ugpu%!C5G%M8wLcfmEjpO#r9;wnwZS!_1~PKhJ^>qk#>01628rhj&qz-EOM~U z9M6!PC-?6JgJ9QC%DB-ZjfHY>)ke3WZqtW5Xnf?D-~O;lru0JlC9L!IkIndE@@q3w zKpVakknzy`A8R`mO9v+x6IYkN_DcTfRQws~DQb2q$V#Yw^z`)o55!a%1@qDE`Qi@R zkV;ls=+K zc@OdF0b3;>&|ADe-;Rb{5a4&6fHdME4Z)>8BqQ6f1v%#Vby2>q$KlJqItH(5eWc%R zn*)7kWY}qq;DPOd8=_5CEgGIp^DO1n*fA?<#5Z766B$ceA{9|k*Quj4UsuGUZ!0cl z?r6YgpuzzYsmZt&!(m{{m>^rYGdhyDLYtCh!A)7G7S+HE;p&#W3TM_9)2npYQzIF9 z#0UyZo0GfNzw20k)h3)G)DpZQK(IWsjWYC3@hS9vnOX$XC1liNQ4nj zfjd-Tq8X(pnE)E+*5NttszS5MESq!5l*7>lml;-ka2MiKF8kyVg|*{f@Co7dleKxg zgN#yfP0k4O?2TJ#u8MtAy%HW1Pl=jifu3j`nyYGY5!@!cS)l4yOb~b7bpxhjMqm@J zsxTxBau6r+PHl+yXoO~ReTW&<<8=V{=}#;ur0o2kV|OUaGM=rqDba6(nxg$8reu3p z5nbgGXi!xilZ+j8SY$tQSeaeMx~BRbwoAgS&5H_%xK8*n`yMFabfhZiDi~y8a!Q5E zHRTPy6uX9Wq*$xfpke`Jo3Jclxa_te>`&Y*8C-5hA-H2;aw_%Mik2dNtE7#8V*T!J z=AJ1>EU;-$tF=18$wO`Q-SeD9V5kw{ls*NH+8gs4eKE=FHQpuI_LR`ah@HD7)FK1| zMqXcmV3gD!ogV%g0&HVegwS#Z$MN`*l_CK;EP+Vqja)`a9`B#|z!mqHyiJxB;TvE9 zp$99I#KU{fCT_WH_7rx3wVlq`^JOmhO2=bBC+mk_$fh7FJCTbWn-v69dJ-0S0ux9a z3X%LfG8!hiQW2*JmS3YuJY8gDX*Ou#9ek7eZaSedoY6y861rP|!f0r=D`*$7ODtI& zV3TRK=>h7)&=6-H)VF4c9Uc^6!T`q*ZfRO;<`1UQ$F&U zWZSgvDwlOP@uIZ)GRG|`5ikZ$xPGKB$hV>aWxDB){wvTI52!6%8qS%U= zc1gSL8OZ^*?SySbTxMx?{escsb*#WJ-A0Nm*L0wEcE;0PFxQ$U@;QH?rMcDFtCT?{ zY)ZY*JBFWNSi86si9(z6z^@QCje6Y-a=tq2KpuuiCEGfRgx@j`l+V{yK8XPfbLm?% zrXvYT%ELZR*wD%Yt2vh&T(jQ(3+tZ8Yg~KetMF>-YGYa37^{@shx^XP?_Tmg^*poj z(SoB<)%krsMQSDzVAzS>{4e-fqCbj?>vK%G(IMtH9{QhhHd@SxCy65%!#xSU6R!=U zlX1?}QYLK+qhT^V~n+d$28&p_!TcFpH=`K4=TM8!5z zSP05LK1Ib83)C-jOO!Ysd`4HB>#Us{L{0A3+nDvfFS32%47vN6?7bn>uR%cE0{R++z|q?H3qP zhXvfNR!og>)_*d6)WBluP?RI4;iMoMYk-kPMQu$_tqoJk#qYv;P|yns%YsBgY!x7m zRB%{ofJU0W;`$%DPdB{p9{#!ny4XpLgJ$PVp1b-Am!+m#w-u)FAP&ZXwdR{4xo)nx ze$jOx(S>$vx_n|ymbASgAJ^xZjt?C+6e~NJaSK&GzKf+gA+)%SHmoSOR z&QpQiO3V+PGU`Gjn^He1F=q52d}0~bH*w>q&IxxW>oiUk>#@d%#E17*GO7Xl%?Vt3 zPcJ-~Y}*D<_Wct8B3HoVp`Y;TX+Rs~jOL2nL)W+9j*?~D0K{v1VB4Dx%x>KY&T zt7sMSfz=(%C0CTTpkURDrdV!h&`u_M#P$}ib*k%TW7qnDMRJef#Q@bb8I$g6)C# z!p=x()hEnTuo}>pOaIt6Z5&TSIt0YZ4?wI?{$CCl6&E8Xm%l{|U@;J|Yir#fXBg_`dN9NYEvCoXk z#J|odRr;Alrc$O6ieufey1I@IOIEk0OUkNu(kZqpj(%?&jQb4rQrhH;_P0#V^QKC` z%IK^vr2FyH2Ntlwxwk%1=t?vwq8{T@eWlz~S}(vY*2Re8zIfv>y6mbKSxh+;tK3(- zGo?R4c|!TUGXMY3efTZMz7Z#Fb^O! zEY|bZY5nnWX_HCM-Hp78J+NcyaJO7}cQ<($kfCjPH+GUQEU?w;Cg00HR~ZDu`cmQ^ zTX=vpTgj!IV9`_DR*GiK*%r}Z#@9^iP4bXpe|AY)c^lOu(%pK|LcYHw=L4pWH}XVA;hpvU|mhkAwyI)Y$Vwr zL(!@429a}`T$a3o8PZPLh9NCamFq)C{^LWHA<10DPSbJHB^H`Uh|SfRIT;sz9k1to zKR*55!Rx=d`++7XGlh@|&`t1HgI<9u_<9@+IDftG4^P`UNx`Vv=^{^cWnk}GHdU4r@1{+L8q5gEnTBAyP<(SIxg!F?ekH#K383FA?P0G(W zkK<|uxV%W~<*rG_)I;@Y)<&Prdec2K-AV~v3ost$Msu8{s59&0Gr|>E*rfMh%(t}P zENWrLPg8G#Jvlgg6kZiepM6Nd<~ND--_+;Inbu-v9PH zYo>OBy2%O~ve}_hcj$3gh0x?+F&=_v@W2kNd$P$IX%B=5iaGe( z!>VxH4{gQ50FS(m$?%=DVAt)jye*n*p53cDc<~3C-xcUr-qv1C2;Ct(PR_@1OMW69 zRX~DS9R`Pk;w5nO((B$qJfR5mA&(I_<}8ebDrtvrmAb~ih36xieUmqla|mIAAI-^6 zToYCZZ$Dv75p4v1{En_b#6x+DCSmmzbC9BH65( zK!f@?rj~gxFaEVD@XLG^XxMkkgMy?dzLewC6^c*7`q==tjgpl4pYojtafoSd0taF| zqB(;71@@fh<%ui3hL1qWtwBrZs;>FPjdupUCeM0r|Cn#a&=_2^T%N0$mc?;eJ8EDj=laY2(cX!brgsF3Zh&l z>s3HvZ;}XBYxL^6IXBspn$O)31_5h=3~7S9K=SoutCJPebpZyu@{;D`Sk zC}T`eB#ym;*AXEgpn_NvN#@?10*Qx>8y+n z&AN`(difBoKKBtgr(6%5|SHEnyl-`A$F)<*L9fj>@ z1x99tZktAxGRC3oROtyrPZM6&Tsq0z%A_aMQ#<$2!aNT1h1gBWr^_ypI8f0%EH-59Yx9`uli z{#ZuZ$ukt?Cqe#j!luH0Dh8=sx^qy%0_=cCw+Q-U1m+#={e)^m@{}mS?R#4Z!{!Z_ z&MBNP)A{|bF&GxL89KDwFxq1!8NWp8Ts*AtMUrlW!@hWg>&$k%>y=_B$t-0k8lgcte_VAtiQxnKGh%pwPX(v3 zv*2$3?wIB9#W6eZ(8v&K~BvXL&=ZA>UX@ z1gBJ|p7iHFx)0&cPHfg{%O^wvE6t(I*`J}yieKY|Xl}Q9X=<{}rsK7JE%}*YVvjE{ zq5>T{Uz=dRyse7ZgLO6Q(_K3Gn_T7|C%N~&Lx0gRvP8fqxKW-OkI!z><4LzTnqVi_ z)f(e7R7CGWMmy7N(ZfGjXLZMe>T8lc3_M;nCcsMB>Mb>XR-4&mz)d%sI84bm>{Oj% z%jx&+IYbnGMcO1KooLnB;Rn84BeA0bVd!D}mJQLom7X$gTiYiL+Fy$J=uGflFKr~} zN5U|4_l^|Smjjc7dy%LzN!~{rR!hFG{peFi%K_WXa7(eMgy41ZP~cA zdJ6I0r{H~s2anr=;#}{x8)N-ok1z*;g!~emOdg5AD%Jak4V^5@Px zw%hk!@u!>(-Vrw|R^+8*U#^0VJM`nJBKsH?Xf0@G9;v*=*CHo#4=r4LqGlj{*wdiO ztc6F=TfxTh(DF{7Kvt=H7O&BIei|8Tgo9!8?f#hI7U9kE#`0v9tMJ9Ab(&!E)rZc~ zK`P7YbTnm9Qf%-V^`()W&$088m>dwfNIj9~@7QYxS6O6+wuS1N6=lh>b0Lj$Y5F#J zc~d3GQXazPGr)Z+0!95UmLkwDL;!qMfkpmN{$RL^CvE@7VigHPLr- z*yawJ;%F$Agse2SIT@3;9e!L5xM&xj*fYfq-q;k_>zfLr$r&co?l{xV@GMiZ!6^O! zTcXkQ=^j^*dRMI5w?Z6_c%mw#VU>L&LF+>Lq|9<$z=cO~>N<{?l=4~1nWAoEOSc&_ zsE|IEN7&Bq$6hj6hI}ll{fzW$cp-8uqj)ZlH}C~CQ&l_HFU?S5=9BpGXG_tcKW}jB zJ*=Hh*{n*M{H*<36ee8-JTk=*uh_54MxvlmHLZC@KKWg$0Citg!RQqGq{;w~57SHi2SVx1w&st@P-gXvB42=Z~fm zrn;qmAB{_dH<0)S;+RlKhO&0#83wrVSv1Fd2Dr^HY>KGG<`4SU<|rsXcx(4x!l^9w zuEmQUU1Q8hFTOsP$CE3on48^L>D3N7w>N9k(~YAA`De>`da?g*f6Wb67DS0AG+_lMn=?Y zkBp}2&xBpVdkZyc;k#La-Z&uzoNE@gSoD-(iL}6vrj^9&d~OI0Vcnyx$tU_+p@=?ew1dtR;zGqmA0x z-wo>~;ss#6L+HPkAa9Bv=0@mVfJF)(-R4h_R9u=^@bjmLgo*Qfdzq#ZcqC!^hF4*X zM1{|Zhm?&QSwJAAQ0b>(A4~=L)TCX(0ToMP- z0ILQ=^gW8SRP-wKDqAa}OB zJOmNeZNU**aKlL#cK^92rlPd)UOsIN)DndNE_^@y_NpK^b@pJCB;E@2LarS~A8nf; zz7il7y=;`^D~2CeE%dX}AaDsMjnQw8E}U!Sa1_Mrjc!GTa>0&FtSHEnkgMbjCS!Sr z)Lbq(?WkE6Gxf-Aq{FS~1811c3EXduMn|ezHZujH@@`fBZ)M44pOY)zNXso z--eF({#rE|ZLaPacyFM#-^^*hx4+|XAF6m@hscDeE6MPLHFC zq-+xT1b9$a+l#xYv~`lXTdQALUawzyHzLB(**wi5oY-sjW4m)X>x;#+EFv06j=67^ zXA5>4W7(=%Fb~nyB*3z6x+-=%LR1}Nj2`>b`s4HRvOkKRj$liybxDeX>AWDYG5Mgt z#bSlsA~)iLZ~>{l5}|(vu^yoRQsV}zzWPW1r3Sf8c$2I#x!_j{S#B(Gje2RP5-~y` zM@bqm3{BzLs zgzh#*VqNJP>HyPx-r;PC%8@XvUV6bXyvW_HWheE3e@3(68C#;|J1^bgGn6gl->31ceaC^2aao2mc`=;2Y%6-~R?>t&NBnzU}gkIYbk zUIMb|62_^(FD$oVkHEL@x6fc(&=Sz$&|g9UmUFl#)Q38!nz7g3dnb*oG9sMvHU#I{ z2Iu|LxN+SGbD}tJL5?4@mdz|Zvj=grR1yzx9po-)!%K-=FA^^RWiSn6#p4MRHvuWg zvh&nQRWJ!9{pQ=q-F8#+Dg<;TheT8N1)P3D)lhmHha&wS5}5X93tD5Iq}eUx_I~(C zka)**tV?|lUT$+qzQmGH-v^e(2)yBZzA!y}z50*N(;vWCmP4HX;mGF?0OsEdp#K4k zh^>+HUj+7lJMw9qO3-*9Aq|Pd(dY7|WGeS*N6tl;*IvGV@HSY9Y=ZOu6?OV(3_u z88ETQ(a`77L8ia3iD4Z#SAIugHlJw~=Losb&Y%X3`$*vDE?SUdjCgt`YR{4gX>yY( zjQZxQsNZ^!aHo%qJ@$(w~leRogTX4ROH)|9zPK0a1msnNKb{ zXhP+RH4f1TJ|UDnHBUz}HQFs|HZ@B>zuPUft~_M7HzjqtUmEuuyfV9AOtybM&t$Mz zOrNoQwto@|7!~l?IVAH69f~&!TL(VtEZ$d@94P|-apJ;@s%-I1F7(GKBIz^XTd+8P(Z=E8t8l3QiK2*?jio*Qn@qU> zKpM4=7(-rC?&s{NzfvYJo2&^mpWb3y#kJyYiTF}_DO29Ci`PWau!0;v8yGgt;xc9o z+MG@UJik*&T+GrkCpK1H0~9vRoMy%F_^e#Dt_8|((ilA9rlg9BS*-xIa@(l!QsyiA z2vL#>aPV5geQNNFQqAvu`SpCrY^iYYF4&PN+tYryRQ7SMp|2XDC`euy!569qq+^H3 z-7OaI#ENz%%vPkz_m<}AkLu*$N{+(y?~_+6j&}Z>D>|LTDG{RHrwU}gCjkkvVczXQ zv{2wZwVKU5iBW@vu*((YjH5rsSsHZu-=&P_P-5>`Ffa3iL*7fTcACJIvip?ajZ+i$ zb1bm+sKSxpmzEqtiewg&*>=x3<+0W?&W0e4Rvk5@MiI{Pb!fyf zuJL_}tQs(f_d^!$SYM+$ipNWt%3)*m6*5pJ#PFgm<&QN(tb>j!Ny)2-0sr>#6@}* z%!>Q~(oCl(dcMv?u146HhXgLK zuc>WH5;=FxOaB)=D3XjyJ#2Z`d#p&WTUKTRN<`eyr;vMGUW#0P7(E(|ojcNzOZ3U% zF>vk~by2UP?M1_&?0Q2pJ@)o6!YF*$5D$F54zfwBG7h7VB$v|G{jGR70ciD?sAa># z3CqZMo|{SG{IGyGM{1WRA`pugBG??iqhR^94H9lyt+k+Nlt|5>L5Ifyt$Zkz7Dd;Dv=0<7t-*;PB8J+54jMhFc_wGzEhG$~n1p*u1kmN@?h;rz@_0LP zGj*_Nxu~o_tHsnAb5JY4n6sC|Uw!Fej*kNCXj3Mc6$v<6`F)Mq2rcT_kU=_nTi*T? z!P~O^qWA!w6JiEdH+`O!dHj*Y_Rx^Jo<6%;Ctv~2uPv>5Q)Y?})y92J86(CASq3bT zR}6KW$*ZjH78^2L^aTCMhyZp$7(bLLCv}i4?EMNTR6v^mmfdzU=SPkrP>t+jV1 zw$!l?o_?&v&jU199SeQkKgY$;M8glI7{tmBYs#}PvI`8*ClSE~)?UHJ6y zGN-D7TLv8=p66WLj8FP*6mWd*{P!435Zyp@|D zn7rVK=t}PFS&oPkZ@RZEF0mO%^P58Az1$jR^d#c`P*F@v7jo=)RhUhGzA4m3R5VW?Rle(-@ zgYpc4aO)$I&fbB@Z?m+q%Rc35Y39TdTI6%$+XFldZ(MepYAd}koAE3qmx{Jlfmy1a zi$E%@hPb(Dn{5U5YI61NA)hL*{Ry53;O97=Nm3QS(N-~Q?QmVQ!N}qRDm;p(gIgR? zb4x^dLsm+KkzfhGGFQpJw80lX(d~9~KA`S>qv+W3?9%M}DoOd{M5-aeTUc#Cv3}&B z^1j^U%frm~>V3{w_%4h?FBk4JFs~fJ$FRzJFfnV2o-f1j}G;wDi@F47O^L^{V`bYYMUG5S{Ux+U4RX}srSwdb?Vi*XR>u$^wT z=hbJ!B_0fs_goNVl+FqEi6_e!z;hx6ZRh;UFehvS&qJClOX`aN!(93spp z5$}PkdCxNofd9D86MduXI>6>v1=S+C89L!)hI=$38lmaXshaj{hps$b&zZJ%KK-L&Do zfMgZR4NR{*e|6X`+O$)wzT4Qvc1E~fRK8V*Y_&$qw$8X3AbHG2GOnD}1x1?3;r-t1+O*{4K*NK+hB6M}z2!g6;9)-vn@q^;= z?zkxpf9W)87ntfrT=8(73WsctsiEKO?KWP2CTwkzGdG951rI2i{c`2eb_*X8!Ttr* z<=!w`@)ZtxqwJfAJ$iVcf3j<%&^V5xuD>^-BS z9O{H}Zn_CZ@@^h!jm@gJ4ntFEvL5kBY4&Cg;fo1d+y2DDKSGq`k0Luw0U_~}rFE<8sBOS^9Fn2l31jl@c-W(KT&Nxynt=|oB! zrN&R(=K998E@`xBliHFKSgsp&2KR>O;{@)8zzMN3&y z$XnR=1IMw=6}mzU!)_> z1l+G*SS?M}wTmfJ)m7@g7FQKxwSqrdHE$x{>w8S4{0~H!`W9l`L-f;guAg0c-_+(b zWu{B~fYV;YbWhS8D-6Q8#%a*uokOkY%lBbqaW7IX3b{j&O`RKhXd%MQjBVLt@Umh% zck5MruYi2uw7O%fHw4ukgp+Pk_seZk;T=*N=4f#*g2bnjV>^h(n)N~or-SR4h&FqI zqhIV}#bQ>_)rvM(0cAM-Pu}lncXuW$lL{Emc-8Y z3YjP8WsdEzo+~CzdWd>+)aUk>liMrYdGC1_Q9im~kE?~A{Bo{)ji2xsQIyPEQb-=%k zXPf-)1u>fwl!iHRR+3+hmRy@+%2yvPA2XB<@fxih_=>-%ulbjkI0ducEOoIIz>7_9?MT~4hz z92MmJ6vFV`teRTVIObDRE=ap2C?xmbKz8)7BU+6NmR)b3*!cixoPH|b_I(&E~rhve8^#RYE@{XLF| zwAeS5ZeslgHu#nowy!nITYI7g5?|&_>i8LQP|-TP9XaaxYeae7KnI&Eb@EA))Sff`k-Fu?S6gFWN)cgPQ|noaCq z^@$WmRJdJX`;eao!@*Nf4)_-D{&a^g?p}xaC48=~6UmNDld6}?KNZ%9fYXlp8xxeE zLKh~urHaoqbJyqDUF_eRHwR^Kt9N+mN89RlWPHd>B*gFxs@lR%sSg+#jI5SlJC3be z$6);-Ltet{u_l*tVaK<9;BvjRhB>HvhQ6S6dX(?*_%Q4yM2$QJn$+HwR0mxzvn7*d z{WjEJ zTskeTIivS*?^P?0{+pf0$XsN;8Pr%Jz9KnT zF72e9E4wb?s*^8{NNGnIJ2mK}3@Di+<_BI8WJjwaUEzcA;sq4-0kF_Sl~`R-zd)Bx zzf?-+lkmBNa$Q3pi@KO6AAut!i-;ZrBi%a+HV3x#njggFf5hy4p_cVy8doh?t27*c zw$vqxCUnbILEZ_=W+G5aC#cNA-q$6WzE|P$AI|ci*{TNLFoWhR_EPjpkFB>);=Bx_ zo}SIoMMGOyLZMdRX#Egwccg2WHKo1=OGYZS?B_Z~c{XQcs+%&p?Cv*l) zIUkL#Ft~v=m`VxI0C#|d+868xZh^3vp+o-yg=Nsc!^CWY%{yPO;0Yl-fF|HFw!uRJQ4`&7=K>jCWobeW>fXi&I~0wD{F~!8=i5qFN@i;I{&l?GsO7ku4#sq4}z<|0Manh0YD^pB=FKP`Lv=*4lDk4BGc2{Q7I3@ z_bcSR*sX8!>9?x6^>aTLfeYh?TF7pvIEvQ!jpQe?Qh%Uc@HEtVdut0R!e;`%hfQNB zrs|DL-bSoRzfmXIlG(ISGC=d+){{Krcqc||5ohFhYA>q(aDtcG+CuoQtXNe)Otuuv zBG7R$v(uKJ6p_1;#JT9ByLxrjN6CxtpWqZ=!bpM7(58<5bPlyJ5 zK7IUv+xjYc8+rw|LT0@ybaQSst;p{#TWm8It$OJ9rIDvqEUL9{vaA<{Z*!PZQqie%_hk6b%ZU*T5j8m{EKH&)Sp*yL|Nq+-!db%E8Xj$jQpt z!Cu_R%GTA%><^!lzkd1GoymU2E9msqMHDr6}nLy0UaL)4-O zaP9kDtdl7B+cuw)ny`q4|0sAjn1MT=#dj7Wqk!(@TO9Ax(bJ>mkIS>Mnkmk!_)DM1 z+gEz;l^-AP?+QQ=jsg*BO!%T4`Qk9l_r@)R?OL$pirRMetp_oJbI=Ao5FHx zxhLZ($kOuG4@9PToLrtS%x%1H2Jts%HA`#8bxumnWlBw#No5YYjlnE6BG5pL9OU@& zyZSgoeJc`eKBR)oDE&p0N}x_AS#R+4cO|8cJmtwqxFvZiH2`X(?8F$?%6An=f$OSSmA-a^p`3G1yII1>8 z&+S+Ni%(q{5n1@zP^q~(6>tZU!%`V=PR$`ATy>-&CN%GQjUoOs<%Ya5O!;S{N=iee zAxNICsXa(|nxhqu>&V0enbT&?aWgay!-@#QIs!2?c4=xaP5>E2{ECJq6H&q0w?}I1 zx2Aqg#IO7nftQyIs(~`U!S04d- zl;Ip2Q@fdxNgT3Z`tT(#J&RrDG0N|`l3f(T>M@(-IghEip>_%2XbaTgpBA{wVhmq7 zx?h3M0Q%Zg0DA$9)}*dZaeIpA7Hm(NcS|rZ1s%%i_nU8$zHyvcl;lzRg}$Wwl9vTd zBpu)ytX&}P%?@C>mY>jFabl_hbMhXM`h+vlr~<*}y2PMqOoA)rC~-nv@Q@dT>qU?k zaKc;2YgvQsk!1+t8*e0IxLDErfrnTtM_2qJ@s3YDA~p;*TKA|Q22vRL1}e!ZHjuF_ zyJY5t-|O=5s0BN>DZJ2D9RYg&5;c-Yy{tm>$260RK(T5-BUh=GdqU09y(Gycuuqa; zR}PDy967%Q>dnmItSwKeGqEgWE~&MTZDqX8HIRty%5z4kxrcwh@U>1rRvO`8y;Kgj zRwlIU%~HkqE)}}lAjfsd3 zOt)wG_9O32GYj7b+Pnug_H=zHs2)I;Y0RpJc4YN1&ca{~>a9$B-<_|O3HgiXbV|Tn zbCF+*$vMnOwFz}ayMwO5gYZb>KBnTEKM5r1)ju+-m$dst zb-LAu|1}k>aw-p)iv1{E-$)g+wrh_fE==8T6pM+Rv&_`4FYQIJ9x^cP zfOX9>OPjQhi7SBuEdp3qiD1ppmLRSmX1W}#_1xx6oNfC5_yE!zaK^*p9V3h>?u{WvH zUth88vM^)|n~S;xBYNy7ckd*YU-JyJB`h9TFO3h}^(L^nq;$)Eq5i_%htP~aHn@17V{|j-u;k2+o59Rn9yrd}?p#fR14xpK zd_t>&Tg*juy9=~AeIB8CZ8qTtiLmTKM)aGrBw|^tr?E!_R%5ya=h~3%9h>RbxSJ-) z4h3b}!~@Bwq!hOWlWIkBG&X=z+M(?RFZr;^ph5zpLc&|*;v>H+Gqi5x(Ki;wxL75m zLnykA6o!I%U9cZ*pz?QpFd}^oRa@UhdYO2mrbjRfbSUz~t7ZX9lz-1Yip1{&$pI-E z5FjxBEokuPM1r`Lhn$&k_>VNwRfOA zLh7j0ZmZ1!Ptl;n@6y1uXKobz)`WLoef!NGG)m2+I!#|orHBH{hQaY6t|wpJLG^V? zl5n%B0Y_QH3Z9N_@$`H1x%gf!xf4AYd}qV8we+KPDR}1mXhyFU%Up>Mr;;P`@-UC^x(#9XRabvl!li?Q@l-2!*>8P#i! zr1q^VDsB!z1_bE#7`DMo$C4v(Vm}flRcZ?1VAi*;iLzyV1CzXDD4Wu0X=YA54HlwU z2BvTt%K7dGI)7{SLggLeuE;bk%Rm=ZKeFKat1&g12_x0*G_$v7dXjo*!ST!KcR6z6 z(bcZ#vN^ZO+A-N0;^6s(f9sIt3Bfxvt_xwXM0}W|sr&dxMNy#m`RyDKsQ~~WQU7*+ z{%0}q=TMPzW_2WXQBEi(t#XH^4wOD)JSLX{PSq3>uD7k*ej~=HLDRqLEj^e8Tuw$7 zgpCnKgH3`wAbUr0M`A`)PO`f^JrxYzxiF~iY9=4OiWuT-ix|MfOr2LvTG(Z^tG?&? zStetq7+_*1^^b`elNt6xKp{~ii$Xl|DVdi&H^h!9`f!u3a7gt>AyL&~N{|dFB&|PfglI+7~ai}7=<`UVoGqvnq2*(Ds?xtM8gC?^9^wQz2H(cb9Nz>cd-Af;IdQf zln2!8*>c&M?9;&^S10k50U$6+*NAe6%JC`SyC2B%V`2yL9ZlPvW}RZkF+F z#ugU#ZWq`0@7GXUumC;I<(r0clki#hdFlj7YA$~H5*m1#UuZ-=j3qe}JZfa1OVh{FT@jGL!UUZm+XBwj>ZP0*UPxs! zHu}Ffjy~>pfZ#sh{IDLj3x<}>e+JCx6>$fC4Nh?uH@3~`3f{1m8DujBrT4f)#=9tN zfzq@6nJc6he)MaD+9?D-=pQ7h^U~P0BLGStz`^+UX!`@szt|5YI~fomL_hWx74Mmi zv#AI~v7@6VBvCA~QX>t6m*(H56oU^JM15S*l3w$}tc8{L*(=<2G2whotZGFv8@A6$5J?I@+Oxv;Gxv{EHuOtgZ@av*2X!(5lc2l37^Wp<@bE+NG2tDHfTCU>#b&Z0gxIJ#LW(kv8+j{7cn|gWgB6t8Sq}q1 zV}k*9@%}vs{pYL8%)`;l$;!?Qpe=37plIY|1dyAy{i9-b1xz23GX0fZsoJOjj6wNU z)rD6fBc9L=y0j}reQ0{>QNd^!TX()~rn;0wAD1>sfxhp|TsOrsylo*|NmRJ6ZUt9J zntud0dE^ohhNg6rZqp<8m)l^ol*D;h5JhpQW;c3|hR-6>=EAd|<|W1)6`GG%3cKUWcY5mtBi?u$n8!A4SA22l z3}F>O@{J0lQPfg6t6^WolyZ; z^jJuAUD55^zhpT-Tua-|zw?Ddtx`19mra${ zu8qvPBsVDP5fK_-DwZ{`WZOTfDLL$o_GpTjdZU}1n4acsY)ZKNK5=4ik9V9y$sPU{ zRfWe#(2es6&inxp_9WVs=LYn4oR-I83rPm8_nWV=mese9wqzI{E6U9nJk9i`L!hoE zOc5xi`7RPaq84T9gPHk|u7D4VfY|=Eq%O1^V?I=Gy`LJ40gZP_!_fvmt9Nf{I2p<& z?$5V3DT!sg_=GSC9AQ*0DA7H}0c>?P0U=^q$zn?}w7?)l)|FB0umQpohp2Nret*Kq z*mD7ZjILpEYn#uvf5zAu|HvEZ7seXCq*AE<$>;vJ82cN-vXm@j=D!fuw@9T?KCB@t z2xrvni@XJi58D%)OUF;UT~eo5dScD8p*-WWOLJX8OfHOApz}v=kf9!QMhoXv&*XA_ z)8R7B!^GI<{rw%e8~hTTHQWN-w1qkZlieC4)8+(ifzFtBhzZziJy~z>b`0B0>Npk2 z*OyI&vTdi~DsjwOE%)OjnoN2BwhPk=#6q)ps3RXW3JPnas&YRWq~Sz&0@*b4Df}{^ zrRFp^VzOLD=FT(L<(-J+exKdWd?r{VdEFDPYHdnie&y151g6tpBNA)N`#3QAs{O-J zmUJKvGaB;v#fr>bPeaJXnMD9i;^vWBQh;pdMw{*=$ z%(?;21AdNDxrA&DRC!3Iw?uzRhv0PNo#Cj};7!_YL)mFlCAdr74+0u1KBuu-x+gk` zf_?4Na(ryo*w#zx1mgm!ss+^udogJ8hsqRR1~ZC3>v(&8_UX`8^NznE!;F7Badg3m zAVaz<ZE7O4IELWiOgP+pmaU`nktK$Z1<`5E7r5Yfz;^x7b0cMn0DLshNB5@ z925yUu@_wmbqYpagYQv~$23YmLn9xYO*n=U&$T}^?%`e4tOhE1XZoZ@2+x@d2(8A| z6dD2qG-z>DujHOE2CqpNJN%d_%@o2He{tC+G&Ca>DfwL}mH?Z~>TYkKKpg57iJEi@m z7;PI(9<%fuLALp?;?{q47pxpO<}JQl8t)egn(yC3&Op!6$i&9p%*cU8;6EP;|NiJE zY-ahNMEfEYFBK#sq)(Xknwm(+(&u;#;^8{VDhy)?dGN1wPY^Hai!~hG+qCVI(362~F?qoZs1Bd0mcOwN7>RZGC>+ zp!!<1VE5+H5@P){K#Webb5evJ;%CJXhKNqwC7|=63`W#{78Lct5GG2bRW_)>f*>5o z4W=b@?bAmi3kjB^gATT(k2F8Viwpx60a*hl2x?f)M$k|wt?$?jtGtvw@3#Y@nnnoTo$NQ~=$&AEdP>!HHe$Xtu7C1b;8CDq{duX0e z(;!g0u#?EPQgqT}E*{$sBfym9P)@YNTiC5GATx>;9b*hV5nX|3wlF`a*r$B&+N)Gl zrrgn|vpC7jE8>q$rst*>V_fQ$R?D}5B@5;xU+yjsA;eRdn!fBIxH8AiMw@on^3YhQv^T>H;S|J*1mqCfvqFHOxArIAnW6(q+?b894ADU>>TZye=BFco zu}mF80TYP~!E89;v{`Bb4TVfUs*v9OR(CMAhAtk}KMh_C{>l-l(2B~aff37~raT@k zu0~H!3_?g9kdutAF}Jr7DPOCAKYME^t=QWJKX59VR-9f_uh)brJgThe%=!cO`-sAF zff{p?Rknb67A({a+SkyUR^DZjTcPuuA~Bcyp69&@#-%%7-;|`a2`pD2T8U-DD znQ9NplWdQZI?z^b5Q%!^8B*ttiV~?UQrWHn@haF>Z4g;gKi8oq)(&|~RFzxCd-S;P z1FmZ18D(qa8E46;BL)YZI%U%RE_D8&E-BSch7_|4@e5gjh&g9$cTMmCu#4Qf-p*V`dc4X<(+o2tHxn zOnHOd9lUH*JQx_?ODu$l?7&|G(vVzHO>O_4rh1Ulhd`8Ox#R?4f$ugRomh3p+r&2v zV)IKyK6xsfOygHMV)1CjK>K0x4(Og`?zPSRYOSpOX5Hi;u z^Js5+aMZizT0hMYzG4_q_lB{F%9NMkVi%H;DR1N%v3wgGAuKpgpd%yshR6(~%XiBi z)m__1f=M~&qMEOn&L=bOqU`z#FAg(G!R$-uqi;t>GjHI6m{)jcQ5ym`)m?t%7(aeG zaPpT#>yt&Z4VteTEc>y1GijWI;H%u+FCVtcO|KuTcyfCvY^~}LTBUBVMXG8@z&BLp z5*+#ZC8eavT*_BWe+KZWT+dau_=p!l?ePju7DBmAPN!y4DovYc=FJdK%z>WvC7khvb^dM2RDa=Bm0M{UkBm11@e*>;IrgyxVdjKsN4vi<70=3T=@9jr-J9&&(8Xg z9}#l?jMZmIi#@v!E6YQgCp~6|s~`qB{cM?fQ0x&N*;o%MRf?!Z;ex1lb*|x9c}%x(6>01i?gl`! zjj-3F(2Lm7LIc)bICxLq>-XGKZ=JlDsA;JRZYS6`osq8E$?bJtXm4mEPZl6%6EbHav`&7ASju9VDk zq}K3wq(*wsv^U*Ahy(lNySLe~nH$&Kz?%mWP)D`irU$OCsY?X zS<)LpKwOzfeq7-EDqJM8Y7`=qhlb!WY`v$x1bcdRbpo^YIs3Z%PJEN{8x>8<1W6AO zSqj4-GfRvz8Y-paKn4H7-ZXkdhR6{i`1b6dciMemCaAJXt8_&wQ!Bw_R02v>vo-}- zqPZ_*;9_(%1Kf>Tm@xSL!9`rC#CzKxK|z3pUtc{L7u|Co|6L85&|H9x!f!L+bSN2d@+do#E`zd@Tf40ZnJ)WN%| zd&Ebw5d=gWOXA%mpHfyhsKTg999&f^%^0uzy~@rcsX(&SuC_-WdBE3+QGMsXObY*H zfB2_my#HtWi&_60`+t>=27d#}=xSHZm97hakdg21e%W6R{5eLk(`FB@sS;C+d7vx( z2X1!=LWvMYp1&)a^I--q!&VJ$j?L9K>6(**6N3#Aja+W|VnV;ikDdkDs6@um;yM#W zxlBk9uPpV0(abP_TfT?upzQM0C}*C8RjT=8VgchA6Y>zEx-JJbU~cNZ6pD-1(c0=T zaW0Jt#Mwtuu|7C*BreO4v-9qUeF}P3B>MecNXFaoYwu7nFUyz$8zsOwUR#Is=+7b< zK|&gb8u~_rrT!?%mny#JK;~>{Ws&D!_E$DKb*3%shd6&ft!G!+KISQA2LfV>2K`{z zfp9H#XdG68;jWOFqvRdFf^g<8$KbslEd4k$0gU3OR`7X)t^6m zG~a&iSkXA|M24EtIPaocXFuda$X!l^hK8j+^aj*(dPiqC;2(CR4!PkHQii&2hDcM^ z?1NfUyUs*JXm^CBc)Frj+uoIjE(s1(vR(DypGDmL!sCax6YDM}TTzY=c6(?jUkNAU zO<#2Sva;crJmvSS66M|W1ljO0Q)Bh&G&4*Ur-f`dT4p4z_>_ZC;G-()g`*pJe33ObU`($u@#d|?JHIRa`6sJgP- z7Fx3DPtmMLQT4@z$byk3^W(Twx@y%XCuy;D6=nMHvSQ?o za$3|`A0ualpdIjH>)MlY>KPL<-U5iE|6$YU*cXL=YSm|kZn-Oq- z(;S6_HcJj-Ku+l$r_HkOU3)^f7Pw_T){57|cNj+64T`fiy>@PrL>M+F9VzCxCS3uI z)5!^sz*Z*RMNdMfWz@s9S}3u{xS zF{(kr;XMu*b@C54NfnVI5Bob^>lC_9p+}>ulp0=pQE}L(iV>ZI>cv=*0xc+s_U^Ib z@1U`G#3jc1lW$-9w4MX;e>y`Hn~5heJ*2mPCYoUo<2DoS&@)2pu~O^4f9}_XHh^FU z2SRIal~$!^CfXvD5K8W}fFLG=YxoBk!K)Bf`t~nf2m4~fLSh?@v_TyIq(W-{xV>n4 z556o>OqqiW3PT*io%&7op7`mle%PETIY?_2KP|5$Q#xke8^^?RA&L%Rk*f7x9N4@} zuoLAf$ZO+8c!af3jJ3YCJ)oe{a=hE9Mc#1$1XI^Ro^cy?Y`v;n=E-e@q4M0@o-d{7 zRnB>i3(0vd@3QC%ar}!a0U7!JI-tUu4J+=J+MA7PEL~vo7{^?(z{^qeCHV zmhqrMZlSITMjBIWK&H^gMwUMtPXQtz!xYa-Ry9(jXi6-lJZVK4=`D^cc)r z^y z1q96C}2j9*6J;TspRa-dIXA3@Y+!mfIK$Z~&Ru`qSA!17+T|`u6QnsQ6J(vpm+8F6#_{YDe*UV+ z_GwN@w}zPAz8iFJ8%z^x(Qef$r?}D5l;OdpZK)(7yZy%+87oJvNzI>sX&DrFD38B= z-SdH8@yHmM`?)JCaJ}6e^FEZu8*8Kdkd4vD2?0dzAAE;9(eBz)zK82?P zbIj0seQgvY#mm))J+RZTMAFEB5dV;&aax{DPUFX$ukI?y8XdEN<-jpqI-->Y@i`U_ zmlm>ne$oQ93UEcmY2q|S+WLuXivKw^-)kpB-YS7k3c3y&g)05DpM#Ec%n_v?4M2-_ z>fMx_p~>?y6P6wAioCZ6m*-ErEZGm|JL!)0&tEQ^>6YZWncVB^I@+)hTsnv4rCAW+ zIyxdOjxuLf6!O({O-c4l;Z})6oWU1>joKiwcW8 zDyF!JHd1}dUoRm4Ty?C>-TOxKWyFK8FZ;iDoK||SGy*nGmWE&JDddgx3$@BO>ultEMi$#JSSZF{7m`AWj7F$9em~P_j9XY-Zm!S4vX; z$EwtIy@r`VDr4u($&M%bw~w1wux+F@Zsi&!;rd9FykyY|!SxhoIboi4O@!lQS(qs4 z%;_qcUB%=YPQh#HMCB@hWwy}bT{)22>AhT*+CwpD{T1$W#PB?Hv0mZAhV$ZjzlP59 zDA}0t*hUZv`#+#48-hfEcf-qev{GqYu@P+T>0%dxSmXWp;8GYdZG#(PbdXU=DiL{^ z9L(#+?c+1=3s613S<0|SEs`KE{*2hiOR3aA=GZ>sVg?Sz_}L)6kzQB1*(?je6HVf% zfF`~Or(q2-3A0BcvwDaO(c~U=l=RL_&5+AfIe@5-QCBhFeqPJ=8BZ!rnPBAn^D(%K znQ0b&9fAB;0hsc?KL#m1*T1Y!NcW%JmA}i(WTXayG!qhfHWTp%-pgwH)EFF)`liSjj5c`i=A5QI_Ucgo}`> zYtB#z=Odc^P88&67NeKQ9=xNOU#HJM*pL@WHvXIa880sU|lv1292EU8uZF8o@D5X=-d4iQ+J{V z7Q2IZlZhLV-cBU-G_TzTNebu_kp6Opdc@#cA9=~#K3Vm|{+b(`4P2M0#)=5S&PB3= zW>ivlAG5i*R`U-gW~~G*tk*c45eFl*3&GP`y<85~JK-u^QXBf%ohY8B+8AI=3DRZK z-Pmk$ttIG;2m~PRNJUYiGc!^&NJR8WC5Ch6^y((Tz$m1tNDP=Fp}P@rqPZBpd(>L} z!?Rq}lMc!Bao!HLNWWNTli(8FSaec~EVk?jVCb%KpT5QcX(byxlB zb^R_+oF1c-QHZ0D#Jz1PW~eAoAX+^N;T(^Q>=P|ML>HJjA8B}u%|jt-L%cK*PnX5Q z2B&K0N5=`#@>itwR^xbfc+^Fj-_`;Msr9dux*LYqiX*6+T!0q>r0)n8a9 zES52(p(){UNdcAotM46d#+(YDbrIgUk7%4$!RB3WkwRd(osf{=DgyY)Y?;X2u0@=D z#NfpbGp!UEfM}uMo@LlZr7bQoaW$k>CnnENQI1VgrkKT~_ZY7Q8^N6n_gcDL7Xy*# zrN~#5jZ2)Q9>LjmI-u#qza(cNb9(4wYYgsFP(;s95q>{6&d1!(mk%>@sWb@YCU{2+ zEf##z^BV4wCJNKH{+o+dvI#K>Bdbx0@Oe$A3F^Ubq%}8zi?NYNr#axkJThqZwFSb=}V^gSSe)Rtrp2ehd)&L0&c8o>{n|zGsT4U?4 zX&e47@}ooCBF@*h7YWd{mSP7pR|EUTZhgPe(G%*x=@H!P+})*5_#C)S7CtnCF5Ikk zhh#7`xf*}{+C`#iDup4CNRMg|epxQ)4Oah?XDudqNNVT=#X5mf*5Ac$q$r-i@rvTU z|Gy|n{*}5CF!M|#f303i_+m2rLud7W<4XVX0Dr%F{`M*YR3Kb27vMi~s62`u2BkCm z>{>t|`s0i!%zz+Tf3Z5-nRDoJKtKc;5&-sK>Iju7;_v;NkVs|SK~{@Vt^DM38-Bvn z1&l3FP<39lBe~-?6b0clfEsUBDc2E>jXW)E9c_4BO=P?r`7qoG%XB!9(#NEu>&U*Jw375uFw4<1VO0%@*~?~Mk9d2&fdGBFyCrdZRe=0jux+P0K<3&V zBU8cZ|3k@;?r?||Hk#a3vt`I$E#zNq z4VQwwHSD|Y>{f-KD38|1C#&mQYpr%i#Z+D!0URk;Sm#)1>nk($db+wtLVvQfHd4SD zAI}%6X9?`MYDwsIHH`JAF#OQ5M+8?F5g(PgvgttH1yIw?ILxr&RM!(49t9tb5sIt)aAG2l-v~Niy;WipL4xCzRp@aTDE*YEij0#b3(5%0&U% zr^ryWG1aGD!N$2DHYQaG5y<>{>64~2H{`8vMxpg8TV!gn@ccj(DBxOJ{9k92q%=%_ zwE_%RQKjmtNmN#8WK*Qooqc}pvyq${Px`I478)V#w#*i%~qeua$lp1D4 zMW`4CYJUgAT1Y3>Z;T3F;0WN}ZXfWIR(Il)=H!WlfJy@_WpYO~_k*GoH>@y|rC;!1 zWiNkCsh7AE=yVnS;2MxEd1%Y0aB62T<~%$`Wo;g(Lnfyv8TA`1lPKd4GVQMkNuVns zpV%;1?sU&A-wTDu96#EqGrLGUEc)eTf;9C+bWvqU41czc%Vb|!%_?^wjWc!VTl7k@ z2cR&6Im9pE-%buRoPr3&6=^9KFzyv1RM-TRWt805rZ4Qumb7VP%usl6!PAF znwh@x68$>mr8f|Q>4G~>c9HPnpvc$Tamv&C(N&^H(IlrT>7!BeT=f3j<&SH6JOIno z0m%jFUAQy!92PuAC)ntC8b63o9GtUjg5e!a!qiWfzk});j+%`Ee$bo_A$|w4;$q>* zPS2Ys1)eLmX z;`v9m(zOiCXRm_dhp>Gbb|NKcio}R+qJz1UY~Sx2e_jnX?abMu*mln($zDweb7#X4 zO7dTC@r%gtu+hOR+vdWrxZdw7eV^C(*lOHq8&yLUpg>XsS<9fB7t7l2Yo1)*DpyIVLj5Ze7NBe zMQU`vZvThWNZkpFXNt25MMd`j!a3k&)Ad6UG_E}Qa`T7P&`R%tHI+~1JSM&Ns`{uX z0>xo0x|3*r&9U9UOYfXPEsl+gM;Z{zf$<>)FN-?0q71poYCG(hmcXTc(Pg=IQ^^QC z`S3a!oDWqHs)%=x;StK@(4OPEbj;OWg`}>Sn2Lfn{F@SwT0AN9hISBnFChphm!!c7 zrItdUd)w5q%^3I^pDuzuZAsDfrjvhyhAVq?KAO{#>(ywoS+68>#sM|s?<`0C&gHtN zJ{#j3tN{YhR2&kZjPR)tan=(24VgjFQSMmGX;_glX`2FiHlgeb-MgY%sc#u(ZIVR^ z78syve9esQMVdT{6(#b*_{xc#o3N8) zLC2JQM}B`lHI*5nwG;b;e3G3gzDYEtn0g}plS;g~)M(nq9^D|J5+>Phd)B|K4ppEP zm{c%yZbyK`mz=UY=s38Wn2jAOY8`Lp2^yqS?^J+^dF~j?9m?GT5pGSupcF&op>*92 zp3CAu9UQejkRZf+782U`6HF_O>i(zglkirhQ)>ki?RQ)Y0GV=YC9l!96y0{slHy6F zX{iEoFo_Hc0l=OtPT*%vNn!RqgEOvje7utU3a1IMcGMVQ6S_Rr#@+nPMIn=N`-&2# zZjv9R;-He2@7X($(svo9Z|%8rua`jM?Qliasey)~1On8LFd$<+o9upV7Y5UHsdAEE zwL{vgo|=di$AybuzULS3w#VS_YV#&Da6cQ3=@=r^)EEz$D&*IQN(p|ec}%YyndMxW zA60j@_!ojcbyj6rn2z7}EDq7V!I`Uz2mlOH=g!izIHKM1uF=wO6DI^O^4Thx;F(>U4V`A1Bulo5zM8DjU?oCt#FY+VwHJqfE*$QO>_c8YI$?3FTS>C zvj!@h>>2tE*^Zj)u+E=j_LYg)sUtUS{FzNa1h+OREkPC7fZ}QGjLp;*x27Sfhjs!5 zP!XQa)r^<|qu>Qp5WYL%ygMN94ok6ek_L7KOw)PC9w8`KCdU=_=NQJ%tU7lLR9XF;)g$3BB`{Nr zZXnfFH(UI<>sURYk2uBmlDw>jWKolAxhxphnWL57cV?!gYrl6yyZUe$@0w>uT7-q4 zfj>X6qO!=YuZzaHAhNkI#5qM2lI(XsmWoQ`gIuV|q&wQ*+K&@?Z5R@`6i=!vW|K9( zT&7*x6SU6Qwce~#D#sX1m{y}D$*IZgS7#;e{4hII{@U4#s=#3O2cts{Ve44W+>ws0 z|94o|rerpo^3oi2va$fZ8EIjJ!_A|=rXp8XIc9D2Wb^c=Q}!gGUGH~)jek<*KW};q&D0wFzJLCZAm5iJ<_3S@+tLGi1LRj)803&+6&)W{@ileKGJtZOl3~D&b@Cr7gp1KsXknD4;TRLf^+) zDUSn1)}e%h=d&TIqjVebQc7LgPBtRaI5s48?^FNoj;T!+6G?4X21D~NL|x9p3Y7A% z1nVy$!2gC*_4n9T)Xd>)%FpdT^Xf<`$X;5wAf5LJu!|e0MI9rq zY8jdu)sk^?tZRrvv3k~8c%v0^e6n76CFJyc=5izI?_YCgz-Yo82E%}c`)p2uRokHC zVz@U0F*n`RKS2^C@Qb}Jt8$@$0PFFe?lV8^5}y0glOK8hxt4&IJQ?`c%688$%>kbO zV|MwEKP_)$Wn`uQ#pSd%k^HiQk@Y{sBeRq>R4|p0KBU3Z;K0CT%ajDwa|!t{uazxg zQN-f(zY&Q79+(3K&@v@e9r&*Kd=e~1irSLLzLL(dtIU2v*+Mn${c&!O$B#!ZnUB}E zW}a{3x$)hNcE5`EmeKL7rliO~<$4;O7dHL*=5mX1% zfpT^kga8!1?R9*0Um zi8UM#cDnA*!ySRgMwBZB^l_D4tH#0=>zXvE;Uwt^56|Ktt$J!bb>vBxvQhU^bm`JB zd0+h|JJwNJ(%RUA$m1_Bhy`@_%|ZS8`}*SNQMbM=NEzA2k=?r_4g5U0J-@eTT-u~m zZz>qeXzj;r##rWX9+CH5X)AOdTYgcos*|Ep7D&^8-6-bhOG(vC@jeDw6&;^z=#KhC zVz^fQ1~lN@UNCVxVfq6qD@g}m-Gai6@P13C|}tb0H; z0y2ylle}lDTD4uue&*Xx4an>9BPy2>dRf1om`UClI7Q(${S;J;NeC}ZJ{;eizNZ)| zOb45#+hoP^ykobiPzOevl*A^8XA=@Rgq|^QH1-xbA0dl0==YfcFW~ebgAsMCy-Qdg zklK{Qm&0wQ{oY7mZ4f^T>47d6#TEO4d{f5Yn1y!(y@BnzE+}aV@#Bvz)2gggL3D8` z(yZV_Z1gSLz!oM96c24WT8;ro&XRI=Pvo}DeP-^HbzO#Dj0b>UEg6b9U~hev8O)Ukud_ zF(z}uyUFchknPqWhtvCy4zib)UY@>gq4gZy?IVNG6uY7Dbo>cRXvuTL=}AmaLX7;{LQ~|S@#@L z=0v|rnMPk+*8f9Q`KzYzk1Oaew*TM8uK(A%iY!G58ALgxkIM$fW7;IhP#Rgm*e=J? zT||(i@LW(7I23BhV0S>k96CL0ARtT_QLBvZa=leAFD&0qZ$0g~Ao56>EQk6;}M$|CjnA%f3G1^Ikp=e6quFba*~WS28zFfG+BZlE0K=SF~taa3@y$s z2=8!%Wj)(FxGVo6u@Q8Oo->Mu#(t>Oc5F@xkWXWg@Os;_H? z6~#qZYQu@`WNP7vcgh$ooR1n5fiB7ty7vaOLwVbJgbszPuL;a$sh9+fkYmc$(1k-3g&!;VcmgaPdvWV+&Aut6osT#W&# z+I9Z8JOdVKUtw%-BzN}r?ARXwTkAXYKBk}HVJj5T3k zt@{KC*`v$v62w9fCps(N#1s>)HN-G}iREjJ81e{=dh+cPh#{<+M#aHggTI+71=RaH zV+E#ymg|OI|AZGbqcP;>8?C~7MS+oB{Rh6}rz03Qify1Yf|~O-snIWf6Z3`X zH4Z`{QyZuiOcDp48MM#v=aBUf3=aw44+Ogo{KqB2-w>+p0Fv=64F?1ATVSqOd!456Db=Hf6+6@+1_`zn_88@pS<~jQ_o(oti;-vgMgV&X^SGA*%y|#g%$pDf&pQ%T;~GJG z@h034r-M9TsnAVp2or4gYhi>8^u73}0yfXwjRVZIZZuo;ZE$_^6@^aUquRlbK5Ofd z+sf_-#s-;+%uy}*>Eut)qH=k9B zj$y~%GabA(NN#KrL3eSI4w#}@Fn=+qK63e?YN`hB{;^klO)6?tji>{visjUpA%6Cz z-`!#>@QkXsY9E_Jv@D6}FhfCF*GPfQBFGOQI4x*~=FA{ITZhe*h6*qSNT^Nr6R$H0 z)sZ3(%@huP_Ds}-YDxMUL=#yYacTS%{rw;NV%bPX(c=P?I#>Qr(qeyu!R)Qj5%cp)q zRFj*x*xWf`ILGOj?>SEfxNKvk1fC`(?6}qc5p$B#WyESxC`ENEOf7UpjR;|oLpw-I zmUN2?wn~fF(`Ztx`V-c*HiE@cgL>|GoRvPwF>q>Jw-!*Yq3e=goliN2@|wNe&Dh}P zF5eKGBu%ju0}BmpDoWhsswgx#&VVAIk`dwqSMnYH>eO|rKj*qDnkVD=o6pXT zs*WJ>M>wq1I}C2xGn&tm?Ps!K_>!wy-~(=kjUp)TgGOULmI|Hg~sNCYOYZ*AEu*!4nXViZfB`VJ&dM`xjBN-CmL!>o!47X{T%^du#}cz*H?%OsYX zOfv!M2l@4|(TZ}~v2Zg<6RqDs#0`_$kLwokD&TWU#;PtB;edm5lON^7GjT0h_#K`s z6q=h9ej2W!6$O#mCS4e3+P3Ar7Lo!sRBh^Fr(?Gdw2izshuxWO@}Bv;&yhvTXqoM&JQ;l)tF?^*H3cZ1PePEp<)O2oM_Q8 z4xahu5HU>KPBw> z*y@9g^XP~dr|EqRkq=uvtn(ivjuXzC8Pc);ut+lxUsVNbkYF0+SKOdo=?=W>B2(Bf>UZO#0`%83+1LvqX;)#=57->&#KCAGURPav}dk1jm4gur* zX9f9v1ah8BG8(%C^cJ8@c*xkC)9D9OcInsSp}A&0#tF>4YhB@>LLLT2_TUqKxWP^r zf)UKkOJP&Ez`{-!ZhkswHMmlM&|sT+;3nLTEmQ9h6C7l-lKT-eNxIy%t&T`1_UWchENF-mbo{!2rG3mXVA9^zL;sDxs2EXW|J9Eu&EtYbfU z4e5hbsFbOBW+5>)B+mfNwo-*6BtTy0;m14XgCqhikU7rmhD(~qWUJTQmbd3K$Tt2t z>1wRCFaCSs{mDEjK!+Yee(8kRTu&B5=Lw==p zm(;7kP&vm4NM$CNj^hNU@4$!4p5P(juK;kis=C*b{~4Mrmyl`Cnqt2U->c}ZV()X; zinA^T)3HV_tkxEl;iwX#BT_+q0#__@{8T$N(yLy-=M#T`f@)z=+6H-z?+fA4B>w?H z6FRT--5#69WWvhG2#<6qRjw1*FONMBl)qdjw?6pAKe?;mj@zK~a~s~SOm>zi_5*fV zex$x)IS_-pRbPYuz9)LEKfM@*|xBDF~!cm=@@xix#v- z1|jahA1D;Pj@TEMy0bssNZ&YOn6!YI>ZsL*y{(Hda&GV~OaB(x>zmgIbezP`E{2_)I7!xa> z2{Mc19v4S9i$mgKBWSfKIXkGMQhS>Gt!8tnml>y+JOeR~0#f{}~dUXa{SR z9{7koV#pYf!tZ~f(n2 zLP*}l5F3W=UPE2qkZW^KP})F+`V0BMg?mJ6$rg5@tjFMrNj3oO^*EC=#&%WkbSQ=Ly~9Q9K=?{_r55zhntN}k5}K^=bneng07NDH=75Iiil z8-idg^Ro1GVfxAaEK;6+x8J(@Rluy%(1d5Yt$=kh&;$nhNxS6wu#41~ZBz1iw)GTK zpy!ZzO4&5xND2`Jvxk69geq>Ki}&+1#h@ixN0Z+&&gQkM4--$V(GHK;Jzo;AaYC&w z#hNesxAPoW;2O3{?@$ce_IdW9`;d2TIA$KfV3m`y^(uF5+8&r#;LLNt=j>fVif6Ki zp%H&vj8NaOZCYv8L>T4(!qbmNNq;5S%aDy8Qk9qOYY%Kz!_Pc2+X}>F7xdJ%uLs+|DZ}5bB2EAhi5$OtV!!in) z*$<=(>-gZA%-S43E`co^fI{kwvp9Evi&=v{X6B#=V-DLdx12+@*H>F*f*gVu`Vd za7T?Ei|+^JOhRFBk*^JwA8K9VoY(uj&>?X|T}c(j2_RyK z_R;h`(%Gukn8plr-GZCc`sh2{f<@_hYK7+Fwf3R2K>K!SERw7)EzQ@6)et~6md2?j z==xoBBVCR9jJ^fLH&b3xrlp_R*BL@JDagB61OjgVkh?@eHgirWVqY#wPATcU-K8I% z7+tpPspS)+wpMTqGH*4Y3&(Twt5qB$?Us#wXfH5WQjoYdp~k>K2OM!QI4Zs?tixD^ zWc+}h8~KdWaDjd;hQ_3HK)fPV>f1vOmaM3S?i}f@YAPu!HcpyXS!>s{`4#-gz`w}g z;V6bFJTlvnE`U&-BWZP)J1T_lXI~GPO+)3kS!NPBst9iBy-Z+L|h>IXa|N z6KDiM0jYc=+2bG!Q>-z@*TWP^UrMEn)^{x=PX9GyGi=K?Y$n!G%!v+m43X6V=uTsV zB@tR^GFu>T4tG>`kYb!4lggw6^_PFH@#Xg6I9-836p*>CByiJYyYiD|V-&Tz^*V(( z@j+3jBa@R46#kTY%=j2i~8bR;iiCjB*7U~s%)tg~p zx&qr8j;Y8C)K&c*zB^(8{6by_2^0mZ0YNrOW^so4nuj;sQ;_ie1Zl69c=#FK5Nqj# zb+M5**5LcT<~MW+sSkg7ks-6v9pchuctz;F7O^+@_1ix-1SeC7qAx%)yFbC+Da#oD zgdXesb3E$ujJbRG1)$xpxt9Mqfaw3`L6a2ECX^hDjSbTu%rNQH!w=?Yq1ed|e1pFI$ufw& zv^W7NaCM5ZwNu_R5w3o3Dz0UL~#l%kmI+`k7~B-YS;p^oBIIV-YE-$i5DT`HBDMNxy*sn2Pi z<)dRz3qWpZ;+fte#^iI<5bL3}ijbZmeJH5SIx%R1R{21BR)AU1KH&`PC3c=t9C*Q3P3%jbn*m}9xpEsczUOS?_$HPC6>f=S@|{C1e?Fk@Dnzswqjy;r`lMFQvl$D!Zp}_8lNh zl~Zl)7Vofaxd?9m19v!KKqf{Sl}mVj^QJ{5ssVED_m9r`Yp;fMp-^t#NyFcMMvw5X z{OxcEjLxw?Y5lx0kbS5Oz6s!@t2BS_UHi6U-sER{NTCWG$3=+0WryeC8x8mPONbi} z;bR>r^Um+bPnsXyo2T@`CzgKwNySdZM#Z*M!JTWrYp>hZd+u3x-*Z3A*5>E_AAO8I z`gr>9K`02jzRYYtw^c-)o`k_QmE;&sB;&ou+Q|+);u(H_fpnO|D?H)}7bc8Qe(pBB zXZ-iXIjk%ht_3De=>JjTu>N=A*elK}p#@xGogG)o2?-`RVTHcQb$u;9nKrQR5d4)KN6z+Uiop!b<$zn~Zpb5FQ(-Q4w1tqZpl z2Ml&ve`_3cV*b<1)i!}t#|7WVWWa8JGw!$?-ZgNR4*eT1RJUt`J=EU~D}#RC^h@aD zTx+;)L;Dd7k9Gx*gX;F(SQY~UPe1#5fBMFp{?1GK{e9a`_f+XDN^M)a%toq5`yF8P zN9`4iD26NHXfCz5FH@tGOao__WxIv`ITzgB>P%ov8@vnE!<5oeQkiLlav9Di0+xlM zh6Pqtmi#x_?NX~!HdpI}T`kb~^KF2D*)sG0(Tg&8+=(&=?S z2i-{VsomFA7aZ6nwv7=m_#-ES0WJa>uaX_+JSr+1tr1ng$xeT||GW)!1{wXOxq!=j zkrfL-G^`x=+(JSW<`tIOn?+%0cN(omv_RWo|vaN#5>Hq52iB?-X?Ty$S|-Pz8ge&b(xvo+2UaBrO5 z3Y~sdOqK@u~SyEToc8M=4Z7+hUnX+d>33w%bLv7=~?DC)_0}3rq zn2Sw`C#n=M`E5wIQ)O_=s6IYSii&zQWU<5 zUa&maMav~7r`X1j!f#J6X zo#!{IW+>BfkWFD9jz9Rr&Npxs^HDjvm@XE|gA_wzRxz*Z?XK!n{&I(`DI#4NVVApG zhQvQG5X)e)bgZ0J$^}%9iGT3kER$wKb+8}HEdC;?(L{+O`+)rS?e|kKCprZ<%OU{0 z{Qn2hjf=YjP-EiCDDGft=jdu~_RnosWkR9P&^sSg*gpQ!nGjG*i~u_u1U~+^Fg5bAdqu~R+D;*uiG9-KIT8b)iTDal9jw6 zT1Zuit6>;_8F`%S#5_&sN=^#8NvQBFDuUFYuP!tqj&sLx8jWL~99mx%#a0SEVQjF( zzu1I3oc_QGR^ui)78NElq|5zmc-`AgG#z%?TatoGgfj0_ICdIzTpb;Kr31} z|B9tqo0w(b*xmImki1zCV$@Pi_~Zt|KEXxWwOSN775ZOBv_4jhB4CU#V-pj=ag{ev zCqU9b&p_}%B9oVtz5aL$BylXms#iMOn)Q$@MQjX5cF%Yd2M?kPvMCFPd;>Awwg(;| z7Xx1%Mh{ZTiu+O6N3!TQcS_vyCbZ_aQK(w4PT%e<17ro2AJ^)*i{0J5(z)_td%rKl zRchv*)71NSblw9Dq_ZR?KLzyu^5dB! z77lJU2aYr>i^*ch4TDlW(-@rj`z~`s3VO;5lfzFv((l}}`vY1(_l&iuB9)cdVnm){ zX8EYIRZT9Mt@2cE+)&r9V}ab;$2{BqJFh|*#$EE+?&{rG(7>DfkV2#P!JLnj66KsJOApUg-57D!Z#WHf@AqNaR4T!NZ281RhcK*`=ejw9##*Yc zQFNLns4vZV{6)HDnY=N5-WBqFEmgWIOs=I|0E*isIU5INOAOWF3Wx!gqc}a~UuDrv z5?d^BBBwzPC(ZU+3^830rtJI#Tn^hYvpm zY)0H1;KM{JarV{cnUgXf&9?5>tebTls3-#WV2i%e9)>;1HD@lvrL3jlP%G}yyMHml zVM(Cg=!8wyND%(E`Qy`;BllsBa#D{zR5Om0%j|ZtJ|sAdGso7Ho8)w+TAIgG4;~bv zi_d}_-d#JsLN%0JUtAA=kE3$;egNSteIR9wpnM%O7j5r?z*iIA5DZN97 z0WGSLhGK~?r|pTebAXF{jYqDBs7kFk7aN&fLhNiDJU!g{Wm)f@n3|B{sFswey+tp6 z2m8wJ7}!2O>A4Qtx#x`%@%o`-6p6-@9cdNwBeYNb7RDQ8#41TcmzJTEOU_%`n*jy= z5w|fKYgnv9#S4c&X4i+P(Jk4#Lp0gD0n6-m;=R$FUUfDL^zfd)T!=FnoyYvly@9F%{}x2lfaatNFm*(I*`lf? z)nyF^9c9bbTOs}{{Wn2DShQ!9qRiKOxZsxbZS-|y@6B&jL9@n9Oe%?nVQ)g%O}BTn zc&VUr6$J)J#u!H5ZLJ=cq|gWkhB?83pI$|owN=5XQPJ^ zW$BRLmo`urH(U>7&B)u(6?wciDSi0(1teeJE05aM%!n6LVP_`6VS{5k1p_hF#y^xQ z^LMBug6%&|=1S@9c*)b0Ati!3X9WPr8{~y-ynSe-$io1Zxxp<9&Y5Do1_|yjk4>0P zxG91nX9g1Ye=5D)q+MGT<7zu3Vx?WlNli-4_6_1M2ii@^hO!c2ph*|Unri5NgNy{# zm?17}LF1GA$0sADi3Lcww&ZQG@E5}Jr|7L8`MlNdIrIL|Zwu2(et$I|OfPu-HE>l$ zVPuI7a=`#{fv`;uBy?(FfS-HXD{ylZ_ph+`)|psqW|fxPQlB=EX&|(xUmhJ3A#kU= zSwxSvIOW!+b1=u?tB_9RAe5t|10)@P(9=S+43pEMI>4YZo}2#A3BzG!4is zwr(Wd@RKUDWDOiSUXd`Eg5p-`@JVFJT|hmEioiPi@^yv)?}&kTxFHI$^!l?4= z-@1X`*-w15z^XzPc(3F9|8#J=J2}}||F@dECh3;~=s&Pd{f*E?L^xMlKSSYfpoy6& zayV>4b_|>v-BdlK+t>}fs1zv({Js#5b9Esx62L|APv$#jZ_9oEFZ?+qmu*pW3Qwnd z4r~}{t_>$f`Qs~V@NW)Zl3-W+&O)uX>VMapt?& zWGCkG8g*3e<5F!UlQ!cAp^Y};@#hP5%MvO0E(w_%a@dOVlj{)7mUHW1C3|Yzj@By) zC=b;oo@=90NAa_9`ISEp4GW5UiL*?_X@O+1SnBZs=3jFg0**y7;klnWgX**2!@sZx z_ifpt9jChDqz&H&~y=@gDH@p z@zTeYy`M6RJ+R$-{#N%YI`TBa1LHpd{QU<>>;GD~xT^m30n9}H$)1S&Cs~Wq-PW!} z=Vo78Q5+dAqzyw@yilp-yzRSeIUw@;$Zi1s$yl~ z-?HHfakJnR;$9MGXggSa6h8fD=UU;` zVhXyHqr8pkpKKp@!w|qA+2>&2VP&z%l)gKpb>cY9t!XX>QT(9Ku1-M-gSYbkn?ci9 zuR9AnaDhVr8yCF)lSS?b98_?#HntOXbp_Uk|G-fH_sdbPs;%um)EFs}o~Uh8p*Ck# zJu2TyT5QphRFKIukWJ7@L0|$h$xK;{n^Zk0O9f^7ilAS?-jsK9?V-(4(HfbWnx23} z+`Y+V5&U(|zgArh}#K?7UA}6VJNhZAK&wNhg;bNmA~pUL@z2_zJuk zIB9el4wU|lNH)dNQEH>DmK7XSz_KcFLpO#`fe(U*(=TC2Z79s&Tw22n@`XRJ1I$K8 zY+HWwv?t&U6o;4fT|0r`4Rnb&E-tQ|;nTdUB*yE-NQIu1U~_z68U?EKiM4xpYlLf) z)5dHdtFUTwV6qeb5?aos!E(m=xs~&F;SDh>JkLD0vvvJunTlUG7|jJH7u_U?$ksM z5S4|qOVSrUEHdRmL#UubtfgtZn4?#O_u$<#aMDJlHEiz5*7>`&=aQ2P>lQy7lZUuJ zN%%Q6G>jPDbxaH1r<}O+zurm4oehs(b_4NA3M!gDbL2>_|eYwA`nYpU^f9)c6jVCzk zI8{q^YirTcUl~fD(Ws@~grL={!J`#ZE-pO!Ey^aR(?96^QPBQ@wz;{qfLTNfJ0F0nzPb_wIp38I!ddd;gH`J5On@g$@VA4levnJYBgA@2XVX5hB1(xhFcfn; zOq~Ut^2}!RiIP*5fgn-}ENpi91G?y8N%Z?+k{O2XA+0Rbj*sk*Gy>{$^D9O2n2=6d z{zS=<0{T4P6)tW>acq=GCl_hea7nJ5h^Ndjjm!Yzu(QP2zIk?~*3q(l@NiT^xJdA? ziw~*138o|-1jJl*o=b!AZo+sfm(A&%I6nH3AzTX|=!I!YSe>Q|En~S_wf4D7y>RHV z%SPlFxIl4hGxd|FZSncMzQQp(F-J9r-Ba}J`~z`$@b=-$>6^ov&2BGQBgc4?;DbOy znrmkQ^iSN8?-$y#mhY!<-SA#~w=YLGla2J<952lyya~)U>)S*KL z*L8iCuCK>}*L}9voY%3zHh%wbMv1j-9b$t7b4$tPKAOyO?8$PSo~+vz3;@L%RKdqV z&X6~RHol)Y48UJwMiQZ2AVO&*gfo%Ci6~`3>8BblVIvp}C8EH>@nC1&ZO@*#+i=15 zVQC$$)Xg(*ue_#<`6@ZJ{%u1|Qz5qu%Vr~IM-2L#nK}E2{SA-x3Ab)yClO_-+>~=W z>L42!7R9*I%Lf7`0DMkvG0heJvb>6%SOv%qPPLWCWwQtDs5hIWezl`%9Y&H$N+Ql- zrt8^1;B41gaS;?Du=_Wqm z%$dVUWVK#)O?Oy}H#W!Y_}0XU&Nmnvg5gGGCDIh4;6{6#JVnZQxSDU_3d6Xw5ad#rn4S&}M>T$YW^U{Za|V9Runkjs*s8 zV0OZyR?b^|OSm(4o4KPpw851-gA`X=7J-*#nLXcxEU6$@QNv4DZfFTxg2q^ASuDLv zI_aULa~GC|oTXKA*_3gj@@{AtW7#~B2YkCBysLT)2{q>ifFJ>#rR6`%I`IOB&a#4l9y(eRU$+tE zznp6W~dglKzXOXug4%m*O9=J z_cXWfud$E!E5bmK(Y|9*!CRM1^~9f0E}1cVq7XlxrTV@cqU&@O7X&37?1hAgZ>V3x zL_2T9?9FqfV=cI(@$MRJaa6_^j1<|sD%ZO$A25K8Hdg6U4^&)eZS28u%Ep&l>AJ7q zv-R{2glq4$e%H;W^p?A{DZ6ksPBGtdpNgi>*yIzPtjczWlkV#t0ZZERSw$Wx2nhNN#Ww`^a`n+Xcu&A;)3~QG;I;hURVQ3rBa|0Y|&iYe- z1vAqWTehQ5U#Z0xC7i3?PUlAk86TVXh31mZ_IX^}dBk65z>PGv@1T!;Rc)JebpPdc z4nd43%wQnJ>9NQ^KPOXm_A)!{Ri9&LXpZH`I@LOwUe&*vvISHLZsU|HJ)MT+OthZ4 ztx+8OT5Q*J&)aIiGyP`V@$eAS$=6V;QM_zy9V1eA!!K#a_=00xB z1DL)Ba-fI#O^n*-(&Pd~%dD<=)^nmSq@SFd_btp_V+;&3lEnEheQxFQR(=&=g`hT` zlS0mCsWN~41G$}aG!SQ+mA9PJ$@E-A{Y&$6*7yg5rwTpY3gDoH6-G$w`Z<4UN0YDNNFIBp zz^p*Yi}R?5jD1CnC>1)|CR6)anTzVezz59ckFMHuC2Uw-Q=4$##>lrY7Cm{-Ef2V2 zdsEAha)&6Np;iP~wZOb`+&n&3Q^vH)-`k@WwJk!oQ(=l@VcQ7bt|uV}+%ol8;8Kq0 z8Kz=n__eTQ9L)%Fmuwk69hL4WjqZMs@Sn8`Pg(N$!;V$(({0*cW0fM7f&1%;Crhu^ zf9X_xB9Ud(AMncUiIA{rjfXCBQ?#JW3pTIg7bW9;!Q<~us)53^jzva!M#!+jBVjYX zfn)&tIG67hZ&l8&5>U_?_M2{V4!=~{tGy3pSW!Zopa39ZnhO zhsw|V(GLU;VNtVNh+X+d2{OSpCd&9MRFI~egKLHhBQL~xVIA18bX(F@(QcPWfia*- zhYHNrcB9!MFBogviyI(5&ctnRih5HlvGCgK%l3qiP=B{M~>03o-m)#M`CQzBdd@q z2?h_OpJ>oux#Z|t2W8x)#WIa83K}K^O0UdwnrehVp;z0-@+Qu+94&fSS^u0pCFFkr z)FX*ty_;Ym4HRIdGSw0R&oDqg&2h{U!2~zY8JX)Vc-ho%9 zZ|ygL#j*;b$9`3pvAeirg$`|dWn+vnGrlSt$9pz;Rc)fuq})QmyQ61}Jp*B>!+SG| zf_z428rIW8wJg2OZjAvN*ILva?~+MQ4@<1IGcs=wnWM~I#b@%G_z-n~FfilrjE(sQ z9blA=z{+Ofmcp10d$uuMc?OUyDXkcewmCB~M2Cb(f-}mz$24=xEU!Frb0$|OlP99c zDM$4c4m>++s!f>fyKGix;lQBx%u|gm=^|0H@MJS^bDuC9H8`G0K1deRj5B>L`jkK) z^KNz~lba7%rCG(vpNGJQ4>ZL?GeC`LDzngvcQ~ZUneYl5VbPhP5S0jxt+Gm;4YR<$ zh#d6_`HrH(l1EH$EHO-XNH)pZ{rXv`Wb>z+36OWEVz)}p3o6m?3Sc&bJf2Ia&-VB&XG--eQI9KO4xN1+Z)!Hs;6W+m9E99#ujmEbu?~+!(oP&;1%mh*2%$N zjeNVL6WAsh2dK!Agjh&+HYkfwGjb5eQ);1Ga;4IgHpliO@HV#i&Dn+i^i#P}Jz(`> zpCC3UU{KIxJRwlf6g`C=zvfR$8sgo8p4z30&uf6HK8HvQ?{9qNH%M*B*LL@0k1)1` z=e(x~#O7Am1)M9Mk*|xM&=!w;kqj#E>hR6pwSHu6fM9NQ z1m@l)(7f?~(*F5>ECl{41Ew@zeAg}TKf9-iB{k|wBs-fcWSgcNQh4+`Y|i z!sq^e4K{Yy?E`ciGrSt%{CFQn|I&4%h^(KvJHd^-ndwlp=?#J@#@5bwbud@GEc zu;Z-oN{p=dd%*7r8ALH!EAE6zU_4*(=D@ngPi}DJ21emoTH%?x$1l4#fFk7At}C)1 zf#L57ObEXy!a(hxtRy`lby~v+!Xn=Uf+lZ4-NACD;Q|avb*StL$pl_NxM7&^@il)tuoR~rAz5)S@jhC z_#U>3m0+_C0$uKeKDRJ*8HwPcAtlVcp2&a&I*?zi)udadmAR$YDkAMsa8JVyHoi>s z1o^mC>3-B#!cm^f6p4jXtd2s8xEgV7K3FtHzAES{c3d4?dB6cYZbTTAyjDE+P|!1%r)l#g`6H$@RPI= zNtJoJ=4MvxY2C(a0cML|?>E_AtmFnk(-SP@_ke~xJ$n=2fO|)+^vvkV3M(0{36@y6 z5Q7=Evr+8teFUYAN$#8VKcqIglQy;}xp6mx2$Jo+SBSPHH;AVpc)rEw zQs8KjRi%6|ukxw_zZ^+no_=4T_%ulN>$mIvR3v*tW0c_v13tTx?N~l{ghAaP4U{#m zk^=eNDNwML>B{A3gbLKE(b&06us#&02~xB+mgc-R$}L)`mB~?^q@*-|&>b(LC1lkJ z`L=M=u30ReRZ^K^xIykv4EjRC44pDmyrlZE3=M|RK{Uzr1{fjUWcuq~j<$cZ+sxxw zl!a~Y^5{FTtILl#fYix8<2zhuej4->UIW4gyb3IWJzazyWxT!ynsKSQSJ2~N?B|%= z7VxNw_UAK=lzwCxTe?rt{$@n^i0+ks=4}N15MEZ6-(s@swT{b>al1)1iA-1A?31^4 z^`ns=A0o>xlT*>jl|~|xPL-B37b)%`wN?#tem+uOC4)mL*wQFdz-Fs$beMpmx-55* zL0TZ5Eq%x6=a7ZJ5kAS&p@41at+tkQU*%Sjk|l0!Otx_{u8AyDo<2g)g*!&T`5hnA zGfghJ1%6Uh@brCm{N8xoDFJ$CFdYSDXsz+911geNZlZeJW&eTQ-m!9vj2EC@yN8Xi zdH|56Qg&hF_f3{3v^?-(7nMcj;R~jIPz)BRP__37wSJfO>MqTg*`_z$<7{u9_%cZb zo9Eq`19y&=Ypv$_(d^LA58=jjUwiF+37BC)M9R2LTASBVA)9&^(mDEKQuhu zd#?q9NZLY}Dj}IBLWX#_Q!1=d<}^WdKo8i&O|UL?2|^eyYSD$P&tzDmA#tcr5RInz z8_35H(p9k2DJJyrE_k2Q3?aO~J=s^U(HZe}&cGKC5Xa|PVeV3md7~(~3dkEKd~(^aKHJwArSGA}KA9;ytGdPRJv?1#8+0la`80 zn8GPyjrfUkrnmqed?B7Q8RfJHS7L&{&k+*2Cs*;wLPhQs3#L@_ODI2=kOHyg8DC{^ zatHR}g~rIQ!C4U0BcoZXN}>bL;!r)?p_BX~CxvND(D4@x2h$;{DKwYZ>gY}I@nOW- zFlSjJ9?S!?$54Nh@z3u|0z@+5%P$@ldM03)2foyVvG9Y%^K5;=MG?1akCe*E!(~(+ zJ?^Mb35NvXt_~I^<~=K4IcE7&xE3S~my}%4m|Azve49S8)31BfkY!wMOVGy57cDG+AbqFZf;w%U~eAmpiKrdB1)#M!hNDR@!l%xTN_D-&NNrdD^~g0KZIpSz?nf z;?`N%6ZqDVHP`-u#;$ux=EwyxUe&z`0`eqOH?$2mOcoh`l&YGhL#9F^XE&!#SFN6y z=Q(&j9C%!<04xGVjPW=#)3V=mG8%_=+uW|uBQKJv5V_Kj=j zW%lwx3g`qBX()PRw9A8Y%8+6U1DHTBy~SDD;X&U&TM5GjL0sp5KeLK0=aT0+bq3(f zExOk&Cnh~}Js7@AXH%pR`=;bMLg3Kt!s_9ceT>p$!!|*u(YrSBG+R*}6Ep>PkMPN1 zI3t$Bbd}R+nXAJ=RFa(E@^&>DsD~N*s3QXo)Wo4%NsEO5H!qr!q)$*Q;`U8omxf(` zp8xiMknrL6J_Zy!p#d=)4F4Y*8-JBBX__yZxXb7tkYw;up_oh*EA2yF;KMR{BlbaD zeJcvi+Ipf=&YkdcSi=NUGqa-rx3M`o`xFZ6wdT04L3zwM@~C-2F}(bg`TS(pSJ%(H zvTgrlNc!PIC$FoXKbKukT@zi7&rgAZZ_q#epDppEC&!$a;|IL-0Cgib@P4fEjyvl- zlU#?uMjviOxGWEb8{M$+PlrD9th&*%`H&pC4K9>x6s>+wu?O7ujfSY%!h{Y^Yy5gGyY}dm?nf;5 zRpPwBrMaBt(!ITQMply1Y}s6o^DjdwLk1<+H64RSKVHj@;FA)tU=!V!d$}yEIiw#X z!)$hr^>xOUHA!iu(S`UA{R94#)P#afISuKc>#lb^dGj+o_KfWoO4r^cRei$Tqym@I zUh$^pA{!lQfQwRojbB?eXk-=3W-FPqk5q zq9JW{22T=2CXHt_4dzondF&w%y?=RxHnkp@MG^Z*L&I;XfA>F2eoob3VMAy3{|o}? zCv3|PH|UL9nc`&Ip)|;vgW;pk7suND#$*XjRT<4~xa|u=r}H7fZJ3-a0;s9OKSNY> z`09#gq;-v zh#WDp_mBG^LqE4)#1v+~<1xC5516^kM{vgfcKcZ{kyiAoCCzUexJLVoeO68XR9xfI z7Z2+O_ReKugd_?{kiO&HU9cw!84#O)>^1vS_L-XXQ9Fa9niroD*9)Q!=Na1oh*1IS z{ds1Ga+X%gfGF#c%ZmTp+T~Pf#H&4lDb%~a3B&$aDRahtP5ZX?6SrN#{zr$1z;SMy z&z;-yG}beG?L^=9>2q%I_MSW#XX>hwQw7sisLio?p$L(Jvvy1=mc8SNHC(3hR|C)ZMEp2?)yb#s znU){9*LicAv)uN$#+sobi+fw`QcE9(BTQOcdo3naK099T0It>$v*_&oYeiu)Evmti z1^h(JOpaVb@TE<&PSWg*$I2e;xCxcDSR~>KYGCfQ4@fv?} zopTq-BUgiYnJQj?(hLFm>=$WUZl%7$zQ`(!7KC&VWpM~mn1yOfOYz6uT!O1wiB)OG zK}$QHCEEUR0OIHe{8`Z}vdu$Hj^`qdGhWZ&BH|yblRJ@U@wZ6kY8fk=JI6kXT74S~ z-*4En48q^;+NXgPgerkq9I(sJ&9XLVX?Q1fzasoNOD= znSy`M4B_YoDCd;bUU*?!I;Hn*2V>qqSCkJD$L__s;Gufu@+hzxoFV^E#+-#7?g!UE zmqXTnfN&+O!CNmdI=#cNt#@H)zU63<;6h|^eA*Cc14NOw)yo#2QKNLRzkTIT0mENW z9Xt{MFwe-be%2YDX~fBd4ZEb)nAS+Vc$Z@a?FQ2IUS^4l@x_r{gjdzDgBRhP)~nGhM7`j!71!H_k5!)Gu|+LCFCDU`*ZA%^!bjvcVcq zDm?=aLucUo?0>MjaQklo`Ckuie;tY8N`JkSr^xcj$5MD`=s?)(Ro8&hKnFNW#JGKP zjrFbW+Hv5_?6ued8i+@^!Wxij!QBBkuck}|1h%(8@JuO(Jfel8i3_iaS{Au}c_Tk3 zCF0>Jzzj6F3LG1C^Bz#*+e?W_hh63-m`@)KvlMcATNu{H!~R$Z+obC>GI;J&v#{uJ zE{Fb;@etp*HkI~4t~MO3AEyAFTiU8DC;3^uB0 z@Kb5~#-BBRD=Sz6wAOoo5hMggQ1pLLRshBK<}MCEe|BLzJNf^DeEzp4>0b`*rE$y- z{Xn6`CwOF^a5S$Dtc}J(B&fKUjB)92a9h^KWgUx}P50EM(oqmDwLu+fRf`@AiNJgI ztH-+sc%uk&0G+79=r4zB_FkNcu*KQ6>u#?J-%%no=f2NTOjL0e8-GiL{MAKVmijvy&{b>pQeBkyEjcaos9@aIktdIN*#X z@td@-ri9|Aet!0>&vC~`JTCR!mMX$=dNjmv7f7ofs?vnj$OEcQ4DMmG`gWYD^g@aN z$!$F;>0)}YhreW-85T7*FHM1~&{Xu5VEW;;7w?IiA9?Y(wj|T99YED)O=8}s2K9Do zr=(FgkM6cBqTYySXxZKSW!^oTKe&9FzyRQCqU@|rY-*6n$Ln}3Uc*@ExP{dyk8-b_ zkZl&qXDzz_sElg?GhTSIM@+|-<&h-KMj?59DG4?^C&&?;s6OzfR==_`#(JJL;;V%= znpTe)8^sTNiX_VAw5$Z$@4|N!MQpd32ouioq#9!T6;? z<(K@2v&fh_ymUA&*BpMWKAO)g(CZGhE+=pG*kK7IfS=#-FgSGy68%}b5VMn1p;RWq zZN*)oaZ=?R(ym|sv5LoQs^rByUG<_-UZHH(?=|%^leWrumy<*EUCM<+kA6PsYLDyT zGl-;TC^j5ExTejY7Q*3&un6cABfAgiYGu~J8D=*pC@BpW^pkdSJmK)E(5oQKMn&F- z(VLTw`=Oi z*|XVKdH3^CXo%s)u7K0xM;XI^`4k()60}-*evS(z`kb$UDBn`j1ZD|2kCu!AqYz1%C!x7?!rPR?l;EMjk%7Q~5Ub!frkEMA;96J`D-|rNq{04R zJeN`d?=7aD_&GpDZ;ay3s3k<1PKs>4JbD8`X22m?j%T%8SS~ZqSg(C7`;P`jws0l zKce2P$w!FXOsSTmb|Y}}5peSXf=(D~gdjjR9iZj(A_Y!3G(z&sC4k&V%|~NF_D&{1 zZjp~M;OuKgWmMxNPYdwjl-kOgQZd)#4p=Hg)1$zgWK4Q04=`y!1 zOL3JY#b$9ZujpypYu5mbzS${0Jn5G0ut9S`{Ry8T7)S$RwyD3%Y86)aiA?u|uT2r? zdaB0HD$O=ZZr6>d)LIYeOqR&P1edH9|6Upc?u-~&RGC>59ty3>ktFt+52jX{a&+7~ zE<+17i_)hyF&6-d=*(T)qTi$L%p?2m)JuCeOQ{Fh-%#DkF$?eKfQEwXOW7o^Xd!er z9CVwPQT7+^C{SVI)P5Fvp6=9KC(;^9%nnMNFwRgY(*_BtBVQ+3Ku3|*UHgCsHRq2V;v@rT}*Ft zA}u$atzuttHH#YHzOl(PIW{XZ)6$4D$$h7&!j}}JQcXXlWBf&A=ZU{N=IjDFRJQ3$ zHRIYP9n5h-TbqSP0ABi)d-dDN9_)G4kiruCOG|D>8iY2*iZ6Wd{qPiqHs_4_eV0Xl z+41}*;q3CV8|&2mTG-z8A`g{=EaYkKa;0ad$Ay{K{Sgw)ikJR#Od=+UMUz-dSEsGV zn3%NYLH4aPYXynnXu3Hahi>|;=pHvebz#PpO7doEM0JcibCxvPO|*Fm_4xG0#;s4& z@4`al0UQk@a^hGXt>N11Mu5Ubsc{4r#~uSj8tUpf!Y7M{v%-M4o|3cjfai5;v@8%3 z$BNSvb49J?lcw1WxZ2Z}7}avMeg?^#H!5@#dpIBeN#nHGY2!t}Xmvay0P(G^(42Z= zIR^&!Q)wXPISG()9TH7w>xC_-e4`34I6zAiP`iWqTpDd??S)=v{mdRv+$Sz0ipTe^ z+g-Nni4%|@SpHlL5Zw9YcD(YYm%>uhzGL(UM!}oB6lD_YU=7ej`4Wn66fWwhLK^_mU0}!f^23Xwg*FM&FEe{`~{3U zyS_N8c^l`(5n?ti!&5Mc0KY_ZPsFI?r(Y1!FLBEXYb3FjP(?SUk1uZ9P_yde->|}-|&@` zFDpS?G!%f}sbjY^e}aC2j*E;d(VRZsytODiY2-AZ#}?4< zq`&RlwvFJcLpy@egw5o@SvPo1z+H3^f08yW{%#d+-6N&AMxS!58rjRsd~3bQ?Le4? zAC+`|N-?ufddtq90xkkkQF z>UbrkvQxSvgw~WZ4=7#+X=K~&!iCmA8#e*_(k_C~^imRS3>kOLQQmLw%%j0E2u$P^ z=2#j* z)6`4*h~?@S;Aw)tGnqoOMljnVg+GLcW*BnIYMVC?!LH5E2lniD=T+ghZ;j{1H9O)y zaY)0(Z8+|`eqD=dj=k5N75+9YM&D}OCDuMH*-jCsG}(ykLt6}eb?6w8a1HAHm6yXC z+VY4f_JD|vKw^vQkg7hVg}EUDs5##j+9t!@`*0)-mF&8l1L+ULI+A#MixBY6JeOdJIM)T z?v<-aZVjSL)N#TyvsOf3XA`y4!c7GoLqt(t6nN@I7nK&Y~7^zEYMccDL zKB+=1ZRbWS{msI$N9XoeYXkkzvNNv0G6A7(%fwsC5f#&4nqJHEuRw;Kfp!x30)q(K z%J?XD!8tJXAl#@%q1Z;eWGi1pA@wjh+o5>-2z#66rq_qRa}idOfqsatX8EG4^B55h+V`NnGdudSUdWB%aqXz z-@n6n$r1mKX|_R*=zL@h*mu6<6Op4V0i=nQH)h-Q1*l+-t%8hE-#ubh6gs&Joq8ZW zuq?o8<(~#+8OxN5g7yEMGvdB!0&jxe;@6zvIGb8^TzOK=<)&(})10=tK zTEm46fiw+%l@}UCj%SvR4V5LLU^ALCO4%*34rBYtH4r%+YqwVxm(p3YUiRnm@^bh8 z;_RK`J6pGH(F!ZJZKq<}wr$(4m=)VjDo(|=ZQHhe|MRSM*1mK8_P+Pr`!HUTr)2ce zzW%k|TWddT0Shf~4|DT5>AzoaKX7ffyv&%fg0zhq@SV*LH=VYeCcToq9(uYyZ}I#< z+{vR&F^Yvq!Rg%0+}v0& zc$0-J88#z`LF>lsM6tWJdhwEnObykb>mk^s7(N@~WIZdw=%IOTO6Owhh3}O=Yr^QE zBW)q{v4KrCq0G}puQqlXTXKL!Dg9}5cz&@eea1CkU9&3nH`oj!{Y%(TRe7mUl z>fAG*Rqtx6Qg@F!;mjzysW1&#S)_;^51T5+j2tI@a#jgGfh0-~A5?;0UD7d5t%vXL~TsNT<2q~IGt zzbVe&=7|AW8K~8jXh~ftND2*S@-paG)GQr z0Ts!w&AH191^P=_Ho1j5_wh4fd@euAD>*$k>y4gSyIj0zx@s+BVZnAbJC&eLWiB$2 zogGS^E>%@?6Ssd1I_y%apHxz{s~{^I9YL!m>*AJ4(pi~HIEmKD3XoJQAnZ3h$jWA) zdJ*zJj`vzP%Iq9t5)zMA^ycT^u}KiFji?tA8FIa-fHBnRV?2&iYm;2Cm~qoiprSfg zpheZk98~U^5Lz0BH9AlBSmvYkxfwoJ1&q*!eF@c(Ce#Hls0c05fW5LJ8IW{K>UJ~B1d`%>@J=d7Jhi@sRll7iq7Y1bHs3UB-}9o1cNZTBG!!@Rh1pWO0nt`v2*8in5o35)ACS9NDmG&Yp17qj zIVdqPSroQ}TChOn>x+-b*^3AeyX5Hu9i&r!N9t0%vC=LIJh*2HEi3tk+SOx+%B?oA zhzH&`j621Jj0F#Gnrkim^Sj!#4;zq+A`aJW$&59s5r*0gu&y$|R9km|{5n5i=OVO+ zzL>?Kh{Cjnl)bGnN?di+7uB~LUxho6Z@^w>Kr5gSSpdwWFFA-ktdwdj^DbP>zcA`5s2_pv>`mVv-4c0Vv5X_!@G*#e;T6}bukoU3z zR#(P)MQAQ!-yG44(Q2H|c!BWiprNZ+Xt^z@-8H2KoGt~{X0;SNgcN#hR2thg)m+xC z6+ZQ^SgXTiezm4yFV!#1bQ3aQ+_$(tQBNdJCOBK5C$ZW&);)LStx4`;fcsk2Hyuazzf2s17Hb-W9!a9Id{v-@qF!*IlZd!rraSbwwYym88j%Zi!ff zG!Sz8Lc82GA>?$03zvP7&7XBPJUC7Xl@x`Tu98=*U+iu}WXGyLivLQDzBd)tq_kH0 zz%-aqm=tEeGx!v}ArUi}L*xzKkQs49SnY-bOF{glEkfcg<4HhM5{G0_s^L<^^AlyJ zo2PJyf_Cu~Owk?WfpA^4?}0Hf5Gc_T|9}$bPJXj6^V&u}R-o`&hFSLaE1P|en4)C2 zn70+%GzxeZ5g?;E(G$;1I0PgU_B9T-A2hpIHK~TPKAg#|Snjot_fq5ve;t3%DZh^R zNsSpl+8IVfs~}5_o@CrQ$`h}tqTs<^#%tou{J1r;pZ45X`sz!|tB_?i&Z;`C14E_i z^DXdEJUq1n1_>ix6a0V|X;nz_DIs2n**?f=k6DoYnt9=g-X^C9MM84A!2&0xlzWGZ z#UFE$^7cZbGkAYZ>;@;Q+5~ER7c?O^6^iSHE1aVWR=g!P(N4Uoz=mps#OBCOZDhJx z8;#1WP{8(*&3&{$8^8B1h?}Yaw|9vCYN3a6@;31)RXbM@@fT}eff46}o3PT7U7pis zl#!YQAk=OUS(r=Wo7h#Nb>w;Cz3D(UUht6X~w_X782}R?78ZnXr88;ruBdn@u#tS=Du$xAZX5SXwF_}B%FtV3$s`?2^Jg zT11$pDXU90(b=~|8gSDY*D55&I7u=yV=sS@@vNN`b0ZQH9~2;el78Dd?_*Q*Tk?K( zfbWb`{bIA`^4mBzVzcdm3kTTH-+|`@OrRn9HnGS)NWscE>r$7W)D;>;DRAJ23D#(l zFWZP2H`x+>)=GaF%CuR1)UKU$s->7mg_>TP@6YkbjIbc57N2WNrs;)CGfbN!J^Ha16Q`c3*u-ArL6 zJKlg$bIJF2;)$j4U{4vKT@V70Pm=#%$maiW$`+m`#sK-MiQ`{U>LQMgc8>p>VAj$C z2pM!jgQSr{q?Gtq4Y8HYA@WKWwV;(1eQ_&xn;^1YDxc$i#i_W^%Uau8ZKG z1(iPTzd!G0@QLY|A^iyMsfIs%V`MVBa$3~&%IcVU*}KyF`Td$TJBXoLpD=QOLbq>7 zVSPvuMaZ2XG)H)b5dSGI$`F%!wy{i~778`Tb%)SVM}3I+WjVHUX!a(}+x-_Ss&#Np z<+c-;9>hIItBv^r?1n4Mn0Gxh9RVJM^OQ#Mo@H@co(i@nxh5YWLOQE-Uk5dP!mw(+ z4z13@xT0r=wbqv9OBt_AZ>p0`AB~Jn4t?bz^=mX2OD7>hW*t;3zuhAJLy{k;t`;kf|3HOF%4`xiW#K~yXX%pj+(MZ}Q-xMz9+yR*v&&kciA-HX z`lSC&mhLdS^qffmbfe9R63m&UtArc+qw9TZJv7X7F);$E_zG18g0v%70v>7Un7pyu z47p0{137G^cVi6F!7R{n8 zJZ388{dqW_@&Za*PHEFs6_8}i$6d)xw^4=);5eKhPE&W{f6$6Pkujv|&8wRD0_o6u z=3Wg5NqmfCb5QqwC?N4}A4x~;N5+@7z-BNk>Z*|G(deDD;$DrN6))s>r|Qu@)1vGn zPiVk;iRm#He!KaiILAivyN%%tS1`+*@Zk*M7o(~oipqfMRK7vAEo+XbRxuwgPvw{F ziH-nv<~YK&4g7i>5fK3+MK!^IqN3^)P#K_|SN0ClKqaF=bs4WE_imNk?rpSc__ik! zWr6CBH1UOBNo)VYzTFpcf^;C9@RT(fYKThPR;-Y=-_rK;R66#z+H)))HTzDRgU=9H zLXFJ@Z(A~7h@w)_^EaEC9}h^z)E3X=(q8_u+6 zt>4J(yiN6OHFhsb>h9geM?ff$zeC^?+@4cN4hw~OAcC(U!V{OI_QSsV z#`?^QW>^%6#3RcHXB@Bcfw8y)Q}t5w?g)r*8*=*?x6P2}eeP@NHmB+3+471#-S$J@ zLsUq2@>h4qG*8Cx`g8Tn7wIFT!y$NiA4e3%J3i0x`4++1D=0#^qYPqvQ>Kw7^}OM9 zJD?KMF*;_?a0P8jTVt+EK-n_6W`8sim6-hpzbBQw*(x^M;-E?o6@5_gcz5b*O#rVvx)r9v0?BRrD0)g#Pz6;?Z z?Ga6kJH595(nH|z6YTHUH7iKV2?v-VE&?9*{{!rD`nQvW6Ww1)T_(nIw*Nw^Bn2Kh zL4ZM~&^2X5esFk_sxUU4=CXM~I2j4WzCWw#kWt{1<9b}1m+)75Fu>Q#Wc>&|3bJN- zgVNNDtj+FP|FVvMP8&y1W zaF@n!Q!L$MdISyDyOa)pOTN?;YnJvQo2GzeGNkwco`$K{06cCD4)J
)~g(KTiJJ6 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

1K)y}n(v@%k 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 z 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

9v=>wXQ_?o9X8741CK~dn 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

  • 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%0AXlDr#taxuZX;!Sx>UK)WaPev5S%Z%*P@hL>O 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 literal 0 HcmV?d00001 diff --git a/modules/java/java_test/src/org/opencv/test/OpenCVTestCase.java b/modules/java/java_test/src/org/opencv/test/OpenCVTestCase.java new file mode 100644 index 0000000000..75e240da30 --- /dev/null +++ b/modules/java/java_test/src/org/opencv/test/OpenCVTestCase.java @@ -0,0 +1,495 @@ +// TODO: This file is largely a duplicate of the one in android_test. + +package org.opencv.test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.charset.Charset; +import java.util.List; + +import junit.framework.TestCase; + +import org.opencv.core.Core; +import org.opencv.core.CvType; +import org.opencv.core.Mat; +import org.opencv.core.Point; +import org.opencv.core.Point3; +import org.opencv.core.Rect; +import org.opencv.core.Scalar; +import org.opencv.core.Size; +import org.opencv.features2d.DMatch; +import org.opencv.features2d.KeyPoint; +import org.opencv.highgui.Highgui; + +public class OpenCVTestCase extends TestCase { + //change to 'true' to unblock fail on fail("Not yet implemented") + public static final boolean passNYI = true; + + protected static boolean isTestCaseEnabled = true; + + protected static final int matSize = 10; + protected static final double EPS = 0.001; + protected static final double weakEPS = 0.5; + + private static final String TAG = "OpenCVTestCase"; + + protected Mat dst; + protected Mat truth; + + protected Scalar colorBlack; + protected Scalar colorWhite; + + // Naming notation: _[depth]_[dimensions]_value + // examples: gray0 - single channel 8U 2d Mat filled with 0 + // grayRnd - single channel 8U 2d Mat filled with random numbers + // gray0_32f_1d + + // TODO: OpenCVTestCase refactorings + // - rename matrices + // - create methods gray0() and create src1 explicitly + // - create some masks + // - use truth member everywhere - remove truth from base class - each test + // fixture should use own truth filed + + protected Mat gray0; + protected Mat gray1; + protected Mat gray2; + protected Mat gray3; + protected Mat gray9; + protected Mat gray127; + protected Mat gray128; + protected Mat gray255; + protected Mat grayRnd; + + protected Mat gray_16u_256; + protected Mat gray_16s_1024; + + protected Mat gray0_32f; + protected Mat gray1_32f; + protected Mat gray3_32f; + protected Mat gray9_32f; + protected Mat gray255_32f; + protected Mat grayE_32f; + protected Mat grayRnd_32f; + + protected Mat gray0_32f_1d; + + protected Mat gray0_64f; + protected Mat gray0_64f_1d; + + protected Mat rgba0; + protected Mat rgba128; + + protected Mat rgbLena; + protected Mat grayChess; + + protected Mat v1; + protected Mat v2; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + try { + System.loadLibrary("opencv_java"); + } catch (SecurityException e) { + System.out.println(e.toString()); + System.exit(-1); + } catch (UnsatisfiedLinkError e) { + System.out.println(e.toString()); + System.exit(-1); + } + + String pwd; + try { + pwd = new File(".").getCanonicalPath() + File.separator; + } catch (IOException e) { + System.out.println(e); + return; + } + + OpenCVTestRunner.LENA_PATH = pwd + "res/drawable/lena.jpg"; + OpenCVTestRunner.CHESS_PATH = pwd + "res/drawable/chessboard.jpg"; + OpenCVTestRunner.LBPCASCADE_FRONTALFACE_PATH = pwd + "res/raw/lbpcascade_frontalface.xml"; + + assert(new File(OpenCVTestRunner.LENA_PATH).exists()); + assert(new File(OpenCVTestRunner.CHESS_PATH).exists()); + assert(new File(OpenCVTestRunner.LBPCASCADE_FRONTALFACE_PATH).exists()); + + dst = new Mat(); + assertTrue(dst.empty()); + truth = null; + + colorBlack = new Scalar(0); + colorWhite = new Scalar(255, 255, 255); + + gray0 = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(0)); + gray1 = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(1)); + gray2 = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(2)); + gray3 = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(3)); + gray9 = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(9)); + gray127 = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(127)); + gray128 = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(128)); + gray255 = new Mat(matSize, matSize, CvType.CV_8U, new Scalar(255)); + + grayRnd = new Mat(matSize, matSize, CvType.CV_8U); + Core.randu(grayRnd, 0, 256); + + gray_16u_256 = new Mat(matSize, matSize, CvType.CV_16U, new Scalar(256)); + gray_16s_1024 = new Mat(matSize, matSize, CvType.CV_16S, new Scalar(1024)); + + gray0_32f = new Mat(matSize, matSize, CvType.CV_32F, new Scalar(0.0)); + gray1_32f = new Mat(matSize, matSize, CvType.CV_32F, new Scalar(1.0)); + gray3_32f = new Mat(matSize, matSize, CvType.CV_32F, new Scalar(3.0)); + gray9_32f = new Mat(matSize, matSize, CvType.CV_32F, new Scalar(9.0)); + gray255_32f = new Mat(matSize, matSize, CvType.CV_32F, new Scalar(255.0)); + grayE_32f = new Mat(matSize, matSize, CvType.CV_32F); + grayE_32f = Mat.eye(matSize, matSize, CvType.CV_32FC1); + grayRnd_32f = new Mat(matSize, matSize, CvType.CV_32F); + Core.randu(grayRnd_32f, 0, 256); + + gray0_64f = new Mat(matSize, matSize, CvType.CV_64F, new Scalar(0.0)); + + gray0_32f_1d = new Mat(1, matSize, CvType.CV_32F, new Scalar(0.0)); + gray0_64f_1d = new Mat(1, matSize, CvType.CV_64F, new Scalar(0.0)); + + rgba0 = new Mat(matSize, matSize, CvType.CV_8UC4, Scalar.all(0)); + rgba128 = new Mat(matSize, matSize, CvType.CV_8UC4, Scalar.all(128)); + + rgbLena = Highgui.imread(OpenCVTestRunner.LENA_PATH); + grayChess = Highgui.imread(OpenCVTestRunner.CHESS_PATH, 0); + + v1 = new Mat(1, 3, CvType.CV_32F); + v1.put(0, 0, 1.0, 3.0, 2.0); + v2 = new Mat(1, 3, CvType.CV_32F); + v2.put(0, 0, 2.0, 1.0, 3.0); + } + + @Override + protected void tearDown() throws Exception { + + gray0.release(); + gray1.release(); + gray2.release(); + gray3.release(); + gray9.release(); + gray127.release(); + gray128.release(); + gray255.release(); + gray_16u_256.release(); + gray_16s_1024.release(); + grayRnd.release(); + gray0_32f.release(); + gray1_32f.release(); + gray3_32f.release(); + gray9_32f.release(); + gray255_32f.release(); + grayE_32f.release(); + grayE_32f.release(); + grayRnd_32f.release(); + gray0_32f_1d.release(); + gray0_64f.release(); + gray0_64f_1d.release(); + rgba0.release(); + rgba128.release(); + rgbLena.release(); + grayChess.release(); + v1.release(); + v2.release(); + + super.tearDown(); + } + + @Override + protected void runTest() throws Throwable { + // Do nothing if the precondition does not hold. + if (isTestCaseEnabled) { + super.runTest(); + } else { + OpenCVTestRunner.Log(TAG + " :: " + "Test case \"" + this.getClass().getName() + "\" disabled!"); + } + } + + protected Mat getMat(int type, double... vals) + { + return new Mat(matSize, matSize, type, new Scalar(vals)); + } + + protected Mat makeMask(Mat m, double... vals) + { + m.submat(0, m.rows(), 0, m.cols() / 2).setTo(new Scalar(vals)); + return m; + } + + public static void fail(String msg) { + if(msg == "Not yet implemented" && passNYI) + return; + TestCase.fail(msg); + } + + public static void assertListEquals(List list1, List list2) { + if (list1.size() != list2.size()) { + throw new UnsupportedOperationException(); + } + + if (!list1.isEmpty()) + { + if (list1.get(0) instanceof Float || list1.get(0) instanceof Double) + throw new UnsupportedOperationException(); + } + + for (int i = 0; i < list1.size(); i++) + assertEquals(list1.get(i), list2.get(i)); + } + + public static void assertListEquals(List list1, List list2, double epsilon) { + if (list1.size() != list2.size()) { + throw new UnsupportedOperationException(); + } + + for (int i = 0; i < list1.size(); i++) + assertTrue(Math.abs(list1.get(i).doubleValue() - list2.get(i).doubleValue()) <= epsilon); + } + + public static void assertArrayEquals(E[] ar1, E[] ar2, double epsilon) { + if (ar1.length != ar2.length) { + fail("Arrays have different sizes."); + } + + for (int i = 0; i < ar1.length; i++) + assertEquals(ar1[i].doubleValue(), ar2[i].doubleValue(), epsilon); + //assertTrue(Math.abs(ar1[i].doubleValue() - ar2[i].doubleValue()) <= epsilon); + } + + public static void assertArrayEquals(double[] ar1, double[] ar2, double epsilon) { + if (ar1.length != ar2.length) { + fail("Arrays have different sizes."); + } + + for (int i = 0; i < ar1.length; i++) + assertEquals(ar1[i], ar2[i], epsilon); + //assertTrue(Math.abs(ar1[i].doubleValue() - ar2[i].doubleValue()) <= epsilon); + } + + public static void assertListMatEquals(List list1, List list2, double epsilon) { + if (list1.size() != list2.size()) { + throw new UnsupportedOperationException(); + } + + for (int i = 0; i < list1.size(); i++) + assertMatEqual(list1.get(i), list2.get(i), epsilon); + } + + public static void assertListPointEquals(List list1, List list2, double epsilon) { + if (list1.size() != list2.size()) { + throw new UnsupportedOperationException(); + } + + for (int i = 0; i < list1.size(); i++) + assertPointEquals(list1.get(i), list2.get(i), epsilon); + } + + public static void assertArrayPointsEquals(Point[] vp1, Point[] vp2, double epsilon) { + if (vp1.length != vp2.length) { + fail("Arrays have different sizes."); + } + + for (int i = 0; i < vp1.length; i++) + assertPointEquals(vp1[i], vp2[i], epsilon); + } + public static void assertListPoint3Equals(List list1, List list2, double epsilon) { + if (list1.size() != list2.size()) { + throw new UnsupportedOperationException(); + } + + for (int i = 0; i < list1.size(); i++) + assertPoint3Equals(list1.get(i), list2.get(i), epsilon); + } + + public static void assertListRectEquals(List list1, List list2) { + if (list1.size() != list2.size()) { + throw new UnsupportedOperationException(); + } + + for (int i = 0; i < list1.size(); i++) + assertRectEquals(list1.get(i), list2.get(i)); + } + + public static void assertRectEquals(Rect expected, Rect actual) { + String msg = "expected:<" + expected + "> but was:<" + actual + ">"; + assertEquals(msg, expected.x, actual.x); + assertEquals(msg, expected.y, actual.y); + assertEquals(msg, expected.width, actual.width); + assertEquals(msg, expected.height, actual.height); + } + + public static void assertMatEqual(Mat m1, Mat m2) { + compareMats(m1, m2, true); + } + + public static void assertMatNotEqual(Mat m1, Mat m2) { + compareMats(m1, m2, false); + } + + public static void assertMatEqual(Mat expected, Mat actual, double eps) { + compareMats(expected, actual, eps, true); + } + + public static void assertMatNotEqual(Mat expected, Mat actual, double eps) { + compareMats(expected, actual, eps, false); + } + + public static void assertKeyPointEqual(KeyPoint expected, KeyPoint actual, double eps) { + String msg = "expected:<" + expected + "> but was:<" + actual + ">"; + assertTrue(msg, Math.hypot(expected.pt.x - actual.pt.x, expected.pt.y - actual.pt.y) < eps); + assertTrue(msg, Math.abs(expected.size - actual.size) < eps); + assertTrue(msg, Math.abs(expected.angle - actual.angle) < eps); + assertTrue(msg, Math.abs(expected.response - actual.response) < eps); + assertEquals(msg, expected.octave, actual.octave); + assertEquals(msg, expected.class_id, actual.class_id); + } + + public static void assertListKeyPointEquals(List expected, List actual, double epsilon) { + assertEquals(expected.size(), actual.size()); + for (int i = 0; i < expected.size(); i++) + assertKeyPointEqual(expected.get(i), actual.get(i), epsilon); + } + + public static void assertDMatchEqual(DMatch expected, DMatch actual, double eps) { + String msg = "expected:<" + expected + "> but was:<" + actual + ">"; + assertEquals(msg, expected.queryIdx, actual.queryIdx); + assertEquals(msg, expected.trainIdx, actual.trainIdx); + assertEquals(msg, expected.imgIdx, actual.imgIdx); + assertTrue(msg, Math.abs(expected.distance - actual.distance) < eps); + } + + public static void assertScalarEqual(Scalar expected, Scalar actual, double eps) { + String msg = "expected:<" + expected + "> but was:<" + actual + ">"; + assertTrue(msg, Math.abs(expected.val[0] - actual.val[0]) < eps); + assertTrue(msg, Math.abs(expected.val[1] - actual.val[1]) < eps); + assertTrue(msg, Math.abs(expected.val[2] - actual.val[2]) < eps); + assertTrue(msg, Math.abs(expected.val[3] - actual.val[3]) < eps); + } + + public static void assertArrayDMatchEquals(DMatch[] expected, DMatch[] actual, double epsilon) { + assertEquals(expected.length, actual.length); + for (int i = 0; i < expected.length; i++) + assertDMatchEqual(expected[i], actual[i], epsilon); + } + + public static void assertListDMatchEquals(List expected, List actual, double epsilon) { + DMatch expectedArray[] = expected.toArray(new DMatch[0]); + DMatch actualArray[] = actual.toArray(new DMatch[0]); + assertArrayDMatchEquals(expectedArray, actualArray, epsilon); + } + + public static void assertPointEquals(Point expected, Point actual, double eps) { + String msg = "expected:<" + expected + "> but was:<" + actual + ">"; + assertEquals(msg, expected.x, actual.x, eps); + assertEquals(msg, expected.y, actual.y, eps); + } + + public static void assertSizeEquals(Size expected, Size actual, double eps) { + String msg = "expected:<" + expected + "> but was:<" + actual + ">"; + assertEquals(msg, expected.width, actual.width, eps); + assertEquals(msg, expected.height, actual.height, eps); + } + + public static void assertPoint3Equals(Point3 expected, Point3 actual, double eps) { + String msg = "expected:<" + expected + "> but was:<" + actual + ">"; + assertEquals(msg, expected.x, actual.x, eps); + assertEquals(msg, expected.y, actual.y, eps); + assertEquals(msg, expected.z, actual.z, eps); + } + + static private void compareMats(Mat expected, Mat actual, boolean isEqualityMeasured) { + if (expected.type() != actual.type() || expected.cols() != actual.cols() || expected.rows() != actual.rows()) { + throw new UnsupportedOperationException("Can not compare " + expected + " and " + actual); + } + + if (expected.depth() == CvType.CV_32F || expected.depth() == CvType.CV_64F) { + if (isEqualityMeasured) + throw new UnsupportedOperationException( + "Floating-point Mats must not be checked for exact match. Use assertMatEqual(Mat expected, Mat actual, double eps) instead."); + else + throw new UnsupportedOperationException( + "Floating-point Mats must not be checked for exact match. Use assertMatNotEqual(Mat expected, Mat actual, double eps) instead."); + } + + Mat diff = new Mat(); + Core.absdiff(expected, actual, diff); + Mat reshaped = diff.reshape(1); + int mistakes = Core.countNonZero(reshaped); + + reshaped.release(); + diff.release(); + + if (isEqualityMeasured) + assertTrue("Mats are different in " + mistakes + " points", 0 == mistakes); + else + assertFalse("Mats are equal", 0 == mistakes); + } + + static private void compareMats(Mat expected, Mat actual, double eps, boolean isEqualityMeasured) { + if (expected.type() != actual.type() || expected.cols() != actual.cols() || expected.rows() != actual.rows()) { + throw new UnsupportedOperationException("Can not compare " + expected + " and " + actual); + } + + Mat diff = new Mat(); + Core.absdiff(expected, actual, diff); + double maxDiff = Core.norm(diff, Core.NORM_INF); + + if (isEqualityMeasured) + assertTrue("Max difference between expected and actiual Mats is "+ maxDiff + ", that bigger than " + eps, + Core.checkRange(diff, true, 0.0, eps)); + else + assertFalse("Max difference between expected and actiual Mats is "+ maxDiff + ", that less than " + eps, + Core.checkRange(diff, true, 0.0, eps)); + } + + protected static String readFile(String path) { + FileInputStream stream = null; + try { + stream = new FileInputStream(new File(path)); + FileChannel fc = stream.getChannel(); + MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, + fc.size()); + return Charset.defaultCharset().decode(bb).toString(); + } catch (IOException e) { + OpenCVTestRunner.Log("Failed to read file \"" + path + + "\". Exception is thrown: " + e); + return null; + } finally { + if (stream != null) + try { + stream.close(); + } catch (IOException e) { + OpenCVTestRunner.Log("Exception is thrown: " + e); + } + } + } + + protected static void writeFile(String path, String content) { + FileOutputStream stream = null; + try { + stream = new FileOutputStream(new File(path)); + FileChannel fc = stream.getChannel(); + fc.write(Charset.defaultCharset().encode(content)); + } catch (IOException e) { + OpenCVTestRunner.Log("Failed to write file \"" + path + + "\". Exception is thrown: " + e); + } finally { + if (stream != null) + try { + stream.close(); + } catch (IOException e) { + OpenCVTestRunner.Log("Exception is thrown: " + e); + } + } + } + +} diff --git a/modules/java/java_test/src/org/opencv/test/OpenCVTestRunner.java b/modules/java/java_test/src/org/opencv/test/OpenCVTestRunner.java new file mode 100644 index 0000000000..4d05304a11 --- /dev/null +++ b/modules/java/java_test/src/org/opencv/test/OpenCVTestRunner.java @@ -0,0 +1,44 @@ +package org.opencv.test; + +import java.io.File; +import java.io.IOException; +import junit.framework.Assert; + +import org.opencv.core.Mat; + +public class OpenCVTestRunner { + public static String LENA_PATH = ""; + public static String CHESS_PATH = ""; + public static String LBPCASCADE_FRONTALFACE_PATH = ""; + + private static String TAG = "opencv_test_java"; + + + public static String getTempFileName(String extension) + { + if (!extension.startsWith(".")) + extension = "." + extension; + try { + File tmp = File.createTempFile("OpenCV", extension); + String path = tmp.getAbsolutePath(); + tmp.delete(); + return path; + } catch (IOException e) { + Log("Failed to get temp file name. Exception is thrown: " + e); + } + return null; + } + + static public void Log(String message) { + System.out.println(TAG + " :: " + message); + } + + static public void Log(Mat m) { + System.out.println(TAG + " :: " + m + "\n " + m.dump()); + } + + public static String getOutputFileName(String name) + { + return getTempFileName(name); + } +} From c49b1bc6d5adbe54c57d24d29a139c0ae02991f0 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Fri, 28 Dec 2012 17:03:35 +0400 Subject: [PATCH 2/8] partial fix for failing tests; fix for Windows launcher script; more quiet output --- .../org/opencv/test/core/TermCriteriaTest.java | 2 +- .../features2d/BRIEFDescriptorExtractorTest.java | 3 +-- .../BruteForceDescriptorMatcherTest.java | 3 +-- .../BruteForceHammingDescriptorMatcherTest.java | 2 +- ...ruteForceHammingLUTDescriptorMatcherTest.java | 2 +- .../BruteForceL1DescriptorMatcherTest.java | 2 +- .../BruteForceSL2DescriptorMatcherTest.java | 3 +-- .../test/features2d/FASTFeatureDetectorTest.java | 4 +--- .../FlannBasedDescriptorMatcherTest.java | 4 +--- .../features2d/ORBDescriptorExtractorTest.java | 3 +-- .../features2d/SIFTDescriptorExtractorTest.java | 3 +-- .../test/features2d/STARFeatureDetectorTest.java | 16 +--------------- .../features2d/SURFDescriptorExtractorTest.java | 3 +-- .../test/features2d/SURFFeatureDetectorTest.java | 5 +---- modules/java/java_test/CMakeLists.txt | 4 ++-- modules/java/java_test/build.xml | 14 +------------- 16 files changed, 17 insertions(+), 56 deletions(-) diff --git a/modules/java/android_test/src/org/opencv/test/core/TermCriteriaTest.java b/modules/java/android_test/src/org/opencv/test/core/TermCriteriaTest.java index 656d76162c..523a39d0ac 100644 --- a/modules/java/android_test/src/org/opencv/test/core/TermCriteriaTest.java +++ b/modules/java/android_test/src/org/opencv/test/core/TermCriteriaTest.java @@ -77,7 +77,7 @@ public class TermCriteriaTest extends OpenCVTestCase { public void testToString() { String actual = tc2.toString(); - String expected = "{ type: 2, maxCount: 4, epsilon: 0.001}"; + String expected = "{ type: 2, maxCount: 4, epsilon: " + EPS + "}"; assertEquals(expected, actual); } diff --git a/modules/java/android_test/src/org/opencv/test/features2d/BRIEFDescriptorExtractorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/BRIEFDescriptorExtractorTest.java index 9ac6cd42ae..4fdaa2db62 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/BRIEFDescriptorExtractorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/BRIEFDescriptorExtractorTest.java @@ -26,10 +26,9 @@ public class BRIEFDescriptorExtractorTest extends OpenCVTestCase { @Override protected void setUp() throws Exception { + super.setUp(); extractor = DescriptorExtractor.create(DescriptorExtractor.BRIEF); matSize = 100; - - super.setUp(); } public void testComputeListOfMatListOfListOfKeyPointListOfMat() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java index fcc389fd77..28e07b1b29 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceDescriptorMatcherTest.java @@ -80,6 +80,7 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase { } protected void setUp() throws Exception { + super.setUp(); matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE); matSize = 100; @@ -90,8 +91,6 @@ public class BruteForceDescriptorMatcherTest extends OpenCVTestCase { new DMatch(3, 1, 0, 0.48435235f), new DMatch(4, 0, 0, 1.0836693f) }; - - super.setUp(); } public void testAdd() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingDescriptorMatcherTest.java b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingDescriptorMatcherTest.java index cd32bca451..08ff220ede 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingDescriptorMatcherTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingDescriptorMatcherTest.java @@ -65,6 +65,7 @@ public class BruteForceHammingDescriptorMatcherTest extends OpenCVTestCase { } protected void setUp() throws Exception { + super.setUp(); matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); matSize = 100; @@ -73,7 +74,6 @@ public class BruteForceHammingDescriptorMatcherTest extends OpenCVTestCase { new DMatch(1, 2, 0, 42), new DMatch(2, 1, 0, 40), new DMatch(3, 3, 0, 53) }; - super.setUp(); } public void testAdd() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingLUTDescriptorMatcherTest.java b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingLUTDescriptorMatcherTest.java index 1c22a77e1b..2d99c75b79 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingLUTDescriptorMatcherTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceHammingLUTDescriptorMatcherTest.java @@ -65,6 +65,7 @@ public class BruteForceHammingLUTDescriptorMatcherTest extends OpenCVTestCase { } protected void setUp() throws Exception { + super.setUp(); matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT); matSize = 100; @@ -73,7 +74,6 @@ public class BruteForceHammingLUTDescriptorMatcherTest extends OpenCVTestCase { new DMatch(1, 2, 0, 42), new DMatch(2, 1, 0, 40), new DMatch(3, 3, 0, 53) }; - super.setUp(); } public void testAdd() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceL1DescriptorMatcherTest.java b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceL1DescriptorMatcherTest.java index c15e937d79..d5370f32b4 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceL1DescriptorMatcherTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceL1DescriptorMatcherTest.java @@ -80,6 +80,7 @@ public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase { } protected void setUp() throws Exception { + super.setUp(); matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_L1); matSize = 100; @@ -90,7 +91,6 @@ public class BruteForceL1DescriptorMatcherTest extends OpenCVTestCase { new DMatch(3, 1, 0, 2.6545324f), new DMatch(4, 0, 0, 6.1294870f) }; - super.setUp(); } public void testAdd() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceSL2DescriptorMatcherTest.java b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceSL2DescriptorMatcherTest.java index 7c886c15db..39253f0441 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/BruteForceSL2DescriptorMatcherTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/BruteForceSL2DescriptorMatcherTest.java @@ -85,6 +85,7 @@ public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase { } protected void setUp() throws Exception { + super.setUp(); matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2); matSize = 100; @@ -95,8 +96,6 @@ public class BruteForceSL2DescriptorMatcherTest extends OpenCVTestCase { new DMatch(3, 1, 0, 0.23459719f), new DMatch(4, 0, 0, 1.174339f) }; - - super.setUp(); } public void testAdd() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/FASTFeatureDetectorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/FASTFeatureDetectorTest.java index 35ffd6477e..8eeec37e9e 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/FASTFeatureDetectorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/FASTFeatureDetectorTest.java @@ -33,12 +33,10 @@ public class FASTFeatureDetectorTest extends OpenCVTestCase { @Override protected void setUp() throws Exception { + super.setUp(); detector = FeatureDetector.create(FeatureDetector.FAST); - truth = new KeyPoint[] { new KeyPoint(32, 27, 7, -1, 254, 0, -1), new KeyPoint(27, 32, 7, -1, 254, 0, -1), new KeyPoint(73, 68, 7, -1, 254, 0, -1), new KeyPoint(68, 73, 7, -1, 254, 0, -1) }; - - super.setUp(); } public void testCreate() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/FlannBasedDescriptorMatcherTest.java b/modules/java/android_test/src/org/opencv/test/features2d/FlannBasedDescriptorMatcherTest.java index 6eb20eec12..96e4986399 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/FlannBasedDescriptorMatcherTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/FlannBasedDescriptorMatcherTest.java @@ -154,9 +154,9 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase { } protected void setUp() throws Exception { + super.setUp(); matcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED); matSize = 100; - truth = new DMatch[] { new DMatch(0, 0, 0, 1.049694f), new DMatch(1, 0, 0, 1.0984558f), @@ -164,8 +164,6 @@ public class FlannBasedDescriptorMatcherTest extends OpenCVTestCase { new DMatch(3, 1, 0, 0.48435235f), new DMatch(4, 0, 0, 1.0836693f) }; - - super.setUp(); } public void testAdd() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java index b30ec32404..e9b65d1f41 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java @@ -31,10 +31,9 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase { @Override protected void setUp() throws Exception { + super.setUp(); extractor = DescriptorExtractor.create(DescriptorExtractor.ORB); matSize = 100; - - super.setUp(); } public void testComputeListOfMatListOfListOfKeyPointListOfMat() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java index 33029251a3..2fd83eb346 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java @@ -28,6 +28,7 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase { @Override protected void setUp() throws Exception { + super.setUp(); extractor = DescriptorExtractor.create(DescriptorExtractor.SIFT); keypoint = new KeyPoint(55.775577545166016f, 44.224422454833984f, 16, 9.754629f, 8617.863f, 1, -1); matSize = 100; @@ -44,8 +45,6 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase { ); } }; - - super.setUp(); } public void testComputeListOfMatListOfListOfKeyPointListOfMat() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/STARFeatureDetectorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/STARFeatureDetectorTest.java index 15e8fb99e2..0b7e4e1031 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/STARFeatureDetectorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/STARFeatureDetectorTest.java @@ -42,22 +42,10 @@ public class STARFeatureDetectorTest extends OpenCVTestCase { } protected void setUp() throws Exception { + super.setUp(); detector = FeatureDetector.create(FeatureDetector.STAR); - matSize = 200; - truth = new KeyPoint[] { - /* - new KeyPoint(95, 80, 22, -1, 31.595734f, 0, -1), - new KeyPoint(105, 80, 22, -1, 31.595734f, 0, -1), - new KeyPoint(80, 95, 22, -1, 31.595734f, 0, -1), - new KeyPoint(120, 95, 22, -1, 31.595734f, 0, -1), - new KeyPoint(100, 100, 8, -1, -219.90825f, 0, -1), - new KeyPoint(80, 105, 22, -1, 31.595734f, 0, -1), - new KeyPoint(120, 105, 22, -1, 31.595734f, 0, -1), - new KeyPoint(95, 120, 22, -1, 31.595734f, 0, -1), - new KeyPoint(105, 120, 22, -1, 31.595734f, 0, -1) - */ new KeyPoint( 95, 80, 22, -1, 31.5957f, 0, -1), new KeyPoint(105, 80, 22, -1, 31.5957f, 0, -1), new KeyPoint( 80, 95, 22, -1, 31.5957f, 0, -1), @@ -68,8 +56,6 @@ public class STARFeatureDetectorTest extends OpenCVTestCase { new KeyPoint( 95, 120, 22, -1, 31.5957f, 0, -1), new KeyPoint(105, 120, 22, -1, 31.5957f, 0, -1) }; - - super.setUp(); } public void testCreate() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/SURFDescriptorExtractorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/SURFDescriptorExtractorTest.java index 56fcd28de8..8b063ee4f6 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/SURFDescriptorExtractorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/SURFDescriptorExtractorTest.java @@ -26,10 +26,9 @@ public class SURFDescriptorExtractorTest extends OpenCVTestCase { @Override protected void setUp() throws Exception { + super.setUp(); extractor = DescriptorExtractor.create(DescriptorExtractor.SURF); matSize = 100; - - super.setUp(); } public void testComputeListOfMatListOfListOfKeyPointListOfMat() { diff --git a/modules/java/android_test/src/org/opencv/test/features2d/SURFFeatureDetectorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/SURFFeatureDetectorTest.java index f44d08ed1d..29da6ffcbb 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/SURFFeatureDetectorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/SURFFeatureDetectorTest.java @@ -52,18 +52,15 @@ public class SURFFeatureDetectorTest extends OpenCVTestCase { @Override protected void setUp() throws Exception { + super.setUp(); detector = FeatureDetector.create(FeatureDetector.SURF); - matSize = 100; - truth = new KeyPoint[] { new KeyPoint(55.775578f, 55.775578f, 16, 80.245735f, 8617.8633f, 0, -1), new KeyPoint(44.224422f, 55.775578f, 16, 170.24574f, 8617.8633f, 0, -1), new KeyPoint(44.224422f, 44.224422f, 16, 260.24573f, 8617.8633f, 0, -1), new KeyPoint(55.775578f, 44.224422f, 16, 350.24573f, 8617.8633f, 0, -1) }; - - super.setUp(); } public void testCreate() { diff --git a/modules/java/java_test/CMakeLists.txt b/modules/java/java_test/CMakeLists.txt index e912b0d459..b2c8d10ae3 100644 --- a/modules/java/java_test/CMakeLists.txt +++ b/modules/java/java_test/CMakeLists.txt @@ -70,8 +70,8 @@ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/build.xml" DESTINATION "${opencv_test_jav # Create a script for running the Java tests and place it in build/bin. if(WIN32) - file(WRITE "${CMAKE_BINARY_DIR}/bin/opencv_test_java.cmd" "cd ${opencv_test_java_bin_dir}\nset path=${EXECUTABLE_OUTPUT_PATH};%path%\nant -DjavaLibraryPath=${EXECUTABLE_OUTPUT_PATH}/Release buildAndTest") - file(WRITE "${CMAKE_BINARY_DIR}/bin/opencv_test_java_D.cmd" "cd ${opencv_test_java_bin_dir}\nset path=${EXECUTABLE_OUTPUT_PATH};%path%\nant -DjavaLibraryPath=${EXECUTABLE_OUTPUT_PATH}/Debug buildAndTest") + file(WRITE "${CMAKE_BINARY_DIR}/bin/opencv_test_java.cmd" "cd ${opencv_test_java_bin_dir}\nset PATH=${EXECUTABLE_OUTPUT_PATH}/Release;%PATH%\nant -DjavaLibraryPath=${EXECUTABLE_OUTPUT_PATH}/Release buildAndTest") + file(WRITE "${CMAKE_BINARY_DIR}/bin/opencv_test_java_D.cmd" "cd ${opencv_test_java_bin_dir}\nset PATH=${EXECUTABLE_OUTPUT_PATH}/Debug;%PATH%\nant -DjavaLibraryPath=${EXECUTABLE_OUTPUT_PATH}/Debug buildAndTest") else() file(WRITE "${CMAKE_BINARY_DIR}/bin/opencv_test_java.sh" "cd ${opencv_test_java_bin_dir};\nant -DjavaLibraryPath=${LIBRARY_OUTPUT_PATH} buildAndTest;\ncd -") endif() diff --git a/modules/java/java_test/build.xml b/modules/java/java_test/build.xml index 29398b4b14..49d2bf11ad 100644 --- a/modules/java/java_test/build.xml +++ b/modules/java/java_test/build.xml @@ -31,21 +31,9 @@ - - - - - - - - - - - - - + From b0e1cb473a9453727c05f40d870121136db98dda Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Fri, 11 Jan 2013 09:13:25 +0400 Subject: [PATCH 3/8] more tests fixes --- .../src/org/opencv/test/OpenCVTestCase.java | 23 +++---- .../ORBDescriptorExtractorTest.java | 8 ++- .../SIFTDescriptorExtractorTest.java | 8 ++- .../src/org/opencv/test/OpenCVTestCase.java | 67 +++++++++---------- 4 files changed, 54 insertions(+), 52 deletions(-) diff --git a/modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java b/modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java index b24d858ee3..59fcc27672 100644 --- a/modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java +++ b/modules/java/android_test/src/org/opencv/test/OpenCVTestCase.java @@ -1,8 +1,10 @@ package org.opencv.test; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; @@ -426,24 +428,19 @@ public class OpenCVTestCase extends TestCase { } protected static String readFile(String path) { - FileInputStream stream = null; try { - stream = new FileInputStream(new File(path)); - FileChannel fc = stream.getChannel(); - MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, - fc.size()); - return Charset.defaultCharset().decode(bb).toString(); + BufferedReader br = new BufferedReader(new FileReader(path)); + String line; + StringBuffer result = new StringBuffer(); + while ((line = br.readLine()) != null) { + result.append(line); + result.append("\n"); + } + return result.toString(); } catch (IOException e) { OpenCVTestRunner.Log("Failed to read file \"" + path + "\". Exception is thrown: " + e); return null; - } finally { - if (stream != null) - try { - stream.close(); - } catch (IOException e) { - OpenCVTestRunner.Log("Exception is thrown: " + e); - } } } diff --git a/modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java index e9b65d1f41..4ccf09808a 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/ORBDescriptorExtractorTest.java @@ -100,7 +100,9 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase { extractor.write(filename); String truth = "\n\nFeature2D.ORB\n2\n31\n0\n500\n8\n31\n1.2000000476837158e+00\n0\n\n"; - assertEquals(truth, readFile(filename)); + String actual = readFile(filename); + actual = actual.replaceAll("e\\+000", "e+00"); // NOTE: workaround for different platforms double representation + assertEquals(truth, actual); } public void testWriteYml() { @@ -109,7 +111,9 @@ public class ORBDescriptorExtractorTest extends OpenCVTestCase { extractor.write(filename); String truth = "%YAML:1.0\nname: \"Feature2D.ORB\"\nWTA_K: 2\nedgeThreshold: 31\nfirstLevel: 0\nnFeatures: 500\nnLevels: 8\npatchSize: 31\nscaleFactor: 1.2000000476837158e+00\nscoreType: 0\n"; - assertEquals(truth, readFile(filename)); + String actual = readFile(filename); + actual = actual.replaceAll("e\\+000", "e+00"); // NOTE: workaround for different platforms double representation + assertEquals(truth, actual); } } diff --git a/modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java b/modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java index 2fd83eb346..8add9f4933 100644 --- a/modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java +++ b/modules/java/android_test/src/org/opencv/test/features2d/SIFTDescriptorExtractorTest.java @@ -87,7 +87,9 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase { extractor.write(filename); String truth = "\n\nFeature2D.SIFT\n4.0000000000000001e-02\n10.\n0\n3\n1.6000000000000001e+00\n\n"; - assertEquals(truth, readFile(filename)); + String actual = readFile(filename); + actual = actual.replaceAll("e([+-])0(\\d\\d)", "e$1$2"); // NOTE: workaround for different platforms double representation + assertEquals(truth, actual); } public void testWriteYml() { @@ -96,7 +98,9 @@ public class SIFTDescriptorExtractorTest extends OpenCVTestCase { extractor.write(filename); String truth = "%YAML:1.0\nname: \"Feature2D.SIFT\"\ncontrastThreshold: 4.0000000000000001e-02\nedgeThreshold: 10.\nnFeatures: 0\nnOctaveLayers: 3\nsigma: 1.6000000000000001e+00\n"; - assertEquals(truth, readFile(filename)); + String actual = readFile(filename); + actual = actual.replaceAll("e([+-])0(\\d\\d)", "e$1$2"); // NOTE: workaround for different platforms double representation + assertEquals(truth, actual); } } diff --git a/modules/java/java_test/src/org/opencv/test/OpenCVTestCase.java b/modules/java/java_test/src/org/opencv/test/OpenCVTestCase.java index 75e240da30..15ff735f83 100644 --- a/modules/java/java_test/src/org/opencv/test/OpenCVTestCase.java +++ b/modules/java/java_test/src/org/opencv/test/OpenCVTestCase.java @@ -2,9 +2,11 @@ package org.opencv.test; +import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.FileReader; import java.io.IOException; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; @@ -94,31 +96,31 @@ public class OpenCVTestCase extends TestCase { protected void setUp() throws Exception { super.setUp(); - try { - System.loadLibrary("opencv_java"); - } catch (SecurityException e) { - System.out.println(e.toString()); - System.exit(-1); - } catch (UnsatisfiedLinkError e) { - System.out.println(e.toString()); - System.exit(-1); - } + try { + System.loadLibrary("opencv_java"); + } catch (SecurityException e) { + System.out.println(e.toString()); + System.exit(-1); + } catch (UnsatisfiedLinkError e) { + System.out.println(e.toString()); + System.exit(-1); + } - String pwd; - try { - pwd = new File(".").getCanonicalPath() + File.separator; - } catch (IOException e) { - System.out.println(e); - return; - } + String pwd; + try { + pwd = new File(".").getCanonicalPath() + File.separator; + } catch (IOException e) { + System.out.println(e); + return; + } - OpenCVTestRunner.LENA_PATH = pwd + "res/drawable/lena.jpg"; - OpenCVTestRunner.CHESS_PATH = pwd + "res/drawable/chessboard.jpg"; - OpenCVTestRunner.LBPCASCADE_FRONTALFACE_PATH = pwd + "res/raw/lbpcascade_frontalface.xml"; + OpenCVTestRunner.LENA_PATH = pwd + "res/drawable/lena.jpg"; + OpenCVTestRunner.CHESS_PATH = pwd + "res/drawable/chessboard.jpg"; + OpenCVTestRunner.LBPCASCADE_FRONTALFACE_PATH = pwd + "res/raw/lbpcascade_frontalface.xml"; - assert(new File(OpenCVTestRunner.LENA_PATH).exists()); - assert(new File(OpenCVTestRunner.CHESS_PATH).exists()); - assert(new File(OpenCVTestRunner.LBPCASCADE_FRONTALFACE_PATH).exists()); + assert(new File(OpenCVTestRunner.LENA_PATH).exists()); + assert(new File(OpenCVTestRunner.CHESS_PATH).exists()); + assert(new File(OpenCVTestRunner.LBPCASCADE_FRONTALFACE_PATH).exists()); dst = new Mat(); assertTrue(dst.empty()); @@ -452,24 +454,19 @@ public class OpenCVTestCase extends TestCase { } protected static String readFile(String path) { - FileInputStream stream = null; try { - stream = new FileInputStream(new File(path)); - FileChannel fc = stream.getChannel(); - MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, - fc.size()); - return Charset.defaultCharset().decode(bb).toString(); + BufferedReader br = new BufferedReader(new FileReader(path)); + String line; + StringBuffer result = new StringBuffer(); + while ((line = br.readLine()) != null) { + result.append(line); + result.append("\n"); + } + return result.toString(); } catch (IOException e) { OpenCVTestRunner.Log("Failed to read file \"" + path + "\". Exception is thrown: " + e); return null; - } finally { - if (stream != null) - try { - stream.close(); - } catch (IOException e) { - OpenCVTestRunner.Log("Exception is thrown: " + e); - } } } From 8cb0343f4cf18d144c1123316311c1142cb615e3 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Sun, 13 Jan 2013 16:27:11 +0400 Subject: [PATCH 4/8] Documentation build warning fixes. Invalid links and refences fixed. SpaeseMat class documentation updated. --- .../video-input-psnr-ssim.rst | 2 +- modules/contrib/doc/retina/index.rst | 4 +- .../include/opencv2/contrib/retina.hpp | 40 +- modules/core/doc/basic_structures.rst | 421 +++++++++--------- modules/core/doc/dynamic_structures.rst | 24 + modules/core/doc/operations_on_arrays.rst | 2 +- ...on_interfaces_of_descriptor_extractors.rst | 2 +- ...common_interfaces_of_feature_detectors.rst | 31 +- modules/flann/doc/flann_clustering.rst | 8 +- ...st_approximate_nearest_neighbor_search.rst | 133 +++--- .../gpu/doc/initalization_and_information.rst | 32 +- modules/gpu/doc/video.rst | 2 +- ...erfaces_of_generic_descriptor_matchers.rst | 246 ++++++++++ modules/ml/doc/boosting.rst | 3 +- modules/ml/doc/statistical_models.rst | 2 +- .../doc/feature_detection_and_description.rst | 2 +- modules/ocl/doc/object_detection.rst | 4 +- modules/stitching/doc/motion_estimation.rst | 1 + .../motion_analysis_and_object_tracking.rst | 4 +- 19 files changed, 629 insertions(+), 334 deletions(-) diff --git a/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.rst b/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.rst index b7d154c398..b9c1201b8f 100644 --- a/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.rst +++ b/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.rst @@ -16,7 +16,7 @@ Today it is common to have a digital video recording system at your disposal. Th The source code =============== -As a test case where to show off these using OpenCV I've created a small program that reads in two video files and performs a similarity check between them. This is something you could use to check just how well a new video compressing algorithms works. Let there be a reference (original) video like :download:`this small Megamind clip <../../../../samples/cpp/tutorial_code/highgui/video-input-psnr-ssim/video/Megamind.avi>` and :download:`a compressed version of it <../../../../samples/cpp/tutorial_code/highgui/video-input-psnr-ssim/video/Megamind_bugy.avi>`. You may also find the source code and these video file in the :file:`samples/cpp/tutorial_code/highgui/video-input-psnr-ssim/` folder of the OpenCV source library. +As a test case where to show off these using OpenCV I've created a small program that reads in two video files and performs a similarity check between them. This is something you could use to check just how well a new video compressing algorithms works. Let there be a reference (original) video like :download:`this small Megamind clip <../../../../samples/cpp/tutorial_code/HighGUI/video-input-psnr-ssim/video/Megamind.avi>` and :download:`a compressed version of it <../../../../samples/cpp/tutorial_code/HighGUI/video-input-psnr-ssim/video/Megamind_bugy.avi>`. You may also find the source code and these video file in the :file:`samples/cpp/tutorial_code/HighGUI/video-input-psnr-ssim/` folder of the OpenCV source library. .. literalinclude:: ../../../../samples/cpp/tutorial_code/HighGUI/video-input-psnr-ssim/video-input-psnr-ssim.cpp :language: cpp diff --git a/modules/contrib/doc/retina/index.rst b/modules/contrib/doc/retina/index.rst index d80e45792e..a3a5bc82fc 100644 --- a/modules/contrib/doc/retina/index.rst +++ b/modules/contrib/doc/retina/index.rst @@ -208,7 +208,7 @@ Retina::getMagno Retina::getParameters +++++++++++++++++++++ -.. ocv:function:: struct Retina::RetinaParameters Retina::getParameters() +.. ocv:function:: Retina::RetinaParameters Retina::getParameters() Retrieve the current parameters values in a *Retina::RetinaParameters* structure @@ -325,7 +325,7 @@ Retina::RetinaParameters .. ocv:struct:: Retina::RetinaParameters This structure merges all the parameters that can be adjusted threw the **Retina::setup()**, **Retina::setupOPLandIPLParvoChannel** and **Retina::setupIPLMagnoChannel** setup methods -Parameters structure for better clarity, check explenations on the comments of methods : setupOPLandIPLParvoChannel and setupIPLMagnoChannel. :: + Parameters structure for better clarity, check explenations on the comments of methods : setupOPLandIPLParvoChannel and setupIPLMagnoChannel. :: class RetinaParameters{ struct OPLandIplParvoParameters{ // Outer Plexiform Layer (OPL) and Inner Plexiform Layer Parvocellular (IplParvo) parameters diff --git a/modules/contrib/include/opencv2/contrib/retina.hpp b/modules/contrib/include/opencv2/contrib/retina.hpp index ab8bc360c2..6f660efcac 100644 --- a/modules/contrib/include/opencv2/contrib/retina.hpp +++ b/modules/contrib/include/opencv2/contrib/retina.hpp @@ -115,7 +115,7 @@ class CV_EXPORTS Retina { public: // parameters structure for better clarity, check explenations on the comments of methods : setupOPLandIPLParvoChannel and setupIPLMagnoChannel - struct RetinaParameters{ + struct RetinaParameters{ struct OPLandIplParvoParameters{ // Outer Plexiform Layer (OPL) and Inner Plexiform Layer Parvocellular (IplParvo) parameters OPLandIplParvoParameters():colorMode(true), normaliseOutput(true), @@ -166,14 +166,14 @@ public: virtual ~Retina(); /** - * retreive retina input buffer size - */ - Size inputSize(); + * retreive retina input buffer size + */ + Size inputSize(); /** - * retreive retina output buffer size - */ - Size outputSize(); + * retreive retina output buffer size + */ + Size outputSize(); /** * try to open an XML retina parameters file to adjust current retina instance setup @@ -190,9 +190,9 @@ public: * => if the xml file does not exist, then default setup is applied * => warning, Exceptions are thrown if read XML file is not valid * @param fs : the open Filestorage which contains retina parameters - * @param applyDefaultSetupOnFailure : set to true if an error must be thrown on error + * @param applyDefaultSetupOnFailure : set to true if an error must be thrown on error */ - void setup(cv::FileStorage &fs, const bool applyDefaultSetupOnFailure=true); + void setup(cv::FileStorage &fs, const bool applyDefaultSetupOnFailure=true); /** * try to open an XML retina parameters file to adjust current retina instance setup @@ -206,7 +206,7 @@ public: /** * @return the current parameters setup */ - struct Retina::RetinaParameters getParameters(); + Retina::RetinaParameters getParameters(); /** * parameters setup display method @@ -305,17 +305,17 @@ public: */ void clearBuffers(); - /** - * Activate/desactivate the Magnocellular pathway processing (motion information extraction), by default, it is activated - * @param activate: true if Magnocellular output should be activated, false if not - */ - void activateMovingContoursProcessing(const bool activate); + /** + * Activate/desactivate the Magnocellular pathway processing (motion information extraction), by default, it is activated + * @param activate: true if Magnocellular output should be activated, false if not + */ + void activateMovingContoursProcessing(const bool activate); - /** - * Activate/desactivate the Parvocellular pathway processing (contours information extraction), by default, it is activated - * @param activate: true if Parvocellular (contours information extraction) output should be activated, false if not - */ - void activateContoursProcessing(const bool activate); + /** + * Activate/desactivate the Parvocellular pathway processing (contours information extraction), by default, it is activated + * @param activate: true if Parvocellular (contours information extraction) output should be activated, false if not + */ + void activateContoursProcessing(const bool activate); protected: // Parameteres setup members diff --git a/modules/core/doc/basic_structures.rst b/modules/core/doc/basic_structures.rst index 671ae0978d..bac7194cb4 100644 --- a/modules/core/doc/basic_structures.rst +++ b/modules/core/doc/basic_structures.rst @@ -210,9 +210,9 @@ The sample below demonstrates how to use RotatedRect: .. seealso:: - :ocv:cfunc:`CamShift`, - :ocv:func:`fitEllipse`, - :ocv:func:`minAreaRect`, + :ocv:func:`CamShift` , + :ocv:func:`fitEllipse` , + :ocv:func:`minAreaRect` , :ocv:struct:`CvBox2D` TermCriteria @@ -1303,7 +1303,7 @@ because ``cvtColor`` , as well as the most of OpenCV functions, calls ``Mat::cre Mat::addref ---------------- +----------- Increments the reference counter. .. ocv:function:: void Mat::addref() @@ -1313,7 +1313,7 @@ The method increments the reference counter associated with the matrix data. If Mat::release ----------------- +------------ Decrements the reference counter and deallocates the matrix if needed. .. ocv:function:: void Mat::release() @@ -1324,7 +1324,7 @@ The method decrements the reference counter associated with the matrix data. Whe This method can be called manually to force the matrix data deallocation. But since this method is automatically called in the destructor, or by any other method that changes the data pointer, it is usually not needed. The reference counter decrement and check for 0 is an atomic operation on the platforms that support it. Thus, it is safe to operate on the same matrices asynchronously in different threads. Mat::resize ---------------- +----------- Changes the number of matrix rows. .. ocv:function:: void Mat::resize( size_t sz ) @@ -1337,7 +1337,7 @@ The methods change the number of matrix rows. If the matrix is reallocated, the Mat::reserve ---------------- +------------ Reserves space for the certain number of rows. .. ocv:function:: void Mat::reserve( size_t sz ) @@ -1370,7 +1370,7 @@ The method removes one or more rows from the bottom of the matrix. Mat::locateROI ------------------- +-------------- Locates the matrix header within a parent matrix. .. ocv:function:: void Mat::locateROI( Size& wholeSize, Point& ofs ) const @@ -1387,7 +1387,7 @@ After you extracted a submatrix from a matrix using Mat::adjustROI ------------------- +-------------- Adjusts a submatrix size and position within the parent matrix. .. ocv:function:: Mat& Mat::adjustROI( int dtop, int dbottom, int dleft, int dright ) @@ -1417,7 +1417,7 @@ The function is used internally by the OpenCV filtering functions, like Mat::operator() -------------------- +--------------- Extracts a rectangular submatrix. .. ocv:function:: Mat Mat::operator()( Range rowRange, Range colRange ) const @@ -1955,202 +1955,6 @@ SparseMat --------- .. ocv:class:: SparseMat -Sparse n-dimensional array. :: - - class SparseMat - { - public: - typedef SparseMatIterator iterator; - typedef SparseMatConstIterator const_iterator; - - // internal structure - sparse matrix header - struct Hdr - { - ... - }; - - // sparse matrix node - element of a hash table - struct Node - { - size_t hashval; - size_t next; - int idx[CV_MAX_DIM]; - }; - - ////////// constructors and destructor ////////// - // default constructor - SparseMat(); - // creates matrix of the specified size and type - SparseMat(int dims, const int* _sizes, int _type); - // copy constructor - SparseMat(const SparseMat& m); - // converts dense array to the sparse form, - // if try1d is true and matrix is a single-column matrix (Nx1), - // then the sparse matrix will be 1-dimensional. - SparseMat(const Mat& m, bool try1d=false); - // converts an old-style sparse matrix to the new style. - // all the data is copied so that "m" can be safely - // deleted after the conversion - SparseMat(const CvSparseMat* m); - // destructor - ~SparseMat(); - - ///////// assignment operations /////////// - - // this is an O(1) operation; no data is copied - SparseMat& operator = (const SparseMat& m); - // (equivalent to the corresponding constructor with try1d=false) - SparseMat& operator = (const Mat& m); - - // creates a full copy of the matrix - SparseMat clone() const; - - // copy all the data to the destination matrix. - // the destination will be reallocated if needed. - void copyTo( SparseMat& m ) const; - // converts 1D or 2D sparse matrix to dense 2D matrix. - // If the sparse matrix is 1D, the result will - // be a single-column matrix. - void copyTo( Mat& m ) const; - // converts arbitrary sparse matrix to dense matrix. - // multiplies all the matrix elements by the specified scalar - void convertTo( SparseMat& m, int rtype, double alpha=1 ) const; - // converts sparse matrix to dense matrix with optional type conversion and scaling. - // When rtype=-1, the destination element type will be the same - // as the sparse matrix element type. - // Otherwise, rtype will specify the depth and - // the number of channels will remain the same as in the sparse matrix - void convertTo( Mat& m, int rtype, double alpha=1, double beta=0 ) const; - - // not used now - void assignTo( SparseMat& m, int type=-1 ) const; - - // reallocates sparse matrix. If it was already of the proper size and type, - // it is simply cleared with clear(), otherwise, - // the old matrix is released (using release()) and the new one is allocated. - void create(int dims, const int* _sizes, int _type); - // sets all the matrix elements to 0, which means clearing the hash table. - void clear(); - // manually increases reference counter to the header. - void addref(); - // decreses the header reference counter when it reaches 0. - // the header and all the underlying data are deallocated. - void release(); - - // converts sparse matrix to the old-style representation. - // all the elements are copied. - operator CvSparseMat*() const; - // size of each element in bytes - // (the matrix nodes will be bigger because of - // element indices and other SparseMat::Node elements). - size_t elemSize() const; - // elemSize()/channels() - size_t elemSize1() const; - - // the same is in Mat - int type() const; - int depth() const; - int channels() const; - - // returns the array of sizes and 0 if the matrix is not allocated - const int* size() const; - // returns i-th size (or 0) - int size(int i) const; - // returns the matrix dimensionality - int dims() const; - // returns the number of non-zero elements - size_t nzcount() const; - - // compute element hash value from the element indices: - // 1D case - size_t hash(int i0) const; - // 2D case - size_t hash(int i0, int i1) const; - // 3D case - size_t hash(int i0, int i1, int i2) const; - // n-D case - size_t hash(const int* idx) const; - - // low-level element-access functions, - // special variants for 1D, 2D, 3D cases, and the generic one for n-D case. - // - // return pointer to the matrix element. - // if the element is there (it is non-zero), the pointer to it is returned - // if it is not there and createMissing=false, NULL pointer is returned - // if it is not there and createMissing=true, the new element - // is created and initialized with 0. Pointer to it is returned. - // If the optional hashval pointer is not NULL, the element hash value is - // not computed but *hashval is taken instead. - uchar* ptr(int i0, bool createMissing, size_t* hashval=0); - uchar* ptr(int i0, int i1, bool createMissing, size_t* hashval=0); - uchar* ptr(int i0, int i1, int i2, bool createMissing, size_t* hashval=0); - uchar* ptr(const int* idx, bool createMissing, size_t* hashval=0); - - // higher-level element access functions: - // ref<_Tp>(i0,...[,hashval]) - equivalent to *(_Tp*)ptr(i0,...true[,hashval]). - // always return valid reference to the element. - // If it does not exist, it is created. - // find<_Tp>(i0,...[,hashval]) - equivalent to (_const Tp*)ptr(i0,...false[,hashval]). - // return pointer to the element or NULL pointer if the element is not there. - // value<_Tp>(i0,...[,hashval]) - equivalent to - // { const _Tp* p = find<_Tp>(i0,...[,hashval]); return p ? *p : _Tp(); } - // that is, 0 is returned when the element is not there. - // note that _Tp must match the actual matrix type - - // the functions do not do any on-fly type conversion - - // 1D case - template _Tp& ref(int i0, size_t* hashval=0); - template _Tp value(int i0, size_t* hashval=0) const; - template const _Tp* find(int i0, size_t* hashval=0) const; - - // 2D case - template _Tp& ref(int i0, int i1, size_t* hashval=0); - template _Tp value(int i0, int i1, size_t* hashval=0) const; - template const _Tp* find(int i0, int i1, size_t* hashval=0) const; - - // 3D case - template _Tp& ref(int i0, int i1, int i2, size_t* hashval=0); - template _Tp value(int i0, int i1, int i2, size_t* hashval=0) const; - template const _Tp* find(int i0, int i1, int i2, size_t* hashval=0) const; - - // n-D case - template _Tp& ref(const int* idx, size_t* hashval=0); - template _Tp value(const int* idx, size_t* hashval=0) const; - template const _Tp* find(const int* idx, size_t* hashval=0) const; - - // erase the specified matrix element. - // when there is no such an element, the methods do nothing - void erase(int i0, int i1, size_t* hashval=0); - void erase(int i0, int i1, int i2, size_t* hashval=0); - void erase(const int* idx, size_t* hashval=0); - - // return the matrix iterators, - // pointing to the first sparse matrix element, - SparseMatIterator begin(); - SparseMatConstIterator begin() const; - // ... or to the point after the last sparse matrix element - SparseMatIterator end(); - SparseMatConstIterator end() const; - - // and the template forms of the above methods. - // _Tp must match the actual matrix type. - template SparseMatIterator_<_Tp> begin(); - template SparseMatConstIterator_<_Tp> begin() const; - template SparseMatIterator_<_Tp> end(); - template SparseMatConstIterator_<_Tp> end() const; - - // return value stored in the sparse martix node - template _Tp& value(Node* n); - template const _Tp& value(const Node* n) const; - - ////////////// some internally used methods /////////////// - ... - - // pointer to the sparse matrix header - Hdr* hdr; - }; - - The class ``SparseMat`` represents multi-dimensional sparse numerical arrays. Such a sparse array can store elements of any type that :ocv:class:`Mat` can store. *Sparse* means that only non-zero elements are stored (though, as a result of operations on a sparse matrix, some of its stored elements can actually become 0. It is up to you to detect such elements and delete them using ``SparseMat::erase`` ). The non-zero elements are stored in a hash table that grows when it is filled so that the search time is O(1) in average (regardless of whether element is there or not). Elements can be accessed using the following methods: @@ -2231,6 +2035,204 @@ The class ``SparseMat`` represents multi-dimensional sparse numerical arrays. Su .. +SparseMat::SparseMat +-------------------- +Various SparseMat constructors. + +.. ocv:function:: SparseMat::SparseMat() +.. ocv:function:: SparseMat::SparseMat(int dims, const int* _sizes, int _type) +.. ocv:function:: SparseMat::SparseMat(const SparseMat& m) +.. ocv:function:: SparseMat::SparseMat(const Mat& m, bool try1d=false) +.. ocv:function:: SparseMat::SparseMat(const CvSparseMat* m) + + :param m: Source matrix for copy constructor. If m is dense matrix (ocv:class:`Mat`) then it will be converted to sparse representation. + :param dims: Array dimensionality. + :param _sizes: Sparce matrix size on all dementions. + :param _type: Sparse matrix data type. + :param try1d: if try1d is true and matrix is a single-column matrix (Nx1), then the sparse matrix will be 1-dimensional. + +SparseMat::~SparseMat +--------------------- +SparseMat object destructor. + +.. ocv:function:: SparseMat::~SparseMat() + +SparseMat::operator = +--------------------- +Provides sparse matrix assignment operators. + +.. ocv:function:: SparseMat& SparseMat::operator=(const SparseMat& m) +.. ocv:function:: SparseMat& SparseMat::operator=(const Mat& m) + +The last variant is equivalent to the corresponding constructor with try1d=false. + + +SparseMat::clone +---------------- +Creates a full copy of the matrix. + +.. ocv:function:: SparseMat SparseMat::clone() const + +SparseMat::copyTo +----------------- +Copy all the data to the destination matrix.The destination will be reallocated if needed. + +.. ocv:function:: void SparseMat::copyTo( SparseMat& m ) const +.. ocv:function:: void SparseMat::copyTo( Mat& m ) const + + :param m: Target for copiing. + +The last variant converts 1D or 2D sparse matrix to dense 2D matrix. If the sparse matrix is 1D, the result will be a single-column matrix. + +SparceMat::convertTo +-------------------- +Convert sparse matrix with possible type change and scaling. + +.. ocv:function:: void SparseMat::convertTo( SparseMat& m, int rtype, double alpha=1 ) const +.. ocv:function:: void SparseMat::convertTo( Mat& m, int rtype, double alpha=1, double beta=0 ) const + +The first version converts arbitrary sparse matrix to dense matrix and multiplies all the matrix elements by the specified scalar. +The second versiob converts sparse matrix to dense matrix with optional type conversion and scaling. +When rtype=-1, the destination element type will be the same as the sparse matrix element type. +Otherwise, rtype will specify the depth and the number of channels will remain the same as in the sparse matrix. + +SparseMat:create +---------------- +Reallocates sparse matrix. If it was already of the proper size and type, it is simply cleared with clear(), otherwise, +the old matrix is released (using release()) and the new one is allocated. + +.. ocv:function:: void SparseMat::create(int dims, const int* _sizes, int _type) + + :param dims: Array dimensionality. + :param _sizes: Sparce matrix size on all dementions. + :param _type: Sparse matrix data type. + +SparseMat::clear +---------------- +Sets all the matrix elements to 0, which means clearing the hash table. + +.. ocv:function:: void SparseMat::clear() + +SparseMat::addref +----------------- +Manually increases reference counter to the header. + +.. ocv:function:: void SparseMat::addref() + +SparseMat::release +------------------ +Decreses the header reference counter when it reaches 0. The header and all the underlying data are deallocated. + +.. ocv:function:: void SparseMat::release() + +SparseMat::CvSparseMat * +------------------------ +Converts sparse matrix to the old-style representation. All the elements are copied. + +.. ocv:function:: SparseMat::operator CvSparseMat*() const + +SparseMat::elemSize +------------------- +Size of each element in bytes (the matrix nodes will be bigger because of element indices and other SparseMat::Node elements). + +.. ocv:function:: size_t SparseMat::elemSize() const + +SparseMat::elemSize1 +-------------------- +elemSize()/channels(). + +.. ocv:function:: size_t SparseMat::elemSize() const + +SparseMat::type +--------------- +Returns the type of a matrix element. + +.. ocv:function:: int SparseMat::type() const + +The method returns a sparse matrix element type. This is an identifier compatible with the ``CvMat`` type system, like ``CV_16SC3`` or 16-bit signed 3-channel array, and so on. + +SparseMat::depth +---------------- +Returns the depth of a sparse matrix element. + +.. ocv:function:: int SparseMat::depth() const + +The method returns the identifier of the matrix element depth (the type of each individual channel). For example, for a 16-bit signed 3-channel array, the method returns ``CV_16S`` + +* ``CV_8U`` - 8-bit unsigned integers ( ``0..255`` ) + +* ``CV_8S`` - 8-bit signed integers ( ``-128..127`` ) + +* ``CV_16U`` - 16-bit unsigned integers ( ``0..65535`` ) + +* ``CV_16S`` - 16-bit signed integers ( ``-32768..32767`` ) + +* ``CV_32S`` - 32-bit signed integers ( ``-2147483648..2147483647`` ) + +* ``CV_32F`` - 32-bit floating-point numbers ( ``-FLT_MAX..FLT_MAX, INF, NAN`` ) + +* ``CV_64F`` - 64-bit floating-point numbers ( ``-DBL_MAX..DBL_MAX, INF, NAN`` ) + +SparseMat::channels +------------------- +Returns the number of matrix channels. + +.. ocv:function:: int SparseMat::channels() const + +The method returns the number of matrix channels. + +SparseMat::size +--------------- +Returns the array of sizes or matrix size by i dimention and 0 if the matrix is not allocated. + +.. ocv:function:: const int* SparseMat::size() const +.. ocv:function:: int SparseMat::size(int i) const + + :param i: Dimention index. + +SparseMat::dims +--------------- +Returns the matrix dimensionality. + +.. ocv:function:: int SparseMat::dims() const + +SparseMat::nzcount +------------------ +Returns the number of non-zero elements. + +.. ocv:function:: size_t SparseMat::nzcount() const + +SparseMat::hash +--------------- +Compute element hash value from the element indices. + +.. ocv:function:: size_t SparseMat::hash(int i0) const +.. ocv:function:: size_t SparseMat::hash(int i0, int i1) const +.. ocv:function:: size_t SparseMat::hash(int i0, int i1, int i2) const +.. ocv:function:: size_t SparseMat::hash(const int* idx) const + +SparseMat::ptr +-------------- +Low-level element-access functions, special variants for 1D, 2D, 3D cases, and the generic one for n-D case. + +.. ocv:function:: uchar* SparseMat::ptr(int i0, bool createMissing, size_t* hashval=0) +.. ocv:function:: uchar* SparseMat::ptr(int i0, int i1, bool createMissing, size_t* hashval=0) +.. ocv:function:: uchar* SparseMat::ptr(int i0, int i1, int i2, bool createMissing, size_t* hashval=0) +.. ocv:function:: uchar* SparseMat::ptr(const int* idx, bool createMissing, size_t* hashval=0) + +Return pointer to the matrix element. If the element is there (it is non-zero), the pointer to it is returned. +If it is not there and ``createMissing=false``, NULL pointer is returned. If it is not there and ``createMissing=true``, +the new elementis created and initialized with 0. Pointer to it is returned. If the optional hashval pointer is not ``NULL``, +the element hash value is not computed but ``hashval`` is taken instead. + +SparseMat::erase +---------------- +Erase the specified matrix element. When there is no such an element, the methods do nothing. + +.. ocv:function:: void SparseMat::erase(int i0, int i1, size_t* hashval=0) +.. ocv:function:: void SparseMat::erase(int i0, int i1, int i2, size_t* hashval=0) +.. ocv:function:: void SparseMat::erase(const int* idx, size_t* hashval=0) + SparseMat\_ ----------- .. ocv:class:: SparseMat_ @@ -2286,7 +2288,7 @@ Template sparse n-dimensional array class derived from SparseMatConstIterator_<_Tp> end() const; }; -``SparseMat_`` is a thin wrapper on top of :ocv:class:`SparseMat` created in the same way as ``Mat_`` . +``SparseMat_`` is a thin wrapper on top of :ocv:class:`SparseMat` created in the same way as ``Mat_`` . It simplifies notation of some operations. :: int sz[] = {10, 20, 30}; @@ -2340,6 +2342,11 @@ Here is example of SIFT use in your application via Algorithm interface: :: vector keypoints; (*sift)(image, noArray(), keypoints, descriptors); +Algorithm::name +--------------- +Returns the algorithm name + +.. ocv:function:: string Algorithm::name() const Algorithm::get -------------- diff --git a/modules/core/doc/dynamic_structures.rst b/modules/core/doc/dynamic_structures.rst index df20690880..e333971c06 100644 --- a/modules/core/doc/dynamic_structures.rst +++ b/modules/core/doc/dynamic_structures.rst @@ -166,6 +166,12 @@ field of the set is the total number of nodes both occupied and free. When an oc ``CvSet`` is used to represent graphs (:ocv:struct:`CvGraph`), sparse multi-dimensional arrays (:ocv:struct:`CvSparseMat`), and planar subdivisions (:ocv:struct:`CvSubdiv2D`). +CvSetElem +--------- + +.. ocv:struct:: CvSetElem + +The structure is represent single element of :ocv:struct:`CvSet`. It consists of two fields: element data pointer and flags. CvGraph ------- @@ -174,6 +180,24 @@ CvGraph The structure ``CvGraph`` is a base for graphs used in OpenCV 1.x. It inherits from :ocv:struct:`CvSet`, that is, it is considered as a set of vertices. Besides, it contains another set as a member, a set of graph edges. Graphs in OpenCV are represented using adjacency lists format. +CvGraphVtx +---------- +.. ocv:struct:: CvGraphVtx + +The structure represents single vertex in :ocv:struct:`CvGraph`. It consists of two filds: pointer to first edge and flags. + +CvGraphEdge +----------- +.. ocv:struct:: CvGraphEdge + +The structure represents edge in :ocv:struct:`CvGraph`. Each edge consists of: + +- Two pointers to the starting and ending vertices (vtx[0] and vtx[1] respectively); +- Two pointers to next edges for the starting and ending vertices, where + next[0] points to the next edge in the vtx[0] adjacency list and + next[1] points to the next edge in the vtx[1] adjacency list; +- Weight; +- Flags. CvGraphScanner -------------- diff --git a/modules/core/doc/operations_on_arrays.rst b/modules/core/doc/operations_on_arrays.rst index 6ff04e462a..9f1ebad6a8 100644 --- a/modules/core/doc/operations_on_arrays.rst +++ b/modules/core/doc/operations_on_arrays.rst @@ -3243,7 +3243,7 @@ The constructors. * **SVD::NO_UV** indicates that only a vector of singular values ``w`` is to be processed, while ``u`` and ``vt`` will be set to empty matrices. - * **SVD::FULL_UV** when the matrix is not square, by default the algorithm produces ``u`` and ``vt`` matrices of sufficiently large size for the further ``A`` reconstruction; if, however, ``FULL_UV`` flag is specified, ``u`` and ``vt``will be full-size square orthogonal matrices. + * **SVD::FULL_UV** when the matrix is not square, by default the algorithm produces ``u`` and ``vt`` matrices of sufficiently large size for the further ``A`` reconstruction; if, however, ``FULL_UV`` flag is specified, ``u`` and ``vt`` will be full-size square orthogonal matrices. The first constructor initializes an empty ``SVD`` structure. The second constructor initializes an empty ``SVD`` structure and then calls :ocv:funcx:`SVD::operator()` . diff --git a/modules/features2d/doc/common_interfaces_of_descriptor_extractors.rst b/modules/features2d/doc/common_interfaces_of_descriptor_extractors.rst index 6c500495cc..d785bafafa 100644 --- a/modules/features2d/doc/common_interfaces_of_descriptor_extractors.rst +++ b/modules/features2d/doc/common_interfaces_of_descriptor_extractors.rst @@ -41,7 +41,7 @@ Abstract base class for computing descriptors for image keypoints. :: In this interface, a keypoint descriptor can be represented as a -dense, fixed-dimension vector of a basic type. Most descriptors +dense, fixed-dimension vector of a basic type. Most descriptors follow this pattern as it simplifies computing distances between descriptors. Therefore, a collection of descriptors is represented as diff --git a/modules/features2d/doc/common_interfaces_of_feature_detectors.rst b/modules/features2d/doc/common_interfaces_of_feature_detectors.rst index 9a80a1db7c..8a1fa8c001 100644 --- a/modules/features2d/doc/common_interfaces_of_feature_detectors.rst +++ b/modules/features2d/doc/common_interfaces_of_feature_detectors.rst @@ -113,7 +113,7 @@ Detects keypoints in an image (first variant) or image set (second variant). :param masks: Masks for each input image specifying where to look for keypoints (optional). ``masks[i]`` is a mask for ``images[i]``. FeatureDetector::create ---------------------------- +----------------------- Creates a feature detector by its name. .. ocv:function:: Ptr FeatureDetector::create( const string& detectorType ) @@ -219,8 +219,7 @@ StarFeatureDetector ------------------- .. ocv:class:: StarFeatureDetector : public FeatureDetector -Wrapping class for feature detection using the -:ocv:class:`StarDetector` class. :: +The class implements the keypoint detector introduced by K. Konolige, synonym of ``StarDetector``. :: class StarFeatureDetector : public FeatureDetector { @@ -412,7 +411,7 @@ Example of creating ``DynamicAdaptedFeatureDetector`` : :: DynamicAdaptedFeatureDetector::DynamicAdaptedFeatureDetector ----------------------------------------------------------------- +------------------------------------------------------------ The constructor .. ocv:function:: DynamicAdaptedFeatureDetector::DynamicAdaptedFeatureDetector( const Ptr& adjuster, int min_features=400, int max_features=500, int max_iters=5 ) @@ -484,7 +483,7 @@ Example: :: AdjusterAdapter::good -------------------------- +--------------------- Returns false if the detector parameters cannot be adjusted any more. .. ocv:function:: bool AdjusterAdapter::good() const @@ -497,7 +496,7 @@ Example: :: } AdjusterAdapter::create -------------------------- +----------------------- Creates an adjuster adapter by name .. ocv:function:: Ptr AdjusterAdapter::create( const string& detectorType ) @@ -528,3 +527,23 @@ StarAdjuster StarAdjuster(double initial_thresh = 30.0); ... }; + +SurfAdjuster +------------ +.. ocv:class:: SurfAdjuster: public AdjusterAdapter + +:ocv:class:`AdjusterAdapter` for ``SurfFeatureDetector``. :: + + class CV_EXPORTS SurfAdjuster: public AdjusterAdapter + { + public: + SurfAdjuster( double initial_thresh=400.f, double min_thresh=2, double max_thresh=1000 ); + + virtual void tooFew(int minv, int n_detected); + virtual void tooMany(int maxv, int n_detected); + virtual bool good() const; + + virtual Ptr clone() const; + + ... + }; diff --git a/modules/flann/doc/flann_clustering.rst b/modules/flann/doc/flann_clustering.rst index 1e065d3224..13025c0f85 100644 --- a/modules/flann/doc/flann_clustering.rst +++ b/modules/flann/doc/flann_clustering.rst @@ -10,11 +10,11 @@ Clusters features using hierarchical k-means algorithm. .. ocv:function:: template int flann::hierarchicalClustering(const Mat& features, Mat& centers, const cvflann::KMeansIndexParams& params, Distance d = Distance()) :param features: The points to be clustered. The matrix must have elements of type ``Distance::ElementType``. - - :param centers: The centers of the clusters obtained. The matrix must have type ``Distance::ResultType``. The number of rows in this matrix represents the number of clusters desired, however, because of the way the cut in the hierarchical tree is chosen, the number of clusters computed will be the highest number of the form ``(branching-1)*k+1`` that's lower than the number of clusters desired, where ``branching`` is the tree's branching factor (see description of the KMeansIndexParams). - + + :param centers: The centers of the clusters obtained. The matrix must have type ``Distance::ResultType``. The number of rows in this matrix represents the number of clusters desired, however, because of the way the cut in the hierarchical tree is chosen, the number of clusters computed will be the highest number of the form ``(branching-1)*k+1`` that's lower than the number of clusters desired, where ``branching`` is the tree's branching factor (see description of the KMeansIndexParams). + :param params: Parameters used in the construction of the hierarchical k-means tree. :param d: Distance to be used for clustering. - + The method clusters the given feature vectors by constructing a hierarchical k-means tree and choosing a cut in the tree that minimizes the cluster's variance. It returns the number of clusters found. diff --git a/modules/flann/doc/flann_fast_approximate_nearest_neighbor_search.rst b/modules/flann/doc/flann_fast_approximate_nearest_neighbor_search.rst index de2781a859..ee44b301ed 100644 --- a/modules/flann/doc/flann_fast_approximate_nearest_neighbor_search.rst +++ b/modules/flann/doc/flann_fast_approximate_nearest_neighbor_search.rst @@ -6,6 +6,7 @@ Fast Approximate Nearest Neighbor Search This section documents OpenCV's interface to the FLANN library. FLANN (Fast Library for Approximate Nearest Neighbors) is a library that contains a collection of algorithms optimized for fast nearest neighbor search in large datasets and for high dimensional features. More information about FLANN can be found in [Muja2009]_ . +.. [Muja2009] Marius Muja, David G. Lowe. Fast Approximate Nearest Neighbors with Automatic Algorithm Configuration, 2009 flann::Index\_ ----------------- @@ -20,40 +21,40 @@ flann::Index_::Index\_ Constructs a nearest neighbor search index for a given dataset. .. ocv:function:: flann::Index_::Index_(const Mat& features, const IndexParams& params) - - :param features: Matrix of containing the features(points) to index. The size of the matrix is ``num_features x feature_dimensionality`` and the data type of the elements in the matrix must coincide with the type of the index. - + + :param features: Matrix of containing the features(points) to index. The size of the matrix is ``num_features x feature_dimensionality`` and the data type of the elements in the matrix must coincide with the type of the index. + :param params: Structure containing the index parameters. The type of index that will be constructed depends on the type of this parameter. See the description. - + The method constructs a fast search structure from a set of features using the specified algorithm with specified parameters, as defined by ``params``. ``params`` is a reference to one of the following class ``IndexParams`` descendants: - + * - + **LinearIndexParams** When passing an object of this type, the index will perform a linear, brute-force search. :: - + struct LinearIndexParams : public IndexParams { }; - + .. * - + **KDTreeIndexParams** When passing an object of this type the index constructed will consist of a set of randomized kd-trees which will be searched in parallel. :: - + struct KDTreeIndexParams : public IndexParams { KDTreeIndexParams( int trees = 4 ); }; .. - - * **trees** The number of parallel kd-trees to use. Good values are in the range [1..16] + + * **trees** The number of parallel kd-trees to use. Good values are in the range [1..16] * - + **KMeansIndexParams** When passing an object of this type the index constructed will be a hierarchical k-means tree. :: - + struct KMeansIndexParams : public IndexParams { KMeansIndexParams( @@ -62,20 +63,20 @@ The method constructs a fast search structure from a set of features using the s flann_centers_init_t centers_init = CENTERS_RANDOM, float cb_index = 0.2 ); }; - + .. - - * **branching** The branching factor to use for the hierarchical k-means tree - + + * **branching** The branching factor to use for the hierarchical k-means tree + * **iterations** The maximum number of iterations to use in the k-means clustering stage when building the k-means tree. A value of -1 used here means that the k-means clustering should be iterated until convergence - + * **centers_init** The algorithm to use for selecting the initial centers when performing a k-means clustering step. The possible values are ``CENTERS_RANDOM`` (picks the initial cluster centers randomly), ``CENTERS_GONZALES`` (picks the initial centers using Gonzales' algorithm) and ``CENTERS_KMEANSPP`` (picks the initial centers using the algorithm suggested in arthur_kmeanspp_2007 ) - + * **cb_index** This parameter (cluster boundary index) influences the way exploration is performed in the hierarchical kmeans tree. When ``cb_index`` is zero the next kmeans domain to be explored is chosen to be the one with the closest center. A value greater then zero also takes into account the size of the domain. * **CompositeIndexParams** When using a parameters object of this type the index created combines the randomized kd-trees and the hierarchical k-means tree. :: - + struct CompositeIndexParams : public IndexParams { CompositeIndexParams( @@ -88,7 +89,7 @@ The method constructs a fast search structure from a set of features using the s * **LshIndexParams** When using a parameters object of this type the index created uses multi-probe LSH (by ``Multi-Probe LSH: Efficient Indexing for High-Dimensional Similarity Search`` by Qin Lv, William Josephson, Zhe Wang, Moses Charikar, Kai Li., Proceedings of the 33rd International Conference on Very Large Data Bases (VLDB). Vienna, Austria. September 2007) :: - + struct LshIndexParams : public IndexParams { LshIndexParams( @@ -96,9 +97,9 @@ The method constructs a fast search structure from a set of features using the s unsigned int key_size, unsigned int multi_probe_level ); }; - + .. - + * **table_number** the number of hash tables to use (between 10 and 30 usually). @@ -109,7 +110,7 @@ The method constructs a fast search structure from a set of features using the s * **AutotunedIndexParams** When passing an object of this type the index created is automatically tuned to offer the best performance, by choosing the optimal index type (randomized kd-trees, hierarchical kmeans, linear) and parameters for the dataset provided. :: - + struct AutotunedIndexParams : public IndexParams { AutotunedIndexParams( @@ -118,80 +119,80 @@ The method constructs a fast search structure from a set of features using the s float memory_weight = 0, float sample_fraction = 0.1 ); }; - + .. - + * **target_precision** Is a number between 0 and 1 specifying the percentage of the approximate nearest-neighbor searches that return the exact nearest-neighbor. Using a higher value for this parameter gives more accurate results, but the search takes longer. The optimum value usually depends on the application. - - + + * **build_weight** Specifies the importance of the index build time raported to the nearest-neighbor search time. In some applications it's acceptable for the index build step to take a long time if the subsequent searches in the index can be performed very fast. In other applications it's required that the index be build as fast as possible even if that leads to slightly longer search times. - - - * **memory_weight** Is used to specify the tradeoff between time (index build time and search time) and memory used by the index. A value less than 1 gives more importance to the time spent and a value greater than 1 gives more importance to the memory usage. - - + + + * **memory_weight** Is used to specify the tradeoff between time (index build time and search time) and memory used by the index. A value less than 1 gives more importance to the time spent and a value greater than 1 gives more importance to the memory usage. + + * **sample_fraction** Is a number between 0 and 1 indicating what fraction of the dataset to use in the automatic parameter configuration algorithm. Running the algorithm on the full dataset gives the most accurate results, but for very large datasets can take longer than desired. In such case using just a fraction of the data helps speeding up this algorithm while still giving good approximations of the optimum parameters. * **SavedIndexParams** This object type is used for loading a previously saved index from the disk. :: - + struct SavedIndexParams : public IndexParams { SavedIndexParams( std::string filename ); }; - + .. - - * **filename** The filename in which the index was saved. - + + * **filename** The filename in which the index was saved. + flann::Index_::knnSearch ---------------------------- Performs a K-nearest neighbor search for a given query point using the index. -.. ocv:function:: void flann::Index_::knnSearch(const vector& query, vector& indices, vector& dists, int knn, const SearchParams& params) +.. ocv:function:: void flann::Index_::knnSearch(const vector& query, vector& indices, vector& dists, int knn, const SearchParams& params) .. ocv:function:: void flann::Index_::knnSearch(const Mat& queries, Mat& indices, Mat& dists, int knn, const SearchParams& params) - :param query: The query point - - :param indices: Vector that will contain the indices of the K-nearest neighbors found. It must have at least knn size. - - :param dists: Vector that will contain the distances to the K-nearest neighbors found. It must have at least knn size. - - :param knn: Number of nearest neighbors to search for. - + :param query: The query point + + :param indices: Vector that will contain the indices of the K-nearest neighbors found. It must have at least knn size. + + :param dists: Vector that will contain the distances to the K-nearest neighbors found. It must have at least knn size. + + :param knn: Number of nearest neighbors to search for. + :param params: - + Search parameters :: - + struct SearchParams { SearchParams(int checks = 32); }; - + .. - - * **checks** The number of times the tree(s) in the index should be recursively traversed. A higher value for this parameter would give better search precision, but also take more time. If automatic configuration was used when the index was created, the number of checks required to achieve the specified precision was also computed, in which case this parameter is ignored. + + * **checks** The number of times the tree(s) in the index should be recursively traversed. A higher value for this parameter would give better search precision, but also take more time. If automatic configuration was used when the index was created, the number of checks required to achieve the specified precision was also computed, in which case this parameter is ignored. flann::Index_::radiusSearch -------------------------------------- Performs a radius nearest neighbor search for a given query point. -.. ocv:function:: int flann::Index_::radiusSearch(const vector& query, vector& indices, vector& dists, float radius, const SearchParams& params) +.. ocv:function:: int flann::Index_::radiusSearch(const vector& query, vector& indices, vector& dists, float radius, const SearchParams& params) -.. ocv:function:: int flann::Index_::radiusSearch(const Mat& query, Mat& indices, Mat& dists, float radius, const SearchParams& params) +.. ocv:function:: int flann::Index_::radiusSearch(const Mat& query, Mat& indices, Mat& dists, float radius, const SearchParams& params) - :param query: The query point - - :param indices: Vector that will contain the indices of the points found within the search radius in decreasing order of the distance to the query point. If the number of neighbors in the search radius is bigger than the size of this vector, the ones that don't fit in the vector are ignored. - - :param dists: Vector that will contain the distances to the points found within the search radius - - :param radius: The search radius - - :param params: Search parameters + :param query: The query point + + :param indices: Vector that will contain the indices of the points found within the search radius in decreasing order of the distance to the query point. If the number of neighbors in the search radius is bigger than the size of this vector, the ones that don't fit in the vector are ignored. + + :param dists: Vector that will contain the distances to the points found within the search radius + + :param radius: The search radius + + :param params: Search parameters flann::Index_::save @@ -199,8 +200,8 @@ flann::Index_::save Saves the index to a file. .. ocv:function:: void flann::Index_::save(std::string filename) - - :param filename: The file to save the index to + + :param filename: The file to save the index to flann::Index_::getIndexParameters diff --git a/modules/gpu/doc/initalization_and_information.rst b/modules/gpu/doc/initalization_and_information.rst index c679b4ea3c..ed045a3098 100644 --- a/modules/gpu/doc/initalization_and_information.rst +++ b/modules/gpu/doc/initalization_and_information.rst @@ -6,7 +6,7 @@ Initalization and Information gpu::getCudaEnabledDeviceCount ----------------------------------- +------------------------------ Returns the number of installed CUDA-enabled devices. .. ocv:function:: int gpu::getCudaEnabledDeviceCount() @@ -16,7 +16,7 @@ Use this function before any other GPU functions calls. If OpenCV is compiled wi gpu::setDevice ------------------- +-------------- Sets a device and initializes it for the current thread. .. ocv:function:: void gpu::setDevice(int device) @@ -28,7 +28,7 @@ If the call of this function is omitted, a default device is initialized at the gpu::getDevice ------------------- +-------------- Returns the current device index set by :ocv:func:`gpu::setDevice` or initialized by default. .. ocv:function:: int gpu::getDevice() @@ -36,7 +36,7 @@ Returns the current device index set by :ocv:func:`gpu::setDevice` or initialize gpu::resetDevice ------------------- +---------------- Explicitly destroys and cleans up all resources associated with the current device in the current process. .. ocv:function:: void gpu::resetDevice() @@ -47,8 +47,7 @@ Any subsequent API call to this device will reinitialize the device. gpu::FeatureSet --------------- - -Class providing GPU computing features. :: +Enumeration providing GPU computing features. :: enum FeatureSet { @@ -64,7 +63,6 @@ Class providing GPU computing features. :: }; - gpu::TargetArchs ---------------- .. ocv:class:: gpu::TargetArchs @@ -132,7 +130,7 @@ Class providing functionality for querying the specified GPU properties. :: gpu::DeviceInfo::DeviceInfo -------------------------------- +--------------------------- The constructors. .. ocv:function:: gpu::DeviceInfo::DeviceInfo() @@ -146,7 +144,7 @@ Constructs the ``DeviceInfo`` object for the specified device. If ``device_id`` gpu::DeviceInfo::name -------------------------- +--------------------- Returns the device name. .. ocv:function:: string gpu::DeviceInfo::name() const @@ -154,7 +152,7 @@ Returns the device name. gpu::DeviceInfo::majorVersion ---------------------------------- +----------------------------- Returns the major compute capability version. .. ocv:function:: int gpu::DeviceInfo::majorVersion() @@ -162,7 +160,7 @@ Returns the major compute capability version. gpu::DeviceInfo::minorVersion ---------------------------------- +----------------------------- Returns the minor compute capability version. .. ocv:function:: int gpu::DeviceInfo::minorVersion() @@ -170,7 +168,7 @@ Returns the minor compute capability version. gpu::DeviceInfo::multiProcessorCount ----------------------------------------- +------------------------------------ Returns the number of streaming multiprocessors. .. ocv:function:: int gpu::DeviceInfo::multiProcessorCount() @@ -178,7 +176,7 @@ Returns the number of streaming multiprocessors. gpu::DeviceInfo::freeMemory -------------------------------- +--------------------------- Returns the amount of free memory in bytes. .. ocv:function:: size_t gpu::DeviceInfo::freeMemory() @@ -186,7 +184,7 @@ Returns the amount of free memory in bytes. gpu::DeviceInfo::totalMemory --------------------------------- +---------------------------- Returns the amount of total memory in bytes. .. ocv:function:: size_t gpu::DeviceInfo::totalMemory() @@ -194,7 +192,7 @@ Returns the amount of total memory in bytes. gpu::DeviceInfo::supports ------------------------------ +------------------------- Provides information on GPU feature support. .. ocv:function:: bool gpu::DeviceInfo::supports( FeatureSet feature_set ) const @@ -206,7 +204,7 @@ This function returns ``true`` if the device has the specified GPU feature. Othe gpu::DeviceInfo::isCompatible ---------------------------------- +----------------------------- Checks the GPU module and device compatibility. .. ocv:function:: bool gpu::DeviceInfo::isCompatible() @@ -216,7 +214,7 @@ This function returns ``true`` if the GPU module can be run on the specified dev gpu::DeviceInfo::deviceID ---------------------------------- +------------------------- Returns system index of the GPU device starting with 0. .. ocv:function:: int gpu::DeviceInfo::deviceID() diff --git a/modules/gpu/doc/video.rst b/modules/gpu/doc/video.rst index dbfd93aaa8..9b17081c24 100644 --- a/modules/gpu/doc/video.rst +++ b/modules/gpu/doc/video.rst @@ -785,7 +785,7 @@ Constructors. :param fps: Framerate of the created video stream. - :param params: Encoder parameters. See :ocv:class:`gpu::VideoWriter_GPU::EncoderParams` . + :param params: Encoder parameters. See :ocv:struct:`gpu::VideoWriter_GPU::EncoderParams` . :param format: Surface format of input frames ( ``SF_UYVY`` , ``SF_YUY2`` , ``SF_YV12`` , ``SF_NV12`` , ``SF_IYUV`` , ``SF_BGR`` or ``SF_GRAY``). BGR or gray frames will be converted to YV12 format before encoding, frames with other formats will be used as is. diff --git a/modules/legacy/doc/common_interfaces_of_generic_descriptor_matchers.rst b/modules/legacy/doc/common_interfaces_of_generic_descriptor_matchers.rst index 2a1536910a..a2abfa3e49 100644 --- a/modules/legacy/doc/common_interfaces_of_generic_descriptor_matchers.rst +++ b/modules/legacy/doc/common_interfaces_of_generic_descriptor_matchers.rst @@ -3,6 +3,171 @@ Common Interfaces of Generic Descriptor Matchers .. highlight:: cpp +OneWayDescriptorBase +-------------------- +.. ocv:class:: OneWayDescriptorBase + +Class encapsulates functionality for training/loading a set of one way descriptors +and finding the nearest closest descriptor to an input feature. :: + + class CV_EXPORTS OneWayDescriptorBase + { + public: + + // creates an instance of OneWayDescriptor from a set of training files + // - patch_size: size of the input (large) patch + // - pose_count: the number of poses to generate for each descriptor + // - train_path: path to training files + // - pca_config: the name of the file that contains PCA for small patches (2 times smaller + // than patch_size each dimension + // - pca_hr_config: the name of the file that contains PCA for large patches (of patch_size size) + // - pca_desc_config: the name of the file that contains descriptors of PCA components + OneWayDescriptorBase(CvSize patch_size, int pose_count, const char* train_path = 0, const char* pca_config = 0, + const char* pca_hr_config = 0, const char* pca_desc_config = 0, int pyr_levels = 1, + int pca_dim_high = 100, int pca_dim_low = 100); + + OneWayDescriptorBase(CvSize patch_size, int pose_count, const string &pca_filename, const string &train_path = string(), const string &images_list = string(), + float _scale_min = 0.7f, float _scale_max=1.5f, float _scale_step=1.2f, int pyr_levels = 1, + int pca_dim_high = 100, int pca_dim_low = 100); + + + virtual ~OneWayDescriptorBase(); + void clear (); + + + // Allocate: allocates memory for a given number of descriptors + void Allocate(int train_feature_count); + + // AllocatePCADescriptors: allocates memory for pca descriptors + void AllocatePCADescriptors(); + + // returns patch size + CvSize GetPatchSize() const {return m_patch_size;}; + // returns the number of poses for each descriptor + int GetPoseCount() const {return m_pose_count;}; + + // returns the number of pyramid levels + int GetPyrLevels() const {return m_pyr_levels;}; + + // returns the number of descriptors + int GetDescriptorCount() const {return m_train_feature_count;}; + + // CreateDescriptorsFromImage: creates descriptors for each of the input features + // - src: input image + // - features: input features + // - pyr_levels: the number of pyramid levels + void CreateDescriptorsFromImage(IplImage* src, const vector& features); + + // CreatePCADescriptors: generates descriptors for PCA components, needed for fast generation of feature descriptors + void CreatePCADescriptors(); + + // returns a feature descriptor by feature index + const OneWayDescriptor* GetDescriptor(int desc_idx) const {return &m_descriptors[desc_idx];}; + + // FindDescriptor: finds the closest descriptor + // - patch: input image patch + // - desc_idx: output index of the closest descriptor to the input patch + // - pose_idx: output index of the closest pose of the closest descriptor to the input patch + // - distance: distance from the input patch to the closest feature pose + // - _scales: scales of the input patch for each descriptor + // - scale_ranges: input scales variation (float[2]) + void FindDescriptor(IplImage* patch, int& desc_idx, int& pose_idx, float& distance, float* _scale = 0, float* scale_ranges = 0) const; + + // - patch: input image patch + // - n: number of the closest indexes + // - desc_idxs: output indexes of the closest descriptor to the input patch (n) + // - pose_idx: output indexes of the closest pose of the closest descriptor to the input patch (n) + // - distances: distance from the input patch to the closest feature pose (n) + // - _scales: scales of the input patch + // - scale_ranges: input scales variation (float[2]) + void FindDescriptor(IplImage* patch, int n, vector& desc_idxs, vector& pose_idxs, + vector& distances, vector& _scales, float* scale_ranges = 0) const; + + // FindDescriptor: finds the closest descriptor + // - src: input image + // - pt: center of the feature + // - desc_idx: output index of the closest descriptor to the input patch + // - pose_idx: output index of the closest pose of the closest descriptor to the input patch + // - distance: distance from the input patch to the closest feature pose + void FindDescriptor(IplImage* src, cv::Point2f pt, int& desc_idx, int& pose_idx, float& distance) const; + + // InitializePoses: generates random poses + void InitializePoses(); + + // InitializeTransformsFromPoses: generates 2x3 affine matrices from poses (initializes m_transforms) + void InitializeTransformsFromPoses(); + + // InitializePoseTransforms: subsequently calls InitializePoses and InitializeTransformsFromPoses + void InitializePoseTransforms(); + + // InitializeDescriptor: initializes a descriptor + // - desc_idx: descriptor index + // - train_image: image patch (ROI is supported) + // - feature_label: feature textual label + void InitializeDescriptor(int desc_idx, IplImage* train_image, const char* feature_label); + + void InitializeDescriptor(int desc_idx, IplImage* train_image, const KeyPoint& keypoint, const char* feature_label); + + // InitializeDescriptors: load features from an image and create descriptors for each of them + void InitializeDescriptors(IplImage* train_image, const vector& features, + const char* feature_label = "", int desc_start_idx = 0); + + // Write: writes this object to a file storage + // - fs: output filestorage + void Write (FileStorage &fs) const; + + // Read: reads OneWayDescriptorBase object from a file node + // - fn: input file node + void Read (const FileNode &fn); + + // LoadPCADescriptors: loads PCA descriptors from a file + // - filename: input filename + int LoadPCADescriptors(const char* filename); + + // LoadPCADescriptors: loads PCA descriptors from a file node + // - fn: input file node + int LoadPCADescriptors(const FileNode &fn); + + // SavePCADescriptors: saves PCA descriptors to a file + // - filename: output filename + void SavePCADescriptors(const char* filename); + + // SavePCADescriptors: saves PCA descriptors to a file storage + // - fs: output file storage + void SavePCADescriptors(CvFileStorage* fs) const; + + // GeneratePCA: calculate and save PCA components and descriptors + // - img_path: path to training PCA images directory + // - images_list: filename with filenames of training PCA images + void GeneratePCA(const char* img_path, const char* images_list, int pose_count=500); + + // SetPCAHigh: sets the high resolution pca matrices (copied to internal structures) + void SetPCAHigh(CvMat* avg, CvMat* eigenvectors); + + // SetPCALow: sets the low resolution pca matrices (copied to internal structures) + void SetPCALow(CvMat* avg, CvMat* eigenvectors); + + int GetLowPCA(CvMat** avg, CvMat** eigenvectors) + { + *avg = m_pca_avg; + *eigenvectors = m_pca_eigenvectors; + return m_pca_dim_low; + }; + + int GetPCADimLow() const {return m_pca_dim_low;}; + int GetPCADimHigh() const {return m_pca_dim_high;}; + + void ConvertDescriptorsArrayToTree(); // Converting pca_descriptors array to KD tree + + // GetPCAFilename: get default PCA filename + static string GetPCAFilename () { return "pca.yml"; } + + virtual bool empty() const { return m_train_feature_count <= 0 ? true : false; } + + protected: + ... + }; + OneWayDescriptorMatcher ----------------------- .. ocv:class:: OneWayDescriptorMatcher : public GenericDescriptorMatcher @@ -59,8 +224,89 @@ Wrapping class for computing, matching, and classifying descriptors using the ... }; +FernClassifier +-------------- +.. ocv:class:: FernClassifier +:: + class CV_EXPORTS FernClassifier + { + public: + FernClassifier(); + FernClassifier(const FileNode& node); + FernClassifier(const vector >& points, + const vector& refimgs, + const vector >& labels=vector >(), + int _nclasses=0, int _patchSize=PATCH_SIZE, + int _signatureSize=DEFAULT_SIGNATURE_SIZE, + int _nstructs=DEFAULT_STRUCTS, + int _structSize=DEFAULT_STRUCT_SIZE, + int _nviews=DEFAULT_VIEWS, + int _compressionMethod=COMPRESSION_NONE, + const PatchGenerator& patchGenerator=PatchGenerator()); + virtual ~FernClassifier(); + virtual void read(const FileNode& n); + virtual void write(FileStorage& fs, const String& name=String()) const; + virtual void trainFromSingleView(const Mat& image, + const vector& keypoints, + int _patchSize=PATCH_SIZE, + int _signatureSize=DEFAULT_SIGNATURE_SIZE, + int _nstructs=DEFAULT_STRUCTS, + int _structSize=DEFAULT_STRUCT_SIZE, + int _nviews=DEFAULT_VIEWS, + int _compressionMethod=COMPRESSION_NONE, + const PatchGenerator& patchGenerator=PatchGenerator()); + virtual void train(const vector >& points, + const vector& refimgs, + const vector >& labels=vector >(), + int _nclasses=0, int _patchSize=PATCH_SIZE, + int _signatureSize=DEFAULT_SIGNATURE_SIZE, + int _nstructs=DEFAULT_STRUCTS, + int _structSize=DEFAULT_STRUCT_SIZE, + int _nviews=DEFAULT_VIEWS, + int _compressionMethod=COMPRESSION_NONE, + const PatchGenerator& patchGenerator=PatchGenerator()); + virtual int operator()(const Mat& img, Point2f kpt, vector& signature) const; + virtual int operator()(const Mat& patch, vector& signature) const; + virtual void clear(); + virtual bool empty() const; + void setVerbose(bool verbose); + + int getClassCount() const; + int getStructCount() const; + int getStructSize() const; + int getSignatureSize() const; + int getCompressionMethod() const; + Size getPatchSize() const; + + struct Feature + { + uchar x1, y1, x2, y2; + Feature() : x1(0), y1(0), x2(0), y2(0) {} + Feature(int _x1, int _y1, int _x2, int _y2) + : x1((uchar)_x1), y1((uchar)_y1), x2((uchar)_x2), y2((uchar)_y2) + {} + template bool operator ()(const Mat_<_Tp>& patch) const + { return patch(y1,x1) > patch(y2, x2); } + }; + + enum + { + PATCH_SIZE = 31, + DEFAULT_STRUCTS = 50, + DEFAULT_STRUCT_SIZE = 9, + DEFAULT_VIEWS = 5000, + DEFAULT_SIGNATURE_SIZE = 176, + COMPRESSION_NONE = 0, + COMPRESSION_RANDOM_PROJ = 1, + COMPRESSION_PCA = 2, + DEFAULT_COMPRESSION_METHOD = COMPRESSION_NONE + }; + + protected: + ... + }; FernDescriptorMatcher --------------------- diff --git a/modules/ml/doc/boosting.rst b/modules/ml/doc/boosting.rst index ba33a3db56..0bc92ec964 100644 --- a/modules/ml/doc/boosting.rst +++ b/modules/ml/doc/boosting.rst @@ -124,7 +124,7 @@ CvBoostTree ----------- .. ocv:class:: CvBoostTree : public CvDTree -The weak tree classifier, a component of the boosted tree classifier :ocv:class:`CvBoost`, is a derivative of :ocv:class:`CvDTree`. Normally, there is no need to use the weak classifiers directly. However, they can be accessed as elements of the sequence :ocv:member:`CvBoost::weak`, retrieved by :ocv:func:`CvBoost::get_weak_predictors`. +The weak tree classifier, a component of the boosted tree classifier :ocv:class:`CvBoost`, is a derivative of :ocv:class:`CvDTree`. Normally, there is no need to use the weak classifiers directly. However, they can be accessed as elements of the sequence ``CvBoost::weak``, retrieved by :ocv:func:`CvBoost::get_weak_predictors`. .. note:: In case of LogitBoost and Gentle AdaBoost, each weak predictor is a regression tree, rather than a classification tree. Even in case of Discrete AdaBoost and Real AdaBoost, the ``CvBoostTree::predict`` return value (:ocv:member:`CvDTreeNode::value`) is not an output class label. A negative value "votes" for class #0, a positive value - for class #1. The votes are weighted. The weight of each individual tree may be increased or decreased using the method ``CvBoostTree::scale``. @@ -233,4 +233,3 @@ CvBoost::get_data Returns used train data of the boosted tree classifier. .. ocv:function:: const CvDTreeTrainData* CvBoost::get_data() const - diff --git a/modules/ml/doc/statistical_models.rst b/modules/ml/doc/statistical_models.rst index 75ecd5c055..76da927b19 100644 --- a/modules/ml/doc/statistical_models.rst +++ b/modules/ml/doc/statistical_models.rst @@ -156,7 +156,7 @@ CvStatModel::predict -------------------- Predicts the response for a sample. -.. ocv:function:: float CvStatModel::predict( const Mat& sample, ) const +.. ocv:function:: float CvStatModel::predict( const Mat& sample, ... ) const The method is used to predict the response for a new sample. In case of a classification, the method returns the class label. In case of a regression, the method returns the output function value. The input sample must have as many components as the ``train_data`` passed to ``train`` contains. If the ``var_idx`` parameter is passed to ``train``, it is remembered and then is used to extract only the necessary components from the input sample in the method ``predict``. diff --git a/modules/ocl/doc/feature_detection_and_description.rst b/modules/ocl/doc/feature_detection_and_description.rst index a6416d4e60..d4fd6e65fa 100644 --- a/modules/ocl/doc/feature_detection_and_description.rst +++ b/modules/ocl/doc/feature_detection_and_description.rst @@ -148,7 +148,7 @@ Brute-force descriptor matcher. For each descriptor in the first set, this match The class ``BruteForceMatcher_OCL_base`` has an interface similar to the class :ocv:class:`DescriptorMatcher`. It has two groups of ``match`` methods: for matching descriptors of one image with another image or with an image set. Also, all functions have an alternative to save results either to the GPU memory or to the CPU memory. ``BruteForceMatcher_OCL_base`` supports only the ``L1``, ``L2``, and ``Hamming`` distance types. -.. seealso:: :ocv:class:`DescriptorMatcher`, :ocv:class:`BruteForceMatcher` +.. seealso:: :ocv:class:`DescriptorMatcher`, :ocv:class:`BFMatcher` diff --git a/modules/ocl/doc/object_detection.rst b/modules/ocl/doc/object_detection.rst index 6cd3a12acc..0104da5930 100644 --- a/modules/ocl/doc/object_detection.rst +++ b/modules/ocl/doc/object_detection.rst @@ -56,7 +56,7 @@ Class providing memory buffers for :ocv:func:`ocl::matchTemplate` function, plus You can use field `user_block_size` to set specific block size for :ocv:func:`ocl::matchTemplate` function. If you leave its default value `Size(0,0)` then automatic estimation of block size will be used (which is optimized for speed). By varying `user_block_size` you can reduce memory requirements at the cost of speed. ocl::matchTemplate ----------------------- +------------------ Computes a proximity map for a raster template and an image where the template is searched for. .. ocv:function:: void ocl::matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method) @@ -71,7 +71,7 @@ Computes a proximity map for a raster template and an image where the template i :param method: Specifies the way to compare the template with the image. - :param buf: Optional buffer to avoid extra memory allocations and to adjust some specific parameters. See :ocv:class:`ocl::MatchTemplateBuf`. + :param buf: Optional buffer to avoid extra memory allocations and to adjust some specific parameters. See :ocv:struct:`ocl::MatchTemplateBuf`. The following methods are supported for the ``CV_8U`` depth images for now: diff --git a/modules/stitching/doc/motion_estimation.rst b/modules/stitching/doc/motion_estimation.rst index 0c85c2c9ea..a4cc62f001 100644 --- a/modules/stitching/doc/motion_estimation.rst +++ b/modules/stitching/doc/motion_estimation.rst @@ -221,6 +221,7 @@ Implementation of the camera parameters refinement algorithm which minimizes sum detail::WaveCorrectKind ----------------------- +.. ocv:class:: detail::WaveCorrectKind Wave correction kind. :: diff --git a/modules/video/doc/motion_analysis_and_object_tracking.rst b/modules/video/doc/motion_analysis_and_object_tracking.rst index 19c970de21..7703fd7efc 100644 --- a/modules/video/doc/motion_analysis_and_object_tracking.rst +++ b/modules/video/doc/motion_analysis_and_object_tracking.rst @@ -287,7 +287,7 @@ The function finds all of the motion segments and marks them in ``segmask`` with CamShift ------------- +-------- Finds an object center, size, and orientation. .. ocv:function:: RotatedRect CamShift( InputArray probImage, Rect& window, TermCriteria criteria ) @@ -316,7 +316,7 @@ See the OpenCV sample ``camshiftdemo.c`` that tracks colored objects. meanShift -------------- +--------- Finds an object on a back projection image. .. ocv:function:: int meanShift( InputArray probImage, Rect& window, TermCriteria criteria ) From 3cb84ed17c2e86899c1a643251fe761f3e0ba345 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Mon, 14 Jan 2013 18:16:04 +0400 Subject: [PATCH 5/8] Fix dependencies inference for auto-disabled targets Sometimes information about dependencies causing disabling were loosed and it was not possible to correctly display these dependencies in status report --- CMakeLists.txt | 6 +++++- cmake/OpenCVModule.cmake | 6 ++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ca9d17186..7831430e69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -551,7 +551,11 @@ foreach(m ${OPENCV_MODULES_DISABLED_AUTO}) list(APPEND __mdeps ${d}) endif() endforeach() - list(APPEND OPENCV_MODULES_DISABLED_AUTO_ST "${m}(deps: ${__mdeps})") + if(__mdeps) + list(APPEND OPENCV_MODULES_DISABLED_AUTO_ST "${m}(deps: ${__mdeps})") + else() + list(APPEND OPENCV_MODULES_DISABLED_AUTO_ST "${m}") + endif() endforeach() string(REPLACE "opencv_" "" OPENCV_MODULES_DISABLED_AUTO_ST "${OPENCV_MODULES_DISABLED_AUTO_ST}") diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake index 9d5ce074b6..aba5c21e68 100644 --- a/cmake/OpenCVModule.cmake +++ b/cmake/OpenCVModule.cmake @@ -174,6 +174,7 @@ endmacro() # Internal macro; partly disables OpenCV module macro(__ocv_module_turn_off the_module) + list(REMOVE_ITEM OPENCV_MODULES_DISABLED_AUTO "${the_module}") list(APPEND OPENCV_MODULES_DISABLED_AUTO "${the_module}") list(REMOVE_ITEM OPENCV_MODULES_BUILD "${the_module}") list(REMOVE_ITEM OPENCV_MODULES_PUBLIC "${the_module}") @@ -193,7 +194,7 @@ macro(__ocv_flatten_module_required_dependencies the_module) break() elseif(";${OPENCV_MODULES_DISABLED_USER};${OPENCV_MODULES_DISABLED_AUTO};" MATCHES ";${__dep};") __ocv_module_turn_off(${the_module}) # depends on disabled module - break() + list(APPEND __flattened_deps "${__dep}") elseif(";${OPENCV_MODULES_BUILD};" MATCHES ";${__dep};") if(";${__resolved_deps};" MATCHES ";${__dep};") list(APPEND __flattened_deps "${__dep}") # all dependencies of this module are already resolved @@ -262,6 +263,7 @@ macro(__ocv_flatten_module_dependencies) foreach(m ${OPENCV_MODULES_BUILD}) set(HAVE_${m} ON CACHE INTERNAL "Module ${m} will be built in current configuration") __ocv_flatten_module_required_dependencies(${m}) + set(OPENCV_MODULE_${m}_DEPS ${OPENCV_MODULE_${m}_DEPS} CACHE INTERNAL "Flattened required dependencies of ${m} module") endforeach() foreach(m ${OPENCV_MODULES_BUILD}) @@ -286,7 +288,7 @@ macro(__ocv_flatten_module_dependencies) ocv_list_unique(OPENCV_MODULES_BUILD_) set(OPENCV_MODULES_PUBLIC ${OPENCV_MODULES_PUBLIC} CACHE INTERNAL "List of OpenCV modules marked for export") - set(OPENCV_MODULES_BUILD ${OPENCV_MODULES_BUILD_} CACHE INTERNAL "List of OpenCV modules included into the build") + set(OPENCV_MODULES_BUILD ${OPENCV_MODULES_BUILD_} CACHE INTERNAL "List of OpenCV modules included into the build") set(OPENCV_MODULES_DISABLED_AUTO ${OPENCV_MODULES_DISABLED_AUTO} CACHE INTERNAL "List of OpenCV modules implicitly disabled due to dependencies") endmacro() From bf3c2b0bbb51de78e1a8d4eece07c44c1f2a70f9 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Tue, 15 Jan 2013 19:23:49 +0400 Subject: [PATCH 6/8] Fix incorrect Mat address reconstruction on 64-bit platforms This fixes random failures in Java wrappers. --- modules/java/generator/src/cpp/converters.cpp | 2 +- modules/java/generator/src/java/utils+Converters.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/java/generator/src/cpp/converters.cpp b/modules/java/generator/src/cpp/converters.cpp index 289a8194f3..6bf52c00e3 100644 --- a/modules/java/generator/src/cpp/converters.cpp +++ b/modules/java/generator/src/cpp/converters.cpp @@ -219,7 +219,7 @@ void Mat_to_vector_Mat(cv::Mat& mat, std::vector& v_mat) for(int i=0; i a = mat.at< Vec >(i, 0); - long long addr = (((long long)a[0])<<32) | a[1]; + long long addr = (((long long)a[0])<<32) | (a[1]&0xffffffff); Mat& m = *( (Mat*) addr ); v_mat.push_back(m); } diff --git a/modules/java/generator/src/java/utils+Converters.java b/modules/java/generator/src/java/utils+Converters.java index 7734841954..49c0844a87 100644 --- a/modules/java/generator/src/java/utils+Converters.java +++ b/modules/java/generator/src/java/utils+Converters.java @@ -262,7 +262,7 @@ public class Converters { int[] buff = new int[count * 2]; m.get(0, 0, buff); for (int i = 0; i < count; i++) { - long addr = (((long) buff[i * 2]) << 32) | ((long) buff[i * 2 + 1]); + long addr = (((long) buff[i * 2]) << 32) | (((long) buff[i * 2 + 1]) & 0xffffffffL); mats.add(new Mat(addr)); } } From b362d47d95787bcd811d152876a4ef2cdef277e3 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 16 Jan 2013 12:43:12 +0400 Subject: [PATCH 7/8] Fix documentation build with Sphinx 1.07 --- doc/tutorials/highgui/video-write/video-write.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/tutorials/highgui/video-write/video-write.rst b/doc/tutorials/highgui/video-write/video-write.rst index 1fd0e07d3a..16be92bbe3 100644 --- a/doc/tutorials/highgui/video-write/video-write.rst +++ b/doc/tutorials/highgui/video-write/video-write.rst @@ -36,7 +36,6 @@ You may also find the source code and these video file in the :file:`samples/cpp :language: cpp :linenos: :tab-width: 4 - :lines: 1-8, 21-22, 24-97 The structure of a video ======================== From a8c0f1d962753f0d7ebd5d09baacca8046f088d5 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Wed, 16 Jan 2013 18:33:35 +0400 Subject: [PATCH 8/8] fixing test failure on some systems --- .../src/org/opencv/test/core/TermCriteriaTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/java/android_test/src/org/opencv/test/core/TermCriteriaTest.java b/modules/java/android_test/src/org/opencv/test/core/TermCriteriaTest.java index 523a39d0ac..fbba838afe 100644 --- a/modules/java/android_test/src/org/opencv/test/core/TermCriteriaTest.java +++ b/modules/java/android_test/src/org/opencv/test/core/TermCriteriaTest.java @@ -77,7 +77,8 @@ public class TermCriteriaTest extends OpenCVTestCase { public void testToString() { String actual = tc2.toString(); - String expected = "{ type: 2, maxCount: 4, epsilon: " + EPS + "}"; + double eps = EPS; + String expected = "{ type: 2, maxCount: 4, epsilon: " + eps + "}"; assertEquals(expected, actual); }