From aece9aaa58bed5864fde2e7a84976e0afaf5288f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 3 Sep 2016 14:01:51 +0200 Subject: [PATCH] - added xBRZ texture scaler after clearing the licensing conditions. A screenshot of the confirmation that this is ok has been added to the 'licenses' folder. --- docs/licenses/xBRZ.jpg | Bin 0 -> 60099 bytes src/CMakeLists.txt | 6 +++- src/gl/data/gl_vertexbuffer.h | 10 ++++++ src/gl/scene/gl_scene.cpp | 2 -- src/gl/shaders/gl_shader.h | 3 +- src/gl/textures/gl_hqresize.cpp | 62 +++++++++++++++++++++++++++++--- wadsrc/static/menudef.z | 6 ++++ 7 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 docs/licenses/xBRZ.jpg diff --git a/docs/licenses/xBRZ.jpg b/docs/licenses/xBRZ.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab8335391b0e35541662e9664ad53c31aaed0c51 GIT binary patch literal 60099 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 z zRz+E$-olatg1@((P`7yU)wJ)I-MZ(x%Y};Pyz950_v^JuwsPXKqui~Z`_F31-uP61 z_`{;*ItpKX_Z?p9=eH<7C2rOC^31fZPpf~XHf?S&nE9@D)zOeEx=(jEL@(Alu6SgP zzjbxvyX=nln)hF&+%UPe?xNC}jX#g*N#q?=wtReF^wNF)8`i+g=#65mDZ&`z`v+|P8 zT#ae&f^C`K5+%MIzkX}M&P$gby}2XFwb5`+^6wu1*I~-$X$2_}VX|{tlOpVD3oMRC zEU@Vb*_Xb59{22TTc&up1m*;+ncEjpJU==7$v&os3)(o-OPK4YZ(%*}Gfnx+3jMe5 z_17-hTJiRpC7;dNClie4@7})7_GR*xom+O#^G@xGcz(-c;;E?$$t&0`7c!cBKXflN zGWS`;%_h#epq;kX&u=dcZTjF?xbkG7vc#f^1x9{GiyLguI_gcdKB;JU+vBXolo)Gy z13kyv-)lEsTe|a7$`12WakkTWCMjB4q#kD}m#Mn2fBgaO4RLF(^D-aSF>1Xh=2Nt9 zL6d99q*obRPfkplS0bRD)6>H|`5dRHZSVRCPiGxFcX!+4686de8T$G(C*8igY^mzi zT?ZaM5`5&z^`ObGB6!{wMjffCdp(ynm3=T3IJSjbR z%zbNed~~-pcZI?Zw=2oD7aPCN*l4}u%aebhn{#t?*96_<=a^mm`n|h@w%(fF)Nk9i z%~i0tbv*y<XFkUJB`e;$C;klM+{7P%O7UadbIiC2k z_>H-_@Ez~Mr*4;`e=@ioZLh0jzP?obiog&3J-f3#zIoexa$3LDa85$XBoEozmu{=M zm#|4Zo%-zVHd6+J+ut`&VmN+nm8@FOwauQqYu?K!iT4G0O|TLunjQ_cDZDds4BbdwTCp*ZTaH5xDO%?OLbM`GQZ! zBt;(Vj44g>kY69Qx^%^sL+7GP=GI^8$(M6TJ76hW`0J8H{pPq+VLP@)CU5@~t2R9$ z!FuKK^;^yTw#<5T?N*K!W69?U#i!;xmZ`q{`foYw_OCatZrSa&PIjgOp8A+H^x_fn|Q}D-(=O#pKcf2 z_$*H{Zw>3ZRgjynyJuVe<~2T(gckJeWMMv6yGrzunupHCY21w*xgSn>IQd)3$j!AB zxiL}Y`~Hl{zLVG{3VC*In#a%ZMDUHPyXs?SnY63#RL_3wyympDKW4>whQi}sB~d9K zqi?o;a=v};k_gM&gX#^1H{`tvFRKd*t(BaZ&wHxLk3)T-#pC7|8UOYx{M&EzB>cp8 z-Mo({MVjo5`TJ%b5AZd)>t4Ln_QdDp-oWW8`RQ9VJxp?gM z2{)O^2P~N9xn`Zsooo3v>A)E`)ANqUSk*U_YA;)~La|LlFHhpYrYE`Q?#+49mwDmU zMy~`rpOZ4r1y3EwO@4Xs#2;7HwLKf|9@RDy^$u-$Fy|fn&k%#m$;T6yA2=)bIOncwR;L9s-p-u#_^i2V|BS#MB8ZBYx?*=S?XQ`YfTpD1B?d`q@i$=I}8{K3m`$r{+3! z!8{AeKO41KZ_jx=N2ag((aikhlI>z?$$Y0>Qh8dQeljpJJTCWa<&Ef=xR*}11yy(Z z9GzdN-|*xCPx6Y_vsf=&>-*wc@X?iJ-Nt>#C**SR*DbeSs#1O^bEaZbq+ooqmsuIGaJ#DPj*XUhz)(EjPqRdFNnXpW#N91|yOfpQ$@Cc+ zM^1ZZzj^JGIrooU+7rL$bK||^7xFCPDkVhguHEy0WAXMz?u6Sdhs&%B&$_F&tY02^ zyUq85P0n$3_B`XRbxXcz`BxUQSS^`&;^^WXu0Ed|%AW9iymPJler1wrb!N+@NkZ~d zHXaZDzOnzC`^% z>U_P2sVO~wmhk`Jc>ZB^`G&1Wr+iq*xTJTA@MV>x$v2zstjt{T@7X=e2Xj>_wky^y zKckTHpsDiLqouxHoQhi~GEXeI9gvVx;CcSCC{xs(ysg!TSpsgZs|(lN@%EUfLIT(N zrP1wI)uw5(Oe>i7iRj~#=kl2!eFm#{q%Zm=$-MH>-1^*7+q=7uZ8*tdZ$Ism=;?1ZnlA(I-8f&f;iQh) zArJY2-Wj_rlv!j}9DkC@Gxcjm5NArovhdDBHZHse=FRy|K9s z@n^2GqF!%vFH07AJ4CvbndCXZt{*E19wTrT~|%E?CkQ;OBCGP zUE2D1V%L}FmJHv&t+vYD9QpFY?cHoCF+x^pE2cy(>eA#Hhz7Nm<~qgg0hiCpc=<7w zaT))(vUT?AlTU3Y|Genj*?(T+RR6?XpX}!{#I8S6N5d0M~wN)~6T}b7_ zOWE^hMHdCeaGYmm`J#MnX!ps<6BbM` z^0Tzn7UDjc(#P7AtnxDL>GiV5&v^H`uaDa*vQ}jG;_bVqMf6YnEa{!tGv~p)w!Q@= zJg=5I8?g3?2w(XfAnQGahns;j<`d(8hOc4TTHQA$d8T}NxaZc=rFq734l461ZT}Yf z?frXgVcBct#U_R+?KWzUWE$UCfBTccoYl2(`G#rMt$ksW?$;?zu1s=cE4b@#`TUR8 z^4Z$aOQsv`39MYC8C@B}$|5}PW}UHvbjY<-*E?@SswQ`xXnS+ygU#isjgvy%${zkp z-2AHW!dH{;MgOEbpOl?;l}vwC)mOKLajk38&+{@xo|(#Lxx6-~kM!nr%Hh0ra)uO`5@4KeS z8$Dc`JgHnGdFp17HRcS5^Uof%k=y&~j!w#|c<1Dz_cwRs9V?ty=(omx%bDDTQ?!ba%?+Gd*5R0!4;ftEvMYCazreCU#Mm7B5qm#)6@ZvyB#< zHekMUx#q?G=Zos^J2j{*TKsv@e};LT{~2nzY^WzHb4t={&V!zUf_key?ufOgB@T<_ zt$BCO|B}!=PiT`}j{{2D+p}@eO7=rxD3eEQ~%@*vTe+FCOf4@ZFMlg7~x?>R)a+x$mkMl-3<0Q7)kG@B0^%oeS90dafo`XXVwM(@XsPpW*qmkGrog zkD717@aE#Iyo|F9)+TAQXBj*2ot0entmgvrX1C0)B70%)Sqx^_n{f`n=_s_~b^4XX7?#X$j6>AqxWb!(-VB+Kh7SDFYT%46; zuylu*Z!M>>Cx@Zv{es77?>O~OGIuqd%hbDdO?=11Mdm@vl6EFf<(^>PBgTAhm(Rsn z3@5|pnwo7e@(Nrcyn33t;Nz+1e;?qflDdA@QFKediBAei@2}20Ex+L8gK9ploC^%g z`;T0DHhHP!0-m#`dAwI2t8C<`yK>W6Ql~=x=x*juYi?J*Gt4#GY8kkSE4g?nL%_A}j@+KCHUAkh`x*NfEx#W87dq2qyXLp!iU~8H z_n+%c(GoK-++87g@ZF8aAJ%o7q%{}>J<5)D*=x>ix+i$f8sja8lX((0N~)OKd=Z&^ zvYxTTQzg59!%VJs>U{BY_^MJGzpVXpaTde#Ns-rXWq0T;o}|H3B+~VExsCj6m4<@w z?OVNbi%U%pw0X*kxtTkjmrgo(=wHR-OWTdzGMM$9=SrOAnEjStBIxp(w_0|^uj+!2 zYuT<2>_1gEC9V0yQ3kzi@t~PG`D(kGKHZ2hagfe*dsdUqSm4O={KBXc% zfh$9y(A#@YZ_jx$Z(0BAPt0tWo*OH6z4O#N`*`u8G~M5Ok6SuS{~QGMvj!+SZ#`SZH#@ z_R!3f%KJ|x6X!gC`ueu$#RC^-2pszT_?FqWzc=OM{xd|CWt?S@{MmmYq`dtvU;VFV z_fIW(Kg-zjRofPWc43?FZcdcM2$ z>fTSKnq%MU5_@7zo^s^Diyuer}@5zk`}eGk za}WG2D*hQ_F8p@;&flU}HaRJ!<8*nX@Bcb+)EHRI)Fm1`LN`ZTQNTH{z`1lBXr6(uT!unZ|Be z-r^={lfgM+L{Np#Q#`0xIoMNJtTOFTl9*S&v{#c%tc;raa6!FOw~ z{AZ~CCDqgb7McFqecpeD&!@jG>SD0@{-0r9{93u{{|x8#uXSlKe7^s$vTjS|`~M6! z`=c}#FrTmg`SjPt=llPB`kS$6XzG6scK>I%`{zUae;)4tdWiq+VgCOI@&A7YXaI~F zQ2%qVgu&2FhLmI@PKBh)O>TC<#~*234Q>8g|A*y2gJIYTChqmS=D)9Z4hZ=kUuu8v zU)zEO9HP&sKkE$7&*>_=z5m_upYk79zM0{kAiGN|2G@0ET;|mNvp4QySiJ51?~VW5|76@Q|9j&rgI%@i!&c_mr$gpwn6&HrabH1E9-OSWygpAXP6Ls{P)zOX$|J}4^^lCtG)d1mr4C0Z~Z^N zm;e2e&22I&F&ZSJiD5Jw47!rRilfHktk#+hS}ScPRE7Q8kji5vIO~CN>>K%y@8y3l z{u#jXp?>{;hKBji2-Q67k@>&5epcMy-h0>Bw~y`f#KqgqZv6g{xOInZVCNDz;8?cGt4Xc&v1X+e+Djw1W%z%#^y7TG6qR*?9A)y3}5>8-Mw<8 zETMDm?THuO9sKL+jiSNs%Kp#i;(vd;|ImTcbl2HZX-}y=Sv__Me0*;9YgIN%EbV>N zUZl0@O$<-E+z#25_p{=EKG*;IJO9Jtx8DC5Y@YsS*q{4PgfTYfslbUA-eY%@*=^G2 z*-zD(=xaX9N3~pwVU6QCiOKht{|@@kaNe^1{q6czdAJ!1IF@cNGiMD*y~{Pv@|Z@S zX4s1)qm6B8)?HJd@A`iJKSSJ7?E1JxLhEsbz(&__?3y@V+y9Gu`b+=oYJ0c~R-NLU z`b1&f8wUP3`@bcO(V&Ve^!)F(9doYduKv$(LhJe8!!d3djBol@tUGZq-a4XBTDH)6 z@$v0dM(?Dj7aVh6vHJRPDYKdX8FK5tXl?p-(M0gftIHB=ra4Mm3;4aMdct^}S%k57 zmT}ay3%6{$?|IAaVm9be-m+UH*(Ueo$?wZ6%>-}nxp+h`+1$xAJw1N1iHIOS2<#J?&La4Z$7r$S(3%;=ks~ea`U4Y&YZP!shFM9 zapG>lVYV&L<&ecUadLe>2{ce;)aB?QUJGN8G226n1hyU-(p-A=T5q{O9B4TNBe7WM{p9@SmZ-;y=S( z`BQs-o4zopKfb5_UH?-D;e-G7|6{73u{t!2|LcE-55j+rMlImb+xMz|?_XX=q>eb3 z#-av7So5{~C$63U849lR&U#nc|C8m;e})~|t!Eh`yMDcsI8qqvFU8ljNr3&KPxQ=d zE~WDvUKp&Ac-_DpZ&QDV{EoM7pHXo0^{lM8nB$zSda4n9MO{xc&&O%;T%5%)NporA_ruD^ z9{-rwVVd?jXjbKdnQ5G0u>m(iyCBS z8Do%NH0&SWv;Xe?X}$G&m*#)AkN-22)N3)!gQvw+8{m~WgJbFU;J@!*WO2=V{cid1 z`xmZ=Fa-Kae49P5%j7aDq)D^CrRTQG4}^FP72+W%_V|Ng1}xH{cf{Lgec7oo(tKPiLu2{H0jH`K#&ztNai5 zE$e@Nk^lbjKf|$pWX`(1cQ<(?S9eT3a5CtD;IXP&P2V%jYcBRruD>T=e*NWp2a)=R za+mf$zfgbw_%D3BA&h1HwMo{iD?_#vA9=+Q6ncT|7~+@AF})&7L}0 zD+-RzU|4?t^OEY-6^|n0DyEtJUKhhq*Vb*YO9PMHHD?yiFFqz1Vrc!7d7j4`i`Txt zW4BLH{p}JL`M~aD^N)*Z;;#D0$pt0tY)PJ|>hN*bF1eoN3YS;%oIwpCv;fQY>tZ0J zV&&c^Yi%}0-Cnayz34Kgzel|NP?r{o_BwV|Qdu zSjygr_d)j)6&vpSeCT+EWs z%2|46N8*XEa#t>w=CP!l7gMot-cxhmKT7A&i^cyLIKEB&&tTX5@1OmTizvKnjnfR) z9CNwV&Qs2#`F+`0`>86L+wHR7o~tVG|FY;{Ng#f^-K*Z;+>w8*?D?Fk%TllIa0SIjSUpjW)8uSQF{&w*f0%rnz*5GYjr+xbx41 z(Hp6dMoF|Mi&-XZ2|O!(Vt=J*qw*_F)~B1T7u|7*WYk%BP`huZ2yUGQufmF>xf=_m zjzs4@Pq6&*Z>#p5gEHC5XQdYZy_Uuxzic&AKF%Uzt+UN$zlTZwsuIgSJug(gEw`t1 z(Z3Io(I(5xCp373vd^iSclcfdzTz^?`@-~s+Z}g%+F3U^t!MfAuHt2|-={_WYKqFj z{WG^UzVo*~)u4e~!kQp+Ock!kc|87f5|EBin-}rm^8|zN0_*Cp3%KqhM>|Ryi2hx= z|F-M$S^ElOZ=C=6e6OAK4E4KD&dbcMdXrH2GXPIBVVSR=q<&4uE%W|UMv|cinb{>) z>uW^toZ#saFW@|xzmy>WZ;_GZyuwp_#^l?rQ$r&|RqjX^9*{h6+*Ij)l4MlG3~%9_ zjK`;+JXV$|XTQ~;jVJdT?49J18zm9CWJm1n$P-+Klh5&Qcp3IxQ0^rI3(p32iv>LI zafaNo{=o3AN*<#|;WweT%FP+RyuH5vahPt}Z`U=!Z*M-|{H{LoMsI;2 zqqLXVzQ>K%m1X2=|7}%Wd-|;MaT6s?(a;UjWg-8V=kYS&Z#fWC5fZK{X`&+Q40J#( zbk%D1Kh?+oz4#ZxXe0mnKf?p{pIuu+6aF*A|7T#dKNGr&p$Xa`7qz{9*Z=$eg)20e zvV;G1^8fDsv#M=1OSpL1OCz^aO2xkq7}!<({IfYc*Z-G}{X71r0r#R#+FU#-vZ7UV zN}JQolfgIJECU@x(l&2xy|}3BhS5nrF0JP8mp^{}b3E$Oo>?v#iXCq==jZ)N&p4>k zU#GSHhThD{XLk3jNJ(Q-W8F5@_D;{Ay@g@x*8aP&BJ|Hr<=huP&hh)X7dATxZrOB0 zrN2-)#&s%3f%%g;36Gg&HIE0lPEdB$U|6;LV@vWyf7?n~Bg@x;Tjy+QO5b_s=*5Q6 zLk!Dp^!(MYo7^-xQhm9=X8z1(vlq^G?u+G`8*eqJP7e6=^hWOTr(KIDFr+ce;VZuJ zxhGiR%FH!ypHx>$Wd_$zmosj#w3#=j@8`3HvD$xi(=!96PT2Qe`?+(R-~nbGfut0^Y|nC&rt5@&ZG`+lh1do zPkmHz3`l9SJG|lR>JP^hTb1KF7#=YG;?r7xBQnWR=3q)+*wlz+?q~cQCBNiHF)w($ zQc*CcDZP@Lp^MEixQWk?{kdTu-`c@qO;)tU+$*|)K;_tVB{EA8s&iAAat<=JYV?DV~H!`-^#^~5|#XZe)-yX6hC`~IT!3Uns)B#<7ooD zB6Z$MKUTJrV5B?&#(JvvGCmfoKQ9S#WJk)QIs=kb28ODNV`9zXdk z&2;WbC!fq6uKcHVa2<`9wD{7TZJRwyHgB;Oxx>jNWW?Z;^5C)Maj%Q0I&bWqrMR*4 zVdK>6nMT&hH#RD*39f+zryMwFmhPT5wLQ=mMU%5^Xh(`R~_1FW{0-oBK6?ixo?7?&hLxW!v60?|&JpWAb{&tgEV##ksqA zV$F(QHtu+SUvw){GALne%}%b+TXQc$wr1@k=e=d0IHW@g*dOqly!N)dJN&$>O{X|2{lsk^Rr` zw(xZjYQkYin`>9OVCua}rCDL0&3KoF^zS}re2l#+`*y5{RBpfY&(nHWw4&cJ6wc}6 zU%xa9Rdc+x@wbdK*^*1P^)alKJiT+`4WXUqPk(y6uJX9VS+hsi9_7zIHC4>RC08U@ zPMqbdik#&u%WrGrksQ5vZu@4pnho=}uVJ3?j9X>Se}>{eb@3;zc3+*acgw^hmwp!I zr3Nt`yJS7_blvX3Ky^Je>P*g!sEgd=T~4l-Z>#XBjBX`v>#84 z`0TYN%|?pMQnqf#E2t@|LDtnA>~3g*#E34hp;ImvULNF{cX`PZtGB7F(Gmww%G4UW z-&|fB{g$s$rnc2HEarCJVR7F%zY_8+zaKTacI-oJ zs$UVvbuz$L)`przCH;Fx4>= zzHK^XHMfT{pOn%oue|4$59;TA-H7DH62{p}Z~NwEXNz3xiu8V0d*ElJN>6R=s#@o_ zd_fuyr!LI-*(**Vf7|zj?#s%xAW+dwdn=Hg?T> zbua94o}!S=B`brV-;S2D77U^Dk&@X0t2<4P)GOCYhAUZe=2h`7sWA!0=R`pTz;$x~Wy?g!9vRbR1J0 zmh?wW273orbfQH!v(Y2&8SnJZ6i7~c$q=+=aVB?Pk^9S8tDl_AUvZqF{Vm@#Mh+If zAMbB%hn7Re-{taW|K4vbU0yh+Dy_kAy5Fwt{rOYB^?s{!b7tJQU+&JoDU)v8o1xr& zBFXN=#+trW&fo7;O?+cyyBal$g@0SUS>dmq-$`e_MF;BItnE4d+00!=_-MwoY1X8+ zrwO<*9{2gO66#=B*s<<;pRJZK{jK#hr%NI~PfaN65pFy#nsv?6{!;2BV`-nC93CnR z43fuXSDi;m6&YJ^XJ%}^QM+_;ccS!^w-&OU2VY)Wd+YXDk%FJw`Hl)`>q~nck9lmr z)*mGm#@!S5)H|)mGAS>vs&_%Xp=V~kPT90om-gh!WJwurXKB1JNB+W9loY{pQ#W;Y zW%Qf>3~A}Di;FxIZ#-u2TafUnpmMcXrtzJVg*IwJ$q|R9v3#85FT3-v)^%ieGOt+n z6H?-qr_x`^Z|EyrDu)qGF;eh{V(X3Ul z37HT^R%l~ds~Wm!Du6LxxjUnw_52CTQ@?7n{0;vzJa7KbaNql%$?4>Oz2d){e+KL2 zCv4SHOJi+R&N41AoY#D(u7uHi#(##-2mdp?U;3Xx%I5fghI#z|8EW-^Tn)XND|waK zgIja`$*|EsY7`(^)QcVx>zYlzLy)c<_&pW*wZ{|voy$^RM7v;Sw3@bh@y{|C<$u_}UR3|WX^Xb)e}?9NyVU=+Xgd*{zalih zHQ@5+;8P?Q*SvtvoGjpcfar;>X8-k{;Rolxq_qJo;?Na#E8jt9^Bh=r{%3IO{(JDx zs! zJH<*fPN1?RPnf(`d~N`w{_8x#JVRy!9~) zdm34`f%W@`Hyrr^#m6589hGvH=rg^w_`V6_%%=zc&YE82@afdaXEq<--fNdsSLvH; z__k|9zPf#8!G$%20xS1=s!ZTdJ|EXm9JIG}^G03C!!n!l6Iy<+E2!71zIEWmtKjy8 zvrX>G63UksymSz`9I&%gV_*Et=N-)^InAuabC*1u`TWl5x&;y~7j;&g-7?ietGMT{ z^_5RAFN(VMBvdYPSG}#y(DQs%yAv|M-8snEy*)E!U7g6iM3(T7Ir}+q?iiz1^S=Uv9c;4Scx5K_C{krhNIX z-z)!p|6!dBPj`Qo%Q-pftlwUFa|?rU z-;)5=E-m9ip%WALbWGZDqIX8#pOwqr-He@Z$3?R4({xGsD27>G$>(_zyH9m*VY)qo zhxxL}(Y;&CLcM21&VJXZpz>FPDND24Mqk@y(_)Xk0R}2{BEPU^vTQ^&q$6Snel{vo zSjs1>=^_;J-t;#mu`Ok33cUk@U z@c#_^c;!D#&aD4@^*_V=<`~`R%Ugba)$Uj0UC=l!?FDPzhYwzF=e!mT+^y2L|DRB< z{=cgIe?Nd`TXPCGCKSPbw^K~|cE1Z^2a5s>hxbshM@-CCSz$>enn>Y@NEOwf* zEqR*KnsWDQ_70QRona<3+Va?*Ds6dv`k+D+ztUba`LBlHmQ8Zhq~+Pt7uLLrdom@^ zHK9as&#HEI`&RXN``Q-G{+qet1=IO?``Y?#Yk9*KHR$|&{UYP@^$S8nwH&K`b+QUBY1p+~s{HVu;d}__AOnW<^VycaL$t--Z?W2Rc1L1i-`*d` zCC*x|c~62|9Cu;moXi&mOLeiQbhj z$jWni^43jN!v6CvmHm!8^82&f$4}O|C;w_YW6`%dXR>SAsfixbju#6m27gZfQQ-M} z^4ZvB2v^C~*nhqXI$nW)(ah(E|1;PIgHBFBINGi&eLnx6ui(=SVA2e~H0MFJxkDub zm|qYw^n)|cN|vfF1_A{MOL6^*$$u~ZS$!t^^0NO7f$G1P{|uj-IdRRdscUk-M}?k$ z9$S%~s#chE^-kc`Oe@p9^X5N`Ju=Bx>FM^Kx8Fp=4=V|-x!+y?HM%aQDs6qmqV#U> z$%)Ek;`YH2`-FCMalZ@;=iFzb=V#>jGFUFtDJa!@nsATcg}d1Xk@wwm3#SV4w7;=D zZW?{W$}28f@=@UP1t*k$v@cwvFYGV#tLbNsbkf6(=PcKCJI;K5A<;-?Dr-@7LxE<| z4p(2%bF2J9ZXUY6-1*-k@bVywy^gY9UhHM*?LW6yPX4PPxUh*+z3V#jq3E26s-|}o zPA(5AI=-jyO1R>!@HCwx^S)eiV426TRH3;!^nLQA>|&luxkRor{CDG?fBIK)VO~d< zt%L2H%RgNt8gpB|N}RCoSZ!D19q4F{@lU#$=3 zA9*&-*hJi1{>3G$6Azm;W0EsuPuQ-E4r@R2W@d)BWWXU;EkDNdEMJbge_Iim^66RU zEQ501$4`I#3e9+Ae~VYlSS0s3|LVg2^M!x1S)nD~u=qVZD3z{;I|Gv-4 z(ug^~arv|3&C}yJ*ypu;kzcXm(JuG9dsYc5_B!V8abFrdjl1`g(xJ$dX_n^iBp7l} zyq@#XukBhy-kIOrc@rC1`louHQ2zA%Kf_vgEpe0GQlc`Kta1g9#m;z8++eqStM;+8 zN*iWg&<|xSxF6H=FI4pAj8>0{r?%fuQ4p}*)d9*HTXMW=3`Rg(B&&#o? zJ*nP)oIfXSYhvH-f2~1E??&&wh|k;Ka7i~GE1pwwe5*IhzLM&$w+d60Ef2DbhFPSx z99KF#f%}na;-_?pZ*PBHU7gVr(3-?86xs1rU9CZdj^|D@p8W29Y4x2LpXq{*ES}0% z#*;pYGH3?gkbfWA^1J)Xs_k}J@s2iS?~T^vwI~KSs&c$?|L)76GTnSaOJ?o@j#z=I zb0(P^#5_*;x_ayULe-V*YKKlkb$SqJ?;u)wMp8huy4|) zJCrgb!!rfXNrv|cc~LSY|=3ggSm_qL%NN3nCU38U=OJ7r;$VouMU*fXcp?&`V!42M#RkIg^+ zx9mT|n{4+Z&;O~I+kfEy%M;GWFT!}a{!q&OFMR(QPTc?7EB|4p`CsP!pUnR=B!?*6 zRE|De%A+PQ3zigU+BIE5+!zD!??FFt}7D)w=(BZu z{pNgL;)JH~XLtDQ8N;72=FMSj2=)B+`Jd>q9|ivzj{Lj+kNrQx0;xAC{~7w1fqIa$ z1DNCSj;AQk{_6s6pk}hHW%+n&f0Y@JJ#*Z2^Ix6zckNH@Ikwwif5yY3FHcqRUNOx2 z6@TKs%E_tuUJvti*6A!YyyF(~&Eny{w)HP|J(-pGX^y1s$#eH!)w=%(59HgrJZ8D@ z@$(<{vwt#~ZY!Q0%lj$Z^WK?9IcxItmkHi>i?)rH*ZMsVp|4JFW_VlyVmlyR{-2c7!7xFPaCBnC|Q)5xrW9zQX^=nOKBQmz{mc8-(@~z2l z{xiI-o5IK{YJc-T!>zv>zwLj=FJ*A_IJItRq_d`kLQiv;-T8mlU%Er2nRcyO)auH$ zAc4VvRoDMp{kQ#IU}*=@NfwXqK3%l#@y=~MDZehSs^9#dVe79zunLBzuK5sqYUlr5 zf2l!X(Q>dg^6CE>vcD|g&{+8o*$OVLQO(05z!W8!8U9U4`PF}F8A^N?)w(}*^I!32 zRX$20SpRHreFG7*9NTP?q7CL3Pr?wzp^I`Ml}YI=SJYpZwE19MAh~i!WT6 zc>ngv-8nP3mTo!~B4FL*u6!qe@f!=*zL-tNUY&7XXZ%@a;t6HReTlKHc9@D?QThgA`w3w%7`7;X{!3)1G&-=u2IInnWZHv~V@?;AJzKSmkIF8L} zJ$=&VlHtwMf`8PN8w|sXL#6)RO?JO`#I8V8vR}4>Sy@E-M96N*=}C+Bb5+Sac)qWe zl_C19bv@o0|VK6F_CG(@pQ-Py;uT$gE&ZlsZIJBE=l5?|&HwXr|1+S#PYz%kQJ}; zvi+uHz7Yv@P0KQ^+J5~PS1FWYaM`>%W)FkxiB(6w9X$UdFyHEqTP!1kvA*4c3H4J$ zvK{SK8=rix_0vOilDmUnw0%j>w>96lPKiF$FKM8CcIqUt*^{1U-r}oDpI=|aaBbEv zjkJuLF`M3;WB6xw%RVq{HP7ukOw2m#4(2wd#rerhp10TfvwxGA_{RB)M^DVX73n1) zWmovQMETvvd4_Ktq{5B2Fe}~j3}>0t$`HTqnaJzRqi6RNYZUy zT2Oe-^82HWPd2M%J~!Cxqqj)ocjfI*DgAjnmmP}I-fYK;X3Fq9 z;B9q~+rQLhSIwJA$IfhY`#9xR-5Vz*apnCI^pF4q7xi? z*7P(+Oz=?nRQUF#kJ)sdNt>6b-V0Q_@W${{<6*`L6|cK?KC9oT58g_7=08IcWDlmu zyh~4RyDV8UN$vfNQ!h@>n^Ac3xL?(y_KkD58%~Y$otW4!J(E-2?%2AY^WS*?XQ;dV zN8_{o4d}K}mn}2biB;NcxK}>o)RGBoXBV@}%s;i}=8+3dfgLKlx68fp|GK;qQyl8;=DuB~MLdVPJfHto~R7 zJA7u~Jko>#-UB$<)`$K2&*12{3`(OYW&xikIg>^3_R*(DIASKBRGH-Gsq!hyOM}s@ z_x1+kp0sI$=xUv1+e3f-XK?m|(hhv^3AVLTh-o(xb|$%sFa#37*QpTVT-(1dI%S%# zbK*?h3!4W_o_`pYns4CVv9_oA%vA36$`k+9Ph63@W!9sgOEXg%m3=3^xmBJ%&8GQ{ zJy+YMThDGiyBlRTNh9=;P+rViRj+#P&G0>YxGFdZz0c0$&ycZC7SGl$|h9)3RS(F_FG3_6~~Fq6*HdHtSkFf z%PW8V8QU7;!v#whOjQji@G?l?f9PAix@3yW=Odeh8(I&j{MA}FJ73FNWwXwyGpqLR zO*wh2TH%=GtI8Gc)-0L+c1MT#oR3q_*(Dgxf9)Xd`gCK%IlV+f=4Q2zTjbYj-@WZF zb>h3Amcglw1&ngXR`_OH-P?M|`I*+aO)M--htux#%t;ZxH|^HB)Oq*ZJ2ZHWCr&8K zvt)k#WdZlcI|p^zES~k=;XNAKs8IE2V&2<%%33il7n`?iC~&Zwxn}>Hn`h_l(P}ai z@RpY8pR&#HQe(2siZdV2M9va$Su3v?t==keK)!z~Lwv5+MIQ!#>CQQejCLq1)YkJK z32mDwI5qNW^{YI0=bP=yZ{|TUojwzlSZW(5o@P59lfu{Dwd6xwl4&1T~5*WqvWMYuTK@-FFN4S4G3{)c521MeNfqtE7v~nHRpCK1x;y1e?O{L(DK*jgflcG=SO}KVE>CA;UiWLEceYPuJ z$a)5Sy5(`Evyj`3kDHx^`Q@y@@|*-S3igu+V(fnr*2kxqhlQ z_at1p6B#3^I?dp*xKe7kT^J2CzNfwzVtu4QL*O+}irQUgl zVOqdrgM_pCGO!j8g`uiv)~E;vB?2l zp1L9~v+v5vXDA4_v3z~JHMH6?;*Lc(uj-i~J~yv*cm73~l=8K8%oCftKxpAqH!n8n zhF>A(<{P8V3;CSrR7i@wp&@bn$5riW%}ZZv&RZ<<`P6o&(JtqAp8A}GkH11^UzrjY z?Jv7?j+?xqSCbK&;Uo>F({~O^_SjrpIr&{`!`&}m7p_Z)Ji=>|6!yd|BG0}xX|B;r zr4S{jO-{-wos+pwTBtTYe)ek5$1kgkZr|a)kl6Wc^I~ITWw#s0JlUV|HXgHhPhi%dK%8Khdo=g7k? z#PR3%Rgbmr!YY&v1SZCKDo!qXu$t`{Tk)T`DU1tcukKlQQuc`7DI=#HD*RE(ySGhK zn`YfH&*b;HbsX}+5#Pc-#oWBjzll+%@Z_WzMzsfSY?hMeJdfvn)!4dwk|ej=6Sm%| zsh_^@yF6*hdWkRRYc8-&zx8%czx`XmO3ULj_vHS0rM}8&-zr=8FsU>e_nCzld;VTua3vPDWA;? z9MAswTf7%B>i=V$V-}hCBy5=lzyION4^rj4RwpGK^h)Mfb9A(Jv zJ{>GLCFbzc_2Ksn?4`nXZ4Y%y@8Gn176aPKb+S`++NbK4ZT7o&hGmrNJ^sC?>ak7p zwdGqk&D2w#`skL~nZk*m#1b6-Y<3XZx0XxgfJo)S7N1ZR7Qvnm_3Ny=woDIu*Yn!O zHQ-@KVXIyHy-i`KUgkV$KcR9mWnzla0}I}R&+jeYwQ=ID(msX2$E_hL32&1;{;c4C z{Yh`_+r@8gmU8D?hYK<9_{ASpb?3n4E!-w)p-+xUvd-jS4!TVSNJ;O!uf)YjyzcpPO2Q;vv$dc z;|1X5b#4%#IIg>ejb#48E<-rgtfF&s;bC$w=tA-=V3oMU+GU+emNtiaF;31#o zVVMN^GocmxpBNVZXNXDummj%#5&OR0l+=mq9$DP;WSH`V`ThLUxB3?3ZD!Ttus1w# zK>hQVMeY%cGi4rz2>CA%ov>ad+(~p=P?nSo6SPX=?ae*|yPYgw|7y)!SQ7TP zrD)eKZ>hJ&Qy(i^^zeute3iB9#?+1LW$y^>aH-jNx3T$;I{Vj^uciI|GxWcxn{NNh zBS8a<4TL3!wai<)xnQvZr9j8^GWkt$K<4^+j(aymlw|ee3T(KIQA-AY*UlNNsA|6 z)^KNc9~N0Fvv9e9;Uq(CkAwdi?kaOseY}5PRQ2NKYNfxClAb{D-VNX$%_=HC4^eIx(+c)}lshyI7`0XHFfEcR40oJ?+=8(B1$yy&So4 zjn#I>dsaO4v#NglXBNY5k(EZ`z1uZZi~Alt__t`zyNwIW6ILx&ncTpd9L3h=p%SU` z_vw{Wr+2)){drFA%PZ-&Sv`|ycPtB;=I*JxB+2f=xgrC%hYcdXx!A9~(#+~TU4LX& z*w%@&zpE_Po~GWn;OnZQyK4{b&dB>H(556CF_pbIed1+X&bL1TR5xz*@MH7OI%KYw z6LReNNpb1eTTi=kk5x>UJXT=*`e??>x5}9ZPAW`(pPS&FT2y$F*{1ycwe}5Si>9h| zs`k8dXPokQg~_kyEVp$Q@!L!^y18(BXwmNb>>GX`fA{fxeAT?_&Idb6%L_IL7Th=d z-OkXz{Qlz`0SE3Z+MJrX=z_|`xh?m+Epz5Hxz&3uue%(5YNO6?5f>g`)x#^(Po9^s z{#~>D`n?A8m7E7ozK!^NF8Qj6$IecdgHXi>G}J;W*4+&ADFc3RNg|B%64nNb2nd9$}hFs#$42Oq_51}yYq>; zTc%jV_BlGqWqkJ-pSw(4vLeVO-0i_?p5};)mD7#grOzA0 z#0ZJG#XNFgSNOI%)8y>}ofDDE%^o%$^UU2_x20r9>BcgR#Z87XhD$Q6v^1DMEx*R? zJ+)->?x_#d1fOwwCw4z*IPxo5`A=s0q==x5Yi^%{UTB+4-t;!M;lX|t-s4}7GUQzh z+47&kDAs~g^-gp_c$j+6oSGv{74Pq_O;bI4WhvvtgVV+C7(Sey_e}0TL;d_j_h`lo zfe}p4&s=#N@oYlg+=&NwBppcT5n<*svamcGvtd%^a*w$;W`}C(+t+Sx@L$ht-?4z# zN?Sf;cIuIX&nKxxID%8EIxMAbPLO@~?#a|Un|3(tK6mw}$ULi36UMr(gIDyr?r-P| z5BE%tT~@RwC0($wX@{+^C*u_FeEqrFCew`;hE14y%ltv|@f#N)1c4>Zk-Z=Y9F+Tz|j$@!%8 z2G8^My$tz*5tDrj|1JwZ8&asmadlZjq=9kA0mc2@^X}bPy(=QED>BZ#EHkF&oCkv; z1LK7N)=LFO)xk+f+0t~P%#ABIZJte?IY(gAwvdDeCMgMwmkVAWU+bKgzI{{kn@?Wn zzUln-)G_DXao~mFyt^693s&3<>3!^;W73}0Q);39lR0A91Emw!wg-9U%=0#B3;ON% zpJDbh^~;j7D<2ixKH3vhxk~T+wDOetm2cn9Vz{0enC8)4^NusHZ$YyCnc!xorv^m~ zwtV(hM=#Ga-@hf%X4092dJE%ex9;n?@!$Owva4m%-&GlxG6m`vH*W1XmZI>e!Sux% zw_@QvM*dn+Yp-1|o4RTB1_ASQg*>}0Khv83%Gf?xofi60bIQ7BED3oJ<{9_LlrP}z z(&jSXF-ddDtjK8|Z>Ao&6aGwbr$YIona?Lmnq3d}6zt_a{Ij)7=&-u|p~Bq?$r5it zX(y;;jcc;W#iOD})@EI|4!stpI{mat@6D5v-~WXQ$5ifWT2plL^O+Z~@}$cQ4zn^G z>gnSvc94GY>V>R?(S{QWPXztem8RZY_VU$a)`lbHn`5>lSTOeeanh&KBe;W`ML6 z<%ZL?u?g;$%%5#t`zs_oIO)|3?v-H=ed=7CoERoV7(qtW}>TNR!&_b(S=T&uH^t8L;2 zZdRFcb>^?8s>Ow8V(+r-e$2}#u_Lps=3HHp-Av}LjXc+RS4_CH>V!(c$De2X&K3UN zlUOZ#^Ir+$PS?Oo9=}^AT_I<$`>=Pi<*g9G`7yz%Tbd$j7E7&q zqp>uEX+e)nRp|On{~0b<)_=VJVey;&U+%^KDgUFvv~}+mvy3@df^@kdi7Y#0%o~B7#Qnx2C@ozl;gV4+{wiWYId!t|f zWwn|Gp->m)cQ`D1awp}zhOq1gzWTM^t_-3q*B)gqnmG5P;2nWvmIpoajPGAtz6ezl zfs?6(Ry(FB&hWZ?)>vz*zd`dBxxMVR?CR=WTQS$as=DUpZF_aV+S)oVy(YE)0mBPc zUrbf#D`(wJvQ6}bg+#BcJRX;MVxeF_Nnlqg=ICEY;DL>2byoSk^w6C*hbLqUe7z^Q zW$&A}`s=^8xe%&B7QUo4%5*MtohvE3uf4%*A)0@Nl#2(eo+)q?vbNfs`b3L?rHc8r zcTWAqMgJKJ>b07lUDeB9Sh>(MDdL9g0|8F$KK=_ASer`}TWlX6W>lAdZSm)X$oE~1 zGRkMAHcB#VV3*s!G-#eM%ZHQsIdUfM{<>!C?mT#s&b&3e?Nr8tnOsfBE+z%>2brhT zEov~?cR#bK?kXGOE&mx7cJrf(?;e=U5m#|7>_zK=3w;sMC+$9 zM0MWl;;zQ!8@gm0|7CpFeBq#MTf2hka?IP^eZ2c?CBLUHT{TUnQ z_HnRGu&<dTiFdY;KRF7TY}&r@3;UJZ9W~Y;m;b4dW@ZD>HUXT>N6~7$KQA;~ z6)!Nk=P}P%|2uQ<{i)u&HY)T!n>aDy(AviysV9!Je?Ff#*ZSJAj2Fz`19#1wW$eIz zH*|^RuKe%fKezhMYV6Ac59l`tBKEj!z7Jcef%oQm#?@E%?Y|Jb5<;zDQk@(1^Z~;= z*D&>MeD#Nxu9~RK8}{(jgk>5Batb_j|Cu_yl6<^->f+8@7PH@KZuLAZ!^FOy_vZz+ ztD@)6W}Fm^T>E62+jco`E#XZ;p2-ux`*}R?zqD*>YNT50qN#J=B~36o<~6}A<@xet z2dQnJ*B(i8VPQD4=U0>Czfk$x$^Xv(&b$8U&wgVG$z#TmP4{P3Zs@ZxbzqsYf|ZpGJ^`bTVzKKIE( znO`z{tKy+_=F`lkBG=v|Y!A*8Q@OWkarBl2Cy$?PaI}2Rdp?RK&sWP)__X4!4sOF^ z1)7H^&N{zy`y^k+2c?;*pA6gLXKb@Isyx3pWKXMnq1Yya?1F6zlk9ib)$VitUTN|2 zt%LNGP+eCQGp(}Cn{4t9x_KUED$wfL`19kP-G>d_cJeJ;pvQ58Ez&}zKBg*w?XKyK zRbpHbjo;mj>a7k<vg>wpzRR`q6MHH4Y zd%R3;+>v+q^M8i^x-C1y3qS8W_EmIta_+b4J4;+e-(J~y{9esG&v*4v%U8I3ir=id z^0QdPhkxG2qAWtr&$+C6`0Jylt$7nv9&Wx$ZEnyb3l8fgVF}fRJ^vZ3PPUz$zGh5Fv$$PTy=5tZ^b9Y9Z&dn>nyzu4us^r^#r3_~{azD5|+T4ij1lc5hMz-jgHOFqByClQ&yZHFENfFB`obN`9 zC%qQbm-b)?s7vZT&2;n6!3DgNwRBDk+V4r#VY6!N`OjeJ=M>2-s^xL+a!>!M4LQ0! z#kcotTf-r&HD9H7XF~Y(jAMo8t0rB#l-hSoUbm&_xb*3X4QrYgepk9Xe0NzU!Ole3n$^b9y?L!S_K`bMx`4qT?GUpXy!Mxb9%5Bv; zE#Epwm&$Bfq9x^aKu4tT&K&+L*F?9jz0nmrd(z_*sgrY9&G+w~_Om}m@b#^w^X^^p zHv4TiUun@EpHm46GUgV+CoRr-$o!hcaA(oR<=y|(x>d^Fyooj3Cp=a5)CoQj#y{%o z?Y6F4BW=On+~+95@QOe+j;$$yS1h|Ue*G7dR}hNf)w$+>(BlO!!l(8~*gGe9RLfmR zc}G|PBTu2Lvu&q6+}hp0`Lsy=&VK91`tzbMwuWu4Jasfr&t~pf z>n$CNC&@41odfElm4r!N$vea0T=ywsTF9ZE0?q`x9rE9=TE5R)rlFWw=97|Q$Z{f7 zfq(BYtNBq3w-#+u-n%PV#_yEM9OY$a1jHo^te!8AtNXA*IAHH@mC2JH*Y5T*|5*_x zYt~TYZu@rybK%`&r*{WK-8|J9xS|%eQssn=kYQ$H*ej$JyU*rFAGaLBg!qi zhT)BS-JJlor=l(S`YPKhr#)CcJ#BJgV8NO4bW2%_mCttV5IU=Mc8jY?VMkeyLGGS; z#`9KAGZ;CJ`|!@ceAA8JTz^^||5%;=pW(WLa_ZawrZ*x&3@VQ&Uz!`qUs#&2d?a1Jnek+R;m!{S z3NQDs-)kp5vu%M``xW5e9za>AlGs^a+hs*5A3GSB4x;uLGPv5@QV7_9_m06j2YUR5= ziAjdqY!X??!hF)^$@3n;+iM;2(|?ylt4(|~Dcy03LkmNN{Lu;SaZ?yKyQa9-S|81+ zd2!fww#U&A;sv*xYT4Chf4ei7FV8aMTnzd0QoUqq zo_VS~!%p8H2kgx*H&p)F81nCO!PEG+IyN_#w4dhMuOPj_UGn_tc}12lotc9)7tQr{ zR`OsxsBz%Iui&6}w>*0^3x&Omr|@y}ls;M!y=L{pse;y9+U{##R(|@z(7RB_Fe=I< z;IQh7l27Mng*4CMT`cpjZcFI~vHuKPboSiWep^sE^Y->LlINEh2d`c&#&uw-MFPL` z`$(~mcVi;_^Cmhz^;B8C_lc!s*~#16e_h>cS$4K+!8|o)`wy%Oxcgp8iBD`=)iW)* zLCd1pqy! zHu>DonQo%{LSI-HzRO^`bXIsn=tPM*57^ij9{kg*GVS9@lcF7}i=WmdH`EqhHtm~U z9ChfKokR3Yvx#>+5B~Ly+%YTLJCf_}>`uNjOe-YIWm1xv;pf zkJEN&MDE%2yG-nfo`e10EdMQc_il+!D>}H8_vz0hH?AYhZI9)4d|SXfOIz&Gzo*}} zZng~F9@(tn8m4YvUHPE!_O)#xlNL;D?qY}<+;s)3NT35D%u9tL)0HnqgU5k&<4NZK z4A%osX6NhF#Z3EX#k@OPLD_D{*JrCO%%gfH*z|35mD+aW&O+7BCli}*FW;*e^?YjY7(eX$NzJ=X`v7X~y(P?u9lP`*J45u=GZLVEA-pUO|D?xAzWG(c%TUi;H@g z`y9UfWp&fdy>h~JkHhJIn>p<2*RKt~oHEVZQ}&<{XNt6Ux@jD?mbtrfcsq6i@+;J6PuQ#2s$s?B~r?>Bw?i_OQ`UQlhPvd?gsfBZ`hQ_Vx4=g zz*25%8t0#v>ApKY#itctf68vZmVxcml>>@q7k)ZCQJ-e^{JO}OCW#Z8LV8AQB7A$Z zI&uI-_)K5V=y63e!F~4cgMCj8FMLy&x2Qo+CGc3pajAvH)3gkC{F;@1bM2qU<`d;- z`IWzs-fy)sd9{0`MQ_dix!lW6I?M3C=YMF^XZb$Jzb;|NR33+;JaIYwyXO=ika+U( zl?Kz1vJX!0J~~Soe>$^@F@OD9{(PSPeIChWx3}vom{V1&HFw>5mVN1SRrl0I1VyIv z%&@h~vwXbNUG|1}{?3^f*BSJvSOh+0`{N#G``JNCm&fP!EEAQ-lNN70@n@yjE!Mfq zBa(%-vpFm-{FAk&{8R1Bb<4Kj%zrvFbn17R(t{Eb7GKUf%{r0sL|Z1vV=3E>WqeBv z4?LHxUBT>>U7^Pyd{|~d3E#r~bNO>w=Ecus$$$Fy>)HjI)5gxyUi(W=H68xA zL~Pn=&8fMMgoGzOWb^!b)>Mz@n|EQ}?9b5YDDg!0Y)|^_wf=b*w|>#gRK4b)mO69Eu}ge>^7{%e-)k^c>atK4JS^qb zyl7E_y;jDy2A|6u$wC_r)-EoTk6N0}k^Ov{r1~eNGxa9t9^T%0P`&Z;>sh5&zu#Ow zMMvk&BE{Y(%sV??UZ{^^*weM5QP62s4+9&6sMM`!m1m{fJ5y~_IGE*+&CD$L{PVO* zlBH5@kLY&h12!`J@m}Y=cOUl-OJ#E|RbmZ4kigu)FUw}j@AGv5Z;PvAOTc242Rubp zSM-xJRrcjf+hEf^_pOBb=T$3LI?rfNXE1Vzbn;Wq7(`}Q&nsXtH7J3%ys)YwEzAoTC&Er+Hae=Z;tL!=dXPFys z-99SqF1yF0|NGPchWmk$-@bn@7dJbT*k_^Ixa9V;l>ZET{C8iUUtcwe`)6vG>DFzZ z4Y@oXK6}FUf>HUIjogl37g%q+eb5=0+-4GD8L)~W_?4~ICC|)UEtX05)E&H8Q&>{I z+DA3M|MqkLuKx_-R?gpdy}Nz>pY5;Elzo%#ow2UWow-!{`5ZSki3cgqKgeBST&%iB zXo}Hc=@~zrPJt4qjnZmkR>s*YnJ0&=HD%vD&9sj}a8YDr_b2o82E+6ISvA*-x~H|> zV>Ik_woAEv-GaH#pM9O(7RI8kbGxscU3=-s#iLs`^`$YM^D`2cY5Xe7Yo+UQvg(6K zuhTS^%KdvJ-UZ9@Cvm>gVEQXM7kgHBnZD^@b@?-f+=q=R4Dz$>&2!3+uTOmKAY~F7 zojp@!=EHfSU9JHSwBNDFd_VBKtM@C@uJ)TXJAO5O_7c6VylSOP(*-oH{W!#OFsDJ?dvGov*wIbd)3`l0;v}HlkFRxFW;8I9M*O6-$kX@XQr5B^923exH=`(>yuS_ z^YLqIGJkd5+cWXs>neu(yQX;Tu=^qN@lu0+U}Sdb(|e~jiKqVd4E=e6!)8HMxopMv zv);0Q=BH(^T>CBhXIf}#?Qz)xH#R<7V+ZjUYnEJdc2|seG|5%N?5IJhVjsK3>$mvV#VSED%*dA@OIB!H?LA% z@W4S)#dP)sDu4D&KK~MAp5#39X;)Kr?4G7Di77c!w3BB+9``wSr6sLTqh~N}d31Lj zhoffh(VES3p3h0Y{zrp3scU6%^|wkDw|k zq#gP-hi~4OwY7Phb=>@CZfp{n`h3CN3&JmFF*NzAiTmrSOj9xBhz#hT=~g(W`Bmoo z<;RZBOqr-+RM~i?XXP#No}OgpeOZ=UBc?^Pq->J($*bA+in+kz$&=)sD`!{STH~qq zEm5tkwRh%@*9Rme-aGJb-5wp`lX326T2jQ5Nq)XzTQ~7-&n*;I*r8IH;}%+L@l~~- zeXqx_xwBZ+f}GW7m@PIx{rbRz;Im&h%y4}sbfj^@l6C%$yCqouR$pL=zu9r(k>|6C zcQigr^q$`GB$-)8t}5i)wnMkiD7jBulKbX-&*TPc#+RXI&)z9Fmre3JY6aMeG_KU#syj&({MHM#hv$IVNCd&LXR z&#HEQuDO$vY+d#*Vs%IWtHqZW7kPYjE;(;l(0L;_ z)OH86eP5<)gW=n0k1Fd@6Jq+z<}@}i{M(w>#jxs{mru`RU*VJLGa@-2Jm70d=;8ah zjMvJf&$KHtx#aHeqsJcac)EFlyZXGTWnB!N3-9JXSu;uh^!AFJ?a!)zUroRCQ0uht zNv^r`wUQZDvY0D;J|N#3x2QqWY|f@NP1T*t^d)vhI&e{G*7&|Ty5<|2T@`FPHDv_=Tv0O z?0)Cj^w&*!o$biduQ<(fNdaS};T*o^2KM5xj0HT8mv6Z~U0?geh7%{sG^JA*`1bz# ztND8Au}#{QmqjC`Tzz^M%z3`eKlsYkR~k%R{~fyO>R7yx#aWG(DX=2Mrm(7gR1lm?>$OR9M*O> zxwvWiQ;(B8MefSiFVEWR$`HC`W7maeX2rj^_CK?oZt<_gKSg!Msm;FJMy>TajXU_} zy36`2v(MV<$`Cl&r_WP%&&#Q?*W4W3xOo!3oKHMf=r5-It##_NsfP?xdONh1^vD#> zd)`!dHhNKmc64NS@~5-fO1&$k1-G&F$-#S>U3vUZQ*uwds7fi3VFpbx2K(BX%<+8Y5gK!1 zqmbEZnI~V)7vGn;yl7*WymGeXCy`Z8`W(OhS#?!}(Y55p#lWOl8Q+#2({RvR@PYIA z&L;_S9}>624SYmdKwr!c8r@2ctEoz2$E zrzI5_E6OmwVUPz+_G+wa#aaOBci6>Bbzxoua2Z#NkK zc(yLkL6j9E&u&?pvgE``lZ!T!DqAP?@iDw`<2djhlsbZ>N-|}#MK&FKx%+!}@A1OZ z=?Z=RwpxeWUMe*_IkIv)Pm$->^YPb~E^5#^ofh|WdEc{)$SK+^9FEKuzfaZr3Pt8k zKHFEBIH5sya{l?gnJj|y3$(6^Fotn+qYx7icy#o+{oKquD-e-|3dQ$ zlwzD-w4HaA$FxUEQ8zR{b4r|+t6;bHzcyo+v%3M8^ARsYUE`iyhT4M%e=nZ=>(SO1 z3p3bi!i3asehU6xF64FZ;r8T@KU-a{i6@!3lxpsCOBLEuvpGd(#mNKeecEAN3`e@| zz2cm9OJ8+v&Q*!c0_^G&kK6lSTP{`e@x1t?6CJY|CwLs3p>dFBere}1qxz*;fer#3 z?6;#H^vu^$n)Bt!+w|?Pr2(^GctVI4J_=3Z*-gHO! zNs`qYuAFk#P+lmx%rFDg@m!HIWpx7M@wLY1^Bo<;GFIKIuHv%!_CZagS)DmV$;iPBTf}%v-$;HopWl+(luQd zUW;9xyD>&t_>bl5A3?{JqfS4M6ciSo-oME6t8D*{HTwmAq+R!J&C|_`);So)X{l3x zQ)yHuFSx^2O`*;WScUT*TzSn+gn!sC@|&rOote{ELZlu3TR zMxnZrOkv&oz8-Ub#<74sFeG>RL`9=hpL|qnoR(-L**l(BpLgZ+3iT60nz47xPcWRg zRp5B?Xt=hbuh@%K^Ygkj9-IihD8a*1bDa6U&DD-)k#a5p#nQQ!znK4KMlM{bX4j>) zvaKDAyNen_RsV1`7V zgUa{!zd}zD)#k$07NbPm(w5Pr`0r&u{~dNy!=9h5excC!@L^c*ohe+N3JYW%|9xD* zE%TqDEY96dL`+S_~_*AtL{}c_K&=CRXlmGZWdO4mw9=b-5LJnTa&$(Jk_s!QG9WAQ1JJ8 z?T#yd)IItgV!rVell=s(#fSGNyzg@}4!wWqd!IpR$RFK?{|q-*B|f%Qc$|IaOqE8* zv-$cRv5(L0-K=Q;`TB}K>_4t;?$!S6nU!l1xZh;j(rkG?_hnfIv9Vcp$$7WBg7co) zvIobyz>cSSQnKRtl|3%g#ra~QR+gzRNRtS#=b80-;eUoe(B_0Kxws)!T68)`qx%`h2Yhq2u8PK-iRmsj%sFj8Va?%Fts))) z4H0JU*O$g_YkX+5WfFU)bm5`5%ni2wOMPAWd^;U=-P~CMrWv|)L_FQLLh{#@z}u&$ z^DBGx$b6n+$-IHx{?eMjpvXAsU}?3N=4+C3lJg8~|N3d(bNuuqbi!)uJRWPg`=^#I zYEXy{O*&g3l%8a@oLSbua;44w`#*R7lU-0}@=JqBF|SoNg_->jf+nv7`%z7r(vX<&FYqBqt zSm9En`9SgeInKXY>U_yo6P|m@9J#P{&c4tWAt!&TF$?bh&mdIWt8&YA>+!QX96$f* zl>W(HUNO%_;Xt_T_$wi}4vh#IQwEc-7 z-mtS9x4BzN#<)B$vwGZDcwbh7>HMVmcmHO9bvYN83HwfZ$Fz>c%|(6TW2KfWy7Me$ zJR2ogH!UfB;h;RBI(aRF?~~=<>!WO@{Cod8V6NK@xAl8BoZp~7?e_N4V|UW+TP^bw zvilWde$MIN<)Bi^@R;Ry0Lwg(YZjmMfA?>z*X6J#@6bu*H-2-QpEyu>oqeD6V~f@M zvMTTSy`P`=CV9IT1K4PHkgKvJw{mBw8lF_-;b7-D!c@iNaKP?Ld*Iev$Ezo--`sKI z>COj*Cm(!S!1)K{8i%XJ>CPKI&HLG4ol7b(n?AqNJYF&GSEe zeg0tqHBleE*n6ZN}IGFoY z?RWpWkmhL7vi&{RG-g?c$G@)du8h(MGn!*?cS4VYfkM@BQ~)ey{x%()LZ_&!JE6 zxD_0P%+xK|B_z+Um%r4Y299EI!dMXSy?Qy?O4Uh6oz>s&-)h379aOw zCCD$9R_hiD-Ii{8e3E;A!IR{58H_dXsLPxb zdr+|8eX~?sVpD}W^Xo}g!F6}@pUf;by8u4!Y_Hj4%Rd@S@d&>w&9Yo5bnNzoo+ifg zPp{iu4SF8bsdFzv#`>qP64P=CxqWkfJ!;VX3CbSec)M0&)xGtI$M&-F=+9GI5~nlF z`TO{|#GlNh-Fw8YZ8zGxd&yJA-ej%A$Oq4=X-SU=vD!h<Il&Z|W z(P_LzCnvgZ597qH?%zS;l~bj&RFnb@-LyejBRKurfYMLo+Ulx(Wpa0~s(7?CsWBHO@JoZ1gPe_wp1Jm2&FbSFi`~v` zQkue?XT+iM>$&CE1>ANB`?y|-trb4`Of-aHLrSX6mj^v_zI|Qr%50Io!EVO=XdV0#`>|TeYH9gDO z7e3+2nf~pf|C8MlesUG`ga}^{?%_X%QU+Z5#yf!LiKKYVBT&;4nf z+nxbV%(qP#^$~H;ujTe}@ir;vt!`Fxg#R?Ii2HX_z_2XAn?cMh`O_RZhI5SXQ35t7 z{puRgl3+G;HcU4#{D&6s_in)1CT7xdw+u&?{HP`9w z+k5vcepD{Gz2n$9hJ&{3KmV*ey)w#ZH>cl~peIujxcZh9p7@p4ppNj$(yq{1hDv$2 zs`7%Ce=_;S(2oeqC5sx6YSEP%3pgP4%d}OeLXzjd3>sPk;jAT%)Ba_il#VkAuzn); zpFwJUZnBPj@|_bkEvY%eCoNw73~Lo(bbb?5pR{$}lg~V^#*=$yrCyu!dCw7}hLaL8 zhBAwVuawC2xn>4BNKSb9NoB%`gCc8=xyvP=DBQ5(=j=&URY8u+_JlW{lQNySB+S^- z((-ZoU0Hwo<)$lL8Bz|W>J%Q*_hI5LDTpxqxykUH!vSXdzgg4Wd-t77pYSgI(CVs1 zAC`Z7^3Qa!D?`G4!^me_yF6x`waE+Y{LHRBN6%6w-SY8#uN~LIHM2Ilyq<4)_ln2K zot`SZ2U1Gqr-Iy67FBY=qgPq+)}}s*$ViWi_TSch zt2{|PVqN43mY)qZ$DajRNLrk$e6)SV0-m?gYna4Ccc$HHwwd52@%XmoAI;4-d~A+v z736r@;8Z@zjB%dBaT~cgC2OrTnDxB5`wcG{3${M%i#>C^;P!T9iT@1g>#|~l&&a13 zvg$wYVY6UwzPJ9OgCzelzjJy<%hJ+yx{Z%5F0(S~nUgEKb7in!Nnc5@1b@zkb;bv! z_ZAhNc$e+fWfj5mQztdwoM*o6`bn1d)$=dU>i=z*DAJtc7ZqB-y=h_#_hG(}k3Va( zgSr?_S4%I>=9)C=)a-r9#*6i;5|69!&FL%PX$cL~emaaPIuqvpR+$z(fSarep3>W#+=udTc2AlY{ARdB&))qO9OT{w4k z{PeUf;COvdR&(w07~5U#HM@MDDOJ8daLnxI{OX;Se?W6-YtxydqjI=*e~M^$E54?ATXiqRukvN?4*zV`rC=F)2OWHTmCO+-D+p~Upp>euwgLE~2 zRjk`7?`6r-3TO9BtU2;EC;7vp^%osP7i~}3J1r?Z`&b9V>j}|+vP_y@Nze4L^X$rG zo>o+@&mh=SeECZ0>Ma3mIc33XHZGR<)3GdbYNK^u@j;2l?@P~Tm2U0X@VCEM@sr@x z4gM;Rmp_dX31D-2`F+AMF=gho`zLeHR9M>dS-!rsq}_Lt+`T_PWC3&w-(9znn}G zcvqq`X_~tFyEht(U-#5)UG2({b}Qn%{LMZ0^}h?4#A^%B-`#xq)-n%0g-b#A#QNWI z3OF2@yYraw0;?}CkMFh3S)S=~N#g3Q2VSSv zcrfVQVea#P0Mc+iTGH+OOuOi1vseCJZol5-_wVYN_v}^Mr!n5ym+gLD!ZOa!@^RO0 zSBB)dW-oIe^qF<0^eM{E+GJ%k@qYh4+dliK3ws*hDY^t1skmEy;o+WXTIAi zxm=f9qgA*>cW?2e!a01kyVIt9I`r<*!`W3c{v1g;v(A8#U7DSJLZu}*$!S}+?EmcO z@#xN(+bTJB?oRCu)lcLK-+Ql!^ej0OIE6W1CFa*Q!ykp=FBWiZH#l9q>@*|CrjwF! zoLZc6JN`{&*;dY5wdqKZ>76CJP8^tE)il3!uTlNdjEfGHqWOu_oLMHY==03pwo^f{ z$*Q5YR%__YCC4>pv|A3?VE5Q zwsq4__q@9N*~|C)&D%2h(6M(;2@}`(T%3{0;SnNT{JDhreMz-6ZF1s&woU8bcrB-$MIqkeIhNIO2dQzg>k8Zye zxQ+E^;pX{=Z8N$~pQ>2W#WYFxa>K#8H}&Rnr+f)$_yayxK+>5ALD$wyrJv-&yF}s&GG9SM_+Lp0^Cwj*1zY4Y+OR6Un zUEI>eKFv~Ve??02WqU7^8L534=0{$v+RPWQB4*bF!*dodjH5#W8jfC>Bz`3&a_zmE z+ck{=+oaWHt>o+OZ86&G z*+6w$pLWKr>@qd)V@A9!oAu&lN|j|-hTRRFx_s-zH{~A5-KTW7TO2>x)BotWO#0Sb zPa&^>UC)#A;;Q67WqC0?f4+T+b53gGvmFtlPJ3LB6<@HhSFYOl?aRva?K8K!rLmaL zXj2yuOV}aF_=%~1?}XawXWL#Z;Hgm3T>Z{NVp_T0d(N-`_wS$EWDTqfUq+occ*TI7 z{fa=nvLE3gVq&HuNmc`yFQwK-QDR01sj&HnlIa0j>m6DJPeW_k$z%Riv9JF={CRlYbJQCj-8wY+jwzoZzZb#6t1ke6k=KtOQ(|RM7NuHK!d(HB{3f1qbpIX^l zmRL2%;{4{%T-%ptets1$=OgXNtaJ7P*DI5`QuogLf7W~CsW!3b_OY_xT&o{W|3vSH?7>g)LnnbC~CGzU=CM8?fo*)3d@R3GbwjpZ@w~d78M(mEf8iABtWdWcYkx zUh`K`nQ)Ka+ow9I7_QL$-tlG88NJRGix$sv_g!Rhdb12)0sED2ON_j}C%I-SHKbButE-mvottFn<=*nQ#wFdw7X(EiObezX!b9kq5 z$JW)-?!~Xr>h8`-k2DlIRnpyx;+z(+YFRV?eZ?@l;HyZU+@jT<#g!ax({3@eUgV5C zsa(u@&Wt~5H+(6DllxvO-I9rIpA)(m{(VnOmiw=G{(Jc^^m$ZDw%*cg>Dp^ki+^5U zboSpOaHcb93Tvu(8oyVXO}=s69MV%qM~bC-9iRczU5CS;yi{MEGkp?1fDeN$5l zWV(XXw>HXw0GwjPcu}`NSoeGvclIow_C;cL0(Ub)bzH_}jmX)3C ze&q6Ty9N8A*>3E}DelW&bRn(si-b?Rs$`SZXpZekh!CM=~clJ^$ zTV}4CZI{`5SN^GnNV05^dD+`vVN*q8-n9FQ5PiktqTs*h`=Gs$L z8Rfhtdp7*NV7IVB{iEg5p0liHkN-01+hmb&DqP|gdl7%uwpA+@20E>fVBlf&_BpbhE2;Sy;${>kMo5{U*W&+TQipw9^ZZ1 zHTHOMuEfc&%Y&bbE6&ytmww{fvgxEwQT`nRhT9XbTRxi0yJo}Pncu|jDl>7)YfYZu z{`CBRhNvwXi|4j)c9t{C6m2=zSha$??bnm^Pb=1)Iils#7rO7aB17ZbN%mG7T^$$t zpPHn0MnFJHq07j=%+a>q?&iy&4le1Gz$x7;zaL}&yz<2Yu6~(K_R|tW$|!w^Re7M<)Y}t_nm9}_8wdSKy(AJsj#Dsd^ zwFkP2o+=aA5`DMtP4UaOp5W{Dra~^JVsHfWz}NEy#>ATltHh_w{l4u=s%D$T`7*io zwchzfdNv0HFD}kqv$m(Xp<4L01N%+HC4l~cXSEJ z%wUq=jJSPpUKc|%#C^4(yXBUzSf?IcvFA8T@2Nf26YSSAm?KGc&z_j4EEj#^lG)Xe zW1a_XPslQ^T!GiLMGXo_ciXLef$FNN-lrb-Ov(;>l&v@(+*CiogyB4Hmn}_lnk2H3 zdBLkp#}n)l-xhGxorhn%sFj3%HnIt$JW`DKqXbj%MF#<}XZyjng?vGcDEwhO+%;>4 z>GmxztNik9C8Ps9WVUZFePkRPDH`N-%3HvSxA)qL(;2=;k314H`n%4kcMI$U#b}cN zcKfH+S(#e5X58@keWG=HGE2${KMtD$Hg=JXktSvvE6d)j`=+-kkp*PKYMdw7_#f)>(*`J-a z+iM(kC4kLrVgBsyZ_#C$s#_UllhxIqoj4&|6`ZH@r2DOBwqQucBXus1`Wf#Z|LC*& zZo1u-A>dMyp|g5G>!KF8Xc zj5PD8)SSCt^WToY+Qx6*e{+k-UFzAodhNkaCyeYRp8x18K5_natf&ZMY+FM( zr8Ol2d#e8ypG^}qeY$44zO9LHIje|C8!c_>9Z zj$N^rJ&NJDi=oHlqxo7s@4yG5*}2i&%5e$=$fall*ePc{2N!Co^O`D%fH_L z+_rVPiaWJZd3P2uD{qpKTddHh72?_}3O;4ViqYM{U{UMhEjw>BX53MlG41A~nCFwX zTjm+gDLra*?|RO~J=11(=55!zowR^i&PaR`+XMSwS1$%SNZvZ(EW2T=AFZKsl_mw3#Z+|%cs|M_}4$b51Ny4mHZ z;)jDd2hl$r_0K2O-&g8alK=T+{`V8B z<8b&lmac=l?Ur^&^-KLi}I 9) -#else - if (self < 0 || self > 6) -#endif + if (self < 0 || self > 16) + { self = 0; + } + #ifndef HAVE_MMX + // This is to allow the menu option to work properly so that these filters can be skipped while cycling through them. + if (self == 7) self = 10; + if (self == 8) self = 10; + if (self == 9) self = 6; + #endif GLRenderer->FlushTextures(); } @@ -242,6 +248,42 @@ static unsigned char *hqNxHelper( void (*hqNxFunction) ( unsigned*, unsigned*, i } + +static unsigned char *xbrzHelper( void (*xbrzFunction) ( size_t, const uint32_t*, uint32_t*, int, int, xbrz::ColorFormat, const xbrz::ScalerCfg&, int, int ), + const int N, + unsigned char *inputBuffer, + const int inWidth, + const int inHeight, + int &outWidth, + int &outHeight ) +{ + outWidth = N * inWidth; + outHeight = N *inHeight; + + unsigned char * newBuffer = new unsigned char[outWidth*outHeight*4]; + xbrzFunction(N, reinterpret_cast(inputBuffer), reinterpret_cast(newBuffer), inWidth, inHeight, xbrz::ARGB, xbrz::ScalerCfg(), 0, std::numeric_limits::max()); + delete[] inputBuffer; + return newBuffer; +} + +static unsigned char *xbrzoldHelper( void (*xbrzFunction) ( size_t factor, const uint32_t* src, uint32_t* trg, int srcWidth, int srcHeight, const xbrz_old::ScalerCfg& cfg, int yFirst, int yLast ), + const int N, + unsigned char *inputBuffer, + const int inWidth, + const int inHeight, + int &outWidth, + int &outHeight ) +{ + outWidth = N * inWidth; + outHeight = N *inHeight; + + unsigned char * newBuffer = new unsigned char[outWidth*outHeight*4]; + xbrzFunction(N, reinterpret_cast(inputBuffer), reinterpret_cast(newBuffer), inWidth, inHeight, xbrz_old::ScalerCfg(), 0, std::numeric_limits::max()); + delete[] inputBuffer; + return newBuffer; +} + + //=========================================================================== // // [BB] Upsamples the texture in inputBuffer, frees inputBuffer and returns @@ -322,6 +364,16 @@ unsigned char *gl_CreateUpsampledTextureBuffer ( const FTexture *inputTexture, u case 9: return hqNxAsmHelper( &HQnX_asm::hq4x_32, 4, inputBuffer, inWidth, inHeight, outWidth, outHeight ); #endif + case 10: + case 11: + case 12: + return xbrzHelper(xbrz::scale, type - 8, inputBuffer, inWidth, inHeight, outWidth, outHeight ); + + case 13: + case 14: + case 15: + return xbrzoldHelper(xbrz_old::scale, type - 11, inputBuffer, inWidth, inHeight, outWidth, outHeight ); + } } return inputBuffer; diff --git a/wadsrc/static/menudef.z b/wadsrc/static/menudef.z index 2386b1076..86e2d5dc0 100644 --- a/wadsrc/static/menudef.z +++ b/wadsrc/static/menudef.z @@ -134,6 +134,12 @@ OptionValue "HqResizeModes" 7, "$OPTVAL_HQ2XMMX" 8, "$OPTVAL_HQ3XMMX" 9, "$OPTVAL_HQ4XMMX" + 10, "xBRZ 2x" + 11, "xBRZ 3x" + 12, "xBRZ 4x" + 13, "xBRZ_old 2x" + 14, "xBRZ_old 3x" + 15, "xBRZ_old 4x" } OptionValue "FogMode"