From 9aca99303dceb497789efd1337aa38fef1c4b1c1 Mon Sep 17 00:00:00 2001 From: Kurzenberger <01kuni1bif@hft-stuttgart.de> Date: Fri, 11 Oct 2024 12:23:01 +0200 Subject: [PATCH] started with the changes for the recommendation-update --- Dockerfile | 25 ++++ docker-compose.yaml | 47 ++++++++ dta.zip | Bin 30136 -> 31473 bytes dta/README.md | 164 +++++++++++++++++++++++++++ dta/classes/backend.php | 2 +- dta/classes/database.php | 1 + dta/classes/privacy/provider.php | 2 + dta/db/install.xml | 91 +++++++-------- dta/lang/en/assignsubmission_dta.php | 1 + dta/locallib.php | 2 +- dta/styles.css | 148 ++++++++++++------------ teacher-dta.txt | 1 + 12 files changed, 363 insertions(+), 121 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yaml create mode 100644 dta/README.md create mode 100644 teacher-dta.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f88e96b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,25 @@ +FROM amazoncorretto:17.0.3-alpine as corretto-jdk + +ENV BASEDIR /data +ENV TESTDIR $BASEDIR/test +ENV SOURCEDIR $BASEDIR/src +ENV RESULTDIR $BASEDIR/result +ENV LIBSDIR $BASEDIR/libs + +RUN mkdir -p $TESTDIR \ + && mkdir $SOURCEDIR \ + && mkdir $RESULTDIR \ + && mkdir -p /$LIBSDIR/additional + +ADD target/dta-jdk17-junit5-runner-jar-with-dependencies.jar /$BASEDIR/app.jar +ADD https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.10.0/junit-jupiter-api-5.10.0.jar /$LIBSDIR/ +ADD https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.10.0/junit-jupiter-engine-5.10.0.jar /$LIBSDIR/ +ADD https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.10.0/junit-platform-engine-1.10.0.jar /$LIBSDIR/ +ADD https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.10.0/junit-platform-commons-1.10.0.jar /$LIBSDIR/ +ADD https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.10.0/junit-platform-launcher-1.10.0.jar /$LIBSDIR/ +ADD https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.1/apiguardian-api-1.1.1.jar /$LIBSDIR/ +ADD https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar /$LIBSDIR/ + +WORKDIR $BASEDIR + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /$BASEDIR/app.jar "$SOURCEDIR/src:$TESTDIR/test" "$LIBSDIR/*:$TESTDIR/libs/*" $RESULTDIR \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..e6611c6 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,47 @@ +version: '2' +services: +services: + mariadb-dtt: + container_name: moodledb-dtt + image: docker.io/bitnami/mariadb:11.1 + environment: + # ALLOW_EMPTY_PASSWORD is recommended only for development. + - ALLOW_EMPTY_PASSWORD=yes + - MARIADB_USER=bn_moodle + - MARIADB_DATABASE=bitnami_moodle + - MARIADB_CHARACTER_SET=utf8mb4 + - MARIADB_COLLATE=utf8mb4_unicode_ci + volumes: + - 'mariadb_data_dtt:/bitnami/mariadb' + moodle-dtt: + container_name: moodle-dtt + image: docker.io/bitnami/moodle:4.3 + ports: + - '81:8080' + - '444:8443' + environment: + - MOODLE_DATABASE_HOST=mariadb-dtt + - MOODLE_DATABASE_PORT_NUMBER=3306 + - MOODLE_DATABASE_USER=bn_moodle + - MOODLE_DATABASE_NAME=bitnami_moodle + # ALLOW_EMPTY_PASSWORD is recommended only for development. + - ALLOW_EMPTY_PASSWORD=yes + volumes: + - 'moodle_data_dtt:/bitnami/moodle' + - 'moodledata_data_dtt:/bitnami/moodledata' + depends_on: + - mariadb-dtt + backend: + container_name: backendcomposedtt + image: hftstuttgart/dta-backend:beta + user: "${UID}:${GID}" + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - '/tmp/dta-tests:/tmp/dta-tests' +volumes: + mariadb_data_dtt: + driver: local + moodle_data_dtt: + driver: local + moodledata_data_dtt: + driver: local \ No newline at end of file diff --git a/dta.zip b/dta.zip index 01aa7904c3ee85d7f0d91d2f601f81b77e96df83..26b39cf40a3686ca39a9f8b767a05ad14afe7802 100644 GIT binary patch literal 31473 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 literal 30136 zcmZ^~Q<Na>mMxlgW~FW0wr$(CZQHi9(zb2ew(ZJOf1lp_?Cv{mJOoCph?iJnO?)%t zrGP<@0sh$%pmWsz>*T+8Ab*d>&IWYy|E`GrUllO_U14Nx;N)cD^zTXt0Ba3K^)JJ6 zN;@zB0D-@+NBduuh6YAfCbq`3_U87>YBqL@^zeUr^c<8SG?g)T_>fu2jrdFERdmRL z0aR=cnnIW0S{4-ne{#6E=zP{iSwO-q7Z6W(ayw6FUXsernYW>V&}Bmc)QPe0{3e<} zQ3kO}2({Z`m8=$B;itB|q|PP$Ip5U8<7-Z^qa&{aEp|dnCh(0Bnd5@%HKUoL3{lgg zfl3TY2@&Y#fvQay4=}HigN{8-=Ni2{mbrq|v>m4r&&&>mgYBsWX<@-b85SZl9w0`H zM=iRF(Pe#L-b&}_8wJNn?E`jMrrKHG;9i~ZLi$O`WkfHg6pt{KB|Twb+#n$vQ!K5Z z-6MVpAuMR*R3sk)V+uJ#ClJ%0#AD!^NhBpJpzpYb)ymC;&YgD$wdVBaFJkq0MGv@E z+)?E@*-1_<2<Mv!7iTm{!ECkjVPf})rp!FvIJmvR4Thy{8{D2fA?xPC<O6@t=&$i` zbKSt?`>~$oW#cvj$a0VsneR0mjnwd__l0YbA}aCwhLNzK>mc?gPjjTQ9vQ~gGeD?x ze7UTTK}aQMv!{DNF;v;YD6W&D!`w>9HV+%lXO2xd(A-~;vYTIDgSOgU_g6>Oo@p7T zFR-5)q57U6E)I`|UUE==+!lneClR2ekPOg57Av_kT=8cbBN5C~V)&*OLbC4r^O;7c zizmgH4anb%C78&Lh#eWvM5Hw&+^vBnF<Z!7Q{Qu(;|+fCs!kwHtP@DkkSaxCEJDRH z#qQ6(A-<2mhtz8fm4ql)%3%|z&zORt1QEif?N3+Piw}YrSo?2+uJ;0-6o#Os^1P1C zz=s6bd3hyUfn)le8T8qdP8J&VWym^$*^-6aDe4+Bj5{xvQfER+Y+r_gEX-;Wkd>;u zxtHc3@k46UP0Oa#m&|Ij=Kny5O)-G}_D3B|bfDj7RU>6ts$km)S+@Iq?zifMfhv+| zg!m$1cQjb@85pxdwPK5x+jXAz6ze&tQ2TiD8?t$8#45Ue#l1@n6OCc%ow|AQBQ#5N zFhu^FH+bz6uZ}>3S}-lcHOs2nIcMNrVO8xrTHZByypqMBj2tUwv}6!ZCD@~ZZQ!wx zujRrolCb7OMCXxE^UrceeSArTVZtVE9qkZIvt(@Hm`Sz6tPvBnr1KfN`?gR9f|MFA zO)Son!IjM|DmWJ`v$hhNrY5wRibs-}Q3+xl=U}-U5`y-MK!`zULi44xQ;<uPIaoph zu-$G2wzUta%p&-bIhR}7{I6;fhfW_j4?Mj9RotQ=H{16h04qyCnqo=uOE6}Eai-OZ zgJRj;U8q*jW_@3_vEsU7Rj)47j#>{%GaxmrM#Cw({O(t)`IWz)<hpA}ds+Xd&#bzg zR@tN(%cH>Z_yw>zDqfus<H7UrB_N#gIqq`b#b|0a4d(mUL$Gj+S|U?q!!Q+H78#YX zu;!?Z5E0w7x>*r|iLkk&Ry%T9qs*BFIy>gNLHR}P5(s<Ot#Z%gTLU(*OU5EipEEnM zT_|aFj>l2W)^~Y^n)PYoI24d@`T3$UT>rUbjZ3?>fLP`8A$DivB$dklPqI>kPF=M( zV}-jbCM~S^Idy$#m4X1E$QJXO3xu*R9VSraUS-CebC}M#A2xJq#;gGB?uz}-Ni=?u zp8@X?MMqs3-3H+&`9<p(WP`#<+wav17Um;3W6xvu5DzI8-$_FbCaufv_}Y)+QDJ#+ z{>fqF%^kS&j|OU`^FIzzYLt|}xh!{PRGhjWvr0OgqE&*~;IwB4;<K(r*Uz<Ea;9QX zf3JDNatwCc1NZoaeetMmx>Tu(bl=#e$Eq|BHum33__1SR!_I<r6YPM>>EXhLGt@As zj@$D*ai@6$?u)MK&{4JC9^2ws6IrL$U|l}(WglQ{mq3K6x8t!u`dF|jCv-kCw!J=A zf@k2BlxWy@FE9y?R6q<W<*2fn1tWRs6@A2wxn2`tUk!G1x$TX>vY#FzwfUXSytmWN z>v4-AE81R+P|Li9j09=b_ak~}leP8qg?-(z2-((;PtaoBJFxa|9>kJ4X7brw2=^Ar zN6n=KTXoH0bv&bjjF4IiLAvyUrA%IP%OAHax;G}boiDuM%N@RqlHJ|S<W%N-c4r9d zgNfZ-nwyfUal9YevAkxP#Yx%obb+iE?G7AEJ(@Y_aI{JLrdkrz!t2bGM7@JlS9rMw zDqgYkz4!wC3(X(^&J=Uhgc%_$<^N)o?_YpI|6dqoY~XBQXy9b>4@eEGYyAZ&WZ&Cb zcEO~zIdeRBENl4@u%wZ6PlQbPimf4w>1_6foLH#)U5?ls_ST)f082%)Q}5B!hxNQg zHoHZW4J;V_24g6~5sE!G$zm{selr5WY!67O>cz%>{FzZ70yN;EJv{@1x<o~J!UZ|u z1t#?<7@$P|Vge=229MHtX<&(gfOz<*coC~7{gVdbV#KG!z*0ulHb>q!ceao?=7L1~ zw%L<xQ2R-sOmZj?BW5N`388c>K8}NpA^H}EJ@I^_!VGcQ07h?G1Cf#ehAu}dWH>ni z@x!BZbEI~V1k5eS&`vPfrmz>Sh_rVDa_aGJS`o>6Jm=7L9)=kMSpp^IiMMjVA_nj7 z4DS!doW8poz#cfUqW$foeHP5ilD;x$k!mW`vg`u0De*+%T82CC_saQWvS66q-K`yI zTzc=eo{TM>m{I$06A+;`yjW7Uw8hPRh?}yaPrAcO-oA9jLu4FlD%<2&aA<Tz8FV#~ ziC=4qA@ld}sm3Dp&44CU(J}n^3(q$#7-Ydw#tCKTlHms1!toG3P*8(jhreH*o|g28 zHD*|B_bu(`Z=b>Fbf5M>i%W4N7m4%N@>y8P7o(Y|<@+KO%?+z|N{HQwp@q<gQ6nZ! z7?et58s(F=`rg6(V?$&#vqe4Y#6A4Vjck)Tdqb9~sM}3MZ${K5ThuM3b)ed&&F{pG zA{{VBf)+HykzmV_`ONbZPKj9=;5<E=?hJT`&rrTDo&oqgV&4R252<4#w1E*brXay0 z^~O4bhnjA!!A`Jr8c{-ns>PGRh)1rMt+~IyJlH+`o!nPc{4*M6^15wnI14EcKW<TR zbYjX{lVYqUwpeJ_wVec-fzT32Aoj6&q=btJAu%3C0s*BcFjU|&{MJpS5P=6d@zzU> zn2ibE0Qbb9i7^xU7vQ_0FM&m^_|~FRl+73eeraxYwC5T$QGi8HX3n8aSzFxJ=!$j9 zC6i+I7E(h_-5W_7GP#;W6o*IUViVE-G$HZQ;5I*w=VfObR2Ac1)*?3U8OCb8o(*~} z62124c*(Gw*rb9ZiAluzS~wpKBqMjC4z%CjKL91AuV)yEcsRSN9-dHm3w8Z)KSoTc zzroDVVYV+<``DH==T&I>@s%4p9aUJ)EV*#Ws(@X*f9V|zRp?1tvZ7PCfl0-aNX*f8 zN)Q*wRj=R{jh3EILQfk;#vULmJol*Nx&YGf+&SF+CV@1E)=Qu2l1al$0R>c{9N>4T z=O3bADdVucOdYMbud-Y}R;!ABxH?=)pR+F$nnXF=+kBnbQ4eZhpya!kNY6t}H6Ywr z=n>Dy+R_+xQAG@4P9d{3Vol$)cG)>>S)YV1^E){bh2f+wGc~mZrbHu&b3odJS2?6H zJ@I#Pb*&qxABYkQJ-y&`IXPZ}Id#pi%atUS$<EpKf6{iL=WDDN4>WT~G``Q4gr+<( zb#(-eZ46dba5d#3MTxXfJvthVjl+`oyzUfO3vm11EUI!&;kSD1ESZM7^-}GJYT@$l z-p=p2H^d_^_9=&jv$K1f3E(3^*n(dRLgsNRnD&DH<H2ScjN(&l3XEHLOE}Tp&V4b~ zqL0hs#$2PiCHXq<TH>&~x}+23xA^iff1(flt_O*FL-79U9@NiP{#8X`NJXocWwM)Y z<hftM!Mt&C_-n5sn6M`I%rt#=z5i>-RK4}U#bVo*qmrFG*EJjUGZH=fwj{D-*T)%V z#*NBQt@4}n#hBKlYPXAT9Uz;r<+;iQ^Eh)QwJE1-yc&*JCYB?f0VO(ZTyfpfa0Akj z^PIre5IWzmV|Ze+^t*SnhBP6h9c@7;Khlylxd~})Vd_GdtdJm%<2P+lPMshg&)AH0 z05izqFR4q`m>ks&fihJ%u#>dN#7XQZq?&*~Lp+X=y(#vQJcw_HW07|-t$W#-Id#G@ zRBW;-?tZVHPhFxvr(C*RxvSwn-n*-CsQnJZHT4EIYplD#y6JFnf9hZ&so|iORo?xE zFC<octJk~-AE30QkZuW-ZI2a&IAl3zu0B%DyMnLUvoCuERGqf$n_<{VA_A#t?9fB~ zC}vTqdnZgJeEScwLqD}EC7mw&-DejLd1|@EycoI0+4(%W*`}6z`%psOwm*UYg+hN- zS9kXRP+k9Mv42$8zciJ-qlK%1k;i{%D_EFZwb0>j+z%)K07hB>0Q~=-C+r>VTrG@E z9RI<uZA}fkMSghS*;;k@K#-85fYxNHt%Q7jtzdYOR4Y5gAUfAoScHS#$7x(%L^2sA z{%{C|O)e&`*O_RaTLa!%u0aB>46#I+qI9OOX`cdhR+HLB>Y*eq>l$TVOgJPTzOf-| z2<$H>_+Tn_Gsdin5W2T;n#Mp--wBXkMCHQHs^tC@CuRHeNYvv4<{coQo~p$JXwuUh zO4`JTT$fpBVYlnhxsLmzS2hl)Vt`&Kpxi0h?|TWkV;sNMG3MvdXCuOl27zxF;a^me zOMFI%s-RtGLWX!ctzPXxKB<v}i!Z4TwCkwJx^UNY8rIZMF7##Y6nX0qOENFGCpl>O zVHRi#*-g!|Q4-~%+T_LnOz}v`=>E2<!Qo)s)!^HixwrenJwTsju0cwklMtok13Qq3 zIPsS<O@G_YpY{2qG=2=e+^)=QZ;;Qc_oJh`^?L@dKPTZa>znuU<45D4YKKHGFW>W< zY@@Sa(Kt@B!UFnPj%6FX^7>;bc*6@3UkIcrd$e%tTYRVVHho1-cPEYblWAyKG2w3x zsWVOKsv-JTj3ySPAJT!{UMtI}QN#MFs2i(>L9}7Nz;a|S$h1#<`DO8oG$^AQi4%=6 z>6HIi&=xxJspC3xf(k?8hnnH#jA-nQmO%zX`S62jU_bg#dDlUz-r0esT{sgEw)KVR z3#3y1(HXXffR)m{!Jw7H32lFVXiFC<H)G&2grNRqw|i5!NsYGd5gb34nonX{UoU<c zhyO>-Z>0th7G6t<aivg}QFW@!l6~^9Uz?<!VSQ8W>Wdb8{H>EzD4sBL8U==u@ugy~ zUoH2J1Pysqx`ObioY1$IKPg<7FM%K1H4wcj#nGJX1d^YGYugktZ0?r+lgmb7KXb{e zuwSrn$b^p*Q!5LAFZ?IFfdDbW?h1fOc}(@0c(HHb*R$T6zp}NrH@Am_``4fQOURlX zY)?74k)6l!O0&ZvGoxD1nVZH-6a|TwPT#tT@bT$4vH4@?5M|&R#GIXQKI)cFV5S<= zHs%?kuV9s(SzG1ROv!83ELAMogi+@f5`3v<0#DmO9ZJ3Z*(Pz=7!0*sq6M4X7Pbnz zkHL(3ILFffyii=>B&l-ugJFe_X6U{PHz_Yv9D@hd-uj1gr^i33E)fYvR?0#&1YY1d z)6wuN8FcMod<=R9#nUkQJQCjZ+9uQ6Dr+fbBKtJ1KLXI5o2=+8cb}I}R88M!YH^$A zmE`+(0mQpu?h#v}9;jw!zE=i3ZxtZ1{ywhiL<==V_<M>6T`z&u<Lw6)@DA;>zF6YT zmT-lScN1KgjGL~V^tdhaKSl_IZPbR(Kj7g!-8{;SX%G5Ec?vk)F<rb~uOu}IY>7Kb zXQYnKidRB$cbbs03N@%ew5?OG1zJM8lDH%RQwvnq`VdVv^?J6AN3EyKAm$0hx|+mh z+E)VI0lO`LvBo`o@0hMubH<E{^SYXDzk5j_F*CVN`2XOfI7cpqUTAw-Po!!IpTV>o zP#_Ndq#sncTtxJN*)){gbbLXoC>eAzfT)F-D`$XvUZ0LUaE{F#W<j-D;#ngZapLN{ z7aAc+skQ*<R{Oe%yhv706EaJ%{oW22yb>(}n9Jg3Aqot!Wt7(~GYDQ;V@*hm{OG4F zs2Bw4|CnB*VeqMB1p6_1(5hNrSwobIFmE5!U%l8SbmxDGM#g2iQ_y*_l^OXX%Inp9 zumhWOHyf9LFi4W+h%zT^M%hqo8q^OqsB*?wsS#JzG#{9dxDkl3t6%+cG7n*TRIU>@ zPne@{D-}6Raza88eFh_4M7>F(C%BE;|5T<x-r33Y<n_#zu|Pis<K>J();yZ%A|Y@3 zl2W|txWl%Xgg5np4@iO0Q%h!<%FnR})t5l1@?I0Mgf7J;sP&6h$bUtD9vz%~6{kFu zi~$L5U>_{YQZ=SwD+Ny2&8WJqGNft`_k3PN?A3YF*xcmPMGD6>62Tq>ZO1s)Z1+)` z9G!{vk4eXawE4S@P>;l)X(KY%Aghj#4~joT2L#8F@r&%Jql{WpMfx{^nN!sm_~<cK zxF*a7%}TPJK0e|Cb56LY8^AEQ>waaw>F0JXu0-XKU6ZUuw(;nX$%Fkzhow*pndO<+ zwU@xSlW8pSQTWN-X}W3-GP3CzKk$^pdX;9sKYHA7mk`Zc-Q)wslvZ>?78PB*t~Pv9 zQ5~+_ZF9{%%L^YH4f!`getY-JmO$mnQ|RqJges_D1(}urYF8A(_E&5Q%K*#Zo%G@3 z`)pS$Twsw>xjX7DFkEU1>tP~NHFRRTF;KbTqK^fUa!!CMwXZ{g1?Tem*3xg|#_$){ ziz-}qtk$S(<bXR@sT7`p%f?RB##-piX8|A@&Z)Bs9nFV-^*)79*8oX8WhxwU;;T~_ ze5zVhUg=+qMVrg0N-hL0*0C`sG?fyMwMyRGT+I^d2{V>=`k?@Y#CM@Wye!yTt7i4f ze_MZ0pQn-KaP^20O*(@rNdeb9k-rWtyQcV9S|lK9!Kp=yQ6ws0+Q;jLu_0o>ICW#? z?l14nyHLSvEcwqZOL}N4?aacC4x`uB0C7?)tMU<SQ)S1Gj@?$5LAsUW@{>zVzG{Mn zE!gGza6G(n*k0xIWGJ5o@o<ELcFJ*9vTvTJ(-SVoLBdmg+lb{}WQ<Nht;dwbAwZ_t zD^H4pF6tL=+3=iUZ67t|iYcI&0vY9*Hl(=Wu63XBgh;e)o?SAp@cMQx@4i=y1WkHY zLi%o>T$)9-J2@D*&j(jHn`kTAo3kgEO4=ALuOym05CEq{)~#({Gl{-fRFB$5210BG zb;)F><?kZ4atYg@)Nc=C+x+sx#$x~&!d<bBFuZiq$xiXUQ6b3GkqI&1fn@rDQSok% z+8OlBuwV)jWK|qN0a^>6-;U|$L+j~aZ{%W;VntK4b>O*a5sn_*VA0ovYEogmbV(5S zLo+_i{bAHz!g;C*daXlaRL2kl^#B9i##S9(D@MvcD2D0K(x$0uVecmZb>`MGb950{ z3#7-v^=-nt+K}CxUHnnB<C20RUj3bqFj$ApnoiHc5^?JoJ4vh6ke;PEmJrl^ST_j{ zwmsuqF<Lq04C|r&B8fhYSACPAHX5zl%?wUW8UzK9bGVr2$)qy_C9bD7RsWDTRz;IB ztl71>$<nAOH=U$SvudGoU>Vu{veTietVgJ%_`#p{NduN=y08HZ=6s0Q298mn%-0iN z%gg2aIx*O)b+|gZv;X$oScYb5Ea#YMcbkw7*-gT9S*2Zi^6b5p+@#p+WlV)P0hh;y zXU9I*dO}aODuVI)F=4^!cyw>Dt)!|}Yx?Cm{;uNM8u7$t-J6TP8%a$KWE)3<iEqUe zq+0xo0q4H7k!4))4toOtxKuaW5qBX9;UlqfqqqCaNvUw8>9jb(hs{vlS(T0{dV?Ic zwC$G^HCJO{99o*XOY4gS368Gs-L0o*E#4f~;j^)-N&SX<xlHIEsJv(MUIT6LmXD`* z{V;MpEE|NXmm^UPknKZ@V^|x8HG|GCR*;L>wa--zo8AsZIwBySks`kP;j+q3N8Vv8 zY`73TPgZdk{m@nOmCmPv2nnDVL_^Q(q)$uP`MZ+%4kLy<j-)7_Cg+Mn;6g_gJdF+o z3<P399@j_G&4!tq-PJ_qHtqXvIZc>Df|<=uo*e4)77nz}arWQWveD^hFJNgKhTm(A z9nM+F;}>S9X#Zl`5C8{%{hqA*#^w3Hy!l%M0N{T!ZC48uw|}_uwU$>LA_M$So*aX% zw?E-qI79p6(&Nl1iDxFTQFME}2}NDUm2Jnikhiy+*#_+=NMv9kLd-zR<JnX#({<D5 zo&r0Z)ita0s4a-ls*(Rs7%Lh)%)Sad%-y&QIyAyf^Cr@JC(4}ymc^ajLXbI!5j?06 zLo>%_kOq8^(P!U!Ukr%bXMLY7khR|&9J_R209Q5vxF_l-@Q6S(2E+&%f@CURZeCBw z>6F>l%bv{Et2Vf92izkO80&?&Tp<G%f8LvTq*<|$*tvf%kg+v1+g(<lw)Lrfzk6`+ zeobluy|rLpgv2&#F-I6aaR*oh7w{}9g+(Rv-TRw7%4(YSsKD4AG~?jBjLvKjZxFlT z;F=X8gKMZ8**043uIv8Y6HgZxHy0Q8b<ghTj3Kr@Ri}Pr3Kt{~8pmOH+jSHMCG9XD z50_^EahRN}Zm#og(Z}6YvDZh_Vt`rg>>m6McCL$D>`o6icMzN1>`vDWw+)~(I#KDE zeuhKX0-t#wAX3Yv$aws2krdI=3|8M-kN%lvSUcM9ELd6i8P(31^fleRxFh;zNQLSo zg0}#3!Qcy?Ir%Kvvg!mpsVa|1Zc9GvWy|Z!RV#ZO!+lTM%)$FB@<d8Jw_gO2pGa(p zv~b<-M~Ht4*N~2i=Niq#C5GaJHs6io;KkP5j>?p~1L{n`X%GP@p9<zZt;siv=B#3d zhm?$b9}#J93dxZ5iLoxmx98RKMce`Cj841_kywqgNr8k3aq0E=$AaRf5Fq@#5D5%A zOG91u8!YIGa9}wDYnw6m#4v&Q$WI}ET?McSg;T(I_K&$_GRIs)3fcSij~Wx2iqS^8 zj<oO@(#UM5{%{50L9%;(Urb*vmX&SqobOkb*#oGigj9Vef)P2g!*Ky+(GP%j7&6ws z!;JA(tad#bm7}+@KTJmcfK>0n;eRVEv#0=dnsU<s*|Q7nlV>%;hb-!!VzVPLyate# z^GPmAfa6Mr8#dD1^%`7pF+ZLHFAU;0aK5DFHJnTrmsgcrTU=SZFL-<eHSS{|&7jkZ zuUEexPHGZs{<Qt1a`&{d86HRjwHIyV-s?L?EBkO6K6jCNoX318)5Qd6TV9_!vp4XN zk&YG0;DixenQzJ1Tc{dZ|2YC*G{)U0FHQoE_0I^VO-!gqKLw0q6q?HpN09I~o?gap zc{UDb!?S!5L$46&1_TGUhpy2LX%Z5hQc6s`UiYs}yauYzKJeoql4dhPmThZdN?d|) zkpfO|`dq0d-3o|?>^+5f)fN&qtWc?Qx&%mtv<+Bpd6{H(X-r6pNyV&BV45m=pjYC_ zx83*C*qmRaf|Y6%=kr=fGATjG;Q_tv2swjSpu?#XG1$hsxjq((O8&~9E%=7#Fzqui z3<xW~jOswgFH2cuTdXY8w=Q;wgkaLoDzA#DU|Ejg;Q;kh9iN;>_n6Di(C;~HfFOhV z#P;m>|Lb=dYlUb!TBed>sRTk#Jmq3YEw@MNO~^|NqLd_xF}f_%b+$=<Mbor~6O=N4 zU5E>n7)ibd-2CBxmhs(fQ+Ns_6xB7M#Y3Kc_s#Y1(El;stE8Y;&i-98-*pSK>Xc52 zgFqC9am>Tqq&+d=Yr&s33Bpm9ssD>!Xy%cU^+5yCMG@rUURw})rvWNR=6aKpTm}dV zNb);mj`F_YPA=+zSah-gZS7#-r3nmKYf+4t-|!Ji5t$%!fcd+Hd(7PUg|US#qvb6{ zR1e4Vi7{a4xpZq7Wou`rulu(YXr}&tM;Vh`6(_8gC!x1q*I%?TXN`|)=j+B~)O;Y1 z`PoOAWx(p-T{jEIbtn|KAyg+O(+U?Y+Ab<?7HM!Pxn89vynM-sxx6dLEN@eTHcG&N zvOKG2XarA|E`{ulj=-a)7!3>xLzLCI_z-mEfi7Kn_YH_b@JUcCc?GgS8H9<Mq2`FR zBLB;-t1Y`*^fY&9@Xvm)Q1`<FqBynq?`2p{BN{I>Oie(O$3b!Y(cGEGiJ{{7SQ$W0 z5*_|}LSv;dA5mq(^G042xi4*>nqBcQ3Xx`o9Ii?e*A2=Tz*dF}AR<a!(T<i=Qe6t& za?aB}xB(B+2+@d&Q#HywX?L;R%hsgDfK;abB<`h!4ZePkcW$6pI*On>wSJuJP^RmH zHTg4DT$BH9FN68H!GTC;XLr7&3kORQ)~bqMLv4QSX;%<aqTy%RIX|_&!k_H8-@v2o zRCGgmn?CJ^dUu`G-$T|2y3Q+pLdBu4JLLPy%fp~4I|tmx#@2@#UB_-z;#q=Pu6X;W zo2H_S>CUmbg{-H^P`&MGxBRZK8r6on3b|-P{sy)MK><Qvgk$p;=!X7Dfj*Pr<lTk> ze@0rCFNWqYcb!lC_n#>vMCYHwnI`wQ$@oRZmN@31iwjfiu9pQ<CPOz&wc}AAZ%viF zL#e(N-i_4Tx{4*u9)G$Tm!$%jKU!?z7N%wNQL?%d1FKvS8F?ejEv-S$KlM7JKd=Gk zlGnRC@Zz*7(!WFA=6+%fSy~c>TZ)hA%_$B*O}Hr6Qsh{ff4q+$;AcIJDd6v51abXE z+|5EJ&V5Krqu<9l;FqhG+Y@WyQWrGMC`~j{5Z=|2F}TQORMDZ`Kofz}j;10d?=+7# zLiisOE5|uzF-sQws%|<S#X6{F?2tV8yaGF40<Jd9da`)>MSd=$0zFTX7m*_<viDJ+ zI7}AbtGPIlf{+z2swzy7+tp}*Qm6ESJfg#OezH9TAoR5EHbxgxDygMv#*yo%bg!8^ z7jHwGDSV<rFXn?kJ*=jO?TCFck58H#DkP<|W-3J6nR14ixstqUHf3@~CC5x>2~$pf zoC@bPhzs~72f+AVy0$=xOb?rbJslcR4e&=P5{CAG#*l@&SZ0X|YNVjX+py>8+7;q7 zFUk>NjXT_9OTQzXYG14(^mB;ikzJTaE+^@6I%nK{Z31hA<#ma$E?~|JSit$witS#2 zWp^5Jz<cox%Nv#P6I<mf6!CiB<yq&!JgGJtt?G^}g*u)otem_iH_p6}LN~V78(2RS zLkn2lTB~Hv3&kun(W_LaD5c&n779N>K41fL<JhjIX_1pBnXpu1w+d1Sb9^hWyi3+m zI!#a@fAd))8TT5oGBAvepvLuj*(xeW!q&c9udj?s03@+tav{^o%|BV(X_wEqcICS^ zQF?c#M+1AynM*@r>P=!X(pGXBdHc}Opfd-&@F!pBL=LoweXf~n0QD9to`}9AHk4(I z-z&L<?jkkX$Goe#4y`1UL|Kq@{w|83#oFGyjtsJg#RdIS(|IOsX;C=sniI_Q)_gm? zRP}Vn>y(tbb3dfknjR!Bt7LDoZ7FJJO<J1|w8CpxT6Qy#0|lG0mOGNfYg=<xMfF4O z)zk<UxZ)<Y!%{gX4E6G*&x4M^Z-M1`3Ts(`$+J%05;@hgswyO8Km#26v@bgdtn!sL zS3v!Nc0dHlkBN02gflFHURAIEHJC3hZBen72QXx(D<llm+7q}rV@rE4`DAgd>dCCq zTbRpj$F;(IDjKw&IXcNQ28TpXr(SUkDgpup)<ApKI4h|0D7rhxWgWcpu+rZoo*AjB zSa%WywIboObEIr!Wrlp)hEqznCGqEpP{)7RcuRA>U*sP9pzm&Z2!uH1p);o8=PPFT zwi)kV6c_+tu2JiMn9bn-Z5<mM{)fMeW2&j9k!D&D3j_e*0}TLx`2UJ5Y@M79tgUI? zZLF_Tb>uebkwb42-hQRl64-JT5G?sa1;f(7Mu%Exi`X8tpvK~?&uISn&ZcVzT}Z7+ zYExHH;f<Je+IjP4{*Drv=))sKLD>q?DFX)FuNNoJ>$qd+;@}P0JNUZG|M5E0(+m6* zc-sys7l&7kl;u!-XD_L^6O9-l#}K-k^g`d>0j0fi@!XbeeMAYY?A)J&7DQ7`hBN_@ z4h9h-Ky0)=?jHo!=M^PVGlLe<VPE9r5;Et_<9eivjaOQ_bnY0l7rT!xeoJ>OVThBs zw#=SsgRqxW4mDD=c@T+qdGCu2O6`q~O@K^Y>YWiJ33bxV|JdJKcojYFsOP6g_oS^V z);dm5z%A#NsrT0Ke7Up-U{=sP!De=o(uVA6fBw1zv#VVqFb5KNbJnYB3+;Oiv=brh zAl2#DLFfMHfrd@zr+@I}_3Tek+dPAH5OJ1li**f<qgS#zd!hdW%M%-+n3OG2FV0jb zGp<;e$$k$bg>|+BwgExAAe87MWMNsyKCL-Zu<bN4gx)yDK02$J`9K3%G83Zfcv+;j zy!f-vqmtTeWlCzH;K4GUiBeF-{M2)L#L*zK_?AUWdZKvvQ(A-DmDQk<iFJ&EWmV2I zfC0FI!R!O`6kSoO=T8iiMGQ!@^1EqxwPL~6L#;%l3#F@K&DI*}qKddeR@x+)p*5F0 z@ptxlOMoF5D^Uq#Ma;#I{dz=hhUuUZqQhg}z3=0ztZd8epY)8uH8g9jsgEmi8%d{0 zC#wKtNs395h$pEPT8qX`Vs*$KVEsdR?;P;{hh#Bsxlv(XcSNR%@tU3t`6l<xwX3#W z4&SDQ5HTs8M-DS@mKNTh@LFeI=YiGB1690~+Wu2Nz<;$k1OTd<jT%q}HB8*!?#=!i zVf&Bnb+I>dG%)_J_52X!e%lRx`0hs(r!#^Ga^9m<VH=9T;7CLeQG_yco49M4mCltL z>ZOX0+Z-L3n5Ew$;&oh)J6&u{FWaXrw%`Bo1?iUfCdRMY_!`<)D+yWYW>zq=(8 zNpr<UR3VMtye1&jqabFIo#9dK@|kcQ3;GQSa5OSJ4w!)oqK4GXr3ofuF$Qv0K{fL+ z1Ljy`sYVCC9id-;&qIMy<xyk|3ZDGN3Dl3-A6ZuCM|CGOL}j*)#e6ePSC41*gdpdz zHHcfe$Ef+lBpV<=#}cOn0X;^Q#<EYNZUrVe`{n$UcHhXCO6X!-Efe(>HomqkKnaQw z=%((;0;4Y*TITU_*Cu1owbj4q-i=GQxJ^T*WWyfm#jQAAs*;$oo`90ciHbWZx0(bV z8r?gC_UJtNV8AMuwm1!D8fS$*XxSxunsja06}s%&?YSi_27oohKLPS%X^U|>2umFw ztbAkaF-qi8C5s{-#q(h9l<c)aiqB^A`cn^zSP)%PINcLMZKWH?$_z64aPy(Ug$-9E z`PpW50pT`YHm@JAtpmFU)na2J5}@7APMNxqARlQ&@Ku8HUill|-)(qYk}Hp8Aq0{a zjo4694*JWZ%)IVz=BU_m`FE)(PE0jwUGIr2UMt~4uryU==2{C&-CcUGVGzzn-SyrW z+HXirD_wfB9fx^#Fj6x*tOt#!z1{Q+9rbyC<0tT<NMBH+AwrKz0wz(BnuW{k0m~nA z<piEyvyb+&UiU#4NIviaz!XM|*~>v=S3fK|cV#3y8fY~fIdI|o0~{7_*L;t=8OTl0 z`EPW&jcthBXdjnTnHj4BD(Ai8nZuWRtr1Scwbt{aFXiFPZn6ekJMdnx-ha36|93(| z{`c^;Hn27O_lyPrs7v~vtA_tdV*Xc|iS55DApn?_a?~c+T0*7%x*pt=006}Q`NF@I zf0LUQX0}c)hBg*|&+KgV{w_ZL<AO|Un$7+b%bcmLgU169nB1wfCQjW!g$Gh@k66US z=4!}EeYk9I%$eteti&fKwmcni8a#Elt?nGIU}wcmT93p^bm)ip(v!D|m>7dDQB3EM zQe8o18#&yH5tF1F?F0UyggRP|Mkr$JEXdr(*HTFgmMqkmh*|bl(8O;Ho^Y;W9#@%Y zq!I6HS1grA>NFf;%)y$w0+ZA2A&^Tq&V+jC(1ys3Kjk)9pce!rnn_2I8V5RNj~xv+ zxM1iL574)4Pc(x#ywgcySp*w7GMrO@<Q7U6B_JyoIm-ME^ezjyMT4-!T2(Z5x54W_ zP?FT42pWWk4^y>iPcRmkuuxZpY!;6ZKHh28SXR3;HFk9D^<eAh%<RG8<%bl0E!nTu zVycTg3*9fks9s#&qy=!Z#K-A*hpbNen#beE>h<ex{Lrj1Ev{7Q;cXcqBYrihXuT2K zE>|vg?2=8aR!;^m1|owoR8XKV-iZkf&t89m`glN@v^Ojslb=knq0kDfKn7h8m{k%{ z#o7;>6<IJOQOeBJo}kY&6`}kJ!w_JnI^HsC+O#RTWRhinefn+YY_0zOd~tNlf)O-t zvP7URpNB5lcp>p{3B4z|RQqU4zwM;FWOSAv;<%w$N;H<q1A9$jpgWLM&ptMumR9V5 zg-8ONnpv}MDmE<yz1o_#>%2BE=~)CKd=`rgjDkh4hMHZJ>Y>Yc94)nxX0Z)7yxt`8 z47!@PacF=tza4OdL7l6{n}gGJfIW*3n@+g>NO2(>=SSE!>F^gy_~I8<u;EBFC?=yu zVPDcOvm~WayOnHx9vz5O&K6k*ww#GD?183W$39^wQ|fejnr9lmb~{{<--Od>;Sp1B z4NJD)1#CU{2h^U~B`G<ub?PVH!@~QZd=FBs)WL=6R$%BLsgbp)mnfEj%qiw9#DD_W zcCon$f)3}}1}Rcf(@-XDDxQ}OvviO7to*|6wmq>REa6x|%IBx3s9m9UhFpYp@X+FR zb4xC9r4(X|<?veA`M<F%B`7%FSa_^B-hco(o5&D60ZpN3*D3H_16k$wv_s9JOQ40p zSt-m+n?<|P8(C71O_vT82dOO?KkpmjX*v@=C;+SXngaJ-f8A;+LW*s2KGc!`toWvL zBT1tUq@h(_q`QG)nXW3|J*@)W@C(>J4uP_mXpm65L_u88q=JwPx~tIE*&DrK*V2+y zjUcQD>QrkrLT6qdQGK1L7bu2i0Y9G?C!x53F4cJxRA3wGL61?*EepnCB57Ho*+XTb z+mdQY&#}k_FtLZ3^}qIBq5i6iXnvh>(1XDB@9ZB~IS?aDZ>LBK#z;yb$Pj0mhjRnl z6oXU+E2Otp(my{LDA~!jsCE|F{NUdTV^yQ*6>kn`YLYkP31TDl#=jBDBHGI;QU@a? z=@MkAPKcrjMF*Bw;t=Z`+C)h`Rkj1}#cS%-GAU1Y(oV=V4MiG~aSmA6i3Ee0_qrRD z#a6BPdwbNB$K2GFe6W<w&NXh;0LvSasZ;i(MdSr66jmk))&_IU#}G4GM1y1VCsxVW zwp9fFVQn@ZW6D{<QZy#9vq{XhMh3PLDq1=BiUVeBl2MPo`;tW=iCeyK$^;ytDs_)c zomC;CX^*?oLUH)lsBtLLGt`6z!U6pTY`WYo_KKQ*O&HrN1R79e0$E2KA5oz6Z<#xY zufU{qt#-|ba7A(y%3FjW5C>EdVR;i7fM)=|1vqJ|3Z7xD3J%n}@Ipw6V8%Z%VosWA zt?}#hBBchjCwubI&Z=CW8t5az=^ZjFo^Hhq7**HCx|khRszA{ik?&7nq+VzD#cguD zAsic!8h0TzQo~MsX9;jB-m=iRa6EebtdJr`4<8!8y89~yQrvDb<Lx_R#?A)x0}Zoz zu8T8%J2sW0{NbP87koj9Wgw*Rf!vwga*|cFW4sk$zb!wEjwPpKpI~n$8i<OepScRZ zOC*bK<SOjCA}_*@JF8*uU|%E}sEn=SJ2i^6ViC)JWO#NF!y)s%^24j?*@`>&>GO2t zBdsk$J@t{+7Nec{N^gtQ&3<91j@#wGxjp_soz=3ZbAI2}%RCi7MuV%0#$E*;lp0gj zM9yw|^eJo_xfGl}ru&IE-#6(~E~5k9grTgWos^12^RcHzp7UPPdDDWw*eaJz#%}?a zgcDNiu+ovFr<>yay*m^P-7raoJEk_^KbaGmR>D=lnGvxY3&D73;DC}V2DeYF{YJxI z5>a5jc1fNam<699G-z*95)yQ{4S?HzS2&MD{B}%>zlYm9`7$!bmp~BlNdEO&d6u92 zP1@qJw)-oEPn}vzzAN=YhhBriL|+-e3(!*ldPN#Y+Sl$ui1fuMJhRmgu0|){565Kq zT`pghONdQ6a5A3|(j8=3s?>)8fTSiA+Y=@KPL}^i*sHPf8U^Gf<ui;y?^hP*1!Wba zni>4mjOQ2y_xeCgZsnaYnykAYID=$d_RFpSte0n;S>@Y6i6njNv0?HL7tw%*(JX|T zM!D=gY;%2hh|t@QZ4w`1v$Q1h<0$g$aoTZntW1vJB=w=aT6~*?a#J&06|;_HXsq6S zb<wACD0Prq9Kfq7xZW*|v47buFJs?=8xw~9d3O=a-P4vT82iT!4KOudS3k@h+_p*R z+lMX7-^;dL7<;%~XE5}z8*X50q1HUWmH@9gfYmr#;eh4ZNjK#~E_bhC36`+LqulLN ztRD_;R%W~5c>WsjkNQ^d=lixxSIOp81i||KnCy}QcJ2ktP0T6%wGDaHHMYcarI6Z~ ziN6Dtn_3{}{Mr|k)*aL@7CoST#GlfQ+GeNsr?k7`drr3%5R;BMzHXac4g^)>hn9C% z#-EA6cZV+uDTUbl7stCZtCtL|&$lOKqEUM2jSKbYtlLEU771BbjaZ=Z_f2e<*F$m@ zFkl9m%!o6@EAeyziDGkVrv2f2SSn%gTf!}z!D3NnFGj)*bF%yq##&&Tg%_9EoQB+` zEqByV2M+|@bfS%**c#5(_aAgKL-#n?7MUEn{!(S3Kdy~U24H^!vZ<ek_g2S0Cxr2x zdrLI~Ve_CYQ?15;^%Bf<nbk<N1Xh{W_sw<3qx4?D(q-zccEnJYtj31R#1MW%{)@B% z^DBTaHLUO4%tE%zxQ7<uLxUGx^WL96@6*oIz3(rd4>Yp|IE!7s^9p^m?f>|DZukII z4W(SU4njYF$db(FTYPDpU!a?OHGJ4yvt{z?h*4c}WP4#L9k!@v9ljE{8w_6js&FWi z1BZHXi+;hA(w9TE?6)I-jAr}zv|<O|xKE!faMMx@Q2jF!36Y5isHf$LyZ5%IiTO_V zi+UYrBWq?=z~t2p#o(mY{Nh6Lqg}|->LVt{1*E^uxh$F7hyFOiDq*I?D&fXi=36-^ zzr^v^R31TJsqNe@v+GaB3n8<=+h)I?j@{ao<+`7CkGwOxiTk<`5HNxBS{c*ZWl{)N zn*FNNH{AadXV`zqD3y9WU;1BRX8f0s{&g4rE9_=%VfYW{tXBQMzXI*(IS3)iC~Ww@ zjpWPg^Ow}i*pQ{eM{XS@qGz+O$x4BKxy`sPAln4`<X0$v>f-Xf9ysOk)<${4i_}rJ zg+@bzd{k#J;xoC^nMfuwAdf7`75;Yqj8OIv=6$-RuBsITp<!w?fy(QXWsR?cLN3+D z8eWYdU;?g^Br4BOrkHgN);Ez!DFjl&M^`Q>P1-)Wen;sVhC)HIU#|j{+lwYsw*V2v zt`<g1AJ{lxk7G+6TyV<IA=Wo-s}kgw^#sLI&V0FR<0%4$5uk)dq&Lc-if?|#LfFQE zF!fv=kLi28M?lf#SQ1<jhXyJ-Yte>KCt}8I6b)X<h~6Lce!e-d1Z{k@dZX8(Ha)Gp zL}FwOA*QjN6S{9e&5oxa9Hwj}I=FdT9IkXbV)WwR%c`x3;O)w&osmnEa(Alt$IzZZ zt$eSnY+MJTtwl{kn_PtKL!1vp?AuMuYX6W2QeuvV-VX7WAz2=hEtao?RkT1l!a5ki zPk6rBHEG0`9;0+KXrUn1e1xI25S$afwb-=Wymn1gi@9Xk-*#cnfdQKj0ta@Vd!@?J zL70~89MlQh02-^^06Pfo&`8tn9O%`Z&PSD*p#rLBr?X7;HsJsQAWG`Gh&f!MH#?YZ zC2fswEP$SpPF^)sOjmpZ(a!BZVMrNviwmkxjXVu0cp`^1gC*6gAHt#ZqT<gY9iHH? zK0=d**#=d$bc}vspi{7sZ{?P<+Dux86WXA4vzSlf<sX(Le|M``auA%BNqEDPiYx1} z&ACENYfxF2+6>Rq?XGZhRq4MC-TFS@H>rhw?yE16cumInZJl(xmtL-oC%&o(#h6Cf zuWU<2pmEUzB~wIMJClx&$?ep?=^8kt`vb2Sv2oqalHm?3(@YmricDBdfp~hhki(*4 zX!lbMi|~0<Khp2dStw<(W-Hm+hR~DrLeN<qw@70rES87xW#8K#ZzX!)>x(gPU&&@C z2c~L$2*LSu-=qVPi3Jp!+g};=xO_gU^7ZH7d3n7&=pm04mRFBV_9F@)=Rj)^WkgWX zTL3MU4aUZp$j)~PHgySL7Jn}VqdjrBV=n_zn?DC52E2T1iV;uFiMc)vL?~~yP40?* zYw?r$=o~&*rqhV`wSquKet7Y24=6aEYJKTwA*;Jrv*uti?(w+7$ncwbKX%dmf~0yw z;H%tDgv`%WR234e1?13TA|-K283|o<=`*1W88U;O;LTI8_98y^72KU<U#-n%{8s9e z5zAGFnUmc1@<d7Oahl%i%bc5}LJVB{(|W6X$}hx~sVpz`_4f8Y_J#MUViYTObB*LY zKT;rVd_E@v`x}oG99z5oRx-d*{4isuE_2@NX^N+XaabQ6R>+U*m8G~$t4Z~>5KrgX zn!#73bvnY_Z?&i;sfbUuvlV;=#G<J6rJhx>KAX{g;gsB7-dLpN@O;O)I|{lqiXZJt zq3)EeaLn(|Q&Q;KIs5Svd2k2xO)8RSkzT9Om=4M3>hLcz^u;=9%;D*qvCNM7b9AE% za*sj+ZfCtB%+1;Vl;;ot*nj_P1U7>T0)hnqSY-wPfdAJ3voreZi~ip!c8z6ax5;|v z<qL|2-pt+R8s_7a>THXfQ_nnZh$b`-3Pz*Ail(t3Od0X{cH2o*4o<RO--&$bk0D?v z(FK0%Lv~V@c2Br-`8sag4|?y>2k{kSK`3#Q#HMi6pL1$VV8VU&ns(8FM)Jtp*C*Ek zWPmgh9`5ZShs26sNlrowD>1-LYdm099&D00H+LxpsUeE{s^$-PTT(EJNQf3Ko=OcW zuZmVnx0AR^Z43!Jrosu`CN<MODcBDIihCccP9HY~9~a0jggcT6-WCbKkires8SLPm z8_$&r(MHOLiHR{l8-XZ%ARm!UMjVMy1AJ8@&Tj&^QE9`yi&r-w6yky~4ATR^xVFvn z3y9H(7-dQ>h!$wj@Zr<^Ve)tr5<|C(sP|WGZ5UdT8+e^MEus6wO}glCnnNET(-nC^ zfi~b_<k$K0Jskj}Hw!18%nsn^ku`HWJ5JpA`Y{VeV&(p`vGdo9x4TTuj;@|gtejVH zG=@;IzkZUvPYE7;{wVQrz*x%{oHC_<XCD!?=O}+O?V(#A7Ktr#Ev_0CVSxbh%ra{X zL_l?d+<>@i1i*_gW2vj3-)>e|c|$XQP}Cm<JG)sU-d`D~O}pB<x!HNLVrWT=mr?s3 zokF}mKqmBMPIY0)qLb`EOg%-Aaf$-!<n7u4f&shiV967V;_%b$l`wcO8FjsixpfxE z9a9!KdELIgNB6`Lgc6>`+u%jlN(67*S5eL_M?kQJw-S+Z>i8dIiMmV)U=859%Qx8G z9D;2ApLIrcdYnapJQxEQE_NDcJQzJ(GdE1eUf;L9yF|N5{<DagRpFXNQ|HEv#GpWk z;OE%dAw1&xAwfLmn6Ogzx0t{1MYs4y>i{{;z>59Tfz&Jo^rzC}!IT7rVAJV7AKA}n zju_`oJY8gOd_l+-df?1Iydr-WFgA~)k7VUyw(#9tBfOD&^ntH=rU)-VtHOiQOQUyQ z8WxvGf!!YhZ;47UP_heSxd{w%Tw<K{d|Zka#2>vqOfMe~pAQ>*GI%>l!j1bT5x@MZ zfXOCaO5+?5vM-KAzY$?108L1MQg8s!u86lBU~nO@X02zyjuWe;8?n>t#^`UIjH3AM z?&-+Goh3ahdRjJkxw!A_$eD{D6gjjc1eWQ+^;x0K^4Lg27NQ-~kp?f}TBfrl1_xD) zfu|yRB5leG9~ffX>L;5nofNM>0eOmwRv+8!i`jv`4nK%2kTcUq4c<t6QZ#qQ@{!S4 zTTU><8+y=(2V<>uX>Q?DbN_+q9#SVwa0i&5?Eg0(Nl=%F{zwAGy_@*}nuOvj)$Zkm zN+PwO`SAwsSHL4bOGK^jue2_vLhFX`ikl)i;=d?e$s}+7H&1BI2-2Z@BPfL_2qPI! z5PW7r1si%Q)^}2VvJhZ4Y}O0Xy-UN#NVvOFORX*y7gGEfBMZ!F)X&+x@q2(7;);s~ zvU&fJs5oFt&c%ipJEOQNsTSn&_k>k{Ai5O}Mu@1(6jfBMf^{#z92KY$vDzN@AdAJ= zkEDhvaIjbShj0IONPz+QORjVq|GQdC!@W(sBkUWtpa;~aiWWF21GxGc=5m8<U7A7N z0OQpTqwtN{e4tUekQw0P#et4}T+A2FQ6zvI<=7zvB5&p|!!Yuj9bQ_<D&bO7xogak z`eH>17m1QiemCJ70X)_NR^{|a+`Tcpsu=S@{O}u4Q!FCYl9n}KMR%qsS2t#Hj20<D zvu8s5eM%}++6W{@FgO6KJ3#%#dtno-0w=z3Qb|S_=B8|tIL{o(zM&C)5lvJnEFt`r z<VAJ^2gG)12pG&+>$_5j--X;;QD2C=V=b(g(NbtPgei&l<;U6$B>Z?4%SzEC6G6nz zGNp`jRN31wRR`E=byRzmLj{&B%xYEG{r4I(MW&Q1eW5to@g9;sL@@{r;%=Opf;#vG z%Fdj#aR3JjT)Uh&*7o&iFUOy(;uuh#^Q2*7N5e8k^7Sr1zHFdd@j_Dcm)w@pw~}xO z?|RBu5a&3R4P7Cu+SA{S<WQ`bJpj0oM|MP)Fv#5R=Ie{%%}pk{XnU0g%C6GK!1PRG zgu{6h$U%U>nksnYfCW@n=u*EJt<kS?Zrl8G*dt$0#bDpKa1MJ?5`Q(i23#~YZ!-kr z<&@gzBGFL&DV)H;71YBEsXE}6YzaA)MoF|`lEGDy<dTQUe^OCz3VQ$0SzQ=}s9Q}Q z6N-7#ayiJ%LM3Rc!hzUhkis0$m_*ap_2?(%uXc_NN-zu&bqbeq$ir$@9h;L$0wGo! zd)Q1V@L4}uUg$3i(7y!niB19fz*t_t&W-GXz1Hv@ORd-D(9C8@`y2%I`v9i=b(7_> zsNbjGk;r}=$P-<<mO!b}pH3H?bt(Bg(_cdiOIpMnw&vCHF;0N*k8jvk8?Fz76x(Gu zT`Ic#2LVjC_Nk~9ku)SIz`wQ)W3FxXl#$V2cACB;Gwc~9efu=UF}R{M^Kmedk3Z24 z#me9)$$#cy=pM2&i;)&$+Y&ThUZgo=j}nuMxwK;ax$a^rV<)`>;%g$R44^Omj8h&C zZdDRAv~>&czJcP0!qri@;@GnbPc+>EEJ#gB_;%@dO@}Dh*2HT&dY8MB6~zMd!xMtZ zkh6)3iJ*YIG=hz0*t;wjgR+LMybb00+EWt+g|kz|O^+xa<&|cQbkld;9_f%8BOVQ_ z<I#_G)I2SJb6ds&mvapM5U=IarCFNofMYb2(`_2Q7#8h}as}BSOJWQT7#=x}+0I$m z?%KN8e60EW$+fPQCXBRmMyy7|Une#eP(4=76!mXP^_KN)&9vv<oy*RyCwF|sBp4~w z4t#$*ZZ4u-zlwQTw5*u>{}lEWP;o5V+Bky*clY4#4DRku2=4A0+}$k@Jh;2N26uP& zK=6>C+<VS_ym!ujZqHh?R<D`$eO*<%cXw6o{cW`S?eVrbP25mv!1v02om{FG>KES@ zio>2K(Xi`eMA|TRNKFlvIcFi%E04%oG!|SXBN<~gFy(^T=<0l71jOM8XD~i7A&*1k z!clDLs$*p*CYouWM8=OFw5sdqcOybUr7{)l8tiE{#0DBkQ;bL!7wED?1vmi@jNN3H zcyZ+^fg64yXyH_&4Gn%a1L%p)@~T>m9YTIqO?5WQJWC}Q70r1V^11{zr>9J3Ce>V? zrsfz{TR!p|`y3ux^)kaZT9q6m#B+5Qzv2U8rM_vVw2F1?UHTV=euXB!)FMED8`3kr zlQT(iccN8%j6Z^G;1<PG5PM3}-nOmBUsp=f4hpi?HhOX9+4aBvrSfGJYzV6jFP4>K zw7-L$ZIo@ye4M)MIXcfqN+l*^>dYh~q*g<!s==Y_&aOG(x_RI#k#06fy=~5KN3n(z z`R40n5?W+pv+20sC6ZyWC6{ro+-Rs%bKf;d2pPWs%X}jgcucch1Jo5dP%Y%ejagda z5b-=r5Kwo`suIhSX6!%6^;J|`Z0Wl*6}RC>PwNk)Nn@v4s}9J}PC>?JVDfa>v`ee+ z#Hp9oYdq_3ipMXHP|ZW(5KY3K+ksg#M<pr5uviH(YRI0U#J$*P?w*kB`q4h1IKoYh z-a-=|?4HFHj@tJiOMcCRbW;Jjtco3#2$ox(9q{XRri<2m5OKrQDTsI{OFBeESH*r> z%9Oy`C0Z`gpkKlT^CdMbIHDJc7NZ%Z0rv6O$3rExvLjXHwkHtnQ;Q|ApKc1I1>bXY zZ8Hn|d#6rk;>`X?cTP@Nmo<+X0b4tz^pbtvi1Qu@_+(wG8@SbKqFgnk`i;>oO(k8j zaw_V3iaA)D)|XF{rld?&&`3x$;&vq$^Q?JI5D;GKYNjqDjsuYb*VqQ486Kz^+GSep zmW~_PSdw0K2^E^}UVf|tDfw=t$863XUgG(RRN7<UJ{2*TDK8i^b$E#RSpwxsW954f z$lW_P5)d7J6<%Etnby8c*{!{s;J<VmyUvgUztg%WU!M>w2&iK38WZg2qP?==oKl5X z4fKOpn0G;c*ynqczFk({Q^^@U7h~}=+!elNJ6U1FI7luR5zlnJOtnL`QMpL%1;k8L zPPL)Ye<j9h`vtwn0^6t)>S5=Q>*X@>b!7~#F(>?@D*aIZd?R{#jN4h4JT9e$cHtuv z+ZM`9IiL4;--Ci5)y}Dn0nEf^X6R3L4v-Pbkr@5At`eB2Lx|dSPxsRT<^2p@5UkJy zsj@gd^^N02HPVh>fpy;(1Gw2sY&M4n%4H;h+(3a_2WgsP4R|#UX!$vZm&SDQ;S`yl z%Fw1Uaw%QQmjDK)cj(E*$J+GMxefe&wceT-BQ(kaNSi*9eJb=_WLJHnQ*FgNH4KhG z(Yyfs&-KvOm!U|=&O^1PM!k+$nI)MTI%@En?aN|JJ5z(UbI90jbs5tWfuId%am1){ zUmH=w+Lt*<M<a*QLvub?aVl^c!bdc)suU<7G2TdFZo8%qKp7lR;Xn66z~4k{!}e*} z&N_srV+v2Z=QlsL-EsW6;Pcn)#y=N)tZj{qt=<a8kiM=Ap=U2o`M-vw#N+=@GX5Wb z6mim5GIn&fa{9eYw5NIUTQTO>dgpdv?4es3u;U$6B2%`)a>-dBl2AfMlQmHk>5923 z!7rYJTGU2Ktr8|aq7o{^r*l`tjZE*Q1k)p+b)6PtmN;yo;y2I>ssx-qv~@V-?IGS& z%gn4gEjSN;42O9kg6B~x_{v?p#MEQ-glC9(k^o<FB6ln*x;)9kI2my1p5)jnBz@Ko zr2g2W@v+jAjtJ?aK|;ef-&<TkE8Tm@BlKfsw<&#X&@M&n^@{Sa6&(qB`ZkdUY4Uo9 zj(u&x{L-RD95CGiuThe9sJ%kO<-`!&FaueMWDBGAQA8~6qZQWJ`eZ!kcfz-Vyo;m~ zk&bop@d%ON%e6)A;ZYINwr6NNEK}pK_?!l8A2AKh?)Z8_ZtWJ&qxkv640tg)M^jdX zL?c+Ek+A9FX{RhzKKFe=oLDE4eiHq<g6$*nV@uU^m4`5DQ`HAxja3)2GrlC+$Q#(* zZ#PMpNeCXv$&n4HnrK$mB6QLlVv8_H%6LXjQOR+!2RJtDHr0W~Bp2ZZ2;`q^Fl2!0 zS4)@}6*>}^%%usD+<Z_dT1UmSD4jcYOEyBYtTt9J|2h~Yc5-_LwF;GW2xv#{li7kl zdUjZaN|MEh%Vm?>vBF3LQPC{3H>lQgu--<@lQHM0KpO4hmDjvX8e^=9bx(Fn9aUf< zv6BK3hzcHfNtJiDOdc3?Y!5BRg!-Vt*Hd3jEW#M9Bv#ujMkooo776|F!N0PZY%XzJ zi1nQkRmY`3UWt{ylNFl~Ula-fyKVc$-A9)R2A=k-hpL71b#8w`enx=%^`U*H>!*th zp8?4E&nfBe&eA{GvV!;+vAiHX1)<SKE~HwrV;eF>__r2jRYMNa{tWIN!2etf=!bMn z{&ruzV>88z1S2-6`Rix)2G2zlgXh`ZfgLQzaht=Ay=cIJG{sh-qp`n|{^qKMu1>T9 zgiVAjm2v~8t6u^x;EW{f#;>Wb4lzm316uzqKoMsFTg<Is`!E+{`;cak1S=wmoS|ux zPv>U+$0MOf{}4FVhtHY%R5W4)J*6&RJ(++EVgysL&Mjy5&?)Aer-+uU^~<L!&f)!Z z2|AV48ZlS?!7I~x?-hPgRk4Z^v4`15G}(g(E{UqeZU2bA3hhLtW&&eE3~_2@@5XSR zn1=XRZv<Kq;|_7{^-c}5sg+c%Z;3>*rXM2VJW{u-1N+ENBj4?^sRb<KGUkLWlnFMo zkDgEWs}p#;x(l^RzU&-+Q-~#UMxL5C-!6ATSP$8)Xb5Nlm~|T~Q*WlHA@VmWim0W> zCWTB3ig|^znxPpK{wVamcoBat0C}xY(Vn3wdQo+N*(Li}ysr++PWmFe*o-tk_i%S7 zDaX%O@dCNV8D%#+5#<+gZsg4ZW9xNB`wDth3<w=6VB{L3Y4qz1vgX5i3<0J9zu#bZ ziU==IAW>W0Srj=20ZCst6rm|aM~WB`^H%$m_8~n~)j<*#A7rI!;mfZD7^7W;qz%_u zUVJ)E54$*jo@zAk-FQ8EQIf;R9)nrN-GPUEp&`R_DaexUl(-?4Pe$eC(7N*#B*2LN zz<%6}E=wE`)l*3IA|Z^MJ09N&u7m&z2d;fLq^&7$6`8H>cc!w0^`c$=Al`<+JV<0p zhpF%kbd?aZW^E7eVGQY+b`{mLm8;JDf+UaZaC!_o4&_2s*Y@QXB>RLpHjiO&WQSJ6 zHvAu+1%<=t0E_xC6aUdM*<8EkNJc9#l@%-Wo^SibylyNYR-I{7tD3$bZFSAN=s)){ zfptx$*POZHj!5DOC|+e`I_4Wx6AAI;xCl$0LJk3nIhv|xhxsG}DT?2%!}B%ThJ&Re z=2juxRxfwuX!7OmOTZ$_b%Jizl|KUI+S{VGxU(ES+0?4lHbNP=ezyv6Z(*9w+;ckd zL)&jv%5-7hzT4gxX%(<kxSr*7ZcYBE#$(u#UzQOR=uiBSsFNHcTkYYCCu)cu6FOCZ z)WdxvbEwfWWqr*2e5^s$B;|rXl+^G}u@{=nL3m_xlf7De!Fs7K`Zr8R2J)~0)rXtr zP{`VM4jA9`1E%n>Y`1S|7WP;s$H*gCbjPt1XjMx*<vBbrl|wWl)5RLIq8je$C^#B2 z3Pe8C4XR4*h{#)PxK2HqOgp0GEmoc@n3STIF)v5gX3b%OO&mbG9yKp{qkBEr#RQ-9 zqemr})&@MKhMSDkCUWPDnLXWLAJLu+=-0>ZxlOQmedO5F&UWx%iPB}>$h8JL$QZY$ zS}4kdy{u)mULpb538K)Z&y5YgPfrlk8OuZUzt?T(8egBiN8U(bF`b^HrDh99E9&H^ zon~F8!H?89&Bs4Pb9~kn)A)ur^!e;ZLIL$+xp*4|`ox-uF(c=>x~1Z9j7p4=ZbU=6 zyr$7jF>0;sKKWX6E&e#as~BnAuZL-C){xiD;f;6G@9fE}eVVwT7s?m&P5>)W6Pi8? zR-}O;>g=~$Y*;5T9|q1lbt2lTXjYy#ajXV@(X=3<Jy883co~#B!a@|l7Vo{DuyjA% zcq-MkZ_!yIziXHN#Qy0&@k#)YC2MPS5nkbJ+*bh|YGDwN*LBf<?dT|p3W~^z(pwvq z>nz!vh+uU<g}E|9Ru_gX5*sMyKq9neznZG-sU$PrAS%#BT0o)=TwTJhH}8tf>lZVN zOMH#=A#1hi!yPYBq3y(5b!B@s#nt+xqgK`4Tv+{cxz!AMOxwu>!vp~xU(r*N<$3E} zhbO}VJ=%Sx_6o^;2c5Oz;|NCi+T$ko#(8*w?E~8dT|=9**6NX2hB@q$wQ0tP+Pw~X zgJwoyUy9`l)ImlMgL~zYjkZtJ0qnXqAx8xbeMi0Zkw2a8wY8=6su)s-^VM>m$5<f3 z9yr33$2&b{n+i=PgBLcR2TJRvD5#Y61&v|`28JEF98P00+xZF|%qVp;*$=C!AW~j4 zhK=PEEnTzDe%e>ID;%PobliltULKFLDn}~mP`-CL8c3oUo75{{NMa0%2S+gT_n+#a zn0S`_O9R0xK<Qh-V#~B@mynX{&DGj9mq6>Fcx0Lz=;+!8$TwjKg}T_>beND~8@oG- z?N%{1nyvMh9nLC_2q^4Mywz3Y7OO~OdBCSHTMJ6<&uf0*zGyj9R2pfN!L)*v@=Ojm z1!4o#pG-u3@TH|TQZ08ZYC+N}GQ-fG1i0)7CNeM}cEJ(RY~7ThA8BvuGRiwammogA zY?6)(lN@z7aW<*e`pt$=c2_`dJcbjH>o#aCxqbpKk_JKS6GgLz90!YG+dZ1~8v`{R zY?c499!`ZHAKSow!`3ml076nKeu#;SnR+H|SsFxj0b4=+?1l{6S<nd|YB_?_<)5jo zotE^mxrVW<pT_l_-ZT}YoJt$WPZLXf{Uh1{^yU?iNJ?iA)KPX{*snvlrQrZ`wr(|X z`Bn7#_69aW>C~3xtzvXM-3x7<85=Ll_az|MNo48p;nvz4+h|^nNV2h`TMeIDf6x_G zAi~sC1<YHAPB>+*#qK70ub`;J){SR9?or7B+2{!Fja`LT%K#FcYm+6o8|xqDUnoR! zNUj%~Ein{59M-k*7<zPFnmkEImg@)N67eMBK-+DqjNwe2c%FGo=6dcpjn}mBEPK`z zfZMpZ^?8=wbG4E3us{mD^pQGrBRDT(<-rMA=P~v~iB7wy!<nd)`Ru%QmkvZQ0XHWt zul(;ii$@kxzyMAxFk(UmD_lJ#EBLzkL=2oYaMcb0TWIF`6K;iN7GaN6bHyuL59QVZ za1BilhMxIkIY|)VMh7E@o(ujL;Isr>-9x;jUu(vPX(2DOr#aY0WDocsQA=SHc4Hq- z$*WL=ObpXRAq3y06+NMFy7UPm@lbzdw6H!os~g$}7kI>VcQz9U-A_Wb$FITTK;0l( zXmCK{BsOjctiT8O{hSYD7=iW;aHcEarK8`ew{)aaTG0B8JtogeF}${KD6-eUrXgm_ zeu|?9+2WUyg<&cU;sG8UBJ%M&rN9&jn3XD=+rpf{*6>%;37ENeRj_q~%XEC{4WKCb zW(&#Zd!k5|V7LqbJ49iyrO5X--XWu(hiSWwM-oo6n3XquU5o-~+vHIwuHyXUP^y4S z382Wi_Qt_wS|nKBH@$~l><bk?+Pu;=2(6`uz+eeCs#T7uLiWi}ZxiVZn8`VVAe_v# zkw`s4y6~_)<_`JO3@oFHL1^WwzOD00IRYVl4p8f^tQ?Yi%}#d^H}o5fuDRW$nN?v} zG-BiFBuR+5uRbjUsaC&hAjOUG@$P{5R+g_i97!?uXm<FW;k7GWW#(sKWrFiXM5zpS zXCmOJMy<^oxE@~5ek61@O+#6#-MW?8D)$41<%=BF<e@6Oe9I{&EI-A7Hmn?|Bgr{( z(KBly7{q(*{HE+kWG-3d%U;R}qDDA$V?5oYwN?nw5+MmD4w0)Z(&vj1pVc-2Sg|pz z+pY1KbW3D9vr%D1_GwqJ#mKRJ_aIDccexeI6YUn4H*wQKKyShQxLVKiX&aa1__NFN z%Z}|`{)dt@s?U|QN3|kiP3)z2jKE{0ukzP|PViyT<c3C=qC|&Mr6j~q>8qL&x<+0! zTt?y55r_<YEo5y}$z?y~dg2=SJbv*a*o7@u^~N1$bol9G&d>!)90-mh542PbB;_T+ zfJ8rPG5P?28~lAlOUUc~=-L;-D$kqVWnVt<Gm$dLEVKEXR{Ntg)FmgNE=U=%<?m-Y z3MHc9#v*w@V^HC~PJi{vMM$a=V#RX<@?D{3YeLz?!~$|d(eB~L5U>+}!r=w=p}7b) z>*8t@feb3CH_4lCgz0_0@e6INzNS;~_g8rj={p>=#k}w}6IxMz^KR(dJ-qga2B0U@ zSszQ<MLJ~J{|;|)3TImio`Xc^v^E}`na(@7g5wmZ;lJGjK40xF<Hhr|i2!I3mAFLY zGP!*Snw+qXm8-W{G_XoFHq50WU)jRTHSv@@U<?+%6)d&_XJd0~HgJzF8%5&8;*tzS z$$3GZu*oa&__9*$@#$*3f3IJHTz8nPO}YK1z4Q~2!A7?>>|*LjS7AdY2I-|t5lw0# z4fdQNkT@?23}mQ-jSk6ASDeS)H1(1%&|jq1skB3O2~ymsIF&IBhS?^pP-N!NBSmOL z``REHoX=siSF_$vp|8ukkj4}?>Rd(qR|zBxl|q0%sdvRNtv+GT;@W5MWO#UJDzKrJ zlLmdhjIC%2TE8ogrOciar!`nUORXjBT>0JawHzNipCwo-5w(7?31nJhftDZx!G4($ zMp>~ZmAZayLaF$0-L%`wc4LpXex`|NgbG@M7bY5WKeP|vh4fgxk}qZ>KBlD%9qfs> z7UpAva?ZEdfb*%~dkq+c-qacs(KT7}8S~{iV%7uD;~N7IqJe8lYofjq<*e)Xf%7le zeUBVmrX9orHPTkK_-m+~^hyDjcd&l<tLIe#d}ex&S0SzviY}B;6cfgaY8$M5nG5*L zWA6+5e|{YL>YfwZ4xZZS0r8_Sjd{N$P)vuHX^p*9yjph5vDm`Ec5g}?W81II@pgZ2 z4_fqDEiiNs!#-_iqOoZMz_Hcil)D%bSH-?_Y1Fed%=K_o4JLdobEYni<e`K#0xI~u z2fBj4+3V^ahOvR@!W}Em9hTk~%DnfBEtxvbiCJBNQepd5H_w7RsIZlvLdH42IpeN+ zWkgcBBKoVUP0L4_y*0G5)Or>jRNJipxgAMm#_54t59UglePM5T7&}90vcf{+@jLCp zB~4g~@W$~C`Ybm&n&F8^i>wfl#|;>fg<)%vyhA^E%=XgOUjpTorLFQn*GD$@MpHRx z*HGj!k&z!uc)3UQU-4p~dDhZoW&0BQXeplH7P<*}*btTIIm%fMDq+)(h803`YoAhu zgdd-&#+NRj$+T&$eam*{B+v=tD2)^fepZ&)aC6^JH7DO0#06~yMr`81oe{jpP56AJ z6qs+qN}6<>vzQmBzb->gSp8v<s|a_i?)!O<Pbt@)UWkz2fzd?*Q<QUg(1il1{}_7h zjS920{1|B(ps<!%jXq-GhMGwZukIri-_&Xr@@z2_<&{xP+2Ew9c7W_<FBA;9`k^AM zTs>09;}JyP3@H&`GO6y@opIkeWWX$6O<zND@0G~uyW=RZ0m^CFV9&}T(YCcwZIx6+ z-f0$?ZPQ>R@vyFsI%0M-2!ljE)Y`Z3D>&+k%L>TcQ_b|ebEu#R!9^%tWqRFtqS9Jv zQ~FfAE^dAHUN`wfRYae)d-v$W<@Y&vZn8>9Z86$^P{EM#zI^XbQZ}p=?@PJ1gdKtl zA40w|E4iUt2;oHj`E&3i&hGclU-vZH(bh4*MiDm)shWNp#h4l2?q;Ubn0@Wg?giPz z^1^9H*m3ab5%`l`9|)-^Mym>}ZMU^a<;iLNb56CRUZ>bodr8%-92EkJM3L{3xvaQL zGK3au-9t;rbORmM4A5k#N}fI(Ala?E!uWFlB8cmUjavf^-kF(7Agt!DSypH?6r@$+ z4gAm`pJ_PnHCG()<;nHuY@5lT#A4q#M4UeVmn^i8y-0l{%<WNGo)K`lAHIzrfSx(x z;Q{wkurBzSJWA5tMPZk@kjY$PnN+U3XXS49mdvk$ys*+SAy3stbCX)kl4>Or4G3eM z?x)YuW4w9lq76LqZ#%>#nZTF2lqy&oiYnGF4hFM1M}HPs$yAzjw2PJ?o}D`mpYyp! zG8(!5is!~rM0MpaETj=-jITi)8CLniyt!y%NS1k(4pSV=jo=jQ?e7hJcJc}JJxX-F zAzWYkla&u&&fPOsd)rUp4kUSyrE`GCRCyazX+JMr<sJn!q@XnyEWIJ66*r_xe?IxR zfw!@~Ez(D0Ga5OCa6ILp=s2@t3|Q8|f*qYahGfoA>N!1=p6j5%132*|xA6sW9e&WI z82v|9L+&!P{cLJ6|K&T_!ID)N*11`5>~B<vl7<!Qv@X5JFGbE@9LgV>AXCn4<x<2A zreG_`45r6nH3%wW8)xO+QR(m{w#md3v$WdTW^kjZP2R;rOZ}YdPT{>0A7UQMv1~59 zY@p|xO9tTy>ZNp$Gco#-ZpFwx<QT`WCj`??<VQt++IsrpQ2f62*oq{O!h{j=yB*O; zex(<{LrtMzWg3NDxb56&aV^az8J`KWAgetNRaT)UrocpSsRc5mpf}Ozv!MT_63Y8M zW6M<9mF$Rm4o7>JNjIdP^RH~$`;Q&ncAxi#P^q;d%5Ukg?Yp1u2z|ghUt^0QBod>@ zc$1Fc8IGSfE->vRetxC#H4gCv(+evoV?5=bKA?TySj$mI?n-7k!{J0wz>}_9LpANB zk0n(Qy!@$MPi211Rc&chwm>LLUPjE14s%k_A+!-D6NWCrTrmAx@#!>Mb;@`UU81fh z2+#2g@8{;U6&{cB`P*K-Txj1?0Y{+v(azC=U-|7uLCN{ZF^@}6gE_t(mhLxhd!5%s zd3Fv`GZ=!kv{{M8tX&V5(?}S~5Qar-i~Z7d33;x%m~GZDQ9LZYlnw>;_6Si->jz$4 zS|kboQ(+$o@vj^S#HB<_LUFqw;<{Pqnee3dhJ8w?rOqRVBjX`rfli7rak9N#!!Z;T zXIC8s({jh)95|`gUfFDNMJg4%bt+Bi6B53#VNI3r5LC(0V9az~m#pC8{hDdI)qc0V zU$XrL1d&66P)_4-4i1ZtmGhWBdSU&tNZichlT0C-a~#;AE0z&vi778|i%gf>y|FWn z+_rKEt;_a}H0tFda3D^&0NdWqG{(ZnhVWFNnUe0I7-v$l3>TsOvF_|d39pH){hBBV z_TeQOPv^L1J?xq+K!Zs?SzJcp_`)*dqZL~LUM}O@{zp7&DQY_`N0W6%i?H<>0NOrM zV^;SF?bv4DSO6)iNFcPNP*fP1V2X`|P|tUQJcO`s{NWA$M^a<HlhQm02=E<7#yD#n zIfB$jUqoT>ms0rW;0bDqw)@N*5}32?9V}V)0@0yb#l}*AGk4L^{bI#MKU%wn$pl$Q zIUGZ!LP^<@fjN7%n9@KYhTU+T(NS1&s2x~6nZ}c|n?M<p$-JX72?Bg^FtyoP^=HLV z{jH>>IHMEhP}+U=7*m;u1yDLL%B)-i?AN(PI=U?GH*}SiRoL~gSb;85b@H7u&@DT3 z(luaZ_qdD^i>w)0Cvo{b<{s10)TsJnkV|{n4Cd^t(RT9X%f0{pPsK&K+vA1VggqDN z2|O|Q2%t^otL!Bg)lhK3Em%0SiG4J8rK~is9gZ{?d8ci2cTklhQ13DuExCiUyCtDA zJS99q-t20Z43p%_1g+5sP^;P5Jz7=Jq81pUuqvTx#yM#+G9MBvYA7!hmV7@7jXHb7 z02<}3_c4jt=a!K1-u#IbWzg6WSqyYpJd$z({{}5<&0NfTEW5n)h9ah;(nB0*0RZNq z53`=o=^3yfV}5bGG$l(TdhD0;PhL3lm5P~cq8{;YXhl&2_LQZfy${`h$7|KG`+k@= zrO+?OB<cRV2BypqRo0JA6wHYG<+@JuJ0MF;0kn6$i90QT?kOFqQl^1#Bki<veQc^Q zQmBAK+=rn%J+knqIh*4^kHaR8i-?i_4rwS>0|(fDwd>DCHe|Ltj6LirqD^vU6Py_n z@B*0^vVQPY0+(;PZcDW)h63&&lsTSd4ks~r+@{D$)DPNK#_iIT3bti(4Ebs*7ULaG z0-}LNs@aZMG<<v4rb0X!|GvacB?imhF!90_his#w&g>aQNycYwV-^Yp<B{@r99x1G z0MfZsUID8R*AhLM&b3*OgVdFseX@^(WL;lU%j)dsvFKC!GBA-5y^b^(Y@^wxa=A_2 zCm$?s>A$o;$srRF;U*Lw-iJq-@_w-2WI=lgbBJFT1P{B@66^qa{>Y4Y)qrhJMXTIs zb~|_`#pd&Q+P*%jDqnL&P%m{m*pxt;Yk3z;i`#%AG&epP8J3UQJU!x>zvBIkU&lNf zP5jZp?yB!OtbLZW*pd^=vvs-;Sh@QizN8<gMoQ3*7dD6t9Sow@CNa|9$y`j&SKPM> z+3bqU|Iw6F=sNq03Ny+a5b)XeQ*`Y6-kw3qxr6k<k+LeW1c5MyCNCMs(j5^hj3tOk zpxnqo!Z$`2W*2hyG$X$V5fGRZWouoD=nUx5Tz~w0??vXJ>BKC1UtXRJYq+G)<%FB6 zTUONz4AQYdAA{gasZB9=p+F^{LdNiyE6Gt%R&otOsC+-%_?FOb3{kx`HZR86eLt9f z+RH2Ke|U#gQA(zqQ^13;If&2KjwC!um-ONoaJkz6E^h<}=l9M&+y%L5mQ<haO1;aF z*|@m{-3Lc2_6v`qrapga5k6TQd_lpmDS~Q$s_$?dC})_11!F2Kn?xg+d}<swo^H70 zv<ag?`#xHSw8ll=u~EENXi-}lh~3MY4pa}NUl=^R0iCoY>unKoPMSbN*wjs-ru}%@ zwY{$k8fd&27uOR9?k)AmLj~GoLZQ?&f%pePGCy8#u1e9O=k#ZbKuL+jZV%>e2jch5 z(#!;85Ye3$(yXWk{vr67AyqYdcu}_6%9!>J@jlPVI$>lapK}`#9!N8o8x_@1k*HMg zEHfqU6-pdM8bG|H>2@5jg=LB$0=eVT{PuBAv_8f6O)(x^w1t392=h|8e+4i@>Ba!5 z^;Nm!&=xJmWmJO%k;%|!^3({`*tVV4PsDqgC7l`;I!t)WD5Vx~a-dS_PO{~yB0n`0 z@ebS1Se!^M8*JSmpvx6(VeC}tkc|Ph9rraV4q|R3`Y6UGq3ZYs$a;gPdcE3m-4@jF zlwYWF26Sl#${xfWd!yV6$&*;&hW)2@2^AlLKcUXxeSO9f8Mbvt@U1k2wA>q%3eb;8 z<u%vE#_mx$xaIPz$f$GQvbFC3Im7Q$>}@`Qh!>IoJmcQR3M6oJgd^j6x8^E>ZO^%* zZQir=XH@{_XYyHY&HA~!6bs~{8~I4N)bi^>U~s;m3U9AXUuh6*#hf&GcxA)uDkZ73 za8CvX(8F?tqwH#7??3$_ejv&<o6HHVt=;Y*lD7fkiShc&7lZv+*v6v7!@@We8$6Xn z3(I;Dus|~_!Hw{zW0yGD*nOO1FZ`tcNqHduZkeL4*azEiLKrn{0?mx+vHI~5Gf4V2 zE|>2qXvv6f29;bP{6c?o%hV`XVANv=cX!aud&oNoORtb-hmXbPXwZb_0%*evk@`+1 zp;GCfPonOdpg{4@b@3)zNK<-c<j<YFCBC~6%%RQv3{NSZMosTJ@h)2W1>-aFfX(Q- zR|5(P=qEZ<?bCg6$3Xo=eCl<>xulJ%p9Qo#EP8iLN?hqPLvm{K2^ukbZPl^UU!kBM z&$1Q7rKv(gof)a&M5$DS#XADLjS`7(*#)yp>5vPg9{Htkv3^0O9mqj0Ieq`tL{#(Z z%_{mgHEVTVLsqTa*Q9kP$o~l|b~JW!GPf~x{Jra)q%3Q@&4|=~pdL9X6%-yX)vjVa zw`P^nAc3X;DB&bVl}E9~=c&P`RPuR_Mm0lRiTMzi7|DAv=E;&!dZDTasSl7OrZo~G znXEM!@EhM0w3K`QUV&5nL!karAGr1RSjHQEBeya^h*FkDV<-l_ua**NU;#QBrhP3g ziTl1(1Qy^0`y?yK0sN)t;@}kmc4ku2Ng10qHNHG5W~qUi?a3rT)e?%D5Mnq#!{}mr zm#<kvwJY`4EwUw0nH+^m`LeS;!EsrW4LDa8IFW7zapk9t$7wjSX<|;|R`DhF*RumU zBRd~Ssf5_df+}KlLnBwMgA%L6is(%0PdypQdv_?CztE$EQb@Z+ZgZxSjY><o1Qlwp z>PeH2NWmIVhzC<Ol5WX9=zBTJ#~vP-0i}}32yMiNjX1ybp0Nf4OcXyy+F<NZ1}~9h z$sY8AcHvDWpmdv#jio;*fOBzE<nwCiPD{`gC*Z+02;x|W8wf9B<+m(*^RmnL<g2+G zI&KKXvyBLtFF;FwuedF3ShIm{F3I?iK(`va5I_Woi2>*Qw5DFkj0$V5oN=W@xot03 zw8}2`S-#9D6Hb&9@uy<-P1qhlz|%;y!m6D<=*P?l`@!_YhJ1N<@fcScCP#hUVZkk_ zC6BBqeMhkbGt9!At2D9QpuA|TcRM&U?`iEr27CZ|AI229iXva4it~P$7Le;<L6p<1 z^LnJp`9y`3PLW{`B$#>42BcsvbDiGO2N2!6TzWW+ab8fbHt=ekO{f>Er47ya!&d%q zY`o6ei4CvTYLVjyc|?ZMB%(cIQ*`2~T)3ofn|Z=(q*hS-;=5J1(E4mjgYabynteX9 zrS!hNfl$j``oV|CcCnJq`PNc+i@?SHlgFp!E4g1Fe};X$mj8j*RZn=3pTmB&=Ydyy zM)+e_$kEB&%Gi<K(9y9#r8|20)tX7K5NCu7=t+<S%;rw3S4u(%N(z30yeB|`8;l-6 z1$)(Bs28rW8m_^ck3;F-asOodJa7&3OtzY*Z$>LA0n;y+hL;FRkK};D{9Gf!)?>s+ zFh&+3o0&YqWjt0$FD)p3&qClwD4T;tsvZW9%Gf}x$Qvo{Gnhx?J~R3tZj@7Za`l|9 zlNM^7)MfAi--A&ecQibPXpTT>7i!A)qzOPO*ua@m2hQN}&J(?}@6!QR48^4|p7mH& z{cQ5pm56C&)zy@1wEM^LkAfc<#HrQI?PZ>a&5aqQ>c?CV+h>JmDTjk94e)$UP0k3+ zORW=pi<VpxiicddmX?QhozgD_lak0Wf}hCODJ2x`#LiGs=>Ve#lf(`|v7oHMOVi?d z4G6X)%2!lb!KN6M7lrnrg8`G<=l(iQ64?q$xkuv%WzRgY6FbA~-Y^aGcC*<daB@I& zI-as`7Sh68;QdqP`iwuX`dhjO&XO16Eq7uo(aW8+D_1nj$qofLPVa;H=nFAdYEQ9M zgn|)%6n#;@vqWr7rTcl%*<d&kKb+w+sT)#scw8UujR^nK!Do)%^!dG0{r-l@0nd8f zqG>lyBZ1deHBY<XF{8V(DK@t&&l1NY<5LEvD(d=31DQ;8?+rskSt7>i#g|HvWScFd zkp*BJT8@Z%rakwO_PWJIku+4Xaf30~s41+{<hjnU&;J+^lLCtdcWGAS(5n%xz9x(z z{$WHe#ty%Q3V!><Amy{)G9J$tUo}*dz7rc<=crgn%(TEr#^MPKP;RR`En0ewJ&d>W z2*-ZETw_7fVzWR-`OM41Q_JJ}P)|+G03f1j^85TdUo5pD+rdqNI`6%yf`;}72*IV# z-UTV3bCa$ycJ(;Okt1j6=54-FCB()ktR|}(W0>{isgM-40_K#e1K01EnoR4zDFo0V z(H>7L9PHb1q<7;>&B}D;>jJWb`jiu){Nlv!`p{Cld#+f~8|8YPO8w-*L(}%88bG+( z7pjD;58>NC#PI6FCAyFee&gQ5QQ13|lQ@Ths0~s2#js=hA_1H7&N7EOpI=1meEv0G zjA$0>TB}Zn$#2U(bv4EmCNPf+7;KLh9q<07t3lxgL%peB+nAh_DS>n>e=YX1@F!76 z$JhAFCq^6!$9TlXUL)32xh)qwVL$?-T<}6IWu!iH#QUA2F6dMeZY7fY1-ok#e%3B{ zx}Ba=x(V}w;Mp*E*ajgj>u@j8SFc#I{On^L9SB375;e94kep|PF1CV$A8uV0wQkpa zlGfzVL|t(})p^Lm{G8=s=P^X{BbiJYXW`kpTPHrEMziC3rcGJNE)3%%?J60uO0KSh zq)zm?cK@_#gGe?aOE5!0F(x@j^eI(sS+|ulYpSbC3pU`JbyZp5$3-Qp_e^1Wb9q0l z3}-Jn^Y=%4ra#yD7Y*ECORr|TEPzLrvm|0rmw(c;I8v&bR?y#c$KE$0=Hc_eim}b@ zp0P`W-&VxJ&+Iy(AxDmpf6ThGw>&$w;CMIv1le+CQ#o^1zmoX^ntf$D#+Htsz4kK8 zb&++qg>;$q3p>~7xL2b|T5Cq9M9LiV7QeOiu_Pac=Ms*Vve3L55f)XfTkFX5*CeZ| zaRC`uexdlqyQf2rpt@cy$5wk-!X6_G<>fDhiBD#iA&7pF>^lmC9-jtneGWZ4Up*%% z82`TnN&l`48`-Pj|2}>v8~r|hmj{6Tm+U_X2<U6snikQLn=`Iu(0~8>Ki_Xr|6023 zEh@<$sDBn6c#HlEY4P%((f_X8+n?w}ugEh02mMX)x3@&W2v3!_lK<3<zpL5vmgw@e zlF#qX`Lh{sEBL%+s(!L8<mCP*roTomqWw!b<+UaM8U~lwIES}Pe^zOD%i=(_Z?*A{ z!vX;LYb}Sj?J4^Iu)MA8@Ro7>XtAjAAKUeJD!6YMH(!e&y=~W@nz(OSfDyW1{#)<; zRcP!_mfuFaL;7!)SJ|<*z~iyf6L>KHG%Ns+zlxLn2~6|~40t{Hefh7zZ=}lJa!B6? zn}7lSnd7e#Qg1m1DE`CoMo{W4M?C~V9VW&<ar~Xm&z~H>J1B_i-yHvv^LYymM<?@N zy6Eq;f!;!wy@h_&|9Oi}(-me>`(G^fuX;j%qW>O%`Tv9d|5F!w%Zg2o`~1)L^qP11 zm&Eb6tcI_dn7@bpj|9xO;2aU=+y52(FG-zm!O6J(0DqI>`IbRoqe}gs-PT{73Ecm3 zCMsh8X80r4`7L;=>wotle+`{}d->k~8(idVAoW`&k(}Pc|JG4|4fcA=#3uLeX8b4g z>n;2Nh=?o0Ki(4nkiX7?-@<zu{~P}8ocJvR9C*6^Ki_qKH!pe1AZ_*s!+&NeZ}Cl5 z<?n}J|LLv<fc*89^(}s^#lP|2yuiLCz!<;AYLNOn0?60r8VCsb>jxk3>Kv?ppZz~N CV^dWC diff --git a/dta/README.md b/dta/README.md new file mode 100644 index 0000000..c07b4cf --- /dev/null +++ b/dta/README.md @@ -0,0 +1,164 @@ +# Moodle Dockerized Test Agent (MoDTA) Plugin + +This is the source code repository for the MoDTA plugin. It is an extended and enhanced version of the approved Moodle JUnit Exercise Corrector (MoJEC) plugin, and the Moodle Dockerized Code Testing (MoDoCoT) and Moodle Dockerized Test Tool (Moodle DTT) plugins - for which no approval was requested, which all still run up to Moodle 4.3. MoDTA can thus be considered MoJEC version 4, thought it can test code in any programming language for which a teacher provides a test runner docker image. + +The zip archive in the root directory contains the files from the dta directory for easy installation as long as it is unavailable via Moodle Plugins Directory. + +## Goals + +MoDTA empowers teachers to provide programming Moodle assignments for their students, which are automatically corrected upon hand-in using teacher-provided tests and the results provided as extended submission feedback. + +Corrections optionally include a pedagogic agent giving feedback on student competencies and in the next version recommending next exercises based on student competency levels and resilience. + +Furthermore, MoDTA optionally provides the errors as tickets in supported ticketing systems to resemble current state-of-the-art software development workflows. + +### Motivation + +Due to contact time constraints, assignments for a new topic typically include about three tasks (one easy introductory, one standard usage, and one advanced combination with previous topics). Students e.g. stuck at the standard level assignment may face frustration and only little opportunity for qualified feedback. Especially in beginners’ programming education, many students struggle with the way of thinking and at the same time feel reluctant to ask teachers for help. + +MoDTA allows for teachers to provide additional assignments at intermediate levels from their typically existing assignment collection. Teachers have to create automated tests for the assignments and place them in a git repository. Afterwards students can practice their skills 24/7 with a less steep learning curve and without having to overcome their potential reluctance to ask a teacher for help. They receive feedback consistent with other assignment results integrated into the Moodle environment. + +MoDTA supports beginners not educated in state-of-the-art repository-based workflows by offering hand-ins in a zip archive containing the code to lower the learning curve. It also supports hand-in via repository URL and optionally repository credentials for advanced students. + +Optionally, if a teacher provides competency profiles and difficulties for tasks and tests, students also receive feedback about their achieved competencies by a pedagogic agent, which in the next version optionally recommends a learning path to the students based on their resilience. + +Furthermore and independent of the other optional features, MoDTA optionally supports a state-of-the-art workflow by placing tickets for compile errors in a student-provided ticketing system link (currently supported: GitLab and Atlassian Jira). + +## Overview + +The MoDTA system comprises two key components: + +• The MoDTA Moodle plugin, designed as an assignment submission tool. +• The DTA backend web service, which interfaces with the Moodle plugin through REST and employs the JSON file format for communication. + +The plugin establishes communication with the external DTA backend REST web service offering the endpoints: + +• POST /v1/unittest:** This endpoint requires the assignment ID and a text file containing the repository link (see usage below for an example). Optionally, it may include credentials, if the repository is private. Credentials should be formatted as "username:password" or "username:auth-token". Also optionally, the file may contain a link to a ticketing system in a new line of the same format. The results are returned in JSON format. + +• POST /v1/tasks:** This API expects the assignment ID and a text file containing a repository link. Similar to the previous endpoint, it can also include an optional line for credentials when dealing with private repositories, using the same "username:password" or "username:auth-token" format. The results are provided in JSON format. + +• DELETE /v1/unittest?assignmentId={id}:** Initiates the deletion of test files when provided with the assignment ID as a query parameter. + +## Installation & Configuration + +After approval, install the plugin directly from the Moodle Plugins Directory via Site Administration/Plugins/Install Plugins. + +Before that or alternatively: zip the plugin code from https://transfer.hft-stuttgart.de/gitlab/HFTSoftwareProject/moodledta (here). The readily-zipped current version also sits in the repository’s main directory. Then install the plugin from zip via Site Administration/Plugins/Install Plugins, or by extracting the plugin archive to {Moodle_Root}/mod/assign/submission/dta and visiting the admins notifications page. + +Visit Site Administration/Plugins/Plugin Overview and select Settings next to the Moodle Dockerized Test Agent (MoDTA) entry to enter the URI of your backend as shown in Fig. 1.  Finally, configure via Site Administration/Security/HTTP Security settings permitting communication with the backend URI and port as seen in Fig. 2.  The plugin requires the external DTA REST webservice backend. + +Notes: + +The universal DTA REST webservice backend is available under the GPLv3 as well at https://transfer.hft-stuttgart.de/gitlab/HFTSoftwareProject/dtabackend and the docker image at https://hub.docker.com/r/hftstuttgart/dta-backend . See the documentation in the repository for the necessary setup. + +An example JDK 17 JUnit 5 test runner is available under GPLv3 as well at https://transfer.hft-stuttgart.de/gitlab/HFTSoftwareProject/dtatestrunner and the pre-built docker image at https://hub.docker.com/r/hftstuttgart/dta-jdk17-junit5-testrunner . The repository contains an example docker-compose.yaml for tests with a bitnami Moodle and MariaDB setup and the backend. + +## Usage + +With the MoDTA plugin installed and configured backend URI (including Moodle Security/HTTP Security settings permitting communication with that URI): + +### Teacher + +When creating an assignment, a teacher can select the MoDTA exercise as a new assignment type via an additional checkbox on the assignment creation page as shown at the bottom of Fig. 3.  A new standard file upload field appears as indicated in Fig. 4. . There, the teacher must upload a text file with the git repository URI containing the tests as shown in Fig. 5.  The text file has to adhere to the following format also given in the example repository: + +The text file has to contain the following, each separated by :: +- dtt as the URI-type +- \<git https repository URI> +- \<git user name or the fixed string “none†for publicly accessible repositories> +- \<git password for the given user, git read access token for the repository, or the fixed string “none†for publicly accessible repositories> +- \<docker hub image for the test runner> +- optionally, an additional line of the same structure containing a ticketing system URI, user name and password or write access token + +An example text file content looks like this: +dtt::https://transfer.hft-stuttgart.de/gitlab/dtt/example_openjdk11-junit5-calculator-test.git::none::none::hftstuttgart/dta-jdk17-junit5-testrunner:latest + +Students use the same format, just without the runner part at the end. + +### Student + +Students use an additional MoDTA standard file upload field in the standard submission processs in Moodle like in Fig. 6. [Fig. 6: Moodle DTA Student File Upload](doc/usage_student_1.png) There, they place either a zip archive or a text file adhering to the same format as the teacher’s file with their code repository URI and optionally credentials and/or a ticketing system URI as shown in Fig. 7.  + +Upon completion, students see a summarized overview of their test results in an additional column of the submission feedback table like in Fig. 8.  Clicking on a new expansion icon in that column, they reach a detailed feedback dialog including stack traces of compile errors and test failures as in Fig. 9.  Optionally, the MoDTA backend creates tickets for compile failures in the ticketing system under the URI provided by the student upon hand-in. + +Note: Teachers have access to the Moodle submission result view to assess student results. However, teacher control and grading are not the focus of MoDTA. + +### Technical Workflow + +Assignment creation: The backend creates a temporary directory and checks out the test code from the given repository to that directory's subdirectory test. If the repository contains a file test-competencies.mft in its root directory with a structure described in the backend documentation, this enables the optional competency feedback. + +Assignment submission: The MoDTA plugin passes the submission id and submitted text or zip file – no personal teacher student data – to the external DTA backend REST web service. The DTA backend REST web service fetches or extracts the code to the temporary directory's subdirectory src. It launches via docker a dedicated test runner based on the docker image provided in the teacher’s text file. This test runner compiles and executes the code, running the teacher-defined tests to evaluate the students' submission. + +The runner returns the result in a file named result.json in the temporary directory's subdirectory result. The backend optionally enriches the result with competency feedback. It then returns the json result structure to the MoDTA moodle plugin. The MoDTA moodle plugin adds a new column to the submission result table and shows a result summary as well as an + button. Clicking on the + button, the student sees the detailed test results and, optionally, competency feedback. + +## Plugin Detail Documentation – MoDTA Assignment Submission Plugin + +The assignment submission plugin type was the most suitable choice with assignment feedback as another related option. It empowers you to present customized form fields to students during the assignment submission process and to teachers when configuring assignment settings. Moreover, it grants complete control over how submitted assignments are displayed to both graders and students. + +The primary features of this plugin type include the ability to: + +• Integrate additional settings into the module settings page for assignments. +• Provide a summary of the submission to students and teachers. +• Incorporate form fields into the student submission page for added flexibility and customization. + +### File Structure + +To ensure proper organization, all files related to the MoDTA assignment submission plugin reside in the directory path "mod/assign/submission/dta" within {Moodle_Root}. + +### Language + +The language files for our plugin are found under "lang/<country_code>/assignsubmission_dta.php." These files are organized into different subfolders depending on the language to be supported. For instance: + +- English: "lang/en/assignsubmission_dta.php" + +The filename corresponds to the component name of the plugin, structured as <plugintype>_<pluginname>, which, in our case, is "assignsubmission_dta." The repository delivers only English as requested by the Moodle team. + +Each language file contains various key-value entries formatted as $string["key"] = "Value," with the key provided in English as the most widespread language remaining consistent across different language files, while the value varies according to the chosen language. Moodle incorporates a dedicated String API used In the plugin as required In the approval guidelines, allowing for easy value retrieval based on a given key and the selected language (e.g., get_string("key", "default value")). + +### version.php + +This file provides version information about the plugin to manage installation and upgrades. + +### settings.php + +The settings file defines two settings for the MoDTA plugin: + +1. Default: This setting offers a checkbox to determine whether the plugin should be enabled by default when creating a new assignment. + +2. Web Service Base URL: It features a text field where you can specify the base URL for the web service, facilitating file communication and actual testing. + +### db/upgrade.php + +This file is currently empty, as the data structure for the plugin has not changed so far. + +### db/install.xml + +This file defines the necessary database tables and rows for storing data associated with the MoDTA plugin. Moodle offers a specialized XML schema designed for modeling this information, featuring elements like TABLENAME, FIELDS, and KEY. The plugin utilizes two additional tables for cleanliness not to alter moodle standard tables: +assignsubmission_dta_summary which is related 1:1 to the submission and uses the assignment_id and submission_id as foreign keys, and assignsubmission_dta_result which stores the results of a submission as a 1:n relation to the assignsubmission_dta_summary. Whenever a new MoDTA assignment is submitted, the backend web service is engaged, returning one or more test results or compilation errors in the form of a JSON string. The front end parses this JSON string for the result summary and results and stores them in the appropriate tables. + +### locallib.php + +This is where all the functionality for this plugin is defined. All submission plugins must define a class with the component name of the plugin that extends assign_submission_plugin . + +That yields the following class hierarchy: + +The "assign_submission_plugin" class serves as an abstract foundation that all assignment submission plugins must build upon. It incorporates a limited set of supplementary functions tailored exclusively to submission plugins. On the other hand, the "assign_plugin" class is also an abstract class, but it functions as the fundamental class for all assignment plugins, encompassing both feedback and submission plugins. This class facilitates access to the assignment instance, represented as "$this->assignment." Collectively, these two classes offer a series of public functions, often referred to as "hooks," which are designed to be overridden to implement the required functionality. + +The following provides brief descriptions of a selection of functions to illustrate the types of hooks available: + +• get_settings(): This function comes into play during the creation of the assignment settings page. For the MoDTA plugin, this involves adding a file manager that permits teachers to upload their test repo and docker Image URI as a textfile. This function is overridden from the assign_plugin class. + +• save_settings(): The save_settings function is invoked when the assignment settings page is submitted, whether for a new assignment or the modification of an existing one. In the MoDTA plugin, this function is responsible for preserving the text file chosen by the teacher and transmitting the file to the backend web service. Like the previous function, this one is overridden from the assign_plugin class. + +• get_form_elements_for_user(): During the construction of the submission form, this function plays a similar role to the get_settings() function for settings. In the context of the MoDTA plugin, it adds a file manager to enable students to upload their text or zip file. Once again, this function is overridden from the assign_plugin class. + +• save():This function is invoked to save a user's submission. Within the MoDTA plugin, this function sends the student's submission to the backend and receives the result as the response. For details see the technical details section above. + +• view_summary(): This function is called to display a summary of the submission to both teachers and students. For the students, this summary will be shown within the submission status table and for the teachers within a column of the grading table. In the MoDTA plugin this method returns a more compact view (only essential data) for the grading table and a detailed view for the students submission status table. + +### lib.php + +This file serves as the gateway to various standard Moodle APIs designed for plugins. In the content of the MoDTA plugin, this function is denoted as "assignsubmission_dta_pluginfile." + +### util folder + +The folder contains various utility files, e.g. displaying the new test summary pages is delegated from the locallib.php for brevity of that source. diff --git a/dta/classes/backend.php b/dta/classes/backend.php index 7ca08f4..d0bc5bc 100644 --- a/dta/classes/backend.php +++ b/dta/classes/backend.php @@ -83,7 +83,7 @@ class DtaBackendUtils { * @param stdClass $file submission config file or archive with submission * @return string json string with testresults or null on error */ - public static function sendsubmissiontobackend($assignment, $submissionid, $file): ?string { + public static function send_submission_to_backend($assignment, $submissionid, $file): ?string { $backendaddress = self::getbackendbaseurl(); if (empty($backendaddress)) { return true; diff --git a/dta/classes/database.php b/dta/classes/database.php index 6f5c82a..a444dee 100644 --- a/dta/classes/database.php +++ b/dta/classes/database.php @@ -107,6 +107,7 @@ class DbUtils { $summaryrecord->global_stacktrace = $summary->globalstacktrace; $summaryrecord->successful_competencies = $summary->successfultestcompetencies; $summaryrecord->tested_competencies = $summary->overalltestcompetencies; + $summaryrecord->recommendations = $summary->recommendations; // Prepare results to persist to array. $resultrecords = []; diff --git a/dta/classes/privacy/provider.php b/dta/classes/privacy/provider.php index 9e36d5c..ca26121 100644 --- a/dta/classes/privacy/provider.php +++ b/dta/classes/privacy/provider.php @@ -57,6 +57,8 @@ class provider implements \core_privacy\local\metadata\provider, 'global_stacktrace' => 'privacy:metadata:assignsubmission_dta_summary:global_stacktrace', 'successful_competencies' => 'privacy:metadata:assignsubmission_dta_summary:successful_competencies', 'tested_competencies' => 'privacy:metadata:assignsubmission_dta_summary:tested_competencies', + 'recommendations' => 'privacy:metadata:assignsubmission_dta_summary:recommendations', + ], 'privacy:metadata:assignsubmission_dta_summary' ); diff --git a/dta/db/install.xml b/dta/db/install.xml index 1a0b3f0..4b74456 100644 --- a/dta/db/install.xml +++ b/dta/db/install.xml @@ -1,46 +1,47 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<XMLDB PATH="mod/assign/submission/dta/db" VERSION="20210107" COMMENT="XMLDB file for Moodle mod/assign/submission/dta" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="../../../../../lib/xmldb/xmldb.xsd" -> - <TABLES> - <TABLE NAME="assignsubmission_dta_summary" COMMENT="DTA testrun summary"> - <FIELDS> - <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/> - <FIELD NAME="assignment_id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/> - <FIELD NAME="submission_id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/> - <FIELD NAME="successful_competencies" TYPE="char" LENGTH="80" NOTNULL="false"/> - <FIELD NAME="tested_competencies" TYPE="char" LENGTH="80" NOTNULL="false"/> - <FIELD NAME="timestamp" TYPE="int" LENGTH="10"/> - <FIELD NAME="global_stacktrace" TYPE="text"/> - </FIELDS> - <KEYS> - <KEY NAME="primary" TYPE="primary" FIELDS="id"/> - <KEY NAME="fk_assignment" TYPE="foreign" FIELDS="assignment_id" REFTABLE="assign" REFFIELDS="id" COMMENT="The assignment instance this summary relates to"/> - <KEY NAME="fk_submission" TYPE="foreign" FIELDS="submission_id" REFTABLE="assign_submission" REFFIELDS="id" COMMENT="The submission this summary relates to."/> - </KEYS> - </TABLE> - <TABLE NAME="assignsubmission_dta_result" COMMENT="DTA testrun single test results"> - <FIELDS> - <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/> - <FIELD NAME="assignment_id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/> - <FIELD NAME="submission_id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/> - <FIELD NAME="package_name" TYPE="char" LENGTH="255" NOTNULL="false"/> - <FIELD NAME="class_name" TYPE="char" LENGTH="255" NOTNULL="false"/> - <FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true"/> - <FIELD NAME="state" TYPE="int" LENGTH="10" NOTNULL="true"/> - <FIELD NAME="failure_type" TYPE="char" LENGTH="255"/> - <FIELD NAME="failure_reason" TYPE="char" LENGTH="255"/> - <FIELD NAME="stacktrace" TYPE="text"/> - <FIELD NAME="column_number" TYPE="int" LENGTH="10"/> - <FIELD NAME="line_number" TYPE="int" LENGTH="10"/> - <FIELD NAME="position" TYPE="int" LENGTH="10"/> - </FIELDS> - <KEYS> - <KEY NAME="primary" TYPE="primary" FIELDS="id,assignment_id,submission_id"/> - <KEY NAME="fk_assignment" TYPE="foreign" FIELDS="assignment_id" REFTABLE="assign" REFFIELDS="id" COMMENT="The assignment instance this result relates to"/> - <KEY NAME="fk_submission" TYPE="foreign" FIELDS="submission_id" REFTABLE="assign_submission" REFFIELDS="id" COMMENT="The submission this result relates to."/> - </KEYS> - </TABLE> - </TABLES> +<?xml version="1.0" encoding="UTF-8" ?> +<XMLDB PATH="mod/assign/submission/dta/db" VERSION="20210107" COMMENT="XMLDB file for Moodle mod/assign/submission/dta" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../lib/xmldb/xmldb.xsd" +> + <TABLES> + <TABLE NAME="assignsubmission_dta_summary" COMMENT="DTA testrun summary"> + <FIELDS> + <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/> + <FIELD NAME="assignment_id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/> + <FIELD NAME="submission_id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/> + <FIELD NAME="successful_competencies" TYPE="char" LENGTH="80" NOTNULL="false"/> + <FIELD NAME="tested_competencies" TYPE="char" LENGTH="80" NOTNULL="false"/> + <FIELD NAME="recommendations" TYPE="char" LENGTH="160" NOTNULL="false"/> + <FIELD NAME="timestamp" TYPE="int" LENGTH="10"/> + <FIELD NAME="global_stacktrace" TYPE="text"/> + </FIELDS> + <KEYS> + <KEY NAME="primary" TYPE="primary" FIELDS="id"/> + <KEY NAME="fk_assignment" TYPE="foreign" FIELDS="assignment_id" REFTABLE="assign" REFFIELDS="id" COMMENT="The assignment instance this summary relates to"/> + <KEY NAME="fk_submission" TYPE="foreign" FIELDS="submission_id" REFTABLE="assign_submission" REFFIELDS="id" COMMENT="The submission this summary relates to."/> + </KEYS> + </TABLE> + <TABLE NAME="assignsubmission_dta_result" COMMENT="DTA testrun single test results"> + <FIELDS> + <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/> + <FIELD NAME="assignment_id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/> + <FIELD NAME="submission_id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/> + <FIELD NAME="package_name" TYPE="char" LENGTH="255" NOTNULL="false"/> + <FIELD NAME="class_name" TYPE="char" LENGTH="255" NOTNULL="false"/> + <FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true"/> + <FIELD NAME="state" TYPE="int" LENGTH="10" NOTNULL="true"/> + <FIELD NAME="failure_type" TYPE="char" LENGTH="255"/> + <FIELD NAME="failure_reason" TYPE="char" LENGTH="255"/> + <FIELD NAME="stacktrace" TYPE="text"/> + <FIELD NAME="column_number" TYPE="int" LENGTH="10"/> + <FIELD NAME="line_number" TYPE="int" LENGTH="10"/> + <FIELD NAME="position" TYPE="int" LENGTH="10"/> + </FIELDS> + <KEYS> + <KEY NAME="primary" TYPE="primary" FIELDS="id,assignment_id,submission_id"/> + <KEY NAME="fk_assignment" TYPE="foreign" FIELDS="assignment_id" REFTABLE="assign" REFFIELDS="id" COMMENT="The assignment instance this result relates to"/> + <KEY NAME="fk_submission" TYPE="foreign" FIELDS="submission_id" REFTABLE="assign_submission" REFFIELDS="id" COMMENT="The submission this result relates to."/> + </KEYS> + </TABLE> + </TABLES> </XMLDB> \ No newline at end of file diff --git a/dta/lang/en/assignsubmission_dta.php b/dta/lang/en/assignsubmission_dta.php index 4f3cf89..e0ddb29 100644 --- a/dta/lang/en/assignsubmission_dta.php +++ b/dta/lang/en/assignsubmission_dta.php @@ -151,6 +151,7 @@ $string["privacy:metadata:assignsubmission_dta_summary:timestamp"] = "Date and t $string["privacy:metadata:assignsubmission_dta_summary"] = "Stack trace of the compilation and test if major problems occur"; $string["privacy:metadata:assignsubmission_dta_summary:successful_competencies"] = "List of the successfully tested competencies"; $string["privacy:metadata:assignsubmission_dta_summary:tested_competencies"] = "List of the tested competencies"; +$string["privacy:metadata:assignsubmission_dta_summary:recommendations"] = "List of recommendations after submitting the code"; $string["privacy:metadata:assignsubmission_dta_summary"] = "Summary of Dockerized Test Agent (DTA) results"; $string["privacy:metadata:assignsubmission_dta_result:package_name"] = "Package name of individual test"; $string["privacy:metadata:assignsubmission_dta_result:class_name"] = "Class name of individual test"; diff --git a/dta/locallib.php b/dta/locallib.php index cff2b4e..1a3ab59 100644 --- a/dta/locallib.php +++ b/dta/locallib.php @@ -285,7 +285,7 @@ class assign_submission_dta extends assign_submission_plugin { $file = reset($files); // Send file to backend. - $response = DtaBackendUtils::sendsubmissiontobackend($this->assignment, $submission->id, $file); + $response = DtaBackendUtils::send_submission_to_backend($this->assignment, $submission->id, $file); // With a null response, return an error. if (is_null($response)) { diff --git a/dta/styles.css b/dta/styles.css index 0919503..9afdd31 100644 --- a/dta/styles.css +++ b/dta/styles.css @@ -1,74 +1,74 @@ -/* Prevent word breaking in the grading table */ -.dtaSubmissionSummary { - white-space: nowrap; -} - -.dtaSubmissionSummary, -.dtaSubmissionDetails { - margin-top: 15px; -} - -/* empty div between summary and detail table */ -.dtaSpacer { - margin-top: 30px; -} - -/**************************************************************** -* Layout for the Detail view -****************************************************************/ - -.dtaTable { - display: inline-block; - max-width: 100%; - overflow: auto; - background: white !important; - border-radius: .1rem; - box-shadow: 0 .2rem .5rem rgba(0,0,0,.05),0 0 .05rem rgba(0,0,0,.1); - overflow-x: hidden; -} - -.dtaTableHeaderRow { - font-weight: bold; - color: white !important; - background-color: gray !important; -} - -.dtaTableRow { - background-color: unset !important; - border-top: .05rem solid lightgray; -} - -.dtaTableHeaderRow th, -.dtaTableRow td { - padding: .9375em 1.25em; -} - -.dtaStacktraceDetails { - max-height: 300px; - max-width: 70%; - overflow: auto; -} - -.dtaResultUnknown { - border-left: 10px solid gray; -} - -.dtaResultSuccess { - border-left: 10px solid green; -} - -.dtaResultFailure { - border-left: 10px solid orange; -} - -.dtaResultCompilationError { - border-left: 10px solid red; -} - -.dtaTableRow:hover { - background-color: lightgray !important; -} - -.dtaTableSpacer { - border-bottom: 2px solid darkgray; -} +/* Prevent word breaking in the grading table */ +.dtaSubmissionSummary { + white-space: nowrap; +} + +.dtaSubmissionSummary, +.dtaSubmissionDetails { + margin-top: 15px; +} + +/* empty div between summary and detail table */ +.dtaSpacer { + margin-top: 30px; +} + +/**************************************************************** +* Layout for the Detail view +****************************************************************/ + +.dtaTable { + display: inline-block; + max-width: 100%; + overflow: auto; + background: white !important; + border-radius: .1rem; + box-shadow: 0 .2rem .5rem rgba(0,0,0,.05),0 0 .05rem rgba(0,0,0,.1); + overflow-x: hidden; +} + +.dtaTableHeaderRow { + font-weight: bold; + color: white !important; + background-color: gray !important; +} + +.dtaTableRow { + background-color: unset !important; + border-top: .05rem solid lightgray; +} + +.dtaTableHeaderRow th, +.dtaTableRow td { + padding: .9375em 1.25em; +} + +.dtaStacktraceDetails { + max-height: 300px; + max-width: 70%; + overflow: auto; +} + +.dtaResultUnknown { + border-left: 10px solid gray; +} + +.dtaResultSuccess { + border-left: 10px solid green; +} + +.dtaResultFailure { + border-left: 10px solid orange; +} + +.dtaResultCompilationError { + border-left: 10px solid red; +} + +.dtaTableRow:hover { + background-color: lightgray !important; +} + +.dtaTableSpacer { + border-bottom: 2px solid darkgray; +} diff --git a/teacher-dta.txt b/teacher-dta.txt new file mode 100644 index 0000000..276c40c --- /dev/null +++ b/teacher-dta.txt @@ -0,0 +1 @@ +dtt::https://transfer.hft-stuttgart.de/gitlab/dtt/example_openjdk11-junit5-calculator-test.git::none::none::hftstuttgart/dta-jdk17-junit5-testrunner:latest -- GitLab