From 60ecc7e56b9d92dc4bdd9517707c49ba5b4e1ff6 Mon Sep 17 00:00:00 2001 From: Liz Date: Fri, 1 Nov 2024 16:54:41 -0400 Subject: [PATCH] code & files for nfc movie player Adding code, image and files for raspberry pi nfc movie player --- Raspberry_Pi_NFC_Movie_Player/add_movie.py | 52 ++++++++ Raspberry_Pi_NFC_Movie_Player/blinka.png | Bin 0 -> 55388 bytes Raspberry_Pi_NFC_Movie_Player/movies.csv | 1 + .../nfc_movie_player.py | 125 ++++++++++++++++++ .../nfcmedia_systemd.txt | 13 ++ 5 files changed, 191 insertions(+) create mode 100644 Raspberry_Pi_NFC_Movie_Player/add_movie.py create mode 100644 Raspberry_Pi_NFC_Movie_Player/blinka.png create mode 100644 Raspberry_Pi_NFC_Movie_Player/movies.csv create mode 100644 Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py create mode 100644 Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt diff --git a/Raspberry_Pi_NFC_Movie_Player/add_movie.py b/Raspberry_Pi_NFC_Movie_Player/add_movie.py new file mode 100644 index 000000000..ea643c6a2 --- /dev/null +++ b/Raspberry_Pi_NFC_Movie_Player/add_movie.py @@ -0,0 +1,52 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import csv +import os +import sys +import board +import busio +from digitalio import DigitalInOut +from adafruit_pn532.spi import PN532_SPI + +spi = busio.SPI(board.SCK, board.MOSI, board.MISO) +cs_pin = DigitalInOut(board.D24) +pn532 = PN532_SPI(spi, cs_pin, debug=False) + +csv_file = "movies.csv" +if not os.path.isfile(csv_file): + with open(csv_file, mode='w', newline='') as file: + writer = csv.writer(file) + writer.writerow(['uid', 'movie']) + +def is_duplicate(uid, mov): + with open(csv_file, mode='r') as f: + reader = csv.DictReader(f) + for row in reader: + if row['uid'] == uid or row['movie'] == mov: + return True + return False + +ic, ver, rev, support = pn532.firmware_version +print("Found PN532 with firmware version: {0}.{1}".format(ver, rev)) + +# Configure PN532 to communicate with MiFare cards +pn532.SAM_configuration() + +print("Waiting for new RFID/NFC card...") + +while True: + the_uid = pn532.read_passive_target(timeout=0.05) + if the_uid is not None: + uid_str = f"{[hex(i) for i in the_uid]}" + movie = input("Enter the name of the new movie: ") + movie = f"{movie}" + if is_duplicate(uid_str, movie): + print("UID {uid_str} or movie {movie} already exists, skipping.") + else: + with open(csv_file, mode='a', newline='') as file: + writer = csv.writer(file) + writer.writerow([uid_str, movie]) + print(f"Added UID {uid_str} with movie title {movie} to movies.csv") + sys.exit() diff --git a/Raspberry_Pi_NFC_Movie_Player/blinka.png b/Raspberry_Pi_NFC_Movie_Player/blinka.png new file mode 100644 index 0000000000000000000000000000000000000000..d81c761458a0b4b10849feb0ef583813a0f6d402 GIT binary patch literal 55388 zcmbTd1yEc~*C2dxcN>C}0Kwhe65M65Fu1$>-~>&Adw>Mj;O>wREVyg1;O?-K=X>9` zcDKI$xBjK-7I$V&pFVx8`$)f6Q+bPp{sJ8U04#Yq84Un{V}U&)sK~Hye9K~wVE@pZ z<@DSD0E6J~0|#VefdByU#6}D34pvqYGIMfZGck8EwP5phaE3txfQY!avx%9Vg*&yW zg_Vt?DD81;CoQ#&xhSnJuQG?Sv$Tb^jhwHmg{H5HmYJ`enV>nXxEQsFw-5}0gN3^Z zwYP)4qnnVoDD6LZg<$W0zhVN&w!lrXIw-nNldGoKyV4p;3t=-+7 zh1l7>yu8@FxY?Xst=KsQ1qInTxY)V4SYZ&XZa$9gCf=-$ZZH3hLB_((%+dU>sxjHgRU>WaId|rhfp<&He-D?BQzv&*bK2 z>=yPG4i=8?ZZKHR|G+w1JGnc#Sv&n7Q2*!W|78LgZ}W+x{U1IGNjup)xxyxf zQOErc70Sv&@{VrqCXQwn@-m{dutl@k*q94(Sy)Sp8c;S{?|g-|MxZi^V|Pqwf_c(xq`p1|8YXF5C3sv7LG9AnC83I4;yZ$WDV_fdYu2u89F-N+)(&B^q0Z zJH9{=;@Zn^DTQYZI9(3F6TZYx^UhyP+NHxPhCuF{y4XzHk3tg;7|;Yb>&&*scV88f z=R*+IsBmwy;$`J90VHbjwqI+jVo=D5827<*!Ts4qXl99FFS z!0VV;>9zB%NlCGrE-K1KgX4?j7fFEQhM}tqgkS|vPM)R6!7=fMhNt7l-LeqXMU4NP z>f@GY0QEEZWzv1R> zz(%0!v}fld&e}2XFey-^{S_Tr3K@AtjBtaMe^b(nS6MDTXm8z|#agPz080Cg+>Tm@ zgWU5wARBS?6*->tu!1xfhF<4e4?<6f(-CR?*W*CK-tusghBjZI4X(>5k>?i^gMfB- z2B{(1+U(mVW7cxLqR~t@USoZ~7EGo0R_&A^E{Oe~PAT~A4QzZJR{M30nPW6BY!Q{Q ztL4F~tsIM}5Y2=>9AF9h{aEMgkh&&O`QA=D(BYeQUp(r7#rDn_L5Dw!LHh80>?*Id z;z(FkyaZr>ls{k-68!7lZR}4`OOR@&-?15R@KQt&VT}lQ5+UNQa5d#17`;nOH^2>N ziIw%XJ&&3Gim__n%*E#S69p2BZ066j<28kgC$K3e9OrBi;%SwGO?lLWwTMDV1pLO! zxeElIxnw8HxqgTF;#I_xtC9?}UAi$7;`_m_sXCSrrY?J zo4dl8t)2`0dWQSDD-U_dMZYT@R1@yOI=V>Tf>@oX{D%bvR2AMEwF?_aMY!qYq_ooE z&DuAv{ZpV*9FTt5N@Mv0|0Em|+x-}k2TJvkbNwO}S3gLtXxFkx*+w!own=OBc(nhcShKn7$Xe>*ON)L$veez_5 zX@x0QcvG^JQXy`lyZ{#*GO=uDFT}PDUR^7IaahVVCU@mb;~i$L1#} za(7?pFqh?yubHO{I}`)QjS8lDJME5JtUAT*F7Ky5Bnq2MQ=3e8=~^V7wz^x{G>+c3 z>lBL?C>7H+Hqja8RNHDP`r}n4jC|xwH?>H%3Wq?3{4F9d$=CBa#d439pQVp;0#+M2 zuGltKX@_LXHMVeJYVKc&aMD|IWF5_ZvQl?c+k>ko*twI|7cBwcO{lyy<&wQWH<-#f zn5+{%ClrcqP2++)@%Q+Zm#u&;;X<#Z=?_Odn-$$(UsNr-cPT}hi*vIK(2EZ+e?z3x z$B)@tc@#f6n!gSpGc&lK1#b4fs1y#B=QDv5W5QpDJklk5y()ikJW!vzDc?Fnc_Q>S zipUB+;=%;SR<0M%WomH2+W2UGE$?cv+F^}GMFxNHDjOfDFSg7UEIUlLw|JcA+POY6 zP0POEK!=y)!cacFy=WC(WfPwZEQ|Yu04vw}uXjIL!Ztw7LdiD9~dStfaink%)-qUW*jL~HFuFBw6U5ue-_=xS8 zOhl6Yn1|E+L-mBSxzywFwrc5BkEd5`WB{r9fqrsgRw+bTWCx)MLBcooK17!#pi!t| z>zlWg%PgpaHbSToN!<6yjZT$lURdQZI{UO$hH)4Ucwy?svF3p!K6hrLiOR(W*xK7; zcHB)@ZD2Whhf4fL5n4D-0(M)ES`?rAjUSK}>+NP~Vq$`kX3OtTS<6Iw_ZSazFA(jd zU(`EdM0ZP^WLt@;SR{K5c+bVaEs2&8lyGg9MDQxHh>s{N!IbT>&;gFAL9{yBBZas0BT`CGYbBAb3cN6hUWuc11K^1HZhbMQFy zwcpxGO@i8%`RA5bB4Y0l)^g!kgq9FMo85N0{@=@O1;!59j)DdA!Eitx4d2*O$NB1m zvS?5&9Dp#H;@l(Q#|AvcIr+czUR+$^``wwL=Gc1Ju%WGMF^Qb$?wU&OVg-kehE4>50wk3}?#{Qfh_8LKy>&gn^=PQnc z0-?r{PLso;`G+anqSm_W;t*~$=x<_0aJ{eQnCOdNI^wfmUIFK)2|-KGYbfHo8z;#) z@iEEFy82jHSltv}OEf^W|M-{#DUQxeF6((Wkf{_zj38|d|EfahV*}YmZ9ow6n+{bB z_10S9f05AbYod>| z)Mun?oQ63&=|DO|-@UIZjh&B&y|NLyTvOln!9)?+Zli(+KNxZ^8XcEy;npa^DSYJ* zOXzK;e{@5qpxjMR93gvHM;)r19qjTZ5{^WgSD>+Sgr^7y<{x|a< z;Ke5Za_3L+)I2HeC;!vmx<^Vb3-F!&!?UolAqOuU9UqVFbbGed24-0Rh6UX!(b`znT44GbfVqeBq#OM$qk zz7jl%^R?#$-7b&z#lq2?a|Qib?~fy-Bu4$q)DT0wO-#%oL~4LIffKk0z7FbQ(fel3 z^6S^Nr|+N6#_d~#Wy-}woN%tSi0`uU`w2O-yHsUhI0*xT%=1yNj>+eppeHN%uH1b; zsDpI}OSQ!kcD>i|@g5iw`;zLSfU%)VtbOb2N-sqx7pR%%0Yiqu`%3kXOzE(IiWWu; zTob0c!f-#30#}^5HcJio2Kv@7jQf+O%;s7w(hhLHV~{$eY9um^0l^zxb)HVGasd9< zN6WUq@?~F^m%UTHKkn#E4Qwlea7qj-g5~sn>9%l_Y*fw6ct5+V^rkJ_^K?5S55zlT zAI#Sd8nk(zs=aD&v7Pt3g!$pDVaVvZxfFGu#fxAzl-0m(;xny04fnDizZhs3GQvHC z@^b>&``5GA2NB>t7v4NTWS8~qO-6jh*z1Q(W8asr#+A=v4cvsWq#J(h>VD7xa8r$4 z()H@Be>odti%wJBR5jHmQhkpcEfpgBgon9_d-~!egYeS`2MJrhNoLMUO(!A1Q3b|L zpmM~HA!hwFYv>kt_d_)h9>_1K)~v8u5=ejS!|v`<(-7ntBmtMb7`@CrXem4MsFKyL zRuNJm?9PaMUG{u{CdLN$`9;xu9X)YvbIBGDe{(c%-}d*WWMbGRNLsb8)>`rY;tV(7m(b8=t4!o&DU0-wepWYVK-}f{6+S{a1QkljBQg z4j_lAh8K&ZnxXYb14QcPi4G;9i4H1r{p3uGI-?B)a*pm`%PN!U(x)*evY1Sl7S8!k z3B+;P%)YdlhB>j+ui0;~ahc0#MYLsThRGK$Gh-_PM+NR&DafJCyFD@3dh+RAH%?8h znJ%LT{Vv#aEPW}B8c*wkA)`)D6zn383~8>Cz=!Mli+kPN+p**)Dqwusf`WGZlqj{$@2Il*LnlP0 z{FTm!E%tLV$ENPpY7=Suo15ds_LJ3|5k2PZz7v^7tDuwacgM^-yzzAQ0-LeiX%>2f z5j4@=(3&O(*zv65$yHcHI}CP6ZI+t)vNrU^P(8?V?%iA^r|bKBCYg$f(yUj*mPPmQ zG9I7s&6eJVC}!m9n-Lez!eW(e`Bq|H6>hq6{n2ztmJ2Q^E^6K>t~Hema>f*%ow_no z7FwS<)5B1~@rh0r*Wk+C6eZw%ba>I0`p{y;qM-286x!+?ymvFO^B7+hbl{A10?|vk zJBbu8cWhcm-p0B(Iet7y?e@}Xmz^8ISbEb*r6>CxnegehwAoj=f|tph7B$4VI|Qk) ztn4S;XBbU)Fnv#rJN0Sn&JGRJwu6Hf#hhrtEfh;@t1(2UDbbKz+^sG?puHy0Vly5? zIq3@PfFzUtv~Q?>qBM(2W;L~x{%K*U-1}yR(3l#r5nL?#nt*!T;`ak3q$fy&03(>X z32{xWgdsctDzPA)$Jdc9N%$!q-<=cv+%mUTmMpQlcm{Sd8~QY~ z_xUmf-&;%(8oy3-6eUnPQ}cUW1}~*KzkV=x>W+7LME)zqu=IMTL2Jc`s5~)ho(UWm zb$0VcZKt8sPA4#IM42rWA&>;QO(m9n&d-;ItGdaIZd@j!4w+gZZ0#tX%jv!R2X}~n zMQi7??ArIkwMYo4!SJB-F|+)LZWg74n=KB>=w5x_`ARN<9hZ(IL4ZMEr@XmYk4nH< z0;^ROz-|BfxXXHol3(m=w9luRJ!!e{>1Rm8Zw>XGIu3)r->1=zfCLf*-G{lf=-Pd#lQiEpM##_byje~(c2=VK}t-ea>wV-sPOSc zRr}QfJalN#1<)DTPid`H)q};FC6|*G&vL8F4_;4&IeuqZXskDsy6N4+Iv94h#ld&A@pRPF) zp%DZdYDHn;jsH(PH1$oM5Q&iC(?h1amN214ZSYbadW-{UK7F}C!ah>zFuG+K zgjWmum3aoO)$KuDG1I9w+WDW<#66TdPceqMp7SIcIb^7wgwJ52So}*LBdhx~HuLT< zL;`$A2Lz1GUyimVTIf!#hkPP8YoP~Mi%vy{i;ZqFibLzc#mG=w6_)&lK75$S{s@*3 zS;vkgx}8z%J`u z+sEIYWhcS(c;F9e5;eT5JO^1p5CKGIhQM;7H*dSLKudJ2u?7-0x_pEQOOl-d_NlkG zy`85)C;P2mc6^ezQtE#UW)5zAdxIZ)p#_)2luy3>wqpj- zpDu$?Lr1jCBeOTKs$jyYakt6%^H4dY0bQriwM!GpQH~p#uToS(8rg+8JWQLcgz6<> zDCQ88xU!-Wyjd)JFX>s%>hq7`AdED##n@noKXt=dY=KJy74gUNX@t&Z(c$H1X5s5` zC#CV`!MlZXY=3x(PmAkIQ|LSc+o!%>@j03Lqqf<^M?+yia59QCse%b{Vn8-ES9RFS zjLn#v%3;l9lEU!ByA5qi%v$YgA!Zcxb$~D&aR9UnMr8if7%@lw=X_y0ak(?HDw@Ud ztBptRZE?a#&E3z#Nosve!A=sA3h!k9?WgCRMTODUk&SYzaWa8G!O!ela&gDQ&Y7A%Xi3Az8EDiv>u;1EuL0k z_VyqiiQk;B@iL439#gDvMsBN=Kc3Wm&jt5lfBXGL1JYTu@uSo2w`(KwCx?UqsdP#E zAL#0SKlVd97CT(ZBk2HS1@-o2C5OG_!T}qYNbzmuS+-r$O;emHlxfbj@B}-(24pJm zZ2HV605uTls0$14&(dL2%d*b5@N*cD(Q3{Gf#VEkkH=;ak_(EpR|DLhJ;+4mOJC;RHNnWTyV{uN}!oCzoU27U#b1d5<~Hv7Y039%D6h zTw?B;UWKPb=Dpm|qO#kpSBc3<)t6U34bK;wiTI*z#W}EEHUatKi;BQacYFwz2iNbu zKKTB;+dPH_^p+{vqg0z_6lzK_XtNuoLu4XuTM$)KKaYU(bh!!M_Nimm-rbJ{e)2b>>=4>T;-KpKtwUVS zbvQgjM*}<{7a-Yj&DiHR`a|(ZN4om7*b_iz-&6c*AeYUC;!jG;IaJF+xNRFu%{v{> z1S?)g7&Q(t3jGG&8iM6w?GhvMY;WEC^OWX1lIs4j=nlwQ`zQ6n4>2W}rln8Zs=iVm z`ZOM5fcz5ar>vHFH4~UYpjNLs5PnS&)XKhElZF*}cS3RWl%^EIDYj*bB%>%b`pUQ0 zNOCviI`G^t<+<#6nD=PcjVyZDR)Hmc#3&F$vFXw|&5R)GwlsF!`*j$?ca-+D<%o-O zTvAj^`5573V;Ou2QRvVzl!*ZZn`!~>0Z=cike=(o8cRPfg~$6b?tLL8uJg8!ans{l zk>8PusXYd(pj&IFv;?^Xd1YPb&gJxlylpq(JbYudnX>9KY z$$@<-w%yI(D{sEtExk^wlc!Sf2q;QmprMeyk%j`Upf%V}2dv7DfZ1(3F0*&BrKahF+448#mWdQap~{shiZ z%HtNz2m8fTt)WW(ddL0GUwOGTl;czLQm*2oq|+rPYv|NRg+Ky4j072<&xSPr*^XcV z4LtOiCi-V-n8RMHaiHDgTcy$CUll*-aECKIh^L&bPdZ-|p~bq`lX(lg4i|KAxkof^ zmvGb5zsG$k@=4!v)vJrn+08`9?-MehcJO7E}DW772Wy@X)Sr-Ln6ZtMjW zQE*q+hXyiOlA*d}C*iInM;wv$y=B+v%8LsS;PjB~3YP&68KQt?J&S(Z56c za!5bd(+|sI@Zr=yYczAkyDhx47?Ecs5$wcKkD3_v#~}#rcOdK?2D6S7iZQnj)j89m z69Y?8yQTN*oJVHa{YGa+i%&m>Wso+nFX}BePG7nf-m3H_it^U)(KFv&|aCp z;7kw6@3KD(N_(ol7EZ!J9!{@d-ys?4)WL_w&hmonJU60=a0QnGj9$De^oa`IOH)lQ z*^wb)0d7#CgTTWs$MyNugXh!vgLvj0I8zU1iYe3C?^AAQEn`3l_z~x*aY4oFf6RM9 zk^K&^csa!xZ`6|Q8@3@!1sBh9fx^CV2-_ z!q*|cLSHuR!bk$WYG7>;I6^q#26o7|Iompyf>E$nqG3-dtc;{-V9LnbPqN$an=7Tx zHk{RTO{wcc2p0_xqjf=EEDnOGmfBM>eP0)Vj7o3fg7RsxT4u^waEg+sm&M^QD5^!l zZ?1AUahLJX3@Dy)C?sL`PXsSIj+Kl(2&kg!ne zzsSK@(+8g8Vezzc)MGO%=zwjQB3&YTQNgA)*!F;ak}x-+N&BV!`lpv0^cMUa22CNs z1UvYc5Ou29ovj!+z-(=e!(1*AUSe1i36?rl$3AacwbO;kPh|i4Eaxonrc_`G(le}D zRd~K_7-vym^pZ#H`1KJ0O&lnF5fTh5y&YW(4cf*{@lv>za$RO&hVb?!z&*fsMdIEz zXt1AnAC=JxVF>?vpN;t|;r9pZ`M(Ld675qvC^(&A@UYzk#5d!03OByB|upr zY=Oa;gmIkm=bfl!*Z%L&?sE9C$h7J-rM=|K9f)?X4_L$R1y0T(#kN>R^ixTqQ91PcPO9$X z>#_$h)j;uRskVxe3hd}JDqZz$%y;+L^!Ra2=Xn%I#6gIy&6o<@G3h=kYR$F#g{4J_ z(w97rbelRNTrMBUW$I-`eYOVe%4?bYkqde|@4wX*x6EdmIE^$(D;;;Z7D3lOU;I23d z-sknpun0JW$bLlk50T?E6T@`6eI5nnR*YpT7N(p@2Wi8C@j|#>#l7pagY`DKob5 z6*{?-^jPZ0Qd>6_lrgEjMKFuK8@i9o=)ksGbssJox^Tuv zONrsG#@pF6EbsMgBiA)$n*gBXPhps%u9dP!kB~k91Dz(x!+$hhqjnv&U}(6X6g-xoEZ? zo@#n-ua$a}N|gvS>A^b?#s#&6iB}BM1gOZ!Bi3&yY&lWfoGC~9g~}zlRl2`7W+C9B zfPJvi9uVX>x}a&uN++Be@5eCGdsG(U1HJ=Y+CUCaP5v@SU?S=6caCV|L{59Bn!|g# zCs=h+XJ-^ozAUA`;)V7mkLzNzUKZNRG)P1g9ww#@;zDTQ4uXbi(iuMik`;U&Tc(tN zCGuzvV~$F)jkyBiz5+{k)v2V+QDliV#oMTbDXjW3W(02ly^#jWpGG^}1p$uqC0R}} z-TZq9AK}2 zuwDJL){7dy;u*R62~@;y=t3_2A{+vQLnJOzt`^5GMRB*Tffn8xFng(BKTC-yR>ga| zo@BI-r+#Z?6BrE~!kpCLCCSm_WKckdjvJ~f7rl1%cD0Z{q7(4Y4z!V)lgeg@AjYI4Q93>)2BHqGfg;@LChykf^Y5X(lvbF(}F;f`>aruHZYFDX?dCJ})gZ8o>ORb82L~kN_mbkG9O1a{cN+Io&Etr)C zGO0fB{>Vi97JZN=u^8{$Ee!?$S73AXjN&-hx@G_fJHex+-v^$Nkk%Oiew?RgWFQr2 z0zQ7IhmWG#NfHEBj22!7b$TWER6mk*#}K!@%Uy7PzqN-ycH7Qi&sDcZtY9*Fk#rS* ziJY5xhNhjaL$6$I4{i$1MJQ(LvjT6TyulQ^UL}NI3sv#38178qeXE-Mt7}587UZfW zmeDKD>3x5;)=2}>@LdW3R%l~kcjqE7MX`0^!#Uj4xpI4am!9Jns>|kw;}knm zdq0GNLQr58O(e`IXITKkrv9sq)5UCPFm4|nbc~9Ti7P$w3VGa{xA!$s10f&ae>nnJ z5KN`AMcgpmU!Y`M5Gcd@WhKrNg7}20(o7v9v>wo*DU}aGgVs6|(ryohc^#G})HeUv zQc<;8MQapMn#Y<;T|9U+-zPzOGt>PCsTz0s>^lQdqNT}l)TKl-kUGTu-3!SX9^R&% zjj%0Pv(CUe@!Xg%p||=MF>x^PE+I7z>2(DfO2m-@5F8W$%xqwaZn6=w++7zY(`-b>gE6+NyDrvU93{ zK%C|qhq@@=5G6tggm=k2BZI)o7IJEoB+=8(CcT*p$h`)Dzw3!7O+I{>-Jo~YW39vU zL8s5-PN;s-{OHXxLzp!u2S}r^sBWxhH*U3JlCy|u^5+-SnKw0vT-&By?pQc2S#TUs zbp^L}br3f6Gx)~L?Dnlzo>&q`?qD^WeSd-Ng2wC_5qo2T2fnDt7EJdKm6{;)9|T5nQO4M%Mn0<{<4Rywo1N9ix>;L;Up0P74j|!& zHxpcXt1+-YuXiJGPe0`D?UG5GBb`Kh!SW_TDJpW&2_tnndrz2a9r3Q%lh=xcGrgzb z>8+CWgTnJPvDV8aRRwy(>UTETA(x|4?ir3zq*g|GDG2QJxLu$$_Q37PYz{+NTTjGS zR|P~Bb5R~mc9vhN4v|iD0CA958phr4nGTd`SUpY3>9%XQ);R%gK;Saznln~Rl`1X% zRx3U5FZSasq&{*vR;#6ia42(ZJ`XA`1U2l=VV+KAVESW#17eRMwqa$;CR@-ORAS%( zSG{PTIU?>yd-KSj*coO*l+@b#q&NuvSB^5A--EGO?M|gTniiHEc_Gt7cFw_i(HeOq zG*dE^cQ-UpMHf*5a%yeLQRCZvW2i9tlRuQuGU0?xYu^!f@ zwquP`DjdeZO27nm`a}lzRU$%l(e;Bw7iy6}Fee=H6~6%C&t8bj9dA>h2&5=Hy&i!PKi<+WV$0B zNC^v-r5J~Q*<(>s#CD>$DzpwN#QQr7ZEL|8OcQb$JZEuZe}?>9nLmo`#HO}Vs_!-0 zJ0Yat_kW~0EQ9;`0^Xfsr>bjdX??gfjZ(7i(i9O%(zilJo^_mm%9NaxBI8S7-p zNjqa03A8ezjG|1dOS8U^r$Pd#JxM!~{K=wQFa(*DtH4-NUrf*dMv0$iJ`>ecjJOh? zKnR+I4}K{`o>K9vCmh4QFIwTwd-TaU($O;ST{!;uB`tj;1?4)J%EC6p!lR9Mp}&ys zDN*Q~W8{-bN1BlAnk;xV`*>I;FKTIR4ozYS>sE*x;M16C@Z+fZ$ss>)xM@!55^~cBV%#YNt!a?uP{i9njsl zo@H}ulmkcj>;W;}dqwc;(uPIbALBhhlp&<|#s}05i)iF?>o-nZb-~mTZZ)D439omqVV!wq*$ zWIcs|=cvan^lWLNHop2^Iz?4}>jHXgQ>wTwVD_TF$ZT%W{_#ck9C> zvDb%7zp0L;?V63M(x)<}O}Ca+BC*KxTH`LN$>XLpd>CAm{Nof7&9e z?-v_;*w$_B?lE@$f-7y?V>}~y5KhI@YzP({PXQ}n)d=PjS{9j!ZPL?g&gCvDA-uEN z@{y0CT`J4^9qX5R0^bZGhGwBzs?l-;Bj&Me#P}14GxLZR4Pg5D7HY?(LEdQy{*B@& z@KRw-YeL)HY^aED`^NQ_960XU{PDZ$l6@<<+(3!gNi z1LTnqxURQ98#ge%Qst`*QxI09f8!CcX=-qVNcv(;4{j?Mk5RVMtNrdA6938Bl06%! zg>j`#`n$;u&57|5o;o6dz7k~?rAR#Y#ai@eZ6$6QuOBOlOU0$dfZQz8RP9`wP_EY! zCU@TX_-%Ea-En)knf@wgiV>+JKVUkHpfPGDKR|STb{{Sq8a9_w)CkP?C$pzN`FP_2 z6^r7!Whno;)!iG{-AN*G-0O4J-VD`F=gj)jS5!P3@H?E%P; zkV9aLzp$a@dco;F$7h_+O0{q6T)(ehdOy0WZYlsf+OgsLneSviq2cv>p4kf{Rk*_rj^1+*+A!TG3V|(Z~eH*WR)6fWI4SIb+u6H?)h-GVjSH@8T(G z`^YeNj+3W3M=NR=!uWdxvmiBe>~jlwxhtqpr1U)Htm4M})UQ}Pi9H()C z^jPVdN5`ZNvR8k(6KdeH57pYfquhL+7PDX=oX_SQ5Zb_umhRa9JYbsep!AhR>7~Zp z>xguS?zVjBugV7De|$X3B!0wG`dQU!_(p;n!**A8cYZy^;_1~dQjW=PGA0yLuCJ*x zxs0CQSSk-`p5rKnMi*nR4KT9+Nr|fd59r_9U)zCohO-WOzGz3n&SW0CF4y4h{AcdJ zjIm2=XiJ}mWyWGN@sv7``LWj6nFp)`Hs2VProS9J7)f1Ss5I|3&HoN3c3}1!F$~{6 z;A1iG=dN5lJq^Sk4hu8Ss2sk6-X!^SCdo`@TopwpN)2^l?^QQC($ypO9Do-QIC3Y| zKBN7nDmBGVe?D&nL$z_ug3<-MtGiy-j581pe6uP9#k79EZC`(SaD(+chc>FhLh)hB z!pDsJwy(TS1B7sG2wrR4H^c6#W>JmW*uzdjkr|1Kr+1>F^k3I5u-Fg=rMRgJ(cA*g zLT%zh7;rT_5nz4iJbIn28e#!}cuu^JcDkt29^3l*jneHb1ahObfdy$X(+^b?9_P%~ z1~K^%L8pn#N}CU9&(9naa#Of<5`NOWo8#E3M|W*G)J2AJ7G7`jbH|EZ2jYAV_+zDQ z!N++>JcA1}o_O}8z}N+whPstFuL7Ka$+HDBwY}C5qsA<@dYw%o6kqQj8xOC==^}nL z`)aBv75>s(DDuRNo$qS4HPZHxw2XzosW)$_5_iT3aiYi*XPzzfR&A8s2nLFMt@1%+ zgLC%jPkXoMYI9O3_IA$1dh0hv(Q5TBjuGx_)t!(J5>W;=u)4w=;sO~nQPB&Qzl9k* z#h!KlLVsaIkl06WQ8_Oaz2>dK6VTI(Akn=lH_SGlDY--VM`9P^ii4w10es@+tF{8M zKrZKuL(QBz3k3t#D5BJ6ndrPSc>#NpI9wrnLEF%Q$s0YewEwpU<|T~>swt(sua_ym zcuxxx>wy(5&No)m_L!>^u#UG|5fKG9dEi8_m|Egfp=!-19aik$Ihyxw1_K$lv7B~g z!}gY6VEY%zkkM@n`>2X%Vn! zTR{FUw+k23onD9qrbW=DuVH9J15x{_LT5-A z@&wuG+BDN{zrA!HE*Uy7AGob%x-}Op{dE8S<`Pnfaf^1~*F>@CLg1M3!AzMt2#%W9 zw9jLRs!vdYX7e|a_=achHaXTUtvyA?p<71p7c&!M6KGatIbl5`XtcY~-9}Ds{&H@~ zFZYO*3dCG+YM?2Q&QzO4$_|!zrH|OdK)?^QAowt;Mp?I$I^~T1$upzjeDisitgU{X z=$!-kTmm2FZ8<3_COUZpLIih`!~1Ow>}-#{6V2l`rR9JtcsRvsEvpFP$2%ACt8wgB z!`$CIUjsZqpiSSwt^%|EcaQj8GmKeE$$F#ZxUdq6)~%WTzsbMU*LYt|7vT-Zgd*UU{RVu_gk;G1xD9< zt77I+&E+7DV75gfuj|hX)6GMiTxEzD0)dKU1linqzPsQhL`Xn?8v5!Dwxvi^VF$bb zCp{)wFH{X35no5lF&MO|U!B3A%l}dxy{1|egD&S;DT=!ZK{hF4GT&)B%XytDr&|j( z#T=H=QgPVxgOtnNKO?DSUC3(*=B0UrAYnGvtpIMZ&5=$6nZFXAn1>3Ipx#kaV0)9szPsq8gfVwhovW04UvCEg@{MPT#TiAL?5%&G6C62W7v@T_XLUL( zU5UkkO*n7&RL#?NLpF_YvIM0PMXZt???f* zsz-Y@f8IU1PcW!$g_$pK-z21pmrwxyhUO zT)Pi$_(P_!p-*Aw3T}n%qeu9pi1Fc{%<^`@uZ8%c<3sZ|v6sO=8hqw!^t$CuLEf{|7+?jhN=5dZ|c~XR&s+1f&Y7oM|VDZy7A>Sud-KsF)Emna96hgk{LR3BM0vPIal{7KERhY?6Js^`8TJhn}!SLF!JjU>rI7~mXp?H6-i(PlRuvR~_rC;mD+i7+cz}bX;c~_J(upXsUHk8-*n=7y-M7f^)!@P}#=-N3rSq zZNPd;2MY98M;TSV{&ne)3r9g2Z)_x#FlYSUss#+EzBC<$@g}3WJM+MeR7u=y^Trlc zLJBWO-ub{QJyz94FunMP3(eAv8JIxExF1xB^t*CB&}5 zyoF!3hzSu<-a>PmvY%?A=%mba6=oS zYt|~R!T}q{cxlTo5k9Z_i)T$6xchBosRd|N{A$NQv7QabvL1q9ixAjlrzsjZ|2o$b zTf5K>waSkHg;s_$M1TPD_XQ=<NP>>l<}5g+i1AIK-EmiEgV?ayM@TVJJA@YGWlU|0}tl5R$5y! zMX(!ZW6W?_>YRmQYi)!O7ri$eM+i9m??gYD#+v-mbb*E5r_&8jk!S^GRgNee9Q~T5 zt|4wc+IDHdZB?#oS~U_z7THYanybL<#H~+lD}9MnNddHW;WN0&o2pHDk=JY3JPvocO(mxUr_`z)t1)_Uu4@~bhaqkpZa z`zCFqlqB6J(jQKr@;Y+2G9gp7&C0C2r1Q1Gox*qsP4=~9ewUYFV08A%JSj`-;V*Da zz30R#h$gyyA<<`udMJT>)C|bU{(Ayo{CmgM85_#46}vZe8Dufl(*pMK5a( zRhWE0cuh3_gQIg`udD0U@Q#zl-m%@-W@9%t8arvw*tX5ad1KqQZ5vI424{Wey7muP zbFaC^9C)644#O`y`r)wp6ZE2Ra@3$v4ELr;g5C3pCRo_gC%cjh+BM_cgrtX9bn(2@ zLAM7oUU&2~f*e&#YyN{BNQg|kpOqqfw8sycPM7`w;q35BOOUgc?0Y9W2ycM zJhhK*sH`J|2zWRgv@ZewH9&sc40(+WYV{$oFJ%FG(`$ zU<@SkkNigFZk2$w7;u6|oYyTdHfDpW z2duEw`}R$yyLWZhAAN^i&MEZ3+ANPvf9BJ6$r+UCX2aO034lWJK}ON=*&s>EO_7oB z#gMIJ((xYKzWpqZchB6yu5d$wM_WF7s&Z_@Fc4#ZAwC-&K8QKJJU3Nc@F(SSb-tDJ zaIVg~lK`D@Cb)kp$QEU6V?bOo`9(t?NP94evUAm`)r%#`lN!!y2@A5Fjqp9J5xc|E zX@I%#`~1u0xg(eM62~m7JH<;9ll6qyQbRhSa3D}eC%WCw;`BpV*{O@L(=cl7SobQFl5(A|IyB0MCN*gn-$ zH_LSD0in3>Ux`>%p;|W9Uo&oYP|8H#6zGHHED21)31WhCr1D<^Ekp8b=R{EY9|g5s zz>c_qp4t5!Af6ALh>h&YnQPjvFtr(lZ z955tzZbhZ>uJnNr*>2T!M-~O0i}g2yi>{ogON(Tz=c@<$`ZbmeR)xMZuvdX@l|apq ztI)d*>3nq+Kk)qhBo1$0l|V5I9C4Vj6(O9gYRx$#>dUY`u}#D0OF1KU`Vb)a<27h@ z;xGzJRSMkU!F?3F8$T>?7vUSbKTU}TpExDNCTN!tG)+A6V6{5+JBM2Rf&)R0r#9VG z1*>5KD}|E$|D&etV9Ch=E%$xNUyIh#}xHHIQwh zXEg1`%*gGyZ-dpNT2svFI&w$Mbl8URp!k!06iHrf=E^O&!HU>owyQNhQNHbEzY}1L)Q_x_Z}>2i{+1-E}YU55B=kWBu}>s&y>$ zu2bc3a~lJop~Do*Kr6U2Bb!7LO7bUjGEeY8puW;6#g3_a0RRot!M8u>{@2;;TAT88 z|4X-|vg-63oT4Ft@-hSY+~MQ{`M+<0PpBHw(H=PCvwX;)ejka)bQpNSyteU(kCO71 zxbaGpuJ#v0wK1Arp?shx_2lgMk7jz(_^%gv#{!R{HgP^}#27JDNL44j$oF3&#N>*Z zM}@!lEGl`-9P9xYX}E>%Oa5ed;&L=Qna)AfP~ti=kD>m5sE2v%fXwoa>uH;Y<@Eu7 z-vOc%zSj&C+Z}0|Qei|yLsCV^BlT57Qfz^MIRO=xMA-j(6hD35TFFTShi2}`#Iqc<3u_h^DF<0cwjh0{ z5{-H=PntQ<$OxX(=(h{skD(5P2~Ql}fyh6iC9VPdYz@tKVmb!yI5u)jbtwqiOsC>? zETG}%-OEw|y{lQ9<2QrDAfe{MJzIB~E30$vj-EZ?g$JpKxt_LS5V6D$70>Vd8*5VP zwZkK9pcUZ2Zdt|cJ&JKF-4-MZOj+#pO)D==j9!r+a8`CE7$PlNr;u`{8X@?KFNL-G zq9`%N7YobD+$0Mqo>>7~FaxGW3{a~Anoe=7sd1EurJwAlrBX^xB>NgV-EKo+9yTU* zek-{Saa13bAa9ahn-Y)AhS&xvioV;~njM^qNuPi#2|60*ze@BRO~cH4nQ3z1JHBiLd3+xN zca3yoF`9I5l|RXc8{M6vHZe|zFDzP6{{JMvjRlY$Ttn18(V`5XQQD%b%o#|r)X`?fuY*$?>X(wp=Az(Q%{zojg}8~(LjDYGR?1YR}{s{@6qLh6Es#E(Y{Q>S-WB8=@M9Xwno&L@bqsnx6TEw z$34B2Q4(vh4QY<;WC(OjJTL(u8Gw&MgWL9Z%A>`@Z*_);JrE#0g-g@6h28ib78VeI zxtHLGyKUxh=-~1?Q2FkF5Y4pk5EtH0R1qzzUK<-zSH-Yt>+qWjDET-cWTtzK%wWH* z>Qj_Wn7CbVKu1wm>0FKr6abu);dP?J@KiVPB~%TF^dRZ%;RlGa))X!vO#F6@!8I23 zjDbO$c@;eUQg3AYSL=J2INGe8OC$85VXXsdWlK%;jy!+oC(4JKl~XtLTwq@Y9ULp(aC%0bj@>esK^b7nkLOe@x+*7s9ly%&OQs$+FW}^SCYm=IKvNXafP@J1 zyb-lK7bIe@L+Zxz%4rq!uGsw6COh{E4?F_3dY@-5XE=t{4#;S4PUy__ueNzn)Aae0 z{y}{;Jcu=R-2|`t9;we9Y48=jVv3D%;n1i8H#krxSzXjU*$tWMMT5-%8^M$<1aPB% z{cp<%XSoU!P}{1qSe?8H{Y=YccIMeg^`YdcDukoaq(0IDnZ_G{QXJPr?2xn-U%TLb zdU#IrY@vj4y<1{NUHV0KRsSiO_p^%D!|#TlgL&va`^C+kR$=r_D9vwV?xYl1>fNR?xwP?!D)Fl3A+Bp)&;`dVQ|emzRh0*aee(p0xXY zF_0LvuYrtm+){D9pL{Xv)}}bIe9uEFXc-d%w3TyJPL{IeX_{J($wA?`wS3Wl*e@?*QjKI>-$fWs9E=lmc$ zorSX&vBZA3GrKt{Mosp+H2R&=1e362Xa=UK3~@#F|KyJxL5E_`MktX{*CF8Z_!lt_3{&3Un4JigJ;jI>Z8m}-mLhkHJVJF@YWre^ z{)#2QRZz8_4Te_f{u^cWqN!+<=e`I=4+Yj zeG%n)awcce)X@%`RE!5kZ?3V95_BAZ`Ovk0!AszZjyMrkMS)ExtWGSw)m@!Y6R~bJ z`VY1iLq)WoJ}5gn@DY!&tq~4F`O!YhN{;CW2m*iduG@64rv*3*uM@L7By@3mRFgZt z$PejX+%3sm%n%$0f`g2aLfJ9a2lWh{SsM6|2Mn;FTdKX|I6i)y@Q0sW-rm*4H)a~proLtXw;O{W+m8o{Y% zVTm3U$pCdTQ7l4ut7kg*Z2TmffN*{waQ&=kV_V}zLq@U3LNiToX+iDb{SO)Szg*nx zhT?%M#Stk1KmSOr;jAOrZV}<%?&`!JYC!1%O_OEhgCB;=kW_0k@IA{Q`d7JnCvRPN z%OI}KOMc$<=KIvR89JwdQ&QnCtBwX5)4-pBW75gHuV0*$L@iy)js&=&VWmw#WcLmk zqE7W2C^+TpNa;*5Y}6aP$eeer@Gl&E{Ceh;26<08QdNcrX&r7hU`E7ZRQGfv6;M zJpY1DVP|0)-W0LlP zk%AyVl19KNMt>|5cHBrJzps)V=$yxrxz-xe@Ux4xrHIa9q5^txS)kG-!k%rdH5Zgy zf7DPqdtOh;u>{NY6Vry*e~Bo?l>QqQ#v~c-|ACL|(($mrXeUT+6vhxcPCKL*GuJbc zhO~_$h3cOZPM`jP(0k(;xU#~h4Q(Un|H(bvnvtf1*Xg|G1z7p27j9hhD_h~BSy#zJ zA$r(17ypf@6gwE+7?d%ur#bHm_i6UE2BE7#v!uG~ZR=jtC)(i6BnZ^-) z`^56ia?a3JihKF-Gx@xvf)?dx1c=6n)JpvC(JHUI{oiYkC%Iq*Y$fcsG8HBZ+BTf+ z_X8R$E2+Gt96l5Gx;yV$g`gG}2yd_mdT&wqTfp9re9LOhbmL_&? zo-1ep4SH_|$P`Hemackd1Y;y4|7I8g zuPWQry1DEkCd0(f$F`kYo9lHP->XUL1J==HB7IA5^E^yS{c1a2m?>2}c*&ayyXEi- zdO{Ne>*8`3oy+JQ!7-QgHAm1#zH%|gqPmZy;Zo_Eo?&ajQGML|lh6K<-)6a=)0pa~ zZjAx+mB_>gzUF3!aRJ{G0QCSEqPfs;Xz4!YMr?$E%p{##aJzz_+|1yWbX7&zzV>2g z(h!NW%uIrBXjl@W7G$fA0TEwgfPAxy`N_8U{uC(U*;u4rXXl##IFU#9iO`2OC+?RD zwJ&_#Y?;`XNZh~~f0RKx`98n4wvTcznuqtt5P9Tlwe}25S|D{k)U3Qepzw3fCc4KX zMnLH$z^eEi+TLkc$?z|th8ABAVYtIK(8+eSU`T1JEibR#g+#Eknz8e9kyjNwkgKyc z2-<+R3&xr8!i5jk$?Z4yQ5LRnk4uL))vIyvPH-|4du_)Gr6x6lL_e*^yX8|@zQJ== zCsgRDLqtn4{VUd*^y}mAVp|&Oq#KUIa z{72A8x$b*&Ja@3>XwxS9J0`h?IJ`LM)oRpPw$EhD;D zndj#+Rd!cJx!ZBG8}vZkNlhxNQGX*a`d#99MfOgVNjm3RKJL|vU0?U6xq(Iqh3h4R zKR3CojvsO%8&^Xtuy#px$LJ|t^i|Cr%N>1+myC`TFT~GQUJc7~Gx2_aGY9aODu5ol zCamK8)L$4i8lC?XyW9)g_dwyBkGV#kH509-y(Qhw{C((7motL=*1W5kT7_Brh{2`i zb)Rl5UIJ?=1-YCL13tJlqVcf^#MT_PcAAKOJu=}UGQ!wFv#=0wuZ*Gb0XSY*23+}P zn}l^sFsA5Xr*&{4U&0=eG4nRme{7-+y~Q_iQ$6;TQ2w{R;gGU*N@F2nY0f#Ck$b!I z?ghAWoUY1$M<;F-cY&S@;00NRDH|?_pS>IJifdaD7b<{=rUJ-B&wbja8oNHx?_JmU zCjZQbR}A^0^$L@GhVeILp9Z@64)rKZ$?aGsveLc(HL&%XTC2Ki3+h(?tADgk$|kMj zx;pRGbEjrJh&>ak=Fm8U!=lZV00`vh6jt#LtlgvU8Z%#O@u#67^-%zj1_*m13OHK@ ztd?}PjO~|ow4g&h98j)Ks%}Ys-K3Dq^Q5Z(G5+1#9kp_Qxqp0LzVjydg+3X|39%{i zk2Y`7^fWs|(9Bc{rF)7Q?LR@&zL9^r4V+?bD=$zJVncP=HUd9G~ zG4c5ImaIQ{#jz=4x&Hc->BAd^tosKr^nIf~N-xkiL5|_7L-YGW^4PPxMaF>I(R!@L zDcrR_4fif}7diJH@OQRmLzEOJiSDBC*NUmn!O)&KQ4bRFMQ0EJn`sli7egWCqdVc! zMkd7Mb%mvrIg@|p9u&E@oW_A(b<|6r8Du~PSsWLc9k-GDG2NEIssY_$-_+j_XvYH9 zx-8y6e-V}@s_D_p&?8c`Z!M_F{OQz!`#vK-WM|}Rj*D5ie=$#!3+KRNN#s)xSy-G* zobtIED_hG)cqlPpFn|Cjij_w(+X!9M*#MO4R_#p73T|``w!9lJ(l_6)Vw}Mu6<`l1 zrI$z-@U({!0s>Mbwu5-j8FDrA2i(Xh+gRT(7sDyMR*qvW9{`+12w*L`YKcHq3~6s6 z566#&5;i7ddu-D?vD%Fs0>CTP=Owkl=ZPzYdGh&@H9xzBx7B(?im1wp1{$+#;QxoE zJV(0wwQf|8Ze_G8<5|cZ7?`d03WbgR&dvRbINf?id#zRmzn7k*C)uRf0RQusszDlb zSP~<}vL=fpym(-imSNxO%l$*4bG8TJDR%ICOhhldy+<)A8!QfOSujQ8h1M^b(*`gH zf37Mu5}^AaIxi@D>T7?-x9h|vd)X@vVLo*mSEmk}x0+&}L!7_3tlII>Q`g|dymdtf zIIVNwESs&yYm&qB;TR$RIRug3e-N7-*SJ|?iicEtrvmU+DrgOLl~gf5b}LuBpFUWU zn5nCVIq>OXujjWNZ9c_QPRe~_T-za(+H@GRFM(8=QEygBBtlNRnoqM(@9d{9$2B$EiaN0WkAEVy`?ztp z5-0xp*3}UFp?pS>-yqeokU}BmMYuzLC_X|j3vSc(IHzC)P?0V@j9{(j_i%-N^Lkb2 zREzf+J9O&d?#;iHes1;;XA=97&&i^cI)=!FBUG8U2q%@3=V~A2KKFL(7vwxu(OOkTT)@XvJos1Q?s2CFOJSP_Lad8&iy* zPN)X=yIfCU4>m!0ff9Zd25#40=>qD6#`?UI^EC}KSS&AN&U{%G2iYkwKY}t}GI0!Zo5lrj9a3C@Y7Q@M4rco1G7|+q>4k4r1P@wD&pEsdILrsS=&TFN+{k|1!|>{$_a-66lDbrUp)5Y^9hd&V)oOR+t*ls zze(}gyR$fl41v7yRPxWFk0fxaw#NgsG~-_S4Bw@5x_S-^H<@Mc@bz{~2kFd$pITBU z{B}Okl%0;+#Hu;vUI;5^qWLzRDBx)k&DZT5SLD02Ap9vXPsaobk`bifUFYqPP&!W( z&LbK$wW+ew^=TKf!`z^4eE(SB5ztE4aPgAcpJ}1VLSDrh!@pqswLTm*H zu*vCco*1|ryfoHq+sm?a+B(tV{0f5+NrhNqP<`;Z#Wz!~3_tz{fAT_^C1x@O;iNd% zc7+g{n=T_WQH)28iC5r-Pv3L% z!AxD^e@%n)#nX$M8F9;C{pv^R{W9;K6>`>OZ{hS59Jz!R?F8K(?OPLM*nG<9X82-M z%kc2yNY5a&Z2qi<+8YvcFygD$13es@XehVchSh-nS3aAfBz7eun{iIJR@3iRc`fDl z@(4R74wNipi->dx*A(V-hoMSK~=LzE|?szq*WW}>tH%OPJQ5ov4g zdgQbisFX{d0h(KAzO*r}KZUCb+_{p|O=OANHJen-oucHMQKN4)(NCm*nz7dAs~n#! zSEgPI*u*zieE(6*N&8=~HFidukV+S1loiVe8k7;;wDP`6zD2RZvUZk)OS9$HYrsu| zQuhJd;}UnSeQA`?`MtrfgCsZ(Bi=z4(GFrV&n#=6o!P-diZ#b4!!1JJ`|_I(@V}=L zgZ9I#^TuPjt?PNATN&H-KCQ!ecL_bc?q|E#jVz)4Ulm$(I(a~&u>?AT7G_UJ;w8w= zR3LN<`vzs_I@?|px3|~G2*fWVOef5sTxZ&#G0DoDbn(OBNugB>9V7(>C^On^&6T7q zEc(7;4Md-Ry@r-#Qc*Km$~ZJ96JQ3h!tRBY?QBO>H>BzEGZ_?}UvE=(mHdHc#TWW4 zXmo%8E6$l4sTqdJ>l*dfH}2|g%6b;t}nh(Ep6#sykfdC`=0PRh$pptBdP10;WHLU(8=%iZea!$ zjSONMLW&6%Mu!G63BdA7RmgWGCH6+?f#uM`j9>>Z*GD?0=TRd3_A8l~mAw94wryKW z!0zcH2-BC`3B-4PX$!4j$Rn<4h3Xn(&m|i1NWhqaimE;XUHDgB2+sMApjXUZS;5^!CC#<(ypuCCzdzMrM7?s2+vw;j@2HW7cCW) ztsTy>4gesLIs_HsnUKC8Eq2gh$^6cLy<{fIrpnC)B%={!7>t@R)!udApuD1O!4mJT zN3a<-z$y|qWZ5$D!z8mG4}km*U%=9*1}$$=#WNyi&>cw$cLl_ZEmtBrK{X#>AXO&*O1qfiCNuC;h%RK{cJRb6-K?6$- zTvK-;A4?2EqyTQFw6d1r%YW(ny_?EjWf4<#idLPq&mGdWp?ROoVt=ymyPPznjncHyfL-3R46G$A^a7u|A%R6JGJJi=|O8&hWq|S;3D#1}Jw}si z1S3ETr<(h{_{D9k1s{BFxDssEQ}BXe0njF-MY$6Wwbhp^Xt0}?dE|7FGtT8ZkcElXrkEvfr)SLzd1B^K<**pw3qr`N^NBTNVIZj{m zbkYLCmfKSj#yN0!6R+7`$Rt$+6eW?>A^Hwy2UoyWzudU&X`Dl!C<@bCH>-m?D?Wp_QoSqy7!wsz{5tiD)Y_vVQ z>nCGg6w;Ef{gtIF8MS9`2gi2QPt4(~x6B*;=1-ndK2ZAbs=!UVI>}0n)@zzQ>*Q$k zil7}(^zcIb9uK))H>niRtRlD|JCT3PjtyNiH-2X*6#HQ+3i<<(&br!-DFBAzEdcD& zMsj)0QtA<=g@zh%7k?Ih?QvcAh|!$ED2ckKn0x{^EZH2wqOji~^dPD5;z9n&1!LM~ zGU4O2sKB!&-?dAAScCtRw@-VH!1+ZpemZu)zVjkh4a?&d9PZ(M?p5y&?D&vs)aw!J zc+b*s2nDkOB2d-b0h@dmSFTv)sq>Y7+#0zN=8s&Wh+7OXnzJ1&$lI7 zrZG$8xRGgRjnEx>K@*mHy-ttJ5_bvnBqJZV-YgWCJOgdNX1=b+FI>z`^YyI*52C{D za{p%0vM%&^ZrbmOIzGgW5C0wAFn{K8f~k4-rT$^G;mZvUQu7fED}TR7N1RYO;!#eY zl1mLQEvb^;aRh>ayA?@_y6+$}4T2QsZ(O#+*PN7puR(?eok*E3dVgn$ANOuPR6NMX z8W3!i%$+0M6v~88p2fzR-Tu)e*l@!fZdXWV;yBI`G zXUey@wKs6d^qBo&{7h@ZjTc~v;3H9xxT#Uf)w7zt@K;vlq8VUS0Vv#nx`?XZZhu%X zIeCncM&*pEmHM#XLj(TVqAx)tBnZ6erL!Y1c#E1x8NDM8<1heZ(vOMM?j*(<{tc!| z!im=|mfxt_lJ5p^iZ;I@Tv&RR{Mt|KV~q`E7kNz@`Ow=F5W0wKf*38)W1#8Np-RGt)s)UR1{9uMTk*D%3GNlTW`84Dh~>=xj1aPz zW&kMv1zCumv-+Eu2uoPH>Vv$OVt9(pNLN~93z;q=ml;`wS+M!I$)n%&3S_7P<}|}4 zC0<&S(qDWpCxI>-daq#|YqchKHg2cwnW0Xic70{*gL3?IxXy(n+0D~ELu%*1Ust-- z_0RYi3dVu+tp1VhXM?M!M8%&RnW45BOUFLH5d-Ycm@N_04h3E zyaX`TjnI(T5~iQCXzJ?kalYfy{qP@ zLV4IGQ0mF{`6rG`1Ivdfp#DXB@_RBp%vS@H$Ij|bt1E^x30{dpLe+Y#S_$5-(`R&A zCTvzO_BF5{`^NHkae{KCztfDz#{yd_n zGm*O*^l_FFaYQU;De{!{Vo;#+$<-Rp7f&X#`ocOPZT5qf$|N`Pay){=oBZ80fQkny zA6lv(5&Z#seEL~Q0RYHr|Q%>83d*+T4|46D-m8P9fFTFqf zwu-ijI2dH^>lwq_^nw8hBvQl2e&?XVqNyVcHNs=FsD0s!>+gKsP3ZA$8~bYQ7EH1} z$lGq<6UtkBL}vGXA(*O)@dMpfnwpHhMiOHLjfq2j@@La+PVnakJcgvRgQ$IvdD2T9Pc1kz?*iFdqIp8A1&75f!2RD z@$k1H?e68tUWHsuRX6D~g@-(JdmaKnTS`$0)S&+dDT-G>)#@O}gw*F4`h%ClA04wt z%~VZZ3m>{1Mr!l>B&!bA^XeRgirF_<1e7R*RkT_%2y=+qA`j0m5YK8XW}fSpsCjH~ z&%_I1aEnauNDeJ1A75?uK9OFfGKZz0{(sP?z15lk+!Bz}M2RCe%roP;H467$^!4pb zB>2l<+xnl9CT*IowTA5;?>pTq-<~A6cJD<^)@dHdgMyC6xc}@rM>QlNw&^0wf zD_wU61ncFXla*FSsqE+nzru>ZE9^=*3c_&DqOJRX6P*@UG@W39Wdy4o?wD|-6QzEI zDN;fhChbBq?iY=B9-B(eFWt@LS|tlZ&p;1sO6OjnbH*0Wh_6z>tNCwg^)6VXzpz~y zUc__KsaDeZfMRGJM`PQ<|G9UKGv3mN9}*pgV+UN_t{fc$ghjHfXxVPa`@qz zg3FSQ4mr78n)srK{IyKPNA1VIDUs*aZKZz-Jxijzgd9+-4zTI5uVS&>p(0QsrncR{ zri9JP(&+}21H|6yc$Gv7FnP65NmiEU9l1E3AN8iUUJu35{~q5B1W~HXo>}s ze!uS6Hh*rgkAES1*!)iQ1uUuQ@QhG+T!kcpH+Rp1XvFO=1-b+|g1)D>2q(c@45UCM zZuA{R?F=JZX`{G|5RPEzo5F_}_1a$er5E)dc1eG=5PsXou@Tvn+G=9OFLTm%*B97i z?Md~#Fi{jT&hqY;v@j()4p)OME@TKyT1Fg>(=z1}`;>Woo zo4%KL$Fpg~3a}c%2kPY@{i6Fx;YfOpi`S!jHD+JYNq>qPm4ZJX$$Nx0f%1$7#{nWD*t{z~9T~GCJ-(NZ2`aR) z+DRp^<&kBb2o6lzi-we=r2<>^^@)_tcpS@d=M3F!wytV-6yb{FQXZ|}E;tE(&gjM@ zG4Ku@M<|Np5s0q?BXK%439}onuKkkv77B>-ps9~@Ll}3A_1`wDrT4=hsFp`KCX{5+ z$mrDRQ+irl7TI7e%YcDE5L_4tpo!rXijzT+abO{-Emn_Xz@Li54K}0t2Gx<~&j$Z# zde7PK7`@9a{DOFRM-C(Y{zRFp*)b^LOBmjd25oy!TjO<`3H-|Lv!M1!@~%Wi6$$XUrrlU^1 zfOz5r5(eEOgI*{E9P}pD`r7N9Nv&33fVp))yTOXnH~5kNINZ!~Iq-UH2E8nd&WoKH z;h2liT2$5+BhkSWkWlHE=c}95WkiA`bFm-suqc?2kjlg7f?a)_hTbWkqoHkoHxpwa zO-9R_c6ylgey%LIwfU0M>jSy3j7No$=L8%|ODZv2k_lGmtT8O@4@b0KQ4ypE>+r}E zLMHcXX_g;o0~BE&c2{t=VN-kRkraj>8n=3kJNb@UH4cjNO zW?)1@9+yM18PJ?6i`Qf@stzDn?_2tqvbPMI|3(c*DAn0+7 z<|w=3>v3?^T|Y!Nug5p4Ew zRYod06vq+1Nq7&x26N*&=y@@UO;?BJJ5gM`T>g@LoYTA#q}8DKHC7w&1|%xzZp^)| z+SADMd|!+uMiaoO5@TT@Sg4OpEwCjscM8LBV_fQR>0cfs&v489HeOxi*%GtD!kK4?DeF`mh z8V+q&blTBNWX7`ROpk;tuQBvS={iz9X?^&SQtt(w_P2j2KsQjcuAMgy)L)jJCFJ_W zTSaQgn>5^uMk!a*)&Io7607TTYz+yfknrhKYC6`oVw>#S7$TU?s$@y(PGi<|Ua34R z7O7HWeWiwZILBl$IVayDLYJ~IPNNUaIFtLqFBIyhEKU~<++FYth*iS1=>U+Z`gd=# zdAF`;ZL2}E%#ka6DK=fODnPq4Ok>@3HEHbea6?#hgoe;YJWXR+Ic@!HF7?#=6cir* z?EdNcVzc5<>t$ogRts(Y#SA1%d8uPN|L;%UV)M9*sDAx!j4#mX(bxDjFWDE*wU)m! z@w$~-`lYbtr^urhk$4s!^Uu2uVBJ=rJigo~9!!|Z`ZQ856S9A*GlUOw9vVkqsV~F` zozW$Qe?o#ux)3!3C@=s^8d8U>7d;7HE(4B@@~`tXEAR-3PTY-0c|biBr8Lu*o&w^|zfKg^xX^*ANqW>#8r6=TtbX9^)35+f2( z0hx&%b{a${uz85F{4pbR1QUuqf4s};Z#!h`(GUHX7?$Pmujt=lh2-PoN;WLF@~U7< zY)Y%mKHu2Q;tWQBq^;0WJLBtQbJ|9tc52PUZgfz9sAC4SNG8X)aqMfS+u@r5U;57R z4cG%I#Bnzy&`ua(_c8o!;lSFB6%*#7D$;M^i$%E=QwfFx@9MRWZvhOVe2D;zMLrPi z!E~e(5QqmT4-0p!HZhp+P7E;?|2~k+`q6K^s2n&6jxbd65uVVA10hIZn`VruDoR*Bk)FHCQ!{)kR3aXZ$^VKw( zl#F9kNt@=08$X;z>Ov+UfHPT?6kJq5Ct(Q*K&MH`qZ901`^n*H;qy1lf9fRkw=~)4 z7_eOX52Vk)liO3IDp9B-MFbep1({6lhY!K1NxsVq8sJU)^NyJf_I~@HpO1MAB;q__ z9l_imxQL%U{}W**?A=<)EeSwQlx=T+!Xupxq^xN}?DB#fB$G+JN2xOp1M5rXMe4eoBtLmWUxtn`%9O5N?02;#aUE^gMwlw*2UcN z%aX`99Ct!J{Elz!KYr>f1(`_M7h=cspCvqVFTcP@R^O4>=7e*@OxR>XSWMIU2@j$N zOt@^%{MiFSS3B|h29*nV(FHRg{3li&uP7uXFnVd{cp5u!1al#3LG`&i;*=;x%8v4? z8K6uoBs|3*Xy>2+CJK`5bd7nfaFGBjC{qNmwze9Dj@hLP*aUV@m%p*ST~jwT;L^Eh zCew8E##*Za{KW)G3^S68+o?2WEA6G>SMMcZ6CrTh1`5&{h0f%7urf8E0DvGjENCj( zgUnw4W3r&KS)OWQ)M>M0+Ag%+Tyx6$9EO_<2Lcb`JDR_sg69y(QkAw`<;=KUh-(B5&s^HLF<0X{gZPeW_2E-@Y|Qi} z8W)35V=gF(;d>id@jx(?d;XwV+u#JUO#H5q#Ay>)0L8_AI=JS7tFgi;J8;UQCS*>A zi`1NsqEIXvcGDST{N~5*uC9Uq&BrztAhA=yg`CoYqd7SsUc1~tyH*_uhIP-(jyel+ zfx_3H#2`-sYJ`O@)OlhS6(P5mf0VAR#!TdjYSzwYLnL=_Z`( z%VUlF!bYehaeL9Ce}A%=@3?%gEdu_Cd3mrosVSPFI{VI)ZN)DYVzU&>Y&AC{#k+&C zp<6i>dUVGallyH~Z(J?apr@AG>@+L`2LxOM)P~Nq$olqBunO$Z?c2{x7Fw*CxD(kc zPqSd2gb2R2do?W0C1d%p%9LWs-&PpJAl6H=cy3qVGirc(QC_?`@v1Of?z(Ov-o$Cl65Ti_OL*FBlniyy86A-sBDJT)o`Xq9O5seW*Hc z64GPFt?{BVsI@rDw3KM}PAOdgiZFp?aCnGtrw2mPOCli#18F3^67i*!n@ZBDfKOen z-wsYPex8!}PYJ@S5Tc?$su_%^$#U=NQB^0^opkYF-!V1OUd1@~tOuTi%|8E?v3uX0 zQ835wUN{fOR4c|d4YtNuSb~7}<(6g{6mFIC)(0eJfS8*oCZD2VV7)1f#m70qg${Qy z^98p6ULvOv`?J6o3vg6fFzSMtRH!@w_tEkmDG7_=Uy`63!xW6!e#D5tSEn;&epuYnsBUOGUxIude&+&!~(7CK)QtDH%v^zed) zIFT-ui&~hj-8lz?)cQ!&<0A2(C_-+}F`~=&x=~=E>;Tv%554?C!x09PN6e9uTbB5j8#O^6)i^z>g7qNWNjSKTt**j7SU{xz}yewi>Op*yq%Ww|M{^JsS$ zr2sEJy*Y7IWHGF^>WlbyzF>x=ABbs43Q1?0F!BV!PEt=bwn-Y>2l*#*FK8Ch=CY@D z(yLDfwTrOc$#F*NF+BD^j8&+q>FNYxCU1N(fBIgq7X=Cvm_EEMWHP5{*I4vV>^oA& zKm1F$Yadjf*uF5}_~auo)eL-w_OFcds6xnDyJJ6BfSxs$mSn9hTc=6(xYE~^SrfxH z!D%H!Dw*8PNSWd}xO?Br`l$VGalY>vH!$nK>Uc(e@pSre-#1>Pl|zPuRwhvH5Q&b) zR&pPBR_BBC9q7>KGC^YRc*#@83>?URU+T|90sF_JqfkRXZa}8uM|wm$VYjIL*^czu3M1@SjhCpO?ge0kA~bp1EA@!*+qr*@!n72w3fQp-?Ck6v6Gj znseEJX7}&P2x%DAS9VBmUGn3QygVds;A5p3MQWCUdd{f(LWKy2lq`Dqo4gjva4L~AIV0|qw6Ww3X0ren zeR>0{(2f@%xiAwtJ@|h2&dx%MY1DhMo5tuH)%DvgNO*XFX~Y^@J3&9^x;Lr~sOfXXaTtYVjY2w#?6t4O0 zojb0iloqV2PW&oUZfTJF@9iw8-Q3~EsP|qvs9-XnFx>544{8A?UWmJL3X;TIJz~-% z?sxGRGPJm+!k342uPgrThlO1qlJ3RN&y9cAJZ;tYmnVWJn{0OO&DNS-TB%>3>}@yu zR?#+CyN1z71E9r73t-_9pv6Yv&d{X&L1b79b}YNG45^j2V~JJO`gS{O$Iqc1b>7-?`ObW?q;lG4&Nl^y99C&lfo6lz#~XD z69@?yJDjYPUIGefZOrPAv9Rpi_qf#8q)AD(RDlMrfXY+?;!!7u82M<*YBU6SdSdF zDSD1}^Bpo2wfB<&k)LH+iTh6iSN$HRRG7;c=~06?Wo3}j+{UW3h27eb&y$ZZ2V+RS z#$-Eq?3L%{tSdWK@=(O|IDfPvNhhDy)Ij}Z8~%kwlt)-#7Tpid^EaL9hxGS?==9z6dd=AOS6U0;k?PhxF2|uH%I6mQ z!sK>K>aLUmpdrg5Sf^gi2?j+t6BMZVtT}@r>tf_Bt-l{4cxR+a?f00Fkq&^%3)n7_ zO`|L0@xRJl@ndnAVUTAW4Va6f4U=4L3|nD}cUQGqzD?c%;Hl{s&FVY#+hZ z{Yri>SwYXKrnvaSH0bRwadef|u0#7?=XpEx8zD051a|1uIQ|AUgyk=zIdrj?RBTX% zv{;WgCjIEh$MQrny&{w<=Y(B|_2xpRBAqEq@&qlwl)_(ydY=4>#P*-W`erGgwDk zjAf;GTHM&HH;sjh?TWl*W>@B+@HH6N{Hmt@dJw#1{G#gf!Z!AyaSaidlWIPHDCQ7k zmu&MGTOhAcHnciIdQq947#a&9!_?ei5*Fwib8gB^?6urq!$nQVQf6tp-7h|H7XP8dGf;wKJ}nCFO3`B>q#natrj9 ztWE4ik54V8w4D+S@1m*3GB%a`4I61Xzao-T1s4T2*rGF(`sK4;Qt#}o`Gb=IR7j10 zjexcEJG&2xm?XcL)Hq|9_fL{q@EGyvoDYn6z$}xdQQR6)SN2-o4XK5J|-V| zm-xQ|Q3)1FUArQ>p&ji~gfQLIB5U+u2aeMG~*`J_iY!&kG``(>IpXDMGv zT}l}xNDc^eDpX7b=$OM#Xvgt-8G?L46E)5ZWw8?06i-ugc(TKCh%surAvDoHM13jL zu#J?lDModl*)g$KbPQZ9qu){J=K5N`^?dQ`c_k_ApZk%A21;MpsDU@=yubQzTxBr9 zByQ69QACPC8|{##qH?VR*%F`i7e#`;p*1ZhwAeOUV2W2-aU0MU=|7f1}#N8Ly z-=o+i8tN?ZgCSu|oq|7IiOv|0LVM=_0G~i$zXDPc?+-H*2w-Ek+CB%9Zqh}f5gKCL9K!nsl3FU>&-ji>1a;ltgL`ib^gur4whdM5?b-lkEV?@zaM>*z zqvpOrcQBJaVoO?DMy#X?JSAj3y+K-z0XU%jb&rNe~ z=S#vDEPs<<2>WEDt4E!z_JdH@njkG9js%ne$P(g!APqq>pbe4L+Bn>vv3t&0Dbj_?7+C>{k15kvK&>+`x1GGm zHb4916+$TKj*`{rHocK53d>sEfiqWz=RLMNHeQ+? zX6Z2_V-U5)Y_kSl%7A^#)TG(8#t@zb`4;Rkq-17d_)MUf2yr@%6ZiCpzx?X2tAF;1 z7fWGTw%19kzbTFO!D{%IUwv2rP+G|&wj_mRgszmKE0weiBMGTc3&0ZBy`T((X3E1A zE&P<;5WTAUCEjTEO*aJu0R8;MuZXW$_J-6zZ7+qoHmCVkhYA9r6b)iwZnav|e7@d1 z^w8w5yavY@VSN+_QAY&8eNp+d(H)uh1ef7dXX!v7YYrhB81%NLsiqvOw3U&YJcL}5 z2)M>QT%0nGKP8YB!4O&yAXE~OBcP=idvYELq-C^}i~Ow@o*MqeUtBJ`TQhE(W|1|J z{g+yFnS!VwemWK*R#132X=)5V0n} z5^N+OV}db+T2+va<0vzn^XapWLKJJblP6%7QFa8aVK+FxUvs~*#0mM08gCOgsou?# zWzw-V=~Dy-CF4{&7O`j9w)eC7l9gf`YosP$FCz4l#VcZI|8Bt0Kp0B}BG-alW>+O9 zbu#V=h>27nlKECBfEob|q6s8PfKKJ;o!?pSE5qSGzwT_Wlt~7e8=L4$ANi>{^Vz-W z-o~a`nf5wtP|CQr>LrbAiJ|kwAO_ggu*ktjR(7Cj2jai1{=50t@U9sMN0o9LJ#t5MXW)N)1s^my~oLmCs0=Q1S12qVV=VSO6Y^dPKbw9)DKnTUIN z<+JgFxIVhL_G$WJb0e~wyRm&?1MlfyCnYYgc6%xAnX9Zh-x`{l$(2k7{}Wq$m`wY3{R{$e*B#Ojo71EWnW z#PA6V+(+MjRq*_e-=v*tq_jUj-M|G&M793Gism znlG70nJz~RASR%{sDIR3F&oyjW9>+70^x^_L|_g7;iiIrR+*is%hcmwQ>*|Q`v+hG zOPct_QJFwV42d9g9`7zkH|1PjXe^m=Nt=Qhktgl)-m(O&>vAHkQWHS6J}o>{5Oclh zNLs%Adw04$Et%-=-+X?mrBK82?gC%%RF{e#aO;~m;i-N zxftNsd_DYW{I1$}X_%`sSykNVwS_NV`+n+3uk`vVyTGu=&@^x&2!wJpgyjvViJaSP zO3~1GZps6AF@XO&+JyC9%s^IYCl|hO`5)>>dw%ZhDLpfJF5z5)AIXz{R;Vqx`n#dK zYN5A9K|OlXg6PCOU0_Nlj#+qk+U|??*}{aTscxoSeEvPxXTGe`)V8;WTM7a4rGPpI zD$$C)BO+f4RXT`~3bjcE+I6%I-PlBqw&cbJRuDo*a_CB_rAURYw3U=&Ls!ab%CVs% z;~!mq0ykDd)iF?k8Fv%s_6(x9q*ZmFw_30K`Qu9ajdO8cr+|oHY&@P}0VKucAc2TD z@oFB>z?}FYyAlhEvAXex8{(T@v_=m$rBvHcb?kVzt!cwcZ{DcSdTNhTOl2sN2Q>w! z@pW{QC_pfPmLP?f{cIEd<&~$0TbDQcC+-}AmI98p*toI@mNj;DHbjN2=d})1&}bD-t+YBonSU1DAN+ak zCb7l#x|lhS(wx+CVf^BiZ&O4<^;C9@>9QZoh)jTHf1z5|cuMe8|2>mGz5+*?uwDV+ zAEsH(3o^^Y>rZ&MSdl+1)8uzV-`x1OVPt9(YM>%OJht=hw0PBW-Ttz7h5GG(DS!3y ztMKaEil#L#%VDJf^6;$fBTRC*bH0U}Vwot}E8Wz$r z3CqIKRw`}CF$_yUtRzQ{5JnJLA*7ZhtPm6{L6IY!_Ms{k_Lb`e+xtPxU@25-af>0# zGX$w;AC$-=Pq&WzJRK}BOPr}%zAjq&$opC{;Asp zgJji}5VI5|>~BnC)xH7$YahNPc*px+7>{H=if9aJuR;4NEqa}@tg1Au0C|x?x)#ILmV{*pYe5VW3=p$x2`&>M zbdqx@n2`#S8bm9SG9VTNOGMfch?PL#DL8eDY~oI{Nevd6=lzj4`e$ALkS0iwY_LbE%M%Y>Zju$Z28Bar?P!I zQ|{(*8NGfxnSXuTPw1}Js_AP^VcX(-xNS*Z zmNKp?W?WQK4h62{*pV`Fq>hvT6BGbqA|~e1T2|v|wr;GI(hN7&){hM3OQCgRLyw-c zfKs8B*-8W}2xJ-6_C}-zOQ!SJ+eDO|QYABIU|?GR1t)DE_;7W)gk^+|0+6CqsEGx! z6@+vUTTPN`GCiwg1tgXZ69dQ~TaA$lV{3(gG8RTi31mjQbk8yv0CDI_9#^qoi21NN zi|eTgdCEbFCcqBayBfF0H-G(YsC@V~QR(S(abWAsw4@g5%a^_ZYnsn@%ki-2t?Wvs zfXAr6YBHDzZm9+^;)mXRk==Lp3UdDVt2*Abc|1ob0LzXBVZ9%~<&zh7WLAVXtbUKG z>XIr)!(&edK@x+tF66y-=f+b%Dev6%jqum|ZkCutLgS!%>c?bbC1xS!I@30hY}0ed64B^%GpbL)=VH6{>^`BT zP{e={0)AvFZfuklbZ`<1NJxqREPDu-RoN$HTj(v@Se*z6onF zrYUIjR64wV^`8>}ryLDUF=GWu6v94uDlJ~P{13e~Ef>Uh?fTzvPifPXt{;;y?Ul=@ zv_RHJpG_Rz#E{BZC}Yty5}<9U24}3>IeQbMf#U}fIrSF+f&ocQ0$K?~!o>&v=K=TJ zjlJgEFIZiBXla9J>Kf+dcRwxj+j_lfTLb2^uF$Z7D}7%HhqT>aXBtA=2u9?N_!cMD zf(Q&UQoxHf+}Iwl?(N8tcgdH;7<_F=e_NM4jy2os#Dn|~U+tRfeCm)~FaSfl|euc`q&1$H&588(H z-jBz&V|_Y!g$jDkT%mVecCwS--V3LrlVoe>bO&<6d=u6u0Hh}^(^oFL(YB_Sqz+Vw zDM%tR0eUMt#e(#5?{z2tjoCc-pn0PIj&OV7aY8c1JgBRcCU-(LE)x)|#P5X3Ub4f4 z5d<%C<&_U_m1jJ*E&Rx`G;u9(9Y;}RLF1eh1Rod-L6Va5JC3kelZL4$*&ZGe>qhFK ze5xWX=Zzrvk#QY8)qgj;V8lw0mV(^a0Le^oj#UT=m9zs&wvEP0C{rd@RXH_1g~9M3 zkrz3DvH-{2Z+rF4;jj5ly@h@pKVe6>b}%Fb0H(?BFsHR&!KbxeCK~-VXE^9ZUu9=P zRKHXz3o|>3bb4G9b_vpk8c~RAdn>=F697n0WRrHX0N?P zKZT#i8)?1S#RaZT2?Wgm2B25w&oHO7UQ8?VXUUA4SHra)^pv;%#uL?e2yGdZ6sfQQ zM5bZ70ogjAg!R_R3nZ!N{LbsBrpwY=eb6VLAOL0z2R$H=XihD1mo%)yxt-UV{_0M% zx3t9!2R&Q}d(E!mQ_@&H{x~U3vsBb}FyN$AhowmDzoVpwWfLEk@?@HWaWcsj4udW( z=vCC&h{J4kCM-ikP}Ntyv;(_CeWq#}*29eL5U zAS*Mq7=@gNmU6^^N3E&@AO&#E_Sr#wSNu3XY<8;q%r^6Y-hN0k005@JYc(e}or^Wi z7hq|_I+tO^NZ5~ZdFZ!_r~n|&`e@s*oBg4R4)Pi489@4((WLS5$jujFEk>ekGamM= zju)BE+-kqK{MH*0iFeabFrfv#mPwrH;0xQ1 z07+a4V`1>4g~S;vjU>gG_;mLMxa=HBhKn>7fv0TEcdRm2MUF%&)W);Mt%$jOHdK8l zGJ+fcQZSPjnK{`YfuLYfZfT+F%B7TcftEb<^SUVlhMXV9d-UCU3m!GQ<&$PF3S1kt zq7F8%z$)SB)lKK|>gIFA(uQ>+@3pH+T);qWFGgixew&DD6k#rfrX79mso%Iey5;@X zn%)k`RK9Ua-$Ve7^F>&1#iTR_Pp0ED+Fu~b(a?m<=EFt3xED2DLQR+82pJ`#5YQCaM$`MLiRDB1F`pTN1 zow@d5)jTDPAYuYkY-?U*3_!WVU1JhHA*9JgntUX|Xa|60pcgwA_QhwC7h&Bn={=v;ei^r?mwCOF9dq*3AOf_}*0N?y zVrm63r@^H0umBV@OFj}Qxg!U&g_17Psxic*l#nVSK(=rzG=mf+<$R-&(FmGD#IVq? z&}?AAFynmN(lDyNgHpzYG8UF#I|s@hVASDslsOcHo)kt3ij+iiF%Sy|t8AXbT2v5F zB;i8Bg@T|I011#toPCJ7$OZkV-YNRHWFIxV<0oyG+bxFZ>AOdq`1T>&8?yu;4ns}N zNa2`e4JX?Z@@L78>ZVHoSA(h`opPT z4d;WfF2+=St9VuZY}9m#=I){-78mmro*)S^Zx$9~zrNH_B`h!;;iDyE;Uoewo+C!Q3j2aGAl&0SuC1e9}eZnLr(YrTn4#y1xyRr3Y_LP4o_G~ zz6+$Xz>+8fAd4nSBZ5K18n&K)#N+m9;y%udskE0Ysbo_o_FQ2zg7Q_VR+Ob9WghJ! zh2*SDj2S*80aybLIO2fH9MT>hj-RnTc8?u)`nZH{JAxh_u}_-4W|tij^&k5fo!T9G z3rh>Y$ljNnhXL^Qb5{p^oBmm zoNkmvKD?1(LLz=Jeo9@K55juk&C4T2IpK??uy%L2 zg!}FhhB6HTO$~aaYg1gqh|_No=0(~xQN{-e36QN52-WNI>f4*Fjxk}+F-a9e)Ga`* z7c7KmO$i%Ek>9(kI#}&Z_fw5~wM7LXN*r>LYbbCPB@V5lhErGxS6P@jy-)-KVTu!l6K&1;86Zr6Vpzw*S~X*K z{=C4lLB?r#E|YdVb0`3+%puAgVh@Iagy=l%XOZOlJ3;us=SCYm%C|v?caVZtR;G<| zrj4?2NLmLnN|8$*lu{6q2u4C02LfXBia|iuZPFxt*FwWU!@|H4GrJnr8r0%Pes~jt z`_eo#G^iiw>k_9|Mq~vBx;!DfVU(O16Y~HCCi+PZXHXab@Kr`H%AQC~eurq!EH{g? zCyEBQMYuBM$2LSokD$N0d%`AuS4nCVl7U@5;gW(4UeRw=(H(Wz2@G;&I=f=nE5J@>*ZdVM0`64U}z+te*V0)Cur(un>Gu6U6OiX7IjRjUB zSVSD5iYPP8Rct};=tq;a#%C0tdkzQyDeM5S0|@Ix^c*v`BfSC)z_>DH8@)Es;I?8x zW_jF^S*co5i$vaAAe3;V=2+F@B1-WvI2u2T_}wO`@sJGkx`YKWqCe>}g27Hj5)=bq zYX@v)zbeLl^vyM4J#X@YMY$7gOKP#K>Czl;8X&+@QcFMnI7K|#W?&w`1W1N(EDL*- z2duUcGEN?n6dRt>?Ru2Oe>Xh62gYb@ky05F zq*QD}1iFGk*oUL*sr=1=;4x=Z{11s(n} zk&;=b91qW}g@p;3-4h5)v$gYSVR;tTWmrQbkLG}mZGZ-^4S9co9;|hZpPt&&+Ac3O zcx|b{+Fli!immAiB2yKisd1<)9NTEL^Ux@vO^Lq#hG4WMAOnaU>5H_=A*FJZa&kzk z25wF*)GhuZm2$FZblXJMZB|Ms0*JJYRG=$}O@L5WrUVX-IMR3tE>NWX87iBBon zRBxTE03bsy2JE1I)a*VggtcbUd)p#f*&is7NCQ^UoRz86^Nyq^QJEndxch9{im;uoBLWs`;Tr{K|Ui`&Q(ejLkP)|oB+W1CZVE=NX@Gc z%QD&`w)5M-eR>FzqQPq&wJ^p~8}^hoiSF`NTMmaL6F?v-NWzgRxReo1UWZa*)F`96 zgbA~;nk_6bTVdI9O_yY7s=~0bu?g6)X3H9}39V%#7|fxmg@GTc-A*&vj?2SDpxS`K@1((El=L~}Z^0Czp zOs>WNfM)>=%q3xE0CbFB;5N2%bm2v*dlxl{bBDUaWp`{yl{=c|L}rDV;Rp|TuN`|! z&rJBJ#GwI+`K+TC$tW`~6(7Y>@XBj9NTn=U^o4qfl3^5K?LzgX`ZNMTlwZ z42eMXnSGM#D20>B$z~7)h(w(%2npfTH6ci(1t^{Tbo|-iL}rYc#%*D2?e+c5GB}YZ zh6R|xfXgtj)`G#VWdnwl+Qz8HBgyDursG!9+<}Q8jD=ecAYu*UD#TeIRtQMTs7RpS zC39ns318b|{GvlLm{k5zzsBZXz13ic;6=(sUVzx(`cboV<&PG8LkiizcZFpG_U^10!n~&M|Pm1iFll>?%^iwR&8) z=fPSx_f>b9MY%OjIT||X^(Evn_CHu-#);P)GG*f$A@W|E#r`M~0APU2C~*Ka$1_4p1V zaDHiM%|h*sRE=8-5}mAhhOwGDGAl=GwZ_m}-6@OFfc3=uHODxP-)#8973{kFRI~5g z6WsjvUdS*8S%#`cXx`R~?ayE1?z!+p30sE7%oa)uWw6h5>F-95O!t+ajQ(dX@0O`- z;J9*M2Sm@pyjghbW7^r%@0!fq5muDs9l04NKVe_GQ80a#y-{i;Y1Jj?s8UB6i{?tn ze(jpmYu9|~)pGrtFVAd$&GY>S-g`Yg@zyJ20&BNa!(1yGOh#bJXiY7KCsPxMJk(Xu zRoZIOPUG<~{&74fh#A(ATwa)WR1nDtLxuoX8RpM1$pwE8x7PaQq$HXVsHdt~w5FcczEFp^*djkcLj{sKwOZoO?gSx(xzGecO0 zV=NS6B(u;F{OrPWqZ>bUt%|scWTaqgl(AN6 zn@9{W6BDtKf@4K6f>hur6DvWbj2m~gXKgX#d9f1uvwv`o$d6Rj!rn5BOs<;@HFA50 zsOy5&a_QY0O>WPCh;sAUqmUsWdfIaKiZ&IE?OA>@5@flF4-}Frec6t z2@Eu)@%HaLW^TB9iyBH#F9Mr|2XLVOBf1lq%0~|XxPAPBxg@OJlNa=gkVmpa4hSIw zy&ln;iuM0t8%JMQC~J2%39nJJ$j6B(`CJ$+>p4)gjlr}ay=+RNq(po6P(h8D$+p{o2z(@iU9GkSEPu58UVuoPU+o3a*VI{1Ev_LA<@I#HrNlFK` z67_Dy<94jx30j7lteAhtduXa?@;k(e#?!)$gZGWED-;_C@5AZsS87F$nx;tlIDUsA z0F)&#;1Cvu9KUu@>g&4W)Sv$KPwkR@#oBkSI?=7992q(iOL|KBum0-+0kDc(S-)5I z!@wdZJMiD(&*ER{tjqiBt=rJqMdJ)*ePN6dFMjY5 z*-%#TO;@dvsX&ustiAT`?PwVZWzC&v8!;HIltYEf(QB$-M1gCQwc;KG@aL2FV=gVM z5Wrpl?V}3}tbE+;(Wl5&04LKB$-s~U_?F}~14f=zvhfevWbL*l;q*ID3nGSV6N}4A zfz(hLEQQ|o;xqNYy2XYV)c)iyz4+c|lnP=MHl{&lf7(@S17zJM$~bu*?|9c>b?Fa& zhD(1?P$PbY3k@z8avm46J`Fc`dRJ#dT+Dc>YD$^Vk&=m&mZYsn>^jLzQnM1wtc;B^ zwb=0@6LHsRD?zi^ZNrf zzIw=rr8Ra#Nz~&Lh%Mrjhg_5uE4oL7A8F$ltA-nV^tNQMZdc#5>sGRzKUMv**=Yx- zOBMLXX@4_|$2J{y061&>_O{wS203Fw`#>@u4hiV>2~9Daw{>Z8@ra0j-X!$>jlwAl z$W{a73suBfKYH|SSDAh1uJU9U3lL%VB`2BQ)0ahO{^u{@mTD@>_+td1ZH%mwrzXEc zPlyx(;+|C5T(9 z4PQLMw7P0tElBivNd@p&c?~lF2X3e-TTN2U0ssbv6(B(JIMw$H)!@{xPD~T9tl_DQT+(n-ytnks z1jqZG@n(F)3$*q<22rAU0T05k!E4k04&sv5^H88m#+h{cL3J4QhC zxin4}d(yTbkO?&VVbVZ1@Dz2mW##xn6AMNQktGWPcK_}X3^SV9rDd5wbed)+EORgRhONm`pGkl zOwTa&oV`*lzwJqr8Yqc)EFqN;+mJdkD*+(JxD)hivqNq(`|JwQf&ng1dk{(P746@- zLxi*zW#2``cPSHUtSxD$qa$Y@&k3|015ze6Q$|~AiE~=p<>7~?Wq)-~T~g*aev=@yMQX5YcV2mFy!EeWA9A1=T1DW}q!6J>`m ztOywcb9T|{3rb9s4Fu}dpt*YKBhwlfd2!q9a9@nz`{B|iXQ_gd%$e!QR3=%2z?%j zCKJlFshlY_q+%7sQ@-qk8lfY2PfOa2z@RLFP$a&uiY{S6W~FTO+9qtU!lArVZ)PEK zb80_~Uf{B)KuS65s%#H35IQfY=@OmXda-bX7ft%ed3fI~&^FSJoV$vI)&~e44SiEdaxu@10`8)Z}1*@*Nf$@=baeU3MI}PieKJmqYv!X=6!p#e8He` zQx(6F!IHx;T*CF6p|>*z3}oN}NdV_&$t ztk=fEc0`CBMp%+C10v>Xrb*^<%OUgz%_Oez%LUEJtAJ@6~tnp!kLAL}@deaKKFY)qT&SDzuBYN%2JrLmcPx~~Wm zglhY>=kOm?{o3C>Qxk9Q*6Qq{b<2`euSckgLscjsfDsAikdY*h8cB)EgbfzRC3sXn zS$loui=%DTCgZKZfz^p-i?Ch-pdY|r9L$&3o1OCe@nfbzE|}0k_&^xWd04Zz*SYF} zowjR53tN#8m9UIhN$g(U#4o*LE5C0;pZBf-iTCZ+^xi$j{P|vE{G zKGqn1sh`G>>D4)!pTy0QA}k46E)HSK$4K#uAVMh`q|@84R2e5fdBDiKcKt9zoH z+k(2%#&P@xz^Q~7T+vpmv}Sc`s5~KGkp;mWuAsc2!8xJ1*=Y(w+3S($a|!xLTC_|~ zLjnL8ERdb(x4q$u%l||?z2E9@kT}~9h$AJeEP$UOsrPA};X8&vld})i=fYnC9K~7q z2W8t>ArMMm{QW=QtzPrpCxU^dG&3bRQTar%Oy zbuTMe_oSW?dRw?oLZ}IM+%7vPA2K_UqWLNKjR%caR}-T>f-06umwTR0NJ zx&}ZWfU9TtoRx5*7c6_DzG(5wLrj`#+^e@bUx;ouIoSz2wN82ph#7;q6mmi6eC1=e z(7I;_qk*Or_H^X%vfH-CU;f)4NCv6FtdE!&fk?u#{SKkeAr#yimO1U>d9-W_dH!5K zZ9r;XOa}rGOVBwbOYJeo;jzJ3AQBi3dT>Vjm1=3j$y3bojRW_p4gGh=?dfI5r-p}# z(a3eWzX+!qnxH8gYv0xBfucQJsUb^Ap45Ot=<*0d4oub{e*TD!URQF=zudmpUA=Qq zY+jm&8ke7_w8f4kd7QDiSD(G5M+~Q@yyut4Mp6Dwhf88KO`*3AmA@g?O?=_gJ1 zbdJ!S0RG@$w{f_S%YOp!t^<5-PHa9ezIgE~X?f$R-bmOdo*wvBG#vDdKP&P>wVU+s zJ7!I})j)O(R`{`#+7USlZG{Q}P=#y?%1+NaAv7Rz>SgYk z(F3(@6LOBe7e7KDu`h}9l=4P6IM{P=*eEE%>KdyxRn`wQ2rP__jnqtSBUrZT`HNp+ zzPa(~(T+ExP`B>*lIh5-jGFz0?oiN;SrhuJt6wZ~ae=iC*WQXxxc8f(nHcdENUCBE3Wqx4ngHC5 ziMdtdVcIjx;%iTMr@ds!t37~JZ)H0gyf*0wPj4Mw4~(x&dZaJ{lQN}F? z?3QXmr(CcU6M{Okwas*Yk@sG-Hhk#4*Qs(x-UUO(IbZgiy;2ocEr>hUZ?jG{lGar) zlysRXD?(8bN{ZNmOv=Kp3=p4Jw*0&z^HsxEUpr`VMS<11MXQzt>^KZrR1jrJDEmH6 z+S4n4@9v#ucV{E-Se%!F8KsPCzWDK9=quN6_InzekC?0gAR9*5+1be7x$*>&UbaLu z_En=FfBHK8tK!bg3_p1Rl3dM$#-R|_i2xp}|D6ueg^OOQZ&>{oPLsdD84h{~M98@< zkR)+Z%Z1oi*&g>*cTETlZnb@)%H`MEDIKbz96
    5h#oS}+AX$sLUUCGrC;TokASO_wee>ighY*WLB#xMPVle; z=^sPB?ASzD)pQo^Eqk#$6s~iu@k+3g1t^G<7*+3XR@bx+nSPGCLy_PdQP~zd$9r5Ouov(Mi=yd8meYs{w z>E^Ay0?cGQHLIlMRzlR;8{x;kAn;Vq?@}+vIRQMFJGJ z$I#0H#@ZV5`6U}&Gi>cuLoBWuwshf$mFp@j7e}lBQdI#eE24@dM5A>X^?xc}npXDg zR448!>;Jj-G)@ZqVc+=U4Pr@OMOJ)oRvyurFu=xTt@_9Byp-g&9`o#5&bP&`O*4_z zjYxb~hlGQj5?%@5wwXR$)_6*M!|L~7S>q|G!CE&L!vSsCic;7Y4+r~fIT~`5aA9pM zFj?gbke>;E;Wdd&@WIq;J*g4buIs>1 zwFp)U{m7rbDBg3)x>R=GFl3m>?reC&C92wz3(oxFFGx(P*I4kb*nkdXPk83$i#>p z5#(Tz`cGYI-{>^dmTn9DoKj|C$kbpUd;>^kj|mhC8gr^243a@*0W`uu$y_BQCPLsj z*s~xXV#6M1HU^%lH>Tp#FF?=Z8=~mOOC^_vXPO57A%L$P&UOxlu&&1pOh_d3MT=fq zJFDYrHCXHR9_#z1843F0-s(=2aaTaL$r{D{j#{Z2x$3%=vo! zV0gB3G6RG2;tH=Rq8AKXx;rnT5ecus92*5Nf&>a-A38ECy{lLLaqz<}pPeA`2SDE2 z{e8DhHdJ5Ua=rVQ-X%)H#wA4}669C_hQJ080!h7@03hq-AF{4Uoh_8H=Y^-+ednL( zHa)vhBFD6{vLqN>&UOfbc9w4H}%WP)keJ zdJ*YO0?yPvPC#faS{!9xUJxQZ91D{YepM1e0;%(lGO9uEgS>I;v(!--75 zNXDgy{iHNLD)3y7EA^MPo2b_oYX6XavzO+Y?6G|y$SIe~z`@ErBcgq%YO20cRbQ!x zPg$T}e#eIA3=kK%iVnFW!wT+pJR8A3Ka+Z4dJpg9 zUS&*0k_ZHGAV8sjE-KW96s1D}galy(*?>SAETvLG|JsGI2;&A=PMq%mKm-|UD9dW+ zsf!KPZ?>@mG5Yz~1)f2Qe`<}}e)wU4?(^rk0t?qdD~6Cs*H)Gck+RSZv-B);%D}X0jvF*Q--3J#ZqRI6G>|bY+KWUR9vzT3 zSz}9SS2R?@F?}^d;`A+j=9Y_BB3q5Id3m#lg>T&0s>qp{8wCWw zWqP@D7Cs&PY(i~emo2DoL=WkA`8U9toik2LXA^-W@q%GXcjZMqBHNSd4#!n|dlFrp2!}y# zvRt{A_h)buV1ZO1l0?jrOqx#Jyx0BHZ$BP>@?Dq6Wn25Hp&Wt*VX!fU_JKOJvSJ}WrJsskQT+m*F};(=$0#&_ z%W#Me_USMaVJ!!6%aN}9Fd^>I&w8syJ{bOY`t`L}dsn&*U^#4h5yC)#5Gw(JnmYB_ ze*3K#t>x9bhiUz~4m`HDU7xqHOZB=3RzVoB!#GE-b*^{LjDHkAHvS{|mFT|s9o`jD zj#6%g!#O=r0x+V0g#o))582==9nv-!J|-fDKr)4nOn`DUEML6p?aoNlAM7b^nmj1w zD}w*#&x=~{Ht%JA)pk>H|8$-RP?Ru;5C9y8@C-mq@DXP&dwgH?l~x*9+5=DzyoQ*QDbBkmv-lTVRsCe*{&mvjBCAb!pOa%eS2_XrK#B!{u#EO{-mINHf6My#~ce|D-_{#5} z?7Fd%0APf$|M`hum~)@mmFjJ5o)ZNR76fIil7{Pwxk=6xK!O+toxyCuPypJ+LV(DA zF8EgXp4#^$rq5mnfGz;f1F&Z{j$j*MDG|3JY1{KPB>7y8 z0M4hrc>-lAD=Y^HVUPUHpuouExzL6 zZL;e52R!{2j4WkDmX!X#_}3HEHhZ~9i$&gC;GC{XJTfn8n=FXdRhc(rh2G zh(ZAh2^5J5FVtT&?k|M`#89+u+W_Bt*5df#GZ#DU{S{CmagDA8IY?upPk;6l2Da|T0QqE6v@8F_2V%0V|y-&ApkYc0WrjjA9!4;*em|%iW8I@8IcV_^XK1u zL^Kz*toY8Hj5t3ssH7cy=S6F{oOY?^D?IPXefo;^yF}G<$EMpeA$cfRv``~*vV$Md zPsJ~({6F(Q(L*j~Hhg{#;CukXvvnNPJA;o|fl#o6_&w)rd8ImOa^}1IxA0B^SK|gs&3U;FA<0zs zHM_6qH*5(yJZ5aH1cD?=(I6zG^Xj!9R_&Q(Q#v96ke>>F?!C19sYt@ronjFf_JHTF znDLN~W9M7%`>}lO51$T(8+;fk(9@d18-K8&_KgqSEDZ@+_0^~qHTJUOUv%)VV%mXY zW9JJW|E0KK{obIE^OC7x#zjLVGT->CTg(L;cX_>y(>F~x5=d)NPPqV5bo%DLbkawF zQBHfjr>)TfcGjnY(_k8AIxtxoSTs-y9dbEG(D6H~pAXL|e^NYd_IjAvH~mp0RWJuE zWh-;JISdm_N2_uf^bbVuIik;XG8E>z#YaQ zGxU>YulkqpHk}r2^HN_Z80hy17Zj{}&9K$`Jc3^dksc@^HBf?6iw?DHe)ji~Bnn|K zq>%3G*ZqxJm_4D2sfLC4LHvZjuJl2(#qJ6h$QAIRW-M@*)?!~ihvss@{oDV%M|zR9 zRZk&wRQ&2+Jgt>2xdV;qq|xmxL0ZPXd;?Z@^?SGe$#-bgo<5lW#CCQ^YEV?SfX*!MuIYy4rI$)SY*gWr(6y}O8-;v z-Ed*?FZtiXyFAQnRrMj60)Bj!cOSq+!nzE=rw;JlX90W;32U|ixEM*3iSHokkaMJG z`z9n7*+U2Tj@)GSxqnf+$vLC+3A_NGm zn`l5I`N)t54-OP06a*9m94M5{0AA^wuP#t4Cl|-bk43kLp|~sTC^A}#6}XX|Q*}@S zpy~>FE~K>> z@iWNPv}h>?962&+`YD6}(!$oeBF!BH{7?%&)MV=2m?B5cDO)9~CL-2K7{LrnfD;=9 z@C5%=V!c|V$wh};h74uR|Ax1QD~j(o@2=hC7CCS+^P}_Y02Ux=ATcKxWyvN0-=6fD zMiM3bzxv;yx!Q?w7zA(ulG2~AB2j~w4g|ox9s6*5=_e8&{D~Fm9H%;0n)_dHm3iYL z!*AZzW82M2?xeiyk>U(FtjLjxhh)@TVL*1OkNPhSUtIo2fpN8S!=~ijuyTF*-IsmR zp7_I`$~C)(r3|9FB%ne}4gyCac9M=dM+yQ^wFa$0MdG@1!rR|;u4r<60cNy-;c5+r7!mm9PXkkWW>I8dFXwnEH zx>SNBYH=CH#`4l7uTCw>o*4Xa>*q|M%ae(Q3S4vFSpAy)*YNJ>8|gQRwd!QY+5!#o zaD9|BLPt=f1Txw}Fl%Wo19T|Y>X4B{FNwxEx<`Hbb4pqaKv?F{X(tnb=Ugz~qUI?b zcuGiZgd1D6ZV*{uDVk);JgT43{}kSV|BD|MnyriHPV~MV!0VB4$GkxS_-`b_@5eH} zUVoj5L_6oT7}xJ`E)fs+IKv-(Q@G^cen6?%kr<`7v(B$BP^6db4YSOXL990N_uM1l{Hx3W?w7HwBN? zU++eu8gT=Xl!;4_Ol{`^G<@$5y|$0MyK>oEKd0{X1Ft_#9J`8yWlDt_*-A)Cb5bj3 zSXoJ`yDbY4q!D6#nZ?-6AS}DmCSh!4+0RuXqyi14EsUIcqp}bnYap}{d=y&S&xFxw zU4La48oXBb4JUuX-q-cL=&s%WD=@t^tG*K5FTWDqum8loH27QpTGfK(4mB^*q3<~9 zYDivWL^{y?+zXfD>B=cwQQ>St5)lOPa1h;B0IMj4U|-8ZmhGd2wZ7 znlj(NmCHZ+BER^_AILHwVGfF@HX|Xb=aey?OC0^j^x>kpm3yQMq7UJPu@H49;ke2w1=v%Q1cZ9o}|E2 zMhjAcL5Z6`xkI?_IjbjAva-;A7z-~lXe>o2WgLW_lFcKvF=xIq7Tq03PsKq65(V~}mEAywvKi~0RL04(Zbbb&5;QU8)xB7B?zy2gn4jJz= z`HlwV<{FURypOY$ko6oA7BNFhX=5drm=zNt6>6D8&F0pPMF5x}Y@O|inT4G_v3v&L zL7-7If+)+z7VKuZ)qM57PdL?ko|HSEd=i*g=X)SL0N}4M4-WN%!EZ8QjYkh9Z z2!SM%J`W%VAdTcgx%HPs5)BOjL;wN+8&VomyFn=6*m(~gXWa7IxMBF4TKw@}@wts>>9tXZg0cXj zx>IR(Nkm#k=t@)b9IFf~CSpfhnFLSf9!w-hv&)5Lc#*-8Oo1&J892y^Mu1WP*X-kZ zoBm$>nEj4^L~Jp=5|6<-gpGV1NiNma!``Vmz;6p-%>;`iqG zWWSuwR^Q}bn<~Y-q=^GGjRaUQRFx8=O?fy4*t!`+c6#SAk0$NqM_bzi605p<i(Vl@h?3fmvj%PPp@qWZuj6V44Hg;3^g|#13?gBBk#DFnbR-hVT&{-^rBMeFDvswe5U_~&xFT&lpDYCME8hxO>< zZ0sdq1*upO*CV#p(I&>+xfaHO5x6pnln}zgk(Na&)Q6PPzyK5oIZDB$27p{>9*Q5( zo9vJDlejg0T5d31u;B6PDbIynNOCRz7r?-w9n<{ax1F$#1Rq8+y?oWA<<1{gzls8v zgLkK1?bSrDD7Yoa8G?_LM3jNai4D^Pv6%?q44tucpZm4H{)z2s$s1x|(a^98r4T`; z5%1p>qoYFx-)R$W#;|OO$8?yEDG&)*Ht4PFLdI!yUb6B}`IOen;`_V47d$)sh{Q|| z-pH!zj;GZ7@s#~I{W!kCIWzt}=TyE{ohsVoLIqfg>antcMveSNS8Vv(c~eFaGetYaF-3G2XkHGl>r9fHQgc~9*ox!LrDU&y@OO>su{ z*q&*%yY>fyo_qX^hPiti8{ldyT8FCw1Po@f&`Kl@R0DNmw-#%vBKl&dG}}|;E(sZm z=P4295FtpQs*9+^Bh;E&7 zM6Qls>YRZq)mmzk3nd^0xP+1|BY-|6>q|hRr!_+Z`IKm=M3BaEI*1MC<(^M^s2hq*c`YjY_3z8=8m z0sH{7Se!i9I8Ip4jTa-yIk{rea`B(hz1|bHEBapgPwYaq(izr!5g-PAzNb}OC&m$KuDTC6r(|uq9M_dS?RuF z%?IqZ!ee?v|6S3p;!~m=4bP-T3jk`L9l^KldVD)xZyPBUU*nw2XUk=Dsa$Q(Rm)V4 zvI39YrO0gdndpmMb)mJiG38fbqk*gU7GH4e~ zb#elOYdma=<~IF^eZ=gRTWz1cQ*X9=?XW^UVfqj^yctOe+_#aWC;Z0YIAI+eu0)b~ zf9<5@;z7N`Usd{0{9mcp1+Vj7;(&{?*Y*Ptb0SS6ka)>@d_r3U_r1Hdxv(hoO|4Qt zl_9q^W@`3PB$PkvOU4dG7NUzuerl`!2@WIx*H)J-NzsZ1M>RK~z0aBxYgrRxA0E|P=}FTS-)o+w9d=M|GW&Rd z%cIl0!@+hW4)h-Ycw&|g=cwU0VI4fKL!wUcmdPIk96PVCewF?&ULSov^#-v-o!|zh zhlaUw#Mahy7)?4HZ~@1XylB|UQz{()qDh3eHwn4ZC)KE#@^uZ0V}-bwEgb2g!E1wn zup0;O(;NEl;%A2+%`oiYj74Iwv&rnkCbJLUj~_DtxKlKmi{vV^LbTFik+-MFMfMc2 zP&HAC8bl)iPXa#T6(?A`ypeRe5zBWJ)G2*NL1v&J0gSg+r$2*Kr(j0%c=E}C3z_uS zB#9&lEddCC1c1oEQ~)U6R@@#|zq5^pH*J>j_U-)2eGgzgc9`CB%|S9v9*x8t4%P$s zDUy!t4??aONH7y*H;oo}K^1HnkDNnSjs_j8>oS5BQzz~o#KsILX z^C-H#N$~xRLT>j-DF!vi4EHFdL2%tMo^cwHb(>L&2KA1SC(VYwyRc*AiT#qoGh;K7 ze7d&7+I;fTEtH`S(MT&rn?8dUigl5)-+JlA@og_UE2Gj4eD!}$v2S)SmA+_mV%v`) zE@A(3dG=ueG#VhK8G|mx>l*|=mL+V+5ET?To&|D-;oG?-uThfnRTfz%4-0F%OIzZt z!;jGBp$B+4=slPlwF=<90R96&21(u86-X@IBTYTvaeo;Aq?E{7C+wuW?GOzq387Qu zA_G?m2uWZIA`9la;xj0Mjw^^v#99Tcv6qJ{gIrEkIaa(sbDhThovjPcND?_8KvE*} z3mlsiKG1I0PX=Wa#Z)| zDB(C^9XVc(BrES4qoG&jVqkf1Sq4x6%=g|Rm5{fUJ^i~1{}*A3bMO> z=*?*%dR<_TM`o`_vMeDgf&>91IWc{tO`?*L0X0KaA2Hy|6nvG1D}02uX8WtV^v;o| z&|Th&9V1VYvGKu@lmYOs0R9e#mbADSNjtiekPz5Kn5P2fIYNZQa@v5TAHu^()O(K= zSL9K}al)D%q><#b{J}wd*PJdF>({#H(IxT(oTpZiphgEALvslwt|2;L|CPgsWFTt+ z&m@_wWktHj1qL0myF9{x16h&8WeKVY;!uDBLR3~zn#gq_ktGkUl!Xt+R!MVTxX<=i zcVnQs*X|g30{bf4B(pt~kb4Qqx%(t$$7;wUsVlt{z-a)MAn5|Na2D1*n;1gUNoFsS z&NAzfkkfWxq8`$5?8kA!nq8a#;NJmUbr9cWB;;kTP;2Fxa*4TIt)|7IU4k+KtO*Da zaexwsu&}fKh*b=vE#O%OF*xaLBRCR(ke={`Zy}v(s9Yxy?DX4mxRZzChs+KR(GuMPmMNQi7DfELW&{SYJ3iP{dJ zAIX%iufA*mz$PS9yx$4G(`@26Va*Mmha{4C@ge+1XUO9-=_euQM|cPxoTI!MSXTYshMuLdMj{S@|} zAd946K0@MSD*~t>DV(p?mz9uMP{*fnvy9_}HMdxcq_M~EAL8#uqgUKanfPqER4f#E zxm>h_r^-_54~GOvmHd|KPj4mw0&Go)*hDZYVuLCoTjdBN zT;nnVvBwsor%gBaamnkkMf0THYxdcZ(dz!u>D}RumtO+-PXIr}{8&@R@mq@Hgf&0N z0(cvMHzM(`9401Q?PI58VrMHC0Doe(ib zxMr(}WXO871TV>doSleUHxftjO-L-NU>4SS9LI4SM*(X9{3DXqX#899GDxCYpF}bp zK91v<6CAg&jxLrVX&`$AfHROdgMSmS7m4HeNhB@c9zx=`IgaC)QyeF(V+&^?u~04s za1N4?{G4`w3B7MRiu-gNzr#3ASjRSUNJwiP5&~O@q+3uc60Q0? z63OR74UdodtV&4g&vlEvw0yh^r;@00000NkvXX Hu0mjfBj~Xy literal 0 HcmV?d00001 diff --git a/Raspberry_Pi_NFC_Movie_Player/movies.csv b/Raspberry_Pi_NFC_Movie_Player/movies.csv new file mode 100644 index 000000000..5a1bcbe00 --- /dev/null +++ b/Raspberry_Pi_NFC_Movie_Player/movies.csv @@ -0,0 +1 @@ +uid,movie diff --git a/Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py b/Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py new file mode 100644 index 000000000..d2352aad2 --- /dev/null +++ b/Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py @@ -0,0 +1,125 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import subprocess +import csv +from datetime import datetime +import os +import tkinter as tk +from PIL import Image, ImageTk +import board +import busio +from digitalio import DigitalInOut +from adafruit_pn532.spi import PN532_SPI + +# ---- Update these file paths for your raspberry pi! ---- +home_path = "/home/YOUR-USERNAME" +image_path = f"{home_path}/Pictures/blinka.png" +movie_path = f"{home_path}/Videos" +csv_file = "movies.csv" +# ---- + +if not os.path.isfile(csv_file): + with open(csv_file, mode='w', newline='') as f: + writer = csv.writer(f) + writer.writerow(['uid', 'movie']) + +root = tk.Tk() +root.attributes("-fullscreen", True) +root.configure(background="black") +screen_width = root.winfo_screenwidth() +screen_height = root.winfo_screenheight() +root.geometry(f"{screen_width}x{screen_height}+0+0") + +def toggle_fullscreen(): + root.attributes("-fullscreen", not root.attributes("-fullscreen")) + +def exit_fullscreen(): + root.destroy() + +root.bind("", toggle_fullscreen) +root.bind("", exit_fullscreen) + +image = Image.open(image_path) +photo = ImageTk.PhotoImage(image) + +image_label = tk.Label(root, image=photo, bg="black") +image_label.place(x=0, y=0) + +info_label = tk.Label(root, text = "00:00: AM", font=("Helvetica", 68), fg="white", bg="black") +info_label.place(x=1870, y = 1030, anchor="se") + +x_pos, y_pos = 100, 100 +x_speed, y_speed = 1, 1 + +spi = busio.SPI(board.SCK, board.MOSI, board.MISO) +cs_pin = DigitalInOut(board.D24) +pn532 = PN532_SPI(spi, cs_pin, debug=False) + +ic, ver, rev, support = pn532.firmware_version +print("Found PN532 with firmware version: {0}.{1}".format(ver, rev)) + +# Configure PN532 to communicate with MiFare cards +pn532.SAM_configuration() + +print("Waiting for RFID/NFC card...") + +now_playing = False +# pylint: disable=global-statement +def move(): + global x_pos, y_pos, x_speed, y_speed + x_pos += x_speed + y_pos += y_speed + if x_pos + photo.width() >= root.winfo_screenwidth() or x_pos <= 0: + x_speed = -x_speed + if y_pos + photo.height() >= root.winfo_screenheight() or y_pos <= 0: + y_speed = -y_speed + image_label.place(x=x_pos, y=y_pos) + root.after(30, move) + +def get_movie(uid): + with open(f"{home_path}/{csv_file}", "r") as file: + reader = csv.DictReader(file) + for row in reader: + if row["uid"] == uid: + return row["movie"] + return None + +def read_card(): + global now_playing + uid = pn532.read_passive_target(timeout=0.05) + # Try again if no card is available. + if uid is not None: + print("Found card with UID:", [hex(i) for i in uid]) + title = str([hex(i) for i in uid]) + movie_name = get_movie(title) + if movie_path: + video = f"{movie_path}/{movie_name}.mp4" + subprocess.run(["sudo", "-u", "adafruit", "vlc", "--fullscreen", video], check=False) + now_playing = True + else: + current_time = datetime.now().strftime("%I:%M %p") + info_label.config(text=f"{current_time}") + root.after(2000, read_card) + +def vlc_check(): + global now_playing + try: + result = subprocess.check_output(["pgrep", "-x", "vlc"]) + if result: + return True + else: + return False + except subprocess.CalledProcessError: + now_playing = False + return False + root.after(5000, vlc_check) + +if not now_playing: + move() + read_card() +if now_playing: + vlc_check() + +root.mainloop() diff --git a/Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt b/Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt new file mode 100644 index 000000000..c1cdbfa98 --- /dev/null +++ b/Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt @@ -0,0 +1,13 @@ +[Unit] +Description=NFC Media Player +After=x-session-manager.service + +[Service] +User=USERNAME +Environment=DISPLAY=:0 +Environment=XAUTHORITY=/home/USERNAME/.Xauthority +ExecStartPre=/bin/sleep 10 +ExecStart=sudo /home/USERNAME/blinka/bin/python /home/USERNAME/nfc_movie_player.py + +[Install] +WantedBy=default.target