From 530ff9f3a08b5e5b226bc5176a58a6051b9936b8 Mon Sep 17 00:00:00 2001 From: Thomas Spohr Date: Sun, 1 Feb 2026 12:46:12 +0100 Subject: [PATCH] Voe Umbau mit Joomla-Cron --- .DS_Store | Bin 14340 -> 0 bytes com_eis/.DS_Store | Bin 10244 -> 0 bytes com_eis/Archiv.zip | Bin 6380702 -> 6383643 bytes com_eis/administrator/.DS_Store | Bin 6148 -> 0 bytes com_eis/administrator/language/.DS_Store | Bin 6148 -> 0 bytes .../language/de-DE/de-DE.com_eis.ini | 4 + .../administrator/sql/install.mysql.utf8.sql | 10 ++ com_eis/administrator/sql/updates/1.1.2.sql | 9 ++ com_eis/administrator/src/.DS_Store | Bin 6148 -> 0 bytes .../src/Controller/DisplayController.php | 60 ++++++++++ .../src/Service/DocumentScanner.php | 107 ++++++++++++++++++ com_eis/administrator/src/View/.DS_Store | Bin 6148 -> 0 bytes .../administrator/src/View/Main/HtmlView.php | 98 ++++++++++++++-- com_eis/administrator/tmpl/.DS_Store | Bin 6148 -> 0 bytes com_eis/administrator/tmpl/main/default.php | 84 ++++++++++++-- com_eis/media/.DS_Store | Bin 6148 -> 0 bytes com_eis/media/pdfjs/.DS_Store | Bin 6148 -> 0 bytes com_eis/media/pdfjs/web/.DS_Store | Bin 6148 -> 0 bytes com_eis/site/.DS_Store | Bin 6148 -> 0 bytes com_eis/site/src/.DS_Store | Bin 6148 -> 0 bytes mod_pdf_tree/.DS_Store | Bin 6148 -> 0 bytes mod_pdf_tree/helper.php | 3 +- 22 files changed, 356 insertions(+), 19 deletions(-) delete mode 100644 .DS_Store delete mode 100644 com_eis/.DS_Store delete mode 100644 com_eis/administrator/.DS_Store delete mode 100644 com_eis/administrator/language/.DS_Store delete mode 100644 com_eis/administrator/src/.DS_Store create mode 100644 com_eis/administrator/src/Service/DocumentScanner.php delete mode 100644 com_eis/administrator/src/View/.DS_Store delete mode 100644 com_eis/administrator/tmpl/.DS_Store delete mode 100644 com_eis/media/.DS_Store delete mode 100644 com_eis/media/pdfjs/.DS_Store delete mode 100644 com_eis/media/pdfjs/web/.DS_Store delete mode 100644 com_eis/site/.DS_Store delete mode 100644 com_eis/site/src/.DS_Store delete mode 100644 mod_pdf_tree/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 5661c244a3b41819a510a32b841019475ebf51d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14340 zcmeHNeQ+B`72mhE7t-q6?M2OQlSbi!~mg=;{hg)H0;tvL4`U2p-#Zv8C-+{ ze0S6faB%`*LA}6T zeBPOL^_JqZmg%HJp&tS*E3a5niDg~oZINkvK9Y{5=bYYH>ICD)Y}<-w`?2^j)0mH{ z)qQp{9W#?giYu79fg&d-%%pD5_u6ww-Ql_sF(G4#sTI=v^7uxDn4wEo;RWt~i) zutixUYm1+_wvgnt>y-7{#N_cQg1wydMJW3pwAPo|ACX*O3hH96(jsdOJ- zEUKz=jxlQBT4u)R#}%DP6SriF)j5-h4#-bz*y7)QV{_}??(o3ikvCngQa5h8L8(!u z@Gd0N<{hSyIv#TpMp8GEr^n|_Jv}{GLP=-UeO^O<+l{anbLr6rfoin));Qk zwBu~K9$n{W@YQau(jwZpq<&ArTVy6PCWZ{&RuMT;WA@fGhIfl@b_hZ{?1fI~ zf?gPbqc92)I0@5W!kys288{0Ia1Xo-&cnTMAG{wPf{()|-~v1fpN1#l3vdy>1mA#5 z@Em*xz7NmC&*7Kw0=x)+gTKR7T0ytaTDp}s&>(H5Ep#vKr2FW8I!s6CB#qHKsZHGw zquDUM%{`Ax=vnNn9;Qyl{TZT9ln%YRH{LpUNI87ngx-}6JlLvhHg5^+*nQK@od$v&hz++%VzZ363{;hJR;g=klQA6CGM8=Mi!2C6+21W=V5;RVTOUT2aHg)Ve*l-c zq)PuQufIZ`C%+03p*i%zTOMB!Z7#t2#mw+5QS3^2OVZ02{zn~et!>~ zgSWsUydAy%edzZefDgh);bZU!`u=0^N%#~z4xdHO|1vDWSKyoQEqDf=bz|VC7y-Y5 z-wOB5dG(Q%UJZY`mRIK|!awq!cg8>0^lZbmy;I4|6|X`wNP_}Vc^_c{%Z&O|9wfkcI3@3zh;!0 z&ws6eZkA3c{LlZ@&Kh)dwg&^PtzG|R)}Y`^h7~qFzjjCQxvk|4L3?SK;u{-3HZiHZ ziZCUY4k(c-D48Ls+s5!o*MZ)HhlV*uSE`lGSx`}k`SUUdJUPIT$>mMzMwTS-6=wpJ zdS5_RFG?#g4d2CA@7pd(`QS%vzSFl$R$~%JLSiJSw6G)qM?yk%kJ2Wox-4*%80t_u zC3Q&7f+{gst#nIr4t9yLTYNnX`WK=phSq$y_z=3}G>&ti;lTjml0GN##!GXan0WddFxzaxJ}OhlmqvjHpv$Be*t z;YaXexB|a`-@_l^MGAB+t)?|}GxgH|<^vjO2WA7pbdZkH33`g3gXGZCl;E>1jbX1a z=>8@0_cP=_bp3?XD}?+t#V-(kVTfi!SFL2(JBfqxZ4HWFt-z2G?CW|9+1AAK_WA$2ji)3`hP;@DxY>4EJZV zUjq5RRN%{{kbi+M=RbIx{&HsXQ{ur}B(?nbU0rI$LwMzycNG3?Y^S7+C%L|JT4ty(4%Q@GP*J1)#h?(%*}-*?-v!1=+WD z0j#I6GMT5bvVwiCf(`#14=Mi~4;l73UMClF8=MQXF49Fov4`aq{}51obmQUw!d#X3 M9>>G~|0nqWpG5x~vj6}9 diff --git a/com_eis/.DS_Store b/com_eis/.DS_Store deleted file mode 100644 index 1efc6c669e7a798b666862aaed48ea6ba5d9450d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHNYitx%6h3GAU={|LR^GDgN}*JsY>OgD5x4CYsI*XNOSc8ByE{X7WOk0eI%p~`o zx#ym9&%NJ0XKv5k0suDTv|4~L0LWArRTZixd00OyS3Hu(DIGGz(>GG;CeuS&TRI`(**Tv9|0c$AAvCh*!Lk!h0&--hXv)I4yt$xK(v_H z{GoTs1GrAuqfw6z3(8e#Op!gHr;1*RfkK`7!%UoL)T6_K3UxrC4(M4%FGE3Yo%F(7 z955=VU;7C72waH(%iX6_wyr^ja`(dg-31%6W?yZ4%Fgt2MVwl44QVIem^AGqKv8?L z-!vSzrsfPvMa3nhQ{=$ZY0C6qSG>DN*&R1hw$*Oz(|gsKPTC%5re<4K&l~zcSIRbX z8O!Na%Tft5l`|8rUT>OAn0PatRMs}lHrp{=!?wEPu0H6F4m6=F-s9L=w~-IltExFi z-=Wi3MqZE6h%{6=v$nmT4dd+8vkuXUXpKN9aAd~Z(2}a^)oV9Io0?ni9hs??l`G2Z zIbC_fF_NaOyLS|fN zbd-25X*`rO+#$6>mW7Sr;);N*zQ0?eNw(S=8&Tsu!QkR$vb>A&8?!pqf~^EstR#g* zheH5))2yit1XQPEuVHzr%9=amfU0$xiKK3d(UkRd#M;`G7c2Lev+tGzaoX<;EynT8 zHpXOG{rrArxFzAZ+xvBEY)Xw=WVy#lC$jqX0ZY%0YP85Q-&o=^l_t$_?JP%Q+u~rb zn+;X3X}U&>UNCQdd9Xd$DXU+Tj%rwW!=+s!?;w(Mpz?bkfd=n4iA$$vu;0JgN zKg3V)3;YsK;b}aJKjC@&886_UcnSZK%A^I-5^1SaDMh3jX|;5lv`N}5wMpGlQtFe^ zVg-_S!ohtLS0)Wn`)Z-;0^&G#rR*M0DPJA;MWO|xdtnHyfZJaYTG zyXwcBQuy$w+ZKickAMkr!y|xu$>rY5<5F1^>ZB0S2gd_b1nOvbs#91f%Ogzs7NsJj zmQWChW~EXUQcEd-L~})`I;2Vzx1w1STCJ!>6qNz4yCzhvs3?oZol2de7E^qR=0;_a zqC!A48bYy<%A!sFul@cjI0NU%?=QebEX8T4VhF2n6|N&c--KJR8C$TGd_9icxC?iq zj(wQM2g&nY%;NwK;XZsEpCG?~8lS-z@nw7kU&RCX26_J>JWRfS6yL#j@gqErC-5YG z%%flgzsDc&$IJY>b)sM6g{%8@#*W2=UxWPizCWJYvGTL}YiVfzQlmdzc+8z+6TC{K z<=eBCX>DrueT}YE$hWMl!kxgiZDfEF1cz+9pch&Ps5@QQS7^KP*H4eVek->*Vntzg|KIe_zyIHG>-HDqBj6)2jsOIgh6{?sBiD zQJM1J*Wvj+zxRFr^;w^D*7v*C+H0@9&pyLFM^SSeGJhlvnP!Q!z0I1TjDHH6c0;pZ z$Z-hQ#p^u2FMsmDZofetx;@5p37Do7Ds!Ha8%b2pDTIW=ac}ZQCvk4!@A6lW+`E52 z@HOdERC7xZwOygz)u3&BHuY1TA3nGQxVYR)5)D<KsI0cm+4*k!e32=u-?Q-5mY!VSXmDg5zu1w~`}7XxcdKp4 z(>9ycTTB*hTmW?6ahfM1Z)~4k_?z!A7WR6$z2jGQnaSf8*~X$Dn6n*8#%J7LpvdE$ z_^5WSKkTPCXUt$eoJRglmSK_)^;y~4SWHdkCEq0X^u+`=fiX3`kp(qlcNKm*r*!W} zKg(?0axiL^{kQiHXMZnY;+_7gN_6`r`QRQPyKwyL9#a>Owue!d)P6{WsNB6DsZnI^ zXhb@_=p{7PBP3#sENITe#lgX2!oe}tL*mil5P|=;w=>KU+N39A=&<%FqXUmMW1U<& z<2RxR3F{FV40x5;{e})a9^4ZUVzWb2Wn3jlJ^_%_VXPVM1e_UEtauq!gtRO)gmoUY zK(O2YGzqM1GxX^=pb~d9KD6fv&!T_Ze#mt*BRcjVuQ2c;W;^82Lnn-)Whq3PvUie$|hO)fSG#T>uM?I2w7<*fnol1|#&76k5T4Hp;jp(kVvNzw_Xt1)_8H*zaWuElvUhqK)|QaBysJgB|zs9n9uAvspAadf1+ zfg^o^%Kpyp8Y{Q@zbOn-Y>y9{UJW0LFsxGQU5J=(GLE=l7It5F`i&ML9fl~)%3G{g z_|K0P^;@z~> zAN{jm%W!n?gM}d?V~o*^0K0A+jXoFR%H@oDYL5S&1UU+xJ<3#?9qIViehsbz3d$^u zUnexblea5>6yS+V!K)8r=WW`=PadZA{Sv^PhS1@q9gbNf4*I1f6y%Pl?AGd!xQ0XF zsY9tC_k@DE@NQRez~#;4rtMc3cg(kk1Fw{~&7l)mcsZu`=H9YMC|*4+gRwBFeK)@H z_EYNb_37T3h$%*kzueUk-gRFR{t(1FF}(=n5|ZTzVvTpQ}rvCNHl=l_1qBLC#cbnkl0;gZtCVZ7763y*kq zFPS60O2XBNc(X7$N*v#StCAU!`WS}UkF820={|3>iI`p(!-u5K$d^Te|IauGVv9%R z$@xEq0$zKCm@Xju0$4M?+H*n%0cauYdDd$8fyapyX3nMNDbu}J4@u0}>gIZLA>U`z z?Gt`$vhAbu7ns&U@#*5T@VdIIyo>J#hu6P;sYKrt_=-Gt0hQnzu@uvVvnBHWf%O3C z;%qldukzzoK>`=V^YX}Ivizy}wk!4wj6N5V6qHFK8520(LMj4s&oMF_MDHjcKhHH( z38?zYqP|t+q`LP=V0)rg%+}-G0soNdx{uG>%H@)&Ki4g41S0MXg}pX!e)x&wdI8hO zrg}i7mhOV$!0og}RUPt2be>YCw|1p@eJMjZewIH8`S@t;+(nJFK2{F*d%@0+%Le^7 z|H_5`60$2iTNpy*|0Tfk4CY<$^=No|tfefW3x zucZkA@*(rmop9Xc^aCcb{fn>Odfl-#4=nubP-q*~B`#2=;-HY7VAm^XbYXi^xmBiqyt3?L}8&&skdQgMJGQ$r~x6B#4`roQPjOqg(QN!E_Q`@=A~_O z4uONiOVF^uQilJ}GXL;w3=#oO8EuxQ;Ijf%Aesw1`?d+{JbnYgZhLK}{ik0rw@;YW z(%&MkLoe25dWq8n;G2s*0t^Rz)=7r9^O}x7Yu~dyo z9O;(^eGB`ptC|Jh>PhIkKCtre-lTeA%!9BS=ZL9ao6@D>wN-v*_t!k7)cHz)nMU)4 zwVdYF#MC<%^CS!2PH;H(REjn8iQwa!bz}HVBsgWI7Vq6|i1Kvlc3f)hTnqm^&(qZu zSS~H-?YB}D7jb>sAuKsODA9!{BKx6YB9p-MX83I}XCL4G$@TU7-^%y1)7zwD^Bl{> z+VL@W>hd?9s6_fde>r5YJeIRCoqcVLa&e;s19K1rSqj>s-I8BILRqDuXE?oFgoGF4ArJelq|`=gf~ zo@(K|J|vUtKUFK8s{gi-sfApY(xe;J`DX6MKbNvxiE=*bN27#EZ*Nke@>xGRx&*X35Fd>Fc@g`lPe+r6AZkfH;q5KeB6X2* zhrk5tr8kY^e?FZpmDU`;zvJ#DKnisiWQEvqF#8r#b!jNB)Xn z8nu*HD!2GYJ>?nqg7R7-CxSSd#a4FYt{PyxR3DJyi@oPu3t)+BT}9oYJpIv#o5$9@ zM%vF)itMEUlHpg`1)rZ~UvUaHVn1zpTJfu&#((!Xl=a*C{Z+%pRt_yeM=d&so6giI zJ1!slt&BoyUJ-3#EybQoEv>0Bg5*D4-{TBr#|WGqjZR>b@qiwYiPWh**mR}|`g zfa%h>i>WPNmy#}YrWx@%%^CcD*R)8XZcgdk-UHd?;;q&q=fuAU;*H5)mY=V3Fibr= zue46tQpo5qv5e=bU6%jCbLX|G&%lgt@`8}X;6Pde(cji9s$BFw6Vx3k{oh0L$nR!) z(KMR3&Z;blSUtFFZhAXUH`8=z`GTJiLG5P@KO2$4$HZl2wV<1~)cp-;Hf>Eusr@-} z(`|eOtx@%o2{A$6>HLKyzKFfqUwbwZ=65wBBq+zLV=Vc1qdL<~^#STrMnyJa;VtrS z856W({t6GDHOZ5=kgt83BiSTog*M1Ef#R+3wuzFPvOPEMWLEE3<^^b!)UsEe`<$e) zfiZZKmd}(BmBf5D%8K<}&DV6p@lyzWWI8|o@S@_c_KxKOc8c>e53-oY*K+FEq&VU~ zWnS0Wrg+^t^IBs#EHe6h+>)G4Y^jI(3cFlU4t;@f?H7}Kgb%ctP?zyd@KH7_OT3nr z7L{*>OBO>63#-2FMx$}EGD-D!2yvAdzvNG@DrCLDI+R?ux@2r*v)WSAB6)WdsByWnRjexRJiEmKw6kHQmlNUA#d3@Xfh= z-p<_C=$#+mOY(NDm)<`8%2p{uE}7A?YJEBfdj3X&Ai364WvivThK?>R#csOGeRm)O=ggjJJ-Lz`Odk zs-_O#!) z$v(s!Ld+d@$b&=^F6(ZFi}IC zCyZuic(`&6swc&&4Xaz81}G2&_nXfA+rdeKE%Ee$%4d0R z5g#llq~x5tJSmJ{)2nuwq&?tlEWMHyR~s;2Kj1e>A=HR)C{**TE0NZ&)um`2kHNFi z5W9Vu;w!G6W$0kHWOR&MX|eQ6VHE>a-4FG{saK7ybRJeZTWIxb(EaQmz**E#O3*Sg zsK#XFnfHyeS&EmGDD?<@`qS;r*vI(b8u#trqK&NyYhQ2TM0Tu|-Z~Y}!<^(~XNvnw zQSO^vo{X1@kapZV`i5})Cpja!MJ=au z$(&po4ihdp?S=*lO1PB!`)BhydLo!iYbHd!lNI%!Mzp(3zjG^%y-_jL`EY|j6Ccu# z+wf)9@v$h(UMdN6L4{jPpsg(|3kU}6J=hIxBVbq-b+f#jWLE|{4=uDrd3y= zSb1|=OM0{XE-ae}z)J+J8Vq=l*`~lp3v(w9G#Q|4e#RnF8-$u8Wj{V16j?^>Xx`-`?j51^smn6$M(~pgZreGki-^Bvpb-{nykXgy z)!Rri=wY)!8sO#LsvX@D|9oRKl;yp%ls{%{we?51pdm~4J@VF-wl)=)I^7DLwm664 z*+Wxd4gHw=@wlrWr$I8Gui%#SP(YErR$Wsop8_VU_8at zt%{(voV%;TsA!PAdHnmOh1w5=Y5r%^HCPZ?b`olKl{hgf2f?Qf&pGjK|E#>1Chg~s zQRWe-<$8Tf>Y8vn$!N@T;y%N#W*(9Gk0&S7)Y>M$;w;nb)^Jd7V9e*c<8|AvW)t0P zOKGe^Uun9`hS#88qd4|zol(|pN8lm%OLPk2Tyq%yGYai=GU1pf=k4SL376Y%7ihhq z-#Y!0`|Vvno8VhSq+jUAiAH=^E>yCfUDw0-{T|!HWcmmzwH=}axU7*c8ZVnxG<1-0 zSd5r7w+p`zA8n|e2^L{-en%7V#v73*guGXQ({XLhx(1W_?%WuS>axU_w`+A{Z&yC9 z(sKObH++GYaG4?BL&UjvUS%+V=(gUxs`6t>-5Vx9rjgH_m3$8lcQm3Oi!Wu*xy|@H zidhLh8I!W&_1bA;XYYTNcX;%?tNT~<*d;O?994mTKhVV9yu1=JBR#oaIeFgo@a%(( zc2WY!HwaAuxnDywWpIdmMVbQZbP0hIh8ugQlLDS(ok*NTm(R2uRojv<5z?NgbE>&% zBkFdJx~&Ec&y;rnwMW=R+HAp?%#Yl6_j??YW;&JyWe;^a%GLUxnDfuHoy*JZ%avU> zP)zF>@HZp+cw>jFP%|#jwSe*~n^Th3MIvcdEx9y$Yz>yCQ$BYWuHi`}eFd!R$)gw4d}Im z%a<#0UD~KpKFyPAzNMJ{PWXXSS9I#Sh4%YHFEzQowzNcj-nEw%r&q{#V#)(b9~fHH z2WM=?I&uAFnaXqsd$0LLp?|pTV#8n-F>%+0Y03G`Vw_1r&Ww7- z2rFf`e>=C=bG%W7C~t9PS|iRE`c>OET6XO_e zyTO-#!-{H}bSX&c_YL*DzX+QI>&QlQnjUru5%Fi~wH>Cmu6{IATA*cl&z~-Ey|%1s zvd*^JPK=WE#R~&`ji{-Z*;KO^&8KFAXujXwwsne1Xr2@$wN@3i(4sBi4V*T-bHg1s zu=WDGQ#rGtijuX0@FgNKRoVi~^nP$#pXr3>Os0nY!fUe;k2|6(UxqCSSRbXKqvFYR zwB>Z!!uTO0fh6kY2)fLv zHap3l%UhwB28FLF6^wTNPIXY%#SdzZWiIKhJ#|x^)M;rCx}&c z$0~fxgQRBE+TNZS?&lS6>cQbCWzq~SRdy`Q@8L*^G`L?up;0;cVV-R#6o+%H)yesBpe56stBBsI5-@H8SH1- z8j2*g{(1b|@bK*X$qx^q4dgPO|0o$btaJ@Ta&vgck1*IW2ox-k=C?I792BfD3#*?z zJ_5mRhpcD7vCPmuZ1&K;>^3RtEBg09ApkyFmdT$g zOzK>x^#>R4wlf-Qx^&eOVa{Fe!=nr@-k1mr3%DgBc)IA4oNsM$ZPXi0E-en;4SO2e zEj}{jsbRvUU;B8i4-ftZZtpO=)!@~=ysoL3IMuXdg*5oIuf;|?6FIPQDTnAng@dQ# z6i@1*(f2)aXATBcc#uv!ZDiE>xldeg1YHy>uk0lE|Ef^jNY2J6RA(|qbXx!e%V))JZ9^U@ryf%ZFDSi%DZ?K$Aw|nX0@MQ@Ri`dk# zmr~{)G*3eJKa#enmJ&+3MQTP_^6-6hf1^e)HT>kNXDE4h$jg+`0MVoY-1^EZzlmZE zh@TSkx(eACzb_p;ed>4ApH#KDYBgChHq}pzkKR&P6b6pa>`7j-dhX9ngL%zjLclz+ znwpUx+qWenu1qc;DXQ)1!*xBJW|t~Tgx-~EI~@WU$!j4Gf+%`e7imHqoRRp+ zss)!W?#vMiv#<2h+`rdl;Z^&J9~SXA29mRniTajfkrl{};9)g!%%&`L)jPl1 zaS17sh09kD6)1Ama!6gB+=8x-u!fxp66?!WSa!Ui)~C2SeK-65r=L3HG@caMJPU$# zbAd4r5)8u{37PAzd2YHc*Ewt7BMh`5c8FsnF?>giv&M$%>3@I5e2Ddt_+(@&s{p5Z z=2fvWeqlw@viHzFeYq+5Py^=BUsCC9=(3cs*v;dTQ+oo88_(~;U!b9np(Gp zwGD}+{-#x%_yV-{2ThjF_Q&NB205mJ9mc!K;c7A*2VLzZGu(%ERh$DD8q>fYu+8Oa7iF6Ewg6+Emv5y1#$+ z^XJP|O$l1}9))(8lFmqPD;VaKGQ8{WkSKq0&_Y9`&Uq!5(zNsmW81YToCNNz9u$=j zD~anXi6K?O{s;0b#rh?}!?l=tg}mf0?<^8&k^O8U`GvMd9^1^x-ST|fyvuX9-d$6{ zi_;`(|A@bB!sf3+JkfHQ`&4f3HhZ(-vdjI+=%O*3%PLChBXJAE2gAAVi^sC@NatvrTonK?7Fz+*&`PLTH7kn9L?1zDLhb&44aj-XV$BE)Kz z_Corq$rk%%jK#tuhDPUz;xGh%Oh^APpK{{c-14wY&6y8R72=7c4I&NlXGV+=4Efe} zC~NB)tFNa9#ec+<^DdHKnBiQs?13l?_F5=UiflM~C1 zwjC3};M5N`C#qjPB9x}8yE&nc$*b+@b8+~>HKVmZ$bPU(lzehUf45 zaxAFo^__DqYP2t{A9LSRuN%jNk=>}m+clJB#?&Sytr+xV*Ca7)r`gm*7Ll)HYTR7r z(D9;|?Q9eg-m@3sIUfBOE&#|$LgpEGIC)Zxj@iYkIr&n2i!^`WSlf>uc&>?Ji znx_pfo3ZquOLn#8d!)yzQ;DmB;EtIQVRfXk)%?yy%q06@MVa5BZqa*jLgcF_XL)`z zvz@g{%-o{g$VP4;qobjo5zKWyLCx8z&UD|qKX&tUs$ZXpF??x5kxHtHytqV8R`g2Z z$qj^y*rOTqYv;WW#QL_UhNPrkx35MU;Md$;Fs@aYi}-m+mw`#?UGfe3xHPu3*T{KnUVI23hF zAUZvTik(i(bM~&u;RartUQhU?fVi>Qn%Vp06YSnA?LMoBYoeOSL6H2(8g+C|Mzr4?HR?`i{&x&IF5^OlX5|TW{4o>hK}K!I|Ou_iZcog4I&f zne^m>^*^_*F&X$eR2hFsX`uP*XkzF=7@DP_Qmf_U0{H0n;)VttvJ)V*L0&I{^yt^) zHcM^H$uGv(?PJSn|0!*%@Fn4vN0c{2{odUx7xGH1W-sHiv`)SucC$@fwFK7)>`J}2 zR$4sugLEhP*^bdKy(e0XVlPs^t%=d$Cx?a_1{W(T6jI>*E&2I`9J14v3yM!MB&=HO znsaQAmTj9)s-hM7qm8DxKn_nAnn6Bq+m`VAy05`J&b-zsg?bRv(A|gq#PnQ8?nf z?5~|W_wL0jfg}c(Kgu8e5?@K_nUl<$YL|GLc$@xIjM4BDhP%vty7TAwoPXZu5U7}yZw6K0?t9pzP(G)q zBGf!05*i#em!2MZP8p!ca(|^}{D6|_S2ey{sC7Y4m)w`;#EWEaco^R^<%$Tz z*QsRkocj==R_)FvQqCi$u3Ju{!<-bD5cxcuL~P@fOy{BD@OcfTUL$7FKk-F%nAvB| zYQwJOVxB?YAGo&&g}Hw-p~HPW%JYRewEq1$7FJu)hffagOIWJ%1~06IB!?&tJvUuy zQ+?uo+wB^s{{y_>L#I83O|llHQW4j;PEv(Go{1Se{)LXy)u7rxzhEUF^89nT=8|8Ee$x+%!KKfJ!RnK`a)R1-_}=@< ziTWj%Gt%TI)V)LEe|b~h_V=`N`-RFsdfo*3G4B-vYgE^Q@$T?f5{LIu#IO037Ii;K z2nKH$CHz*5D^}}kBv^VJ!~fglUc%b1))t+{>naKvDF(YX(il;<(T3Lfs}(h%{!Wui zF6K%XN5T^uD)6d$jefQEcdA89FbrR@9bn$a@o_RSAirDX5DT&0;?J-Pv{O{O1j$ly zp$P9@8@u4@H^e)zryC}9&mfSLy3RvLp7Ue6qhgN#;3q zs?ZHdoZKYg%V~Bh1r@J&#g`a=aqdgDlI^&s*RZ9AR%!QM_$g7T`0E}mXGO$)x0%ks z_-nm+6_afjUMS(a8Vat%OplFso$nJX@7h*weAut&=qwaT{Y}Z%gHtC_)s)5L zv&mY$vA5O!)s`YXJnw40^b?`+grPG<>3UjtXR~YKgw8%FTXi%|4%7P;mo)t}-^AboSYJ~n@>9~NmXhmv~RznHyk9$HH4P)onVu_f)?&Xak%D>+KT zXTSGOat#hkhfHKdJ}c|S1B^eJWXo@BXU@+*Y%o{R1CNJ{iS*}D?0RoEHa3UN2C06H z2WC?-UH|h(i}Zy)5z?%pE+^SU^I`qh(|2vG*{qYJ()`awRR&TCDqL2hq8i{nlq|%L z>NchzG?=H0``Uf3fKZ;|N$}G~Q6iBh#8*Me;5X5Rcae-WUvu8A5#*UAUR^tF(*85a zRq>D#!|K;mSV|`%=CZ#P1P2mgy|X$e;X#A^XAFoMCRf5av?}vm=9FxN>MM{)Y~8v5_;Qe9vyk z2TakCE{;OBJTmEfxAPRc)2HkD(sH`!p{7Z^It$e`Rk6$Nm*3{{ALDXq5u)s) zrV1nYNtI|s ztSf}u_0j*$Pks9D!@pylHz%Ey%4_cThSQ6dZ^Y8P!!T5H>bc7n^p1Ep7@sszn-v zXSHVU{~lKTE=^BMx)*?m<(YeyG>%vM#!bDM#ZeJbS}(p*5vCY*M;+0BdF!#z8@vc|Irax72 zPhZ$DB%bIzRj1Fb_AFhR?I)GWbNj|D$_Dq{vM`3<^zH8jrI?)VTi%Ubu9uw37b_6@ zw&nelw!uC8kWaKfv{tIcmiQ;#*35S8y)sj$pIhy!j6Q7&r#>$@{~Thy=Fn{;H<MAX_40}JmQMNKYPdqq-1k5$+xn^ecIX+yRf_R}+Mf$9kFMSfnm;EWmfcqp z$gY1SHNbuC>36c4((f!aHPQ2*tvB`_Y*Jz$cD57W=ZaYbYh)aG#$&V+(i*&6{TuxU z`Ok}3;0^2sRac(>tese(*&Xv=KunTnLXsyg5Cjk;5Ii9GKnQ>k0wDrI41@#-DG)Ls zLJfol2rUpgAoM^OfG`4K0>TW01qdq;HX!UkIDni2!U=>62se<^KzM-g z0^tL~4@3ZnAP^xS!aziThyoD3Z=4(T3Epev zL8%^jJmE(P!mc8Ms7QFPP8hsvgyaQ{&B&l^VGMN+g-d)CSV?& zVu1G&(Woyl8{mwB;63t-sDtA@Hx$QF6HQ_ss0joW0;i*M(M&HF(D@z4Tqu5z${)kstInh9fKNx`;Zie z3V|`g8z)(o-b6_wk9s|sjFN=ok>5g{g`=pYp`PF!<+q=Sl7U%i2=yFh_j6DJFvg#c zVuCYO1uv?=dvT?xvoPCQhGK*FrYca(F#D?t6^wh-u3t5Z0>+~5qu#@j?dnk8@ZR7< z)H=M^{s`3%?(GU0e!O(->Z&%GJd2*=}SMa9DXt>{Fp!E9y^Y614W){An4_oiN; zRF2pLj(!vnc_0cv6oDuKQ3j#{L=}h{5Op9LKs1490nrAc14I{y9uR#X20#pf7y&T` zVgkezh#3%bAQnI@fmi{#0K^)I4G>!(c0lZbI5cteJATOg_nOmW;DG*haw~asZ`qWM zM$;1zgRg#Uk3J!R8r{(9G}sSDjP-C4bjXwMNFWk-G#f$#0oD1UnKQx>Y~=Vjxc@QB z*hDaqgHKP6{~f5TK)2k{7Z4~U>=1xtgqS_hl1O4aoD5ttCdkzTt%`8KgV}66R%iyW zxDpWMCA1wP4j;zb@L8e5>u5^o;UzRT!ioSY4MEdoBoa_Vww?eb@&xEz0@!wrfB}or zVn0)Xu6UwZkyi~|_h-&8=uo@jc+b3!Q19Ziq@V1=Fb z|FDIGz0fvDKs4R(LRTV*vF=Cj;X|^%XlgZJV4#L{ z{XqeKTmc0*V1VtU{n46;VMe${JB&=wJzydWzs=8T`|o$vS#ka|Qsq&6KykY0eaYui zz*T>ztG@o?0aq?VPQGXkiT~XzR$I~=opRD(n6Clh`>#M*%-BR&z>DvYvOAjdsMB@+ zXknxx3w9u&O|Z`iUVFFw&)dm3I0F9)(HND@0?7xU6_Ma^1{59uTs7E%t30$6fR;pT zvBN_IzGN{+T<69%#++fqDFl&5qG>t7n*p}}erMqHe+3Rd4f}%kop~g%_a^_I3RqWy zs5Ddz=+ZP0vHxsf03wxrU~Nn1az92+DJi_%*Z~8OaKKXF;E_&#(SnIjr-)E2r>Z z&fCnhQG%|8*OS^Y6)0 z9+mBIG+)yr&^$*o@o5A|+r{Odl*lrCZP}qh3}{ap1KJ~S{U;SNC<22%b2J&-|G5PG zpR=6I?VnKi&{qta7m1xq)RCYScP~gW60L_U^Tx@ba$$nXBhiw?OWrs*-mVufIUOC9 zkZ&}a3?hmGhrXUKBoc*oKrH)0$x&!y#2G(mHVSQxcyl$1Kpbc@%9a_Dh()U);sc?8STq{>CIkn1BZ^{z zzQ=-vnlBVO6Ne5$-uXiY)xSb9K)m0{sG-p~u%K@Ph?+r(0b+{>hT1z2Iv(wUsMvve zununNBDw0quzBpTcgLA;S?0CTQd{nh_GZfo4JK(a}LqiRnaO zC=oyi%Q&d=21utPmkugPL~}s~x9I30<0;@`c@yh0bQ&7j;$?wSZi4tOhtQjwXeXqB zABbTu!wr3K6*;z!Nd(dITA|`Z^hKnLhYXfKiw#5xX(xeF4*r6uQ_(C?d=gq6mj_bG zL9;^DYv<{p-6U{c3Wou$WI&E%_gNsDZ-8t`1_c%U1J$R1-VmgqwGlV|KqhH`ruYu% zh!pJPJE9#B=XS6yI3Ut@pexwz*B$5$cB`@rN!|k6++8RgyWQM{HnCfsJ!~WgMCl$> zpN4iq?1L?~8PRmK2Eu$FRyHJ^2%x#m^VCpzI%uoz1jgDB9>6xnw}Ik#fQ`xmE&e!9 z3q8LLY?}_?Ocj0tgeLf-+Jy!hw0Phhjt%igh z*m8k){;|TjbDkbb&js|>F*1`2#?=T9s;>m~8{Yxm7I}cK!h^jHFTyFw3d1dN0fqaUyqeYHPFGuQV>s-0`}@dq8K6TJHVmv7^%1ef^HuvEKnF8 ziWXun1GE7p?BH4k=!zqS1ro*w^dy!(faz>a(12h$Xuy&R9={J*le}_Z@_-7C@TDB| zpO6|>k_k|BkZlE^9gmT_6`+BpV?~}2q{mSSXc`)D_(Myf zju8|Uuvx((6s)k9%tKH%w_{}$OIJSxbo(*#3rjPw!M6F-fcC5hw9hf}q#le`|FL37 z18C7lfaYR{9YP)f?+|u){0?crnQ;S4zdfeq8vrfB0oxWdfQc4&tQ=sOnPbJi5h&89 zV6!%?l5(uDKL*O;u@e3m5;YrFHhrtrDxs_%Jtg}Mh4qKQtvGO zMf>W3E1{z@g?0efTNkjLFvMpFrr!~~j)i+|;L3=1f;+ZuTQ~(H6BPK?5?kT7oxq00 z5pwDWncX!RkZ#zIfDHwhapW;RLMlGc0Q3_OHTFbc3u~J+M)kAyDt5ag#*6 z^n~-YMWc9OSD7B*+I|_%#nAa=@T#z|nGbBe+5;wmxgQ*C(iJ5HyJmsvB7*&~us^~y z5NmrhxvUVpLD+b_P+Ko>BoBe3fRQ~7JNmo;j!~g-n-5-~br7l%umeXQaNvuC9hw7C zoUp@SA8_!F`d9xbgHh}-XZjLwLoskL`w&p5qmuMuVX}CvO9a9^0b55e1W_V(%MESx zqm7{JgW%G`W&lhe{oAnj&;YnC`kn!Cy+ZpSgdiyW71|S_lM6R1ItT_mEf2QjOhYll z?TikBcBG2ojQcWC!jSS1IHto&A;~dt{7^tAdA=S3hN@+-;dssotnnJa7b_sA*C5a2 zDs1>Gh}Si+S=cZ*vVPr%6ZkU>hLrOm%rsP-1gHR2M<_I4;j4(IM(k)D&3Q7&{tYN* zdlT#}@eWN0eSU-1LO{(hVm}Jv5w^k#IGT(RL~YoluOKGc|Cu+W(91D!GPgdD1Fw;xfATUy)C@yW@6b08 zr{BO0gE>YCHN7~gvC9N-a2$ihGW{@4>|Hdxbi_0kC)vY+|>uFdF&(5Cz|6 z*n+?G0p9?engllhsyYfV-m9n}0^?Z#N0f6y^^<5X8DC&4ooF=i!ZEDbIx1z@Cw zUFj6;@O}z7=n7+DMrepri5-TOrU88K5o{egjn+qYK30O9;?bPhpTMo__i3~t@*RgV zmqM>s{Dta{{TFsD*%G!9cI92=&wKzXV8JjxF4z~b`%ijvMMXw;Eh?( zAsuP86OII$7g9UsaOVJL5cCg+pVg_34{6VVHbT4p3nhknv8WiS`biwD?QzX~=0O;H zqkkw8=BeK+vs(N3w($iPH+yn~vuA%n8zVQGU#&{(7V$=05QUi!+`wUD4IBsrk}y)Z2QD7Um%-@!e*+;lm0(y|Q5O%Y z{sxvvLKPS}YLMeQ2~QOG&ACv_CMCg1@qkip_PqbxQ;;|AL>^J9qHTv9jP*b;X`tL zVyFpWa9k|4P2fUr2DdV@X@&=tXrE+SkLBddVZUcOx~$nhK%lc0M?iM99ufFUS0{yy z{(+5S4cq1#>T<(lv5tjlZD1HOI)Uwe0+`ns3-dq)KhZi!Y9>AS83-5@GbAN5(5Up- zk4CnHLhm@)sx2^+Gg*$f^Kb(U+W;bEJA#-Y{cZ4A$ctSMQlWCXivQMSZgQ+ht$z5Lj49-*BfCRboRK!m00-J(<7J#n)wY< zKj=Jafdx7#A0Cwa;?FF+sRH-~=no1yTP6S1At}^p7WY z^A4~T;l|P|P}(Xu)LI$AVnDSEs$O{-3o}6}Q6_|t^Dc;k*MJS`g;@U#2S2|D=8N_! zYzC&Q3BqvgU!i6eK&YdhsqTYj?tFte&Q&xi6tfRp-+jl%Va2X7gwO^SSzCvL`7P>m z!LCUMz?EzhhSR?2A6Il63%7$uH-Ev&Bysnc{tH52_Fx4p4kXY47D?ZS5wMh)B1QMVY6>jphA5(hZ8n&kNFWjXlVc+f0c>7VVL33k z2q*9ZAU$k2a@K+zdV0p|*Vv?!b0p#7<@i-%6~)0u>TF86ogHUg7^ByuARCrZm=)&(1&|>F2>BQm zxr8W2K+;{l|l0Ij{Sh7EO%jM?F#2*bkh zwpbXPj5p1|kxK#mi|t@T4oVPy-X2y!UL?>hNI`!rBSJ|3g7NVX5l{o}o(q;^#SZpy)dK;He1&gvG<%>rYA0(Xak2@t znPABY3DY>~A%*!(;n{PW#>o(=C146KobNWxjuVoh1ra7{O^;S%$dA^^09pC~SfQ|! zaMO$cnx_R}yz$Nc1sT#g=_8}9%;5E$z`*QyMg2wxVtLwv`$uri1M$!UtGjlOZrx1A1Gd1($v;>&}*{EPuW>CwU#>X1Drup$Ixrep7YGMv8XquzodE?0f zAZqiIs9(XoN)3yX4pPm+9In!UuKDpusIdam$XmxzgIS%-kTYpOJFXr+^o5y8@ytDhkMRMIH*iKm-JK_bw}Y zt#FA+s39$L3Pxl)VI90RnS zU#QxAZ*^q@+qB_0#oN60Wm9TBG+;P_4rEi><&T4l^nR6`k z_yrL|qaP+`S$Ga*u%Ew@t#gkgNv(!;{xJ6-I)_Fc6;^S^$4rJw{t{pc5(d1BY|T_!Mh5t#JPdM?>-Uu zhCtZ=wGR?bFnrCpvVQ{6#jQ^P_2f(^olO&z`tuxd3b{HF>s{6njDj+OY{mxxUg1ixT1(4n-B0(HIWg-XQq)aAlFs`lE#@{TR$Y&RX;|0E3)WeowH5wrL?0Ob5QM zPlPb)0r+aiTRFa9G6G=+I}PZJOO>kOR>@TPDn(o}n40a$`R)L?18Ahr@h-5~eJGV4O+9(Qvy^xViuel@@|uNw*90F{yx) z-Xr+!RH&wIBB6CHIBG(@ng-6J{REfp)Zi5yUUh=t(8DMl4QZJ2{3b%iEaY)qBB6{6 z=kIgDDc#mFB@1B}^lPTpr^D1wqX}+G2lt#G3C2Yb;ZXN{F~N^HJQzgqglt&e7eT^CF3iaw z;c^OQQVk_62MYE=f(vrM*;+wDD;JV#xlknC-AkZzyXL7q7mD>w1c#i+AIAp--^Xo) z9BlNAnxrVIOvuJ`&t0&@%KUt`jugUuNHqUIHeXNfq_;fOR~=;;Z7WuJM6i$ zCaV&lyHMa@)AF#Zs((rxAu9or+cFj+Lj#jkE-QAa&&fJvd?=X;*)*GytE+p+0!ObDiw+n zQOYhM{Lh^``u2OCf1dZ5`+nZ_yyrdl-gECQ^JOgdW_>I+)ft-}Btq7smjD-z5^yAT z8pfoVGJmtBQh((4CulNnw-t&TdcB890r%2?Q7Tc)=+8HL`MVFj#@XjL=d%=*mYz7; z;j2}D|0K8P4Nu1pjVz39tje3ms`Tz2EYfkEkB~ggGBhxEW0#FJ2hF8`2)9-YVRzqE zBk4_Er}Li9eU`hW(l382G0~^%EBOg&uaI9-YQVb~iL!w&!J~&J>O9Le9QW5;O)Kj4 zsvCJ{QTfaEeb@1~Q@<{U44T$I&KazVl7GFM-s<{irqOASt@`B&7xI$y%bmj~MzsxB zmybcE-;E<7Jl~WyM8O~@fiMt+na#!7xmxj-gVon7dtP;z5Q~Uvw3OJ_e_+n z>g_Y3IJWjAso5n0S?pN$w!)jzBK=3URa%{V8eN&~nRqzWs?xZ&gG1Z4AU-|2JwChp zthM|D>4E)Y7In{+*W;=$%Pp?2wvCaDIU}RFRyK@iF($LTe(a_jhVCnd1nBZS}5ZMl6%8E=MmB_UG zBIFj#Yb@m9@fk8NUBTaD9r}%966o?HaFSCPdBK(A1U~Xr2Hy=W?2c4Hax~)(wu#Xq z{|zD^X2+2S8P!RDUYGi3yeaiZet%xIGH>4nJ0`*4R#4^f9ObZcgM@7}boEiSZPls! z&2!4mjZL%cKJq!=^Xj+82YCniT}qerly#Md_J3vN{koavO_)G{o0aprFoxXqn%hI~Ny0^Z3%1C=#o#S!j(MfKx*UUFwUDG^1(PeBg zGn=DTIm~XHUtM6-b2S=1nK3g5bj!V$F z3Raa4ByK+!ZY6SmA^lvGq-Y{1GK~?L!M_yAzU)%u?{J>T%(AQ-1x4oznL7<&e3HOJ zcE@p%CB@muyI5XrOidM;RUboTM95R@W7OmDDhEz&3X3bz3X>4f0_7PWP|GGFXP zL&w<4nB;tU#~-!=4C%J^McA`aJZcI>EcX45qoL0|rg5z@701W;xp=ond-=q?-eg;_ zC)j2r^3vqdNh|3A6`G#L6kHT*YjlB^ahd2LwaW7)l?fesdrY}HbGMeeZgcL-e;mZm zcFDiW&F{|KNnX6r)bnBRbA1NM<3@VV zgB!y9=&$N5GSPBhkc`&%EV)z={1I$L}Ep-^{o%kt#$4|l$;jR)VZ z)aXzjO*k_@(zsbl2-Gn@+RJki<`my!g7HcIwE39!YBkJyXLNCV{re@iJEUAWc9+ui(&5#e7alFQ^PJ>ju;M%N_Ko{Q$I0bB+NGVC z5hsfoTyvxN=AO+3*Z#<~?o~9GK&HHe?+rfk|692^!V2J1B!M2B2`AtU%Cs9TK&}+nSi@(?eS!{TBb+BWU^f?elOHd5c7~up*4Jkw*}f|EN9aac zPs+7jd~s8!63O!qq%OH;2EFq8Lf?=y&@nvzfbec>w(1>O)%Qft0sVo&g-1H_^528@ zb+QZpe(`zd5b3OMw8Qgv+JeREL3)SP*q%2ZRY{e4se=7u8u`_5UWx6LbDWt>3XL$0 zUAoar&lpvvLYqnXleIPKq+qWKtR@F@Z4nbb#_OGj^DB27nK-{li+wZn;-Q1%7oE&+58FLwU1!AhnH*?;%G5GQ(%yb~Ti3}~ zEee~(h5H8CCTG}euVlIDm0B-P=Q7u`g%V0m7Sb=V&k&W4U!7t9DRsJffbO+2?Q8t* znJ6YZtsN0B_(LSB+T8QAW{*gev$t2aj+uY^C6^tsR<$D;1O$0k-uLwit*sZFDt*i~ zW)~r`oVBvqW5shRp*ytp6p3Uy|4MgVrYq`lJk8Yma^qimcW&f{$B^X8_Fj6Z+810T zxw@AbDj&+Y7s29|V5F~7GFLB3K$~)d>y)hWFEh4k4pw8U>bitSMr+1EgUEriN9<9^! z$pzSWV{}!9V!8Bx&l}m=WHOM!lTYigksi4XSc{n9n#Z;%bo(E^_)0S-#;KoiWS1J3 zu;`<1fAz$eXI{PyMhnD-5?-crX`!wM%bZt)`Z7HO2W4$4NjH{bRQ89Ous)caEMEV! z8h>bcWkz8z++_T0Y+CiTvGPWrrgMHG#>~=5ziMkM({8!g@df{x{B(SIGVG*|v&0ip z+7tC}z3+yMGO`oa?$>BN{;b+=u^hB#JN@(;G4{3F?k%`%6ZP|toF*9W?k!T|o1S*1 zYy3FSFA=ohaP-l)VAh;T8~>#8s2$5itaV~6nS$57y?N6gi~7{h7Suhw+dzJq9k1;X z$HA*^+M7sbxqe>6VoSc31dpgsr*SCbPf61Cgu)$9)*h)QRHoj$D7by($Psb5m`#(` zkqNKPtDP0+-TmBQb6bpWQG=k*uf3K`tYDIZ{g_Ica*o{L+`#IFI`$O>X@Lvt*LJ$= zHE;x1?#~%G#Zqui@>_JK;?HWJ#hTQ)x6(GwCnTN41j0_*L!#8`sEu@ zERjD=MCHY&e*WxrK7GEpqI0`&-CPZ4^DQ)ERP)r-8Oh&6W9QbBv+3WIE z+Gu+0Av0FqQzP|W;RHyFesKwynl|A__Dd)V{ec*`hi#-QxN=~H>?;Y?oEN#7JnXAIOUH+QA z|B*7KY1J#=!%F7srET-YYPCi#7*7Yjdf6!y|FG@)KbuRBO{=#v$xW3_ob!)b2 z5nUH^&Dk3nl}9W1jcT-u^N!x!>*U0rH%L?ZROQ62h6#&AvbJu=1K<1dEXBaq9eE9Y{N4(cOz(x>`!NR#r0j35-!*>!jHXUa(6wD({G`5`hrSMyolDdb zc&xl>;&|$4nR20Y{VS04i=A$d-!8`Ac~_03S`@xCB~7ir2`9DDky86Y+j8^U6Hl$+ zbtSiacJEN)u^S4SH%us9qW%5*cz(gNh{_YXI@2kezZgzgJ-Vur&wN?+Ak!0xQ; zgrb(S6MSNr2d?5n#amlQ*R*tmBVLn-EFT5i?Tih-iQm=TcFaA1t>yHx$n!%Ln%kTb zY7DlooP5NTle3^CLy8R;tvT^oEOkq=s9#Uo;5j(R{V#`|#JeviWM`{r5=|LXA_gPwk%T(uOijtobHT^L zX_jQNjIY|hiaaaeR(MF`P)$$GB?j$u%-N9)rZWumPvrQ;Z_mz-_A(#T2&|&>+L~9) z_`$|qVdw-$lIYQ6I~n(UkGY&H+Z12n=|8cJZ-3O2({Y`FC)_jc@S3(n_y>Bw>!8ha zFa;}5ea%ay^geYoiEs5K#f}hM3o|_F|11vm$Oxxu&I?|WBR0pjo3ULswd`Wn_8C9f zW7#CQs}##-6gV$~^ZmxyIP4d{zmXwX|G*mkt_tG;f92;rAfDDTM~wEiheEjVWRwG*UC zoBEckHt2k}9a72V!?7_G77adBk2vvtf$rLn{-I|s+pI)ocE+|r~X!wM)T@Se!;`8xA!M9SqN;RJ;M`#?n<2Bn`^Rk730}V!-e<; zwRA53oivV4PY*{quc=PtwBAoHG~uzYNm75j`ruX4vBJ&cLiewIKYT(f{Z*}(+3@9N zX7*c)dQ2N<}Vt5%T9tK6;n>C~nJncsgyVU$G zZyXYjgTSF#5i)JV)lA|DUWoZ+r5Jz^KG5YdSTMhA^lac5rwxefB0V>$gUX}dee4@{m%FOpWGim z@CtXXS;;U7dG6(Q|GJWTtkKq;qT_sAnknq`C>+ zinY4z;T&tBbq3@n|LxJHRaIsh8h=qTyS6C#sPZ0od&Tt6Ems)`iY9C$hwE^XAFK3} z*TlHUDVib($VVPh6(qmd%|y9tk9F({>fgl$Z^)cYOL>Y~o4Dg^n#?}n24=}L@S99c&Lr|mH&Ah5VeX-R|(FeW`WE^QeqSOI&efD2=J*Lj6vFV7- z&Zn(`tYPw>fBd-oa$DvDjQt5e#?`C!x&md>uH~^iJ>ri<5`OCAml{d#Q3?hh4ewrd zb1OP{){6B zil!)$>Yi;D#MRE2;FM-de&K=&>9O=X0wXe?Wr~zIoN_|=FPtYztsTlt+Y|AA&kwp^ z*)Jm7MAUdj*&fAf#$)h?U+lf5UY{A~2py!#pbYnQb5Vv4d_YoFM1 znMm)E?rk)@Q~hx2B0t~#ho@I{1IK=T%Xn&T^R~PS<9PebmD8+6QxD&$U3U(@*)clH zIf;3ZD|KLiExnkWq`cP8Onw*@{?$yDMWSR&|BrXwy|OnZHItGjcq-Xy z7?Z_9HpNW%yyFQf(C{GMJXb%XG3RE)?i9f*D%U%Za(354@tP!8#Uh7~;=5=3=kM5C z1#{E4)i1P6h&>L>J#piJQv!aBWSgCkUYKd)A-wIW7CrXOU}{WE?!&vG$JWkQj;BsG zZM$F6TihUOqom{U(NJ^nd1zSui}D?DAunrcyR>#npS@FzVK*+w4vpI;!ctt~#z)_C z^rx=No*za;Vqc8pR^`GcrjOk`Uz#c(z}8$UFWTyB_n@QQLuUETrLDZr_mq#3+_PF6 z)>6aEsurc~74CL!k&O~iJ0rWroeA&L;wM+Ud585tZOW&FZMC9_x-X_}-W5Mnb-8xk zW`Fv@;{$I#{kV1iZ3YwO#jT#97ybIg(Dt`4nB$1GQK82M@dvtuyAFq0(S;9;e%1My z7slhTDr^(C$%=ot=y!J4!6-&iyoQBL-}7*zep=g zVrghR8IaXgm7+QS_bEtKw)Uru&2f0uD*n)4hP*7sSM^(Oh>p4nMajQ*J7H7c6HseI z7g8jANOBqy^4sP5G3d)<{^mu8>mOMx4oUTSRJ$D8Z*pnGy`gp_vGNijkW1#Mtd%84 z#^;ybn^jU7nZtVzjQ0-y%p5Tb?@mqoE%S~8m(4GEUiv`y`ckvnpYK}kCJ_;r>2*`y zpKT8w@my?|WRU~Q*VYyqcbRerJUU)Tn$CEmFn_v?WARs+UNhh2h}zL+i8J^g9#%~J zVQ0To$$p*IXTxTBExx!h!CTwF)-ALeJk2eaJl+8Zp*`3iCt947xv%~VGLGjLv zmA$l`MoOkP`+|1hg9TY$Y%}dr*A(3~M9R3C-QlCZ-R|6Jo?@D}mhIabM=R^yPGai6ACEl+s2fC(Ys_?TsHi)o>iUzt;8Ak>GMDC7Mbgay{jF(_}HbX zs;Bjal|I`O=PG*A=|%AM^PZPq2ESIe-D1LCbt2rZ8on=RJibXynl)4T&h&zqgKZg> z^!$-7XDau3(pC)PTq+&^xsbd2#Vcgv8dX~lh(G#a-0cm%9^Us%G21L%VsmQU3H)+y#$-#J{iU7jY~@Bj!gu$5-J?j) zSNV$@?3C60Ja$#*hiyakS^a~m!=}tdpqA8|b-m%e_+TI$@F$*-Gw^>-jyxAt z-{wU3M65!Q_nJ{zbL6iYSA%h4lALpH9RJ1oHM`K(v#W%8^ga3AyRZ$XVy@Pm$ox3t zrge2-lc-{9!c^VUdx_tVD*4a_3x|yQ^RbU-$`hSSV z)IFA4yC1_)psYE3cx&gnzWXstKT>7aS9q*e&Id7bq+N%|Oqv~de&hf;B zr8^7?8i3n0?D51@zrnz{*D2$K$6If5^s3Igs1&?u*Ds|jKg%j&sf3~F*FMQeo_VRN zcZ7SpwrgnJ`(3Tc$Blb(Q(inMTx4!J>sahG{ev@z^z{iY-nzc1*{JoN>9u`Pkr#f zJ8X`jg5$(^{GxmslkrpEtA08351-}EbkMn-(iFw#b_jhWX%;EBKOpf&A86ccQE8k} z`r`f)UB|CK{#{=^S!H+6U+IeFJX%=&skpV0`D3Npgh#ct;1l*~a(SZ}JAACoh*adYB_k@LmrjB9`D|B9f^-J{q<&&n_*f&O=XW6^ zI;(%L!U99e#kSoXw-V>H!*}!N5hG8XbiQI-cDr&`xpnK|E!X@>pM)|UzkmJ3tSZ$} zp&*c;6-%2Yy?3Pk!&P?w50V!iWF1{;U`f|VP3$$CWWLF^X1yM`ZHu?bGld4X)o~784Vf9&3!uDXHih#~JmiCI!D&5qW`P%72B5YoPs?ny)iHw)dyuWn8 z%QPW&HrkKdNzYBtN>%lyP)v!tyD{f%Us(Lxqx!*htRZ1uCz^&VJ?_)GY*kpB{qpwh z+pkK?ePT5G7`ndX(q@0~SZfrEb7M(qj-or}SZb=!7OLzHNh~{W^zYKQOCDTC8aE} zSDR)(l_(XT>hOpSB*eY`w*UL^U8yFmpW2goLoL^>=yI)hQ%a{m)4_*6_;OYphvLZ1wA$3D#H537 z)dLhJx&M4GAbz`|F0@O)`)-)Jj?b2i11jsI^v*grf0d2%o$j0B6x&=%glcnY@tPV5}R3eaECF`(BS{)MIUn8qHDdEb>p^W<84v4_Brx|Ef;x> zm4_V6M@Me4qX%2#3Am~xoBJDgLX>w(RT*|{8$fuKw8I%ztZAqK*_~689DrjbcYBMG z6LD;$8fUL#{ia-J#`wJY7#|8~O*qo(P|q3WlqdLfi*~E6?=f zfAAkmYFyeBartKtC!vCOa|5ffRC4(JmdUkck%e$BhTOpkCC?Bk;&_Tjleq0be9QVD z);}fmK98G%uRKg_pW!~U@MVbJ#)j}%a0_6Lmn7Ys<=ZZmz9lQ9@1y>#%hBR{kwKkC zA7(LO`YkKlj@0WOI%slEVr~566S3^w0xajsI5^SUABLsvXp$F+7nXiYvGr}QL^ z-Yc*%ku(>k9Ub~m%_iZ1=z3zG`mg*ptLtS;beQnFRbf{`e$YL>%jH41cyM&+mJE*$ z{$%GiZnc@f_K+9iyi+{g<8nee(J9{S8LOIkqr>|ZAH^3k1iUH4E8fwK*r%pbk^lV8 z=f~yUk8ZaSO8v^gYq09v>8HPdX+3*Sym$1dgn|$0=e>cvj~@&AKXw$n4mY`;x=g4h z|2Wh%VsCsZz38N1|L=X15xEZQCzjV~+r5vsJ}c|g5>1lY?zoNj{O#D*wx_;kDu0rO z)fGQYs@dy}5oF|!N;ylDO`jPZ-b5!m=}^&%7mZrKanmZ{%=s);?^#7XpT_VSlNU~R z1laLYa0_sME8|@b`9zunZr7$oo8JH6Nlw1O{r>&BJ#K5xtJ7MH;=JCTqkHowyk+pp z9mm+tUoUCZ6a5jqsrlUG`!|W~@+W1T9P-#$#1)9Osqab6gZ|RbzZ?t=k>P3f^bO0e z#q~*B?`pdLDBjAr@L^@^@f*RP9`1a1a8tXVK+}81&6jPg_%9UR`cB9A-j|c3izCC%`sR;NkLV|Vg0?k3 z3DmeW&3`Z7STQoFuSw{|!K~Y_cQ5Gb8=kma$0dU|IS}Sr7V`V4oWdLTi0VQ^?s&6E zvMZlH%l^9x{3)bt|If4$m@hm3)Ny>6)=eJuY||a}73{8b|9R6vTk!H?v{Y)ub??zo zA3x8V{-JwDzv2u_zL$P+d$j2*qj*nVy-Vx?FVnq_9;V8)Zs$crQ+FF&K2XA6E-Pfh zbtcoxL>E|5}RZbY@y?IgNc~Lhs=?HVxHXl-YVeYNSPVL$8^WpL& z&7-#zg`n)CStmlORj+Pwjp*&78$txVLC=W80;Ku>U4qes*@Il7PmakEKnGE+bcUu@LoMjTd{L1`9 zZ0)ay-oESA4RLWS35-R{Lf6APGpA*5)R>tjzj-TIe!#C~>Fdhl@}aBGj1tX`$Bi7cNDvOjIeOHgxNEo|CtCdxpk8ru&ZqshCot6}s^U1Wn zU+VfHMfy&LFJ`}PjvkM=JCvNI;`H{;!^4R~e=hv^ee9*C?u>m5R+(|?YI|>J#226I zHnu|5eQ%^|O@;yMSJ691i}1z6Hq+w~bn`y~kF*a2_(gxZr|@~dj{Z4}VW6VeL(i^9 z@a#4bz=x6Ze7`#<_Q^`tn5&HF1nHDwf{^~;`gnU1^XE_Q1Bpc#C(J;EmEgXbCm;6F zdgxEfas<;fiQ5IfT5xF#x!S9+=(&}rPqT?^;NDs`u&x-O@Jyb2=VX zSRk=NVuQpEi31WRBrZtYka!^RLgItO4@m%$AS5A3!jN!~L?DSm5`!cTNdl52Bq>PJ zkYpgqLXv~D3DRar@{qPbQh>A-(l$tnkdz>8holTi1(GTxHAw1^G$3h0+5t%ml6D>b zgicEd);O#btV-gCkb}A*DLgX*5XM7dvZ_yR6OgRDy9{3fC6M0X(J(hBG+6V7SPcePJAHR&6 z_WI$?(6CYm@dBt5odEn-G< zCm+6VR@B^dD_U;o%z&|>(o8{hYV`$q|) z7*h=R97PZ&hhs$9>1k;HQzK7egxKLuf%Vg6Qr^33^ZgS zA1}CioUj{H%z&zVU=RSTCkVXAXM;fM1VIEF%1A@L#3(BY6Gc8B{C7O&NjMM6Cvbpt zg20b`0yRG~Dgmi5f(#fxL9hZ>!U$Y-@bk9}ETuG*Z>PZ6DT3+$R~mzGSegU8ASZ?( z1|q`=63Dq8+zcmd#p?4RsVaf#lhCtR1c3u{l@HZ3k04lKkML7QLgvtCC0FosgN_JT zqG$Z5hHxao8hc9s)qoo+@<#z~up9}ia4QnlY*B!sM%EM*L{JrMhag&(>;wWMFg;C> z1R7^xwIqd*GVqa);DkWj83M1A-vykPR zq4{6q)op)Ok#|~rNSeGr>MZmUql}1-VItsXMYh-f_ABCmAvzU*4z8~ONP7R{z-$lN2}r!U zIM{X29E>6dE+(jJ>UP`$vto*>BJCt$Ckkrg;mC^2HnhY5?mPtO%{KsgvZTELvh-9i zKIZ?Kp0gK3KwhwN9`=T&1w|cD8c#EU;D}wZ`ip2w!Tr6*e|PNv+Y@=w70w&&$q0A< zI7*9x-HFhxn#V>KY~-wcVjwFKX7SdOk_DJbBc05YWoO4^qjnX${E)97gyh0`J9UGV>v(LLiEdj}J_f zVLudv^MRR*1RT&$BN$^jFYq3}v zDx-K4GK_PmBpG3RsLaosgguyhbBH5Rki7zO$1kF}9>G9yQZ5t^Q^oId;ZX3uQC&$a6kFv%F`0^F8o1{ZOfgwhrYRq~`b}lT3!tIxGOBh4VG5VgS_~BsOlYwn6{*WO zJ@n{&8{U<8qQI@&1S^cw8fwN;2pyJDnSeqVig_KCbR*1uDr3e1voT79MV#P(Od0G8V|d?&q@}4t?&$)%8%&5 z9&Ur>9Onnz?T~41BRFFk1Q13TWJ}>Sz^7;M0u}K9UWK}aP`Kg&To>`U)lSl1ghC-lP4KI$G+KI3RR4%!qWl$ zPS^wdwrD^~_3m^MEHONGC_+hL-DAU}-E-*ikRvLy@xjZY_abcw+~kJ3t=PYjmUb6} zi#`H9Z?yC){&-OoR_}(e5CQb`6Se^M0K5zeS0OORUepsM%eBLJ zcprjvh};V(%iV{}_6ba$FRGIejEDb01`+eTgyJU$P#6wJ9);r&_|_o=#({20Sm@Lf z8+k7wvJ(OSMAPme*kHVZ&`Q?z5UephNB)W(F_%OBGOXa*D}oK}Ns#jro+G&A@$BGW z6kZYyYW5mBZaRr7QwnlFdZX!HATqI2|2X1&120*g5r4G>LCPB#IWH1LVELKA`Wx86 zuB3mE!@UGsjB+fByz7N7uE(PcrEW==H#+g`TNqG3;UCkMw@^Dg2}OJW%$jni>HQ8W zW~87n%vul>za!Xy#$Gr;iqDtV@WSW-ZQeuGm^4InGYHMXZ$;rZ2;7;DdZ@_RfGzqU zeEBM>oze%#R(8m5G1Pu{KUDm11C>!iJ}=zpm>NVTo`ZDEG0dLazxHAvVgS}A zI3IOCIRM=!7orU8d}_a4{Q#{Qi%~1ea_s*A6*)@(`Vj=BpW)t|_z|9n$IAY~Ftd-) zy-USkLPiI+b`J<5E6?$bIEh8JA;0?*EGzN1Xl0xS}20A8Rx0=HiB3&3`S;D^1euLtZP z08X3f!L^KRB6vn&he`OpX zSbjt1^cBjkNg^^|%+l?@I*wSblAXw=Ne%>z!DlU-_;yjZP(R@YWMYh9j(zWAfIypo z_c+`t#$KavaF2y342;8l;Ps*1sLc!eJxsv)8^IFWJ4S)zK$eXWJ$UgAuAvMCAoZOP zin$Sh{B8oR-wAe@XSFC3%xc689<>=#_d>@fV76yyKKdpR;ejyGydHK^dve9gYE?r2^3F;IOZe{%uK^=qPv_ayhcpHi-DO4 ziYRU}l|~i!Pea8pX#|!52NX?3P`DR?w-zJtVN7lb@+%HrvRE;Km>GBh+g17xGLIlP z%Kkx8>QO(u;PNbdOt7@Y4Bgx|vl5xXS9LQXFfj`^t&>`2V8+;74A`&|*?{RB!3>+* zOjWJOu%QFxb8ybHTFk&vjI#(3nJ3s_PqtDO+&iHg${DL_9@Ze~0mN|@V&LaIY;ky} zcXt7fJWI@i4V)4%r)pkVfTQw&JM9I+K}-ZEs^fz*7X`MzV0A=~?CQ}MEkJ5Ky0n>}{uB1>JMUoUZ3}Svm z1LsXB964dh1X_Q?>KSOD$h4_B9oVwVTpS&l=MvO*(L`mbO9V&EgB>W7B}QZfrMqF~ zloDtyL&Z5QRQ6x`rHpQHUJ!mDaH z=gd*KqS}H9yj+C|`dT9u6#b=cDS|Se9cH=M109Loa zp1ng$w8TVbqj2^bfdw2Xv7inchJ)udcu7Jck}yOE%=03YfdiuEDT9SNL!~I}f`!hk zYEfpRPIN%G4SM{9C8}WS*(`xnm8A&SPDixDcCuT7qkrIIqbxe288$+|5?xDhCg=ep zJ%l0!A%wG#1_9ER)SU9@VZ2|kb?J$Rv5tilciQMIlNg9N?9P5_ggOT3;OZw!kn@`$ z0jlQ++kqV;RJi$>>NAxQD$EX3I5EniNN0k`rV)w*98lh5$_N4xNO#oo?^%cu^dXSv zS4y(tz+`44vt!KAJI53S7X$^&aDe?AT=VjVmM#m_dNBihL*IL9coX~p)h6jNp6AfOFnQ~ z38ixoRcOV5GAmISSa1+6X&nGJ8$5=+$_|=2h-S0|5RCwEK{Ep@0W0dl@Z^Lp$8Vx8 zQ#pw?n0Hx7HUSuy92CUgv7#>i3@)habPIvSK?R*N6BytkT4IAYTcbswKsMY&3#@3B zHK64u;y}|@c=~AOhEt?pP0_*uu620dv#rINnt&G%tfLZKaXFWrWq^2)4YjkLLmcD0 zKb;>IM*qkLs>Tbot0QedbiB zfWuO{2OUu_2aF&XfpY3?kam&)$qzTuU=f6AtTx#os|^PfWr$4R$5R^|I;-J`@X!jKiL!(3-z*t{ zxc5dxya=@3<7kU6y=^|W!f5t62=3-&izFZcK8g^nv8=8XP6n*(wWZGTIZ>#!1aV62 zPy1}Cmx5UY7g?d;l*=X#5^$}*L`qD4CgbUubW9jGgFrxetZbAZ-JZQ=Ns0Z9rvRB?1b zXJ%3gu9QJ%3MT+3u7=CGCO^<4%Bt{Oa^LY z%us{DiKG@&TNZZk8AD*F0GGvor-#GVj?}IxKomHQQH6e4qBW+E$~4)+$)jB1!{ngO z!#$|Z)LvUQa8HhCh9R2$b;}OqH$jAKjvzRY?co3)IXZ2`Xx#+uU&f%?^PAvRN-+*) z20UTM9oh^{%`g7r41aCIlvy5{wxpsmc)fy`!%RnN1BD^7flGg7GHAA65qRnHUv~@u zo)N7u0%<4$ueU5f14mQ^?OUMYz4X5@<$7z6@y|dIe@tlRhJ?rp1{GkAH?O0}I=!91 z-!p(9h}#PN?8`!AIMBG2XotbvLlyrk`1FH~toLn$+I5>j^maHSQ>sJ`P^1diF+9h^ zmuL$Az`}~~E5F>2$em{A$Jkokr(|79Pl3`ZN226c$*o^z(&kEA$L`~4V#YsFA-%9)><-4KG`i*-gW z5)wc}1FplCIEq&haQo7R*Si`}>rK2fa*DyD2}o)}=#ZETx{4_mDsN3#qzG{ky#vno zV@){H9XcqZyaQe=Q%w-YAEU4z`4tA7M_j}~_9Wb7X=}le%O68w_}a-HLr6xM0WEkx z5Oy17yegpqWmguV4Gm)NA}|gFG`he?0mx=;6oI$416myzW@HGp>iE84Rj&iZK7UZF zDIJ&}yg_NxgQ>XUVSbtFC=<2Q6^6mXw%cNWA{>?of~oL`8^B@@pFo)m1DL|^vnca1*-Z-dhu;kibZ???@NTFRUIE&6L+A0& zQSk7)4dEv zgz?AtS)!nY3pAwk%#txQ>~=?C`1Xnp)cLwopGWTB17&wlqOy!V(CKD45F`RyvOBzO zL<*y80(G>LQCR#ck`FS$1qfVu2ZaYr;P@Waqs(9dENuBh7=vPe+7v2YdWFhPeuQo* zX^kWB?RO|FW(J4gForVc&0rpHVF8dlCYkXJV8skx=c?#EfC>wIrj*I$Ap)Yz;SHB6 zw+EOJgO9Dc%;BZaOxy!}W`PfabS$9y9UTwQrtTvQZdt&)oe(n*V6dno1lTO0^F6+R zU`Y(XiX8U<#1i;Y>boVhcoXe`yeZd2#}{V>mn~Bc#SErV;vt6SJ&oX*wI1M-Elh8d zHFPfA4mo7JWP}?Z@BnvXVBj@`dovE5&Ut8~PP1*Gu`8V?l8Z3V=k%nmM;2R%zv7|b zLSUyYtmX|xkZMcx$A)TCQBNaJYUxewpmwD()yo+>7^c^ms&$_TwJ3ELvxi!1`#jNP zMuIl1&m(wSFjc?F9>$72jl_Z{i1RQZim|5yR63bKRr1L5gs%jUS?@sbz8WgN<^V(M zJfLzCT^pfqI6^JVCn`Sn9a>Z7oW%*^KbJiLHyxa`T~4sk%LPD>Gc0706U+l%j3|tk zo)^`^!WnkSTPqZfa)vsW4k3&`CNq`_rg~9VNP-L0-IBRuAYN?+$gi z1W+a)VTw1Q45tU|YbOJQ@yFcuLct_|=!Fti*b{njK83>8o=|u89Lm&tLNB|sP-b)S zMp#!bB>j36PWFO2w|h}06$jVJsu#Sj#7v{e!IcfG3~y*9u!h3j-f+%VIDF8y(Ds1~ z$5PA(e9nW`|P$9_0CQE>vYcTxL;(^l_wi{exKE6aVCMQn(xDLYSH>dpI zl`YX5-0>qiV}JM%K>Z>3fT7cu$O#M&5T!9m1kiSXC_wqJF698!9i#x395xsmjNUIA M8Vf%H{Fdtf0IV)zga7~l diff --git a/com_eis/administrator/.DS_Store b/com_eis/administrator/.DS_Store deleted file mode 100644 index 2431bac0ec3ac8bd8aa2d15a4651acb375ba0c60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-EW?5S}#=f{F&T&_X!H6e9lQ0hBYGy^t5kFDhJ2OpJ}qJ%*L7Z5qMW%0|V` zr?3!w0KeH?b9cE@tb)i4?0%P-+5Kie*xf74=*CQL&uJ7KbPx3j8$%c<<)O$G$zq&W-Hfdb`yz#jaJ;a$0TAtNHC3$DS&C zg~7(detKTxS9zV|VmaijU@Fwrqb7Cff=;N8uO6Q(Vb0`LT28dCUS|94wP5QSnXA-s4#UKgK}ltEo*0s|_||tM&|wGAwHO$L2d2zWpc$&{ z6GNHd@H;lowHO#Q!%1mo%ww6AeW57L4!@(*Nx2547X?ItxB?mTGtc+`!T0a~_#pWu z3Wx&#N&%Ji%3cXevUh7@aeUW0XcaUz&I=6cA?WONtUvfFUPRM|n8P1H*J5B09+>=7TAe~qdL${70O2q>dc2rWq&@^4x^GKC=2o@fS&u1$nO%NMG z)RuhT#Xqs~ycVHptdi}qw>7IAXC$71t5TRv6gt{3ZuzsZ2S zy9pJvrW?xX;QgK6cfDnm=c`S%f;D;jc$n|6-)|2iiXS3&FYOZ&kdFFm+M@m)W!>{L zkrUbSw(G;Qzq+*gO@3K@)gO)+sE{1$&t#BqtcAhP5I*5Y|+nrm~F~tm&`^i%Sh_MNKER;e)L*+l0cg zI_@80IB}}zt25vXbQw6&%c=DL#rN}nH_5M@0cYS}F~H+|nP+$;>#e%Rc!4 diff --git a/com_eis/administrator/language/de-DE/de-DE.com_eis.ini b/com_eis/administrator/language/de-DE/de-DE.com_eis.ini index 3a089a4..25dff04 100644 --- a/com_eis/administrator/language/de-DE/de-DE.com_eis.ini +++ b/com_eis/administrator/language/de-DE/de-DE.com_eis.ini @@ -42,3 +42,7 @@ COM_EIS_TOOLBAR_CLOSE="Schließen" COM_EIS_MSG_PATH_NOT_EXISTS="Hinweis: Das Verzeichnis „%s“ existiert nicht." COM_EIS_MSG_PATH_NOT_READABLE="Hinweis: Das Verzeichnis „%s“ ist nicht lesbar." +COM_EIS_ACCESS_TITLE="Zugriff (Top-Level-Ordner)" +COM_EIS_FIELD_VIEWLEVEL="Zugriffsebene" +COM_EIS_ACCESS_HELP="Nur für Ordner der ersten Ebene. Unterordner und Dateien erben die Einstellung." + diff --git a/com_eis/administrator/sql/install.mysql.utf8.sql b/com_eis/administrator/sql/install.mysql.utf8.sql index b1a42e7..4ff7464 100644 --- a/com_eis/administrator/sql/install.mysql.utf8.sql +++ b/com_eis/administrator/sql/install.mysql.utf8.sql @@ -27,6 +27,16 @@ CREATE TABLE IF NOT EXISTS `#__eis_settings` ( UNIQUE KEY `uniq_param` (`param`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE IF NOT EXISTS `#__eis_folder_access` ( + `folder_id` INT UNSIGNED NOT NULL, + `viewlevel_id` INT UNSIGNED NOT NULL, + `modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`folder_id`), + KEY `idx_viewlevel` (`viewlevel_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + + -- Standardwert für den PDF-Pfad (leer = noch nicht gesetzt) INSERT IGNORE INTO `#__eis_settings` (`param`, `value`, `created`, `modified`) diff --git a/com_eis/administrator/sql/updates/1.1.2.sql b/com_eis/administrator/sql/updates/1.1.2.sql index 55cbf1f..d1e2428 100644 --- a/com_eis/administrator/sql/updates/1.1.2.sql +++ b/com_eis/administrator/sql/updates/1.1.2.sql @@ -34,6 +34,15 @@ CREATE TABLE IF NOT EXISTS `#__eis_documents` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +CREATE TABLE IF NOT EXISTS `#__eis_folder_access` ( + `folder_id` INT UNSIGNED NOT NULL, + `viewlevel_id` INT UNSIGNED NOT NULL, + `modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`folder_id`), + KEY `idx_viewlevel` (`viewlevel_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + + -- Falls es Altbestände ohne neue Spalten gab, Spalten idempotent ergänzen ALTER TABLE `#__eis_documents` ADD COLUMN IF NOT EXISTS `title` VARCHAR(255) DEFAULT NULL, diff --git a/com_eis/administrator/src/.DS_Store b/com_eis/administrator/src/.DS_Store deleted file mode 100644 index 889bb740a85580a1b89b5b7249e93ec7d47262f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKy-ve05I#dxm9mtLr6^SFP!1JscnHmbSHS&KOxXML8}Ht&>NmP^U+CE{BbGaG1uj^S`~m zY}xOYiO-bCi@Wm%7O}&IPdrRlt6m^6G-}6I!BxDDZa*@c!VVFa{P= zgL>;grLO=$4{mK}>$4E(vjZ4dObx;VQ>H7>bXE3>p-gx9eVZ3pObwdur1Z=f$Ih(m z4MpkM;rDeqslcGrqJSviDzI!Gt9<^qitqn!CwUSDM1g;$fbzm9Y~q#d**f=feAfCX rXDDo(mm1VvP}$>HH~1)CN706u&kbN;F*OJeO#TRH8Ke>gepP`_2jhgetQuery(true) ->update($db->quoteName('#__eis_documents')) ->set($db->quoteName('title') . ' = ' . ($title === '' ? 'NULL' : $db->quote($title))) + ->set($db->quoteName('modified') . ' = ' . $db->quote(\Joomla\CMS\Factory::getDate()->toSql())) ->where($db->quoteName('id') . ' = ' . (int)$id); try { @@ -175,4 +176,63 @@ class DisplayController extends BaseController $this->setRedirect(Route::_('index.php?option=com_eis&view=main', false)); } + + public function saveAccess(): void +{ + if (!\Joomla\CMS\Session\Session::checkToken('post')) { + throw new \RuntimeException(\JText::_('JINVALID_TOKEN'), 403); + } + + $app = \Joomla\CMS\Factory::getApplication(); + $db = \Joomla\CMS\Factory::getDbo(); + + $folderId = (int) $app->input->post->get('folder_id', 0); + $viewlevelId = (int) $app->input->post->get('viewlevel_id', 0); + + // Validierung: folderId muss Top-Level-Ordner sein + if ($folderId <= 0) { + $app->enqueueMessage('Ungültiger Ordner.', 'error'); + $this->setRedirect(\Joomla\CMS\Router\Route::_('index.php?option=com_eis&view=main', false)); + return; + } + + // prüfen, ob Top-Level-Ordner + $q = $db->getQuery(true) + ->select($db->quoteName(['id','is_folder','parent_id'])) + ->from($db->quoteName('#__eis_documents')) + ->where($db->quoteName('id') . ' = ' . (int)$folderId); + $db->setQuery($q); + $row = $db->loadAssoc(); + + if (!$row || (int)$row['is_folder'] !== 1 || $row['parent_id'] !== null) { + $app->enqueueMessage('Nur Top-Level-Ordner können berechtigt werden.', 'warning'); + $this->setRedirect(\Joomla\CMS\Router\Route::_('index.php?option=com_eis&view=main', false)); + return; + } + + // Viewlevel validieren + if ($viewlevelId <= 0) { + // löschen (öffentlich) + $db->setQuery( + $db->getQuery(true) + ->delete($db->quoteName('#__eis_folder_access')) + ->where($db->quoteName('folder_id') . ' = ' . (int)$folderId) + )->execute(); + + $app->enqueueMessage('Berechtigung entfernt (öffentlich).', 'message'); + $this->setRedirect(\Joomla\CMS\Router\Route::_('index.php?option=com_eis&view=main', false)); + return; + } + + // upsert + $sql = 'INSERT INTO ' . $db->quoteName('#__eis_folder_access') + . ' (' . $db->quoteName('folder_id') . ', ' . $db->quoteName('viewlevel_id') . ') VALUES (' + . (int)$folderId . ', ' . (int)$viewlevelId . ')' + . ' ON DUPLICATE KEY UPDATE ' . $db->quoteName('viewlevel_id') . ' = VALUES(' . $db->quoteName('viewlevel_id') . ')'; + $db->setQuery($sql)->execute(); + + $app->enqueueMessage('Berechtigung gespeichert.', 'message'); + $this->setRedirect(\Joomla\CMS\Router\Route::_('index.php?option=com_eis&view=main', false)); +} + } diff --git a/com_eis/administrator/src/Service/DocumentScanner.php b/com_eis/administrator/src/Service/DocumentScanner.php new file mode 100644 index 0000000..347ce70 --- /dev/null +++ b/com_eis/administrator/src/Service/DocumentScanner.php @@ -0,0 +1,107 @@ + danach ist alles "neu" + $db->truncateTable('#__eis_documents'); + + $newIds = self::saveToDb($data, null, $db); + + // Dauerhaft speichern (Frontend-Modul nutzt das ja schon) + SettingsHelper::setSetting('last_new_ids', json_encode($newIds, JSON_UNESCAPED_SLASHES)); + SettingsHelper::setSetting('last_scan_at', date('Y-m-d H:i:s')); + + return $newIds; + } + + private static function scanFolder(string $dir): array + { + $result = []; + if (!is_dir($dir)) { + return $result; + } + + $entries = @scandir($dir); + if ($entries === false) { + return $result; + } + + foreach ($entries as $file) { + if ($file === '.' || $file === '..') { + continue; + } + + $fullPath = $dir . DIRECTORY_SEPARATOR . $file; + + if (is_dir($fullPath)) { + $result[] = [ + 'name' => $file, + 'children' => self::scanFolder($fullPath) + ]; + } elseif (is_file($fullPath) && strtolower(pathinfo($file, PATHINFO_EXTENSION)) === 'pdf') { + $result[] = [ + 'name' => $file, + 'path' => $fullPath + ]; + } + } + + usort($result, static fn($a, $b) => strcasecmp((string)$a['name'], (string)$b['name'])); + return $result; + } + + private static function saveToDb(array $items, ?int $parentId, DatabaseDriver $db): array + { + $insertedFileIds = []; + + foreach ($items as $item) { + $name = $db->quote($item['name']); + $path = $db->quote($item['path'] ?? ''); + $parent = $parentId !== null ? (int)$parentId : 'NULL'; + $isFolder = isset($item['children']) ? 1 : 0; + + $query = $db->getQuery(true) + ->insert($db->quoteName('#__eis_documents')) + ->columns(['name', 'path', 'parent_id', 'is_folder']) + ->values("$name, $path, $parent, $isFolder"); + + $db->setQuery($query)->execute(); + $insertedId = (int) $db->insertid(); + + if ($isFolder && !empty($item['children'])) { + $childIds = self::saveToDb($item['children'], $insertedId, $db); + $insertedFileIds = array_merge($insertedFileIds, $childIds); + } else { + $insertedFileIds[] = $insertedId; + } + } + + return $insertedFileIds; + } +} diff --git a/com_eis/administrator/src/View/.DS_Store b/com_eis/administrator/src/View/.DS_Store deleted file mode 100644 index d3f08b2311aac4584664bdbe375d3fe86b0993b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKF;2uV5L|}{1!%6MImrzT-Ia9V2qjfM0LSS9QWBq#pw0v6cmQwU6;#x`fRaBj zyS74d38F)QcBSXz=}_ht2-VW!a*13-Ad&P7j}^&&R`<<+m~GtL{AE`PZ-G zF2AWuR~O(hwy`vRX`O` z1^%o8yspBMJ&)R|0;+&2&?>;|gM~Au0UM99bfA$V05AqEhHLqk16n44X~4!K7?|;? zK%Z*D5ySX&@HWJy0UM7#os5i(=Y)|>IH4FB9lVurGO0&xRRL9?ufUeSo$&sD`t|w0 zpQLxHfGY5>6fkj?XLGz#*jooL$9t`XpTpTWuJPEW;6k=y#PU|W4;KS(`2v^*Y&?R2 P>5qWOpp7cint, 'title'=>string], ... ] */ + protected array $viewLevels = []; + + /** + * Map der gesetzten ACLs für Top-Level-Ordner: + * [ folder_id (int) => viewlevel_id (int), ... ] + */ + protected array $folderAccess = []; public function display($tpl = null): void { - $app = Factory::getApplication(); + $app = Factory::getApplication(); + /** @var DatabaseDriver $db */ + $db = Factory::getDbo(); - // Daten für den Baum holen + // 1) Baum-Daten $items = TreeHelper::getItems(); - // Neu hinzugekommene IDs aus dem letzten Scan (können leer sein) + // neu hinzugekommene IDs aus letztem Scan (können leer sein) $newIds = (array) $app->getUserState('com_eis.new_ids', []); - // Baum rendern (virtueller Ordner „Neue Dokumente“ + normaler Baum) + // Baum rendern (virtueller Ordner „Neue Dokumente“ + regulärer Baum) $this->treeHtml = TreeHelper::renderTreeWithNew($items, $newIds); - // Template rendern + // 2) Viewlevels laden + $this->viewLevels = $this->loadViewLevels($db); + + // 3) gesetzte ACLs für Top-Level-Ordner laden + $this->folderAccess = $this->loadFolderAccess($db); + + // Template ausgeben parent::display($tpl); - // Optional: nur einmal anzeigen -> State leeren + // „Neue Dokumente“ einmalig zeigen → State leeren $app->setUserState('com_eis.new_ids', []); } - /** Ermöglicht im Template: $this->treeHtml */ + /** Für Template: HTML des Baums */ public function getTreeHtml(): string { - return (string) $this->treeHtml; + return $this->treeHtml; + } + + /** Für Template: Liste der Viewlevels */ + public function getViewLevels(): array + { + return $this->viewLevels; + } + + /** + * Für Template/JS: Map folder_id => viewlevel_id (nur Top-Level-Ordner) + * Beispiel: [ 12 => 3, 15 => 5 ] + */ + public function getFolderAccess(): array + { + return $this->folderAccess; + } + + /** Lädt alle Viewlevels sortiert nach Titel */ + private function loadViewLevels(DatabaseDriver $db): array + { + $q = $db->getQuery(true) + ->select($db->quoteName(['id', 'title'])) + ->from($db->quoteName('#__viewlevels')) + ->order($db->quoteName('title') . ' ASC'); + + $db->setQuery($q); + $rows = (array) $db->loadAssocList(); + + // Safety: Normalisieren der Typen + foreach ($rows as &$r) { + $r['id'] = (int) ($r['id'] ?? 0); + $r['title'] = (string) ($r['title'] ?? ''); + } + + return $rows; + } + + /** + * Lädt ACL-Zuweisungen aus #__eis_folder_access. + * Es werden nur Top-Level-Ordner-IDs erwartet (per Controller validiert). + */ + private function loadFolderAccess(DatabaseDriver $db): array + { + $q = $db->getQuery(true) + ->select($db->quoteName(['folder_id', 'viewlevel_id'])) + ->from($db->quoteName('#__eis_folder_access')); + + $db->setQuery($q); + $rows = (array) $db->loadAssocList(); + + $map = []; + foreach ($rows as $r) { + $fid = (int) ($r['folder_id'] ?? 0); + $vid = (int) ($r['viewlevel_id'] ?? 0); + if ($fid > 0 && $vid > 0) { + $map[$fid] = $vid; + } + } + return $map; } } diff --git a/com_eis/administrator/tmpl/.DS_Store b/com_eis/administrator/tmpl/.DS_Store deleted file mode 100644 index cad045a904ac559d6af53d08bb93ed9381a59bb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKK~BRk5L}lC1-SIc0VInb^arL2FUSX=tw@oQxI%(+#5?!`Qh&jxI56wA(xfip zh5+qK>q*AD@n&M#F%g;h(`rUEC88Y8I5|Ocz__11u}Nf3fhIiTfvUQil}q1jl4vD< zqXPWxj%i7rTDqs?`{i%@{f#e*MeP^hbNBN4vAul1PGeTz#%$KZdBXE=T*q_y*w((S zz+-MvMh)GezIHsnF4n`oVQt{IS5jM_+xT5whx*4gS%mDy-K&TD)KmdgKo$6_3h=rL z%g+S0RRvT5RiIaZ*9Qw{bP+qjuymjaM*v_3IvB3QzZ}pq0dx^NK`<~QsX$3J@rYq0 z9lVWkE@CGr>14vlcupMI#1o1Mql330oQxCHRuxbM#tIzC?UeWbo3GFR<0QRP1yq55 zrGUwbvY6wQ;@+CP9PhOjehX*gxK6N7!A01L5zAZgIXoD6%NIZwu@eLX(;tB#gEp$b Hk1Fs90pU;W diff --git a/com_eis/administrator/tmpl/main/default.php b/com_eis/administrator/tmpl/main/default.php index e2c1adf..b66c213 100644 --- a/com_eis/administrator/tmpl/main/default.php +++ b/com_eis/administrator/tmpl/main/default.php @@ -6,6 +6,10 @@ use Joomla\CMS\Router\Route; use Joomla\CMS\Language\Text; $hasTree = !empty($this->treeHtml); + +// ACL-Daten aus der View (für Vorbelegung im Formular) +$viewLevels = method_exists($this, 'getViewLevels') ? (array) $this->getViewLevels() : []; +$aclMap = method_exists($this, 'getFolderAccess') ? (array) $this->getFolderAccess() : []; ?>