From ee77a823e5b6faea7325c6c21262b11e6f531344 Mon Sep 17 00:00:00 2001 From: Robert Butora <robert.butora@inaf.it> Date: Thu, 11 Apr 2024 14:01:23 +0300 Subject: [PATCH] adds support for coord-system params (POSSYS BANDSYS TIMESYS) and their defaults from settings-file --- .../vlkb/webapi/FormatResponseFilter.java | 15 ++++++--- .../vlkb/webapi/FormatResponseSettings.java | 24 +++++++++++++-- .../main/java/vlkb/webapi/SearchServlet.java | 12 ++++++-- .../main/java/vlkb/webapi/SearchSettings.java | 29 +++++++++++++++--- java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar | Bin 21965 -> 23078 bytes 5 files changed, 66 insertions(+), 14 deletions(-) diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java index 7515fe0..53eee4a 100644 --- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java +++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseFilter.java @@ -52,9 +52,15 @@ class FormatResponseWrapper extends HttpServletResponseWrapper public class FormatResponseFilter implements Filter { private static final Logger LOGGER = Logger.getLogger("FormatResponseFilter"); - private static final FormatResponseSettings settings = FormatResponseSettings.getInstance("formatresponsefilter.properties"); + private static final FormatResponseSettings settings = FormatResponseSettings.getInstance( + "formatresponsefilter.properties"); final String RESPONSE_ENCODING = "UTF-8"; + final String DEFAULT_RESPONSEFORMAT = settings.defaults.responseFormat; + final String DEFAULT_SKY_SYSTEM = settings.defaults.skySystem; + final String DEFAULT_SPEC_SYSTEM = settings.defaults.specSystem; + final String DEFAULT_TIME_SYSTEM = "MJD_UTC"; // FIXME take from confif file + protected Subsurvey[] dbSubsurveyArr = null; private String reqQueryString; @@ -101,10 +107,9 @@ public class FormatResponseFilter implements Filter // FIXME add invalid param excpetions -> params already parsed in servlet Coord coord = new Coord(); - coord.pos = Pos.parsePos(params); - coord.pos.setSystem(Pos.System.ICRS); - coord.band = Band.parseBand(params); - coord.time = Time.parseTime(params); + coord.pos = Pos.parsePos(params, DEFAULT_SKY_SYSTEM); + coord.band = Band.parseBand(params, DEFAULT_SPEC_SYSTEM); + coord.time = Time.parseTime(params, DEFAULT_TIME_SYSTEM); coord.pol = Pol.parsePol(params); ObsCore[] obsCoreArr = queryObsCore(pubdidArr, diff --git a/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java b/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java index dcebe2a..3c582d8 100644 --- a/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java +++ b/data-discovery/src/main/java/vlkb/webapi/FormatResponseSettings.java @@ -11,6 +11,14 @@ class FormatResponseSettings { private static final Logger LOGGER = Logger.getLogger("FormatResponseSettings"); + public static class DefaultParamValues + { + String responseFormat; + String skySystem; + String specSystem; + boolean showDuration; + } + /* public static class DBConn { @@ -58,6 +66,7 @@ class FormatResponseSettings public DBConn dbConn; public ServiceUrls serviceUrls; + public DefaultParamValues defaults; // will not start without config-file; no reasonable code-defaults can be invented @@ -74,8 +83,9 @@ class FormatResponseSettings DBConn dbConn = loadDBConn(properties); ServiceUrls serviceUrls = loadServiceUrls(properties); + DefaultParamValues defaults = loadDefaults(properties); - return new FormatResponseSettings(dbConn, serviceUrls); + return new FormatResponseSettings(dbConn, serviceUrls, defaults); } else { @@ -92,10 +102,11 @@ class FormatResponseSettings - private FormatResponseSettings(DBConn dbConn, ServiceUrls serviceUrls) + private FormatResponseSettings(DBConn dbConn, ServiceUrls serviceUrls, DefaultParamValues defaults) { this.dbConn = dbConn; this.serviceUrls = serviceUrls; + this.defaults = defaults; } @@ -121,6 +132,15 @@ class FormatResponseSettings return serviceUrls; } + private static DefaultParamValues loadDefaults(Properties properties) + { + DefaultParamValues defaults = new DefaultParamValues(); + defaults.responseFormat = properties.getProperty("default_response_format", "application/fits").strip(); + defaults.skySystem = properties.getProperty("default_sky_system", "ICRS").strip(); + defaults.specSystem = properties.getProperty("default_spec_system", "WAVE_Barycentric").strip(); + defaults.showDuration = "yes".equals(properties.getProperty("show_duration", "no").strip()); + return defaults; + } } diff --git a/data-discovery/src/main/java/vlkb/webapi/SearchServlet.java b/data-discovery/src/main/java/vlkb/webapi/SearchServlet.java index 8bda8da..50b9522 100644 --- a/data-discovery/src/main/java/vlkb/webapi/SearchServlet.java +++ b/data-discovery/src/main/java/vlkb/webapi/SearchServlet.java @@ -24,6 +24,12 @@ public class SearchServlet extends javax.servlet.http.HttpServlet private static final Logger LOGGER = Logger.getLogger("PSearch"); private static final SearchSettings settings = SearchSettings.getInstance("search.properties"); + final String RESPONSE_ENCODING = "utf-8"; + final String DEFAULT_RESPONSEFORMAT = settings.defaults.responseFormat; + final String DEFAULT_SKY_SYSTEM = settings.defaults.skySystem; + final String DEFAULT_SPEC_SYSTEM = settings.defaults.specSystem; + final String DEFAULT_TIME_SYSTEM = "MJD_UTC"; // FIXME take from config file + public void init() throws ServletException { @@ -66,9 +72,9 @@ public class SearchServlet extends javax.servlet.http.HttpServlet // new based on vlkb-volib Coord coord = new Coord(); - coord.pos = Pos.parsePos(params); - coord.band = Band.parseBand(params); - coord.time = Time.parseTime(params); + coord.pos = Pos.parsePos(params, DEFAULT_SKY_SYSTEM); + coord.band = Band.parseBand(params, DEFAULT_SPEC_SYSTEM); + coord.time = Time.parseTime(params, DEFAULT_TIME_SYSTEM); coord.pol = Pol.parsePol(params); /* query Obscore table */ diff --git a/data-discovery/src/main/java/vlkb/webapi/SearchSettings.java b/data-discovery/src/main/java/vlkb/webapi/SearchSettings.java index 0a08c5e..bf8c0ea 100644 --- a/data-discovery/src/main/java/vlkb/webapi/SearchSettings.java +++ b/data-discovery/src/main/java/vlkb/webapi/SearchSettings.java @@ -11,6 +11,15 @@ class SearchSettings { private static final Logger LOGGER = Logger.getLogger("SearchSettings"); + public static class DefaultParamValues + { + String responseFormat; + String skySystem; + String specSystem; + boolean showDuration; + } + + /* public static class DBConn { @@ -30,8 +39,8 @@ class SearchSettings } } */ - public DBConn dbConn; - + public DBConn dbConn; + public DefaultParamValues defaults; // will not start without config-file; no reasonable code-defaults can be invented public static SearchSettings getInstance(String settingsFileName) @@ -46,8 +55,9 @@ class SearchSettings properties.load(ins); DBConn dbConn = loadDBConn(properties); + DefaultParamValues defaults = loadDefaults(properties); - return new SearchSettings(dbConn); + return new SearchSettings(dbConn, defaults); } else { @@ -64,9 +74,10 @@ class SearchSettings - private SearchSettings(DBConn dbConn) + private SearchSettings(DBConn dbConn, DefaultParamValues defaults) { this.dbConn = dbConn; + this.defaults = defaults; } @@ -81,5 +92,15 @@ class SearchSettings return dbConn; } + private static DefaultParamValues loadDefaults(Properties properties) + { + DefaultParamValues defaults = new DefaultParamValues(); + defaults.responseFormat = properties.getProperty("default_response_format", "application/fits").strip(); + defaults.skySystem = properties.getProperty("default_sky_system", "ICRS").strip(); + defaults.specSystem = properties.getProperty("default_spec_system", "WAVE_Barycentric").strip(); + defaults.showDuration = "yes".equals(properties.getProperty("show_duration", "no").strip()); + return defaults; + } + } diff --git a/java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar b/java-libs/lib/vlkb-volib-0.9-SNAPSHOT.jar index 94a329a806bb4c43df0d25c3d36896d6b28ccce4..9ba5160584a847c38f4cae9a2732f69845e30032 100644 GIT binary patch delta 10378 zcmX@RnsM0{M&1B#W)?065HQZ~p2(}hY?R+U(PSnwh<8B_OnuY<QJZBLGg*a<^SdKh zeI^~5%g4ZAEYH9o$uL<VNVHxrIVZ8Wcx?n{jZAp$zj<43MXo)*Y0tLQwdYGG<er>V zqtPjRx^JV3_ohi(Ra73ka9)Xf+xN6L-1^fyuWe2R8oHWGSu%n-I2BtQ3L05t)F;Z! zyrsypbV)h)6uBu=g1lbVUN&RD|NrcptgUj=hu7Ps-P`js{{8RyoAvkG6*C_2tzTu| zVKhbh!^{;8@e6;QyWx`Ktu;;V<|Xr*<)Y^`f0V0UK6xjv_0zAm=BXSDE;(E{!Zd@+ zTkVZ*@<yMWE2ko7>i*s6bM4dw<y+V9-nCq?L21>|-sh86>S|V}sCaG+ytnquIo1`2 zl$fuoi77AHP|#OUpW}0Iy6?Tz%&E4DQoF7ksW-Z!p(EcbyV>eZiOsa#rZcTig_?<b zKi|Z4`c<{mqT*xx&x}I08Fxgr@UAh~D70E6OFx}YRPC~Rj$rXhf#+AUeb%_Pv|oO{ z^qA|#O0)Mojt`|ae)i?M{c5q?i7T>Oey3(HU%vG9#)AjkguiA4L{zetwK|+DyCE{| zS~VB<f{QNo!m~tIxvjaQU><z!U_{oO8F?S97H#j*RZ3ocs8>!WT-9aIouo%mG4An~ zCJ4Rt>o}WSvYjU<z2xr0)N8#>m-{LgzS_fWIHkOcd7D&Ej>(zkg8vm-)30!-m~`wd z%PXkKIdksG8W)bI6`Kv-1>Sg381nwat=2NnS)oi<;)Lfu`d+UZX)S1NB45aSw`X<b zu`f$1=XNY@df`;9YFod#Gg?5^Ew+|jG%Vh*!X<uvr`?y!zi+1GEJ{6KrDydyNOar( zB_BR-Nn0Lal#mplW61XVHXlz3->G}izA{s6|0mR^A9vWFb2lx?V{+-eYxN7#>zBW| zoA@ZV%HJ&J+I-_ek8h{ytG-Ef7&<;{c;mTr&BTaRy2eI!SxbxOsz1IKp_jRwxkG!+ z+nds!Y08UF=1lW2b8S0b{L6Bh-;tuSG^38gd`0d)JsD4a{oZnDNvHMJwX(L%vVpnb zr;e=HwtBz5)s?%~wX3&v8v43zJGju1S%>lJXT!~#9cA48YHZ%gipMQ=s;HNkukM|l z>~19NAL%&9VRwuf$KAV1zvptz_PX=*LRFV}0sr2(q>QYhBYy0KUM};CT>dw8{BvzR zcFCil!#0(@VEv)ex$4OuW3r5rmapxoRdK3ODtDJL*jb?1)6<t;JTXz*XwsYwmu9nG z{66bPs^gZV1#7qOzI<T4M$5C6atn;=nLgMZ&zCp&=&1O8>-MkjruN30e$2k*y=h_W zr`KHF&pk7ie{bF)Z@IAkz!CSY4K+V(QywL^ez?qJ7pL{Wp=gSj%^Qx2D@WAtp6F!z zs9AICz~i7=`^oycyEbi4HQIP`&5!?m+TwcRZp`}&GgS;P`adpyH0iwdl`GX#OkWzl z{<x&RQ~$*Z8EJVxmB{He7Rse7Bje_oe%!JrM6<H$+L0-BQhX0&tewiEx2%2a;NQMy zwqar1{?jchKAF27Vr`whUaM*Ssx{q{p8M8Brk6S0{wyl2Z`FU;@ysJt=KZOUvMVa% z=HAQh=U;xKNvy}y@sxe#w>x`<H1{h{_^THiwSRj3ocbrfYH$8#p7wpxiE9r_XYTl? z+{$M@&pge{?Tt@La;?(UDH3@%BqY04jav)kPTvqd*)p}`$s3PDr_|gpZJZ-|Qf_w7 z5u-4jhV|NS>?HOsjm_`9d2@-#8jm}ZxTIG4oAR2Agswdi_`AjQp!m^N?+w3}b=qHy z@XdJf@5+(+mi>=~>hIPovi~s?UK!V?!*bv7W0wHSrN=8pxJ%6%-g~{g6dLO`=l#qd z(lzl5C&en*U&z^4GyD6j<0ouZ^jptc=)LXy{M@owty9Wv<-r~+_N8cLCD?y1y}{|t zwk+k=D_MEjZAR=#w>~diA=|%{@0gKiWtn;H&c&XRFZM)9m|i*ae5OqO>CbOh{J+_A zO>Egpw>LYV>}{I4q3?)=?T*Kj>z%5^7~?EvbRX>xoVdC^@zUGH?<Ry9J~YtLdUrAQ zTZ_|<e?_tpY8^_i4sMLlOBU?8@F!M#o}{+oTbq;5G}C8n*JkzSUST73ny<+0rRR%< zzslUAC!OY!l&*+BWGy}Ka>X6F!kzV=8@G60%BYVqj(cRXeWGFG@lQtCdwvT(EKZc0 zbLN@O%tF(eDd&q8PM2NBce(Z<*P2t8pGuxS-lF~_b@>zbxHF%E)J1xDCwPSmue{0| z7wV?Cg0a|lh3?W>)>9p=GNbP?yKv4H=$d*nMy+1raOtDakK79@4sSgB(@bM)_VO=B zuGDW#G<Wz_x_IKxlDzYbNe=aYDmw%euErhnJ9aQ*rMXk1%c}{q85@rj)Mch{tv-~! z_(PfJL{av&Q)K<0sV%jyc%0%BvC>)dcgqu%@W-ESTCCX^_sBC|aQ=lW`+l@s2;&kK zJ^k_O+s}$GQWswRdCr6DP1o`}`VSr~u$|W#9qW1bNd25iTO#)yS{|o8`*yx(p|XGJ z?%d}uj@`IXr(J%<FGc+4)n3P~&ReCt>;kXoweGSkSGz3y&G7WsRi7(wAJy!6>-2E( z(YkU@*@eF=)=ZhYw)@t%jUP8^fB#h36J%n0qW)0B<E|GSOM{wE&e>|bpyLGBJi|QK zS;{*X>zG_pRn~e`Q?JM_V!vE#?)SBVq5*G@xL!Y|S8X#_VeY+D72Uvz!W(m*bnMnG z?YR@nm3>9jo{1?-e($Oiiz39TE@f(8p4gST`H|`2zc&m;q@Vv<?Q|hvZ%Aco(9c3= zVdX>THyAbi4?mf&ShaQ9Zm#;(*X<MHmzDmoURQr&Zs5Jvx~I!BS8O(@mzsarsZ~;k zk$vaW*;4b5zFPicmrVWn)jo9#66C{*E25i4MgH>NSy|}vK>nkDL!717|C!m7%hR8; zvnu~<{r@xZRJvi}{_I0Wf%eU%>z-*|@lCuec~;?6^Q;V8);x`%U27JUNd6NI><anB z+^k)t&MU5!9K3kep=Xwfb-AI=6YCWgE1X!cpuU(jx0E&Z$;_v3?#`ZfFe_=xTAuTd zf8BdFJ>X)=vY&^X&z=3Qaj2+6^Uj5sdq&M+wIX`w=Nw<R@YpkM;~Ts_i{B<OUgBNx zWUFN84X29jNt#gt$F{P(u~OPNceV77?V-}UP8u#u$k?8}V$Hv~tBt&FHvU%#xBM5Z z99I8NYns%Kd;2H7|B?DmE^W&D)2xP!JCo~$`4?s+UJtlz@@=l>$8UB?SDgdRg@3Ft zQ+{M1&iFrGs={9E;r^|Xi)<LaYWXmme>&U$!G7H<v3;V=%(KreO6U6RZF_0CsfD3% zfvLuy_3HnlZGQZ={rUg=<o^xq|D$bw#(#aX|7vsnf%?h+P5uAfw*A3w`!oKywBG-> zdFxtE{4cZ8zh%LFxLj)ACv~p6VxgyIpZG<OmY<j^<}l%qYR()1&1%uBUxd0BCGE^A z_$pH<ynNe&=c+n3{fC_wKFn0nGn?jiQt_0n&+g<aV)~b&qAx_9%|EdxOjg>|$}D82 zR(Z)P{h*+R{P+d+e%?%zzc1eN{Zn1f_b_?!%xSD{Z=YS`y80@A)={=)4@?v9dq>pD z9dDm?Nc8fFZNFx=B>opsn^C)bVq!yn_B_|k6Ryrb-nsBurq4Dhrxc%udP1D}Hw2!Q zZ~5h)%x@W`QBi!uyu0nQg{jCl-^a16)8@}V{wXi9@IYmMgYdWW3ytd!w6OJkit$t` zP!Iks5nMOL;<nG_#~JQzhO-afHf$7}^Wd`Qoo3HH(&Z1EcS!R;oLeEYykOey^F`m4 z?k&DpD}DMHN7hvT&<%06N2bP0#t80pircq<N$Mj*TFBCKr?cjSI<7mFc|83p)4G~1 z&k|FMLLFzzg>Z+8DhJkV;oE1PQ9mnD!NL9P|8kid*MdBs>jquTI}nj~K&O1J8sp;C zr#ct9EsB-Wf4@BRyJ4K&fk|H%E~<!(>kwZ)P2{NeRAK$@&=by2^+i|L%wJJczw%Un zz!~NV^V3&x-0)vq)EV_^;irg=r-B!Kie0KDzjTIw(9`6QpD*WoJv9n_ylT(+w>G6A z^_BByi^>;GUSJ-->%Dwdl23hwUp?<%&YF2f^AlL?PTKro+WmFrBD0|Ij>)^6=Bz1t z{XHmT^;0XqBkNcL)+e?;uAUXP`jFhR+9RfK4+dS9ySB_WDC?HURo~!?mb1Re_*(z} zpLmOF>m}2-jMoEqFNvRjRQ;3e?b3+HtoM_P((OLiFP%}t*Z=hQ*UC9!`E_OIo|sx~ zo|pcwrj>2a3FVrpY-fx9XXjkd7q2Xvo?T^{&YpRsFI{`-sZIA{^DmqTZB@$N?Y2%i z&wt0o5am)A`)g+(bQ|eZgxp>)JR#p;-M*76Uq!p#x-R-iD<&%Ux)sOTu<ScozooMO zC+(XX8n~+dRB8Qv<Gj67jihHyvwEF8v3A1M&xh~S`mHK(-H{|#I_ZY**@s<{HJ&|l za=yN9dNJMUXWxs=Bc64EC;rClQQ!`H61k<lH}cMv62ADmf*I4Y4c<(jEot^7O!Z{6 z^a|c<v$lp_{_*x&mhRT5CI8|~;#2<zIGnWqQ^@Ibm`CHm?IVw^ZR#ItyS&*wCt_cF zRgL^@i~79hFLw8H$S8bW>+;%Q`4tuQOFAECJ&`Eo|68VCxVxY6JBRx8^Bc?UPjV*A zvaN8N`p`8j#xX|gy4{RjOutX=<n>>@^~f(dlccWI3QMm%JRLK0%GOym*(X18SSn@7 zK7MSF7kWKl`TSeeS7+}q(s&#fTE9Ho@b9BvK_*_I&(h`gExGnuh2x>*R!4P5miZU2 z-d=8dx1r0tLSz5Bo5#De%`BStT#fw4F*P-4xB03nbH4b6f<~?HE-w7QYc8@+b)my^ z{fu+{61Qtl*YGDT{TA2yZJy%N<=Ylrn{jNud-t3L%cIO@7;T;K*iF<a%kbJt)f)?@ z)i3N^y0+DFPxRUg4(}cxob7SZp+U<+VP=+a_@shrE`c{;y{kN(H^iFm7RU*kZOZa` zLs)KLbS%fTMSn`y7#8d=zG2Jr*VO1%j&@H#tj6`nSCfu9|5N4v`9oEB%DkgjZY_$; z*_hq6Vuiy^r9N-QtBW}6R|xyRtO}L<wYvDn>*a~QHcOvx+qpAOvF25jW!Emh*z>#l zcfY<`#yd6st^;%arR(OevuE!sdy&0-U)gH8xqnmtFmSDy{e4Zq_7#6u@jsMjhV_Cu z7>x6~H#dnmvV*(4$D|FJI6z(AqE-3rlmE*a)$6^zwsqQe%Sy=wOu^A{W`Y+a)D9}R zow;KtGEKmKhSB<nOIw${p7vusi;$ue@BF`k$BOk${nWpxeSb3Nv(0(S=imPP`1#bj zLA_$h!v4fH!qe<_OuYTXu;0r%ZnF5C{<SmAOAS`21$h`}tdFy+-n@JB$qDOY+Tw*< zdN^YRu4JvP-=)fQ-Dk!N^;W09nW^Qc6K7P^?rdpv<jH(tZrG#ayy{^)WBQ56vZoi` z?ohqY%jdQAuk*bQ&e?}~d6m`N438OnVBa9RWp>EM$G>vps*i8TD&1&ayZvg^Yc7kz zC#>w*cSTzouAHAe<A93ut~ac4d(IgoeKp$twu()&x$SKF0`7Y2+$6TmNf|etyAw}s zS}!r1>kr$i*$<;<Rcv^~y60BjyU!WN?|#<|`s1JaTkB+wYR-<jyS+Aw6IQHXOmto6 z-d*&uy5H)8?0bcR$7L=SM>oCx5`3E1erEl{`Qcje_YPWlO8MRBllrq$J?phnv`EdQ zHJ`%%DCHcL3X^E7c9A&qwqD`E#6QuGVlRoWlJ@?x$1*BDH92ODnnRd)nTEbtuaV{_ z?is3gWIv^y=sIuF_ED1gxx^nAxx=x$E*ni({-g0u^@r$}lPe~s7N_s1<5T-kTmMjZ z*I90noHHkF)^gr;O625{b(lSSzRl4e7ez~WKQAiP@i_Bng5ou`%p+}D((-<RwamAJ z`xaVMzcMsgzWqN>SA<VSzwoUu;Yq2>rv%@zX;hjUy{cr3@g2Ly!Yj&))oP~{#NSf2 znNTLVx+uggU6SAYSUn?ZVyjb-X9cIR0)9W{$xBrY>-An=TNjt&lakk@-?6FDV7bz( z2^(~rr|TS!h;jN8l6G{`I@8?kN9t9T1s7fXa8o|j=6jH`k=yJ$#pf;0SDrg<yT7jf zH|GP^Q(A5kMz-sJocwaOPc*9T<5uxAQuCWHyiz&1py0?vg`0PBu1Rd_RlKo@AzQ|i zb6xm-i9-dQ&D_oP-!@%Z5wiVNXyTqThHWCvR<~D~+`Gopc4zm(EmoIyEK)jZ*tnYK z<F>~;#SXjdyKuv}I_;w2-Mf#Tott-+k8}1xQ_;vinRUVQ>KkU=ej9LT-pi7;XZd+f z{|vqudYq@}lV-EvuWh@d?dCcPc>K%kliqQ1Ld4cs>zL#jXZYQ&aqIHd7tXDkdu_s% z14qB=9k)Hxxh++a@o>mKgFS^_AH|o4?EQY_bHw4YwQ1WoC;yCo*5^F!XmOFaUV@ML zo^3C;_}mx!DA@T(DC7s*iWA~>TUItKNqoO6?Z#J5@zdf_Uly#+RhK$&Xr|#>KHY>~ ziPFQbf8}N$7F%grq}Q3T%WSPe%~RI;g<Z>eR&EyI+4FAKH2wQtXH*Ig?TlM=GA(2J z)URtILK;$xCdHfx@yn4`e3WuNx$gt(r8JK&|M$sXw2$>q{O2Tf*k&&0OKJ5QK5oH( zhHgtj{Wt$q_K|Dm{BxrI$M2F)!XjcDRsL?#DdB1pO8Ub5>d&Doip##~bA$(qEPdQ~ zWJ-F_t{Zb!Oi&VutWf*NoMU~>{mhN9Uje;uE9Nh=zR}v&uHkx6I`G4#@-E-|U9yk9 zF(w7g3|z9v>#1Li)-S;{euG{12UfZ)wOzE6V`q<g(7FdR-^{zXzv=nwoA#(F&r(C3 z6<o|E>qaty8T<8|*!V!@9Rt&)|849H3`PQz`Auc(!?VMsk4x6EO$h5SRom1kARWDJ zqwbNlg~@Xoe3OHHJdUbrC>}lHDYj9}NPF$3-AamkmrVaM%X_w2?wots%a?vXmfKwX zrufeLzr25M{lCC(nK@rl*Xh8j<I4+X%$!?!|9j<o<3Eod-!5mIbJ&-+l<9Za+r~u? zB`Pl)&ux@ET<BY`&eg~!tJuPND80CKj=7S6_mXu|tB*OHJRQkA*{yI#wcjPz5)&ma z%gD>KH{QKCXY$4~lDDHy-(qbPwws(PvWYqK{7KPGhwrX@J7Jr(OlzO5)GXC!agEb- z=e<0-I_;S73jdPxrjP87n7p~XQGV@`TbgaBmMuGe{CFCx+=@$AH*Kzue8jiJV)nU$ zo@3iz?~s>edRv)%RAwu;<l$<o=eosDtK1G2XKU`u*6w1qSg|npxT1{Mj{Ra<e`jjP zY-EjUesXEz_lF&Qi-X*jXe2unKS`V3_t--5!jqeKJlF4>H>@ZuRwLQ%|-py)9(5 zYvPjTn0Oa=-%lJ>p5|7D*0ZE0uc`lQ#rA=-al-B#5#MJA^Kv}PypF4X6tFbbV$OJ3 z)>4!d@Jqq<?7aC>;fLg}edK7{@i;(c=C}OxSyOjEvD990)@S*%<I9(;T<_@fe;D{q z)co_B+~t;8^B?YP2;`lA&9JTe_NP^Ac5dnFR%#Sxyx9A|uyI#KzsTnuediTaCA-4< z>N#g}bR2Z~?zEwJS&5If{5q+ylUF{p9Jr`^i1W13=C;y%C#QW%J1AYPnJl(<PHe}< zJ(rAv=TE6L7MxLMJY%wJam1=0k+Pq691)nIKZWP?-HAC*y`<jlTk>$`+|+nJKN0R3 zmp{lP@3H0zw9)1lf4NE_+&wWtugz+Udm(Ei?`f<0q8+D%R!>Y13ASv`lJmKczx9$~ zTa{)pW2G#s<dKf_>1(G;Jyp%KYh&Bu?hyEORUY4hCCQ@tTqc{ebHftq-%jFtCCs$E zylhYPt5lt@fz_Qm_n1%Bo)NtC&!U$$nL1IcO5XG&o|W|TtNT4W@#s6RUvD#*s;8aN zc02jW%=X&0x%KsHcW5RTSiin`w~I~X8Hb?M<()YPKX~!A+D!iOf61N2;eKp8>{p0i zs=rrsZt6X*376JPTDD4DO}MdEEuyGgX~lk)%imO*s=W+KZGU&<te;nW?_pAW!*Yr9 zThdd)UPOtS@visYXBvJude6qJ=?sUT%$llVvBP^k*TN8$MYl?#>a&C`XK(y-+IrSD zZ@*)EW=y^*r0Bgrr2qS=DKD!gFFO-hwdZM5Zneol4Zm6UHtl`#j`#8Lz&|YZS3elv z?5NYbur)P&-G;37Gxk+JjsCJ|;>VnH-v?2pTWSw&x^TSb(4^E|v6{EzG+D2P=(^2( z&-jF!(Kc^;N8sU2mn{9`)b>xYtv_OD^eiC8rNB8ME6qwayi)Z1^cekpIcthit<&yA zn{gNJPB?Z~>E-X3;9Yl(r$1VjdMfPgF>&unb((rw(RT&^cs+P%dH9s>(WNP(6DrR2 zPJe%8$J--U|Ei1sTe|GXo{Sw{i%ZSUb{=}AR$p~5+)wu3G|ywc>sY^ZIvp%=(>+{T zpDN8eeY3-1dDg!BlRumOiF|P3zuMG(E!Q69Jts=+=9$P$;Wt><QX}c`&u4Yy3HP>H zKSctJ^~+5^?|LTlH29-N+#}tM$JU!zSIa)PEmwFpd3(V9&5Unr^R7Hj?MvLmc=m_P z@oh$mcK!MqJ8XX_F|x)zj0!LL^u~M6{xkcnYFg{76>Fw0W;qp{Wc&OuOXe@`sH(hR z1+xzhlR7@8Y$|6yZg=41?5?k=tm2cN><N98vGDHNE58K#G(#Vy23Cm12d|O|+s3{1 zmsNNv*Dq<iFU58x?Ja)Cs_Y!%Cmn8PTyVDQgN392hD&~7jin(6tfnNlM&&lv8cV#{ z!e6#bEyDa@{UnyxD;d=mZx?<OeK6s$-Hn~I5^7mqtKV?oHJGV%HKFvAWel5e?31Zq z%q2E_-uUqXo0?knd$T>q1-@OI|7f1e`&^CnYS#sKH_!ZeZ})aX?mLHq>;3=n)*61Y z`>Pi<xqO4c`QDS!JI;8lNp_n%Z`~Zb*YoZCudjVP#Y%SF9I1bq^=;eMCGTgMB(i;D zNZYPR&j*fbss&QM7Kcw&wyd9|sA6zvec->ohnhW~KN>Mk=RX~8(7F8s%evz7)3)YX z?{+rkuhz*vWV)yA`pY@yA(z_iotzHOK09~rTwR-I|GDZa)&)95Xnj=l*_E}VZo|T@ z3qM=&ec5I<M~drfNy`-1hkY07f3G*|`1=2kx749S5t`9~hKpjjKF`rNl;Z9=Y16wS zCU8^l*YC1wfgX~3R=!)X{+;yG7xg_W+TL?r{Fi@;vxfiv_pLHPg=uR~Us-u-M$udQ z_|V@EyWVWbGHTji!}qJ`-^=ZjPKP$;J^OW#H)3UJ%!;lJckDJZ&c1CMx^U|4=Vk%* zKCDNl)KxOx$ntd;e3)_Ri_Wc|XKdZJf8BhR=U`e)?3s@rHACw=p1o5)fBTfA?bNHS zr@FL$x1HU%eqU^1l(5vT+qdkTy4@ae)HUqgx71xk_<}^SUCa0IEq6lxmY&WGoOX(T zs`C9rp@#S-{!ithJDh$9?yp;T>~&U+fA9XV$N7pMtb<OP{}Fxm`n~+y1M(l#qwao; zN3F|`STAJ)*W77xMP}Dn7#Li+CYRgE*XM={yNlGR<$FI;l6tDTFk{OK&V??Sv$wIV zblP%>ZOO5uiMPr)k|QF@9=}tW_WrNnx9t62wC4rK_kFwZ{;&LB{=X^J>E(>d2M@nI zX=yz9X7&8%JImkQ`T6>5cQ}LI;j02k78f^h^S=AwtJoSG@t{w84vU16)uIl=BWk>- zCj|4<pUg>}yS-weChum0<I+p-EZX$?lAwE&<7#fpvui`!xEmLqTwAqJOZM=p=|xk` zq*5ci9Nf3JE$&*;{_w`U%V(#S22SRAn3K1W`?%+sFIRsSF{u{>Ij`@t`(pfMo8q}B zlWjXr8n`%}x?@sSCYE!3f}6Ka(Pqt<wjB0KSr+~2k3H%Y*CqxWua-!%*r(6bcEtIf z(6SA$ih32d_y`4CtW|C{=GnDnYGCQ<sY#O)-xNejetYZP^`}<$u!Xz(12&15&2J}{ zED<kBnV9_I{uAk>W81P~?ioIjS{rjx*K_0d)YDJz)X8!_F<kYKSvFb2fJf$tQ&5zn zSo@}(Pn)l*6mUM4s<*rHQP3{WI%@vJh9k{t=A0|OpWX9=J^s|)s~<QI-`vZ;d70*` zJ9}PTnLYc^r0aF7I@?Tgv^_<C%;c(WdRTLur<`M3hi7Q<^!rNp3nNoH%&*vfIKSgZ z*<JZ{yH;kTzX?5fA=psI@cx|`!E?F$k}mmeO1i#d=LuQozx-y&^Y*WPQ-AxV#IEq8 zwf9V(o>Nr$uKnTf%U3}@Q~Ati@%*|Kxn0Wo%+az#C;z@U{d@Z|4#POpS7OtB+a2De z{+B<MIQizvl_hq&J7SDAdeyBCwZwXAc3s{v`OJ!4LQllZ-nR3s@%g^vW`J6f`F-b` z&Dya$%RH->uklZ_4w<v)u9D~7(39EH^;2Z@KT5qb<k|OFD6o3vE#Kv8>!e@Jc=YP_ z45oAoBmEdl^$=gdcN;TrPZJT!Kf}2*ZT&7=!z)4&tc7>Nr#H9ozF%pyX4+mwroy_} zJI-ZaD%&O@w|C~V0~gr$I=)#}(5}60@5MJIoP0$gQ?DJY*?D;DeSX8kzMHc=0$(*b zc7~m=cW6tE5I0-ldp7DyZ_m}9TWj?~jpOoXoiKQ{ck?vWIg*oiugeNEv|lWh(^lNx z<$svDE%?2eYRr9!^c9h>uQWJc>0Ob0xof3)^D_zCzTh8o_Qfo$H*I;z{$&qKv{Yr= zhdUYnG`Hm5;(Dyr%W1^YHz}BZS?1J_XAPT;9;{vW(5k-iIOh-UI|{EOZ(YqizWvvv zXX|YgMQ?Q{^|`t35fb1RcsX%m&8Hj1D)TSwpLlV(#aEVe`D!~aM<GF}V3TE@#}$5Q zPOw#Fo^jmQ|0IK$jcV3c)3r`=_t!S$_x@RIvfOsx3;9_}zh#*pa&NyPa`Nu2<Tsyn z{3pA!xob@IoD-UVzg~LH%h+ost9HEIxa=eE+Cy97j?8T+Z4wCmm!$l2+l-`n$1V9c zp5K1MwWpHZO<ewdlIDS#D!QkXUwZC)qPg!2)APo++YO54md*d4(jXahzP{m0hsd!E zJ-g#4?z~vNvcT|?wB#?*=EZv_e(cP!6Rqv)-mfsNEAPKd;{LzCzk7>J&-$eQLGuI8 zQv34Pht6M=ILmtKitDKh60xs8-j(?}v2C|V`zEb-$HI8dW!zl7@<X<YNzL(y|Mn^3 z2fxp|CjUYCtkyl79qHnWvJy+0vSQj_x{57YubC6)dC-ZOFX%s7N7~-WowXj+dAW0y zPrr_ZfuWm|fkB*sfuSs4zaX(FF*mg&wMaiCGdC5oT48Qzbg)dQz(2lf$s0V|Rdvig z&018d9m5u_J0;}9bZ~*g1y$*jQeQVzZ{j&~?!lQzuX}$5KVB7&_nfMz86<lDulzsu z`HO1Prky@CY0;XMR@dLH-@U*7-Q~~MZ~rxC$UAuH!l4VBbJMr&IK0}4OMUYh*>DR% z1D4Vjfiw<($!UtqB^PzJ^6oopY??V^rt7|`-eOZ?R`;2?NNnkvpzRiFaAyVgtUIex zK3y_g<E6LrLV_FTGo=d`*DZ9Ge3kOTDyVA1Hbt*ViW5A<qAvQLTXRPLUiSiaant%Q zuR0d?FWk;pcyCeR?AbhrpPbM!?`@u(dfRl#MqREuYdEJXUOci_jZZxNwn2j<ud~&? z!v@aZS8{aBdFA$Vp^o7ek#uF1x=44KaEX#k?Z!WS+OAU*|J3yK{Q6{>`eRjJV2m<% zo^0}moSzy?KezR<Oya2x-KUwBv--$WW#@I5>rYL+GfAXe$IyDV&0BYt%%04O_~RBv zJb%+86~ni^=HXMHbaeCH&IBfN)0!2Jm22)y2)nPu*f~Gzj>>|2kN5oWJg+LB{i7xE z$%~|WCa$fs%jbBl)zYba|9sMoNo~2VD}UJqC;A)3<ew^-oUnOD(ATopEgzYuGCAL# zR>fRbw^_YD`(MpeUsmhn>7M(G4{kUTw04);9MOGgmpn@j>J@H2AnW}0b$g=!{m@Un z&m?Z0ex$j6<|hTti<jjBvZNi$xA8S>?yU%3KDB#!|1!>vy7?hGdf9x9HlBa%r+hBD zx+dPl-#1{L^pPO{;29Ib=RMh_J(qdgt(d|ScM2Z8nHBnA?WKA<jSJnKYFnM(cHCPe zwbZ%tq<7pc6*HS<rZuMxzVx{t6gYX?bh*kio~hH#O3l~#7{o*ft&0&^<;Jo1^}1Z| zO$WA%wZ?2eotG|g-~9t~-IW8O8`m55$o))<xczO}irp{le_O^)+P3-dhc_1MOC9CE z*lj<xtiWA7r+V|XH7m{sh14&->ayp?6Uq5)GafFRX};vd)<r%gtEb7O7hdaHex>Z0 zuGjp)zSWoiWZAt_EjBv0V*0u0X$5IM?{=;F*;4Cfnqv@S9bO~#Vtv8OyNg<0b3f)X zjh`!(#a$}?>cEzyRsS!`ERw%#Vz+$u?JcL39kdtxHNBDbN|ouQZN}~rfdjHqhwGQH zl|0t#HH;T9p2523s_mJJf5o?4v$ZTOpZ~1#{D<i!Vu!*_w4AeBBo^$P-xK4pbaCu@ zfm+AiS8mAZ?LBa!*x&tTkCMk@g<j_u3d?_=$W66>_d1!ed*0tVoyu=lUoox?S#kQu zuDtw7-%i~x(7N03&b{Pkgv&$cBOBaB7r&QQsy}vorjq>>H<PdIznF!yc>LZxw%Sn5 z^m$eLOJl*c$=g=QXUe{m{3*Z8@;BGYqZ`dHH|A_GxA-I7cC4z|T;2I);{`dpAEFN% zFTB%t{Puf){eHJH)4l!vjnhy3t(-AgVk1|Tlc9=cpNLz=+ygfh-3>n_wmu37x_S7< zrivFELl>0VvoqxjUi{FpabLZMUPtKp>&G=Nt$F18*xG*`tA9rLC%48f@ks8wd<lQQ zG4SLp>T3MY0BgrFfQFtYfAG=*jl@ir_0|W`oBh4znK?m)+Wl;<z|_g*ejf3BCpAI~ zbTontOhODywi%gjH!=$@DCOk~G%zwSdg!HpN?-Sb&qm$TC;c9I>1dtw@%GVU{P?-p zX!4FzLET-(pFijDe$gpy{wu@WWc$Z?2Sb22Ba;X-7Xt_w=XXz*^)~@60-GG-Zx3?9 z<Z1qTVEVYf1(;?EZ~?b85zD|PhXh!Hr6vSOGx>{7o+u)vgD{l?<gthco-=DdF)}dR zWno}Y0a*pbOByH3Ouj0uHd!)|M*-wf&``Sv69a=23j>23R1t_;(s*2MGN+uv<ceU3 z!pR{jSKqNPFzn-GU=RbTfZ`>M-inha2C9Hf0}ZOiF)=V?u`n>mLKT3hC5^dilh>=t z!%g$_a7=m4!oX0($-tlpQUS$F8rd`_D+K9-P1AEzaph-ZU|7b;z@QIR0HT&O8t6^V z53&UZ!ulX-rXKyt=k#PIzX*aj6)~KK?$nE>lSP76!1}C%rJ1^ICr1S9fbBvw<RP^f z$Q}@0(rD~3x!O*0^4?$`u)Z_F(oA-)ll`1zF#;XECIsmR;U$e7UXzVNRKfbALZq3j z{U?`)$b#(!$-}S+jKLtl@c(~?|KtWgvB{@GAoku2k!G3&5|WuL6spB^3B**G92d$D mHU^wt85kJS7#J8d;Knd8ENR>mG`Yb~Yx4F`0k-sDkPHAOrbF}q delta 9258 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 -- GitLab