From b3d1cf6b4bf8e147c2e17dde6e3329174bbc82da Mon Sep 17 00:00:00 2001 From: Phillip Kruger Date: Wed, 22 Jul 2020 08:55:17 +0200 Subject: [PATCH] Change to align UI to Health UI Signed-off-by: Phillip Kruger --- .../images/graphql-ui-screenshot01.png | Bin 0 -> 54385 bytes .../main/asciidoc/microprofile-graphql.adoc | 4 +++ .../deployment/SmallRyeGraphQLConfig.java | 28 +++++------------- .../deployment/SmallRyeGraphQLProcessor.java | 23 +++++++------- .../deployment/SmallRyeGraphQLUIConfig.java | 28 ++++++++++++++++++ .../deployment/ui/CustomConfigTest.java | 2 +- .../graphql/deployment/ui/DisabledTest.java | 2 +- .../deployment/ui/ErroneousConfigTest.java | 2 +- .../deployment/SmallRyeHealthConfig.java | 3 +- 9 files changed, 56 insertions(+), 36 deletions(-) create mode 100644 docs/src/main/asciidoc/images/graphql-ui-screenshot01.png create mode 100644 extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLUIConfig.java diff --git a/docs/src/main/asciidoc/images/graphql-ui-screenshot01.png b/docs/src/main/asciidoc/images/graphql-ui-screenshot01.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8731dde81962eebee07bc77f848afa50bb7bbf GIT binary patch literal 54385 zcmYhi1yoes_dh&@Fbcv*m!yEwjWi6>DcuN2N=Qg|E2VUYNOyNAE#2MS-Sr-y-}?U7 zdzUWOnqe+??mheLPwlUY@)FOV5j}%IAkU>F-zh;L$ej=fVj>g~yrOmbhY|dE`dL!b z9sR_t zp`@TVR$Dp~@)ReBK*6^`?3sS6{bXxA;vmTzM(I!PzsLAJ2Pu*j0*QyA46{+c`ri>M zvY9m&_UrMPFL_-w7ShvqaLfhlou zD(X!sSGgKXrOyAmmZ$bZJh8m(L|9l@xMAC`sn2&)HMLRO(^xr zCu5R5>^)Du<*xmC+AqZ^fwEe&t2(lgS)&!${s|LZ7OfPm1YgmI ztZ#0H7?;4IxliKnxgRym#Z-8ZVRWf))sq!85fRdBVuejsE%F|!kv1&@=(yD0fX7(M zKras-V(KPgph3KyHS4&CRg*OaujsGc`A3W!F^1S!VdWQa^tR~C{E}I*n-=6wIX!OE zm+J@aA}}+dU~I^i4MA^tNlb?Sf5*GJH~X^S9zlH@8X7cI|2+xTrXyU6DW@Q>WE-R% zOCNG%VGY8Z(mY8aOo%sxyznn=<1?g{D_@SHws3;=coVxaLzmwK?C6>HG-zmO<3!KT zQwRdfDoYh#~nX zRa!+8W)Sbyw}f4qT3T%Aq7_+*l=lDk5Wd!g4Yc9VN=izqaAe~*Z{&3cyz@B{^M@e% zevDOR;1nsY+u(VLGQ6LHgJzSp6c-R1sz&|c!}zs&WQJ+#l7%*Ful@_T|95+QX7Tyj z7f!osf7*hWm6Xhel$he&REu^tSFy23=CX}@XAlq|S>4Ob3ltA_>eYHb#I5fDsn>=F_Z=qC!7-^yo> zb6Jh$e#()jd2ardfAG=c<}9E$&S+(2WMou7`xnH!DD3$@$zvkt?pXeKsb160!orI6 z9sc{g@i)xMdX4Uy8XCXGEw&?(iHV65WKE2Xw+}WpcCqx0x{HLK7HEa#kFpP*GK33SswQ5rx`9Z+#$IIkcyaY( zGPgE{1L>dT)h@5Q?VPD3?k|f>_54*@`}0>%@!ACdwYNJbjBM`w@XBLPM7+?d)2*ux$?qv|Mhb5jg}-rperl>g7_k?xWjxQ5VZ4sT z7KH{VUKubth%ZxTd1JMhZQ1Sv#DI(TRZag33~ zMbdpVHpP!1YFpdfblM;5sST2q5%M^gTUqb5X>T9Wepx>Qe!d+MetovMk6 ziH=TkMMXtUPEJ;qaZeZgzhmVQbEG86zrDqK`?awn1w}G$W{(6UIEM3hgjd@~D}+!0 z6OrN_6ah{UjzF&A=VS0rj~syn3h{;^3qxHZqtDj1M+HzZWYhRv&boil@JUZ9`NQDB ztKUkRMi{fk^=@}d?C}}C)8i0@(NtQ`7ZG!**g0~U!J(iGCWF`#`qH(`p%hSxSc5gY zI`M+4@^Ut7$@9mn(?O}x95jO7k8G)%9nz4qok&|96E(H9Fk-~PxR~Wx;Vh*l=VMAf zzS+siNg;CY;`Qtga7gRl86wEu-afs0-b&YL0wH0I&7z}&gM*V(9AzwM1z1>z%s~)uUuNMzS(4E|`M@9y-8}E0-L)eNNWO*cA=eEYNPlbv^dS%tZ!9nIR(~TH zgny74^#Ce>sOiLKi-HdK_YP~Enx^uHP*f5q6~CsYK&FUJh&k`ceg9*!q*p_&H69-s zQ++a)QELqC>GAPJZ11{oaNy?Qe2dri-S<MOga9{f&hd0t*#PAcHK zw!OW*xhat%Wq9_BFV=ugy?AeJ?dHNu1_vhTY#$ zG07gvJ?|%8@@d2x6Kn+G($n$qVG^hb7*Wn5Z;y-kxI4RHI z78Ch_vaAB0V180X`_Zi=pGGVKaO9 zJIQzTwySyen{UIhk$+E2IQEwtznrb|iwp{Y=w{|_#*Uqx>(+lZ;AAd&B6Qcvg5Jh* zipOZ7QKDzXUXAuZJ7hxo*6tNIGbY3r3F#9m@?EnBAL3NAy=g?TZm;HM!;k&Wl;|c6fX}WB+Qf;OSrz4-BrLSp?w0wtBkaPv0JOTgSpW220**#*T zrlw-AFvt`q=^B1gToMvf^`%Wb%zB~mDFk<274+FRG16`Hxr_hyDnCD@Fn;3AdyA#p zh2qPmhm8-O#Qz6l7hcLrypa*TXMX=7n3qDbwUzu2!mp2-^3&NBEsU)l)<(*znsXRG-Ksr=tP zJcUcvphUvhE-D7??CmG-ZVF^+ls7iPue+}@w-9XSMoK?qDryqD39oZG)pK|EZfQA&71-wLGh!Krx}?VSeAJgqblBb*=g*2n zsCC~b8a!p_B`U1@ExwJGH;Cu7JJGt_#$Hju6C2aJE>xmJs8dt?!}51%a_^t?aFGo8 z2Nu>Jn=XW1FW|11TO!b5iz>DR*_`Z#?~+oMEe?lG&&w<9BhzTOEyjY4HQ-41>%PWQ zS_oA?Gc$_{3m4pptpt ziIK5)Ny6cO$m_{$J=&$g8n*HImV8JFK}5#(<={u;lFGQbJH95(47$5+du=?znegWu zIpGUr@5xil-hR-~M%dW4ZhGYRXD|1sqfi<``%VZ0GZuP(F}I)}UFIO!rd*y%9u|Zk zFGR-*VlI|>o)K;&bRdR^sB2|iz+Rhkx!8c3EKw;@`DDhElY0)+S;ht z*_G#hskKiPCHO{`*&X){&Z0D9)e$a|p>yA->-%qKPX_X8DyK;XH4v%Dh4CEofBLq! z#AYq>>r|cN$Lu;{A!}29@Fj>s)6b}FpM+Zet3=xxYXR50_=zg(6y9@DQP$2438JSI zj7i)jYkSEFF=CM7cj6nHo7&pi#2h(U(Xj+76FHUP14AU*{zJXd(V1TNV$}0|Uw#gf zZ;w`NW*2EcrI70B=~77DTd1?YzMxDj{L1tda%UeINg-`2ws^unXsaVHKhVu;gheVC z-Mg+;bP;rYdV9WO?A}xmUT%l?R7P1#Vo=^vG9ZDIvXJjg zjDw47{L7TXa_UHKq9L}kf1Hty?r%Ti;>?UzvI!SK(p#M6-+rj4n}d^0RaI5bp-=*r z58j!XnW?d?XSez_BN}-sp2r>d^y#v+29ZX6qnrEX4g-`YL+g6q_t(pd5)O2!`no^DS#- zDV*!nOh|QbyN!Eg_w|o2LZFE75~KUT_Thbs+vS)R<9Vi5P!M|{1{xz8uV~TU3KkB5 zB-8*V?R>?;NQHEkocl;J({~?)vA(g60H2tc(B*T=mimH-NaP=gNP!M_!z6)Jv{jTm zX=C9Z++1Hrpn$ga^lVpAB2~f}dhzh^!f#G`3*Nsc=`ydH=~?Z<+?vE}A>P&fGPIpp z5}{C)uj-O&N@#M~?2$8&y8ae};uX|)YH5-3&30ad!WSwTz0JOa`=e#ivN0Tn-kU2G zuNw|codxX=7kkr-UXS;G0?>jm$x@@E0cdFX#`)J|AeraKj~{2}7yGl|Z6^r8@=dPi zKL@AyJ@1@9eE9JAaDQI(U<`wETh9%}wRd(#I&CEVa-VDVa66c*8yFbK6b~cfw$`b# z7>{MrB_bnZo^TT~pDa!RJVryy_dq)8`+rAzqhoZWw4~J3cit$dh&#<~uaBF%YDfuj zsDSg@RvT@E4=j8YS>ywuI1E{qgEVzqaBo6@o_7CaNUBLNbm+_)1JZih%HsW!*|CrL;*_({{CsQgjUdXO}UAe zY4w=2^GyNGnMUFjD&_(0t04^Yxl#(<3OcnX5YcNW5VQcdjV5Ft(5-(J*Hfvr@6X&E z&tihEd#I(RMk(#OOJi8GbvQ{FyEpr{z+nTSy(a&9jViT9qdzbT;o zGBie~ny;a$iQt`-l%!Sku$`0k?c29pQOPe`)I~PAna-7ZFFg`uCyKPWZ+HQu7x2!&DqsOT2)wCv7OFz0ntu-eKx)TDhi%e zC=-<}G`zdJ_s1*Z-Cj`3Q<`qcJ`63P4GP2|BYF%Mg=Vn#jf@(3Z1p?wN+hy=T3~Lm z(rR}2-TKfWM7eHqdN@n##i{)2qbAq-w8xL3S1vApi5@bnt&6!cnZJ#`>RYPv+Hrv0 zyp~2z2q-<|@>5o6FvRl98tKt2pS(^e_JBcM1tuUS0cbC4Xcp9 zibfzsV5ejny*iVGm{>J4@$GzfQpok}^_%|=a`F$o;A^TCrmxm|Jw7xz9eUoMPp%L(KDoQQ zW74fZTkFBLv9W;+nQ;JWeK4Hab-db@2e-C90DBME?PZ|mBfomO$h`VkWPudoiRtX- z_ITVy1~#70pFeMn<&EB)?{ZsCDaID*E!zZKU0schjmf7xBp@LOPZsNv@jDCao0^zd zPnT0uQ2hS;7pTt+l$5>(@!;#4e*B1ogEQCQG&nI)ZQL8H+u#`X?b}UBX9u*xqIiH=Hh%(pV%_bY>&%kVJ=%PsoH85(Hj&S z=v-Z4#Oe)>RypclX1Wx}W0DEh6M78y_mB4$SgeYl(>JJK(Z}Gsxivt%gyyxQu-||E^YiC5 zTC6*#abrqKQFCLiB&XBD%A2T8UY>-8CsJLX78`SF+*nXz5jZisR(h6^Ro+>8AH6Fu zB%tBt;=0)ApIBaQ6S`g-m~Wt!Pq84yn<$iu;&VDIzCKqM$*ihW{QL|pQljue{I|ZX z7}ab+ry~W%1OYb6SDX7tLp>_#rx1TwnAUTGPsqP}hKK)-l)uHV$gqxRD4>t#e-6)6 z!Gfdn@@KI#7gyzB$rNnAy7@CQWU)6@71CV1w=&XfrLDBWVHhefKi`(f!Sisr2>o#A zgG42C-99oh;+)D0edF1R*2ZF-@`udnbR$x=Kt4sFK=CyPk=&#_kjbp&pl|5wa~EHS zvi6p%#l{wR-k9GGq>ywS`;tfX+??-Zm6*_=ocH$t+$8^#c`OKKXkc)B`ZoqUN3Ox) zoX!K(DLyfNjr;jdaIvm7cz(S6$tcuYdWyDqxY9tIjfzs%tit_$dIxF&bi&ah?V5p< z1`RE(Z=BN0YirQ}I`8ehl4rrB5|GNsiXN3z~$ih~};KX?jG!NkDu>slfC zt?fdi%kqB*T}*y%?rT=o;mJvS2qhKOY^AwTxvNdCumJ%LkYagx>$R#ZAfGn}UgG29 zo0^(J$o)Tr#xd(3?CkJ<*%|x!^C#G?t)|P3kCuM_B%K0_w8C^STQ(swDd~3BriHKu zS5^2wbme@!5)cv+5*8NLoCvx`QW9~|I4FSm`S~2Vq}Y^{CfikUf5mt2kSW$yIzr?U zITBcnIsxY6wpp+=Hz&lyyU-5{(JGRck{WIr7id>9m4QwJGyst2FR7?8i}RVPPYP** z^EEd5^D#6~xF+K`S%d5Oj+lf*jrk}FWMyRq=UG4tAdp0f)Bo(D7iSfjn7H507Xupum+nO*V=6_-mR>z_Oquc9;#AD^U!6P#=ZQy6X&57ipn3sv9I#7al^-#pj$ z)UDy!aqT-0;@)li`;&4!T|qpB&r6DCbz{I~->t#$uv=CGWQS z;-UT`zjUw>eD&UL??~nsM2xOQxi9V!BYW4=@s+UY?InM#|@@lQ|qcG5HwPvo2=yxYh$6JNiprhpnNE(QLWi!NJG9iosld zW@el2?-b3=&Cm>hx}U$~tu*OR1f5be2t!Ump~da;pkO+__0ON5pkJ`EvOcel&O;w2nz?AZH3uQ5jtwErSz)Q-Z<}bh}_U|Mo?o_4KYI1RoWH zWNUq0wZ>Xk*Lf&-Uz?hpeY87@;&84mDkg^0a*9PkVX*$o?#03U?O2{NM^9&`3AkKv zGJtG$=IT!Klye^1Y`;cCq-A#%YF4xpLGtqQI4#DGj*s(H3nrr9D8JjpBs9;n-uuX= z32^TL@Cdr7>FDwe+5)olwQBP0!J= zLR8v&xgxcO&%-C323Ad2+yRo7L>`RMZvw>=Uf@smJ*tGP2&PAN&rz1!m<0C#*S3@Tc5CGiUn zrs^g;`kh9`2$i$@pFu5ExGSe^cD+!&jk+Em&MIsx(-Hi{5rqNV5+w6jAyyom<*v1_ zX;v>5M-bk1oF^4@M}~-;Cw6trr?P%Z1y?g+#b^FCM?P(LtSX|$=5uDYm1$q1x}pXY z(leOaP#t5cF7t?UDkB0GVrozk1 z;QfoPasvE8+sESp76{ZGN&oj~-I`uxtzhN5vP$%S9s+Pm1<&G$qYU+W8Gq4aQB!7! zxR`$xk^a}x;4d6(w}G_*v>zCpEuqk3wpy!54PS&BU_qcg7Pz?x$V(%71J36$)GQ!} zwQfS-uMsHad0{Cn`K!7Q;PCC{4*3$Q= zs5aZVB0eXR!L*i-zY+a1mdb|)HD3+m$9Ddc$DpBQvNX3Rr-N>ehs_?7#XvsccY7eA z@Q1t&Z@?!L@)$^7uE+&cFir?-^F-`D3F{UXw z$yh_Lz$1!=pe8Gi-J~!5m$oV1|FQrS%5^#iYisZB9pS-MRh(hJ0Uvnkd(?(0w1pn> z?VFvQU2ffj^YA3fIs`^UylbqEA53FrVD8=I1nl8%lJ zP*iDU@mRuu;6?=8lWr@yS;$7+Gm-Yz&=EL>EaathRk3At9k9 z>OnDh3LH;)d3k32=CiZ2U&NsZtzBIbc`86JK@tXBbBoFfAsuWyw-@`^$jd^6_;AV3 zpG%8(A;8=TBNa%zpim|Eue2E7xm@&$h=?fBuCX>V%e97@S!gm+yBeWFz(rTo)UYkFh8=63n=uA zom!p8=E5ZVMz!S&wGzGVt--*OdlwJqkkY5C64>w?Orjsjca5sO8_xn(O0aWKJlJ*~ zQgU7FTdpnpenm%*t;^s$yS0=P?(fxwkUb|TR_x|;G;_OLxYzfbJtL>E-Mk3n;5;6V znzqMBnaI26xSl4PbqWYXeolB-*33h_BQ6`EhvZ-bK6HDXYk;=d&+B$DQapbvM8;{^ zk)MXJ6ePCz2B!m6%2VL9;ro&>_aq&yd}^IN^TW+JJFop;38X+VaWP<5k>RLpP8~-H zxIX81H8X8PIXBx`p)Md5lG+(=l2KEu{z1wIZrduY6w~7h3MIP%fyw#b4oK;z%Ll!C z6r1_8-gxGmWInGv(S`})$r6{MRjx15_RQ4q+pku2e67mgrRT-5p-C)xesQZ8b@AGwz2?({N3O<1G9r2KsDPdd$LHO z4#g!hY}gjBp@=ZwzZ!kl`XX`42Qv-$5GX}|B8R!*R&#S^rcqj|06w$+0J+1)p8(Ur zG&fi0A;+((`lzu65Q^avEOs~dxfsx|T{3rMK>Ds+Th z_jRTU_d`Pww`VSlB`5lU)i_3b+smxRcUObrp|#G}C#guN#X1eK1uBT%Iy7!)SI78K zwE7L69t(w<(Cy;i&uD~NTL1pdpTjp57w=RMD&q0H(`fM|BXqy>i-}S7^z_lt8m_Ic zA6a#Ix79qnh0+UpDX|KB8jxbZ3eEZT>z$a`m%Xc!1va1)`uO+^4-b2KdXjXh7N~{Q zM?*ds7%XpZ^Oz1KtD{4dl$HOr)&ykX2yZhHKzBa1~!s@LGSzqPdms30ki-7f$QUc7i=n1ywwO?M+utX`sL zY01#W!o|hq@U`Thz4U^F zGmXX#DJlDlT^Cx~+JpMFXEk4v6jFHAnK?9)Ckr@o$z1o2iX|eVh=Qtck(b+t1w1`D z>m3e>332aPj^E4f_0P>U=0&w6vu(?yZi*6D-)+Y|Pm3TDw`$6F)!}`_?=7Dfy1V*2 zo|{y2aCU(E0t*WnqNgfAJcild*Jpt@G1WhQzH5%nNhJ5VX@f99b1=2V3~vG`V?>ad zYK)p1FXJD*k;X!Zt(RyU=zEJbxsu~QRdd))ncLeJer>)z;`cfqSp+Aj@Ww@A6|XXd0%0z zl^YQ7guLB0nN6rgF>9o!-=8k$S2nzdP;Kmon@qFM_0Tu5g<4wynm}nRG9l87>&>)K zBF?jl!FOJ?TXYP8Zx|T(fkQGd#{oD_flBe6Eofh0t6!`+?DDul2Pn;`!LgB?+@Ga0 zHa3>?{?5$(v8q16SQBySgH4O&Z(oG_nAeA{1D)tWz4S{lqkB|TU9p+J2P_P?<&%C8(1(&q6-1~-0Z_Fi zJ({DiJ^Sm|tJP|n;ZObu?K4@qnibhmQKQRkLFWPZOgcv=C*{@E#X5B-;E#jeoXZc0 z+wPL;UZ^v++F~sV|TJ-F-s=y4EL{v z`L>0BU?5?X>KJ_f!vyqq_sQ~L?usY{h;XR065*50pRZ_=$PVA2;97D$h`CwzSxv7o>$ydokhxn4WFDgL1 zJ7m=AYOm{6pG!(fJ@H0;`gN>YEQE!Zuo!m<6GB&&`1i|OK0dkBx3Qbo!KwGV$lU$i zeTbqpIOiG9@6wI{^BB9dUDB zxV-ut(&<)cm2}h@w$sw&vPArcr4KV?L(R?+RK|pw8hxCXzO@%tpXQYo(T$tLtwgK8 zNUjSf)Q)j3CEJ6pVgM5JWJ5z3QJIZT0t%8z)c#N+>Xp5O=6QQ@&(~MAh!7~EM=-S0 z|IPSjC4=F`ANALo_&Zx$lDg6{(lN2A@?@n3o=YKgIaxVKZ9{5T&TiOnbQ2|4tbd-Y z$4jkm@=CFcMXkjiw*-MA=zfsMGyxe;wZ_tB4hIP`xY=TcsOZh*WYI7i0tIp_pt8eG z9b_`kI-QSl(o$QTf2`K-^Ep*pEHo+yVfd0qA7H<@Vaz&D;Pki&ns4~TK@@0kbGGL~ z#pO8rPhY{s!<9=E^tkN|17e2C>3A}_@D}yY%L!*PrLzKm*iRl9oTan#`FX|(dQPUI(+ebf2km%F^=cfx*EXA=>qHr7UT{v#g2m z#I-5pQC`1x&U~HgiAns9TQ+OlK?-DpEM}|sH~N!;FkV_%Sv5Hw>ZNX`q@I(V@5CFxKxUA|yIrt!pJ^dL5tJ7suXC4I zkqAaZ*m$|rk}aR@d<88InE(mW#^Uf8`TLWWzNG%>B}&ZswM51meT3e$u?PM?$wf*^ zPQVQW?;xR1Li4(;3H*^m^Lm|xD3+x^zJhmO?f*2CzSAyJlW7TmO2Lu#Ro`7i$QhbJ zO|QPOu^zMjJ^D!}0ma((vJdOV+i=J83}&oNwqr!A0(}YmCJw%Rk*o zn?iv=Km-n`8E5yGAxT`%kr1HLH_9t`&xl9}rFsL&nBC=0_ zul7%UIa+Rmz;JNRwuUot>D3wyujxS22_oE-?nOuxqFgWzK8QmND9_Bog6H+gIx&|e z6a(V{ur{%0kRu?U^YQU9YgKM7{q_SCV=~}RUzrE-Sdq39u$2f230od+b_azXlM@qp zT~5}3!iWHFHa3kc5b4qIndZukWllHx8yvRbMSvH9qQPg@yW33j0v1E6pt|4RWg#N` zRUi^^fTiDX*!<7L_48{>7x5E5lx81MdV$`CjEbtBrxcKSL;o+Jg-5V@y~s@E5B6j= zrZ~V0Fd$q_@Nni^-GAyn`^cEq%z#77+AQwH6X6|4?JBN!a|a?F{sgi6!*vy(V(98; zc_;}2-*0Rl3OFlfDZPMWkO{HsIMoNsGcd*>by@YB5s!F66656FY{n+Cy=I}=3>&c}u+Bot$y zOh86(3&%_e=R!`%`ZD-%02NzkUC^+(Hls8p@vnk1WO44src`3GCZw zn3xf7l(V-SauuDjKu*6}g~Ktrudff(cS0dSM=}jyP|<;&j?z>UZkOG?$`@Ol-mu8{ ztGAqtDaO-1*v$~{7j38|vq!fBy0;(}3B7ajBtG{^H2{OXu5Ov zco1}%_yZpSo>7HgM6`MB}oiAPvB0TK_|0^rTA>xS@dARvPJQ)<@8`r1>UFoa2uNDf6qucR*( zh}nLO;%Zgz$6ec`qQ`#>*8CzgzfUp~G@0)bg9SrW4wtLTAeC(T4y(bUWdS}JtwLI& zLzaVL)h;V52!C(czatteu`x1IR&$TI!75hG-+C26Dio-`Nsp32xUsP|luHg7$|QPz z6Qwv(nR0tETzxf>TjoCevxG+e&SXc$&uf%cL65~W+u8so_uvdXzZiExKJ z6)^q~YwR^!`PJHkp}<~Rv_Y&TY^$&+kHg@)} z?;ZX!^j3eG^c=nnY4{SMsG$*jj{XDqLE$CS&Wym@jUeH{A|jF=yme`*b-zA2m~Q|E zwz86vd@BERt*ud6r(3U^0Mo{I;1Ruic@J8M6AL=n$B)B-I-k`$x#cGeSgGsT(7@7? zFeG9}jxz%N4 zLeeIgKp3BqlXJdp-s(mj``r`5uHj)HQrZgp%ZFK~gD?_7=g}KZ!z^|4x!i}K7rN2X z>)RFhzJ5qK@(&|_|FY3sY~(5gRa=c>K`=;opFuK(h+ixnI^C5hYfkgrY*=Xp+051# zI~IAj$S14isQ?$L+@(#+d`udw3`J^JHydd}CC&nI&|-y?mAUE?6;lIRUol#X(Bo?8O0MSIG85;&x%@CF6Pp;(H= zNBu&;5FMSW<@035CDzh+Z|`v|$aM(U!l23J^nKq$s$!BlE|wf=TX%4uq42&hMl<1{r@bYbSR!GN?{g;a6!lIm4CSK!wF$IXhU+hFC?K>vZXxuNYj3wFYMV=@%<)a` zj6|Bd9Vc6)v1aNf_x*{??$PJfvfAjeF}#<&Adbfhw2m@|Wq4G_FnZ2lLWResJfyU$ zYQDxO$mV>f@&P5r$a-Oq{WCd0Ja^}7J!u%kou}@aReuO77~Jj-TZD*(QjIkAU?!gD zMYuaY{Y+_WCNmy5Qt}U^R3ffsb|Hg z^m8Cf+iwm10HzdyW-6~?I}5~YDBa+2!Go?T-0L;eU1jWCt>{mfQ|5~U5KO@5Xr_{l zXZhXVZ#7kFU~(a9X=w>uvkoPJhklgooE#fKS%xzufRF`TEs$hr*zz+Md{k{H)@w@q z@ng8^llqUlCQ^L+tJ}kt2r{9CVqLy@Br!R|@-Pq^KpCFL>L3`sjt2u-mS?9`V_zjL?DVvV1OU+3g8*-$K|K5B zAgz#_+W6>buooN(%xOk}`zd`dR&-Iw9Uxmf2i9}=yv|#&bBg`_y?XZ}1Tep*9V^IK zFQyS+6Q_PsVTuk9iXeSCR8!K^H9_cOKoDxXm@41|(6iHRb?7RSPP6;g*06O7AF+8M z&ydD?wC$?(e4Rb`se&MTFa2??pU=s6XN*;e z3=V~Wv`ObWU7N-qMRiElRaTB#H=@?lqP@n)>8xG(40pt8Z6lYNa$ib9&2(4~{ zOdCUhTVCvkD13_kFX(nPXrSrXx25jbzqOVrL`D&th??1usf?l>p9PUK0zpz#fukuQUthR66BqvMlae?W&S*yhB8c|E<@6UL+%7ks_!v)v zbg!*)4h=OeJG$tkp} zXE+Ou#(%xGaBr`pHx3)@5GcJrX%&z8h1`Do?j@7N8b9rPpGf5|EK1pcwji}8!Oj>4F4d=sXA>>y)f!4v)n7vF5|YrQgWBf6Op|Tf^@H+yuqeX zJVc{7yDv9R(Cm;93#mG1No9}G*3$BP+^@mFz(DLI>9w9JUmq$nLT@A3_Da+)35G&G zXo9hje_+*((?ddH@)UbG#x(QxdSzTq6cYcW; ze&XiebCaav%+2~Q-uB2yQ(&sJJiqxUg8k~%!W&`uPyh6EUeGf5czJ`dUoC{PA+eR9 zJ~w6w&6j8@yw_j%8V#A!_VeaMv znwyD=)M%op`Q6`sm?~{iNJD{yuMz}iyr6xiY-hH4q1(_Y8?UISAvvjsaj+=VsL8J5 z*cbv=ZgARO*wrpcme&I9b)>pMVf#YDelWA`@z&Jf8+q2VzmM*D@#0&%aOdmIbePy?nA%K6Ul%Sh9KGzBTSaUt2+5TV zUh9X|2tbMaQJ%z%BeQ1|8%<&g28V}bCDB!sSF~JT%ogoVj?xwq_yZoYx3@id`*fwDhQ>7vI1@uH$LRQ;POA#t0|Es2DE=Vzcsr zL+1wBiT#%)Ej*2f=W+iw%`5%YDl$sM4xy>QYB(D@3?8wQq410Ul;CZ``E=Kl->T4F z2;>Eei1(0C1m;~(B!36{AzKJLk_ar{&84eT014+Q3N; zH1LLnsU^jv=>AedpkQbN9To~N2@bAfHvt*1#68NFfcJ7*^Is;}G~Ykm{`^T9z8V=B z)uP>~!4y@emIsd$F$@Lcb!gAfo`R3(auU%>bb-0f=g-jF38+MUB#5ZO8oq=a=#H6H z%{Mq?WN_J&;94xuQ?9Ix7d)%uSIFc4a$)({>=D4m^_tQ@H%FSCS(oft=hSGM(b!Oi zP@zuVzpz_>WDI>xu{Nr4JPZz{sP88AkXfgc^M`dh&$NHNB;&7j*iQ_Azi?UY{Kol- z28{Z>(g|fP-rlTnSpM^MG<%&chNKs;eMapj&?4z#=toVF4MM>v>1nhyn7fPJbP3RT zm@m`>GZR?IK5uRvG~rM%X8AUClUcXPm4^)rT2@`{SX#sMo@4QUSpfC!^|36KJQd)- zBL|8=(A$pq7b|U7T`El8+uMfY`l}UGm6n<*ws?-6?@~}?prD>rDHe=79WIzprTYNO zvdw}WU3r4@;y`qgh~UuYvdrhutzqHvCdrS-3iL@9Xo^;}cp)v2gofjBvl#BpaatyW z48XYFk|zpw939o$Q%Aw1NCh1$C`D`hGNOoiO?l(c_qd3fOEO}ve}iMyDSQ=nc3@RR z=BOx5!cn_yg@a=^KdF=mTAytJ@F4n?Iith`c_->@cfKJzZE;R4#L#Bpm%a^A*oL`X zc{9y<7P5%h_|J~9r`Q(Px5T!wuiY?66!XS`!lAQ}q07h8V68$6<`-({RP}!SBKHPZ z>FitZ>s_g@V6@KRtNHu)@3%81Mdtq~pkU0|FA1+i(F%93f12d7p67K~Y8|o4P|Zrh zG*9&<-&(s#{_r~)5->i?3jX;$T%>ZP6>q%;8a+chcy?BDW|l1E_E>+IA@zPS14=z!oY0LvcCsn-P& z;+azN@?0*EypWLI+i~F;CXg+({R2jVkW4pfRf=`4=L=hS{(pl(V8jvvWknZ(xCZTz zXBvoxB2c`&gRrup{p!d6SZzwSd5*Tm%3ALf1wh}5Tst52fc31fR zV#(q$HVC8gU4n$yStxppw3r7iOXX8zv;L;)-y5^N%OvIJBCD#0t%N@9J+W; z3_jolSVGX(uRyn?i}}X;-mXq3L(y5ah-hhZvcm0>CXDDkHWdY%|99|}e1MoX$!NYHMeguUvo!3iYGuCz&tOpOlbAK0Dbb z@!4;HVe$+==c}o*2}Z4{>FF3_cqTR&d9}P*k3)-NJ`{3)3&OY{_h-&Qe9<6zX;?(T4 z>gkCEjA(|P@=w<+u{6e4+)dTtkEW)mC=(_GIM~G4FvS9Q`Vaqb)9T@PKJL=;LH4aq zie)O(`>5UkAb+v-=6%K*_kFmFos`3rmMlmr!1VkE?6cA7; zX@xB*Al)F{AkvLWN=bKjcc-LucS=il#~JkZzUQp7zCXTa@yA}U+0V1@n0w}$Yp#ik zib9&<)Q?l5vjU=zxjCa_vFz346TD_EBk z?wd*#UL93uIi+s$CSDxQ<>)Dmx zjI}-9CrgMIvy|_{k(_?oSYRms`?)QG8VTx2!w>iFN8h~?8Yp1qRQFDwet<;K624b_ z#RrREb@*wjBp<#SC$nb(pz~Z3nGYY7<6X_aIjn@wRu;vDg^BmHEo(gL>+AQty`!o) zyiHY9Vu0aaSX^9^Z<<%w&$_bEUOw@}1qL@DFjl$xv3&VwELqv%g62}juTPTTN=|lT zGJ@2A$fkqTozLYHXZlr=x{P=Xr@uM%Nt@*od&3wi)p1g?q){$up$?ls^*&IiPB_M` z9`9ZiGA1xK<&aT1(vd%PS+aTi5NOEcGQmH7qF#ksqqC)QmJSK%|LtNCvaC19v=a&>NK}?fLKl52yFP*-8M*Gs*#ZRut z*U5jVC@oV0w43-Y&Et%73Q%oXTeDX2_+D|bqxC&BG!!PuKjS(e?T|nNy0C?r8Gy9D z;i5rTL=cxoc8?7mg?Wjg99qIns;AqQFV`hf<`ZvWmtBAR;A_Z3B$=T`<;j$ax|bhp zyWZbg z>g=qBHO<(byCL^dT*$#(l?}=HWk{>$HX0EMArmz%Deu$J%)jWwpl~Q~OagZ*7}@sP zuRoiTaeqk7U&0vp8D}M~^W|vT=SP|;o~;R}5?nMrm7a0amkX=*4njKj$&H+pS&Hjn zi$UO{_vcS9i+W!_1F%~N2new5-D)o|e`~0w7XRdqtE;P!mWrsQF9e}afBuw_384-a ziVFQV2B$a9Ehqwn;p^vqi{Z4R2nklVAj1xwyO}}obm)vw)XuiJK?xR|H5kH^Tj6{fk1&gkm$(DyCEc-&SKD~x!;!zR=UCs5-RjiRx~;?^3j_CIJf=%On9i>yYRS-o^!8( zCOA6_iQHfi4M~`9j-p{c%i74>H*2mcH-l8LN1`V;{k~Y>zI9D| zd(KHosk1m`}3Q)%izp;|&PT$;x#NB_>d#?bF!ZaU&^fdZbCrPkigVjNnXqRsCb z#yxP-rRwH_rTeP{7H0L|r6b5L`=7HXO7L9gisjBUN=_sq^%pqK-66jubW^)|{pU|o zer<!&v^Ls@=Bl0?piXHc0n)Y^+yYUjBGz zFjGB0%!7y=E=pv}wWB_AHKd5ACFYPmSy))m($Y!>wGb^Wc#VaHB`qx-#(Ec?jJzZ- zY0MQ11qG#y7HOs!<9#ewG`^iLLWmDf!cJLS&2>-D)j2ip{q=V$8W*HBUxTbAun4hK zT(f-E%=4P?aX3|npQ3QlqoH;NuNIet3Y^jnZs1)B9+%WqfalJ~f%G(>oIExD-J*ayQ zU0mTM{nOZP0h@slTsH|SUVC1P=6*SnOe}hxJ8c=qWWf*7x2>-e$?FO#=y?V|I?8nr zjFBY^7P8?`f$zEwaA&bVQv3y;r6V%j%$WsI6B9&yv@$zeZ*&hSH~8z`AltMx!W+@H znNJ0^`=P z!A^3N1_81FsH8HByk2L}gn7?(VkFW(I9SWbsMF^?IAsz<@&omK6 z%6f;K9EQn^O2m7+`*~gDpvRZoe>X$gfsyX0{oHb7=ildoPbEV8`3V(WO>^I975zkhMo z@g?w)+nU=+N_r&U_@;It3pdsWms2SR3u&M(SMl#B=-Xd51iYL}AtO(|bMxzv??H}H zl(bY(?Bb%s_Wpzzg{T&eo87fKWVGsk_eLOU&o726_VGP+&qn+&Bah2{eVNhkx(4Gr zP8Mm7W}GAYMMOk&oNowkXcgnQmD{eLbShd22?_1*nbUTNup?W+p*~+?N636$KG@&T z*)SO#`J;biiPh|YM^8^LcIx-U&AR*Xp?}B0d1vSTPMr;E-q@<;_ z-$xd#EHxpDeh+g?Nc7L=23Q?TxURl5b*xdDYw=mb!#kT7+yGANMT2kW;sM82&3_~O z#{B^?O>SCVVd3#v|J@0K-XCwz&+Myl+*s}BZ?ed)E_Sm2{Bmtdg@|^4?>TJ;@`JU& zfQXoom{z01wj_x^wdqKzr@Kf4_iq5*1g>SiGg^|BDW;_OCS^b^6B0BqF#^jx6|UcU ztK#@&O-e-CV(*t)g)JMR@x}Xj*LJIosob=O5TzcXY-YsAzeS9WvO>PD+h)h5dr7gl zU=4jrL|&fi>C->;$ut*^T$EzKiOdbn_y650xkSYA{=vSu7)Y|aZ zznGdL`V!6d;RYH#B-Cjy(iMk)+{dODCd1%I2GsKm*37TAu9q)#M{7;!jf`mB)aaC| zJ}+&Y_w~IZG|H~4^UWq)*Xq8p>2q>f|91`9e}MV*Ow$tPG)@R9D8N8}>FpAkHrU*B zyc2A|Zn@!8XDKa=X;IZ5>`l~T1h^xAx#qrEPBcpA)^1u^8LULj^%q7zK zIFSo)tX4I5&$}aS8RtNz=^gntiwWA=bW7vN@~>WxC`vIm)IZbJ2EW$X54-qPw8xdI z%$r(UP3wSFXUr!(cSuLW<9WZ{V;-4xH2ZZR@!fUzEFd zt3GYF1*Vn{Y&Br^!W!iw;!Ke3&O3@My_~4xe391>Cf?B2);5ZU;k0WBLpn_NbFSI9 zsJM8_Y35h$A9Gjj`~U5U0SPfbk5>%DW|+ms)8+gKc#H`|cGu5qZf+-5o1CvLPL!mj zi@!JmMt?qD_WC6XrUR$(S{QnBGaq6glm8HlJ6A+d5VWIKM&h%<1&zp{Mh6n&W9-np zQfeA{V*DX#Vc|l^`*uy9VshbX#7*~&gi+Jb6q?248AU0uv$3;c_}9jE?}yez8d`F+Fu)a-1mk@OpWEoN2*W?VZGf~JDPoRhZ1 zQ)3la=*0%BnVFf1nVA~8aVF~OhI(qEhzAEHh7LKo)1Tkes+5!rA?D}SZT83Zzu!~y zdW=^<>2i4EKLe#d-DT2V5{-;T7of zrp9|aujTd$tqli}UB^^OURv3dyN(|!>i*~rICeBNct=g401jO~EK*BnNvXn~mcI50 zEp2pX{b}k2x6|L%O&pZB5l=zU48BvpjzgjG{wvEG5*qH>k9#eFnHd?#Xe)Pj@?g+2xaXvmYo~oV01p@J$HKZ*D`TE1C<9Tt@Q6+x-8uMkXyqm7Q+=9 z9UT}HRPd)eJDTnABY*XG1d04$%TMe(vvVeefoNJmkFXSV;Y!O)d#0l~@Vpq_mjJ@0}^(XH?j`cd8`f@@E zV{5C;&XMVXr$_%NtJuVZk~K$6uHW$QMD*6ybeJ?)k650Kpm)(GBvjwlRu9`&B`x7ZDw8wlj}Q zE7G~ta#Db2Yi(S4@{F2FTbqlHhQ@A(@v!H&20}_jMHG>)_h(pRc7%DSrPO%ZVeeV~ zfxflQ#~GTdrS!&!=(jTGgz|9CwDn2Han>3EED1EL;ond^@dwLt`PcT{z!aFThv?a= zg=fdre7E;D9gc+t_D9O9s;&b@rJ>Q_PwG}Q&`+M=?7I#plD`HzPkc{bpZX`i4TPqK z#=_F-es|5c>tA>b_$$Ah+YxivKc{Ask>yvsD5X)c)WJM zYR1Oif#V&C|C$Ztw(G0qM61y*sp~5&SnV0rJ1cxnPH5SYkzqL*jpy49d3R%A2F}fy zoLbvq_@9|dnP-)R04taFkgum|+l6OilV|EjR@QR^0|VorXABHx3vI#R1kzshsJ=ex*ZalKMV6fZT%7@`# zK*AeTIk(J(M?};#Z(P+VJE?~Lb-}7`Rol6pSNzub@@A{MhPTBxb~fc2 z7l+SAvXrDG6cS;3A|?=$FHyctZ(Mz7UFFyH%=ZEU8|YKPkvERE7%P(O)1i1cEDUE< z@2XHKCr7Eq7i#yRvYwKX()jN^;>y)Cg^=PXQ0yJ3fQLZ>kq2Bo0|WMNIm4pzB}inwnfWEv>9_BeOIhL0x;cBkbsSQEV_=#`^btNV*3q zPJ)66OG`_Aef{ROZU7JmEo?eoWG;I3X>J!?!ANt!s?aQ?4tw+2#rrU4JDTPzGTUuL$gqdrz2+1E%> zFYx`{t4ML92IhiP5AX2#614hoEn%$+lJpG@ioAcHRa%Pq?*k(WSzd(}i1YCB+Hg!k zO(s-7m;cX`H{(qTACDCqj_v@zaPEIU^Aw6Rum0J2ai;4WVSEQk<@SF*FuK36f#TIK z7HeaL|8tc$pZ&ki@a9?FaBUaI(RyQaeL==g!u7=myTMJV7nUz6ehZ4KHJ!A6QRbwb z&$0G*tyCAH&It9^Yl)c>>WnSgP4l5IKAD}qXBJyui zstoXyB`7EcI|8m(d%Lippy&89E#Ba$sgzC&{bg0XXYNT7Df%t@azD&k zb9%eRoxmM`Rc_RP!6>+Y2CnDxg)yPcoq}tpxfGX{v%b$qG{Jnm7ZFjeb*zR=1^*e_xDL0D@E zQAaDg~%>BS%;R(3WeoT53yGKf+LsW{E+U|RjIW_t|b#dZbtamb-7+91~H1q|Wy#&Q=qShves+^piYA7fdFb*$({teKJcyKa-}Nh@OH%8w?x> zf!=@oJk1RI@8mgK$zuw)d3$@0jErPWle4i!cuY)AvW_}w@XsgKk`iNu z$OsBX$V%XjG<%QF1`{6Fq&l~dl8kz{HLKIhKHR!#ALHDDDNKe)O3B(f9hl)3ojTRK zL?tEMr$4c?+#4w~56BF)X2)yVp|#inDoPn#4C-1GY>u|SDqauVEaGAs1I zPf%C6KB}IY`;3+r5bq4ADhFQz|T3@Xk+sI%%3Fwe|qeq2^hX>$vDw``Q$`hTWCfpAq z?S2XHclNyrEF5pCdr*SCscmClBT1c{7K^NxF=ROKGBdViK$X5Irl_-3$!fY(Z71~8 zo~k)VYF<@Yl>$kyN=0aLd;-okuL<+Q#|+MzOtZsscZ7QDm|!$pCDZE}8IoXQE{jVq zkx);58Mg=nO3Q%m9cvEH`O%cnzfX#^$rkhB*?jYq_kZW*9xnzlaV@~T!2Sj&?2{SN zmZRYR&0$$ab=eWaX688JVXDlAyfJdX&LRtbscnC(qSfYTY(&HqPoZn7`>MB|*t{tul*wJ!uinbT`9~=O}DqVk7vE;9WSeYI{iJWX1J}Ew_bwv z1&x)^prFrY#S{)~8Vf6^4Q>x6Do=AQGDE3os9X>6%sDB1$2ax`g}d*d{6QzgWYOv? zJHIrBgyh~j#sDp&3%=0-7y+LSf|$jj@MV4kC5fojoq6NZ z?Fz%A{qC7MUvB$LT9)m5c$`~U5%1r=Roj_wy@G#`kQgaR{FjeB`x#Qjj!j#;(J8x8 z2tIVXnT=bnaoKImHtn`_biN-Ic++AzNBLekPxttz1N*$9jEqdHE&65hsM+I)2%OEy z;&<}$o*o<%%69w9LrnH{2~FJDatCkMq=rXAaS0yPp;lXfJ|GzesO^|ycD^?@RvGU3 zc;GkW#d)dxhW;-CRL6i#r$R+XhdWYRS{r)^ZtVmkI=azhi9w&s%L3bg;*S@l{amq) zMDFIRW=Fp~(Gw}W2^jo64%WE|9zN1GUYKZ3Jnvh`9AS1iK~pWasR_G z{sJ|ZYMx$p?82+e4#?gDf+8Ao*!0S%e}+EsFGT}#1FI8iI0*k%99aIitc?Mgc zIVtLe+jzk8KX(on|{>Rn_QMU?f&U`&^+~kku?y= zZRWIzXm7S!pIVxZ_bLxIYpL4+xa8xv9hDP#(HO2_TKl@64J{K@Y*QY!%JTC2`=z_e zoa{xG+tDv$`U4iSaho|B0C93EAu?+WRMe{mK&-=ovNhUs#yXx+KSFJx4}!sN!Tbh3Ge~ z&bOf7m78v}k98~cE}^i%|8N1c?qgyEP`r=fvi>+-NQvff*qNn8Go(~)8Ev#X7Z8gK zamT@Y{8V*47ar5^pA8WtYE9h+c8B*WKOM*kEY)?VI=w@n5mP*)p|P>~Tq>nIJS0mU z%q1i++qhb6bh=?QZj~)xKEL%dn#5oCAj%a1`~XJHqmifIP6)XRT1H3nO)k+5e+EWI zmfCfHnRL1=*H~=^ga}IHANE2Vr|Q7I>BPY8$6;swrgn;y&mkZvsDA2f*e7y0Ti$W6 zXQOBjNg3ofRKV*CWU<3mxJ%hNkQn_t2XV z(VGNkhWXt+bU*Q(K+ju{)~#| zyvY7{Q0v_Kn&EBKH3MyJh`Aq+Q@l=_(~;!LFD{OGX(aS9^?{S|R9CazAZwrC)WtFyFBzIWg*2 zRp$NH;=oZ*oOq5l?KGaRQMtGGo&>`SxQ-nxEDT1&LoCmpJ=ryVjGld|)xVb>Xm_xz zJ=penmQn*&M5$pW)r*t;^*@_S>toI3cEfaw+9`?rsD(u@E_IJ)Am}E6lurzo(au+! zX+X{_*Lq4M-<;aUmj7KSOQiIWddZS6PbyAy`1GO9YP#d(+>e%nh`!2Bx3QJMa1H>i zlf(7>wG;$Ci_x+10X9rbbTq+mwhAO21Q0MswU_z(OITijEU&E_$>zufMT9tR_XP(P znUj+@#c)=#kBoOlpEotD%6K+e2(`(cJukO8rU{|jI@o#WnPIgyQEA_5&#g+&A{%O9 z5TaU+w?CuCQyuGS7kb;p0!>R;$P@8-PYy9X#W`YKO}}+(x_HUx!oWS(Z>i&tq@iIJ zpC2A`o|DO_B-Ncqk7v&VNh z4}s$n9K^Mg9Du21>0`)9UN)HDa~$exYVzdFD|!Lqt|Mi7?G5~QO-)%C7-EBoYq(Sj z=1MNO;FMDHi;gB7y|FOHYOS3@!73IbkSrl84GJM-k7ObuhjG7-|G0K;dtPmp>n@g> zXRHjIe>UV>4}oXxsa$!p5EZihrRV!J=+T^3Z)Ig$$}FpuMm5MNDCo<}KZE@lm5k4m zNPO3+a=Rrzg`MJlB9s#bpx7KU1mFMSL-v);umvvZA;ZmWN;m$6w!o0>#PV-W2Z7VDR>kJAB zdHUGv^a0LOyQ`!ee5HfU@&2Lav2m6>#nK<5*VgS^EEYOm*f(`2Bq!@>Yx4jAgp1N( zZ9A~{A~G@@4-b!wGF4lXE9bC~IGSM=drAf;GffMi=64G$Y~!M3gH%>5dJ zZsGSr(52!>w5^?;;fV%~-P*j=C6_-jLeOSWd$EcTq+>WvMY)Op23W5lVS(xZ12X~h z)!_ahih0gJ9{-rQ=h(i+&^fu_l@&T3GIAxrdidL=9Gnv)0^;JpBO5ACTje0??ixxl z-aRQcHT_<0xq)c>^UF(?EBwV^LxaV1Og4#snCf)Rqi*gS=z6-kS#l+DcBOO^2<7f! z!lov2wd&ir%cW~m*}?)#Z=inbu4K2{I%@U9(f0Y7T^q=bc*o|JR#coc3CjY$^zAx( zQPw&y1&QS_>M?sEu?R13w8yLlUE7LEct1KaVE$Zobe~~E-FH$lrI>Y&kN@)g^n2_( z2r}_A$S-^6zcR(Xd;5EVDI(dmyf9FsF}=`glj{!J{ow3S$<6!rO`8hUD~{MJmk1xC zqZ25?1dS@==^6(J6hV9~CnICF#2R}fQeSMdfzb1!0^EN4CD({+Xjg9GR?b7OCVs!z zC@zc7#+D?f(|<6Lsa@&|b;|D-y$@$J29r+=1CExXaGH6R-T^tNbNlMy90fM}+Wk2t{T3wTgEq*{>G&3~H#y@%9ons%r zmDi)uBG&3>n|xd4V`7Z~^H8?B`kYoOqy^SY-mAp*k|)Q+sJwae2IOiR>gzKyG7=IE zC=6;8I~4Wzj7|eUi2yF*AmPwla7|GI#+e#BJDZxDSGIaFKWBS*oE)wWvX)7f65Vh- zUhjql4eJK)v{lECSjRw5@3R7iznhya505$zkA$UVSLyWmkBE>M*~-BAbcQ9CvlD(H z{jms(+Gs9(R_(p5iqN6$hANZ3J_g%;LQ6mol%B{4o;MM}z^mO3Ra?$hdl^5q(Lkm`qD zMtk?@$)4qXi+|gm-d_uRzzRrbRoxP9@grjs<&V5`DhV6#EcNq(74otau5NhM?v*qInB*sYw8Pxj+PBNT}k7Q63?0Mv9Wuzr$Q0xf{ zcf1qBMQx4$bk0{%qZjI{zhUQ3^qwf#v_dqIFJw?t**{u)onLu>Jp8%85KF9M-rQM3 z*4NLN%KNOm4mXtEFBIjwF7)_)J8Y+Ci3qDb%{woRv|dV%q$?c25;J>|Vj9Adj~ zw}_AN^@sQH0J+;pwv#uOp+!>>PEW&dm}t`bZ2is2{mL-UbV4fGrP2;xG`7Rp5qAEx zoU}A8cf4=QoYCZ2yPGQWI`=0{uw5l3GLt;KDPqx#PQMG5+;tt58oKCJ%;9=$D_Z_Dnf7RA6zRR~a8n+nX&S_~MS|C;r8T%GKP^NS5dZDepd=0V51ZLZDhg@%ano9T z{VZgpFHSUWT=}XF%nO0JHPNziasXoGTMkOFlt!e-UzwR5N2S+?r^jCWe$gZto@}>@ zRI5JGF`daP6!k2lPZjG-KUKUqd*_I%#;s~%L}-M4Sc0~pA}c9vVfne}1&kUB2T9T#&CF8Zyb%_|!U8_G{d)v}=U~L)eYZ=ObBPXjd{p;ZBE7(u7Ye^63a} zko5O9ns;L>ZBGl)%y$c-2D=$bimArqP@S1 zGd(Cz5}d+GTl^|(DO3?@%lI#xWPd!p5DV|-h>6j2a8!ZX!NI|So15E&`R+sXQ09WdM3wtkq=dzOUkyTHZPOoGnGv(!AnE%c z&Nv|BRTU_$@bpCAIke#V^m{P}>$nF0ToLOPIS{zJ24{A_X8jNTjuW5qv&Fz8CudqujUCoAFeuqS zTv(i{0Pu;Ngex{TfehieNpV<(_B?QWLZGj7sT1K% z%PKGSsUF=64hlj+MXj!?Dx-~X7i&;nGWNR{X(zxd-TG6CGWT_)5B&s|*>j5G zf(R<=T>Z=1YDAHZtw*${Wwe(;`m?(wo%fW>Xj0BE4`e)X3`jfmstqg)3Gi1M=X!N& z`Lwa6a8@%MxYtJ61RxpFF=5`SGiJ;cYvpLFDoyUH_T_=tcgPg(moOdaO%%HRmmix_ z7LngB)|=Y-4)m2x$SN5ESU8i9TYr-W;hB@bQZFF`)zF+p|3eJc_ z^Pbr0!GlmVW-@9v%lR-*v`v*I3cRg91N0DpcvRT8_4GJL+R@;+{oXz1AllsW$Mgz0 zGvA*TG`?@G!({s}6^vA62_%%y`bOP8H4jQRC)ll*mjP2mLD?%WFC|Yhh`r(Ni|(KJ zZ4#h`ay{$N|Ih!Ca^uybR#QNgJ)rv#+fFnZkOSeK#2Yq5K_g{n ze18OAwL3-(ardquCWRO=N8aXWpnJ`!_7Etu<)~DOB7n)FP_BQDwySely?zL?x&Dci z1&6Gk8NYTfMRVmlb*<3@@@ckt!F!xb0t7Q=>*cWUes027X~dLF;0<(hozJf{NnTuV z#fqNuPzPVdtAsD=r@9V6`HqwyC7i(ueF=j^sQcF%x31=JPnV7;5dk3JNmLBEN`!Y+`>O!%&XG%14u>^@V)wWjl%%Y^{vB6I3cu3ALR`kY-0*Pd zogx31^rzi!U=tebi5hGJ5{rS(IQ^q}YHT%8+lV`&Z zREfL8`%_0o!HlBG~nj0VHgQKhD*e&RW(6#&C8Jlt zOn?^Vf6Z-=Xe``bd@LHh9sK5rfQZNvg@?zl)>ePco`DQ`ZjhfF9Uc~b@-QzIsECyZ zYdU^f7=aR1)%r2+9#z$x%;)*iblt&WL1%;5{UaK{Df#m!M2Wq5a5z;v^$nA>v{flH zL_xL{Z2L6?Bv&+91_re`2V2)@HiwOwcnv=c40@%iKA_I|aMQn}N-j>U1|FB)%KExI zl+h|F@gRV*(_AdP-!_HBsJLk)SZ+Vxj6+w-@iwByr~NfPDdnVDLExm`*kn1FMh4L#}(WC0^>k#Lpa~ml$V|o zJZ=#Y5lc3;z9QK24~Pa#e#JRPe`C*qSQGMv<$r4@;&hR?kius7z&?e#BRAcQEdV|W{^ zv=&GM1h{r4LF5N#Yy(l@*X!&!ctufc=c_I*N%ygHI~4QG&ql<%H}<38-uw8D^v|Bn zQ_R#31%1hdTq0-^fezAZ=&ivr9Ocm%podQ%;~~N@I4H;Yv~E-))FVk^%=X~tBEzAX zmn&U}truT0IPS-h+}aDc{0z~16Md1bHqs>8gN@FXzI=xa_iD#2*VVM+Rqh81su|rz z9?AD%_}pGIjgA!>l$nvVC7w6exIwqJ<@{|pz=`W&tg1qKO4jQX;Z@H`W&Id84>g?Q z-+$QxJrjmgMHiVSHN>wqi=4YR``ORNb9K;rQv+M3YcF3U84#0_elykJ?+ib0noXuT zcc|vZWf6MzsOxNc?Q4Ak#Ah;>Rbh6Op}i*QEM_M``vR=G{cH=VMcPL3CfDxqWCs9koTylXqADn9u<`e z6j0>D^&i2F(+;P#$?dX~6v<`fY@5@C((m4d<5{!rFfua2ovnY*V$sN&=&mjm>di&u z&vD~(o35xj87@zkF2RWmc=m*nfg{J`J2&kt&-Vw1r>$0BzEKo5IO@5^kRp;}SIb63 zP6pB5>(^zNwyz@bWAe7gt3XRPJu`EBYz(wQDuD_GJerBe`>kzl1tp6Y6my;OHJi=N zm{u%~L~BbQkJdvB#J*FPbgl6q*hz@9*{scW_a3riu1||iP1>=(RChGF7R!&&kclbx z531bW{YcFItw2cJCRsp{mwY+Xf%p0vg==YfbOg7dd}9c%vi&-0CgT0CwHuRF&vo{9 zJ7^z2P<{L|F_+(jn?|j;tTTwv={@S*PcOkw7Wzefkk9Zj)?Fi}aYx;;zkb zLK$L8`tgpc6r2w@I7835uWX}RQ3!%W4Tq1!-=j(0P3^tDtj!nMR1-tH?K4w;_lTTF z&e#Tfb;FcmF&qvj1Ffx|k-CmmhWmh!1YzCcv{xk897H*tvOM_hvO$;KY4PZ0l~@I< z4t5atFZ&@oqFLjv$6xTMzq^g;vjlwJ6{ewdEfs&X#c8z1JJIQKb@kg z4*M_gA-+-FJ6xLu{`1t-R3wWDNSz-;qcl)H|6peI_lXuM0mWcqk~V%6cg=@}iUx3P zVPWY1@zjfe^>ZT-6+uxpN4iiuCH3Xgj^t9+PIVcAwL5aSH;jtE_EDpgs%5sNHeuaX z$Utajq^c#PI$DaW9ye$Cc2N*Ui{N$DG8Ci9J7_#D z#N9#|m|Uv9ljsb6Wl0nL+qjd}is<6bg`Q#lS?soz1rhLv@$_R^qWOp7YVw1gW#($d za&=2oR9l16j}}7b#HFMjc{O!+{m1e$^;u1}M?*m~{~?ehITYJX{cQMywBhhrnG-v{ zaiT)o_pc(cRxyQ~E5mbEdyLYHDEs?XFUUwBgfEegzi-u4bU8gmjjmyo#F|~ojxLzg z*O|KEl>g_|_OG@NX6ucjJ63bs)&&qgY(azPIcywl7~nl|CT ze{@EZOcWO4|23Prk*umXy#_Z$At9l0qBgIp>Ls)n0~$Eg zg-uL235k4hTtnO-5af52_^zu=kX^g|+>X+(rgm@b(ch1Yv(Y!FPZl5(g5V6=A3^%Z z!rUCFl*3U=Bqyh*(A@|Gw=PPj9p@G=B!$2IYWH9>N)5@>-4mzIuH^Zk|I(;Zk@DXL z>_K6wxSHOuhzN*qG5kS413HI+nJz9WDqD|mhZYj#l$5!uwKaEdm}eL1O5)hy_jaZR zDIpTZ>TN9U>=%%7VhPd5$L92>D0b6PMZT33>z9*#rS}#wU*Rbi8r==U<3XeVp@MPU%zrAX_$d4u;$?!67y zE67UUbdaH~6#BgqP7i)8-P$=zFfTy!HT{&R;yB1-S^u%fVSK&N_l~%z9i2|1Q2+JZ zfd)4jH;(%fH_#GE;`(`Yr%CawoxKPC>^+1pSi3n~4r+sN&2;LS3yy+i1ztOJ^cE56 z1eI|}=@#kseg*O|EUtU^d@j5Znn|KYB6{=a8S2Xt6og`qAqsfXW)Fi!#7F0iq*9ZV zFonaD5s37r?yrgCJ=QEc6Ys5d^+{r*6S}K)Lx_!51-HfYPQuw(e(Nr)RVW08ymGLJ z!J$eH?#bO|EMxi$4>(g$Q&Gtm>H4op0p+@>NvkLBEeDYw?Bmws-6fNWGI1rPtlV7U zM~~)bXGsi{#Klcv`875+uB_-wO7;_R+5+;3-g|L=nwX&PWKTvyf`t{lS$nC%#e<-c z$@FYaih{=l@Boti|EsD9;g5Z=sPkJ>S)s5Jo#aAx96r0T`7p{ zUbzO*Y~+upQGI=5Cp*iK1V8F*p96oxVTy|OY^VPQZr2F<+QzlTnOQ0xVADpsXN zQVmc z&kNt7r@$!(Vt#2!M_s+1s1O-U(B;{#A2bWDt#yKSGn$%7Aj|;O6>Bm`BK^x?#3%k< zWxb31B>vC~w6LEGpQh5=LqIk;<%dDK5SBVgg6Lw=>mOe)a&T*H)o`}0yK_iLOdSlc zd|3J31)DoOiWW``Ot+9AA1r$QeX%H2M!`I_1T8Qz-d&I;eh=gG#IxzY2jB%3DJdy8 zH#bS&(2%Hz2rV5QMFP0Sa2P@`@Bp9L+XLp_>Euu9T#H|2dHJ?=73eE1EiNAX>2H~y zj`iT+;D81i7Co9rWphE^BP2Ko6bJy&*`b9Re$Qtd91|TKSs;Tx zUTTtCzhMApSTgcv^g~QchH}{}X97Tfk_5g3X|D7*;c&(bRCIs&`}YddJy$b6m|{(K zlalN(P}D}Ko>#fZ@u1z)J;5Ct3-liJ^r$fsj;0k94mS__vsxncLEh<*A~W8dHJs=B z^^>t!DJ+36{3>pbG@n}iO+GLNOHn(V9lb;kkBr0=*Vl)pD8X1RfP#TUNfQ*axB>|< zAfSG3+uq)OBnx~Z06O&bsqIeai%q6g#Kj@&`HG8cYIOAYSege~uI(+Oqqmwwf|k^$ zY8e|FR`h&q&@yF#chS;bNj6SaYUG+(qek=zAB%1s?C*yNcyy<3)>3lCj?6W$S-qNl zVRSFC=0HkH5c`$>S9gr`NTw#I_u6Em@GVqD)Me$Wa2DVIZR;# z_1GpY?dU}LrLwpBGin~s(mhT#=5AlP@o}vqFKo!?r%&+b}s>uU~F_W z9SVDAN%?)}QS2ACt-*1F3+x7vY}i4T90V4@DvdU|BSoz3pHZ1u&S$pp$pl;t=GIe< zB?-&5k>39PLKsGX%RELD=qM=Mj7Tv&uX@|2r?=9L_hv}bcp@;cv0JobLFhjs0$K|w zo3%Lk&?>D?c69%{1_z~UVzP!^?_)!p5D2aHva=^asS_F59gYY$|MC3?ae`C*DneJc zb#~&1dL9pO>pVd$`WLjQrlSKcP+LdG8aN*ie*sHKyYk51!2!w~ikvPlfVU5o*UQVg zT(Qu31G@`#I>p81rsX|ybUl52D7(PH$0ugDG=!2WXkNz?zXc%zY+{jd6SOx(7bt%N zr~zIe=>p+80P2Z6(%>`4#>Swk4SLk|3=dzmY=tOb9Q>E}F&xLBWeqhhSe^**)S$a$ zcW&Y?b8B}pOq2!K$HGEQgzeMO9m>H}9khch-&<8x6?*sp z`ft&xiDdl_Q1cz(*NmWc(^%Kzfqx6hxjAqM{NyXO1dM#Sju+mZFE7GxSr=ZFdVv`I zuah26kCr)9B91UZtgV#Ja0W_fItaGW;bc#5%sB9B0$}Fxz?EI=PxV_ng6b>q7)?@R zG@*b<;_ch`q@?-%kf8eX;E9KfCWo`-|H@3PPr-L;li>r#Q)_E0n9s~er#Yxqo425! z%}7Y7NBtM4*0nP_e1%nu7u&6K=;#o+x4&;PS+{$8D|jGCI7iVCojkXW`CuiAq?e{Klf2~BDvZvA_kjmTQE z{m~Yz(e$gBYI_lS7DEgg7xPc+;i#J_Iq8un0v;A_HqodE!5WBsl=o_rLe7uV4((H- z$mg8_dE(2D#zosIbEN;C|Cd2q-7qwdfgypY!FV?Nhfs2-&G?B}s<+A9TBA?R%S#<7 zrOU{;eC_MBIa`owi1q)p_nuKrt!=xgYq?Yu5iEd$fDsX;TIf|lK|nx}UPXGB-a!{p zP?~~(NK<+X0U`9FARt{ph!A>*kc8eL=ML+A_jkViuCI*q=Zrn}=Wrx2n3%Q*m`ePvZS#su;JSTQ*`|j4FTw5!=h1p!k=dHfpW|*GMrxLBE?w@hw|Mud_u`A4F zUs!6S!weTo$0pWReKs1`{iKqdMWPl*+I04Q!vKbs%QoE>J5;W5KURuzqXTypFPecN zBdEh7&_ky)R1$8)-iPpDso@|yUvWyMi*SNSdE=9UKmG{Z6IsOpwaeC)bzr%K@>y0% zTHEO_wactjrle|FU!o{dQmSx?Ls~5GP(9VMqSJgILq53{`@PjZIETV$EQ_ zqf+;Kx94A7htG;OgUQUgb6vpxV=!Y)zqk4I2%FDxn=nlCk;23F7)L zWNx6@t-L?l3l~1R#8H!{FGR*}QfuYz$Z~~&Vk&ZDRnSJg5DY8$=;^C==JZZWZ7o1X zFRm9IWJ`zWvDlSx*!#0yiJ`qOuC)H^*S-2t_Oz{U9W{d`j9KB=oVQ^>%S_HDN@X@piq4{tPUWbPvR4&11{*H=DUR<1wddgunUr3JbZmk?Y zo@r}gAwGtQ5pw7QA6a&!cEMb@#gSDs2$13NH)mq^x)xBhQ(nwMcCJoN^Vp0)l?-pc z?>Fu3W6-Co`@T}H=GhHJVw%tS)I?Ekq=)^?(@$z3yl7sinZwJ&^RAo-hcXiFE7s>L zK6lcH{K9o4icSV*Nh@!xP)i#PukYPVHoytV1TD{=1L{IoNJ&Wy-9<_E?zT2TcJ^*; zqkQ)E_NHQR97}7P;aJ4mx3lHKDiDKH);+mMhlq}Od)ebrt zAp9LeR901iWLl~h7~B<=_I(|I3(|siTTOA59=m+RgaA{DL_0*T6C4LhWK%1zGcrz> z{t6?7FfBJVnn-Ya#H&aadUr_SyY*`lBm^aRR(3W+?kYw5FD(XQZ9P#S@?f`klvhuv zu%xgXZ+D)BC5;MO_NYQ(SQ$TrDlCb?e&gp9v^&LNkjR9~+I6VmpJl>=a%Wpy&4d0X z-V^DirFXof9#~~{KE6_1(3#aU7k$0cA>=&9SN=)L%T=;=g%t4mdXG@ZlZZRFZau5~ zW5kVUk-9S(W7LZ_GAejdUozy?(%!BzR6Sh%USw}vwb~N*NzY9)EIeGRrdkq(%9NwI zn4$|JZoo%vaI@w|-cu6C7AWx}?s$1kd8ah`uQW~bntbrxt64M;Hk(_CMOW?>E2bUG zJ|(icjZT$3?o-~exqPm`U>kxW!H`_(&A5)#EgST4Z}*??qwRo_FWQ^?koV^DpXxPz zU;ogcjvP|jY#m{&k6KrQ(7ScVaj7Du0m>`?_(T2J(W4PB9o()_`q{@2sIIgLvc3D ztgswU65_7#@Ekv$6;o;=JE=%NDLEipF(#a|5+)N=-!h@f^%_5*pgZFt2L50mt5~%+ zhu3)K&CbCwndIXDFwF8&wa>P|fsx^SePf|G<;#(Mwn9vymm`}xVjK#;3~CUQ3fD=) z{=|W@Fc$H(`Mz%OcmY3_rB_QotTC{(KxNRVQeN1*7AT}*@gTwENk_60RylW_?NgCB1n+`J>|N*dY)Go*uuf#&a+Qn`;B zdOVBTeuV}ohMSAaYc4ATc9bX1i{yhf8~!tfEL4N0MFY%Umpx_ z(y(~S@j`K)78fX&A`t?oCCtx%0I5|p7pPhRt$&J0@xXoyy8qy>+4*eMoesym z3=C}f$1M!)hP;Ci1)N91D=BEOM8k1W1q*jS?e}HfmZg?Ph=CMqqYkEkN!c$41LDp) zWSiJ_oVz*QoKw=BZa3gS&CrsA-L$NomQD26FoY1{%Q!Em+2+?_b|hU?oR1-@&I#L0 zP$BPbExJ}sI>R~cc?MSPbiD~$@LIC=JR2&fI{fA|=c5Tqa$7>Zb<*ciLZ7yWbvLyk z#^{9oa`knH0-uPi8PMaZj)p)w@F>7W6j|!Wv_&dhLI7>xK8AiUiY}}nOASR;IMGJ zFF8Sv7v0Yvk6X^7yNKUFA7Rw@J=Ro!k?cCvcn=@kIK{ewvLAB^44`JGZa0#OfcHYx zoy5xWmd+l>K2C=D#7TCZnD9%yj;*5{ZE1oF4s=%?I96Nxz_L~IM0R)8^t1SQ{jB#+ zVwmA)pL%TMUkX}+-LSMa4?~ue`2gqJhp3%{)=hjqyME28uIx})7q&B&)09|^u(Fy? z^-{2E%8!v(hZB|dMQ*RLy?d=%MCupWQb61(Vclg<(WN;n&|1z0?LMHlVwN-QU z=-#S4cD4X5)8i+v)yU+;&(;*nLUu$Ad{S&Z6Vpsk<|sRK4%!C4;lPSmx=(%OR%&I` zB)6vja!*FZX(2On!}r&1^5|+GUm*^e+=AUiwSis?Z=$ew`_A3q7^S+DVSjOipKlve zPczZDrFY|KlAkEPk+gQ%Ui5=cr7gZ=mDyX0-hJi4lYlMb@dp3P^iaZ3WY@wb6ZE2{ zO(n=k8lORGrbt{otC()BEz>>H=#}I*t&WQJ*C&1aS~qzbE4H`G*kkC4Ein-e{4(+p zfi4%ejK5*=;ipr$?Wv8G2jb*rChsF1Q+Dkroy*88_oU+e=Yxzgh%!M?0__TP=lLNd z9mi&d-Ffcj*D_ShjjtJ;9jzX|taPm3^gX?MQLgNeD^~o7cVP9@#NegnA7`>AXS#nD z_AU#BMfK<&iFvI$5wCj@dCioKuUT}Ab>*j^_itwqYD0?Q8RdtM9P;ugEwLKBI6HG4 z@y&=?XmWDe|Js~#)lj>v!K&UxNrOFQqrb%F7;c-~WtkdIq+v3`#c+!xx=a+(YW3z`*lqe%+WW?D(@P)* zO4{>AaeTy`4{0(%g)IyoLUvi`5i`4{Um_ZOS4G&-#~!M^$?p0!H(xm!%Kh3YqW!W@ zKAux}R+Shlt;lB}b;>*Z8vearR9;_3G!^2rN-LNhq+u#%VWucfc`VEq9`BJ z!+iWO;?7)b5u^(RL#;S_loS?$%sbc*D?}0D-`W)Qy;E zs;Id+i`CGMYHdZOv=_adSwk7an?<2j#r#M*sAXY9Zxse21&;LXw} z<_D~e?kAcE8LHV3(q3nY=%u)~NSE}rW6~cqg*QH__PNBA@F;3Zy7X|fs`oL(&+;7k zF(x{1r*S%2d#B#TVV}9dsn3QZY!T$DZz%BN(dr!L_iNFe?Z{(cX5@X(%f?lQ!`+nJ zUE(-4doC6$(k zJxXeEEfgIsW1ZF<95HhevIh(K4=lTDk$*-uRTIW12sb3M*EF*1y4*rzq;&7sAMwkH zi53wWA2A(XC`n7snrMDYrSxzOVP!V0d6V4C?uo4TnGYxSaWWd5t5CGTk51s`2Z-S` zWli=P<;}Qf7wY61nOdHZL{0fE@+FTk!p|w|r;3U5=DlbB zukPtcftw@sRL20u+vtwza<(9Ih|lz{(%rk17~6UDZCf3C9Gh7D%FxUr`~q7mMXHm7 z0&@u^hIrw}mV*oFh_AP0s8*HpK3>7s(GG1sokxlpD{rl^@sMDUjS%w}7i@1hxDxjU znQ?*=QmZ-rB>#&&gY0oHk256F2bPDj3oES~Z{^UL3LX{l>Pm>BcoumH3 zA28o~vE(^o^MV~SH*z7oVhh=G@W_eQMBjkmLH&bbJ;X%I>+~76epjtLyc`mTgq+szqvPMvvm$m=QSm#vhcO=#{6=sA)XZn%hjmfAP6>6P z;one-j0mKB(2jB8vnPN+T=XOm?irD?)K?-Tpgeckc^$Ld-UTNON|5^oG-!c3xp?iG6s@v3V(#PA08@ zH;(fK9aB}@pAw$4V~K^Y$gb4$iizJ?)QL4gSI}k43_tT2>6v;bHWnj|c1TNYy)Xhi zzRcD1LT7W@PnH z>9N-EPl<-l5NK0dl-3nCZZb}Aj2Mmc?5CA)Auj&oozI6}hAQCe1^)frynW!kt4O-y z;^KdXo}~-)a194O(!Je}MgQh~DIGRGJ)uEsD>O}QZISCp%WffJ$)VuM9=z>95p+9t z&(#yx&%T!Ql~swq|5liCx{<^SYD4NWJ6k<1{*hW}kIgj1$yTm!qqoine430L?BkD4_2IgN~bN(=S_?F@ipR8*w+ zk|?KtcI2?d)fT(fQdPLL%_Bb}3^vNmY0eY;zd^A?uCE4M;UBaoePd#?9U}V)Su?Wvo z^IaR*?7U7mC_8soAjH#uWn*mYR2CmnyVBH?Q2r1j!yHQXNba+ZehpoEo93);m7A${ zfVq+Xc0m1;w{zZW^Xs&k7?-~6^y`EDDP z`?xsa$3LiL1CL8Y7v=cfsXBOsR!@(y@H0(4hxh4{o$0}o4rGgvcZdHbCP^Lre)!}t zD0Xy4(8G$+D@lbY(j{PxRPIStI!|_O;)QMZ+?LdBY_`L`vEcUft6lc^ml=3Ae8KeZ z?}H`1X-M5^kr$_vY@+9J7_-(Hca$sTy07qGoJ=V2t239EZ~Sf7+XmAQ`(aOyQawGe zBj_0gQ_dZ-cEnl#0|l%DgkGU%PVoR`}WC7zr02)ri0id6i@9X!MC;p1S@eMV-d%FcT|@!*`W?Mc=?AHYI5IJEeEFn$IO z{2i^W)G|RoZ(33IT1?%1TwAX)XE@V4-Wxo4@Hhc$DL}uwn@cHAetHCg@JI#2%IJF2 zQw+g$V*{^W;N!4wOUN%KG!jnxJ(x_wX%|}x=-+>zJb1IE#CGv8Pl>3l@pbB8oqOUt zw>5O%@v(gw554EfEym1@K+d`ivmoh)h74zCWB4^N+C1lC8S@Ck&lJ;6$!L?D-hqC< z58Mn8Rx=)TFwmd#TJ+S^;>q%*VJ)kOPX9BrQRN;4nyV2L!~M? z3~fLyo!VK7>$BbSTthSRn>TUhfh|y_1oyo3(|p^-WqwY({vCHiLq8Q2VvLbL2?z^k zACzTget&%B1Z_@^W)8o8t8VGcToT4WY^Qs#UlRzl*&^u#H7QiB;cIYQTFn(?|K%Jq%#f(N_W&}+rCt)0R} zQuyAL3s+oVWK=b+C^lxs&gFH@|x>T@91jl>pgo_hgJ9dyq>NGA-@^8 zT4U979LS`#f4_ulfP|u4m2{qp_IS|C>qo`icW-!uq#~-K0++!SK1*(0b{yOe_i$Ek zVQ6b6raG#d)-|BS>(_kB{n2>_V#g5k^R|qwNo6+c)j{8ldbN@Bn*nGq$bE56z!Ar)L=+utJ zG_*m1v-a?x;|ko_ijrSC7370`?c-r0Bqtcnsm%1850wTkBY^=DN2A2zK z=$;G@d>r`M!{9vIhg@H8qZtxyvnTKL_i_3$%A_{bBse}*n;NwWj1dryn$YF<;k|lK z*^s3I&$;gF8~{-ruYsh^b$ZU7kIhmT4^sTIgzothysvLeoPS$=k=3{|W=Tk_$Uj+j zn=_XU1dw5raCO&km0SJn4b4e&g=rhcnoQ99DP>y1uzf<4gnMf_gUpHtS6<^IM>B5O z!?b5_c--oHZTjQp?qSJpRm~zykCM0#A*zLRp&L8?R4CxIO2f32O_!{NHU#f*{^ff9 zM_B@S&kG>5$7u!8$xI~bWVoN`6+hH8-TdQMDN@qc4Xc{xx}Er=&(nf+YjmfYKLFR- zBYwn4tIW{!D`GRF%GRr|BKYF0aQ z{ucy0Z2g5Nnhsfq4!){6oNn)*VU4qCPZ;Y2tk?u*c~OBPw?nk+8aY^|M3D*9kp#!9uLG4NL%t@^fIu49@Cus@QAU*Y}!zK;?*W!6pk8Ei9aq~Lvl8GnBM-?NQ(0g zF%|=NXzh;6>lN)Q!)E=Q8Slmo<;yA71g)Q!V1GepC>UsderxXo@8XqPrK84 zdxGKole;zNx;e$goW^eeFjm)CrkPpvL$s{4H?*|U&F#ABz?{ZYv(3h}dqyQo^PdkL zY6`qrl8g1$_md*89t-0v!-jwMbIDX6SY6Y~<;dYDm}x6;!=ym}nYNSY^P>6V-=DL?*$i_k|Yx-F~n-4_z@rtP8>Q{GAg=NK_-dv$5r8Kv`3HR_b!jT4bYra~=Vmvv^8q<#r1CA(z4>p1u&+JM zD=lp(Mg4}aq>z`vdBWv$J?aq|1&$|W&X^f2cm1Z&@Z4ed;?Q!|b~#;g>Vl@$W`DVQ z#XHv@`nn%`MUNql-5A4o(V|d+^)5M#`Qs1kbtnn*k)+Sd%QY@r6SJN-75U6rV?~M= zCZYoQv(?i)MH?#hF+-YZJ?20g_>d4)w%Nf>W`6V`$%60dNg05z>oyC!bWi>A|6b3c z7g@7Aq1ODWyJp8@t3>B^N3|_s=*Me%?l4wKF0|pOZkdVkR6Di2Ma3b*(^oNG?okcI zfyAR}G3^#f`W}eBtuCi1xalIzFbY7@r5&E#ozCu3nr>^z zaiDvewUQcI)zL%~KqD%@)V>$XL@sup0a`e#aD3XCf7=^i0nTB%Vf*c?qXXgG^=}*k z$xpCSYJ=>bv)X%nl|9njjyb5^-%=jBOuX|vD(g);-&-=ea%j)7DpHC~ z>qCr9)!lBX3z3--?TT_XS zv3YVNNpSmNmg{X^zx#uGZVg|XbgKeY2ZfJykr`wxZQ}>CU8E~hJuz;<2UBV!%N)N~ z8_56)L)ovQobT)QUfzkNwtt=wPVOVkG`nfw4E!FT9$00&Z?T&#w*)c>_Rb7S*ht_R zuV>H4)S2AXa6u1gzmJY)IOCF&adz0mys)gaR74n5mTuk@SXom3<)JQ#vgmd zzAJsHS$?yt3y3+e0!A+U#brKo@n7D@-f~E;DO1qx15c;v{*sbDcJiu&?PNCQVW(=5 zm%( z*zriO*b*|UkuEF01dS+JxdW``@$fCpQ9G+%aa_-T(~$iW@*k3t+^HEBREU=~0!50C zA@a>;JETSV67x>yY1C>s5cdUuQb6U4~>ll)dwjSoW{jPk%%A1Z+iM-`E&Nc3C7j&;881 zikvx*#ckd1{K)kijFTj~C$QS(`r)-Tg3~;@8a{td{WeaJeq%U8ZY1r|4dVsl5Xax-C zUQ2R&_(1OUw#M&By1z+R<`Jp)@6hSL#B#>J7IXU*Dw3|ime{r|mmXUdSp+G)#Kc7K zq4laVL`@+jh*|%wkur(ndFsCCEJXR{e}gan31j^4?}isIBIynX+&0|L2M(Ngt44(Y z`>Dx&)Z+``>F8hD>5H4^=fS#^ga<3V%_tPjLRM|vj8Bxg8_J< zP%B|?qED8{+^(ZR`6}vkujxo(-OyRlY+cl0>9+Um7@!TTnQq(P?x{^S=|^unr>IkS zFwf)QnomtyrZ|8`fWiJIevl5EZ&hcnf)w@wA6aUH_8HUl-CofyGTrQ#7Csx=kbJSOTw0h_+EGzzpMONl z*{&9?T2YL`k}+9#l zrCj5}Q#IfzHQBh!gOKlo2X899$nV>xfbR=*Tp+Lg`0>D#nYP$qF;2rv9`S9=ti=pf z+Mba5LNjM|WyQtOu@k>)Eyy|HsG63VDk3fpY0)N1u6*sS)^7(UEy`+bh2rjCF6^@v zV1kr+692II^NQf4!hN6)=JWsjeeu*u1oGOy<&cBkfr+(^4fj8BKI*^RTK>!P{Ok8P zaB*_FLzm9Rh8@p3*;yDAHx6v1HT=$tF4Nj}0~QnS!&nmPWK4Ws`t?}Z%%~;3=^6H3SK@EWFt>@^I$G0Y3Z5aGlHyZ&$ zyYJ}u3L>Y}iAl!5d0dsCW22n7I1X0HBH}3FE&9ay9~N8T(v1!}_>sqCY(tw&(BIOX zJSmq_YD8IFG;=^_8`KuE)Uud<(gK$}Qgz_FbHI^}&CO#7F0JfLERHfatqzvEF~|tm zb!7rKnJ^%VxYK?4Aps{j`q;q%=tdv?(URWldh2xO^*J&XAK$vg!OR>7GxzLlEI>S9 zRl_E1u6~Ht9cY|bBTs<(CVT&J4Mj`8=bhc_dNURg@u|*GNlART+8~bXd!zU3*V|Gq z316Nye|{aAl2Y_z)&-)yPuf&(y{6{<8~uyDJNDE}tgIBQfCB0YL*5cBHUTaBktujN z<@#!?4&s}$Y#?=%B9-y=IE=2HvGJ(1D7Z|*eS5=wL;cLg=(dCZ#vab1Bhfp1{Y$KL zhxg)(uWAF_f=p?#m6ba-!l!gma++nIM$y$8RRAL6wZKl&e&{pGz2@uED{dYJrMv#p zh;I=uoU5v;ChYdl?O(dEn!cxBv$*l<5kqi&uO?b8D?T9sNyin%b*Z#DjOCR~kS~;I zi^X3Wo=<9OZ_hHwd6|%4XJs|3dUN_a4(sIT7#2*}XwSS3h#7oE^XyNM*!vzxIr~T= zU_C#Z9$l^4I-ad2$dj(o$j}zIM(k704rg26OC_bl?7!JkIgFP_8dP*j3y!AH`o~|d z0ER=gD(%r6MlJ`V>EKu6yFR}CZZn!3sfK8&0JTRQ&HKT|NaCaae7?X1ib*_ht9Q_x zWqCmt9MhDfe&%0S%o5Jh4B%41Jp;rJbQVv~?e94Uo-GyrEw`q=qmOc92VMmIWmWYz z?;fQ<9*N$ybSKDDj&zUGH1yy(cl@yDQQB9{^xUkHZmnAdYH6>{K2ZKlWA@WPGkKrp%;2 zlr{1I!Nu|MMYek;=C)dk;1?P%HOUNCI*4yTtjgOnF#xug z|J@qn4ryGCgDT=%=6WLw91Fd0m3_{$w1VHLY-+H?kZt8Y^w=q0Ttg^%{@3DZzv^l> zzXg@J-s>^s{Tch?j);<{1>i<}2*2IJjui)No-$-YfC$;CoPwmIELEi*I#yO$bjhWq zra(FL^^)eW`|K+}w&BQ@Yk;|ur_}gWHc*d;0r9P)(0_LcPXaaWshLj+C_O>8Ycq#{ z1=Z#-^x3XAgfw1~2juw#pgpKV!2~4?=L{$8ZUrAD?M&BEp!RZ$7sqfVd4u`JN**4A zR?KL0I2>tkJyeUC>;0aEJWsqhU z`-QU+_#j8ae2GQ!GJW8`2J&i>BBieb0s>-UEPCFIaB2JwIxI*!>5e^&M$7wO?F29~ zk8BA2aOZBGZk5VEt`BAiqFPQ*mA6}*u)lHOnrdrOO{OY|*c)9Dms6Av(kYl83sdu# z$Uo8&Ma5?;tfbrG*)j9BtFf_+shGk@h*4*YAb8a6*zz386yJWHlJ2WWRU3Ers&a;4db`^bVi>^e?67PBJO!B`MfzRJ{p(@ddkge7ym4z#wr{Yr z9WRElIff8xT&>>AQTo@Y=SuAhw0i_PyrVOv5prP74BT4TzpmXFgTT+~JpC+*WP@@T ze!GEv*#`BWMt-{np>rB(jms3iA-Q^EZQ*T-Ob|#8LGBTVRrt#{`ufU%=h%~dm>O}) zouDv)(UNjRRr`AJ=zjJgBr%7`nLK=JJeb5Bo+QG-MhUK;`G?%|3LtcZ%GC-fJ`t_&8vnL8I1X#+!pFUUz!S8` z^KiLlfo*!l3acO|SnS&J-ki7J#V;HC1unVD*wlCP8@N2@N||g;bkw|8hcwz?Q2L{c zj>`J|qU(`jb*Q3P>K}Yd*|nd!gdURqcbj$r^`YvNu@cgJH@OT1i~4YV3Q?UVQq}LH zb_rTZhT=i~)>=E}Q9}<6tD^s1a8@JvRWd3fVr+h%2W<%K{Eil!Jj_k+k|vKqTy`V2 z)x5CNQXuxeU$sx%AtIk&do}+4YMnB~MiBC;l?5fl2fy25i`%kHggva= zVLSa7!*3yfv{s99)H9hoe^qJ7=x@M@K=I{W%)(>mu4NphY;k0dUF{g+4%D+%B9Gu8 zhrXZFedZnZNRsm5|7=ANj=FX?W+6avtI#{TV-|(hZI#>nL6}d_OS@)LQRx+^U-^Eu z;rl}%kOkxfx|2j7_bv4-y}ALhJnF2rl5Y69bp?zr4WE8%x!Zn--5khSJ*3#P*1}Si zjI1~P4izAF{LC2#lFA*v2NIKv`NMx$VII|xv*lK^!5WWgZ%z-~S&LPRqdN>JrectB zt8lZ;92w=K@E#7_@`MoYuFZHhW|dAxq~EjbPy>@w*mq7MTfirex&~f~7cTp!(9lU{b8LLk3jp>!wE%ozt3N5%x zdoz{ZaxWgmCC2dON@6^J^(Cax@`c=wCzg`2x`$?Qd3~Mq07SqT&rper1=6_2(D~~- z8CH?0s~@EILacfUtlPFaj{7abjM<9aDleWGqX{?{VY@Xwp&d@O(%s@|vdbT_evqzN_y0|~<`~=4_OFFs0Swn&XTP~vNZzZmlehGU%$p1CPx}kqfqkoFWJro^D~$eze|;U zA7XDUoO%Etp=4=>QW|GrSVtj|lhYORz{Uq(mDO2MrfyHt;DadAeyEzea6yjod;z(+M3yYmMXkF~!$lZbIWT5NBL zKd+|tv|+12gmh;%ZAH@g_gwn*k3axS&JAenT@|9A{#CAyd9Q>r@b1{^l1b~-3BHkK z(Vi&gTCU?VE=PkGw$>)2-lD_E9%FhWzYXV z8!i}2&no0K)Lp`B<^IzkycBp~HL1^czLic09Ia`_10EX1(#LKn>F zhKNy26!H?KP%8{S&$)>G$w4gm?*loKy%txYAVGzKn4Xpa-a0tN0yMh$BW2Pt=p8tK zgL@YcdSEHa=pG!aHK$Bi~;}JNz$H6rg&BtF$37^iMh>Zs%637t2f4i zfBg6X8dBOvraF@Rp*|W4tM1Cl=>~VFD_3|dCKtH@FOZr#I4mq$N+tHj-HdJ;CV}r_ zJV+2T+1=YFwP-?p`jO*jFCf3SwCI6~5L7M!pdJ&W70kd3(i|-+lzr?M78hyu$#Pe` z8)=B;>{;y;xzLG;2@a)bh)jN>^t7bh*`dyPXo&1UGW1KyW<3y=WIR*%iRGJNE${x0p8ghN>BZUF(kRP|4Had>^;i^kJB2FI#U^s=!1 z02N}wsZ3GrG879^N*cMMRN_S(=YJId8*6=SP1ER2sT)D}(*r6*2$VE(no$|ozorLc zL>`7{2+vS6> z(tG9;$D~8euG_@-x1i?$1RQYj45W3W}dpV5uc8cwgMs6eC9ZURWibhzSs z>1tonFhlHTZebxy1)3=!m}2C++Ox8<0-6F`QT@esdV~b%ZUQcDZd1#f6DFS?XhZk% z_4QqH^zo_u^a&ByHsw?nW9XITq($`!gAw$!6pE7s{g9;}xJjonwXBuan;l@i+1A#E z(k@7L$}T9lzWEXu&!B-sk*f&D?cJID)B}0~iN0%nrV)kUaO2_v-=;~)v#&SF;*>-| z-;OV)1Ux)_a&vOLiDe*gGUd0siq+$CiTyfNE6ka&@y%4V9*LHKxTC3~u#GfbHm)#e+s^^2Jzy zgHDgE4Llf1j~FN`gdU-yqM20gM(78dAdqp}rqt;{bv-oZ);xC;b3%=i3$(bYCb zaW8M~JU@5@o_6QZP_@Hwb#HI49tq&7QVZ689sJ>(a6!Hp`iimTXp}YPqKj#4kr-Dk01ZZ6RbQ?>d2nd0g5{X5cfmN$Fykh zFDAsri9a2=5oF_Uq9{P=>-?sfySgAWLbN$)Jw!L7@x~@uukUY;KwW}x>`%k z4|gz=m65m=EZl2a*ay$ul+n!F+na-+k|0JeQ|h%k2POC5cWWagdl|>X2;wwya!~sS zN1d3i<)*X=xltnE&WxD8;Nx4OpS&4Jm8*;I$tE)!-yQ_ex=YfQjpkNP3nArBQiAyiT zbEYpS-Kj2X_yTn+lQC!5CcM++r(BwYs5$SPb+tU5!l|{?`{{IWxx;xEP@OQ) zU}%9>Ol!=`xE#aC%`Q3_pkaJoTZO}lT@po|)2C=8GgOnR9mnM+nL+plr0c;@St(7e zt0}7L9n5|dB`FdKJs=J%Z=bo&ZloqDO~2SyXDJ2-K?jI)fGTNOettfz)Sy;Haf%+< zQ`oH&&Xqa~4_LR%$&7I2i+>w5eMJ45KLKWg92{{$hW`Ljb2A+tGGxEfK%WZiX>9%b zr3;_>OBRvuOoXjmg68o5PS&DKc?)b8DXHe5OaJZHA|DuUZpR^hiER3L;9)R z0Ie^qk-zWiTn~nVwk}wf;&qzUxq3P~uV1_Nz#E$8nS853hZ@X`uyBEH!_P!GY~-Xf zcAu2^<_#s`b|>Qh_4-<&8Je1hL6!<8deQxZU9b*5ykMrbPErk%-kgY}s|7(PEs)4+ zxeI@n_?;+rwR?62=TKuHeheN;3a9ygB>0B{pa{1F_FpgkU-%eE*w>>V5Q`7;1UHoc}sa!Ql3liKmDcZGW1|=v1}zZwc3LhC_f*|KG?;> eA#sg-Fm3etJJjQNEPUjE!d;a+c`}dx{C@ythy#NF literal 0 HcmV?d00001 diff --git a/docs/src/main/asciidoc/microprofile-graphql.adoc b/docs/src/main/asciidoc/microprofile-graphql.adoc index bb7cf629bc014..eb474468bf858 100644 --- a/docs/src/main/asciidoc/microprofile-graphql.adoc +++ b/docs/src/main/asciidoc/microprofile-graphql.adoc @@ -369,6 +369,8 @@ The server will return the complete schema of the GraphQL API. == GraphiQL UI +NOTE: Experimental - not included in the MicroProfile specification + GraphiQL UI is a great tool permitting easy interaction with your GraphQL APIs. The Quarkus `smallrye-graphql` extension ships with `GraphiQL` and enables it by default in `dev` and `test` modes, @@ -376,6 +378,8 @@ but it can also be explicitly configured for `production` mode as well. GraphiQL can be accessed from http://localhost:8080/graphql-ui/ . +image:graphql-ui-screenshot01.png[alt=GraphQL UI] + == Query the GraphQL API Now visit the GraphiQL page that has been deployed in `dev` mode. diff --git a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLConfig.java b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLConfig.java index 936a63175d220..ab5e72ade0e55 100644 --- a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLConfig.java +++ b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLConfig.java @@ -1,5 +1,6 @@ package io.quarkus.smallrye.graphql.deployment; +import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigRoot; @@ -13,29 +14,16 @@ public class SmallRyeGraphQLConfig { String rootPath; /** - * The path where GraphQL UI is available. - * The value `/` is not allowed as it blocks the application from serving anything else. - */ - @ConfigItem(defaultValue = "/graphql-ui") - String rootPathUi; - - /** - * Always include the UI. By default this will only be included in dev and test. - * Setting this to true will also include the UI in Prod - */ - @ConfigItem(defaultValue = "false") - boolean alwaysIncludeUi; - - /** - * If GraphQL UI should be enabled. By default, GraphQL UI is enabled. + * Enable metrics */ - @ConfigItem(defaultValue = "true") - boolean enableUi; + @ConfigItem(name = "metrics.enabled", defaultValue = "false") + boolean metricsEnabled; /** - * Enable metrics + * UI configuration */ - @ConfigItem(name = "metrics.enabled", defaultValue = "false") - public boolean metricsEnabled; + @ConfigItem + @ConfigDocSection + SmallRyeGraphQLUIConfig ui; } diff --git a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java index 5450eff63d8c5..12588bef28071 100644 --- a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java +++ b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLProcessor.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.io.UncheckedIOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -337,10 +338,10 @@ void registerGraphQLUiServletExtension( HttpRootPathBuildItem httpRootPath, CurateOutcomeBuildItem curateOutcomeBuildItem) throws Exception { - if (!quarkusConfig.enableUi) { + if (!quarkusConfig.ui.enable) { return; } - if ("/".equals(quarkusConfig.rootPathUi)) { + if ("/".equals(quarkusConfig.ui.rootPath)) { throw new ConfigurationError( "quarkus.smallrye-graphql.root-path-ui was set to \"/\", this is not allowed as it blocks the application from serving anything else."); } @@ -373,16 +374,16 @@ void registerGraphQLUiServletExtension( cached.cachedDirectory = tempDir.toAbsolutePath().toString(); cached.cachedGraphQLPath = graphQLPath; } catch (IOException e) { - throw new RuntimeException(e); + throw new UncheckedIOException(e); } } Handler handler = recorder.uiHandler(cached.cachedDirectory, - httpRootPath.adjustPath(quarkusConfig.rootPathUi)); - routeProducer.produce(new RouteBuildItem(quarkusConfig.rootPathUi, handler)); - routeProducer.produce(new RouteBuildItem(quarkusConfig.rootPathUi + "/*", handler)); + httpRootPath.adjustPath(quarkusConfig.ui.rootPath)); + routeProducer.produce(new RouteBuildItem(quarkusConfig.ui.rootPath, handler)); + routeProducer.produce(new RouteBuildItem(quarkusConfig.ui.rootPath + "/*", handler)); notFoundPageDisplayableEndpointProducer - .produce(new NotFoundPageDisplayableEndpointBuildItem(quarkusConfig.rootPathUi + "/")); - } else if (quarkusConfig.alwaysIncludeUi) { + .produce(new NotFoundPageDisplayableEndpointBuildItem(quarkusConfig.ui.rootPath + "/")); + } else if (quarkusConfig.ui.alwaysInclude) { AppArtifact artifact = getGraphQLUiArtifact(curateOutcomeBuildItem); //we are including in a production artifact //just stick the files in the generated output @@ -425,9 +426,9 @@ void registerGraphQLUiServletExtension( } Handler handler = recorder - .uiHandler(GRAPHQL_UI_FINAL_DESTINATION, httpRootPath.adjustPath(quarkusConfig.rootPathUi)); - routeProducer.produce(new RouteBuildItem(quarkusConfig.rootPathUi, handler)); - routeProducer.produce(new RouteBuildItem(quarkusConfig.rootPathUi + "/*", handler)); + .uiHandler(GRAPHQL_UI_FINAL_DESTINATION, httpRootPath.adjustPath(quarkusConfig.ui.rootPath)); + routeProducer.produce(new RouteBuildItem(quarkusConfig.ui.rootPath, handler)); + routeProducer.produce(new RouteBuildItem(quarkusConfig.ui.rootPath + "/*", handler)); } } diff --git a/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLUIConfig.java b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLUIConfig.java new file mode 100644 index 0000000000000..7b2b8a5994226 --- /dev/null +++ b/extensions/smallrye-graphql/deployment/src/main/java/io/quarkus/smallrye/graphql/deployment/SmallRyeGraphQLUIConfig.java @@ -0,0 +1,28 @@ +package io.quarkus.smallrye.graphql.deployment; + +import io.quarkus.runtime.annotations.ConfigGroup; +import io.quarkus.runtime.annotations.ConfigItem; + +@ConfigGroup +public class SmallRyeGraphQLUIConfig { + + /** + * The path where GraphQL UI is available. + * The value `/` is not allowed as it blocks the application from serving anything else. + */ + @ConfigItem(defaultValue = "/graphql-ui") + String rootPath; + + /** + * Always include the UI. By default this will only be included in dev and test. + * Setting this to true will also include the UI in Prod + */ + @ConfigItem(defaultValue = "false") + boolean alwaysInclude; + + /** + * If GraphQL UI should be enabled. By default, GraphQL UI is enabled. + */ + @ConfigItem(defaultValue = "true") + boolean enable; +} diff --git a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/CustomConfigTest.java b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/CustomConfigTest.java index 68c04b2123041..c841dc1122d1f 100644 --- a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/CustomConfigTest.java +++ b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/CustomConfigTest.java @@ -16,7 +16,7 @@ public class CustomConfigTest { @RegisterExtension static final QuarkusUnitTest config = new QuarkusUnitTest() .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addAsResource(new StringAsset("quarkus.smallrye-graphql.root-path-ui=/custom"), "application.properties")); + .addAsResource(new StringAsset("quarkus.smallrye-graphql.ui.root-path=/custom"), "application.properties")); @Test public void shouldUseCustomConfig() { diff --git a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/DisabledTest.java b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/DisabledTest.java index 14e4e900fefb5..099c90086ed72 100644 --- a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/DisabledTest.java +++ b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/DisabledTest.java @@ -14,7 +14,7 @@ public class DisabledTest { @RegisterExtension static final QuarkusUnitTest config = new QuarkusUnitTest() .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addAsResource(new StringAsset("quarkus.smallrye-graphql.enable-ui=false"), "application.properties")); + .addAsResource(new StringAsset("quarkus.smallrye-graphql.ui.enable=false"), "application.properties")); @Test public void shouldUseDefaultConfig() { diff --git a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/ErroneousConfigTest.java b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/ErroneousConfigTest.java index 630e9b0bdf46b..78eca1f2eed3a 100644 --- a/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/ErroneousConfigTest.java +++ b/extensions/smallrye-graphql/deployment/src/test/java/io/quarkus/smallrye/graphql/deployment/ui/ErroneousConfigTest.java @@ -16,7 +16,7 @@ public class ErroneousConfigTest { static final QuarkusUnitTest config = new QuarkusUnitTest() .setExpectedException(ConfigurationError.class) .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) - .addAsResource(new StringAsset("quarkus.smallrye-graphql.root-path-ui=/\n"), "application.properties")); + .addAsResource(new StringAsset("quarkus.smallrye-graphql.ui.root-path=/\n"), "application.properties")); @Test public void shouldNotStartApplicationIfUIPathIsASlash() { diff --git a/extensions/smallrye-health/deployment/src/main/java/io/quarkus/smallrye/health/deployment/SmallRyeHealthConfig.java b/extensions/smallrye-health/deployment/src/main/java/io/quarkus/smallrye/health/deployment/SmallRyeHealthConfig.java index 8d365e7c38b10..08104bf8c73bd 100644 --- a/extensions/smallrye-health/deployment/src/main/java/io/quarkus/smallrye/health/deployment/SmallRyeHealthConfig.java +++ b/extensions/smallrye-health/deployment/src/main/java/io/quarkus/smallrye/health/deployment/SmallRyeHealthConfig.java @@ -32,8 +32,7 @@ public class SmallRyeHealthConfig { String groupPath; /** - * Config group for all UI related options. - * Configuration properties for UI + * UI configuration */ @ConfigItem @ConfigDocSection