From 34f863a18d5c317e1a61ffd1872c235575b9ade0 Mon Sep 17 00:00:00 2001 From: itisar-345 <143781880+itisar-345@users.noreply.github.com> Date: Sun, 4 Oct 2026 23:15:26 +0530 Subject: [PATCH] Add README screenshots; fix Hub reload and slow GraphRAG answers --- .github/dependabot.yml | 4 ++++ CHANGELOG.md | 5 ++++- README.md | 15 +++++++++++++++ deploy/Caddyfile | 4 ++++ deploy/lb.Dockerfile | 4 +++- docs/images/decisions.png | Bin 0 -> 155632 bytes docs/images/graphrag.png | Bin 0 -> 153531 bytes docs/images/review.png | Bin 0 -> 94781 bytes 8 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 docs/images/decisions.png create mode 100644 docs/images/graphrag.png create mode 100644 docs/images/review.png diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 09e4e38..08c1bab 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -22,6 +22,10 @@ updates: directories: ["/backend", "/deploy"] schedule: interval: monthly + ignore: + # Caddy 2.11 cancels proxied requests after 60 s; see deploy/lb.Dockerfile + - dependency-name: caddy + versions: [">= 2.11"] - package-ecosystem: docker-compose directories: ["/", "/deploy"] diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cc7ed6..57db7ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,10 @@ Notable changes to Knowledge Hubs. The format follows [Keep a Changelog](https:/ - Backend dependencies upgraded to current releases, including FastAPI 0.142 (Starlette 1.7), Pydantic 2.13, sentence-transformers 6, NumPy 2 and Celery 5.6. - JWTs are handled by PyJWT instead of python-jose, and passwords by `bcrypt` directly instead of passlib. Existing password hashes and sessions keep working. - Tokens without an expiry are refused. -- Docker base images: Caddy 2.11, Node 22. +- Docker base images: Caddy 2.10, Node 22. + +### Fixed +- Reloading a page whose path is also an API path (such as `/knowledge`) made the app show "Failed to load knowledge": the browser reused the cached page for the app's data request. The web server now sends `Vary: Accept`. ### Removed - Unused dependencies: `openai`, `tiktoken`, `aiofiles`, `python-jose`, `passlib`. diff --git a/README.md b/README.md index 9447a7c..b04db03 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,21 @@ A **local-first knowledge base** for teams. It turns meeting notes, retros, decision logs, documents, web pages and transcripts into structured knowledge (decisions, risks, lessons, how-tos) that you can review, search, track over time and question in plain English. + + +
![]() |
+ ![]() |
+
| Decision log: status, history and what replaced what | +Review queue: nothing reaches GraphRAG until someone accepts it | +
SF(s?+sn5!a;h9Wkje`e`BhiT{WaOcvJQfl4H(1{e%dL#dV`z8L%BwLF5E*vO!R&N00$r|K~|cgznG&prrNppj9= zPXQy=KDl@?N-9vFtfcYUCP;n%k~FSy(<%gNK~cLK%_*Y?>|f@V<%e1DVJbJ?aG*3I z);nF-J3W)saaacWY!8>s8oQDdBQZo7A$HCCTC)77m1b2I@OD+(3B}sQMfw^it|G`T z(TrNwI9z^|Uj}^_>2w>*$QZ=cF`B;vu#f=8M?jjzRw*hJ&>GH2+Es>qehV%g;4m#$ zbrD8FOHz!15BcYS7{(tkkc zl`Ta80AV&?W{apD3Ub0M^xTh7)LuR(`oCkH?2g@8OR=;bR&HRL#AEI2A6t(Y(`A)0 z`J7fh*)8UHjGky%7*-{EyEcM?2>&}Yb2=NXH#My;m z!*Fo&OJY>f5@_qLTXV_+iDRN?exy|Wsx#}mwXktG&AWe=st$!^EeOljT(u+udipX1 zi);dngZk+#c@sSp=#1;5YceI!MW#TZ?_|^h0tVUN -akLcs4fmf950?UG=ZR&U-_F~I ze%4cj`!IQ1GBpxuba-a0@0|rIhqhTM7(0KR*{Wii6=1t9vck{(+%d==D-m)&xf=y+ z7tv1!J`E%?V1$_))3Z0|3)JV8rfoV87eCF&X|Pmy-)wy4lrWA n7jVwiUX zBS-9hh3SKwWP7h@S%MVQ3Dlgbt7k!mtmxtq 38*`QVB)R&mp5@N=&gE6a zGX)IG?P@kQ$TgWF6E`9(h{JPe#^E^Q((sJS%Ms2t?@{NzFKI&GU0cN}1OIUB7~$US zsNaC&&X#q~=h-pM0=djN=g)0Ho7leLAkz-{JjGfwb9O0~r@q-iz@1)HLnUZ3e*SK( zkr75PnZrp{(naf)uY;7uk?24CZj{O&*NG0Pe$_lF%ob7Lyx0^S+E5LMDAjWs6v&Wo zpBbTqiq_MIChKxBsEcyWoXF9 yZ2f8jl9VgLin!4H8!>R&)&rRVlKxi;sAwK_7 ^=B=_n3YfhCvP%1P-;yRa%4LU)&-O_VV2}(9!Zff%C{r?(2}g>%H(7w&oh? zG`^!%;G-it|4bFa@4Nf_(5ls~U8aJC@AB%TY1I$c{P-8A%z)IiBC51dD)WCZHB%vG z4OG ~nsz znkSGOiLo2(#l4fU#p|iIHdI6fY?*2q_wzA1a>3L?ggjmLXc}_*EWk8S`tV_55>$_; z!~THZ*J)-5sLGChKw9(s8XYC}u#MOcAPvLZ#qhd`93BoiNTCj^9|5T&!_F4de4$Np zL~tt%mwCY8PrC?JKeHNIo)UXuxF%iOkQk~R9H%+r`6YN<$Qop+Ua{i+An(s5xI424 zEs6n)8-$Hw*1382@m3E%*UenOYO9<* tLOrbF!r%Y1W%iq0S8ousOVTJs)D;9suabG9Go*)<{oh~WR?a8 gxTP+d`kPr7wH^NZ^<37O{t(-Eo7|6f``n{ng1*W6t0T%akrPuRSlq zvJj$wt_{PknX6q@Z`i$BnCQRT=mVup+h_AZDz?Gv*hVP}(#NqC)?n?A9?kVv1U$Yo zb (zfrSIAxzNGw$!MNw;G@CarthHDITT94?4ufvL* z5L)}#D$=_4ZQL^&pqQ+-w8Qyhilt{f>_1LsVcZ;?n;aqCuDUUw`0F0053ik%T;s?z zSId!bslA!@e`5h#mz*ZMSiabQ@I1^nMY5|> -!y2!^#5p!0;M3Z~F~d@oD$nJJv|X6XWqV zlo-x}^lxjGha{P(K)uPhEG41>@`c1ML0ugMBd*;Fe$RR~%8?DU^Ka1NXYIPiZa8kt zEQ}QdGalCsZkH?UX|?v&*(Cj4SDEL-b)45)14c_7v-~OY<{>F(3-$U9 Gy zV|VT&n}d=nk?RFhwA9eeRcw_YIr#_lM{rRSKFh6+2x6KY*RRn6Upi>$Ss-0viB0gP zKDP`cjNoSerBWMFCrRqw=r+HyJDQwP)IqxvE_I-BW z&@%`$#*N^2bWbIGcir`OGh#1oj+>NLHEJq(HU0^=yGw^tMRa(fI76?F76T*1%zayW ze`zjtMx?hqRsz;qs I8;FD3AzR6X#K5ePGHmWc Jj|i{NT-Tv%F>a2yzSZC OJK-^$Y^XvLLuyOK&mH5| zw^zV+h3K-86wyf~sMD#q7Y1_PmfX#D?UiFMlfVtJPBFeS9&qzG_*GHPLzQ^EWYBv! ztso}F8!&5r)WZ4}$$M*G1JqgtxVDWUN{9%h`vC!5Jgm3|)ikqUDqO~fvS36WO4j`A z;AV0`FX};QYWi?Lv$KCupu;syG*l2(ix8=Z`K{p>?e^im^%9OX*@q!Sj1@A}I;N|$ zF0x*4yy`dvNZhf7v^%KWNMGCS?H7C#)be_kFVN%`(~WlC+pkerJ!aVp>EGvgh&h6J zye6za9`_|ME)^jJl<{KvXaglQ3JETJ5w8kMpV8ygFwDM~4nUsvHjyNJQKg({nqF?A zE37}#Exp jcJVhB#EhOA>YTa9<6oKc-7PtiRO(MZ%4oR; z#7CtAw1e^q;2O#jgG(x4CPVD05)Ep1 l}P{H;(aoAd0P@X)XEVw3F-BD={m%^(YEe?wLe*l zA81r2fOsA?=6eE9Epwb*6~@mPaBYeP4rQVa5=j~ISCC$eHWuV8oyvqI`&Y%n&x+UF zeJ^$PNoOPbA4@3Lbolq8%1Vw>VHjTS1ZvMy7FTyv2s4nz$sSA9-m~0Rtg2`lZ#?CA zO0=N<6{XsrFq?8+nFze$_v{i5gHDoiUVAHic$%A5rPbA6@e!n@t7yctZ(fIP|7ya? zVvMyShy3SSUNr}h%BA%0^!JJ}MODhnk-v>RAvB&ZWAktxsik_$Q8@VoPWRU-%Vd{# zCx?jA?mZALKKf31?jokOj;-~~2&o8$GM)CP!!0jll^D|RD|JM?-{1=Hz{M5v!XD36 z-aZmKBD0YNC*Sl|dv~)0X|9O@vI}G70pF6HE?y|c3BRpwNE!&y *K(%5t^Q)rUn!R6^g{*f8Xcpkv7$R4eR=#@{>jmf>$35uo7y8-kxqr+Ec$5i z?Blmgn}#i>$agvwtAP$W#t3ROWUx0}>j|+BP0GWO$yG;(^AdtqDys&jaoENIg(ylw z2Fly`&LN#PE0FggJ~*B*MY-@pzGL3Dl8#v%W93dx`X!h5yQDWqnP<1m)9I#b?Y8cy zX}*;Ms@nAmrV+muIcSkud;9kfNw$F$>ldS!Ed(bLcawMt{T$g*ynl`bKaHPy>|EQ2 zV`2&M?Y3C)H@ya(s+D$j26B2 X`3{C)50%`+^!(;<) zp*frjXlv>^Z>sLsR5#yF5oJREPvcGeJVPL^Ng|zuD>N=9v;-0~t4@nCciL#LBHBAd zcdaKh?$S2UM;THzsLHVWc1PC)By|v>z&(O6o4Co&P4deL7LqkB$1R1%@EZD$Im30e z@Kc#wfOw$QtNGI^Eps3a*ahR2-Sn!-(y>Her_5{$z$}!9tWxFNK+33nf}%*h9)lc} zWAFz_J!JNOxX>oyZ^CN?7&S{KKBD?Xvvz&vn1(6R9fNlxX{=&psx@(MFlJTy!j1Zr z?f+@#ISid?+qkD@a5f;1DM4s~uEn|!7}ie>!V2~;!9{Gb(?UgWrkR?u3s!trB#8xi zDk8>d{}p>nTi6JIR9ha)hScCOFfiFJHVTu%jm{nzmUKw6x}Ng!KP-3bit6vKb~(;{ z95?WQa(BBa93nhbqu4qC4+tyQvq;9d$PFo}k;Ys}jEDUEm;i&tQjy7MYdO`R#(GKe zrt2oVe5sD0yA6pRQSa7L%t(HG^>E2QIUhb(VS|INm%cjyIrR`rj$d0he1v3fzZIeW zDMUQ=+|2{=E{7y8VRr{Jj9fWJQ&>OFBVd$c{i;cqVPI)$q%+$E=7wZnB|rpQnhMEf zqDsVEYcKoyOLFK(ha1fr(SkD5oG_aSk@zGUXuPlw@j9yXWo7`tzQjy6U1yi_3^>~s zVL_H3k)l^=PCBrn@YGy2Bd=x&4+=qkW3=k35FH) apF*vBTGW7~~eIkEhkqR!X%ljm|?>Azny9#yz5RHkkC5pLX7 z6DJipXdSJ157crn-A4q6c=Wq}qvNK)-~U5n9Q}3Ko|%lT&c!tzV$|(~7=0!{F_- zM@;RDP*bakk|#^!fmYe1Q!H@u!^FwMpn}swZLp|l?Nxc?cY@-X5tY?LMJ93j{EAzJ za&e92RM9q&pd%RMhdt57%%E{9;&b6Zp0MS;cUxfJ- Dw)5Xb7IGF7|5(n5*tc zJToGLn|ctW&fcWSVNf#=GYa EDYuLXIK$-O%2o(T>&F062@Z&M|ec+zn3d(Y`( z4(j{9h(f;~bE#X;N&uX?Z=DF7z&7hSlPB5JCOtEYvMX8|+;84_Fjmz3e&|e~Z3Pw) zFjyq`WyTF~2y`4#E79}0cBVQ0MUY%una?YGzgKC}5(PXVisXKG3wYLD%+8^h4Td&j zKu5!vKKIXxqAgA`s|&QW_#yt=s(h4?vS9jWi+e^t*LAr_H;u}z`fP>hWKR(bK^Mz+ zR2&&YR$scuO8-sv;2wal6(Xz5#eniNb>epXD7}tmGf8lHSx1+$l{#sESFEKRd}nFj z3z$B~bg!<4D$8)rwda)FnyqCI&D69c7dO7#wXlCg_i1C9u>x^om1$@7kb9txZ6HLi z@$u)QoPl(KxKr-M;K|X)gD^$5lqTP&Uj;m#@bz%I?)D<4aF?4i6z}K@PIMNOhlL}8 zD)El~#IDwN06VvErZVz)$e*S4rVU8{A>ZC7{5fp!zWLOjb-(QSr(ulb=Bc3q&QFR8 zM3S7Msv=Q6*IfS@ymiH>o)XD?-9<_>Ek>+7zJ8$|)DleDk)N ;kO0i^LaR3a9ZZ8VX?0(qGcP (exHdysJSSuk*2v$Xt()Qd` zo|)@ld^T$0fHmW=8E+T4S~IuF1yN*r7FJtAUOfF}gvvay1(8hugxVQ16*XHNWkS~z zPVIBWug`rSb2Lfjv;xE^Xh(-=om{Q4CK1S8HG)TupQl<%6MLp8n*f^P+;y}{5FKqA z4HwdqQ`vZTr4qMqpzA1N(??7-c2xuF`KjMxgXk|#U(~kHC{(+gs&dQ#-84sP@oF66 zbfsl+N&rNcqK2PPFf-DBy|;JYf1D6Zd7jemSl%&;M0p(w{k#6x0|9-5(fneCk+9?_ zm#JG cSeCR^ ^qVQ4yYN2kEx6A_b>yzvj0r#nQ$ L zq0y{`e 6HOBI`rc3ow(Mnlw z&M7cIGangDw8IJoW$~r;WVwAg?#@O(+q>bRGa?Np1^HhH+%C*gPT9}AMNmgSm$!>g zgw{+=d9ag|WtycLgI?(lf4=tgCUUA4V{K7IaaE-pgiZG-f8^41=sT|h)t3?&^aatB z=*dXAn*z{zmWr^zU$@YpCYEQ{8Yz!b2d=PMZ|?zP2xaD^|BeNvsuT_dQ;f2uI1ebo z@rb6Sviv?l6b#^ (UAle+KYH`|p2*;>(S!9edryuXz}Uc12~WjW^o) z*QN1pg`7 OM;k6f*3+ 9AVyW3p>)*UM)C7|6zHI6E>a3FIe3#oZU+D!jj$Rg~$5055Jq=Ap z+oQ#|01+uLV*YW)u8wi1F!(_HhBy?|6@KYK7)BsLJNlOx;5Q#SbQyr*v$K^C3U|z# zG=+0LMl*?C`ow}i7i_Ei t#MwQ4OCosYY(ytQ7igd& zsPo9;v@xh8F*M=L% ;=ea_4%M zhC`!v=FG(E1bmE`r)gd4dJG?olF;T2;UvNkJ>og!X}AlVPb>Qd+`JrGquHEJ#LqGg z6 YMhbh|KJM+ zg|ki-p&L^gCRf+^Y+r4^1r?W49tLbJhfs(Hcc31mr|8ufiNU&mXmY}ysDvZ7ML0*} zhUfp{LF(Rz8xi7t^zLQwXr23wexin8vCsNyy{H{x_V?3Y>nrx~!!~_)$IVeBKOxxF zaq0`q_KwF;%VSW&x{Qy%gdbS{1RIyk-V^ZAiY+H@=EV|HL{Iu+bIQ}erbbKP{WkTn zUY!j*h*j1lYkn5lMN;SRq`Z<+eJxt-a{@Q+X+?cn*S q(*_doR~Q_s#JcnlQqdz}m-hqAkzIlXMRL%M1Tb`@@srXIN%SZj({M z(iX1hkLy}I*yZSn1pg6({CviC5~qC2@nk~+hA!O;eCBF=UAL_S7$_LTxAvHc5r8Rk zSqR$~4j)>9LyLGMP1t((mHmgd<9U-2$}ON&eDbKcyh#Iej#Za}n|lIXJ)YXrQ&yDC zK|;1^ZE#ypZ-7Gg)%@|7A0Y^-@N9$%l%s5fGfPAdZmX$;pCNKd6u~hq@lFrD#XyDU znqJ>+>P=o#F~xj&HO6t=^OJyV`bOKV=DLz$D8bQvaiM()!m;p+w-n_lRQUGjnYYV? z&uRU#!TfFele(WmK!{B=L^B|_u8xhAR-XuMS}>(79;%JWs=+^ocziI#)Yhn&d+;y4 zr>$c9M@VQEwYwLeXWu()V&Sv7v35Rq2~_jATir}eFDqe&=>wDGb4L0j95#zFc5WrM zJ-@n5rye2n`2;SmNZZjPbkQ+tlkhY2@kK>p$xt=V*Za9+3g~#tYC3+m+j$umS?aQH z^M&K!QU2Wi(;P_s*^|iexUD&Y?2leupJ>4xne&xI9Mm(b7dzN#&KGyac4Gzp=-DAk${cS43nlsYnS zsDHENmH9agvQivdN<(RgCf8zd{)iGEOH6CZLIB3nElyF9vyjK){n0*?llLPOFv$@L zsHZ6zxsz9BJI+!0!~Lig`7p#6BRZi?o4MW$#6XP9+p6Q`6}J(Mexoq5LX97 +?TGrm90Fv=ZdKNOi{I3balK8CBR9UePFSURnXQFEIrd!xlju<5{3_>f zl{>82ZVSbdf-BOeo~Vd9Y|9}J-|bYUzVI2LCLFJHw>=w<7etiNkIMc=KnD9^M(7z` zOV`%0U0E%0QC5b$BD+!7oTV?}#*`SDjExFLeUl=uj7aiotJJyeK>PU%E_e)#`mZNu z)^r?T6~u0eTzx;Ku)Rh?v2uQICq1!z2pk~{sne7Vfi|tHkmIA#eiX8pNG>Bx#-Iuc z5ZE;zQ7N >N!$g`XJk8VD5y;RTpiP_5lOZLo!oR_7aMt17UQb3ktP+= zb0_P&XNpxeCuR2L^$|P?tY7R#HLNMg`B+YO_+V^Y!PvNwskU)m!>@W$vM>@KM=?JG z3(NVb$Pl_~XVwQt8EL4#aPcmp__a(74snpv5Bv35*xhj1oa#Y_doCLVAZZ-U ^ToazLZxbtREC0?KhI&H72x{M>NExR;ufP{GjO6cJ^ZL z%VEA%i<-MJ!s#(>-v{?f$OIP4&G;D-8BE6ttzz0WD=$#W66hmKd)YR*e3HD?8vewk zmYjM+bUYVeV(rOpEBuCJHt_~_U54pSJ`P3VC~3_;ei#KAFpS`CoddQmjgp}Q&33{j zL@6%sC-z!GdaLQ~-uO`~I1CR1?FoxBbR2Rj`OyDtvJ}}EtII ^+PA7hkfsmIVT@H nSqBjS cR zB$Lp@=v8e}-U94{Y(MIB4E>_XLprTJhUIP~T6U )L&2j%kUT>kF_x=vFxn!R|MP zxc21 >2P(LiLJczk}q6(P!Oyu;xxyyz+WF60X5e9BxKDAix^m13ss84@XEYD&qCi# z_=HzKh76n6A7Pc1Uz2ufEfBDoPGX+XpK!$YZaj;qQIqK3B$477IwO|)w?U#U(bGc8 z68S^|?O6As%{+y*F_n%Yo^ZS&0yTnnF|YL`Dl))4^hDwTlfs0Xl^Ev-US%Yw#T1O% z+UN3zsx`wPYJGX0cuuMMkuZ?~4OQLpyTs%+`Vut{+vXw<@Lgk!j%0w!k^Tv}aCKla z^}8ZVF9J$nmCrvCkbv01X!pI78Eb^(MhF)}>J&H#Z6JgDb$GT;n3~yQ#p`)rAX8TK z{&rVveiZtIAk$ZL>FzwVBO3YsVx|EUljR`Hc@lc0o!=*PdUE2)usRfr9H|wYiG#HE z;llUTg@R6qZl?;obp7O36 p?e*Qm%(m~hC7F&b7VyxvS~B$8~ex*B9|`D~EZ z4CHoB2a5EWATGuXxTJf>>xv3$EZmN^c=OdHAW$nfcIQiA3wKvr^B8Pq?~1ovic||_ z-A?Tf28*#o7H?%wcJZsC6P1`q2DY<~`bsJo%LM=Qbzzk9xN3E6cg8cxhc ^Prex z{u>Y>wME>0-=k12!GPeSa+iO^)XV!o7boN73Wjjn*~LlAjes=D><-Bl7@u8sorH7z zQcgK6929w3N8y$i3fHQJUgr`TzVEJfWZa%{QjkaNYYFCCF}nCH0j?NZtFity?%J^G z5$!(xGW678_*WqW6rxjPa8lEU>v~JQ7WbjGU#*r`_RfKru^t~ AXOxOd|d^y;_@8%)Y-SiHv+eHXT#e;s*Ft)`r_WR zxXp1^mcBVg4k#?{ix^JbW)6MYJ7$(2=#yDam2uddlFVNvls?7R^5!b+>5VdNJtuFj z4!%v-^Y#PA24SI@cc9KY^p^=CZXe`~!ZZ?wzsR$HYkfk36Ucl%P_6yx>w328dN18d zoiXbCL$cJQt;(}Hj~uLhe8R>dalcJqKARqLx-x9NdscqLREigJvp!zPKDVSF@U5~> z#yVlgK w#&BYr??Ko7P*&vB zh=q{w0{)ce@qjH)buB5P&((6XOZZ3j`BW%5q%4Xkg8J3C;uVe2e9s-_u3tmb1*uZg zq=*$@=M@9J^R(2QiWL|GbC=u#L`xfTnR~}G?b+h-=Bkr*^J$yf-TL|s=~@-Xh>;o0 z=29Gk|HT4a&T)KsW8HTOM`1+pD5rQO>n%;-WRp#93~=&DTk3FG%O~NEUjI01hoa>Y zN-;yy%qE{_V6J)cG)T?O%39l6eGb_AvMvuiN(p=byfF$XNzF0yH7g#h{z1Rs8l|;w zkLJ@4{1)5Xvt4t4-PhQpx#Pd*<)t$G&2gf`A=89gjDL?&x|4L{L*y(6rIwxph6jRKu` }8WOEdZ^_9o=Jr&b$tvD8FtD12Uus^Yc0~Y7 zBo}uij6>d~e+QEz?m@S8tleAm?kqp?EOqhyK*342(CHsWjUMgzR23dnX6|kV-=M84 z>PJqFa3AG~f+P}2rDzqhR-kFSxQ4ii0;?47?gsaoBsid2X?fL0Bl6q$!3z6TH@#0( zaRjY(Gn0m>Y`N9U8N!1uz-%T?LzhbK)qL{tQjESfIa|cUK5&PY =pt=#)lbMW U0SO 99+*ek1)IZ;z;qY1h-p 9C4Ps >E{N>}@=6jynh4j_0Wp}EE zocq>xO64-DXvY&o^npI@;(foodYw+O{8d9lV^(|IX|gBKe%Q5C6_1H!D>^vvL)~+^ zSC)oiwwJ-+Ub2T=26()E^YX*UW%J^%{Sf u{otS7mk1{!Oa~YgsP$ z`TKJ@=>hsnccW)}son*9P!+QU5W&l93$5$3c3uE)q+VC=P)o`&6j @aR;hcxp zaoXBvk0?Zs`MHHbI-e)NQJzalvy<`EC6VmmG+l#IUswO5WJ*BYH0C`tw=(#NaiD~>&51w2gN zUSIASBH&1D`I((9&DBq&g;P2wR?4gKM^m@s=FjGN-p%T^kk8AD<*_!a+MSI%ZuI5` zn+CFf2qZCFEJ}%MZZ^08ni6hP6;8#O-TyfAUk*D)=a)04V8yiP1_DKQsTgK93tdlX zQr#xakVE;L5A|{kheB#|%=1iyV-DeAQ5c@FF@p8A-$cVGmfKGiT*BrsnS!p%phJZg z7bH%EcGcvp9`l}^3rdeBLS8)Ol`EcKap}G}C9B<-?MG9~;jgFl^$TBu2jd%Y6H!=^ z+TE9*OUS6!%eh_1^7n#zxqS7bb%)Of`|0(-lc!CrjbsiSo}%U(+c( 0R!T%gbF*)m&+H;rpC(M4Yt#khZ7iw5$Jhh1YFOO%uPY|wVnP6 z7W`P8NU7v}m(!V9k<^&`Tz2AF7R%;*axyl%vyuBUra^31X17mbQ}ux)9b2oQ7q|Oq z48kIsS~Ee}a+s+S)8XmmNQGA874OU5oO+vD z?498^M6c$ Y$iJ5dOy{12Vtxx12zQ(|_DF>S^I^*>ul0QzCW{KYag*9NaVaR-7?v zqLZA)CogNeS)zYubJLkid2nsdBIo{XcHPaN89hg`?I5X#+dVMA!?nP7(LFHDl@LS5 z0#7JsBybV2q8v~6iJ_7${`*vAM#@3CK+9JsJtF`u@4RpIk$LST^qST8**Po@Ic+u@ zzabxSaryF8wl*TPf29!qHN4|`(PuvMxdXa++qsX0C?M$keanTJ`u=CT2`!TXaa}}8 zV&(w0e_*As`3MGPdKKq|+W%p!`Y53+Ep8ub*FET;DVH3Hiho=-e|FE$O D{vHT?^j@h13Xnl{p7Ggeo4%hQs!MIFL;sh!pqTyP`(rdDW22wLr8^@{tkOUy z;UexKqZNBfwx|F >DHLPdyC|j=x6KlPywmuIMqz{~Kl#meK)~Hx3u*J73x2TWtIfF1B9FFO~>dsj* zP3!94?^U*n@%wsY5&Ebx^O|Jn12Y)b(s^$>=&v{q=EpKL*q@j;le%!MpIFDdIZO-& z!NS5LUJ~A|zG9dgk&p*Q;;Y7X->qTeLe{?CioF`^VTyWIO40cH`4S{kf(Ys_s2!eb zwsVk6L1W)XK+_tgPu(^iYesUt&ht_6g&Z5l(TeLu31NR@4Ur-o+YBZFHf^HR@_js# zw%yU|)=}eDYukp%n-JfUhO_xrKXdMr(4PegRh7(=fK$%g@#P%JP=5Z03zk*`IVm!1 zK8i?=2iS;*fgb+v5Iu2ABW>?9KfUZt0hQQ5s=6e{Q#lC{&h%SQ)@xZyE_=uL609GA zmI^h(F6orsb2qGl<*7%@uA*BRxGw4PUJ!2$<0JG}h`RY(?ZxFB^K{e#eXCbHYx9$( zq<<7Yap=hPLZycIGoFJ7dov5I*+%#JO@}=kZ(RH|(Ddf<;_iihu$gf{E{)sWeR&!# zHKrH;%vCEEy~@q8H=6>`s==boM*NT@c*y=Dxn&<*(Pr!GtOZFq^EJ_6E_u&xzFJl- zNt3ey|ET>|lPJ!))OdN`#l-&yi%K4KY-nh0LsQ_=TN>AR1E{X#_n0L!Zl}mN7LG60 z_qH@# jggYP!e4By?FPnl2d^i#TQ4c~Cu wK}vy xG?!I_Cnv#kM zst{s%eQ ?ezT58^i=(}_Mj;pFF%_q5ELJW23UXrTCItCf~P#!S7(%hxSVYm%Phz2=JAUY zf{EVZ%1fheYbr-8_&{6ldry;P^SD$st=7d>;EG$)r`j=kcSw865h9W{ `2V||Iy6i1b3 zcm@jVf&d|e1^{7dqMps)N(89&l(uL@`5w|!KCg5>pI#_uCy}Am{xEs3FIi4E;_$^0 zV_T5DSob{>lVN0UtNL;8$EQod&rgxQh0>iuPBznxz~?Kj+^@ZRX~^A;iel6#9j{K{ zguJp|-?@nUOGNXFS1kQlWJvNy{*ebh<@5U_a$eBK+>^^LDqNI?!*=wfEtc3^UqKJ@ ztR_ScLBF@n=%B?Bsg@=7^bF#4s}BF|iEv`# iOnCbX)ww8@d2VJ%Wfun`E1Vl}j3MDie)18C zN|8g*Qsh`Ed+LRRnz)|s5I$Rq57-9_Ckse_lc3j`3qB^8t~9O;wC8^;Ir`aFy}552 zmqvDyK9%ncZ0vZxnE}5ygp7?#n85J8ytM1JYr7BtpDR+}fa*PK|CKs+UiFq(GnV~p zN|cyKhcjx}94x<#+GH%5Wq6)~B7lr*_a0+pmn)(pmw1FMUJ{$1eZ3RqRpC)vk3nZ~ zx}Vt0kT$a#tn^w-2#3s@)iDbGlbRkqV;)kZI(_Pc$I&r;O@cygS-RI{`lqWnTPy8) zo$Yq3Fuh5HKTGK?g@5w~+CWH`ts3k6T>mCmsD1Ft-d%f`TH=1SYndaL=U ir15*%>CQ>W+9`#|6j5H#5!^3zo+WI4MFcM82^@!Q>7t=a*ogo z#^WGy`rFf4 }mqmcrd_#0eJMGF{S0HO(qYAbYjx+)Ei= VO-vCLKnwb*Bj~R+Xj|;){O!|3lncg~j1JVWUu^lmew#ad&rjcXuo9t_v*C z;!xb(-JQjYySpv!R^0iP_V+)}ITzpc$<;pWl1!3GGMRbj&0!ESG=fi)@FpgSU{p)2 z9mondVT5JJaewz6mP*OrRx`b_A`D3slOVQ=lu`EAtRFuh!O;kvj85#2c2LvsAZ^;O z62f1D!{R6+Lb?8eI-m|%>a*_y2r^1Msp7?J97AulX*0&2=-vu&i@C{vmWMH7)KIAE z@ELKaZV-0*CmJTUW@J_mhGroJCDQmCgd!OE>Njo+i4a1As62m$jK0@^0Hnaj=Yguk zsRxGW7+5#v0FJ2BYfx@Q5c3yl z7X2D3+tl^{r_s9D_xx& LLmks= ?;V6t<4_ZX5v8@Y OpMm+N%@ zZhml5dCb}W=j2m6nkX2Jj7;MF&n7CJneP6enfbWQr4TNMT8;?4=94!NH4s&8lP5 3#QGfp2Uyz}7d1O6o zFthwE5ZBN~S3%OfJSUALV+>e#cwJ0&o@>0t$)!1!anhg7`NxV(FgPAGEE6_=#L51? z@He!4du)6>X~9nB$?NiM*;&>($~om>U}Iw)*D1~JS$yjO7miD9u08?Z`M5>2#Jat^ zEgASY)^hJa#M7Ia+L`@z-SYgQ(m^C$5mXn4QN6eA5rC|K_Z~NHES;9~T+CiV!nZVrmYksdlnQ}MO ?aL^1dMbS|1v*1R$dI!<_t5A7zR_3kO1?@AJ9z`IBk7Ai7 zl0p2^);^xO?po8a9nE)*ZULm1B{MPF=9<@toJ;XdGd5B6V$twB7^4e>V8B&)D!N~F z=7}&aE?bKDRif;@_xy9}-)du>Z^G3HN#WDPg|l y7Z6iICB^Kx%CZ#}~uPzh) zcpBEec>yP7Ug^KNwlP& 23 zJZ86YJ1m{@_Ba0H>2Y L*hMjC+9da51mV4->217uhLSTX70HMKY*6SaZL zirjJ1<7ynZcvatJ{vZ!(vwISi -0~84Pcu@PZr(@;0h}-VVuicXt%a+1(HT--^Q9&is-x+LyEW7?k4+ ztHVVV+AFMxw;h|z@U($OM*1aMH&HC8%ope^L0@gNG8_5~(kLOrPzQO`*?`?|&(O+0 z6zhD^P!#@|Sft6AYZ!6ubQf=ncrrgw?#bloNY>-Bj1%^ep9ckaUlG ;$KbbDg7p$4Ni-&~n0J9C$4B_0p(?nznS1GE?MVBWCC&%wR!1nCd)ib~duoJL z^*Fh*`m=a}RfCc4hlQi3A;2jmGL0o?A~j$CaCL@xpOwJHY34}gbvz%g A+v98=0sS*7R$uU z!n@OSSx759-55w|zSZ=~ed;z(N6=r6QlJ4oHIPotA=V?*d0O7QJ^$psnp3z%>>n48 z$!2p^@8O?rMbp}XeX _op`aEVym%GM``Y{ERhGi=Y|Zqj*LnbK2I6Nyjz;XV82 zc}`iPHdfIoXZQ>WNn?(7mM5k6;$Km7MMZYL80;+0!aB1 yzI#(g}|qt!w+vs~fy%Ok*aVt|`;r z38t>t-*~sLw;9SWWhy|Xu2)31P6RLhXXn4F62Ob7vr9kQ1{T?BA7b}Lr*3dkj>O9G zK&O(M64!>Tz@~!3{!?(s?Q&=boT>|F6EO}3o6~mIw|qJnxgP8a39vMn)e3SmX+Xb? zR2#Y||NWaabNxp& M+1DmBRd^-<>}u1a0=vx@{}>9NN7C z#)ClpZ0LI4Zk~lPb&m8tw_KIz%HSNOAS6!fVN96a^(;e6aK&RIA-VmYF6feXdSTpe za0P!JJ5S&wX9m}?tClZ6nJ_ry}^rR_DOjK{IPD|Frip-wgBkZiHt}Ee%uTRftdATM# zwLHYA-TVE7?LJN#wnu9vGn_~+`XQ|6_6qnAqZ@95nvgfvi@LNQB-S==XJ&qg1X<|5 za^1vKvNON@DJ9#^cEKS5G^RJY;;POeznRTJUi+sPSl&D@u97n}p_|XVFEIvjE0Aaa z HYyiGVCf{FEqXdISf|6_~tfk%qZ)$I+AhLvw zu}(xFB$_Twl{A3X@lLSCN7?(M6X(>Eo!2)Vk%d{(i{DjUrg0pV54O$?_?XSAHoE}k z;a4rc_v6WCN%*qw``+LlWoorg_$A~1`qU8%d4CgmBP2#ftadljZC%bZ&NeiAbDJCe z8DCND6Jfoq^>%OVr>aYLTU|GS1*Zw$NV+EXI^%pUm!sCJj1e8rKs=JI^@cKR)Dg63 zmj^1nW%Z4 bdd(I~#VQdbPY7bX! z{ _TuYbwXhd!9o3UFDi2G{SH_KSnybh@4QM)7H7* z_Bl?o?1Pq0;!HHwAh-56#tJE|p?EM@Ar+3!7!KzJ(UsEsa!1VinSQ+bd{!9IOCgP= z;wF4~Lb~*N8%_|Na_PDDO3zJ0%n&VX>QC=7j5i(bng&6t>3joNYil{!?mPr=0<^PR zcCR(-%@axH@>V<9AMdYd4z)H1w89!}Ekub55ij%!bs}USfUz7Nvit&2TQsRC&B&Y9 zzwDqQGikv%3Tl`A3KC8vBM2Xr#ayBuk#YNiD)FK?RANalqnsFgqbQ7u2G`zpGuF4C z$IDb={Xbto_iR_FIf~&*X<8X{SPwS0=T+wwjKUv(64aOyNdAJ=t^@+KS) Y z#w}K-XP~JLJ5HL}2Gf0O10Tk8CneQ=ET=fZundFs)5HT0xEK?ASTdyAjAtEaf*SbP zCq_FVrxxf!8?a9yr%Xl0<3(P1ZdtzIIb7d&*3i5}Y3PsoCR`<2S=Nb;a4UWKrc5`Z z1#Fqv%)GIDOsP_sc-a>z`unu)X~2W$C->)*7sulaX~h+STW4iqdYY!GOQub>;Pmb- zNW=_z)#D-OnYMTTrYjcy3*Pc~mzA78veO&frF01FPa3kPtf5W~E|2*~x=kP`e!-Co z#cs)3xzf3kfnlYH7E!bE*kBu*Pa%tFjjT9HyQpx&U@-RJh-`}T_LwtY0+Ee&iykGP zICxx)-wldg25W&2>5r3p(6wy92+j4jCu#y|z3Cs9CK4h|Hpf;G;Bcl2J>hKM$+-|D z2+>jvO(GE#2tT@#!Th-x15W54K{MLV9WV8 6MF@tnGZP6ImYZ%b3{#$j=);a=^t#x~u@ zOnrRLZOG>fg?fqOax5UE25Up%F_1^YJ3zV?Mk6_3p1_?Jq5OEMgybUUW@0CcXxIP2 zstLvAVZ51m3t|}GB$eUZWp|}IqW#t?U*UDEJOv+y7vGct@3@8n;lc6C+e^L;ws_hE zpB5hFEt^>60$Brib&{jF7%CPoTF~i3J}vDZvswQNzJ1Q?CyNur&gTVk!?U0}dr(0_ zS-}iQ`9`QaNa;1EDNzRq@42l|@!&qxBMhT>DN%_)Ser&qlC@& y z2fyl=iIV&4iKNIcWc3HrLJaEFB003o;!(OTH+E&5ZRTaIhPYG>>&K`y)R?Wu`n}9T zIa7 ;*$lhpMz%uE)Gmx-F6LZ-{MqXHZxVID1-5YJ!rT*N!M-O^JaD>E!`De z1fqoUbB_Ub=78%zJo)!KRUTjO^T5RNVCeVB>R4Z@S`3KXa8lnD#78tji1`QOE}RLL@0<;}CU_BDu^;hd&fh5Q_K&hxvxql!rj{9}!-8M@)^ghv zYDy9@37EiS8>eA136bvQxa1SO_Oty~Y_$nRIju~8*Mqxj_T8HxT)nm=lIoim3xStp zA_Zp6-&