From d43eb44110dd836cad0da96d1f027260c2581d89 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Sun, 11 Mar 2012 10:48:29 +0100 Subject: [PATCH] Another go at building the pagetool sprite with a script This time PHP and libGD is used so it should work on Windows as well. The image quality is much better this time and the active highlight color is read directly from the template's style.ini --- lib/tpl/dokuwiki/images/pagetools-build.php | 121 +++++++++++++++++++ lib/tpl/dokuwiki/images/pagetools-build.sh | 56 --------- lib/tpl/dokuwiki/images/pagetools-sprite.png | Bin 10389 -> 8178 bytes lib/tpl/dokuwiki/images/pagetools.xcf | Bin 14393 -> 0 bytes 4 files changed, 121 insertions(+), 56 deletions(-) create mode 100644 lib/tpl/dokuwiki/images/pagetools-build.php delete mode 100755 lib/tpl/dokuwiki/images/pagetools-build.sh delete mode 100644 lib/tpl/dokuwiki/images/pagetools.xcf diff --git a/lib/tpl/dokuwiki/images/pagetools-build.php b/lib/tpl/dokuwiki/images/pagetools-build.php new file mode 100644 index 0000000000..1b7262ad54 --- /dev/null +++ b/lib/tpl/dokuwiki/images/pagetools-build.php @@ -0,0 +1,121 @@ + + * @todo Maybe add some more error checking + */ +$GAMMA = 0.8; +$OPTIPNG = '/usr/bin/optipng'; + +// load input images +$input = glob('pagetools/*.png'); +sort($input); +$cnt = count($input); +if(!$cnt){ + die("No input images found. This script needs to be called from within the image directory!\n"); +} + +// create destination image +$DST = imagecreatetruecolor(30,$cnt*45*2); +imagesavealpha($DST, true); +$C_trans = imagecolorallocatealpha($DST, 0, 0, 0, 127); +imagefill($DST, 0, 0, $C_trans); + +// load highlight color from style.ini +$ini = parse_ini_file('../style.ini',true); +$COLOR = hex2rgb($ini['replacements']['__link__']); +$C_active = imagecolorallocate($DST, $COLOR['r'],$COLOR['g'],$COLOR['b']); + +// add all the icons to the sprite image +for($i=0; $i<$cnt; $i++){ + $base = $i*90; + + $IN = imagecreatefrompng($input[$i]); + imagesavealpha($IN, true); + imagecolorscale($IN,$GAMMA); + imagecopy($DST,$IN, 0,$base, 0,0, 30,30); + imagedestroy($IN); + + $IN = imagecreatefrompng($input[$i]); + imagesavealpha($IN, true); + imagecolorscale($IN,$GAMMA); + imagecopy($DST,$IN, 0,$base+45, 0,0, 30,30); + imagedestroy($IN); + + imagelayereffect($DST, IMG_EFFECT_OVERLAY); + imagefilledrectangle($DST, 0,$base+45, 30,$base+45+30, $C_active); + imagelayereffect($DST, IMG_EFFECT_NORMAL); +} + +// output sprite +imagepng($DST,'pagetools-sprite.png'); +imagedestroy($DST); + +// optimize if possible +if(is_executable($OPTIPNG)){ + system("$OPTIPNG -o5 'pagetools-sprite.png'"); +} + +/** + * Convert a hex color code to an rgb array + */ +function hex2rgb($hex) { + // strip hash + $hex = str_replace('#', '', $hex); + + // normalize short codes + if(strlen($hex) == 3){ + $hex = substr($hex,0,1). + substr($hex,0,1). + substr($hex,1,1). + substr($hex,1,1). + substr($hex,2,1). + substr($hex,2,1); + } + + // calc rgb + return array( + 'r' => hexdec(substr($hex, 0, 2)), + 'g' => hexdec(substr($hex, 2, 2)), + 'b' => hexdec(substr($hex, 4, 2)) + ); +} + +/** + * Scale (darken/lighten) a given image + * + * @param ressource $img The truetype GD image to work on + * @param float $scale Scale the colors by this value ( <1 darkens, >1 lightens) + */ +function imagecolorscale(&$img, $scale){ + $w = imagesx($img); + $h = imagesy($img); + + imagealphablending($img, false); + for($x = 0; $x < $w; $x++){ + for($y = 0; $y < $h; $y++){ + $rgba = imagecolorat($img, $x, $y); + $a = ($rgba >> 24) & 0xFF; + $r = ($rgba >> 16) & 0xFF; + $g = ($rgba >> 8) & 0xFF; + $b = $rgba & 0xFF; + + $r = max(min(round($r*$scale),255),0); + $g = max(min(round($g*$scale),255),0); + $b = max(min(round($b*$scale),255),0); + + $color = imagecolorallocatealpha($img, $r, $g, $b, $a); + imagesetpixel($img, $x, $y, $color); + } + } + imagealphablending($img, true); +} + diff --git a/lib/tpl/dokuwiki/images/pagetools-build.sh b/lib/tpl/dokuwiki/images/pagetools-build.sh deleted file mode 100755 index 202e222e98..0000000000 --- a/lib/tpl/dokuwiki/images/pagetools-build.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/sh -# -# This script generates a sprite from the unprocessed toolbar icons by combining them -# and overlaying a color layer for the active state -# -# The final sprite is optimized with optipng -# -# The script currently expects a Linux system with current versions of the imagemagick -# and optipng binaries in the path -# -# @author Andreas Gohr - -OUT=`dirname $0` -IN="$OUT/pagetools" - -if [ ! -d "$IN" ]; then - echo "Input folder $IN not found" - exit 1 -fi - -if [ -z "$TEMP" ]; then - TEMP="/tmp" -fi - -if [ ! -d "$TEMP" ]; then - echo "No temp directory available" - exit 1 -fi - -# add up all images twice -montage `for X in $IN/*.png; do echo -n "$X $X "; done` -background transparent -tile 1x -geometry 30x45 -gravity north $TEMP/icons.png - -# darken the image -convert $TEMP/icons.png \( +clone -fill '#cccccc' -colorize 100% \) -compose multiply -composite $TEMP/darkicons.png - -# create the mask to highlight an active icon -convert -size 30x30 xc:'#2b73b7' -gamma 0.7 $TEMP/active.png - -# create the full mask -montage `for X in $IN/*.png; do echo -n "$TEMP/active.png "; done` -background transparent -tile 1x -geometry 30x60+0+15 -gravity south $TEMP/activemask.png - -# apply mask -convert $TEMP/darkicons.png $TEMP/activemask.png \ -\( -clone 0 -alpha extract \) \ -\( -clone 0 -clone 1 -compose overlay -composite \) \ --delete 0,1 +swap -alpha off -compose copy_opacity -composite $OUT/pagetools-sprite.png - -# optimize final sprite -optipng -o5 $OUT/pagetools-sprite.png - -# remove temporary images -rm -f $TEMP/icons.png -rm -f $TEMP/darkicons.png -rm -f $TEMP/active.png -rm -f $TEMP/activemask.png - diff --git a/lib/tpl/dokuwiki/images/pagetools-sprite.png b/lib/tpl/dokuwiki/images/pagetools-sprite.png index 0e8b4a9bf8e2a39c1d460af5ad37b6e8eefa7b37..bbd7fd361b260c082e7f9c46cc3a3a3b3e7f90ef 100644 GIT binary patch literal 8178 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 literal 10389 zcmZ{K1yEc~vo;9{76Jqb5Iksb2@+fuch~@n26uN^BtY=sZUKTU?#|*6oW6!r zQL($GW~Px)Vq!q?iUnRGfW>KZk2rjvB?Ib&h2tg+%z{_l{4{fbuG=y zp&^#S27^x;MP=xWfHnDjSDlaQbjZE=rZuoWLTfMHpC+&H^dKr{tHMSs!`RU*YF}~2 z(zrM|6u)k^{ko>Kwz5zd+F%eQM$lRE-OKKd!A{G&qa6yI^pZXq8J0}Nf<7sYNzj-8 z6^E;VrAWE6?$$K8YGIp&KFq|HYbqS8fX0K>f1=@*zv5S5D&mY&poQn8uXeEiOp z1uuem6!4J2thxSB@wBY$YDTH0e)O zAfC-uqgiyv#=1hvv1$d~hthp(Gy7O5Ziwn^4mpe*fLtp53Sd)mJAE-wSuCodY|-h! zzSt#T(s85G4TkkblHIXhzF!Xs2$hZS91I9Erv43U(o|zzG2GVywXb9~;k4_dVJwr!n(@B>eXn_d6Q3|70iLiox)GnR6qoflJKzZ{X5R3&| zzP1(OyQ7t+xZh@KzBn^G9vw=ny|R$tbK}TA7k9h6(KzmE`Pvgurz2gh5!%g+%f-eftzrx85pYEt~u<`WJoRCq04qFk(d#K>)_%QgW_bBofV|lp97F;{?_G!Z=E99Y6NZS_NNU-oJZfdD1Y0O1? zxL}#`gv^TMWK~%AQ#<}X=-QgMNJpLB&0x|;h@WW2K@eiy1X$CO@Z#}J6ih*_XTH~K zm$D;UY<=K9+Z{nveMICwlSg^F)K-~ypvd)L_ic9M#a{5CEFvKuE@~x*`PZSzYg^FV zr>?&enGQVZTH|a-JP!k_K6bjI$-6{S+!ywNovFh0qh8b)UWM+qM*W6)cGDcP;ap}` zGh2Y%=4Z{0yB3>WPQ8^MmRnOVGrg27*5GO}tuTvILv{bypm99$ko}gJ3G!t6R85A6 z2p{TwHeoP&p+}4EXDSgkmt0YKD~m1gP`*HlmduKTrs(~aML`XSazrG9kx5kc(LOTy zcwS^XnO(o~6ucG6GM%pNQ8^P7jH_Rf?H7SEuZND;T(|sB*pkcI9Y?8{fPC`#3@t z{^DgIBls+SRYWlmQ(IORYtfZ5|FAhOF5_u(R9FwnuDHO$xgzY6GspF3Z zQT$aU4>XZ%H0;TEEUH3sWgS$J>_<>k!MW~JgfUE43RvCwY-BvX5?tF7RUn7km18Wz zEd`|E6}zx*E*h2sK5QCik8_;OQF-3dn(&eVSf~n~(nsujh z84lRgS%O9tG!M+I?cO$ouD~tcj_T%7J9&9~kJu^TK+v{YxTrFRK03LN(Cw>?$ zP#hw&!ZB|=!0^ZuKWRZ4;{W|w9^&O*GWf#SM^vG<{`G8bMXGRF!tQ`I6>=OAGiTXT zpn}_HDm0Bj-RJB@(Pli@pBZFIzt)#i z#KEPkzo-~O?ld6GHH7nWrR0XF!njw-rJ}y&eF&o@=b#@B`$u%42vjBsD-HeqF_^4o z^r?vzFGP`7!ZGODE@2=f-(SzOs9=XixQB{$jOv9V2rZE)p7JKA>+#L52&m8#BfNYGrs4V6c9~TyYBb@+vsA1>{Zp9q zG=`M{qEvdDM>@1FN6pwSw=THuT?sA@XKoUpvh<+&c~U7uB3-rmHb>r3ygSlUy3N*C z%5eFGvdv8IAGsjQoU zhXMypIz*Fh8p)Ss+dNrr+gND>q3)TzKXZ>*pvSFCZNR)8IqfqW7C>zO`Mv>89MAO* zEChrn%MVmNS0bFB!A4pf8JG>!sQStH8h}kGjV4Z1_3DI^SU3xKAwMS8ZD}Y=V5gU# zmgku^i2JRoJCscN*UyC#D3d~t!k489t? zO|F!+qO$nzgpEXQL~Acif%fg_*Fl=st_Z~Wx0(W6w^D;s_RM$A%^>Y~NEB9_buj7& zSgrDMG~de$))0d}JBBZOv`2|k8SH65?+sm%f7GkNSqwLLBTEZJD2tF?Kk~Sq)ixlx z^<3C>blVm}d>4_O8t^P6ncA(C%!cIR8Iph-2ZJGM07l~Fq+u4q{8c6u2H-8q=89z< zQWFMwz0jh=D;;)W}|Opc@4u1cIXsz@qzUuuqtsIdOOt3 z+zXy~cuEmCmq*;)Sz?QS`eMUcCq%Bipf@#~a9m0us`fbrtJ{wTbp*W)@mxK(d)}p4|6@6H_v8{g$~lsDRCa0KNev}I0om;&GnAhE|2PT=<)h2 zC4-Aw?yQ4kjQcF{BYHlIW|k};1-`T}#yY7TN+ zl!UcZGh216&dCpSu@`~@77^vwL4&Fu6#`>00lH7w;9&~Zk zsb)v&x+*%`ggfFuVUgumZQy|lL`t`5`nxN1c|nv9NH43)*SNh~$G2b$J=XbuGV4wN z4PnkR)}O&{Or8pq=h1F52NBSO|M_4{)N|vV^XcAVOq(2MO3ACSMpk#7N+*vV6R;go zyX)LgHDfXD_wTF`qxF;J)Xfr z_`+g}!cXS0+7Ctfr&F@lpy1Tp*|8CV^=NI6y&q=;KM4GlygO~mWxj(F&$`dbb*R>k zKicZqTD5p&C34K%52o94CgS&Q92-WrN4oR#TXc&S%a^6pY0=t()_NAzB3jogb8i)l zPtojpL@NyLR=>6~&Fu=62==2GAt>Sw^fCAb6ezXR6H(x36ioYOF+h&5KmR& znRDQGXt#)i1%?<+0r{i*YsHnxtUceARoys5`FV3>NxhoCO@>x{XWutOM&(dLx#Fkf zNiM%74ScI*LQcLr2;V92NDcaYuS`l)&e-EzF(>*?J-uREw0*49(`>i8%O{3B3YAga z!^xM#-dXA{dBG^%OJiF72HW^;ZrBNY`y|c21QxFS*@NDDOU|4h*6wK}Zy|TR<-v?W zxzvYW{TNGw9|U|*+Qu(CSMT55TVD{9_9x*p4`Z7yLuC@DXce9oBM#R} z!ToJ9PV?PywSjF70PL}^pDgOQow&vM)97o;DnTYEhits z&U#0QQqA%ekck1r75|QX-8be4+lV1S`c`d={PR^L3ttVA8W7cqB03eG-j> z#LLCv(>Hv*{IwEe#+ad$ew{PMG5UjHC2da=q(d@jXXFqFaR6;8j7%A2+-;bq?SR8fe+7^?cCZ8!X|}JhD*{G4OAX2y7n#mh1U8uhqyFjk%Qp|L#A-j5|IyqPMMs$tE{2=K^t{c_qp*KEzBUPlNcAvhRU-`0c25BCz zX~r>{bsLgAM8dYj8{Oa6Cnq8*u?FGP6^P5ilq>^i-NTwKroHg2iNgf($|jJuDMP+} zUY|63pEHWcwK9j5#GrQXTNB~S?cgFf7fxHnp1!%__}@KI-e23r7xbp3z4%Npv4i&> zIPyKQ8j6DGM|H0(D7Hc?I})gOYd7a(FJle|H*#TEMv9=^yO(Cx%p)OFknWdAwp_^u z^{FWMNtcoqFn} zq(_CXv{JTB8~4rr=_W*`YCHd3@ZOF6?!t<{1;20(?QSnOM-0PJ#giM|@s5AYT;HD4 z-Zt#V5(A#I-io$^0#@C0vuOiWxE(|fIXL)x3= zA{Qz!9(Nt1G%Q2E*cEqPP0HAj-`Cir{bMY*oX$c$atA4{ll;eCtx3p2^oZIG5E zSb{@ssofQj==w%v@HDom`x~D9XwQphMYpxT2Tr3<-~5F*(q>cZiJ{GBM#<+2OGj6X z$jX&>Wmr-%>1@d|mCvC00%}R-(o>*D*|uc@#HFR6|>&Qj?8V&&k^&+W)oT;4*2f5+0Pq zQPHf?;O?~)wyIfeRpmnV-G=ulDAfyGtM{SZa&Iz|^AW#h>gqyTLiKVEp z>C=Q_`+#BSJV7vueW|{$6C(}}q5PyT2>N#oLoRE@S5Ny0WS=8YE9KQsfGSCiAM-U# zmmnHt(|aNaKa+AYYHBv$%1G{-T2X5YO`l8yUzuhr8gPLdyrAv1_6f%T@lTGgYWVdY z(4M75zkaNgsiyc&AecY67w2V1WJPqb`I-z!)t(ukXp-_nedi0<8W?jc;=^F_#VkuB z#_ywv!%a=@WwPYQ1OO>lKc2Y3e8I>RjzeYcGJZt29{?kp?0h=H%!)FSLX17*5Srd z2F}xVD=@cgarGhOkJt|}(X^RER_f$&71leFeKNQMgwFo;-3|bx1~<{5uA7mo)c*XAGfGb&wa4|5^mL^#S7`h zn;NMcMiF0$4pVM`&|-kFw|JGP-zh6{?(RrbPhL&iBe^~>?x|vzq;4#TR*Ux(9klyJ zH3|pUMmQ@Wjh64BAHIrqi@iy~&YY~|{lqIQ`n-3p46RGU; zk4J+gN0{F~EBc8*)&#d_DKN*uzjuQWhgc5;!HoM&K8j>~EZ^N8ZcF?^Jqe`-0p~e$ zFDs9d`PhQN02&v!bTR3^42*P7_%{N6rT=dp54N*E8P8snK+E}X-d{Vjc3~(ztME*# z(J^_cgrq+40o_f?Ff$-E(82jwnQqSLF;A6aRgG62qud&tt;?Sro8gfaLt-91oUk(b z_Ez@i*%mRFF3l`FJT}adza;AALEFA)v3+KU+K>3=24E+60#g z=N=_}*a!`E7K|nRNcNr7l;g%ME50vrK9i?Uj!oEP-oS_xVq6ntwIbosmY zavPI*5k38lqeJ=+j?jJ(s;P`ATfMh$KY1@WQIJRvL6A9kH|UHh;g?HOs$(5 z0tHo%ix9`Xd(@tL-lO?2S=`>E5|-&E#39Z1fI4vSHV2ui=e;gQgnipzKROV>zVR4b zr?Ho*HnzU5jkv|<@=}Vfr%yzA{<7tE?NV8fDE_DSXy%7pw|g61q%pTGefNXJ0}d85 z#u1!o4>umliUY3Po=bV4<}DcTzG#I9hIzaGCL(n>0TgDC{w`X`LU%9D`gifbW7T?m zPn}*X=dar?UUj#DWGO7V^}ajtO&v|i%^atf_r0Qiv6!Lsd%{Pa7K~zJv!yk*vl@_# z$N=f*5rEbvW@{6U3*hQIr5^R~-=6174!o``4zQ+Xn{bDlsUz6p#&iH;eWt3BW>XCg zN)v;z6o{9y+B?JTlt=SFRyq?2=Wmqd#D`wpP3T~u)sL<6!e-|usk(;H052u3pCoCk zy2WmYSONVPlW$yf{*si^?2}^ryhcF_KtM=3ksSd5(W`3%!OWHYu*Y- zAoCRId3o=b0;>z_-d!AIoF73GEXxlL#FD3E$%bAiW!iuc4`3r#%bRD(3uTDF z9@x5-i%wtdqxp!@9S$;yZEIYNtIiOY2GmoKBCGk}h39)>0JwU7O1yfH8~=M6v$6lD zhA{@%oQFt)UEZ>nbN$1TLC8URqAL4kRioLJJdVV8Owk_KZrt|1h1`S~SY7D%llK53 z8S~yD!z|}Ru1O-%UAK__i~pu0t~pTUNaXJoW#^Iv8+X4fSH`r?%nQAMw&q%ZYxgOAxc1RGT`8Aq95d89$YCV7+flk zaM(w#+AQQTtPPIl>yYs7KjD@PDc>t4^aD45F!>5RiOq5p9OaS8&Pl-HyB*7 zzAJ`=8=Cdmx64=N4WF!Fecu+NUxvnWthf*r$A`(UJYq!%;eIa9bKgY_$VcUBOqpq2 zP26b{EwTrO+B!L?O)AE`X4?u3p>9)h2m%sVzmxq*wUm!aY8>_*LMh0s?!-HjvPQj-fEtXkzvWqCc$ClE}5D`p-LJOM>7`yne*mTich z`zxPvq31Z1x67pi7-hHm zQ)gwW>&LugJN^a#sV>1&5f@m(zcaN7R3*tMdn})N&S45$EwxPHe^Kr2bia@^a)j5B z<};a)lFf`M>3_v4X}y)D1Cn@kVJ;ri4%;@AglN7 zS|OHr=+a_XoputLqsj*7V2st|zpHXTBG2SR&=<~5x(=EihXdOFTc2#V{+85V#v@d1 zQ3GGEj*^KR^VvBu2;V1&j&oX)SwQpUm++8SOcNZV4+$P#gk6wySjpb-QS`MZ{&=Bx zj8!ljiyY&#Z=@|+N(9zu!tkZxEVAp$OvOq7f@Fn;ISqR)iYI$*xEu1Bp|fby^Yor2 z2r24z8chtcG^e6x!qv=6>i(zJ(u4R7j^~c@dzAz9vhRT+iC=ZadkJKsdsgwBFP#Z= zJ+XAjbekgV7QdHz zwzJzyDp7y%v7;r2NHm+xx|6fQ)wAPOc$xH;EO1Ut~Hav@heWX#a zKmX%YDMY*U9JRSHR3IBFJ5I0mY^ZO=S~a#`+159x(aR*ssXu*j0z1e2 zMt-QUE@eF{6n`7q?a`oux;L;-GnYdKCREorx(*%OI&IBIJqlX+ZLu)Tq)c`&x>O&@ z&|HoM3;#en?o&Lu%U7{+P^Xp2K>U6{Ls!DkAuP?))xqhJ}rQhI!j{(%2d3|sQ9H%7&iPF^;>eSw1+2DlSO9=Uox@4NFRO=)OUpE#*g2yt`_>RR;AYbE3s>h>>$U; zt*P`ci!$dy-W9`mT*Ezw;-O`v|7H(@TND1)zC>r7|0X!$fMkMPU5BFEE&dN2F(qbh zW|}wtu!~7)c+B2gdxMchq+9c=YJKzeq^Y4CI%tzEa0^Sc54`wZMl@X7y6nux_Civ9 z9cuH>cY9fmHN6~4+U{ZSxgUydNY^;MoG%%{+xpb_-alt^YG49n_Y-&o%-4y$tlLw5 zP;jpA2Orz?4bt*dZ!C-k~p!X0DXk{2; z9j9eJf;XjTW-DjFIQisi=3=@cQ+#Z#hbf__zxrbc-melLP^X8qri+8#n zJ?J1C+&3wqf^UzkQW?+%6G(lDAGX617C)>t{YUT7h)fNy-goCmV!fp*{C5rP(sL{> zE`AZy_w)ApWc^VdB%|7SXY>iuV_?seI>edDf8)^R2%}ZZK&Qg4d>4W3*bogrc@g3; z0w5FeW{(;+GIuyHFc~y}?597|VAj)k#UfFo0HRA+z#qX6?H5hLl8pWN>2Q(bkWoEu z)m@aRgr@yR%LtOTT4B3QykDO#IGD%LE_IPUm|+|eARVKGLrlR**zRa&AT5_ z39OiQ_*I$2;VG7NhsG?$E%!O5)#yT7e{T=yvV@kouE!~9=k^4nz?<5y0FU=pFN4kj zGiYc#A;+2MJ^}5OAdmO=U$n;t$8c6X4P#6aGElUViIjb3!=Oh$%AS{w?-NHi`b-)Tdv>v+tYn!3`4StONQ5JDY>*AYEe>(0VOL@a9%|y z;DQMgYNSE;H?BGdB!R+RWEBIJc~d9g647UHob-HuKW7f&7-(hGKVgBF#zX&+$D>Sk z_UPc)i*Wf4E~fa{TN?CNGBo>yPx|33t@jS(**HDgTS*0zjxZzMMJn}nPMS0+~0poFTmak(J1zq9Q@XuBH$V8XNHmXM4VE3Hy|&+1v9I{<|6HOx4udDrIkXNqy3e zeG?a4lV6qdwgKj?=;|(7Gu6wbHYEb^r>X$D5f=x`0}8o2$N;yiG5idk8dzFO7!=TGo))XHMep-*%2rKhcx<{3L5 z+A?+c4k+QEr<3R4pB0>fSOv1dwhBYW_nI7}ZUag(FB2WNM zS<9A(z8r~vb!ExZ#^1Uacu<|&J_ z)P%>XrbFI18d1$CBUmS6Mp4`lpZE1*bJ9<)^vB>g6muuGrqB+4&UcDjo^1LDaXNwK zwa&76MGBQgcDaocCOIVpWpnap)28O`zWkP{YJ=(rKWnB7)X1c$s$^IkC$EeqQlvJG zxVMU3yF5%zb5}a0*XUo*CRXsO(jn9QjJl;wcFlOi_qBx|*z&Mwp8J5dIp+&c4=nl6 zU1ahM#$GQN7#w{1*CnC6(R;!YF2H)*L5^=ue_aDb6T{sqGJV~ZmER!*s!O*%p=rL7 zyY4>75p?kQ%qQ=56mnc!1tX_{9&xR<>~*lJ35Yml5t)OMnDfWXD?Mq=>Cwr?W3R%{ zg*zXRgQFXx+v|moyDU98xzt6GGvF4f!JtTTBF0@i*#(#L-uE@xv9Nf$AXg|OYDf(!n*R%WN>Be>39v{9t z;Z~Ecmw(jCw>EG8DW|d9X0Gs_U%<(;Y%`@*VA@ol2DZCb`sZcGSYW4<~4LMh7$yKRyKAfRt_dMRv2M+@)8!s!XMYh<| g{~2IyYh-TX{{J69^mJ$N=OCf9xB{S5^vl=(0W%s@(f|Me diff --git a/lib/tpl/dokuwiki/images/pagetools.xcf b/lib/tpl/dokuwiki/images/pagetools.xcf deleted file mode 100644 index 034b39a42dd5a378969a4a4b59aa8ed100d6ef1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14393 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