From 5e15e8cb489c9ebbea14b651975ffaa851dbe61d Mon Sep 17 00:00:00 2001 From: Julio Cesar Date: Wed, 5 Jul 2023 02:09:38 -0300 Subject: [PATCH] boards: xtensa: Add support for YD-ESP32 board MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add `yd_esp32` board: - Model name: YD-ESP32 - Manufacturer: VCC-GND® Studio - Espressif module: ESP32-WROOM-32E Signed-off-by: Julio Cesar --- boards/xtensa/yd_esp32/Kconfig.board | 12 + boards/xtensa/yd_esp32/Kconfig.defconfig | 20 ++ boards/xtensa/yd_esp32/Kconfig.sysbuild | 10 + boards/xtensa/yd_esp32/board.cmake | 9 + boards/xtensa/yd_esp32/doc/img/yd_esp32.png | Bin 0 -> 63602 bytes boards/xtensa/yd_esp32/doc/index.rst | 310 ++++++++++++++++++ boards/xtensa/yd_esp32/support/openocd.cfg | 5 + boards/xtensa/yd_esp32/yd_esp32-pinctrl.dtsi | 77 +++++ boards/xtensa/yd_esp32/yd_esp32.dts | 183 +++++++++++ boards/xtensa/yd_esp32/yd_esp32.yaml | 23 ++ boards/xtensa/yd_esp32/yd_esp32_defconfig | 13 + .../bluetooth/hci_uart/boards/yd_esp32.conf | 4 + .../hci_uart/boards/yd_esp32.overlay | 34 ++ .../esp32/deep_sleep/boards/yd_esp32.conf | 2 + .../flash_encryption/boards/yd_esp32.overlay | 9 + .../boards/esp32/flash_encryption/sample.yaml | 4 +- samples/drivers/adc/boards/yd_esp32.overlay | 41 +++ .../counter/alarm/boards/yd_esp32.overlay | 3 + samples/drivers/dac/boards/yd_esp32.overlay | 17 + .../ipm/ipm_esp32/boards/yd_esp32.overlay | 3 + samples/net/wifi/boards/yd_esp32.conf | 12 + samples/net/wifi/boards/yd_esp32.overlay | 9 + .../sensor/grow_r502a/boards/yd_esp32.overlay | 28 ++ samples/subsys/settings/boards/yd_esp32.conf | 4 + .../adc/adc_api/boards/yd_esp32.overlay | 35 ++ .../counter_basic_api/boards/yd_esp32.overlay | 3 + .../dac/dac_api/boards/yd_esp32.overlay | 9 + tests/drivers/dac/dac_api/src/test_dac.c | 3 +- .../gpio_basic_api/boards/yd_esp32.overlay | 24 ++ .../pwm/pwm_loopback/boards/yd_esp32.overlay | 37 +++ .../spi/spi_loopback/boards/yd_esp32.conf | 1 + .../spi/spi_loopback/boards/yd_esp32.overlay | 41 +++ .../coredump_backends/boards/yd_esp32.overlay | 25 ++ 33 files changed, 1008 insertions(+), 2 deletions(-) create mode 100644 boards/xtensa/yd_esp32/Kconfig.board create mode 100644 boards/xtensa/yd_esp32/Kconfig.defconfig create mode 100644 boards/xtensa/yd_esp32/Kconfig.sysbuild create mode 100644 boards/xtensa/yd_esp32/board.cmake create mode 100644 boards/xtensa/yd_esp32/doc/img/yd_esp32.png create mode 100644 boards/xtensa/yd_esp32/doc/index.rst create mode 100644 boards/xtensa/yd_esp32/support/openocd.cfg create mode 100644 boards/xtensa/yd_esp32/yd_esp32-pinctrl.dtsi create mode 100644 boards/xtensa/yd_esp32/yd_esp32.dts create mode 100644 boards/xtensa/yd_esp32/yd_esp32.yaml create mode 100644 boards/xtensa/yd_esp32/yd_esp32_defconfig create mode 100644 samples/bluetooth/hci_uart/boards/yd_esp32.conf create mode 100644 samples/bluetooth/hci_uart/boards/yd_esp32.overlay create mode 100644 samples/boards/esp32/deep_sleep/boards/yd_esp32.conf create mode 100644 samples/boards/esp32/flash_encryption/boards/yd_esp32.overlay create mode 100644 samples/drivers/adc/boards/yd_esp32.overlay create mode 100644 samples/drivers/counter/alarm/boards/yd_esp32.overlay create mode 100644 samples/drivers/dac/boards/yd_esp32.overlay create mode 100644 samples/drivers/ipm/ipm_esp32/boards/yd_esp32.overlay create mode 100644 samples/net/wifi/boards/yd_esp32.conf create mode 100644 samples/net/wifi/boards/yd_esp32.overlay create mode 100644 samples/sensor/grow_r502a/boards/yd_esp32.overlay create mode 100644 samples/subsys/settings/boards/yd_esp32.conf create mode 100644 tests/drivers/adc/adc_api/boards/yd_esp32.overlay create mode 100644 tests/drivers/counter/counter_basic_api/boards/yd_esp32.overlay create mode 100644 tests/drivers/dac/dac_api/boards/yd_esp32.overlay create mode 100644 tests/drivers/gpio/gpio_basic_api/boards/yd_esp32.overlay create mode 100644 tests/drivers/pwm/pwm_loopback/boards/yd_esp32.overlay create mode 100644 tests/drivers/spi/spi_loopback/boards/yd_esp32.conf create mode 100644 tests/drivers/spi/spi_loopback/boards/yd_esp32.overlay create mode 100644 tests/subsys/debug/coredump_backends/boards/yd_esp32.overlay diff --git a/boards/xtensa/yd_esp32/Kconfig.board b/boards/xtensa/yd_esp32/Kconfig.board new file mode 100644 index 00000000000..843b2b38627 --- /dev/null +++ b/boards/xtensa/yd_esp32/Kconfig.board @@ -0,0 +1,12 @@ +# YD-ESP32 board configuration + +# Copyright (c) 2023 Julio Cesar +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_YD_ESP32 + bool "YD-ESP32 Development Board" + depends on SOC_SERIES_ESP32 + +choice SOC_PART_NUMBER + default SOC_ESP32_WROOM_32UE_N4 +endchoice diff --git a/boards/xtensa/yd_esp32/Kconfig.defconfig b/boards/xtensa/yd_esp32/Kconfig.defconfig new file mode 100644 index 00000000000..ebb60766eb9 --- /dev/null +++ b/boards/xtensa/yd_esp32/Kconfig.defconfig @@ -0,0 +1,20 @@ +# YD-ESP32 board configuration + +# Copyright (c) 2023 Julio Cesar +# SPDX-License-Identifier: Apache-2.0 + +config BOARD + default "yd_esp32" + depends on BOARD_YD_ESP32 + +config ENTROPY_GENERATOR + default y + +config HEAP_MEM_POOL_SIZE + default 98304 if WIFI + default 40960 if BT + default 4096 + +choice BT_HCI_BUS_TYPE + default BT_ESP32 if BT +endchoice diff --git a/boards/xtensa/yd_esp32/Kconfig.sysbuild b/boards/xtensa/yd_esp32/Kconfig.sysbuild new file mode 100644 index 00000000000..3a2d17ac5cf --- /dev/null +++ b/boards/xtensa/yd_esp32/Kconfig.sysbuild @@ -0,0 +1,10 @@ +# Copyright (c) 2023 Espressif Systems (Shanghai) Co., Ltd. +# SPDX-License-Identifier: Apache-2.0 + +choice BOOTLOADER + default BOOTLOADER_MCUBOOT +endchoice + +choice BOOT_SIGNATURE_TYPE + default BOOT_SIGNATURE_TYPE_NONE +endchoice diff --git a/boards/xtensa/yd_esp32/board.cmake b/boards/xtensa/yd_esp32/board.cmake new file mode 100644 index 00000000000..2f04d1fe886 --- /dev/null +++ b/boards/xtensa/yd_esp32/board.cmake @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: Apache-2.0 + +if(NOT "${OPENOCD}" MATCHES "^${ESPRESSIF_TOOLCHAIN_PATH}/.*") + set(OPENOCD OPENOCD-NOTFOUND) +endif() +find_program(OPENOCD openocd PATHS ${ESPRESSIF_TOOLCHAIN_PATH}/openocd-esp32/bin NO_DEFAULT_PATH) + +include(${ZEPHYR_BASE}/boards/common/esp32.board.cmake) +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) diff --git a/boards/xtensa/yd_esp32/doc/img/yd_esp32.png b/boards/xtensa/yd_esp32/doc/img/yd_esp32.png new file mode 100644 index 0000000000000000000000000000000000000000..8b530e819173d7f587a8ef01289b80570d974b9d GIT binary patch literal 63602 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,cqjeelnX~zfDSCa7{SoTSflzr znI|%jk{K!BJFmnl0T%H|N5+vOmwlfy_x%>r-JyM(Y96;kkX~#n&A*M%;C-I5;QfGs z%NBa*gvR_x){o`7kCm(1+E%0bwV_V|VD*WDk-0sZ7rPMyOVz6ogmkZw?K-=%sOV8H zA^kr9h0lOi9?;GkOH}`nRLjUr^ba@lyH5cK(0lu{o__~K zZ^F7R;vT7c4o&zkq-UR+TiRGH5vcD!qz*KZHtc8XI z?$e3yIr=|ji~hIRTM3r#j?azdkT(WG7&LJr>^Ik$awAS^l$Cwm_`~_z{}PABekN*8 zy~*-q;ci*KYQGXZ#|j)B?|AT-`2$ElFZXq8d${{wN&qtDn$gT4@d5D*r}9pg^`t)l zu9i2kg-BnsIBJccmZqi?+W&QwGv(Z;0j83lG zdz(e@{%KABt%Hv?#rmWJ77lFcyd&{R+;N|{_))yDPvgIOXt;7GveW+G;(tppIyY8y zBg;15pKC^pN;kMkxr_e*zRXcRtvthA<$V5M3Q&1|E)`Fd?N=>kzA}Vou6bed$yk2? zz5gF<{+I6C0VJ6sy{Rt%#RjR`MLe2ma>GT!aRqHY73G=xN3k4002nP)h^UoX*EHn%pJQM%{1M~gcEEFytE89mhPOeYfD&&;x z9HL@W)I1c%Z*xD0Z^BS;&<`wkX5Vo3B-UXa?MLvkC(-evQ%?z!^?8Y8J zKHu4@IjOn!z7EtiCj#fwIe`6!io+2imyUX${jsO2(fqGe9O@X!6&@*pzYD)DO#3@%|rP<`V zM{g5xx6K$LZT+Ry&g6ykd#jP^K`cjM^JziM(ZbwXAovde&&}-*z}YOCnVq9T+Txlm zL~^X5g8mO6A@2^#$XDva@Oz}-cZt2A58KGYg_1Se8bMaYM?(=QE64}0$V8E%oVz`J zLmlKlOLN(1`~oV~rtKfd#wfZeUAI#H07zjIdb?o{IYW3K@N-Ds(GZM(%z@S@gz@Xz zx6&z-WoL_zjnYuq4TEQ9ai+1v+w#L=;jrUV_MN_B9{d(9QJ3Z^wlPX#KVfTY@OVg) z@+$8hrX|AM?9m(cBZoiYv#Tn50-B`2Xe{plTTvswL(zskw;zS_C{R2gQv!T5(!A96 zvv?tKPv1=MGoYrX-O@peLotxQN^J-xtN{H)7fsWN|0JBEDP_CrzUOD8zZHHWM8MTM zU;=+2TNztNqoE)zkt`w#Cp03Yf+KiABbi@3r@oYEAy6_5J!vJaal3=K&ZHRnr1!Wk zuKZnvSl<`;+t0cO@5*~JEgXd{T}{}d55F(+GB_tkx}Zz$Yc50LjFU~MTu^nJUNt-26NrS?=#z?gTAoiAAoKD zLk|drAyU{`F-2!=Txttx`WRT45Rg zI<~XrY@roZc>N~|-kr@*JG#x-s2BTD!mE1qjTpx^cf0&Q0Mmyvd?f3IwE^mV=ox2M zWm1oyi61v=qI$kSaF@=tpW1TNR0PXbz1WpDt-)m8=T>~clzqM0iDGh@Ch^e;_SM7+ zSs@pY*p$P&s$`Q6X<2#_1?hrzyGQaE7~F`5c^V!muA#G75g|W2yPDq#5Koo7DaNr- z-;P;Pqle=@bpi8p+q$na?pvCp75j0DBwJB)6{%^D;5uG9e!{~>M9o~16AVQ}AvBH8 zAD=~2>;%9pAoRFbI>;zYesIA@jV4na)wlvn>_BgmNkfQ6(%~o8LQV=q7YLXMT_Eyn zi>q-SIZC>#R5BgD1PY&-;?r_A{>@L_BQT=z%g+>8w3z4O{X*M#vzplvgF1HG#u+@! z9gi3{Q||s^-#epEA6kA_1jP+Xy8h5i`f@NRJhq+vWq-r7JBV(ixNFm2P0a7Ho4-rR%^voriyVxki$2gJEm*=EvrV1ioU zEM<)uZ;_xWVi0e#6Td_&Z;z$!USBWY9M!U6WCjy~sR^A87L4=x_qu}i5a~LTl_9F> zYg9NR{=RZJ!J{KPk)YegFDE8phr6T=n4hGNh1auebhgXVoex3rGMnj|LKwBLf?-qD ztmO&;8TdGhW42mOmsuCeBvIoUnH*O$;-(PCJO$UVC%;7|c*d9qC#kxY-`@r@euq|# zl)|wi`-@p(^l_vlgc?gV3sCSuENpB~6wC}iILQDkrxp|%zkcS%8A?h2*-~{c9=?a0 z>*QM7>bYrZ6Cs-yn{nHyFfST~v}DGPcYC-u_&{R{d_^hE?O`*G=ec+a^{Ll3Glwu4r-lHc;L ziYZw0T`J1N^_4f;a_0)CAFhcc=TZS7v7D@)XOq&Q# zm7bPs1-|x%zXzUW*GnT4#svg5aODPQ7A=LU(UAF>D_fy`iuRX5U9cy|=5vE1THh9# zF4)%eO~4Id)JQFdP{SIB;vF`U?ZkaxGu0@|T(z2lmF<_+WwamSru825yy6*MOqks; zzcom&po(vvO-p^~Ffy65sOz?>HaJc)3HhPUol`%Y`-osnk2`;Kw%|qQnjZWEY~ESf ztQOlR73odswaa6MKKSYedSe#jqHkeHTl1ThzQRHk=txI{C_~X3%21BY8uD{hjA}<2 zZD=a}HQP*+;Y)I|vLlPH;B5O=7T)1KK==YSWBCiL@B;3R{d+17%Q{w9gm-j9yk|ES zv(lHnpIlB%=?W@75sQJhEP20urQ@e4H{`FN>%tll`p)O+hLk|xsZ)k$?%FR(jjZB= z2FG{o=Jb1unh*1sYaN1nKp{9ib+<3!(i%Y0c#NKa`?z7 zFUKH=QDOUC)!_SL3swyr^^eatEYprq*`Ki()4VAi6G}l5?%x_ag^{!U!!=n9wJpV(R=$r&hxR6lfg zkC$;aCk749WA?)eUzK-ho#=d+Y>ItBFr$kVr%cNpom$b+{VZOcwShBQsx@g1o_@VVT41mvacj(ZAp7 ztYBN?DA4{~QAHqaVgtoX^2wo}Yv^F#UVIDwuCm4_7iiVLilUY{U0l z#V3)KfGe_w*V0}XJ`KZe4}o?9dQO8P!}?OkG>Evt2?kdK7IxDkRknlKxal!LfoHBY zsY_va=>wixYtg04!U1I1?$IpP+iL7epZ#XkF0 zn3MaozVlyQQ_@}>>B)p`bRL4ULJ3jNFjmX5nMO5nB(jUeGfA@d4F!6BsnD}d+b2JI zS!OtPl<>3w7%-jvSS>yxe{hC~)m&{BHT!m(nV56_Qst#W?QY}p#Hd})M&hbrf@Viq z-zFIBL{&S&uWdJ3K0ENk>0bQRsn{g7$BS8k+JxzasmV6M!pu~=ZowPR@UBWHfiP5G zoTz`LmuQ{v^KfZ9pxclKDi6a4ptjUJ7<0$`4gOhM6vkIfB^>>9*Je=T=v(nfbt;!% ze5OA3r1Zqoayt2qzN2F;pQp5294m_Z{<7@mVEEJ2ai&kvHT-0+0J_tF3C1V18w{CkZp~OG6#gkh8>-G@?(4H;iu&|;&f4e z%%gP{8$AgpG^7FE{jMtmOFFB{dR2&0Mg?YRiVa+A*dZJf#_e{2tm4PEBcvQrb<|JH zx|-OgDMbhUyO@{EJ*l}lCAXYFquSFa@+?hz7ecH zhcQOEmmf#XxNux?lnn(THrP41cxzE30L<#&>1>9!V3C=|fIma@sCh+MO)d96lYK-d zNZ!u`HpapyIB$9B;Ory;>j&}fObR}9iE}8AlTZQ&V>>ckazP}!yk*KB5bXb5ax9_r zBldQbYgMDDSs9oN30O9wo~o;E^KEvqPDbzU#JL_u*Z+fvo@>5A5(o)w;)wUN$1701 zm+o%P*X6XrDl9oih;^zgEFm*hVMGAgqLzMegh{k9kr!WS{MH(@Ff^}7y3 zm$6TPjEk2sn#~Qi7mLk0KHES)T-*4zQ6n5a!qj?lRKTr39=TX}75@;@D2<-0!1TEU z)4~yqIZ@PSmw|l9gHdD%(-N$2{p^C37Rjc99o5igwTv6GktW6G%UynUbK<|Ruf+d@5l<^IvGsl3QT@>b{L{Z2LnA-v3z6*r2T<+Jt*mJQ~9V12y{X&tsL1NAz_? zb006k`e7l+QQ)_~oKMVm_rNwOQC?%h4iQ7*q3#P~2o9h=Xxq4i)j^@v(51{o=9_RW zSI9+d{$ikR)E{$f+i|L@rd}%OG0`-&Jh{b!qBRw}YVB4v!$Q9L12a50_$ZTk~2;pybjMnv}L&m^4JP8TbJzkMVhlBhR*jLu$>v>JR0$V` zDU!pXY^e%532Zn3A0!yu`5Le|?;;`d8w%_52Q3QG-#z48$VLPzjrn(Ivb*3T9NYse zNAVYopKDtBu;Q;kwPPR{!J2DmG(w>-$nqb*BZ*fE5NnjgyHXt@$Zn6qxPa*;z$ktE zn<&!^>dbffNUD$AA43I;uj?-^uWAKA@6b3@CMSD_e3v6|DJ5+y_^{wkle9fc1)H}A zi}82n(Q|}aI8LWy+0;2keIHVr@*#e7(&WZpB}5o43!j`l-F zCs48pT3ZV4J%xV12d&+HD2jMboBDajsr)TzWy`U;^8?#WlfjZoS6#OA!C-CsZEV)F z|0kjgbRjFoT9O8n%k9^&-(mWWvhmOLVH@+XLF&t67H9p|PjeheEuP+;$T@1Z4YL5k z=dYsa*Fr>yt!W(G@AMUAj`#bGn6t~R5en{6S<}Y7*cjf%>G;$TP;4ptQ$fQPolBH5 zeSOx&oLe{F0g`lq zLsfcumLH82$A0*FB-4dw+d@0I)?X)=qk_nB48Tw`y zXwEhZ+e)bv;6hm&0?-rk^VpA>u^-9<9LAxpfO|skp$L?MLWxgJkvh`SGXe`X zY)rQpYF#NaWA?q_02=t5x-eC&XJ-=WXgxV+(Ltbcm)3wA#}CyC@ob_SvsMjjXu0*h z%{6lDCQbRL`3nq63ik^=da+2f2NoLC*6GHhL3JMwy0;!T@WgB5cqK&C3m0OAl04n` zt4Drlb<;Eq|KYO^CeHzn*U95RYsBy92h;*DG4nw;ts>_!xu6O-6IG@9k#+UOn=G51 z>UwdjE5RwJ_ z>@R(~iH6q+a2T~I&NusLrtf`Z&j%1p`hJ$>e_iqHkFVqw8)_EI)z}5=U$h}L@bjJQ z7kP|a$JI~S>|6(l_#eu$%JUdVd8b@f13)Ra4iuF!u>&~Yh1W+bXmkc@KyX)s*m=x2 zw-}trrUjJ((yiK}SY<9)aUAyYzv*AWQr*08gMu(w!ae3y}36^)ZogRY$1 z7G9-!PtHEL%yT0+tH2nW_> z=Z~Ks0}SU=Z(n=@jOJ5k|7Y_~_A6|h!f=s+{e zrCc&%vUlz{OxxT`;cl)?3M=jCeEko=H6xV3o7O72@Pi2AcnIf44v4+A83`lZ07A^j zK}cib(sC0^d-+4Ue>`xPPq+`-E!ZL?4rgd*?P&FiMuIWd3vXt-#8SP@!KhiUJQfI3 zJyU20@xP^9R7R|gk+w&pGn-0Ab<8DGKtFLW0@+fn z6=iiOYfMd7)XFFHX4C3UFmuR5vs`@%NEzh(omkSSWYMNt;A@zMhnlGiyI)FoE|T6N zRg=^Lcy8JPc%hW`L$N}${GeWL1GSkspY7bYn2*fzA3&qkqMT!CrgJ&@$WEke^Pa2Z zl0AoGu<3azLRoztvcmZ(v!-in(hY2|n@jQ+ATsu0vE)o)pfWev5jAxynKCdf{&UJD zjv=ZuTiGDHKRQ>09-RO5dSbP#kZ_rccZIapg!%6Dc)xEuk~OALouBo)Zx-)~*LY{R zoI!pt@!&LKnVeoK!ufn7r+M|}E zv7Be|PBD;nk)TbiHAAjt>`TF-G~;x!>WGBS0#m zabqv8+5BAK07vk4KL%vc;AwqHTQkk+iGKIn1AC%P#Dnf$uK{%v5J0D zF@Yghg~bwc!476OcK#;}^cFP|fm)^nEAD`0e}aXV-z&0wRb=eu1jqgC{sNEwGb0Fg z`Z&jgAiG&4|G9Hw%=dmHt(R}S2t89G;bbu}lOj7|@1otWahNt!BHo6q+=kOXfpF(- zU-}boV+7fSpqmYzacxjOf&k^fB34^o;JXKr**1H9UP0X`4;+vu#>c(I1uXX9f1+AfXZA`-_$`(vn7fiox zY*CI>G(DF4)(|Pat;(|upBi^bF4q?eSh)@I^ zQeJh&e;kZSElZgZs#MBJpa`Q9L|$IiZLCr^8Qa_6v3(}IO|9EFeI;5}ukwRs9`MDob>$=%mU(2Sx}v(G50rVN%%z0z z7=#N~dLl!+ELLS2NL(*4E=NNQ919D_^M>qw4y$^DO)nRy>f@zODO4v7LdJ90X2h48 z4_nL357SrH`5=(8fQ(sCd_&sLb%5q$)MA=gx{n2v^U% z401b+NoK3LB(zp5Zk^;bDB~&%g>y%^9DW2vPv<$^lxVg^9|VZdzD2qYUy)|GzeaGz zH$K$vSF?GAue^|!l=$Es(Ov~5elpO_ipc6NU8D$+Msk-I!`u;5Bsq}p+FN? znmY@V?syCdR@hTbv)QG?z7kj8{iB8FhSIPs^vxPdqQ$^M8%o(&q5RK{+^*suikQ4v zp6p8F+*+n9BNefXNg&ZybD`1LxM*d?WQQ!w-`Hcfd$4_jztRq5d6ZBUX2$=`Qu%6J z6lzqM{GIScwwC|q;sxWc#&1mw1)m&D$NKM{@bu|fnX{c`!&|0aEyGb>oF7=?CAtc` zB@oK?H=rZ1E-I;0O`;K==wM7rE4rD*b$mOn8|$DJlBAJ0nro#44lbc9@2yqQl1^|t zSxN|KGE;MY3tm!GUx=FvQF6XyI=k5>tqLe~TB#+d&E628!lyoR1})`XdQ+JDkrE0T zb)62ykqkIdo@9;}&q{Y*d6V>eoD@wqFP_EyX80SZe)CJv066Hk&zo<8`|FvYpfOMc?&@L8m*;o@;Xk5QLPmtC+jFZ!)80t&9Cs~Wh`dN-!H3STz(z<;P z^5o21(PQeo6PN`V{Q-okfMm}e_*O|w+xY}egscbyC=2o@w5mG3yN=&~UmIF6%qnK0 z2l;8DyT)U_otq*m$! z$Y%q}SgaDnwbxR6VV~{CXRvP~?U?I#4l6H{o9kD7ihUQDIqc!gj|a2QG%=8Li6zi> ziRHd!YSKIt$sm;u-0j#;t=W0$D>XkJO{t>o)(8&>Z=pILKGCab7K&YEBFf^>Jqtgk ze~vC(H}iC6MwqZ~$q+wdXt7sUxDG_;yjI=IA4}zy#&UqLk=RmDF^#vC+HS=VEHah^ zKGXVn@Nvc}g8G(-a!ov1@L)#Wek`fW*m*J%FxZzAsEHJV7V;8g3N+E$ipw{;Wi<)! z_((gJPaNen8jfX_cNP{FS`XK2T8Ev5vdeV;BNVe0t2bL433-0yW1AX))E#=_(v}~-k$wGe+&B|1HqTC~=XWi&?V&7FM zN#F{J9SPU_l$tk$2Ubmb;RC<8^;G!NWvVhg51^TK?bYmbC+%u%f7c@mbx=d^+R5vp zx7FP^>rNAmCyiBvgUxrgS$a+;S$rb26s*oK@ZiEks`GjabjR|#MzP}!53vpZjLlT%b|p(vWS(ksE5&nxr=X**VGVRQgI5 zmRlz!8BP*S{QcDW zY0t6*B#CHGzI8GAiG#M?S_%ffJHKCpgPq!mi==^7LIcbQ!@w=-qu9sM5TuHb!dz3n zxfjg)HD&+ZrYpmfx3+)a%7s^NB~ApU=+H;cZ#RFrPh3#CzxP|0hFL`pzG|VZSk5=N zFi5LwuD=&SPwvj}s+H@nrK~uiQs(nJXAT5Khv-+7GkDsLr|A!c!~Ovbv+VrlxDnZz zDH{@C9+H)DvLj=#Vh$4t*twGyctL-=id}bY@sDK_12mg0JG)k2Fa7|g2W8IE(Z9IC zISNgNE_1(eSU*^3A|+>_Us0zP zTAXB{V36~zhjkX|qk}bvMeli47GGHCH|LdsDQT)2ebw1@jMQ%n~XHrHx5_&XN)=pH^gak zI|~F1*~T$8@aU(Sw?9`kLq6e^>K=JV@*kUS*e-r^IZa$QZPiITb@nn%azCWZYob+R zuoGg>&TJK5NbZ0w_hcI9VIXoqqw~5yf@p$}JvyZ$PK*O{l1$%LE4g23zC#X9u>%S# zQo06=;7w>rg9U4{Y6e2PcH#@oJ3^kaG#V_lMoSCsk87O0R!Z)OJcoZ4cF21Q)^q(> z_TMc{*mo6d%Nzcgx6mZ1Uy-D)2cBxWKN^YOV&*y6u6oj~Eh%2n$K;~W9g(NaGf>^p zk4fp#jVj=yy`nMi$S~(V>T^&qu=~=i+%&f+G)tg*H+(Y)7P_*L2ZJ|i7?QzJcCM;1 zn$>~TUlbyxTln;DICH7Al&alrIuLiZ@gVYAHdB-xh!?!2uGUgt|C6PYeAEO>N%Z5G zqEYi$1IB58fe?Rz-hPqSJ@ungyN`sVOKwT>XM92GTne{2bu+$ks{b4#UBMka^2bGC z+na%mUI?TA-(Q^I%{D>rbrxiNQ)P*5OP1j7FrtFgv!Jk`x94zTkqGX~C9Cip5=#FV zqh}5nXcAo9KY%OKz>mdcIQ4=14_1$)mpRnjBzVV`q>(-S9=P5RDf-0wK5@58Z^j3f=Gc2Y20$=g zKfDdsn>V)Q;dS%OXuXFX(}K!dSlJ4Lg=D^NM-r=UT#|;{`u>Pv>9t(HC+Y3$zPN=y z@P06wrCXaZHQU_URQz-o)V#4FPcoydMbz*~Pb=c}`#8Dt zB#7U!O+yp>Gq#Jqiv&%<$xei zpq<0*E9a-WFGenFHQf!6*u;llK|GC{S0}jx32jn=2>BiIFYBmQr$JjHi!Ew<=3A0B zh`G`OWOy)#B~^~hMiRdwy)%5vq+aHaVNz!E;bn+c(a z)ov7x|CxhePkP^Ai&)LiwOv00Z)tr~?bTP@7#)&QL+U4kuDyI(5-9pC{69S3UJ|+_ zJz4$OD3Y-v@i8fOL&Zs@4cGJ)`?EOF4~yhf!-`Yw)cFDy8GQyu+{Ix<{e=g$VOl1b zFGSz`)mUvIW0O@5r}GLtxU2TJk?URO>gxu2g>f<>M#1Hk3}#4c73PlwTSpS|ewtei z`H-G;?>)m4Ml0W>u0j(=clbR7@aqDrqO%pFGd!`P?m~Gp?idN3-t#HN)N^Taw>APS z!IvHMx(#1}9g)?GIitrv0F2jhpA+Rx99UIav5SF|bJxSt%vR{4v_+ms)XTAawOS}kn6m3j2X_B&dYWGdT3b*l31yNkH6xsCjXi58FN_u^SQ(>bfo6#$;e1}c%l~s zzLJOX%+O^}&eXltWr^^=wJQFy4%ZvToeas#ry06NT<8f$d06ma?7V(`Ym3(lxjpoA z`(t}e!Zrkhl)}LS`^(y_v2m?f3Q882#J$NB)so}=^H_@IwJU7FjUMO%jcw6i2oEfe z+hUZua*^n@QA+WJg+hzl+nS?zlq#%GJ1eFPD}U4R8h$XL;aV#&;;ozI*>(1`y{-y7 zw05BR14!*V$^d&IRgw+=Vx?bMl@Z)2?(oRW4pa$Tp6$F*w{Z5(Og!0F39Jl+xB==m zFU{>ORqN#idTpb=8gnXenQsqdXg1c-whe)f$5N1`nL0^VuQ}!|m zLn2+|wv_2%?4w(X(zdE-v0k$ZLdDg02PZS^A9_b~g8?*rf*I*dr>Ds1@7F=}E8-T= zJJ34Z>jobk0q~j%IIF?-4q+nb=ZMf0ZQs+b{r zDoWXUW;pg&d%ylB0 z-O*LUbPT;J1RdY%{b5nY7SKQx^EhQF6;;t3{A(!ytf1m<#i z)Q@K;64zRKr)PBw@GS;-ZnXucpXp&RkK^^l3;mV8_PeK|=ZnJf;N&;KX*;18j z_DkE5I!F@s&&O{fkv!Fc1Ei?3InLA1AN+JGwe_Q!+pGvp^W5HzfiJ{-b=#BXUCC=d z&TP8H3(ek-l3K+xjdh9i8H~#lsUb)`Y5Y32PEb;vPehW9*;=}q_iUuGx>GMT{eS5C zrs&AJaNA0!JL!&XbZpzUZQHif9orq7l~iooR>!vO^sWD#dmryhJ=ES~kFnQY>*JjB z3+ZIq5Iq9G|DE}Hs?x%*9=ibdbDU|P8mqYP1_49%1l@u4l~dgG;3s!;*{3AX3p=>X zZ*-a=qv5Yid2D=7+7@0Yyx~BfBD?;n&Y7nKjzR|)x0boq{#4_($KgdK z#|0vN(B@#3))sa#+1@_@`_@#Ho9mJJ(E5u@$zPeRVy;ND`CnNMLOQ~x7AkOX>XkpC z&Ghe@xy^Q%ly1c3t=fRow##q@74tseMGH;V70DwIJ(fP9CzKG$PZgp~SU1xEuJdPz zP@jfL=?Qw@sm~5g0pc+dBuo`0H`T1@6@MRAy2XI4QGf4INGhheEXeERK|_2bXo#k{2LwLvScr62~OD+6YslNV+}9fV>as_V@PHn(gi^ zs@w$&Vh>=w*jm;l3AC{sK_tzzKG;*yZ99>?nI<9O9I58sInlMie{kp*IO7t+!fiVt-WCvCD0>j66pyC{)fEC#ZlC>YcdcK_fHWvg>q9tQ~=7o!^jY zL+Q633(Cbg6aAgzqi7bP7DoIHCz#UF3{_Z3f!LKnprTDC%*0wTf-_N!X${x~MGb3X zx?DRW-;ceSA1V0@TSq#D@4ygV;!%M5yO|%D$On4!@3zZ#H>l%(iKwXheN>hxe)e32? zo(Q2Eg+@|tt>yBh;xy9I>??mo>`@pHxD;Dci16KP5{^8nS*x5`kbmno;c5QcpHt4N z%OBTA(v>bjQ!zT%Uv4@M`EXh-MBV0id2C29(mCtINPP8oB2`FvB_pliW8OqR*{p-e zb}EBb(rgjcen!hDjynFqnF>9NneOjtUr2*F7}L73a_85sTNrT;*-r-p$x9( z1kEY~c_5fjcwDP3zs!Q|I_%0a{-SmjtMM$+>gxF%KjQ4CX8IML7FlM{_YDE?YL(BP zFC*PSM-5#(u@FG2ig9D2n`mfW(qcN7kTA`~#W_;wD4qt%%iXAXO}{q=cyA?e{d7C5 zV9h6HbVCMO>+dDK(@2M^F9`Bz6hU#UrU%!1z?x{dN zgjloSGU{}AgRlhUh6wY%)9r3q{wLuqdY;8KdYS8BAgcZzrY#3*5p@qbt$=SL;sY(!uPe*-HTk?or~aKBG_!%(G5}JK)!OiSTk&rQa(*31X6oJ(~k#Siz(#ToQg|$&H8>~%4{Lp(&3%+Im%Uuy<4SR(FH0r1kb8s z9b8m7$NC5|r5udhql1UHs7*>^(y$+KaT|&o4M|Qd!o;k$P{I7Gkv=-uWHoZ{$N9VN zj!vhOj`NtqgTfBM>a$cc-bvK2UJx*~giBGT-=S5=fw6?^FAg^$nfD)PX zv^%KloS2|e?LqelzsTyVO%{{J&&tFa@Yo~}+@AK@s!@;Qcx}<(*C=Jwq$~<$)fSa@)4uB-aU)&}CoTu}qAmvuoC_3G@ik z|4|e_*k{tLVeFqlPqY(=z$TTj(KWoLQrt2R<^4;&sJ1;(~-`_xoeY(eYZ?-csmq*OSO0SW| z04ix!9>m3Q^E6rK*BylOE5U!T4Ru4Bc;~Y_p64+Tof|+OW2n5HvSvu6UiHUHCQYC5 zIjJgW)J(ntav8c=@B)MS^y!%f(1&)fj|@$%oU#zjbR!%l)){}7!U7&bsn{G=56-pq z6x+5hMO6QW%I@KVTzg1=|DIy=2L7nvZ}K>#Jhia?&Z6i8Z#f6cHL|Gxnr#5FAxi6Q zH074#MttsZh|Bgp;#tMX=!?9!H*iCbjQT#f!Me@~Qs_|66$E4W{|A?yZa?q@K`(fBWAgA#boSn0(P>O#lonaffmo#Yc0 zbw7|V7BJR27L+Q3i08}x0g^5L0U9lMayc6rif6lV>KDICUhw)df1$#6(CGhLHAYh? z*<&-rQnZ&XWb&=SaYK$>DY$IF$YTng^;%kA6(?Ql=rT?QUB$KO(`>w(_cP|Kgzh^c zie_a(Nse6CL%?wO>X;pNp;c)AvW9z?8`=iNke1pI>qH(x85`Wm_eS#fo4qx&D|EI> zan`1WRC802Bz~zL$VCm54q;eWO*rm=L#{V)$&sOYlqgXIy~B6xj?D&Sa+o+mVsR*@ zKrF|IL@*Gs%5`b4_MZXe)m*A>veq$|{J0Ok4GQHfv=?MXj-`X%V^v9E#!hP-1F6fr zMGR;oe1|EeQ>v^pNe6f8j#uNlBBzS-BhWMsQoCun=2}~Za$(-D4kzv0Y2bY_4DEma zeqQW`F~Lst>~TG82Xn$5X7#B1i|koN300lNJN>J@UMgVABxi};{j`8iUde&{<=9*o zBZ%;)a}1nTr7R^p287F}&puT4q>On9HT}HzxiC#FjjeZ4EeBH&c4Uk~Q#L^k*iu-A z^@x-Nva`oi*!0VIdR`A|qoK1)r-#UpTz-M&liR7cT=|R%)sFC3V!x*`@y(;paFXK; zCiU%Wu*P+7>T}h!PHP$5?8+)5|1Rd@#LiY8ev>jOk%c6>dZN94NNAVzIbB&I6M~Ik z^cg8HNP|nl^LT)A2~zS+P_L1q4AGZgDKEB43$Oe_E;OakoXuntcP7HyisQ#n;2EK3 zatxGO^*Ta1UA}R*YgGOyph=$#b@vZc{rwXuWKm& zv6!crq;H&7B^@iE{he_FJssR5YbKkWexz}nkg7}8flH(tp8C(vwua29fe^Cj}?vSYc|Ej9h?%FGay?uTGM+6MqI$_J>0ainUW5d z$)+>u04rYQLCi4<-3B5G;&h^C>}I@$;g{0Zf)T(R5uiFJZ z)MZWlCA_2dBO6-3lg=`jEc@7(fS;KkJ!>gyv zKI%1;^>0emVIZJMU2e)j8A}cviKJ=(M2v^mQ=JH+gxw6vV2EJx;pH=6M9!vpq+y1t zVM@>A;zVLEe?$ZGx1qm^9Gjq`)J;DYPFDccu#%WA>-Chn*4H5Mq^1zutJCr&AFtd9 zCReo~F8cM;1A4<;I>$>ifCRr9sRzbw{f~_SZ?u>-&La)lBsm<`Xklv-+~p&b&y_0q z!OVe-z15~4SVnt_Y4bSZt9>q`4~vn~DpJ|*$YtPSg;f4f7n6R?$WW4!Kqow6HO!yI zCXN^2C2iLuJ>)}8AA>e0H`p6y{h_SU-<@WcE4|~9@CzBD%7wqkI4l6`I?S`6a z80@bhEUSaMLo=o_b*8bPk2m}OoZ1q$K?tr?yQiJseyT!4A6tDV-sR>+1)WI}U8}CNXFIY5 z9L;Bj_uBj5*GHZyd=&{zG|NmatSRt4T=71SO1m)07DEat*oCW148}~czKe3gM2s3( za4IQGJjmbaXOyGxlaP0RwJBPni2Z)Ck)HktFrBZ?T8ozIht{y%V=V^J?HOY?)Z^`V zEkl`W(B}735c4KBOotm^;y>8m$fIDBBG)=d@I4T5oX!sf3;)788qXF3CsONq-{$0k z4iv13BzKHPQ2gk$s#$k~{|td%X@_aOk~F-MhtAss3DSVsXqXdGVE3ek-S04!bMVtW zh({Ts=2pin7~ZGe8U1_gA=fzPd-{RMuYoo)cHXtqNo|P_RCbf(hM2sEp*6p5IXUio z-=-PUEXx%!R~x_uYh+S;>S@f2aaHhuSVy2FR5o|>CD4FLo!C<}1J?A{j>Z#a#eQ$G zFpU)#TQBT~Iqj((F2JB;;Ryzxp2!TEuHO9jV|9MlYD7_{U`!*W0U=JU)R7h1R4JiA z|Ee59wytuEQM{0fVpqe2L$&FUPxF5}_bX{M=5)Mb_#jb&-Ln^1{36=C%I+{y3g@Q~ z$v=R$q`iq3Vf4gAH`>+Xf*(1CdD~s67uucz+!LZcO;N`wRmbN3V6g@+^^>xWoRt6+ zHvV2TA)%f&X&hM}KzL|+9C%iC0mEfQJ78#P#&K2R5$wo$#=M6=TI${P)ShKP@}r#x z#iuI+S;)${wyGzCRc`cjH%+afY#eSjh4XOVI6sxu^asq4h-Vy8>Pov_@eR--m30;_ zSdI`YvK7$*6+1}GWmVA6?*Z&vEzlAgM&=9)?s!z^u=KgG)5PnuvH5@Qp$R$9@7<=a zmNqX|haNanQ_vBVL*@O-p|+x^-IIW6=GU%ml(J4(11Em+1dA`(xtG@4;XgwylOpgE zB!Ut0g{e#z(idZXI;f1aEHuqAPEw#;p&Wlbf$T5`iE`+A<}4XIxBQF|0B?pQ>CO(@ zZ$GV8hub4rlFN;ipZx5KhTLYA8GWg6MJRcqW8Ik7nKTO&9eGYsXOBd9Lgp@-19sFo z7>M1-!aIBp-0-^ymarm&$>?P~zp+`e4HP)HTT})Hdl2+khLEYZ{6f)sCK9_CS7H#0sPx~-+zinFsA_4-z$ zXNRTVI>g;qbe8LFhXN7nUxCukBb%nKf?Q^THAs^-V)j+74|DWREAx;j00!fb>Uram zDSCd?=|?(@6@*W$_&rI1s9yos@X8*`d-iY?kgOy0E}E}6Luc-p&@_EY~fCB*Y~eN-fW6q`*{t9Di@ud z%p9TXS@Q`fu<%w(J=_Eq&52ZR&zF@iKz!$@z?rj>^;0>-a^+2Xi2=m^GhhP#dQx{L z`_U|yE<`7zNGg)#fG0c~PgF?@FJ#s$pV?YAD(>lELs6V1h^?W7;-HZ*h zkTgdM8sFWVqI>6jMHBerB`(pL@XVP26Xqcsw;0xcn! zP~Cbu4vq;DCDo`&p4a+Q(?ZRtTyXbR*HeAHe!nXorLqto!Y3tJW+DO|E1I+Pi2(2ohDzt)YAL2qLpyTG*xp2B1s&|FU8S;`~By4=|Ncq*rgoo*j3d`@gwhzY$$G4|9Zi?NuN5-6oL=O3fx3PY-r&;_80)K7 zmP!^EQO%CY(DU4-;2kUFbOXUza8!7df(>UTja*yRMt$sibX`50mMis6y{90)E-|3X znrOOh!A~G$M}e!4;2PBQvB;C0;#sw#$OvV<>mfxNv&5#aV>r9(q^?D>(~-d}-hWb_ z!~16?LQnTb%tX&_n<`3p4DEz8R=m(GB-}3z{~zFrxS^%rQv+pFJ>p&cm#(ZS&G@1^ zA;=)CJ{22>>+47H3wgr(rSjOWQ0lbKP{)??a6<4|)?2>Fc1zQor9)Fv9E0I0j<2s( zs!nURT}%4`g(qa#o*+*nl>hB>gJ6Oy}SVn_Jgmc=(Tsm(JtaF z`tR-91>p6M+^=!ubXFzikVinzhCG5Uk4mC=TwFIUvJlgtxaKk6U)v=%*-Nx;yj}~a z{a1jovcK2lpbgUOuau6YaSc8-i-_R-6OINXo@69PGkhg85eALkhbnit*Usa`t%R8l ziTj#S;K1Cfg~8aeV<*U#z2qmQqq*@ps29i961TarDg~9WA`l~X2Zjz*Lx|G2g;?3U z&dSxH_u5(vHBjmi%NoT(Y?dG&$NU&V)`;gqlS)c=8S&Pu5LRP@2A8P35Kaew5WC>U zKIAQEF6ZNEFEe|=8CR>X%8_G$N z;-*<$Ge7<#B|(0l&&DG~70>LTK115LkfTLNqq|Z6kgkYrWQ-)R{q;R7aO`A?_5>A?3jn8LfeIl1e zG=&^>^B38x^JgC#qn~jssEI7c8I8NTyA<&xP|=0XQ!5~xQuyw}r%1Cyff~tXodSAc z&&8_6jPJ!Ei?w@8kXOLwCF}!{a=|HZMgB<9H%MKje@)8gBl&Tivmj=Ku3z6(k$2N> zo27J=<}@K&vF5t0pjI`60L>k1S_ds*qe8YU(FFKwWy-(8@*?lI_-u&?+*Of-2CN4P znvRFtccx%y?y!%ij0Z0kI7Y?64}vaPxCt~uU077vhAlP zF|52)`p}m9msC@Yy1a1|A0nOL7DpP`980P1-4T+`ai%=vk7eCfvsU<^3@a?e6yxl<+lsUZOyDi#*)GH|fMdMI9}p``(96C>&o z3Bk#WK;Uv({=RjKGZkm<4h%FXt3A^2vD;Gr1bTjsk-2jdKFc}WpgxP~{R6CyKB}rK zt~r@K-W^HK|FsNxoc6b|G06qP->ouaAX4Yv{}q%Yt|u5nkkPITeruf@;&Vr zb#%lxB%hAprYG}Ox) z)Te@`t0LzhNS|PsBy3nXn1kd-MDlryc)h?7U>Pfkgr0WUz;4 z#RePN&}c01C&y0;x{NptnT2HSJ_l_)vo-e6S4%NraVdpfgmNX-68H!m&=klMN%h`n zUF3+@L`^M;eUGO(Y!|1$U=0ylEbw70vADtk=7&yPT+)WNb-J zJ@B3ax?UM|x29?99YT2|wrMukj9F?APV$&CVJD((^4gfgm2nfAy=w zmCR$tbjy#(WAP0=;XUXCconPjGtO7PfgF!zQyI)~hoW-^aC8hzQgLXS=TxI zjH^05BV+3AgFB}hrmy%&xl-xiIx0;;xn%`;)n~n+i;WKzrt*}h{rN60r~UMHo>j4d z@7Vi-b3F8U^}DUJO`QL=8Ob85%5`r|`L)8Wg9h6X&VEzid@&4_x|Y%dr3IYrmPTd79CTvNg=YyW?8uo_2v=7#I%qI&Ynz)R<=s=^5t~ z=aJ?7L{GoKq?D|F^$*~qm?mq*Upt;F&@Uh+(=$Ifzqlz6UhBp;>LDzoQ4(42!u^>R z9}i81(hc!#Z4N~2hm79UD#b@p$(5Vay$`k_BuW7+iB7bk5on!Zx^ZyTB^wfg1fWVN z6`J<_*Cjr$G{DHj-+RCp^E!-o}uU zq+Toa+l~CialVJyEf681&Hsc}BY&46F8>UVL<1D2FCF%6orDXh_*SNOL17zI*|;f;^a5Y~dJ-v^TK2~*oer#+MhHYk|9c~vLNn$LY6>pTAqCU9 z&c=D&Y^mflyX1X%&Ox^l^0o19PLoqtk|Om6=EPXB+mXTBfo#_I8LO40 zETVyS#EoZLafB7946CeB8W)PuS-h{&YlP#c!|%QF48fFB2RGwd^BNhBn2HDI z1VSh&o-8@IW&9g&Wmyn8JC}HRfI&=UqJ3)ultH{*)gOhnC;@LOB!jkz*BfSCT~M*Ftk`ul1e z{SO@5%i$j9{Sh&5`KZPZs+;fEqny7F^m)enBjE~Lk!!NIFQZM>98+@x&gLiWdy+x! z;2Tu8q{LgjK@rKvO7$G_f1vRba0mp3jo%0RU%kwDzRHrs%GPFmG{6tb+&GO>jh|J| ziGU%ag;88H`2h`UO{X8V7qHf2+rb-)hCa^+`Ao+)DM~ zdINDrALci;^+}=lt*C;y zsTncbw{+bS$=fAbq{TYg6%%uhR8b#PZ~_|x)CRDnR7k`X<5p{Szt(^KjlQiN`kj^D zOV%3?P zK#KJL`#?D<>Y+(Iza~ht;yt7SQzj_BVTZn)A2U*@(aagK1hh%6`UOU#D~Lfwoz7`0 zQyoL6g?%a8t4n*dz#9cm5D@ts6#Ea*qOc2oUM&jyZw^Qm6HYAFrl#Y%Rmt`oU)iS& zrc1l6DzqHpq{3IBkGEtMj?z>9Hctv6Qh7$zg`47@w1O-%rFQ8>3(Hbwa#IJ55Zp_` z2gP?juX|u&_a*9c_rPT5*u|u#i^`tN?8i^fY;3Bh%xW>jpzG46B$FvFej3k()H_gw z2`6jQ2WcELXq?%-%bRBQx_!cnwGhJErfetiBFb$Yd{>SYMOJ2~FaNtqwySBHd-WH# z1#4K(qj&jDnRrj-uHf_SDR{a-!6Hlr;Mr42a0dTmp>`skSA)Alk_z$+UgM{ z2T7qDA*p)bd1F(ZNmtc8Oy@AA<&R8D-lhvQd6P*>iU7buSS#7jz3M^1adnl^|e>Rb$ zAKYDe8%yCu)dAB0*~Ekx>-3Lc)wB@m{OhC0Eq{=Xf(0j`0k?e`hI)=At~^^4$P=iV zsursgH=2Ln(aB&zYA9kH`I^??J}Kb=Fv2~;8A9X@2$`Ho-;__&YWN3;k6s3A-mZ1O z0!!Z4ehqGq4(*t5H{>k3O5|L-ZaY3dUwGGV>08@6nDhATGnsKbEY1dfO+tu0rNR5+ zOj9bGTDvL*7fPYoK0@Ms92?{NXY+LR7R49Kt*fo;AE3^l0Zg#?xbJpz7>mBPJRy9x z_Bi`V^bCLcpz$uy*XAi&9Bc`>`C?D4!_VT?_ScCuAd~m3fLv!tCNmR+IvJE@ZT$}r z(c9v65WAs(eN*;elV^$+OGOT_z_vcg#ElxI-)q{jv|`F0Qee0)I?1-`Qyq%^ z&>YmdPm`Gbsw{*pEBoUJoJgKDw&h^9oZvkaLQ8UzT!G^1b1o-VwZ`h`Q|xrS5T#w+ z20LsGw^OpEu0Sbush--Wk1F(yQwdobLfj)!0uspx{>;(-=p0h_Zi5ZFlD{?opo(Lg z?@f}1YT?1xSw`ANV5a(;>u8uYx=gyN4JKa?v!w>mA|N<{rD11U=bbypOI7FOmw1Y%rcF79ij=r&{W zpdlrP1D-|LiYHt`j*2e%t(S2&&<_%9kIvC#&3Ae@x$TNL1;j|pv*DQ8s8sH8EL=jA z60InLg=p!SL7n%VxRoz!U>sNMl|zz>GpNjLjYRS2GTRMQv=Qp1n7XN&L2^Pga@#OJ zQY+fAF$E}2r9ctiqaJe?*q)QKusKSKHfF$)GW`b#C9BEhVvhc1Q0bR4OJ&77YR95$ zgp{`!w$`ltlBC-+Cs)lt3ZH6nx*6)hxe0n-U4p8U#Og@w*1TA!VwL#Pqw=jEUr5HU zC8GW<|K*1$g&d1adJ?tXD_aARJNW}=VWD7I{kt(24NE1@1lPDS)Lf(eV$l4eY1 z?NbtFk<~%A!K#OwbUks?7T(x}-|Jg8!~Xyc_fSU!YwGJI7P!dm%CU4oayd7;yC zH67!6o3-Q3n$a*P^l_hmT5Fq|(vW{gMF59+lvxJH1D0B&epq*S z=jL!h_-|viya6e3c3~mdRS#5p*?5NKz)VVvrM1F+Jv@(%5fZ~Xl-E&@Y0(`hf6pA0A2%A3SrdUA7B#zujzyP91}3$3%f#l!#EAE zdU~`=_53uaZ;{%dHatW1v&CbNbFqMx)=9&`;j1z>EVJV)vz*t9Kbw6g5l+GR9Bnqi z>gdgKj(;1*QZ>n#xTA@{_A^gpUtnR6hAPDQ?M|T4wp9kKXTJHNi6F~mO&;X~xHa8_ zg-)9woX}B9Kh{F)=P&0i-lbjJo#c12AG%4Y_a++-A+WtA@vH!*&e0%&XGDI1_yPqU ze+ix=`JZe90GWtMNXZDv3CxwduI*)=>TYBr8hT~hsYQ*I7TI0GS>+th;`r$zlFT6ctQ&L#(`lmoCS#9bTT?{-+P~r#*kn9VcIUU2y+(I{JW}4xpgK zK;qUA!c_@B)$^fqOB*G>Lpbq-L;U4*l25{ZuMM^sA71ZqKGs~KXbh^=rF3@L!OQs| z)Y}j?IYL9Qa9>VS%0U{|9nxJoU6^YEFXq8Z1NGunAnfY(c}cg!leVSqT@_3K1GhSz z^J6>W%}jsvL(F-WS01n6iUiW38Wo&)>~~A4nHtTDm578{rlG@Z57D#F)$iz&pzGXs zytzg6D*xdd6#ZDH-1g%|QRO)pyNAdMuFT|gs-}uH8AiH~3L0Pe}hVhSThj(8w*7!AbAXL)nq!-&s7mMu3)A~ zpt8e1UHGi#7d(BI?JL{ts}2XqpJlI0q*)hn~w ziPzX_y7b~{Sh8rp<61G!t%!!ZYq)2UGxO&R_; zBx0Uopgq~&RUz*Z$@rNFfxgV=DIx(MloGeXe+MpWXZ!j|ar7ggPzncowYWe-B=o4? zIS(6&83X(7hsk9CaN;%tjVWWrtI}to#&)Z#Kh_{c(e?A3d_}#~tZ&S_Ski6#wcm7* z?eb6W`;;Wpbzsbk4pUcO~(y4<@1o2S8uvKl}Gnu54 z12qz8-{UD^C#os#YJ<4vXfaN4!hhHmK_HS6_nmKhgNeZH@bJh35K+g{mt)?=d`c9uERp-)Cm*p`eXpCl=EpzlKBdP(j&sdRc(ya+SJ`)lI`q^m#XBZv>G`% z3POCD)`r2|LIc!}NMFbc=Kw!vS*e;qQdHDem9vt&&%J+u@o&JNy`P zA7rhEk?vN*rB=PHy>z{Yl=g$+w?>RUGSJrc#~W~HPTRuxB)VB5i`|y8)GP_Q1O|Vo z0i|dyzJv0ZGr{%ey)p_oX+e#MB#AJlnP`&)zdJ`brX*X7npYvazWDzf)Ru;P>H8vl zCmqu)40?<38*O5$zT|WrBu$kbtNuoDscx#{$l;>TOZ3N|C=ab{&--f5>Mzy)goq6z zn@cEh_px|zUWeIB(7_~icc{TF)0T-$P*%awjn)!jNL5Yo0Ci&F_@J6zP5jJSu22XD%HH zqM0f)Y0kCato=JH>y0T9l{f6p-jY3qo<`d#-Ewb-29Z~^=JIj!sXeDEpYF}~M&y}m z!$QVE2bJ>-AuBK6Xp1S_AD{$VNH4)EKwqt4Dh|WSSJ=tz-lxyJa9k9Bp~v7}OJN-D z*0^9z@v7kg!RFrt=PzR~4IF02VY-G7q1-ruiw_7OV0)$fy$pw2m8$8pV3Ua83}4kx zk`!Us-odKd0sfCK0d9l!uC-fjXJbb>7Oz8RCfTuR zI0l?+sKO7@Tk;yq=wz4u%R-1gRMY2U_?GwROEoLApw$9{YA{jf;IU~;u4PDLmMJcO z4k{~?MLX-E2f`qJAyfM9Qc=3w>D|-tO+FCTY%-U`>CFce=4 zH7!ixmz(hhKpW8=L}6AjUDLPwe*jnLa_w|{x#HYRyVYdsQyvAq3D4V8+!73x7r4Va zdh4Kd_Aitv2_0b*dAvs=O%FWuCJtIUnR&BZj`yxz%gUj+DJ_Q+*S%Os`Z z9CBDnNGNpmF(_hzznEihGT(+uAR*3X-WX^0C$JGAtP{5drJUbZ6Ymz>SWiEHMue}* zb3nZJGn$PLY=gyJv2PG*qRyjU^Kgq~LeDLhmq42Be+|Sk2Czaf>u&l(^4FA<;Ukd` zxjElx3l{duH{yh7MNmiJv<)JjKZUW|#-`}s2~CCi zurdd?SE!i^7siXD`kMJI{-hz*;bfx@7zIq1E)e-$)^alMGgQCHg zHG76BzblDPSf*%-rvoP8QSOV6VBE+P?oM7nIc-RRc7f4ID7N-P!ooFAq;1vmxa8J@ zU%_1m?Yn5@TsO|2EsU%th^^!bRMI{u#VG|NZ<=&@)MC|+gKfW3iO9jCL z4Ve8i8Ye{@v1MKjWL%-Zb^VZ;d}$jt#ae2V;ksks82M)+x}j7W9t%fbV}$sEf=-?!<;&&WOk`71L5}c0Kvr`~zW!Gej4vNj%DBa-616>KoO>I=c897@ z`NQE2w07ifCACOo-~ZOMw;VSz2`-m5yUqMj+NYP~K2~)e04cTh*7GZlIqO=vK~s3q z*cw53hk7`tQLee!4hmFT>WQzj{`85piE!%>SB0TpcO33`jZLg4@d>vl#|llJ59&&~ z6ur`1Tw`bdmal=$p#9;fM~@N#YHX{OP ziRk6t%FyxAT`|4!u1+HJALFmUD%tNYn@Xeg6ZMGFPeI@64>`jp{$98@!($B}l4}O_ z^q%JaiO9bVtwAF_ekP2u&* zZ6&*PRao=P&-YTUB{Kb7VQ|X>W0AXq1o0viqJmN*t`CO?T8Kxi)fE2T1E;PV^c~!t zSYqsH7h!dBHE%wgE9b7fSv*N5DbGrP8l z6E2kag?uZ;;$6_lmVsvuL!%J8|C6tE8n_~@jNFDOU7<|h(~c2QWVxM%#5~1z@HJW! zxqX1Q3X?~7vhGkBaCfBWY5CWkg;mangRPjy$EE<@BsfM%*FD(P7@J8Y>yyls#V%7z zc)}X_wt7mDQU*C6qK!+hXtKikZF;mIHaMK$S^f zS#RNL%+bIy+*Sst$h!a48{FhfO)i8jO{Qu1MAB$(4C^=-Al6sk-sQy4>&(@gE}i8 z71)J`v_$qZQN+z+)_aqIR0%m$Lj)d*!-ih6T_F|NZ>3M+=;X)r{cx#b>YDXuWFCt; z9b@Dsol;+8tSR@m!EpT8qEZUiDnp{2%^eWx9FB%e;Jtb|U0_EIaxM?g$gHU|f#sF? zY?bFrUzkYmNpq{P{viL|E5BEXFyJPcO?-@`jF8DG;~+>}*ac6dVxL*}n!myQ4(sGsoU8FnQc|}1O(5g9Ez?d1uUM>tUqRdbah zzT!M@^yM}dHT&T-l>m*FxKiXz>goJm`5En6m4-gH9uGfQ@YL5r2b)yiBDkJ48WOqo z8`_p_>C{jugDEm@TI?~w7n$glH5d-=PFFIQC5sU>jds>EN_>*vht+euzm3jewn)8d zBJp!G)Oa>TDw3&xTn~=_;z#!DAAj%)y53pgEP9H`WqL`IoR3co5HrPi{`7v&CjNlZ8#TjB%r5Q^zv`NH#`;Yg4X+}X z1vX2MH=a>qois0fTF7_C|jkeq(O zR7?5&d2||4zhfpQUB#3+pvQnz#Vx5mpf`)-#DF}cZcRY<&)O+_-H7t^oVr29s&fr* zU14*=rn;dDSYPcW)~$3jySpdTwU2CC>ZYrEVfsMMsO#4@R>{Yi%ji!ry`oh^_eC6N zsjB!;?c0-wSBJJYLrg`xVkbbQxg-*k{(E%B$Bj%#&O4>aC#O;{Pz0+;&xT}xw$Avg z@6s@+SPC7*NqQksw1RO{0%09*BOI|}Y4x|UAgy!QhAT;e1;P>{n#_ELQhdfJ8 zT+72-QKrf{o=jB9%*bS-;lUOj>QS%Og;A8Nt$gS0MksOc>&|6kb_A@B(LYwl%l329 zNh}^tCw4b?P;xQt=nrY3rPc~AoBtoS-T}OlsM{9Zv2EM7ZQI6_0_JbRBDYi##+TKr^D0@mAla@-F5t+rIGBVt$+R^ z$=M~%(0s=AdAK_rV}5)2&ev$mlR-g4q!dnQBf*sJRCylfp(|PTCYc3GDn=%h+KmsC z04xJBpx=R;9bGx`Mva(mB_nlLHgJ-Uyi+QL?_FQv5_#amKu@4bgCrjW}=G$@PO}8eQ51p?dQ#u$rHj+ZdtaZsptp)%sPy=U4ootF59j@P)V2N z8mft*#lR1{8g)s}uI<=5O&jrGET4H^nHw zvBQBz#$*Cyc1W&H7>c*n5GUwwwcRPPf{=cnUlpnU0agv>J8BT~l;(pb@z{l#$fN%? zpKzkWEJ%D3n}mm6n#bgdwVA2dRAqGRhowtF;iJgLk$jv~3$>!XoAn1IaY%CjS=`rCN5#^PMLrd)I% zb!@W7Zka(wPmY6X-cpCQd1GL;BSYitW3;w6Y$`9IebY`xSBl%OW$5C4@*&dUV>F^S zEKyiy4)e%j77~qMXMs;M2JQn z-B8vqYaoblEWDcZ-Cni7T4GGe3y_egt9Xo8(RsYe zHkjF-LmJJfu-9YM4I@svxwxl`jfmA=;g;6f*9Xx_-XeJAq3l&cdrC!e=K7l2w&>CH zo#Qp;rer?Xm3}eXu!v*FK47r2Sfo$ji?(AM-tQ zhyq$8!G8cFg}b(c{7fU^U98+o)i<&aiRc~-7cutf_Sir#Mti}@62_(1Kn3?jjzRQG z{xT(M$RRW4sd#(F!OG^C>0n>|0eiPOqopYn1#Bs36_kjQ4s3$b>Amb&De+Q*lvu89 zwj4ZLc*f|C0!=6w&8r!0iiSss;5v6!E-&yFp3(hMHtMvIT`yBTIHw8XZV7c{6uAcD z11$lDtMtuhH9K|>x%-qbd(K#EcirDUKgo!pHdr+?GtVKd(m?E&4dtF&#N&}|U6GdL ze@r+I@6&4XlcI)OWrJZT{R#yCSiR9-@2rUd@>+2Kp2XZ zve8prR`s;S_x{OgK^vlTLt_RMf#9h$51;pN=aUsPWQOD=;D>n#PBEPSXoaE24K>T@ zs}UPQX`{JYJHp`U2WaH%mJSm{tl8<86ducyYZp`U-@Hp@icm*F_Vj!|0!~IoN@!~2 z5;jZ!YUdBc>FK-t?W3F0G8*lIBoY*Je5Z)Gd~j^_D(*b=H7#Ip6+Ny~B)-mAtRMc9 zB@4dUJ}tU_uZDY8vTjz*a1fXFnDXL|e42dPDGYKV2~n(@Dporv+`iD`V9iO7x6XBzO1d6q&Z5Q{ZS>ab1MDRxK^v&*z>;PjJl>Lt?zL=hP z3Dj@#`jfXWo*N&E#Fr$T`W-%0u;y^r&snv^6#W^eUrDv4=%&n&M-W|p3+$V9)x{0; z4YEKQF95AAl}?x`7M z&02GLqWrMsQ72g93<`dQv2-A+sjm4$8IRQpufOA|Pr!ZUoafJI8INvKvbexl8m+Sg zFuj<%PZ+*;7-LA?cZHWo;lus#lAWBTHOzqf6}{69F*woNRK=~4rZ==W8;;s|0A8s~ zEER4}`v>3;Pwpv3J!(JgXgg>m3~hvI?*&ybQ*eexY@<5WD3FoL4$W@2J~$;obE;5U zHg2r$C511}Ai3caS-7Z>hDoP1o(W-9O=r7-?iZwIdqj<(Nl5GP5=PTIciB4i&O#Jn zqNX)Wv%D^u*Cr;I*r^OlAGA_WP&#q`4HA|v&y^eTl#CR`RDN_1lXHS7-mb)QIG1uY&JPVY` z*qx<|PwN8*ldkY$o1Fdt_);-7ff`~Ea*Zz2KW}w72SH4wcD~p*Rrhy~7Ev&qVbu4R zQ2n44B8F6pP}w;qr)@kLPHzf0u-$2KzJW5mny#qeU=0#OqoI#*I{Oc)-oH}*}A$h0#F;ns+aXy9}L@;x)t<&;=spB_cD zHJ0NFAFaJcw*FkzbgLdWUN;=AJb)+0dDk-U{wpnrPq8;)Q*TY*jW@P(E%m%aBt18j z>DehknfzST-?6oBBoL8O@E;1;1ACbn^j5@b(NN+6Fa-eu&VAbLS->XWbm`jfQrTo{ z;g!yCf=4Ayz95@ttjR+I7O5%xmzLHR*oBphu86sq#fXz;qcqeaC zRS`apt@F>hQ0EHtkT2U7uaZsC8B`Tv=|vVX0C?rE_ZaHm4J>Y}}G8BrR-n7r+Lx7c7iL-ckdIv~J>f$hQn1}BDpMw2Gl z+!NU8%tbe(#rhG>5*6G`dLhizy>(|{M5E?9dl3$d;TLP^ijB4-6L!6}6K#>| zf~9ki-Y8%pr(@v^fd=DVp_oUXWb=8FcS|$=WN5vgAzGqrFGHXrr$r)1tEQ=&zJH)Q zU$|#bEBMaJ%8LXcG{*tw+El$la>OIGb5xnyqO(yDWCf3Q2~^{Cc$kROVfOxaX+`K@ zzkp8L-V`s09!RoVzR|q3OW!n=w3=r6`rW2+wBIF4in7P7*-->1nVSgI5%o@Wjulo5 zz8ypemQptXy~gr-=rS1W6eO=!Gt0~7u3Z51mmdETWduyJIMTY4)6o2sYE6-Gvvb{x zrK!jSxJ>S{w!{qo-8Z!2TJ#u8S7wndxZg*zHx;p-3iO>)6BJcX<(OKbvdGc+Kf-Sc zPP!cDIE8P>bCZdrEFSV$qU$6Cf_ zzVfRBG`4MA`h_{~#_QFHe9)fJ|Co$fz zVOu2ym+x3`V+oCih-SF`NsCQ9A2kz*0_YJi{hW9|x>On_QF zhpoMa!rfAKq=<D9Pvfn^ zYdf@`&RxcdBrXeN3LiIS3Am!Qtm5RhQhbjks}c?02gkt&%uDX&VcFrLcYO)r*0@0} zl?_;nc+Ibn2q+0WTi;F}rVl%q$pB!*h=_GY(;mAc=}QQ8z0cJAKAHbyz6fTUW5tl`TA*+hMooB z?QArlgmZCEdxkJ%2uBJNY(U__i09U<3bj%?0T)ug zv$Mq*#`0+%gcje3&V7*{1;gJ`25kL}e-6T!eABx{gxvv#YP}1$QNxB9ho#L<$&tCn zP(Y%KHqwWO^ZoKq8*FYUJCo{<%Lp?65zlm8bFGTU|ExA)JPS)0yHoCex5~{X_LCm1 zGfeEbtjAIrO{(N0e-ZA@W#BM)b$1gV@pxz|w671bg)e>PRUdbs`WEQdJumnbe9n!( zY0}u;Z7zVfQ(|$LSj-nu?Z#cOb8+k1FL4!19+};Gx^Kcnk90zN&Jl|nod!dym#{hL zB9w$(Q(AH;{66n)e~Ha-%#Xl>-^m^wL9nPT4h3gX-YG&v1)!bY`>X@eZPFj`&83A9G)+;o=zxVAc zo}#?$!qMv}Px+3z3%)mD-O)wn@jaeEN2CI`50gn3Wq_5dYW<3g$7yi$AeD(rN1y+l z2eV4r_ZqLs8@&5oOU9Ea=I=&1cs<4h1IzqKji&E21%4;9LavQh>v2D`d&zZ0)&uTy!T{B*vSPaK23`iClnfY zk|Ykt6)TFDz$nk9nCykubW77}!ee*eRG$89s>0&|c`qDw>aTg^;SAqP<^AYq>Eo4d z-N)Cyc8#^X|4w}PAa?DU30vLn8U7ptr!$K)6R$4eHYByLpzmI9&OCe}4tV(Jwn~)q zPA5<}&fS6Badf<%DZn(d%03k_m_5)fp!BKqbgM(M0(pU!A1P{li^$fSpG;~OC?k_C zFe>mB8c}hXw3zebyN)2+7?sSb!C7dU=gY>YhS;CEo3nF%T|omhhSfE zR7ZAuPthyo+Tix0(ccG}+-SYH7j;sEtG4-xD`K}GytYW;+K8Fy&1~fYzRRU~$m0OV zO0ZD|8Vvjxi6FDk&1`lBPAJwfsO_GG-axbivKdnjv@`X(#56N}5tsux>L0bU>19U<5c)dgM85@bx`%Jwako}ZuuE9r! zHdX3k7!O*Z*JiyYteIP2m&psiXxTA8jrYP)q&eWajTt+8ES<(@>vw{6^;Xn}i&wg_ z8FV?dDCAzVuSHMahi6I#{Ye>yeE%n@Hk`_k;*c}t}@n4SCc164> zsA@I{q#ky#e(q1hsS3g%Anku|k_FI(Biy6y$Od_Qq za*n;L;J|=8sUY7W`%7NZQlPVH!jlpL!T=z_zar$)I{xC!|1=W#G@pY1v^0qRLI6e=Q#RvYI36->gYWA~mNlp#-mFYH1yyZi5CT+gn=VHolx zY48Q`{I}QtM#x1Z5c`V!*)ZGO8c>D*-w0B@N3z3tGE|S(^8L`^2YCOIG4DF!mXwF9 zK9bHsH({wnp8q8auuCUmrf*&R6m2mJsb6h)8ULG{&DD_Uk>8#a&6`L3BZN)A{$Jk| zR-*$ia_zBAt}l~zrvyWbSpW8olpJjuvrDJ3YP|b3{-XnJ_#Z;Ta!(K#QybLb^E5An zkK;F#e|?jt1`r^S?CVVXvwx)d^+G&6{Y4-zHP>bB8q7!MJ3oW2V{~41{2NSS3dyO> zi${PlwCg~n-e06$`WuuH8g+b+6F7F<=6f<9&GVm2|A!Da?ear=2N%Y}rAkjaMf(23 z{BN?Dw{5mqD>j7dvry^?H)>=v>fdBiPVj1ZlR=7v@AWdpuW9u)m4C}6N60DkZ8)@xBNwro?Ol-U~ebz5TYE9FRza1l$Y(Qbw-{IWO>a< z0A&e7(go_Pa~j<4WX|7m()_pdAeD*{?e0RJ5Ho?#)F-NF_^X)SJqZz&s#4c=b}8G>|bS-EOTZ_3z&vY$IyG9>>XvMKJK#{I_K zt}&r@;nLmmix2-MOX+a1V)461dVf|!Z`5$v8 z!@s9Y(EWq3sEaW$CF)b-?;B;t9eYaY{8tZbGswiV0)*OpU?V&D0Gc6n{9p21W6a&w zOrzZB>Z$>s4sPMUpycHM#JhgwW^(ghggd}B(wSPGOZ{%+W6lDY<{#Q_jio7h~@7n)dl5vs9i=6`dHjobe(2ttavpC^<5i5zEcp7po?XD1`bCQ4x__C5WY=%WB}`1&?JYB1gdTQ7 z$c-`j4`_AvOgy7g&*7*0OPv{0qO%sI__xsr*l#uNclNPqEOcRg93%XslC#h7Y^NSG ztGQ2k9V_US@Ev%2w?axqzb+NnS1+{08x3&k)(oc{Xo2+hnc8OVi7qs&p_9Jb?PdpH zsO@3{_izWxgchf3_<5%7lg_^@m+jw1PiNW1E-T7LjycW<2zu${OVo@mv!qF#Dy zPgLVrNlawgYtVJyyJNgFnN01?`>&vDl&c4jq%F36pN_}m_lvAMevjPX4Mj~%+;P(4 z8G2UQITz)K?cx$w8dKhe-wDK<*hSiP6pzEH#;Uc@&zR5~YA?C4%bD9GvyRk_3_3t) zpO1qt;@VQr2|P5yZs7iULC$qtT)p#w8l^o#tfhzXo`X>&qS0s^;-v#(eM*x+H4X2; zTKVi_2EVXN7KpRqDkT~xfBFV@R&(*%__2x=a+WsPg@4ast)Io&3FLfxP^6TmogrS> z4yI3J3-)SC3qMD)l-Fivb%^;%CQXsZNeDutI?ht02s6!QOhE#pF=)?1A5$0dwr42t zknL$sXQ%GoV{ki*lF1LRq)mZt>L?PMhZ4kshD2I4`$UC?R*zq7W>FkKnJu#m09KE0U>G%zoo{w*tJ=7SCrp2syElINo$0Wvn?4GprFafKmCl^jYe!}>dn6!$9sORewp zdSOD4zu#mo)x_C)EKVf+V2?umAg`5`KWK){lHqkF1v2B{_zxw;)eS91XC?W_$o6Rq zqfN=~SvjrmhpMj^)8rDhPP;4C@GkAY-1%e{N~~0qIuu^YmMP-Z#Vl00n^}jjxN&*~ z0mEWkX1l~#cC%6`o`7YBw97nA8#PKO>7W*0aj7@&;p+Z3a{+@GYt^DV#>4+?Sa z=!^BsN-WsP!yB!mnec&dCh93Kf?;YRaP38?N|$BPcgF* zp|E57nRj^-49>&OCP?DK+@g{BjOv*HZrs9)?yRm#r5!4ud#b4no5zcr~`Bxn2GW z5l`Jr3k*?=aFBBRQa(Rnts9certVFfIy-03n-WfJOH%oLWfcpXvRgk|k;#YB9?%xL{WssuWC z^XfyIApa0%KQTJ)JZx*KU2+Mu?6cs%q0o-ab{|>C<6|nkn=fOvrdYwH1m^@>ZOSaV z)zR^kHh)DI71BbT7vaP!<7m+*A zCAgjA3Wb8?=v4@OCNZfb4k@p{Uh#}XJdolrjC^S`Yhk9+y5B1eTs=RFT~awwN(>Zg zJg8lUNDZV37*7%e*T7QxrbGBXMu?Da5+JN_t*Mgfk1)X;BbhEd&}Uvm%HML2=Y!5Q zHcg_jX~N;%EB{{Ic#-!W z5Gbpx*uxe6c~>#CMIcgBRJqct#y)khSs!Dm@is_2@H+JV^o^YBd0B1Gwa%~I{E0fm zY<1HFNFBTlp73pCk27PWoj)#-$TtT} zQxSKG!=tsU-OsdAfs94^1E6|)zGQWdtQ(e>OU;*iJX8=pApP9fxTd}-*7k{>dy1o1 z37P#rW7NjLhux6($oMNEc0pI{ zio~HpyFipcG!26C6di#nwrqlRG#PmlR}o90INb0T@8?ZcHux@7R^11CcLX{rD9m7Vl(WKAa1zEB!f?vM?3MXZ**6;U?Dtq)-83|zxcQesfYO@jX@{+ zLMMkeRt>tJ3r!EN9Dc=QjT$@D!_pUYW6ReEn&2d6F$XehG58z42ZV>Y^}wWajO=mW z@W=GbbK+IqW}-c?h-A^pnXUdn8YH_3-$Qv3_d_8HkwDg~7goRx+UWm9Dg+(>xhmrC zhn{(ttXNjBPZ{pj#PZkQGDn}!LnTr#KmQ~zf1)-1KY;klJpZvLJ^zb$RH4_8 zGhKpQNq1VQq-Xwx*N=>{J+$>N7OC>qrSEz5sucs5)bV|rk1jtDifG~`#~MZaU6)1@ z?7^&QM;AQV4MP?tP{;jFD&oy366S4K+T9pv4dU4SPKuC243%*eBn5s$&C?*JD7l%!Bp)qd(GVwz5brUsoy*ZE4{fK@RPeU$|E&j==)u5 zMP7a&L5CY3(LBeTvG`G6#qfD_G&#w#JM`i?|BA)oB(3ol*N7AU)Z}ju zvXSH};u^G(w96=pti;~(ktnjZQ;_~qu^x%X$)#@8!oEEEJ${bG-%aeD$TapO6rLpz z3%?w)o?)8r8aCv_&;r8Gk}l3YkOCMSm> zYkkcYjy@$s;3;ubo}`~VD8#zZP(l1 zaw+)HrP^4r@FNeZ{K=Crf6V|%>9Q`r{7Fk{;hknsK&TPF-BV%W&EMqCYa+x`pNdC0 zE7eEQ|FzEh(~tF6nLWc8>(UAA9KY06g?et*?GZdF-Ap#Df$vb*(IW22Hh2-=gy7C} z)6cSBT4(NP4$^X*gq^FMj}i(y8%zX#T{108_q71I#81n(enyfrLay{nJ3!ip%2p8BTWdrLf>h>ak}UwT1g-q*-9uYbgkq94JPvI+Vn zv0?rM4jaq~)WPEX=pKk=#LubZFKP09@FMZh!SLXL;wv${F<;N6d}i`_MQ;+JsJsdh@(1(>yIPlJ|$NS;I`{yKGg5t+;#you?GlGyujOW3F9I z4tyX88i~uFn`|z=2L0TY*`oI}23jv%TJp5)-9b}x#r7-$1r^MEc4O=1*VE9oD;Z}z zp`}C=N*)#RLCy4?hl(96Me+~krR$P4*XPXc-52x_Ml2K6MJ`;WAI%zKX45V#C7325 zuTavS()3@iAiyP1^0iZ}wTcJQ7)QJ$IC$@~)XnmRkcPK#XnQC&z*ra5H9vsagxn_c zptXw?dsnZ=Y?C#B*;eJ$$ZdQ**$alKPBv=e*)vpEFJ@azd5{1vrxSpw8gJ^QT)j_O zW!3v6eJYl87VB&shwch@12+dD1MbpYY}swCa3P9jbw+2WmwxSogkDyx=zE3sB!%RT zPE}hRj&YE>x=!coB|$nItS3Re$_4Ep+0 zIYtLIYC|bs6!f}2#)?FOISZK@O*sbVQz)#?l?!<-iDNy)3Gnv26p{ahc$3CFb^}d) z>4bh1=$gfvS@UL_187f>qQr4WO=Bc0;UY&Vh^l&!g`Zp)wJOm~$*zT3xY` z`oadIe>}vd{$8P+avBg2YkyM4D~zC*QVdBRDu0ijz%5&qAw06#l&ARXO%@C<`jb^U zuW3LIj7@2t0D$)PX~#gIWE{Sp4b`~7Z5Do)D#4iy)WW@^aB0NmU~}0AZJuV>Z$@>A zb7doh#`aQ!eEXrA(tDRdRuK|xk#RxWfs^Y2&~^VD%7b!Jjl*^~-Nhq=KHh1;{YHBq zW~ex_W4n@L7{=hArvePQjYI>otRO>IPycRk6$i-)Gs+NLyiWOxJ)Z%MYM)jVdE#dA}+y}+ilf$uxy zn#Dp)3g$J;pcVtawlnFtdLT?y=WB=Z(Zo|DV;DLU#E6rjTAnmjG6I`H++4Fr>h9BV zfs{vd5pWY=-_yM0oLM+95>Z?u5Ts19x_{4xjwFg_BDemMmu*P9iQ>&vH;F5yJzA`Y z)i?^cY@j~M_t|rs%rB?O_vC7PcZu5atuiErJ^pJnP_8ZPN zKA(8wx_R9*K6P3YrH0Ft?6;E5lfiv1g<(kx(p;Q~tnNL;vdMI9^Ak*yx!i}~kRDRi zS`XeZ#|Z#K(mn!QDjkb+G+Oj;&jD)6&({%U1*~5|V0vksrjQ7zcQAqGoR-^uzM&6O zvNon2raJv2VyJs!xpHFqb-FF6iw&8?wKNPSywk}}(`4W!R~!n4t~B~A1QV$kg^Y74 zv{oo145?g5l-jNQwpi5HfSv>vs5-tI_YYv?E~4{Q#~W)n{4x2fypKE z1O)}eI(cnO3i8D;^3pqCC_vZPrvBF-%6lhI!3AdSPIgnJRVmVHr31uJ$XjU8B|uar zYIg;CMry2nN!>uycwe!5`h27M8E(Twkn(LtZ5;qujt8$OzcV5TP9j>$k90u{_-}Zq zr&?5397^3OvKIr>N74rY)P@fOfk2IM%V`49%3q4TAQjH^N7|{qg<;N$zFF5&He<$rKHe<5l@d#N3bhtM)e3bp(Ea!`AkJZ?_f3@Tb zM87eiWsXPlu?>bE^THlEN^?$bij8p9Ff z)QT2V_eX{Z2&td}p_WbHr(ERv-N6feaAl1l$G`lTIFyW9w9&yFKfB)`aqOKfG(&|* zjd0>njz@LC_fk}&Q)yNyvx(}SX=#Nd(+4X#Oxh8=RjB=X#Xvh#e{NV?fJS5ENoq3+ z%Q)U5vQB)LVo`e2nL(K^lm<5;pwDw-as$q78>+ZTE3ls$S*4o3a|OXZOu;-L-?D&T zitnl@EV|}u0c|K=>F$6SWehz~QUj{vLoKC-u=hD8ap~QgN1&7!>C48%vGV8~jaUpy z`65u(&IA|6&AL08%DHGfLsLbJwM{djdS=E(t@+)+1jDIAl(b#ird^9V3U!H=DyQm* z$1?nj2W4Kqe_kT39#^}94}R~baq-mf26mc-iU)^?G2a06lDGylb(!u^4w=dkwxqx? zF$YZmfE!;s`7jMJ?+@S-j4S@^evbYKAlmr>_Ygoo4jH^`gXa9Hr|*XZ$cihsT3^&m z_BpPs4hHIX*_i5A_Ea1#Yp>9=nkj4fU_dkD`AAQk_*r@83%Ldv5+b4U!%QQO`aukv zWVlBqs}sX5tIr%!8wZMGfJfAdj_%K)F?ebydVuwT+w7BJ(byyY0k9S|?5ow!Qb1U! z&39YabUN1N{`PG2M((O7`Zj^dfeXFHHgM4HREM*dsd*zA(wdO11x-bhl^y^A-?_3m z`Z_g$B&=WHMUhcr1)EbiK|^%N-a@Gm>gjvzLPm=M?O?VXU@v?=6t9$5qTV@xdUI1p z%)p2rjzlo6PreOwI?B}7Ed@D%wWyv)kc=XmB*i-SY)&+Eo{iW;wa_Les)0DBnN78W zM?ot@W`vyRQW%2rtaJ&8(4z_1*1cGKJ#TWEs)1QK)%R{JiN$h&^u$bgZ=7V|z)5uC z&bnI0M#RuZ9hl&+H0$$ARv*EJQf;jdU6fN_=M5%hUxUcdg3P9*Lc0(G|DN*gKJ{B< z=JWT=)WDjBh3osRRC+0XLUJ`Hu*mk!iqe>by-L;Nd-VIPq7=STop(@c+(2PDaCTta zC^0RgCgAiY(+~>7?nHI`OH|FpOBBV_I050ClI;XI`p+1U;K|S3q%@pGy{YYicjAtH zvTz+uISS6=5p1_JqI1tH%PeOKEXAP-FMTnq2wW$r%%0hi+`TiDL0`DTxQWjXK>-{y zxc=P26wHp`7Q|rVfF7y`IYMv;yTS7l_%e(v;}<~KxX7jbT$=;j5FQ(m*s7On@Sw7a z0d34X0wUzf=m`<>)0R*-*J!wtb=YlF!}$dRr!V?O?hL(q_W}d`DhPi*lZKVnguMTj0IY-+-z_W+7aTv1e4_}PV3X*0m)HM`p$oy%6ezOMU` zkQ8$yqeHdil~<;M$KP`6@kWQe!Tla0L4RI-?)tM=O@yxdaXys6{-3= zBa!pprLN)icb=ck6~_&dx+uOVuBWx;Ybz6dP+|o7t9lsL{Or-$@^0>Y1jbFwIaaSz z-v#P8m>#_1VgzM+5uLsNJQ=D1(9Qq8i-M{U`1t%knbPasB?eO+iLdrW=di_o$ ziFpM{-FX+mPI46!vULNZwZ>P{&$Xp5Cx!qR!7Unw)z=v)>PqErR(7E)+Wa?Od_wg z@{JCE`uZnREdT0LUXG%C%m2{Wf6;G?olJ)c-Tw{u2f)^H(!ba-?UGy0?X>8@GdcXZ z2u;-Nz@`r6R3tUSJC#+DS8Auy5*=>#J#9K!(o7S9%I*#+pAE#n;_P#=(P1zeDRSWf z8yo{G979J@KmRfh_WhUi)ZhCapdesie}@VGN>8Bx{z*^$Ri0vQ96(l{yCD|dyZ!&A zr;z^uLNHuNkc3|vGm^g>IVyZQ>F5OJ-TFH_7h9$gx&3zL^IL%+k5(k^^zC5K3bSVFk#vG^58{ogkG$u z2$LbVzuHhuRoHQq7X_wBB<=%(>-$bm+Yq$uO?#c)!!kOVUri^&M(rkR3})yfT)X<- zrao^`Wg%C2=N`7e66E9xI2!M!lUoH=VMrt_kQ08Y8(H%?N; zTa#>{eYq=8q(~iUgg3&^@j`G)g-Mn8_kx%u8*`;uS@)^Qb8~opaoqwEy1y5oC5u-j zV++F-K0Np(7Xee6P8_VLVy?@4EOy{K=xVqQZc`kbCK(x<2X;O@#=xNMLc09e**ph9 zQx_@?VWfHYPh`FZ!)k-t8|3kdhu0A*1MXPto4<%$EU2T5;I&ulS%kzR#jBejg@b4x5 zxwt-12x}~3_)lQc-`IWj8AfmnZ|24voEL~chae5Uv^SRRMakLRIz!Ilad1VvM5rPb z%UBppLm+C3w3s^34>gfJ&W=Q4q7=p1>#dni($i}!4w~>>^$Y%FvkXK94+vSDT@QmV zyLY2JP72~zS=L@pUaKIXf{mDq1s0G}kpkT#hsU2dB{vL75=IR0xX9EA$5btH4v2}J z_A~+;oR>cENoqz3t~v1~rD{s1^`~N#cFf(q{JB{-FtJ+Rr(*B3R$ZSZ{LPxnFa}5cFQqYygx9t4fbRgd9;fv{q#p$a` zYW0<~A0@vDI`{7KZ)Q`>oczP-L=O%h1Af8w>d&#a2ngU|3v9@mWk+_vqS=qSkp$dO zI_TN3Qmd7(LyBom<$#2)43%J)0$(LKg{p z_=DYN9`F0h)haV5@uQ*@@ll*v+r*9Q$b#d2qYywVgARIk?}-i!CxjaM4kj8>33N|+ zV+kqBpY<8LotQG`_^L<*gz#oRtHep1i)if-esb}01C)htV9d*|Vxp{ik7mOZ_@Rwqbry=^$kV%^R9-^Ld>u5%~EBFpV29x&8Sj1H16u z&pCeu#J4TF@$IM(E1`m>Ck(;eUF~NvX?LQyv-sJ7<#jCJV910=f%)9TCpaRhvmV%k<%maR7BhpgZx$`Iate z1$3m>T-KG0uvI@E;cUJ1zQRE-ZG$0VLFIr_4OxP$r{hkyb;(IA!f};FIpDv<#7N`-=yu0~G_N;oF%RlGjkm!(jo;q1EV3`Y5b= zmuTAbQY`+k^{mD#%9R>BSM=g01wa!~pU0Z5ObbW4q6#GVQ0R+Za76TM8FC=%i_8AF zxn#pGk~Jc5{H99~yC_ne{YU{;*J@h5R3e-h2YoCqQawOMEW9OmjAxTKP}mM3kKnMF zcPgS#l>fDV{xH{?XypC)tkkF#IaXL=9DF1kD{N<(UNp`5Mf9w?n0h&#H~aLG{`8e6qU zuAq?q(^4cs6r8BxEfQSh2tiX&bY(BfL?Qn>vi1G~r3Rp!uBDIA0zb_x7iGFzceilAgM06oRjkm!U#z26BX zwq7coG}1Vl3UM@2z#@Zrq`(Un>GN2)90P}23D+~2Q(!3q)D?;6z2_4*`&fjdLe0ew zN%8n%pP_i{pZHREri7-z)zy)>!fC7~)$C^hmx6!Yb%P1d%@DA5-Y-J4($_le=&yHSK2eT==d;@WR zyFT|!sJr1)ZzjRpol7mkVF!s-r|O|B$V9#FFv-4V7+3O1kI#9iq;(H$y&koe85Pw! zn})yh;D8pwHvRNt2{d>>g~DBQ^SEmOlMAk%+tTxfL>SsE@gWOo2FwuheM+5iEv}jt z)zj8U&Z$BiO37ql17;Ng+{}=a*k<3Ahwp{8Ld)_KOumT4WJHidOVQ)>Qj3kWEc
SU{EUoslC8s3XU2KH<&!Y^R}Nb;LKD; zxDAX1@2}$MG4LK|V+L5VU3Vwb%Nnd-Yy{0oDBBQ0n}Buo#NNJ+rcnGp0eCTo&cXr* z1HtU!L^}GqqJT7B0oI!mDo}Qae8VQ;2;6{~1VQ6&9bk!v)*3P_h-~crafh11rrI4j zhqDb6XKN4>XoVAaP6}2JmF{^&Q-R|EY9sZ)lkdOX$Iu*A%4X^R0Hy~=FYdvrPwHxUL0rzD2ym+sjH$TL+QXd1Xd=T0D3`!f`g!2m=PQW_+oBj zL{TW5H_4)Ri{!&_f8+pTCB8IygE~5p05mtCUE`R5t)ikg0Oaw|&z8)$mY&MQ!E=%B zV9D+k{N&08k&6XiX^cVwF3$Qf?obOTwQk2q__kvlkV-Y+Ph~ky@ED;H2^~K8kYEG07k`YSB{y9b zce1AD1~e8@jZhNPLJkeRp&wEL6T`+czKLy8qjcy33g}-ZZHBfDw4$_sUA{ogEeM)6 zUbT*y(JIZiZlVV*EzXJQK=&Bnyn?tC*bp(`9TxylXbNpIXBUWO<>ckY#8{&EW2P({ zJ}Hc99N1D^z5_$8SP_aEMIaYV_-W%Pi9Ze0NRM50g2ke*P!^N75|&@m#8@|Lyq`D- z3{;uQdF?PcV8bT(6~=+!RBCCF*CSrKUbJnq05A?*D~>3Zun9evooi`zeHp3V*RgeD zH26JtkldM)F{Yf4t}x6pK?}sVJ z7BxGtU@hl?rOk+9V@f#fZm)J?kko<-qAE${m#dV3~6P+3)+R@?H=Pbu< zMd%K@Ld${1jp@O#C!&^-kIYeu(ywN7)8!4K5~7R9k{I4ZLscStzpo3K+KcNCDtZ8` z&@O6=AONkYUrG3Nj8aBtfMlS6hSPHe4dSCK!+=c*uu9~ago*G!%m4}8kAo=tL6TS< zI%~wd;?z%gi9W~d1Cb~|16x+HMmF$b)}1Uen;U%QsL_J~P2nKK`7nI`FyfDq5EN36 zWSg#yMX! zd9wcbx&25Z&;H=cQ8=Wp}qze^e?t zbbRE&N-HEnBn2p@xST-mz46yL$aejIj4mpBZbgqyc!E-iUPQxgB?2^oy{{ouf&o!U z6xIM3nry1xm9?)Y(VCuzX2Hr8lb-PAJ_<z2?%nu*xyHo7jTC# zz_6g-Cw{U3!V7B6O`P!cFhIyBpxMc@uRysDfDIklZ$1Z4oN*vReFQv58pLL`2YUW- z5%LGFf8QAis-PU#x90$mu@lJv?c|;?dK7IE!V1-;RobdMba(*?QFrZiF*zhs0-9_9 zo1{XQo_(csL?2J<(;}If)(Zm*6vkw!)@cHv;KkjO7DHh2CcIg>G&fvkw|MWPB?A_e z+ks6yVBUGa<9Vhzu07l!a`kdBUV!jiyo00X6GxYnP$f!&g7`B`moOfXBF<%QwjRln zQ)yAFB&W&6vJheql04pUYx9szJ6SHJS9RA8K-hA*?xy@P<1isC5wnb4Fp@Po)o4LHOnl7)74hM3S`gfyxnaM&dvMviQPehSdMu`^O{9Dg<&&FULAax(SXqr zD3QH4@y2PEsy#bKj{)O&!Y;P4wRVTw1p?S25}_+s35J7txa)UnV4?y+1=(;1@9 z^ynS1^_7|zbBw+9vk_vEiYmAWqlE}U`pzXvE(=n)O%?)i1lO6qSH?GoMs6TQ1-D{= z5wvkS@|q#wY>ikSuRW8XsjxaWI6CLhvkVmC9L2L7Aeom$pi`K{*(q`eYPFxXAn|JV zgn`jLxHUNACBjv9JhQ9@8!YS!r5&0)OP}q{>ycC-fX28^yvtA61jt=H=L$kKUST%X) zA`Sll+LUbL@NT&Z-fCyA3b$FX5MX)lB2&1PswAslq11u@q6-3A_s z20}v7*<4?dER$gOuUv~Ce^ZidN+GaBG~6-IMyPRX@5k%Fz(*w&2WQ_Akb`w10?gQ@ zrJxH5062wLus?jJb)xl~Nd()3#G4N|99-)WiA&Ee=e#^o>M0m|goP1bBnok6lfUhNNQn|1;n-nMLcOxtTE>9m#t~~MNlr!Vu&Kqu-x@ZmEm98)dclXB`T{3WCYmx> zQOcVo^mppuHlGlLO3lkP;^yR{$_KDcY)6Lgj4-B%zkzh}E8e)6O!VUcR7(@jIBP_z zLW=8>dBvbuU2A=PaJDw8qwW0VcCuwd8sR4fH$a>G-P2t2yoN|?Y$7~y!-6a#LnHqH zhxy8$5u|Q}2zL{_Bw_@^Zm^W5wQe2C0xBky)U>;;?*~IP-61qv%BZO(7>wwfTY&?b zclzWt1oz1t8#r-&a4L@}QipY~81a?0P?u#*Itw^4DGkBOI_y4iAZe7r`8Ar4dAe+x zM~^rii-ZH3PyD5sst|&!-;7K?F&&T7E*b3AC1xcN7;QPsqRkeF#%YFgA8a`ev=UV<7xYnow@sq|uJm_q=Rc>>Pys#Zdc z0MQhqU25Zw6@ZKedewL5ru?)-p@s<&(QjGG7Uj%()a2u=8CkHfl%ESW7U=kh&F+iu zyk)0CsVd!hU%o6mYLqzEgP(fG9hJe8Z5)*P4h0U7_SAojFsLED8h@NXYlpuK)Wh23 zpm-bJKm#r3x9sryn9x&0(I9xK^YqPNc+Qh3^6B5kAGe_B@P?z#@-(!k(F&w_e6jT_ z5hfJnZC^d%;auk1K#){;+jRc`TlGZ^);fnjt{`Hz8^i~S-cm#?!-J4CDN5sY{5cJZ z&iW+ZB)VxO{ASSUw+B@egWC>`HhfJBu@JQ2!W6ah{3wc}XaoFVLi%Ij}ON`dJZsX_;mT6M&Czg+DxSJrF? zLu2PQR*}4O#3UEHA`nuh;&%sQtZcAOYFA^mFu?Z915^mI0+CKNJ*N0?(=M`$qs60KXwmjToT=t3S7u`mFn zF+wLMI4wIq7{KckcEb=8R0ta{ZY$7GHT-LBUl>nJ;1DfEcjb!~f$s2a#3b?d1 zC;p2K>kc)PLjsph@~TC24=QTdAShMg01E&BAzWWZ8iasG0BsG)&nbh?1k}sAVkiT) z;5J+U-3zWAkGBX7#1I0dqB=x$;ox^Vga9lFvrS@4p{f8IYp89;KoeRB4+*u$Rp>2$L-49)a?!H#tzD{X(S5VRO#muST!X8 zU6d|k$%2lWi3^*kT#2j_Bdjh9M=^4Bi5O^`N)!m*;Y`2)lc;2BHx0Mw9r!LL#G~~;lM*~kzWG#e!Z)AhN+X&o-l%3 zH3gG39KPUZNK9jt-OVbE|m9!#}n1&1$3pvV^}C* zyb4d3DjiMzwTIb@Zg%Vfc(+cR<881o4*?Muy_&_8^JD{M)DSdTOhi>%?8HK@2%MuP z+;SO4I^Ggsb_kk;)=`@vpa{{78i{T$5UW&bzgGYRs}NpTA-vuUCU4dcL{fxA3a^ZI z5S=z-6Gv^`!?9E);{-%;OSGm8wITu$$OPB1n7vRUR`4uPS;mrNuzs0|WJ1a3d!R`+ zP`4o=a@Mz`$=fwskVer%@000CaY_*8Z@t8&+$KUnU{Xw3n(k3dBSZSSe5ch~8U#RpyOi2I}x-p2>w(xf_a}lu}e)sI+s#^-3YmA0aB3N_3 z%lF8d8A8B;>XnQ*1@6Iz!5O~&);}oV4R^h>p%99yg!r8ZP zz1+7O!BcI%ZYVJ!Re4uA&jq=s8_JoB5PE}n>nD$!+uK@XVLI|KuaGLr>ForZK0jGr zinR^%&wLqaF?k2_T4|=9@oNY>V&6e8U?;pEzVf-Hl!Y{W<5FkJmpj2rIVA5JHf5-z z+4K!A4vGT_!FU4rhdDj8T#+MwXmI$+OxUv|IG5{Y_mh2yg@e`<{Bto<0VkK*A_ZP} z-UCQI#X&i$3Tws*yUU7EF2@9~81ub21O*@q&>76lUff5%mvnHOGmzrf$w}deWaO&| zP}uTQD?A0Tp2qINTdlKrLHfpq@-2fhW$G+LQvo2uFpJ zxrbZ0KIlr-TFf#)PU-@3Ab8zv$Je$h8mrpk1V&XlG!)yJh05hvqeG$TboG@D2$x!T z9G`P3IK{PUb!mX;8^%jFw1j+i57s0S<8v zq(%#dx>~<{cs$KG22cU;Ygk0dN`nAc4Li&0J^+r@U{Y~#10-_G#Fou)Ct-{l0B}f} z0P^x-B_v4jn4eFapJGV>hQ$B`g=(s*@{0NEj-YJuT zaV4^;$;Rd7Q%$GGZam-*! zwzT@gSD<$bqbS^8$(B*0KAA#2x91_n3zS5JC^%6}+vp&l0tqQ7&T!?Ol$EKj*IbFl z@tEVvWJL)Au0x&WW4U=islf}$zOYPAVCN*{jo$QPU*aiPMb}@9iQ$rG;D(^&P6J|Z ziU_5MY#c}cAOmS#Bq6!S6v%-I6!U}t{{Uf{r=D!egyc7ii`SJQM@trhxx)~4f=<_3 z)uao<+rDl}F0Y+&oLF`A^ZGI zLAY0g&L=8wS`cixY|^=GY8r)FP;yk?j6~192JBBatS?Wxa8XDunVQ%c>u?s+m*eVD z)sThBv_#3s>B$&>K<6MrEmQT;g@YkBD>wrL7&(CuZmqeEbB=&3V9<~?$_K%QR8Z20 zc+M?haB&{d_Qzk&9P@?_A78$0$FJuOGf^TloMyAFudE4!7-?66h^Gu#^vse?4MYIF zx~tl`%*9Y{Kf@dCQYghC0nsY@jG|qtHC+xRY(T1lbJGM&%ez5#@&Vi~eX&`{vDiu? zG)Da3{$dSUC?aectCp@H%_&O4d0b=D+XR}b?OZ?KNDx?yYnPetIwCZTpcE@*+w+3j z7^l2|WOuG`WVqeJtXb+fJZa;U)iQ&Vl67#rl9x^i*n@|lk2_h}yy-X=8WsiG8GCEe2Q z;L?y>Wo;E&0CspWzXNck(C^I=9vrw;C&dz>080guxM+?12?g3hU)OCx1VU&a?+dyS zg(8^HJqLL2ZZ(vP1$fZzyTFH){NhzP^ZaA5@U@<@vU7&z%9;M}EB4BcwLgpzKNvP= zNroAq9pRkKV{6g0`eYE4aEo4(L$hw2F`=lhQvoUfHnomIzfK*{_AM1v-djz$E=&NZ zC~EBkj4N`D0z;8d@5D`-UjY-(TA#~PDh!Y)#Z6d!@u$;RhJbZjz6==x-7Oh9Cdhts zathTuF#10@YXQ*fjyFX~=YROY35Rgm4MTXiW2f)<9x_!F7{D1ioDoKk+eoR4xtu;Y8zjMtnSRwG8gAkku2$eR}8TUw){z`FRsb_`pA?4J1p>R(|Z15w+?_%vi*7P2CXnsd>ZKm=H^ z0*hK`afit#HWhc|)91z*jkxblc%pr3mMv2)GM0AQK^LB+v28;zqOg(NSseo6mU(R%VI7|7! zz|Xh*Zy={@H-P&;j5|+XwhiRtS;>XMxHe-;H)#E_gyc#kmWNfF?deP+Z*8W7LcopE ztAoRiM-YTODsPT4)&BrU$3>HF0j)u4tqxY{sz$0N<69l-VWMv$l$&;pH*VON(iut) zx4j1Y%d$@o)d|AI-u|Kz#L8$-W1{=Q@KH}G))kO`97iF&G@@|(!t50jLaOuaU#=Wz zh*6t^V~NR!!5*?$!^`IzVd>t*M#x9Mc``>?!Nd+a9ASF&re_bQ4eq|A=0S6phd^Q{ zr;OJPpbJ&VX|sNJl|6XFIjdt&p74~Y;7MzN;@}@t@dSgUl#i9`0cAZiM54~Y16oAd zEkL9!-zc}2^~tKR!w^%i86a9|XdWGkrq4L*FvBBtK$_eO*MeVO<9p9ZY5B_NkJdbA zsv{j-3gMjxkKYB)#Qfn}aX*YQ9|!G&?||2wMm1Ykq6wf$VQ%`SLT7#N{8%8)z^UCH zLU|LKag4+EJz$NB0#Xu#k72)^Y+!(^!^OGrf56EY1yN;D^Q=O`Opeud;qv67h>(~f z=yi`qubkcOl19SAIDXiTkyWXJMC(r&LM z+jWof`UERpB4;fb96>0!N1CT3Weg=k?1;|jpG@9gJ@LqJJv77l$pze?0byBKc*ayq zD({Eus3weB!dt{A}9g9O>vs~tjNgjRHazDnw+ms-yqk3FO0Vay|^WY{&4Uv zx!x)*MAMhe%6n!c8|>rjgIeN$4h{aB`eJZvj13qZ;cfMtJY;sa4nyG)oM<|)2<&qfhjh9h(f?T!bFh}i{&RRpQPyikHHoT{w_?c2^L zwa-8u??ZjzFSY_G!F+S|a2)$cf&c9}u`%Ow9@+ zd!dfSog`Vn6PK!RaVlAM0N&Lt+ZT#-DCX$qu3Rb+OC#EA>*a{WGItP!h^pG0A)F6S z7AOaFyT7l+lTXr6C|GxsoTlmccMu8%>6KJ!)@`e><~n_JwH9fiR=fe&%jM{F0LPHRNZc(GhNSk$H zBpg!jnE?Poz<6L*J%Hf|wXp$~+n(=+Ir7pB5L68o-UlE%`dgxDSXqZ_U5e=kq0ubM zD(@To!k|certtXqngY=FIz7>cYffP(SDty^2j!g~lbi;U8dbGa4RARbk=F2V{xQe+ zx?ip#6-~?XF;G#n$n%7yAR+`C7#z*r=A?g6fizg>Mdt+)iNydoplYyknYv8OH>vPH zV-#bAW7sG}Gj%SU+_4M4S^mDN4VpCIMBfh}feizIvm%Xr9}oH-u(N74MEFcs!4Zsz zQi7T_@M8;Omk61b;lDNu-M(-EGjRU^dCo)3{&SG=Ka3l9#tS(pIkPY@CwM4lY!1Dw zUeJFcCrOU1h^VE(DtQbQNz1^AG;q#2%P;hdK>9H35O@ngQrJ{=rTq*mP!~d+D$pjr zNb2nMH{ItOFPg@p-M$OS93=x1H1Nz`{!lOomD03$#l?!J1v?@R4R*C7)Bq^Xk0+#6J>RN1@k^Z=_y3GL1=(GkePJ3 zau+JUj;4u>W3x}$i@h;}GqnCV|3bc7vZHwL)c_)FIr$G2{GyC@-z+^0_Cy=N`= zWT~5WPZ_Eh8s1c!3rG`;QROSk9@#9K3@}k(;ghsiC+&a-H1|~c^Ug37xI)jICPlYH zB)AYf7@%~=iE94BXfT9{RygZ_WpxrfguJAZ-+yekSeS)_WVBxJ5EeO6?JdXZz z9Gu3{@vd&Ql3+GSe#15%f5iQJu~Xg#n=nd~c)F=%Onmaxxe_kNq141uEd<%$e;L5P zYy<0+E~&g{Ev6qQ_}&9R?teHRXP>4G7kb5BDS$X~)(zlsf*4TVD5I4T>yZ1`9XMm-LOZQK49HTbF&gdp6v=JkPj3#3M-#Zzr%5fHLzw%`HJQz)`p zjqcm*#ik%2&=7P3%0{@ciPYu~^Mwkm%i_XRG(p1R;i%e6=FETCW1dCS7j6RMYy*u2 z0tAnnfPs4iHQFXm1|vly!9r!4`F&!EQ9H18)j{!`Vc{)&n73gQ)-iR*yq)2NrI!^R zR;X?X-cP-U+()_jam$EE9st{<50qa209^{DGT?+&@NZficAzSH3J7R9z|H8)2oyM1 zY2uEGyTmXc<4eaq;l6j9QMn5(1o4V-Hl zEt&KKa6M7^z$6t7S6Dck$Sw(8kDM6OF-w#8FUA20DYfgp=Zt!kOgf4Fe;=++E2awl z2r8&JL=ny}j5b8%zFc@>QG3o&sg6jLvE0J~AK= z00wOx-=T#j-?4%oU&eU~{1~Q~$f_$enm=+l$IU(opx87tf`hz&2vSbFxR%6r&xRNM z7O4!SuOW(PntRzQ!UWlN>J+DZ6OS(RH{dbD5%n~Lq|o4)!GKA|=xjiZh{U)Wg>mP- z;W5u6L|V3^&voww;*M3c0CMKF-b4(JA|El{O8bK}1~*(Ywj6eep8{IhE`&@+&`a`P zz^w6uV7wGy{Q@JLLd76RJ0%U^tadC2OTqX5AHMP^sIH!)V%8O|Z)bMbwcStgHt+}2Df698ecS-?ez|57;{)I2#i`#}MLO?z ztUOcs!3Lc#8N+0SzHo-m#&p*{usJZ8K>K7cr0Q=NU_iv#i@;_fc)8Scl6%P>(x-na zBy_2$z`Z085*1$&r+Kq;e_@nQQsS_CX-*1S*aB&0SY) zKN1wvMk6XNAWGXN6`b&Qb9l)%vDN`l3Z~$T={+mR{0^#8qBtd5bp{%&S4M<)hN>ot zgf+shw>o3hQQ)r9LNpGJab_?I+Zx?3ws^`P@Pu1gKrc4(EW_G5mL;{y2WFXKe+)ZmE za5*7qyGV0N+_ajAaik>@n(oUeCiSiIBdkrlt?L2^MAS!o=CKD;MIjrA_;R0bP!lI* zpgri$ddNyzE2Ha=Q69`=24vFc)sdYgRyK_n3;;JX zA%XATPH~YAtJTGEjf6(1(+=ORT1sd^I7NH2&Ku0yk!!<%9|43aS~Lo;KnE@jI&=ba z3Nn^DrZr-oFQ3<@J~)%lvwFpcqu!U#t4O;D!`Z5k@>ZC+fYS*!!?&Ki#xp`7@8%4tzT z9#O(QjULP=OHg*?P&Hz(-m!fMm?++5jnyW{AQ917^rg7_f z+KbRy9!${Yl2;!anc35klIa?_1Lm{qUJE7!kk>zwCf7efNy$D=7^P1j=`f>jMf+iNgq&;*9VMK z&I#5;*zh@UY9xGTQt*D+(-rIbQFL!PEcPXFUbD7vW2L7Lj4%hF&JCNAc8@!L>D~lW ze*FiR(U5(d=4%a z$Rduuau_(3V>lINp$O8LL8Z^6cZ#BoOmo#&LlmjJs> z)#Y)8&75NjjA^?ie;O zyftu@wxARXw?VfCpBO{q1Dr=4Qu^b`r0mm=VO_->q5{I9SX@wM>-KO!)`MRR0M10S za?2aiy=H_U24Ev8+1rK~ynWG-*IQn}>BCUaAQH~C+{>e?`e#9ju+Bp^A%cJr>*&aM zZ2Gz$WtR><9`FhI!2_b3AsYVxznoHnJH}JLcywq6I+%|afbo&U62hB6KNkwbQ8-Sq zem3bjsZn21_P`EQ7$OTmlVoGLp3&;B-ysZ|@DBh3A0)fMJ2QYF(_}MzEY=66fZHP{ zY&#^Sd5HbknS`dCmCn4WJMoPjz`ubI=@^&srkf4 zwvw_r%OkA>FVmtf557z3phe~A9xDHSPn=Y?h}R} z7myJZkxuO8^5P2#Id;J4F;@*R%$-oEt*3MMxcR^l29z*vBY2k(kOX_%nI{({BF*O+M85IvQj zs3kbp05(=^1E2+D0K;j>>^~wU5pXfu@QxU__~C^V*dFs9?_I(q-o(A%=zCuVB3wV| z;|AybZ&|xb;jp&l=l=i+;>2+7S?{4zuj!)J03 z%Jutk5Z)N)TQ%D8OCBw8wy5D=mmNba6uF7U^nP6e3(%#nFrCchPlA3Yrp{tX?LA0Z^Q&b`Ly7{5Zxn9 zBw0wXN@f1-ZR)R$ARnvx;TsGo4;2MKqeY=BgfgR5L+4EzA!zv75j@!34%&P+C1seXMy1B;mk&)B|VW?dkYn#G3y0J>T#wXf+-O&6TdK0Z^G;=ZWFbrPz-WMU@76F1Rw zYtv?K&ZM7zTMwfq9XzfN0a(g@wvbQx>nu^ zii$pJch)s?({e?J&HPAO;F$ zOG3tI)>d}ySIdVdX9a_b%PAI+;O)RojSUK?k0N+Z4d141E&QKC?tX9UGSw)yiz!f& z>o@>9`x_az^#0aG#9EpkXa@Jh{*BtT9hX_{`_6F+&nV{oIi%k+K8y4)^mgf~kvxUt z#ifGvo4j3IbSX)Dn3ftTd?10OK3~@j9eYQ?JGrc0@)WIfn)3}qjsE~>h_I%Vlmvr# ztW07cZI;h-);NoLw2|OA!|rgt8$gl@s0eT|@l!6hiXk0z$yCnHnHJPOkL_Do2;&DH z3zpLbheuK<3w9kuImFHtBBcSAp>$!m0LE%67p1xVAa>b8pfS9+&aloeJ~1B6VcCRd zk>6@n+W_X6Okjw$NDOA(WfP|>Sb30b<+?aG9@TiH%?3tf$#w?Dx8mb8_6wPXby|Fz z)(y~-g+&dzE}Padw25#J!F1!=jg|uH0u)Ou+`w#-qK5;Ov~ce|P?%m@6?S$%+08@> zuSRwC6R#=`HLdlPJW?>kgLq}TF7Q*Oxe}%ak=c@#AR>4Go{(@_yP}3uUIER3Ar2+= z5fRvk;rk$t%9V(EFJIACL;zF(9jXBGnG(rNtPozCa*Zf6{w?1oE^MfDFNelHU`#=Y zPRFn63@{KS0QWs2UKkISqJphS}Eo$Fu=6kvgDhYk(EhZ&M)18VJEwtjbnlvn<6qXubnA7*Ae6 z0Afu{kV&8kwCsg7OS7DtnMFjcfY4|`P0}f70p1kwMe&RsM(QAwl>6a~Mad;ko)INC zSrV?_E>tJBf>91`2Ffr6hJG3 z4V?w3avQjN*l3hcLfS>=mD$JiLSzb3#K0j=U2$!SQ{14m=08l<(OH3Q0BY7@J`vph zG{UOuNzf^UU3iB&m|;c7eI^$y=e0+L(VB9-VhMoJn`X_YJ~2Nc@QfW3!eGuga6AE{9-|lnn!4?K{-bzc zVD>n?a=NzEPTqgx&TPD~=(S=sGN0BfOI2;cEafhMifxrs3^X2pX0wipzDvB%> c*SGp=N=VWAWY-%oc1SxbzwF=dy?<%{*?}b^^Z)<= literal 0 HcmV?d00001 diff --git a/boards/xtensa/yd_esp32/doc/index.rst b/boards/xtensa/yd_esp32/doc/index.rst new file mode 100644 index 00000000000..2696c2664b8 --- /dev/null +++ b/boards/xtensa/yd_esp32/doc/index.rst @@ -0,0 +1,310 @@ +.. _yd_esp32: + +YD-ESP32 +######## + +Overview +******** + +The YD-ESP32 development board is one of VCC-GND® Studio’s official boards. +This board is based on the ESP32-WROOM-32E module, with the ESP32 as the core. + +.. figure:: img/yd_esp32.png + :align: center + :alt: YD-ESP32 + + YD-ESP32 DevKit with ESP32-WROOM-32E Module + +ESP32 +===== + +ESP32 is a series of low cost, low power system on a chip microcontrollers +with integrated Wi-Fi & dual-mode Bluetooth. The ESP32 series employs a +Tensilica Xtensa LX6 microprocessor in both dual-core and single-core +variations. ESP32 is created and developed by Espressif Systems, a +Shanghai-based Chinese company, and is manufactured by TSMC using their 40nm +process. [1]_ + +The features include the following: + +- Dual core Xtensa microprocessor (LX6), running at 160 or 240MHz +- 520KB of SRAM +- 802.11b/g/n/e/i +- Bluetooth v4.2 BR/EDR and BLE +- Various peripherals: + + - 12-bit ADC with up to 18 channels + - 2x 8-bit DACs + - 10x touch sensors + - Temperature sensor + - 4x SPI + - 2x I2S + - 2x I2C + - 3x UART + - SD/SDIO/MMC host + - Slave (SDIO/SPI) + - Ethernet MAC + - CAN bus 2.0 + - IR (RX/TX) + - Motor PWM + - LED PWM with up to 16 channels + - Hall effect sensor + +- Cryptographic hardware acceleration (RNG, ECC, RSA, SHA-2, AES) +- 5uA deep sleep current + +Supported Features +================== + +Current Zephyr's YD-ESP32 board supports the following features: + ++------------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++============+============+=====================================+ ++------------+------------+-------------------------------------+ +| UART | on-chip | serial port | ++------------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++------------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++------------+------------+-------------------------------------+ +| USB-JTAG | on-chip | hardware interface | ++------------+------------+-------------------------------------+ +| SPI Master | on-chip | spi | ++------------+------------+-------------------------------------+ +| Timers | on-chip | counter | ++------------+------------+-------------------------------------+ +| Watchdog | on-chip | watchdog | ++------------+------------+-------------------------------------+ +| TRNG | on-chip | entropy | ++------------+------------+-------------------------------------+ +| LEDC | on-chip | pwm | ++------------+------------+-------------------------------------+ +| MCPWM | on-chip | pwm | ++------------+------------+-------------------------------------+ +| PCNT | on-chip | qdec | ++------------+------------+-------------------------------------+ +| SPI DMA | on-chip | spi | ++------------+------------+-------------------------------------+ +| TWAI | on-chip | can | ++------------+------------+-------------------------------------+ +| ADC | on-chip | adc | ++------------+------------+-------------------------------------+ +| DAC | on-chip | dac | ++------------+------------+-------------------------------------+ +| Wi-Fi | on-chip | | ++------------+------------+-------------------------------------+ +| Bluetooth | on-chip | | ++------------+------------+-------------------------------------+ + +System requirements +=================== + +Prerequisites +------------- + +Espressif HAL requires WiFi and Bluetooth binary blobs in order work. Run the command +below to retrieve those files. + +.. code-block:: console + + west blobs fetch hal_espressif + +.. note:: + + It is recommended running the command above after :file:`west update`. + +Building & Flashing +******************* + +ESP-IDF bootloader +================== + +The board is using the ESP-IDF bootloader as the default 2nd stage bootloader. +It is build as a subproject at each application build. No further attention +is expected from the user. + +MCUboot bootloader +================== + +User may choose to use MCUboot bootloader instead. In that case the bootloader +must be build (and flash) at least once. + +There are two options to be used when building an application: + +1. Sysbuild +2. Manual build + +.. note:: + + User can select the MCUboot bootloader by adding the following line + to the board default configuration file. + ``` + CONFIG_BOOTLOADER_MCUBOOT=y + ``` + +Sysbuild +======== + +The sysbuild makes possible to build and flash all necessary images needed to +bootstrap the board with the EPS32 SoC. + +To build the sample application using sysbuild use the command: + +.. zephyr-app-commands:: + :tool: west + :app: samples/hello_world + :board: yd_esp32 + :goals: build + :west-args: --sysbuild + :compact: + +By default, the ESP32 sysbuild creates bootloader (MCUboot) and application +images. But it can be configured to create other kind of images. + +Build directory structure created by sysbuild is different from traditional +Zephyr build. Output is structured by the domain subdirectories: + +.. code-block:: + + build/ + ├── hello_world + │   └── zephyr + │   ├── zephyr.elf + │   └── zephyr.bin + ├── mcuboot + │ └── zephyr + │ ├── zephyr.elf + │ └── zephyr.bin + └── domains.yaml + +.. note:: + + With ``--sysbuild`` option the bootloader will be re-build and re-flash + every time the pristine build is used. + +For more information about the system build please read the :ref:`sysbuild` documentation. + +Manual build +============ + +During the development cycle, it is intended to build & flash as quickly possible. +For that reason, images can be build one at a time using traditional build. + +The instructions following are relevant for both manual build and sysbuild. +The only difference is the structure of the build directory. + +.. note:: + + Remember that bootloader (MCUboot) needs to be flash at least once. + +Build and flash applications as usual (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: yd_esp32 + :goals: build + +The usual ``flash`` target will work with the ``yd_esp32`` board +configuration. Here is an example for the :ref:`hello_world` +application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: yd_esp32 + :goals: flash + +Open the serial monitor using the following command: + +.. code-block:: shell + + west espressif monitor + +After the board has automatically reset and booted, you should see the following +message in the monitor: + +.. code-block:: console + + ***** Booting Zephyr OS vx.x.x-xxx-gxxxxxxxxxxxx ***** + Hello World! yd_esp32 + +RGB LED +======= + +The board contains an addressable RGB LED (`XL-5050RGBC-WS2812B`_), driven by GPIO16. +Here is an example of how to test it using the :ref:`led_ws2812_sample` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/drivers/led_ws2812 + :board: yd_esp32 + :goals: flash + + +.. _`XL-5050RGBC-WS2812B`: http://www.xinglight.cn/index.php?c=show&id=947 + +Debugging +********* + +ESP32 support on OpenOCD is available upstream as of version 0.12.0. +Download and install OpenOCD from `OpenOCD`_. + +On the YD-ESP32 board, the JTAG pins are not run to a +standard connector (e.g. ARM 20-pin) and need to be manually connected +to the external programmer (e.g. a Flyswatter2): + ++------------+-----------+ +| ESP32 pin | JTAG pin | ++============+===========+ +| 3V3 | VTRef | ++------------+-----------+ +| EN | nTRST | ++------------+-----------+ +| IO14 | TMS | ++------------+-----------+ +| IO12 | TDI | ++------------+-----------+ +| GND | GND | ++------------+-----------+ +| IO13 | TCK | ++------------+-----------+ +| IO15 | TDO | ++------------+-----------+ + +Further documentation can be obtained from the SoC vendor in `JTAG debugging +for ESP32`_. + +Here is an example for building the :ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: yd_esp32 + :goals: build flash + +You can debug an application in the usual way. Here is an example for the :ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: yd_esp32 + :goals: debug + +Note on Debugging with GDB Stub +=============================== + +GDB stub is enabled on ESP32. + +* When adding breakpoints, please use hardware breakpoints with command + ``hbreak``. Command ``break`` uses software breakpoints which requires + modifying memory content to insert break/trap instructions. + This does not work as the code is on flash which cannot be randomly + accessed for modification. + +.. _`JTAG debugging for ESP32`: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/jtag-debugging/index.html +.. _`OpenOCD`: https://github.com/openocd-org/openocd + +References +********** + +.. [1] https://en.wikipedia.org/wiki/ESP32 +.. _ESP32 Technical Reference Manual: https://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf +.. _Hardware Reference: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/index.html diff --git a/boards/xtensa/yd_esp32/support/openocd.cfg b/boards/xtensa/yd_esp32/support/openocd.cfg new file mode 100644 index 00000000000..338e6e4e6ea --- /dev/null +++ b/boards/xtensa/yd_esp32/support/openocd.cfg @@ -0,0 +1,5 @@ +set ESP_RTOS none +set ESP32_ONLYCPU 1 + +source [find interface/ftdi/esp32_devkitj_v1.cfg] +source [find target/esp32.cfg] diff --git a/boards/xtensa/yd_esp32/yd_esp32-pinctrl.dtsi b/boards/xtensa/yd_esp32/yd_esp32-pinctrl.dtsi new file mode 100644 index 00000000000..f4f51cce98a --- /dev/null +++ b/boards/xtensa/yd_esp32/yd_esp32-pinctrl.dtsi @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +&pinctrl { + + uart0_default: uart0_default { + group1 { + pinmux = ; + output-high; + }; + group2 { + pinmux = ; + bias-pull-up; + }; + }; + + uart1_default: uart1_default { + group1 { + pinmux = ; + }; + group2 { + pinmux = ; + bias-pull-up; + }; + }; + + uart2_default: uart2_default { + group1 { + pinmux = ; + }; + group2 { + pinmux = ; + bias-pull-up; + }; + }; + + spim2_default: spim2_default { + group1 { + pinmux = , + , + ; + }; + group2 { + pinmux = ; + output-low; + }; + }; + + spim3_default: spim3_default { + group1 { + pinmux = , + , + ; + }; + group2 { + pinmux = ; + output-low; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , + ; + bias-pull-up; + drive-open-drain; + output-high; + }; + }; +}; diff --git a/boards/xtensa/yd_esp32/yd_esp32.dts b/boards/xtensa/yd_esp32/yd_esp32.dts new file mode 100644 index 00000000000..3995788beb2 --- /dev/null +++ b/boards/xtensa/yd_esp32/yd_esp32.dts @@ -0,0 +1,183 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ +/dts-v1/; + +#include +#include +#include "yd_esp32-pinctrl.dtsi" +#include + +/ { + model = "VCC-GND Studio YD-ESP32"; + compatible = "espressif,esp32"; + + aliases { + uart-0 = &uart0; + i2c-0 = &i2c0; + sw0 = &button0; + watchdog0 = &wdt0; + led-strip = &rgb_led; + }; + + buttons { + compatible = "gpio-keys"; + button0: button_0 { + gpios = <&gpio0 0 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "BOOT Button"; + zephyr,code = ; + }; + }; + + chosen { + zephyr,sram = &sram0; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,flash = &flash0; + }; +}; + +&pinctrl { + spim2_default: spim2_default { + group2 { + pinmux = ; + output-low; + }; + }; +}; + +&cpu0 { + clock-frequency = ; + cpu-power-states = <&light_sleep &deep_sleep>; +}; + +&cpu1 { + clock-frequency = ; +}; + +&uart0 { + status = "okay"; + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; +}; + +&uart1 { + current-speed = <115200>; + pinctrl-0 = <&uart1_default>; + pinctrl-names = "default"; +}; + +&uart2 { + current-speed = <115200>; + pinctrl-0 = <&uart2_default>; + pinctrl-names = "default"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + clock-frequency = ; + sda-gpios = <&gpio0 21 GPIO_OPEN_DRAIN>; + scl-gpios = <&gpio0 22 GPIO_OPEN_DRAIN>; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; +}; + +&spi2 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pinctrl-0 = <&spim2_default>; + pinctrl-names = "default"; + + rgb_led: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <6400000>; + + /* XL-5050RGBC-WS2812B */ + chain-length = <1>; + spi-one-frame = <0xfc>; /* 11111100: 0.937 us high and 0.313 us low */ + spi-zero-frame = <0xc0>; /* 11000000: 0.313 us high and 0.937 us low */ + color-mapping = ; + }; +}; + +&spi3 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + pinctrl-0 = <&spim3_default>; + pinctrl-names = "default"; +}; + +&timer0 { + status = "disabled"; +}; + +&timer1 { + status = "disabled"; +}; + +&timer2 { + status = "disabled"; +}; + +&timer3 { + status = "disabled"; +}; + +&trng0 { + status = "okay"; +}; + +&flash0 { + status = "okay"; + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserve 60kB for the bootloader */ + boot_partition: partition@1000 { + label = "mcuboot"; + reg = <0x00001000 0x0000F000>; + read-only; + }; + + /* Reserve 1024kB for the application in slot 0 */ + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 0x00100000>; + }; + + /* Reserve 1024kB for the application in slot 1 */ + slot1_partition: partition@110000 { + label = "image-1"; + reg = <0x00110000 0x00100000>; + }; + + /* Reserve 256kB for the scratch partition */ + scratch_partition: partition@210000 { + label = "image-scratch"; + reg = <0x00210000 0x00040000>; + }; + + storage_partition: partition@250000 { + label = "storage"; + reg = <0x00250000 0x00006000>; + }; + }; +}; diff --git a/boards/xtensa/yd_esp32/yd_esp32.yaml b/boards/xtensa/yd_esp32/yd_esp32.yaml new file mode 100644 index 00000000000..99f149df488 --- /dev/null +++ b/boards/xtensa/yd_esp32/yd_esp32.yaml @@ -0,0 +1,23 @@ +identifier: yd_esp32 +name: YD-ESP32 +type: mcu +arch: xtensa +toolchain: + - zephyr +supported: + - adc + - dac + - gpio + - i2c + - watchdog + - uart + - nvs + - pwm + - dac + - spi + - counter + - entropy +testing: + ignore_tags: + - net + - bluetooth diff --git a/boards/xtensa/yd_esp32/yd_esp32_defconfig b/boards/xtensa/yd_esp32/yd_esp32_defconfig new file mode 100644 index 00000000000..c90b1c17d15 --- /dev/null +++ b/boards/xtensa/yd_esp32/yd_esp32_defconfig @@ -0,0 +1,13 @@ +# Copyright (c) 2023 Julio Cesar +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_BOARD_YD_ESP32=y +CONFIG_SOC_SERIES_ESP32=y + +CONFIG_MAIN_STACK_SIZE=2048 + +CONFIG_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_CONSOLE=y + +CONFIG_GPIO=y diff --git a/samples/bluetooth/hci_uart/boards/yd_esp32.conf b/samples/bluetooth/hci_uart/boards/yd_esp32.conf new file mode 100644 index 00000000000..460f012e04b --- /dev/null +++ b/samples/bluetooth/hci_uart/boards/yd_esp32.conf @@ -0,0 +1,4 @@ +CONFIG_CONSOLE=y +CONFIG_STDOUT_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_BT_MAX_CONN=9 diff --git a/samples/bluetooth/hci_uart/boards/yd_esp32.overlay b/samples/bluetooth/hci_uart/boards/yd_esp32.overlay new file mode 100644 index 00000000000..c962a4ad4b4 --- /dev/null +++ b/samples/bluetooth/hci_uart/boards/yd_esp32.overlay @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + chosen { + zephyr,bt-c2h-uart = &uart1; + }; +}; + +&pinctrl { + + uart1_default: uart1_default { + group1 { + pinmux = , + , + ; + }; + group2 { + pinmux = ; + bias-pull-up; + }; + }; + +}; + +&uart1 { + status = "okay"; + current-speed = <921600>; + pinctrl-0 = <&uart1_default>; + pinctrl-names = "default"; +}; diff --git a/samples/boards/esp32/deep_sleep/boards/yd_esp32.conf b/samples/boards/esp32/deep_sleep/boards/yd_esp32.conf new file mode 100644 index 00000000000..a235720de86 --- /dev/null +++ b/samples/boards/esp32/deep_sleep/boards/yd_esp32.conf @@ -0,0 +1,2 @@ +# Enables GPIO2 and GPIO4 as wakeup sources +CONFIG_EXAMPLE_EXT1_WAKEUP=y diff --git a/samples/boards/esp32/flash_encryption/boards/yd_esp32.overlay b/samples/boards/esp32/flash_encryption/boards/yd_esp32.overlay new file mode 100644 index 00000000000..d189c08814c --- /dev/null +++ b/samples/boards/esp32/flash_encryption/boards/yd_esp32.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&flash0 { + write-block-size = <32>; +}; diff --git a/samples/boards/esp32/flash_encryption/sample.yaml b/samples/boards/esp32/flash_encryption/sample.yaml index a5080d25275..355daec1f5e 100644 --- a/samples/boards/esp32/flash_encryption/sample.yaml +++ b/samples/boards/esp32/flash_encryption/sample.yaml @@ -3,5 +3,7 @@ sample: name: flash_encryption tests: sample.board.esp32: - platform_allow: esp32_devkitc_wroom + platform_allow: + - esp32_devkitc_wroom + - yd_esp32 tags: esp32 diff --git a/samples/drivers/adc/boards/yd_esp32.overlay b/samples/drivers/adc/boards/yd_esp32.overlay new file mode 100644 index 00000000000..d43209179f7 --- /dev/null +++ b/samples/drivers/adc/boards/yd_esp32.overlay @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 Wolter HV + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + zephyr,user { + io-channels = + <&adc0 0>, + <&adc1 0>; + }; +}; + +&adc0 { + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; + + channel@0 { + reg = <0>; + zephyr,gain = "ADC_GAIN_1_4"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +}; + +&adc1 { + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; + + channel@0 { + reg = <0>; + zephyr,gain = "ADC_GAIN_1_4"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +}; diff --git a/samples/drivers/counter/alarm/boards/yd_esp32.overlay b/samples/drivers/counter/alarm/boards/yd_esp32.overlay new file mode 100644 index 00000000000..241947b0643 --- /dev/null +++ b/samples/drivers/counter/alarm/boards/yd_esp32.overlay @@ -0,0 +1,3 @@ +&timer0 { + status = "okay"; +}; diff --git a/samples/drivers/dac/boards/yd_esp32.overlay b/samples/drivers/dac/boards/yd_esp32.overlay new file mode 100644 index 00000000000..4bb2651bd68 --- /dev/null +++ b/samples/drivers/dac/boards/yd_esp32.overlay @@ -0,0 +1,17 @@ +/* + * Copyright 2022 Espressif (Shanghai) + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + zephyr,user { + dac = <&dac>; + dac-channel-id = <0>; + dac-resolution = <8>; + }; +}; + +&dac { + status = "okay"; +}; diff --git a/samples/drivers/ipm/ipm_esp32/boards/yd_esp32.overlay b/samples/drivers/ipm/ipm_esp32/boards/yd_esp32.overlay new file mode 100644 index 00000000000..80f7950333f --- /dev/null +++ b/samples/drivers/ipm/ipm_esp32/boards/yd_esp32.overlay @@ -0,0 +1,3 @@ +&ipm0 { + status = "okay"; +}; diff --git a/samples/net/wifi/boards/yd_esp32.conf b/samples/net/wifi/boards/yd_esp32.conf new file mode 100644 index 00000000000..5c37cfc402d --- /dev/null +++ b/samples/net/wifi/boards/yd_esp32.conf @@ -0,0 +1,12 @@ +CONFIG_WIFI=y +CONFIG_HEAP_MEM_POOL_SIZE=98304 + +CONFIG_NETWORKING=y +CONFIG_NET_L2_ETHERNET=y + +CONFIG_NET_IPV6=n +CONFIG_NET_IPV4=y +CONFIG_NET_DHCPV4=y +CONFIG_ESP32_WIFI_STA_AUTO_DHCPV4=y + +CONFIG_NET_LOG=y diff --git a/samples/net/wifi/boards/yd_esp32.overlay b/samples/net/wifi/boards/yd_esp32.overlay new file mode 100644 index 00000000000..ea9865cf5f8 --- /dev/null +++ b/samples/net/wifi/boards/yd_esp32.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2022 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&wifi { + status = "okay"; +}; diff --git a/samples/sensor/grow_r502a/boards/yd_esp32.overlay b/samples/sensor/grow_r502a/boards/yd_esp32.overlay new file mode 100644 index 00000000000..2fa0bb3197f --- /dev/null +++ b/samples/sensor/grow_r502a/boards/yd_esp32.overlay @@ -0,0 +1,28 @@ +&pinctrl { + uart2_default: uart2_default { + group1 { + pinmux = ; + }; + group2 { + pinmux = ; + bias-pull-up; + }; + }; +}; + +&uart2 { + status = "okay"; + current-speed = <57600>; + pinctrl-0 = <&uart2_default>; + pinctrl-names = "default"; + + fps { + #address-cells=<1>; + #size-cells=<0>; + grow_r502a@ffffffff { + compatible = "hzgrow,r502a"; + reg = <0xffffffff>; + int-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>; + }; + }; +}; diff --git a/samples/subsys/settings/boards/yd_esp32.conf b/samples/subsys/settings/boards/yd_esp32.conf new file mode 100644 index 00000000000..498fb072287 --- /dev/null +++ b/samples/subsys/settings/boards/yd_esp32.conf @@ -0,0 +1,4 @@ +CONFIG_HEAP_MEM_POOL_SIZE=256 +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_MPU_ALLOW_FLASH_WRITE=y diff --git a/tests/drivers/adc/adc_api/boards/yd_esp32.overlay b/tests/drivers/adc/adc_api/boards/yd_esp32.overlay new file mode 100644 index 00000000000..c288312aa3a --- /dev/null +++ b/tests/drivers/adc/adc_api/boards/yd_esp32.overlay @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022 Wolter HV + * Copyright (c) 2023 Benjamin Björnsson + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + zephyr,user { + /* adjust channel number according to pinmux in board.dts */ + io-channels = <&adc0 0>, <&adc0 1>; + }; +}; + +&adc0 { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + channel@0 { + reg = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; + + channel@1 { + reg = <1>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_INTERNAL"; + zephyr,acquisition-time = ; + zephyr,resolution = <12>; + }; +}; diff --git a/tests/drivers/counter/counter_basic_api/boards/yd_esp32.overlay b/tests/drivers/counter/counter_basic_api/boards/yd_esp32.overlay new file mode 100644 index 00000000000..241947b0643 --- /dev/null +++ b/tests/drivers/counter/counter_basic_api/boards/yd_esp32.overlay @@ -0,0 +1,3 @@ +&timer0 { + status = "okay"; +}; diff --git a/tests/drivers/dac/dac_api/boards/yd_esp32.overlay b/tests/drivers/dac/dac_api/boards/yd_esp32.overlay new file mode 100644 index 00000000000..c179baef745 --- /dev/null +++ b/tests/drivers/dac/dac_api/boards/yd_esp32.overlay @@ -0,0 +1,9 @@ +/* + * Copyright 2022 Espressif (Shanghai) + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&dac { + status = "okay"; +}; diff --git a/tests/drivers/dac/dac_api/src/test_dac.c b/tests/drivers/dac/dac_api/src/test_dac.c index 377de463c7e..491fc61a317 100644 --- a/tests/drivers/dac/dac_api/src/test_dac.c +++ b/tests/drivers/dac/dac_api/src/test_dac.c @@ -70,7 +70,8 @@ defined(CONFIG_BOARD_GD32E103V_EVAL) || \ defined(CONFIG_BOARD_GD32F450I_EVAL) || \ defined(CONFIG_BOARD_GD32F450Z_EVAL) || \ - defined(CONFIG_BOARD_GD32F470I_EVAL) + defined(CONFIG_BOARD_GD32F470I_EVAL) || \ + defined(CONFIG_BOARD_YD_ESP32) #define DAC_DEVICE_NODE DT_NODELABEL(dac) #define DAC_RESOLUTION 12 diff --git a/tests/drivers/gpio/gpio_basic_api/boards/yd_esp32.overlay b/tests/drivers/gpio/gpio_basic_api/boards/yd_esp32.overlay new file mode 100644 index 00000000000..a29c21b4265 --- /dev/null +++ b/tests/drivers/gpio/gpio_basic_api/boards/yd_esp32.overlay @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2019 Mohamed ElShahawi + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + resources { + compatible = "test-gpio-basic-api"; + out-gpios = <&gpio0 16 0>; + in-gpios = <&gpio0 17 0>; + }; +}; + + +/* + * Some notes about esp32 pins: + * GPIO pins 34-39 are not suitable for this test because: + * 1. input-only + * 2. No internal pull-up/pull-down circuitry. + * The pin names are: SENSOR_VP(GPIO36),SENSOR_CAPP(GPIO37), + * SENSOR_CAPN (GPIO38), SENSOR_VN (GPIO39), + * VDET_1 (GPIO34), VDET_2 (GPIO35). + */ diff --git a/tests/drivers/pwm/pwm_loopback/boards/yd_esp32.overlay b/tests/drivers/pwm/pwm_loopback/boards/yd_esp32.overlay new file mode 100644 index 00000000000..aa4cd2ff6d9 --- /dev/null +++ b/tests/drivers/pwm/pwm_loopback/boards/yd_esp32.overlay @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2021 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +/ { + pwm_loopback_0 { + compatible = "test-pwm-loopback"; + /* first index must be a 32-Bit timer */ + pwms = <&mcpwm0 0 0 PWM_POLARITY_NORMAL>, + <&mcpwm0 6 0 PWM_POLARITY_NORMAL>; + }; +}; + +&pinctrl { + mcpwm0_default: mcpwm0_default { + group1 { + pinmux = ; + output-enable; + }; + group2 { + pinmux = ; + }; + }; +}; + +&mcpwm0 { + pinctrl-0 = <&mcpwm0_default>; + pinctrl-names = "default"; + prescale = <255>; + prescale-timer0 = <103>; + status = "okay"; +}; diff --git a/tests/drivers/spi/spi_loopback/boards/yd_esp32.conf b/tests/drivers/spi/spi_loopback/boards/yd_esp32.conf new file mode 100644 index 00000000000..fb0909611c8 --- /dev/null +++ b/tests/drivers/spi/spi_loopback/boards/yd_esp32.conf @@ -0,0 +1 @@ +CONFIG_SPI_ESP32_INTERRUPT=y diff --git a/tests/drivers/spi/spi_loopback/boards/yd_esp32.overlay b/tests/drivers/spi/spi_loopback/boards/yd_esp32.overlay new file mode 100644 index 00000000000..b2af8bbf3cb --- /dev/null +++ b/tests/drivers/spi/spi_loopback/boards/yd_esp32.overlay @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022 Kumar Gala + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&pinctrl { + spim3_loopback: spim3_loopback { + group1 { + pinmux = ; + output-enable; /* Enable internal loopback */ + }; + group2 { + pinmux = ; + input-enable; /* Enable internal loopback */ + }; + group3 { + pinmux = , + ; + }; + }; +}; + +&spi3 { + slow@0 { + compatible = "test-spi-loopback-slow"; + reg = <0>; + spi-max-frequency = <500000>; + }; + fast@0 { + compatible = "test-spi-loopback-fast"; + reg = <0>; + spi-max-frequency = <16000000>; + }; +}; + +&spi3 { + dma-enabled; + pinctrl-0 = <&spim3_default>; + +}; diff --git a/tests/subsys/debug/coredump_backends/boards/yd_esp32.overlay b/tests/subsys/debug/coredump_backends/boards/yd_esp32.overlay new file mode 100644 index 00000000000..eb707ee7221 --- /dev/null +++ b/tests/subsys/debug/coredump_backends/boards/yd_esp32.overlay @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023 Espressif Systems (Shanghai) Co., Ltd. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +&flash0 { + partitions { + /* + * Reduce storage_partition to make space for + * coredump_partition + */ + + storage_partition: partition@250000 { + label = "storage"; + reg = <0x00250000 0x00005000>; + }; + + coredump_partition: partition@255000 { + label = "coredump-partition"; + reg = <0x255000 DT_SIZE_K(4)>; + }; + + }; +};