From 65b14fd5be7d0e93dd88aabef6752832fc24e120 Mon Sep 17 00:00:00 2001 From: Bond Keevil Date: Sun, 28 Jul 2019 15:23:07 -0400 Subject: [PATCH] Feature: AI Thinker LED flash Reduce LEDC Timer Resolution. Add LEDC error msgs Update app_httpd.c Increase delay for still image flash from 100ms to 150 ms. --- .../camera_web_server/main/app_camera.c | 27 ++++++++++++ .../camera_web_server/main/app_httpd.c | 41 +++++++++++++++++- .../main/include/app_camera.h | 1 + .../main/www/index_ov2640.html | 6 +++ .../main/www/index_ov2640.html.gz | Bin 4679 -> 4726 bytes .../main/www/index_ov3660.html | 6 +++ .../main/www/index_ov3660.html.gz | Bin 4776 -> 4813 bytes 7 files changed, 80 insertions(+), 1 deletion(-) diff --git a/examples/single_chip/camera_web_server/main/app_camera.c b/examples/single_chip/camera_web_server/main/app_camera.c index 6682487..ec851f2 100755 --- a/examples/single_chip/camera_web_server/main/app_camera.c +++ b/examples/single_chip/camera_web_server/main/app_camera.c @@ -20,6 +20,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "esp_log.h" +#include "driver/ledc.h" #include "esp_camera.h" #include "app_camera.h" #include "sdkconfig.h" @@ -44,6 +45,32 @@ void app_camera_main () gpio_config(&conf); #endif +#ifdef CONFIG_CAMERA_MODEL_AI_THINKER + gpio_set_direction(LED_GPIO_NUM,GPIO_MODE_OUTPUT); + ledc_timer_config_t ledc_timer = { + .duty_resolution = LEDC_TIMER_8_BIT, // resolution of PWM duty + .freq_hz = 1000, // frequency of PWM signal + .speed_mode = LEDC_LOW_SPEED_MODE, // timer mode + .timer_num = LEDC_TIMER_1 // timer index + }; + switch (ledc_timer_config(&ledc_timer)) { + case ESP_ERR_INVALID_ARG: ESP_LOGE(TAG, "ledc_timer_config() parameter error"); break; + case ESP_FAIL: ESP_LOGE(TAG, "ledc_timer_config() Can not find a proper pre-divider number base on the given frequency and the current duty_resolution"); break; + default: break; + } + ledc_channel_config_t ledc_channel = { + .channel = LEDC_CHANNEL_1, + .duty = 0, + .gpio_num = LED_GPIO_NUM, + .speed_mode = LEDC_LOW_SPEED_MODE, + .hpoint = 0, + .timer_sel = LEDC_TIMER_1 + }; + if (ledc_channel_config(&ledc_channel) == ESP_ERR_INVALID_ARG) { + ESP_LOGE(TAG, "ledc_channel_config() parameter error"); + } +#endif + camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; diff --git a/examples/single_chip/camera_web_server/main/app_httpd.c b/examples/single_chip/camera_web_server/main/app_httpd.c index fd5145f..71ea657 100644 --- a/examples/single_chip/camera_web_server/main/app_httpd.c +++ b/examples/single_chip/camera_web_server/main/app_httpd.c @@ -17,6 +17,7 @@ #include "esp_camera.h" #include "img_converters.h" #include "fb_gfx.h" +#include "driver/ledc.h" //#include "camera_index.h" #include "sdkconfig.h" @@ -47,6 +48,12 @@ static const char* TAG = "camera_httpd"; #define FACE_COLOR_PURPLE (FACE_COLOR_BLUE | FACE_COLOR_RED) #endif +#ifdef CONFIG_CAMERA_MODEL_AI_THINKER +#define FLASH_LEDC_SPEED_MODE LEDC_LOW_SPEED_MODE +#define FLASH_LEDC_CHANNEL LEDC_CHANNEL_1 +int flash_ledc_duty = 0; +#endif + typedef struct { size_t size; //number of values used for filtering size_t index; //current value index @@ -243,7 +250,21 @@ static esp_err_t capture_handler(httpd_req_t *req){ esp_err_t res = ESP_OK; int64_t fr_start = esp_timer_get_time(); + #ifdef CONFIG_CAMERA_MODEL_AI_THINKER + ledc_set_duty(FLASH_LEDC_SPEED_MODE, FLASH_LEDC_CHANNEL, flash_ledc_duty); + ledc_update_duty(FLASH_LEDC_SPEED_MODE, FLASH_LEDC_CHANNEL); + ESP_LOGI(TAG, "Activating LED duty cycle=%d", flash_ledc_duty); + vTaskDelay(150 / portTICK_PERIOD_MS); + #endif + fb = esp_camera_fb_get(); + + #ifdef CONFIG_CAMERA_MODEL_AI_THINKER + ledc_set_duty(FLASH_LEDC_SPEED_MODE, FLASH_LEDC_CHANNEL, 0); + ledc_update_duty(FLASH_LEDC_SPEED_MODE, FLASH_LEDC_CHANNEL); + ESP_LOGI(TAG, "LED Off"); + #endif + if (!fb) { ESP_LOGE(TAG, "Camera capture failed"); httpd_resp_send_500(req); @@ -360,11 +381,18 @@ static esp_err_t stream_handler(httpd_req_t *req){ httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); +#ifdef CONFIG_CAMERA_MODEL_AI_THINKER + ledc_set_duty(FLASH_LEDC_SPEED_MODE, FLASH_LEDC_CHANNEL, flash_ledc_duty); + ledc_update_duty(FLASH_LEDC_SPEED_MODE, FLASH_LEDC_CHANNEL); + ESP_LOGI(TAG, "Activating LED duty cycle=%d", flash_ledc_duty); +#endif + while(true){ #if CONFIG_ESP_FACE_DETECT_ENABLED detected = false; face_id = 0; #endif + fb = esp_camera_fb_get(); if (!fb) { ESP_LOGE(TAG, "Camera capture failed"); @@ -490,6 +518,12 @@ static esp_err_t stream_handler(httpd_req_t *req){ ); } +#ifdef CONFIG_CAMERA_MODEL_AI_THINKER + ledc_set_duty(FLASH_LEDC_SPEED_MODE, FLASH_LEDC_CHANNEL, 0); + ledc_update_duty(FLASH_LEDC_SPEED_MODE, FLASH_LEDC_CHANNEL); + ESP_LOGI(TAG, "LED Off"); +#endif + last_frame = 0; return res; } @@ -557,6 +591,9 @@ static esp_err_t cmd_handler(httpd_req_t *req){ else if(!strcmp(variable, "special_effect")) res = s->set_special_effect(s, val); else if(!strcmp(variable, "wb_mode")) res = s->set_wb_mode(s, val); else if(!strcmp(variable, "ae_level")) res = s->set_ae_level(s, val); +#if CONFIG_CAMERA_MODEL_AI_THINKER + else if(!strcmp(variable, "flash_level")) flash_ledc_duty = val; +#endif #if CONFIG_ESP_FACE_DETECT_ENABLED else if(!strcmp(variable, "face_detect")) { @@ -620,7 +657,9 @@ static esp_err_t status_handler(httpd_req_t *req){ p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror); p+=sprintf(p, "\"dcw\":%u,", s->status.dcw); p+=sprintf(p, "\"colorbar\":%u", s->status.colorbar); - +#ifdef CONFIG_CAMERA_MODEL_AI_THINKER + p+= sprintf(p, "\"flash_level\":%u", flash_ledc_duty); +#endif #if CONFIG_ESP_FACE_DETECT_ENABLED p+=sprintf(p, ",\"face_detect\":%u", detection_enabled); #if CONFIG_ESP_FACE_RECOGNITION_ENABLED diff --git a/examples/single_chip/camera_web_server/main/include/app_camera.h b/examples/single_chip/camera_web_server/main/include/app_camera.h index 8cccfd4..7ff3795 100755 --- a/examples/single_chip/camera_web_server/main/include/app_camera.h +++ b/examples/single_chip/camera_web_server/main/include/app_camera.h @@ -119,6 +119,7 @@ #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22 +#define LED_GPIO_NUM 4 #elif CONFIG_CAMERA_MODEL_CUSTOM #define PWDN_GPIO_NUM CONFIG_CAMERA_PIN_PWDN diff --git a/examples/single_chip/camera_web_server/main/www/index_ov2640.html b/examples/single_chip/camera_web_server/main/www/index_ov2640.html index 8460f32..3418a89 100644 --- a/examples/single_chip/camera_web_server/main/www/index_ov2640.html +++ b/examples/single_chip/camera_web_server/main/www/index_ov2640.html @@ -531,6 +531,12 @@ +
+ +
0
+ +
255
+
diff --git a/examples/single_chip/camera_web_server/main/www/index_ov2640.html.gz b/examples/single_chip/camera_web_server/main/www/index_ov2640.html.gz index 4d8c535114e958efdf87b84cf4e3be91649c2fe2..4c398ecb544bde70b78a9efe541c1b3d473252d1 100644 GIT binary patch literal 4726 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 E0B<=7m;e9( literal 4679 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 diff --git a/examples/single_chip/camera_web_server/main/www/index_ov3660.html b/examples/single_chip/camera_web_server/main/www/index_ov3660.html index e7fa8e3..3ed782e 100644 --- a/examples/single_chip/camera_web_server/main/www/index_ov3660.html +++ b/examples/single_chip/camera_web_server/main/www/index_ov3660.html @@ -560,6 +560,12 @@
+
+ +
0
+ +
255
+
diff --git a/examples/single_chip/camera_web_server/main/www/index_ov3660.html.gz b/examples/single_chip/camera_web_server/main/www/index_ov3660.html.gz index 411189c4d218441b4bc7e63b809c6283550b1827..7eafd84c70154186e3e972bfb472624631007c69 100644 GIT binary patch literal 4813 zcmV;;5;E-{iwFpn?mb-q18Ht#Wq4n2b~83MFfM3xZEOJLJ==2III{2g3Wk}Dq>3d= zvaEO!lws)3AJxQ4gB09h=QZHeERuZS#vG$8(rN+;(UYmyUWWF6J|Pv;duf}H-Kf`iOnm#s_?)?g#}tTYPsze@Z_bV90rYwFnz}2>9E%)<#0%RY z4V>w-4ZsPpKFtC@^6YctQSS_YHXB*K>j&`s>J|QMKIgrM&VT5+(HkzWGtX}yWG?6Z zBI+glSvh=2E#~-MXF(iKgUNQnrAt5tQ+2zne`Kjwg)j+&CF@m)8}lJQ?E8W}_vsZO5CP8)sS+eqhs}9T3}z z!gFJwYqKE13}|6K5Zmr)DUnSAXEtY`(v3EGp-C62(r2mM^im_PGxORGqYGdsWC3N? zyo{8oGm8SMAtaGo3B&Mk^HFpsUJ{n%eaN>Tc6q?BLS;}kW3j3s_{{@ zifU}d-O2`z=QvpN`;zqF!VVJd=&~!C7+6G3+mL5hT)vFv2)hM=LSI=r1JH(I9 zh6E>tQ3Q|rkt9V{8BH{ZizCVg-XibTU@a%1ZgkNgE~B9`%HVNZBj0#5i5T;}aIYb% z$j|%x136_N*ufF>hP?4j>LTJI?xG&5qjE zMAMfaF_f`Z6F#uxup8|&>4};ru?v?zUj28Xq-+@x+jCm%t^~-u5i?ZjwGy<8bL@_+N9kN9Z|WFNeHzY)0AG) z(ED2YcuJ>rfmpnHvNIacH&GOfqaf zT>~3|;ZZC5EV_Qr>X-VlK-U4EArqI{C8L>5rzCP&g;kO+{*?8|!_Yr*UTDMv$G>hQG zPT-fOo+&pjDc%Ch%Z2FbX{DlIU#W}wo|K(m>UAo{;R2K1-Vim`vaO02{(ssc3Hg6- z?TRS=)Rw-rT*5=!Mz>h&ZJG4}g&x$P0TiQ!nW55V2N_Hq*KNE0x;hgnx8w~wtv2~x zsf{3V{hy%r&+TxfuCd!dv4cJC*HJA~5}9Cm*|T<-HQ%B1Obercx&$-$on|O1%QqFg z4kui6U(f7PN8}F0v087|73qG~GxUwNi0E<9o(1%#1~W(U@41*i-hHZs4*=4NI)kuA z*Tr4dvBzX~)HG{^o01_^Z>sU=tFPzjloh=E;d$ywd30+lvniF4Bbmf3wmvOpjGkK~ zFIGvMK65ogn}rE&HhmPZl$Dg8EJ*HfSW^BVS%j1BCVpzy|OIAY|dnr8oRR~ zkoKav62Pd_UmbH-=2&~fZbg@t>xX+zfECYwX`j>@x=Vek+#Pc=?{&42wse+~&!F-5 zm*<8>^;l(csVlU^>p{bENf?eyTt{SP7i?YF&dPA? zk?Hy~KlhA37cXoeXpYRx%Pf;arMJxS<44~CNei}wYo9sZhsH5&df2#1W2x*4$pQ+^b~0N4KSSncf);{8=7OpGaPiU2WNZWIW=Xb zgXSNfnd8eJUNr|mWB=RX?zjhF7f9qu9}o@pAo9c?@HA*ji-gJ~ooLGF7Ij=)=((+86j*coeR{EvV!C_iMWrX}FQ-r}-;r*5 zy}KM$meg{H`+-iUPzG&3v}C|xd=b~i6~Eqk4kL%|OHE{S^|kPienRK2vl@Ve&iJJI z&N%vD*#WuXUv2JFNWY`D@r&c_&ddM_q14+C%PEvdaIzngAy^V!I^=68;>mil{eZHb zz_|ST3*(9}1KT=Wi8s`B3|#~&NvF9nC#rX#y7QtM_F@A03q4cewjPgnn2K5J?b9%8 z4QjGixI)l2KwtNwDD3qxisJkpT2WvvA8;Jq#i=-;IetsL2nLz^QdrXQ!Q4yoeQ4DI zAq(H$zTA;;A|$?rv#k?@7{eWB1frDMJsEf(dEU)FnZTv%NA~U*APx9wI(4kw6A4HH zUi*uh@OM1$Qfr4w&H^o7UEb@!3w<6aG9b5y4hlfT2W~vOC`&*l5j`%y4^`i#6lJTs z-s#CODeq4DU$($Qs;z>AM6mw9KWGnXk7Y%+$!r{w8ncrjLHPlht}78 z;RJynY^^d02W3V3EkC;#b;Z3NMq>%jhgRBZ>N?AOPH%y>cWXFy8&y$=^knLMQd>|@OlH5bfG~zSm-uQ|)HqgqdyTi9hR`E-xi(`*y z#9g3;3$aOR0V+HG&WuYU{d_iIEB{%ooc=2zp2#J~D=O7y%mX?dnU4~jQj*vNq~)(Y z*C&`6kR=03JAW)^xM~_#5|Mhrfq#fA^C3J<)cn8yQ)QdDRcgIS(t|3y zjyiW?+*+KmhrL^O+*dR16svPuz8i5uoHM@yS9`Wq%f(4a}(Basyy$tUjsFQcur zSM@ePWG_dC7eUzgjV@_|#_Gwot##sg< zGM1wo58eSZ#kU~oUJW^M;=w!KY*dO>F0>SS^TQip8JjNL5W8=` zM1vbZ^zoa|aeTi$=HF@g?sqT(jK2BIRek#yx`Yef@$E-}Vv0M@H#v$}Zyh$LUNfNK z6428$ki|XvE`_0H*8CVyfCB=UZ+!EaqqsGu;LYKj+D9<%5Qe)HeDgU*)e*ODKPDEE z3FEe(>CNn+>rQhm6r3NOZ3VkgW!H9(R1tavkdv2If|laN+50M{KS3 zqi@rknYNIO<71FAvEz^=bcB2G2r*?OESQnJ2$`j$bVwnBSGB8xvl-)puWBx2aa zfgLCaG9oGxQ?`<5q>-dRX5vuBG(Mp5p8v^>=3hr*5L9APOA(l`K>V*gY9ay|{gq4c z^u^5&FnEg;gj16OTqY@JC1jeODmZxVDI!i8hNQa4fFjmv*i22Kz^l=&3|=WC6liYB z)xc_^tI`g6b2V_9oi`Lch0I@yk|^gPYsZ5$y@Su2a(q=~)NwqJ{p(-ezQK5W0`fVKzJcn5NC5vP)z6x|3>xS@x5CfDfOCK1j z-4w)&R7}!Av&1VwRunYfeXu4FS6_nDbUfgobz8=c5Lapgb&22+Oph%iA3ZwN@Wm1U z%>_Ru)2{kb0qxlYFqdfv0VGaQfC394i+C#%s$OFO zL5xbrX_}&eDIGvub@*mWn98CJ@Qci2v3*YbTwI9;NiVp!O$RsV_3X>J-GBVYlFk~*j$?`#v7|>)iRRB#q;T7Vc#r1Z)PcqYKY}ACub{&D2PFaMjUw}D$9%`r2TA*@b@q#gQ8 zQzg+u>?rv%E1MQwM&RR%IHHPsSgRzVA8MDf0SO)}gP1IIDgczFXB-x8ZIZ1C5zwxc zL@Wf7Xur|uETSZ&(;@y-VTFyLGnUBlM3J7(nv0$IpWS>g*5g@IEs%zcE z7=M3}a<-n7(kW|Dg}ris%!d_%t@WfHTX7AG04ZDgN;hUDd0)f-4_LBsR6?wH*-@Fp ziDn9uNv&K7nzU4)6FN$v<3=KbOD<~(D`}lNLW)3Co@3)QKgS{}0Ksf7?^hcnEM?jx z4kF--$gCuVxHN#l_-B`5-7LS1x%}ak;RlA;N;pWi4m0FFn|yY{@n!~_J0TQnxE%(4 zXeOgmC3~VeQ$u)0oB}45Xn9ih2er1(|@QvP^m1kfv_ZsYIhV nhpLU{#aa;(7o(gwE{@}wdT}LoCcHQn|K0Y#8N-#e^>zRN$GSS$T2gcI&;w3kxO6^p@rpRO%}&LK*Tpta!IuG5a?j);Ziz}7TAxEDyT6cZI^@s>YV8zUig({%lPsG z9~%_N23m(`$pF~Dn;;9~3#U4_P6plOb%iNUhV0KK&=R>W@n`4OnUO>gx;Siy$R%-f zZVgN@3lz?P7a9Pw?Vgbn2@;aooPtR=VDd_nAyj40QoWhAhCDL!+l1l;h!fEeQ)gbr z%9PCF5E~d#dMgnaZf@Rcukqv)p>3&?37!TaHbN#4Uf_IcM-+v$4nZ`fIIO0JnO9U( zD;`z?5Z@y{uFqc4xLI-ns)k|6VpirQT-MFOWZd++-M?(!oMYjpD5k;w5wQ_gIXV8i zz%D^nQw!&_F8EZ-LcVJ?gOETVAf9eKxB?T$61NN@m&A;&5p&qEUyYQ*ew6`akdc!w zvzN|ck)7&Bcn0!b` zQkX^9uYM*;iB)D31L5L~vO%{fx(!szS*V*`41~*gsLV3#cUz<0cr=MA4g6@YDXJ*W z{)i(=rZ;UF(hz4$1SRAI(>2EB<%W+|kauP?&*Xbf97e2eTLuIOhnoXuW3c8xZD(Q_ zD~Ku6vC$F%h(qX&@t%xC!<{4qOQ(e_U+2yoJD;%oq_PaFDi1rvU&ge}%Bkg@*ql3L zB4WQ^R#coWugjI7GduRs1bbyH%U~!-yE0c5*KVA%bn+TJ{Yz~<^5dh-r3iZvU`3@j zz^s9X(g8x`&oJbI>!akbyfLUHK1{4bB3(;*zlxp<0Vk5+gk>ass&Bl0x#Pqr>J;)&y5hB1>; z11*;r0hEJ_>`<%4Fz5MNeS2lVs^W1gna`(z6Pv1tdiU1FLWL+Om$Q;SPv$BFFpiS;4RylcoF=kEsBu;_uj6l z;!o}ATk9n{v~P5at=^VZA8_bH4;n%zOu2A@&ff;CEV~sBGVK^g5Do z)qOpyOC3==6z6KQTUV6(*~l;hZIRKFq&*AqO$}j=ZonkNH--@sM%GM+1K39<0&n8_`~belk)7=)>cz0GlyElEcQMlWtKg+CSGik zql zT@g?;*{_bfYiq2%VYgyP#|xr87r=_wzl?WkP2Ht2RUVExo%g!NOk282$yd<$^UHI~ z!R9oYU8t+GR9b3>IdNTFx)#iO-kQY&btgel`dUNpt|LZHG({`v*;1sGRbz0g zwN|Dw&;x_o%;p+b7suMGR~N_WTVfaN{VV+qE%A8Jay%48Bb&WPWM^O4x^T(LBJRlc zf?1He$M1^=Hjp$&cIIK0&9Tx;_W1FmZ=XILK6~s>qNV)%7xC;*yg&wdlv0p0x;W-U zbBr7VCk4F8xz)s80usS=F+rgLgoBC7jr*<5=a@-wotJ!$IrfSb%I#t80&cWwc;^>0bBx-R|zRzO~2i zIjQ~`km~mLVC&2tb4ozu`swg&cS28rr{93m8AvzWN4TLqW^{&w?)Bho4?3r|taOQN}6_o_(= zaxYg+Nz89%vdrzWl<@BuDgt`5bwZGMAd)z!mkTsb)Wd0eJg5+Wqv{Ej<7W7`S$)W? z&R%~44?VH9sNN~r7Oc+P>nKc=q@uZvV)R z_A$rvm}_q11koN}T`z-(ypoVQA>uojcbZ4IO0+T-ujlYI=+-NPe+^3O#hh6Iz;_oiZfH8uxzaN!TXp!JxKO#f$B)lZ(YiQ!pdb0h5vYx=a z{QC>*ioXW7b-EHysOvboNK}$fdt*)196)u~MGfL54DtthwkB;o8Sk(ZbJp9JVa^)N zW+3&7->n6-TtkZ;>CvBy(Q|Qv)9?yrkTRHXSgs z2;A-49f>DW;#)Y{x-dv6+;K%9TB+TOf%mcR-|SNfTzWz5?oI*9fS;yQ;_O~XKoRgd zSk%P7MZfHl`_+g6|6)QYgzjwx!(0YSuSBCo8*S+Q<2jz`&f5S#qB;p6QcEp*#d2C z42cJ}c>DZ5%Y|gz!^Dx2`p~(~!~XWkjv?9OH`tG?%OI3nW!;O__{fJbnGpKW_L?t9 z7zW|iCX;y3R}(Nr9HH% zCd=*9A>i2K7eC)m?Z*bIX`#LB!G$`sHP$;=W6c=<{hq9`u5XPm953sy!9M(3j0xI) zI!X}POJi_ky+HRfA*pfiBZN{R4{fI@a_|Qi(_Nk|Yq<9K6`WWv`N@5ieERtJVYQ6B zUxneIzz$~qPM5vt>j3%HooG( z7W1;|;n-6Pr}*K<#j%eJ>MpRth1iUVm8Rldo# zWK9)dTT$qYY~VBuq9_Q-j1(HdtnFiyx^ut=`(8v&NS1W`zzv*ufqmLRu6wnDgEu6i z7&PB(y!`3yrT8-K4d@HIjU#Is`y#ZOn8AvzaaSm`CMd$MgNRxqOHuR!hresw5pqdL zA^5MM2cQb;iPbni>owRXfM9yK0A|Mk07+#umY*bIufx^P7-ZZw8^Sjl?BnKJg&EC* zbs1)e7r_eWkQKI!pvs|>NNcnb0JV48$f9A4vt+SfMKxiol<*XJQI2xFbP>hBu~kX{ zXkzb3ELk4OJMVxl#jSKy{W4%=Pe+y?L)!R`i(s8+?s9AoGNRm8pO48ek|`Uw!#DXK z0gXm7qcqaJlXWDnhmNeh<^7es@$lhF(X})%xRu_xg&W!z*PFC+G!o((g$IiBj0PS* z&Qg0gl31xE0v;j*A`irt-{DJ^$h7$|qj<&Rl&OfgTtWOfWh?#CR`B;7_xdK5kNjGo zf9A~T1qq)HrBj?`C^Erve6t@P06^Jld%7n;PMz$>2i^oMrDiN=!!p$38tNW&&t zvM5XuLJYH~uSb)}NdJy;cmsq!e)BoW@3+VNd!WGk4rYMSH=ntwZy&>uaKZ<^{U}IG z*$(GTP9m{eht9Fz3~{ss@;FUo$%ui6VXB!mKZY3afB_m<-+bmIZmlUqb2P{95zIS? zvajL4`J9mIh)cI0m4~RwAeqDXjSi>vo?9UZpL<@jA+~&wIl2Rd?iB*I_2ka;PT)Hp zaXzuc+{!X8BHinVExdjVT%2>$7GvZ17_^MsBqa$OvAte|nlc&|!bn+!&eGXB5jk~R zVLeOf;*Tiso2>^*4VyIB02+aeii*^f?Iap$CMnRF_-S(*pV0Wo|Kv{duOl%DYB{N; zDNJ}E``=;oLIf)MD-W~77dJn^tEi!VfjjLts2?li0@=?9D!N91GTrvQ>rFqVZ;tUiZR)&mGO;MB`?7;&k6+b zb4tP2EfEC~OHi^cePHQ+Q;;uGHOT(7mu1*g;%85(WYueiIX9a=B5p1a}|!}7YRVZyB_T z9kvmy?_SP{=QahZ9ENkoy1r{hMN)-uz7*G*jXty{&k`H5OC2{v>mOL#&fVcC-OP}N z>3^2R=z`kNukYTZbZPKXTxvFW-+%na63-fHXDdyOtfgnF65!8tqHx)Ve9zpyX+ljJ zeumB@c?BKLKQIcx9#5>M-L;=I`SrIT&b--r(rdNY_FN8bw)+VP{KH|yAjS7z2XPpc z0lX!COmQj5d#HPTcLT)c>l8_|0i89kMzuOrmO_|4XoVZklwT|7NQ({GZf@8=m$2mY zZLuwO=BzT6DXdO~WSsg-OC>Qv5-9mLD_a&_#t`F+B%_LJtXEN~A9|Ov2?=g%lbCFD zDiE|+oH#CA+GN|1A^@(XG8RLU?Lca~&9*F`ur}JUTg_U@OQNYfxLkOw3!k)?6&U&} ztwMZUQ+zDNX9#I0RNd<;XZ-y|D%pBc%BSo>HSx+3GB5B8vDTA%VkJE+LrBFkce;rv z>Uj6mON>-4ELzs+z_Au+4