From 7eb519f9b5639a2fb5970a61917bcb3ae45bf6a9 Mon Sep 17 00:00:00 2001 From: Felix Homa Date: Sun, 27 Mar 2022 22:40:52 +0200 Subject: [PATCH] More Work --- .gitignore | 2 + .../pingger/korrekturHelper/AbstractNode.java | 21 ++++-- .../pingger/korrekturHelper/CheckboxNode.java | 29 +++++++-- .../pingger/korrekturHelper/HeaderNode.java | 11 +++- .../pingger/korrekturHelper/HtmlContext.java | 61 ++++++++++++++++++ .../korrekturHelper/KorrekturHelper.java | 7 ++ .../cs/rvs/pingger/korrekturHelper/Node.java | 6 +- .../rvs/pingger/korrekturHelper/Test.schema | 21 +++++- .../korrekturHelper/AbstractNode.class | Bin 2531 -> 0 bytes .../korrekturHelper/CheckboxNode.class | Bin 2141 -> 0 bytes .../pingger/korrekturHelper/HeaderNode.class | Bin 4402 -> 0 bytes .../korrekturHelper/KorrekturHelper.class | Bin 1009 -> 0 bytes .../cs/rvs/pingger/korrekturHelper/Node.class | Bin 722 -> 0 bytes .../rvs/pingger/korrekturHelper/Test.schema | 24 ------- 14 files changed, 141 insertions(+), 41 deletions(-) create mode 100644 .gitignore create mode 100644 src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HtmlContext.java delete mode 100644 target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.class delete mode 100644 target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.class delete mode 100644 target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HeaderNode.class delete mode 100644 target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.class delete mode 100644 target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Node.class delete mode 100644 target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..536d1f7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +target/ diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.java index 52cfe07..da8295c 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.java +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.java @@ -11,11 +11,12 @@ import javax.swing.border.EmptyBorder; /** * @author Pingger */ -public abstract class AbstractNode extends JPanel implements Node +public abstract class AbstractNode implements Node { - private static final long serialVersionUID = 2766238124985613235L; /** Content-Panel */ protected final JPanel content; + private final JPanel main; + private final JPanel sub; /** Sub-Nodes */ protected final LinkedHashSet subNodes = new LinkedHashSet<>(); @@ -25,18 +26,23 @@ public abstract class AbstractNode extends JPanel implements Node */ public AbstractNode() { - super(true); - setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + main = new JPanel(true); + main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS)); content = new JPanel(new BorderLayout(), true); sub = new JPanel(true); sub.setLayout(new BoxLayout(sub, BoxLayout.Y_AXIS)); sub.setBorder(new EmptyBorder(0, 8, 8, 0)); - add(content); - add(sub); + main.add(content); + main.add(sub); } + /** + * Resets this node + */ + protected abstract void _reset(); + @Override public void addSubNode(Node n) { @@ -46,7 +52,7 @@ public abstract class AbstractNode extends JPanel implements Node @Override public Component getComponent() - { return this; } + { return main; } @Override public LinkedHashSet getSubNodes() @@ -55,6 +61,7 @@ public abstract class AbstractNode extends JPanel implements Node @Override public void reset() { + _reset(); subNodes.forEach(Node::reset); } } diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.java index 1d113d5..b384333 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.java +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/CheckboxNode.java @@ -5,13 +5,25 @@ import java.math.MathContext; import javax.swing.JCheckBox; +/** + * @author Pingger + */ public class CheckboxNode extends AbstractNode { + private static String ptsToString(BigDecimal p) + { + return (p.signum() > 0 ? "+" : "") + p.toPlainString(); + } + private final JCheckBox cbx; + private final String message; private final BigDecimal points; + /** + * @param configString config String to parse + */ public CheckboxNode(String configString) { if (configString.contains("\n")) @@ -23,7 +35,14 @@ public class CheckboxNode extends AbstractNode { throw new IllegalArgumentException("Not a [] Node"); } points = new BigDecimal(spl[1]); message = spl[2]; - cbx = new JCheckBox(); + cbx = new JCheckBox(ptsToString(points) + "P " + message); + content.add(cbx); + } + + @Override + protected void _reset() + { + cbx.setSelected(false); } @Override @@ -45,14 +64,14 @@ public class CheckboxNode extends AbstractNode @Override public String toConfigString() { - return "[]\t" + (points.signum() > 0 ? "+" : "") + points.toPlainString() + "\t" + message; + return "[]\t" + ptsToString(points) + "\t" + message; } @Override - public String toResultHtml() + public String toResultHtml(HtmlContext hc) { - // TODO Auto-generated method stub - return null; + return "" + + ptsToString(achievedPoints(hc.mc)) + "P" + message + ""; } } diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HeaderNode.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HeaderNode.java index f8d079d..76a29f0 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HeaderNode.java +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HeaderNode.java @@ -1,5 +1,6 @@ package de.tuDortmund.cs.rvs.pingger.korrekturHelper; +import java.awt.BorderLayout; import java.awt.Font; import java.math.BigDecimal; import java.math.MathContext; @@ -13,7 +14,6 @@ public class HeaderNode extends AbstractNode { private static final String[] configStyles = { "", "#", "##", "###", "####", "#####", "######", "*", "_" }; private static final String[] htmlStyles = { "", "h1", "h2", "h3", "h4", "h5", "h6", "b", "i" }; - private static final long serialVersionUID = -5511548087337263042L; private static int indexOf(String[] array, String elem) { @@ -84,6 +84,13 @@ public class HeaderNode extends AbstractNode lbl.setFont(new Font(lbl.getFont().getFontName(), Font.ITALIC, lbl.getFont().getSize())); break; } + content.add(lbl, BorderLayout.CENTER); + } + + @Override + protected void _reset() + { + // does nothing } @Override @@ -109,7 +116,7 @@ public class HeaderNode extends AbstractNode } @Override - public String toResultHtml() + public String toResultHtml(HtmlContext hc) { return (style == 0 ? "" : "<" + htmlStyles[style] + (css == null ? "" : " style=\"" + css + "\"") + ">") + message + (style == 0 ? "" : ""); diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HtmlContext.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HtmlContext.java new file mode 100644 index 0000000..1f1b9c9 --- /dev/null +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HtmlContext.java @@ -0,0 +1,61 @@ +package de.tuDortmund.cs.rvs.pingger.korrekturHelper; + +import java.math.MathContext; + +/** + * @author Pingger + */ +public class HtmlContext +{ + /** Style for the Points, when the best case Points have been achieved */ + public String fullPtsStyle = ""; + /** Style for the Text, when the best case Points have been achieved */ + public String fullPtsTextStyle = ""; + /** {@link MathContext} for Output */ + public MathContext mc; + /** Style for the Points, when the worst case Points have been achieved */ + public String noPtsStyle = ""; + /** Style for the Text, when the best case Points have been achieved */ + public String noPtsTextStyle = ""; + /** + * Style for the Points, when neither best nor worst case Points have been + * achieved + */ + public String partialPtsStyle = ""; + + /** + * Style for the Text, when neither best nor worst case Points have been + * achieved + */ + public String partialPtsTextStyle = ""; + + /** + * @param signum the style-signum -1 worst case, 0 partial case, 1 best case + * @return the style tag-parameter for the given signum for the Points + */ + public String stylePts(int signum) + { + return switch (signum) + { + case 0 -> partialPtsStyle.isBlank() ? "" : " style=\"" + partialPtsStyle + "\""; + case 1 -> fullPtsStyle.isBlank() ? "" : " style=\"" + fullPtsStyle + "\""; + case -1 -> noPtsStyle.isBlank() ? "" : " style=\"" + noPtsStyle + "\""; + default -> throw new IllegalArgumentException("Signum must be one of -1, 0, 1"); + }; + } + + /** + * @param signum the style-signum -1 worst case, 0 partial case, 1 best case + * @return the style tag-parameter for the given signum for the Text + */ + public String styleText(int signum) + { + return switch (signum) + { + case 0 -> partialPtsTextStyle.isBlank() ? "" : " style=\"" + partialPtsTextStyle + "\""; + case 1 -> fullPtsTextStyle.isBlank() ? "" : " style=\"" + fullPtsTextStyle + "\""; + case -1 -> noPtsTextStyle.isBlank() ? "" : " style=\"" + noPtsTextStyle + "\""; + default -> throw new IllegalArgumentException("Signum must be one of -1, 0, 1"); + }; + } +} diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.java index 466ebbe..a28f419 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.java +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.java @@ -2,9 +2,16 @@ package de.tuDortmund.cs.rvs.pingger.korrekturHelper; import java.io.IOException; +/** + * @author Pingger + */ public class KorrekturHelper { + /** + * @param args [0] input File + * @throws IOException in case reading the input file fails + */ public static void main(String[] args) throws IOException { var in = KorrekturHelper.class.getClassLoader() diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Node.java b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Node.java index b6e2375..8eac76a 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Node.java +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Node.java @@ -55,7 +55,9 @@ public interface Node String toConfigString(); /** - * @return the current Result-HTML + * @param hc the HtmlContext + * @return the current Result-HTML (regardless of + * {@link #isVisibleInResultHtml()}) */ - String toResultHtml(); + String toResultHtml(HtmlContext hc); } diff --git a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema index 625ede6..1641e23 100644 --- a/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema +++ b/src/main/java/de/tuDortmund/cs/rvs/pingger/korrekturHelper/Test.schema @@ -1,8 +1,14 @@ +// Kommentare +// :base gibt die Start-Punkte an :base 0.0 +// Design für Punkte. Pts ist dabei für die Punkte, PtsText für den Text. die Punkte zählen als Teil des Textes (
  • 'Punkte'Text
  • ) +// full -> best-Case :fullPts color: #0f0; :fullPtsText +// no -> worst-case :noPts color: #f00; :noPtsText +// partial -> alle verbleibenden Fälle. Sonderfall: Elemente die 0 Punkte bringen (egal was ausgewählt ist) haben auch diesen Fall! :partialPts color: #fb0; :partialPtsText !header # Test-Schema @@ -21,4 +27,17 @@ 2.5 Halbe Punkte 50% Halbe Punkte in Prozent 1/3 Ein Drittel Punkte als Bruch - 0 Null Punkte \ No newline at end of file + 0 Null Punkte + \\ 5.0 Text der immer angezeigt wird. Dadurch wird der Text bei den Punkten zur Begründung + 5.0 Volle Punkte + 2.5 Halbe Punkte + 50% Halbe Punkte in Prozent + 1/3 Ein Drittel Punkte als Bruch + 0 Null Punkte + \\ 5.0 Text der immer angezeigt wird. Dadurch wird der Text bei den Punkten zur Begründung (Multi-Select anstatt Radio-Box, das kann nicht gemischt werden!) + [] 1.0 Ziel 1 + [] 1.0 Ziel 2 + [] 2.0 Ziel 3 + [] 0.5 Ziel 4 + [] 0.5 Ziel 5 +// Zeilenumbruch am Ende der Datei wichtig! diff --git a/target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.class b/target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/AbstractNode.class deleted file mode 100644 index 49a2e6a7b688a88cd4f98da518fb93973585dc59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2531 zcmbVNYf}_Q6g|zdEUbed!3T=L2bg712V*qRMWY}F%!(w7YcS8=*#<^-XErlED1RuQ zlS;&jR^?MZrSd~km7kERR8G$Z+xK;DpL^%Gzn}jC;2OdlIs~rNm93*& zexRF?SGS$e4mLu&<$9~DDzMl6AW-W%3g%R!#rK=FPzTb{3w~YY&?zwRNN&g{cKDbE z_MJuPsYVW60vGn=*0>Ys4^`mGMpXr&>wEX-ZwZJy0=+Z77i#J0s%%6md&c?h&(nYW z^`k(}@jb0PEihPqJ&lq;CX8wV-CRw8P+%z5vm@;`?6T{vtNNS_*D6X=xu@c;dXi9? z$--`WQ{_G5DqW}Zt|`}Z^>wCH7_SO+&M==mGB|AEEgYes@Nm4E!%>052FVT?<}rj} zqdnLIfwwL6p+AQc0teI3r~M~ox#>qbj}e?Q>Zb*c6cRY{v9?)DEnQCqrTOt{o}R`m zoWVPUA1a-g3LHxrB(l5GljK9mBst!WX&Zmjeo$AzcFY2X4XU#y@Hv6uUHuTPfni&) z&}*J9SlEwVV?36_djyz9Rf~hzv(1*?OakU{5tmJr_eq1oJpT-u46azX3Uir6lW5Xa zlEpSj+s=|x0y0IoX5l(MZamT{PC<|DtO1~_Dz@fs9RWOym#%A>dF1|rh?EJe*ule;w8OWy6?0&MGq$jF9M$5m8F?kzO5{13AOE~x`Aby_I+&za4V@- zn1_Uu1BcwHcx=QM>3SRfy0Xi%S*uGb$`uZ5KiITT2OaNYg||flzo#kCwoIJQNw3~e z;b__S*P~V`VSgN;q61F*wB!}TrOlRlv%@6h|J$|+m_|Ay8;y#qRjIEF-|WKbYCl#D zu^(Aj!eCzy+q@q2l+@=RAC^kUNzlhi}_6%1&qUiYh6S)UNX+M@)wQ zS#;tka_HuB52@9GJO<4K8Z&$oxP@7wH;9(FcW^(#Ajc=RaQlIYHt{p&1-5WE6>~pp2u!eYXK@(kV!wwH z+qPeN!2;t8EK)Pe?>IMMCK*=~>@0UvzK-JeX2lJzU9sdsD$S0UX?}uFsg+zsCH7#q zJ!DO~|8;UH##F-P!i$A13 z=wn}eP?vFTefRDGUA@?+2TG!=fK$m2Gb7Rm9NhBtAY zp((65wqUr~NF@<#aQkfiD&AtyCERobr^m7V`fRPjEy0U=UVkD~3^1g&cO=q~hGC45 ztW=xnP}TpC^X=UO9+yJ(Y2kpXqI1Et$~HgX#g)X) zM$*7YsUu=UDU9IEV+Ga_R&M?rfZ$t zI^zrmX>Nz>c4(7q3*I9hRvj@fT&l6vHEXt8bx&ya4EzfpDoOaUr%qJrIEih%!3yXG zcE7wAaqv{tc8WYuu|WlF?~ujU&?jB8t>FoF$bF$*@~UoB-hzrR=pGEKFc~02Ee%DG z0h-N9g?mMYTjyPeGq)i@osd8!4P`v0f`z~0(Djaa$;0;WPkcLQv_Xbq|i#UKPXDZ7l)2;VK~=b z$EBxeJ;vqDT<;NH|7|$;Mjic2BhQ<^PnK`U<=oAYbiR(kZA&SZ&4@KVq}mwe&fz0WQcY8|+J*EBIv}NhDRe0Ql+WyR2WDum ziBSqDWtLK63D#+rqP5PUUoc+B$4`-^QT`d4f5s<2(nic#>IPyUd341Ir#w2bjEA%@ z(dkdGeM+G=CveNO#;}41^eYw5(^sCPCU8H{I2EZ9Bix7(v^XX~V5G#OB!4u?&m`;` zbB7voGpD($c%0;ZL$yfkv16=l<~}>ZrmVD%t?!`bK7WR$+?RC};z)H9s1N^ zzbeM<2Dq^VE^a_-L&4e$$&{KPJFzA^!Qh-y8IhZ^bS6)2EMlzT)YNGaZWQJH4WR7e AZ~y=R diff --git a/target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HeaderNode.class b/target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/HeaderNode.class deleted file mode 100644 index 292aec192a3870288eefa07f31b31213cb81d8b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4402 zcmb7HX>`=q75+4~N3s#%2(vpd29nsuFkrTTAuSjv2HOyZ5QfkMdFI&`){F*8114$O zrlF-v8qzH-qzklZX;az;2!=pIx|1g9zVGYr{^&V9r$0EQ-;*>j18z>iSnuh*d++=1 zz2Ci0e)T^WE&*7DzpIETSe6w@zqrxv=2=xz{p zf$tlHnH6rYlNBne6)e9c<<)(j@0uB3sw>blPQKq7NcjhB;VGE#K=&SVpP97H{6I40 zy9Cgopl;C5*(H&BPq>z8Zx^m-Ir;m#)+$goDj3`887(bHek?0m7*9Bmi3KQlPEO*jC>1rEYV}b_La)fv1xc)ZYkB!xRP3Fpa9S zH8d)S&E`0RsjJE_>Jp_#)&wNTKiqXuyeZL~DFP{VvV zwrf}*$3+_2<+xbGVmU6+uvCsqHQY@DeHvD9u%w-pI#k3JjPJJcqPLjq6Ye&%Pr7Jy zI~j)0WDxltEvi;ND~31sD`;*WB?UJJucfOF6R}1|Czyb^*jqGhhIwLhnds)eJtE_G zwCtqort6vq7z|;H9Fvvu&CF1bS%{9W?-Bl>ligyvW={CbEKRPAa!_G1qD0H~I#i)s zM;9h&=%v$j63!MK_hKtENK*Nxm8Y5M<$yW|O*ciTBA*e2rDB_cS=UqAW!qxFv{$xMI;;FDt-NP@;SW;PL$wJEXQVU;Av5|QW^BHL7l6n0278#T~drB(<6N?hNd<}gH)TY6p z9yMf{-CoB}n2Bg9A&abzbm-UdCcIe^V^BvuZqu-bWhKuD%Bo53*gD2zoSfx#jKw$= z1=^G08BTipS&7Mw-DaP#>)>FA3I=y<5Ib|fpIpy?%k`p;eb`S-1HzYU3T|s|2`Nz$ z>!^c^13DhYBMQbua=pyEf`*c8dHGB6M|Hd%?+DGNtcNMe$|M6_JSL<5E(McE32s-H z7 zNW~5NIzEbzvFLWL+qzl7q|t4#f#fm_VA*c@$*gJ1+irOln?+ZCtMH1pzk%&INWo6Y zmS=Q)5}#t#dBr}-H~KL(G*ahrY}0i;7jPC8VJlb6m2x?y1muRKkS61NCoFBc z!Maj$x&)?-_-l%m&0AK(3xpEYGyBRZ?2wOhI?m%ohRG}xM4p8|ZiD{>LCtqU9K4Nv=X!=Uyv$a%Qo}bXlL#)zRkJjFn~NO2%i$i`<}T}a1>a|N?UNU; zyh83Qhf=x(LPnH9>Co^RxwkUOMwD`jZbq!P>P!e1n66^ zx8n>I3mrGZE?cQk+;*TK%EkZx&G5)K)-6wEWVzF{?UY4EkB{R=^;kOwzs7G>{6@jT zTk2r4W_5f5N5by+r@q6;8E1wr`r)_$k@KpSn_gGNnLE0+1tzYDqUktPo?9=?WweC%uJ;GaC>g_BsH>ss3Tl)wF>K&lZH(feASlQWoe)&4 zj!|axlm)HluxYN*GlI=WF!mx+Y2&_gxc}w3MtTGf^t4@yA4hH5CH2{8^C7uum~BV#wiRr*)wG|*5Dgx~m{#R1awkyN+7{9t!q4&7u!)VJ8~^0^FZAHw*rFJ? zSDDDK-6ZZ02p~^m&Tt6t<=JxfzJLHTDEWSpB1UV+@ButQjFJj-pkF1hm+d);eH7Y z!99(Sb6@g~2A}4j$OgryEQFO5m&yhca&!crzJOBfbJXD(HY;m2GRIVI6aT=h5M0bCEGIt-B&AZmy~XF zG3<6OcEcmd+%i`Wm$}-9_*J&T&`s7Z|6j$-@VzR04#qb0CkfS8ZFPMg3;&=E1{>T;ix6_~S7yJ!V{|i25Nmc*= diff --git a/target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.class b/target/classes/de/tuDortmund/cs/rvs/pingger/korrekturHelper/KorrekturHelper.class deleted file mode 100644 index 4f07abc885f345c10d5834698e6c863a0ca062ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmbtT*>2N76g`tBb>o<}WP`Go)oCGSdq7I5gbIkokcw1QC7veEkhqQQXl7i&XTd{| zc;Ey0D8#kX#%aY1;^oeqdp+l#yZG1dA3p&+#bX0GhK-(Zbo@M$I*7xb<0(fTDre+} z{l1XSK_sO((6M|ah9kmnPhtakhUI;J$eke%`%b&NFFegKzu||z-ej1w8@mkot*9qV z%%NzZfO&=`*AK<}IOqzw!@EPlP%>w&KrHr@Zx*rNOa_d|xd{n5>| zcC@4-TZumN#b-~9v>%1aK$)SEe&t8b>-IEaqKdkK8i~(1wuW3O3+Hg2VX-fCirt9! zgk)H;8#C!*Qf~6^FgR6mY#T~ zs9M1ThK4<(>9_?GS5j{{iuL5vRuR{6)4+`r1MYlLS_Bqu;WiC7ifPuh>FaH3=<#b4 zHr5O@W}BIjTUf_k>bsUaRG(-GqNH6@qIRq^9gR0MKrZ{V2$jFgk0F=LHd8TM18ILJ z^dRbObIAjtg(McUllJ7LpX^=r)J8XxmSPoD9sMLgj&8KFWDPO}hK0^5D?ItT48j}=&kdf@f%1IRI)_22s@$Ig)H)r^56#Rhv zs3>y_=A%dvnj6i#H#2YF%8L4(m`6aFn2=;@o*Mg-v9fOFz%$OxrX?FQ?9X zoKoTYn9VrrSvVip)HCHlIHkCidHyD$Ewu&bj=a`I~wv-Eyok3t3MH4yX&zZA? zchu{?!cTR2j>j|ism|G8#CN3E%uM84;?$lIC5*6cex`5-(;J-EZx>o{(70^nN z&YYP!iD_LdU(?p)Xzn~SQGda+9ib-GPlL(2qjYy|fu}Lg$^l#?L zJ7j<3_S-tY(zzaIcxiuPUS!lKlL=Vrbbkq0GwM#8!YoYRT?h!Szj3$fF-Lwh7qS~| za=edgokrw&+XA*0m0_!oD35QEdp)%oxx&YIp)-DMquj`sa>+He7nb<002+KARj6^k z!dX>79m