From b42176b010a8055c30fe18f0e4a27846418a6210 Mon Sep 17 00:00:00 2001 From: tahatalib85 <91789717+tahatalib85@users.noreply.github.com> Date: Wed, 15 May 2024 20:17:05 +1000 Subject: [PATCH 01/12] Create Readme.md --- ai-ml/LLMChatbot/Readme.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ai-ml/LLMChatbot/Readme.md diff --git a/ai-ml/LLMChatbot/Readme.md b/ai-ml/LLMChatbot/Readme.md new file mode 100644 index 00000000..797ec4ec --- /dev/null +++ b/ai-ml/LLMChatbot/Readme.md @@ -0,0 +1,4 @@ +# NutriHelp Chatbot + +This is a LLM-based chatbot application designed to answer questions related to NutriHelp, a project at Deakin University under Gopher Industries, focusing on MedTech and nutrition. This implementation uses GPT3.5 Model from OpenAI. + From 1f9da7ec8fdf98c8d2c8805849440631bd9532ed Mon Sep 17 00:00:00 2001 From: tahatalib85 <91789717+tahatalib85@users.noreply.github.com> Date: Wed, 15 May 2024 20:19:19 +1000 Subject: [PATCH 02/12] Add files via upload --- .../flask_chatbot_implementation.py | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 ai-ml/LLMChatbot/flask_chatbot_implementation.py diff --git a/ai-ml/LLMChatbot/flask_chatbot_implementation.py b/ai-ml/LLMChatbot/flask_chatbot_implementation.py new file mode 100644 index 00000000..2c4828fd --- /dev/null +++ b/ai-ml/LLMChatbot/flask_chatbot_implementation.py @@ -0,0 +1,98 @@ +from flask import Flask, request, jsonify, render_template, session +from flask_session import Session # You need to install Flask-Session +from openai import OpenAI +import secrets +from flask_cors import CORS + +client = OpenAI(api_key="") +# Generate a secret key for the Flask application +def generate_secret_key(): + # Generate a 256-bit (32 bytes) secret key + return secrets.token_hex(32) + +# Generate a session key for a user session +def generate_session_key(): + # Generate a 256-bit (32 bytes) session key + return secrets.token_hex(32) + + + +app = Flask(__name__) +app.config["SECRET_KEY"] = generate_secret_key() +app.config["SESSION_TYPE"] = "filesystem" +Session(app) + + +def is_relevant_question(question): + """ + Use OpenAI to determine if the question is relevant to NutriHelp or nutrition. + """ + # This prompt asks the model to classify if the question is about NutriHelp or nutrition + messages = [{"role": "system", "content": """You are a chatbot related to Nutrition. Your job is to see if the following message matches to any of the following: + 1 - nutrition, food facts, food comparison, related information + 2 - Is a common conversational message such as greetings or something similar + 3 - Is a question about NutriHelp/Deakin University. + Only reply 'no' if the message is clearly irrelevant to the conversation, nutrition and does not match with any of the above. + Answer with 'yes' or 'no' only."""}, + {"role": "user", "content": question} + ] + chat_completion = client.chat.completions.create( + model="gpt-3.5-turbo", + messages=messages + ) + response_content = chat_completion.choices[0].message.content + print(response_content.strip().lower()) + return response_content.strip().lower() == "yes" + +def ask_gpt(question): + # Initialize conversation history if it doesn't exist + if "chat_history" not in session: + session["chat_history"] = [] + + if not is_relevant_question(question): + return "I can only provide information about NutriHelp or nutrition. Please ask a relevant question." + + if not session["chat_history"]: + session["chat_history"].append({ + "role": "system", + "content": "Hello, I am Roy, a chatbot working for NutriHelp. NutriHelp is a project at Deakin University under Gopher Industries, focusing on MedTech. We leverage AI to help people track their nutrition. Feel free to ask me anything about NutriHelp or general nutrition, or just say hi!" + }) + + # Append the new question to the conversation history + session["chat_history"].append({"role": "user", "content": question}) + + # Make the request to OpenAI API with the conversation history + chat_completion = client.chat.completions.create( + model="gpt-3.5-turbo", + messages=session["chat_history"] + ) + + print(session["chat_history"]) + + # Extract the response and add it to the conversation history + response_content = chat_completion.choices[0].message.content + session["chat_history"].append({"role": "system", "content": response_content}) + + return response_content + + +@app.route("/") +def index(): + return render_template("chat.html") + +@app.route("/ask", methods=["POST"]) +def chat_with_gpt(): + data = request.json + question = data.get("question", "") + if not question: + return jsonify({"error": "No question provided"}), 400 + response = ask_gpt(question) + return jsonify({"response": response}) + +@app.route("/reset_session", methods=["GET"]) +def reset_session(): + session.clear() # This clears the session data, including the conversation history + return jsonify({"message": "Session reset successfully"}), 200 + +if __name__ == "__main__": + app.run(debug=True) From 60e6fd708ca366b54f7e63811ef6824467521cc9 Mon Sep 17 00:00:00 2001 From: tahatalib85 <91789717+tahatalib85@users.noreply.github.com> Date: Wed, 15 May 2024 20:20:25 +1000 Subject: [PATCH 03/12] Create chat.html --- ai-ml/LLMChatbot/templates/chat.html | 51 ++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 ai-ml/LLMChatbot/templates/chat.html diff --git a/ai-ml/LLMChatbot/templates/chat.html b/ai-ml/LLMChatbot/templates/chat.html new file mode 100644 index 00000000..4da091ef --- /dev/null +++ b/ai-ml/LLMChatbot/templates/chat.html @@ -0,0 +1,51 @@ + + +
+ + +}lVS%B=jqG#3~pg0}qmU=eZ zs;xKpp0gJH%TS%A(=aetP2+Ko+vpXDbbE49R6*Q)(Ja2-pOt*4TW@HL;B0cB!VSPX zl@1W;Tm#k85EsrA+9}270j9zG@WZl|rG)PJ8Q4VQ7wiZLZwN#2^__?|$6DJRJ%6ow zb(gYl?bR!Uj@g@3FFQAeIpFNVDS&E>5IIz&%CB$WpQ2n18$3Obt`P>uxS)hzz>)u& z#opOr#Wq?Nc(J2QppZ6BBa4T>5gl>?UepI58@|vUj9m!ay!TXV*|EHw6T6k=pOjv# zXThWmxddfCd3xZZR1dQ$xYCt(E+$89rt}je>DGuOwMzHd&_)a-ib}SrxW1?JLk-7H3uZtp-5Bdl*L*^7?*}2h!R%@>cM7& zR(e*|U5VsUtDi+kU4=7tpePr^9FN!&TuHgSmqU0NA6z?AFL+W-y&!_emS~c7c-lRA z+?tOLv!}Y%?7Wmikp?$U@k)@facfzyhRJ78l_X+O*MZEPtf(45(Zz+Cii(KTLXD%^ zaIcLKioodTy*bkmT*=-KRoS_Xr*u|`Yj>t(NL7?#h_1y)y^4FLB!F67TwkxqB?_wd zlYiTmtSHj(8sD3X0#vCRa}uawx2VGa2v<6Y?Jh5$5ImK(&dkZ2kO-EiYg@NL4Xp-t zkgJ6Hoi)lq2?I;hFvBHK7o6sD1uqeI@d21TRgt`li!52l9F#O_ofS6EaQ_Y-bQs}} zIRXeArP>OgM-Zh;tU6nopGm_35UDOv703)hmcj(?IJ5ao3PnWWys4ffE#(THY!L07 zOyo+L`bJu3AhcQFdjE!EoaWz?Or=Rp$Ot~F8B0h_>T+vPQDpoktriT-(Dh6*VaEK3 zne`d$O})$n1V*xxjg1-Tk*LgKSjNJ6rH5JQLNM-ldN8yd8+}G0w4##*@ZB?E51JV> zEkm|>Evp>#Yi{-HCtz=Lfrpc|Eaeg&9k3zFXwWronD#*+rRNF@QshTkJ;wURBl`6j z^pXxT+;X yGx+G z!$f~f<7DcUdFpYSv7xZkZyI+N*kT *Acb5SBn<7}?r;zQ< z8G_E9c=|K@dP51WhG6@f1(*~uJhZGofpL&DNRPaG`KR_ou09M9jmzB{T^&MgFXlwi z{yt4vHih`C^|zG3kcYIZm=F>iJBgzp;RaQfi6bDSXCTDMtKP`dkjek |Hw+pnC(0KqKggf<&_<9+d4;`iz8a8y*q=--rd(L zD3hzqY3f!{t%r$c9%=;RbFBn4Q6$_NNhtpcV#W-ZY47L|q?N?{!_olGk#$Pq3WBE} zP^wC#HiQg&AHMxSP&-jC&z}z}vJ~CDXTCJXUk_Wl>D$i<2Y&?GW!SVHJ{)B*%SE^b zo@4;*)FhR0i@%4(!8vTt%vBF7&03Fz=;vCZU^;7grbAXQ=!F5|qb4CS!MjIl85Doa z12qp;-hm*<;`5fdW8udb(7f@O!4KTeQ|gN(3AxM#l;OP%A0yi> @P2kh*l&YN4}MHVhKpe0|QZUf)>@`YIM;C z7x1anItEQ* oM*y}QhZwU`fE;m` z&IjL6lgn&iXXvcU2k(xQ0&MrBIt6F0AOc%emRSf`ORwq{I{FF4P@|W6G<%{b$hI )#qKg!q-$bG5hr^fb 37^_iSCRwcheyt5!5wkb%1I zqcaVKmT$*6U3sr3)yqC}1-3EoXNt6L@5&Mjmm}6HpJ!DCIn8&$c%saQ<>M6 FGg{YvxVq5+Bjh2S>@7P$?ex(RfRb}AO5JRe*Ya(5* z&EDGk83=IMoq>^lPtDqmT!Go@3RNr4sFYdm6>K%RtEsEwE2DmKE|S3My>4C4-QL }BeyXt%Bjtt>*r?#|^_;kjjGX_h`f48GlU~@p9Fm^dog7e~ z*^L|yAHweJhdA39drw0bj;98jYhuYi7-ZKsk9y>GHj8`Ywl+h0 <4R>kKoG}9Z~sC=@z+oXK5+S?+1vg+IJd~n;^oT}t*xRD_%5C7&zis*d~t8oy! zC2hw|d5x8*bh%n%DqIa# 2o$lRCw?>S)7c7I!9-CW{>et zpWRDtuB10NQ##vdo|bE~H;(@+nI?aAP@%{9UrBvAz;FjRUj`X&`__HjPhH*r>gw^g zOqIExFVp94gsOBoTAwOhZSBxM_2APKP}I_$L0iz;w*T?a<@$f4M*crh6*-%mBfV|W zb`F@AJM^n6Je&-uX%8Xx6Ibn?)|m2FpZ~S%;={v7Wwzh!>@oDyaCw>g@iKkh zfAWfRH-<-e3ve&2IdmO)X7e^WdU9@jc(%7U9qk;-up@DQx=2y!^8LRqcw1n#19_bI z39}UT?&DnShoBey028pvdLEB@40KQ{#eR8NV<&9o;oVcG3olLv32_SxFTI3*WiCQ( zOa6#}nTNNZ??s4-bi;-^lv 4udUmw|Iej8)P3#35gU;pLtQ5? zzk182NTnuAq;{xKvn0e`dzqU$yix_xVHI2*GenR_9rA;3wmQmK#wJLvNV@TC6!Z$F zUad#4+|sZmTZRsn#vlr#Ont8D+v!(jxE Ob%0yNur*~XE4{trnN@%v zF~`pbl`h(T@)9M6xoX(B4R}_M6R8cCxzx@@hT^QsLAm>+98K6z`P@_s6ual4_$ukI z=p4$T{8ZX5rS%LK+44Fvjz$9C^6=pLKCN(Cov4B!W>ak;oro1`d_I);t#NMC4$s4| z`pUgWtY?nPg!6rZBk>CoBkkwOg)xNiTFi;q;t>X}nD_ExkyJl6`{G3!`DtQ~KL}dx zMfSAETZ&cE_P_8OO~=L!bqe y=CROb&gwN-c7>1; ;-z%IzoJl94@~@M& zBDhT(#4a6{hp3+F<(x?`5^5%ABQh6wD_N8@(Ot5ihM8*~kEowHE)qu8VsMqpQc_Kv zAA=Dx2vWuD!E)4j1B2XpwCj#Cok-7`7g3O$NzW3%vneJvbjMiw$7AzFFsz%tN$BgC zi2n10GDiV| ~!aem%gN&Nj+7$pVcNd8rrxjmCUq5wFK~8$AeNvY#8-m>Ge45 zU&BC4lbnVwoA3FsIl2)t#*DC=u9pDzTesY%1e;;%UF-ErGWMSM%<&El_20@>Ps$ws zjjoBC1{d9A^y+aYZ~H|R)VVSI #t)lp&152PXb9Q!9aF7t-T9~ AsXWZni63PEY^7K;v)Z#H1yH5U!n&-Y;c zSGwjsbk$7Wy8Uy3ETyhNNf5R<;MQ!QUsKy`BP-!6jMN_&+pH_;=9ZYnDzxYv5E3l> zjf@WNDwDnNkUY%IcXqy?Vh>XBa7C$NH}&pPq%7y6H*5VWLf*V4S~X+bBteHA5?tG0 zC==Xbly;b{6l5i%_pMHEXRlL)?4gHKg=YVtIhJX8NoDjW0YkL_Qo7HmLW?$tY0n## zw#(EIOadf?!mR?BbT>Lj _1AM)Z!pHqcs; z8!IM{Of38&8Dv*DR`cI%Qe4@|Ib<5XOmUNw(Lg81XKoH}o^$HTlu+2Kh94;D2oV9& zHB1bn^7-hcv6H+T%JNHz67UPnVCtCiO;dW6OAl!%nR$S89kU#CG0ieMy*IE}p3An? z^bg0-YrxTa@8EF|!Ixs)C6@k_ou%n!b=x0y9Hphyxqc^_0_&DsE6^QUk+kHsYohJ2 z;1Dm^fiiLn^v80>O5D;Lf?xh^)4zkmNQKIEI38dV2;6fy=Gp6lGpGj%LNdHwg+z`)et)4cIt8gg)&E+Rmd43o z^X*{jFJ-eNwYAR_z{R+=yrx=b|6F(HeX-c3B)QAX*+ieTOST8&v^ ?7y~*hw5VxHa$QWhSm(I~FN1sQa4>X7XM{_ u zzgs@Ob7ULSr6%1tYVHWclCEDnQAAg(m=re`Q5%IrgY)n>p{VK$rxxac{xEvmG-Jk% zX{e&7&%lR7Gt9PM$ZZrWZ+v`Raq9y|gDC~E*J0##;v^VY+aYxBY7TU1C+@}C^Pxmz zr^|@s8aL=#-RPqS5P5}O??AOQp0*!)p)j2=@zvHmb#;8(-RvZgzlB0&tvx@4(A+W$ z%7_-EaRE Y-Z#1*650X5s{P*Wv3pPpkew&$NSH#lplftIMA_fflW^ zC3)eDqidkTm)(rNc)CZy(lqs9wiFSDG==S0aF#@{*|p0zia+;Uv!WCYeM6kubM)EA z&kh?|t+KJRb7}PDr@%C(Rnl0C?)L7I9HAL{kdI?5G9f&J?mH8?IAg5uKjd1x#~~cc zj0+abi^y{??J|{cavXS`fO9lVBwumQTbQJ|#)lU;bt ;8+`=k &Vh{4_);C+)*>abGUIF-+x zRFu<{XTW3I)!h?3PB0_8r|0aj4!h?nL6F^{qCsExz>ppy?sxB~^EJx|ct%HL6+j#m zxb|Yu`=iYk#ETBEmr-rbqH8(U;ZP7M!72cM$`Hv7Bbn{RE0s*jr7zV_`$POWVjHK_ zZthMLS$wL-u5pvM)0nWPHFk9kmVH(vvD6N77IDg4C&5j~eD0vp?wNJdXE4Hk)u`z5 zs)!8dyjHW%V&uKjg@1DD)OR^;?yY=2*}K`$|2#Y1;tX@{&GL|?s#C2}E%nnz!jE-k z-dO&oos>vQVKdey_qhPzoz`T4zmdX__gs+kCi$nAE2Z>aQsStmk3OZ8kcyp8ym9rz z`MEdS&m}wVa%od%wXBRsquO4#+b!!D7pje}M95EaKV> z<>VLT|=YP <@i7<=^*W)NRN9NN) zi`f@agy_WMWELRe7BVBwI}`DQptkzn;xz9m`!OOomc&n+2l_nNh>EH(#G#(%7iH5Q z5of=-vkG*@15Hud&9`}ZK|kTgpyu?_vwXPtJzau`&InntmiS=D!y{0)biIVey%vpL z5p4r$e#E>7Y-wb18Xv>aL|iH;9=1AO%c`R3fxYFiG3q}F5j!VDTV*=B7DYUW2T<6= z ui~5yQw_FFRc-m7$qx>lR}zed#;Vc?=1wwW=j-ku^{MS}G?% zG)FJbk#p1%70g#YMmF|lS*inG;_&>u$jpjIMN%1e=6VC?{WwcJ-atSSU#w)aCG? $U}e?LIs+IOxO2?%?MfUZ3f@y4GG-$IOYX$21~FCfmK# z+J{kGHO_09G@Sa@L#~TQPi()VkvlH&7oK9^(5UE3@PX%=-~gAd_eQf
ULi-^K9VNf%-B*N;L# zNmZAM@KOgI)!~Cvn}AJ9eM{J*w-;zV$DxYf*NLMjFDKQ%a1Yz^1&4F$>Of}imy!Bs z?De<%Y$TV}kUSRQ49dS98f1o(H^`6nE4yWa@PPzokI2F{nk6=O2{(ttR{!UV2jxhG z2bYduIg1In)7aMfVqOH89XzETw6U&UiFEfg-(_zW_(!-<{P)!D;T?YEv T8hPUp%8r z=L8Ph!!i4R4!R(#;t&zlb0nAz@FsjZMs9ky3eEq~i}b1SZz}=w-LAUXFm}`6yns zL$1_b6I?(F(~HvHN}D4v4sV;EfFEiRQDmeF(P1 z__IJHz&MgP6<)e5 zVm(363j{hcV_Hilod>n#8Omm&_Q#qiIl{6PVqbTgF85}@y=|ah9CE6gmgma3!56TK z?O(ZUks1}|DP#C&=E{`jGlH3{n6 fV@x;98^Rm4iDg=~c z#{2Yk;g5NoxIaddc(zH6?Ka5`YRud`e7p$sg(lO0dI_-av31iuO=cXw-2R0OweaiF zc=+<8Z1FcEdI4XYVb=(gZ{pLHA9LLhZ}CS|*ogTAu^7EC1*Y@zoE)cEHP@O>WK#5@ z0E7OJff-!Ek`L0;mcj$jClnzYl;KestM=JsJ?K9vlr7|;GvfK73?IkYF(YEPl g3yJ5lZ}kv~Ko=9#=GPH!%r|4MOy_YI>tUF=n9juHCsY5waIle(>!W^gxL QV1z3c65&r Bc|Y{gSqP^AeY?Xo8r-J=@!aj?W6<~it _|l`&1BU(g_HX1IRr ztzH7u(v)*ID1~N@S|nOKo 1nm#X(wX 2T#s1gtfty z{&fq&i^TSl%pfII*`?gg^_<>R-9zSGjzrG0NRpkfJPb5g7y~NU8F2X*du(0Rs=D1` zqkgRDR#1nHYi7j{Xt6*Ge|E+ d0Dmy1Vg$F r4Lu z$V=rf7UQeAMOI%gtj9fD!bw*NEW^+z7u-6DC;0G2xF{)%e7rcd5%dbGiDC8&G$xiF z>Ow;$?B3DNjZmO@lB=`mzl&}UZcBvry5WKtAvoED^zF>#$YVA(=ebcllMhK$xdsO> z;i@E_UP;OU1!(uh9~^%#!1>li&wM~=s^XNx0!%>8)A#&R%Ur;^8P0&9n?Q518FQxk zjpEe#7PAK8Du K0luUWC9-DFHvj3$&1euybxT-9`Z01ZQ@K vG)42mK_7nl`#?+1Wo)kwG^ zaU2IH#91(xk`Ax(gR9V5OCuh38#EAjMZCyq5M*2ffvJqUo|y1OqEAqzgLgusCAC2l zaV~txVIR_vFK4=&INwhe#hWl6a*Rn?xDe9ImipsX3jYp Nio~eLdVJT7xEHLHf2b zfV$L_T`s(*6~qT}=J;{ixFs}WC!AL$9Vb7&(OJfp(zZ3GBHr47=YUSwFYM|HE;Yg~ z2@u#tqQtC15*6k^eJ^(91tL!-(7$Se;T7?Oyx{Q#)$xj0BWhMpAF`5Fj%A}&JUK1k z>^Qm0`-$M-9l$U3xQqo8se)9Xb9Sv aNN$9Wew73RX-3`$}1(CsLestikE%}bX} z8?qSY;_W@(A6Z0*Ne}MQ3RKam$Eg(NKQvLT-`=1L?1D~|r0NB=Ja+45mul6tlB6M# z8v__g6U>PwP@BJa_t3dt(s(g%0!{sS<2fb9Px=>vzmPmi{E^FC8#1u+GDSAF*|gd{ z8RIU+tbCce|5cq0h1r2oV)!t1KxwFMqr|aPEypO~GUyn?_n`$L`0pt{aNTU%PAOvY zL=uo0nKHRL7#a(OUWECUJvSd85$9tk4(Nm;^}WU#WlnGml?!iYCB7mJz{wUDO+w|P zm_N?WQj#LYkC#r~txdeGe>y16=fY) WFO{Xn7+-mYRj%$Zpa-EFU@zY ziw&=VD9~!b1~>EiO%6F>nw%T`?~|ievnCVP*eNSSty8v?1&gV_ZrgaOh&s!f(+M=o z!fa&VGzAjgLV??cJe4)EjA$1bVXQ=MoS;RzpOg#$&Q7z^$EtrhmO{%KaIWGdLUX0= z4p>dkjQ5PD%OHT2#6oss5Cx#EARInz#8fg_&8HBO5)KZ*m0w-5c~;TH{aUnMLfEIb zqMf8Te&*vuE*CNFAi!-ziTCWpav!)xnYg~YEAqO3jwtM-Mf%%jCw5|sqyEIuw;#>Q zQMavu1vZoiP~3!hK&>cOI_;NE-D1Uva28i<9PZe~n+fW$acIyr?pO|kyX%Te!0A4z z5*Zgn(?1gK332FobVU$Ta_fm@iE2I;Ys;j))PEg>Rh=%F9Aib(Va`5^x{+k6h{IV+ zmbt5AKPD8GM@fY6_b oD@Z4K>$O&@sSM7;J7I))ZIE(%$8TPrBUk+nZ^^_;FI1FDDg_dQ^hTFn#T-Ui z?z+w9K`?j>iY9%5LIfcpQ>@1)XCU`BkTyC5(M$1A3eCptVTi|iy6xpfvjwTWEU)a8 zdu%h+CE1D6B4Vf21{0ZqCW_gLQiG4T0n+j_?SYrq*0?O9qE0j_j?xI0Wb! N#ww}c{ z?l~5mmMth}Hr|01PCc;Ve9+)N$|c|jJ*|Hob;tJ802XRy z?j)8li%_~g+_-d2u*t|*n0q1Uyyhzo?~6$KHwR_#9j^Pe2|ASVKNxJgu{?K-D_UIU zBf{m|IZn;!*F3fAJ?K)^{ZO=z TC`TYp;_^?5tWyaxIy)Uw{4=cg|}Mr{S~fW9nPVvQ%nv| zY=a! HKm Pr0la6&-X zrBJOlgbMcu8qT8(aONG{Ms2RWo7{Qeg%j&jjTv`ugt#y##f26lt-7>j#A}jRl2Y}e z%$;wCg7ygc=$T9va6O~PoS~00Zh~{AjmIqkyQzYTt7te9BLKHFDpKpx9O$}C?kk)& zE0J>SyUEF=2bqlkH6Z5iPL=DM<>MlM)7;2I^ZOM}pK=ynzBn@kcg;S0955Wu4FN)H zuL$<0R*7zDuo2v@e$;6}3;K_t>fp#S-7{r@@X?$S?Yb+ex*|5+f~S(x-d64%9fBo? zYwj;USUt%!bK|W}mOdmDl(vF%ok2!y!J2PQ!POa-eK?#Daa&)$0D6k(zDcCXw|%x= z@5#5wIsrbo7q)BOX8czra{QnFV6h|+7B{Kzdak9c1NJyJK9K^i%<2xF#nSfMG7sxy z_N^Jp949vZ9^=)Pcc~xCaOqOe3IsZXrm|dEG{}+q@L@W~|3?4Uq$e?hn&B~Aio0by zcA4kIQP=PgR<&?#;Rw3C_OCA);7p> A0-zx`Jc2piL0>2lc^lB*G>akDa_x zec|j{>2C~V*IyuQEJ46Lj4^Tz0eXD_(M8BM1i0SFg&ZkCCsh{m6g5u2I+77aZ1|oS zLKYbgGeECu5&1X{3YHQJ`R{ORT>!jLRR|v*IH|E~#4fZZa?bp669i+xy4(vjxG7W} z5p@mG>idC!Dp}FdAFKjeB2rS65jrAZm0I0v%!EW;W7_=8meHlQ(A;pGv*m9W zvCkmfKp5kgWf5@AbSbo~z_==c?OS9<6I4MBRv^?-$*D&u PRfoT;6gbkIs55F5L?(()TDBV~NzA+yFXa z=M^>;q5dc)m|5HiKJFH0AlOk#BHmJ>R@-3lf9TV(N|V+^qmpV2{UPbbf)|-Th4j8b zW1xn>i;t-ym|!~fN(?Do1A78%iGVVpy<-w{gUW-Fbx%)RS&>Z8SnWhP_A^9F*PFnw z`BoT{gW!MWcHxNzQ-M3qLDXZE=3_Vl)|g-vg+WrI*hHt0nlu^33*3URJ3xdUwt$Rd zgzLai*`Es^AdGLQNkl7*Tw|1mXPW}HqT?l>RelN}M=sL_m-0p7gn~sdMG>RAVv%}< z1Of+o{KbiYxx^|e-;4u7){n |B-MV6WZ zG5<;IZ6NeFPP{r2OcuW@n(_K)^Nr~eI*}S=FtS*XOnwQVBrgEBVn<9zlxJbWc*iLH z9T61$PI3XmAC>$yDkyr1%4~{w$}>v&22_#s7Se-Y0L2b5KXMMF$s`W_76?O*Xd9e9 z!L8?$%o+?v6!Z*jr4Pa^L`-HuG)j3s8yQsLOjsgxA&O31LZYG&wJI9#%!GtH10Agj z3_41Qej(*lm*A{aPSJCEEmxBJSX(5~@^k8pFP1`+1gE0<2su0(nIW2o!&YJgZ=As@ z2k+>bU#)W0sm+A8uA~*^6tm{yxSVPne*6A6bD)q4{iecO3>~uA?ajD;NZ%J>IbE3U z`O!rZf=9HAr4fYHjEv3RPvu`!J;h17qD|DY(LYLxN;z!9we;*i15AtM%8)XUMjy@y z5aA&2X&*^c1#Bes3`Z53k;476#HknIlz0c+DEj!VkLXb+*+?2QT*S*WT-XWM&%@9a zHp+jgB=MZx_F36%50(+_QGcGSXQ0J4JDDj7C7;>KSz3Y=qqa(z#{c{r_|3_21>Zvh zGSGx1bzKO_YgMnYwEpq7-NH{of-U6F!V3%2IjaoiPu3s{Z?nv- T zm4jA}T@0;x5-RflAY!miW8n6qxFK>Yk }K;3XY&^F@Pk5Wb7(2= zdJX-+O^Us(jz2I~L{Cs;78BMF&n07)R8rpI3R|Y-4qGObi9376nOr8P3zd~ERxBo) zeR6Bd**5W~JvEDVqR@Qk{O%2wLVpMPlwIr3(+s% fFfK!J7qcyleHb0jV^2siQRO>7wQ4`bf#$z-+!ZLSZ zi~K`p^aPVEQHBXQgdbhsVH@#&;#7S4Ny52GhC3lAa>&VVgD|W!w4^;2ry3dJkw`T^ z2WAo!ptHnR>Laf)=43N0UOxiEY#;$E1)0S7rl{IeLWVV>x7ql$b01JEy SgXMA#+|M8EGZGaIu7(Wo(#_^DGoq@1`w* z#&I*#5*tEqVl2UZ6Fh)yI)Nl4i0C0- KX$)tCDFy&@WtMNPcV3R2 ;fpgZkN{O&-Z1r0iy7P&Qx^Tn%)9w z^@Hgxt^&RdejiZj9wzwRIJQDEFL5!u_D_QmACq=@MrqO>1si|%AKGb=89!_3Y1BLE zUWO`VcTf8Mz=sxSm62_))qtAd{Dx4ztJ08}wEX4j-3;O;GRBGt22<{EF2Bq8`%2R< zy|{6`-z#2~mU#|JocY3Z=cw80q_0Fzk5SX_jx%B?ti7Qo9m&0|OqO|jmFkO+j)wYP z{B73d`@J`fl$gV;YJN*(NcFqe^s)J51$w~}c-(WQswYN*%R+M@GS#SZI_Q#SyaJWm zn>Cqfgc(*n4EHw=CXcNT`A`3ZyqU0 N=UH=OPzMJ?xj8$h$a62+;U@0%PzGYPaArJ2eFKSxmEm}o&r{v2Mmtx9P&c)f6{_Pe4 z{@>Z9cPRM{ zcN|LyJ2VPk91COUrpDj%_lMVp_|DNKH=f$!W&-QP>)Lxv2HPpX#CY3_{^4PQQrL45 zvBiQb{Ncj<9$AFgph&Ia!8m5XZS=eDZK0|=i;*sF=eOIhIz-ZC<3Cnmis15p?Bl$Y zlSS>WY;B3z5YnIw(MdOES-L{!67t9MshvR}Ghctu;sru0ej*#=4TM)zMV5!0dgxVX zYM$pgV*dVl7ybuV_zdgbdt*KJFg qL9UA)N-^ditq*cvi|07i0})Ycdgka0 zW-gO+$~EFM-%kPgaUXL|g$i{-5e?*D`>avvEw2%-F}*ZSm46MR7fXpfhVla8D>uR^ z+;}<-K3cjt+IMcIu2K3I0s1z)XFNy &@xoAD~dO6Batq*dpQx-H) 6zPwnT1P&i^j{+ZXaq=g+;qU8D_QF8v@s q_$ ?7*gw(*c04e+o;7SP~iM5~; z6Ew9^dXc_(XT4G)#%)ELi@0fz&%8+bBFkyTvazkbC59$>)~eC;E<=pgiZ$18Wr?3M zdDb#fq~_{-QP=m(^UxGz=QOnS3JtTRPhnUbx%A!yi_q%bXX%k)i%GaNcKB6VfVP#7YZWP@E z*gz5RCcPal15c>C*qJM;P$DreDj*JH$>LiE<=6ORSsF0O(!PtFQhiqO=c_Chb6+9- z7ePl_ki{;9!Ww7h-EVYS6yl 6Ln_ EEqwF?^>bKgFm8=dCn6N}C@lqv`t0 *dPwpE zZ)IE%O*H0|pLi5CC6FA^a=CY=o9RtS4BC3{f*%>3H$O-BPae#s>2|4fER?>npPacz zhs6c ?wF0>`yNw#0i^`@f2OPm(Wo{2resN=#ld*28GYPh+UaCaCRn| zO1USehtUX6@2eL&UnTm!^R `XZa&e~Zm zxmEhB6T~PABsq6=lfZR$LTO|zq<_$a73r*-StsmgdI7(!E(>iNkSk_|IK(wl5B4-0 z=8g1}O-_QJY(YEur%nY@Z>`t&34B;_XnGN`#L(cHF+NL lzKkvg?CSc0g_(@AM9H?Fk&&`FyAqR+mn-TnlH5^G4 zqjN=N4yzz2E^itzsJGMnS|`cJ*&E- 7pQD(OQGDLV)m!O$E#s z0-CEwhrWP}5KL*{6y~UFU)>_E#!__SVDZ&;jzwSwg=XO+YDn~;BJ1k?wMT3%8*tSl zd=68~U<|t*2U%W-sPfDd*QRCT;fB7KbwfY;zWln1G|16!z`EN!J?i1?OJQZvCJy_? zjoHu3w)0a&M|>~!iECC{tlkCH+ge1IWeEp!+XnT+F~{Xy|G^1ppbG_l!`hyA!*T-U znl*#f_smkMsD$%3CE@L>w5%RiHR!aRYp1~m1@(7@dal=36ZDO{rp5HLN)zg*b+qO0 z3@#r->-X6jQmTrt*LqC`4wjCu2(grZ94^i;Jk)5PqQFg0pWF#9Fp%vHxm Jh|;!h%U+LTeoj@Feyx@GoH&+|m|Y(U_s2qQSSSQk1%bkorW z@TEojg>!=E@f+5cyTqQ8I8Y-vz7ocp8EEtt4JR>!^_ada7gz4!%ONk}(mD;W4I_DP zg&2y2wE#0Q+pW 4{Z6$-iP9c|^j$f>sLtC#k{|1K)8 zRun^#AviXrs7m-_$FaIY+QF%X)dJ*;LtIP8Ow`RP$`KOChaJUFV-Amb#anUn5sFP- zu&Jl<^jv}-#qn{32is7Knh x7}aIgoy_TG9+N+Zw8`8#81 zc(lH7jV`m>KP$UUT$L{x{z=tXm*tijek8$>lVDz5Bd5onhH1r=-mioKE*5@2=hY+x zvHQ-`Et>bFq(&Wr3wDp#^I__K#MmI~z_q3%-zL MHNB+nL3DRg-ERjsT(U`2IBOjIS|#e8X9-Uxq%1Vo z#$87*3i#aJlPWdB51I~P?%eDlwd+fqPl*cfU29tt>WVMlFT}d&Wv>%J*9o^YzWwxB zd%@pKW$7vfMXe_sHPF7po^e%Ul5DJE;OiiZH3fj+;vOzIg@Fi=B+QqM&}r93tuwZ* zkoZwMC%HB$AB(fI72H*FC=wqy{i0Gj{k~0oOnKaF&6D>12(zYz=B1;{QZk&lz_&d* zmT}b;ks!s4z(qf&TiOV#)eM_c@NeA5c$sSCrR!wqBXkpAlhsHq2F~azmFyL*F7XsU z7rJ7#W2P^W*@;lh)|*hKmm|MGLf1U35;e>trev9B#3$~bXwoO$m~@Qawo!E>EyrfU zZP2c2KRX7x@ajg38*Xx$Z5`k3vEZH9S`i {Fs$0iaU8hFM)t@?)C3pv_0@k{T?nCJ_4n&VH zGp?9m7i%}F6Js61z1_v}IW@)m>P!ObVjaC>9bIK#zR-QB&iH!%gZuMC!5qrPwYpGY z2dN0v+yLJ7zJWnQiFi`y7wgjs@$|F{T>`f$<32l^{u;^UbM%r%=stfeU%tiYNCM#( zkqy@|%x8G=>5DqvotKz+^{i129QQKzH!D_Pm${b>5)C(IupDz}BehNK&04?>(^o)~ zW5M2!{;*MF*u{?J^7pap@e(@ixflVAxyuLTPL@Ywb6IElj!2DATw|R6dkt+mXEd~S zeWIBh&Ebjzx0DKPQ~P(69O|jjvv_SArckAbj6OItNJbcT=b`E_$o9VF67)8yoDBu8 zKGeEe>hSaTaL4y1eErVNS9TSn*B>j#<|zpm6O=KjoXGe08^vx@>&hE7aeOal+=ovQ zco-p$iLldyllnau^t3RE2d5BU8sx(^Bb%vi=PIz{1c8V7YEB`Ivho}u$rJD)g6$5M zYa-cl7V7tIdNdrxgkVcynuXY<)xQ12&a_wQy8^=+glnI5r$BOc$TYnoQgN5lFR907 zfXiQS#M}SlQ0^RA=Ci_qR-}&7mR(; abPvkJBHiq*?qu**^2W_d%m-=1L5h_fJ>jX9sj%l4<<()W+gS|>C&f? zMpf)fwKesf7Y$55X){gQoG0TBYyB*@S6^6JU&Zzd*D&@7)G|`A1O+t@_8Qd4^c>1K zK{_leuS=*e#n+ipL@BdrnN7YKd~dO}qV$?vHPxfJ*ayX-qkgsvDOblQly{-pk=!C* zvMV*F%Cy4hC#8IJMQL_@p %}BOJ0_!TbHl}ojFlDIxo9|U zvcRv4gJQR(qmJZv?lhjt+)>x^+m6%1pC@0%OBas~FFG)4+C2z7R$E&in+830k&K0Z z+buF{nVZjcuuEI106JFnOWxN{!48x=f3h)}GdVqOq~&TX^EIkxjv{>A&a%a7X+lG# z#1f`wjBcS%x9!a0J{7IFz#vu|uE#mzNNG9S;ED-u>~0{Cu)6$QzB&^&%)&~0xxO|T zw{zWNgmH 8> z1)6S>+=a~YlH@e_@*R1yWl 5h_rkox1F}2&u-3Bvc1I(IWAl`Q2_p>+*4qQnF(X*Lnund0kH)Is_9UnLf-Rh=h?; gMZb`<<>;Q+6KAo%_iO?wh;IR5NDrC|_B)^t;XJ`=@G{ z`L~iuyGl9V&aNdr!g0&jWAVD7`0*^FVBEX;avVuebW-QrT){^C#ddo%+LF=gz;~eY w zo}<}1%-_7JJ>R)zye#zBv?4!m$T(dvIk;Y0bk(RSxy1v~MKP-He%zG<3Q6NGfp$GJ z!es+XNSo{7eo)`K7`;QdhP(9HOdJJj9wCsYZ;~RprnndLEUBYDxrs39n1ZU;i>$5c z^rGSWls3< mhM-VjhGnpMad9W4p~iGn?;Wgy_yeaM`;8PPbY^G zK9D_f-hs{!J*IKLDRy^*yC-}+UgmkcmO3fnc^K84cehD9S_Bm>Yd)&G-OUo#Ruinh z2{I0@Wg$|b!#iXA=1A `Pbe~BBp=!}QcO?w0n`TZmS9)f<(UprF9XhMphYhljP;>6#ngqXa zrt`Q9@!Wm(D@qAD7qvV$tp0&%a;}T*r0m|m^oUF2LIgU{bgrEd`Gau6>_c#V<6xMG z=m`S#d$~@(T &3M><>;?nQkI#~yuLR1QTe-->b exoo^!T>x zx5rhTs-f1imUfKvJd` |>wR_z3C*Br%Dmj07^w1~ezH?+}^I`iWl&l0HmhnVNp-=bPdD>^xI^ z2A!mddt<-fcG0vtzC&Y`p}E?n-s0k$J-H(+&OjTQmVeD0J%o+XIwqB@Z7HVpx*4{Q zF( GR`v2Dita z{o^_fiFqFLTWh~7n&bTy7PF>)gzX`}@N$0lPK`${o2~nXhhEYj$&Nb?X{^;|rMOzm z&43$b#uk7}!407VdGj{Qu6xLw^XMvVvlT5?Pu+lYfz?c-=WWQeLAc537_wX}cSb^D zpShazp299pnL+B^lzIW$3WAs0`II_iG^;&UjnA|;l0bc*>!2B*6XHA5LzjJzO%q=o zhs}#%g)EIk-pltsmxcUS>j0G+ddbBt kq}7 zcmqAvMM&-G$Aq~^l(x&&8CCRcBW!XZ+sv0vZo@W1Y0U>!Ms^Ug8iUDhQyUQtSDq1@ zgy3|v$$V9V>)`i!z#PqeJnN=J6Sv}A`MHLy3&*y+C4%qw%`eRwy6)REJK+wLL0>Uy zI>@7+#=ZS)F>aLYfaKlmIX|JhNusi(dtr*3Tos3MquH=~i~Lg}uF(D^>Z20YL#ms7 zwe!t19rC&Rbo={OSa&n?@0`6 zk6daR*Q?qB2)@VtQ^yJTr1Ckw8miUgW_mT V>Ovh$mYr@?1KNa_Q+5;l-uE*H zolJy*Vk|Q$)Xha_mgs4{ZNp-D!A6?9q1OBwiLHq0C&Fq_CMj+EWAf#tyVhNZ=QkHP zi0yW^dSEM*q&()Y;z)i5ZVM;&>)~c|(yj<+($ms!%O%ZyfjtYPyYPwu_YeZB8ieJ` zvQvG1c7vQc>*P4(0_I5TF>ACWXjQ=!#7C&(;L4og(v7WI|8Q}wRi+Bb>%UK3+DfY% z1?=K(i}(Qv8H?xVZFMW2LtCF-@#5AD9 9de=tjBB$qi)_tTLQi2&c+ zdmRnBS;I8u#I#;)0j*h*3Ssm8<*pUn-jJ@$1~;LSUSImAQ-r43;Fgd$y@joo*BE76 z3>Rw-K$H)}uWu>iA*^d9le9%ur^oaNemMNV=i+p(0q*T<;dso(b+1U2@)y&T ty2XLO_n@>@v0MCod+ym{?e @;vqV;3p*M~K?Z^*sAb2B^Rgc-%Ud=K0K39 zVLgndxPyx%{0~iO-2M3&n8LxA5hV4HRhq6uQbXz1u_AZ+l^^Jm-_S&YpJDY$xMSH{ zLNLd4j(ix~&ECJs%oo=1_ZeBTyB`@RBCVXSE7Ghjbq@6dU4MaY{D^qGoYTOHlen?6 z>n~I!fbAMLsmP*%fAeOKDWo7!>@{}6@dMV?d22;|w^S7))cfN&Hpj+|T^KNau(=Sy zwumcFzABiyQ<>4`dd?R#>aaUZ5P*jZ-$*C>&`DHB>XMd*v}V6j7% tN3xML1J?~01*C)j$&CsT{m_6@9yf;l6 z&A|Xr%`cVy(c&9EziSu#IqG;bw7x;1rD>*3J|`L4dk$k+hp}9ovm2v2x9uLNQ7n9o z5>SV6XCg0)cH@dV8Zv vc)iXiWWAWpK#VZ>KIxO;dbZOy`A~?KX8+by&k|3|d!P+?3oXszJc@X81EH>`U z+Xt_@6vL~spfg0`gzC_@L^j(JZ05s7vendf#Iu#vcJ#w+SzR)36|2v9k9A!)crHu$ zX@v_%y$^)pZ*h%OIRmp9y*XNTRguzv4Eds-GScyjr(l00E%u0*75Je2`cgVFEuJ!F zg2vw;f89%LwN)M(+;Z7S$a4k(-qS#e0Ri10#|NJPn|6T~Km547E!(CZmQjWGr>fRV zF5F1IhmHrLRa8?xx0lsS5Iq-oj=jXFdTeFH9p6JC+dm|QB_*}h&`gS~ZQ3lK^JNux z2DkMduS7JxqzMy^9- >9U>ZGUeQwP#d4bmG@;Dva)Kgiz=+NTJ6VZWR@(PRJG zCZVVH-Wh?=>m5%Mtr;pGxY5NUjl=@l`pm8)D-JqN0>m{IIT?y@ci=Aa>lmUlxM5DU zV-#!WJtS(@NIGbuvs5&SZ(5d0OQh ckBix==8H zY&ZBL^^8LNTX$%2RN_iV-I%R! A?&t^D^VH>-+1c>Cb!s)5 zjkW85S4yfhOX(ABHIN5J_KC6?s^Yw+6|O~O+PDKZ%~`W~w}qND)Gn z&o_+ X?$!#Exm2$Gb}$sJ6chJ2`>g%ECt$z?Eio#FX>`SZ9@M@ z>~3sonX9ef*M(2z@yQGybb{|$3H87c-d970 @5J~CrM_U6$&H|&2A~7Yi#8p^Puaik7vvGx?QwswGnYXg! z%BhpZ7ggR#W>s2w`L7{Mf@Pb}wFe50v05cv@)y!)!7vTPYpq0;<_~e4@t69BZ2Q7N z74p*PiW{EtcbF>j2$TacXNSOJi92NLXZ>IU8?Xc@sLdssH(sJ5zlT;D?gAe$hh%2+ zrxmbo4zk z|_Gvql%%Z?yj508|fT9hdKrzaWWXjWyi?~1*DEn!aV>!$4rc3@M znx=Rh%D$L7HzR``+x1zE^Ifc~=OAYbB@udKRP*&+=T}vaa6+rKhILgK{TB3I*&oS< z{AE6^O;9(s5Gk`ssbA~CBc!V|`$}K%=Z6tBL3P+dv^}JP-!rGZtz3zj?Rvne84};A z+%w2ZO#5bK@KDgVUg#6vdRmp`uG9WDPH7>CIHJn$PDwYo5Q pim$z{!6cqbH1z2 zqvw)vd_pN#bgfWolDwH^p0sfUs@}A7tdNDMQWre_d2bHSk0@}8{3Wq{#I9KKF#Zp9 zgVtM;KMl)>v8yBX>LH0p!?adCWnmJCRoHkaybA>r^ax|s#BcWc7uvtPB=jiy#wNEH z|Ee11L)pHPY@D)(C|Iudg`MVoRblVBs3CXo_zPELFFG(-X4lph2bXtBO%1#Ii-`?n z-m%rOQ+yk+DzV8a4!&M+`IO~(aFRB}6W68ki9alLdx&7*2GY~y0eyFsUh=U?@hYXb zK837=R5}TloCBg>rJ@^Rm*1qXV=`i
WlG_KagRMN8s%1 zQ5`%PoHSu;x{qdgn_oM62HZ#^DPwjwFFW&tHf^ENz|-nUh*(7UDg$E}SgpylWnZe+ zjE}FEpa)qGdh9GB(`>bOdnk@$IFCdEo|wYw2ZRM?iqeYNoTt9M$5+>+`5^wUBK|}z zSW~M>{v`)A&WSWAu`kR%kcxL{2uDoWz5YUO-wO3vha|QjqWt4@X+t&WBu8iCvt4zc zU=m~ptmT8Z^+~~&5-`HrZo-czFbQ&CLfD~efilV)FVj0+BIxG*nV_=E=nH3B5V+Yq z?3sOD)3x!-+6pN{3nknQ>d>+Bi#_Z^LF9X`6@X51l%wQ`&xQ%bMY)3A7?TDF(`lA} z4wT_B`O; k(BhJ`^~3tH&J7xt6wd7VpxI4@!bVvyq*!Xd$cU&pgVATQ zv{L!^s)g6__X>+}Z}byTP}seyGu~Xej7bYHj}GY*{MeuPp-QGS69%s=r1gnK8HHB) zZla=W=H7_?=Yj%M)+A8xBC?GAp?%vl6d+P*4mVrDa$3f7+v87K9Fo5n(#N`Tg*F(J z{#s}I{Um4anKaCBxAq5a{U|TwAWw7zIVi^^&bl}qqs>o0atJ_&MzT8Wh^>olmU8H@ zAi)n3rAPJ5PSb~{>k~RKF?{93)7EL7ZIVGR0-YWSbH_Zk&+1~vZfo<(^8TDvG9f{D ze9{_5xcmA&HzCSb FIoNRbq zTdSGS9x{dB99ayBwBp}+5Sp=rEo9Z9wVV#$Fr^vrmc*@8g6nFxK5R8=?7)uexf{W- z86EN~&zpM>`IuL=Xy|pptU;TK-#yOOB{Fu(VArO}ok71#1IIg}+dyi_{jl>eOLxcx zOfD)SmXuBTRMs0zrzLtP%KsKyA(jjll`k_1)}7fjS w7*!L2 YxoR!L|HmuXPLUab#C%m`kWUQvsZSYfx*o6nz74mj!=2*XHy *x2a% z262_ll roho4~jQWCGbQ zy00uL1Srpw7m=8~V`F<*yl)MQ&82(D5_X~Ue%u4Y+ol?E+@XyvZ8ngSlv~gRZ7@*7 z16#RO54d60RqEdKq@!uv@553qf(~|Fm#PI~JLH+zRmL-RCn3^uyJW4S1Pf&0_Hue| z9~j4d&BCbRb0cIAw=&6}RbXWrhP<%l@VvLyZ~&l8OIn_^8ym)cu=UI8R2ewP%1}@^ zPP5?p7))I}JmeG=jM-n?biy=E>W)+66Qbs3Iw3*x1Hy BE-{$zONTIi6V(oA%r)Dy@(@{J2y6zY9sBRbNBB{(v z{nQEjTv5m#mH|lOY;YTri0{6NKJ|A4a{IXMj|DZ5Y&|m_)XWrv4mAb$%bWSdc)BF+ zBx`2fm@5`)N(MGSDjU@s)Dw}#95wvDfH3Lse%|y5NNuGY*(|`7pPo=fERPa=Avh!A zm#C9 2Dcx*Ve~96oy5HiCZ5&4FHy*zC #G#V=00sSFRP}>`onZX%$xKqE0T#{Xt*pd^ zN#kKiGy_iCL#E`k0xWWOp+I~63*Grc3)nR3N;zq4eBoX-4uMaIW1{-|`X@=dG{Y}A zNh_4i3M9t5r5a P>RtXQ5as_eVOf|IoaX1F9r;Kgx^@HKf(OX%MdVDKY zraQ@SBB)kB35|pkEtB*#?M-@ZFtx|Z7JkL6Nvi@S88K?-J=SO-(;)d(d2qf%qe!vJ zP(-3aE`R>Rsg2EyZPK*7Nt!q+#W{7Q6$-WHV3vi8L0b(M)OO`AhO6iP=Y;bMR{itn z!*hkNcRw)5ko2Jus$=Q;iAG6)b-cC(WW25>B!LTV8O;)*oek%7%Ntc2ek& }*Afr$@m+)eS%!`R zVwY+nTX9(KnNhG1&KknUoS*RhhAqbMhVx8?a>tsVJ7^LUEtHyKZQ;KQ@`a%B5r&~A zE)bE4puZ8MV$bh9Fm=IT)-cmZ7$z^x)|)U|S2%$PtZBl?>FXd7;N_-;hlv&(YRoby zMR1#;LzDN@rQ9_!1`%wsUJym%SwVIsehj7P#G1#uQIhmctNsN;Xat7RRNg+#W(3<6 zyYC(bWAx;1I8uF>mXcM1N-u96gl? 7Em _`XllN4T$Q0BmnB2nRUxo7uHKMo) zE`%kui@175{aWDe5%wvnq*J6wtu+TffoG|PARCOCR!hT(Y7{0N%6}GpKO|xQ_DpQp z-$)Wn>jq)U7+ZIOzZJq`jZ-hZC#x`c993W@o#Fes0wf_G^ik9sW4@Q-vK!iNyl|fk z(R(edu&n*aJvQ=AQV*`B`BD1U^!DOXt(QiKxf$Q6Q VY#AyM;w*;{I=fcu9f5A_Jq$a&Bx$a zROv#gu9C0666n+9lG=7~f4N$(pIlP0ejHr!5&=?G6y{h~wqauHvByMg@nll~Uqi z`cnvuD*==CbRhs7BN$mEySd9tn<5^pV@49UfCC(3t-``)R%U^5=#rR%d1-Y66Nw^T zg|-O5X2E5NQIFa&-6HAZ1@+k^@&2P0 9;Wip##(r)^fA9Gtq8G;~&to@-_) zo-_?pT<0l%lvBwvemAGWi_VIG6r|*(4H3+kgZKgn!?wI*o`AjeoDIEWUJSbR<@1 zy? -c!)FgWqxtIb_QrfAmu_r}y%mi^bP@T10GRKk%FA!E I(C zDae8m `(ADptQZhd69ptCKZ7TKDyqQLNnCmc^#N#Y!vPSp8-N&5JI0(xma$XV4Dn$O`IC zJ7ho5aIdUAApC_D4X?HTR7-pN4uijvzDV}1F=dzwE(6iKMB&g8kGa%W5wgi(76qAv z20SfybFA$Rv}$comhs$#?|7T@Io#0UCEZqZVR*1gqPbh(7^XU4-aQi4UxQ=r_H%`f zyrLx?)&63HRri(#&sv_@$u7yvS~2WrRIqeq4(<80W~L= |q5DPcW)Te99YG8x=FS|avoimgrj0-mjXNXbv4 zw>10F{~FmeL0h%d<66c->=bV*3dVTww1AplwI5uEd49f#4*@5ZH*DBxa1zg?wX?1f3T5S6KQ zwwS6UAmGIbi1BP_vo*?!$FdaJ6msOVbsy~rGi^-4Qs@EqdmJtKC|Ezm0>`i8Goc$A z{~}-7cYF{ eWQgAfA66cPlK__8jPU= l^E{6NGh*d?(gU` zUYt@Oyle!{TJQ;(5sOiw-K;_lKZ2E(5#IvC-FTw>-1?@lju*a{RcG4}%d(x^3TWgT zmE?f36rBtzZ{PJ8So>s;Cf~oXhGD2BUWh%5ES8~@Pd3r^vwD~PF`i+nHsK*w<=q)# zpMfP~tH!ivWt$0)w`{dsvxbo=;jWV&JK`DY1v^EL(1U7ph|Bw(4QZ~ZHmV3%)U=JW z&!(Dq5oIM*xzjf6TUA51(DS^b%poHYL?Nw}vz!sP;)c@qFe69sg4M)gz~bg}gYG@o z5$KeH_T)DO%@h5*t%aER?(8V%!rlGf?vfQN8q>&n4s@Z2wO>gkp%9wJ#<*3xP~m_r zX{pfjKT3p3bLcW!!nZ4mAq y?#x}{3A=079YurN((=I6I?;I?F_IduVb~A9fMMu$z%h;>vQ9P z(R~N^lmwpi#iGfGxg0bf7FF5JH&T4SIK~g`jH*oA2!&0j8>pOVkSS zO(h8g{K=r^8*fhE)|DiACFk%g_%p*q*eJp`!8P|njHV(DETdr~O?aZSyE)%Z$)_Sd zk7OTeUq+OiI-4}mxh*+R%R)_FEAbs>;a0kw#!(HnxQa>7G-R0nP#!D$&X-(1{k}Nd zpPsa89LRHC!MI-F+BZs|cKujY^ZpeQY}*2QJ2sby5$_h?d!murhz^e-?|6NVq%|$C z6d&!qxiGtcYdegVDu;megSMOD#BCVfgl4d0Hd|Vr0}buD=I&uvUJDFmG<^~q)98eH zrnsykBy-Kmj>om*DOSGO?Y#x@9N1f0pQ;yBCozla@iZGJu*_!M|$&` zJl>6zJFC>r1>MTZkIUQwR;ah7GJaMkXXa+@M HRPC zv;DXFpN#+Cw?X%Gn|}BFbN=iPj<&*bwxA5yH2e}Yk`~rxKvNn4J^&pxEsYNF>E)l! zrTf?1+y6%PS@Ku8Crtf~HmO;knxtm^rNv($`rldmrxt%n`TakV`z0{{@8tf{JHKH1 ze=Pe8ZvV%!zrgZ;Ec*-O{yW)!^)LPZ0!8$H6GeaJWBR{|q`#E?n^^iw+5Zqv^nVji zfAa6L}PS{w9w8B= jj9>d?n&Y$G|CT{*D_ct-~C%OL+FARSZ zFMowmhW`*V4F4f!82%<^{?gXJiJQNYW&E4i`AgZqiJ!le{hJv2OW9v=BtWN1O~=Me z3!3N{=okRhptmgQG?D;18X-G#9a|#{^Cu<-(9;Oe{#8Xm3p1dRIVjqq`z4%W`~`1M z`f1r%X+f%)7(r7uH47~rC>r};Ht-8D|6nEq4ZnpQXnRYQnx0;r<~bnKdom6*#{V)L{zDDF42u8E$4{LA`S{6_f9GSSe;qy2KwDcqYjaS<|NQ#9FMsze zCnv~<|8gUQt$|Lz+=(Zn|6kmRe+GR_zYJ0#P(b=@5*^KdEm1&5{cbGioq;t_*Ai$8 z>eh45WVu0qX!!rJ9-*V91>q3%pE`}Wp1FaoA%KyMM%dcI&Jra0r1!TA8UeZAQTE(9 zIhs$_Kyw?*r!|m{6G-1b)+0~W{3fO(rERRIV+%6+_l;dEz(0%v=-2>$G0R5B9OR+j ztavsBV66wx2gv++ImYy_1S0{oF`*F#Jo^LWVj6KfGb3{g8zWngO;6%aAvM!4%)%!s z2haza+UPw;?lf{w@_=Wpvd IlO(Ef{(f1!{6*Yw2n3w!*3LQhP;Fvov1beNtz z09w;N^UA*&;Y`1B#J`S;KhV>&Isbz}LHA5gw2TbQ%plUHV_^WTyBKJHC3vR)HM=nV z!Y= 9`?-LaBFI@9{Z+<7JXMg-Vf@1!KTmF)up0)m82 qrY=e4>pfaQw57 z4)8q8LAQzKY0C*DA_Tf~&((zJ0nZaGjSvIi8Obz4jDY9q4^;WTSQR88EcZ`+Yyi67 zX2@R)=~)5K(X;FysxkxUerxCtRT%*c&)oEfs&p&>`rmB%wJxY7`oCz57Vx~>`eS4C z%z) ;L0U(2)9QB7%dcgB){Ewyd3;>4bNbiqz=>X5G{y)|Q^%i8s zlisIE+zd2X{nKrr>HII$FaSXM|J4vs=bo1Ye^d@??|HHK$5Ifn{#gMF0OZbp)e2g< zKQG4qC{GWddxGL03+WgE^nboZAm=drxh}{i#wUjR7Y$5+=beJT@&pKde^$;205$q2 zEwq5=eVIS%1|fps&!C_KJa6Xxu`0-3#y^|<6uSJWEhYfnZz1@vkN`pQc`^CSasLQV zn17x7t@VIU3mievb|aY}JLoYkMp{OCHd+=2Hby3LnomZyrg~(2);fkpwxHn34iqQ} z8UaDzFr&8A)hB-%?z(n5de&s(b~;A7067bNTL(~#1`svZp(cL{(w;)H-#*ka1X|mY z(+E5@XkktEiBE(N@QF`cl%JeNOwY;TX<0x ~sP?#uZYX zfd{|m7>uPRIcJo2DI6KE35+ivqqz#L_$pz@K#OHb00RW& zN(j^dtDB67jVGyxO;Pijhz+OuSHrMPB-ybxrKMNU%AZ8P69==Chf+dY_A@E1Wuy9Q zJ4K4cfX{s;z`R!OZhp%nR*DSwE;9VX$5w2}mdrP1mVA3S3vy&@y~NZ3Z{z?O-`j9~ zWD`FLsnW8`E%A@OpdWy4iL?o;Tyf-(`O0*p0YD;H!)HrMwvQ;2cO HMJ$*$S{H|*~||>CZLU0En*!CHg~J! oH-#W^x}%gw3}j zqX^u3s#MS+N75eJK}cqnk)y3E5E2h3>wAW5oVRmzMef`jq;THB)BZGD_|;d;9GV{Z zRn!KDc|U7y%JL<4_2UGpQc*18%+Gh^{ls4yLA+W#;XbLZy;Y1yrgihEHtoH!g3G-% zSH9rUsHfiKQFFEV%FHd6IJ0#FPA)fgVg2$Q+So&b-T5$l{nh^6$A`S-{!8m>b3cK5 zyS#_@Z%>Ku?L4-j?iVR36j3Z?QHtuQHmQ3{C-pS@m+!~7JNHl==3^1#TwR$NE%!@} z$KT?DAHd|XbEu-IpD$3UvQH^`-`?CEZM-|*P+i;NkMR|1 ZgD?rqL$`;N*s#zSl&NajlLf<%fPiG8`miz&K<#_9Etr< Iax8XDP%Kg3HjE%3RDD&80+%76p9g^&GcA(FS4!36|*kY!C zwC$DT8BYq>A(~K9Hl0nUnM{Ts<@pa#&8sV;OdBbWLq0f@Ejy2+NK|=lFekB`zg8fk zDas?dY;(>ZbM6f|BX7Pz*FuyEA?1#g?pz`VWn4=9^wzYmPy4gl0qy9jwSNLZ97o?- z^&Bv(bNvMa6ZIwCH5%<`*(vBfmmH;`GNMihadj1>JiC|@m_v9;WIs8V;f0lGzTCoZdTo*dKEhRi@T(#D6#9ddQGGmn9D zGdYgx{lsx^Tz*L26{hMbZ9@I3$9kbYGy2S{VWuUyuHH*q_brFV?79W*=)^ogkgZg% zXQ%ukb*}`9u-)V2eZXq&deTPm)HE^15g@2MZKf#lA{ ^B zRwV5oMv+oaxvVmr7&J!<1SSHh_eoc1fqr~c;#A-CkoJ|fB(- wn~Iuq*%Q8>-{Zirry*q(gJHjp}9|1F`t%b@*|4Q eovo>nxt`7M%trV7R3{Du(cC{S z1V9@@wgCEHDfE{(?%$LB|LNrVV%sLdI9jRNW?ct;SV1k!c&*4ZId<&)X}ly`nzU-B zW{pa>4s{#4+LzX<<5-SE+(<~26`0VN1VcQb0h5Y0wxUW5O+p%^MQQ~CQH>WK`miD) zgm~#-Oq&=Jceazb9oi6ix;WqW`@TEh{qDQ(I|b3Usp+L{IBUzcIMi#07nK5~y~!tF zULUQ<={=6jj-_B%pEiqC>zua#mQ!gILlWNIPRH?XYhzfEFVukubWqy_*kCnHa3nQQ z 1gBq50ra>SovQfeGdNc|-ZK36(8ER-gNkVx)}y21u;WYsJ( zK^R$C$@4~p1n9I6dDO;_X_7ES^vMWm?uF)dM@C%)5!S>EKa}XRHPN>SIic$+Pt(O> z(Np9+Ic=QwhC(5lVQH47kOY;VQgmQYN`9A#VWXhI5;RH08#aMa!C0=KWB)CuM4^hT z7Btz!6$Ki~FpI0iwAbUsep(&Ks#Ren?=d^$5pr4D04fq>oPw#;gGIAh+V&FpDGGcB z*DUoYP*oY#j tyub z0+BF{M?#jOR>Q==mMmO{A;F3~EDJqg{K2Mb@yR9wrY1H}!E=}pYwzbj_NX>jHkqmR z!--ijh2|n}22v2mNKqWMQH+mbL&Hpv=R&;Ce`q)!rZ wNZE_Wu_jg?GW3bZLhV5 z>pKM<2&ojG$O#2JEt838p&*HT1_Zp_-C~epgdj`#SO_TqG91N?vA*t5C<6pWG`qA> zcOz(0$?HH7;Qs-2=$fF`3vnztb1|E<4XtLx33Qbd(3dKwpe$g7EMn3?t&Mj~z0P7% z${rd-&ep*Jb6noO-;n~^WKzlG(9sn)p=hSh(V@1&@<_`%v<#p%;)V(ewo!sz(1$e$ zhjKZcKzS>C8aXV%BGl3v%s`wvg?WUSkn*YwrqBy8$+ZG)vS=JJsGJ*j5-kR@i8h%S z4WkN)kMjlsoIk*E-2s2}{wK%K|0p6CtnLm~2${otER_(Cb3qz+uG;gFQFI0)P_d#< zl2PWH?vv51PC#_C#JX@o9~pv~8h;z_QP-06SFw(z8&Y=ev&*-xzHx41uJ_j%+1m0` z{mB!LUO9eY_Q0Pn%>8`sEmi%czWYEYnn3F p$9OZ+;^V zl& @UH#t(ywMeswzv+G?mZPUzMx4e5j-l(j_e|&L)JzBmvFPxZSu0MTm z<`{ix!N0!RxV-Dr$ENq*-f=5Dzh$I+<9yu?qW=5EFWOu8*Ejs8*1g|z>iF1~i_d`7 zri<&HPpnEETbuTL8w=ch{PeY+w?8?veeuH5rN2&p+|;-~;G2F@Bieo^cDl-24!dVa z_iL^0SK0YkX!zx)I?_#t(%by$t%daVZ7Yqbm1b(ib#S7t?Q*<9f2IBN586xRx~nS< ze_yZP*<2=?7noCJ_ifO;1X@2L&MzD9z9XGoUhC~2tXqSR+-$qo&{x!3?w_A%?P$7z R=8B68g;>Vb)zv%L_YX4knneHr literal 0 HcmV?d00001 diff --git a/ai-ml/LLMChatbot/GPT Chatbot_Documentation.pdf b/ai-ml/LLMChatbot/GPT Chatbot_Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c750b6a1a66669df4f71cd79fef5bc38075109c0 GIT binary patch literal 54708 zcmdSB1z45cwl<7(hjcGex?8$ix |uR7&EKjI2!DD2P-az<*E>Sph5ndt)mUM1Fo| zHFpOfvzU>Sk&V4MvyzcH&=J4}zOBM6Z)9gq1GJ+BFsnL&oK2k6KtQ01y}c8Fo&E8? zf)U7C#?H(hEaOKLXbJ##0}2W msX7@s0l|W#R9RU7;IAKjz-?9l`0HmcC6K*|D$q%n8SD#Y zHK3alvy3g+*rGqbiT(U0^J6h!` C>NvaRjjZZo?mff7wvd(#8o0VwSW4uTLCkVs8p$mIvCIJ6QnOx!JjXjB<1W0gY@? z5Z%(c_2i<~8ZbU`k3DqsE oY=2 _fb^YX*jtZfU;6_P#k9Z1cVMYSI(D^SWP~lkvVft;iHg_qjSaz22x0Qk>j5 zKk&F2J&oJNx rxFV;(?Carkb1OmXt*$fI-}AD cdSFU?w4y3%S;Y%ZpC&6mbbA6 z-`CELUyQz}Z}`^6FXX) v66p|_mjgYuB-Fpe7Z%)ie$u7-~+-{WQ zaD>Z%phAjtlVPKsup*~qTQ83bMfzXkczh0+mhr=E3HPnzZml6oKh!hn(CxBtLC>`f zQ4X{#k{*wm{3`B_OjAI^7hi%jsZD B%y$%l$BPFz!W9jE^*6v`Of z914BCu#h4NB02kd!(tY8zy}EozF57(IJG#Vl$on%N%!++LYcMM7Oze%a<})kNbEC) zX7rEaSQ)x9cb do++8J-Cp^v!vP!vbwZN{;8fItnk%V^ ztn}CBibhu=reo|fm=w@nRMF^!d2|PM7_XWO+?6C ~}e}ERr(zNz@Q^5;yQAVtp2ZuMt^R*3BxW1278>oAw1!)7mC2Z;xj-(VI+n z4+jkOrf}lk7R7yU*0hK->$|k6S|n%SONIKVq;}mi_r66#9U1#$jOfPkHM!kQx!ila z%FMB?+TpM8lwD}}i`Ap6h;S{irIJSB3Zi5((FmOju2c5*K_hdCKDj0UQT!SbnL*28 zbk|TwRmey=*!-`?gjo1dtb;!LL1UG2u{;1Ke6rl>8vRBxd<`8tPs4wq5jV6~?`NDQ$@D|p3K^N!?lsj-Ue zD mDL6_&5gcoZeXD-+0hm08O+)$c^K5Qs%xbS>7RH|4CYp lfnR4?MP%=Sv9QJt z3XoofN@aU@Ig}R17*&(zEDi6n=$suAR)yNv2~c`iG&!43_Z$;|F1v}XYe-t^Xq^YC z=ZcD)ADb&Ei6xUT*?ciF^7+7miy>icB=^eueWL|-4&JN^#PU-jci(}2u9=7UxDGO6 zY>u}N5Z@fOm! r(PoGL zhT@fRPb?=TqAOZlm2HfRKcKJUgCuy!z7;p`I=r2qG_Nmqm4aYu_GZF_9pl8pQ@#sV z2e#hj89YubALdj*-nYH*3d5{32jNcVDxyh3?~>hJPmVGjk)kLI!y@d~)POM(g=`J< zl8XH-z-O%2q+esd_yU?seA3KoZyT!dvPX%c4&<;M6%lxOE-WY=d)lX#OP`U;3C8G> z2{p? eA}%%o{Sc z3UpXf+?jJ5C}~z&> XmZVawkIzmbX5$eBQ7v}8fsyny_1%LbZ_uC_}&pajLBlw zp`qvKrhL&qo!(Kb&x8wMRBy~(*3(mVjXjxvM&x`Q`ZB$hQvDc6VhpcJ+ FW2{IjQb@K}0!Q8S1OxVebNuf$dnCT%8GO zRwmUn27!eu+_k~XfH+LVG)?Jlyyq*JYZ7Ki X`qMfM2C`g=CoQ53Lfy+rH z{v$cQF*OuuI;RNUpdNJWoB SqeP$Vyhc)SWrmsj3r>g1#G0+rV^0CYS8% zk?Xl;H8Pv26c2pO%Z5c?gB2D7$C@{p$hYwl$KGL*e~#FU+-F~n(O>ENdeFUGffi?n zP}-D;dzGN&x-_7%G*uFoo5BtgAW{d15m$rthWsg&$r_ zYK_~}2@vvl@}up)f*sf) _b4%NN%wYb`Sh2Ex>^R-{kUuZhEZK+^2V`XQjg zB0HO}FD3BV>(Y1m>*b$$@H#d@a7!t=YL)Tn8}(Xk9J7}CmgrFWHWA^^&X*-~>!n`F zhRBGJYr~MLrdqiRD@m8aI3l@LP21$if`qzTD32^sanH?As}R{|6{i~9a_XV&$$A-( z?oT9njDx(~q8nIEbz>aJkt^O6%dKp1N 8*+BNjk2W+SD{CSj&FD@{#q3PszjNiMK;+ |Jbx#1*t;wnV0EX`rv@w2&{eC;ziv41iOJ+4ZwTfwSMwf=uo8D>(N#! zt6Ki6 vfxOIi*ba~N~eARjI3J5y~yt7-8qgl;^S+orMn__fq!ZF$X@ z %p*T@-K$Q3v_@h+6cwV`iaAlGUiX-+`|noWG`wYxbN^LShJ<*jBL zDSBOYFpiy=%B>?$$ETgzo;8y8 UCJO-ff_FKzWA}g<)t;$~bk=l7=W+je5aQ^| zBe(?F1DC7~{GjvXPwBJC;j;og@Ndf!pG}yf^fVqb^@H4Ryp@BuJ;>P1-4Yu_kq0Uu zF3D+WUfCcbValGkT{};>gjk*0u@^MF05EEN-G(AIky`w8+-XJ;{t8oEM>) YO3^^N2c*WNkY|3@J-D*e%IQBblucdHRWA^mHYKD z%vLuhLc2NkY5(!*-TK4bbI9b8g-f3Bh?xjy6dOnn&$K(M*}$E>4l3g;qj-r?&y{|G zs!ot-KFBYr23CEEOVh4#yF`5KREvY{@T_oq9b|uts;^@U%XG8y{Bnr=jdBy?unRX! zZv#BX=-oNryl^jU%28nYvvaS)xv)jjt;Vs&i&N+^U7xZ}@`W%qoGl?ciAnMX_~zmd zWPV>mvuN(oyh)e@DQ`-$_vj0cwtCx f+_q zbf&Vi;uMjX4uUQ1O#DP2saJkyIx~I$=jCueF@ZPQ2_ML%DH|KehfW|qU0||Ch}rCX zgenheF|G2&pw_H8ab{}hb2e((E4V*NtugBfh3OH1Kq82vqH$#smw^oYcy+^JY%>1P z&S*V3fWUM|TGWG>^2jj!+NAy>8-DEee{FFecg{bE0A^KZW2YZ%$d4;5%%Vn)z{ks? zV&W1K67(VtPWFz>5_aHCu%(?jvy3Tt7jEg~&L|DuUOSqAB^%i}{pjxqcw`2c)$G;n zEPw2n!6d*VyYTxS`$v~Y1#|(A9Em>QZzkl&g ( zR {Cy#Sd4L10tR{4xcYDpCQOTY`=4P9p+lb$~y(BWDK(8=&nE`sELj;l~`m z1pVcKzjb(2Nzup_$oz-(!90YyBY>TaSq98kS(=F0ncDyXEX*Q5?C%8NW#|2eFPs33 zY&>90Hgb>#TAEw@yd~mdu4!osrY< R#r+RqfBOl*`jZTlv;;XiiCGwdemF x?>pu~Gk0bwB-JhcW z2!X#9`~PhS{7$R=74iQDbEJOxf T# tza8{va-!;P zYiw_$p!Of(!%qYMjt^{)@coC$|9X7r0)F289UmUA{8H{OeE3U=|2 `&r)j^N|2x z`&p*>0So_>Qaz6NrP}`$EIi8oCF$S7!e0yj_rV5Eyf}Z$Ojx;o%S^a<*_r>!Ot`?G z_`fp~R#x`k;ox6qCR{AP!NHHT1PtM<;E@2Z;6KxnpC + bC*CjeJQ|B)_o{KWBpU^IC255KSg*uV)m06fi~HOt3x<{wM^QTqHpC|dqq zs{Ffr`Tx wy}NQU+9LdbPx zrT(a}OUT#F=jNIwk5g3Ec|wY;T&Jl1{OodNFEb;P=^Ku(yN^eqbP1Ma!diUTI!yK) z5`7>~8!tv_v{k?@QZ~~wTH#vUhj$GOfX$s{Q{>+3Q6Vbxd_K#hai{LPQk~toVPn1K z`nXN6Y9o<6ZAG}ohS5##tL56D3bb9kcxRv2AJ$0y%NdGf$76%&dDU;GE;OBb2fDA| z*d3ZwndhO^!sMPLvARi|uSPws_)f#KW2jq)IX!{rE7H(?wp+24I7YhhCLvbwjD9CD zII!*Qq*3Qwhi1d_v3)eW5ceXgFy?m`)#w4=X1y1ni`BHvx||jf{fXC}9etne-oMht z1eiMqkD~NCC}zEee62WYAOK2v?O=<<+fVD=z@y;#0f)fh=HwfU^%@R@V$3P0rFPm{ z( ztemPX>y1^Bi&UtUs?rqEhv-OO0D)uEa_jkT%-KaCNiSF2^}{vX9dL08Nl2+`R*;b; zf{zlSM3#kR-?-ISrj3K}r*4uJYLV3scZ7Q)s{`Fhj{!A>aGWr6gMl78TARyH;9EU# z_8g*j*0Nm5FwQdF+8`ju@SRa9;NLauK|=Vwk>QH82!wzDtRRQvaxk>syzetfbm4Y} z%0Fl*M`N-XoZrvz$x4f2B0YQU{zAwCu`Y@9taf=QVu(}R1C}elRdY7*Dx4Nl5H{E_ zfslUFt+n!vm0c`vKwdcKZP%(T&JaPEAltD+UqUqNy8qFKTN!*RY@CjhFpoferQLYG z$}exVKf}J9c;W#A?-KY>NQJ{ htq1^X<6>U1qu*&e4$C0N zo<7}JR{977M>3@&$mW2b({na0_)UsXlnq(lS@c%VN9#PIsn e_!e;P39ZYYbEo7iFC`TS7Mp7gfS^0d=Uea)0F>N@(O z9)Rv)8h&~=UWfN43291ZaR|!aIWF1TRRp&CONb+AIDld6Md1vleqY&M%1LEx$aY_h z6bH5(^ef630ps!aV=9^ahka->S#w8?TG+58GA&rs0pH!*yVbEbSr#ylH%Wm$xik_V zOnb0`(FuKUx89QSyF9HB`QX+jkj!iHnI{z| hB>sp_)SsFc)|_#7TDT=tUeEt<4SOey`% o4W-t3{$vt*VlHexH!up<~dlgMmd7=LLhhELCV3o4(xuuE>wjL{l-5UQe@^bj-& z<7$IqjxkzN)^kFbvc$#&a#*CV6;DaR6I9x@KFnNZ57j-}vChMrN&G6Hg4HKrxm0KR zTpdQAlL4 l){d3u_!G)}hL5!U3Jw+xHT7FnKf zFg;w%B9Mxx8N-Hr=I~tNPMi|?^DCPjKpUMI96ej+`Q7fwoWSjQoht||W25~yV#yfh z23^~96+pMX`A)Iy)_xX@y{CO2V4mjLdJ`z)K{NYjGrd_#e!_xw1I%2i?n25d5rPec z@ZTWdG7> N$I%!k>=CD3FH_2dEH7MZV~p zm@Us$LfO}()O@I=Rm@V<)e1lrxr%KPWFvqr>cL8;TE2X4R4`72DA(Lo638dRS>Itq z+nre=me9@ Bp75=pj`J9z5zqhZZ3TOyDnaB z)uF`fI1O7#PwMC`e4Z^Qn x)_L$%AI_?HJgA8Q%b80_XVUJ&yTZxUZ6BcRpkKOb+Jsu9;l52_Tb?`i2Q zw&`D4ZPL-mK&w0Vs^^<^`cUJY_wK+#&6iW_qLV-DoB#aKdrAR{n-lh@KKWS-{4nr1 z@p`DvRT%+?WAE^e+%*Kd$f*Er=XjqUI9!k0&}?lSqAzbctC?Ev7Ki)SA(hKVvXKYa z21MB`1_+Q_Y|%ZxYr(!Ezo_ooj@K!IxBrCi@EV8Yp2K40E}~>J+r4z}n8`i2WT_(C zjHwKO!Mr`S;f0nu8)7+v%}S*4t_xuk3VmG98yb =1M^Ut<>Fu`N<&jJPs$Aq}h8Q*R!+gXCjK} z1X4cIgp9UyQDec?<3+k zcOe&Owi=_4f^)B-$$e^h!8x5*^|XZG!4euiS!KQWOEgUN1KEp09_f8^oCL8&e?5it zjC{pf-P3oIySCR=*j5B1IJve95c!{rbniZuD4wR&aQkc+tOjTh=Zeqrvw2S^j|*RY z&OT+ERwh2Ij+|mEEHL_t>sh48K=bu&HK8gE%);naQ%6pST 2K`Dd>gW%p}n(1r~V{A`6kNaOt|tBcl8L5%PO{DH;TgU*|1*)VBZ3Oc)iLe{Ktz1+H38VKe6D9EVp2_YgckiHyn*$*c{(rGta&1ZDOhm^Xv ztt>N@?H`?!hR@F?>NwH3u(mBt(p5#OzHC;f{F*D374Nwj+2cDxAyMx*jewPL#9Y|< z pDGx82uy(|ul&2Ao0P$Y&f)0?I$+ zhp^HB8E-(0z13O*bM4sJ0r2`fa%DG=GjB?J12B}K8#rv{qfysf@75u7!t2tH34Gsu zVGZ}M)k}!rN_A1_O&PCasaP_4C6fk?O-8H!bg!dca?*g MiAl89oU pT_roaCuxU(KxgaIA$@DW^`Kic5HQqrcK>{w_h7 zJZl>`w1S2aSGb^~-nG!%kU(VnzA6BI=6z?I(kj8;^c>+!i_G4LbY=$mS4oH8)JIl< z25zc~YQ3d%J|>PbbZTn_u+{Pg |5C@5Y6|&P2N4MtwQ&KAmXutm(sh*pH_SsS;ar90= Aui;aV!M+LCKp zC-2Gs@LH}SV6@H2495K?M~2m=L>Y}Ka-()fvNI0jtaVJ#G?Dc><8}^4I4?$fPoOXC zNi@EQqeq_2@pyCkopQ3X?p&x)EqBVMhGnK0rXA*u)vbmpa*YDw5o8HxRj+5Bz2#Ix z-6DaDIs4}QLa|oxSk9<>Q8r_K=}AN`1Cbh)kHG$+M}K1rCyFgcJ=^&EKAv^&gev6) zw+C&LtNhiibbBmiHcsiapeUEB0jb-khj>cfUJuZ%nUQ_Vit1m^Gg4cI1 F%7g1Fj2#E0q1)*f^BTtfta2L<4BHqIL$h*;HlyxFGExNGHQJAw0V>`_l-Gn zp3Ff-w-<+PtDx)>xS-8jgvSE8H!Zgh@zv2ZD4s?x44W1>>**d=7QwdHx8C#JCP};4 zzdW>C $G}&a!U@_k4!CQ8&hkcaOB8)cpJIG zF2r594|RZtPhd)4gUWKEz&IP;DiDQOony4BPyKBPr9a@HV18IBKVW8bA$2t0D_ERP z&?q6=n4j_@m{FMb;B^IL?vt{UDL*)n;W0ss3(-5Bl6!GrEb^h#dU1b;FXPD(KGKQQ zu`iUDve?HisoEpeFInx}CYy8SCZFOD(_uRHht(Q_SxcuMwu4b#MXsbpeVs~meA_0? zlJpF9h`u}Hpz>U545?(-=uNCsv&1uCNR3cqQrpP0BlQRmRHhS4z}NUyGO~tEcV}X9jrXuJU@p0 z&2@ax?vI@3LT?2h(ay>x7A9cIk$w{3XAl8>Om+m#i^q%SzorVS{hbuvI#-&prhUP2 z$1Xw~=e ^fb(ED%sFP-L*>0rUdliv9 zgmQad<*A<^v^6-KNBCHMzcy;S<)_*Bbme(|HR ;^HW!9~YFTK!w+p$#au8pq)boBOOrWQ1xcX71P*|uDbNP??5qhaazX0*!X z7{@oLTS_-Mm>Tc(!?=~-;1%(7l!i--VoOT+$L(X!d8 G&?&nev1kUdqwvmWN zzCGn0JAUHgGpqYts;(O-YqKKjMBVk#5pvRva+WVAxg#>O(kYA63C>SVm8(0jGuox3 znM|O&5Ejl*wi2#=H?{f=gj93E%hez@+JdH+3eHaUttngZ)FI?=hT3R*nQ>d7$Z}sM zY*nJ!94PjGSYXM%_0#P8ShY1NuDgFNs}*Q{!(!Dy)qp?}IV3@^m&|h#T}d4xOds3o z=Wl~O#4d#wG`A|VpyV-*LL1QpB(QwnuMkX&F?K`3d~3a`sXIoWLu_|3(`;0@Cx+RC zJ&`@B$ot}n7d37-X>8!p^P8Y3N-Daj2EK{>=r5Ffp?b7C;+b(m34*%_p|zeRZ+4SC zQP+9|hmA8;&V;Rdp9j*DH8|103N2>y&0+{Zstxs{$Hbjb=EC$*E|j059B!}~xIFXc zp-$1?T4zAFNYr=uzHo%GdT@YDs!p5~nRN~2FKXAYvzZ-{HUH)AG+bMSH7BKm$@pfh z7 +f9u17Yz%;C9APS-yjD^`~?lB zTl(c=p!MvFmgDaFoFdRA^Ag@ci(E|TYut^_=*h~RIIg6~T9zsYh>!D^)~T)^;lEXQ z9>%0b&rWHwa8%0U$^`emT@kO)L1Y|G8krsIWb t~e75kT>66Ebmbc%*2qu|=^Y z1~Scfaf{X5F6-k6)!`5})au)V4!4voAP0g3Ba$QuQry;)TGd%NY83xa)1Kkm+C^LF zWlryu*0qKl_JVQiO1EK)oYpl9