From 51983f972f68275fa1a364d73eebc8437688b59b Mon Sep 17 00:00:00 2001 From: Noah Jefferson Baumann <noah.jefferson.baumann.1@hu-berlin.de> Date: Tue, 25 Feb 2025 19:36:14 +0100 Subject: [PATCH] =?UTF-8?q?improved=20Einf=C3=BChrung=20with=20more=20desc?= =?UTF-8?q?riptions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rag_lb/jupyter-book/images/rag_flow.png | Bin 0 -> 51885 bytes .../notebooks/00_Einf\303\274hrung_RAG.ipynb" | 648 ++++++------------ 2 files changed, 216 insertions(+), 432 deletions(-) create mode 100644 rag_lb/jupyter-book/images/rag_flow.png diff --git a/rag_lb/jupyter-book/images/rag_flow.png b/rag_lb/jupyter-book/images/rag_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..ad34026eceba7c89489432da74d42c2301f1b7e9 GIT binary patch literal 51885 zcmdSBg<n-s*EM<+kZz<~1(j~3JETK8B&EBgrIAu;5RmTfZVo6R-7VeHeb>R~dEa}# z`xksif7Cf=pS{+eYpyZJ7;}dz%1ff75TigK5OirNF=Ytk2`&Wkhy>{g_{;BhXEpHc ziJ^?77~~%I??-cPGz3BkkroqHb^E?M@1=t`eusEC^!jt+<9XH1j2Ke^eATlb`R4AT z=mZfEVFY^Q_!tM=XE;oW`1abF6^5cmL71Q3N)#z5y~YX3eo3eUSMB|S<_CUQOvd`n zU0b4yfhPVG;@Hsj>5Te*f1+axuLs7gWeeLzFT608kl6n|#sV;EFnmM)_c6mogZsa~ zh4jAszwuXIOD+u+75_z_d$Nt8H0au|c>B}scb35qBR76Z#^WTEE1zPwQ(W88*M}@G zFaM>_xCSHaVcdD$#(tDYaW+{cB^V|qCfxQb@QgZj5MEwhr-KEu6kb<}U<^-gKiF$+ zWc?_YMzUq{ii^9mW#WI=JASBZXjmy}-0vu^U9i|W{5O%Zro*s9UaZCID{5(djwIvF za6MS4TaDyh`t!#)pC%OcvYG6e87);+)gMhwqy$WQVv8+a_Cx&VZG(f`n5ekeut#-5 z_cvq?4i0X&LrQQ;zTUT2=|1;&n^WbPFOsNXj|LkgKi|K99b#f)glMAMJ3HZ;-A^l= zHU3?13C-t;ikh0CqQMyLVA%Wn`<pY>h4sml4{t5eZSf@P?(XJx-o^_;Bl2tUx}M>A z{&3g~nneCYMK!gcj120Ntx?4Dc~=U8glDklSXVBNRxh@4)9fa7T@5yWr`KQvKa9GU zvQqxH7Wg#q9yCH`$oZUO)SE(@hmWF~_d1^kpG}8B&KJU{+px6Xcu?ak_3tbroS4<c zVOK3(H28O;t1S)A!|}A1B6;`QzEFuCjw%SIXJm9tEMq;)3Ws4FY<7ExhT<or9)^+; zw>4YKG&eV=sHo`M(7>Y|Ec$ThEGT_nfWG%70s*6rZ(}3x<iD3&WK)R-{ZPr3fBEWF zx%10^XW>5cT{f?<P}JP~)z#@vaEWeX(zAz?&q!8=Mv}3(9lrn0ZU1<DeEh!ymKs?% z7SYrs;&Isxxx2kienw7Box!Qy<i>)}q-V9m91^0nmUe$bOG-v&e{*549W3(jNzct4 zS(m#)aX051xxib^BHcnll3qmjC3!OFw~!J?Jkctim@t?LS1Yu3`B|Scm{wcMrB<R7 zT2SzsPFzMzENISoQa3LzuMGsbH5tmolwkXE(%@QHSlBIhAk5iA$<{vyhvaGcQU0i? zP<GeX)kPP^qC|RpcUtOWu=X<+2?eFWoGE1E&mVT}oaHxoLyN%_-XS20xOsUqtE$Gn z8EB1xATM{?Qq~R@78|o*WMqWcjo!sQe3sJnXpV8mLF+vRSRveR-Xzk2aYvtQkIP)u zW@cud*kWR07HL(ZK(L63-ADP;e~ep{JFLBp{<)nh`ZYP31Ox;Gf{cu88W9l^B1?NG z$T=zZ?<$^U$n^z)MFE!GyiPe5cA|KxUNf`Lou?Ull7#D)WwlmTcDD5B6=Bi{RFO!? z$AVI+)B4@JcTzGk{$P?ILYc#05m52*k*=++K`6(I8|BpBy?YwRq|YeFTV*-PnCa}{ z;UROHr~2BAow#{Q%kd5(RIHX+P=EraePLnYw?#D)Cg!Ae*bjz{%K9NXobyoU9d8=Z zYvNQ|m7x@~$r9bev$MFIffe0$F=M*<MpsE|>*C_hhtsEi{JY1v<3Cx!v0FsUn6ono z9S&kOTO()dp{R&8m?p?1cbqwFM$F%ig@+fgvSMhyo#u~-X?V2K?LPWA^ykl?Ckw$r zLDbC5Sm1;L0|USOTI>Dw%U`QlLPv-6Y;QK$*B25K8!J8Q1cpt;&W=}7Qi28l=y+oY z3Rb0(hDM(HIatP&@xPSR)Sg60JR8sCt&Sq}kqO-pNmrx<Z-9-`jGf!z4-y^<!eA=D zW!&-f+y=sSG=jIcH#pSY-JM3cVW6t5%C*x_boxPdz9ZroEm2PtMbxC82f80++xYm? z!NI{|`F<?yYVnQ16#K1_7qBpaJ>Vf<kc;a_oaDT{1$<kXX0Wj}quuOl^97C2&kts* zQCFc+k|rkEPUpAaESU|vkg{@es3|ES=H})|XlPcd>mZAYn40FabCTGwWy`9}cAb&L zg@uN;gK*TI_g3kuKtMn^JUsMOD-3*_-BDrk>q~rm@N#Fcj7dRZ;b~3`EA*0m?RcA9 z``tT)4<9}t`TgE)nearEi&e^3)hK%}T)7b)()<0bjEw!&iFr5?ThB!Lzob&V*9T9X zvD23$mkik~eaZ}$JEZMHnpe)b{yb}EFs39pt9OQYv$ot`Bj97{XZCN;7cmoMX^KCo zfTROXVJCK2?m1-rP1=B$UZBV$@aZ60g$u_s)Jye70=<o{wPey23FpX(h^BMgA9etc z=1N>WSwDr8X!q>5O<GjjIXHaVx8qXNbM=r(b78J3W>BEfD7ei@P@af6o)|lu@Fdp- zp`E~Go62tTbszU}&sp`ECjmbG%H8!rd}<Na;xQOS1%g20za4)MIZc)_gXCMnuIEZ9 zZI-n|Jt+i@F^_KHD`On?#%^uw$cS=sjV+2}>QIhADOj7VY-~zkGzkfWViFRDmw(p= z_AME}dNwvST^Y+)0h^`<NN>t2DvAFxDM)z9<k84tPM!G$1sxs-&4~3nk@l-S(zCe= zX&8`;%Z;>b>lKl95L=MDmWyJw!fY=v0I<kv-|k9FOGA9CEhpdZfmK?4NnQUUVbzoK z{G$mgQI!@0A0J;CNI-aacv31DM6;7xU`0d;-f`p8Ye0mtz9c4w`uh5Ej!QqpotT)@ zv-hxxlvxSf2)bvarx!CbdkJ|zUhvKxDx1WP3`TC-d>ZG(bqiKey5h^Mtj?HMDqx+Y zs}(N)`2(LQ8&p@v{WA6~#Anf-X+gTxc2OYz?(opAx$(rADKf0fhh&DP26L>Gh_dEj zcNa}iP|zQw1{eF*eO$PnZ&*Q*)_M7Rz8?p3%ZKQc^HpCmF(E?cTxP8m^Hn9zIb2&J zQh04`ZC_!`t9Ks6J?w8GA)BV1#*eXeU7ZL}p8Rk<I#0H3X}2tG4(jihZ5H?WbcGP0 zUaW;suY&<%$-L#JcF|k=^=P3w6D+&3u&_X2*9n|5Y_o-6k&&T;x&H)*D3Uq+{^D>M zqz)-Lx$bW-WR`Y!iwFoH&DJZe=+?NiOmuY7GwLt#UeeL|CnqPjH#iUZ*Xip#GwlBS z6zmMFTcq2mn7R$t?j9aHdu(7moqZGsiGQlf9M_nYh|_u|i)-ymy4OI8t<grwj~_yB zdp4B|$3r3_tgBM~XJG9J2_VEvUNJC;$201ld?Q*p1E-c$mB)eowchTLDGU`*TPR$B z@nd8AR#mZsLHtmnew63qK*hl^{zU0vs{voCF<l<uY99Z^Zsm~O-OWeY1ZH8TbQrGU z_c&Vu5msy9^q(LQtLdhNVOdC#ZX-S{JL~9tuX+Mq=?=61`$zgexB|?34wT~`<ei}^ z`F}5!hqL<kB{M<xUsnIW_}5)4G9eX4y{3@4Ih{Wn8>{j9-onn#93^_q7CU7n9=Z)q z?bfyPK>!TF0tTejGG{4c39#)<)!I^g4huWFK4{G>DH)ugN)!*qAOqMn03guic0`J< zJf+Ov*)jy$!Q%L;0P^kbTH)d2XH-<+0328AEX5VEKi}9nJxxSTPEN?{LjOG_#hMIf z`uC9Fefan9q<BxCF7HlPUK|ezT9YX^f(00`(Co1ak{EQV+-P}e>HW@^f1yPGmImbT z8UN$s<3|v%ow8{QU7sI7KR=}_`*>`6a|ETZ+nXoxx}HbRoxOXci6|g7tmf=YaCB|k zx}1Cebk$Q19l*lFImaOwEO@}iZeu7g%pfb<wLM;_q^E}wyg$$4^qX?dd)9i>(AIY6 zuz#h1a;bLPg7kik;5)Z7O6`I>ou{Yg;Yt|ON_sGPg|nM6je3cWu$C6_m<7k*zkh$1 z8%d(=E>e`Z&VAZ{r~_<>H|{Usa^=$``pS(ic1l}eo83!16nJ>}w!xD51%Dya6DWlb z<(oG|bm}zed3l7jb0Y};L1-eSdi?e>>NF1GGuy;5xB74H4&qszcBim$X=K~x>K$3^ zSHvo-l|b~5<|-KVC$N|nMn6ndUiFL|>++<&kGQHT-bAT>)HUBe^h9&Wup_Ilu5-M4 zz*)rz6fcMA{=bc_BxYtf>OAu??(fc9!6N%4pTaZE!^heVAZ58>H%ik{4@ud<7;@#~ z$A{rMk%;s2RMCA_WU1ZX`Mij=Tdq+0(!7HFD15rW4vIxV5#@7toK}MoF+<7AOTr`} zwv_t~M>dfina#_K#pcA!sd)`wJJ@CP>bL`8_v%c$NJaq~KU-_`yY17(`)-tQGTw=a z^sj-SkU=Nme81cgc+q_2dVz4UM0B4|csKRz#s}`1_kA(3zE3soj>^cF=#((9#VmvU z7y3J0bXJE8Y(TKbSZY<6v7c6PPe&lCy~j{$h!-2V!bb&j6|XT?g1Z}Bx&<#piq<sW z#{DK-064zi<)zSpjY3EW^7HQCzHBLw;P9<jm)yr;4x?GlrV3-^g29wd-h(E%KoNtT zFL{9$mX_G~_(5Z1s&4$3&sAmOmQuZMt;p~>>`pe)u!%^*iuHXW+S-Jkzj%?ZU26l% z%l=K+^?3iD(!tS@#ZiqCzZE+omEU8Er)Xyo^BRM4dyVi$Ln8nI6@O`fYf%i88QQuO z|1+8?r-dJ_cUP!PEf>^!Zp#P(10L9Ku2B=D%06i~xOCI8lwX_)QMq$Bz8}j|0-z3j zVA79aGiHmimvh6Jh~776+D&&q>9|a&A3<^iPVq1{{=E0rAcP&N>0%`e7M0-a6E{IE zLdfsV?&5vR!M-!O`m5S9QOYcLe`^v`zeE>x;Ocbh@^q4r-vUqmJGa43S+6Xth?6A$ z2p{|I=~T5VSaUjqVj^_>tT$A<{qsR<6ipGB0&Wy4IkL-1Ob=Jask2Ozbs1ndfS!8_ z{umeOTodVqh6eHzs8;6-xGsc_g)<~<bD=8;-m>H1;(}Dc@g*T4Bsa~Q_>oGkp|-{A z{q0fc1l6<-frkfdOj6qQIDLg`?X$BaV0!`e?pQcL(|lK(nRPnq!3Q<A(5$0XaG1pR zBNs;(HrFmXC54@tQ39XAtF(i~tWU<(^_M~NfcgsGeyx`Dzou{kS!=QxgN%pL_)ONU zf^${q&O4l#1Lwow_wxUi)7GYy#vR|^I38NtFml@d>iCl{P=n%6yg8PSt4b#z@y9ZZ z#dd*DApLhFC@=bxxiIe|!vnOkS8m49`Pe?Py4Wm)&)K$igCkgxVGt?3dl%TJr?<JW z9%ReLmWbClI5(b)*)neSduRYXy17a5-8&NycCp?!N0Jwpmj-`hq^Dx)$s^?>YcRHg z{{DW3Y4~B^W$b(Dr>H2*?d@$VGMtA^Qz?1sc_J18K`?+;E31F-_zr(})*yXKN)P`m z@!K&yLBNX#1r^nrY*4PWu8xrH!=PAimAOWi>I~0!mz`xqav?2coQY!XU;sB}CziiF z0^CFwz<yM?@L8pL=pb2wd9C&nJ>S2eeu0p};}Q@b4_4Q)0+?3@r?Xv6*%Tgx^N(oV zh}*6P0J!XYv5{)Nt}|SX-#IcGjzU647AA>%{Xiv9SG*~t#r=DHjE#%y|H8J_pO%*2 zWN$qmA+GtDai8K0>+$2qc9(xmw1XW-8$2&rJwZO{pC_ZZ-w>?9$elm-TtRL+zS_~K zGW%L3#aB%s6Gz|v_5Kz!X-GhHXx6sYnS1QXy`4h`f#t-~)NrOogHwKSXF7fozXvBJ z+=T5F-q{)0mIl$S+uH6f4z3iwq^3rm?o7_|kUnhs8ETaltio9E0Alf-Y})m!HN79m z$$!e@yd8ikAT6Q!@r_!MhQW@VjTVLH;iHEf!b<f?g(UGMH9KBr5T+!khYlWFOGZ)% zMg|1HHyv#k5{|XD7I#vyf$xHGV&cp5u8ZR4=HRTTaJ`NPxO)5h1GfFS=gu%`!I)JD z&r8dZ68Uja2^huX<RZYU9?r|+X(0_REW;nPTw~ZW_+YXo_FL>tjG2A?+Jdcg{A_7t zfShrD7rXVu`Okh|jTYKuq0iZV#38}PY6RDU8Nsn3z}r*|4CtU1<Wkk{F$5Fy3cu;l zuX{bV*3q72%eh(FZ593IuoH9gR`*BTZt%qZ>f3Cb+v`(N4aG0h+g1gwgAt!Qg2K_v zJ`NAAtivO&rZyf(7#n95i&Ek009FYE;unR}jyj(R4$FD@Ge);J)IYN-m?Xv8`xX#r z6~41tqU}v*Ouf`8Y77Cm`@hu4*lRU8ny%(sPEWWGOM0%Dh1DO=`ic5cz3@M43QK9m zKDSl~iSjR<gonSr{*fbLS?yLLiOs|$mOFR`_VX&|mjH!=bo=8Seh>yadbO6e+~vh; zl)+*?u3l(JnI_u$nT=t_yKlJU=L=zpEiECfgOl=Q#%Z<dZm$^`gCsKBXIWU(5|eME zWAOSFUt+P^k{1l7R=asj;yOkN1Gb}y3>Pj!!XG4&%5h5@z|$0Pu~w-Q5fO2_pS+A~ zxwWmFY-ZL99hZK^?Q&8#>;R1<hi+%#(TA&LxKgNBR^2XpgxXcuE`}b=dfdRFX6SWE zQg{V`>ivI04!=^1bs4}e=>6v~77zKl>LhrG)mz=DB5Un*ts|Dt-fu!b&+w>@O{8ze zM=MH*KeL=w+x>a<vw%g{)@Ezw=_BFxivyo~%N@m{q~9Q%s<gC&z{U#O=M$b{`Igkq z8J4@0sH$!@C(SOXmC|b()-)s?cQ_8E=hYDk-W>Xm&#-gJoPD&6%pEUO&-7VrN#M5m zF1~F$rSHS=+D|LHBd&-(p!udke5OfH(-2LblncXk(OJFmBE{^jynJM_s2PD;sa^yv zZFr}y*8#i7yox6c9OP{M4-td9+oojm-*qfpljg;^8l)r+H~^v~+}#^M)cgx<mckdf zHCEGpyax@a`<Q%Y#War~GJ1tRbKdKfmBX1I6wE!MQu(p(zTrTAB$%|k;<8bV&gF}! zs9+@(@SK`RpJT_M5C{iE7T>e@S)Q1k31&>pxwUoE(Oj9l1^kF70(yFCjciToQRGM| zZ*aq6-dgqj>^Rp6pUnW3jb~HSk8*pQnpaxI_;l(eRnCN*=K!L;Ki{8ESTRamjP;lg zHq3~p)pMu9;h4$EB}^vEY7=8pnA;H;qqeX5AYc1t<)}RKvhiWd6PtVi1_Q7mv*8J$ zB?m1sGCG{1;JlJ321evaG)e>O2p9F#A|h;^?jHDupG3G{cRLdhTh!@#`fPV0g8--W z-r5-vuqQ(-PszK)=Jwt-%j9u9H<q#F2Tx8}r65Kj2B$ar!~OjmzG!X62+kUS8c?Bw z|8jcpBWCR22T*9oPdH&k4L6%j+i7>!1D>g=xfy`o1!J8?mpxXE))#-)*4ooOT=_Ql zZH8U63|(y)*CoW;2fGne{Qb*$xzuNBE#`Tq>g#@-)ZLxnXG5bp2fM{*m?|c;(2OWN z(5}z+D&2U6yjrzdJnP5eUG`>PSaXdnc64@T-_e}8&Rh3vbE%f(pNTiD{+ykiwLo1@ z<#ol#mW(p&H;U5C=GSHO^m+vGAmK}?pn3)eJ~O+eiRxMAaQRFUakGPCX2!{ttBP0M zvdjFrc11-NXRWcxR`;_wHayh#o;O=HD$Zv`?6FFnL#BN!+%A8lV#xVFFM3}OSUJ}O zaX<MFZQ5(h3Mjv=73<E{#UO9nuEl7;rGhQm&BH^qaGV+x24MtDago+G{ncEEnB-!* zx?~bjWaj0ZH;+9bkQag+cRs|Bse7*$y*H5FzQNcDMWjPy33(Tr%vFmjjtfttCyzb- zva5-@wql%exg087&DrO_?%O{SXut5xyd%Vodh>Aw54_}Pednn7;!h3<|Ac!hU~*xP zb>nK|j{8W`_8(Let#Ax(XU7oV_>Do~iJD?==aqorzeh6q!G>yB6*blf5M%3El<p$R zW-%d|;%jyy&Dk2mr6sBn&W9k0c_&Ty@xJ-x-O&N>{c3y*hJGpXh!!SzQOBgENV1_h z10Xp*`9E0&u&Uy%hp@2lOOW&^kpSrj20hm33kLxg(_e>CQd$}r)HQ}iMvow|v9S@` zbaZs19;J=sei{mZ?q(;B7!Je+RajJ3)^k-gH4!X$HqVh9vNsO!{)lL1T#la59_XsH zzP{(TZ;yZ6Wo$-+OdC<!x{1T%NV6UguoU}3CQID5nuEj5qz^~->_lv{Kan%kWAleF z_utlg&88G^bpnEdIsnn=NBREl=8{m*n-4&i(<^NQ1FAm`Z@{Yhp;m|uAdc7d85N)p zfoe0tDe8T9`GH=e40g^iNn^k1SiU(dRj!%|1qG!8z-~od-3UOfkn*|xUfDp%JNN}* zb~=1tSe0wpHtz}tad5&(FF!g;NLQ31I0j*65F|o%YNFKJ^wE7yKw7%}%hzZ2b+J2- zVL4-L>3y>g1tVkJ3ig2FOX3%JNhCfE9eUoHNk64-tmIz2?3cdrE<WWo=>5C)Yk6Y> zQ5b9K;2`QL9gqd%7<FIAV*99zfh)l6bH@iSEM#Kxf}I#$L{v0=+ya}J7zHpzAUsLI zjG_cS{!m)nZtyd~(l(Oxjo&`T{6LNTC#onx78J;r2Aj<G+ZC7cx#Uu4r-vVt8twS` z9+`IK5`TN`Fv4xwhYbUlFOPX^CZeEVPjcH_`1+E^%9F3<(!FWHp0~ynJlpZUgYv~k zG8e0XjvrKTa<_HGtZti>-vzvgfzp9*{U2#(t|(6SVsGwEvw2XF$)?x-l(u33@7>nt z_dXP8By$uXi+#Ol_vpP}_GqrC_o(=aMS*Cd%KkTsR8-uW41DuveNBvfWMAz4`aKBP zyu9L0Rec}Gsq`n<z6NmVR_QzNNB^tQYKSjKA00_Ib=<4l>bIZ8xwhUj+;0xU0iGG8 z8Ia&WofGm~(~0}}^Q>WnBtW~uL7t!yLLiET;}BoHW_ON)(SZTEgXVpABtw2fqVm)r z5IIKxXDtJ!h-)gS9_V=(&F&{<ZoD~DDam16xHx4}`CauR$~yUZZQvWd^6Mj05kDt; zj_q!O@)vZdeLItIkZ+TvP_XlP+U>2>rE?I`7jNv<t`<GL+5<WfsJXDPupkgZS8HqE zlM|=ryY*$IR!H;I!I(vLpO+&2B;f2o0)n&w0%qFkTIhBZM(+be6&V=`@s*CIslIef z7P)C0K0cc*9!aG#6cMUry8oUQMfddS#T!BW?O!YNcOd(fy`YmR9V%@-Yxb-#l`Axy z^4a{NIypJn5|0RtLiClGb&f{Oi4^<_%HoJ^nfWFnUlZt$i`&%dWxvU<U%zgSWTQgb zhKH37T)VLB=VTLE5rl51-1n*{!3fH{u3ehTc>(S1=H@148NtrAK9lLVF_<oi`75#$ zte*Fpp7d(8*-L*yRot)TQ@H~{L}}ntgn_3hX?Y0_x?a3DsKQx$mz`HqDD?5&D|`vM zBY7Ran3q%K9H=1Hwqj-Uv<1o4OLhFW8(OdJopl3G^lI-ij4oks7%unBzY9_jLL+9y z8h3u`*5gy~LIK-d=i0iq=U(NZuE9=>9{+~y?CiWbS6^A3H0tPj?}2r{fP#1HfTQiY zCRDv*^k;3o&2nzl-SyJ4<$@H#>^NanceVuwvD+I(Wcx5MF}tXo*~6E9?)_l`1JY*I zt;5YdrazXvy%PmMRadLJ55d~PcPog{h0NRhaDV^IszK2~n;nJh_qK}&pbV;V<4yBA zBZAy!wH+>ZS~pPs1u6!}MA=~y6LvranVL20XOC%iWr8fN9olj8a6=%ZWTb}<Znu8h zi#pm<V*}$)i7Y2#ONER6>ji)%!$TWGYCX*gc<@x)z_^2JJ12BufgB8UfWYcm`6B1{ zCzjI{CivzGvKfGzOB}nav7SANgrj`%lwOYSelJ}xS3h~%^sGNoxz)+hxqH`AVKC&n z_FxVflECXxGq#Z{m+~1FNxf~OkeuJeJE2OMS$hquZ(SRE$BsS}k<Gt~r56Y3>WFt3 z@Bb7oB+{s70r3mDT}*DDOfAEL#^f!#m7gVW1p}FNYL+WCXLznB(t{Lo=(XV8ytm?E ze_uO&>cuNUgn<aX64+VV^hGl9S{z(>w^&>0G8P3btFO#<7`jjpch*H%&>cQ;>%VC7 z<_qpmeZ?O!+!#eCVmdT7%Y>5_SH|w)F&p*tUnMs21=%{G@WuU%UmPF-EnBD((WEUW zI%lD^)dPvT`>9qJ?sC2s-Oz-~T`Tiu{~*hkkl(YDs`Wv$att3rz=9=ab!mFRN5M{} zyUX)_RiaacAR)|6I48fv+{~xbdYv&kDd{tyZU7jPb`91}YHbw^2qXAvx+X5#{btPh zK!ejn&w2hY*d9hw#$+-wl8P6<ahjM?Gt>94j4CH)F4h=pckUINFUHgj7_9b0Byd_M ziMJfDUq#pCJgLPb^zBPc?bWF4G5a|0m2)zh^OJqf#-e^blB-9fKc~kC!-bJ?s>}fH z=Js|#ulCi?U%y~Pg1Hxb?At&<4ndgjrz(1;SZV>AL`K4yW1!zo9#;Ew2{#<%`jb>* zy9(EK07SE_^`14`%7cZaDqmX?gci%<@_k=GWt%HE?M~fq88cj1NeMd$gF^tp42azF zX#x=}Mn$drg#TCrQ8f?NcKjr*mzwMr{TdJ<<1SRS&mpo@@xLDZ&>i3<!@`2e4dH|= zB1xI4y;znE7WB%SvcX1SXS0nJmOFpIMqXwA+!)=)#s<_KU~_w9XlRH<L=*}*MJ`Rf zn`V|1*XHFZ3l!*ggUXWmTPDUj`aAVG`F}8IGL3{M5$js*HuFHP*jZ5}bKHXhM@vvw zs#82Eih{SGcJWK)hrtBWc#WuXqb}AJcjO>FuGdE^ky^z;YTEZ?vGMWGZf0W0YjB8& zkn43A8BRRe5^-@JFCBcGM{gE`LC0L21zD-GpC_;Pgq4+VMYb#_OJc8pd>lKBnrKZ$ zGuzepF4<ClZZY+n)5PIr90SBxlH3i_w&+!V6LY7t50LN99>Kl#c*o_vw$=h31Cb9G zZ=&pzVl`ACkkRWl-~nkeBs|=z;s!V-9*r^CFycU?($dm~Yl`^SOSz&V3Vc2@SzdFw z-#@K|YjZT1>{+dL#zJd$`jzr#wBqOm`J~-mkdY+#6xxTNryiaA-3LFE+XR8M=;3~8 zq}68nXm>NE^t>ev0vTC>{>@E$1Sz^^*L?f(JCFV2t^CulzR2_MdFrKgzK(Jc_<h?^ zvXPcudBYH2<5NjxS)whHWxxyog5bnZ+EY-NX$y8tEukw34wIjFy=xA6;}$^97X}JC zBO}J!Y~_P}rK80aangC~6|(FVvP^&uqkjej2k(qOBVQ~_4Ke}7hNI<R3Xx(pqikdq z%y(*PD?elDa(oV5`p>oeHs-s;n!~ai9UToeR{UH`8KktlxAAhGAj*uA+|qL51FTP? zTZgcnn^yld1htM)yGC}q7AVVy$H#0_i)g1NqO-oOxK^M{`F6&j*F^X__N^AQQ{x)K zY|sG@X#=7TsAEdhDIl4B4M|DFV-pie-mEj93MxO8gNmgo@r&;pDk{5H&e)Kt_~^;v z=qr=Ud=(8J>)|=+NqjMH&n_fLn`B>~vi|&+ua9^M2>P2jo#QX6I?pF_Zbm1@mNNes zSNh<qK=ozj&5RVYl=HI$fI?6!9TvMI5J;(an8t371HkBl`woM7zx84Z8Ng~_>9buu z*K#x(!~uHr(MFn&R*|=(gPl`b#f64B)tc)HP8q#`n$|G{FtRH5DMeCJV={Puj5j&} zFGA6xzE~?6SwaydP4OaALVM9xa53Q#tp`C9X}Vx+YMp-VUCbY6WszmD1y7Z=csF^- zliE%U$v&(gr%v3NrM6FS9YAK2eT^z4rB$g1AXVkI%<Y!eBcW&}6V)ock0z>4m1}6@ zMAvFfC${A}o#zcqAi&USD%os(D$Csj)?R?!bYy!&`R;_xFD*@9yCJ;qH62|bSox29 zv2byp0iTi7t<?GWSPdw;g&E^fAprnV1Ck8(bAEol2vGN>PYGXF0_Y$yn}kC^Ks)Ds zz1IPhi$I`4Ed$Agfd>)D!G5JWi~w<!ZOhzPq1Q4gzeZ1u2T8J{R9w6x_A`osyi^GD z^r#BAy4Gv(GOWSaIFx99{y=a^mHELB*+$N_+S{>7F=M-~CX4|8E4RLTi3i*`iIhk= z=h~vPV!W>VF;`V0=~yoNbLI}$4cAXm0;^hqAI4UP-DD`0zk{K6jvDZ)$bi1-=nf;$ zcGBatntETRkXYHuc{;L}HgLKo{x)0h&3sG2HBX&mu3dJ9h(@Uz*UWj^)Rcr#UOvnC zx4oQjL6x1#KZNj<R#Ro^;<ugOAxNP9@B`ouf&?OVMqN>n@-}Dl?EL4?w^Um*i^vcW z3yT6!iZG1Rw)}DUn0b~&;<#P|(ARRDwhcC5JmG<DLkCcm;!tQ$4~qX2OuT}f*F}GS z&X?XNfBa!)o5_lriGIEps+Za^94)R~AF3AwHQK*Ri8vD^z#p-?Ma_&=CbCbi9{klJ z>H!ZCQBqQ>T-2174*imnGC#xk&lzQ`#?}3}KUe;H+rDkZmufG%hx+nmW(LdOqw<jk zWEekTc-+Gdt2jY~EUi-b=C|C*#hF_?`e200FbT-U%a09JdN5$$@`=q3U@_wA==f^} zWwmjI+#i6dqLDw70A$UqorD%t3zd2C<%0LMbyru{4`4>C17xm_jt&+Mj^Ea3Zs+`b z^YrTM=;QtjbRweOzF(cRuU<hQ)o&3FLUD%+C4rl$7UOfT6zN>ON&_lsUYdYuZ|_&d zLRA=v6AWa^z9f!|=P$&y@Fu?%RYQ&==xJ#Yje5d`ft~_$0nWMa6oaJF*`LUkz1O2* z^k_W@R)!v7KV!C^;|4H|eWn#~5BbSlMlx#nG#>8MzoCeuIr8IlnZ^0-IsLLPOXQ*} zL6Lx_ua8!DZR39$;x#vi%DhuEK6YU#?G;DrU!&)HDN$<##ejJYTwGl09M(`8Tn{1v zq>xP$Aj_1D0v^I13hwIl$NkjyRO=fZB8U5*-TX}i785=-FRmLnD|;<^-y1zm{hJyB z5Ve#Ej98%N$7O0(6eK5*pkuKPV!B#X5hM@8ATT=p$)S-FlTq7Ssd1lEH2?$HxXpaa z1WW!OZtlqsbbJ#Z6v1A0E^*dR{r-IcaUZYuYLBjVN;6CL4~&)nW7;`6SfpSx?Qa7j zo*ghA67nsm^#zciM<ZL)(%?FUdQA@xV~^&@i301AL?kJ4qU^+`n+y$Zo|ge@dqtPA zAEQ0}+3qy%r%#{2>{>d|&rl}{MX>xwPoFF#aUX!sI9ms*55(698o3M<t}fq4aLjf~ zLS0bkD%d1BBO`mA4D}~0s$raE*l?y~C#d<Enon?m4r9E!8Dc}eqQU35js`R#7WWe~ zm=m$I<?8j@w{NXT$^I1u^HM<NhUn@Krtk*KC38;mgzt0!n~2$ojhnswI+%FF;S6y% zP~$Lz1HdC9c0!?0ErSL2DO>G>-mlLj&h-IZ4Y31mpyxC+EB=@QZA<O`ES3}W=AX<O zKJG5IE-vXFjk$omUE(~<=m-cQ8ZDl0R#sQ-51P*nCyF#-P>)08KekB{!f50%>K89w zd~eA>*xgN{Fa(loY3rSzEDfxNIs|p70oX?C+>WRl4*kAQmn~`qyRjUD6LC8oS3d%N zQNzD~`Zyy$7rkO(!G0b4bHZTmq$|J~05^O_oe+>}(a8CxdX)Z+efTtdlvF8<?`+Bl z3;q)muAaTU{Q#pZU3A~?d=*;2dhr1c-wm9n9dJKb%~T=R&N+m|wu~qH7hiXt-po`& zt1ibuo<xIeF188+zDG$}*{|8-e8naOA#AIs*8S8X`Fxt>v>Ifm=obGVqod8?%&E!` zm^w)sW#1oSETk6?7?^sW?C$Q`t^Iro3n`#WOG-&0U7hV&?v#aS$?DvU10w(kB>%KD z3W*3}6Yy6Xo)jME4uA}oS5_YT`1tfEaiC)I9r_k`{)0XlBuGF8RioD1w0Cyy1`GEH zm_H1`{suJ8yzVaJ1b=_H9N9!a;1md_5KKM(gR7ayjZa2K#$r9g4v&Cf@Td1HY1lt# zX^g$clL$1Cg{8AEznQ}cIfz&JXxrM`hkq(zCj$Q*1_T&n!V}p(z-)J*x~Oz(ge8^E zbkV7Av4ISlnm`*{$@jTMjp8($-JgjeP=EcJo?OMlEPkd0V93MM({2!$EZ#S6(Gv*f z47|9x#w?P86{czI)eQ3vq-<k~wKnrh8ymqyY^Lvbr^*N93n#VY&w`-Kjs{eOZ`|Qi zzcT|;7z5wDu|A<-hnxK0#1?He=&(_lyu-n(^kZf^(frQu*fX(QMHfoZG--?zRJ22J ze}UN1(E+l0guc)1QxGh#LjzoKagUZRjugct3_&h~EDZ#}hoAg~@l~XZj5Tg(PDbUm zwZT9z92p(8-=BMvm6i3rBLEp+?m3o{5io>&0+mn8#R}?oeh>UY_0k^TDrAV0Vm5VF zMlnTvg>|;e2h_`&Zm7?No?&z-%D<~+kya8$C;YV9+5KQB^^HH7HY+yK(PO<-UPMby zn;IqKy`gWD8CGPEb#d|WO;0%&<z&0)Wa8e-OCbU2sMBjx5#kHVBt%S#9zYesCOz%= zczJ!>;`Czk>SQxBY6bX2YBjH$NYXZZw<E}S@j*JNmYzjVd(7>)PG4iP-zLK(Mr}Cw zOKP?$NBp!~jDh8Yo3SY%b)P^0Fdw5n4GazzEmnhrzzZ{b+(LjO6<AJ;<E|cDczFxX zUuDhmB!^OA)#G=bkB<RU1*5XiJpL#FgNv~Wfc~qXP6v1dm!ccGv*+k!*M^%ZVQ?@} zOt`fcc+xN1L`rUxDHR&B={^aTM?imSXf&<-a!MWi?!5p7rl7@T?m;h4f2^2UK}%Pc z*sH|%p;wP6X=$NWrw>MNrRE)nq-S4km(U<>nAd+#YCdGyij}ou>NHG010n%H?j&T| zpeCXt;1GNajUtOZYjmpQ;?`B{+-o?ftg()r>7S{2$3$NKJzWDr>8ik)u`VeE-PrHr zoZ6pe`;e6%PV8NivtpsqD#PW`#pFfSElAEuh^m|B@OK+3d?Lfdp}9V6(0S<W&g0qK zOtLro4-w0vWAp%#uh|Qfr%yIYZGkqS?|eqTASY{8At2gy)}5aSdH+u^kUs6{fjTD9 zuu9c3+4TMVc9m-5gL9pb5*9WrU~WYp;&i<ZVsLkGz`CL&zrCHN+Pp|d8=7Qu3rgyj z{N7DUDWtYz#G|Gck0C8X*TOSuPIVedJ-q-GKd|Vli(V?O?$64@^P!w4mpy2iYqG^m zfOP_jqV(E=CqKD(Fv+>kyaRY~ZyzV$Szirs5CZn!9Ol9X4;wxa5>jqEA#S@RUuly^ zNPs**1@TJL3PFM-F|1z3#GmL9J!K%vy;hbG-yz!oe`t5$Jw79`Zd`Ubx=o5mMxQWw zNq(AZdAiO1!qh%Fy{`KTZCpu7`vWuQQEba8U34qv<>(L+K(^LftYeS=7vVB*aR3|( zq5MwAz;Q`fPH{uaS);TF1Cp;N$Bxh!!^#u17Tv40Ae4Z4%(ez35c{-ktGoi&C0h>7 z3uNmX6-nzVgU%=Zx6rY>>2DQ5R|D-Synz6kN_&m`)=0p`$(W2wZy-Kf1RPJt_b*>0 zOq_OXrRygmIgF0BC(KKZo(KVM!N0hXl!J<sQ;m?_?T4bSy1`$WUBrRd#Lcx=s*~@K z%#)M%W%?|~-JQ2vWck(3FHDXipgSNzDZf$KVN+u~E_BMD>oDsyGB>EI5Z`cGOy_?L z0k);Q>4T!IEV16f!5WP;;B|Zqp?dX7I<Ke*?*RwHur4rJW;>wQnwXlRK;Q#KsDOVN z8QAwhu@F&1#H02+RZtgD%_1Y!i`EbkS=n&Vu<&X;Ix+DTC`r>B8nhH&;*Hz|okF|1 z2yYv6mGg;H;2`ey|JIEWAT2<_s##=n^vZXRe_9I2!vK+9N=Bw<)L?*b!bDFa0xr0> zZ0-Tm{I%MeE=Fni<!v<zxcG`b4fv2UntEqf7P6m<OyjVt2x+^(#)K2f+yi>^h<yV~ z*xFm4;%|mF7bk7Mujfd{Yd;zhLvE{IytdfMI&Z%dfKaAH1M1Lf{@wj%?K<k{hA;tq zd&c6kt>`{uhNKPkCb-$*_VjLRb4v@mk}5o~b9^b!@m|;&8z|Nf>oVF@%x@_j9gUc% z1^AN<4+TU(`Sa}q4ndF&;UM0FLr_o(!FcI~;!`7j-AtA@_-ER)xI;cNSCx!M@*hP@ zgU%>;#_|sMxxM)y>@xzQ>1Ixz@_MOb8?ZN1XXB)0Wl1TJgLT)PjEoF6vbU!xbPV0# z30s=yQm%gwz!Ly$gD1AfbBptbEr-S&<jie~wt5P+@4tV+YIg5uS?D^5UoF11*gAMC zvpc1APlC6kvKZeoIQ@CM0R_a)k4+5$$a@#X+k{bFA7Of<?eYc($G?hB^!l%B|B2xv zqmOeYXyb5q3Q7vwCf}Ui3a%bs-K7B^7pxuzulZY`3_DO$0Ujt`+-MowmsHT?%$bZ# zfCCv|OMgnF!}D{P=??-)PfrI<@c@YryE`_(y%hlDDm^`NAXlxdtds%ME-={rC@PYj zG2NV6Z@StpL_$Rs1@a28)|XjLvv&3Lygh}<ewo8d0Ca)S;`TTzYQJ*M<;Q`4<VQ() zFoXLY)bXhJ^k2@HfR+S&!=RkAb9A&^n|{D}4R16U5`PzKbKP7*De$dDo0tXue=Kt= zn<XOTeT^X_DJkhAh>F)O$P>XA=W102*7FS#5kz#>m_E|xc8zAX@-CSUVDCrrkw%8} zPB#}$yEx^lvUVN6VuA>*6Qn%@socV%itwyAli{w(XDn3`h|zM43f7~r6R=<QdpDB= zDBhTWgxxJ<i2G<~Rdx%lM1)0!0Lxcq+UH_SUw@EDx|`CtY^;lDtN2R>qj$!B{w!fB zLg?616L&k&)8M@G1adKoayzZK2<IE$*@<pryD3;+KC<%1rlcf+-;oBm`13v-%+KZt zNFpMdqkpq485m}WOXhdX(enb*?dc3#wT_HH>Ar?#!CgEtJ(g|ckxNSrKpww82heCr z-rk4Znh$e!g&nz`HsXp0hm{*y;wyif)ciALa#X%KpWC8;zQ6kU%k=5$J6Q<GgknrX zmQWLFklQ(Ci1}_dnL%JI%|AW8y`SB^D#uGl3-&kiqHwiy5(=pB-u-aE>g9cRyfF*a z2n`Px170u)1c)ji<3k|8v(EXtuyFwNL_wH6FYF+`TE%g940_>{x|r>XUUFN&BL{jQ z+)ua1^BCvdpJ0-s0U{4n0ZBUdfZk76&Ii;!pqLn~nds@e0K^*xGEVgBzbMe`3*el~ zh)dJ=ah)tP7+|X7dcPzjdy3lTw<%6D$uxLb>H%#oNg`%=a#Kmbm-e><Y#|YGlk<~0 z%{?<Vb@O8m17x=0<q2}3xfjsR5fvOEF9#~C{jev|Bt3jbz5a(E-CxHsXisFU<~idt zXaz8}UOWzLbWK+Ewo%1{sgXdbicXWqI@oPdRx)sE%>KD`Rh@?fgsm?NFkN#0CE_-d zOA8*p>4``gm2IA?)b(GPn3%YlO>WjSKflL(hiz~#e-3p2xVx1TD9OJY`&MDS*NA>j zwB3ll6~|WH5*NpIzQGE0<8?TBxlh7R3<{u;ZV3y0f$Lp1KG535{c)cVIH8P3SXSJh zG$`P177S0c6;DEBPyUL{tY6X2!gggK3K7yXO^m8GTfdq34X9{39-VL{%=`I!TKA7D zfdrk07gMd*t@{laa^~Bl94Bk*3~n~-q=3qMOK_a5{J$nwn(=v@<>h4{^1(dqS<=x< zo0~89*iOU}Ich=yU0!ZJN&`9;wqwn=2~~EO7#O+%74|hICIB#S<ZX)zW{3IkFsz!f zt_k`)&ad}7qXL8bwKhU4SRuX}&zUMGJTi&g(|AE%FJrS6G+g{F2?Y4V(<EP@a7Ggt z+#N>=+U=UX0&QyosFE_&uCA^z<h-VT=jWoL2p>T%wl;@peyOJL(=imykb9=2GR|W+ z+l<mQd+mz`ue=pUz}TM)z3=LQVe-_I)9$gQC42@HZAI09>$&*>Vy^0bP;?H1nvImF zUwm<v&M~}JG#E1zbf^)sn|%q)%${&?b(I9R1n(>T(CKY@Cf-Mo1gE`y7#|4I<)fj% zKuWMf|Jh#*&7=*JEhuDw)?~K;ze+|!$>aKKS3{uP0fpD^99|#(0>0Mliduz?@dEpN zZnSk;%r9G9Qc{#L{uwBLKw~5*Z|mh&v5R%;agNsqfE|F#V;=4any*N@kcI{!fK}i> zXlU#agE{xHzlH*3*bOw704|v%o=KNgJ4Ksydn3?$DgCN(UsPl#*BWMH(5qjCMs5T8 z+ylr|_|=mme{-;muqTC?PgvvA&+DJvbYJ!gI-qT7w~ByycUPb%JhncwxjCKG2k!Br z=@qKgo^T?6m>HJWQ8t;!psVwAaV;r=B$+<CKGXYiX)b7O<Aka^pIIgExEYSU6l*=f zfxxsiMel9ZOjg)c0E*lVkW|5T3q)O+0}KnJZARUW{W+a*60VYga^;=r+1b@{D0!zk zjev=f4Epu^t)o?lulUca{Ee>aCtc1cFseQb%Jr@_e@#oKsMWwrZhSHB=xls{-fg!W z3N*qSTvuZf(IB)>m6dEQeXNTbHx9@6khZd53J9d>MC3N*&p}BDbk#_5S?@f(>|ky> zt3k_sw-5K~_F`)I%D#$OYr5cS-<jg`$Ky^VCwhuR{cI!X1pQWM;6}$bw53kZFFhWx za25oBWwzGQ{Puq~?9A|`e~F6=Dk}r&ZaJ8c`Mt0BjG~S<(+5B~^!D`$OZjscKfvKU zb2S+nnEng1MbFkI2-sSv41&td`Cd*!#FJD+q?7ri<*G4qO+gS2qH%6s5u*sMBK(L7 zP{MmW<l!N(DjM>o=njd4Lkl7#aV1gbR4F-jb9HIh?fm4g&jq>AZOmIBK+KSOh#K~X z9?)*SpmR7k?#xc+#}RZZeRujf4HW{4l(y{T<`Yew>l5KcZ`azqmXonl*j$2we6GMP zZw+vSFyDO9{alrJ#k`L0QQDLSaFzJgD=E3V;;N_chrQdG5XL5gt*sR$+#H(G7Xti; zx7GOrRU8}_FW=OQJF~BW!X^tfb&Kbid?@0xAE-#ia*_+__V;IN#hpLwPkj<((($dW zt<^Nlp76NZ$~{^;+Z$=R+I#o6!FeR`?5|4h;m>a`Aim|#Bp*XOOXpu*0}r8|h&8Bt zc6D@scAKI1asIg`&=#chas~Ap{{_eLhJ}WYHgxuKM$34A>JbG6MP-*<+;F-mB5c}8 zCUR@*OMvxud;Zd=^jfj`b|vtZ*cx5!`EyQ9g@~FX!_^$}<Zn&#K-%H6M`2MqU3EU0 z`pQsnuom)?d%E%c{rTx_E3g!vG-|irD|qF2@0LnQbtSU-MBRSh)d8<q>O4=1RGIv` zl4e)81a)Ci0|vMMZ&TGM%Jf^{OowQkNIwGm9;`Rv$rD4+9XjHU`9Pc)KTb!-Amye6 zbyM4)zrZWn;g88r|6RaG3Fr!zX9#VZzW`2w`4HWqfH+2vdk0FV*kjM1zuwoUe7p_> zxLEjhYewQ4WYhS&dFGxRLoO2!6_y=u0hOK6TOF!&0}*lSlrm>^`REPB>XlW~*5Ct_ zut3m@fDCvQYZ=#cHH}7>Vi=dT-0QlC4A8TzJA?A;<eQf9*Rgt<_8y%)#5Ve%k}B8% zm?h$8qLzN=c`N=?=~;k&34qHH$)nbW<I<7PU01+M%k82a5dk=Bw0$C;BX!ue-qJYj z&AfBFUcBe5XW}|1`7s+MyXP@*Dqa0{Jns%xUm00d<mMh)Dt#SxXgICS(y@eUIr`vs zRaleR+TLF;ihy>|K$zKVLN_AmYg!r;1dG$S2p6#RNnRXWcQo!FQ6v@crPrb-Iq#Z( zdy&1Ip@WrLfU3>51{u3*Q{(8iTVu5Szg~cA3NG?e0Du`H*LJ?=T;E?)6lPuFOOTMu zpbvd2SAYMd6-Lt{fp$WUt?SpXUSU^MRx*qbK#)K$*gxgN543F40H;YhkU6fbU^)aP zlKU)BqDZXSR7<jF!L0!PIMhRgK<gJSAW=_#Zjxsf);9o!2O;)twyUhL@F$3n)Z4eL z8?Ro#w#$ZPO^!rGRn_NH)6>Wlo)rb4KNoOl;Ie9^pG>~?hvp0F(&?(6d;XLG)l`jA z;)s4B{P^dnY@S%9;f@8r44NHmriQS!fkauXSrlaS=(9pK&!YI3EY&R_LbBZfFdCUH zNv;A$R#ZS0ac+6IIjlT4=>44z;|6C(bn~8;=+sjKM+%ajf`Iv71dXGPA8wEA!DacO zmY)@NQe6N0H4Pr1?6-Awto9J(Mb}s-im-jJo(I<LEe)o)6NnJJiWTWe;-E?K|8u@b z0Q#+8f{wzeE6XfPz;_1j&o>~`qM*)NvkLF-tW0T^s*!|SH)}EUBO`x}R4G(-4}}+9 zl_)B#KQhS!mp>`}3LLNF{%qe`wWfM?Z!Ag>B@zQe#LB9uxREdsbfhb6y1MG8SL8H} z_XPlwKj2TbMS4>~)i6r~!6l&a1L4Fy0_SddPZ<X{_7`9A5#UqnhTHa)kAQ^`0MqcP zJ{C8;D-Su^q(KD+n!u_7OXBhPCN+j`h6w`;YARkP8PIX>UuM555#35BLyOymx(CTZ z-A8Y=w6w+zXl42f%4C=T1uLX~D838;DqZtmhkBg@#{^|{QSbw3d1v{btJ?<x;`iIj z$sAF_3BOk=>w_s_LtH+e=0t;sn;S(flWFLtFUK+Z-Aqwj4i*MZajc$$1|J2!BY4m! zV)QN4F@AB^VlWN*TPgGKgl%XkGpb*ZpQw5;&F3z(-5=3t&M3-Y+@m<TBcdM)45f}D zB8N&O1jd*tf)tIwx-J<>Dh!s;03Mm9GVm1w03JSRNI)%e=~vuY|4OIX{V8tGPx~E) z`SM1D9cWBk+zJ5Uglwka2$_wSX4P7-@=i*Y-P-*%ELN!tK2&qyirF?DJ)zX;o|~?; zgWUjvOM$^IqX>=ZRjMRNcDTr#>@K?+utawz!?b))OwTAEp$k5!-Em{(b;)gWx=SWV zJyKFqLO+AhB?wSxkINnHhqX~3<>?=b>C7$z&1gpT9srN86$WrPI5-JXb&+!)H&Q?g z0(M+?kI~}70j#mYK)OGfTSqbAe9>nSG#L9vkZ^Sj4Gm2gJoFmtx)!C%*4>`XmYe*- z|6_X4Gm>BiPL!sgm_G`@&ANs=T+kX@gRzlQYcc+MZn~D~51Z)^twQTN-(-z365FNZ z@1&kb-2|{hSd(FJEUm8ktLu9`b;PF^I$LN4Zw!hrH${iM&x((a(WvukgTR`Zz#=hR zsk1LG@i;hNeCD|<A|@$W8`f={Z=&b1#{rr)o{rw8b`L>)%AL8ns)i=4+7J)C!(-{x zJLc!-Czj``z)cO%fZqX_NP)pR+_G~~5H{->$?uZCA+shHy@T?f{1(-yws<;5w-CHt zoNd-AD`Whq_1*=8%`@l6RjuQ1W7CX>zNoF7$!be=&%4WwJOLka6+eIb{qsdwBj7Wn z#|w)2hYPf6??F{YINZZq(&qrmpeG=0UjzqHyDkcVz6jCe-K|g<j+4rdsTn{<Zg;OH zensJpBpEy*$Cc1%OOcw&ff`M#&;z8Wfv1d`Uu9`T9UNHq8;%(-e&()D4X?r)XsVVg zo%+)nvBK~fL=+XjfRM|tudjau`S$JGh3mtOLGof}s!T<I<rFm69QHnos@lE)(_y$j zSD(N)j(G5broBZbej-T3)S;*fUf5e<bz9%ZU?+}&kjE*nSd^L!+*%`n?<4E3F{^Qr zZkX`x^(;@8%d(*^nFwgt-_WiB>qVdgP}{bk%ZCWup+X1<ZNLUP_WG&c?JcZ%$!wq} z;sUg8@G%w?+{0abz!DdSj~D8;6Si-c^whzLmlc00_vNjW&S4)`P=5@i(xXtJuYO~) zkCf6r<KTF(J~^g+&1hbSNR#yPbscLuYevxL{sYWpl1`r9Hj~RHeI~u-=8e?jX1jxk zH;W#FU#~9OfbXolyxeTOAa;sM3H{Idy5Y~5SG`SNLTy*LR@T%dLdldff2h7Lr`}Wv zDAhp+uqGfdkbhE!`@>LbH)yzJvB2~B*Yfqeg*Za?_vmOR&?ZjjphGFV1VCx(y5sM2 z^SU7<m0OD;Fnsm;b;tUqRFi-W8V?Z(xG<Tr&&NdL;^JWK6ndLu$eF<Jw8LpDp``S6 z${=+6a5$6j^lE3S+D8zG`h8*|aKi=f=$=1+-Uj->4j45cwSlN#uQ$>RgT-TeZ;ut~ z7<58h3Fra3<9b-DX7IAIvM`cpYI<h5xQ`J@5C3y8Ci!PFHGdZ>HdI?Vm-eI(=czjT zX9Bk;qZ{M{+8P>2{QUe3lK<{ha^h(bBWpHW!?3^D8U-5M1zgEEIXSsqb_pAtSU+W^ zpf4n|k;GRpPCTbC2m(zayYr_$3Cw?Az%!f%=H}wPdi9E#lM|npy}-A;oJCn#nez0c zE8_<xT6uN%V6#W^oZmVDC`pRW7dka0B@>*s{D98U-qRzoTb4)s90wV68-1eizIgPi z_3pFxGf8UCTX(#<RwfrSRgw1FYb5<v@>_{Wv7e=_E8un>ZGbIHZFG#;PE#w^f*E>1 z`8?IMOoB$njACD|eROezTP|v;_~)<S@&QS}SAXb={DLl!J1HF3`}37j00;Ku$rG*5 z|Jrc#OfA?4fIJ&j_F;$|jf@A6hK7a%g9b>H02cQC{MivQ%(OZ_xyN#ny}W5)gOTa7 zm!7Gzu_MmK6NQ3mzj0>$oj3VYC*rvgR6%g%XSR%;ogKJC0ld5Y%=ag2z{vyp0woL$ zsrwsUp~<DKk>!~Z?G^fhPF9QL3?zNC;b0}zMW;oD#WODV_C<f$n+f#K&u8Z1f^}E{ zj;#yhtHma;0$-erDjZFJNJ~$Q#2^JXt0;{m3HHGx4Jk?C?ew**9ZU2;K&W#$rWx_R zCu=<06J5E#rAWmmScR>_4Dqnv4bGP3qFGuo@$rbDzaJ);lJV38H?Qsxeqeh7_e84$ zP|(F%j_jY`-svJ#l>VXIQ|0;Qy5GL9`-+*JUChpo8T1<eF4C-g8>JvG-}8&9Rc9F~ zEf|vmD8dNOB*KM26Sc)E-a`o%Qjjgt2M@UbC2o3dZZPP<Hhb{{#MBC4EP6o7D+9MH znOhU7tj?(oM9AUhUP^IY5Wc^=?ZybUpnUcW?*8_`he}3PY&{UwFj%E<rq&h{G$?_7 zU^rY_`J#%-AmX@2*Mk+<Ed|a%qi%X<aPkeip5e&&c=smQu6vSgVd6Eoqe%)_>0}Kq zd&Hc!3*lW|X?ELVwt35GVG&w86U8u96L`Yffq=`vp#dkGuJ{9FaAs!aHgFG&!$IEv zhpq1b$MXH(ezX)aLy<%o5lJZ#4Maw=MY2j}r0iLdl}eJ42w9I^M#&~hisV6*SrG|k z&-c95_y7Li<9NSEzh8x(=YH<{x<2FloacFs9@W#+%Tl$l;72XG7rd<7D=-UhqI*K^ z8^7VUoE?yvVHNwAm6a9tts1i(FNU;+a8N?6WbgR#dCNNNFIcnCW7k`DmzB2no)&q2 zW#D$MiMgq1LVK^J|LxoKw{G2PN>XH)82oVKk&s#q)}aG*hKNpyupjv85JR_m_3Ego zsK-9bOR*V`NTlh}Zp9NP)<GsPHpbJYb$YM3I8m#Azzq=(BB?Ea365t_0WQ*qQV$o9 z0?db6((fwm6hu4%qnFTmC)#(H6)?&W5C@aSBt<eBQEwa%^s!Ec?&brwQH6a(^5eCh zz~?3u)5Ky~oS#;Nm>6_)UufI`E6|G=<TFawxWD=Mkp(OqQbpLlmCnlPNo@$D(oSZ5 z0|VZJ2iZ}TaqeAtCy5PTik;-HUfqxB?1v(IWBBn9mnJAEXu_Mo3<|f|Uqh>wua*}S z`azPYXldE><HwJ!ODi-=Z8hA*_NNzU331@}cMq%K`BYd~I0L2hD|(pi;J@|05AJOs z5gd$sYYGhrGSx_w`8pyipED^HAF|WFJOM2RfwMuw9|n7sV>i|j3m|fjF`G1T{YQDj zw)69^!)4oT+ySoTPZ#WFW#!;pby&>c8_Yp#@QaFysw&U|<`t+JsHv&ZU%I-x^KRdM zbfkS|#<jN{56saVV-no=v5ASVmR7|5Of*O=IDh<^#XGU{uNe=!{a#adhr14@F$Fpj zf3HyI?AcpzivUm86hkc}Dpr2gC|`UAURl{~aQHe77cE3O9s@-;#D>_|SUk60jQ631 zrI`m?4;$3P+L|U=GsvHoy{fi$9qt~<7xXWXkhqZlF~~Xr^1`astEos}vLa6Tg1YhI z%E0yrW!wva78y`O&YwSjG+q06x;Ej7V*O?viLlf8IWlq??iBJ03LBhOhErkA6j!S6 z%@ChB!2Jo2n~w7Uon1%%2aCy-RS;T>4|ch)X2a)~E(}18DrxtWoK9)LXBq2WUSbEW z=DE+ZEFNP3JcSbNIt!iHQssG%UAiQCD>Rhqu*!DaL0ks$!QszjP0ORQlX+%-eut#w zX54$&2C=jrIvr|xIzn$z`p6OPn>TMB=OVkS6ncDp&6KI1w<;(o=)%yhoJ+)g=WX7W zCBQ=JL5wHt&xrgc>orI0b?fTKD^v2A;)e(A`(WBor6P&U5b?lgtcR*>;kOEuI*D$7 zzK@NMS3-A>Sf)3e=Z+^WBt!!`N|fZ~M1$0F>+{Fll)YOB5bF5xRq#@1nbNsWI!!VB zP{;buZf;07YbT5E#p;56`}Pr*LW9G@Nyg>guD$;3QQCwRM<TxnK8DZ2I5pw8fC7>r zn_!1E&CGNb+4nzdl&y}DuraZ<CCph$=6}7kM1aeB6&oIY19iBu5(lWO)hHBvEx2aT zG5=M^DaOlswbbif_0*XZ|I1v`F0vMhe*C+qay7w$z>={1QY<0m^6M5r&#H<F65i4G z_U+aOb}RNEWWD>!eA|wA-+~^h9~`9TPQz>%Dj;HsnN*NAZ`mT_@&&s|0c#4*DSn79 z1j__4tHG_ZOlU=54z-bohv)e5W0Y$?SU&pt`u7i=kTBA4c0SP1&>$51JuNY819UIB zPoD~D?fK^o;FQrCzCj3({B!q7A$SXn13oUcyhm*Cv@Xj}Px-JyKHv`J+jpO{nIr^v zSWWGPcAS}6S<n{+>z#8`u$f%lDD^`n+lo*<V~ZcdQo`niM;vBt1Ve;w<3^CbnK(H! z9@wS{x}DZobyO!uTj&)izNVIzfe3MU^t|HY_h30hJRT|Ci*Nky#T|CLPRtjucagQ7 zz8qfJw~w&PExSq%O-xRHK;|&88wQhzkR786BIvxHQ=cvpP`B=ou1MNpmtSY2qN6tq zb7N9R8?rYtg(K)OhbcjHsj50|8j}PfDT(p6$YP$nXk<0iK6Wze(zR*!?Ae3+y`e6h z%~CgXM)1YofS0d$f5l^liHUL>elZnoZS1(4t}p_GJsHiFD}OjByTX+2K71I`-mX70 zGn1ATO*(9-#e-Xc=W<s$Ss%R<o&;%OUvOo2H#cFm)lpzW#6>=p2gD9J&NVef$d9#c z^h6`gM>+~1aVKar7Vl!#($a>A59jWRsCO({3GiW4Vt-dz%WJ60iH8rO06`Y)avR_R zZz%zgzgfVEmH4o6liraP13K&TDE<)2?uLb3+f%;4jOK8VlEF^&V;HA9yRQ6n3+eLT z&#AFvdaPHDFu*Z2HEsIvp^}goLqyOrCq@7FCtd%$2KmpW9_;ujm_h7;lLj?rrzY=X z4>f^=C%vC|ro7|<$#*LkuEFvl+ekVSLjg1@6&S#XL7=cOY`lCN`<Z?B%5^3x|0Dmk z)I`O^@JdN>5I-BW*IW#wEPX@69ejKWKbwd}8kiPm2Dc{S4?#m+rP7H>Nnu!pm%bFE z++By1CF%D2NqfTIcb2Ip%zDy3?7|cdW@%$z->{tOJSMNbk;o0GavgrQ?^TUEyajZh z6L+@B)ckXGBn=J@K1N_dv2qlHjNuY5BG9C1pt_)kXlotJlCYZcpsBZRYHn`M#RLhG z*p0AR@eK)~MLo60`LB!O#6d4FFT~oOSM0`q*RCCVl>dgf(-M}mv$NnI(ZRof*bjg$ z6Cg*l{Ft)QAm5TINS@a@P+oqc=H<(Ky=Qu<XXfUJT#w}wkdw0qD@efEa^-QT5kEmh z5bPSHwO&{+xFWQoQ)w#q@j(=9vz}MwXJpd2F)=f4PQ)aXGIGe=M1g<>AH>DRq>=Oo z-}3~8P`}W23-MwMvNI&q=1x;nE4heCM^!YkA0%wzrQN4~ZlI;59UN?VuleThOA{7m z$VPJM+KDKl2!T~Q4?dzhDycfmh;vcl4F32**loazz%MQ??%%_aumaKf)2B~_j<F-( z>INJfTkE@j{C&~iC}sP;z6mEfrknI!!I)zP!lObX{2n$BthF-Fm2yChS4&t_egCd& zV}IoD9<f0B*;C?q$hKW9>kj{S;{{l|m=OL&Fe(w-yZ2fFa2`0m@WKXj2chr<D-!r* zZ|QW`jfe<Vbb2*^i=DKSHh36d9Qvc4?!&mBa6HL3I6?%`mhJE>>cb17=#*Kvk)!6I zNl>7?g@wh<!9mMds2>;SCU0PjgB2AD1Iho^ZA>OUL{D<$x#NHhh_ntTBde@SQ#E)# zrKp|=pT~U5537hFkUTGwG={}<hN#-}oQ8E_b$47(j~&G1Ygt($kl%>>w*u~EXN%t4 z$az!o&bD5psy2htl^a+ZiHL_)LAOPGO>uFt8DVPqEw`|+7G{%q9@CdTmw9m#!hWK@ zQHc}{;^H9gpGNpc^fCHp&h)~@^10W1q3+OmVy_Jq2&l(x-?xtiQP2<NcstxQHCC!8 zGz{DSRZr#Ki#@%)*AQUy<W?*?tTmBJOwG)$V_1P=qxHG$$}T$hw!Z#4iV^rT*3kP0 z2JU~7l(bqvKp+;W1^}8r5Epza*LB<s#f|#UvA~#2I2R(m1ahszHBu7r5&H4J=KwN8 zhgV|3kO+!0P!0)*D7FhbmC70k<MWp<m*Hti)HR4F-@kt+_#7*pfrf|_sxI*5w}&a= z7ZjMj_wR4Yt0vzQ>S{Kor>74L3c7YylwDe$NKV!t+S(LRA0mku^%w6{w!3AI{7qh4 zWZ!+l+FFRPH^jyZ;iAXIHDOVX!Qd28v8)0`8R`Gl6VdGnVGmHsqLf%o`WxVBNk`HC z08FML5u2NUPxk66ATia{tReaRAUQfZLO5~b?p?;%BR=OO_YhZeb2~zT0Lb@#8(1Ev zrcQsJbRa?s#n8>ot*Nc;BJZ`pv@l|2{#)K9Qyn%i{oA&Verq6{M6w!smHVJNBA74N zZ``0reHPihn{n&bTO}oj5%_g$)@SIRORR2apu-hWlVBG|&X!vV=V2&fRvisxH?vq- z5?NSXn^6xC55?*X;tCTNS1943i$1~?l<~ceUzLCf82@ZaTZc>yzW%CoZ3ENjPtPvy z*tv5J01fMp>(lQSZFD_gfZKUI%27$;!o9Pi0jm5rz|ch@bXZ1aFZ_rK-0}8)?%GZ$ zgTH?Lsy)1*eex#QV~(97FW9bOwCw3w(xmIAwKGERMEDg^FHv%_%2GpprvM5NZf*wj z4+RI5FQHpF?vd;xi}yug&gh*I`x~`sS}zK{EkyJ|;lV*6EcI|Fp_E*Ku>iShh!F0u zg_phr?@+vb)YzCCDxDkHg3zTL%#%wRAP^zaQ7~(ScYl0#Q9Z#Hg@5$ow|C!!Bj5IZ z|GrL3OAE<*_u1!+Kzo$b)dMhh1?sRp{EY(`v`WdEbXz4EL1!b8P=x@gOc2HYwRd*z zz(Ynvp-3G;nr=CB?j@e?@lR)-StLAuOhVj5ZHXcj+#;5t(-Ci8zxLHk_tQ+TN!LpC z^OL_YKzCS$jnHGIYgc{xbjB`UQDGk4OAiRsaGks_@?r!LEw`vh5tSl_dk~NNJBmls z;S!0u3RS79ni@8)=A}MD!#$LW7})CiMSR8YZn70BA;P@)JrINzc~te($ey)$XECQC zZK64VQyR1M?&iB>trz4wQG9PBTvUJ9jgOBzT)w<Zs}^-oWo6~@*@Xqq0;W)GXjK2l zoSh5rO5*m^p<5y{eyEu$d|5Gz$Yqm9`3uuXQ#(5&)0cR9xp{f$W3t6!dhr=H?=@Qk z@)q$=dSjI%&*Yh{1>avnYT#ZSxz+9TqN;GG9;NYRi5+Xi1_lN_l~#c08jDV#v=cqm zw!<?ohI?NBg&oN3L^p^;)(;C6MR#|px#>~NHW@ybxM}@tQj#|;w52-jO!EYrvA{7o z^+bMA5jE*&M}bOvA%Lx0TMudW7gBHJSQ8|_YR8Tpq{e%+t*xyQg%9uEB^~t|@rU_c z`lFDca=y1jHM4iGhMkYX!0rfTB0i$0MO@g-$w|w#7%}2;j#bU*TYtY+65;fjc8M}! zzv^F~lh%b=7)GDRflv_r6X6yHb7;a>6P3g(`a41iLk^;cBGeV229?OxlMuOME%o@G zaYSBjuCKO`KWvP#ukZ`Te)?HILX`_yw{E2q7S0g56BHaQ^h_<n;q)VwH|aO)wJ3-7 zKvs<E6i@9M(1VU*M&i=Q-FBXyhe_){ihvf~_MB({ttJ229VWUfB1fSKAS61n%L`X* zyGpkF4Z8%A%jfK>eH-1wS`yg)5j1bpq!Q{vIrT>7(6nWE-6FGiLR&((Ra-R18I4Gh zRU~*5OV$SKjHlJ7d2eG)AB=t1&_Gywp@&CIhZsXqi9@?^)a}ffGdzG3+j5KpkXC@A zU`0s2BGMVl%7!MAh9S{<;p0Dr65jFy?{4F=t!!*;gl;xCIJk!Xjxw4}Uf<u{4SKi{ z*HM8Zs^?rT<vd_ZB7yivle7)P&l6l<b#--7*W;cXLy;A|E7-akb0sPg$Yacf>3z<Q zj;qGh#d(B;l%X38U#+gLPSS~gCeMp7<%{|P0XOWy1Af&*+Mmh>VB0Ka(Xg3d6rz3F zyEm`iNr0$o$4&p1w}C@4z@~`WPgt0i(ArRQdqM-VZaWW8LhY6Ed(Mcyynx7n4y|9m z{<KGiED|)jccQex8~Klr4^HY_xU=;T?@ukKOm$EPDxOWQLU)ObXJTfyN<bjhv3qGx z)`X=m`F?Cldg7e0jSI>e#08=>_HzX0?x!updQT8;Y}ZOlWfBt;{jSh#+~^+}8JWv1 zxE!kkr<O2$OcDVFcHEcyHX^*`+0gvGPVE7su32eG$@Q1-FZ`aEXc=@NJY_>y|7$^8 zOiIS8X!Tz>^1;^l4zVPl@TdlFF3)B39Eyj-oEwm9H)0#%<|+<eJ%_>2IiE$R0{K;A zjSEX&a}(E)Bv8r$HzAxn9zWhrYGm65{U=-N89W{UF*l>5x8Mo+6(iUR-Fnm2buQ{= zx;P)Z;W`ov3ybM^|2-j_wx%XV&V!fyN=r*S#sMvEs>c>IM}V(7G>i51_AM=zh)&$I z`i0p)Vc5n&^4F0-3w8z6cj}2-P^S5c(%-+Fm|fk-7ALxA3kxf&e?>)wcqg%GFW(cK z<zT?N)1s!|dKBy0pP?0ZAo<auE9>Gte{VpcNwltLg3U0K#ms?(6lr2^zPjhk#eDt{ z_O^BY$FBid+958kd4G!Y2FlcY+fPp$`Y6%S(SsjT85F6pswGG$%hr%k<9!V=81DU# z3-EtqnsqJ#C}tTJ_2K5aF3jvb=l+8az~GTKv(hI<h;{5;mfZUR^Mq_{dw?G!t1-w^ zSdcV{-ZN-T&!^Y^aM)r>B=Y~>f1RKF#x4Zj%RLoTI|T%GV9EWfc8OuTv!z-LmN^O< zrfu5@U;wRf$|+_U0?*r|a_G<@iosZPi`}QEYXPEEanK3j)3g^m3A3A_3A8@`UmQ7M z4p|9d!$L@<5Ua5Ys9^?rcBig9kSGH0heb4DrPkiw?%2lD#7{Atz)lr>c51bbx~=VQ zIyyQu=t4U!2@klD4vB_G(t4;P@m%OHzeBVq7d^Ki5`7Ksz&PCeOkt5gG&jJ@2=IRM z=FNfs>fuLyF@OCb<ykF1B(5bY%JDu0qM`&u^)IvmQbqv5s|ThX`)})V6acXy@B+l9 zsC^gdWtV2miBEy6tboP|k^1k?6TZX5e=&XlWK9qjA%CyQ$SDh+?($$jtid#y@ozhw z=zixfR>EtodCqfO0TbAM)ccBP5XPrE?ad)tLhO8eqOQB#Cw>RV%FDm`?{Z?EApMvE zlLs=Z@b-boc)f5=MQbY?0L+MO?5NBR9y}-*Q7;vIpZIr5o<s{l#Lw^p;Jy+v9~3x5 z?@RDpVarD-OjSQ&>kyOHnW2mvBBU}UuFyW1ssC+qc@mLN|Mdsui&LCvDX58jTI{4E z_y_)pNpKJ(;eD=wbCy@N@{h?{|K6EtQH?jO0uVGY8$`nk3(+PpXm>-(jY7N%4{98( zJPB1#4LU$VT<qAg(h(Q@cb5`1V-DKWgKK&AxdRo<{f@!elu#maaZTPijRHzDeG`1- zc@>n2f2Mu#KgV9OZ&{h_!omV^Zb0vNe_d6Y-#yerDeCdJjb1tjF`~1@efjd=b4#N^ zEd$I$#3f!cT^`LiAuL0#E4aO5r3E5${`Y}&`hc^w<Aj12NzB^t$JNl*_Jey%FZyby z%`1Au|MjY?aDnK+k?eIIAlmKPcG%Sy7qbH)n?7*|uXV|J@#qtc=dhBc|L66$BTHZl zLo3SVXD1~kh54!Qv(5WRgkLUvs|g<@I4w37(?tLe0eKxQ4wEz;FRxJY!pS29Oq+J{ zv`_?*x<!r4ZeiR3j5?T0^F}HrOmOC^Y;I;A=`3QG-bzk@RZcHBvLs)R>0dmE0L1wV z09UV}V?fMajWzE&F~~$B5EN1zACIk_9WnkuaO`=}QHEtCE-vmc{mUp}DMeLLk^01m z69Dw6-6sYs4?d8n8StFtn15yf$N^u)MIJLV<AobU&#zzfe}Ou{oM{n3p`ouZ`}+X% zT+CoryS65jUl};{{P}Yd2}*3=U0Nv>?d_Yvz(>VMOf^syVh#25^q|fT2KZKi2Ip@{ zs?nKZWeeCJ<uqyg=iw6Ppuiddjo(&~#!t5VD|PXffm}2iNxvt4XhDUy8sKz$ferhw zu2NxVrO*coqg}Z!4i$vmtBQ(BUUh<jCPobaISb_FP^l58Zvea{rgJv|f1Gf-aQ?gr zU?rt{Z|=JF9v4yUa=?gzo=~R}>kO+R0foL<fOgK<A!C`)@iRu^pB}`-(Ae16piCt8 z08&1Ing9#;qo0STEHRJ4*We(rh9oH|NsQv5q4!5Kg?59q9fM<xMVN1^t<==4gclUk zjuS_PBFvz{1t@Uh)G2y`&7ZC<)RJ-17Fkb~myyZp)0=PsDiYubw_j4k{z!BWK?oXA zL0ZLB9F^2q{p+wO+lv8AasgE(iVXP&#f4lt*vN5;cer<qVs3lLg?=8wygM*%4vE}T zU0F$m%>(!`vYkhhs~7_cV3R;~g+*KtR8a?^EM@`=y@E5G-}Gmi#^$CRZYk$MQYo9r zkYL|j2I7Uw?>}Kqv*McSu}3u>#pxI3gd5%wAR`sJyga!~_L<l=RV`QD$hIx<f01c8 zH=nhWi9)l1YKi9C-z<9r7zI-OYTvuN14BZp^Q}JCXO;7J3I&IL(Uq6)s9b^Qtg*AK z8j*tuJC&bZrJNtTTvuNM9(qp3J&;Q`oS-t;bj!|o|K1>au8a-{GN?g`7v4Sq20M8a z%nx*wx!~YT41HoTrJ{0m`Yd^>Hz@%(V#naKM#km-JGlh~uW;Kr6a>cp^js;k;OKu= zocMm`UZ=27|BoL*X=#E5BbcRQe-N#jnOP!$`<Pk)yo~`wDzI+BLutMZ%`I^(jYUez zjM=Q?Ee_eUKkvpoNlfIG_xZDNRdrQUj*pLRcbSoEXLt-hMrw+Rim}ojY{$yV#vGjd zvqd8dJhlbg+4c&?3a?*yb0H|A!(x(tBK2yZWNLrPMJF|>pYhZBL<cgo$8IN!WLX#y zESQLs6@Y<_54Gn>mY7pZN6A0Q$Ov(}^1Y|&HrLFbRuMX%AAFd01#+<k?L<_-IS6&} zMVET<-Kc{X=~*^Nh*{4#Z0*WhopYNjB#1=-6ND2#?+($$|LLG;$5AxX^P3mZe;|U$ zWO&%BQJfd$<tG;Y25RdksPPH3iI0|TyYr%Zev1Q@KH132W3s9jyUZ%}6mfImLivh5 zXs8{(o7&jWYO%0vh0WW9UE;^zmWC=aGBw%8cklugP<dcSW5W&4#OBC^PM&#$2?8l< zzm;b4H|$7y((|i7?&Yc_oF<U~rOOj%kJS9_EHrjp#SrfKix-tDLa)TRx!;$cYrJaN zMt`!~D}esQ35VRGI!tzni+GLCKi+C+U-`O%bj0h=MyY(DxJseH^1PM!ce^LXDj<%% z8xtestW<EbakisPKaPR`g-^d4<&>$tJ%fkGyrUvlnrf^h6K)G}(8lRYs4P+MBDR-w z<dJvEy|E*YzU@poY3n;Th=&w76fX&IhU;%e4sAgE-s|@J{4H)74&l|SYUl%mOqx<Q z7Gj-TI$KWUN`x+{zVF{}{(KwBGyh9^^A^B6r;=EK3-g0Qe-Il0m=~M$)~x<3Wxw{{ zyy!$=eu$}v`WU)EA;?BTXTf{_vV+5E>DvD(uVsiz{5%E2pSN3W&Y#z|csMlwyU>c6 zlSIUBQfszR2m+o=T{H_*Sm9;D;2#wlY2SxG(ZH>|7ka7BZ<X>Z1o19FPN)5a%buSX z8!8Y`#X!d+f^ELfvNtg?e>z%LUBh2^G<Wka)=d?T6P6{o;rd0F9)SwL8vn;BhetMJ z_|K}^$wLQt6KjKM#RzyiEauiNI{0r;2`?<jkD5q53cD8C?M;hLcF=if&6iV;axvAu zT+AeT{tV2eZO4kUM7rV+GAJl0;A#rK!h%A7tdbg0F!eI;vCE^|%3$X5$J5K-Lr`ot z-8?-P`J3gdBq?<}OB)m4Z{FU4w{H`!rMg3z4CMJ(y+zfx^E7m{au&L}S#_E3x^3*5 zcFM|TARYf(=h|@m3nq9d(FOUEi75xX=S9|awjUkpzwzYjdDE9Ib<{U-QEum-1b(0# z={<Jrb&12VDCroEc+~B&^Zg8-Q{#0U5s?GmOsD2Y&2MT459XA!749)EpefW!t@=P= z4fdF}-qle&?soosmWx=Uqhpncu<&lf!c5)Hbd?Uz_r#AbDu%je`yDr0SQ>hGb0Ra_ zI&0Nl%0N4!faBltLxLIjUp4T-o{=BBhK|Q_mM^kta&xN|KC4bI_0YIF{9w$<dh{Ie zcW{>YHz^N(c_xse8XE|}JWnpcfEm5hE*61Am&Q1bh~)!3R43oO38Z1D3*C3o&ttGQ zdf(We-^UT~m-g@_KS;uIxqiLgR_jq}Ay6Do!3Z-<G@d(;#Iz2vs;I^N;fsGo&KXTi zB$2x9I(0|%>*p7BD9&<icjG8JSvuQO=C*P&G3nf1DW?-p^uf~dy7zFagX@UI2Q!2~ zBc+|TGYePf^7FMjk2EzibILBCRT6ZlPx5JS9Tr)D6UOUz?^vZbH9rN~i~}cF_obeq z%xu<C%<6227W>t%(SGT3-VWJ`i8Z8#yUGQemOCUa^vUO6qR?P!ZWf?v-r@bed}MHa z&!_ckn^oo9bcG|73v%Y3$krjWN0_g41ZiQ!F$%S}IsDn)Jq%%!8zST+Yk&Q+=6cMx z#pP!p{s?0X(9msjEZ+|W7mi9_Rf<yS`amgYIQ*O3@0e{Ikdz^e=-)Fq6zo=3c40{K z^Gj;1=K3#sdbY4PK|PR*ZS%qGaYr70-*3}O*Kh27rr-RqMdP|L+v22VI!s=s)$G+q zH;|N+PqEcU#0LMIAL;aW?8aa?W#l8AZzc|q`&A;fM#2ZaZMdKkDeR^mc`Ku2-l)LY z&w4QeZ%c`JkgD+K`{sl0`!zXcl;|H{ivJT~q^`5Lq%7;A68YgtC^_y8*<AV5qz+{= zNAtIV&?rX^O*{oNmivF_fh|h0r_}2nQ>~T{?KQC$BAJX;T#I<{>}MxCsYPmU#tv*U zEM%H1Zv^-Rs-1_l6Z*+d)VjSxusbG3KT^|v{=&34*>>TCJQR<sNR}mHm+UORkXd)T zPZFn4i5k#pOJka{G2~onQ?ZV4=$&x~r?sT#J~KS`?uCb4S#(eSmT^UWCtiDebWW!` z{{8EtCi+nwmH}Hd(+w`#U`b*(rm5M7-;X_;5*s`pz)f>OSXhsh(!oR?P?%^lPFhaW zpm2QJZ&^WF@SeL`(3x$YzleP=yHHZnQm8lJE~Nfu;F5xnO?9rFp(n@YK<rP^@YA@X zJXmPsRwmo=9I|vv5K<`F$y+q73Q|A!KZ`-fDE=1{<Ot#fw?aWnOT+xM)7La9SD{3X zg0aJI{E&c5XURI)IaMPKs++zP`*%i16My@ylTm+FYzlWr0qNLIQSlZedf_8Ka|e2k z6^IAi;acr0{!yG#0Ongi8m+|Iqa7}PzN?kAC#w|P-ePGL^elj(I{(T=$>QR~fxA3S zBP|=^6;JdHz6rO!kl~@eb$R4q!slP*1NGbsF1%S2Q}^Di)mhaycAKl}b)bq*oo3g4 z72O99E)0c0JwZBZr>$_|&ksDk9lH*l8TqXJXF<{DPbmKpWzx|$Q6q<EObwrm!v{*N zuO5A~hcY_yC3>H~W6arqOXzLVNlsk3-_ztfYabUHhY$O7C&&dZ&DqSjx%D=`39p)* zKTI3_=Zu=Xyc+AjELej?oX}ld&~DmNycoc+nuMLY=^oonm=*nb9eHXK?uNlgHx^Ew zprF!-+Ni>@V~Fn5`@+Ka+8GqpBAqLQUdtcttqy3)sZCqMN_*u>CM|6>LY0GS9lgAN zKtI;$iPELw4$d}8slfNr`Rvo#Ul%og&oobO98*udeCN^^2dN#a5#rh>Mv7Q#jn7F_ z)VBZn{IW>Z$X;41aj;b+^W&I^8_6;$r(5ush~1F^9j;-%crQw6T)kG;q}DxtJN>AK z)#g*SJXFcd)8)&R_#?ieCwxxlh0DeFo8GrIv~1c(&U+B_cQ0xGx0f)AK*YpKdH3fW z<zXCoF*&uh$<I2WiJpzk+P>X6Hy74PyYxx-&%8V)A!XVLg8_1vfs@;xch+@@cFaM3 zAsPpcOOzfAm3FQf<B{t*aD|_!9-QqvZ+^?rHSO=_nw2OO&?a+etU3JfRLWals?E0M zs}=Ryl-Yk}r9B!t9qLTBG7A0HMSfH8M0p)67Nz>?)q6j^r?*#&JIfzr@MSptu+C!H zemiq=sSLKDzl6B>v!{3O$KFbxnxbT@=wwgKlJ7B7KImt|=q_>S9}^(oq9Krp<g4|q zLG7GlmknhJBv6W)N%He|u|ar#cL%=pe(oOTn;8CLcwawIIm0r~fR$p{t;ro<OtXPR zWcWN!ijZqVT<Dk1!rqpy(&v}It3JZQ-}~{+N&VGHQXyyBBq(#z<VjcWd5=fe$*tcK zhBmBUfAr{4-*(gWLxzV@nlh|x$h0?qCMNvkdDA0`=4_t*nzO9QHH9xN=Ycdn27HvJ z3l${KZCipGGIwWw%B8~MCCAbvO;kOsIFiJzeZ@R-S|=hhD~syzLpehU|C{Z@e2nP` z3+o^MJUcFwthi*^AJ^n3<d!G8o38)Fo!X-+DuV@<2@%D@iBd(s<JL|r+>&<Q)S4$K z)BIR8TR^Q-%(jzF1I_K+%+a_=M6F$kRn?ReA1n<bt#_XN@%5xm$istcfnlttr)QI< zJLVOFfzQ%P1H>fZ2H1b&(_eG1v6}E2$O1Qs0H?M7Ow_}E+$71UnBb+P6Fj>PZBb#{ zeOg+#AS%WB@|jnq9{NRATG0ozKN{krrngo;A8q0>z1BhATxb`9yeuXsq@d~ew8>3H zn>+2-+Rk*XJp4ex*JBpC4;(@>*mzrOWi+_R@AdIY2I()KT7A$?demyyvGe}C_q;R8 zGC!miiAyhcaU!oEU$L>h&`tj}IdPbFvtH`PmzVoVB%^h7r{`UqhBZU|gkM;kdOtZF zkv&fwGdJ|NuHwyde0WGpNsz8Ek154=i>>*NtNLn%&*TO)KR!=u-AypXt32Djz3Y|5 z88iqcL?j&)H}O4PKGKp-w7k)$PI0`N?U)&_noa_!ip&?|>onX-5DBWmv$>A;#K69> z>hoEpP3@;1kq@wYE^8#^Vv!M%2{D({@lt@C7@UsuP$gsF_|9+WRAiEJ%+=i7G_k#7 zg-JX3J3kR`TGeQJQ=5i_R?RE!BO?Xm>_9O3`c!42x7APIV1QyhJNvli(T~F?!@G?Y z$XDLQM90u1G2pI<KKp(x#VNg>k53@!UznB&psNf?9?Gx>nGuLC<^U+(iOILA2ZlO8 z%1I>gXjQ@R@bDyEMP+3gVo-_cINIwMXR~#E-nf$uT@=Qxn9Kk7h?a?w@pQkdkhC7E z_CtTSz_IjS0oIs(^xm)lL=kNlK`}n}f-JjVcoR(m7dmyQ>#gS%o3<0%Q_EwTSLpEB z_5%n4SY(m~E_-TkZN3&KcQdWjYYsP}EF_p&Dh<naJR$Ysi%II)xxSZaf(bWH>UdWV z#M_jdws|A3V4NL!Gy;T$1H3zS?8Q*!>aWjR2yupifk9T`EM7(Q(cz%9F^AqbQk)v) zsYmC5H4#H4lv<gDld629R!8>iiIwr(oI3Su?O0>URLopWn_l4b+`EUY59a6I?s;oh z#B)l``CC0J0Q)}U<vDg3RE0D(oj&`*Q6b;8K~*hp@u5A5^ssFHRD1TD$tOQXb9gB) zEQ}sKqAbmq;31^{O2@)SytF7V&k+VJg)y<1goHovOAsGT&CPFs&quV8uU@UiAQtK- zV&DRPFhDB;%5K5$7!TaQvj;3!1?DbT^i`W~@eONy$p2N}_i?8;?kilo2oeRLO-zd= zf>X&?_;?dz!V&e8+mGQfMhpP813_os?%lhslb3)I5a1|52?CQWD?dSvfZ}k_s{8b> zjYdXBdDTq*LvlZWTNBP$fPpJOumS-N(<Vk)*OcVs%KCa5Txw+?(+*Hv_j(`;VYUea zJus1PXbb5)ysk9Kvkw(ACZWd-@wqUyhKeCO-wUqrBwtMVF=r;u_ar7+f2pV>-;Skc zDj*48s$M4<;rj57(1Yj*e?%D~$05(MNN*)o<iEJWWA%v{<u}T3q26$H*-8wo#s)v^ zARWb19|NB$>fuB4?+wv7u*N-kImgl2`R3DH#__#-omj;q?%j=A&+am9;6tzXjWCvj z<(uHbOMsQGzrSw4tr5HUerrRV4Cf=EGoB9{XXg^K<0#~E9_4dIpeEytOCnY-Iqxbh z|5_MKc$$J3`m$ME$1X!iR;?dWt$>6C(}E7~t}A?r9Zm!9xd4LnfDT>Nt)?x(#l;2Q zRRY*LKsOb$_>QVC$vpargKFbm(i58}t&1Fbp3n`IEiZXMonit`vg^!PLhDerFwkAX zQw#P}YXHJy9;6Al<kkUMZM}<zppnc?{J23Jf(4C{PGJs5HbDvPErzqDn7Fu*mW!Q< zfY#)ioBl*p!7j5eb*qkk<2RRnRXkxQ9yVa&4Ua0(797Vcv!z}vdVASijOytyrJdjb z9s{y{lY#rT)yEW5+*ORM<f0ut--qN7cjn;q+azrvi8+tjzf|=`$_8UfA-T^ZZpMcB z4*!6%d`BeMhwmO9+_CE<&L@QC;A7AK2k<n=FywsWmojUx1Cy;oP{_Qh4dq01Az>7z zXLnAnU7&Zft;Cuy?~1FNnv{MrW;{9lwO{!?Ypn8-ps%IN0iX_4)zwiWnSmDZafo}% zBn7+$(&L7Q9AIPOp|!euko|}uFtmz>7v_&FFFfnGOls-MPntVcRAX4~eeT>Of7sED zS{fQmq#o=`Ec6PD7sNm&Bb*p9xTyoBXS<_c3nTW_VXwJOB!b7a^@#UYSy@>EaRQV$ z29W2Nv9a-2!Sw8OsXm)#Cea9GCN#L1@~b{PpcZvqu%xENw174KKwr-7j>CGqLc{+{ z#o{sLo3yy|mJyR5)q};R1TX5r9|h0>tRto+F2BC-7;e6>RmOYON$K#taNfl-$DHA~ z9oLq;l^QSf90*BW9-}f?a}^)$wy~8BZ0u*h^@={DgKlG}$z;y4+_|>xCHwvuy<Wa= zJ~_9(A^r%rMwo^^_ls>1nJ`K>80fTdD`#|iw{(YuYc3K|8HMW1ezDvti7ho(Ck8d% zkDO(Yu<t5qUc`_>J?=2oSmwSNoV-WK7-8y*b7a?-7O%fYZejc-qN7Pgg4!wwq$o3- z#ehlJ?LdvND4Y};@9`uXlS07qVZhqJnZV(?HLqTof{NqBW~_!gQ!J@xcL-W8XzBoq z1wXsk*oRFdxO?{|=}hGU+fU43%ic&%<^wI60JZ420et2vtpRrj2T@j$buyaXmIyGj z6jofSdcJOaxqVI<vj#5de8oEYk-eVnjGkk0)K5i?Y6TMFD`8d%;wYdZE;zdIIj0e* zhDLuOP6>qWpzm9lxr6QUu89LViwxpUuV&VoXRfEKmfqLxe<z;37U1RU*RT0Md^)Yi zt*is9-?Wi%=X5sCtQ>^VcSVB3(V*WG#*I1;wA6I4Q}$l^EJ=745^7VdMA{27qdTpI zYT}OX#$h5rGBTdVLbu|3@uQ_0X7<G3pE%bO7-pMup!OXCsshCVhZXt%KRoMk4&-h+ zf*^=-c5B<lG$C2L8e^^kx9ko=enOZ>Ua%Ate;=oS{zD9>ov3czw~ni`C}&zL5`aJN zDB=|8@ns>Q1mAr3{B&I(R=#;Ho%7CvOh{O8#*uWH+Ff;h^<J0THsMB%Ifc>FKd<GO zw^lEH`7}27nt|}%#D7RrJFL$x*s*|F`UC=s;o%VQHFq04-@FvEigSefdFeZmTp7^~ zJn`!)-@V&NaPr|q$nkBqbuvJcGB!i-%af*b=0AS?=)X2Ph@1gpEGRF`(sV+^u#7l8 zT<CL-fqW5&FB~F?Dt%1zU6`k3I2gY<-=eao)X$~MjT)i`aCg(H*Qd)yi(jC@+?EM` zv7qjldVul-D#w^T-0J1z<S<Y%eTX?pUfyMYEpza(K%`E$)8b09`V#R<@6n7(-B`)E zwo`U(ZC|LWtlRIMvNJuax5~J00_gL~2PTI-*H$ZpC~}^9Bpd4V@Idd8<yi*QAW+yE zw^(j-CNE>wC5Gj>|6^EB&o8b)bDkx`-)fbD!@ZKvJ*Yo-8wUdUHbcIQl6J|q93Kp9 z6~}y0!~l>h6bLt>3LY}`%wJCWslVqWl48ZQc}?b*TM{;{CKy=*uolL=aaGSJj<v|# zm=+QY*YI$bPfCjaaRIcV8DfrpVtB%8x0-}4Mq1I@?AgAZgo#(x*i3x~wJ#z6B@q-z zVqi7rdy#gv?)lNKQrG3hX+mV&D<{cBF%~g6{E+%N)CdGYj2LKP)>qxu78$grISORe zlqL>I2e9~f9r|lGf~*SN@1r0;{`Z){f#C~L0QFd=)?o<1!D+)qGS$O4Ien4cH}{B$ zh}sNi>Jtn*Fg_tulIG5REEW#Qks6OwUDdKPj{II{H>epk#Dld^=DQ8~o*G>4X5?3q z=(b5RK5Wgb%rkn~^mBCQAmHU!^dZ)7{-OOJ-}BF0Xl#TkH1C1P<d{=~`;7Y@-+%zc z<UIl{2W}JdtP>Y85+^KKbpx_q<)?pqMW1>~?V%Kxf_g~LizY5?izo@32kkso5kqoT zs;YG0tE0}zJO73mXm>gvs5G~*x88bg&$8qs!TgDk>VbuNGc<JL6U|+O=_-b{HZ8Iw z0vyMOhyU1MYu3Xt{#X=u7%XJ#>RG*uk*FqE(%y^i$SK5Oo!G;b7?<9{h|XlJr&8zr zr=`PJC4Nrq#^Bt>&MHaNu0ZGMS)*FTjq1?0imj?dHHheV6U=k4Jx&kX={d*Gp=GIU zNzWBKm=nIarsT+w99>5u#xp4SCWhM>mS-D%2+kaFlw;znD?lUayyrI}&=Wmgd?Y)+ zT9j|E=Ue@&cw9)FCmbAdJEnfO+6&nmX6R;(!D<$KB@H`|zg0)lWf|5ib{!4RMiw8Z z4)3@tp|@`BE_&DT8+91$7l`pAQ@rQ(>29wgjk2Ee5+)?grRgJ{FRWNR7Zz7^Pl}4P zCta*(w#j-1;=EMan|2$=%4h6N&RYsPE2-TBsjI?_d()=Rbr_K}L3O9ms=7i;=7>N_ zCTxFcyXP54i-QkNsH^Vlc78S6a6}9`5b&5yO?J5cNq-XKotAAo{vA(4ucO!a%sk&T zG=5|+6OqM)!o%cKJ9Ru!Ft?X^Nh2Q-gL$xXO)Gq<T)#!=5!SyrWt44C$=LCTN#-zT zly9aewFp{VL4i~04@QGBYt{!j2L6D>^rRDj#qVTWyH+Cj{p`)-ykRRM4{<USfo1_a z&r<WHXJ@=|cAlweV_z*IVpA~EQM}IPnK$$VaC^Qw(!rXNk|MTmpB!p(N>>!SA=)SZ z5Qc{!z0Fx<6jF+=5Nv=h9I&@_?i>5UCeDyH^343xgm9&uQKR2)cFA~{6$enGyTj-B zka=bwxKtu2hUBIq-b&`X2(WCJtf=p~@Z9wWGw~Xz5eP$Vrw&;H8f!`0J!3+ZxsLAm zU1KGRKWE<da>lK)j_YY<^?kkOr-QiYtq8>+bCA5qCk>3Zp;0C^%HB^&O(nDegbaj4 zf{L3sgcp9xgB;}%Rqy4O=+ex<+<^}tOR3hA5}OGi$b034Ub%D@^1N;<GMJ3`bu{}@ zr?wY}-^5|hHS}_ihis>#WH`5>uWdexfeIq)MnD8%z<^W))T<g=w1-FZ1~@Y9Cy#i} zFm@K&Rb#{B;PLIYIL(HgnU*h{4onT!vV)mP@1Khp7Cr`H7Nd2tSTM8eRLT-2`tpyi z7<LYIzHrATSuXQZnjKf9<JzBgs*~-b4M-M;c&PfjU00twcdn{Cv&CTqx@JrVXRL-@ z1}*rz)=SL=AU&6L<kGJW2(5)6DHqa{V!QHFhN#5I3SdCX&@VYM#^01bsyHya#NL(? zzOCbGbH?Q@c|QgRxAR_=AillQyKHSf3Nns_`@?a9X)=uy?J5zB{o(k~2bF8VmTem0 z78s|w^Cs{D7+mE##eaz6Gr245E?T0$uw;Ofsi}1m12E!O&p#wx1^`K_II!_VyMzRB zf;G4YD47BX5i!UipmfxNgG01wP{Xb!R(zg0HDM43#sRV1(I*_o_BOe6={8}f4cR6^ z?1e7w?%lhDOtKI4xIxffY-fo0)`JHq&+B$T;lxoABr&aN%o~m_O0^-5XBrmKFB`oq zJjutbeUqNUZyEC%KqCYx@~1=Ex;R;{;I*`}6~ineV=<3HYwL_kow*Es+HcQt&mC_} zW0|-mWx5nl);?G5Ecok7#;ZV1YD#0KxZOrN#;t<^7#KZCO>NUS-?&0Y3%w574H%zi zQ{GoJ`7p3Z$GZ1+ucofPFhmEEmY!4r1LYAoay__m$bxpFJju0q$3ajiKo%qpt_8E^ zv4#w}fQ4vpV6ThZMYw1eY?1Q4_$MOc`)+ka#7n8C9IiSMnAPd;|1$zHH6l9#d|`di z=`zUpeRhuK+Z30Swy6=m#!+zQ%!_*idcV7WmmCHJcIH9}-!Q}9F<-P)(2(YZ>C<j) z?r%n~{Lh@G{{Dw28-aHbX!;+a%_0d>Cn)KFiRGR*l8f7vr0G*qR*@d;)<10;-HRi) zrwi?(49u>bJ-X<o*EOmfK5$W??XmKOw$WPqa(`Uz>xOzw=@XNmbw+YBz3r?ab%k&z zXafs>1)?Pc92i61gf<nm2SLOs@FR4?D3VOAtbz!mG>@sDm0<J`TrWbgkDz35QW8zN z8On2zOu#h9FKE^sBDACq$WMMdYybKAwL7wN>wyDS7&?s=o$;D%{rX1#sR@<r+~AHZ zzPgxI{>L@!Q#9825`#(UX=>Sxv-<t!g-f|yrR(S_GhLF~b7yT#=Wo6<HgA2YS<=5G zdn*1-lXot!{^Eu65s#J%tiJCTpxbud9}EkM)yvrL7;kg<6Nckx)Y_kh+4n}~J9GtX zo~kbo!`X41obS5%6NWqxF0noRamF|y&?2A?95mT64OeYuW@)sfikP6ALb=0k?8yX% ze+^#H0Ua()_!06e;{duX*Wo1;(z*o*G#y65z4MqW#df@8KeCfAy_8EvP6&9>!;eCI z0|UBTK4KEA!%M&N*Z5ZCiWL+qi_#c43Pl2{#6TjRL1^C-&9mih&r};?9thtdaMTSf zI$M()Gp?49XKRD3ACj-MHojG{dzmtQTH%1#ya>?m-rwJWK&6vI0g_`Hu^#M`HT}1_ z{2j5Z<b4(;WH-|JnRXUhH{Ne{qPh^z^Ms2WZ{H14lE^{8mIXd~6COuAmOP_vRIotY z$i;=9E#BAImoMK&@R$LvW!hdSvT6F)h8-gKhF?ovYH<9~FPeN?u~yEQMiUF+pnX>j zFejp_D;S;r`RPVx=5DB|Xup9CA0%p2{1`N&!RBwvoiC@K$Br(K_usjD{OZx>%l8Ji zU-_&WZyI=VaZZv`xOR7;KBrkBgV)&jM#FvIB?H=PZ&}<sv#+k<z&;k!LoVA{ccs2x zTzWluPLEG7J-hyo_e-Oq>|w9cuAH{vzM(HprSYR}f2?k2Wo31E85$ZwSCrBBElAO# zA?g}1i3ay+BRh44VcD_ii=ETmER2j57+e*|JmTmD@3kZDdJL5Jy+4+OoU^!nJ`3&k zv|p2RXZn?wFQ*p2`jh@YqMHv`tvc%HNb_>)=Y`)b*UkUjlz1C4U`_UA5I(5W9S$|% z*e~faSM?});H1#E=!j>pVew-;-a^yuHO<8(eYGkfE2%J5GfOhx>8o4hZNP-eV!gYP zQ&PxYd3)v*j);oh#u7{}g~I1|av75D0)}6@^VjX|?9@u#hqzy%O_+i1fTFqO*fB;P z0f7MU8<;n5R%**;EuTxt7d{a3UHORj@0~?vW@5I@eyhX6COD<;pYoa$>+CLXpZZW% z_UaS|m#nkun{uv)cPonbl%GH5ASNescyMH>{@QCLwl&oII=kbi`PDQ}F?&6A<fFZQ zV~e;Yqv)wqTLW*McT!saY;keR5sO;}KK@o6zb;Ej9@-_4p`Bx+Vwv{4n5MDFVfk3R zR|;DNW1m&Tl!uge!{%>g{N-|of`XKN_$YD?(4)3UZHT$G_w~EbE!VE$MYW~r)3U|5 zzkXl$cn$OIn*o2054<PU@b5I~d~qeHj!|Q;w!qX|NAZEnb<&i}#JQ^0l>yDS<L`Jd zSkE2YZc@L=R@%kli=Od#*OQZ(^FzYPWjDx;&0YNz4TUvZAz)B4Fo<bB$Lb)+VJYZo zyo#Q+AK;iLroEmoFLBMeQ>6K<b(%7a<Ndk4U+0eZqYqS0_VmtDgJ6@ehAT`>fbjM! za-i+9d(w%K@NliohnqR4sV-%no7#ZTpyg2p0N~d2u9-}6x1s&KKC`U&CacWI#oMX# z8T)OUd{JirdiW}|MXP!11|GjO)~V%^__ESDE4u}`Flx7h73%4!VtXt_Q<IXE?GAqS z5DVaCAj{-*91-QY-P?5|ntlIt`ao+=5$C*5*K*5Ziv<I>>{lH6__MR<4thMIh9yo2 zLedUESBJ8o7P>IRWPG6x=NdqW39>q8dq>A_%!;3R&N_O}{Sd&el-Jc|15xKYfX(f@ zci%#Nge^fh*`Sqv)!JI9zn!Y0Ub!?4Cm4u=DGH3k@q5D-Z~?W3*!M!P3VcR*p*uCL zsP2y5DOpxot0z)Fw61z+gnVz%pm8%W)E5*uRute*<p9XlY;ns0t16FheyZHj4?2cq zXEKWcdFccL7x_S3%1HfhciL2E_p{4d0;gKimaDc|oNs!3?1uQL0GUw6iifP(AY5<j zvuyV2vcw{nkeXF_b<Azk?qUi1*_m9v{n~cjA_)m4-}-NO4YwYx4C;!lkvI6%&dAF3 z?pNUY&>LPcWRY@19j92It(42fgX7tQm(PAXS=V^aa&D=hFxO-tMXg~yowjbt$mjfY zO&SIE<ag5_!!?DzyttBDb6**l5Ar?ERF)+INouM94l$@i5pXiSCCB&(4!ey$bcNrh zHIoN75k%&+tecE?ir@qtXWzXo=i2H5nF#A@o1UZiYaG&q-lr%C`Rf3J0^}tK-$1T{ z3r;F4_x0a7qAPoG6k@nfWe{^7=1z8ohE}Ts!V>Gxif~2+EA&Zn@?NXvokY6qiT6F$ zTfB`tD{|(kU#?=^Y04jUjtp_G!>)JHDK@_xDBo}G)8kO-zY5`NH=B~6?O?ggr;<yo zQ_fi-cibd3)1QgCKEY|U8L5&w6lSGUr!+L_Hg5azu8@l_RiP!n{Q1n9b$2E#eqHy` zJ*oI8NVitdDz*x0AoAt0CwV%BBkgZ`!ny{xM9WM$-B0oMGIB5dX}~wSffWZN`7tKe zdd!URu#291Eax$@NwSlL>Ai#f<bK9um9!gZ&MD1IasT+yLF?;w><a#xR@faE=&)+x z;<!e|*@DG`-Y>ErcUSI+clYM%IMOKaHj>b#mz6DPP3wI`JK_K>0dr0dMtHR>IX%OW z5<5mb7823GG8ev(jlg^U;>Dzl3>DD-L5~KA7Sfs(;?ph~6qL7jSCM_B&CjQ23(iOy zoivR(_r==y>tx!gg-rSly?>6Ui^OzvMm}G@RdKZI;r^3WdJ{DoAC@HSrX}xql(JHM zOn0TH=kL;9qtil<$;w$tmtX1gyB0j=-qc5Im36+wb7LK=$Eekuv^IxY_p~~Pd0GJV z;!S$K@6CKa4U72ko3o<)*vF|6>yeO@f^^HGOWn0k*v@(_?ys9o?D{=!iU4c%;|B+K zxlTq_aM?icwmO}-30a|&XS&M4MvWR7ZN!yX%+CvF7zr6V9nn29LKA?d{(+mn9ATv+ zE=~@P)Dr=57}Fr-rlj!NKJI>Fk5FH?Kl;xsHo8ZYn8`UYFC&;ikrskML35%4?KeVW zhea4AX1Xe;bczF-b7iS^r1cP#YD$L^mLX~G>+P)s77xm2WmVO6Sd^`@{7i`Oa59Mw zjYebap>U+m%b<TCLE(pZ`1t(sL*k&ses7G=Y0yf}&y%`3c-m_D0r<!5MR`dHH?Mu% zp-4M4CV41dxZsg#I6ob?rsu2P&ufqEKD*F3;5$~z<Tn~>(t6eB`+HsWgy{#}9{Brd z8|t)4!v{;P{+=giy4Ihd=giFKI;<(P*w<gXD=5W$zLfp3u3q2dc-h%Dv5hvSjV~qt zs0~hE=*lVC8MU%1Rg{$pkv#1m@*5`o`$Bgee$^;s?xxA!y}VdsU(&ZE-t9l~IMrqk zy~4Jgg04JNOV6UD-o*2((VbLRH~&#@a{W4cpM<5@$fL9OWw|<}9QWjzWgp&eZ$+4< zym|BHRkml&4+O@ON=kxzl}^u;DS!A}g?M@aim7^Y*eAjAqF~BBGcyy!dvkmd6NAzQ zw>?~2xq@VU%I;YR2pMA84lFG_yv)LH=^>PO{g9+&uIZvXlzYONxqVTl)lp2F_3vgZ z4SsN3n?pV>5P7}a4s@LAGAEl;ak5#3Tr|NyMAy@Q7vbi<>F(Op(!Ti_n~0c;b9Szq zJakky%-^Z|>xb3NM!s~pi1jwG=j`cb71oIR@VtHYthV4l+}eU~`bJDt0np*!T}lg- zYFY5DhBV*@BqJ|GISxS*4bA?=)5}W{V$Wji@O#O=EBqMnB>=vNka}RPPzhD@`U=Q@ zwn$iSf~cYw?m*Nux}q?0%Y)|>DS6!|yxyk*o5<fT29y9Ov`(Ksa+FoIDW8zx;toYD zqMf`669cpq^|7?mhWDCl$qgn|$Zfg#Vr|b$hn~1vWiW3W=;>8r6Q#GnDp^=uI%&^d zV#`O%PQ7ntd1KY9*?3a6iibe*_o~Y3u!-rd^{w`D5#b9LMjG>s48=zmu2kN{<DW@& zI5%i8HoaF=_Sml7GM<6#(Jsspl=c48l&e2)1nfBTOxEwr$Hgt9`_>7o(DwDQ=(B51 zMMSf)egFJi!|BJuzh(6jG<8xa$ARYhnbluDe?qi#dFkAgu=wZd)gMYl@AsswT}{s| zvmPZ5DQ5rP^Fup*u#g;k#=Hwmj;ptIu^u>b<HR}=%rc6q<}zs@jldlB{tTb)<a38( z=J2n=ys>4~T7~l0IJ^F7)v2#Ka66D9>?aF^)9Mo;umDb`wYHJm_lkdKnh}NL$`9r- zb*eKI%2V<j?H!_~1AU{Owb6fmkNV5snv=#8P7wvmEUBl$yr)G00_5Cv3mWPN9KCb# zm(i(MDTT-ZVGGtrR?jRJ^1Y-H!*rTordiHOPwd~%Rh@g1MOWm^_0fDQSNhErmd3{T zTVmlI^65*x!W|!J9zD)nPwg}7zgHpnaGN}<TkPnPpj}srUFSAV)piW-NvpXZk+c`f zkNlEcdT^&vt1)BuX!jQ;CS@;wT;$b}_Pl02fx{|w)^=;Q=DV5Jy&Nr5fzTEsRTvxl zr>H%&F2Sj70=Z9f35zi0Skrgs;Yah}`**^1D`K0fU<u9RT-5u!D*bRS7RTdum+P~C z2KFHsh1Pz^zmqt6fpP^EwkOo*tWvrP9*}f}a_Fi`6(#QS)z%j1W!Sb$$v#zTmVRwK z_rfB7p2KCad4_Ge(zDA`H9neylkP9J`^Q;Rj=IeaFFtj*R-}~N3)c#iVo^KmxvEY* zwq>xuTB?xzNa!xf<bqY@Ad?(LSHiODvBnOdEP5$kaW`938IP~m=ubbzZ!^3zPe|bd z^);&J3?q$xF14%~{*RUI&tI}9w<w5-eXRc6rTwWW_xrmTz4is|Wl{ggx4P8OfyYW- zz79PUuz%vnxh=AulG)kW`Io-Lz~jNp)btoIG6J^1@!u#C8GN_NxD%@Dvf1yPP<2$H zRlC1X0oo3#@zCY@@@2vS4AxP%;4Wl->C(BZ)f-6IYN9UNsZ3CZoed5B2FW<9WJYk& zueW<5SVr<TY(T-Z<}s>q65Zq&iKhAa&g3V8^IU<qp2S6Oi9cNIu0ruXVe;6(N8w7A zO-FW#_9DBN(S;EoMg7f?k3Zj3Y-ZR(kMRqb04&8GF8))Uos@_oPtSHPri2Fp=RS7x zMEs6@zUS@cOQp1{zLF!>k?R!FPbp;tkLcb%g4C3em*;vo=8BqbSe=^<EiK!-=<1=n zj9v8Ww+l%bxQXuK^WRgpz}#*1QGfr%+swA77t7gYy1XU@?I;;ubN6jT{kw0(logq= zFpvG7($!Vl9kY*mkNqg~>KCkAV(*z36bn!slvGqa%r*vqx-BfR6&QY;eszMwTyik1 zMWC|a#a!u|4-Ax1ZXkvm+4<X8WuGezHrjP8@}kkh)~pvGEF|CQA0DQyfb9d7<m90K z3ycJkLxt9AfJc${FeNVK4sz;mSln4I98Bl^Zn*7&k=mj0(Ca3SZnulb;R7kHQ_71} zGCTIEX3;i(S?jqut##>S2DeaR`3u_XxwiePdTp|F+kRw?Z}3*D(=E_i%dFjT|FlZq z$*Whdk|$o4WfJR*hejhy9GZD8UB*oh;^I>BwX8<JR+ZMMo>El2i~uCNp3X#FUJ_Aj zR?sB7BlyNe1#4^TAmI(#cg)Srk<v6eI5|0m^^&2>#55?uxgZ9E3m|orK4J2fbFRH> zW4Cgh$@7*OejqCHv23zIxy(!{dA9^>Tupt|s!m?L%J);#dcjwwoSk&C#YJM|yzV~a zG{3n~xHWq$s71%WOzc6jkz2$8V>KDqnY*Fgp4FYBC0aaJm?<FuP*KvEe;bJZ(>p(E z6YHbTLZy|GE46dY9(((5%9qr90@l5FktfZ2J!NVN<$qG4c+biGT&rnL8DwN1@OfL8 zs$aI4qnl-xpR?!oomE#9SdDbFb%hVwR(yIB1iUBW<(;8EtJ{D0-0YioHaCAf!?-oG zMNZI`a*t2dRr~A~<z=5e>hG@K>mt_5b=mn_Nb<^ye&b1sS7zGx;tQ&7dyc&GDB0<l zDH{JY+d**d#W=Js7*MBYJ<S?qr9XJ-GhxF)jLhKCLCnPBz2|lTK>A7y0AbYT_HzkL zna#SIYFQl>uv`|}_4Nx}k|3m0z#xfex?EjzF<m=xd-u5jQ5Z(e*R@!D&^|Ly$YIfI ze1+&ydG1L)M+SK@L(!!*lcD#ku|~Z$RYaAQZ_l_eD>=l8$M`8C7)$q<X<#HZKYwk$ z?T1xw53ojh=kbS|Tqhz?pv`n7k+NoK2Y$59`kOVz-;zqt7bcg6)1uCqDH>oDHGbhY z-?a2IX#K!BGkz9N{@)6(IkM|^Mr?kPb~1P!O>kE^i1qi}X=qlh^)LTAIru^Dg}seU z2xj-Nl`-&CD0tg&<{1uJ*say&8BWg{WnaRpwt3&p+I8!0O-)|Fibz_=VBr_(&hxCo zm$bFB@Y`6PdHsfL9hC<?hfI78j;ZUsM2q+Hc3@A2PR8cmZ^=*8cG<lAE!44W>*Iqq za;`l*NdfcFTbVy?`DGFWv(sMitH(8fv|kUgRg|>(3I9nOJJZVdY7epF3A|vJfUd+W z*PQ)P5}SzOQ>mSPevX?KK2A(;s_>X`&<*hGk@0lR^FHC~c6qu>=G(N!<a~Ho*s)Yu zulw$_-!2a|Y$^L(_6Sk(fz9$zTH>8Q*QluIes)I6%unTQmyE(np>w=ao#irWc8yzS zzN+qJ9ao*i`19$W@Ge7R&sn|<x#Kf`2I48rN<{3b+a@#EUM9m*d&_NT+Ev3bGy8DN znyt$7bOv$0at{yKS^geegy7oPwgmVPiHPH<1FF(Al4g2tFaTf`Y&~%BV5GZa?^|<9 zhN0euR_zp|hjZSu7Y-jjd_Vt$Le`mQH<2@+0;)g)y_t}}1B)*hFU;o6Yin~Sod{he zsI@%-F^ILe{PbO^(PykS4vv<3DIFV#h4XHX@t&D5zfAwfse^9Tl>=cH;_u5WCZ?D- z#{6omdR2M$x$8+giQ{KIUp+C+Qk9yehzwlA!Ww@KvnF`OePhX~0F+$&=~Hxnz^T5b zsUN|@akp<Ldc<F6I6hy^kg;}?_mOc<l?Utc1bAc3k8tbhZY|;LsblA{Y3ZortLbg} zMDObn6umY0a3EIUnwiEbmxWGcjvbV#<#!v*>Yupm75k_)l`c52B&*UE$8`vnS@6G0 zE))?N9l;|~e&=D>%r1d22FbV3&w@aKw~dXd&<uaIuy7olAI<QxPVLB!i~hudp{$zH z|7q>J<Ei}ruumbSB_&ajl|o5T$cRYD-XuwgvPWcQ6cHgrRwSFutc=P?MbRmtY*JYn z8R5BZ_5FT-&+Ga3>91brIOp8==l+cM`?{|8^{)Ozj+k4&y?Z&$$~P@ee6D}1spt5r z)R0{dG#PVGZyT6w?5?>uG-MBYM9*IIZeN8{LtdFFJnh+7S+7IBgF-BYiiFV62Zh${ zh5JDdfBp8&4xzr<!Ur;$6QCX38E6U6PS#PD1VTZ{<J21ck2%?oKPKr3&OanSh$)=> zIWssg`gs_0LJ4%=`dKN-YXx5?hlE|`1rY12XVy*@o~oSND>6TiGd%m*JnzfC;G00~ z!H!?Bu#iUqV}Q9#u0i<?y!Nvb!Wy{8a)3nNzsmz9rH7|gr|xC~$$&E(0PovDWa^XT zf3yHW8`_I4Ge6{hn}Z!Aca3*T9ryQdH}ZEN$Z+|@==M}~^4C=H?&B`*6?~%<o%asA zB<ZQJ9uSMWoM-FnQKc_8k^COJr?d-#@-Oj1=RV06iCtRS^~K#xEr2TI`h^ajjH)A^ zyHai&TrOJO=+}|iPQPi_C6VH9c?+atkq33tw7g2c3MuC=mKy{yA5%@%kj>~jJ5>K( zzQy<Nd4}^#%4?Yy0rbyXt`lTx(oStlEd_(A_Hll<E%}dL%)E-sA`v-UilOErWyE!> z(IBRyWvdNkUZNP4c_)X;f&I#gikj^VPh(!ad>Mdcp%u8=rFR0SCRpr8;M{l(pKPjH zx3y3#MNfH}bLo<ENtm`MZqd=uovQj(%C_OxO--i1->2(zw2cQpe3LefQgDEU2ex*( zhKT7GH)LeV7yk(4^Zz}q?E!s+p5rrv;7Lv8V6x!N^z{8mYCzym<XIx=_74f+!mI(W z3F`==S}kqCH*-jnhn~Rb2vaxM%OJhBw~*!^eOBbCk$EJr9jZLP?6&uj|D@>YM-r2` z8!HfRKqpxWn_YaH33OEO1UU>VQ7E6tOIqNg(LW*=`3J1yBt1MT>)Zk8<s%&%n5b}> zgy$9ED~M**6KJ=N3rnIb(P-w=FD9HWz0~Tt-+*dFVUp4NG*!&|Wcj5{n^<~fl22`9 z6m8MZ-eadq>=Sja>UZm(o^#U7dC#YJzZ%GSvg`()cA50};;J{_wI=4B4P(piRy@-w ziXq<Yab-VLRBYC}Q=E5!<8)u%`X@ZUt&1+0uk0e|{k@h|x+vv##5!)j?<{G&`uX0T zj-HI=A8IF4uzOq>8dc#`q3xCkY}#F(LDnL*Rod?itq&f@$&}J8Ng)~$K@(AW_`zdX zubsEFyzS>l1*ZhWo5o<TAP6H|jP&&66BBRfm)NkfxKC|)07CUkZbEUYdge&5fAy=5 z@)tvhFSg{n%^61tSM8>));{h;%g88)+IepKn4}o&X@f9oyWn4b{PHVZ<CCJgFRoKK zS1yTQi4n5W_IRa~JAH2CP-DlDW6)7V@);_bJ~B<HS<fKq4kx{I{U-<KMMTI>Cf*ru z^u@(FkW%($P$0PBJaBJsU!;s?_8FqI-O#YAEno%>(y=i0Q)DcPMu_kMKSDv&r^6u~ z26QPC{8^$rTQ!i12-ygQ6$~wFDW#Qfwt2p&d92K7)IZSvW#+&WV0NL&^*RNW-C`vd zhUrA9H>u=|esnN-);dE?<+xR2IM`J2m)Vs61JTzFiJ6yKw0I4kIVbQ-#|4;<%qwQ; zvUp>WN<CScbe(>P$JH@!xepJq4WQ!lo6Zp;xnUa9jg;&5t_8|nT*!DPO;Mx97no-& ztd)5W95B~<)?%u<fFjJ`x4Vze+IAc*i?s8LcfLl=#xCqUm8Ql!1<>N$=$E)vxfMU# zPCWDOKEIlQ&lKbv;vkIy2fs+@_Id^eYGa36qYn(Lad%FHa}7(l3HjXIV1&N9#DItO zxebIHPZt=y@ZW-h=D3QA3c7?`?ObLs*@UO>l`BD+nLKc)>&K%@0x^Z&)Q|L1h1H5w z=_{%{27~l6lG}VK!76CQf4tb4pLXl~GX(GoyoDR6sPaA0^{8IlaOdKX#Ih0EKFfP$ z!87BciHVV!Sv}T;3)(=-FUBtl)KIDxal8p70&s2_7}dq=9Fcr~5VD`W`}YTk`%o7c zeL8$&1JlEi{baqT1_r|;-{jAqsNULPYG&4V?DBS;??&iMXlM70u^-qQ(Ef?ZN%n)R z*G<+l$Tud_<QxC8s+*g8mwDA%EB9RX$gqZpaFaH(u$F{Ad>OK~pN886C$vPsnDw4m zz2V8Ncm{2hG|Vd>7ZkMio=H%upBY)@FOJ>_+S(?r8V&-aO_sNEt8?~OqAm)K1qyHs zA#3eLH+7q@Z&|;%O)4H}Qd+<UN+LQ-qj}*Tn9M>dMkqu8ft!EIPl+_!XK_oUJ>HAB zY2UP6)89Xufl3WZICMSKy7FbGOkl%Xo4LxgUD|!UJA^E@>0ce~M{aN2@=&flKJ0B6 z^aX?fG0$;GX-zOwExAO<QaSz9tA^JXN0VfNa0PYB_o^WxNHeUeEKb!N?iVr??$=rT zQR=ZMLV_PK_9Y)QK&EA8ZUVGfV$-u4!(CTjpL&X#js*O5O*hPkEjmIHMAvyKY^)r= zgcT%U)p-v#&2R_xLAF8c0;r~LcH8qH4KX_j3btxEm%$dR+mGSg`Qernz%rLyoRZ4I zBi0c&Nn4}?QQjOnN830!T!h}o?Wr*}_>UUk{g%oj(LcL;P9nUltLM==KiO#?c2%E5 z#j_2{KSp6Yj*;bQzAp))(TpA*pova&sAsA=jedF#gg4CU^M%@5^t0mf?<TUagVcs% zLW5z@b@=|_HtJ_T%tu@R5x2hOs+gW)bYy%Jx>U<6mtXxoJHfqw_1QK!5k*UQdPD^4 z#=XZ-ydRpJoQz0<jSb5X%wWvW=nQ5+zNl#a7FAj9d`j*Rwpw4>UdC>yFcB5NhiAi1 ziTF)TO+*cN2)rfln!Jf%laNRNV3fzs8-y(Fq?XgsNe15P=H}cF32C%3-`_r<0Je*g z;2^><GV4oWKpy+4Loc5DG(qn$7Z4T0wp6$AnaA%?9HO=9N6h}>6OblfcD2xBub=xF zYFtEe9*VnKDCWoAnkl;(WaL)*-M0h7w|->K4$AydMo8ODvFIX1Zp_vn!!_vW+@s@l zhMage01Q+oz)*Us2X^=MuU-X0#c(GoPF1FWUNB&Vg<Z=UzXe`A2zsO8LiZCU{`~eZ zm<89}_{{r5ww}?2i_*J=ZRg$}K72&3(lOAUpZ{Uk(?BG<)>V_6!uKkoo<gIebu0M} z_%L)lXNCgL2wpr{hE?&k37$&fb+>J=bVQo&-TU?Xu(@lDUex_4SqnWT20p{ROY@FQ zf)+0z;MXbl5CeboZe}WjO1SB=QZTt!myDWHQj<Z67jCsmLf-bF{B;do6vM*>UMD4( zb;%a3<Ix>wv294xQ4+SX%{#3th-!*Mt{Q3j{w=5fd3>!Y3Jfq5dI9hh@{9gviRFH% z9l>2?(6ekCFurop*RtFx$aPY&?CMx>U|?WzDu=~dSP$Z;dX5-_uu?)y!Gpk<Q&2D> zXhW&UV~;qI!lJ@{&CQz$BPDE{^YioV@mfV3^>bX|#zoFry81dKP;hs*oI8i?jKnQ* zZ%<+F|FtDzNuIf#OTm^Azw#JFCjmT6)W7WeO}nKDtPd&jfUaazuz~p)has=bNJ?(5 zGKv|7AvrEiW%J#a1Qt9j(?C>ExM@ABe7?m?I=56sc5aav0EWn%WINR9BGBeqR`>dO zBcmEH8wBR8L@s<g19A$C0TE|B&_8DGD$>ipg4Om$7x%n!oK?Jk_DZ=$$MPU0ze!8E zrq}^20IX<fdSZKnQ%x%5*zilag$DJ@>G?C8Hjx~@wNiTpk91tN7fA|(FUS!{{&4Wt zLhGM6GJN;jvswk;u>(4sTPu%wryY4$BBb4%SYMDc!@}xEE9GCWLPfWxtaOqfxHQ*- z>b=Jx5Vd(V1&JdOyae&f2kyqk2Hm_#O#-%3i;@{IxTvgxr$?&d{iEn#5DX30B@>Tn z=J0xPF8;i;BP4K~X<|+mA9G?0wvx%P!9|DpO$0JCqak27`<0(`G*`d&d!M_oNAE+* ztr`1Q4rb@QwVW^ZU-xa6&{do?eM6471{^e$kTp2+>r1asHR)Q_Z~5EGF58%x8c_mk z>*N%<t950olOh4HgB$%#Sb)M1ycE9R5c&>40Hjg8O5jQxE!YiAPUUi^5nQykmEdil z$3SHWU=CrFQF~T2CLFhpBKM<MY+3#3tu`#(b>pn(t}GtC`%*oXf2u1U3X7zX;Q+R8 zmt0p9KYH}HQ$=^<%_m$+`?sG~G5?Y!Y^@x-x|)S6gr{TU>nR|lJRg>9J2uNO_kSiy zY<NAjV^r)ONOgryzJJN{C~)W?*>iOahlkB~+#8OV?F@%}n=mhDI%X9FJuFB<I84~X zs|-ak>Vr!w&%-xu7)#byF_dR|6)LPEPOPqmHMIY&TNl8z!73~Y!dt@M@{v-UJdAO` zn$e5o#=dx=W^H1w?ZD#I?Bm@acjh9vWzJyzP_Q@e-n~nID=q^I|FQL?AeQ5&MuuKi zCB1JSW{iGdcJUN+B?$)&1L8v&ePpi{Sk^aPaAy|X70~6ns!`mYfpUxE-k7f7gcHpT zLCR6N8kaqLdO4?pUYFQRgta?qvZ$IRDg1C9KW)8<IhfZr-gaUgfWbFl(*}M=rN{rB z_}g55tR?L>5Q%JW$}^~GX=GuhH$9jM3f7jTJ%LZ^1L-jr+pb>^7NIzJqSJBPFvl3c z;3mu6F0Q@XD%a{hAHFobS!IYXmbyB-+3Rrgz>_Wyb|f#TaD(I58I+Vj2sjv_eXa(2 zZhL!sKo5|sA4L1Q1GsnkrIgdeDI?|ojYzSWQhi=FH*@jvg+NmkileE(X+#f#ozmrT zBhKdh!7|rnais1aW(1@Krw1Y}Ne<sT<wk~r<BT|qJztH9trp)vN%M`TLi~&Nfkav? zxuy7%;A*5l6$9)tFj%<bJh|5^zp4=vi|mn+Hm{O$Hl}>f>1=DV4ky)yzx?5@jw1Ko zDoI7Q8cJMQGY9$QBA7k}%T&Fh$Emw&d@+*<vKq-Iur6CZ{_yYoazG#0_Bk8now$Bd zUv`w!^zi%3LShE4{BPgHQQZ8MSu{8O%bT8lK(SOq=sfNA?RAKPKn4=lXccIt1&ixE zU@)gpy9n!NWP+&XL-A5IN|4Ydnim-B0F(aTVPX>#i-T)iKDHo03hC-YFH;-PP(&8h zS40D$s^34?qor2tl)#ZA?4$G3jq!H3BktVONp2bS&)CY4P#rVP`Z{J*d2*0yxEL;H zby>qph~R<JNaeYoZ9g8mZRg3sIBAd0qTOEET{pO!H!}}!tgb!6)ld<B8gFb`));s9 z=vq37FUbwcPHL~Rk;u@b;fXxBibjir_w26M_`=3nxjcUS0f7QpWHJD{E8?6~Vna3{ zR$HYq&Au|Qg7MtTo~BxlBF&OU$KUyo&cyZSQXW|0!5(^V=98hI!T@H9d0?6Wjox#R zRq4}=<arVx>Ad{MEzZoFkI>|VS%8TMXuf~{e&6V56N0i&&|!n-V8cm;b$J+aRd_so zD!<By8Y_6(8l69X0v>R1jWwF+twl+%jX|X-)Hj%a7W<ALzYm2d0izLh8ZZzxhx8Gi zfhA>Shf&J{=?}aiJ+80-yTk*VSXvmfN4p4wx#X6al9Ccy`w6zq7agVef3b+}8SIt8 zu9rKK?td7*%3LrhZK)TY(U%nI(f&N2VW};qC1%*xv9+G3Xd46)G~2RhRcu+h*Hj0` zl?yowg%wUYocr1y{rY$SkpmAev<&c^kbJub+Ozu~v)SCNed(l6mv~Tk<;1PeXWS)f zw~gdkCD%B6Loud%?ASW5MaVba6#Pm?E#FN>#*oDvL&k@s0^B51E*LNp;iA{)zIXOa zf8ZTKC}JbZL|DbdHhPhkbxq>6RmP=AuSXOW+?KHKKRR<w+vRMblaGbtGjNxOa4I&+ z-{|p?jWlP5N@z_r6fb@5AZLd^6>uSa(kM0odIkv~j4|He;31+1lrO2TUWelfeHo~5 zeqmrj5NFW2tz-nWN%^()^=SUY2#e6W%~?d80l_h<3W>%hPEMu-M{f3EDBd-=zyIPH z#XwKfTx7_o21PMK2%?!-yp{997P3=0u<a5o;z95=jQGucIdV}p82uF#kY^Q&(W|Z@ zv>CGtXH!Cw_12BsN&KQq@N}=R&f{6o<k`V&HhOavAtg{_EZuBl+}Ix=-~GU#<0$Dj zy<^NdzH;vL+c!2(5E6n|QOB60PT6xj8RyHnYu{mpqkDMNSqHK1=O+MXh1E@F?Ze1G zZB-&)xB5@kyV8~e>v6u5aenICLjP{k$I<0p41R2oh@A4ra~92<sT@39Gs>spD7y!k zpT513XIys#ny=&=w+F{$r|H^@&9xtiH^qlMf`S#GjTrgt)YKGV*1G$6#>Z%)`3J&m zL~A!t)G!GxV1dzdLcT2<C*lY<YR$YoK5=nzbuQ)zI<SxI<K^cMg+jy*HquCPgt5oq z;|K{?p9c(rEeI9H70XKtaQp20`t>w~H3~m+QR51ymmpMpo7_iMgqkj*ksi^Cf!k3W zwH^**U*d9|e%v`PwZ+h?tBFV~QBS)v@-RieqEl6=7HCE&hV)fc^p2C)xhs|k9S?Qk z3Po7-L&Eu<*Jg@!T|2J>N*MIm;T2f06?=-&&-dmP3r!rw9y>E09@fiqSf^jL(PWmE z4;wwlrKMQAs>%#H_Zd;Nve!KNCz5<m1LAsUoR6BEGsX92y+Jv}_*_i0&6S~tl$#Hp zE32Lqi=FF=-9toOczws$!E?ObDjIh3c6pW=<jv?V8LxA{$M&otZ^^Y@mHt)5epXbC z=lFW?g)S(}dL>x7H|D6NJZhYVKQAN*DB^@aTj>^!Vdr^*;Bca9c`*bIaZCc2ypogI zapOWFA}s)DkdBz6p9}Vmh@;voQKhOqBwWN3;ItvSN;SocWm0ZLe2<**#k+T*KrRS> zeFP$PbtYBvPhhnF<8yfwY7Eizp#epoNJ-zNMXvUOAcCj{WH@N}=ytYcbbapagJ&yW z=R9@Qt@3z^Xu0w0zXZOhOq5cycH@o*U1MvyU$e-X8-FZon?zX9CVX}8)WT;In!Raw zC_TMDUeNL>A2g_x@@#&9Rk3GMDJiUMAGROhI`<ZgNTjCVO=sdo6!(AaT=cV&_xzU* zFup4wORlM5uNp6Vay8;Mm*5|ztIwK^y>CN(I^`6|X-^~k=z+x&^rCguugEZ|h8)M8 z!HaIO4aPTJDsLWfWqTHVRPcml*L5o@g+rd8095YKn3Kzz18+}Qhp>`(4H&bwUlH2o zLQ8Q(Ok96%c<a!ohXJgBdrh;(z7u4Wr@gnpHFxgxt5){o<Es#GG!}NXw!C}y08y~B zi_642S(ZG@j-&7oZiZxg779BUqEX?$gAky=$3Bu6`|j=&AV7!&9u><(TWdlcN@xj0 z;gl*r#J3U-W}Jc(K5^ba<R=rjogb!RP}!YAS_r)pQ5J!alISS}nNu~=?>T&24!Thw zN4tdWe4(wJg#9YK-<$2I=txAbpT9{YsyU20OKh0{Q4nn;Fq2vbHI{jzGaDD|2hVps z+Q=>&c|bAqtvCY%1CZP~tB<4d!xF%v{Q`ZWXKyG6T&E;Kn6kIB=Q%bg4zAR@ZI3uS z#;6j_F4kGsEALw@EVfMfaEd-wh5mAJ-oZ4vH2LdOz+sE(Nhd34D%Gj^^wW<fK<M)B z$l<=$0Up74W0|?W=BkqIJM~k#ewmnnA@tWHI$;t0j(pvULes++1>4O!?@f@9M7@sp zAE)cs;9#Gc5?$I}jN>976pnVMp;mE(Ls%6+c&PfeY^zX7Pf#i8Qhk2vvVigv?Im6A z#S2eHnMRWHhriQ0eE)vf;p^MOBig#Kc^roE0Qd^6jwSS%As!sG8^pGSoNS0di*T9) zZhHX02AMe^Yjhx!(<LlBRUYa6IcB7eqqkWp;2-pcL9?(^b3d+P?LnDFLWiSgH8s}> zIRtE#O~{g(ZeQTFy94dxYMYvJ&Mth+){jz_SiJk?sq5tPW{F9Q1aW%N=P?5}6Fg0u zl_dx}<8S2f))2wl|8Uc{nxl7*i*Mv9skZLtt6DuixHH92b$M{-7lc~R#<-T=myGcz z-zYG3KONw>Lt{8d;}@5591)6HP(^6+(9&4n^uEws@MxjH#`dwAge0Lh2WH;t987OA z&9KwP$%$xIp=@<l(g7*NWabqC>?lbaApVg?O;FwwzS3${RRn|=$Qk6=`GF0JiUNF2 z4k9AAB$Sxzt=lgqc1tg3T8%mkw?!a2okUc%e1Gf1NGbD$Cd(`9KQ|%)NB&(?!ruo9 zjiUS9g-3eJ9apW`f3|Hw#7|M3&&jhxpjurnd#YrSM!jgiLgPdIC+c6v!;Vx|TIbpH zJmVTu**MVOZ-c4NS)Dkat~WqJ_p@7=$HcR#saXY#@W+oI&ZDJ6{egiii7tKP>(~9* z)_^UhQEh^0D+Jb*iExW0{7LcW1HH89^8sdCHr(Q_$ioVvd9240=#aS{>iB~EmKle_ zUW>E4_@2&lyU$PeL7w<w#z9(`lamwvhs_<<x6PWUk8l@SlW%#w&Au;Sm6-u`6PN0U zix_*sg^uJV>8<mNRs#>0@emwFI=4WrZDCnfHq%pY&=Jx5I>Q#C*THe+o{G1ci)=z( zmdBm!`oHpnT3<!uO&3o=y^ktNAx7Cm$Z>wdXV+;nC=`GopGtODiruG^tvc0PnSY0% z)%`6pvub>y%p$rPog4Yylq&g(+r>#!R<qv7yZOc8r#b0IzOah21ywCCm20{2^Y8*+ zLxZRy6446|%F<XhA!QilgSEu?0kus=T-CUUR-1B`YgXb|JM=p1!7y1|Urk=bCyAbA zXvWmocncuVzGK9|kBnSi9C}Q>nVGOf9!*KH<>1}G{`@CdDKmZaOL={jsA!sYmAEV$ zJO80WZ)fhlP@nA&SH35<K%ung<U4dFt4M6O>gg&;pO;N<hJbD}F}#dixi`J+tQtx$ zIM{^c8Q0UzlMf=;(GMud6q)oMq}x_;2ORFllG&fl)W7(h3(cZ))Y1;1IYX)QM3P;( zO^>&ogm7u1lMFgQz*bhvd%d5}Mu@DTrZ#+)`v+@qMUiI%B%~!U8pamc0~`x>(gEN= z0B@gxaGeC{y|y={pU)b|C>}^srOKqs!A*zg<@UI!c&|g>shG%u;FF5>Jc1E5#`Si> zM<bDlZp<`uFgaxzhORd_ZcQJ(X?tp{kiCiW14lycytg^a@0%#hdwS;jsz1>jxpC_m zbdjvDufI8V)uXxcv5!!(eZ~t$t%I5t>_ialw(XF1^5TVqON!RNq8JY)N}%B7-7L4C znIx(X^b#M~RQI67<b-6UKCDcNPMqwa-w5xG_dhdNb}DBP<a<zy?7!}vbWBs8ZQt4* z#1cT|3a3pX%??C=<`bG4)<~W=FbViy6A}5*SrP3tkX5Uq9$V$SCHJEt7Z+d1XV~Eg zlRL+Zqzq7=MU>b3h<(<5Dmwe}xWD{#YcusY)5JfFlu5g`HvwE*6#b;!nz%>%GN3j& ze}(hPUzK%q-@oR$aKm-8sj{?l-nES>0Sf-c-Q6BKI=V#n5(J^~72zbBFUMg03RiJ^ z1TqBE&<W9#JdQ?ET^*DqpXiYH!^k<}zD0+9vltPS7XG#%4$z4#1#qqlqUy8TckWaG zU_v1Fgh#V`j_PMj@I!8OEmInR*EvAg5EcT^Q&bF$7<{+5hVA9?wbs3ZlvF+4UmKuN z;};Yp&lF0d_1SvZ?*}fwj%mVLZjWy|@_jZSe8Ut|Q#b2LoLDELe?|SBt`(TBNGf2+ z^XknDj$*6dkvVZ?n$I?5M)i3vH8tctzx3|eU3ZDGWW>Jh@oL#<cSnH|i5EDy2}Tui z!A9(7mvK^4kY%}1lW^tA6=LpMHH-a<wd-nWQES;pWS70^XtrUyIPVBg`hbv-A=F?H zu^(PQQ6bTV4YeDTiNHreM7F|xg3kJ9be<g{*oGhg-CdoEi+^|BWNE3oI>zKVA%}sL zU>2%=?J`;7JU{~lB-DP?_;pKVMU5~lkKUo7`Zj*Fxx4t_p=ibhM0=*cIV2D{zPZ}v zuAMV>mu^LBm?@@sXcb{D6T~EVYf)m%?A`B>2^Y(=x0m0Z3j>@dRr#elXmi(4gm~^_ zlifR?W|2rVOmfna8n3nkBFh>v7gGoG0~2KR)f<5MX|5N-O@)Pqt~!ASj6!6d?KXro zyt6YFI0m69|Mnp}b3mJu$hI>gk(fa*hvHbyHR~}7Fsnz8DD_YEK#A}K31g09$Lir5 zj-8HE2PiIU0#C+uKuJH5cNc)5)|2?P%jfgwVRACH(xy!UNBAYHVsiI2HN55+n6XT1 zj_U)h<9p+#{qQ$Ur1Eo!^71kV%wweq$9UrGD08?LFZjwQFE1xrmt+wZ6m-U0T(=R? zQpIG`aR7f&3-=DL;1oset!uU>cCY^gc!BsDTiem<-noQvsVD{>o5=R*4wkCJi_d@g zi`d@+jgo+lcMVas7ToB`(RS;`v&>zPl%*7cqd15zA}VTJ>E0V;Jkj#D;=_Rm24c}A zL%b6f9$xA)xtCCe2@6Lfr{+A5at23iT{s0fAQmGLlwIMa>wbPRdFQW#s0L?&5_LJT zRHnTmA~D!LXp1j1@G~5|<SH_70RdwC^4KzA7J|Hk*sg2QC9W3QYfM}2C6Dmv(J|TQ zW+mO%Oy)g)F%!v@@W6JWVE5z4U+MG5(TNi(GY8Noo$f0<f^-o*7;ZG$fH|-8w@T!U z(ISrAs8~rwELRsa{>Zay)sCIf8r5eqwZ6r5{4TNPGxR73APSjK1`ml_`ZnRr9@NX8 zK-WG922z&JC@X7s5IJRIHUej~?Q5xUv4>KDACn*+O<j_~`{`YC!~jW;gki40Q4DpL zY94#JxH3QI7*;8%sfGP4S)uVQEHWr*AcaO8r?#3B%1grCNR9o29Z|-FhlaeCJ5vYj zu9z60L|eGjzIZt3ev^)#2Z#^y>4~o8rKtI`GUpKHn(pNx$)VugI5EM+SQPqxKeo1G zl6~h<kW;PyLrzIJb`f0(HZloR*Vd-|J4n-jy;XoOrQV8RC_+0DqK}Qo?+IA|<K`x< zG?#gH25q>_b0w(Jj_W|g<vi_DCf5io%XjFvN9fYLR#6m+399<hQ17<-Qt=XJSw#3Y zj8@|!G&f-}F&V|yI2>VtfjT2f$S?;y<U$nBoI&Yz5{h2XdE)dQV!W~);2Sl7ad<RS zGCqP_L%w?tN-xl>l;Qg;z_RPUp)&KVoIzTdHDWSIPcWD8;Y&Sa8dm9Ad3pH@fB7p! z4>1B(LCGieV`A<l<{Ca#zpBYqTI%xfi(Fstz$*@pv#F}dr$8D~LJm^qFsx?Ow@buf zEuJ1BNf;IXqk?ar2OdGNu}H9T#w%gXB8)yg7$r6oHlj_8#_SIIHw_JI;eH?Qx#WWJ z;N-emyVb<R1hu$Qc6Nt}RRKH?*Pr?MmK6>R;6s@&mLR@`O^eFv4S?uSUd-JAU|t$@ z|2y<9m?=R25VSC4SV&g`{6lxy9h9z)n(#UhDp$c_(=E>+U9eqVa!>5$ZbLXms9@Zz z6qJ>@pqN8sbO#<Cg~|#FeKkJRqHeQyK=NVs5?DV(vqRW3kp+5T{xhsELp5I;EljM7 z?gs>{gCj>WAU47h7Zlon2bPR^dtv%Ec6uq%R$>i8d#-1!)uF-V`0afS?i$DX9}exZ zAH$L6H*ZXUED$=NbS>e(D-TKQ0kFGuVC&gR&-<lG0W|JIq6*`Ln<&e-8~Y-L%qF5f zq+<rT5iTt?c6|SDb-+Anycv5O!9<(4JX{CV{1MVx0gLx*F>{!XUOA1SQgF+;^tKvP zLTx=!g6K%hI`m?Y#QFcu^_KUTU33%?vcAG}!{Wi=m5{NvfHvt01am|y?)LVwXY(3V z^cva;+n>@1va|cZEns`c7!KoxB0fk+%hR>;=~IxDg@$hNqTA=?9bt!k1#_*zf<y$X z6u>aRnMr8wS@mbGFtz>(RiRaa={irkl5bj#M(G1o?0UM>5uYIL>Hyj_D&y<`_V-); zmuBkfL3X^O5rdf?o{-QC;vS&W-#^CXGjXDU9|eU^YDPrjA4s1ZgESj9=!65`{%Wp2 zUrT(qeAL~$(rRjSsP9MFuBfBupM!GbQ(N2H5?f=XSRqMNfET9{zqbO%uT{+!!$eR| zRf1+t5)Yf_q4J*~aR$0E!VV8b8<6Eo-O8i+_liV`mI+|pWtEjf@Eo;us{Z^8J0>ha z)>?H{zCjxhnRDmjL5=;-PhrYVU@e75M94rvk&ZLhZ#p}iFX}43J53U2h%h#8#TbDH zz>0{l87%1E%VhO^TZUOqbcsa5IE?GUe8_pb#QCTEsT3>oXFc}3P@L2juJZqWidGK` zqZxX1qP`f}Kq9^w*th1a(BDhODz!z-hpAzXUU)=u*U)gfqxHYvO``)s#=*s9k7S$Z z?u_<#7<mwe!sLyAp82VAboDT6itWL)A#4IrP>+QKmk8Vf3ywWYWz|1pjREXU9~c-2 zjfkiP#s{ft4=PxRg-G<q1WpOOhTGBY&-l}06ctf$jlV)|AWp^q?kVCCb}hK-z_38K zr)Uea?4RH_4$22&X2Ij>r<u~fKUpM+Xa>5O6l}4OY--KTuH5>+PZJw%I(I6a&p$Kb z&l?sSS1#j!UQE*Xe?PY}0RLT>l)u_v(ZzqSrG%}hvH$1i<T+QulK=ih>aP6C9sD~} z0Psfq6*v6*nkx7IuM5hccFP=*`*(a+t|MuFe!2EW&tWdMa5WPC$;l{5=SZFR{y+Hr BssjK3 literal 0 HcmV?d00001 diff --git "a/rag_lb/jupyter-book/notebooks/00_Einf\303\274hrung_RAG.ipynb" "b/rag_lb/jupyter-book/notebooks/00_Einf\303\274hrung_RAG.ipynb" index db1c23c..baeee6e 100644 --- "a/rag_lb/jupyter-book/notebooks/00_Einf\303\274hrung_RAG.ipynb" +++ "b/rag_lb/jupyter-book/notebooks/00_Einf\303\274hrung_RAG.ipynb" @@ -10,14 +10,14 @@ "### Einleitung und Überblick\n", "\n", "#### Was erwartet Sie in diesem Jupyter Book?\n", - "Dieses Jupyter Book führt Sie in die Methode des Retrieval Augmented Generation (RAG) ein und zeigt deren Anwendung in der historischen Textanalyse. RAG kombiniert die Fähigkeiten von Sprachmodellen mit gezielter Informationssuche in spezifischen Dokumenten - in unserem Fall historischen Quellen.\n", + "Dieses Jupyter Book führt Sie in die Methode des Retrieval Augmented Generation (RAG) ein und zeigt deren Anwendung in der historischen Textanalyse. RAG kombiniert die Fähigkeiten von Sprachmodellen mit gezielter Informationssuche in spezifischen Dokumenten - in unserem Fall historischen Quellen. Dadurch können Einschränkungen generischer LLMs können umgangen werden, indem eine große Menge an Referenzdokumenten durch das System geleitet und auf der Grundlage der berechneten Relevanz für die Benutzerfrage abgerufen werden kann, die generierten Antworten diese abgerufenen Quellen verwenden und speziell hervorheben, welche Quellen verwendet wurden. \n", "\n", "#### Lernziele\n", "Nach diesem einführenden Notebook werden Sie:\n", "- Die Grundidee von RAG verstehen\n", "- Den Wert dieser Methode für die historische Forschung einschätzen können\n", "- Eine erste RAG-Pipeline in Aktion gesehen haben\n", - "- Die Möglichkeiten und Grenzen der Methode kennen\n", + "- Erste Möglichkeiten und Grenzen der Methode kennen\n", "\n", "#### Aufbau des Jupyter Books\n", "Das Book ist modular aufgebaut und umfasst:\n", @@ -33,7 +33,60 @@ " - Prompt-Entwicklung\n", " - Antwortgenerierung\n", "5. **Anwendungsfälle**\n", - " - Spezifische historische Analysen\n" + " - Spezifische historische Analysen\n", + "\n", + "## Voraussetzungen und benötigtes Vorwissen\n", + "\n", + "Dieses Jupyter Notebook richtet sich an Studierende und Forschende in den digitalen Geisteswissenschaften mit grundlegenden Kenntnissen in:\n", + "\n", + "### Technische Voraussetzungen\n", + "- **Python-Grundlagen**: Vertrautheit mit Variablen, Funktionen, Schleifen und der Arbeit mit Listen und Dictionaries\n", + "- **Jupyter Notebooks**: Grundlegende Kenntnis der Funktionsweise von Zellen und der Ausführung von Code\n", + "- **Pandas**: Elementare Erfahrung mit Datenrahmen (DataFrames) und einfachen Datenoperationen\n", + "\n", + "### Inhaltliche Voraussetzungen\n", + "- **Grundlegendes Verständnis historischer Quellenkritik**: Einordnung von Texten in ihren Entstehungskontext\n", + "- **Basiswissen zu Textanalyse**: Konzepte wie Tokenisierung, Vektorisierung, oder Ähnlichkeitsmaße müssen nicht im Detail bekannt sein, werden aber im Notebook erläutert\n", + "- **Interesse an KI-gestützten Methoden** für die Geisteswissenschaften\n", + "\n", + "Falls Sie mit einem der Konzepte nicht vertraut sind, bieten wir zu Beginn jedes Abschnitts kurze Einführungen und verweisen auf weiterführende Ressourcen. Das Notebook ist so konzipiert, dass es schrittweise vom Einfachen zum Komplexen führt." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Was ist RAG?\n", + "\n", + "Retrieval Augmented Generation (RAG) ist eine Methode, die es uns ermöglicht, große Textsammlungen gezielt zu durchsuchen und mit Hilfe von KI zu analysieren. Der Prozess besteht aus zwei Hauptschritten:\n", + "\n", + "1. **Retrieval**: Zuerst werden passende Informationen aus einer Datenquelle geholt. Diese Datenquelle kann eine Vektordatenbank sein, in der Dokumente (bzw. Ausschnitte von Dokumenten) mithilfe von Embeddings abgelegt sind. \n", + "\n", + "2. **Augmented Generation**: Die gefundenen (\"retrieved\") Informationen werden zusammen mit der Forschungsfrage an ein Large Language Model (LLM) übergeben. Das LLM nutzt diese Zusatzinformationen, um eine präzise und kontextbezogene Antwort zu generieren.\n", + "\n", + "### Glossar und wichtige Begriffe\n", + "\n", + "Für unsere Arbeit werden einige technische Begriffe wichtig sein. Hier sind die wichtigsten Konzepte, die wir verwenden werden:\n", + "\n", + "| Begriff | Kurzbeschreibung |\n", + "|---------|-----------------|\n", + "| Retrieval | Die Suche und Extraktion relevanter Informationen aus einer Datenbasis |\n", + "| Embedding | Die Umwandlung von Text in numerische Vektoren, die von Computern verarbeitet werden können |\n", + "| Vector Database | Eine spezielle Datenbank für die effiziente Speicherung und Suche von Embeddings |\n", + "| Chunking | Die Aufteilung langer Texte in kleinere, verarbeitbare Einheiten |\n", + "\n", + "**Übung**: Machen Sie sich während der durchführung des Jupyter-Books gedanken wie diese Begriffe ausgebaut werden können und erstellen Sie Ihre eigenen Definitionen dieser Begriffe, während wir sie in der Praxis kennenlernen.\n", + "\n", + "Weitere Ressourcen:\n", + "- [LangChain Dokumentation](https://python.langchain.com/docs/get_started/introduction)\n", + "- [Understanding Embeddings](https://www.sbert.net/)\n", + "- [Vector Database Grundlagen](https://www.pinecone.io/learn/vector-database/)\n", + "\n", + "### Systemübersicht\n", + "\n", + "Bevor wir in den Code einsteigen, schauen wir uns an, wie die einzelnen Komponenten zusammenarbeiten:\n", + "\n", + "" ] }, { @@ -43,7 +96,7 @@ "## Unser Quellenkorpus: Soldatenbriefe 1745-1872\n", "\n", "#### Beschreibung der Quelle\n", - "Das Korpus \"Soldatenbriefe\" ist eine Sammlung von 170 Briefen aus dem deutschsprachigen Raum, die mehrere wichtige historische Epochen umfasst:\n", + "Das [Korpus \"Soldatenbriefe\"](https://www.dwds.de/d/korpora/soldatenbriefe) ist eine Sammlung von 170 Briefen aus dem deutschsprachigen Raum, die mehrere wichtige historische Epochen umfasst:\n", "- Koalitions- und Befreiungskriege (1792−1815)\n", "- Deutscher Krieg (1866)\n", "- Deutsch-Französischer Krieg (1870/71)\n", @@ -63,7 +116,20 @@ "Die Briefe liegen in verschiedenen Formaten vor:\n", "- **TEI-XML**: Ursprungsformat mit detaillierten Metadaten\n", "- **CSV**: Aufbereitete Version für die Analyse\n", - "- **Plain Text**: Extrahierte Brieftexte" + "- **Plain Text**: Extrahierte Brieftexte\n", + "\n", + "### Daten Auswahl\n", + "Wir verwenden diesen Datensatz aus folgenden Gründen: \n", + "- Er ist vom Textumfang her vergleichsweise klein, so dass demonstrierbare Berechnungen in einer angemessenen Zeit durchgeführt werden können. \n", + "- Das TEI/XML-Format ist in der Geschichtswissenschaft üblich. \n", + "- Die Daten sind gut strukturiert, was es einfach macht, den Text und die Metadaten für unsere RAG-Pipeline zu organisieren." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Erste Erkundung der Daten" ] }, { @@ -75,13 +141,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Requirement already satisfied: pandas in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (2.2.3)Note: you may need to restart the kernel to use updated packages.\n", - "\n", + "Requirement already satisfied: pandas in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (2.2.3)\n", "Requirement already satisfied: numpy>=1.23.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas) (1.26.4)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas) (2.9.0.post0)\n", "Requirement already satisfied: pytz>=2020.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas) (2024.2)\n", "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pandas) (2024.2)\n", - "Requirement already satisfied: six>=1.5 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n" + "Requirement already satisfied: six>=1.5 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\n", + "Note: you may need to restart the kernel to use updated packages.\n" ] }, { @@ -100,28 +166,9 @@ "%pip install pandas" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Erste Erkundung der Daten" - ] - }, { "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "### Daten laden und erkunden\n", - "\n", - "import pandas as pd\n", - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -208,6 +255,11 @@ } ], "source": [ + "# Daten laden und erkunden\n", + "\n", + "import pandas as pd\n", + "from pathlib import Path\n", + "\n", "# Laden der vorverarbeiteten Daten\n", "\n", "data_path = Path(\"../scripts/data/soldatenbriefe.csv\")\n", @@ -220,7 +272,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Daten sind bereits gut strukturiert und mit hilfreichen Metadaten erfasst. Wir bemerken aber das im Text noch Zeilenumbrüche durch \"\\n\" referenziert werden. Diese sollten wir mit einem einfachen Leerzeichen ersetzen." + "Die Daten sind bereits gut strukturiert und mit hilfreichen Metadaten erfasst. Wir bemerken aber das im Text noch Zeilenumbrüche durch \"\\n\" referenziert werden. Diese sollten wir mit einem einfachen Leerzeichen ersetzen. Dies ist ein Beispiel für den wichtigen Schritt des Preprocessing von Textdaten. " ] }, { @@ -375,7 +427,23 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nun haben wir eine erste quantitative Analyse unseres Datensatzes und können uns überlegen arum RAG für historische Textanalyse nützlich sein könnte gegenüber einer analogen Analyse und anderen Methoden wie zum Beispiel die welche durch [Voyant Tools](https://voyant-tools.org/) zur verfügung stehen?\n", + "### Zusammenfassung: Datengrundlage\n", + "\n", + "In diesem Abschnitt haben wir:\n", + "- Die Struktur und Umfang unseres Korpus kennengelernt (170 Briefe, 87.250 Wörter)\n", + "- Die zeitliche Verteilung der Briefe analysiert (1745-1872)\n", + "- Die soziale Struktur der Verfasser erkundet (Mannschaften, Unteroffiziere, Offiziere)\n", + "- Eine grundlegende Textbereinigung durchgeführt\n", + "\n", + "Diese Exploration bildet die Grundlage für die folgenden Schritte der RAG-Pipeline, da wir nun die Eigenschaften und Besonderheiten unserer historischen Quellen kennen und bei der Implementierung berücksichtigen können." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jetzt haben wir eine erste quantitative Analyse unseres Datensatzes und können uns überlegen warum RAG für historische Textanalyse nützlich sein könnte gegenüber einer analogen Analyse und anderen Methoden wie zum Beispiel die welche durch [Voyant Tools](https://voyant-tools.org/) zur verfügung stehen?\n", + "-- This part has to be reviewed. I like how it flows into a discussion but it can be improved. Maybe by suggesting a exercise of inspecting the data with Voyant Tools?\n", "\n", "### Die Herausforderung historischer Textanalyse\n", "\n", @@ -396,9 +464,9 @@ "- Die gleichzeitige Berücksichtigung aller Briefe für eine Analyse ist kaum möglich\n", "- Das Auffinden spezifischer Themen oder Muster über alle Briefe hinweg ist zeitaufwändig\n", "\n", - "### Warum RAG die Lösung ist\n", + "### Warum RAG hier helfen kann\n", "\n", - "RAG (Retrieval Augmented Generation) bietet hier mehrere Vorteile:\n", + "RAG bietet hier mehrere Vorteile:\n", "\n", "1. **Effizientes Retrieval**\n", " - Automatische Identifikation relevanter Textstellen\n", @@ -420,25 +488,7 @@ " - Historische Kontexte können berücksichtigt werden\n", " - Komplexe Zusammenhänge werden erkannt\n", "\n", - "### Warum unser Korpus ideal für RAG ist\n", - "\n", - "Die Größe unseres Korpus ist aus mehreren Gründen ideal für RAG:\n", - "\n", - "1. **Chunking-Perspektive**\n", - " - Bei durchschnittlich 3.025 Zeichen pro Brief\n", - " - Und einer Chunk-Größe von 500 Zeichen\n", - " - Erhalten wir ca. 1.000-1.200 Chunks\n", - " - Dies ist optimal für präzises Retrieval\n", - "\n", - "2. **Kontextuelle Tiefe**\n", - " - Jeder Brief ist lang genug für bedeutungsvolle Analyse\n", - " - Kurz genug für präzise Chunk-Bildung\n", - " - Genug Material für Vergleiche und Muster\n", - "\n", - "3. **Metadaten-Struktur**\n", - " - Reiche Kontextinformationen (Rang, Datum, etc.)\n", - " - Ermöglicht vielfältige Analyseperspektiven\n", - " - Unterstützt historische Einordnung\n", + "-- It feels like I should be citing some literature here\n", "\n", "### Praktische Bedeutung\n", "\n", @@ -448,14 +498,16 @@ "- Entdeckung von Mustern und Zusammenhängen\n", "- Kombination quantitativer und qualitativer Analyse\n", "\n", - "Diese Vorteile machen RAG zu einem wertvollen Werkzeug für die historische Forschung, besonders bei der Analyse von Korrespondenzen und persönlichen Dokumenten." + "Diese Vorteile machen RAG zu einem wertvollen Werkzeug für die historische Forschung, zum Beispiel bei der Analyse von Korrespondenzen, Zeitungsartikeln und persönlichen Dokumenten." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ + "-- The following part has to be figured out.\n", "## Anforderungen an ein Korpus für RAG\n", + "\n", "- wann lohnt es sich, wann lohnt es sich nicht. \n", "- Welche Formate funktionieren?\n", "- Was muss man sich überlegen.\n", @@ -467,7 +519,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Erste Schritte mit RAG\n", + "## Erste Schritte mit RAG\n", + "\n", + "Wir werden nun ein RAG-System mit unserem Datensatz aufbauen. Der Abschnitt dient dazu, dass Sie einen ersten Eindruck davon bekommen, was im System passiert. Wir werden unser Verständnis für die Schritte zum Aufbau eines Systems in den folgenden Notizbüchern entwickeln, einschließlich der Entscheidungen, die getroffen werden, und deren Auswirkungen auf die Analyse.\n", "\n", "#### Technische Voraussetzungen\n", "Für dieses Notebook benötigen wir einige Python-Bibliotheken:" @@ -475,160 +529,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: langchain in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.3.19)\n", - "Requirement already satisfied: langchain-community in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.3.18)\n", - "Requirement already satisfied: langchain_openai in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.3.6)\n", - "Requirement already satisfied: sentence_transformers in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (3.4.1)\n", - "Requirement already satisfied: huggingface-hub in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.29.1)\n", - "Requirement already satisfied: chromadb in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.6.3)\n", - "Requirement already satisfied: langchain_huggingface in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.1.2)\n", - "Requirement already satisfied: langchain-core<1.0.0,>=0.3.35 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (0.3.37)\n", - "Requirement already satisfied: langchain-text-splitters<1.0.0,>=0.3.6 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (0.3.6)\n", - "Requirement already satisfied: langsmith<0.4,>=0.1.17 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (0.3.10)\n", - "Requirement already satisfied: pydantic<3.0.0,>=2.7.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (2.10.5)\n", - "Requirement already satisfied: SQLAlchemy<3,>=1.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (2.0.37)\n", - "Requirement already satisfied: requests<3,>=2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (2.32.3)\n", - "Requirement already satisfied: PyYAML>=5.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (6.0.2)\n", - "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (3.11.11)\n", - "Requirement already satisfied: tenacity!=8.4.0,<10,>=8.1.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (9.0.0)\n", - "Requirement already satisfied: numpy<2,>=1.26.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (1.26.4)\n", - "Requirement already satisfied: dataclasses-json<0.7,>=0.5.7 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain-community) (0.6.7)\n", - "Requirement already satisfied: pydantic-settings<3.0.0,>=2.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain-community) (2.8.0)\n", - "Requirement already satisfied: httpx-sse<1.0.0,>=0.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain-community) (0.4.0)\n", - "Requirement already satisfied: openai<2.0.0,>=1.58.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain_openai) (1.60.0)\n", - "Requirement already satisfied: tiktoken<1,>=0.7 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain_openai) (0.8.0)\n", - "Requirement already satisfied: transformers<5.0.0,>=4.41.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (4.49.0)\n", - "Requirement already satisfied: tqdm in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (4.67.1)\n", - "Requirement already satisfied: torch>=1.11.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (2.5.1)\n", - "Requirement already satisfied: scikit-learn in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (1.6.1)\n", - "Requirement already satisfied: scipy in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (1.12.0)\n", - "Requirement already satisfied: Pillow in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (11.0.0)\n", - "Requirement already satisfied: filelock in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub) (3.16.1)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub) (2024.12.0)\n", - "Requirement already satisfied: packaging>=20.9 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub) (24.2)\n", - "Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub) (4.12.2)\n", - "Requirement already satisfied: build>=1.0.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.2.2.post1)\n", - "Requirement already satisfied: chroma-hnswlib==0.7.6 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.7.6)\n", - "Requirement already satisfied: fastapi>=0.95.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.115.8)\n", - "Requirement already satisfied: uvicorn>=0.18.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.34.0)\n", - "Requirement already satisfied: posthog>=2.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (3.15.1)\n", - "Requirement already satisfied: onnxruntime>=1.14.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.20.1)\n", - "Requirement already satisfied: opentelemetry-api>=1.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.30.0)\n", - "Requirement already satisfied: opentelemetry-exporter-otlp-proto-grpc>=1.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.30.0)\n", - "Requirement already satisfied: opentelemetry-instrumentation-fastapi>=0.41b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.51b0)\n", - "Requirement already satisfied: opentelemetry-sdk>=1.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.30.0)\n", - "Requirement already satisfied: tokenizers>=0.13.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.21.0)\n", - "Requirement already satisfied: pypika>=0.48.9 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.48.9)\n", - "Requirement already satisfied: overrides>=7.3.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (7.7.0)\n", - "Requirement already satisfied: importlib-resources in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (6.5.2)\n", - "Requirement already satisfied: grpcio>=1.58.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.70.0)\n", - "Requirement already satisfied: bcrypt>=4.0.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (4.2.1)\n", - "Requirement already satisfied: typer>=0.9.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.15.1)\n", - "Requirement already satisfied: kubernetes>=28.1.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (32.0.1)\n", - "Requirement already satisfied: mmh3>=4.0.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (5.1.0)\n", - "Requirement already satisfied: orjson>=3.9.12 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (3.10.15)\n", - "Requirement already satisfied: httpx>=0.27.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.28.1)\n", - "Requirement already satisfied: rich>=10.11.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (13.9.4)\n", - "Requirement already satisfied: aiohappyeyeballs>=2.3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (2.4.4)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.3.2)\n", - "Requirement already satisfied: attrs>=17.3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (24.3.0)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.5.0)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (6.1.0)\n", - "Requirement already satisfied: propcache>=0.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (0.2.1)\n", - "Requirement already satisfied: yarl<2.0,>=1.17.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.18.3)\n", - "Requirement already satisfied: pyproject_hooks in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from build>=1.0.3->chromadb) (1.2.0)\n", - "Requirement already satisfied: colorama in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from build>=1.0.3->chromadb) (0.4.6)\n", - "Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain-community) (3.26.0)\n", - "Requirement already satisfied: typing-inspect<1,>=0.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain-community) (0.9.0)\n", - "Requirement already satisfied: starlette<0.46.0,>=0.40.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from fastapi>=0.95.2->chromadb) (0.45.3)\n", - "Requirement already satisfied: anyio in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx>=0.27.0->chromadb) (4.8.0)\n", - "Requirement already satisfied: certifi in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx>=0.27.0->chromadb) (2024.12.14)\n", - "Requirement already satisfied: httpcore==1.* in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx>=0.27.0->chromadb) (1.0.7)\n", - "Requirement already satisfied: idna in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx>=0.27.0->chromadb) (3.10)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpcore==1.*->httpx>=0.27.0->chromadb) (0.14.0)\n", - "Requirement already satisfied: six>=1.9.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (1.17.0)\n", - "Requirement already satisfied: python-dateutil>=2.5.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (2.9.0.post0)\n", - "Requirement already satisfied: google-auth>=1.0.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (2.38.0)\n", - "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (1.8.0)\n", - "Requirement already satisfied: requests-oauthlib in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (2.0.0)\n", - "Requirement already satisfied: oauthlib>=3.2.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (3.2.2)\n", - "Requirement already satisfied: urllib3>=1.24.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (2.2.3)\n", - "Requirement already satisfied: durationpy>=0.7 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (0.9)\n", - "Requirement already satisfied: jsonpatch<2.0,>=1.33 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain-core<1.0.0,>=0.3.35->langchain) (1.33)\n", - "Requirement already satisfied: requests-toolbelt<2.0.0,>=1.0.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langsmith<0.4,>=0.1.17->langchain) (1.0.0)\n", - "Requirement already satisfied: zstandard<0.24.0,>=0.23.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langsmith<0.4,>=0.1.17->langchain) (0.23.0)\n", - "Requirement already satisfied: coloredlogs in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from onnxruntime>=1.14.1->chromadb) (15.0.1)\n", - "Requirement already satisfied: flatbuffers in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from onnxruntime>=1.14.1->chromadb) (25.2.10)\n", - "Requirement already satisfied: protobuf in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from onnxruntime>=1.14.1->chromadb) (5.29.3)\n", - "Requirement already satisfied: sympy in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from onnxruntime>=1.14.1->chromadb) (1.13.1)\n", - "Requirement already satisfied: distro<2,>=1.7.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from openai<2.0.0,>=1.58.1->langchain_openai) (1.9.0)\n", - "Requirement already satisfied: jiter<1,>=0.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from openai<2.0.0,>=1.58.1->langchain_openai) (0.8.2)\n", - "Requirement already satisfied: sniffio in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from openai<2.0.0,>=1.58.1->langchain_openai) (1.3.1)\n", - "Requirement already satisfied: deprecated>=1.2.6 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-api>=1.2.0->chromadb) (1.2.16)\n", - "Requirement already satisfied: importlib-metadata<=8.5.0,>=6.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-api>=1.2.0->chromadb) (8.5.0)\n", - "Requirement already satisfied: googleapis-common-protos~=1.52 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.68.0)\n", - "Requirement already satisfied: opentelemetry-exporter-otlp-proto-common==1.30.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.30.0)\n", - "Requirement already satisfied: opentelemetry-proto==1.30.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.30.0)\n", - "Requirement already satisfied: opentelemetry-instrumentation-asgi==0.51b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.51b0)\n", - "Requirement already satisfied: opentelemetry-instrumentation==0.51b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.51b0)\n", - "Requirement already satisfied: opentelemetry-semantic-conventions==0.51b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.51b0)\n", - "Requirement already satisfied: opentelemetry-util-http==0.51b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.51b0)\n", - "Requirement already satisfied: wrapt<2.0.0,>=1.0.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation==0.51b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (1.17.2)\n", - "Requirement already satisfied: asgiref~=3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-asgi==0.51b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (3.8.1)\n", - "Requirement already satisfied: monotonic>=1.5 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from posthog>=2.4.0->chromadb) (1.6)\n", - "Requirement already satisfied: backoff>=1.10.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from posthog>=2.4.0->chromadb) (2.2.1)\n", - "Requirement already satisfied: annotated-types>=0.6.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.27.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (2.27.2)\n", - "Requirement already satisfied: python-dotenv>=0.21.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic-settings<3.0.0,>=2.4.0->langchain-community) (1.0.1)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests<3,>=2->langchain) (3.4.0)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich>=10.11.0->chromadb) (3.0.0)\n", - "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich>=10.11.0->chromadb) (2.18.0)\n", - "Requirement already satisfied: greenlet!=0.4.17 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from SQLAlchemy<3,>=1.4->langchain) (3.1.1)\n", - "Requirement already satisfied: regex>=2022.1.18 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tiktoken<1,>=0.7->langchain_openai) (2024.11.6)\n", - "Requirement already satisfied: networkx in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch>=1.11.0->sentence_transformers) (3.4.2)\n", - "Requirement already satisfied: jinja2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch>=1.11.0->sentence_transformers) (3.1.5)\n", - "Requirement already satisfied: mpmath<1.4,>=1.1.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sympy->onnxruntime>=1.14.1->chromadb) (1.3.0)\n", - "Requirement already satisfied: safetensors>=0.4.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers<5.0.0,>=4.41.0->sentence_transformers) (0.5.2)\n", - "Requirement already satisfied: click>=8.0.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer>=0.9.0->chromadb) (8.1.8)\n", - "Requirement already satisfied: shellingham>=1.3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer>=0.9.0->chromadb) (1.5.4)\n", - "Requirement already satisfied: httptools>=0.6.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.6.4)\n", - "Requirement already satisfied: watchfiles>=0.13 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.4)\n", - "Requirement already satisfied: websockets>=10.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (15.0)\n", - "Requirement already satisfied: joblib>=1.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from scikit-learn->sentence_transformers) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=3.1.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from scikit-learn->sentence_transformers) (3.5.0)\n", - "Requirement already satisfied: cachetools<6.0,>=2.0.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (5.5.2)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.4.1)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (4.9)\n", - "Requirement already satisfied: zipp>=3.20 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from importlib-metadata<=8.5.0,>=6.0->opentelemetry-api>=1.2.0->chromadb) (3.21.0)\n", - "Requirement already satisfied: jsonpointer>=1.9 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonpatch<2.0,>=1.33->langchain-core<1.0.0,>=0.3.35->langchain) (3.0.0)\n", - "Requirement already satisfied: mdurl~=0.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->chromadb) (0.1.2)\n", - "Requirement already satisfied: mypy-extensions>=0.3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain-community) (1.0.0)\n", - "Requirement already satisfied: humanfriendly>=9.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from coloredlogs->onnxruntime>=1.14.1->chromadb) (10.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jinja2->torch>=1.11.0->sentence_transformers) (3.0.2)\n", - "Requirement already satisfied: pyreadline3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from humanfriendly>=9.1->coloredlogs->onnxruntime>=1.14.1->chromadb) (3.5.4)\n", - "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.6.1)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "[notice] A new release of pip is available: 24.3.1 -> 25.0.1\n", - "[notice] To update, run: C:\\Users\\baumanoa\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" - ] - } - ], + "outputs": [], "source": [ - "%pip install langchain langchain-community langchain_openai sentence_transformers huggingface-hub chromadb langchain_huggingface" + "%pip install langchain langchain-community huggingface-hub chromadb langchain_huggingface" ] }, { @@ -641,11 +546,6 @@ " - Ermöglicht strukturierte Arbeit mit verschiedenen LLMs\n", " - Vereinfacht die RAG-Pipeline-Entwicklung\n", "\n", - "- sentence_transformers: Bibliothek für Text-Embeddings\n", - " - Wandelt Text in numerische Vektoren um\n", - " - Unterstützt mehrsprachige Modelle\n", - " - Speziell für semantische Textähnlichkeit optimiert\n", - "\n", "- huggingface-hub & langchain_huggingface: Zugriff auf KI-Modelle\n", " - Bietet Zugang zu Open-Source-Modellen\n", " - Ermöglicht lokale Nutzung von Embedding-Modellen\n", @@ -661,198 +561,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Eine erste RAG-Pipeline\n", - "Hier demonstrieren wir die grundlegenden Schritte einer RAG-Pipeline:" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: langchain in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.3.19)\n", - "Requirement already satisfied: langchain-community in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.3.18)\n", - "Requirement already satisfied: langchain_openai in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.3.6)\n", - "Requirement already satisfied: sentence_transformers in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (3.4.1)\n", - "Requirement already satisfied: huggingface-hub in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.29.1)\n", - "Requirement already satisfied: chromadb in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.6.3)\n", - "Requirement already satisfied: langchain_huggingface in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (0.1.2)\n", - "Requirement already satisfied: langchain-core<1.0.0,>=0.3.35 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (0.3.37)\n", - "Requirement already satisfied: langchain-text-splitters<1.0.0,>=0.3.6 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (0.3.6)\n", - "Requirement already satisfied: langsmith<0.4,>=0.1.17 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (0.3.10)\n", - "Requirement already satisfied: pydantic<3.0.0,>=2.7.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (2.10.5)\n", - "Requirement already satisfied: SQLAlchemy<3,>=1.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (2.0.37)\n", - "Requirement already satisfied: requests<3,>=2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (2.32.3)\n", - "Requirement already satisfied: PyYAML>=5.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (6.0.2)\n", - "Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (3.11.11)\n", - "Requirement already satisfied: tenacity!=8.4.0,<10,>=8.1.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (9.0.0)\n", - "Requirement already satisfied: numpy<2,>=1.26.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain) (1.26.4)\n", - "Requirement already satisfied: dataclasses-json<0.7,>=0.5.7 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain-community) (0.6.7)\n", - "Requirement already satisfied: pydantic-settings<3.0.0,>=2.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain-community) (2.8.0)\n", - "Requirement already satisfied: httpx-sse<1.0.0,>=0.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain-community) (0.4.0)\n", - "Requirement already satisfied: openai<2.0.0,>=1.58.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain_openai) (1.60.0)\n", - "Requirement already satisfied: tiktoken<1,>=0.7 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain_openai) (0.8.0)\n", - "Requirement already satisfied: transformers<5.0.0,>=4.41.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (4.49.0)\n", - "Requirement already satisfied: tqdm in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (4.67.1)\n", - "Requirement already satisfied: torch>=1.11.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (2.5.1)\n", - "Requirement already satisfied: scikit-learn in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (1.6.1)\n", - "Requirement already satisfied: scipy in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (1.12.0)\n", - "Requirement already satisfied: Pillow in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sentence_transformers) (11.0.0)\n", - "Requirement already satisfied: filelock in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub) (3.16.1)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub) (2024.12.0)\n", - "Requirement already satisfied: packaging>=20.9 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub) (24.2)\n", - "Requirement already satisfied: typing-extensions>=3.7.4.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from huggingface-hub) (4.12.2)\n", - "Requirement already satisfied: build>=1.0.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.2.2.post1)\n", - "Requirement already satisfied: chroma-hnswlib==0.7.6 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.7.6)\n", - "Requirement already satisfied: fastapi>=0.95.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.115.8)\n", - "Requirement already satisfied: uvicorn>=0.18.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.34.0)\n", - "Requirement already satisfied: posthog>=2.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (3.15.1)\n", - "Requirement already satisfied: onnxruntime>=1.14.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.20.1)\n", - "Requirement already satisfied: opentelemetry-api>=1.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.30.0)\n", - "Requirement already satisfied: opentelemetry-exporter-otlp-proto-grpc>=1.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.30.0)\n", - "Requirement already satisfied: opentelemetry-instrumentation-fastapi>=0.41b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.51b0)\n", - "Requirement already satisfied: opentelemetry-sdk>=1.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.30.0)\n", - "Requirement already satisfied: tokenizers>=0.13.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.21.0)\n", - "Requirement already satisfied: pypika>=0.48.9 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.48.9)\n", - "Requirement already satisfied: overrides>=7.3.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (7.7.0)\n", - "Requirement already satisfied: importlib-resources in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (6.5.2)\n", - "Requirement already satisfied: grpcio>=1.58.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (1.70.0)\n", - "Requirement already satisfied: bcrypt>=4.0.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (4.2.1)\n", - "Requirement already satisfied: typer>=0.9.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.15.1)\n", - "Requirement already satisfied: kubernetes>=28.1.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (32.0.1)\n", - "Requirement already satisfied: mmh3>=4.0.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (5.1.0)\n", - "Requirement already satisfied: orjson>=3.9.12 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (3.10.15)\n", - "Requirement already satisfied: httpx>=0.27.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (0.28.1)\n", - "Requirement already satisfied: rich>=10.11.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from chromadb) (13.9.4)\n", - "Requirement already satisfied: aiohappyeyeballs>=2.3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (2.4.4)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.3.2)\n", - "Requirement already satisfied: attrs>=17.3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (24.3.0)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.5.0)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (6.1.0)\n", - "Requirement already satisfied: propcache>=0.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (0.2.1)\n", - "Requirement already satisfied: yarl<2.0,>=1.17.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from aiohttp<4.0.0,>=3.8.3->langchain) (1.18.3)\n", - "Requirement already satisfied: pyproject_hooks in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from build>=1.0.3->chromadb) (1.2.0)\n", - "Requirement already satisfied: colorama in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from build>=1.0.3->chromadb) (0.4.6)\n", - "Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain-community) (3.26.0)\n", - "Requirement already satisfied: typing-inspect<1,>=0.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from dataclasses-json<0.7,>=0.5.7->langchain-community) (0.9.0)\n", - "Requirement already satisfied: starlette<0.46.0,>=0.40.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from fastapi>=0.95.2->chromadb) (0.45.3)\n", - "Requirement already satisfied: anyio in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx>=0.27.0->chromadb) (4.8.0)\n", - "Requirement already satisfied: certifi in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx>=0.27.0->chromadb) (2024.12.14)\n", - "Requirement already satisfied: httpcore==1.* in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx>=0.27.0->chromadb) (1.0.7)\n", - "Requirement already satisfied: idna in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpx>=0.27.0->chromadb) (3.10)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from httpcore==1.*->httpx>=0.27.0->chromadb) (0.14.0)\n", - "Requirement already satisfied: six>=1.9.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (1.17.0)\n", - "Requirement already satisfied: python-dateutil>=2.5.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (2.9.0.post0)\n", - "Requirement already satisfied: google-auth>=1.0.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (2.38.0)\n", - "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (1.8.0)\n", - "Requirement already satisfied: requests-oauthlib in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (2.0.0)\n", - "Requirement already satisfied: oauthlib>=3.2.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (3.2.2)\n", - "Requirement already satisfied: urllib3>=1.24.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (2.2.3)\n", - "Requirement already satisfied: durationpy>=0.7 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from kubernetes>=28.1.0->chromadb) (0.9)\n", - "Requirement already satisfied: jsonpatch<2.0,>=1.33 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langchain-core<1.0.0,>=0.3.35->langchain) (1.33)\n", - "Requirement already satisfied: requests-toolbelt<2.0.0,>=1.0.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langsmith<0.4,>=0.1.17->langchain) (1.0.0)\n", - "Requirement already satisfied: zstandard<0.24.0,>=0.23.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from langsmith<0.4,>=0.1.17->langchain) (0.23.0)\n", - "Requirement already satisfied: coloredlogs in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from onnxruntime>=1.14.1->chromadb) (15.0.1)\n", - "Requirement already satisfied: flatbuffers in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from onnxruntime>=1.14.1->chromadb) (25.2.10)\n", - "Requirement already satisfied: protobuf in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from onnxruntime>=1.14.1->chromadb) (5.29.3)\n", - "Requirement already satisfied: sympy in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from onnxruntime>=1.14.1->chromadb) (1.13.1)\n", - "Requirement already satisfied: distro<2,>=1.7.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from openai<2.0.0,>=1.58.1->langchain_openai) (1.9.0)\n", - "Requirement already satisfied: jiter<1,>=0.4.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from openai<2.0.0,>=1.58.1->langchain_openai) (0.8.2)\n", - "Requirement already satisfied: sniffio in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from openai<2.0.0,>=1.58.1->langchain_openai) (1.3.1)\n", - "Requirement already satisfied: deprecated>=1.2.6 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-api>=1.2.0->chromadb) (1.2.16)\n", - "Requirement already satisfied: importlib-metadata<=8.5.0,>=6.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-api>=1.2.0->chromadb) (8.5.0)\n", - "Requirement already satisfied: googleapis-common-protos~=1.52 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.68.0)\n", - "Requirement already satisfied: opentelemetry-exporter-otlp-proto-common==1.30.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.30.0)\n", - "Requirement already satisfied: opentelemetry-proto==1.30.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.30.0)\n", - "Requirement already satisfied: opentelemetry-instrumentation-asgi==0.51b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.51b0)\n", - "Requirement already satisfied: opentelemetry-instrumentation==0.51b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.51b0)\n", - "Requirement already satisfied: opentelemetry-semantic-conventions==0.51b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.51b0)\n", - "Requirement already satisfied: opentelemetry-util-http==0.51b0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.51b0)\n", - "Requirement already satisfied: wrapt<2.0.0,>=1.0.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation==0.51b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (1.17.2)\n", - "Requirement already satisfied: asgiref~=3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from opentelemetry-instrumentation-asgi==0.51b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (3.8.1)\n", - "Requirement already satisfied: monotonic>=1.5 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from posthog>=2.4.0->chromadb) (1.6)\n", - "Requirement already satisfied: backoff>=1.10.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from posthog>=2.4.0->chromadb) (2.2.1)\n", - "Requirement already satisfied: annotated-types>=0.6.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (0.7.0)\n", - "Requirement already satisfied: pydantic-core==2.27.2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic<3.0.0,>=2.7.4->langchain) (2.27.2)\n", - "Requirement already satisfied: python-dotenv>=0.21.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pydantic-settings<3.0.0,>=2.4.0->langchain-community) (1.0.1)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from requests<3,>=2->langchain) (3.4.0)\n", - "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich>=10.11.0->chromadb) (3.0.0)\n", - "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from rich>=10.11.0->chromadb) (2.18.0)\n", - "Requirement already satisfied: greenlet!=0.4.17 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from SQLAlchemy<3,>=1.4->langchain) (3.1.1)\n", - "Requirement already satisfied: regex>=2022.1.18 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from tiktoken<1,>=0.7->langchain_openai) (2024.11.6)\n", - "Requirement already satisfied: networkx in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch>=1.11.0->sentence_transformers) (3.4.2)\n", - "Requirement already satisfied: jinja2 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from torch>=1.11.0->sentence_transformers) (3.1.5)\n", - "Requirement already satisfied: mpmath<1.4,>=1.1.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from sympy->onnxruntime>=1.14.1->chromadb) (1.3.0)\n", - "Requirement already satisfied: safetensors>=0.4.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from transformers<5.0.0,>=4.41.0->sentence_transformers) (0.5.2)\n", - "Requirement already satisfied: click>=8.0.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer>=0.9.0->chromadb) (8.1.8)\n", - "Requirement already satisfied: shellingham>=1.3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typer>=0.9.0->chromadb) (1.5.4)\n", - "Requirement already satisfied: httptools>=0.6.3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.6.4)\n", - "Requirement already satisfied: watchfiles>=0.13 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.4)\n", - "Requirement already satisfied: websockets>=10.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from uvicorn[standard]>=0.18.3->chromadb) (15.0)\n", - "Requirement already satisfied: joblib>=1.2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from scikit-learn->sentence_transformers) (1.4.2)\n", - "Requirement already satisfied: threadpoolctl>=3.1.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from scikit-learn->sentence_transformers) (3.5.0)\n", - "Requirement already satisfied: cachetools<6.0,>=2.0.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (5.5.2)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.4.1)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (4.9)\n", - "Requirement already satisfied: zipp>=3.20 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from importlib-metadata<=8.5.0,>=6.0->opentelemetry-api>=1.2.0->chromadb) (3.21.0)\n", - "Requirement already satisfied: jsonpointer>=1.9 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jsonpatch<2.0,>=1.33->langchain-core<1.0.0,>=0.3.35->langchain) (3.0.0)\n", - "Requirement already satisfied: mdurl~=0.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->chromadb) (0.1.2)\n", - "Requirement already satisfied: mypy-extensions>=0.3.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain-community) (1.0.0)\n", - "Requirement already satisfied: humanfriendly>=9.1 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from coloredlogs->onnxruntime>=1.14.1->chromadb) (10.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from jinja2->torch>=1.11.0->sentence_transformers) (3.0.2)\n", - "Requirement already satisfied: pyreadline3 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from humanfriendly>=9.1->coloredlogs->onnxruntime>=1.14.1->chromadb) (3.5.4)\n", - "Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in c:\\users\\baumanoa\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.11_qbz5n2kfra8p0\\localcache\\local-packages\\python311\\site-packages (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.6.1)\n", - "Note: you may need to restart the kernel to use updated packages.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "[notice] A new release of pip is available: 24.3.1 -> 25.0.1\n", - "[notice] To update, run: C:\\Users\\baumanoa\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" - ] - } - ], - "source": [ - "# Installation der benötigten Bibliotheken\n", - "%pip install langchain langchain-community langchain_openai sentence_transformers huggingface-hub chromadb langchain_huggingface" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Erklärung der verwendeten Bibliotheken:\n", - "- langchain & langchain-community: Framework für die Entwicklung von LLM-Anwendungen\n", - " - Bietet Werkzeuge für Dokumentenverarbeitung\n", - " - Ermöglicht strukturierte Arbeit mit verschiedenen LLMs\n", - " - Vereinfacht die RAG-Pipeline-Entwicklung\n", - "\n", - "- sentence_transformers: Bibliothek für Text-Embeddings\n", - " - Wandelt Text in numerische Vektoren um\n", - " - Unterstützt mehrsprachige Modelle\n", - " - Speziell für semantische Textähnlichkeit optimiert\n", - "\n", - "- huggingface-hub & langchain_huggingface: Zugriff auf KI-Modelle\n", - " - Bietet Zugang zu Open-Source-Modellen\n", - " - Ermöglicht lokale Nutzung von Embedding-Modellen\n", - " - Integration mit LangChain\n", - "\n", - "- chromadb: Vektordatenbank für Embedding-Speicherung\n", - " - Effiziente Speicherung und Suche von Vektoren\n", - " - Unterstützt Metadaten\n", - " - Ermöglicht Ähnlichkeitssuche" + "### Chunking\n", + "-- Brief explanation of chunking" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -894,13 +609,49 @@ "Was passiert hier?\n", "\n", "- Der Text wird in kleinere Einheiten aufgeteilt\n", - "- Die Größe (500 Zeichen) ist ein wichtiger Parameter\n", + "- Die Größe (300 Zeichen) ist ein wichtiger Parameter\n", "- Überlappung verhindert das \"Zerschneiden\" von Zusammenhängen" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Embedding-Modell konfigurieren\n", + "Die Wahl des Embedding-Modells ist entscheidend für die Qualität der Suche. \n", + "\n", + "Wir benutzen ein ein HuggingFace Modell welches Sätze und Absätze in einem 384-dimensionalen dichten Vektorraum abbildet. Es funktioniert gut für Aufgaben wie Clustering oder semantische Suche verwendet werden. Außerdem wurde das Modell gewählt, weil:\n", + "- es effektiv mit deutschen Texten arbeitet\n", + "- Eine gute Balance zwischen Geschwindigkeit und Qualität bietet\n", + "- Geringe Ressourcenanforderungen stellt" + ] + }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# 2. Text in Vektoren umwandeln (Embedding)\n", + "embeddings = HuggingFaceEmbeddings(\n", + " model_name=\"sentence-transformers/paraphrase-multilingual-mpnet-base-v2\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Vektordatenbank erstellen\n", + "\n", + "Die Vektordatenbank ist das Herzstück des Retrieval-Systems. Es hilft dabei das Problem zu lösen wie wir die Vektoren die beim Embedding entstehen speichern können so, dass wir sie später schnell wiederfinden können.\n", + "\n", + "Stellen Sie sich vor, Sie haben eine große Bibliothek (unsere Brief-Chunks). Mit Embeddings haben wir jedem Text eine Art \"numerischen Fingerabdruck\" gegeben. Eine Vektordatenbank ist nun wie ein hocheffizientes Ablagesystem, das diese Fingerabdrücke so organisiert, dass wir blitzschnell ähnliche Texte finden können." + ] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": {}, "outputs": [ { @@ -913,11 +664,6 @@ } ], "source": [ - "# 2. Text in Vektoren umwandeln (Embedding)\n", - "embeddings = HuggingFaceEmbeddings(\n", - " model_name=\"sentence-transformers/paraphrase-multilingual-mpnet-base-v2\"\n", - ")\n", - "\n", "# 3. Vektordatenbank erstellen\n", "vectorstore = Chroma.from_texts(\n", " texts=chunks,\n", @@ -928,7 +674,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -940,7 +686,7 @@ "getreuer Man biß in den Tott. Hertz Libe frau ich bericht dir auch daß ich deinen an mir geschribnen brif von 1. Mey hab ich wol erhalten und hab auch darauß erfaren daß ihr noch alle gesund seid und ist mir ser lib geweßen. ich wolte noch gern viel mer schreiben aber die zeit will nicht leiden und\n", "\n", "Ergebnis 2:\n", - "getreuer Man biß in den Tott. Hertz Libe frau ich bericht dir auch daß ich deinen an mir geschribnen brif von 1. Mey hab ich wol erhalten und hab auch darauß erfaren daß ihr noch alle gesund seid und ist mir ser lib geweßen. ich wolte noch gern viel mer schreiben aber die zeit will nicht leiden und\n" + "si seind noch ale beide gesund. Jogen Olrich und Haferland laßen ihre Eltern auch grüßen und si sind noch gesund. Mein feder Erman schmit lest seine Muter und schwestern auch vilmals grüßen und er ist noch gesund. Mein feder Bin auß ungeburg ist auch noch gesund und der aus Werben auch. eß ist auch\n" ] } ], @@ -966,9 +712,27 @@ "- Die Datenbank findet relevante Textstellen" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### LLM und Retriever konfigurieren\n", + "\n", + "In diesem Schritt konfigurieren wir zwei zentrale Komponenten unseres RAG-Systems:\n", + "1. Der Retriever dient als Suchmaschine unseres Systems. Er nutzt die zuvor erstellte Vektordatenbank, um relevante Textpassagen zu finden. Dabei:\n", + " - Wandelt er neue Anfragen in Embeddings um\n", + " - Sucht nach ähnlichen Vektoren in der Datenbank\n", + " - Gibt die relevantesten Dokumente zurück\n", + "\n", + "2. Das Large Language Model (LLM) ist für die Generierung der Antworten zuständig. Der Parameter temperature steuert dabei das Verhalten des Models:\n", + " - temperature=0: Sehr fokussierte, deterministische Antworten\n", + " - temperature>0: Kreativere, variantenreichere Antworten\n", + " - Für Forschung empfehlen wir niedrige Temperature-Werte, um konsistente, faktenbezogene Antworten zu erhalten" + ] + }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -988,13 +752,13 @@ "Frage: Wie berichten die Soldaten über ihre Gesundheit?\n", "\n", "Antwort des Modells:\n", - "Die Soldaten berichten, dass sie und ihre Kameraden noch gesund sind. Sie melden, dass sie die Briefe der Angehörigen erhalten haben und davon profitiert haben, zu erfahren, dass ihre Lieben ebenfalls gesund sind. Die Briefe stammen von Man, Jogen Olrich, Haferland, Mein feder Erman und Mein feder Bin. Alle berichten, dass sie sich und ihre Angehörigen gut finden.\n", + "Die Soldaten berichten, dass sie und ihre Kameraden noch gesund sind. Sie melden auch die Gesundheit ihrer Eltern und Angehörigen. In einem Fall wird berichtet, dass ein Regiment 12 Tote und Etliche 30 Verwundete hat, aber die meisten Soldaten sind noch gesund. Es wird auch berichtet, dass es regnet und es Wasser auf den Feldern gibt, was vermuten lässt, dass die Lager mit Wasser versorgt sind.\n", "\n", "Verwendete Quellen:\n", "- Quelle: getreuer Man biß in den Tott. Hertz Libe frau ich bericht dir auch daß ich deinen an mir geschribnen...\n", - "- Quelle: getreuer Man biß in den Tott. Hertz Libe frau ich bericht dir auch daß ich deinen an mir geschribnen...\n", - "- Quelle: getreuer Man biß in den Tott. Hertz Libe frau ich bericht dir auch daß ich deinen an mir geschribnen...\n", - "- Quelle: si seind noch ale beide gesund. Jogen Olrich und Haferland laßen ihre Eltern auch grüßen und si sind...\n" + "- Quelle: si seind noch ale beide gesund. Jogen Olrich und Haferland laßen ihre Eltern auch grüßen und si sind...\n", + "- Quelle: gekrigt 70 fahnen 5 standarten und 5 Paar Pauken und unser regiment haben wir 12 Totte und Etliche 3...\n", + "- Quelle: es ist uf flagen felde daß waßer gekomen uf 2 Ele hoch da könt ihr leicht erdenken waß daß hir vor L...\n" ] } ], @@ -1033,7 +797,7 @@ "\"\"\"\n", "prompt = PromptTemplate(template=template, input_variables=[\"context\", \"question\"])\n", "\n", - "# RAG-Chain erstellen\n", + "# RAG-Chain erstellen. Die QA-Chain verbindet alle Komponenten. \n", "qa_chain = RetrievalQA.from_chain_type(\n", " llm=llm,\n", " chain_type=\"stuff\", # \"stuff\" kombiniert alle Dokumente in einen Prompt\n", @@ -1041,7 +805,22 @@ " chain_type_kwargs={\"prompt\": prompt},\n", " return_source_documents=True # Quellen mitliefern\n", ")\n", - "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Jetzt können wir eine Frage stellen:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "# Frage stellen\n", "ergebnis = qa_chain.invoke({\"query\": \"Wie berichten die Soldaten über ihre Gesundheit?\"})\n", "\n", @@ -1054,6 +833,23 @@ " print(f\"- Quelle: {doc.page_content[:100]}...\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wie funktioniert das System?\n", + "\n", + "Unser RAG-System arbeitet in drei Schritten:\n", + "1. **Vorbereitung**: Die Texte werden in eine Form gebracht, die der Computer effizient durchsuchen kann \n", + " (mehr dazu in den Kapiteln \"Chunking\" & \"Embeddings\")\n", + "2. **Suche**: Bei einer Frage sucht das System die relevantesten Textpassagen \n", + " (Details folgen im Kapitel \"Vector Databases\")\n", + "3. **Antwort**: Die gefundenen Passagen werden zusammen mit der Frage an das LLM übergeben\n", + "\n", + "Für den Moment konzentrieren wir uns darauf, wie wir das System nutzen können. Die technischen Details \n", + "der einzelnen Komponenten werden wir in den folgenden Kapiteln genau untersuchen." + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1083,23 +879,23 @@ "- Kontextuelle Embedding-Modelle verstehen häufig den Zusammenhang trotz abweichender Schreibweise\n", "- Die semantische Ähnlichkeit bleibt meist erhalten\n", "- Multilingual trainierte Modelle sind oft robuster gegenüber Sprachvariationen\n", - "\n", + "-- Should have a source or relevant links for this.\n", "#### 2. Retrievalqualität\n", "Für optimale Ergebnisse:\n", "- Verwenden wir semantische statt lexikalischer Suche\n", "- Achten auf Kontext statt einzelne Wörter\n", "- Profitieren von der Textvektorisierung, die ähnliche Konzepte unabhängig von der exakten Schreibweise erkennt\n", - "\n", + "-- again maybe references\n", "#### 3. Forschungspotential\n", "Die originale Schreibweise bietet sogar zusätzliches Forschungspotential:\n", - "- Analyse von Bildungsunterschieden zwischen Rängen\n", + "- Analyse von Sprachstilvariationen zwischen Rängen\n", "- Untersuchung regionaler Sprachvarianten\n", "- Dokumentation historischer Sprachentwicklung\n", "\n", "### Beispiel: Robuste Suchanfragen\n", "\n", "Mit RAG können wir trotz historischer Schreibweisen effektiv suchen. Wenn wir beispielsweise nach \"Gesundheit\" suchen, werden auch Varianten wie \"Gesundheit\", \"gesuntheit\" oder \"Gesundtheit\" gefunden:\n", - "\n", + "-- How do we actually test this?\n", "```python\n", "# Beispielabfrage zur Demonstration\n", "frage = \"Wie berichten die Soldaten über ihre Gesundheit?\"\n", @@ -1149,20 +945,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Übungen und Reflexion\n", - "\n", - "### Diskussionsfragen\n", - "\n", - "- Welche Vorteile bietet RAG gegenüber klassischer Textsuche?\n", - "- Welche ethischen Aspekte müssen bei der Analyse persönlicher Briefe beachtet werden?\n", - "- Wie könnte die Methode auf andere historische Quellen übertragen werden?\n", - "\n", - "### Praktische Übungen\n", - "\n", - "- Erkunden Sie die Metadaten der Briefe\n", - "- Formulieren Sie eigene Suchanfragen\n", - "- Vergleichen Sie verschiedene Briefe desselben Dienstgrads\n", - "\n" + "## Praktische Übungen\n", + "-- I think the practical exercises at this stage should involve: loading the courpus into Voyant Tools and exploring it, what can we identify and what is difficult to do with this Tool that RAG might be able to help with. Another one might be to create historical research questions about soldiers experiences during the time period, pose them to a LLM and evaluate the responses, see how different types of prompts might help the ability for useful answers to be generated. And maybe a third one would be to look at a few example letters and think about how a having a complete perspective of all letters might be able to help answer specific historical research questions." ] }, { -- GitLab