From 0802f184c5a7b21cfd87e8f818e31ec7df50a0a7 Mon Sep 17 00:00:00 2001
From: Jan Waller <jwa@informatik.uni-kiel.de>
Date: Fri, 23 May 2014 16:17:15 +0200
Subject: [PATCH] Experiment for causes of overhead (SPASS-meter) + bugfixing

---
 frameworks/SPASSmeter/benchmark-causes.sh     | 164 ++++++++++++++++++
 frameworks/SPASSmeter/lib/config.xml          |   1 -
 ...ss-meter-rt-mod.jar => spass-meter-rt.jar} | Bin 1365280 -> 1365396 bytes
 ...ss-meter-rt-mod.jar => spass-meter-rt.jar} | Bin 539274 -> 539390 bytes
 4 files changed, 164 insertions(+), 1 deletion(-)
 create mode 100644 frameworks/SPASSmeter/benchmark-causes.sh
 rename frameworks/SPASSmeter/lib/linux/{spass-meter-rt-mod.jar => spass-meter-rt.jar} (99%)
 rename frameworks/SPASSmeter/lib/win/{spass-meter-rt-mod.jar => spass-meter-rt.jar} (98%)

diff --git a/frameworks/SPASSmeter/benchmark-causes.sh b/frameworks/SPASSmeter/benchmark-causes.sh
new file mode 100644
index 0000000..8301d7d
--- /dev/null
+++ b/frameworks/SPASSmeter/benchmark-causes.sh
@@ -0,0 +1,164 @@
+#!/bin/bash
+# This file is configured for linux instead of solaris!!!
+
+JAVABIN=""
+
+RSCRIPTDIR=r/
+BASEDIR=./
+RESULTSDIR="${BASEDIR}tmp/results-spassmeter/"
+
+SLEEPTIME=30           ## 30
+NUM_LOOPS=10           ## 10
+THREADS=1              ## 1
+RECURSIONDEPTH=10      ## 10
+TOTALCALLS=2000000     ## 2000000
+METHODTIME=0      ## 500000
+
+#MOREPARAMS="--quickstart"
+MOREPARAMS="--application mooBench.monitoredApplication.MonitoredClassSimple ${MOREPARAMS}"
+
+TIME=`expr ${METHODTIME} \* ${TOTALCALLS} / 1000000000 \* 4 \* ${RECURSIONDEPTH} \* ${NUM_LOOPS} + ${SLEEPTIME} \* 4 \* ${NUM_LOOPS}  \* ${RECURSIONDEPTH} + 50 \* ${TOTALCALLS} / 1000000000 \* 4 \* ${RECURSIONDEPTH} \* ${NUM_LOOPS} `
+echo "Experiment will take circa ${TIME} seconds."
+
+echo "Removing and recreating '$RESULTSDIR'"
+(rm -rf ${RESULTSDIR}) && mkdir ${RESULTSDIR}
+#mkdir ${RESULTSDIR}stat/
+
+# Clear spassmeter.log and initialize logging
+rm -f ${BASEDIR}spassmeter.log
+touch ${BASEDIR}spassmeter.log
+
+RAWFN="${RESULTSDIR}raw"
+
+JAVAARGS="-server"
+JAVAARGS="${JAVAARGS} -d64"
+JAVAARGS="${JAVAARGS} -Xms1G -Xmx4G"
+JAVAARGS="${JAVAARGS} -verbose:gc -XX:+PrintCompilation"
+#JAVAARGS="${JAVAARGS} -XX:+PrintInlining"
+#JAVAARGS="${JAVAARGS} -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation"
+#JAVAARGS="${JAVAARGS} -Djava.compiler=NONE"
+JAR="-jar MooBench.jar"
+
+JAVAARGS_NOINSTR="${JAVAARGS}"
+JAVAARGS_LTW="${JAVAARGS} -javaagent:${BASEDIR}lib/linux/spass-meter-ia.jar=xmlconfig=${BASEDIR}lib/config.xml,out=${RESULTSDIR}spassmeter.txt,tcp=localhost:6002"
+
+SERVER="-server -d64 -Xms1G -Xmx4G -classpath ${BASEDIR}lib/linux/spass-meter-ant.jar de.uni_hildesheim.sse.monitoring.runtime.recordingServer.TCPRecordingServer baseDir=. port=6002"
+
+## Write configuration
+uname -a >${RESULTSDIR}configuration.txt
+${JAVABIN}java ${JAVAARGS} -version 2>>${RESULTSDIR}configuration.txt
+echo "JAVAARGS: ${JAVAARGS}" >>${RESULTSDIR}configuration.txt
+echo "" >>${RESULTSDIR}configuration.txt
+echo "Runtime: circa ${TIME} seconds" >>${RESULTSDIR}configuration.txt
+echo "" >>${RESULTSDIR}configuration.txt
+echo "SLEEPTIME=${SLEEPTIME}" >>${RESULTSDIR}configuration.txt
+echo "NUM_LOOPS=${NUM_LOOPS}" >>${RESULTSDIR}configuration.txt
+echo "TOTALCALLS=${TOTALCALLS}" >>${RESULTSDIR}configuration.txt
+echo "METHODTIME=${METHODTIME}" >>${RESULTSDIR}configuration.txt
+echo "THREADS=${THREADS}" >>${RESULTSDIR}configuration.txt
+echo "RECURSIONDEPTH=${RECURSIONDEPTH}" >>${RESULTSDIR}configuration.txt
+sync
+
+## Execute Benchmark
+for ((i=1;i<=${NUM_LOOPS};i+=1)); do
+    j=${RECURSIONDEPTH}
+    k=0
+    echo "## Starting iteration ${i}/${NUM_LOOPS}"
+    echo "## Starting iteration ${i}/${NUM_LOOPS}" >>${BASEDIR}spassmeter.log
+
+    # No instrumentation
+    k=`expr ${k} + 1`
+    echo " # ${i}.${j}.${k} No instrumentation"
+    echo " # ${i}.${j}.${k} No instrumentation" >>${BASEDIR}spassmeter.log
+    #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 &
+    ${JAVABIN}java ${JAVAARGS_NOINSTR} ${JAR} \
+        --output-filename ${RAWFN}-${i}-${j}-${k}.csv \
+        --totalcalls ${TOTALCALLS} \
+        --methodtime ${METHODTIME} \
+        --totalthreads ${THREADS} \
+        --recursiondepth ${j} \
+        ${MOREPARAMS}
+    #kill %sar
+    [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log
+    echo >>${BASEDIR}spassmeter.log
+    echo >>${BASEDIR}spassmeter.log
+    sync
+    sleep ${SLEEPTIME}
+
+    # SPASSmeter Javassist Instrumentation
+    k=`expr ${k} + 1`
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Instrumentation"
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Instrumentation" >>${BASEDIR}spassmeter.log
+    #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 &
+    ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 &
+    ${JAVABIN}java ${JAVAARGS_LTW},mainDefault=NONE -DSpassmeterNoWriter=true ${JAR} -f \
+        --output-filename ${RAWFN}-${i}-${j}-${k}.csv \
+        --totalcalls ${TOTALCALLS} \
+        --methodtime ${METHODTIME} \
+        --totalthreads ${THREADS} \
+        --recursiondepth ${j} \
+        ${MOREPARAMS}
+    kill -9 $!
+    #kill %sar
+    [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log
+    echo >>${BASEDIR}spassmeter.log
+    echo >>${BASEDIR}spassmeter.log
+    sync
+    sleep ${SLEEPTIME}
+
+    # SPASSmeter Javassist Collecting
+    k=`expr ${k} + 1`
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Collecting"
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Collecting" >>${BASEDIR}spassmeter.log
+    #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 &
+    ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 &
+    ${JAVABIN}java ${JAVAARGS_LTW} -DSpassmeterNoWriter=true ${JAR} -f \
+        --output-filename ${RAWFN}-${i}-${j}-${k}.csv \
+        --totalcalls ${TOTALCALLS} \
+        --methodtime ${METHODTIME} \
+        --totalthreads ${THREADS} \
+        --recursiondepth ${j} \
+        ${MOREPARAMS}
+    kill -9 $!
+    #kill %sar
+    [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log
+    echo >>${BASEDIR}spassmeter.log
+    echo >>${BASEDIR}spassmeter.log
+    sync
+    sleep ${SLEEPTIME}
+
+    # SPASSmeter Javassist Writing
+    k=`expr ${k} + 1`
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Writing"
+    echo " # ${i}.${j}.${k} SPASSmeter Javassist Writing" >>${BASEDIR}spassmeter.log
+    #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 &
+    ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 &
+    ${JAVABIN}java ${JAVAARGS_LTW} -DSpassmeterNoWriter=fals ${JAR} -f \
+        --output-filename ${RAWFN}-${i}-${j}-${k}.csv \
+        --totalcalls ${TOTALCALLS} \
+        --methodtime ${METHODTIME} \
+        --totalthreads ${THREADS} \
+        --recursiondepth ${j} \
+        ${MOREPARAMS}
+    kill -9 $!
+    #kill %sar
+    [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log
+    echo >>${BASEDIR}spassmeter.log
+    echo >>${BASEDIR}spassmeter.log
+    sync
+    sleep ${SLEEPTIME}
+
+
+done
+#zip -jqr ${RESULTSDIR}stat.zip ${RESULTSDIR}stat
+#rm -rf ${RESULTSDIR}stat/
+mv ${BASEDIR}spassmeter.log ${RESULTSDIR}spassmeter.log
+[ -f ${RESULTSDIR}hotspot-1-${RECURSIONDEPTH}-1.log ] && grep "<task " ${RESULTSDIR}hotspot-*.log >${RESULTSDIR}log.log
+[ -f ${BASEDIR}errorlog.txt ] && mv ${BASEDIR}errorlog.txt ${RESULTSDIR}
+
+## Clean up raw results
+#gzip -qr ${RESULTSDIR}results.zip ${RAWFN}*
+#rm -f ${RAWFN}*
+[ -f ${BASEDIR}nohup.out ] && cp ${BASEDIR}nohup.out ${RESULTSDIR}
+[ -f ${BASEDIR}server.out ] && mv ${BASEDIR}server.out ${RESULTSDIR}
+[ -f ${BASEDIR}nohup.out ] && > ${BASEDIR}nohup.out
diff --git a/frameworks/SPASSmeter/lib/config.xml b/frameworks/SPASSmeter/lib/config.xml
index e1aeb1f..ce8dd68 100644
--- a/frameworks/SPASSmeter/lib/config.xml
+++ b/frameworks/SPASSmeter/lib/config.xml
@@ -4,7 +4,6 @@
 		<module name="MonitoredClassThreaded">
 			<behavior signature="monitoredMethod(long,int)">
 				<monitor id="monitoredMethod" />
-				<Timer id="monitoredMethodTimer" state="START_FINISH" affectAt="DEFAULT" considerThreads="false" />
 			</behavior>
 		</module>
 		<module name="MonitoredClassSimple">
diff --git a/frameworks/SPASSmeter/lib/linux/spass-meter-rt-mod.jar b/frameworks/SPASSmeter/lib/linux/spass-meter-rt.jar
similarity index 99%
rename from frameworks/SPASSmeter/lib/linux/spass-meter-rt-mod.jar
rename to frameworks/SPASSmeter/lib/linux/spass-meter-rt.jar
index 9c90361f0798d84376215f2193444ac051141bc4..57c4e1d11f799a416cf7288d83231a67f667d68e 100644
GIT binary patch
delta 4030
zcmZ3mDtOB3;D#-XWheQ{>bJXS@(cYcWoKXz5u7aGqd)zE9izzf<0l!V>#y#*>>%(@
z+*|YD-EQlnYj=2GY_84_=a{lYMe`jP6dh(Q{~)o4`BQ#Sm-YRhyUaE}Hnz6Zzi(T?
zw19P9_6c<Z70tzxr{|d5^-*1F9Xo6DqIKGfH|L!Gl5>2^GS|61PiJmUxiXRSw&y36
z^Tj;=e#T3sW$z`QF!&!~b@TGidMPfBp1<m=?k?MLM`cf3@sg*tzVQnpE|v6ZYFeH$
zw2c!HNM_~QS(dcy3yasWbcy1g6{>qP=GBV`pU6+=SSjM*V}0xLhn|Cy`g1>egi38r
z+H?QnlAO7n(fbd2G&0$~S#l*HM&Y0Ts+uWQ{X34CNV*wLxe~}yCGj&bYV9cwp0)M=
z<7Xa`>fu>9$6@83Ef05XUZOtN(X98VWe?YiB@30#KDn)wI-#Wewx8$WOM#N1EQc;H
znQkkn5p6&3aB$8E^J@t?i5wx90|i<S#kiJSY4F>wl5=_z=X%$9CC@zE7gXHY@?^o8
zHJX<s*Zpzrd{lPGqt`?x`0eI));%wmX&bz`pHu%~uE&z_?q`*5NzWXV-+tEW`IWI^
zVWY$O`_EjLE}M1PXi3Jcur0@*Tg&!dh)}qaA8_wOUUStKp%;IDTm5Ot^KlN2dcWF$
zFZf5A)vU#=zP|E-5BF_*9eGUW)&`%yZ1=6a?q)1qY<la$>Vv(C+aCW^yr<uzma+WN
z`n?W2-&gF6Z?2zs>a3xxl+({f^T}6x&sptSu)5)$m;QM<Ki5BJv;yY8;JO#<&i`e}
zhm`M?O`IVs?kh~Mi(e9#_{A-rx0c1~|F)0IZfq0(`{LcbzTC=7UawxX|0`+F+&M2%
zHDl_!{qOtU2Yu0%xNa!WJj0-C-Q<}^CtaCeb>yt(KE>m0n*Rl4o$C#IysUWKrdM7&
zD|<#{hF<Rz_rKcL{_p$6>!zi4xU?t0r;Byr-;bNx0_%lV7t1QkzSRsanzfMY@$(w4
zWS(Q02@7++-+odvo8@}@d4F%&$A*no{I5)7795tJ^-XwY1jl5Fe%`rjHcGb{3bl2)
zNQL}6;8lPAt@YRJC2cCTUl$**SLk6`rd8Rtl4Zua#Ri8?xf_?9aq(L4ASTp{b=9^1
zk8FS5TD|8qSK{hZ5fd0+R<s&QuVWKCCN%$~$^3^#-X9aBrk)j)aq_gkbjiSd!Jq3{
zCFeDQEfmirZ(|izQj$GhrX;JBn6kkkbHfLA(V8WPBGx2xPW$xK_)=!(MI~Q5ciDQI
zRJQEOHI9GSdy>136v=9b*m6~tG4LddUdxEk4fquuy5d=s>ZEC5?wZ;yU)NmtyT;P(
zl#ko8%`>hBn5Hc5^WAq<Nb~ko#T>yEclE6-R^N?jYv|Dsxaqp*rIC=$A6X^EoaDq`
zEjJYxB_4OTuV1xz?=#husHu^>yI&lUDQPjSzr5*r)S8v^7rzl)@lUjI!K>Q7E$@v>
zfAgMWj1Ui<Dt;n;x6Y>f{W)d&L0i@ACr#qG`q*AH=&SiUt`kxp<2|HKx86{9+{}N@
zbDyHTV!YTprOUk9Gbh#Qt4;W`J#1;X*D9u0ZtZ^s#Dd?3Tc}GLKbv!)r#|u5=ekX0
z@$vg*4ja_#J($$i%{2L6>&yI%RgX7S&GP=V_RaJs_vU1&{b6$mU9j3}-OA}^Pr_%{
zO<VqC*TTokv>aJu)N&-!3!_ti$}+ycf9F#%cWs<=yMOtcovWsQx*HO}7MS=)`1^f>
z&>qE!>FIM?-kklC9#p^lZuY7rA}efk9vs<~v`bC(ZCd2E=eO&x{{6UnYQpaOrwwCX
zy7c=0xVRwHG<ezaT_<bOg0|X4*2(U1i4v7D+w0dq#ZhZX{GZhsN!e$<u>8<oDwVeG
z)5<=tv#%0ADmv8)6zH6aje2Y8E@kJk(Xc%5k)D^SPUtteQ}^Ajwrvmi%CM!aJn-+X
z`ps&`z3i@rEjeg5M?Lkztope%(jo5FSCm}%Uo13xRj^Ka&K~uM3_BJ1_o+LdYxg$o
z+p<1?LEIc66Uoaj_!j-yx~F^F_KS^7B^p;h@>#7sDqA95!Mrza0iz(>8~4CGsrv^X
zY+iAodCy;sp90FqP4+cjT&i~O=#$1J(<Ltd(0h{WlkLKE`Q3q>3ii$CoQ~xy)c+Nj
zX}I*+y`wd8aV6}h-z7Ya<O!G%^!iWf^oj$eha<O0{rGq&EiU8F%~mhVpy>SyrLwFm
z!@KxDmDR`f&;7S&c71h$#PJQ+@7q6+xlzidRrscr=|%IW7w+7A0dEy%B`N6INXQzt
zoc$26t^Tk9N2SD}N(;9{qv*9SCETMPzdT#d`NTv}+Mu&WZSrN2PhJl!COt6`<u~MA
zpYW?r>Y4k|*K6i;O*mF((xz~Jo<&3R3HPk01s&g6U$*YBI&@X8>b*u^Vd<TAIrV#o
z-*{={2Oql-U2-uX{&1(!`@oamcS~*Szqp~eq3!N_$@ZTWCzeWm+vk2%=F+_)k*6Yl
zlix_Hiq-p{|J7JEBU@BUw`oC6&?27R+J72Z+UHk2m5n)B_48Mxi1ZJE^y4N=zUSNS
z^^=kcT{qjf)HFlpd0|Y0P{f%Jv0gult{mp7`>^KQSz*o{tj|7%mlyIkSv+*ejgS22
zpRCmy7JvQw-y3xe?Q^;XKML0OA9vhQ(X`x#TRXJlI}a<99Yg!W3ykd#FEF(~yujT4
z@B&Nw!wanK4==E_KfJ)+{_p}v`@;*I?GG<-wLiST-Tv?bPy53QyzLJ!@U=g@z~BDx
zf<XJj3xe$rF9>aactJS%6k2URJ!rN_nONlm2K)Z9^NhEOqn~Zag3;3h*NX^G|2SJj
zk}34!^u`_$`{_0p83m?C&k^xslDY>Gc{N8Qp6S6O2<N~{MwaP)b48LEr%wMkS7bKR
z&6jWq{^@t-iTE)^y$6YyOi!3ElEvip3Cx+cKqQjM@F$o(z2Og|)by1LM536M{DF%o
zOt)JrA~M}>v53O--i0DkOb^+oKU^uIJ$-`*6W8>63q>-ROu3Lm_OUYwP48bM62f$v
z7a}aMSR{k#D?gkgG=2MGkq{<DYq*HObdMz>F-%^r5RnZYOx)A&ED=d$n&So+(Vjka
zsYnRZT@Sd3`E=i9B7RI~eIOzWe3(?G?_DgyGyTUh5htd9p%CE>9!xyb<yMFYPJb85
zBs_ikauGkKc`>MR`AqBMkVN|8m<*<$%N7xtzIwTc!gQ^bB2r8{6HyiLP48YQ62cfX
zJ#m$Y(R86zB7ThXLF`#fXY)ZS4X1BdFTydsA(x4J`p$eN>FILYMMS0-tQN6i+E9e9
z;KOQ>IHsIZbm53nCP9e4cWXryrr%s6BE_`15>*w~^m&y`Y}5bm6cL#YR@L3c#5cWR
ztq2d($2Pc9k?Hr^nAoS=?|`VXVp8culFMHwlF7u?0~ZmW-msU6ciI{elj+%gOniJQ
z3=q)3z`$^^53a13NqRDzBRoBGgGdO|k_8Zv4;w`CnD#A)b9koD-6&GVv}P5m2><j2
ztC-lPM-+;POjp<}qA-2-CJ`y7340-`1P(F@Pq*7Iq6(6;VlqDn7nYo!zX7J@)@BhY
zrivpFIrS|fu}mvZK{)fbi?C1Mw?!n3iTf;)h~HL`FsAzRNFwp)nRuqZ+A8A5WO@}z
zSoA8B5GedjrtjD$BE@8U6G@I|yGR0)?>)FkG}Gnx5YB-eBHYt0c8G*Bt@;EPNno5c
zU2&(#Y^D=G;9^|Uf9@0sVOseQBGRx+B!#Jpar(gnB8Jl&c8PFJU$IZbYI^i;5h<ob
z4v6rDJt90Hv!$o)6;YV}9wcSWjU=VO&CEXCe~*YClP(`zIEyJ+5YFKS#gi0R`=-4j
zQcU6E5Gez3W~u2`eIg=YDc^k}QcRa5;Zl4cw}db~kcWs|*e}8likNt&Y9+WxGLw%H
zh+{lG<A6vw<AUi24v0);s;~fwnN06KC=$ao-5SI(oL*qf%raf>kcc1C3uKX_*31Hs
zw6OM|h}852Eh22wpC1yDV#>Bf(pT@w%rV{Jut*q_pd-5Q)x#o@Op9Dmh569UTz*7E
zib*B{RTamyqav|PUm~X)o)(dxUUyW)k4ZlY!g+gCB$=^tdf+jUcBVH85V3hF%xu&D
z9|MJSB19zbxJVk)^%MwaUJA3)bjf`pywmMZiYQNaKOrK=WKaN?W1IdrpIKsh!5I<W
z=^IaoI5KT0L6WO2VU`5RiA=A%EFv@At%6yI7da1ZnBI6&q@PK&8cC1&DUoa@#(E@?
zb9E3KM5cc|C1S;Rd%D4Ck!B{ZzUhhQL=>i9JuQ;Xbh97Ai8~{bz;u5ig!ABxNE*|F
z$#4$a^t`ho8BF)5Ktz6=6-j4up9bP|F<DLr(F)Uf&x^z}mCt~17R+L1pYAq;SqS2X
z-RDKDm~PC1%Sl6o&s`8vn4We)M2abS4n$6S4$Q&lE{Iq$U7iaOo;{aY7D-F>MG+|`
zvjq^jfAe8lz#;YjqKF(**g}Y${Uwn!rc;X`A>wyggl+nnOCpI(va8`DSxh-=rti8e
y62-V;y66>=IG(md5e8q^5Jz24KeuT~BKp(UT@g`WTs!^z6%lVXmn0De1_l5pWd-Q~

delta 3960
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
IFfcFx02%?96951J

diff --git a/frameworks/SPASSmeter/lib/win/spass-meter-rt-mod.jar b/frameworks/SPASSmeter/lib/win/spass-meter-rt.jar
similarity index 98%
rename from frameworks/SPASSmeter/lib/win/spass-meter-rt-mod.jar
rename to frameworks/SPASSmeter/lib/win/spass-meter-rt.jar
index a4aee236d16078d8d7853fc250546198d3b009b4..f45b55cdcb301eaa00ac899edd671199a5fec188 100644
GIT binary patch
delta 4151
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

delta 3651
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
S9-F?-io=V|;y6140|Nm4YQO{l

-- 
GitLab