From 0061cb0878570dd91c9d735f0ee84519182e3a47 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Thu, 27 Feb 2025 23:45:56 +0300 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=81=20init?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .clang-format | 9 +++++++++ .editorconfig | 16 ++++++++++++++++ .gitignore | 2 ++ README.md | 6 ++++++ assets/image.png | Bin 0 -> 46996 bytes build.sh | 9 +++++++++ src/colors.h | 24 ++++++++++++++++++++++++ src/nv-info.c | 41 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 107 insertions(+) create mode 100644 .clang-format create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 README.md create mode 100644 assets/image.png create mode 100755 build.sh create mode 100644 src/colors.h create mode 100644 src/nv-info.c diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..d7f0a70 --- /dev/null +++ b/.clang-format @@ -0,0 +1,9 @@ +Language: Cpp +BasedOnStyle: LLVM +IndentWidth: 2 +ColumnLimit: 132 +SortIncludes: true +AlignAfterOpenBracket: DontAlign +AllowShortIfStatementsOnASingleLine: AllIfsAndElse +AllowShortLoopsOnASingleLine: true +# AllowShortNamespacesOnASingleLine: true diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..b256162 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# EditorConfig is awesome: https://EditorConfig.org +root = true + +# for all files +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# C +[{*.c,*.h}] +indent_style = space +indent_size = 2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b9bdd6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# binary +nv-info diff --git a/README.md b/README.md new file mode 100644 index 0000000..b793e3e --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +--- +gitea: none +include_toc: true +--- + +![Screenshot](./assets/image.png) diff --git a/assets/image.png b/assets/image.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd16fd66c26ed6702bfad4fade4cdb080997122 GIT binary patch literal 46996 zcmd41cQoAJ6F)485+OlEZ;>d`t=^V2(Mdw|PKdfnbc;lZPKsWGDA9u@mK9~KUZN~k z@2pjKm0jhx`Fzjsoaa1$J%2v$bCz}8nfKh8xpQALcVb@Zs@=ZDdW(dF42V#l8C_U6oyh%vzbp88WOA)%mMjWJmuWJ0>73An-XX9#2A}K3t zQh892RneM=mAWAH*mj^zJ2=I-lc?_?w5 z=6ZiQ?Av`Ukh?d?^{t8lBT>BjBpT1382DT6%=!7VPy9YT*sExEHTl9j{blVzKV(+O z+AdzlTb7sfCMEaz-MfqP_wHU7SY4lA<>Oxa5<&X6>Dm{qca%k80C#3PHuIYHR;D** zgWHD4-Sf-jZe@i`lR-_W;4vW}H()*cq(u^{SUwRTtq8r&9YOo_=Kr@Jb2gjT=p?)< zB59YG?YFPdDM)1aCb6p!i9aMiD9N&4#_1&{(LRmN<%!hc7sbV#y$(Gm^2VoW!D@bg z(e&Q@HGBZBkZ}S>OfcQ1YU8E=J9R4 zoI}3E7!l{*EPlzr`h5nZj!n~0G(M3uCQuf`{PTz_em~B{e`-BfVvXTn#p8=uDhNy! z7flmmjmQj`Z)gPVgDLz>7i#Q;-?)+Zj|gq6oRQ|Bwq|H6+uZMjU00z9+JX}w$B%nM z5O<#wnPw=s2MedHS3D_GMB(W-Lv9TE-L1GFO5nk7Oz)ddpp;su+}&wZL`7*^Wims( zt(xm9hcK|&^(WT9=ZK4W7(siXs;2|{Fq?=nZwzpM?`SnQEwhR5c#g~=jO4hz$-$J= zd3vPTQSuPi^?ZT8$9|Wuu`YY4dv1Fuq`A&*1ba+6GlAOM_7w~z?8}nRaWOr;>FJ4f z{jxXI)COp5ZceIlXOe1_Z}(k;Kz}9lEgb9G>3Z&~Oft03=lwGQo1HT zdwnub#?0v78o4(Lp^UR3w+(0W9z*{3{!KCo4T>)=o-=&Lp0drq+>9WUvGeJVZnO?Q zJ`&MIk=<>KlRrp9gS6LV^oZgPdni63^dHF<*Y!8VJy|>$B5k(FKYKDdM*lXyk?EbX z9LSEzkFCxw&5^0@l&!9*m+tA!(K>~!{EGxs!ZdtmYVCKz2XEr*8!4sQP=Q_r)L6*% zK?;H!HhrFgkghvCO0ec4Qc@X+pYTS|rWIK0HR%%S;?RIr5JFTfX$xGF!$*7QGyZ?@BOH;C$xDn{U7Z~@VO?jx_$7ihj04jw2-+zPntHXt&;7-|~y%R-8L z&lbKh?RWq82w=g=ic4R9O}^m`aqcrj`uquhviTdMM*64Gaj%T{#vV709^Js0W#3{b zfecw$I$jKse&JGg|MOJ7m+Tj)@wab)u4lvrdy)%M|`+WieEn zxaokQUw@9JTg-}*ACrBw(EhP;Ru9u0_K7vwImALN7GkoLWaTaH?!*jZE}JtQjqYvA zFRJJbBfTeDhP-f)w&2!1&_HFCD{)h%HCJi>#LMWCh2>Hlt43OAV^EcI>)UQ|SxT*Y zJW~NxWI@Z`btiO`i-w$VD7x%GT*R{?&FU@&)?HlMqWF&$bb|I>su~y z-@BAd%|VKlxb!y9l(8nFJrNgMeKN!yUc1#-v{j!l_8gQ3lC7%B>BgDIwXrw4q>N$8 zv9KKLHBz2*`s^$)S>{S{<#Em=<1>?S7`&=-18M?wDhK3@rR%ewCsA^D{TNyx-IiLv zM?s)m5G^Lo9688j1iLlh{PSJnU<*Stx*t$J9Dw^Mu{V1Q|1F3$DsD!cZ39DI|xuGdKoMuhSXK%^~GW1Pu( zg8Y9AA4N4wEa6ez?gOIan3X`A@1R12&JQBR-%9G%R|?i{||p&18$Pw>FDB7=mkr^`UWu2!2!Yh{&4;H=ZEh9AO$vYQ7vt$d!K zs59wH51TPU;(hV9@Ci?7qX!nQGfQ+?@T{{L*vGB5-xEbVLFnYb4{%67)-mt#rgUFYY0#`HpRD1;6~Q1cJdk zYjfNn?8S~E1I^a>D9)3%uJZ6>k zfLaCJl>k|QPi;50PRy4qDc7zNbL@D)bcCEdW1}bT_uMuOBMx*0=AJ$i6wumK8@Gk5 zKQ+U;O{8-+GD=r9iV)2{iSi{z)8%WF6D(;%eELug6Du>UITY5`WbwfkKK|hO+@};f z9OiK6*rkyRsP;Ckyip`4A>4ab_x^9M`g-M8PqLR7#7 zA7Gncty$N*1Q1n8I#mq%CoYu}M5m0KPLQu*LD)(*(x0_}ReLK#ZDG zIS5mVN_X?j`(k%ti9E4cE2{vTy2a_gvcn)|x)Wh~p})Du*dpUNpuIDHO|(HMk-(+z zh#I_p@gRPCpRThShpI`5DF%q1(WHSg^aYm0PyTK+j}Lu0tBu=b&o9!v2yTy z-gl$q(CZ_1Z1FOjf4mVT%HH=? z+V20XEh}>~CLTkZ;L*|1A{s3he@qG!-&iek?Y!pSxVumpnE*p=4t+akGb^;4;)m7d zyTugduj8%(cax-d>mi#2BcwZ1t4D1tW9wdqgxh4ee@E5N%JOIbSZbM?nu@o=YPyI| zL5E~kgUvJaGeWv@)ydM+0e5PJM8!3q7dc;{0}6zZuL{skd{bb4b}lu}dP*d4^lovN zQl}bq8?3gL?%(>woL$`|{;I{BY7*oJGdpqex_MlcfE-pN5u{Yr9VBn{cEGou%)l{s zV5$kIwX)hFMw&$@qM=e;OoFLRtUoKSWa1@mFTK`65v;u&9h zq*lJ)yyyZkLemt_*{&JueZxm=>(ykgT%$h2CKEv?OqBR=ehSduGD{09wKKHJlbnDj z5)bZmz5KJB?Xsk2Xg_nHhc5uQkQg$8rIb(A2gGqgaHG4eE&IztflUh;%5H*e z$Vz7>=usl-pQAEor%#EBcJZp`A+P~MnaE0*zFCs|C<05wt(@ubaj(3a!7F;WKy&CjU`ar=2=4 zhk7p{_x?1R)63wssiuZg8RzcFKgC$&wS*JePVcWVFyL!w(^!2h!>Jr~DjIxzBOwj* z5XJC>2?k8w7YDq`!lG@tO=qeMEKls~h0q1FL%b90K{;O!Kwe_Th zm|>vW|qlzh?qWOmT4asH{cE42&K?GGAfDm%7R z86R}D;AjkUr3_zQF8%p)c|%XBH!%k~v{4?i-@5nZ>(~CB=`=~t4u4He&48VfByY^e zaudjVfDI>2b+tKMzb(jgL8_=KQ}L5n=)pDEY09TZqN4I#R<*8_C$nItXP=5*8ki4& zLay3cPA+BsTph^heAS@m-%qFxO|j|xD=t3O45nDPT1vW>uH^K926)Q*B55ceR+VdX zb)c6Uy7X4NZe?%n+p0b1#d@c9mP}++6#3=hvd}qhq7Cizlr#%}oUA}&3gR*WG~_?& ze-p>HY1~x`V%l<>!E;#M0~R&jVp80GQg2LQnpEZng*BHlNtl4kJ!)sJ)yAeFLJuF3 zzz#P3IQVfdsc_Pwx{evbtpSiS6%&X(UD5^CGvxS)UtL3E{VErniBVKuY^_9{4K>2r zD>5Xfa5m^#3*x+T!)ke}9%J{WT~p_jCU*$jT?zCDt)|;;^$swlQdy5OO^EbM0H})H9ATG+=w$UqUHSK(Sf{?`H)fDxhm{%#lLwku1 zrNJc=Z*_I(I6j`e!bRNl=NL22tF5G|#w(JfV1f#>jBtX=)xpW?>Z$_cr>CSbbJ=gf z%{_t=6{;%Gg5k6gPi-;vaSVYJdV}^6nq+IdsTrc^p#U7Vh2uQK6CEwbRe_zhjW<=s z>$JCVK5^aG`)9!w<_(!+CBvIe8<_dJG@@cj<`_6KL|B`dd+)AA4<=xV!;Q(;zCR=I%fdn19xLSia;4QScL zqq82dM~iE1u)aZAQI$3;t?ts#+S%f{C0D2H%6Um2KaRCP&wy1>2#z|5mb+-!O4mC_ zdBX(!tzqIAX(Yc^<^pxgS+-bSkJlP;A0R71{o<^jdoqR?hh38XbhH|m6uVZ-w*ykb zTjcvK2;Ra{YZ_TNgFcg)mHA>cyuBrtmMX>CWaoq99546TLhz^b=6;y#iFtAwzPh^5 z;IP#q`{SKCq^O~}ZK#fxzrS1_bi=(W+ndbB#^(9+=ZgpRm!*1nGAaM4Nq+wPY238q zKr)moqSyx3(xQ@Q?r`*7hJTt_V`5|g`0qzj`CV}Aab2u>Dti(TX9qNGYCb-<^_0%o{zctnNMnvc zWF(x2kFP%N8V^7Jjs26hR)1wiI=Xg(8_0-~?&)Oq+Z-~$@BQP?f!$<3Do=psr#znn z4ZBUvup#0mCmL(pkn=0XZ5I3opV(>m1ulmX8aplxt)sr2*ZiGs4Da8|4Za>mlz2q- z!auxs!#f0+D;E&^am+DYWlu0wxcLK7aawxU@+&HK&Lf;O)T2Sj#^B>zJ;|%>^3(0k zg`$FjF9V}2E$3+}*J}J0LQo%(j*w87pF-Kk9Hqs@e7E9a{qY$p0H3~lFv6znFw?-> zw{MH?aQqbwH8vF_`s&ch1qUc^7$FoIl+Xsl`?;Ie#xI<2GtJgu`TF{W(q&Kje18*> z38t#D_FGEI*x%)~Vl$N|-rjY}!p|R-MaEgaFFnc*Y>iVGE<4kO-_q2cn>>r02*0k3 z8oBLGMG73={eyxNbDB-nSWZ8%=PuSs-<9ef&b5p9<(tS;(8i?BHIccu7m>oMS{{|e zZNp|H{C0a>pkkrs6&Lwpj!xEZC%D9m1ojVzm8B?j)!X;okASzs+GAo?SJz*?dKF{C zJlkZOk^5KdG*}r%Xyp>tQY3Dq9yD{L&7`>x;Hs`mw4~K}| zm=S_*+-29cUW*VB*eIP>?oC-nG|-PMIv3;ximw5n+rRSJ~Yd>oNIG7ZA3MS|0d+C9vUI@lQSJ&6jSu>{1{@f~8 zTXw|I^Ydry7{`kf*Gn?<8fpd*=cog zOX%uMkTdCt%`3pag9s%l^_2AU-1I#cPD#`Zo`oT0qH!`Xu_1@Uhb^ZK^HDSOv9ChE zCo7UBan9627@tAsQ(G>IgXgdCf2x2r+yV7dQFQD!Z_GE+aLLF1%TkPVhyf}sH*{CQ zl!~buVhr#ZP;&t+=`&W}turf+!(Y}aJHXE?ef}#LJ|=NwyI#cjK(M3T9!IneEN`Ru@|dfEQM<6EvB5y``8;Ljl`mw!k^3B zdq6b|N`y%AJT!mk?d7@x(0z161L)o`(KK&p=X;U7J*a_NxY3{}r%Pd?GKDWt{t$@T zCf4a_FFsh-Zyx1XR>%z|IS)7!3q){%dAp}XJVnvPC5_m12#vnv z{D+huq>sz%Ts@q1f7LijPyp_Z`xbz>?gHhV$|(kjP~C~`VzE4q7-GTDAO5L@ z1JCX#i`?=|u^B_!d2l<(5=)Ms;xEGjGv{vjDcszq|E`Z1XLoS}>K0bItr@%h2j**p zUhb?*0M+u?aHrOfcwB0u?+JcnMY=SMf%um$+5_# ztvf+?97X*z_jKL75livT?>??UlS6Xzl=NrG-|=(`)3zy!d>aq)3A>H4Y&mwTfqck& zI_F%xVEh;JpY!0D?M_9k&1g(dv^qI;JgbV{a^X?dETvIVa+ah*cqCe%J7{VW^&&BT5ZQ>==l!$26-QJQ5%x|`j0 ziz9qwGD^Y$UI{a;DGdnZF6`dve%77Y5?)!CVZ~uYlRbe%879s&ZlcNoLhgPL_{)_W zb)txLAyqAqB;aP2AAdOC(CDWKEfEosbY)ytb0jSj9r*I~h5}SxFQNRmv$>legjldp zVB1TDVI4CrALrajy(E1PDRnd)hsOqxkpG}wnibnEYA!BzQ^%&BJ_%=5I&=O>gMQdi z$q1sN%T)&oM{Hh=%MWaqdx8_kn51{tT{ZLQe@cq#?%aWJKmkxU9RHKyQDPkf+}}eI zEpMc40S238ZtD2>_;gJ&qHX9%#*mJo8#lR|)pGtNDF56Nr6B8B;+sVIc4>KUaWnhy z9FEB)Eyvue3+lfaR$5F-MJWP%<9j16yei4erPa-2X&~;OS96^zj(vP)Wr2ccPb!r7CvC@QK@11kifg+>0jyBD+Xc&K1k zGK!%M*>WU$w`4Dtbqtlg$X*3Hm$FdK;>Q_ff*oau!rbm0_FFt7U#&J>g0|nebR{ZD_$QIc4H%mAk~LcQ3Ie%&DoxGyq|d1gOeInX=>=>kUNB>W8cK z>9%Sc!Y3}zcUQW;up>Ro^9fnw&vcWSw*U$KZp-pVWVmbxESe@*MYIAlr0H~&t{$Zr? z=!A63vvp3gC7|LA1H!%IXO%l2F4;scz#TIA*koMo50)b<%uZw+Z&7`iEP%)2B9k_w zeuylo4WB2!U4r_bU4;x??e>=x@P0X6m6E8lm9v;RPN@}h3}bBRB=(?NN*IW_bWuUw_QJ(C2_=y*C=8I%Q&W0DXSsk9iiWsqp? zlZ;1Q655PM4_U8{W5f>X(&ily9}3wOf92)uRjyPIw+`jbK#)eO(&xj8IZD5UGixaG zR^TZM8#7JRuzlnlJFq@Wnns6vYQvJKL5GQ-6BWj_@k?7HBO!_Eaf+y_|mf|v;t^BgPaqmp7e-AHacviKccy%Gr z?VmZ-=qwUY$XMsP97%7I`yKf!*ziV{q5JpO)$*N)qe!dE2t8i+HHwqjzQ20lEGCy! z&xOCFBCpm8n|JP^t`6-kF<)i9FgjK%Yu;3+$BiKFxxG4;AuOS-y&+(De@zjzcC0p^ zzq?(1L`VziMr>QHWce+0>zrJDSg}(<(ClTY8np?}3tFa%SPcC75l7G+y&jQ3uxu&& zzr6s)18&~hGMAS$JEec~s2%4YhA!_ahQjBg%yWNx^R4g?+HcWQ>~F_Bv1SmHoqPX~ z_$jt94RU*2cDQ$ohR7?Jm;zVRLiUQ3yT((~mbbX?!nY7D$TRH^4!Ub3;uzNjH={zGxYaWBAGTU3XV?Zv@9&>=RcYs4(BO|JC%aMden{b9{jRv z1=a@+DulsshM#T1oR;6{Lj0*N+dKVS`4n848!xbF!n`-bYI;=uNi*_W|e`j62#eyxfK_cS5$a-UB3pR2Yo|UHs1LXCZjJ_Q4 zC9nAX<(xi+c5-04JHHKf-PTVh&Sx<0p4iiyk;Ol(0o}6EcYyob|-n z8GU9=Q5Szl?0msM2hUja?7EKz5ra2o-$~XtFWD$X$v0HOn(uJdMV%PA7i{%G&-!ln z?wFqWLK{;JL7?LUTRqRWMf_>gji$$ zvrx@h0)Wa73m`S}&$w64vziH5+xEQ2huK~^xwNg7${#L|k#BKaFnBXwLtE=SOm<$x zJ0!e%i&ii60(#!Mq!4nt%;tJZpr1`^{=lUY)U#B{%LNB1wd*a!tjup1)p_Dn&W_Te zYL5}ao_|8ZIoCk8IN8as+cZj@OuOf-!<=j#vDGR=aaX5IH5wFA7s>*C1L!)Tbz-!96X z`BpWWIFje86sIBSL_=o*?8wD{SF;;o4u7cXAGrt>cefI+ul_c=5J>c$%;IoNUngWP zy52YsxUEywgDweHg> zC!42?eJ%crnETg5@DwW@I9lM9i8^;H^qQI1xc_@@Qa_T4^!QJ<7t~7}=Z1y-Lw9+` z-s#GXTY&OCsl93Vb%uB_X%Rma)6MxC^+CVJVRK)LPKfdRUlLROnu?*J@-HFv@rv&C zL7LcHQS<9-$N8uIV~FfqZ2wE9vf9Se+vJCcDG|C3AGl z_|oe?@~**_3F3@M=eBEGn9yI$@!^XOT<*E=MiB$q^3P}}iG5G&pep^9%R_w2yr}ud z-a-1M^oI+XsK%ZnqI{UabQ=O9d!@zUVX}E#Lqa*I0YeG?;jz`%Zm^Y7#5U>1O0x7h zd?tz5Ek22zNMRYe1?IKC~udlaJsieUalg+cIocV z8;r5we^gB2AxDT1tAO$z-A8u{V8hnCW<+f60T)-IX8H2e*7gAj@uuNh>Nnd=Ws$K| z1wS%7PRY$@$eQ=XV!58R^zr=N8jnuqbU4WeTa(N}u;8kkw3)QMQlg>KlsLl&21a@K zONez5bvwI<0=)wE4vF0>o)=m3J_TIu%JL%*@rNu-IU&V7^%S#Thw7_U2EG~4r1Qa2 z16liqUIuzle3Hc!v{doOj@?{F#M?Z6fA4dKQ$(B9^SWFwKyQc_*~ z&e5z<$e+w#xpLh^FR5Fmr;mw=`O)0G9b8ddocSbtIYv*rsG!2Um$CWMpvf3(tGY*# zRvq2qcl?^36OljAOWk%U8l}h9KdI94G~`Vw|Ky8XhRU6Zv-U$6l%FS~2s4kx)f-O2 zxqXMJbE%UQpb*PWY=7{l)>SX6s?w#=H?l%3MzntyG#~#hQ6GBx$v9Nld}q_q_G5R2 zQpYH+TmX0d#l7(AGbLnY`XGZWXTj=^R;j2aUqHF8hgUx(F!+^|;B@Ctl~y>xjOL5i z@Lqs@Rqj6%B~48k|12-ZiO;7pE-!z?Pq1&#`j0jl6AK=eJ)|2Nl57GC=d7Pfz;P^J zH^hS%m31f6!=9{0|JJsGgwYj#iILitPlF~s1hw|YoClJ`kHdw*?^rz5td?;qn3k9O z%m?wUd(Z(+@65R*mENT~<#?NZFwi(b{9u;U#jfLqtiFMpM?D-M=5S`%G3n_}!2SZ?{c6?AL!xlNi^HHlG% zTuAZvX%Bp9UClM=h#x2`g6}*)G{10IB#m;6Sm{UUgqWZvR;3a0uz8*t61z=mK0UqK zw)vn%dxy{i%Wi7-qQf5dL&`V-+2wG@MWX)#keC&x_5Ld|kl>zjOH(UTWUR7^zUUGorpJswbr_BL1XC}R+P zvRDXdxjx4H^u0ML?NE(NHNU)4-i4kr{DWkrQ33lDm|hF^o@2$4W@B|bSldeAEa)f$ zVk^A0QqVJvB4K|1R)?FnAo4GeQ0kU-GMGuvZnZ$Xm2%X)wNmn9WVV#)4k!6=Tg*Ta zqvm|@mxQd?{p-vw@*%j_uj6DqA!PUa<}Mz_pB|WWvEE*7#S6_ZR4-Vnt#A2F;cagd zD_r(z&G?)DH90~{slENu5A1H!*Oh(zl2d-> zF`+A%g{>s^$wue$5^v?>pA)2lMXp)kei$g=>)Zlet)}#5LWIPF)aX^6;trOp_K^-lf-)%$jVOGUT8g6#^;vm(C zGD(mBtt(@vsMVjQa^>DPK9LocX0%f#+(eIg&{O0=sZQ!?6r3%v^1w+M7T0o%e&9i@ zt|4HnPdlosdbz8rPR>RjHpZ+y867`estFtf|4&aB!~{t<|YcplvZ z3YaU{@Mv3~7yKxSyv-wOcXx{=#{VZx&5@Pjy9?`=lDvBrJfOcNEIu0#c`SXyI?lZ^ zqj>~})Owp!Rt+CX1`a;)(vy*N+#Vd*r_Mi{av!QEFj~?aj4?@gy+g05b&tI7xc%=> zN$KLdV-*GO(7u{3V1t$ua{iKq{-*L>M|f%Yz3fND?PzW#nL9_TrpG%1o$tX{N?pSj zr21+BW#wgsKgc@Bc|I#S3EoI}F_b;9=K+DMw|yvAZjJVr%!{^CZf{>6(ke()qHcAS zr;@NEq3M)-0O*L4Jb@@imx~`Tg!W`*>5ZQK=pee6DB0_#_uXInde~B}1KFG^9u;}? zlP9)7bN+50rFGgGhIBzne#!@R;_P*^pF22E+q|F}lqMSoNj?@aAMnne_l{4c)Q>4l zoNfK&R^XH=-uWVaG^Q+R- z2_zF*UxzabaxFq2z~&Cvgwv&3otNoNZ_kPz}DHuE`=$H*vRapAyc&us$4`l3)bL&O@GU7 zOooFoZU%`EcDLi`L45zma1^Az^xz*F3VC+xUqpP0WqaL3#2B;%3&|b-3W2m2QTIfN zhKSgdE%G3CG;=?1F zvEiSgr+53#!zdFPbHwcoavv_ta#HoZF;d#x?m?BN_}Y@=18m({mwBl4706SH;tG4m zCD9*+dEnKj&3UTLx>i2F_G9q2{VXgQ<)CI;-+x`aZ01*jqhadG5%uzR^`N8s&uhgo z)juMe51kKb*6X~FoMO=f5I3cG-#QguRv_Aovq>^VJyZU$gWPZz^y%#N;>Aj1cTKyul+f@;P(aJ=P>vUoAWuX-vOD=Fzzzm`@`q}bPWM`?6iG^>c&D| z8X2k{53RUPd!>3S-^@~oquAqo;g8^Ne1q~dF_Vvi!oH|3_gR}_FzOJD&F=C@mKtq%YFjF zdR-n5{C=)S_TKlzZoRAqVJ&~X|K>L=fg)SpQl^SPq}r?+OBtgF~M%K z7r)_L`n`}-^kAe!4@>pB=~PlYMfGIR{_szrmr7r8*VmqijFqMU<9k>BUR={Yc=C38 zT18K}j9NJRmWLwW8e;f$!=tZDcH~R)ufJdfw;*zH+u#RF1g$O2EnA*Dc4rro=~7cg3f1Z16zGFH+Sar6pUus<5P{u> zWb&v#(yd};Sp*30cI*7@JukQJkYj@xoph9Pc+KejB1jIpMGL(lXc|`I?=TC9>+e}g z312fnucSVJdq3#yjg0MpSNG3>PB=22iU`o4)s;gCK{1@Nh>a>ryKgmg9y!gZh?N4ItzA;mp!+3J8 zr36&W8?$(LI#aWECHse`K1}(ha2ZUx-z-&-;lJU^s6)B2^NCC6QuyZEFmtkoF0ZTSUg?5`X6=etXxac{Y$N+(co|ib!{3|TcOKb?hLym8 zov)c0Hr56XUVA+dJkZhMdpME5_}*Io1HhkotXpky5ZHx35k3EV$<_wJEcaS>@3mrP$8{Rx+6t@ze)>QVInpxq4@uqU0-&1l1>Q+;CYOFVpT|Lzz5g2}C3PYd!nL&U^qn#a znft&@zKvrCG5X{g8CfKsK0+06pZ(^lV{ui)$z-bd`thhaP%_W&0iU>wI=z~e@(W$2 zkmJt3%Nhsi2HEac=MefoXbIaLIY#Zo0{1IU%OKo)0`ezs*aexzs<``Qbw>Qr={xs# zMa@kgzbfkfvI9x$Y=EjUmD46`6&GMSC)p&&<^4x;M$e8DAGRFn3TyYmFnNiYhR6kT$~MgzV8J1 za#VF<5yctyYetGFJ!-4QI&@us3< zaD}>g4Vz{?W*5CtXl3vw%ePVRP-(Ai^#B&#GOI@ z=>}nWw+F)4;GJ z3UB9%G76{JXK2hNn`^#gHbZi46s|DMclh9rTn~bvyJUxWpSzrN z%U$$O48DCZS1}bRN~UaqY`v@I?SF7mF0gE3DeLC04m$vue|}J z{j*lh42bVzy~)epQ!N1yc-Y47@RnE7TK|41ob@?EmChkOyWI7C?l{R!N33*4(I=x? zoGfZ8uo!o*12RYdn-G^_E)zscKpHG{-gmI(iQ}-2nlL%u5iXf0-A`5q zQ5V{p%Hd8h=PTiX+SJF47QK!j*1l{Z3QvC>24$<;YO>?WK_*I){CD0CG&xvaVcdVA zxp$12w@wmx-cFGy1(mD+4!o{UPUx{}NI}XV>tR1^+3ofwOyULmifee25p>KCxg+}- z9X>DJ(6g5kp#R&WjeT9umjubW8NbIKG(TXoo!0$jr`)zbE5ITtz^wq1hLUP*Tzvgpd_=&*5Ov6t(QFW zAJrrW6j;0>d^hIp!1+?q3)U_@_QBQhx|XvAsNAelGWPT5(?ea4{QVBl#QGR~)xbgG zp-AG*pYKR*$)DR=Co8$J_ijkGr){kDR6#o6^qn=I0nGES6FF-xou$hZUaF7A@l%4@wm}9-uOkl(*;?}MmVH^?2qerkACi%D$#361Oy$e z9{UO?8ai?^;k{isS21tSF#>%qX!VS0kk2~MY1g@xol(s>lcMft>@w>W{nv8j54zs4 z50C91^rmnfBKFesHzcEb*@rPFiEn3d4_SVlJc7HQFg+kbmNJ$DYR-Ef5NO_?@UCc< zKZ_s8r!iI25&}Y{%2!9WhD@HTs|MXVtX;`+;U6`x5IZelp}FDS&?>98Nt$~8!~mQBkhoCX41nl} zw>q(-FPWx-C`V16vC!R-j(L^=Ep3pBW?qHIt3P-snH^3syE|M|3!$ubqD^BCe{#DR z5LSzfx10F`S%?tf?C1zfy;)#)U-+#A&AF==w3WnvIPj)y{-~6InDVD#rXjVqg`O9P zIPcDwSn|xQQlt5FS(mI*+4gAni#T(YAcHrijz>sQ>*uuecGfadulGP-WM`G{fV))c z&J9oqwcD>5Ee9PLZ->n^L+Z3Fth>a|x&cK|*KA_Ue+M(GS<30Sg%Kpl@7TU;`CuX) z=81ItJj%-J^i(*CqT5n3wZMm8&T{wA$0>rI#VM>Y`{JM3Zitr+E5md3Gl;M(`rD&N z?q0v!@+H;N0V!tg9PP=>l~RYS?@!s<{Strq=6M~x3aw%p!=Jg@@pRqY0Ne-6d|$k^ zzcIar!883qBbQ_N>?|2sCK2D`G^ZObi5uVz*@lS6Xtl=Da#zKV7HXy5aP?Smc|(I2 z9FKQsztB?$lQkI33~9H&Wz1U|*{U^H7MfnyPSiL!s2d;DbF_CLRqOn!F0(!DSAYZW z=8G3FXE3OxS1bI{ueT{m(%~5pSI<_8DxVo_<$G9nmr`Z%(r$FnQBdIM2f+U6ElM_* z(*4w5#}wtpai3mswS7<&1!+lTm6qQa^NYG&y;=}jFkJy;TI88~YIj3i?n}CQ&2A0g z{uky>CtFFBva?&KYcXu7OFf=fncSm!N`5oxnWNWnIJ*~wy)e{t8zW|2kdn-JseiBB52sl81}x?U{>QX8uE9^lID7~cZ0gM!55JST6yc%GgO3`xD?SfAh#rOh$q zVZ}mmXYx@V^(G+)8uovC0m$nTA9B4B-&=qGVkng$qqeN_DNqP#r#PFCp%sxgO{k2`4ffOTEfZ^Kg4+|#&JFj z>(fu~ti?YR@fMaHQ0zzVy+K{At(9}1*x&G8r*?RLPInA8My@qJCfT3x=BwuPe*R#k zq|2iQvvEH}leLWVYu~KqP^fGkn*%U_-}xXxbNMh*AltunJcMAaa)-^qhnow-HoPhH z!t1O{ze2$}=y{H6i8u%@UZAD>>nz-KDDX}l=-Aw$s%LpICVZ7bq84+J%zwQ73M!WG zeb$Vf@Pc%G0*FQeoDgzjzJMsYJk80{$v96f)~y+|(oLn98!YT(YlOP#&|jFio16R3Xmf|s zFJG<0nNxdu3}^yM%tAL*srC4PtgJ)1b)gn9aUbuACTeRoa%@a7NM?BSo4a$pQjhuk zC&EM{!ib^9CkO%hfh|f}>xOoJu{WeU>k4wE!BRE3W{mHs=*%D5cR!yFHf^Yl&o<{W zF|o^7p)5HYH_>fWOt4877x=2NRcXbX_St$7FqRIDhKR-YZxj~x@!y#dooDA@)L1U% zj_-};t!R$+sorS3xbD}e^3d&OA^DTDs$a)#r{Ikql{Yj-{9gfGi}7t#fHw{tL03Kz z0|b6ad~x~NdAzOeTjc8vDt>9L|HIfj$5;0BYobxdPRF)wcha$Kb!^*7r<0Ct+qP}n zJGSj)_V2y-%-l2gJ#*&Y^;w_2tJbPj^?guJePHMlzTigNJMY3%cpHNLWT2(s?T!-b z`y0wSs_z#>8t~oVnd{?I($P$o`0kLl)y5sAP>gTSj2uNzdmsvb@fpNO0>`On7=@J& z5vg){aw6QWNPshXb9kZKS5^ujH~_FvXL7nk_jWagp_E%vIC?~rt!DKK_LD3M{qXZpSh#7`1o$ay}pdjvQwp~<7WfPSXJ)m zBR0vOTrFK6i?%+k5YHaSt)DWy%}<`tED|d~pNYaOi|0jJec=_NbIGVM#*TB5g0OEr zx##S`ZiZ{{zR21_-4q0?|Gg9~1X;~F>6I89+hdSw3ZG_QLT~;4(u&0URz@IIL)f-3 zggAbF6wg5ER!*-S&Uo?`RSqM{Y~^{>`xYP~hrzas5KZ)|L!8c$JZs$c<{>bBaN#=k zaJF2DQP+&Az)b#|J3C$a9l%l+sUbEkV^mWeY{NSyd|glZ3QMi?&Qv~Ka~KVI1fJci3} zBIU_O?_-_bD;}5r2<;Xy>nvWqSnVr<^=FlPFdJ#r+&|-%J=ou@0%RHFXlFnKX{; z$Cldd&8Ar|#u{fzBWGIwTA7b$-Oe@3$`;uQ$LOu z1^h^p$J_qs$NY4yTK7x9U;Wu)+iPrk33E^TwdwHIRw3x@-`%+}^8T$K%VQ90XiivG zk$HWKZ|uqa;GxK!cCxfJZ$B8&Y{l^PxLU+D5onaa1%*4E;@f7~gf>oKt6IN?I zzm!ZN-ZQ#a63#zWKr_QcSh-DOHRDn`;lH7>@qe*mI4tu&eLnW&Dg!y>>f0a`Yzu=X zcZ-{}6w`IgUR|~6w{G8P8&F-dCHzj8cFgEdv>}J*5eI(wo(7Bgk_zjmXv!(+{~yy` z{BTP4-%{P!KxX@x)>|*F?YgpGSVzj5;pzLoDDCwBNom`m!w`#PACSH^y1c)$^AlJC z+aT;LH}!A0@OvDjlkl#=tIu~{0$rAl5B1~_6}!zUU>Zxd&fc66ylGTMkJ+AfH(&^& zLx52=(gm-I%E-n8zxREr&6k`cYnJt>)}R;caB_mEmutdF{{_@)>>eC-@YlQWkNOrP*B4=8 zWQuc@h9_G1p&T(QeXNE&X<~77ozFpdN8N$2-mwUa_Z&o=p%E671w^bBocUYGT#$)x z+%RE#;*Of?&g4$@mUlw8m43wmM>YS^Is&@f`pz;)(k7p^-lB&-dxB(fM{OX6C=yK7w0suimI-QS}!W z7YQMSEH(gZTTgqs(Js5YGn>Q|F);Oy^(Xi1F%25|3)A7Yr_xBADHC=5pbml(@wUarN-KR_(L(6CKggC;CzgGH)p8|0}m34;ZYNGsg_oiB2n_a4*eqtyPh4tp_D znew=)b4i^q5JD~Pp*;s3tg)I~J%CRZMc3Wi5@-zf7naJd%*-vz!&<_ktXI;CuW87~ z0<%50vu<~)MGh$csFnl~zC_Ee=lS^#^_jOEHNv*=#OO&QEh%_AV^hP}->LQcsNOP~ z9WVP%)~D&W&wG{2w|;&t0T$s(HvHV&YY~{71Qfi?kzBKOahPal!Bop&L_>RO736-iFA%dwr_ou+eWO} znWrV?bACe{0`lfYN8@S1d{T}phOuc8@GGrLD~}A^><(Jv&8Vh>d7Nr0{E>J!T6}b% z(Ri#h73YEmc{7T|xE=RJK(8Jf1-W@W97Ja z7?V@vG$w3pbsqeKU1)MDtDyA+=I+J_I5@3;qE*@I$=o9Dmp!@yEKlH^K_rg`%%Kn% zxX`Lhf&#)jCyad>L+1);HEY=Z4Ty@e@jt_7}y|!N_^>TkWe0UgEPdd53 z{hJzHEhvaok~NIf_h0kqkEUmS>i zg@oq+EYWqYDWrtwFAIt-0EGG9Fa9hMBH9 zHhuZ|bhj&vt)K{>+Hp6rwW2Y%JY-s0P@zO@GNDr?vohQ+o?bh~ATq5#@|_c=aeTm{ z(gCq_<7o_>>gAW~<+!k>Gpq7}k#}ZoNDwz?EY8v2d<>@F zYjORD@?Pl{&hucceB^&GtDN+=*PQeUSAWEl>>Ta{4>5vNzke7*zU~}R8QtIiP=hVC zI``qRG(%Yzpy7GwUsI&>J^g0ecI!xC?fqwhAhBvUvw{Y4(wsk;EK-=KE=ykUq?#LO z!S>D}X8Xk_phW4V?-kg6iH7zD-8U!(!Elrb9{=%i-4H02PdT=kNtG$3>O(3{?_WUL zrx{-0YG1IppL2Zb`>mH$|?#!Pum3p5GfCN$P(=Okd$rvn{e4QutGIex$YcBgQ7iOWXb;AIfra5D-FUU?Z{T z-Xg=V74RLHd*g9-a^vMa#aZ3hSbXBChNMKu(Xb#?=qXc!!}l+k-KG)>H|#Z!{X1uQ zqvnDoo4GLB6|rn}G8<@lnJf8?3}FffCh{kdyeu@IOOHSjfk%uW82ay0LG!jB=6x;a zX6meK9U+O)T@wM1fbw{O^xogJeuFN}jAVN^jVjbMLq65l&-1GjvXO)O%aXE}1g=>U z+dHc>naaY67t8L8VWo}19o1js*;=|Uclk~le2ihbgx`^FBfrF_7J_nhNtXK21nW72 zPx;F5FSD3v-hINhAoM^H;mM?T5&RB$)*9n(XFmsKq2rU56Br@LhlrrhTW6 zLvNZ$?XTXuwL-eoJ8yD|Ar zRcA}c&U?pm_n>0k4Oj;`UTJ!;N!G{>EkvOyjp5i=>Gn=zNc|kDN zDrv&jhEB&!Ev@rV7A^Dk?#V!S=#t=Q?Pnp;FvyH1N6EYQ77|P8U-s3sB*Ts`oV5!< zG?)*s3{*d(05WmB%3o##v5s*1R{}$;IG8evs%%s&vA{m)0B7d8h+N6R-pz32NZd$l zgaw}FJv1z_Vkl>m<=L{p{iHGZtF)gnzo4o=EWkAzZBoe1;;uXb)`!;#z9$6p;8eh- z4Heb9{%E4jZcIH#sE+U4LBR9r3&rOQpsr^$>J9Yr$mz@w7ocf>_O%PNM?oPy(lb|K zHOa(K84Z=ZY>VGA_Sx8kj#t6qZ8ry3pvRgdvcQL#*EBy?v^ZtnJJ}8@#z^y==p=kE z3k`IIGtb1XWK~|86`J)gY*}Y<2EBMKD{+jJ_Rb(_cgK8z>Ipokop0ftJe>3lht%?YhzCOTLPeQa8g4 zI}eCnUhOhlNx#CS5`!1}wn`ddzQtjA=2cQ{GeF6OW5;P;Vlx0c(v=VGs#3Dr9B{FE zuz;OrVd>Vp?sXmgy|F$Mk&I7RY{xZ;g4OHpLFt4e!QuXl(fw(!ldX)!_p@vFr!2DX ze%BynhP`b`0uB!KH7p4OSB6){ddX0%WER6QosG4{=_RcKy4Hl6y(@**#jkM9!2)K| z7alaK(uGGThLZ0b3r-9CDU!sB5x3T)&Eqnds0>iI~p2e>ZE0P$uJTf8Jdc6{xT9l1d?dNr!LETOBHzw z_=cNRs4`1nO*Ra_9_!c$o_}+mK!r0&0S3qlQLg}^muvV5_seqJ!%SCgY(sxUSzWCm z0G_N5P=FmqM!VumW41i<&qK-<;+CYkQwp9+&kj<`ST>9Ah(qAsO%FOgR?Em~Z7B&| zxwZ!}_V;nYF$-3$y@fEM7Q4@fHv5eaf)2E*9)BA2`NJEs1tS`oV=y8qh2|Upo|Kt~ z@!ctQV`f(#vTWFE#5_?Bhd4_d8Yix0A?3R;v)UyUS3d3HWr9MY#WJS{-G;4J6zpM? zipmuEm0WV#_Ru#@hx5+%geQN*RDP5S_T{2+GI`F~@O_xWhe$57>Vfa!Jpw`G(+zkVwCI9RVTb|PnqgBYrh_`)x@;AnAS!+B=Jh~eXH}meC z@Q~kFB39=ndDLtdj``uDV|z z<$AfCUVhm#vLJ6_ZKZ0$rRF51zMYwyYrj7=C*5;7YRAP(xg;NkxKj~$AlhGI#?Mu3zsLSx*Jl^ceXSP_PN8zdr z9lhv1+PC&2`)m0)Tu_y(S~F)a8_#Lk9wAYe90l}WP}8y*ewn^IGsw>bw89y=qMt2g z!|HT#XGeH#n-9q$3~Wk<&{3!GYFktYj3t*Z-=1*v=Lj_sK?@RWX<(0Udjw0J$rH8+ z*sr^uR4*n%X(oeA`g^AlH@#t|0)EIC-Cgy#Y!baWb8dPL3)VYIAw%qF&mB8B&g7(c zF=LC^;An$E2&9r^Ejc76uc`pXI;?k(ZZ`!sj(jhwpiIQ1rf@N*9EpyMOd& zd#XgzsrX%?ZG&MFbMZL{+lgN21NXb4{3qQ9r0x3UnVH=hwn$_+5%dWx32+-h_JsdF7sx7{A0kS;+K=z6pHRNb&!J@U zg;l&1gMB)hHCRM;8qfAPbcD<1|77~QAOu?>ju{YDuQwke6NB=|;lwSSSRco{^6R@C zLqSlE7_y_`+;AYR-}~*LtX<00l=$^&h9I71{dwu^E2Gm8G;Sti>cYp_QcVCpbgiDm#Bl%Ei`<#grC*Vc_8l! z!j?)39v=q_(xgdXY`lRaOY7g>fAZm2KY<^Uv>y6p8)!z5UL2$r*p(Fw(`KENs^6B| zWAgaE;iQ67q&I})^(`U^^u*O*IJ){tmhz=Z7cm|PJ;@QgbR#U>f4y*v)j!8>Im~l$ zwv|OY7-;i|twuYHO47BFLKNN-1E%=7gX)Q(`#i|OlJ7(;=nda)@&E|j$Ug3DzDtI# zcw25m5tDt<>HFA11<^s=^(kSwG%FMAc%xiW3$v3QT|CKv6t&^Y;3JJ%vOk)8TNF-P ztB0)u@%w_Q1JDTUXJ2DiTeJg#Su*p|e7+}as2vPT;$ zsE=_|_YuvSd%M%CUA{HQW7KR1Z0AdzT~{ITUb=yd5(kzaPEiU??sRKED)0eQtZ*?z zQ^azM_91kec;!!voImt6J+#tN!{%t{Aa-_6B1E3Bm)$wy+qyo=&6lKN7WP; z;FPQLg){07uq_85P_yU-bg>=a74)1+k1as#@AmJfXFx|{i!Y3tgT#DDwv+wYjzVR* zy`yUOM9H@Q#yR|w@lINE)?taJx%#%MyBS8}fs7hIA^c@~3mY9ffB9o2Wt9%v_Rqb_w zj!%aE7J>GEo)Gz8DkSj?eqm@A9;a>}W3YS@`=a=|xwV~5TvWX-J#(h{wK?vJoNqr$ zX>(?%P+G4ss?xdt3^d@jc*rru<@yH>0rE$CnIl|79{1ixad^s5A%va*e{quGqOww2 zsDs8ItT*e@Y$iMB8SH4&rx*|AcjL?j5eX^7dwxcLCvScU~%v;!m zC*mmeJ?(N2Z<0{xXd}y7z{3Q8=SjDB?u~*p*U)0>*JAgQ(u^B*T{|X0ov@S9{D>bE za8f;r0e)s|ahy9{h*ZJeh`93T)`vx?u)GxUyC;!ZuU$nLKWek+3{=9uvBEQV7fJaz z8D07QxS-k5=={^7*ag8Ync%YK2AKC!Ez!V{SJ;?uH!0ohy#vzyT8NTIQ&jqX?-}?p z=&Vs;V4m{c_~fv`>#fc!Q;t4L+t8QGBC;=vmU7a#6td8>J3I?TN>Y*it$x^F+|Bk6 zSgC0U+4apHT!QQJg$KuPd@q7$(1>t7sy6v;dBIIWX&uHE1?*D)^daeAeITIB3>vb* zK>9LHy3nJu!D+Ckv9C>Dllib{gizyY^8(?Q<2e_&I#Ef}(uRtTkGVn2o}8Q?LMcg> z^HY|Hon2v58e_P0mqKl6K|HG@IjQ(|u32R#^7M8gnS~OxT`C6^QyTxI+9WhF3q1>$K~Vu`esm(j^tbwque)!IJj9jzbWu$ zvOTq~ti)+QnO^R5FT+auq6TnbN*U7L0}!YwkIEF_`f&ZX=Ri0ghpOt#VCk4BFXPFv zrr=Mnr*KAP)-QWhU%f8#@v|C`xSw2m;LZk?c}>cVZyk?u8J#zarEF?=2MU?F&DDRG z5TbK=8XukK3#B03-FIXVY?|H{3EC$8htQG4VR%$ybZ(r%YVzQ#lh2^9)a4a4bnFO| z!-{s6Jwc1^1)ZGQY)%cpXC%2GDIF#+njK97Sr^y82E*+x3U=338dv%gCLj49CUn>` zwXgWZfGK4~rZGiiz_s`)95_a})THX>M`5$3gZ54MkQJqblxa839b8qY`Lm{KW4+y z+jCvnl$J@EiCqQ8@#MmHlNbKO3oui{#cHX-g=6#$p8y~tDx1?-_SYy9m~~EdK{>)& zgpA4--+lxUx4sany0o{T+n3y$m~vcHQH0@iO@%Sl1>a3Ws&)0lIkQm%dO*;aZ;$tO zv@w`zJnF3e$rmcF6Rp+ZRpour6OY4tA_~QArt$awRK)t#URo$mjhe#dx%`;wa{OF( zcYBcT8ImIBhW`a_>d42wY8TdtwjRzMNe`x1IkizP$aeI=XB|9YBOO~Leq>WBa z8ThDujHW?)P0@Nqm_7z6D`UDt$nMV(q5rhyezRPYclmxvZTj;S)H!|_jn$K-mS1da z%=Om8g{k>Z5E`yvII=jYX5>MqU_Q>u!-LrVXs8VA-<`N0^cr5~)pn+CdgK(Ug9)Q%6?*m z4rJ;lhy_|RBp#s{~!WIoE&E_?_F{1U4aCA@FzBdd= zP4y6sSA>nG&E;u81M6QL%$;{7`joD50kp8xOFR6Je-+u^e|Low|ErR=Cq@kb{xfjy z6vWCaJrgcde>@lXVED3K~sM2aQ^!$w3c0O_|8WX?X ze{llMD-T*9sSUn-&u($LX9? zX2{;CFC?qOJ2y7TdHVNU+T)nuuUh{W9JsAvs9{G>`N z+Qj;?D&**FdX8mR;E2ysEC!9kP*@l{%~1keNOqL-B=4FhnH|%Z2#0tR6{{ai=Sp%( zICq>;ZAS%c<%>C>94XROuw~y_>%Nj%;di-WQU-Dq`NA~D&wI8j^!p{w3IS(KTEg_< zh6F6Y$ix8H{Q}{y4?m6?N`BmK?XSU~rNxA$$(_UXoLko^_4C|#c;fF^_)yL_BG^y$ z%PA6d&9Y)v92$pomLV zWN0Zhr3nY_lXL;qE~EDk($`|SqQB#QfXncMNk4qDD^c-jOy*VNe8ONt?B#ptBV(AQ zN@?>fDYr1ax-=BvTah}t?&d*?Zv8__?n@VXLnL>EKu-SMuh(qwVXdnubKA1qFrYWm|BSnnI`Dj`lUNwzJAPmKKD1k5{|RGzywMYNA?PUn^H z)aN^h4YK^F2do88&)ftpZIlA17s*qR`)+>P2ye_Vp!j}*z(#-;q=n(jt->z+zv zQo&K3zTTLfVI>;71%gBWctER0@02pblV)~5U`u(T?e z;u{#e?VS~xn&G|T|%%Nc&97P?KKp69@#=^Tx!Yf6bb^3HLYz|FB zQ$z>03J^yp6Q5fBxr#r>oQg-1**-N--Tg4B5LgISmLcob7Kr_(hnh2|s5a_#2Ip~Q zuYF~V#?Ic++!f>Yn$*~;OWB<%uK=6LRB*GwfuHv4O7im%}3{Dx32Sjgex_Oe!2q!+FCNtBBMHU6XT;WUn$1BX5y@at9_qOPdCq53@T(xs^oXC z51@4E2UAPaTE~2fqwSPG(1=;R;%JrBsIRKd%74}7x?-3oLY7rW|LU^bZ!}~r_M2RaV-rksmxZ&dp4i?T1K6Ksf*X0foYxp8N$hdDLKt#a(eMNh>WiO6AuIkB4Mhe|oQw;^pPUu;&{5J-GKF8OeHg zA1=-{1JkC1uy=(-$};fn#Q@fr-CH!auNF=$}G}nR7P$dW)6YBFUdiUnt8lc80ZDHoGl~qRea# z9kWG5$-3BtrTtoJgNJ3xh4G~wQNLx8*~SoxL047Ff$9*lW%R@S8g3|xfM8F5csc#db& z?v|Ys;vNr|Ccv9pLd6!;LPJ$`!6Aw$Q8AdbinydVxdLHzM+K&G>Je9GGWY8 z9I28{E%S!AE zqU&`}?s1tf=loYclJEfUgYxcZKWfCofc5we{Ktv0wisG7J)8l6iyn&BM-twD?ZPD?ssN-pgd?Sf2-`}I;RT#Q!)BDS zc}_}61n7=9MzdlgLE+0U&t3HJA#y&KEDtv0ar0ix-k*LWuM$+b3MN1 zt?w*|mNIKb7hT#rb0GNSOW;5}a{HZ*8PC@~Ld|6F+~Zg=#@3;35c2YVoOP1=mc5Ioo4eSzQ=1B9|# zm_7SIsDFKhccPAzzsAfPEHTCQwtHKFh!azB&#_l=1fV#vv+o{PC4bmjqa|gGG#BS% zZ(e=SU#%@qJCZmA$x>z*8csNz?RPQ=a74qX#8__9(%Ul38K05T#4OO|iKW!RDN(r} zkhvCD-;|Kfp+#ea$-mK{Uze7peEXe%$vMv>81#)(R+PtjfQpw%%69)izI@u;@a6G) zl=Ya=a*$-fCQrN{<#O$p2qykWOMCyUi^nd-W z(n_W{5!X2P+jBV7?>53I>KMZfcijCL2=hf5sht}d<{IG4>pnv3>yKV60s~uK!jzSn zo+HDzlN@MN_1SMdY@dkOsWA`>mld+V3(3St^;c=tg;0qn7MVsZq}`~&?>`_EaCl>k zEeTAAMd7yC`jU)>?>ZEuAC6gbQ~|T~n$#b@)v$ajR~espSA)uWT@FmPM{)IdH>A?* zCmSeT@Mm?tOrflX1dS)ff#j5Fw56AD)db6L=|*C4sUt(wRO9v={D0L5yYQI*R*h&W z8NtcGC#%4qH4P7AnY(?+BSB%KOyx}Cxg8wS?NDNI|3^v?-dJJYKSW=n0FQ}@@t@@~ z_!|bw$Is90dY)p#0DBheT1nx7)F)L~EyOPoT9Joc=OyT-=t&sX;_n&O@+b6TPWc14H_7pO$^X|{-k zIITMq_KABi3oM}E(0J_pmcluI)%yoKc`yHin9OqF?vLgis@T{YYHWN6tlU(Toe$p@ z{sB@RBtQ*=EBufjs>L?irtBYC!-pFQ+~r@mjL4hwzW`jAtC`vS0>9HAOx|Bl@akU0 zZ{}XFd%}zv?8c6!1ksf}vH*39L4&uiq_bS-Bil{#X^`0VHqcsv1n(bgRrbj>-%Xv) zq)iqi8R*_@aNNWtsANs}?u|Lbr%$L%Frh{*zRzRm4!$qkhds-@~uGvkz|7K}*ZRPZ5mvW#56dpDyssQQ5%9l>>Yp5h)ZCAvba+3s#+} zY?d|5Fn>_u`C9h@#Vvw^*hZ2RZyZ;-{lq~7*r7U~;Y0~-A@0pRU=l6lUm28_*->87 z%wFAVKlAZM2CyaRGzlVy;gIeuO@~VrGx7RU{iYplJISy*S0zM!38115lm&P7vx6vD zvTCRF=Sm_;1+4!{=?wPN%C3*vCC_*TvvRX179xr6yibsJ&<78oL;S+}r-gr8bJ8L} z2r0xZC6-^AiVBnPD?cZ08z!kE{{A1GiGgAN+4-pLSNl4nTj6a@Ft23jPRd%}EGB#V zYlxBHV9HpW#;t3L_R6lfvJ_t;=EUIfs zLsG}ADQv5*mBt;2_sbGaL#$!D8w(>{n9LgKq|SOSp#VDWZib`FEwbZAc$?ppYh5v) z>@K;uli1_3#(h1gyF=M;r;8tJO?x1s8uaSBzOdZezM*l&oxCqW z_3V_<%sepuk%tgvICxtdQQuTcnVm|80Ni>`YbJ4>*qO$^3@uo>ChxE_HN$N_!5;%J+#^8eSX?JIJ=hjSoflEn4Q-Z*jOD zAm(S!|FER=ST)&5;7Dexq$StKm@&fb1T)W1@muDPI0325=iIqbY$)uW?CvgWv~xrS z621Z?_O06zA`y4J@+|dxAI`qn+$s)v*PfStfV4Rs4rlU1l-c-p ziq+4^NKzko6o-Eav^o=dj;vRpnOW=HY~^tOc&aq!l*#V+*SLNcM+DJdh5roZ5HVW* zJ(h!?N9I2Xx>7d!iOFv+smb?8Ums=a9E-E#O>Yc%Fo%hE0iu;AdV0B>&ujYF8P^Jg zQ2vHJ81MkzJY900TgwsivuP9J=9UNTCt3x|bS_&JMR-{}K~1l@;i3iDufWN5PpftK?*?)@>zfFG`ks)@-jzVR1vt?VQxAjl(-6G5 zn%z*8m^VMnF(Wl|Kav0>l-WVR9Y`-s;>>t2$g?YZmqf6OuN~w0!U(byIjeo%Q`ojz zam#-?Q5KDkyYD}Zr|xa})&C#CUkr$`8y~+h*)VeuHekDp_v!%i2{70x?I7+zp? zh?0wK5BQ}}<}_lXrf}*sQYpAs`oKbXu-KmL(2v0BxHtK9GmL;RK<5>AM5y=U8hV=c zAKvR9T&QyDM!3Ul1J5}LZM=i-t3w@NdAe&Z2KuF;ELjQ@sWAl|z`#{F-`MM*?19)HVG zqxB&^tx6DB8;`S<45x2jtO9{d;-Pb~6aB`cJCpkFL7bpu`eN&s&AD1UCERVnoLwms z(t@2yv_m#W4|}_X=0eElK#%dASne=bT)j;|rBL-ZIyKMNarnW3S({<*HhMTpM$Vz= z8**y)z;ZM4Yj<(lC-2!X)sx&pwC|0Ea`Ka7v{yP7nPmIYQ5v4URn=n=X)~# z@Uq}@UCOR{*&lQbZlD65e0VwCKZE!4hIPRj$0t%vs-&#Ere`Jzr6|`~(pqdZLGFeu zxHV3s4M7%ctMi>p%#XZG%c}B(VngpA#EP)W{}VLWs#l9(6 zmXxrNzQ~g?=QaO=|8bit<`{utWrKaNNf|%QKbjdtoj+Tqixs&^VvYjQYnwN8&{1o@ zeI`{#DSjQVUxe&D^P}^;Z^0rUNMqgo%j)MAbTKLlE2X`3g0N9}Dg*1WZf2-FG?_%5 zeNIldf+|-Xb+j%TMXc+Y%x9*~@F$wCGtu59qWJPbZNB8U`hW*7-V|QD@6n%P!%2G= z8a_U$I3;tga#rZ)9Rlst##dB__Ktj#%anII8ua9KP!^*CTn)>&JIkFuuKPVizH!IF zUO}`tWF$oqI~>&nTH&-B@m{8&rA^EAC+0}=X!$Rd-EeJ5u#Z_-@4e>2`5y06vq9zb zT-7W6P)(g~-O5_KcD{kQfmYPzwt4eq!@Q2DlJR0Y27Enc+T)(!f>xmG9LY>xnm9=B zz3KPAMX|{34C9nS-L6R7E)b!IWwl)>6 z8X31t8nRNgZkQWyj>7;WMd*UNe8u9~YAk75D1=Z=Hnh%EepR53?^D~Kc1B#$+Y0jx z6;_vn#doit1ccdibmV*=d?`$`-;kgXa3l+h+e2R0AeX!~2fR)`@RfyZst#K*WsUVQ z2K#P4bp*u1^^}gyEeb6#eJ*~e)d>oYTwxDaj&|udlp+PsN$Gi1XVMZzn5k^lPJMf; zn)a3Ihsk^*w>9mf5>Th~AbYE`uZLggUM0134>1$c+ zv{O4&sbsA^RcG*P0kmPD3Xbby9KQ&685_G(!BRxCAyKs*QKOSMIKOE|KhS_0hZ|Lw zC})H~&MRpAQTBjmdo0-fr>=3jK5q}QDm`1`HqRaJq^Ol8J+fSIC;md!hh3Y-CInzS zs2@q!Zpm}wRAoq`%a%xJdeKf;>v<&spu&OtukdZqPEB#2R}J6K!c5P_oqOOxf=$wX z>7jfhZ4l;=`}6R%o82S#kcK$veo$3skgLV*CriAasfo&cgQ7#dihY)KS>EYKyX5}{ z-3E5<4n+}jR?l!?`v(O!hX7&z^DpJ!*S~{pqO)x=v%G(pp-2^rI5vY zoZ00Y61N(EDN@&HweoAxhl*-Nk=pz9asPjK0Z!$OYrQVSEBIB0k@vu01MOq6Z;ce6 zFB_X4a&~({`v=eKGJP}}l~lg^J?UBM;1c^&AGAH-Rk5pVr$hfy337ZhyW)?t3I$ ztp)Q2`;g2~6^kpb^T0ITbY{GZgg*yY82b3IlSzuOs~C0pT>3E#g3*gld~4s6%6w$! zOYpFanh?FVWInOm0^Lh{i3QD)17wjTj@w^gP=rNd7BxxB z_0@K}L%zU(fp{>N7N|F-C8L7rNdZeY>UK51vC~aTxd+ABptuY^*jCEqi2k9j?OvHB z^>nJnfjR>V*d0BFmS+*>yR}x4hwrxsOC5kva(2)l2up=iIRyX$kDK57MnlQPK?1G{ zn@~P9-tGL4zVT%^1XC?-o)E$YkdptbTXI!iO-im&9d5ZGJpsHJyR|;CraujFY){8V?ADHJs4Nf50D6}ly!}7+#^eu#d{<7ZA#>d%Ga5C zmB6c{r}XS{UP&_9To4T{5D5#SiX(x!hJ=Z0xiV^dicTf5gzdgO$$|sV5xDvQRG(@; zygkS?v#FkQUr+M8mt&3yA`hhrW<-lRNuzkSa5C3r7@*Ibvnxq8HbiaXw=4p0OD2W``&K%%1*?lKu*dVq@Q1<)^Qy)($8a zKDz0vqR^?e_*SJI7qZLbpNp)f-;9-<2yb-cchQsF^w1mdr&w-zXX`2>)Qcl|Z&2Tv zX!q?sbC|XL^(KJ6-eE7W-<%7lli*Ld+4dX>6vD%iy_(9{$f(%+LqE6%u0?PCBsN1n zxcJSQk@#N0^*fJs3Vxr#2jY1cz!nq)9`6;q>(M~)^H}~1d8>mOq9#d$Jw|qE&z4$vhvB=l|DD69=;q1P*i3Ex0 zok2tlLi8RXI$?;GAbKa-AkjvN8oi8YgF%ppPQvKDj9#L5qdt1?{BO_m`|y5$tyzn8 z&vDM#`@YV#_rC6#bLvu`X$RIs{lPzNjHuu3Ir+;&G)1(fczEq@CJ?bRzOO04&to#r}YKNnQOeuY_*^FK2oi)xNHe#d_RrCdYop{F{Zo36@*ST3Qh!$GInLhP$%tr~C13IM+b|}OL-P|ZE<-T}t!?fr zGbZoLug)QZrJFQ#IT@5K$;MUK6|#Xp=NstDV*Ig6-&S5Y!WRAJ!_Qw`?jLA{4q54# zwuca+P9yw6mKrZ#O8EXHj<#$r=Mok6zamRm#&OQBz{s8Q&C5Q@y14L$ZVr?5OI)ke zaqP%EXm*^6!Eq2?CEV`(;wqfjbsvjnDq{D#d3@h26o<2fqT=0r(7;tmV@s&;4VLju zhpWvnu7U>m)fCEt5bsB74XIvIC>x^}?fm}v;*3C_&vycLte^u8;E7A0L6l-+y}kmU zn`97-^L0jJD7kvhgZYc$kuxeR-S%wgzNf+ba#kTt)7}$t-S?QI$Jry;g-fsmeUhjM zz(2gOe<(6u8b!<-O5ts0*f;lQaiGlP`O;hoC%7Arg~o!YO)w#JLAWPompjpMJ(L+S z2*0&=T(namp*Ks@9-JqpPd2H?7t|RqxOUEtAQLyaY*6vxh&f-ptYJ-x3>cZ;VK7cI zCatY`)ow=XUSo1P*TzMiQa2~tD9h1zSC_RHxi<1CTQ->Z5z+N6M!{2xlPBU{*wbQxe%H-V z5c%lj#zu7g@v;EVY|b^Rb$thiw;oH2;LAFm2v)&wtQD$-BSO=oDz{htOjr~39=6_` zJB`+0$7H=S_n2vv%o=LUcD?uAW?Ob$;RX|7Pr`S18V*w z`;tUy;U=vup2-ZjYKo~tf9+Yc1(;k3SSFxmQsP*;T4Ux$I{0xNV8O#$+IJjO^GDui zSM{HgU6#f@)}8#qW%X`(`LRUT?Kl0+U&!d_ka9gcH+7NM06(5WMZVwS-tui^IyHDn zxcQuDX=A&7m1+F|k>m(t96yCn*AidGoV4nR5`Gw?#8gjM8`zEYwH%ZN=6&BTbDF&0 z+#Ed1R(6QlEG=^cQzhz{LVq$f7VqXXurqQJM~n}&vwkMXn4S)vYwA=<6#&}cizI4Aa#g9u+#w@U5I*)PWt(IZpSC|N3_R#TkUtmuaJ{g4Ws z=I+CL$~N@(T~riPEjj&$$90s)@p$c^y`+3Tc}4`J%J1H{S*#ZMU`At1keh`QF^~^~{vo0f0FcRO07~wL5DN zff&=qu&5lqHJM!BSeM%@z|s#~$wjy^jZ6B0jIXKbiD7kAh)pWfS0T;^gBn+};SxgQ;=31Q?Z)trikB{1U9*H?PExaTS89bS0 z>Kq-1-7iSv7972ObbJ0CiFq+{`FYWE!mYDT6usd=8tMyg?qC&U_~>+Vf9#$=#st+! z$u{qGPwI9EGsx7hL-AnG{l{DaCNHkvVW&sB5k$&ALFLceLr{ArDDzd=%#_ddny~#jM>P82rQcLNtoQ@&vK8a7e>BfeVr?gA)>MGv?Q5H z;%g}pel(6u(@a2r3EtpLT;!2_7nXHR=)pBE`K^FGJi9H+iIM{zU*1mOd^s_8>&HJIeajJypemOuv4??$N|J-1%MvEzI|9+@5wx- zL!Dh{{p18=OuFT_O;TyK=`H~lT@-WOZ_-)m!ow;c`DPi2a$dd1=$A*UeEXvH?Zd=b z6v^SQM;d#p z+f#)Z3QB%TXFR~7Iv{8*)qm=7yJF=A_V%HaPx)BYwufY7Kh4gp2Lo4S1Q`_zI zn2D6H`zxH(tAle+0BIEx`4y7%f`=L4CadbKpj^Ffe- za0!j&yZh9s`g`3Gp?h5)SUMSgm2{^2kzLLP3~Ed4CB4UF2>NKuOI}O*9+fB#n$L2{bAn7r*OB0 zV?SR8C%V-0uABO^lcZCH^g(TdOSbV$Zpiq1jRbV4Fn4~u6eaQk#vob2PMrQ@U~wg> zmhUYe!?^Lg2%g?P#nZs!i6OkE=WWNQjxE&VYgxx_Vs#gGA~gg*Oh&$qqA)j_6VyiS zrvW#6dMHrUTrFc2hUUh@i8Iv_L{p2omt5)i;%3o(Ewj9Uu%ylxcTF}Ibrr6M+8i0- z9q}b3-l5w&{V0oxHU*s@fACnf;F#JR$jL$jH!mOKX4LeOXM(+qOVzmceoui#NH+T$ ztHF-;HJ;;Y{=b1$pOKxz*PZ*o$uHN^FN5~XdW6o#AVOyg;nx%U{k#j0O*UiPP0ymR zw>(Pljy6|fkj1TjKILQ)b_XUxURSKHt$ z>n8r`U}d6T>u;I4`E37jvm>SJ{xz|Z2E}{u2Tc5z_tmB#-+cxct6Bwg%R(eXBRu>- zLYF4`W)=FL)5s@gEm-4KJ;|5}+le4il$Y~6Jt4`{&P`{Zv2r@$x(tjJd%`>pcyUN1kEr zpb7~G{B9*yZ^tybiu*%nC!;nv>qnezWmXM3WFQN zt1m^<%R2tI*N?0)V~zSTxy zuxwds>&USv7vgT}dN8mcU-ec`FNoLP%}pLb#mLFU*%9#I+XTv#SyJ<*f9K72Mky(Q zi^ZVlKTKx}VF@os%FKQR&r%nFv2>FKoSwho3)*J$g28lMBctidmu`#Ye&Ua6VHdD7 zu^KRO%258St)MXMR5KsXy4TxiPc$|MrS(D>w|-=E5M3KsFd5;uFHR2*ZvWxzFaBqk zR=1otvMUS>3cvpL@khY}ZzItlO@dOZu}nvYl*Pt!6013n2fmvf`K3H*tqtztq$!d( z2q&~`N-%1G{(PGF^-pR=V~5v@(lqDt@;`s2ht;U}x7CGO1F~;Z3^{+SKjw^UQz2id-T=>G1qxs@zV9=E&b|#WT3%^a|$Vtd2dYp zxw6vqgSUF3)IbiqUTEW^*cY4nAs=TZ_%-OMJ@?DKv1M5&>U^KK;85?q3-k!)`Poc; zWA#dS4W|^ZbT`Xl+hW<601ZsZI*dz)nOz zl9HB=;fBszjG$jmouf=C(X1*5&Y6;49pOoRZ8I=>i1&ce)ti!$*??C(a`XKUOSs!t zk`m0EU;ifb{D%5n3|ia)OI)YVdNk5wMVst&7Prrihj+9O_+kytN4q1<{YqaLgb?1E z3kW+I1)WcyEUm|G>_j~ormA8L^Kmb%v=EaHeY- zv*4C^NQj5f8`R^T)u4sn?n_^hOs!of&}~PF!!6sHgC>KSn@Re;tZ3{b>gDgZ>Eu6m zKbKZJJvs5rp|J8gSZ^U$``@>W zc|qCl)ie@NQ=+CcF;Nk9Si?-RT-wD(VI?zSIKgamdr6IUQ8#-jZP3B_*+8F{#7jMf z=N@Mjht2~+TKiYW9=B}Ezth_%zfqe zSn&)KzW*0B7?$U!wlWr0bx;QDVLcn(uHgN%!QODNEjzJ`!PC4L`1F0UvNWe0pSj5$ zN23(=i1X0jSx0E6E>}OKY_DA3pyE4U1Ju-F4Mn6+ufC`l^&?xl0PFqiOC}Xr9FN7K z!__=)YUl+N2)mWAIyx1q5GcPN6%~cNvze1Xz>T4TwKI(@(Ob><7!v1wwHO_Z@B@;; zR`~T>e)wgn&j&96;$uV|OCy_T@diJnrmHQ~Tsh>QsLGITNM5wGPN ze9_IS2Wr4s7vH`;X>7!4v~_4biI#kZGRT|Kuo>-Y!duOmUoblqiOAnyHqjEh@Q z=S!4;H}OKVqS{jLPe+c<4ZDs@!h%xgzBl$nlqP$7w1OQz)H5=pxhkb~;upwYLKPs- z#Ndr2?&i_u0ttPafPQ!@#mR7+lxrSS7#9&mAVjrc^R8UQ=27L0 z1gn~hxVp*hn3dopRT?vWuB+8jYr&xg$YpS3C{T8qc&Y41jG6Zq=O57jQ#WKkK zGpH7SQ+U(_@?Ipm&gZ_=j3*fn!#}lWEFPFg)>w)sMoomAR;F|z&d$4HfMuy9dBF4M z0`9OzC(Sw&N#Pe*B(|N-*UD-Cge@FZI4yD%c8n(JEDnGC@%{2lx$f$avG5vMz_-2h z26>tOGNLGkQDIJzI`cEeEVBgf$J}J-8nO0Lw2r`A?^e6s=bO!0=^|L}_U zccij<@F+O1h4qCWS8+gTdv|o$7$s-U##qrhLH!wzQ4t=cq99nQ+__{ zTX>TC;Ubn8D=})ZSuO451IjW4*__DZ%p~RxB_U-LqmFbOpL_A~*LwL4AocoLYO)9?Tc)&6lx)9Bd zhQ%?b=U^<(CR?}LYBzxDJUl+aW0b2Twc}HX1W&vk{By@YfQ{#wPK07KdhqqO%P`Jx z{;;8eVs;G0FJs3~y$~cxf+}iGDCZLpjf9>_ZY2^yY*KOQQe~bx<8CM6Vq@M z%jwB$e_;%~t>Hqc2e{Un+^7sHTS=dk$=2u8z%h_RDzW*(*9}XAmI4S3DZtE=cciQZ z43V%OlJBeBr+tbKPkg*F)kzIBx{B|HCsB6{82P#YEht#WV~_iL*es&yf6sAR_jcuW zv~S+8PJb-|F#;8*!2UIaxa)#-GhJ>~sm|;*utNpf0u#S(0i8LRIf<>|z@sTbjG;ky z4bh+K{-JKSsK@X{E31UKZDW+d^wf>_J>!ko+PAYkCLO&w0K49BKi#An<(IsA>YA&5 ze^%tX#V_do<^9=%tBhyeaRQSDBJDZF|2d%0!9{pfFon&b@yrk-!o$Hoin73wVpCW} z8EXG;X5hA>V$Y2*SpEvdh9lqsQ>_f9zLEj!a}2`1xtTa^ANx8-uGS>N$0y7Ani~EXKu24gYmmXGc>4 z<;PuBNykw3JRF`xoq3k$f%27+vDBefBM)36TxYHR*VN(#JkYJ>1z2b#)h)KzhdaK% zgOxN7k4I?Za8IBJ3yUg6Sx#Epn^_$-Z>s{$HO_6 zY4*b0VX^9SZp<@Q(bM8p5jIn@|DnyOM^&g#d)y=1c;uck{EnXA-?%c3Ve47P^=^tbjHaD1MJ0IRp}Hv za*=%HLnx2M6S)=ik@)_MyGg@W3GUDaot!&hQ+uSd%=dtig0`+vFfG*`AuEe=sPc(& zw~&!!BQI=Ew9m!a@Xn+ToCDVvMt>kg;iP$2+De^_4*_JFwYat9^z9E@_PSx)B+oq! z=l$?s+q&o!J9?%B^$L&#_rqV-QT8I-zI^F4Bl6H%EPilk-2~v$@OVm4=NC&o%@9ky zQitc}#a(o(!t6-{phh|pg8}vwI|H&;w2Vn?V-CX2u4hOnM{zER0jyh}}{>1!XITeQYef|I%0e``R z`uD$s$4-P35)zbXS=(7{9Gt$D2Q@<49Aw6%iqR5|hX(o3+2tNx1@t=%8AS>C(kK4& zc4oxKy5_}y$-p8wx>ES)_}HvF!6m5G6nLqo@ISb&uV1(M2;U&95~m6~cMM!;;IL|e zFp(?F7rY_#a``@AM;{e&dfPZf3MF_Z2p)ohB%42BebPy;Y40uj6FFYj(|94Vek#wI!1h zdq}%k6|Tw_wZNvB;YL@EQB4>a--{^u5A#|hW_Ctr{?e`y@IGsq3v(G^dg>~2X^-}m zhpVwWpB7d7!pAfIH6WrZwPO=>Eo(3)qDOAIjk)z-`)IRT9n{-Hhi=eW#`EG2n+u1U z_~=kfPPh#+%!Omdi?K<17!^`=|~OR8!o zVR@#*kV+gAQQ;oUfi&kiVLRfwnwo}Q74OV}lC@)7oB(ISNyA84k(=P@-_ceX zvNcgQ1P!fv{6&tWzN5@@6=9$$=U(RbD`D4dnS?5l{fBKoZ?2O&4YSDk3Z7u;JX$?Jd#eS)c}(K zBZ!}U-A}Ps&ena`rGSwU-Fwev$tabQgRu9+Mp<>jQk4lzkJ2dv=qLkrAp%0O2Zt}- zseU()1>-Ro|6?LBIRk*qs1kURU?JOJ#a5m>@Cm*v>|t)InA9!=0=g#+kK?wkp36aZ zw&I0e=An$^4U+^X?G0uY)KkM>*w&qi^C8V#D)}@Q(0QWc7T;SCc+qtW)w(5h;vp1I!31F#LtJE!$HiAWXa|eqxNQU#Kp3M73L_3BuI_MF`8|V*7Bb z93p)YO2W@!ZyAkQfIYfMhLcil`;wP_K>1!xs8UMc?R&$WQWwqOPUg#wc*%W25w?E^ zyVg{^4_@;A4l#Z^yo_0hdgMn$BHk>NkFc^u@U}w$g6sB>Zg_`d6(tK5Q;BK}L0FYE z)8o%+cXb3>*=brZ63(@WhQK_zM*JiCgo<6Iw4T*hA%W=W=B$Tby;GVZ$ZPoYP>E%} zqia0lAzL2K_xX&h2x+>ieC(`0rfu`zvi=DApLMFY%D55FJ=tGV3zXuX3LW5A5brY( zF%3ru0(n%}{SrKoNcuv_w#4|+6pv7qsU7A`dx;C+uvJ$hJt zSicNl9sZOdN~Ok`x29gj<(2rdIs z>Rl>_g7<;+$0t^F;Pj86;%Xp10qJ52`=0*mt_zd$>Vc1;%1O{)lwbSm(3#CXbGlsy zKp4VX&6Dr<#WNEq5@2@q%$QCsjP2`am)=`Ks}mWkcn_hMg-PmZB#w zHl*^D7|w-s=Do5Mki{uWiEcHQQ0(YhllbuV+l^MyAV)3o zd!#=U?)R>4o-t6;u3dTnX#?D``&4%DDgmv4S!yy+&E@tXYFB0ZswNoofyVYJ{=tS6 ziEmZNZ8U+IxGm8VJ(W1oWZjo6Og#5)@t){oXewmw%O*d!k8(B;YrEx|v{^*?)g__PGJ)`8hKpW(aUQ@t;PocauvGE;9(NlCH9Z5Z} zixfQzF)_d8IYFl_4*2TqZRx@F%ar--(wq;2f|ud0z5=PECIFLz#tr zRT$p)$rd44VkIriXj1th`e=o3#(v}p%Bh?0oD7~wSw4#r-7|j8k%R;_B)X-@?vXp1 zAI(w?lTBbzTL zVPM1>Nu9=P`#jvhOA7ahI5ltRJO#Xx17HClV~F%5eJ0{yQ2>RK7_+0-#K)W5qI;!# zt4teM?onX`k{#OZOOwe*md!E3gn0XxZy6^kzDr96sqNA9NvI`{q0Sx8`T)3~S+A&6 zQ#yTUah5)Y0@0{7N6guYjvYxy&}LP<4;v8)$#K$G>&rcio zr?pQ#=Otq*+MT}6b^#I=d8p84fdFzuCYdBjTQa!ga2MY2bKcnbXP==k+w?d1H<5X&Yh5XiMv|qP3%3it7SUx zq$8cNN`*b6&D(2c#AcoW9DFQyDf)G3RmFm_GY5OetE0>6j;^_L02HNzs^4V@Hq6N! znGMfU06{5^2Z5`v7t<1Gy#;`Xa3@Uc`2xjvfwg{K@zT zHk>ljA6)z)1|5MwX_j*KliL!K9;1sRSSCB#3BBGr$`3cM>pq2atdLhdri(>+W)Vx$IcT+Hb#C9nk7m&y!=6)f5#e(+NBhTV+U$9ep24id(n}u^As$Q)f8CDz^*fD zrOVWg-@^QS2)Qlqj2pz0#KkGKC|beSa&idbL^UUOFMi=d?c3mXhx zA;e*V5ss@8M$NSTPF!*UBNiHZ*>ZN}V-5Z*VsTN-uIRNIj?gu6>b|D?{Z2h{cP!H0Ke|hAafmB zUhL%InQ`p^b=4DnnC+^#ZlpaUW={g%F%OP+S37G66P$uefis*^a}|_kU+gISg5LQy z64sY=KMKxc9k9u-Xy*u(RIM?F5OrszY#P9YnNPboI?AC?UQN|%h=;8k|G8Jdl7xB( zyQ67N7?k9;=xM-Occ+TvO$NkS*)}SS`KX(2;u#^ZF>eOolJOb_QQ2n zJc!uTBQYbsyI>KLFHFJ@_IY9?FzIUr?=a5;l@Kq)gUx4>Dvwrxh+D5@1u+@cSSH&h z733zUMWVQ_!p!d6>sa|0KmU-%7IsqpFkksjeA$oTDj&vEp!Tut5h~|%{$Sosu!L|c zR{n6|0?yf?a%UMu@eJ!-)twxKWADgMYcEs}SXX_LHs@FS{I>7oN%{4ezaC4S8BiO* zAC$=0hAa2=h)nvf%IU|7PR=B4dPZ(a^!rrzTOjtrz1#1>`|qv&NqQg2OX&g!`$!@V zs<|cXpWtEKM?IcJxxQu*H9;KR>uP|yR zRVY^^L!2QU*Ttu)VtMts4hL{n!%LtNTISz)9_zxS1qD2ANgm6-N|jXYSQF{p7o_Z7 zF{|`G+KK6*2alvvZc zgjQA(@GIGt;S~5XFhXS&#jmsT$#HceUh#n<>{w6#>U>_?ph$EI+(vzbuBi|q z*kp)TXMR_=iWof@ePK0xZ6i&G3s6dUieO6un*)3|1SugUrW}{QwB|lGg?BJ?6t`aR0SA3_zwMQabQrSBx+&@0HC`RyDM{`&Wi{=^FB48rJ>D0-plv0hC z7kxMiYv2*kGdmg8O;soy9Ov~E={y2dEeTsoIxtJFIAW9tkx^eLN6d7dP?OE<@3Fqq z7N_F*x+aTqCEUqrr(%wQqA=c-dplx|!ksTV`-B&%+(*LXpgfv-z{j8Xjg)eA!TOuP zwJ$?_T8B?u@wJMR`k+00D+oby-$Q?sYTyW8X@YY1SOXKch9n+yP?dxTg5@~V_i4Z? z4!Q_fpegImw3Gr1`BvV%(7?e)t)V8#O6uf*_m}a|gsQ@i(&x?3`dBP{-y$)iKRwz- z^OFDOsH5(b+c%C2I+1`41N+nVT{Mav0T*F=h+PpL)^ZKrKt`6)t4ztei(pkTa1@+< zN1=T4j zwdQY*Q%eGi&<2jx3sULv`+e$Rr4;{L^Tu{ogBU=~umDM1u#letdHm7>=+a@LE-^@&-JQTUK^$kM_Pj-O- z%9Xm@;3w(B5t+(e6bYJQ-C~Ty@#9FYciexl6~Wg`3tT31{5YI@$(-^BU8qc8K8nIZ zQyy82IoFNV0_(HsWgf8lBmIUAGwV-WBdRz2-Fu1Ah3Zz2DVog|#MVCCuycQ^l@m9I z5g>mJuy9zo_j71TvT^(@%j73p7V1a#&tsUs{YjI%d=`##I0E7}!Ipy!4e;iTcrmE3q z)O!B09>2zE5P0#pxdhkK&?))XW}8PKJfr77={#6PT5OkxH0e;URp%%YYq+{ zi;nzJ7e}{u{wq>~sUy5<7`19n(4v@p8>@fHtn7^M6lrC)6gzJIKTZlXG4d}*V#G!+ z?-b*3CjQyC7GAfJymJw5m5hFs(RT{2s#^J|oW-Unt@%^Rg0z&_^j_%C|%v)1lF`!GNl%#j@|;=Nw|4p?HzHUdDS|GyVJ@s`-d W7(N`A^Nkb>_)(TulPi`n3HU$hP@HD~ literal 0 HcmV?d00001 diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..0df2873 --- /dev/null +++ b/build.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +INCLUDE="/usr/local/cuda/targets/x86_64-linux/include/" + +clang-18 -Os \ + -I${INCLUDE} \ + -o nv-info \ + src/nv-info.c \ + -lnvidia-ml diff --git a/src/colors.h b/src/colors.h new file mode 100644 index 0000000..4c9c2c9 --- /dev/null +++ b/src/colors.h @@ -0,0 +1,24 @@ +#ifndef COLORS_H_ +#define COLORS_H_ + +#define COLORSLIB_VERSION "1.0.0" + +#ifndef NO_COLOR // With colors +#define COLOR_RED(string) "\x1b[31m" string "\x1b[0m" +#define COLOR_GREEN(string) "\x1b[32m" string "\x1b[0m" +#define COLOR_YELLOW(string) "\x1b[33m" string "\x1b[0m" +#define COLOR_BLUE(string) "\x1b[34m" string "\x1b[0m" +#define COLOR_MAGENTA(string) "\x1b[35m" string "\x1b[0m" +#define COLOR_CYAN(string) "\x1b[36m" string "\x1b[0m" +#define COLOR_RESET(string) "\x1b[0m" string "\x1b[0m" +#else // Without colors +#define COLOR_RED(string) string +#define COLOR_GREEN(string) string +#define COLOR_YELLOW(string) string +#define COLOR_BLUE(string) string +#define COLOR_MAGENTA(string) string +#define COLOR_CYAN(string) string +#define COLOR_RESET(string) string +#endif + +#endif // #ifndef COLORS_H_ diff --git a/src/nv-info.c b/src/nv-info.c new file mode 100644 index 0000000..bbdc53d --- /dev/null +++ b/src/nv-info.c @@ -0,0 +1,41 @@ +#include + +#include +#define NVML_INIT_FLAG_NO_GPUS 1 // Don't fail nvmlInit() when no GPUs are found + +#include "colors.h" + +int main() { + nvmlReturn_t result; // Don't used + unsigned int deviceCount; + nvmlMemory_t memory; + unsigned int power; + unsigned int temperature; + char name[NVML_DEVICE_NAME_BUFFER_SIZE]; + + if (nvmlInit_v2() != NVML_SUCCESS) return 1; + + if (nvmlDeviceGetCount(&deviceCount) == NVML_SUCCESS) { + printf(COLOR_CYAN("Devices:") " %d\n\n", deviceCount); + + for (unsigned int i = 0; i < deviceCount; ++i) { + nvmlDevice_t device; + result = nvmlDeviceGetHandleByIndex(0, &device); + + printf(COLOR_GREEN("%d: "), i); + if (nvmlDeviceGetName(device, name, NVML_DEVICE_NAME_BUFFER_SIZE) == NVML_SUCCESS) printf(COLOR_GREEN("%s") "\n", name); + if (nvmlDeviceGetPowerUsage(device, &power) == NVML_SUCCESS) printf(COLOR_RED(" Power:") " %d milliwatts\n", power); + if (nvmlDeviceGetTemperature(device, NVML_TEMPERATURE_GPU, &temperature) == NVML_SUCCESS) + printf(COLOR_MAGENTA(" Temperature:") " %d °C\n", temperature); + + if (nvmlDeviceGetMemoryInfo(device, &memory) == NVML_SUCCESS) { + printf(COLOR_YELLOW(" Total Memory:") " %llu MB\n", memory.total / (1024 * 1024)); + printf(COLOR_YELLOW(" Used Memory:") " %llu MB\n", memory.used / (1024 * 1024)); + printf(COLOR_YELLOW(" Free Memory:") " %llu MB\n", memory.free / (1024 * 1024)); + } + } + } + + if (nvmlShutdown() == NVML_SUCCESS) return 0; + else return 1; +}