From 8ba4d63af60699eaa4014b5021800f7aed450c72 Mon Sep 17 00:00:00 2001 From: Carlos Date: Thu, 12 Feb 2026 17:41:31 +0100 Subject: [PATCH 01/15] init --- assets/about/alek.avif | Bin 0 -> 1277 bytes assets/about/companies/abstract.svg | 1 + assets/about/companies/box_group.svg | 1 + assets/about/companies/lux.svg | 1 + assets/about/companies/outset.svg | 1 + assets/about/companies/picus.svg | 1 + assets/about/companies/y_combinator.svg | 1 + assets/about/nikhil.avif | Bin 0 -> 1445 bytes assets/about/team_1.avif | Bin 0 -> 48373 bytes assets/about/team_2.avif | Bin 0 -> 36042 bytes assets/about/team_3.avif | Bin 0 -> 66876 bytes assets/common/light/cloud_pixel.svg | 1 + assets/common/light/framework_pixel.svg | 1 + assets/common/light/squares_docs_logo.svg | 343 +++++ assets/common/light/squares_logo.svg | 1135 +++++++++++++++++ assets/common/light/squares_navbar.svg | 1 + assets/common/light/squares_rectangle.svg | 1 + .../common/light/squares_rectangle_small.svg | 1 + assets/common/light/squares_rectangle_xs.svg | 1 + assets/common/light/squares_vertical_docs.svg | 1 + assets/companies/light/accenture_small.svg | 1 + assets/companies/light/apple_small.svg | 1 + assets/companies/light/dell_small.svg | 1 + assets/companies/light/microsoft_small.svg | 1 + assets/companies/light/nike_small.svg | 1 + assets/components/GradientButton.tsx | 111 ++ assets/docs/dark/getting_started.svg | 411 ++++++ assets/docs/light/getting_started.svg | 411 ++++++ assets/logos/dark/docs.svg | 1 + assets/logos/dark/reflex.svg | 7 +- assets/logos/light/docs.svg | 1 + assets/logos/light/reflex.svg | 7 +- assets/tailwind-theme.css | 38 +- blog/2024-03-27-structuring-a-large-app.md | 1 + .../docpage/navbar/buttons/sidebar.py | 32 +- pcweb/components/docpage/navbar/navbar.py | 3 +- pcweb/components/docpage/navbar/typesense.py | 21 +- pcweb/components/hosting_banner.py | 1 + pcweb/components/marketing_button.py | 37 + pcweb/constants.py | 4 + pcweb/pages/__init__.py | 2 + pcweb/pages/about/__init__.py | 44 + pcweb/pages/about/views/__init__.py | 19 + pcweb/pages/about/views/cards.py | 59 + pcweb/pages/about/views/companies.py | 67 + pcweb/pages/about/views/divider.py | 7 + pcweb/pages/about/views/hero.py | 101 ++ pcweb/pages/about/views/hiring.py | 53 + pcweb/pages/about/views/news.py | 84 ++ pcweb/pages/about/views/square_logo.py | 12 + pcweb/pages/about/views/team.py | 34 + pcweb/pages/booked.py | 4 +- pcweb/pages/docs_landing/__init__.py | 44 + pcweb/pages/docs_landing/views/__init__.py | 21 + pcweb/pages/docs_landing/views/ai_builder.py | 125 ++ pcweb/pages/docs_landing/views/divider.py | 7 + pcweb/pages/docs_landing/views/enterprise.py | 38 + pcweb/pages/docs_landing/views/framework.py | 183 +++ pcweb/pages/docs_landing/views/hero.py | 62 + pcweb/pages/docs_landing/views/hosting.py | 51 + pcweb/pages/docs_landing/views/link_item.py | 46 + pcweb/pages/docs_landing/views/other.py | 39 + .../pages/docs_landing/views/self_hosting.py | 38 + pcweb/pages/landing/views/social_marquee.py | 2 +- pcweb/pages/pricing/pricing.py | 4 +- pcweb/pages/to_be_booked.py | 4 +- pcweb/pcweb.py | 1 - pcweb/templates/docpage/docpage.py | 9 +- pcweb/templates/gallery_app_page.py | 4 +- pcweb/templates/highlightpage.py | 4 +- pcweb/templates/mainpage.py | 6 +- pcweb/templates/storypage.py | 4 +- pcweb/templates/webpage.py | 4 +- pcweb/views/docs_navbar.py | 157 +++ pcweb/views/marketing_navbar.py | 494 +++++++ 75 files changed, 4336 insertions(+), 79 deletions(-) create mode 100644 assets/about/alek.avif create mode 100644 assets/about/companies/abstract.svg create mode 100644 assets/about/companies/box_group.svg create mode 100644 assets/about/companies/lux.svg create mode 100644 assets/about/companies/outset.svg create mode 100644 assets/about/companies/picus.svg create mode 100644 assets/about/companies/y_combinator.svg create mode 100644 assets/about/nikhil.avif create mode 100644 assets/about/team_1.avif create mode 100644 assets/about/team_2.avif create mode 100644 assets/about/team_3.avif create mode 100644 assets/common/light/cloud_pixel.svg create mode 100644 assets/common/light/framework_pixel.svg create mode 100644 assets/common/light/squares_docs_logo.svg create mode 100644 assets/common/light/squares_logo.svg create mode 100644 assets/common/light/squares_navbar.svg create mode 100644 assets/common/light/squares_rectangle.svg create mode 100644 assets/common/light/squares_rectangle_small.svg create mode 100644 assets/common/light/squares_rectangle_xs.svg create mode 100644 assets/common/light/squares_vertical_docs.svg create mode 100644 assets/companies/light/accenture_small.svg create mode 100644 assets/companies/light/apple_small.svg create mode 100644 assets/companies/light/dell_small.svg create mode 100644 assets/companies/light/microsoft_small.svg create mode 100644 assets/companies/light/nike_small.svg create mode 100644 assets/components/GradientButton.tsx create mode 100644 assets/docs/dark/getting_started.svg create mode 100644 assets/docs/light/getting_started.svg create mode 100644 assets/logos/dark/docs.svg create mode 100644 assets/logos/light/docs.svg create mode 100644 pcweb/components/marketing_button.py create mode 100644 pcweb/pages/about/__init__.py create mode 100644 pcweb/pages/about/views/__init__.py create mode 100644 pcweb/pages/about/views/cards.py create mode 100644 pcweb/pages/about/views/companies.py create mode 100644 pcweb/pages/about/views/divider.py create mode 100644 pcweb/pages/about/views/hero.py create mode 100644 pcweb/pages/about/views/hiring.py create mode 100644 pcweb/pages/about/views/news.py create mode 100644 pcweb/pages/about/views/square_logo.py create mode 100644 pcweb/pages/about/views/team.py create mode 100644 pcweb/pages/docs_landing/__init__.py create mode 100644 pcweb/pages/docs_landing/views/__init__.py create mode 100644 pcweb/pages/docs_landing/views/ai_builder.py create mode 100644 pcweb/pages/docs_landing/views/divider.py create mode 100644 pcweb/pages/docs_landing/views/enterprise.py create mode 100644 pcweb/pages/docs_landing/views/framework.py create mode 100644 pcweb/pages/docs_landing/views/hero.py create mode 100644 pcweb/pages/docs_landing/views/hosting.py create mode 100644 pcweb/pages/docs_landing/views/link_item.py create mode 100644 pcweb/pages/docs_landing/views/other.py create mode 100644 pcweb/pages/docs_landing/views/self_hosting.py create mode 100644 pcweb/views/docs_navbar.py create mode 100644 pcweb/views/marketing_navbar.py diff --git a/assets/about/alek.avif b/assets/about/alek.avif new file mode 100644 index 0000000000000000000000000000000000000000..ea24123da437ba131ffa8cccf85a0cc4b931daee GIT binary patch literal 1277 zcmZQzU{FXasVqn=%S>Yc0uY^>nP!-qnV9D5Xy^nK`jnemk_eIm0*#E6oFWL5fuSHX zxdg@r(K(q(Fk|=%GD~v7a*RMyE;A=T8N_p8U|1git>_kDj1l6kgWkIB%WE2n+TEv0-(cK7@3+`fO=o&rX-dK zF>rB8NN#+b(8$Q_WOSL`rGa5lmqx(#{}uhKJ{!0%j4bY1W$bvX_AciitwQT%D?iR( z@^^RH4xevNGw(Zj7914VeEs|6%oPg$7UnChdN}*;1`6f*C5YU-?z~J|BIc~^+*lb0 z{T)ntPgWVH{`Y-vX~)ufMi@Xhq%bM=UkYR$aHtJ@?*t2D>s(+S!u48 z_#VtSf2P*EpE101Ip5#++7NQ4{o|`JF20s^d|`d-UUHu4tw@;YF0#pq$8`RKxknb3 z#jP)PyZ-gIg{=+O@kJYj*ndV#aOOrVzjE{Zf{$rIERSnWEmjuf5!&Frd&Lujtx6j{ zYBE{2OuWFMweU!0r(ezT-CSQ=0`Dw6{HW#R+9&Rv+3mt&Cu%EukKT52pBdz}&gsy{ z`wNtRoSxwo!aCb`U&qbwv5OrxKM#zlU1+zdpG#=6?y1lBosYchJ*KrWV6Rd_`Ohsk zye7ME(6%U2ec85M^y0&_*EdXFr*)>WdyVGB?Osp&j@Bm#KF;3szSiFUIG^>24c;r4 zi3+UKulHAeu{P}LH_@esf@RMHO*|FY;(E}!M{)Y}jeCQpN9DIJxnyx?YgokfMJqYh z9o_jbdf~)F6=k!pF{nxi7FD~seVevZclG~%`C0CZmAh)PmJ1msw(MVa`lA(#_N57p zdxedcy@0}#8e~MTRM(w(uzspU;ni0CuM=LHPW({s|L+FtC8HB7bAC9u_54-$ zQ%Z@Bo%=g_MSgQ>i(Aa?8!{Ct^TZ4jGj7b<@NA`LWdG#XCw?YR;8nks?z!S%6ys!x zcDX0~g$73JrnGisPZ!CXmpWZ;tIM-vhtH_~m3vm8B`GNei``p|YbPIF zcbQw`#1jo$i+!St|Ech+sARv(dEflC;dX^^$@irC9S&K4^2{P_1zKjlE>mp3hA9rQ}!>vXK(-8g7yB*-rQNGJvAwQGcUdUdgEWPe7>a%mrQjhv!3Ig6-k$V_&oOd zzPRPHRH4Yhi;qv5N6YdW`#)A{Sg|i+$(6aU|Mx8Z@bOcn|j|B|X{ha_br)t9RZC47Wq41)mlvXI^#QW68c(vNE`>;OF+8=lAV6 zJ87BjHmL(!UFW<^O}LjYU2`>v-D>%lNu27Yn-7@s2|ng8Jt~~uH~T&3zm+^Egi{!2 O{y+JsWl7d?@dN<14k69} literal 0 HcmV?d00001 diff --git a/assets/about/companies/abstract.svg b/assets/about/companies/abstract.svg new file mode 100644 index 0000000000..1e622745be --- /dev/null +++ b/assets/about/companies/abstract.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/box_group.svg b/assets/about/companies/box_group.svg new file mode 100644 index 0000000000..59599ffb1a --- /dev/null +++ b/assets/about/companies/box_group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/lux.svg b/assets/about/companies/lux.svg new file mode 100644 index 0000000000..0db7121291 --- /dev/null +++ b/assets/about/companies/lux.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/outset.svg b/assets/about/companies/outset.svg new file mode 100644 index 0000000000..5c0f7c574e --- /dev/null +++ b/assets/about/companies/outset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/picus.svg b/assets/about/companies/picus.svg new file mode 100644 index 0000000000..24173395f2 --- /dev/null +++ b/assets/about/companies/picus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/y_combinator.svg b/assets/about/companies/y_combinator.svg new file mode 100644 index 0000000000..7dc365987d --- /dev/null +++ b/assets/about/companies/y_combinator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/nikhil.avif b/assets/about/nikhil.avif new file mode 100644 index 0000000000000000000000000000000000000000..6d8ccda93909006e5963319d69cfb2bb53dd0226 GIT binary patch literal 1445 zcmXv|3pmqz82-EMj7AE%riGoTC!58SOUdogGPj{58Z*=WY%^@;Qcq`yn9MDQPRq4J z6g4?cr$eD4lMwaHS#C*7XCe`~o&TJt_j`Wd`+e{GJ-_b*000@uN@9`{z(@dsoatbs z6&)l+dO2IUK++dFg+-Ek5X`9&w7CCE0APY-){k1wG%)KpO zcqTuZ61xYt9(UEgFVpU;AgcBe z6Iz$2U+VtssjKq9M-rilhBrNSu%GV$L8}qZ+q;Wy^92iRXemz|CKREx9-crc#QHd+6fVFX)es+wSiUpJeso4&Bk5)n2- z^ii@BD$C+0hfMV&Wiv2+V)a@sV!<@AS{9u<(tw2k&jSpP+wvJ6Wbd;;J^2y%>P0${xn|F=>_cM!F@45mp}eC~v{fX#a`3 ztgI0*Obj(lS}=RJ!+NX{)AmUNZ-bMVI;i0qZDzW?bVVDvF2Wv>4@TZxW>gdgXdmf^$Xkr^jwyz({$C(YBrjSGf*_ zRDAawhgOampWdDx`+BK2&C#Okq#$J+Y1Mx&4ClO°h?w^13lbtycgCE%(S+iy-$ zrN^%J<7MKdVzq+aLYsw|S^r96XoZvByca+JvH15_eo+&_{rFEjN+t@w>7(D<-0}|x zxZ@pPRT;@k{CMyz*TCIHP~grxJ$N>ztER-=gdJ-))q36T#?_Q)r#Ckhie_ashLP%N zyW3!k92r8m3*-$h3QoY!>nZK_ub%hsyz)v=iyyArchB-d`(jO#U6qt-v3f!iEuf%_*i$W zK3~CH*>@DNZ~%k4?C%Lzla&|GCDsY8ggl)fL13kYmX;-|0;xZ8IF^&u#ESM6SV%4g z%>$@oW@amb-2sz(1DB7Ozt7*+K#8}{4THB1vbuDIN5!g@ht7X!-Xksu-+p7J7F%lAY|lpIXQWDc|m#}(h}f$vwYxbU76JoNE41$!DNCi~&qLj_`Y_ITps zQL(?(t5kLha=6Nn@N~5C$zVy+V4xU7-WY+Q?CRLKe8~rqs6$zO?fjW_TBoEeKY76+ z+9agimXjn6!SKKL;VZ+9Ld$Mjr}DZlxPNNzZc*?3F&@&u1m(C)bQC*?QBAzuPw5sRR7E&rY$r)& Zf!j!?r!oXBUfI$!d05HbJ#M$6K?w?VZ8(Ta6Ul#zt-onWF|M~x+ zwT0pTD+6b5;cW9i4)EVjV_|J)^j{NZtF9K}&2U!1nK?@7p z|J~$&4A#HEz+cby>rCK?_qC)C^|h!= z{8Z?k_N5i>QJVwJO?YE;YVSeOoCi8Iq;z-9J?m>$+b5j%R$_ zTpV100}{JZW=22}i}aQVzw$}5F_qSfWjAD*YO|l|s?K@A?d)^s61KgCc#}PtIu?3f z1r(Z;OSfCvApc0)aDyqfl0KyW{B%WpYR|&|tlRw^uAj~X@Euhq<@%+*1FASrdFz_m z)-M6fl3AZ?_Ww{K?3t&Yu@h$0=kIH^B=|QAsQ*o7F8~l&kTLn`-*kW?DGK=C>-N!) zPv!^#jhH%Yaa6~#1Po4#_Z(nTnU9(D)oQWYnEs-bDo@C{0dOTpxdvlF@Ktp=`-7f> z-}NzdY6I9(yTnP|4R(kwfAGGFt7a7QqQy(tvujc1l zjJWFID4^3hIhrx|y0YFgMjV{k$!+Q^;zk?n64M8+9s^x$Yvo5Qev_aJ3exesoqe48 zTjMSy3`Dbumj&+_&j zR?aRJrpL+~!A>M`Iy3lI@f=LbZ(El-_oeFL(Hbm0OocL7Ghz|)OWTv2Cv(T^3G39B zx4|Sw{b(G@vd@0_2LA=ntIXV{ro#>sesTR6-Bk@FTz|yRE}Zf@`dNYCd&Ez|H>0~m zdDCsbnc5Jv{>1EsaP4fhYPhWjDXVbS8jQielj&EZvLu!U1M#s+HKfx3AG0jQ= zcxTLHTxFKHwbYm*s(m~=&A@9ZL(WF3_(f;95LerfM^5{7aLtWL<_88*I>KyTBZ!RV zZrL%a97AYpD4hzIvoKQEA+|i7?bc$LvBk10Q<{7}u4MSQgnIW$R0K1a`dX+(_UQmq zw^hxjqa1O7exAjTAB%nZFpCjW;urnnhU2*JE{=6N&4{>n@`KfOzTUkE3y4cn zNX5>umoxB3r$;1H2YXBQO!Io#@y|1WyRtrPimm)@Mvys{ zy#AlUpXazQz;qSspgy$hkdnj5W6iR8FuK^1HKHFn?|gHy8_f}ia?B$#BFYF*xHz?} zfKi8ptG&1IFLSPy?tC<{!IbNE#Tj#@mF1piDd?qXhgM$Pb0a8OBSP`!!O~N@HxB(O z#;)tqO{d=@1ah~ZvUzY~ca`Y92d9R$N5m941uh#8Ez@znJpkBdQZ-Uki=DX1)j7oJ zPZzbikz!=>DsNGG?NM~1cz&4W6u3W+E%C$u5~C?hI-zo>Fx=;d%(M z?}SCLLiUHBxttv(_=&I&fKkBzg>R9p- zu3I9z(*J>~zNU0Z6P$^iWxQ<#_FX@B#umr2rt&-X5sA*WBlZbrUs*liEq)a&?!ojJ zbNBXi;{CI<_-vXyRGwi%QM?B4*PtNxhW#>{wykMEYr3bg501&yQeK({&Ts+ybbwKP z2TSak+^=U92HW=#_<2sud?QG@YRhEG#pG{}!zObXIF5 z4Tz#zvuG*W@9hn{3C0ynffgjCQejmTC?t6>!54ZYlFl<7zC74_8cIT45NHG~zyLya z|9yR>V@W&c&OuCJhZ;-MFvc$=boCxEEt}A4+@KM_dwgx8JkyovVhW0UJpA-k?(Cz1 zoN)egd18cmk8Em&+0bB)0f(X>GT$Zjm)}bCj#~pBD)R39h{WtOm_CQO|9*o>Y+db< zK0+}K@(m(PNsc?Ej6R+r?~A|L-!;B{nNSvxoe7=C+L9FBqJ{)*n^#F6X#mmr5o{~A8<^*s%+dqJrjqC`Tqua} z??Wa-MNSeOBgP}JCjAs>!I!o)5hYd#Epy=u!~0Vt{DTV#6)1c!eGM*=-fx1`6h7iR zBbpd<%5kXw^?=BWjF{ErlF z+_Z|{gf_`O3mkOj1NyYJ_i~AJF;nv?Ql>}yV{Ea<7+2p%hJo1_av6Q>J!cE*s@2*; z4>`I>m7>0XVzVkD>P1wz6U`S;L#<5x7Usd!1@yx&gU+f_Wkf*H#N??JKRr* zt**vxUfHiQFQfz*uUMUlfsQx)JVK>RvdAh{?C8!}feF>HM8S5!cRamC2kLXz8pXQ4 z>?+O9l?Nxqhhtl(P(sN@nn6#7lj=TUsg8}!w)yU&RfFjRL*$#rx5SXzNILFzR2!-sEI^3gBZEZo+#qucn5CzF5dEuiI=+ZgmSHUPOmH?dVR) zzw9lf;Vslp=`%l%yOsBOk5(S-E+e%(km0(Ll{@dnut&g)!y0C}HNR|;Jek7nnos#| zL%#c(#Wu-Ew<63k5D^|nk&XOYdPZGDi1T8Pn&CyLu%zdZ`ukiR7`Yi4*ab%WLYQf*?pLUwG8BW@9#+NsJDuPxHrH%j!qP0fUF#~@J;g}ZlGE;xxE6;Z$ zWJ3iHuRLQLN0t%%5B1jNf2IdCQIxtnqxdqdG$6xTB2zn2mX81Ut1orDfQT1gfsoc2 zy*g`XQ$ayLtP3#kNorn#*>bCdD|$A4IItM}owJkC)9GI|bWmt|;$c=L0)oI|prl(e zz`PXVZvE77u;r_rC^6I@d2c|KEJ_YwG%Z0QUQ+^*hmtm7<>z_H>XjgTxU|YVVeHPO z@_buyNn{LPCb?f>crinmD!!sx3+M(4`&mCqNFG7l<#UTZk6VB>)WW@N20)KY`#dqQ zg$Lno`23psU0UtsVS;D;V~isaS8!*&(4|p4GKlciXL9^Zmevf4Rne#Qyc#>s%(m_N z=%u3y9XX>3{ZU}OO2dxHe=r^)M;8$elm$UW+>#8pGJyQo>ia$R869HFLsO$@F!ZQm zNs9gFR&gDefyX+WEhY=M4T+~NM1vlb`$d)|*48F?a^3$!;HHN9`?aJYvHG=a9l;;2 zRz(s`4o(}{=vOp{e3*QncgcuMF#Y6g@hflUr)pNH(c9U{rbXOId=?^|mvDRm$;D92!?-;$3Km8SM^0K1BUEA`*~|V5vO0td*vxYpdZA%oDk0f?>3nD~785 zTxU?2Oz8qM;mEhgIOT$X5z}&{rU>PBiEW$Oq6O$()i7(a`^qUXS+UB=^y$%fwK=jy4`1|q+EJ`Qzwu)@r zz`lK_f3&fR#b&dpsuA6NZnNxC89v#|2jgvVjH)ZxBWKund7jgdpjSmarm?-m?wa1+ zS%f!aAe(WdqfYKufjq&o40lvS4vkX3qNHV(&Z>AF8T$nO!NhyPDn_#p z{_Sg@NM?-*CQ?ek)ieA@2gqH&ABs=RDWW}lxFmD9e+#XcONymkxq__>kWQrhHQNEinx-Dhi1Mr7YYYV9sY837U!^sFRSnbpiSpoCFXN>UDdIQ{VQNOLCLJeoCr18a5 zG9R>iZEKCo%r(snuPY|!tlU6kfQWS6`iD1<)3;A_{-*5?Io8rnR^0X8zLQwAc#E`3 z&Fi~nOjqp0wWObs(Suzde2M5SzPD>{3!I zFGr#sXeQG}+L9XCS&ZVpe5d3|^vj!Jx%P5k&W_U~X>a3{8?MAW6RaK>Ll0b&J;nL7 z1d{|v&FaprTs0`RJzr6s&%OGYk~k?A9UL$@_tfr|K4FN>F5|S6| zFRZjCIZLDG4I_bXdim7p}b;58GecUoe48|a{DMQ$c5FnXjk&Qi8sH-)GnJTLni-Zwsle|N$?q97{Xn|A?L!AI#mi_>Not`+= z^HaR41GU!#4}Ek}{ic2M(a+1V(N!8bNw~x?JdigKp-F8fs^JO+6hIP-UwlVCWJDl* z$EB?m$b*EDfYv^YNE8ZP8Z$XkS04D`*$GKj6Lgym2=Ju89K74-v%f$k(MkxNwOq`-HR>(_s}h7wyjZ z6nRM5x{^zd96|cROKVzg10co~WdE#83YSw=&TVYCx@!SpQL4=HlV>nu4)Bvrc_m!? zV5anzsJOETU?FCp=#AW+YRGznBRtveW*9zipZs;cr%t_XEdDCxxiD~ z-P=ErDj=AWg0X}%*YbhIW9SrT&FB?3D)#3g{Eau`(FP3Pv`YmZsT68g^+f%{sp z>IiO)?f$&jgeIUVI|jFibvf>?3GFwm#~*P*<+x9|N|Kx7jH5Ery9-+&CXyTr7V}MT zmSlUGoe}7wKhXfnqaguDTdHJD=wTdgE{={3rK9H%cbBxx4})cM z4;p0w>h)EzH7HIdLwPh@r=8)Q9@kIbbmzhGz9SH7+yEAkaXHYyZ{2I)?%}d?V$*e* z>TaOZV5Fc~}gKKv5mG zj_7@S2LfJP`be52T@8xI(fkXD`#YNv zjVVleS0a|&OH!-Ow{Puq;U8PpF5%(=>q7O&YrPc`AOCdRzQ#e!z6d#ZjJ8$k%$JE@ zyD78p<^b-6Oujm)nfMhY2E73%*pv~EFmL{pp}^N@YdF0=sVB8D`0gOvXwQ?&DM;q>=uy4LmODM|TV^H_Qt13@VToS*M(m^vLZ3ga6@jUAJL*2_)w0#X_wJ3_--zg7M&7 z!#A-nSH#YE1hB$?aEt5e4}^FeZ>~m-0offSm2u9|qunJ}Y$oaN7Z7CFQEiS_>2mLv z&s;8r5$`ODSEl^jPb;%Lu#)_EvIl5DFVDL?DaP?nUDN2`w(nSu!!>)yBKynZA6*`W zx99&Jp}*+5;RYl|WAig#Dc6{|k{=f;ClAg!2QITeabuTC9>==Uc^c+=>$r>EcoAoF zQ53cRef40Ak1<=IhA+JLQ@4Ay9@q`4w4JXJ?rPeqrj#1jrff z$06)`A&K$)ZDVN0eNwLi#(8=|@dNb*MSQ~wQvs;|zMb5G>=L3kWU>^GUB%IjY)v9z z#J;ySPO#T7s1(1+T%$;)=geJ^nG-_cxa>aH8S@Fp8RmWurc@hB+%J7zvhbRNvLmN%mu+ ztz`H@7iKH`dS_n6D`;LONsm4QCdXnsh3*gB<=`U411pHG1z04dt8;vo=x+`uK-#kB z&UkcN>1OA=dL~l=W?kJ6=_PF3MGs)qj${m+5j)3{0H&+kU4+!43As_+7Qm^vnZe2; zZxbBxWB`yfx*wHWR(Qp|(Dp+^vVY4kq zF8#Gj^{-~(IHu#AeG%Gl%t2Fcps+6h>JNMF@a&G6K!pCSWT?r!X?||Z4uR7!N9sFR zHfG{iw75?nW5n_1Q%=Kjq3<`#Il~u@5~}(ehd|j^LhGONTGO~Qfz4*?zEFZ%@%Gf) zoO$6)0jBHLu{s~@ampGWCpi75HL!2@4h>NkU16tJ05yxLNrj^{?k{K%68sqt4wd~S z;01cZr^TyNC=(n7Ac8b5;qAY{ngl<*1kIGoh5$%kK*=Ddjp7T1{{4K`gS&jURR)=& zZOFHT1^tCo{U3Q4FE1Gv#5CUKL0#XCI#p-rqn1q>9w`ogUF#1b(_k;Sy6{j2?wWw(QKu9w?ECi*s!7O?dDLT|>Hk zxh1G)Rzrpf)SYmfA+1v=)hS7PW2drc7_w5~(Su&7A!41aJY_nAA#+MCk$_eTtldKr zAAYXNe-99G#{*P|VAaB1FY3b~KCpV5sg=HI_irjq#}`7na?nh03F#V|+t`(0bN7%ur8-bR+Xaun6!fi|%9#(6S6 zduiT}E1IflsdXinElhV8uKTS7wlHX0HOKPnPLlPWl7t3=5|PzHWg-0(Vr4H&Oed4c zB3q9K9!nWV9b+824N6!Dz$7Zi;Hd-!aDmyiv(yvMN8D&)f)TnD!I0|7N-+6(yrF2V z51n#Xx)41IP}L*K1o>GJf(ij_6$kTDzQgCMO%RkEy;Iom3Wl!|e1WviypzcT-sK}g zS$|!-E{xg~o%|6qI9D6-@#FA>iLX|MKl!gX+{?QyuBrC03^}b^38=Gv&+IUEprM=nEQJWqB@2q-Rj09Sd*Gy z`pqL@z*ni8I`5M`K__Oz0W-e_48lc0I5}Icq;X2^LFHfeGTXSFX8#eR3Wt3s^-{iJ zldm^t{fWKfgf9edc{lrdTQT8W!;-VB+CJ(~d=mrcDxA|E3S`D}=CbNq9C;+1EEFP_ zg5*(K)A$>8G9JnDwMvQXXa73i?B;7UaJg)kvIen5*^N6Eb#V-2(1TO8ZnXQXefo!g zPM_pet}q`R_`Q=e8w_M3Dc+B8HoSN&{hn$Xr(t6&Yrbo65!S@-m!d=r(2;}eX(=&LZ&tB=uwolfwZSI zoW@k&1#=72Z{~B1iUTVnq&QGYPb^`_ld$H=6;^kg-NNfnf3tE!o1dOW_QU+~WfD@I zQ_@r85jDIQnC*wCZP3DxWrZ4Y9{Y`7USr6Shf7psUdCZZbe@#srzaF*U=M>Qf8bt|AR(UlYCJ@FYo#4h9C41d2@VPlC@XhXw!JxPDQzjH< zvPfyrRAj`w&vbqiAQix*4VU3y^Zh5r_c^~lfNf5o0~^fax>(CTm09Hybc2_SKe{+1 z^1e-P{CV>Tb@cf6>MdPG4JzdG`x?GjUMzQ0r*%41GA7=rk9=ketln<5B>p);b=BH_ zlL#RaSY1-?aRoY^GpgH=_;Kn5uB5BVAxGpf+gR4b`28y=yb-lXky9?f*oh>&Ptq@g zQ3ayU?2wXgWyOkrfHd2Pb!u4ko;D>E=W+OUHp^whMJ{S@9%` z>FpeG5smNScxwi_V9PO~LA{_CU;SBILWD@JDv(u(Vk{@ect{_XFW}DCKxTxGhVje{ zZvN2$0LqdcKtB5ISqvjzn44&nm`j?23-frb zFVhorD{uqn?Pke3)9>bSdl3eiaYER3C$NWnHGvhtNiBHE_&zMm_N*o^RtQ8&M{|hvh5Nb9(q22L!-8dwr096@eab0S z;}k(~g<355h*SpG1xGCYwI}WKzFFkohmG?o)w!_8rgFW~y+12+=~&CzD3N^3-T{(a zOfAiCq{OGlot|E67oHu^Tiu#GK%4lPGH_&npnwKD5s}MNZxP-Yg|&Y+uz_w9#9_Ys z^~iaM*rs7pTc#{48OP&6QI%`ylhR*BiP1T{v^&lZ^hz0UeK=h_+Z7JYDI{jWw*1ik z%nuRsa?naC=V%cA0*A7_etR7pC45+|m!Nqe$Bu&Zcy-!vXAQ%?6FZ5D3yui%RHdyv zP-U}wda7xfv>Bn46P;Wb{!(Cg%j8H;gbmCRwK3NXD@Ob59PZ%~wV-Q2kXC|?2}=1^ zEZGWnYT*@D2E8bS+*+UDav`{M6YC&6|2XV2l|ioGs*SPe@Zf)`c~zz5=FxNF6~GD8_g+8LJxT!PoMoOk1cYK-LP*L@{&HD=cU8uuLRNb(J3KXJFsdJ#-~M_X zWxgMPpP3)+9l)gk$w5J72npx!4sL|ZZRl-;>;(ZblODZ@D4HkmRp$k$P?kxhKWFQ< z27f^4Q5yFU;^0^yqc82Ytl@)WE4(Zlzp;O42kYjRN&mWPZ0mo|spzY_f0s={OEoat zPZlJS-2!(jNSnlD(Y^4{m3j37UX_|BtUgvb30q^`k#j9~(F0`-y~3}HQ`p8i(}?yY zRBJC^Ld06#(I54{dTz#(5DT(raq2}kJ`=~X7-{K!sB2=x&F;%pTqUtak;zW2PZz1| z_dwOKi{$8|u6By|IXf$iflOn)j_@*mrydomGYdLmD2$2l)I6j*b9;ThZ2>cjsw3o^ zq1a*(MLSu*)S2zI;27S}DQ;LyQt_< zFKmN4ofXU@we)>k|4Jn--$UtiGM4rMyo)Rp$&j+jabZ;`^$3Thnm@fS^VT`PE++EF zcf|V=Y2ws^NQlH%L_>U6(&s%-g7eA{0IV?n0u!gk_rd8V>9wE7L`N82Hk-=!u_V_M$%hiA!?* zUr(s*7#h2?)#*0$ayPU!4C-^@tzKlmXCtc|-Sq9HSu|a}cKDv;x|0eAewLgB=5G8V ztQo!E#U~n;UX1z63heKMJhX32NQzQZIC;CupqoS+T)1WjsE|)MmY~UE)I49y$>XA? zVVrt<&2z!-r=RqhBTF4#5l?l<>3bEG7~6~Q1<2`S|EhltZNq6o>k1A0j-tTfc1X#h zDp@U5O5CyTJiqs$bmRrioGKs~IqOSCHx$qyQX~0_bNroAJFzGN{l((1XzcRZ1~r`% zn*lA&qIqz}2bDJ*evzChl|FJ%COcE%6pbKRAyb-McTufe9NHviz6-wXNs1UfvktA} zp3Oc$f(l8r{zzps-MYcxWp8T~r=6t@2pZhJ((YN%0fVDU2_*KEy(J`h5H8t4#7a7H zAqbI#Z9?M!9qf)T{q{4<%T=!e8Zsb6X3D&gx$;633cmu!!~nYVi+LX$bs<^KUk|$8 z*p+-?mq-W%r&CmU7&lcJ!#yg2i<5e7<`_FXNj!={38GqMOwkTE%e zQqxdl6tJ2WvMX4=p|*h zwOK9gWain628}sZ?7I0_sJ>ZVOWJ9BUKzBWV$NU=hKxmkE73-_hrOClOa+KjmtZ#t zk#^;M;tk{Oq`W;1EeGAuI`m~<=HOzIvg}neGkP1Wh4Y?6=?uTVFHnOZlzcB$0wcz- zIf3zG51vCPi)i%XJ>)$OU&`+@>`Jyk(&#+Hihy^N6}_#j6$^Shvp_KaAr^#V{lMmDy}ea`@Xc1OGg3*PJv?`PcDPVH7~EhJYvY(z3Col|Jt zcHZ@i_5d6oOJ7YPuO@p;DXq#U5xm*;bV@0U8Q2`ZVa}<_WQK}$_0R0qK zr1I*?peG#-mC8jHO(_Ca@4P|Y#~DfBrZw*6Dly9oM1oOJvV#@ycos+(`14i5rm;F&SrSgZ|=RxJZfMNJ1Buv`C zr9YiD_$>>E07b=^mT#@A*2GDj{=x99<2Nmj0JyJXHdb}Lmdy9c3`b1`KrIcD;8> z;bSM2BGj7LmFX{V^%?HT0Ymn^H-UasAr}-{j@D&e!Gcq;m0{f+p4WK&&4KsHTH|E^ zB>kS9!M9LGy0(t+XXEcs?j(6eALBQoD9IbYuLwB9CGzlcY8}v6I9Fp7cHg-3MZ1ha zLoWi!1!LI-iep+GnFlVsi7X<12Hsoo4E2yttSFd--<@t7Z4_Or1LP8)FCy%M`X}JC z%T63uXG#}xj2i8OzV+tke1(a$GKh=!2k^0n$M?(p7R$ircR#fbfQFs;hT zrWx2;#;8HOk}hwyAV}agM#N50@=bCB%h<9H-n$mxz4K<*xz?pckzHefTETjom@z^- zP!O^BnD4I2ZR(0a_c9xU_H?v$*w*D(BK|z9ej3+IWS)8?W=G|O~ z{4&xTr&-K!E578910N9s)(!p;S?);cVlee@g(#X)EtT9|IWujcS%+Y?Ju09A&Ev0%#%>5=mcu)In_M|XdK^B%Bm;= zb#tv{t)v}$QHYNFo~8duAA|9CJ8DyZ!^0(!XNq6WHK@zN63f8jbNHHZtO7TMox`t8 z0$Rw#atSk@{Q#fR?o}EPpaSLBGeb#P<5>J`Bb_Jr>Snb4Rq;I6{Ft{94W$fuZsblu z0{q%<-s#Cbu4T`_QU>7QU;&?+e&6J!CR+eG9`^TbB{SG{0##-Xjfggfl%A{o%lzBB zfM6v1s3wwoU`GFDg+4wBVGZ+bVB=}MZiq89xidg)aswW{u^U3^7(8vLE}`T1#$AE- zHld$l5fU*Fdz;gUR}N@F09|KVv&k3^^s+eTd*Jf;Qut+d%3hea{VfgD;w&{uta5H& zeXYdX)71u%lF#sE8(kaT%DcvSHlD`2@S6%iIZ2Vy5~>?xLJT$?WI|@XoH%5Y`PU0;*G91|qZQASm9$lJiA@ie$J?-? zMEz?4KKcP|KjAOp3)AD3Ju^FK|AzO(SkfU z`#L>9YiACO*t;poc-tzQc5!s-X$->e*KOt;|pZu87-|%~9w`Krd-yx$UYZ zYdT6D6juFEF29~H9w!K=g2T$rkR~&A8;|17HA~ck(oQQ3HEzVGT}OQ=gWYB5IeYi_ zcW5TYuBAaPN5w6=piWD+B2=e4u&<-P{p`hK*C#DB>wYyF|E=*Vw0^eo{Dy-1BSbPfrH76fpFY&Vx%J$vHtGkJJnYaig4Q&) z=mlb3D+Wk$90fq&^LARZm!aYlpfW(GEtfFfa}5%!YcaFCvG9UB@Erb|UeQ+p`8Rf5 zgFxni$91*+0x0NyMM7u~Lu`s&(peqDR~uuYTt|Z1u;&;~3b_)y%?kJVIKeK`U^6P@ zg+HHv4~VDMP9f@A5TMda9t8McNkN=xp;RMC)doaCZSB^c?hW#Rq{~zu{sN%nh=j(oQs3YN+avM+m3CaeRRr`wDla$Hp*E?+ zy-TRTTOJ6$`PnZNmwf5-)}wE#fnca{t#bl!yw+gj(vV?8_Ise8wemkyweL2NL|9W2{rz7Pq_%Ol@UZtnE)*SEx=t^WV z>j*Kc(|vI#L~v9Y)e3Yh4=J8pA-rV+-9VNbh;a!-b&+$fHjEkEA$T~XNRH)F#At*s zqZRwhsF|_Xd+qEC1(oK)RW)Fe5c@~{#8{N&+10O@CS()x(Z7dp$ zVjd6wrt}0YoK6u;(~kNQ-}ZgU7)zS)(2&oFJqc8xfINI%bUqr?D0%cyG-z6D&1=|A z0sM}#jY=(uu2u=l0;v!}6DS>pw01u1B$2|Ha)=jTVBbV2hsK=Xxt@A{)A%r)T$5MM z&Wdk$fwpoW+g(2lwHvtswEolY8R}{}=M`J)YyDAch3Bsth+FlPUY`L-;PAO^jKN>7 z{HC@8Oh*S0kEW-~kkKZafsx-X>_c2smF2}nN1I3OEsuyP2nl^kGq;0Dh6yEHX$@No zLoZl&o?a&as_qJJ{O(*!egC5XonC}|FlFD5ttto>87kUuzU~fptPH2g*3mvB1`neq zds?=EM5Wbkh(ENVrzta>=?)x0Ge|6nsE~!#XvnO9;K#H-&;6tVo0dt1sCF)gvP9|d zfcwa)PStgE(=S~&Z(S?85e`)nEZs0g27|UgcUWcoiLx;o>M`ikuY;Maj5Lv#yUvhj zoIy2S=>;_T$IA*R9W*YTc~&zMb6@X1xU9Xf{@>A zef7?&tb{X;bk=M?B*1eiiK(-kjTNHuf#)M=_tf<9s6+T2hg)rCfxruMGP*HO?^`#n zg1IPwjF@Am0Wo_NoBl=ziL7oQ_$7M${Gbzmnirh3yq< zhPDe~WQU6=O>);g`--jMH>CNbUJx|W$r+{Qe~qTz`l=(!RKr@pOjM3i`qO@I6UL3o&kNL?K~q_9Fv zjoE=nvI!5G$arylEe5_SRD!n!pUJ+=h`L)N|4t6QvmIm=2~Eb7Zd%`b`e6E^?T5oD zjqNri(HC8>2V*mfKHyCU(s7ouvv1YD@;2?%=5en!oBf)bKz{!z+RV+U63~}cvX~acYYDG6oB9&da*f!;NTXz+G9Q z9oZnGAJ~CU$c;{@sG?a&s!hQW_LAacTPq#lqp89fX2R~&>^=f0h6nN(t@oQR+M#NZ z14SNypl1)i#z!8Xcl^cA2CFLLa*SSbK~drazSO%x(xV4{jPE}Udw5N`<5uCCJYX%c zUdZJOF`MzlZqIrwj_Mm;EiUk^4s2Tt%dA)mJ@Mc=7A7qze8%yaopbtBlloOfQH;k_ z9DAnU-K26!~g!Q=FlG9OC7hIy>ulR<{_6(r2%#aenNNDhKZd)$(M zjA2WPIl%g5Rj%0Dd0(q{hmy_5fnH)0+~I1P0L&K`;o@%+eueYVC=uMP45H_bgIeK% zz#H>+Lv>pubSjA8CyR>gRznoD&hsI`OsNW`!8F;aJ8!G{e$nBN-!EkDK%U_i0Gd@w zroww5n;iC*T;VEA5&oOW_1)UpdOZsM<&L$z>xl_V_pJpQBV4d(ABqYw@oSCHym2|e z@HjZs3vtXM0)a?tcP{Cff%l3S3S#AJneZnC*6cAHx&6x_eg6{f1Z0i|8CIHmEvOh> zaY8u+Wg1U%4RVosh5fZ)rnm$SZ1{451)HyDNb zmP=x*ODLcQpKTK(Qn4?W7HoVjf8zvG;-=#SS$@8m!5SpW)ht(zFpVC5FsGgtWH(y{ z#rn%g9hhn0wk}NC=RrLbXEYDP;?(1^k-xHc&{8%9+|<5aRPI_iFPJ`z#4LT*=?=E? zt_*!5dYB5(-PmK}F*${&lah<+urw#kf~YzosuvNrWJf6H^F*C97X=Mc6RS30r6$@+~DcZprry8J}jdzC-^kRIZcZAQKd^opgcvEa$VsWd$Qu;B% zIQ$fWdiu%3;f^>@{O7F~G@jM}i-RRakncnEFVjX17s0V(4FMjaz60+M25uF`Z!MP; z0v0qo9Jn=tV+zCO5bIQ2yfV#)!i26{aN^A(AkPG*!z=(?4Wm_O%Trjbu=F^4az#ih=NqeJDZ%A-FK&j8LL3$x`7~G9=47E6)K{qN zjGA>xBG)dri@selVm<-~$ab8Q_;(lHn5gjyNG8cSJT9S&X~NY>QIfg#jC@2ffy3L{ zzG2jgoY3cS?t!9HR5(($SRDKiWc!P+3quoub95e{l`4xdyW`_a1;r zlqP5$=Wz#?LwL#iVdCKH8dW!lCe%|UayGQmTMob&y9uj^<<-i zwP~p`jC3+oxLOYYn>fxPn^7kpyA={LAuOWn zYSPl8c(jVEi(pG)-{LQXVS`6)Mq0HKRjWjniIi_W((6|DN~suA^3j?+RviSbs3zBc zQCB^fmBF=KFKdsuhj+aI|HBQ_Pom^K~?iUfg$nM*f2MBH@!Ph&>!djmxHzqbfs-7 z=hf7(4ay2{^ycxxwDGy)yOdzO!SN?by%{EoWMy_2zZlu5CXa4D2L;v7z0kV(ObJ zEm&K2k&KIaMlLCX_0$~alb0h#W2UkL9kgz;+#ML^BL3EY@{ZR0fUAIV^ecbm@;lq0 zc|EEY2Tsc8zTWLB$OxA1@RYmHLIUP6Tlk6f?@;=9lrOoP4EeiZ8n6wJ1 z)Sqgt_RM==C9BxJ-#-9ET7A>)wkyo8g_Qf1yw2WDrGa z^9mfv{_+?oaKhW-R_G!rch?O^SvDebufl^RMv>JV)W{by4>$sc%fo=S12JFJN!jfy zr4fPp=Qf#I8ky`lo39KgQfs4jc(^n8Jtm1mZQl5@L-vOb?Aw^RGfakLrnE#*g~^$) z9~aCWOk{XcP`K8qVC|J2XIsPBX(BPyD55402i7YN!w^B#fKy%SW~Dp7wn_4bUwo5? zWHxyScU2Z!u3Ibcnx@9a%bf5Y|M0{h@^gS1KwCkit5!yj>UwEav3G?X6Q(*%5@6x^ zW(Whd`S@tI&HvkAYn#iYE7X`8<|LmNI)GY)(dvXg*QynGeg`D(r>Q9u=~79?{~pXt;O!Ky zd4p`S;BX1I%`7;Hec{;NIj>M4PM@m{_}Ue3(4Dd*AymXizWl2-3$fl`rQdP!gjmP1 z&=X_PbRgGhL9mrQ*=5-3z5Qf}cTeX;l~v1mfhJ2r(LN%#uo!kZ>wWByhO^6P9Riww$c&eA7lZsKG)D5^ zs?P)%VqAUDD;WD|VBv+<=sD8X1jFoCwYQ?|PI;wPN@FuC{KKn8Nx!wa+DHQHxOX$s zy}&Ed9amcd)6|?^`eQ)~E<6|;V*g8`MyXwg!U_E3ilox?{#x<_MWgOf;9%j#+SuyZ z>0_kQ-F<`7ycxU~h3*h((a^k>Gcf&IWU84Q<~+9{m6=hfZjs<0a+cm`44ibTZ_WR{ zIW!*hdew9PpCJ6i(8@Zm#Z2mjbrI^rW*MJINMwf*k`)Qc&QhorFcHylYJ*Jo@lHa( zt5&?bVfo5zaOz68erEn0tY{k*n!QaRpftO|}-8 zUUk*>Gt}o$qMuxs@mDZYq)yC(iPUxsknqoCt=u6rBTpVDmcR*bMVm7dFpeTnBp)6T z<#-~G8DPf9qgl457XUsHT<9>wiA#iykbqRQYG7b$R^0mHLOvu{gfLD|XYi9bl5VX` z9O1rnbbm#%Fq9zgqLT2V8(OS zno+8x^sXp)AL;Pth>6&nP=zx*@eO?II2o%_+)mbu5p&1FBywUs3OYskTcO}qVUUTy zM`rC4{-dS@3S&7(VFOX;%LtkCJN;lj3tM!6L&5 z&VX6F4zWMo7+fx;B7v9V%Owm{okF_$JOV)wT4~~T&nP;mzVVzA0VPaxKO**fmL4^0 zd&HwPqCOZ;WV!qw7ByE^j_^3}(HlkNCP#+~m|r5uRzbmOGb}AYD6u`D9y=#tQHV!n zbuT9+?xjMn4dm;w!yffle6cl|WRhDQ5k7(T}Z>s8FSGR4#9M);fwr05&E~p2jGCyxY=WZy^=VU$3xMS0B zrAiDX;yQ-ts^-U!ONeHvJfNVDuH!t1TL{u5G+#7djRZv0azT=6E*nbk6o_Qh6LP0b z;G0C0S*!N0kb0Yzq~yK@jPq$yjIxdkGwyBLng$y{F4B}+NEW;_SYZPq8EL7Vw3 zhQaZfi$}}K{|RE+D&~|^b~p}Cr{|^Bnmp)%dV_FQsg9UR<#hjxWo0F}7C}JD4S7tB zuLrC>vR)lLiLWlC4Y~y1cg?Qn&c+4XVb+x!pO2tlSn94=rnCT2zd=&8uCzD^Va#rz z!r6y6ElZGndHPAkTh0);u|D$Fwg^xhL;zjxa81jNsDpZQ<)G1?$qC=lS9uy$)w7!e z2p6yC1z%CK4itmjx``8saVF!>*F@+9i;9F$#?^2{vKSu8B6AS>(=21qQ&H8B>if1) z!m1nYD|HO}GgEajweiv2Yisa*il@d0+Pns?!5ep#%l)Tno?Lt!fjm#Ov&i9%h^a=h zKGR;h1Rw*>uPX1n_#55j)|hqHC^iJr+UNC{en3-sck(-AG%yqG54ZM~fRusW>lFPX zR(#uGW<ZT zclfLMGUC2jB3o(LQ5RdVSjH6`@lQ*tpJ6zJF?;AJtADR8D~tsm8bd87OXK9BE7BgQ z%83v8cBfUB#pCTDj||?OwU%Zn`%{(Zabv3WIml}d(@%A@$8z6=3d!jtqwX4!2mnHZ zGodc3%FO8w9ZxpB{8j@ygMyT-5DNTdck<+3)dO~KqJq2O!)((wr^B8?7>o$6)?w|l z6&K^4ctVfn*ru5|w2L6VcDDhK@_DK58y)&9a|&L#c21_GXO$9(r}`IA#(pkfq4-d& zhBB)qFNoHT26m4xC4ZKI|Ef6xuPR@gNYLbRTQYHdXZ_jZaghT?kmD=zJdE%R;&fEj z@ggOf_KIRaf7n^uJ=nP=FU5P!D^(!IUIQ5$d{XUEG>AYPLxwnan17Qj_L$cNbxMVX zK+Z@TewXF}>O{uVbgd*Ze>nmp5nTHa2@lF~FW2E|SX4cPx~-!GWvP4c&!A~|Cq`o~ z84Ev-_`3hu33f1d66~Wo`*65<^ix+OM1TkOC*W;pmfn#zVG&u2J5WFZjsq8Uu=K#A zE8>?;(k;GY6%&W3>u>vu|2ySRYiQo;!s9b6JaQfUyy+^i8Z7$G^?Mi*H5BP^uqV-8 znARU8TcfWN30BysnWu6aNZ?l5lY2kAACmSQHPaGMV?rVR-4tY3D5Q8&}%+X^V zhAUC!^VT+hr>2&h5 zpV6h3*spZ5V3V>jf z6ogyB4G9n9+ssFhxbHv3WcGZIibXFB=M`HI76NTRm4%O@-7Cn88PE+a*|PK91<#rRdsq=iwi0#QP6P*B@NBYJ!u*g%4-Kyc%vn1#?@AlB~%!770WG9^aBBh8%seX@di)%$bA9sKLtsgGivDmQp|S1u~F2 z{Hm&1$6I?!7clg(QZ0Y8(~H#Phe63X&1RAMiF%pSY#_zP-e9mv-_h%;YFUOOO3V|D zZa2MEi|0F+j#r5p1(*?0sd}Ah9-5xHJxKi_ybf88!e*{Y1-?m@ydu_+?(e(g z1&|F-bH2&F6{-V?6ct(hu)`kAvJ^QP|A{;6ow+spLOX|=N({`Y-)2*xS1hv;1Y3RD z*O-kn6ydaScCl=1#ay5mMpX)!aCAvolC*=7GE)hB-sJkspiY+!Hp7vJdKKr;nOi>&)8=*-NGjM z7qp4#HUe)QNi}4o!qC7Lec-WX@uCt5wo=r8T6d&Q3LF#qZt#qCSie6PL1D2>|6U2D zXVl0Kg;6xV=sPfmVNoRt&4$1#FbPona&9sX8z=p8qqF`C68ELHdQ~@L<>=bqhnvB5A zH)3jt2j3BLi_WxdhycLuz?h1Z`~OE8_tWp0c4aK37T67!QK;ba__>Q5^ccjKH~V!j z`G}O;H~nuRd)u}P)ZEk8#@GWRP%Ntf&l72~0uqofG+~()Zku2n@E#=+NujwG6)SMa z$Q42%npPOXfLO)KhbjZdVIXMHIQT@71$pN&U? zOy6DMIGFe(sKIrNUFSfqP%a6tPn%Kl-ZF~oJOhizATU-31 z)v*^~4+~#BfbN_ds4k>LXl&Q;3mF~#UqS)kcHU{6K&oCmLDF>&u!*-4mZ~&^|`9nAAT2~e1T)D0{W<)kKqMQ;U(&+as zf(E`cQ$|(6h3xW=?J9IrbBm=ZREv%XVAJOvhDAkHbT}kk-1fV~&Gex5b;T=X#7_=; zEgNbG=0naPn8hlXSSmL_ks=!v`6sZsKszOEf7k$eitE&@+bzwvZ$!WlXxi<%%q zA!pcxraUFdNMk#gEN^BKt`yA?>;80v_r#RWMZYZO?k2ujIB37h70WV&$Hwrv?{)nc zB{-5*uK}mxtJ^%`y|9+4?t3mh>NvK9@5*HlwyK9up%k~dtB?6M)u!sHQ^JBd@e|NI z1dI_zpeSEwcs7l$K$%^(w)4vOE)Xm=>@x=STQ~d9h1O=RXB@RVxp{Htcfg zM0gF_ei5AVH$kSDP>|Bcr9A>K$6n_OFiGPUxsXaJnF?j$W1=T#D*tB<;frx>8AMsb zsU~7(PzZ@R3cY~rbp3}(v=EHj=o9CffE_Im>2tb;x=#xky4I?MhSIsRuE}uET23OE zwqz-k2Ma-#yhX1VJ2>l92tEJXRCH})Y5rIOWEe2P)Sb)={|e$Mq`#G_H?@bI8IGd? zD*N`^`73!me0mRES*S(#47mn=v_=ung?>UkIPz+$gLz=lHq;D4kc5*6!eB=FrEyzV z>s)&v4ieY??K$1}@vce&0HXsdRB?R0P5SG3y-A33Su4YjV0NVy;Pgv8`)*j!1MWV6M(tuT=c9CglwP9OVcRyT(k zsX+F7UeC|}giEPclp_;nXeviccuZ=WJ&B@Auk~mM-)fAdHGd;%j}HwS7Rl%YwY?N8yUejh-i5?HgHE{|{gGhg zt)UlF*iPNVtdt7DDY?${YyCx?iNYgZAUhl-S%_2ef-iQc2UB$yYuq%oA;pD&Pq|B^cXlo z!BPG2+~7ENS0NA^e>fUDjgy;G>6r+Mr0;2Xjw_jX{Cq`A_Rs;4CQ)@*hSg} z%k|&!(+A!aZ6cN1#-+8stFx*{=t#{Iqrs;);zzK=m{Z2d8x7cztgC98W53{5G|q9hSYTrgB~WANm}gC(^KQ= zi_S7qsym{!JimetH04M4>D{ji8AO}yYUkdPu|xMFR2^`ww~`RK`$Sh>@N5Iars^o5lDuFGUdaiU%0t_CxJ%2NH*Q}#zs(Ly&PaaE2wXZ0449R zE$u3xvqTVTK$(%>+vjcE3U>?a0}J@ga=5E5H5<^mg2ti}yIU=(wbgM1x;ml+I@Qtq zOyYSzLmpPa9bXz1=mAP6qlIz2vg$slPH0Z8+z4!u#BODE=7>3>&ZdAI!}HjAUa_8p zT=$Z4@p{sk3jDZMk_cxK{HPwnbt7Hk3qB!9GsCUx#r1=k*q{(*T`4GtumKjQwZ)LE zhJn&@P`}Q=7unS)e$EN-GtW;-*G-J2zFf4kdz8GD{!oN6k+q$3!b${a< zD=3L$Eunzs;#;UQQiV8Yj#6%rZJ{k46xs75B8i3(hr1mB!kDT_{nG_&>pL@QYr=Uj zgsUeK#XasOf5KwA0tHdm-QaD=S&p*3^+=e;j?08KGzdL;ijHlLG zAgj>m%}5(pcT?oXUHujQp{N8BfJ<3qDI8-_M&RC7DAd*vRu9b4IB5mftT9&VYu`VN z@}ae@@9uoPl^L+&f4O!@m=4Br(hrYhS5HJT6=(wia?{DjSVC< zjr$^1*UgovMzydkM6iC4k*}(i=I?O*s)Uu%?^E9mxl;K+K9XA_KFFaB5DV^95SEpU zc$YqAg`QD0M@!ekv2o!PcRp8VPw8dG<_-9Jt>r$8q@Tn~uOfYi&$;uDu8 zpf*G2In}H)DAw!v?_MT5d_-uz?2|>H>DqUl9x|cTUr>`wc|?|m7FggolQ?vtf9gU? z+<)TOwK%r_SBRAmfcQ>&PLUgN2{maH3S8m@ci zx_*CBl(GH4Lc5#-{2tJ~I9>jkWO`*+MMut^Lj*n;QHz;p!!yU+nX*|ppr6S`{3OuA z!rp869XO#j#Qo3a_153sz<_TN0hgSDamxgL>Pq)419r6%gEVoi;2rn?I3i%*@|-_f zEJ8=TH6l1QkkRxTwCGStqk@@O`%@w+*SL5Ujssf08(Z6H(!(a1N7hb4F)s6Gwq{QM+lo|6Q?M9p#=v_|dfbbR5 z$34FMLy7;{vb3~wKr~2ZAGz75UmsLbnS1G}z96(F_#3x7r8Pj}EMLRS{ZKatfM;I3 ze!wS=7>=Ksr$f)6uK)|GxUOP^f^CG}nAv2xNYXtrM+*Czoow@3=Y}0V+MPa#tWediCf_uUI>D;xonkhz>kQW#bMXg55&@ZQIWrga)wkSXDmSj$F(n^U#NbhjqyzVlc5L;BM*)IkVs6&M}J|*$U{PZi1Vs z*aw|*>^ zi~J##G+e7}{x)Z0nGJ4G!myfnP_ru|D@#uJVS<71;AvO_m}{30;^WpsaAmeWylpfz zeVIPR0oxcE)9ZX?lo+r-N4t7k6>BBRXA44r$lKKSE>XRXM~V*Uxd9FndZHUvuow+5mh?rk znnmhZS!*7?3lvPxutnyDzb<`4-fd^<$_;e7Z9iytBop{*0pC*0J*xM&jS`(8N00oC z3M&54@%*c_$VW^W=(Ts;=YC)7{YNMQr{-`naz!k|YeW(C^EgD3*tl!^PEqaltnBjh zl2V?Q4vwS$#TfX^rP?P?PEzUuDGmdr*JyN4a3v?g!J{p^3>LOl?Q#o8=%&9I_u60# zCzW)YxAa}oJewf*9q*O1;0e-Quw40$2stUyjnCoQw|@7UFM57x2bn~@Q(tRz8wQc? ziE6XM zOMPnT_M!k!v5ePl{P&r|=U|1o>pw5Wx$R+?dV|iQ8dzp5nn5Ai6x+$fcBCMJYknV- zZ_NoehN1&q@7MuCW)7f{4AH_vQc;Uo^~S&@r9IVRs*cO4pU{flEh%&z-Nu)~0dCDg z5Ex7wzQlrr;I#z>f3je*62;~G(ES4#*7=%E{uz(D$YIcWC(Pb`Z1R%fI00EaE-#t#@1A5D^rA&y6r_4`-gL|1KQCh+S9in zo2o^5j1Xi$wK=>F%(3|L42jfjH?{_b*AE&3UnwrjQ@ zsY6pxz39KsK?ToZLy!A~{tUdanB#xz7P7^~y$tpEiTgP|lry3~!BEV&Ln`n{|#4IR_cUWyzxi^iCnA5d-!7X!5_VAT$bEw|Bwp| z1Lz_6xaT+$9d-PGPJMF7%{RvJxfd{ZZUMc*!dP}Be3ZeUK^}~ob+BXh<7rM(KapvT zyS#=HN}ul@Vf)Z6yu79UQ!kP;K_m>P-uux?st*@gWLRUAN~G4Ra5(6-*y$w*>+kFSFY-Nj@3Q{VMAh%-^()uC5q2K&$EM zNm=mLi+&)o0Nsx9Vu1180xmC4Pop%y4kScxcr8%;P1LhZIC>Mn5p^=b6iU>=#LMXW z&cEkg7&GuU7j3)wmnK87qPYg>;9(Rie#W93AeI|jO~bGcm7FCvs1Zt!dOaSS+eL0y zleZrf=;T=8X&$Y(W=O@Cl@;JoTFz~>4o@Z*R3pWJUF{A#qQkH0wQeN=0k|op?=Mgf zmW#n%I-cQB#P7pIPvB>g;U!ZFzjomT3I0AYiqeaEx32XsX1|1`9eQYm-w0vYFW0sA`V|YOesdHn3SzbL2n6O!^w(8M_=kYrx_2}C1{&8Z-*V!R^+|C zNjv8I_pent_ngA~(3$AqwHeHYi|AJ6(j#%L@!-RnKsYq{(rXLitDTynaUMx_PLrP< z4Oz`z!AQHNpaA+rAVDp)Fr&!&a@G5y_br!tGVIIq@>Ge<>3GRSUCLwUQ~OVxU&wY^ zM-BKrn;cDtErL8}gHwalROmMD+EbB4?ku2-b6YMC+L6&ij)Xv*hPBFhq+P+y5~KK3 zLj|&33=H59MU96`&|z8x6f~K|IMUy%?i4UTIB|QK zb245L9?|1(XBW9S>WBK%_25cAx#H?8r&8zxgpEO+ICoNNdi1O5T~_b4h<6h2yL5l{ zuU&9~WB_T8&T(SDn3$M52&M+0`Yv715lKq&z~Q`P@xdxbE?SE`@DQ7#CbJ!rz~*g zx~rZ(54u5UXA))M3+YvwWxXHSF*OfG;{9H2UG>I%kc;XCp`YPfXs1HE&}ZI{P>$MqtQ!v-2EGakgNFcPf|a3l3TA-F`9@MCNOqbR5!Sx6(RD8)i*%xB|#GP zBj`GA2Njq3uy5G$_MSKlA`H2oFZ$DZP*Md!~G{u^ec)bQ{fRQr73@GTr}kPxUTy>H3Nd z)0OF$Dhbj@3>HL~psFBnzoxBfZ!X1vD0ZcJaRxnA%z}Q2m8jP}1oUZb^o`dqS{Ei5p)4eX3vtDyW38{K6#x8tpD;&J;wr-j;KAL9 z6ZJ15lYQ??3Z^8en7j<84h*-(eU7gM0^vu_Dw3d^9c{w@!R>WMZ&@}>Ms?+Mw`=2!ow0Ku?-qP@McP%jTe}LF=u5)wM>)px2263LZDTfg7 zdNB-K?umnwFB2IY%qr`J!$!rA4!~Ez`9L4%#A;xz8J95 zNMYf$A=3;bY~^odz4Rp&9s*Lqv&G6Q@5#KzL|C#RX0nrL5#KbCh!(Gww7&j7PKoP^ z79599sD_$8GX730{wD6o?ny@vKxq%@QwSgA^{VsJW|fCO!s?_NbtH-IS?IQ1Jjp*~ zzcWx6N9P*9HVA!Pqu7w-%&XQFNAWc|uY zh83Z*zkpG zr~M`lEh=883DTtjviYCR!@^24>GkbS#cfJ|&(-dk%90M$y?t?z?WyhR8j`MhVSFk+ zM}n60Kep~zEy#z+Hpg{8qr>=uc%CCdg3MEpP?V(NZ@_@w$Q7vJZ;**dl{DUVRwPqW z0%5%=p0sk?7~d8kTAeb?g#StGKt@2KKR3F=eAXAoq7O7vI%AR zjRdb%L$(Hi*$N~5Vk-dVuQC(tm-7$!&~pSD;rmw&2bSS0#GZR;ZbT${JS>nQ=MqyBG2A*5$S%iY zT~@gCwrE#Gp_Tn6vB%$zIy1;)fCl7wilGBR4D3%tT%&FUT`R{;@fYfX%xu(QP#m1& z@qN@aQnt6g{%zXk(UBmBfm;*Jn2M#X**fVXc{Uv&76D`~*o0;~;`GUXGP-RpOncWv z{&!h9d_pQ~8HqQbU3~*&rYsS*%{*sIx^%|`fOkP%$0@@wbNhX`=)=9%`__O`(!sMw zdi7X6yC-9`%x(aCYQqzzkBKniE-l<=2O_hfe^3o06liiT5w~e+=OVQ2WEm|=)jl!# z^(01%I;WG<@IW@|1nHmectY- zeV5e1MjF@?D%o(a=U*R9qfB3RIeao2982sCE7%H9mhfse`hVgb$P(8=(@W?ufxRJs zEja>p?DOUJ&{qJ?%44yTrY@kPi8wT?opvw<3ap45WqIc{7AJleJU|5mHMoI}#ew*C zPo69LbLBHDiu?^=4SRrhl<`-j*B-3(>ke<+dnt11U-T!xU%UU683yU5A@h=`ONmEv z3(JBkGkq!40%_)W9~~53n9gCr8oWH-^yKvf(`pJn_i?C=v|(KzrZtQ^OG1j;un#{7bu0jT%WkNF|^lSrv@5KG|KDC5M2CdbIEgMfZ zD!YWqqG{vawmRRr`BrtXhnL;Mmu=lbl_&_ek}!peXl5rKuq%faemA=8%2dB`-p#Cc zSL3|#`PI|wgcxl!Zu(}W#;EHgnT1-~agiYtbHhz_35*uHEw!Wnu8j}&{BY5_WH8C% z<}{DUR_>Qi4Nz+ z;I!<$FUJ|@^cpF*;koT}QUCACeAnXFV^j4;RRJc^JLnNzJz zwUSb;qJiYbWoP3oFe<3sh4Tu-5}}?(MMP$z^i)e{Yw!~nUS=A$eJi|@-Puc;WMqfQ`bx1@H4X%J8hCCWP*TfR3!|wT>*vioC28S z)aS2MO&w^Axdws<`BNv`hr8U44sf_%r$=mfm9rBz@{%#82f)q1=e_-`raipq4+N_@ zc8Ysu@~Kk6>`Tz@;;`4qG`!CBv7x=FmhZ3Ff$PWU^|x5^bwZp@aFZYT*e*!yuMWw6 z10S$oq%ml-)G1>!MYN9W&<$1BFsd+W4k;m0m}GPe|<`^ zMK>n{qbEu9CbqYL)A9r`OINu1meciO-zUV>!T5Wl#%ruxG;RkPVPm?c_Q5wDh!6ZN zWVy}mq4})X-ep!&^(U5i{Ls^uhl(QBUj_xpfH~*7ZWqmu%n>0e)!3q@Qk$k4R*4=4 z1#4SDmAKKHS~%cTlFG8>ZX2K;DoeW;JkM6*5pI*NFtkGX1dyG0azJar*f-+qljR*snw7ndkOu{Op5@14z(&J?J3E} z6I|h@04lqeD=Q|ccs$|{Qv7Xj2O!ohR;+{I^N3f4C*H3itIVS|6k`_ape`4v9fq19 z8nwYxK)oC_=S(=tLlI-Ze-D_%@LIBPtVtr~5)2Sf!K*_(K%)s$5JDJsW(bf}2>KB~ zThsO=IgbKT!E6#wp$Q=4{g(Okvt}(~T{a-8sY5L73!hcnx)o(0txW%#{Vu?R5Gv(@ z2arRG>6)9rTvRzbvDytRtRpcq^aJmTCwGqTc?|2x|DPPSU~#uC$`J{__{l2(Fj!-t zrF%71(=zikv80>VBeY22=TCr8g;JrX32eqPwrWgd?mzGtDhGr#G>kYf#&UsdT!hHO}08Oe003y~ZhEouJM%VI5~ z2Z_aA1eV({I*h`8pU}49>=%GB#Z);)w3!-A@<2dBBa*KPvo-IE&uMf*^j(`EF1L$|O zsHU9Gp8L^Q?!#C9eUWS`j0Cn&e`v35;Fz`|Rw%y3nk6y85G_6+E(G>&NEA<#>`fO{ zJcpRQ2^Zoj`tGR13G@*)8<2S0qvL_3_DTe2@f-bWniZ6$*&(60Epj`v-PBE0Z3^sR zMVqX|H=_pH)Do5=b=N({jPU!7lG~hl&7@a;5b@+FoYS2?z{N&M>g+fD4aJhg*2j%> z=Z>1}5YUA*tPzWBNznzeJtjoza585MLZWAha^y zT0vvL8kq(#BU-+|E9gd^qzlvx0TVCYUXxZO(C#e5#8!Zz%8j~ildp(f{pC^|zAwKo zTijjD-N!tw5>`;9K*Y0HrnmA+LCk}0*!_bA)tM|c8-M)HKlS-+`kv7H&RMXa8JQ^H zKaEt>W7EaSg;pUb)I$h$l?FIBW9sJomKvp|1O*}R=pK38Md|S_aGTW5H)Irv{9=6- z*0;gysvFf8p+pjoOcuR#nUk?qCQ2V+vTsBpYT@X#_c$a(0U6DIp$4aituJJFy|6sY zoiSQ@)9B+;y)s+*;4rdj`n0MIA};o7M^TIthJGibC~0`N-{08|a7>j_I8s+vnQ7tA zfQR1=yY!%{uHAe{zqb+VPWHUf)k}7U?C?juTYYJ4hj1r0FOXNQ|?SrHc7$kejxf?R@gESQsqjFDBL5*^GU0o)1E zuR5Yv6Wl)vEK{> z3pWr`3F!}}>@$&}+JqqxF#0=i6>1(oJBk26FtV=A*OyU}i7P!}L0QqD9Vl{<1}tnE z)ewW)sL-|(^%&lC`p zG0~1zGo7!rFoW6=?!10gjeNC*TDFUe>bSH3g5>Yc3#mFdsSv6^#Fucad>r6`xS7W0 z5^M~ko(F5wMy@2CklDlW;mhaP@x-pHVm`B2MJWTB2UvQVuS!u1&~-7hM&1B;L)KnZzhj7)8>$Mwk9AMtvXA zU{{aWzBL#y3?A_xvE|cfUp#NdMD(w08P*E`f?kGmWZGb?XPJJ&>d|mN$k{@h_X?>V z80aJH1ax?o-(g^eQ}Rapdy}Wdq_-v+zxoiy$Pkc^7%3KGOEAA4=);k%2%u}u+@hA| z=Z}bl@ZD=BRxc&NFI%dnRHJH^)ftD3rlM{nF$pZ;X(hN9%J;NUUZ&NzH915 z+G^I+x-1!NnmiCzV4k`&Z|_Z9Yw`ZGisLROs0RJ;?NHOMZgDAGc(R?dM?6Dm@~ztP zKTudC&;fF-adyaT6c`(tKOT zE3Ja`*}hEm2rk_jt$YGenx$A;CG|zGzN*QMHS~XAO2{QNw8h z%V%ZIvy4qiu>|o=n^bFfUk__jk7Q;N&-^WCp;3h29sp)D?~^*Q7KBh2A+tR`g{dt9 zB$8MpxBNu1VO^a%o!`h|u$GU%S^G+fKG5-qtxnhLEi^2>16BE!IKB56TAY;-{|)m` z+N|@rtUPuc&YX0kuJYYo2r$_uuecnQ8YeQYFa4bwitU_3bL*}W@ly@=`IXrKRXG#& zU3!bFhm+(Zecbm+2~_XQPj98;c=@kaFM4iUuFb%AdkOT!^y#hf)UP(yajAVB0K+mm zLR;{#izA%TaKOP)Mvt1Ji6cr!$>56FR z^P7merWWto=3sOPHiU0odF}G3?DJcrVtZf^9eR9}FwNAh&!Bmpd;}?n5PYX*rDt^k zh@|?bU|-ONqcN$)@vk5jwqaI;&@jdj`gkF zbBy%~4`tdJZ8mQ(_&beSCOeaooVDx~#-NJ~(10%L0QNnjcY0^xTSWP*iQM~TdYwAdJsHHP;q0-M{i)h-hKyv@^L zyAHmmCWBx1_cu=>UBmb^&R?wVq>>*t;e5M|v-R2?bh`ImBCCHN_@Gw)jgSQA`x;r$ z(Rm^7q|U$kbu$`I&W4~KJqfPazWLPIa@0-aea;6g38j8cS-@( zaHpWBb4?>Z3SP>Ave`tF@)ZsSAvxjy1lb{6WOFfXUO*17AzbNCyZp%aVeGG{OU_7J zs*pB*)kC9=8O_&H3|@5CctRB*m}sSAsqI5pa0JWsYB`0^f@^Yh->%}#UVM(~dD?M~ z5EJKQ#+y+5cS!Pzm&1;!0UG4U#T;C*5b}lsq#)Z{_E6o0IzqtNY)n?ioRx;w!MR&T z{;%GDy4QaIl&m(rRFbh`wh;(p1?DsrS*NNJqzQZUxmcaW_Y#k_a^^|LFTdsZtFL&S z&8A$^pW9YjiWw>I2u(m=EBsfD^Lw0!MR-1kgD5Ao7Z0mxYB>1LH0XaIV*(Sl#CZRi zzN`X_tCuP?%c~K2c!eGsHw3`{T)oW&|EE=~v>JG_EO+T;{iuwzLkoZkK7D-V=g&hh~S0ZyVO@wr5LLaS|Sh5XB?gAqq>O1pRSdp#DAphm4u3U@iNzUPs3`* zHkJ~D*2Q_>>mLbn$gTJo8&0-Yt-9H0V!Yw%Mg}7@AGf$CkrpI4Gev*EuqTo{tqRYr z^nNaOA)S!`bGMb#A7VD7jU{LaNeWQ}x!^3|H0qT)VXl6H>l$0NUNvn}Mzb~O0VPpm zET;+`V>#*XZ5nVZPsYxP+DeXwvLd4nR&#b+4^Nh2GCNj%>>hJ-O6_{fu9nF%Ty*Sv z00craa@oVQEZmd&)BcTp&Ld77+u!p0FXpY?$b57B6wHH*HJFtwaPY9kb82i^UdjY9 zpGdH3x&fn(g8{6R+(Lczpph z^*7Hi#g|QofH~ zK#g+J^AiTm1I)aC19=aH`}rVb?cx)n_Q`1Uhyf6NYz(BAg&F3L>5VR=vu#z%QTn(N zA63nXiVH@oiETJrOE{ZCUNC5icN4Zlt)rBrG97Vq=AeNRd^d81Chu_$Ai+ z8vPHT1MFUpas*Ocgm`?BL%d&tUqC1f?)~U_t_{QAFAh{C>XXY0ns0v}j(T#69Z6{J z@txH?mRLTKqC=9g24GlR4H`8{W+ucT^H}o~ay1h(3e~B9`iNJ$J0y#$Fvr5Ku)a0! z3R!zjS0eNCUCFcoSl)u%ddaP<3icK&r@N}mooQQuglkk@HL?F%;iyX>I#+5T?FZa9 ze+!-mr4ft1(_~aJGL9tded|DP{Lu0Y5?NoT02;w1V)CK~-fyuK^wK*GL%Oc6Pbovk z)-f1lXBVr@iGv5}cx$Mf571~90K~!4G!i8ly>RWBuC(A2O5nSxY@i|^UJnK49I|yk5)qLvgjmqI&^nx3G za7Dd{$Q!JBFH;5b5VWeNBDE3)xlhyq=hH`b=5S0y{sCph}*5CWhglos?)%`mjPNujgE_P z4hzT8aOWgfKEyE?=}~u&E>vtKy0_|R!o5i$)EuKmr%r|b_w2i7=POw$IEN`mqm+z7 z9H$3wrut5RP1)L}L1Or^|5+QSY>>@Wvq>_;P%6M*U(rdwW%@?1<} zI2z$MVEx=D0+Ug{vGV^+{tKhpFlJ#8h&V4{h5X0QU?_ytkb~ra+CZ#>evENpeP@b| z&S;K#fF!R4s+;r_@CL831#TeWP}Cb&p}ML8MTqOx?=37+RLr^p<{n2A7zB`FpT#tn zD#*TeO5cHY6)$l0N1oKKYdKuRg#hxjbycV0`3-E?a>Os= za0G$C<>xQVN3y?vp_G6wnjeIL2(;oNjw0AA$BP3UdGW7cxU&xIMeklfkGsthAjxi_ zH+qO7RvJct05~{zH45!tu5yF()t+RRwdsxgTY&zc?xAFaxv-@?Z*eDe*i^^{bj>=b0GB|P z+bjCi9zQ6L>kZwc0o^ahP77WV?e&+8X*+fE7IvvF`(h@=vVjKEpf{#5*Q4Z1lT~#X zcAH4SI%9lV=bXe92A??l(J@=NbvG8JW;a|G8A}D}))w;~B*@{wLf@9AIHhDziGI># zHY&MUmW5URq(f_aN2ihTn$rP8@T0axw#UdSyqGSt#Tsee(#V%KJ|W)(H5d0?^S7}Z zUYhYN?_5i!_1JQ0L;%F$&T!8}x$h5SGpE#J0J}v}X$uRfwUm{?1AQ%I|iIllTwiL1-GS%HV>ENvZGJj{cjl!B24w*UgbUL~oVnrBLOKgagr!0Ct zq6w}FXzJGBpTGy-cf?5xohZ^Qyb^57Ya-LcOhY${ykG(jiNmJf_&5Kft+JMS!f>ty z`(f-&g7QsiQh}o##AH$Apc*}QT6Sn1UixvP+m~!n9%`clD`59JrzOzdc}e#kzX{=_ zBB3qMv?;an=N5EjUK8J}!utwBHo!2Qx!AqFbR&_U>vv5k0Nu=##Q{^%o3ncEtE%0O zT^*H*b0=8RJ}~Q`pOnP^7Y(HS|Gy&7;gP;PT6-5-zCUjnF>JoK{cr8w4~B^lT?1Tv zL`uZe;&JmaKn#-S6PIG$PcCo4bd4G4Ln(11^GllI^pJ1ygpl(Dl5ac&dxN7#&dH46 zxk^V7q|I$^y2IJsA4bl~$VWf+d=>i@ZfkR}+&AGYGKKPl45F*W#eW%t`dCY}h$r@g zzz3^c9{5DlyVo=Al+;f8(-U|_&0qW+A`?PuSI5&K$w=|M@J7I~M6hBHP3CUNr@RnB z5>=&Ot|mfI4L#_pNiCLErw(MMEN0bH`N*&kH>3k#8-P+Q%;{=Q8>t)zAJqpgVTeW$ z8l@$g*=So81HG7k_EJNN9>eU^zaN8~pivon;GA!Q@sS6@%Em-To(PUaF<-9gvwJoCY6xTeLCA}B6h-m@w;Q-UitA|dCO@kGw;za$;_?uNZ-3TX(DXXe#PW#5rG zR`ZV}o4!Dci)Jwk*||RZeBsECN+RhfFhxA8Y_T>c(F~$?Zv1kH?f48!QOVCrh4o~L z>4HlB&m1?~SJ;MrU$&|mMUC(Y!Pkx>RGZo4YD@)A|qbSo3&Iw1Wf^B zF6op!GS&#DT=t!#IT`$T=OgIY6rGBE$MEIw!Mz>xJbaBiMOYe-Pn@S33@F9mMTf>h zlyy&n66+C(e8-)6{xMMEU!@fH9iZ=?L;yEIVWMo2kSmHL2pfI+TQ#d@@(+LOc)lM8dpdF!UTfrOyc)x&zGq{pfk-M z4K~{AQ0`&%m^nJ-ivnMze=j|7D_+m7r_WkNs)uDqTns7>j*01CYN_C_a%j#Fq-) zC>7v8NX)uj47Ws4F6^x)jEd11c9Mnt&phC|^>*kwN&>CkAw%4RD)lW8+0U7c zJygNem}h91#QQDuo6WM?S&D;~73Y1t zgpq7EWVRMl5+)x*%*#|!WL|ipBmt4VI^rX5mCS4ek^8Q*kFlhpCg_NUmPuwfJrueO zmHLUW|BFw5HGG0GExR+RD_-#BN0^`WWVu}g3;e~Q6a1#)euz@WbJc6=>#?-wdseIL zcO>=R%7N;_#Yu6i(^&-4-;*)Z2C(l#PF&m*9V0CH#-S{ijIXNkeDLf>gAjj%2KjIe z*Vt;>d)6p4n;sEWPU}q1>@H|0XF))QkwMTiBlaeil^SPuMKjG^Xpsx@<`!8csEQiQ z9}w8-59BS^93K>sr~_n;?Y1BxD1s7&l2y_jUDR#H2iOrV$Q`ji`U<%|94wr?IS5TZ75mBi0~!Rg}!2%jb0s_X*E9p5%;e8xT>(6DmQ zMepxcIQ}M>=dE#($HVC{n`xZC;EEkYlk|o!ciakGbz#9k#qw(*gEvWA^b0^fIquHm zL&w&YY0XwQ4)AOGY}HtJa({E6aCQ`T<;jxfTj=3S?aey2P+;-yZ&0Yj+R7MhS(9R? z6{8pxrL`n)vXM<;t%eLY0#qyI1?=m4Bi8OAz$3gR-(b}XxIsve zpfXilF~(Ypp>mv!@%i;f!&BH}36XROI_>(zV*nYj>1cjG0_98=2n}`K_931&#FLA8 zZrx3F8o55fZAZ(FDOb20N0S~t)4_hzL51=NRe=(q&v*Ij1(0CIRIG~Us_YbEBE-eh ztjPH$GU_+W8yW7*u11>?8j=|(4-vv7up$VR^N?iE=VJ%%Ph;BB9Qn8b@#OBLE;q+w z(=II#KR#O{%x?GZ%?Y1{3-da=nMWFSH0Z%-BUCVA;{RAGVOhJf4$Ay{fH#yr_5Ejp ztgPQo1$l-a%+uRCg=%2#MyAlp7_?~QRB>XBm_?Ix_E^H|(Sh*ZySi2`<#{m%N)g>W z#u6VOa`+2=t>iJX+^lpgTWr)+zwbl#w*0<}OyMH~HkSKTaSErx^je&7KY_7X>f4f< zgkiJM3x8=m&W^|U3Ciu4LW{K=_^?xPkVSSkO7xBqVP?*E&=?fgcI7V%K_yDix62aM z_fHj;5)>$HKI~;WN;83J-^s24wKlWMV-O_K4)lDSoMX%rb8go)0SMDK=^NJ)2*E}U zC8+=dKBbPi&<|sWN=)edc#zs?CSSK9$6I2MR5lg@8FX1!<5{;TK~FV%`YKut0~GP$ z*tcS9%`v`b4#ighFCn?8;7D5K@ZT_zCAEv z)2T;^5u}fYwq?J#Z*T11qIwjlqm5}^hqRs~4wBSp*>%UzSf48x~=TfN^)u zK{A8?p3YM{O?ZKi;uW0YLwvXg!aD^MsZamKfLyoP*}fh)a)ZT^!>Ro2z5RGjrDn@N zlWssOyV`+Vkn$8yVrW4G$ygyJ8qW3Fbb`E@{+3e6S)BS<${hR-LF)9T6Q?75}Lz;J8G8W z9b7%x?9A*^EM1zbKhF7qlWjso(Xxpfum>6NLYLxj81QU#Ccl*SA8ez$X%;l5ni9H0 z!>6}O$Dms8E;xqyjEwAZUJL7ieK9Ka#7!Pu=Hy(pYU1 zVxl`lO9UcXg+~0_cCbWrEPk#o`9hi%9#l{e7k_O4VoHRhk`}U*@Gxu$OwuVsTvxFB9M4%qMEGBUFii9v)&y=5nUKwm6#1!@vk*D4xDdExFc(x|~AKdH&Y+RH^P9rTqcO2~5Imzy)1{;gSE~*%k z+Gx7AEB2ec@2M|zhpL8|?oW?dZESQ0)=|(TRyJP;U)P5z!NV)Uf%Y%I+5mi+UfzWTzO$sTsP zBq5@LuEk6(AvbhX^3oyem^+wMZI%JJ$94921oc$_dT7gH7bNK98T}eDpD$GTW zl<`gyo$?_)R@7GdSk1Y0wE9_$=s-W9wfizoIqUZz8U$$LRRSBAh%waTKeDjrVtTti zONXUx^Ur#z?wJuqqAR?Q&;BsnCG64abW(w{fWPG9^xS*92&zJMh0fJ-0?a>p zlL6A8xW&=ExSX$5{a-XeLp|Fp`vUz~Ssl71UM-Y~0P8q`TXR`QUahN%XDF5@-@gkLX))xu{c=qhXO?d6__CYcWvfc@?!5RnZO>MLRZ#)Mj53h_*+vCICVN<8k$#$Pa z|D5J+pglkkEtJ(=W!op%lzeEN_=l z-bKka8gokXO#1~mK?FhK^P6399GX~0(j{AS535}1HX|y_#=!U@BAAMK;!90qU843 zog^?@vvxp8bRaL4IzSlmQA~(dBZm*obGQmPf|$}2nR4z(gjW0`Y+(dtO)2xTC6eJG zq8s4oOb+*0h9^T>Uv_W1I`fQ)bBIv#JbP*^rU2>g}pU&pmIp5Z-F0MhMl8De|6oavfJ`v0`_7r z5k)%;I@_F#+LP-sqg z7uf)|BXYwDOr1%!;%{6ELm6&}c3NOa#p)pBj5ZhRQVpeJYsDr?tv=kau-Af(f=>#h z&2CRi-XF}97vY82NSVxG!cFy;Yb+qYDH|F{%5n}xM1ld+3^RZ(VVp4lXP0Ffp*7PY zxOSvoV+QAiGao(};2eY}QiG`w#s1GIYbypmq$1!`VNpbM<-M{)!#CC3kR|VgNAYpvsWZ6$Uf+JAE}cd~T;(-8V;`*L(!@g$i|jQdo_7)Q5CZ-QpqGJ~01@M4fY%;{F2waWi?c zWBjriGRU=MN}1-RXl@@N(qJWR2%IJLb_vDqv0%dV9V0Z`@-sw)e3ZruYJE=8WZ2r? zb~rB=KM5A{yJp)3cDD3M?RM zo0p8LKs-+DD9*8!A?^u10QnoaU!OBlGzF5Pb$Vu1Ur{Kk!w9EOCuFxq<_v2eq(K=! zx;SioXzw!gJQz0;5#Zp@$3I%$P%r2n8k|h1FAtD9fjN2ji2r@{O1~R|@7|>E0~Hlc zq<7647;1bG<{HN>;_d8!p!XwVB~p8UMDInbJF3Vnd4W_K7gPRcV7fuhkmp53BW>B= zSaR64$i@8gl*Aa`dEFpBbG@Ac9jM+d2RO9C*!8UWjmbBgvvW87{UzTEVlcR9lFeO~ zdYbe?tSwi&sEZ@wkZD?1u}kqtzNu&1Wc-ju7?YiQs(CHqAsLnIT|4X^*2Ds0Ysin^ zr2t86*_I0(skQ2fKfy}m^!X24nfPA-Nx(UJRG6xUEL)oj9}!TVzZ~DrpoeKv8~-{C zzdJ*;WJds5t7oB7D&L!4Xtf(z5-gV69@0C9$utN)74sofRSUx(OC;+q?Q-HwfCZ<;^W+UAO z2n`!PYs7KutaT(9x7?frv9}4DYN^9nGz=AeOMflG&Xj`hV9@@DlmC1&OIJ<{KgKby z0%zLl&6`NBXaj7J@YnSt2eHJ;S4ZL_M_d>Sw|jn0JEC1KO8(y%xDwQ`a-zD$lTPG#U6@WSC_yxsMjE5@C z{n&x+MC|f;3Lkp+cvHec;Ba5sv$1k(tVy`8hC|9!*niY7z%~op4$SZo5^T|63QM2!z-@@Z@A?fxS~lr2w@|75};>;9T}E=B#?+p ztshZEKuAJ}0q>m>eO|RCi%!tJlMQy-)-y$W=T*Da%X=AepP;aq)A@8xw^NF^C zyfbl(S_sOAV?UF_7-617&-oGlw?n}q`C$IWgF(98gOhJ#$0X@Py=uPFo-rYpaA%Q` zjWR4=E=b$-^N@sZ6@0N0)bt_zeIwqq!vYX3Mf!XNW$+tK7a^zK=X=qDhZ%LS4y3-$ z<@xD(@+8@b@v)3K-zxwj)2RcI=~u=Po@U=BAa7=wHtBx`S)t8?OMMjIzEzq2XTC=2 zVTtvcGW(Sv?A|x?WKZo^LeIK{WZT%#XpW$cgi2lR9+p4uxEo}IAg4fM;qK8Gp^1=@ zzVj9m+dE{pjCZVgtcCG=8w8_=DDm8r^=?W9byG8mjS#J4?;nSlM#D2CD9@6JJxP=Y z@#gA=AI$qVF}Lv2g~a=HM)@I3Sb(gKL?fLS7Pz?p%H9wxub&k(?tYL#E83P#F#O;F zN@2UloqI4TKis6h(Ln7PBGiNbZgtgxv!u+E8<~`G0UZXBTPxf_F4Ui6r^xeZNt)T- z7hcLU#v8ht5g4+w9OPi14dl<>ZCY;*8SVP>lZCrsBR3v*wcMHW;j2)3u%;0}hh1d) z^1Frly$=VmZfOBnVlid=wuUa0@c#J~d|Oh99OLCv?hl7DVu9$mF(_cAute6H9Q-!E z_}P;IlMrd9rRN2t8LnWd81n>$H>N z4C~d`3hqe`R*J&c_XY1PRj_R@InY-d<-QM2EujwkYA*_omGt(es#lRSeg`1V-8ExO zRFuZ9vxfqa^XB0C;1)M%L?1ii#ZnoeacOKxERdXL)gY{4J?8pMcfdt{n2~zl3}wL6 z{`KkIhgtdk#AaaNKVA~4+d^y(!Kq3aitIKIbV}x^H_X0Yb!Uz;w#_;nmLxOi@IUrb zfJokmsmDP!q{)M6%LKETHcxHoax2KJ09fu`E-TbfCMhL5{X~`7@M_Y;no-Ngg-m|C zJt;uT4?dS{^s{MyEcei=S+h!AZb1&`4N7!vdHzl9Vfz$*OW~YJX@rA2>1VWlU6(aU znQo2X6chaMzuM_x(k2e4xg0{2ey^#x#U(FMAj4+V^Q}-`w{yma=J@;td!se#sZXR_ z%@;GtqY>IA2&=maorW`7bm018)0M=r-|W2`P{sB-mV@M_qDiC2PmebpK_U(IH;c}! z4Pfq&jt}Gil#x9CF|&iFk`y2)qD!mf()|Nk) zY%|LUFcY_pwp-=Z0-Jl^Epf(dLD;9@I2fw0-e?0TfIlq%b*w%tF^1Gl?VNZ|cy(c{MEBSUzdo3&{t`|=}% zzd-v{dVPtb=gA-yJ7~V(w@Z;jN9MnGQv*G)TRBkDHNg(P=0s1&{y#q12w~;%xkzj zh)LfZR+4%7xCN)~WWw(>E$S{MZ>OU)UA1y_7?nnQ1mf%hOzKW3#!s!=huXi@t!#)h zrdYPNDXrH^e5#k5W(yaEZ;W~*Gkh`gQ}|5+b@y^TrM6kU(%Ts!Dzu`!WQccucKfdX zCz{-yLi*%=o4PaY;J(orEhY))>&y|E{!;Jlc`MQhey*_-mOMDYi!LPa!sq$2rL&F$ zdDEp8Kh&h*B(ehu>fR1MVev|1ZJNxG;4v3|j7*P`AzKJv5p{L0LhqtcpMl0_zvQ{R zwIfg&q*rbkB>8fXOEak zSXnO1YR!5^><@`aGW-2_+abF+#lxav?d12E1^0|q@<*-t3o|2RU7q@eNX`(w#S_w| zVVPUwFywY)ZnRp;DXsnKmuBlMC!Z-M*kdgQd++O@gkK7wvjXH~2WkaJRDKqDqM9gU zD}lDpeY}Td#L?fNNl#Jm+`Ja=At8ddywkVeq_HpG4BomhVNvhmBNG=TI{fU4;L#;& zqd{F4iT<@yB573#yf3;QhD6~&pYJkP;hZrq-io@DZlg^sXH}lCzx{uV`5<=THhQQx zW99fJa+MjHqH}4k%dm}7dT{EZm$~wPexv|l(ErC7BXwj-gk6yn0haxbRJdYdkA@%& z9@vnv+%E)t8Vp_-5&L4RBy*IU*YkC_cKLDCQEyngzyYWjbO|+WbzH9U)e)9NR=)~2 zkISm}W!Z&>NV#GpXAnbnWj*xP1-a*CdF5xast15nf%0@_MV$y6I0H-v#tACuE#1cO zaid#?{-0`or1<)6@gc9f%h7L0pnB^HeKgEqldd03S~2LBE(ABh*iqEpdd-iZ>4x15 zW!PwK1j8V#ee)y279dsET|zXAx2KS_H5?k}WjLaEWHzX%ETy;K^VY+0dPEef^>-C-dd$~i7P0j>@b;mcP?i)CYwTJhz{9+Yo5 z8!PxYoJEr|1KvSm-1>c*`@elrlezcY?x zGIv*CYLbKNJxf(9Cs98?@|KKpMTfDY8ViT*As4A$bT)0Q3CyuL#XsNmdi$lxv_NLOiJaBK!I=)xeA$I>i~<=4 zCL;>o{mjF3N8f;l*UD8v8h}x~nN8_4Aud9jOba;oR4wwb!akXrg$i%vD8KStGnC!) zqpCvCB{}ttvf+#<`!N0X@(B^{6}nsnd`m({euLZE1yPG5O$q%Q&oV2I9X1MG))HdH@I5EYjRWLHed@mBbH36DNP_v3=@Rg!- zLl7CPHs{5{t8s9k6Q516l?;>Q;>+Tha1{HyU|?TvxQDe(EWOZBrwS!Hp%yGzGRgvu zRs#(me^}`2qI?@I9$`U|1P#tSETe_Igvc2G@fRJpSYFd4XU*?NL9}jRP{L=exm4p# zwzPwgdqFo0Y*8M_xbIi#<<1P7=-dU}xmHqg?t+~-qntPNxs>xf*WxcqGER8AZ07t& z)277yL1H=SAM%(#^{tsJ1S{3S7l4_RHMGCYeFv#Ni8}s zw7c}QQ_!LhUhmCib3zK=u6PKUI|(H{7@Qs#H-fRc(E5U?0nw!`5f?GmI$FD$Su+}% zrXR+{0pB6{BAnKRJ{`lU$MtV*pwO{W|i^Yl4 z6s92t3kH+bI0D{k+&S)E+B*0jKHMc80*DFye&QZPA07dOiIv|_#Pr#jv`*WS8sBO| z2eW(S^0_N6^CDrVkjXu4c&Z~qoH~A<;?O~YcncQOQYNlHHHA(18--x3tH%ARVsM0E zB95Z5{ICGTCEY2k_KJpGi4jg*q`E+%RMuE(*(X!oyE#(6WCq-3vPLabW36Up50Bg? z$-!$2ow6aBGXb}>0Ve6xOXCM+(tx3njnWMcZIn@wg*YW;#cLPAK{2hkY|6WTNz$et z8&|2BP}1viln@yWl(w4vNZ0Y?1jI7mLzoswZqT#b8=-<0z3>Dc{1ey7M1diobQ!vL zeml9}xD8&y*YD$4Y8bJSOkWm-T+?bH(Ogy3Q|wVU4}LB11oHU5AFS#PFeSFN4pmY7 zJo?|UawMJeio0&kj)PZ}J2I`xV-z@;l`hJ5SY-p7wZ*pO8;AUpXw?CRM9i#Sf0}co zdXuNrypZ&UOv<9O63=$Fq74tH;C_Jkr>T&$gfr56AwRV+12Wy+%@R0~hpS0l-JCdU zpgyKZT9R`3Nw-3ke=OK6gsv9hRtdBklH>?@0ql*}ArrA%!51l#(^MZXA53C^JTT-1 z_3`5#%(@MT$)Ip^bAK>B@_6I(d5EnW9VJEZtmWHUnb81Bb8Gd7xLsCGa~-Vj(kHdd zVBKGnYW)_M}%9XC_-0EVKG**; zHq-r8X zRMJR@)Kt#-O;NH!*2mnh>hBp4Ege@KI^e6g=li6@V*fP2z{e4>{_kp*cpWM|7?bzB z-+;`a4jx^VOwhG`x)+_s#lGa@otYs4kw+UEa zjLEv^1@fO2fhBUpwPeyV4YVKO>7iP5VyKug zlAsep)Ds?~wKk}x8d!ZS?zyR4CoX9HF{O-J&uf6)lWN`q;Fbq94L^CwxgIzL3;2FH zM~;2i7jNh~`jHvdMtS^rdlR^H|T#A(fJ+V+O%*;rD?P`37(0P-w zaAmfBY&)u9zg1vCmRlDZg(26cz~-gbj|uv8yKJVAFUL+Lct@1AtG~5L1bM2C5N^#x-~BEZ`O@PjdmcDmv4j zb<&04JsdtV0Go-ChDpO!)%r(piBTCC0`J-54Xt=BLR`I_LQx#5PDm~b z>O1{q&YR zyD0@%i3z;Ao5kwJ>aU(+$)>4`SvzV&D>j6FQ7?}lFy<6b@L`xj$ItAyS{+hl^r@W_w z*{e3X%4{~jgOe}cRv&GV%Q#8Mkln%a6L?ZNk;CiUuYh2l_;ibYj@#bnNEQ{*GF!=* z9w{K9s#ptQ2N;|_5dJV`(QwX{wdr+-PcO|90$3WtoeX_GD))npU)cB~xp*#cqcgwA zr@DqRH3jm$7f%LxXn=o@Usy6)_BDQ$MUxw=nDDMAD0Y?*R#zrEAST2Y5BE4At1W$} zy&{i{9gU?Vr~}a6EKlM-4X#49T36-Q={p(s;7(Ioa4b_1C7i#kf<6D-10_IL`_L=`~7--v_nO79VZCr}U{aiaA( zit&tCg#%DF5(M0;MAlz;#Y{kJz=uQf5f5T{Opg3nwTGK#_-|>lp+32f*%w#igJMo4 zk?i(Qu+=rrCN^wf*P81jU)h9`Zw~mMiUo^iGl5Rf@8*LRF2pO+qD<-kHT>OqenTEO z{LNGKt=gt}OuM9rq2HL1V`eGPRMb^ywVsF8FozqPU+Lv(a+39IOe*zlR)G?GP{Krt+ zB3L5k2dM@wfBL!MY&?rn&$2DY;Od1`I9?XE!GYAmm?j$slk+bU3ZF3b7LdvxNb!+; z5JydQlC^oyJnHBx2aejC>(q?tc3tRxcuFzIKfue$$Gt4huhCeUg-3w82Ma!0PtRMR<7E_BG%yT`EsiKbims?u`9wz zmc@}zfgXaJ>x+_@=Q#)~cme)=`oakO8Haa*#z9FzwBJ}TePL_|aQFWZHygYpLVUe8 z(L40F!x$Hy6&#)-837NSWCd@XN@=2l1T zrQQEB`JV;rpJ4i*%YQQr-53~!?QQJ;m%#sL`DgymB531aVfddXmZg*F|BV0u0B7jx zVe`K=|66s)(!t5$ALd#*7~B6t6ia6Z(|`DnKsf$oWbltcaIo~S{7(Z60Riz3U<}Um8ajD$8UDZY@hlx||5wMqssA<$1P~|~1ONyG5Ht)N z03aII*2K^S2>=QllghBWZ?J&r74V-#q3~YQn(gM!TJ5FZINcf|{|TmIl`q10cI|P1 zD$lPsF$x#n9al{d8){VeHKZgeTN{iMNHzXVFDfyf9cgpQkuM+x{Pp6n&J2$DP)GXM zP=~rCK!xt*P*&*?y*bd*j5kK7{vI5|b*M{2N_YQOKH)FtL)N-?M9juEpZKcyIzhJ7 z&&XFxs)rb={lodNh$h-A61QlCFTYvb%~J}~nz-IG@QI1{Sj*STm9Prnp2z+^oIfRA zS@~MxG|`r;$R20m37Nq+&seT+!Ec%`6pvYFDZ6(YcdN$#mc(--g=Gc2G2DHnWO5YE z(uFqB;7rl~uWYFQZNdN$5LgJ)Pcje^08kV~p}>2MQe#($?qO$WHR6RQW|=_pJU{>P zooyby&w5llpG<&OZZH*Zd>3ZG*0}^%&cfl)Fl_zhJX#_w9e;kHFWNI2aeaA(L~NZn zO$A>^kH}pwdW>+z@K5TyVT|0edlfgHw0oW~I(@xDhZ|X(W_RnO{ zh?#L;Uh;sY)Y0TUi}yymdO~jL9SMdx#&i>c-u|WeWON@&SxCK(o@COc6sm^7I-8rd zx;kj&@HYocB!8oYM&qYpCzjl`RM539+O)%FM=n!K?Vp|Mka8)Sy>~?B+5jUcR#40a z9}n)Z+Hj&RcrJTx!41H#ESFRt5+<#vvSEZu?-`iTF0?^Q4fV7{>&a*M9z=e}+rl_& zH0EsZV*#%0q_=xEVHG!HeOS@Ak};Tde;Rt&-{zH*#JiQ@(ye0(E>O)c+(8QFxzfWB zFLr>nB(u^TLMvNb>stH+c$TVxqCU@d8$gA%GFcxhSjXQ+@~Hffu$%7~i7!=U;ErSq zdE@I66$}+pQzpQ)ZzFg2f!k+ut+z&bOd%6T(q@IQZ?5RDafo^}ah#;nd)c3=3OzL} zcU^z2Cc}og1Tr}yK8|hIH+=vESYklZMQXWci=H9ky1`cDw~?BcnxY{f85+o;#NK06 zhC`-r8BBa)(q~^KU~w5GwlqP?4IO@OIS>ksS+R>P=_C(!@d;1yAi5<1nq&@)d&04d z4#(|Ch~DYjiE?NrA2u^j-N>Cy=E?!A8s*k>UsOr&zkLX>wXNxHR*2G56OL_R@APtP zSVF92g+zvfoLfvLXZRm6Lo+(aA(5h|cvuX=0vGw*w5#z8(QfOn!>vP&#gb^yzJEjI zZs*mW3#OxgsXj+UVLGGv~LiK%N3Whpz1zjp?cA`)Cmo#0Mjv|GiX%&p~}5ob*u zrOj8V?T|lC04g_=92>hB%<#MSb`^8{Ky5)uL?%$az$5rv7>(WWJCy1Cf-;?nHEtzvBVG-yxWUt zsv81=L2x!q;#EEclAJ};6g^YOvxHm{4$Zx5&erjel8&0M2({LtGdK+br6H<41V zEY}PObDVXJgpXPQ7DK!)o2{NuOS2rH^hjpF$?ha!E;iR@O>Fjo^iJfp)n47ZaUzg) zZ>9+|n{b@zZhu)I5){1fIbHFHXd4RPi`Ic*y zyQ%*svR%7^K1c7ZmF%5+VaR9k0wKUNN&5oYJy*)kpzwJ#9eLU!FcEd4Fj4D|Sgon_ z1r97imX?f6$d%mRb{4Vi&G!2HeJD%7roeV4jr&~Z2S#NK*s+)rn;FW<4+=v9iSR+c zt2T`;exV$HK)I{ZYabp?KdwEIfBei&A-|<&M(uG;0pYmu@D8xvd&#an26#ABW#=MJE^-JiiY{2F8#mp6XaNssm^be>YDBloED_7cD-7<*)qKq)r2-m9 z`oqyEb{$tPd>|*sz^a3oExFuoU~OPWrNtIfgXUcJfrZW{_ZgEf-}j6sUmp{;>;o3= zrFLB%hSyCB_B9Rc$fkG^_ag~J#13~8(R8?dL|rS7g3v`?eL|~ZVyC--25P1WWdSnC ze%91@v@p87GsN&4#)$=lS(D<4dSK&%1jOYpO*UJ}_GeWno1{SFCelsBZ3vKM^&a+* zSjL2O$V9>;+Yp<+=pki9{9g-_-K!zTbFp!Jx*j&r3kA3I@o9FJ0gSj|xu{a!6|XA? zRJQJ@_9;2W7ucIR9yOtMCIKG?kE`|?ad$f4p{|Cc)NiS<$nh>}i`-_y(+n#-D}{07 z5@aawS6yAXXh$wS^w#+}e!oe}EwEXpJuDm>2HZyWH5WifnwARo~DK|B6;0`2Sas6#Pikh2dJ zfK*3Tnh^dBN2^*6uW55sDjvQu_O$cL2-$j7A4HxrS|qsb3!L9lMC1j&BJ;9^yIx^_ z`_rsd(sS|Bw0ozuU9O=IGfjgI6#$ir6l1F#F2mXM%-POlym8615(|?#1`A~`Kgy9P zEIj9xki8pW=Qq3tij$?4P7D=Dkda1-Q354{mNFUdJ>(jfNpLe7M!3R?$3M*4&EuN{ zVe>77%UUn+{aWdgfkv3w2|#|3l%3@PbE1;Um2L%}iPVauzDla~fGQ<;7sW=QgAR)Q zYc7z*jW~yLX0gonALKZ&K3OJ>>DIXSl8Bls4Pe*3wG#PD6l(U3XK`6L*L{vYmO7Sg z2O;lDINucK-~^aPl}=T^S?4x@1keo>d*?YS20Pv?g*Z!ydXZ!=kyFqtPljIF=YCbq zE8D1QYMD=Z&}n3J2H5rD&{KWdGG>V$6(Gd&Gw{?uPv`C=ImGP4jRIIZMm<#lY+x0{ zLha9bOaNO|5=C;?O+N;d4K7}%{t837Wp@WJ#UYPo!}=gghso#^>Fn-%5C(BckbDEg$<9P zhk9qq1z?|&%MfwNHN}~2Bc&ImwK@<3PB;U6VaO9UJ({Ekg+r%(I7DVk5x^+Vc;4t& ztc5bMh~YsG{?xPf47A@BK`iyWVccFfLfGh&t$zHN48wL|#4KKoHH)i89Iw|!xec|O zC)>VMUooogp|XXMx?HVI6a5#_w3MBr+VdD)o2O3*9nCSoji{r5?(>rK;R0t6m2Bxv zP|+1Qi__88YR-zUa_FoY*^!wAy;Gxcpnm3{Ag#{Hxj4_A+4Z1)Wmtbqm1H2dfE9-G zt+p}P{$j?pJ7M>_osY(g4+RD^uS0_xRQIR2Cnj5r+N5~{0m#9H&?UTb^(YQ>0IPk1 zSc=Cx?+kg!4sTg38~pL@L!^$Rj`5%(F1ASNFAbeLivb8wu5@LhOoo<35;N`@qG@=q zQ-Jr_l=|b#Rz~l&-tfr7ocR-7CP6TCmdFN)KjUMN7i0O6;edk4jrVB_V}V*lUQCg^s--66uK7d#s?N8ZV32Fe3^5g;+O-Z zu%O9ky)g&*SN`moj2PPM|RmSuiVLh2+wB%E+}6<>@Z^e2Dr{& zO&Q1+baHjVzIBf31A6s1YzqB;RKsrhUcMx zC6nXRwc5P^rOJG_nuT*3(*OtH`#fhV9X}jO>A7h?Tm|2RmnG24cw!IOk7ps6SYfRqOYPdkzjVxM43!SjQ_a(6@2*T?VY-b(j*_`^yW z!o-QDY)gyWd}Etw7qBDI z_|?!Fqy-@_Ou~TcTF3dDqKz8gN!d}d%wziNqa8<*_4&bW52EggEJitqFBnL-Lb8`C z6!;rOa6o{KBcPTj&MRg2Pco6^_OH6vX(C6NEJo>SF`BK7+2f1(zjB394f=o;nGs9m zYs489z;O8YSX6$-BM;6~LQrtBsh!|S2?Wl`3wb7l?(DAzKT(JWY3ekJbLWV*9|V?= zcSq4_P6=SqK*Cv)^07@gqr{siHUaq|+A~YLfDbq3!)8%-8;!E^^_{qe_wP+0-K)@+ zO(!>?^Ef`&FFAm-YAZ37@yD)5t6q$H&@x}12^)+pb~i1{aC~s;(6g-aSjn*|UJNo= zBL!yH6iouHH!;(!N%Qx3#!!gPGsn{Sc)^qtPbg1=;^tj_zx<*Evhn;JzN~;XqP$G* z7!^!`2@wiej-Y{I^WY}D-w$nc-200IvUGh`k10{#vZUEP65kz zCbi03%%BCpmAu5HMi&A)@l)_&d56qyRBNXWhxUmO0Cf5C9*P6~c`n}*NM2v`*wR07 z3S8mGy zPNbxy#8N(B`kKPkfBnPrSOYTNQJ>D_@v=LyG;lNb4$$zd|>A7K4k$ zE(45ZNqgL``ZuRR~ZQ?_?sJu-wYXR~gzk!HwBcQ>mY{Ucg0-QE%qhG^X&}0pNBWW((*hT62*^Ooso!@6HSpi6P z&_AGs09=Xtkkh?dDSi2O#9$+(>eqmL1dTq_RmOgRlwhgg7IN3Sszhn%6T&n16D?f( zJ(_mo4LYY2FSQ4?(oo>=SkHBB_=t2Stx%a2V^h4k4iqcpB0|~wGI-DaQd)PpfEe@9 zzQ+Py(>`mrNjoBhyb~j=de8BkZ9WA|SED;XFsK&r<=vxiH}9J-xdSG$k^8P(;^sFX zugW|DaWuy3Syb`GOl#)AX9uT?+M~f{#uV$05>(KmgE3|wY+Hw@W$&AAvw!BO#s6Mm z`>gO`X*ki{Bl?#F1wdsOqC82pK}AR6*=KRe%USN+Fp85iD$9WR{oy11bnoGpfk^)n z8Yo3?sC33*&Jw_&rX^eZlGLCYaCPeMOM{w2k6CH2NEx_;~F`(3$aNgDn&$s zY+uc2j=?$TE}ltNrb+q0BgOKK+mbd;=kp!XN19$o8!6KVX^#i$O5;S-04?XUe?3YT zl9t-;`IR}VEal;%&;DvL?p>9f&whMYIbU9z%`^x=Zx__Ib6}X^%82pn9?rEG>6r&l zkgMK}WZEY@ybgX4={44KO;)Xdj8R3da@Hv%!<{HezB~dQNa@`7D|4+xIWSVlJR9<@ zHF*iOxu@Q2z-|-MIIV(m+GFLowFm0nL-o0W?J!oziyUIBJM}M^8)fjzHz3TY>Ruhp zs2o%?yQwnF4NE6`?$&-W8Yzw`r(+D1nl2PI2dSdDQjtJ$b#W9nyn6p#Ej$s4?Z%TP zx;0i!x>YqJMVe-0`DSFCsN2FvrW1&#>ROMZ+Q;(Co3CY=3Ec3TU^59zat3S}>CDO} zA#!rQYapfXa+G+~xxOhnkr(%g+$@#84XL>?+8@9Ta2wgCLXf*5=piReVfOv~eA*X0 zs)#5Q$hIykYL?5WSI2IM6!wSo!*70hf)l$QffIIi)h~v8-19z1733Hsd+_yOg<)`v zinrKJ9KXQkPS{aS+u6)DK|f^^Oqc=HLl~lp6C+jd4%XI=)uOVMyK&NO_d&~xfd*l_ z8ScL;QAwWD#z&>mG2~F1_)G%^tAh@!s(Z+vG+{nR?61L5MMK8MUAH_Ec6jR zy24_uZc^5Y64nif>W_5yR=g^Q^7VSah3)Lq7K$s2FMO!eU$KIe(zbvRp7a} z+U11l*|X!WN1bNJ&IzN9$tkkl(h3G=8k{ZT+6B|~ogJ(eN?@;&y9HB^U?}%9d<|cs zI;F-ws)ftovl$cfuw3RtBf^=tRZqdQ09CEpPE5+z%+2~P1!xKWf@ zPXw;IdqisT!E~ikniqYjq1k_pQ{XqqprZ7#87^OmZh?r(MngtGVXp4vas_x?&;-0M z%t>3bAv_EecjGQ9(_P~sTM(s?5=kKJTdXk6{~VqhA7{lrOcXOoug)0hqti4}Kb?Z& z(-<5mcp^WbTKn1*da1)}K+_vhZGgOsWGziS-PS=qk6pjHq!~Q-_F2jp=k5$Va*K31 z#GSMa9Do2PF+CzMC{kyE&MTkDF|2qE^N(`kns5s#X0lu-N@kz0Wfg)ee6KL}1UGtO zObSW;-D`i5X!d)-;aQl<>+yyg*+XJs>#z}r-%$912h;*RBji}v6FInmm!ilAD8(x} zO(r~>&x&QHDCkG@-AVDs5{yCI6_kI86wG==tD*WB*Ccwj7DW}aNZspy%oye-Vtoe7 zhge*Rv)j*b=s+21K;GIEEModA)WnjXgr%xJMNRnl!*#InM3;N@7#*(A6N1rZr>&VN z$q&Ouc3>>Mcm)EiQWKl&$5?H(yOvHi`p)!VW(&M#?A2e(X9g>>w%yA$9|L=-i@#1A zrksCH$E&GShfQD;tSZoTd?@-LqWJ{qX)CJHfukfh=$V-1P?|Pak|LIJi-2Q_IfYS} zAP61pGNg?azizAe=<_~h3+6hkM@Qg-#hvlBv z1IoN}$Q|9G;Cqf5_>vPM&XZcK6x@$t#~U8cig8`e3_Brrwv&bhRj#aKCd0glBj3!- zzqw;TSVJ6>;I#urzcD6q4ZDCBs|^xL-#OIAvOoH+y;X?k%Ro5&HdZF}8YzYp57AvM zEA4IunAXTU#|sW6wPIJRXOfFlL26YRHtr#L8d-#ft*CV;V|Ym2;*eDF`FpM|a7{5; z+RnPP82EwvG^3QzLD_k|rqy8XI#t+s$toL&O`&JYno(=w$J`2DnPy;lXY4{IQ0HV2 ztMyq*o=8sQtn5zKa_FmjGD2Gcv<<+oZW}-&n;=ickWwX=bqTw66YzY?+yy!Jq~sUW zOpG&7Dn)OKwOw}$T1a4@YofaUakD+7zV6~Fm5De(n5x{fFz{ltZ`cvE{PcciS*NpJ zp&YXs?nz1xQjJZF+(W)2ID0KURv$Pb-x&fx!546o^f&T)h4s6^rwrVzLs@BEzajzR zEQLC`W;4--NS3ufdUx3hk;jH~7(X97gH;&1qoXx2<+XIu}3 zQRPlbf~l48$5S-UKtvib7`2eI*q<{QKJ+*kb1V%+<&ETJ+8$7N;mgx+!)Erm?r)oZ z-xy7_6sv@1b;&WLsAHEjASn#x7Em5x?W={E15^r-f7gzqJrLc(H{a8aUl5XD+nQ?` z*_)7oVJV(W`k3<~6<%IBEyLFxdpF}PVbaOugI>*lj?rXg9bS;_@C0-p(h&qmYTLCI z5%l>WX{0NV{NYkW9ulkE`ND22{}lXGLcsh^a0s~fSCnL0ck+i_>r@ye?7))7+%jD9 zIzwsWLqj%~oRSOP+)uq5_V^o+I0sXmG@D~pwa@yQ-Hm%XrHZ1a&iQ8BfWxzdVj1C0 zk5@IUJ7!s_)c~<4bW+>n>e=#O26&q;uJIa=mhi4=YvM6(H00aaH09V6Vd47U%y;!? zz-sakxl1ys8pNeQwx$x+7%`T6UEUD~;HDiKi`v;_QuHz&mDaz0!TRO0pp_eUr?GvD z)`AKhEQtrf(D?k*Bq-HV)}_*@^$v=4~je>g)1z4lMHUPi}e zWcsS>N;l;-7Yw~ebhq)Fw6a!&7%<=uS~`CLxk%3?ty9>TnbUZ6MLw4t3R|CCHmVy} z?cEXPez5y4OopCl^1dshJMAcLfXx^?e~-tZSB4DF|L%TAT)M}l@ODx2plgYdt_t>aA*yvonC#8ipbPFy3hJwLC z-kRFMw*ytYX$86ft5O~f%&%&R>^z9i1=I3xgQQ9^5tiS*Fsd1}*+@XF4H&ljB(LtM z9$cM{bhW=GXjD$>tCt=n_)^!4IGA%g+@3ioE`P*9C0NFB^*|$iAGzW79U1_)2|Yn# zK`=>5B80M{(_Y0>kQp+oQZ3_Fijqq#vQ8Ffty?P(g&YOfIPkkockLfC1bmbO?xj0{?@O?L}vJ;FN|f0w0tgie%nCR zI?#o3fm7=J9YE%OrLOw9qEclZrFRm9cv1baf@!ae86JMai*Y%P8?B_)%UGlBh6D_3 z!m?RFBF>YK@lFr!dfP(ECQzRyEa;}yf;G`D5;N~U%s^kmaD+E0jDAPQ%_1-0VN>l1 znW3#u+0-afxOjXM4ZrEVBx*jBl*)RO%(IQ#&0ab&}%T|R}l)FJ4PR@!s`r&gv z1_(K$!LVDHbuZIK@)@&)8%)d_)kZ&H zWYH{Qz6x9Xohd0b{n&>+e$V{#2cOZh@g%BBZS*h_J*)1@eDWrLFirQZ#=$H3t87*P z@oy0cOqvNeyt@_$vi(N{cd%jXQ`T{)V!Cgs8N)it0h9wPyR}B94 zEr{Fk=WChYS^i?opQl`*^e_F=-;6!aY_NNX#$u=Mo)?BPShy)Q2fiU6ev-4*30D7M z(gNGJ|5r4bA;IThV{@(5$fmm8J*k;zUfZ`%Q*tJjVqVfl-t~= zu4vrCbUQlh0B_h!8`!6e$rx}fdF1)`E>u|!_b}5nm+~6Ztr2MG{d!7vV|hYcYM$M{ z%k4!uT?ORea+H=uXuvL9tlPS*{JciWg-dJfK_<#AMiUo@_@W~(xM7i8bKx`DQWs(t z^?xVi8Z?g(RGP2G9e(p8J*6ttbHy4ER7X95u&f47qAevfV8HjnfJdF38)QZqcFUM( z_vp>>A7oWfeYXgG$N|2>uk27U5$}r zl18r4LCN`^t2p>!#CQ*L`Zc46HN%(QLc^-SgW|6%6j?mnjIRF~5wu>E>xL1p$`kmz z=5>YQx7n$xJ?ab?;@*DsYUtUbnjCg>vV2iXS0@-WX+6Kb_8jKN+8&pDPGBeu(i3*U z67J(gw;#Ym@I=ah3jZro{jDctVRKibKaRg&^DA<|57(_XCB+X2#Q{FJwrM;VzhGn-@DK+(yk8(O5f)M@WQ*VY6H+HYX4~n zC|pZ@BQ-1Nw5{S*LFYPfvG~r%SPUa}d1&p-tKZIB)?KGc8eFO0MZ^;HJg;^73_|L8 zNtds-6+Mvy<$@l3hAEcXrB3^Bg`wkN662h~hG#NfTAN zp#(T#_*QMBj3V5@>%NRdLvIBO1HD_?CHI*cf!7g21l?~mJ#80WG5rOT9zK;+lJS8> zN|hRQpj*Mf@oeaE*^z=I*{}@6UY3nD!_|~y9O(}bUS?q1dQ~U=!Ib`jC}@TbngG9WS;ky4BwM z{cZj&Hn9WZ>m8i|h;;bpnl)2~&e?BUoT8rshBAAveP6>h2?Yz2aLrX^hw>ocfRJ(# zHqjQx6^sUJn#7#JZUhO8Rto&iQ;mC?4j-5o*{gkkF6(~233I60(#{ixK8-Vc;g|)u z+aNQuF_iZYtF*NcSV`oz%-i3@uj{I4KtXJ`*opqd3NE!ftgP}sqtrov==^Tk&AAO) zTb`lp6pTMTz6ls|LT*t9>c*XD%^^` zEo85p=l666o8;N>+0On|y0=9C-La{=i9|WTnyr^)4ru9ws7RHK@SA*tN>xBk1&(b1 z=ByeE3eoNc=&xu$oX^_J3#Uc2Z*8n|>Q~)BK3}fCkp5#0DX@>y2BHNPKdh&=Q*5HQ z@vGAFTBj!}00sBr{zlZa0EDCG|WddUO=c!uP_OJyez#Jp14~Gbti{lEGg?6}YvDu>UOY90l1OP=# zEy|BnwrXT}y;*!XGEX$kF#dBys;dW_m1rhojSGW-78S)vz&cCJ(Ua;v**%ja7ghj3 z)p|3s#H3o?fHwbk^+l^3^jN>{#@zOL#13vEU;a>;F$?XU%YS!08A+L!I9KR|GuIO{ zNOt@w*e0?0N9&8JxPaxXE`3ScxatKNWAP2cx_2wQqQ#bI5;4=QGK))40X;vjcHt!c zJ2ojCue=>ZHeF4|_0EY7$i&ZF{4@evz5$}^Cei{nMU_ca1ZsV9<0Y6RpERxdV;$u& zoEuAK1IO&`Rajl~uutrHjdz!@oO`oWo((g{(YJE7{eu}^?%Nya82|p0hELUv*I?=c9_hYcjEDlA~<&W8Fy= z&2YF>VYj#Uy4d75yDO{N6-XG={6iSgjU!j0-PnYBE~ehRKrwr8;uO*y~dH5Vh< zq7}9mBz9`yY&CY~)%1*cUmL667j6j9SjwRsS=W15!XE2>v`FtdMH>E+jvJxk8&GQ* z_`1#iPT*CDdFU-&Eed%s%TB|hDR^T`!aZA_N7f_1^1&v1KOzob7es)igZXsf*ZG)9 zE+r&?(Z$AtVdnfn-Y>cbw7mWEo6t>v1CKOKDIJA_ZAY#<%$%9vVCNOxBNr=^9hP}Nat6-|*6;gp(k1H&62z4;Z`~vtWtNC=;wJQdWo6D_5#cKv zuma%B3J>dN&ZpNAGTVFym(hM7nIXt7yrre1Azr6gq-uuCsis%lc(=*GDe7 zFlbYgGJ!M|CX5N3L4up>*s;F^XE)AZN%|-xvS?FWtDrTU#m&WMHoXFY8WTdZFGq+# z@}C6jFJVbxsP=7vsG^tR)1}6L{(ZvrW|uDpEONg&lMYe`)WDAT$Tg|aTlQGuKm+|N5>p`=|VaKe|IvKH2*Rnm_755_#x`k3H^##Jsg+C5b{B%33XE&OyC=2n$ z@Gd+$&}a{R5_G+RdRtB82Sc_P@_;hJmMgV*QjDcaU(Pl! z4!#f5H0a*U!7b0#y~(Pn-o0xM1R()Z8$d2Hj*Y;~x-=G;dV^wT;5=h*73fP@8Ct;M+&0Aq~d z_;;4(tPd}mnGMk`mZ20c8L$0W)e@wp$AK421+B(**LZJ9ae%8OLScEoO(Dn#xvoX& zq5_EHb#z260Ci2y=i}MAcBq zRryF6zk%ZfQHA{qia8G=FylIvH5=(hd%%a)9_9?N>}GaU&{R zZ_8{g{;K#wF3r5T4*T3(L(-^g?&@AVUin>YFknw(9Y50DxfL~vop)sjtTFnocTJn6 zD{T3*L(P(|{-?YMtJy;7T$|fxQomosqg+H-2F(%VgCK=xOx_PC^t9fYmA5a%8GNtQ zYrP-2?X3+w?ke+g33v+m1)lMJd{^hoMNFQ4&4B${fM1P}BVo4z>(SPZt3jdyII5b^ zK#7&5DrEQ81_pb;hhpRGYVkzdsBz^l%WUHL2T`nDOffnCDdGbvKH8634v2p45EPaO z6BcNnbFwMQ&;9+$>sJlbQG1RsumHq(q5zRI%@k<&9Is9Ox{GFTvH1Xy*=NS4fh+#0_y* zQ&ONN)(CWLc8ToSUd{e*i(&rvur}$yg`e?vH}zB12QKM4xXe(uEm^hg_LGnd2&vl= z?RLUjq6+&kD;o?U7nnS85UA5&oqL_}hsi-1on0zazA)cX%-OTc3uAvtJ&5$%MC4I9~>gQ}P?M zA8$`G=A!lGxt&;dvt0qGn>#UKdw$hDxnJYKLcSsb#63FZE}jI<&YD0#O@b}H;*{*` z7H?M_kT~=Qo^9#8fuwT4+;zC8GyGC;{u0e(F#3|o8kuWjVdUY{0+1_`_PTdmvjS1U zKaD&)j61-j5fIu^s4Mz^dTV@}4yWZ&_#;>Ik@K}W$q8L7m}{)li)pa+lXRgEb5aD` z0Mn7hNca_Rb>SAC5U?%A9s>|bTSj4RT_%|l`G;=F0<{oG#QO7}Q9w6LdiHp#Mx|u+ z-(Am!!%J=c2IA*VCe;bAax8#Iqtgq$?k?UUuBqlAHYzIVB(`sa0Xs+v8`ExiQjIIP zV%93CE9t-#+1tmXw?uplfueu&&R6*-l`1)#VX=ZO9j|F0aaJOTt}sI;UK; zrTiE+^7_ zPiCF@30c5pDRT>?lhr&!WypZfw|z3|dD4)*Z`FGkPY*~Zuis%`*}}{2;Q)O;e&!8+ zVX2>mV;U*dI9p7fNQ@h?1Su2HQs@~mvJEg6o|~n#c{W`b$~AxG7hqVp2-^Oe>z18VZirDN|bS2{z>I zYJG~Sbc)7K&6Sbuyt?1W>29M_s1N)n_W>POY*{9s z8(~P)NRPZ3OoU84@+g=W?&~X7K^=*^D@VP!ng|%lf=ICvLtTE7B**0_p$1w>oEVpo zT2D&9-ZhMF2(H;Uf&69dSs1-MZTQ)Dx!?9e0=&UOQdEteQmH7f=x@}n=3IkA7^1pm zgT(zbyPVwEH}#E&4NzERK+`qGzUOTMw!luxL5%r1yO_%U(5us1q6FFmWnos^!Aber zff;Zd&mpf>*{6h4#9DRtu;%)Db@HS&PlEhe!gx>~Dsy{oTsYWMWaba#&Z7w}7!VGO zdG^IX0UDPj5D=kB7?WPa2)k1M8hu+QMZD@N-<%_%rK?-8_5f*RA$U_A;)&0xgy2C! zb4;hKU8Vwij=FYcZn7dos0`c)1A@^f>hbR%TUwlp5kL2w)eTZ1iMojZg75Pk=RQg% zuN(!Q3for7!jTA~ns$#ijV%dB`wWOS79h_{$uB~C)HFpl82r8dK1SgijbhH%HLxv= z)g1N5I}o)-LF#&m=q*S!5eyhb(eS@mjU@ou9InDgn`_ zQ~_B<0<#f#M=^(T-WRdOCjL9?xd7Gr{vBv)E1H>8~V)Q2=4gpuuJ){{agc$Am z2V;@S^MJ$%XE+msWq2KrnX=^1q(suKRD4>y;_$T5CAEUhPd$0#^Br2W0PeTR1E+R; zB8gTfi`0SB2KC?dpFfvBl8L|3PjO&}GfW*^MkaxeakniOZlxiJ=kGvc_Yz*;YL~V= z&qCI$jFd7&MsaW_Y8o}Lj!DL6oMJd!eHq3jLu7{eG#D<$1K!Go@1pG~V>!|Z5E|;X zLMtQlbZDHk4qeh=?$2iXWtzDwfF|yI-6|~Q<&j->O4GZ;RS16BaA15qgpJjbT^CWq zUj!Q@U|UnqE(c1ev#*#8Se%UlHmz`C!@4ZA-&40ICYu^ZKr+ssj_u|5&EU`U3iv-k zcev(%vUEbw2Y?9w-rh;>Tu<1gGLjd({*1PX7%LJB25V>sS&8oGxHLU9a{UeGv;PE5 ze~m;aSJOzgs>`2VW(~HzWpMXzIVwa_8f0BL@MV+!mMZvW3ft#wKxX zuSZv+s%cb)uBzcfDSp6Xw6B0SR?#eC#@w3+LJ-B8faA!~_9gD;zS~__?E!>EHu@@3 z&Q%Bl6dPubbUe*}I(Nh|ze<@|m!DEp4<4bTv=HC@KDF|~D8|~;GGn>1e#8>8vE|6C zfiS&a=`|d|5jmi}G7-0xqcnKwf0Fg3PGDB~SI@Wx?Z_K>vv_SW={KZ@d3RD+g}jDY zN3&Q}Sdjfex;R*Kq!1_)rRCY{odO7{g-@qRk%#s7VzmM@z1}FQ4C=;8)&I_pyCHiW zc`M&HNI62@B2`I?l!CGNs7HlUENIjpVMt}hOGFH!!cM+rKUjRQXW_hBle-^|YqLjY zBrW1L6Uoge_GCedqdpV>S%Fb^?>Qn^%lXj_tk+W0{*w$C&|()pu(AV1u0!Bd3Qn7F zU9x_sWAtU(tpWNs)(7ZMnnwz6KKzzJbVe%7;le?n)w1}s;NYp?MoYawEm@jmoPZ0W zLrr&4A!sjzX=^q`|1$@Oj`Z6ItIAF5f|@is3Fss*Xlk-)cf~?!v*QPW6Q(Oq`KS^< z3?6gL1PFovR-^~CMjEGP{i$8a^Y1K4hkI&zyyR!6K>2wEYIZW-G#RJ(k{u=PNtOTa z$wW(-bu$A#@a`Cc-h3=7mh?namr_}7w)1-ed{ecWKOJaqma@h$3veCs+XU}q39WfC z{#MP72iTC4^i8@FKD*KLXuZy=5aUiZg3E2v%6zQYH*xCL#;siid9$;3lv*j>IyaD0 zAQE*CQu&q#)Pu5nfk3TH)us;a<*jVDI{YWu1`bCK)&5y!aBe~}ad{t1votAe`wvORGKOg|E9# zvWA)7ol@ZM@{L-LAk9>Ph@}EvWmh2l@XSV0^Hu7rpgnaRtxx6ihP?k^mZQsYf+LPent$qU`DO4VdHY3fB z!_eQ{%Bpat$x~&NztD!NsuUD#h~sMW%^zC*$!DY5b{PQ;4P__aJe!r84M9)q@E6&??e|hh1tM>z?YES%Wxj z8+{g`2+fnwf5a@;Kw{il%!@cGKo9M)Yg_m12;Hqhmub65Tp!XZXANnsF7)}8nrRM@ zP<`^$(;hcAiP2SquPEKPULMxs07j;FPjOCcUzdK4T?pGT;s7zeGFP_wb*L*Pa_7{g zpU+QN2U+^S$Ch283e8w}pxf$u4Gg63yZXq>ZFBc0ASiPOi$eE}Wj^8DB@r8BPeoIl zfN1xFm^mwJ8Uk25HJ@0eVH(O(s{k!pUS!3ncfwDn`UASlwc|x2^{B`oo$5p{grB!a z1rFZ9H_~)?yON5hBsEZUr#ou)MfN(2ZH*{$KANWjvEd_>^QT&n~V ze#_w3r>^_+oaMDx{Ol=s%4Ggcu#I95;tQKV+XxJoj<{z(IX&H~$1 z=@?jw5B$Co(g!W8V3jANNurcY60 z?01pp5)6IL%xMYE-V6^D;pnG;oASZ9ozyPS z8Y!)FgE=NoJXdBt!deU6OGvzFSP)o*HthC>G5M8o6Q+K&XCX4iMBdW!3$A4;_h!He zR`o&C)!AjjovTCuB3-1Ik98D+5T8Lol^D?c02a^7zQBu_O<(wku_ni)LM||nMTO4A zjV8Zpv^hmAQqU&lLu!o9Ak zC!v$mDL7UGvr1fj<}kBD<6$QfSGwmTw37DQ_>@o_M(O-#msO4)DbZhSI=|Dku=g@_ zxyTzzbW<+x^wr8BfXP+It%RKR8xCP_M%dhQK1ketaVuu4$8m`m%>s(2>GJNCUyoou zi|xQtJEs$To;fR@>ixN`>>3>td^${A$`m2*E@FF&L;43M zkcdVSmCuNX(Vx#uI#cTF>J=qQ!V%%Mkd{kx`mNDz#OUrVuaDv+u zP0qnzm9M~yDmU0Jq@xkqeA?D&XI;+%cxS^?tPB+2F6DRmiMPae0Hy^v%FzbKT|xth zNp2R=fc>0lhBfe|Fp_`Wsn+xG3?!b<(CUfv7jh0kA1E3llqCnUFgJhkC-dZJbdsw9 z$e77Ap=LT@{r1Ha$~z(@m=e3CP#|vu$_%5tksYI#WFlmq@fK54&g~aDh?Lk}m zO(=QM+uuRY=D%2u2Q}CaY4>!a$(aNe@!Tp56 zqROR(n+ZQ)K}XY`(f06d<|8-o;V?`M^Fw_YJ&3|tAqoIuF?Bs+>6a;rEOuneAP>LG zRz4Gr(D7DUM;ZLFS*9mD@TD}gP`}!X0z!YxVTYEhHK8)X)!~njA69nFD=p|WXd*X( z3cTnG7ofXi(^;uC((z1K7^@MDu($`_7UTk?eeoWgw)@nI!`>{9otl!tDBMF>IU{0= zf<6n1ogJg!gRtZTKu>jnc63h?(`?MkMEJM8*FRQFB4t6L1?d6*rpvtY{~rJ)K-#}M z7>~8*3ljK2Nvd95Ke-(8OEXj41yI3pC39DX>GXk^W+V*pCPpX*11l}C{6BRRDuR3G zpGheiUBBmRHsF~4@#)h1R~zEpCOV=^@vX8V{rRU``^)e@D0#0|#uHyQ9_?F8iJVZH%>2icH05ShS<>7!WTlejN_GD?oA_yBv5z-a`@ z4T-f`@n7no*cDgI$NIkCe#g1EY(tbX* z5T{#%#wxZ6WYXYdS>E;pqPA*e+X>Ag8+oG7286^tXdVP?tXVrYxV<2FUjpyNd%7X zugph8C*hQmLoZ(od3LBk6v7h^#L=4ZRH3CTZIy$_s+@uPyvrT*yEzoRD(gkt@xb0a z9W%`|?GU3BoRN7ubrj|sEjRmfhbd&JstRkL2KwRA9rR)|&5|z7(Ky>=1mIuLu9znM z(fEYa0Y3fAxW$_sD5IH|vgpr7*ETa9eMhv!8eG0HKs4-=k}=xZZn5{8j5HlGn%>G` zq$enAckH1C+;h07mWpZlza;o)-wt2zG%d3Mi(@(Z+LDmcQAO6sw{gOzl@-yBmt&kE z_AWgK|9_&}^gq0cIGTzv=1*uICe#qu-Ht9)EZRbAN-g(?QIO8H@zUTaR5`)Q3#z;R zR9Jk!O1a9oM0HZic=?^WCkDp>NyU-(&7&F%Tqo)Pf2r%wOj5VeDl1gYdk6odQ< zVn}+2_KTGaQSbl%UtcBhQm?rll0dwkeHow|DR(tyVuVF6**pMp3OZnnJV%UkjpG1r z8o=|Ij@ComPFTQ7A_ZESq)H18S?Ok}H$)!d!>`vT8f1{+MLNOvQ5~#2YF#)s%DbO4 zZ_tGOT{+zi5|RtSa?B!vVR5H>f^l=7iWOUMph*|kQa#hWn#akkV>$T|ad|$bqT`vK zzApNn6l6=7IHQIP7nfWL$~ zcU<6e@Y(lEXkqFK+{ic!LOAXI@Q8-!fgyBz07UeQ(wS^{_kTHrpte(ch}xZur1M@Y zW2IA%VNs5oPc$!A-y?GfmU&?{_W|KPpj;cW>3|F$*4o@Y4#u0QIX}49sB%_zH7V#g zJBixD%%0$nj(`T!a{Lku6S4){L8u#i2?JL#);#5E$sdp%K6Ra|r=e%!S0ueU+$3Yc z0MFSKbdj?zPcEhVO}q-(tvd0PlWiW{{V4(u{;kq2{VQEY{UV~q;2xpLGd3RNx^w{# z2}$=$4G=ftiUx=Uf$C03##52jP)R@V5OY0v)XeARXSMwFp}CX7@)V)HQHZ5WfHy3Oq|pgtqI;6_B;7mzG=p4I>QHHaBMPR zGC;^Pb$;_qg@=d{zL=`TE8odY-2m>e!k_X!kVrF19VPd+98sNJsya3)k6e>`o|qxh zqfZ|LltyDlUPTpNV?GmfI29sI6+4qzip?mdUvW8mv*y)c<9%)oK(@7BOX@6ki z{o=3bGh;}ziY$#C8+Xjp91#bOndnM=w5GB5HD_SdWa9$LtTXC61ct0ckA#5s~&vHQ;+o-Gf8Fs0Hl4r=tOBpdA zprU8!nPsiRr)`Vx;WTxPQXb>PFV1$`?M@quU|23Y@e3#1Or(U3Z8lF_&*5IlfkpmN z=UNlPkpid_tys938$)&1@_zGZt^5&Vf$xdxYYtaI9^Mb_rtMtFUs9p;;v9BN42rsh;*~4D`Ko~m4iHD< z7gA_!25r|p4@Kqrj6oQ^BMo$T{--k6#6oU6Ro0GXin%dCpyQi;E~yxuT{lN7GmCaC z>G+;N=e$WMAYoG}5a~6es+pWMpSw(h{!yH`I`k@LeAOfyEs@*n%9JrGxFwuGub;Ip zOlB}N40YQv##X(8l=e@6gyM;Oq!+7<3D>*uxw=?u!&GHtS;`GUQ4z{+l@EkZ;v5g$ z-w(E0RYv_y zpci6@h5pA(&X~7|*?bgX)I*d0zPJeKq}^!9{7iWU`n!zzZIlFmIBI^%IqduBTm*3w zf@M_;Au#|}yt|3NJm8oKna2mn=Z%lcTfsRIS27Z{7QkVk+wh7V?|xcPyImv|etC3E zY;HSk1Ly6j5wg01SG8cBx3Cr8+ZorJEQ4j=9Ik6mIUiZ_ZvsI8J@#dQz+T?cVDbW) z9kD!Zufxc>$0y_lsTK%z2Y8Lx(!~!7KjLGH)l#yC6pNp@13BWl_|{_D5OUPY z&C$F1%+{NGf01^bZN>}F88lvuS7zwYnOOZRvfJdSanEP-K8ks)GTY8aAHZi^dR_*@ znYZD-#cptaYlrQt$$2REpoZj~VtBMWjUTX6Ni$oXLjG_1e?cdL(q+Lf3s>XIc^D{* zK7~B0Q}{W0!493MUkF)0h6P z_bbxg)}xeQiIvDs*O_y2=F^90b65Uyfbo}T#dciM2b?Z_S;t**loXsY##{WxPT#$& z%Jm;XQqotR(N8hRPN(v$#LzXwAPD!dtGv{%%uJp}!EAt0wK-H8gEPdgAGtq5zAt!u zsIo%t^D=O;BkR^bzY(`=&CC>_=T9n&+T0c(I}`_1LQ-@g#NNI1)V&SwQK(CNBnnah zNaa1|a7Pz}C7bF5=N@XbCS^)ULZ@6fG;c~T5QJkm_UT{AtbEyf;+z~+t3(UnbzPjw z>)J7^S3r;0QCo_QEiI*$eMon0!1sj3#;QVM+9R$cHjDD^k2DIVJj$_ zwBEs54?a*b4N_sTOrTe92v)Sas}|_JoeX-HhgC zU(R#$E_@Z%_NjHqI8XT??1ml5W zVtZ3o3?*^Bive(CRuM|JsjCfDq8#xUghc*mIsDrOhif~jjB$dw{93drnV0Zn2xqHh8fc;5v-X0@D#iX}qUF8lB8&1@j z)mJK|9RyEX2Dh?r=hVFi~ef8#A*Im0oz=U0vGypQwv5BD(@dZZ`;tjD$#wU!D z7)y<*qZ8vXSLfn?A-Y@QMWOFLbu ztO6r^{RLccL7~5h(>}A&3FxMW7t@(esSYlDZL`!U3oZC*?|IW)SvDz;;=UA`!jX_* z7!#E?6;UkR9@oGntZ33vvPd{d>9(Nf^g=rz`uyWL-#nhJy@1?RJij`mmsFN(`W$rR zC1x>y6d(J-{#X%LK3Q`G^NGc`FX_!bYYg=~sFMi?u1E+ggbRHwvjd3e2kN3csnC6$ zO@!uMm&S8|Y0#*$?Tom0lZ8|ajO9xm&KQ9j&PFPn&p-L65&`P^+Xz(EJZqCn-w3Z= zMrXxWr6Xb!7~M(`qbmPq|GBDujbXa!zWLDy8livif%2-kwkm`9zuTB|I-g(CcW7vh zr@5+QFeJTd%|eI8$;eUh>vqlgp1Zt3J&N!vBch0}YG{G=Q$({*JT6p^BGn{DGw`Lf zp;F=>=Y|c}n{XhoOSW+*x|uckNNH=^hmz)`#9M%q*vkvH-&efpQKzST>c6F33*z`1 z-o_)rj5{QnYu{LL4CO7`RNX-Clms4L8WXLm-~8yisaISD4t~x3Rh|E@ZhpbnJWpaU za@TO3vH6ZK;jO|?*XyHhidFm`V+i4?b*>^cN_M0myd^YXc;a_6 z!QcgqppL)Ni*1$=z_3Nb^mPLGYB9| zdYu&!ZPdE7g6u>Vgbz18YGHprOE9Zuzuf9XgE>4M`UodGWT>1uSSf;MCnd)uyR6a7ys~j zec_{>#IAng9%jT_`xdf_v593`Z%Duh8>$hn~FYmdW<>fsr|WjCbXsS zU4t>R#3@foBBE-%6ocmOeBS45B6aLmeu+&NXbjm>b;)cU!%Fr3ERhEzB+J4Y`1`~E zY>gha(5pt+3p~v1w7l+cCmj@%rVDFXvs;8>fo)x?owlP%o+7SVHr7U2-VE)MJ{_oW z_j+4dGrG$ef{-{CMcOgXzcWnROw`Kt3g-kiMu(yc0$;W6Prvz<_)`d?7)-)*sERDZ z0PWVjy*6_f@6-$l0&9{L30~x0}9wMmyT%dF>{P4Nt#`41(++;tB zf>fl5Yhr~j-{R^@SN+>i!?3IKN<=z!N2QV=_FHhhph{8sQfc8Oyz+t+FEQ)OcpbZz z@+>XVx<5thN3P+gm7a7!?z50-h?vf7mmBu6g{Z)-Hfb+71i zOOt>?S6GLX)k*b7w1S*ZwaDXjrf2QpRs?sTH)3+{ux7WMV%TU*bfu_{^>l=^83FfC zx$flzZ30VJ*c;nncOwb?U{B}`lQsRz;o9WK-3!X+Nc-Ev`_OE7kc7Sf_gW@D1C z_ZQ*)#rDxnob&=6)9qh-8Gy4b0Ain#!ncsz#$DEc<%GEYZD{5Mvm*!XHi96In1RIt z5)}kfq9x`5q5s;_$wQcwRu;J2oAdyV(nbLBD!-vkwv;=247N4M@qen;zW+w*<%sHo zCA7eE3jK3N#&6NS-Y|}=(2zab3O$SOPDm6nx&f4F)nBS6wWnqKVLofeQP8Bb5ZyR; zaj!l@&~XhaNE@F2%oXkSSG39xDtre7*Sk6vxN|T6bwbsQiOD=3$C-s2EDCoBgbA$b zuRV}4Ga9U`M@m}-N22$4#W&`XlHpoqqvF5G-q;|s-{7T)t`VH(K*CsHv|IdlVMXPQ zYYn)ACiMI3d;VVOi@C7Fm85Q-p10m=i5}^j-BwfPU zR@^Q=={3~4`-eX1 zHV7L?%W#H2(#4Ag&-F43-gYJ`;n+1E-76Fm}U%x z*WdOlR9WN%+9UD^ZBs=;I^XiKwMbA)t76FJfuqvnr5xN)vv?w~Q=NkgoE+1S=Fbw{ zoJDSMnY0e(vu(2tnsgH1Q8U4B?fnUBdwazBzb0#o_xO6xq1cs!lPP9yDylGz8T(HJqR=%(P|kt;1zKw|HejdYSaxATa`>!ie{)Pb^@|ZIN`LXVX*Vf=E_j zfF={N(29q*M+)e_xmQ{fJLw{SnVGL&R+z<3cdNlT(i8?1Y+_so>_ zd8WXd6dywBZYPJY3eDxXMt+;bi+l_-Fl06Y(Fa{N;9}}KpM>t|sy?|FLX2M!lTvX; zK_o6J=jXxmjr*VuzXSu<&#b?CM;jl-G@pGS^f*f$-u)yGMv^H9nhGao*se7pvwRGt zH#hPgXO+XQpm=y}(V&ovFj%4dk`I{^85=7d%;fqQ8qTgCTrW|ybu#l0(V`Co7j%iV z0`g5%Vuj1BpKrs%cLt0-3MB|4M#&w5S4bCZkw_p(zcPMsjO(x6G#?`j)z-{a&Lr4K zeVu5sedpet0tcao{hZ4uhY;`bGIfV$zg4hqzz7xvOZ~xUCY4e*t(*8zgc>9&_m;hC zWCZBq@x~5t%&S)!R2v)}xMroK)BB@bI#a{P&3|-L@=RCcfy6|Dnb0j>G6=%erGM6R zj7Qz4*G)P(5fcu%}H)x=!{OnHp~uttVN3{ku}~KH<2)BSZcaul3zSUv)JX| zL{&Vg(VUZQTdRP7|3(-vS>BLvlq*b|S4k$H?jpkaF3j4GLfZ&si6$~ZN5qKf@yhB%2f^5eK?&)R%>MHT z4Z7&`ueq#-1sG6j&5bD>B#D6I)hoIy-8WEeHN#9_JE^o$I{#Oe5adaC+Bf<)Bsfcj z<4=Iv>qJ-AoajITvfro6ykHkYL|uO~F{K$~MR49aJq4PajqIFj0$3?znP0=B;iEcw z&P+Nc> zRD%CT12w=a>viiVSz<~sS%=BhN1N3;xkYpSZsg=lE|l)tif+x|rMBzdu}DYfv+ITB zCw(S#MzKg;(f%3i z70#@kyqMyXyI7Y_5rZI)Lv-0`%fK#cDnFH4b;C17ehJlqH8-Ll$r~brHe>*z9litj z3~Xfi$VRQ{U$+I%r3ak21he>Q%_*hTReNi-auttg{#hn--bTSzN{-*ly ziex%}%JT)@i`@hzN`3j8;z~B5$p9dS zp8_yRX4FWjtyeE}V~SCeU2HT}xT*Gc9T1VtIP4W31Dx*fq+=w$HL^jO--(B9T@?R_ zMwIX!69+>kQ^C8r{p*cKanX5E7F$k0coS3Tgr7HCCBseBju=fwJE|;D3CsiEa$ADt z@e?SQ{O+v)3Vd!bKCr6EGnQj;_&2$C>?v~s*2{k&SY$Jyykd#5?{$^ks5Ig(Y$1G2 z0~$O;?4Ba-SL<;#&Cho!v?B#*WaLu){zywc)V9YjVWTcX8@vF{Hws_5BAgsXB-2Z2 zM{XWJc#2Yd^{f=vhEqg4vxgw)VN|@GkIee%@Eq0pwKVi}3T3g4;y4@Uv;OEqRcF2M z-MxSWObHJwYl*F_@+v>&GtS_B`?K}_AL>uOxX)zvgx2niXY0m#CeT>CiqC(2g<0!t z+zKANs6>ghxM5gR$|C+^-38yu*Ah6LIQ5_Cq#WPjC$V89crK_#9=fOGbfLGT#hV$LPj+4@0RZ66$gr8NLo&<7l_Bw*-rR$F!6qzoG zvfJ;*M!MaLRj>6E8Baekn)Pw3H%$g&A* zdLtvOD2beM_!GB&fze)^_$&pWVX%6LPTBs*^Lp@LZ#7_!*Fjh0@`?J`u;Hx$6o394 z#{dQ^ObhINt)NL}X$0&c(=t((t6q(siy-4YhA+#`gDM7S@CB^`2;qk(9{Ox0WFWZ< zLs}4fjE6Ol6ZBIel=wS7(upH)R#`jvP1}YspSd@HFS1Jj*Wz#3ud*nzb4cS{0WD0Q z28XYK{B6UU5g}jB+<*6s8W#iTt{8PsL+N#|1wK(_fbxa(=n3ri>J~@Fl~$fuR8fmn zTi1AYG)%b~8lJzOpO1bH-i=`B4+Ae%dO4TL#FufJKvaF`k%ki*$47mE$S_|(VPFN3 zGQEH5k#O^^k9b*_7mO0#!#M^~F1!JB)K*=1*q}Fi%QEDS4;v_HA)$u9FO_5a2R!h0 zq|d|SJNOe)BNXt1pfhER{vRDGXq5)Miw6CIMdr^{yqBfFR z#~yMJ8bIAeDR>iDzMT2C7DN~(ir*6Ni;en#5WrL3xuwiao3I0_JX>NP-4Xqs=pW2X zhQJQtCh^086t;`SOjqAg-1FD;_Ft#dfIeN!KN9Lx<$Bml%0ffyG;IRwGIy{~1``<) zzu)v8>S03LaeF82g`eH_h!IU4wWt#OE7qT1Rn+l{Qu}vH7^&@NOMM}4l5gAcv zV9KPwepFTx0OpX}F)sry3HH0pWn#x=#7@yaD1;oJj;A6|I7j>6UV&ZZVCSX&E#@Pl zTMQR`UZpx-8{Q%QTA?4BsUGX$9VI?$vSae>M$6RivUpi6lXYwEtDG1=gXfQW?xk*( zVSop7`7f7sa?xr?y(F*YFhgTVpxn4<41>$^6?@srCSwiL#atCh(9j^3r z!Sz6yqNq2NEm?ev#J;C7M0rY(vMz+U-fOKvL^WXIh<15m-8dnOL@A3$uT?G1adkCG z76!Lcr_0KX_jV`}7xwKxnmx2Z@duZ)%PJIp)q2&&J)O??$j6*8teu%MJSKLCJa(gW zQw*?;DzOzYjXqo^Chi3Wx8?i#Ws@sy`#h-SR8yzq>?ZY5_PL6sK^!dtnH_;7;9Htu zfLd*H_q%L2%iKRmfRrljsW_0DFM9fQL`SGk<#0MyK0MU2lO|{iKGgZ@)F{9}raEsW zu3<4f1qBf;2w7y0{s5+H!q>SPg)f!0k{3XN)6cszg2ZQWd>L4FydM(iVk)3TFHxm5 z8r?}Sq~Ij}n2cTAGpv1M+T6^vC%yH9I7hxMmQd$p}mc zP#fwm>AUgJ@KXeLj6%b-HKv0ZFz;a$xnDzvLy*_sBW)O^Y=Zpr89Na^Elyl!z zncMMq!|Z;Oy{Sezd(+83S#EjGvBxu@VFeSIAFMxw+~Oe}bP@O^edD_EZcyHQQ`98r zA=suRFfpy6rV%_7_ZUEX&O3HTL5K+?q~*X?@Gq~ZCXWBRU!5ghdmoAv@oY*=pD3|I z3a0RvG9S}gM?9~Up}66d%_Y@|-3>~Zp{`C7>aGH*V4`>*1iD8Q(;4kVRa-lkPw`^L zp7NjGyIpnyAbq=*l0oi`C7_Zd&idpiqYU_X)*lCT zKgAcHX98dm+-d16?oVv!fxk^mJEa_S(^#_u+fACXQFEB?AU~Kw8GJ{cqC8?x4kd}y zVk*8n^S z6G?|{wC^9syx_|h`=Uz=Y3tZPYC`gA-Eu4dY3<(|@Poa)e6?9+(>WIk3z^e|<6Psqz$-c*YW+4?>%Xie3RxXI4jt_5!}@4S zBJ(G+oux#@oq$Z*Ft>E<hF>k9ItU57>jO_Fhqf;(}*u5kgM#1b(@eIA?%5CXu`} z^fn|A_1RyqGJl-O3+bNeDlaUspf5T+1N@_*cjc%LX$-%(9M^=CvV~88i9Qu^RM#xV z^%Yo?4cnVUq1pje#>nLAv%C@ggcWRTXIPhjD;*tcf_dAV<8jq#$6G}Q6nn5$Jbyi_ z#;=#gum%0N;~EuM@>4r|z#@7hm%Bb~ z6pdAlgg+Ycv`3dqF?A0!HeYAvq*mo{pn2L2HW_d^9o#$lTT50pF_qk0A{Zo>?yv)C zBRRs_tJy$BO8U#AYL=MS*HPmRzZ z&w0~sU5^;*z@5nJpen$&R8g;L9Ibm`pd4lao)f(Cn=BQm0Y2-a?yRpnokiXN z3gmgX$zu4OLXZM<1@4k^|M(goNI0g1>IJ23yJ}3YNh>6(rGot(sQmB{eKoXp3EMdt zPNOry0b3^C)AJ9=!__gAeHJkzfanLB(l|AqTMUEU+c+|2zix70z(PTJ)Qj(Dz1uRf zz!;Hj{t8<677G}&PidzC;x&L}W(2}|PZ||PvIn@gP3Ib9U6yw2L{QsHhHurf_k}rE zUi|WSX+H<}BF0e)Vv$g|8|zv~b>NQ^LLH>UmM~VM_0}%E1TGFltwPhK!}>9tf9le~ zeVhcvKd?(E9B$UYufQBV^|VO7z#vKdQ_?Pp9)0TP%>n`T`R1dnrsXSurTH^8rS?hfnf=LNbxA4Kh)B*L?qZnbx1(~e5HYJ8^6sRv}2c?z(-LLafb-50l zwW`PZa4SvGv(r2itV5)|14iyuCO-B1n4j{x5yrD?7IWRs=I7__(x~xho|T@?G!YW^ zN%YsC2Up#Ff06kjEAR@+uIf;WEfvpx(;gPh4;zQev*xCKNha?ak$uRXn>dze==6mX zKRwMKS8E2Xi|y7I1m;IGHKS8_j>-y^h)&xkv6-6hP8ue1=vcmxLxlb}Pk)HsOtidD z+ti2yD9Ro4g08TQ(s3#n=M{9(yqij!14smInaOqAQ2ID-Xvw3PK_HU7F}04|-Qb2o zU&HTz!vBuuuCCLSfZ{k}QoO#dwj*4eyuN~MfEzU6s?kyUVK!Pm{-@&9%PN@&_Y)`r zvin%5%K$o$16|47@)J)180~AxNVPmk-UUkIgKYJdp9dV@>cKc39n<+Ys8>B-(3dCm zM}DS4vWK-i^)YuV(vaHxk8oxDeMS_>69_2dL(!VS)|Nc00aF1KIBg)rknTzqzBZc& zu@taeS3$6;uiI5rGYOLB@yJT!f=r1PCz*_NI-6q^@Xcbma%;l5-BnpSQ;hv}4lr~S z!gOx^{-WMxUA^&i04&3tgc-Vnp74|p;wdyW{vDl46Lu@CYZeHE z5kljY7SI*Wk0K#a8QJ#t!6jr4(rl=lWwEvnqA8N1YtAn+MeDP=xXa3Swx;p<*wi5J z;q5gcsK}??(Rck_#96+K+RTOd3X8n)rWBC9t{F;ir+K_Upeq;KDbggs_J%nFNClIv zTGka96d!h797*A}60M~wqa^pFJ(r~VKxPYD@WrrzI;*XFS}h%xxU~?FBk7#LOe2La zTV9B9Jg12SkDqbcoMrQqBpzAemD3u2E{K^RLYW%=>FoI|);<}8T*s}fTt{mtqe2@X z-%FFu41?OKs(3BPzeOl!9x<`@ZTPbtOkI*Vvr{6Psjr$F$%yQV3drlMX?mkj1hY&hdI7OhTst1BTbg@uPsgt8~~&{a?pfevOd zhuUo&*7GU6Ddh=br9!p4^LJ0|em6Aedi-;@qbQ$p)+i$>b@i6-lLIt1u~DZuO<=K3 zDd2f5$+LgCp#9ulp>aTGfC7P2yNe|*Yfu{nvEJTsOCRt^S9s5te*l@H&tQzIi88#a z^HJiqGM5bsxJ>_cl?dbfloB^o%o202!D#TR+9WfHtqPE@`?SP@P17eNu z(ZRYM`3~i3fz{M660AYQ0!p&c*|cpN;5I;7{!bBtKXw}JRHe@%<3DNxLvP_@Kkv}j z#is^TXydjUQMDt=y`8Z8AtmH#QJ9k`a#Z_PG%^Ypw+Qmn(hL?PrN5nTIi|m7Q&9Xq znKhKtsHa+{r>y8xI2)h-3R&}R8p}gG1?-fOFgeWaO@f(w=U-~n$P?f{dp6u`pW;(0 zX{O{EG4`iCh+8{8IJq~yk6jC5(%oE!`HR4>Th*B}r;ZU)y0sc8k8Vd?mg z;v<5B77wXl$fv_mg~Su1S|)^E*g;r_oS^?fRv>hXsYhuSweoM3WARbPkcadu|BF0_ zCF}N81YX1CrN~F1+8t(g`k>PIF+FWpRE5;HLmI9V3-+DTJQ=OvMi(h>to_rlvZvYF3ub?8uT@4J zbC@XrFE6D>fZv-36KbYxegc{N(eJZLf)`g1*GC{5Sa2&*z$>HVRlHK?5M%tfS^g^6 zGqhu6g5%+f3YpaS?tWAlEA`LdEc$KA8LB)--3L2?k9pHxlbf`{C_lI_1bx<(a6j(U@60` z5v;=_=Q53gYF-N*K=8BhHr$Z@-D>}6fXR`)+CpSW042bbFd(tD1(6V5W+NfOWzhM;aYc5(2pYcAfQqIXC=j$~vnMj%_z;)L%>5SjKF8{)!aMxQ*4FU(Y0~#!E?@ikpOQdv z@#XbwLen*fdzN1i(_5?vOVks{Wo5q!q8GML+K|M_J9velXv_i2QtmYI@33p~(c3Bq zX1xABemi`S6MFd_Y!Y;M&WL29T&!^*dLKk!La$-ZF|Fyy4wT=$ld&Y9KD0^rl|9co z%6qQTT3>FIygJzj0<}WdMh-RAe5^RDP;4=jo!itkv10CubV7h~X2sXvo%Mt2O*hp1 zqNw%Kq27@9Uqj2Swm=~a#xS<%-3>qxoLkNUn`%tWU#5=K-)2tw9xm)L@5Ftnu$1a+XXT{y_S2R0+%!%D>%OzMrADS!=NK0 z=&1VAhpruBF*HSw`iw|GDJaofL8a=*AzBjA8j`yazCCTf!>XSN^MxIc&>HiCrxfSi zH%;{3P*P^Umut_v74VeaJyaPV$rLxwEgHv)bJQhkjA7xjGDrMN0)K1?ap@E5 zL>yrQ&q~a_T0MUL{&oXdt^?%oFk0HX3eK}$`~76gIfB~Zs^A+Q*w>&Rf3cmYW#>R^ zM>9ymHTz@5jP`1ix!o(oMP6;UD%O%hEu!-}aUe{9IBh7)uLTGH1_D~s3@o7$)LsD} znudLm>dq>|q+midN}J*eEmx!h6U>2gdAC@qX8YEYEE#}bd7=}B*~VfLZ89n-ht8A; z_C#X64SopE=wNEWO>ZO0;dW6yAZk6b$s1tp`q-+Gagmy>!>C9W{29FFbaSNw)l63db^e2dGd>Ql&%^ zoN(y!>)^mDslMm`gjG(k-1EIQigx6|GSYKkFl7(pE9kX7#!#>l(mZ8}&JB;KbC28? z5p%NU?E1bcB}e2gamQ|W+O}sp%9P!Pp%M{C3v=s&E@8(A{O7$aBfm`je_&vk2Xr^c zx>s;pkww7dWAXmwK%)smzZ@jaH>q9nVIzZE;RMv4&WkmzbVpM)J&I=tNB*z?`*Q%J zYavTGHsm1(0-P)c1RB+Ui`qZ!yuIvZc6QMhMlYySXt&LM4=8j$4-Urk-3CY~i)^wi zj?yv~YW_wH7{Don$qsR#bnEZ?d_1NGFmB4IlPe)$x5zj`vFyndDM`3SwMsDwfU)1* zVN2$gXdd1CykN*wTy&%eJ$J;b5tvGLWQHfrbN>uOZ zr{Y^BlFP>^ZeBWeDEzoZ7KT-%T}iHXg?}*6krhlYbk>kJ7koPrcDy@j1I8W$i0p82 zzRSKL!VFiXMPQZ#lhj~C|Ko8h54HBg;m;>c^uFlvF^{$(Fu}UrzytX#jAAk`U>qAj z#<`L8Cu$b-HD9oHjEA3Y;5Wyxk(Y68Vh`Y=Fh^9K5K5bS7T`VMU1$KdZDX#K9W&^F zDN0&PLgY*VkWjQSn}($Ob1Od$s%F(1fwcp6d#_OXNH4Y(t} z08zj{DAKTkI9Ru`C}{$Y6pT0)_UAS>$g`eY)$^nCEbML%E-oP_d zJbp(FhIqBj-dwXCQVf3|U!Sc1Qa$WV4U?Ct@;CnYqydv%fo2_PKg4q8leyVJA#5|^ z#YAOuxk4f^oWI0w+W;>@m;o$k)4YY_T#`bGLgG0%)GbY z?RB;FntYfAUH%W*PU2FLD!dW(q-)S;7vdsFu)GlJN4Pw~B0RoMK_?DhEfSS7ohG8T zTdDOIXfRCr&UwyU8&~gri@EisItg?pqU+g6MWCG#EjM8Fz-%e`r?3?GG7rYVA`QqE z)kPWWl>rLxcog6u`M_D@3#K7jL&qQ#OWrYAii@jL6qnGdsdM&on~n}+6s9zcc{q2JrDdTA^S2$DI|7O6#`!~1WDb9+~rdp z0G9>R3Y&;l3SUy*05+@>O)S67k}{fFwsOt5le@Y|5)HQGo8MWnkP+(*-A-GZGDMbL)lk{BX$lpR34FKOGYn2jr; z7B$$z$Ls8)?Eh`>eYY!2TwRzYQjDdW*UwP6zj>i9Sf#4Bc51B}A_*|5fzdQmGg~Wf zE!p{MxxKIPoo-hqdY2E^uvYGx%dZWBn{{QXYF*Sa2<_qLSTm3_G{?kr7>p?)R81^n zubdDca?#mO*K&B*>fjiQl1#ReEF*Tm2LOPXY73iZv06Bf|9yChXG$22-`{)e>V=8_ zV;*M!*WN7&Z8^+QdK*L}-9%ipStkX(5PjtLY3J*}$==S74&4^=?fb~b{+7mM#wp@$ z4fVlt5#(A@lu7NT`?l$Nvc})`Po=gSf&srmtknR*zC+wIgnYi1a`ddIBMkmuW#J#K zy+M{PX1D~+OlMAtOH6ao<4w>7JvnJ%!j{#O7(~Gh^^>fv7kX!g0ow~C^a}ci*Uc@_ zww_R6{mGzd*5&iXSVARhW;(slzw~AuTL82}(}+!2;8RcX1TpKpN=@!33Gm^;)!9~5TM3@?6JH`+)LAEjOGa*7zN8)*{h5i=VGPskP!yvD+f8@r=O4Fqi3H>eWw6)T zF9+6`-UXA+fo3#T=t~%bMZ#r}keHh^7480WGQ)`s?EQNu+3m zg6=ldBdkWQwgEtE47#lm+&zn{!iMBgd!`AqD1vRDamG8BSaxZKzcJ%Jh8&Dq?Mg_1 z%NR8T0}Z{L(c?H7QIr~Aia+4=SEnuKP5dvCr?UU%qz*zbIlhDqGp=u^i|b=*FoO*XkT4f=m({x*r~fvYbDNm=^`R+ADmYo+j6keTi)6^3|EY z2rKgN<>Ue|+#Vn>ecOAhCb0@~4Wl8pBgEPW^)$qh9pThn>SDQaKsZC7JmX`d^xHKD zrLkfpv6|Hw_e-tMxED9d{ly8)#t6$tvr7~!Uca3T{N&W;lR9%{xO&r%X9o8l`)T5R z_;?!!OK=_}XQH?R)ip&7bx_Yg1m@Tga$3;%j!Dc1*|&b2IYdz6KtfOV-%*#`X+>V9 zk#u;OpaAI8#tJ{=)1yhdkGD>yc;HC=&lgvAPvlf)vpq;2LmlkU#{5-8ar!-`@f9A8 z-nbd+$S_(+BL3D9@u(2jA!U!iLBR7G!k)QDV%}q7+ z&{A?y*6;oh{5F03w@^uN(5`@1%u&A4|(E949lJ=?B7>*W! z2}(fKOdoYb9v(sHl>q6%CCrM}pE2tgJ3+jyjU2@g=a8^|-leHCW{!iP-g2N=qOs@p zfN}Y1AV+E=Z)B1c0r9dasC01XBMPnzyMc5Rv}=UkMyy_)K0t6he8t}^%4g5n8k^kyx+fyP-`R5WlP|@ zF;ZBJP?+a!Ihx(vvWfNgIKmss&5PgelVA?8ayHG|1GgU`NOOv|2d|9Js#Q0$kZGYiKR`-6rW$JRzKYAEYvj7Z(R_ z9FO0cQpyP1A)uW^DU%xD7vqQoL1g0;y=F z&0w`?wIB~n1w1}Y_$TAr#hl5c8S5@6Mi%YFB3|=x#(#P7vRz(%Y@6T6kD-8ohWfg` zPI5)V{cL2nBy1-&-)@to9lA&)36pG5^p4qHW~y-y74!Bf%5C`tIU=*OqR~wrrLseX z$q1X>poiNwt`D*=!V(UE3cf9NI5D)34${_#*P4OA?cJnOS1ufPa#2h*0E&D#d)gz5 zgulbPt5A4(&~86UwyW$y%-jNV1LFPSF(L$^=y0SeGmpSm7yY{!HppM897`K#HVK1#)+nwo#i(+&H=8lw-ladFAv5Z{b zpz)1BQJvMH>cbU>?=rTBm#nO9J&R$yALAa9%ljUoC8h~d_%N@Nyl?#6oU|GcO zTk_sxZwZZ+(}}EGY}qT`v(RjAzTIeXiih*PLbn{7e6n>Uq9!1L9`9sp zn>4*3M8C*RVgED0#%c~p0n~_;G(=_@<81=vk>G#LudEa&jA$^Hcjis;SRK_F-FgtO zy1f#TMyQhFIg>_|a8~7FwaLz*tdHpy8yhhxh8MvP9Bk+s+ zb-V6{2Q`$BI9)~_J#U{`LPsT0bj>1tnn(4p1P5nvOUkG1(OKNKkfjDf#BeVV-%AfI z{}?iIDh`0uZ5e^lVXgY5BrU+Ga+tr zHVQ!0PDJY8B}bl)g{F4ldPIis#w&_Wm6q!J<|LabwIc(jm z=IEkU%Ryx@lE_aYdKM_e^a+iQq=t_%p-Jq`b&Dr-rBSu-Rh(FfwMPhkDl4g2ALE48 zI~NZbsuK3D8IEc|Q%VHO3Q(+UQB?7VV z10;hA`WGgJb7o=A&wiI+bc!yB4{)}|U^I!w4vB|nX(u}g zqUMmc6Ed}{_ctX-K<;%p(XSYl!{ia zlDF1aVgC?H8oMDNgO0neVj-LE!O=5XKWr>bd!B{;FwbE?Z*SrK9WeVJqm~q!@mKpt zBV*6L0x#xXufOfAlFuI-5@hwrjsMCEs0XZ6Eq}-pK;0kzqppm`z43tTOjUub$*Nny z6Po**t2r-bUb1e?*uUwh=hp_ugMM1m!hCwdNIFP9#$__9K^%F5Qov+9Tc@m+a&~hv z>z=9yyfb?*y-NOpc#kxovqq#xxgEUrI&WUaw>^JV;&Z)h^jjKomM7-is2=6*!vbO>Nc=&(fOgsy~fUkcn& zy(|{78c*5}7PTGRTON<-JR#CXqjsCP2f8XGb!9;QKkVtxNJz>dW3>i+WdFE$q0WhM zsMMk*?&mP)8O0|zy6iXN(q}o?d*OR$K%o=ds!EnMDAOOumTxFaq3A`qJC!80RR9XFmv&A zFm$st1NcY(p{=DEqphW(nXDkA5C8yRtgWew;eWP&L}6iK#g^ z^PdXY*xts;&e+D|Uqm1Puz-K6e~tcMcfkLjGtPg`9RE@a|HrsG*>TxAn414@5#lno zG>{a+vdw*EUT5I~?{5C9+$K+rI706^e) zTN6VUBmgLIOe(|fzQF>fSHOP~g~EGvOSYRkYn7LN!*olC{3n=-RlW%0>6OPmsyx5m z#3)>NcU%=gY^YJ;*N~E^Y)vpuAl3Lcy{N=^cBIV-N4|g*@Yl1$Ix{%peJ$xjeJ$#e z02R8ILurLa^yWZw6W$n|`g?E;*MTk#Dc#*$*@VBG4_V9ZAu$`jc?SKO3I*Ql<^u^!{1}>_#8X8-E#YR%At#MD?1L!Nu(*5j`m)55*gmSPY0!VQ* zoJhppGT>h8eb#C*o6SkKOL zeu>-1qF*wt!2%}Om>aG=v5lI@obguOxM)V;X>%I9KMMv9+K0Wmfz_zsa|#`{ht3ZJ zZTGTXq(#AO)R`^$vQ61iSlX>atA!dES}Y!?SnLwjcQ3*?+gsa#3X}~<;*)~$eSkzI z@y>+3kTaZOIa;;pr0NP%BUk6qw5B#lG~T*@^~+1XOZApYGrChFe25y+it%%@i!sF? z0b0tbsB(6Y19~#g&78LU{6Pu2Y?Do@V_zjQhNJG<1r5^*{~}WHpzdPQw_dO?Igw?G zj%PXC2JAVdGrmou{#^b+dmF|?GmPuIOrEYfZ1(sARtC$Xe=dNtflNaE7T!;6-y7QSBeFc6uEO z4F0X~kSnw7yrfz{#cF0NYVez`DV*4gOH^|mM{O{aRf>s7#{+pId*K9=V?M2f-f}e6 zASk{+B4^*loex{2lB%O+2^@UqUtqpZU)5@v<4;`vRQfX(Z|eN(B4?3o{-Sx3g(0Vo zp$|!`@aw-ay)6B-F2dXGC%v=zUGykp1px$1?r^YdiQ*!7f3F$My+MAuGjRY96b)pPtIF*7ddaVX z+8GzSkubzrM;oRL?L@Cj>|mpJHYPKF{3$}=ogtPP$nQ5X!IF>m92Obx2^XT6Bv4*0 z1pw`S$x+~|a;(K|v?D-n^#Ce2d@I>M_byAdi68~wB?f=BqZGDeiF95XZD;wNJHS5< zu(%wv<|>Xlsr7oyoFssMwX3;7lZ<3SHqySd9Q|(D>D&mdhHR+=BJ(nu>M$$rK?Oj0 z*|PQ>R17P5T`ZrCA}^_E3Sah5#poBwB4{%Wtv9`?4Fd(^Gw?C|}%cN3tk~HyBA1nc`Wo1B`=r$tY^Hk9l%6pYbIpGrEAEU^rzN zD5IKJ|L?$%4mB?7>EzABRE2CVxyg`x*l}M@`Nxcxt_~zUq0RHtP)+;C4X|ure_1z7 z;(3H%{$&P4(zxgPn+E9P$VP9H=0MH_qvpy-4n~ipfEg4E5Dp@t7H)#0jQ%N8e!93f zE>D9H1_yes^K`ne#-u=j9y2kW(~hN{b=HIceQ1`1zcRrp^U4(OR8iM}xt{@rV9JHO z0@P?X5$h6(ryw4(hEVD8o4kHYf)0f(D=r?MOl!uwW6*co@4_Q!l>uuqUd(p*=J`>2 zIb36i)d%sU#vR-K(tR&(3Nb<;irF;&SMF=-R}|F|j~wlVsfmrz)4+zN9A%9dIpwhV z6W-VSkjx0=`qBh*fR92G!x#q2K63emKE)rgv6yA3@6Qf&Luuy~j`dChfFSB1F+Q5z zU`)Sn<_h*c%sdE8J+1O&jP(n+LWD%W^26I*I-J0!t|EhOKdE9cf59M;c{G^3A~HRS z02Do*JI4T7*bi)EZ>{v)qPv|6%d|}os{!!m)UofMNzLjSEuPxjiCH^uRywZ2*H&sH z7Y>l~{kty;XmxA?M$e~xmElNAW2$*99Bx(tY2f2~rQ!s*BvT6C@zBk*%b1H_;c z64(ljxK-WnsW5-kM}(mmzyuFNc(MfLlaACC`jmb}gv9Gg%;jhW()V{aOQG9-pGZOZ z097UkY8s@0s0%R4a|fgEXw39xoJ`gJq3F{nDm?puXD6QMF#oaI-xDOqDJHSl#Oe8ctMfZ$LGFKV6WKgWcnP~Tu zflvUek-bRgo|-EWpGFj%N+Q$}0w~Sbb4%}>Rcq(BRvi4PjruhxXdLMZ;`#B7li_ z;X6yo<*FxpU-k*!pWaLcM-CogWjqb(EC^I2f_No?k~Az8$;6>Gpr=UluL16WuAkoZ zQM;MJSEEb*&OY_KHv;$bSc0BFiVSzH7xd3WjXv@30c^IVvQXKL-;>D{`m(33VK(I> zG3bKP-?M`Zavtuc&O@d%J;k?CQ-T^;%0;XMrwiqJTu$LdeQhZVjeQpJecDsY4zYdL zOIhrxBPQ67aQH5eHUlS9(<9vH>u*HPUAoK~e|wJyzD5&$2 zsL}xL9v|E}8#!e)W&^Yz-CCL5;hFq*JY4@38EVZ5P;C5yz+BbkZ3^i1!z3juVuqM} zo(6L#Ifx+U{UdX7a0(RBJ1BBu*-gq=^(SRJ7C3Lhjt%fgW6;dgcUTIl=ov6C>NYc#^#?$iud$hvJ-~1- zyZ1iEjl;-%D1I&ml^b4r_Nw2#{jpj36ZEvfJ`j$LaY`&wNNe>>&;D&8FKzaZ6{F3yewPWlf}i*O*jD9o^Hr>bUIK zH)}(fKi0p~$kV^p4Da2Ofwx0C5}e?M=)8|;b>`3f2ZK1LRSMSj^j(lTAP6zBcuxM{ znbx$HtKL0qkc!jo)J>QH=^*VOFh2nwXqV=qA~+oF-X+>}i@o_%eOm(DgaO3s#Dk|L zY5%BjnOeF=PykXMBsdn}h-``emS|X*)`wp;A=`y-avXo@4qjxT_wk;-KWqw~{I-xM z{kk>T+gXfeHyD$^*nPKYNiGNRGO=Zy6c^ff2wvXK+u8?8WOd9@$ihz+m~kt}OAJ^T zmgHG@#x|#Za#cy;R?spta?Mii;bwl+U?~g@$@nwa=Akn02HzX*gBEVr?QiK_A-f;B z?1mB%BM1vx&=fPXx?+JIf!FNLl9}>@o{J@9NnY1xqb)dPojR|>;wSPZ3PbcJYbI4&H3lkC2bnFl@?f zM-W*2K9-^8N?;3oJ0GA=7sZo_4s=%c}Ee;Sk6Zyr~DhQb#HdTg4)_ z)To)Bvp&1s4nOi%F%Mp2aaS`yXiTULzryYB0j`aO2$_651e(Y3K_sj!a!IwG!i*gV5Ws4j+!d^Oc8 zIFEP=_vhF?lLoxo^duhDLYs!59HwQZ+%I$Es9&PIu3*Kr5}NsU2is;3h#t|cZ6F>7 zH1=gm&CG=rvo|q>`l3S0(0gmNBR`(wM%zvBn)4KmDW@;&>wSZX-DLd8m|SThasqPY z$T3!l+r$POK~ag1l!%BnU%bD94JwC2wRb@MS5dWM)N`5PpiOGYE#cKVBK*eG_t{e- zVLPcaFRQ7weeSZhn7$j;9u-IeQV5x3DV~LQktrTL1EG!zTpf0r+Xl*ljgUFXuM?zg zcmEtwFk9Fd*yqSGONkPHlT7rFNnS}64LtB-$^tyBnlI|!8k{;-@%0#C{R(6=aAq!2 zl^%L=VpN*97|cbeJ*i$8qUF(4J|DI~fn)00`)X~R+e~vWdm?}M+V+F`Hu*BHam=#J ze!$Q|dbRECD)QKBHi8LU(P@cZ;|+o9K`pv9gbToHmNgzg`H)%wC4WaA7naRrFBLx? z1RHGF&K9O{dHrf?6v#7GDn-_5KaL^tk~9Mz&*4Q7IoYu{aYMxuMk8W-`Kh|;eP36d zAFC)ee_^3Z*lw!yvb)nYB720R3T4Ewf_a55CE-2`omAqCu}4vN`o$h4#eyW`#a|I6 zYh)fXZKnpdFI_BzZ`L11ZHMu%Y?`us=0pouH=Yel(VDzZNS9VYs0xj!_0zkPodGdP zr%%ZXD6isynTxu_W?-bQPC`8OQSnzqam+nnx}}V7SJO{l)O(@q-&2HVtzfLS;iaBh z1fOtW^K&$Saj;=o_V_ozBp6+-QA03ZM1Yt-a^6gF%TG=pWb~^8x|1NWM zMCqtyr+>_9@JFY4&U|WSDI_d_+cP`ym-wx~3tdOhzVpD>#$b0*!2Swc74n=?Ee#&G zxm)D^o(Z4XXu`ssrw~CFRx=;+6!K;)VVCt=l;rZizaW466`x1e zqoQLmuI}6xdZe$Shotrl1t+IiL=8U?6;Z7>pCVMSc$hiMyu9ia0bm-t5k5#Gv~0Fm z4SQ-V6m&<_r{DIE+ERvdtOd3(7Cy1$sSGX>3JJ*)y-1@ zL&=cGhte-g*0o^bMRJmT5XqI|Lp(+(byA0g$Y2RjSSYsra7rRuOQa%2P}jEf5@#sm zq{x55V>Vlm5lGBc@Sm;IIm9C>sr!Z!|EzWVdHqY*vK>WBsb({1?9UleE%ZJGDTd3E z){}dJIIP$Qnzm(Cf=?s-C3WrFVD#cw5PH!qBp}JhvUg-Mj<=C8nq4{nk&j_{;kG41 ze$5*atxPkzX;xKm@^jp-F#`Khp0q-j6b;w*oMp=FiysKf-9^sO<~eBMV?R?0t?G4y zLoOqsz9htq@ly^MB9yvYld`QLUTM!!guqWi-yY|JwdBnHg{Px8ptqTun#53XpA2Nl zHh*IdOee9Jb~__vnlVLaz?xlSbTtV#W{5~g^DJLs6#(Bgt4J!`&OC9u@)H+Ngr_$J z^JR;|E|!g5p5^WWFXz}aIT7Bxe?WkRGavIg#n6+$gPqmt%{yZo!eZ1#1!`n;+s86Z)mK~cK>-ivt@m@tFo zIkMO`?hwo#=vdY43PXCwloMfCpoqx=Cg=t5oI8LT^C3b4W%bqWYTEVe;J7 z;t0B&%2yjp{^hQnAl`gOPrZ2YNV2v&9%R)KMFB#0F!t)u+df0;)miw(3>YQxv*nXh zxj46^J-fwQd#xz<6^98E`W_DukfN(x)CaT*=l&~u9mGo1fxo(!?xXbWgkGsu(iVY% zY%jB0{|d+y>Jl|0>>O8F2n!0&br3{gzq~M;T!3CSJSE^QCP`o~q4m9Xiq!^`-?enf zFrL2EmW!ULBeo2=Wy#bk3Ox=8XL5oqZoH}NPn!m?ftSo}|Hzp*cP{!1^K4A(Wf35O3zFV>1?#Q4W)zBqqcA;O@ea# z0f%XgBa8Z#_mj=>ko@vhNH;lP2R8XLOTbZRnrIz^TBdKxCkj=)BzT+x3&HLVn1}=U?I9ERZv!OfN%dc~&o9LOIbAc|k8i!pq zF+1z_y+0HJ%I{S$Hh~A9F1wCqf;C*<;Prtwu@ib)Dfm;f-Q90O+Ol&+ z*F*nrCN<$@c}LGRvmp;6@u}W=I@GJ$)X~ud!}!-q&iq$`w>S}cvL#F3KpZh}tU~x8 zrXV{8W;97(WR`~VYDX!R{m=Gmw+`HMShfREI;(g)HTXWG35C2pR)Y_1GHCTR2ug#@ zKVbp!!X3dqf{s7f$ ztvk^%8`u!jpuH2?Nn}9MxLnH|0dnwWVk8qV+&A^$d*Wy3#%MnHayF)=yYS7du9|Q6fy2m-rHNHT!0cjWVx5&sG z*=39Y&0ehkWUh%AtfYD}SVL9I1w`9k@xLR~v^lhjunnWK9V8RH;~ID9uu9P!YLS;FqMd?)hI| zlt%N56v!5H7ZmM!n`MDo*9ctszQ7PsDT@l1w207rUi523sqWBF@fdp2Fr|0n1wNU< z->(qwNLyPV{LiEZHA#sxyWcTnCxPE z@N8i6uNU{9{d*xd)mHEe1CL(h2oKsXRm48sOjgbi7prH;eZJrHIBxh9!SkHY(Viy* z94Ljq3pTK(9CGz8RGMD7*R~b*tn2TIqj`K*2nNCeyUYU^o5CAZAP$1JGk;R`(s!wK zH?0m`+&H(%Hw4jzd8qIt_V{m!Yu9i|m)Q$&699lnEyjkv@8{pRCLOYjD-mv{k?n}Y zWVeO%ynUK~2c9f7JLhGF z_YCUtFFQ}i`3pL;vn~v38F6(a1VAiNCJWByj;AkD3>0D;*#VsGOLX5R+F5cjI@}#d zwc7kYoC;v*yD}Ro3%HH2DfVJj21mk<69_DuQ-4W5U+ajQxtD@`FtGU7x-kWIKVZ?o zt#Kh8&{e^T&NNqL_JNTdE$&gnQx`!Dqw<_e?dq{LvsCFTf0v?S={SPj&VJI-QEVa~ zJmA75`G*}Lg6*vVC3=UJk??L=b zW0`^hP8SvJ2&X{wz#=n;@9KH?y25dNzdK6a7tOgR8QN=3HaLE~ zj(Crf4mJ3R0DTuZ$3jWFG<_pmpE{M%b>hP{Fm1P68*`0lvgLsQFou9tt@&5k2om_s4Oa0tY>~Lo6yVL@{`G z3>Ybx*JC7Q%ys)xMlhb%i2l1mi%HLwl140ETD$USov>rHGVT0+Sd|_&?NXwLbld^Q z3B1{*#T2e{Lz0(Uja%#|>XNNaZIc{}#|(y{7|~G4_57uei>nh;r&`Qy>@y^5xCk^D^*Z%G-b=`@v4JNVciogwt(t=D-9YsuY)z> zEM*nkyR|WBvIQzq7B?I^Z7%eu$}Kqe>tYyuoP;D>1T=3n{czK(htqjH5oLLi-_q@_ zPmWfY;dhGUb%JRac2T%n-+c2=RMx2VZa@5`L2DCH7xFBYGY#}R_z4!H%Z%IN?W-YI zUrg=`URdXLo0UG5nV6pR9K%SFllw^5Ld3dG|H*xI6yc3hUe}jVv$1se@%1=uhP5`W z_zLIp#UYYE=AwQQQ0R)FiAhY;ik8je*VJHw-NW|tZ=Xv<=wQ8n5>m?k_eT^71S%L! zadc1t2`w5t`=^WjG+}}uf6X)8WZGc@E%HOwv=!7AFw?E;yomjGRU(*4y4_CV8;hwB zVeZFG1N=q$NiI85tKfn)>7Z#>Z@z=rW8*MU;(>a!jB3z|#e->`>ad3!eyvpN56z$0 zutezA9vZ8US~z2>mC?cgfH|CD(G#3MdnF{a&Ku;`x?l{@D%~UPbDBDudw;!-&0Df$ z3u>`iQS-vzm@caFtLS6|^t?MvJs&*93;Vz@4av;@MvkHKk9U`8```;kP!R+OZ1r6K zjo@$n;9HGeMvzhmjvTbGy%()be3Cr&cNvMH`Qrcy^$;2*ZA<`c0;W*l^m*fLR&N7E z%>XI)G$CVcl~i1DaN$z}04R^KDh{iC97nj3Y)dag9>5Ya1t!5RdZe z>#rM8h|YfT-L*8Kl}tmkhTtgMh)p$ge2Nk0BmQ_^`4j076T8Yk19 zWQe9Kq)*V3{HD9kjO^#S0g!#bTN=nw8qscVU(w)@RbCmk+;;3$bq`dsZobOR93jX8 zu66MV1OJ!a#GJa)3S7gBGaMg(Ga{x$r}p}f9c&x29=3)tro?91y8mr|84DSdcaL!! zcGE{CL0FO<&ev`0L1Ls@y=Ge8V>wWVP|`vGYPJCEbf&ijUBM@TEb|L>e9chVk*Ohfh$(qz-ghk? zugWlZJg+LMDoJzPsWq4nB_mS*o_$-MQ^qSK-$O8VMSUu;=&RzbG_5Z2+Rpi-w_n57 zqBvU!MDl=|bli8iYQ6^WXNQ_Yy6HV{s`#F1RYG`Ez4uS!sbF-lOmON=?q01qd(^vi zq(`O;b|mdkH!*_N20x=7$S3{-2P#4uwM^^656(MNIx47l-HSKVF97|9eh z;MPods=DeJh&99kyvnH49nBeOIGbRWQN+j4X}~NPOW>q!5Ijy;wBR~I(Xl)r2T@nE z_TEq+77gsg1a)0Pfg_)JPOk+-ts}6w)g#0(!yHNw*<_vE8phjGTl zUfFtdSlgj2!o%f!U>;dLQ5HeRLF*f$8SyAlGg4)fb&ALL0>7@(_?!&t$GFc(XF}}v z69Ky($1adQ!o|z>cW?QPt^q^v05Cw+q$ld^puqI8*BW}syfI$_1a;-S24Kb(o(GR& zs&Xj+qR`8|UHdlsPd52jXT_~gF>&<|0)zuqN9+0y!v%#SYTyM7No0bWlP4ef1k(B! zW45C9soO}fK*d9XcIoqu*)@qfnZfbbn6(pxd=tfy+iMAlY1i$LABGjJ2BA;&G`24Q zE}F@$j%JyYXu!5FPe*i~1ggK_H!bSc^3bo}0j2IeA94uKRjzi!%!R?2Buzn2hD$wp zi=&~pnE#ICl)9(%GVp+%R(0~+#A-3SY_s2)TyGz)6H!k4n#=PYo1H>dg&{R|5)eg8 zViK&3hOq57ukrx+m?kco=lrqIocsbS>8WE?%L7EN5;sf?vHul+vfAXWoh*3TV1tN{^IA(5s_v0I^(Rt>E9mvHZ#hk^{NHEK93DH1Iv0^i% z&JGk`6TfP*ETaW)D-s*SL6VKYhU0YOOH&Z_163GPoe6not0 zxyjl-Erbp?ZYGpmq>Ijg;E7L>Qvn#uRks=%toY^7V1Fw?!xAuK1Tq8!X~Oba=|mGC zvzRL}x?{&vR^w#9_W+&~s+6D7wpSC$K%{k6yauAuX5u&aySf837DQ9{gHgRZTc?L0 zskM~->AgXd$TFen z=T3nWa@dG>ue(j8F8qs)`;v^>@O21_l|RHnuB+4DSW!Kk)s2#WvGln|bHz$J5eyW1 zXvKk7Vj$lcf9X^1xp%DKnM!Q`9t7>qdTj&~vFUJDg(Hgpav8<(T>N5x(<;rO+KU!n0Y;kpAO+i%a#*iJwZunO+l1d_r%uN+@XI% z)0H)&erVzN#X2Q%j8>fwoW5UoifbqV923U{QSZo5hsEQ60A0|y4BD%A@Pa81Zs?wP z$|sSu^xN~pGFVTp1VvzRA=#6gUX>9ub2mX_5@}0_fE0NfyKvtp^Mx1VQM_p$%AHjC zo4ji+W*0Y#=?yDcf%AVC_L;geiP}P5b-tI)q(A^#;*GB=cFJp*FS%8;(&BV%w7icM zQmkW)LA3uSH0EsFJo@-L+daD_ipBgo;maR*zjdzVc^|jG_=Vp}*(sq2q!8r??Z`J- zx)&%3b(+Q4wzo&PP7XJ|D_IkJSsYq>hcJDFi5pL^8rL&7BuhXIU;H*CI*PZmno8rk zqZzp+C~0_ z+m{&XZ1|CvJ`{moh=Dk;@&OG=P%zqV^6#fzrN((BH9JA$99hrydVvF{RzA&&2?+Qy zJuESVX8Ww(&xNYdtp&7g(OrI$u$t*Nz(l8c7i@!MevWSwW@e{)5~1LeU;-X6IOaLW zg`TxLKaJsWiIs_G|M^?BV%n8CzYm%{N0XI?WHt8Sk0JzS%#65N81*-}?kxUKS)1Ye zbjW9cpUwDVO)_;0R9-$;tIDY;)$GliZF3%tS{~mJQ)9WSQO8AVGnMWYL$lS81Y})c zEN~bpnAo=V!cT=P;g`K5ze4u8%=eOj>)2+#rup&re&e(n4FI|DlQ6GPD_<|5#cy&_ zZonjMuXW1OOY(@5R!&(pyb2&m?j&dM{q^4^m_=VZSIJ2{20!DObhmh9r01^<^J*q+ z&I>ULE&zT6kX>rR0SLcp(hzB6Yc8Ht4Q%fnb!2WdNe@|KF*u6Wg-O5dtF4w(g^N^) zXia8UJO4sqFJ{ie2^>ps11zaKyZR$jGmC=fp8S?)3`E3OMt1j>#-|ED*G9}1b-C=e zvh3gN>edUg7sKgP>{+Cf`~Q&GuPDRnH>kBE3K z<|V^nG)|GLL9%p`F#3?656FPUHWO^BpIV`Xt#?!piz}b8l=&ilPgv1QY4+ocSN0>;gL4C-G#K1AX)rBNxjY_atk9Z=t9iYw~E&Bx%ZVOF(55%{EeB~AW0 zQH?~g#enpgW5ox3bebEuVDu4-l_86+%T)#}s=>PFEM1udH&gmv=u1{mgJHrHH2PM$ zf;t`L#i*>bT|*J>Iv;Mq5#Bgb+b@I;9?(Dnwyk=bArQ1%(5dh;Bh^dpSM=pt@(a^8 zG=Z>D{r$<|Os+$XgrisLlZ|R5|FV!kx=KxXTk@O&?kM zqaR1ZCmp8Gj&4?y{T8W*(;T1mE0VW0lEWf$n{B-mS#Jcf5JS=au|M1v7g9StQ&LhK z6tdz@>ZFtU<`E*Z`uTiVG)>OY1av;J%A;zAXs}uweB3BZ!lfe*YlNr>xyTW>uwHV% zCS2kgL2BuFR%Ey*ut}0EY?Z>qwTuVKwq>W5RZ1IPLpqvNG_6h#Z#BPvz~lINyCE%| zGoaN+whedw+}1?ul?W*iuboJc)_NZf&y}{Ou^bfIWpYjVmrTKQn4{9;qgr82>hKTj z+Wb)&{@!J9GuIv4kr&23oR#)jfi#CGRM5z-Zyg-DqhuqM(o&JX;#U+~Jf{HPdl^T> z0#X7O>)~poem73Fph>(y$gniHRqu{bT5l!$Lu-LOo1Mjz-(VwR3YdJXPPs{zHze#y z2UIiY1L3)7CsgMiay5=}Is1OY3?RtCm-lzbP<}bjWqVUAoSBx7T|Y!z#SkTe=HGOVpgeqp z;@aFl!SFJnNrW3C137UHD4NPAmPF!yfGR0KEt1H~=7#&TE;;{ewJw`cgRiR!8(g0b zjnluf7GUe%70Z+D88Kf`_iAs6S?c>eL7a?@wRwg1*#mNpF*3EYM^3quV<5_)9a+Z- zRsj$24sKL9`B4AaPUL7t;<^j6>U#L+6H2Ue&ab~sas-9*V_(U^O~QP96OKbPqv`U% zGTDub50+8EL!Hx})&(OdJu-5&B5Av~M&67>1>6B?0*L_Q!sdd~TG5N_hqdxJ&L#aN zcbhTEyOx0uFn1X^lnB*IS9Skq6)(~lEC$kyrGNUPF5&P(%!Ei;ke`h|#)?;RZN1Uj z*ZquTs*##ad+u+tp*@3AO-DL=MIm^r=^m$!wNCGTLBpD9`h zK#JtrQIRL*qjBQQkG=<(=B$r{`gT3sVoVYcIPSlduXYgL(#D|fMVuP6tO*8^n2uZG z2pKmD$1acwo9z4TM9E@1wwUj7Jd4jld3=G_%;8x3+byOy>kSIWkR#GDwLOH-O4Tjx z-Dx*$rIvfs2EFY<*F7cykE9B_JY>NPhR0xLe}MgN3Y9ZA?NrzF54j_CCLFg&j#l=wFi8V;7L3=)14gSd+!J zv7vuBVnzwm9-mw+QP`}o`5wme+rt$GWidPuI%qQ^mQJ+JM1RO^zYbfCzOuf@Tk`r` zPkYZm7&{xr!^ur2YxXd#4Ngedq;zvy3x*&8nOKXVX!0hRVIc##Z}q4r{(K4J~9 z+V46y5-yjFh%F&BfW6IQf4nK5WSOoa)kqkSbYzVUH^DR!SF^%55eMQ~dsax^(R5Am z#ZrLE?nMlGD_uSMHK)_b11;2%Q7LXM*BbkEs{0^ z(S#ItrnGRVz4Hi9F`vh-+RQqQv@z0@oGhf6XDrirclu#-2-fQV^*azf?)?ae{FTx7 zly%bA7Ia1xQ4fN^uaQ|B8q_x&sMaBBLLfsI7pxznrkSyXlbPI?a=St8Y$x1o@!!u=LPvo28^Z~`Qj&*4JYy7h9r zQ34%Q$(Np|m0nOh4cKx*Qeo3n}k6?*RmXPclGXc7TFngHc!)7TAd4jBwzcuM5o&YjB=eD;5X`uqM}fm|OPd1wA?) zRH5fqoqQtVq=<6}q?;M*6QQ+QH;Jqm&?|XAUQP`vyNO1wDB;h+LAusxq=M%zx606+ zbaYEFZJ;7n5eU5e2fZ!)g?O-@n9&R3K1} zH||c^6)tv2Fxx488%+m~oBMiJ?>vU#q_F{6njmT~N8dnVnPB&=n{<|9A2;Lt3GN^P zWN0C^f0!&H{vMVFo3FG@%l{@TPhR_#QW>nJ!}S z2vr!88X5-EH{Pa5Cu^U!kD5gYgBSMLrY5T60FHj* z5@NaYE~B^^P>eAn!c==i0rSE*R8J^!ZU}m=*p?E2?BLTZJsK>Ba0=-A6Q}(OI$;VP zPiWP6*VN%OV-4CcUSW{X2QT`ia2+nimFu+zZa&oJoE=GAHv@aAX1+EVOF&99CCaQ* zvM{Llm}}C-;b;|uKFcwCF0e^tgP=kdBUa1v(G&Cun?;YAB&BBm?CsE+@peePZpc^mi+rdA&HsO`>eq%9NbdF-w~_RgaG8Q=o=3$(^msbicCg-n~VkVFdTW)w~! zV2zMIprm0Xv-+uKb|JA^<9%@G+sKz`bN%pdtce1W*76E~qhb~E=Fv!{+Sj>bvAN*E zAzTQJ)YKYk4ylMAH+0nI(X>o|aPued*R<&f+bjPR75U<7V<)=JzBK6; zCu>CSDp-wLY?^c~w9c^~ta`%Ix&Nw#27G+v)e%y#H9%B2OKAlejw|{|!h~LZzMLdD ztk4hBDO;Fzl6IJ^lf9>^N;xjrUy4qVe(8dEJWmPeyaK141iEwIzF+-`Algt&#QOAd&5mEX>@b4NqjK75I#FGuc(tu& zudpX~(Nyq9NxKzfW5HGouA4#g1(8rZ=e_&OMwZKXaB=6V$fr5H&V7i)@ISb0pqF7r z#QPwJP0Xc%w0oxA`9>a^twkFk*jme%qz|PsNhFyL9g7D-x3KuA@+BvVo!zo=$tY|L zWbbjJpp*HhMy#NaOQwH+JUl}pnB)SopbN9O+I$_S)P0`jq;VVoBA78tNHQB{bY$H* zX}prwN5`?xw5_I8uk_o`TSRqTe&LKQ#t{PIkBKNfCe(&1(UE1d*8!E|8!Aqh-XK?P zA6Y3J1-jn1*y}d)*MM~u{-PJ8P~gR$_*7w#8F@9r+!~p3p>J_x0acxaFboA=EokK# zu==S@^pvis73C3za*QD`t19@f<+gF*BL)9^I}+U=B_MS&LGdFIhdW+`_mND*#;bf) zN5SRj`O3 z_KA+HzEJWJQ67x$ALvE{*P!Ak;{Z-D5Wlq24}chvf0vUIAe2IzwV}}Rig3`tXN@Zb zxiTlBbz<%&yXnwhe*oQ%rBN4hAj@;IGgDO!Z7Yj`PMT2i3#SLS9BOX}>z-8NsR7kP zeql8NTysf_KCv2riSXcat1QXrcAnjq+GXnl*D*Vl({(3nubT%rxKRCUEtpjL^8TnO zyP^8by8gbj!csy&U2_8t+mMckQVR(u0AwjhWNezc3{6rFv-Xb4Nt`56f${jtIgKLH zsOb<@PVHlkf8WGU(j%qV2Ug+qXUaJ?C0R{fr+y+2~WyMBEY$Z6I=Umbq9D zQ-@WSfFq-rV!5Km#QqDPsbkF7BAM)}ayCU~A*nO`3;-`vzBpuM|Y?6#-R za8vd>bgi`3u^jdM>m^2-M&!b=^Ykme3jy<}63067QzNPs21kY!3?qbiMhsP_Yj! zmdum|H`aSvYj(sISP)oYzJ3Ic!*8ZlKIMiVD(5^HpgG15QOVMdqIpskF$r|Ebl*xv zQOC7=Wwkn`M;+=kZsYwKbd*)dhV&+7c#rPk5Yw;is3yz8STjU< zO1y-bJMCt2no_#dngN<)sXHa6NDB&3?$_iTL2?X#%Evb6E)|&5 zVToYq<2QFex!5dHXDUyzkEzPZ4A);j$C6I|U3ux_GFnS9hg^EHCq%D&t!9PkwqbcA zy(SJVWX-{$LN>&2eWo_t;uX6yi4(5cbyG+bBc=*v|`G(ZWY~&w()r&R40Y}idfihX~Jx7Keh(NtYjm@Xks z_}3Do_>M-W<0<6JJ5^nzL>5}{f|v7Bs0d?xpAKc~%(Ucm&iMhZ{pWfGy8`_|D@> zemh(py^9e%iMz4+(_fyLVe0*OT)$$$=I$lUAr*)Kg6&a8pz?hAN-3d!acTBXAX}c_ zSMAT}P7xvwE)@9d024i1UW>V^RyDJ21#F?ecbhgn>^YEm)!$XJ@DGaT=t=H$G;F)hJB#vqcGz#*jHBQgQVZIraS#Sy)T@O57u9e$lBoj0A zOYeSmzr@4HZI7;)dRau)AVj~MiJVtoK#R=rZ)+799iT}4egqngrnFm%>p|j$tJt5S z+yFnr7gA`d3cw4#B{OprHi`HP3=7O2*<4F7y%2U^T%J0EAUfb4-h{!6V!`#4>7bRL zipYY}Hu;4v+W2&ca23ajR(H>0^V$1bgXBGeReix4An+9L+d;l3^fCo)vBz{KR%yg= zMpqO-GM*gLyOjuwM9m0nI!q}tg9}H_F!ezr-jvSnnmA`tvH4cp7k-gaFag#3C-+}J zy=TX^|Li81Kt33ZXR*7BV+@?l`&&zba`cZE2{YZ3Mm8bc6mPUi!wR(rBD6>TT`HR; zwoGu}6u)!92#-48gMb&{@M}-5e1|zW`K!Djyw@>ezevIyR0HqEmu&ZoMLGasqoG}t~lnc2ZmX;9$7 zs~Bd%S1?7^fi_sEIMa~Cr&i) z1IZH!FJJ&-OMFlIHIh8%5BuM0>9-~%Cfo#*kQd@mz7~~%`C?S5dDPJ7(LpYJI0Eb@ z(&*;cOYa>;lbrxd!s9{B;ig?VpNrfQF?%{=!4HOGG9>c2FUj7t)_m{L)~wkW`v6m^ zCBxYF3VF^;avrjlDp3IdQxoC!w%JDmYB-o~F2)qMg3ov2?BChv8{Oe?TRp!&&|rB; zkp!h*4oUH$%kbu@5_H7inpsAlA}EBcxp9%hmOQy?$Paf$w*8%n_!5-Uuf^#A)jngp zn2Hzs>5z39fppL`F&%XBh)kG96QKUrI96GZmAMZ-14&^22Qfg-zr91EL|6XM#I>DG zt)r2{kEEiBY-Zm!WKT>Sd`Di))-heN!tf0B=*U2g_x_bMSDp?7&jQ+q8YAanj)dRg z{Z3^Vy90FA1I+>ERxpH*MhyQ*c>*b`wZV#539KahXXDF3e&ScNp&85)-97?R&?}D( z`gVD9|IX`{4)?+ob~Hn5sIL=xmq_=5I_hxo#-?;6(K|pt-Tn0~sbfMV%dgw$f)>n1 zfWJtuLV&IRyGHjLkMI9vHCwiH82%V956q`Ff^c2wJ>^Y-VjJj`0+18 z@^*S42ILWmZK0|lD^=pPE2uJ7?moc(0OnoA;S^Y;@cwUX~b8NCTlHQ3A zyv;U$4LQTQ_C(+?DAvv^thVbJe^dF-Qn}a=|MIf!Q#x0c#32|uPXo2NuD)w7hdTKZ6R8NII_ffd^+ZCXERu zI4*Bkl&rOawOWS4uYJgavGoqs1F&dxMkSFq$sy6`gV0ACbHK8t+F1Dm(Rxyd@QvCu z1BqUvG;TL+WMD`%3ZnbVA&PU)`#%vFJ9)pITUKy=i7Bg1S@cnl_puRFy!0;Eb6ZM8 zkJ#DYMD-AR0Yi1CJJH*%;4caeAV5R|7T(^(3K@~m%AY1Z<&gYvAxvX1D=q#;=gxFq z=IjKe$I>TLutr*~RVHjY>CTx>mIWY`StKhA%$k4ep3pyjFUJlAI~%_f2b%xn2Yl_} znd6Y%lAzci8w5=wvK{)}bSX!aT8*%yd;`Wb;?ejf{Pd>Cg2pXw8APWcwt4W*7tu5v z1k8EN%xU5ExGKB9WMo*r@a_FcXh`aNAPA;FT_A)_RiqXN?Ugy-jPcvXMqiGUGlvZy3$ zDfu!;4K}O89?gNbVZ&wjngqR&%_Up6-5S~0GuA)cOP=Z!e7CCASUxL4f8T-X7Kj4P zg|%avSiuZvJo4eUe%eszUcs z#VD1+Og|o~OsU@4=%^;M(mdgislGX9^qjq%i5`@Vo#?%GAt6>mmBMi1GU#lyrfyUX zM^*(*+|XZ`*$4{v_8Neg*KN?czjXm)W?bDz$kta?n|zzSv9e4_w%B*CFRLE#BkBFQe9`RW;!B%LMEXJFifWibRQWzfDfJhqqV;&tev2c3 zA1A5yggIPi@(yK>Ev+ePkO9r#aW6!dn7>5KwcB5#w zu2k290eK?&uudbSYiO)IBW^U)N=EoESCg~5z=O{+dk+$xNYFB9i)y4)CIKS6NCQUk zXv-^A#28fdQ|%=7@{4;U?nW#xGD`_b)=$yUznx*^?IZPA{>Yb%VU92TD#llC$s$k8 zM{QL;wOJoyG4IExGk!@bgi77?XA+I<-TrHkJ`6j{THv|H&uKWi`tuM7`_eMrK*60t<~H{{obrdY{$E^B{J;P z)@e>m>L+0ZCO8Vk!|}wcDxcvXLvv^EuBo(?3Kxh}HHFA$_n((Pi(um&;j*LoX4IxM zommw}E3b{eZ#Q8%Q=DOxaNhxWM#=~>9$bK3*}8?-18aUJofBIQJ!k)C(B$Cv*HS;} zIzb6slt(uK=f@2CI3et1ZY57`Ju=oOI0mwtAZ@)*F0kYZj8qfKcw}gVeenG(hhkWp z;>>mEp_WE|XJr5!!}1ef?)29THhjiMfFUfJsTPUP6JFwTgu=QAPJ6}nf_ApUPSzjq zXxpK7hdyQ0`ROlIFh+ZhgDoRqTVfoUQx&F*>r~J;fipvc*M+5mkmQd{MyLqEA5r zRMtyW)L~iuk_fP2$4W6RJVOEqv%aO@u?95Ra@kZ4<$Yx@$+Pr+Y#@XQS>iY<7~9Q7w$Y|CJb4*{MBP;Hs}lSo^f6ZJE{L(X|Ejd4vr#0`*}!~ zi&~6N3ZG8~sitYkjuaKU2tu)@N;sA4Pypup}cAZNLLB-JwNH9R%?*(sN{2*Y&L4S8MyD-4@&_Eaimsp=cf zK{mCRDHxi9?3jTh2b&+9I8fv4cXfOj&^q8d%)5f8Dzp-Vy_+&&my-elQ2^E#cP{vs z-F_LO4%{k5LdN4h$BU$0g#8mb-8|&ZZ}cozR&G0|M>r5R@1PSiH+la_tMF)9<4yl@0mZ-#`$=|6M{p*sLn6Pc$UjJ_byVZwcrIha(P+?xmw!)K!zp*n6xCeEsdXVP%?PbSwVY6U!vYT{ESGT+Z+m_ z?LB&W8ox+c&SQjBCvRHuK92)m!&FXlrXtb}=D~l!xq!-->9B`VDxPQImyadZHNG*7m1uP&ZtO?bMG0eiZ*OlI2=%fDNa6ohowh><7 z3hPK4T$tTe*g*gJ(;5-3j5oGNg~&VZ|ERS-LaxKUab{499q|OZY$ZwgRqHSg$&u2a z6`pOanF^%ywvZk+S1#-sM(b?3=b^oioh-dr)G4z47oFj?`{ROuM@!5gU4q;3(4N!8 zw3`^Jc^T%Qr;W5vV{g5jz-vC4G*=+JbPpM+QY98E;y}MNwrxQOf!TfUCN}mPpjZmVTKv|++8F20He#ZtnESZB2w$xc3@j!OUuimywjTu= zZ<~CD=aiE)jkB!-H1#`*qM*UN6ZaB8IlnumBEN}|EYnYZ#bUyUz$f&iAdM>fIqU7~ z_20bsVKV?)o`1CfbKkK!*Nn_DSJIphz!=hJ;Za7{T+S(?LpY_9f9!>IdPHkCcQxzd z%#}`K16AEOwnI}SiS3E~z)W2dV6LQZKa3ELv&z4+*Qf(zMQu?6%}S@Ip%8 zE_;iPPK@1=$(px&rtdl`iJ`$CKaR^(wn;a9BH5+gpaMBtm+r&Wt_X7BUet4Rn_(u&_=Rr+T3qMNf2^w(A_-g;Te-lJN2x2M*(Gs}dWS5@Q*t^L54RKcDBoJTmO`Bs z^W^uUAM9Kdi)iX~E-pO%X8crh)XQ^3rnde#Sv zh%ZwK>o!`S_8?jY5zI&9p<#uMsfL9ZF?SKShY*O)X2RYyd#1!<7JyP#`hG;TZiQTX zrmvoJANEm%t(0b-B3e7^<#f3BF(=&7GeOw8v*)lvFF@7i^lF-km_td!;XWx9S7jty zK2WStCh!=;%;%w0(h3@YW7)nMGm@;tJE=s0I6(?lK%q_sXmPBq*IkhF%Pj}DCdE%cM^Yqc3wge^`YeWGaBWWLf;vzO`NkgPrJ+tu^nm;w)aM0Qx zcJ#9=6&U3s`jIx;!UoYj%-ZEU1GTXxNLpBtHvH@0(gye|qAxgw_lDheur_r}6pAY7 zoMsZO+HB)oOx+2=l+^}?N+XjNM*C(3-3v>5g)D@EO|F8Ejcz%Ye!FcA{QU!z%A^16EMY46`gX*;V zTQGahaVK0Ynbc;#VrDO3Q;$`1nyb;;WHD9tnK&Q0wph0a=FJy5__&LGL0PhBurIXmC}f(v4s%b;lk zvvp`BTE_gb_gwS}{%eYl4tj;bm1VIE{%b}aV)Oxb4n4Uo(}wkFaq=RN9J$165jzT% zEEF)_1gS^8XO>OM5NK5~T`YaTBMm;_gYs5b0v38dw1!7HOiZO!mao|+4p6Ek?@jVF zX@C7gfQv5XajmB)#^)P&KOvBQ$ThRzrCb`+f#9#v{-1*M-2Qzc;e#IXIdyUEDP>8P zko7Rq?9GJo^!)YhJMI=I2yyheBN$|A?1+;QJ{tVa+_7^8JzT;9xj68jZmg!9=d3Jb zVk;T`)Ox5C047GgeBNNYy(O$Sw};YgToGZ-vQ+!wsz2>_BRylu{9WD`Rf>$QA?WOA z2h<#^;=6hqCQ4lf!bOFu8o(lF_#791sWJi*}3`4_(@YN*{>O4e*)#8|$hQ8T5J_>dVsHe`(g zM2p#;idR+qhjzvXd>7b}hKi;E7LW{J@bLwtOF6%&GxLFDMgY@hPZ4mY4j4HkMyV>L zEu))OdOKpG=v2vu_^J~hTtG|kM`R8f-v2b*LM0RuS`M{k6?Mu`g zOJ_UNMnETSNF+0fz$iq!WE}bHCWi)M*flCC$rGKAn7rSLn5ogT+3~e+*V;S8Y=1ue ziwk#{buR@u4@LJ=pWC4kf2o+oB*ODoBTN&t;Lf-hNe1PBX#oW5xIE3Q967|P7I&7% zC{V3NoJ7aV+*0yHIwYLS5)6yjL|%7#@ON5CGvPi|s<#BL0xty2hS6FPnBbcIGzn4N z{a02PdL7^JW`%@G-g*g5-Ol781Lx9xdAVKAE3@#Zz$z^$wNjAQ>v-i?6-|KVU4I?M z-9s1#!9T*ZREM?7jS`GTo|UeMl%E_a3qS|1(cu<{B*O|s8Q&#*bEqR=a~1wrAobvw zlH>G**&~KWB3Rzl%&J-#QRB7k@9*-eVs%5lbwblG{{qK!xP*PUxXrC;uUN6o+cGMI z{vfoOoaB21m12LZ!akstAB`W>>0i&5@4!d`099eUELTYv5ID(a@I0cDK z`$W3{mF|N;)^W!(qJ;-?URJxgrGGox2!n~`59QI6E>Z!A+BZ|#zsQG6@Y%y>PX1Rq zUEPxjzYZV_CsBSmWvJ+uek#+7gc@oqH>VtA5Cbn+BX7M-zyeFzEL#Bmr$mLZt)0K# zwWL$cV#BT9YNfzqv$q|?WktAQO)IkU+`yTH`#9VV0GfTCyHm;tYcZiATZuB*?E%O1 zDQqm~Df!1vTo}*qP~$=T8xm@lN0feA?x5HJnIk{qUl6;f2e$A#9QE9Tq|lTupY>l- zUW_iFV9>ZI`Kfk!O=v_~G6^8MKFgPzrf1RykdqDPlT#??)3#Z|?N!`|3IUEClz98G)f6rI7IN!PJ(%PhYcLAJhWQcf|h0vS%gk zIU8=I4AJ-5;{I>y=2i@8Q2-F2L#pqCD-`|$nVotE$0a`+!Dlz)(E;eWJiXy6HOZ}1 z5W`-Fj(N!a>LgTO8%r~iei^IPDlHogfBMisiJC@TXvi(K8@l~ef+hvW8*4V~Z|8hq z>f&3&F&k5RdiVPv&Q^~APSlZe*`~tn>R~b?xT^ih%O$S$j|ib!sWLhawHuSj5@|w- z@ROr42TPU{Jq&B`rT7Ave)=IiWPm%5D4#PAj)pUTInl%jQA@{}c=a#kWi z0p2|{$*)x^B+dOAop$Y@`Y>y>nTh`y&J^{iZ& zWJ4R`m!UrA(LDb7JBT=17;fxI4xfy5GKWdRL-`V(wY=dAkg zqS(5-b)+|j3qIg8ye8nHoy7XmP_GL~yO83*=(96P+?t{dF1(N27nj%4dlo#Y;wQkJ zMI+;O)5CHkHu#Z$+MtHehJT9LnLQpyggj5<7NjKbBr3ytZFi)TF#4uLl7L@Riv>wg z)3f)fshrxAA&N7?K`S5MRcujP>13 zNJk-`cqT487o6Mm`sfVv8d%P{&9d5bLfH>uC)-^EIia-TB*~4!{S>eiLHt5x6z_a2 zY}GyR(ZeB5j;%2N6n*hL7nUQGnq%{{*&GtoA7Lnpz;7+771A<}-5fv&~85^u1 zyUcuX+&>J>o(1?t9u&zreH1DGouV2ZTvCf65aGBhK7Euc2u4<7=Lt@UgQ%K`_}#e~0tm|+QXKW?ja8ah5nlH&|) z+0*GgI^?={jPCI}lO~3ZTS<$I?-P9*7aWzzn7<25<8J4dI2Cj)#Ke1y=lkhPIbAbz zYy+B0X{Sc92C+a&@#~wm&H`r`JKus6%DG;~sG4xMmW#I-G5>anJc*Ov+@#rJ8PdUr zI`19~VQgJ1P^V=@3}xU_=~n>EF1Q75XRw;}VOGh!+HyM(WCK`~A!SXai2iFYp5iD) z-pa#8`&-z;Tc)5gbeZYJ)=HZR$?+h4jAuM;4v1A`9O#>@1bCNy{ZeuI?im?oHM5B&K~2Yk^l@9?@fvy6V{fd*jz-t{ zjo_|YXpFrc}kuf(y*XcF-;Z1+%2DMjc_YU-;tE?+J3 z@aHHtBMUh9!5Q$-CajJ4AHoz`-JRO0M6#yJSyH1cYuv_Z0DCHAyU~f+BXwR)cS@Z= zcIx{QA%R8#uk=;+h|(jQ&&+4aH#gWFQW-Z?ZO`4cTh~AXIn43D(k*i>33%WVd$>hb z!;#9LeZB?i?mp=2@gfD4vh2L6y2e`QNQah8-3^Q4F)o!Lb6SQMz>&GzNZ_97QVE>s z`&(eZmAx$wx=_ihVRP$yZ>6tp0J{w3$TtTgQCHXCDdG84SUZXR4SSG`gm< zceJ@*66zoslO=nxQqx*h=TQET`MGwUWPaS;P+*jO2XGNo_iPAhH>I>7MCCx|TV+z0 z*(aG{*R~|mSL~X68N|MQ&M8|$5T<1EemQ`#i1Z-~&Y}p3v5MV&X@Rd9j8Klz{#0XP zMF*rd?1i2pbobW&g6ryRwa8%-G{_hY?>Adazp$5k`qUmxI^bg>XrZI)j&oJisO$*6 zbasqN%WngLW=Mr2>~rNjfTI62B=GNi^dFgQCztgI#r|5{<$lIKgK80ovx{qT|2>%K zvIe_P1!S$e7s-WW(?4lj`GG9`ohBZ}o37vymB3vggM#@s9clO4y#iJME~=ew0XJvzS}A7;gOSXeJQPSYpfkd`$% z;J-Ci??J{UBXSaajg#LLcF-ENlg@`Q>x>0bs6iJ;zQ|m$qzelUudwPBXtyeVtP2W& zZ#n6mTZs#2E?r%L(xo{9529w2${VrXvG<5sD)^yd+)zp%%pE1qOn%vYdck~%q%9($ z9A3*hP157LD6zzj{>goS(zm=w{vd|lIDgr(3jw|kGkcx}(2v`T5`IYSZvj(6`6X2( zE&Z6u8Iqu#6Z30Ugp8`x78DNVkD9;!NrDX3;k_w376N**Q>EF%i{hfN0?$X<**)g#{-|EqhspL|MsKb@6#-ysbe@N8@Cyw{g7)_kqFPo?3 zQ%s@}pzf`wA)uHT+c778!QJeKB;0d$t2y~cpF8<5Kx;Vrjq>>XWr$_t?iSxm9#>W$ zHLY6GRTNe{hLth~plV6l&|=0s0%tYE@kHZMH{mip6+*8&7Dyx{{-FqZsD=&YPK2d_-7-Jl#ebQ*=Nl9a>ebT2=Qd6y3*MJJK8&^JKPzHaek2oL)NJA;b8_EX=Q z-S2(CiJs9$2PmY-)B^+BXz8!7i9=C%Nh{1Dpq2`m_ap6uA;plS29wssr*&VzBvJDU z|D703Ct{X7ddov>RENu>UK8!J3COvTW{HemCgF;%uF5F<>{32+kQ)9iD&9a|F8PU@ zLk%hQCurzd#lU=FzYYVZDt}nwqA_Q=erK>_SCE$QXNeGEl=d6H&`#27%+QKa`D{qK zYUJYZ{zK}&cSvlc>mtoGU_;1o#pIsdE}=et?7lSJGaH%cM$)-!rCHLs=ZVl|Gb0$^GA#P3 zHvpqPkq+(DqXyp!Ytvjsck)9ZlU>zLcG&Nk#Y&dZ7H_{bj2k)*C&w1fJ4+jr1FNVt3M&#KHNcO5IJD7D5@Xz5$Y)->QCt(xS zX9og@6EJ~A9xB3hO3i}E3JHbvDck<@R{(V>IAs#dGo$rycBE<11JD))-R$EGbax z+8a~Xg52N4OX`038=HeOTlFR4OPwW&n=Z<9ZrSmLKm_tHUJfWGk_3>9s5*nP_^;&* z%p1xlnvg}yS!J$q-uB1DC55HYm<;a}HgLdm<&~J&#naB)qmT^Q+}Ig}pI?5*6qKmT zySQ>6R`Tc)YPw_6MTQrR*-kRSuCtj~qP{e9qHv77&`s=;eqQZPttOAx*Tvw!DPN6q z)V}cW$6K@yF(fW?E9)x#B-2XBmQ%*jVHS;59Q*Oay4D!l3sDF^LiSOJ9oJ*sW7+#Z zUFXRZYNx z_2r7ID|9svNOz|~3Y#*zOso%>LjLu^`}^y;?Q%)b0hAj^Q>u2h&8J9iQ_Tb{4EL!O#)I@a2G*seuVaL(8?92Z4&ZF(K;<~oLpLg-h zVeGjdm$3RwBIpu2O@{fkTi=NMMEM`6#PQFuZ!T$JVSwVzmtC_$^q;xIy~!hMTq%j# zTPgSK>4K1=>#reVx}6swEs28}bdQ62U+_!D?*2Zxv==*A6N&P0`Y2Eq*mC66MZmeP z5A7(;TZ2w>x|l`PRk<|@X=<(aKX64CZJq)X1>w8gD``b z5s0!|LtGB80<=ymZ8EerS+Y*7_Ay0ZwzdY~-Del-_XvLgF?OfXySSSV;n4!B_IC5UOJ~x zurm)f{e!T+ODR#+qLuSvXE&Ns&r0op7X3*ms=xl?eKe*Ogck*pntrm2L2_LW4mZzg zLWe3>{3x;}1CpD%7+)iCW8B9$&cVEF2klv7pSgPY-6-#{lYW$lzDl-*FiKc;uYgxn z1p;J5QA3n(M4?hWH4>Z_`qF&_ohdytT-wd7ER~o35pO#snK-)`9#&|5$8w4xxwbLJ zxE8RU0|9Koph!S|g~T?=l_~Po9>0vyT+LwKd&R)CSk{jJJ0RN&zqR9g(gE;(b_jQd zjKj*k3LZ5Bes(VggymRgTLOn^m=y|g{NxamN9D=lt5F`JM&i@evC>Bh*z?RlL^=zN zzIe!rg=ztBps|Lsar)k8N9Cg1WC<oS97s!h7jQ+pcpU8 z0|;>NKekgfPHMU6F>RHx`!)C$Y_w5Mpm+rdYO|e-09q4R=D88HH8bf#=xLw!iC4m0 zCLmhuYE*`;m;bvk5J7!?YMTJ>*O6fhtK2n8x&VPHtm`U1|7324Qw9 z;N9(t;p}GcyW8VXFoRZmy)@D2ibO##3`lt&ysc%}5x-}utyJY2hnrVIMlNs_c%(({ z*~POxLPnA@+rD0~H^BE-`*8QmbgIV96waTFZ$Le|Mpb7Xv~V`WTXO4j;107n<}SA4 zZRD``-KsPUj;u^&TONZD@X=-v0$W*1toJNc16`BO6-1HA5$__8Lc^<&!xdsOv57~r z27&5(>aT4YhY^IlIIXCLZ5!#9WU;$r#+jVP%L-ZF^#$=GV(_yac3r|EKhfr!#Aqb` z1DDQo8D$A}vFWIlXh5`xBnR@r>MWx8)2MB{2bO+~QlNN)l5(^-uSh>}`6y>|DPfW` z&&gEs26z^k0D0LZE?)35$=0vxJcu(QNE&~ zEM@E2h)qb|k+d#@WSWj8)!TlnkjUyEbp2x}+lx{s&{K~wt(*#_TA#svnDN4VL3z6} z&+3Kx7DQ&-wJm=OK#u?~CKODCXS}G8hvpDBpz9T(o4~e(rRp2MxrV?PR5~k&H<}>^ zM4IL?qjF-aKLYn0P*B`He!J$J-BuanOC!;`fyD0ybo#X_<(>H z`b?_5qsyV=9^LfhTmY`_7Y#-|KsDNHLI}X&q2$62>X(`4XYTCpxU0ucj?Q)_vu7|1 z_ArwsAmW}Ya7iUdk($S<*z!(q@~7cHfill7GI6cysNJ1_2tOUynV%C}p$9i{%#uW} z$YdtENk+0tqUA1khy9VzK`5Jc9igf?W^vqZbS+aW`WM7N+N@Y;J^NIIhNv>#HFry^ zbjCs;Uw(Ul=&z8220_`5$qBP=0xEocIgwAn6$rx#HCTZRy%7=_^{Md)6>g*eyr9zys+{PfA|O#Wy(h+r6&$+R|! zmVC>Uqvl+X)g}hO&8hRDP6J;&{({vxDQ9wUrjS1qv9Ru_%oUD@^{iQ6 z%6IwSfmp4d3;KsZwZMYQq)J#Ep1$>z=dG7F719}>y0b1Q{o|m_q-kRAfJ^;+6gW$H z*wTUEO|$ow3!QUe;If_jUUEI2{Pe*lgsBQKzS@2q&|QTiZlwo7Y4f2A&lX@Ai+ zsNdEe18bVWlDJ=g=vviqNm!(9{v5ccqJZp|bYc*y9gXa!eB7(uf+fJnYXt=v zqbE5DcaN%+tEtQVQ``5~s!0WFJ@uo*76`T$ikpth%bDb+P76>WI_%f)+Mqr^JAzd> zg=}!B1O7hda<_a23p?U|e;a$BfQ$L>^$#L6WU{PM=?SJoq!MZjb-?RT1@A<}k$0C% zRSG?sfC~w}Lf`v0i4d2&Zli{kpe!0hgfg+*00g%*E~ZhC_Z8vbyH)K>Z1w|aa*+#{ z#l5EK8j{V8WsDOl0+)X88{+`Z&TUoK`Fa)@GIOT1;#q&mi9rCsOxwoIdsDXS9TM#y zy3#@wtBXxX2!k3;Pm>dX8;8*R+QD{ZNj9YH5kna^!`LC&cGQ{l(@?nPnJ<)=$)$A& zF52X|yeCai5pao@_z0;PGQe?QGfZDd)e(dtX=Hc{BX;xmDi~L1 zE=ZKmIdKDf{IZyC^=i+|%@H{Kgkj&JKHR8W-@bcLH7WGCtpJ%ODtdx2_EO2-HYNFL z+Hywt#rJM_Ao2=Y_Hyu>xoN^Ok(uwjG2;5Q^f9QM1G5FK;${kt<_wgYRc2kO=F~+H zNv^182c0fu&qe^TYjbDniZX>hBkIJECCS9jk>I)0A}6+(emOgU5|`A?yF21tGBD7~ zKo&<(Uropzp%<-Y`CE@gW@^kfc74dSRbHf?#<6zqH+)WfiEs~#?sRGLfYGJ|xl~p? zO&mZv6m%Cs^lR-#_Ycw)lr8k89&2uTl)Ve12bZs8Ny7M0pVSjG`0B&dppeMuckqU9 zQ>U8LO?P68#6_OTb~BL;A*r~%%WNp7s2T~a5+6uF;EiP@zRs!5EG2RKd*qn7BA~9~GHw$MV+z8v#lF&v z=a2@8To59VwF!)6K6@CmR-~dBdgVYfQ$EEM`w#c=P&|2>1y|R0uC#w?qu|~W8EfV6 zo{sOi>GWVjA4760daO(QBQXweO$lx<62iGnh<^2%a&H4g5cfiJ=wZMIJ0)~-G+(?` zm^H$u-H+2D*d@iPTb{P^(JpUVoUG1p@=Kx_E~?%P;G)htQwsidL$rr9Qb4qHuIzZt z^6PobJ}2)Y2=l0OVBN|Z(&g98_svk0Ah>7J0y1Y`{JB*z_8WXl>(80n$EH1E^K zh{zFG<*Z?P3Au?9zLa~5FJgBWZZrAJPrJmlA|jvFP>41|??0KiKEd&b*#Pqs3pFTc zKD6tm-i0Q3XeF8(*yUUFdxgnvj^e9JEcwqmQ02Wub?q4(WE{YjD3NQ)yv4)MI_fcMavwNLOz+f|yH;AsJQS|jH{Rc!<}g7!h8cw_Hq(k@U^8K z&OsHC&6h<-L8|)=snd2|-WY;<5y7cItnKWz4pDZ1&k(^fEHu--Af~ZLsqtD&u@3%rp9w35f*YV%xnu zEaYxyoJeaI-T2S??t5z+GS*<0&;`|S1z4xGLzL2PO#qM{9>A5;(p z9?+7El@w`D5heO=>M54prwVEs{W5vXsw8)h<-?SaM?WcH8@`G0lR7kMy%|yqxb?_; zzO>yO))k|sQ{kD6uuqE|;8%->WGE%aYjCegXxCmsJ%dhu!J(4Sa16#XoUZ!0_iL|E^ zDAcUWEd`Sa9<`O_vWw+u@N>7erM^neqWLvG??T z6IW4UJ_WsY_j5Ox*LP3>WM%ANiy(ZIYMuKtK#IMK$(arb;;%Jb3c_XCt!#7@z-pRt zLNoMwBZsL@K0c&^W2ZckaHtF^f={d9r3|`MJNjIA156%XW_D`%0L z0QnG~K&b(r=nB$3r}8#DYK>O`QbSDCD%UmAlf;Y0=mtefyMQ&O1p!>iTR?TO9_QGF z0WB?VHQ;sqke-C;EcsRB`#qU-MD2|RES6n<(vGGs)S^KSTH?}^(o18XP3USKt*y+U zbsyy%9Gq56V~EySZ5hYuBpDzJ*98Qoj+rqylvI}&(<6Q*80H8(BgaRqA{EQiNKr{r z@2&+_#|vK4*bw-~!hFy=F~N7lKSBm0lxPAQuT6-z>O>UwxdNq;I7hX6wis zBB|2w?kA-eU1zqV4pV>>%U;(M17zU#)BT3l9E{f+QOHP5p|MVe73C!_;%qb>4ZQ&c zi+G4-POLAv=C)T6fX$IkR%2kJlmTEBU14#$Ydb^!ylv}tZe`+pKerTg3ZU-JXq?b_ zOmey%!_{Iywi%m71G{v(g$KO;nv?;$UlgyLS@@I_$$4cQ3Yul=XttphnR&b9U%sI~ z3D2r^)j_&yMfyxqKd_u~$!Uy`W&_@=TJ%-{L(=-MmDJExVr+zUbKPbl$P?5;h(!=+ zGYtx)5KCyA{KR-mq2vwc<}-%Fud?5th1lN?jqt>{G zn4LA%y%R5Zj#InOdaGyHQI5+t=vQl;cuKP6?FFLq-6p=n5+44yOM>AI?h9q18UtIqwtH^8G=3mMhd zG~VdnfODx+5290O@OnB|%(tQYoY_863kt>&529@xX>j#=tl8hup!RIXPXE}9?l~9r z`fb9hnkp?|p)j#xt1_?+UcA1)53sM9=e#QV43Q|Ta$MMni(He4Om z-&n%tn%w1(h(y57;s<^@_`59O!<& zXps8P$zhilITt~^5DK0KMR0F(&5%I&WMEc)@Zn*z08&M}HE2I~qel z#W|WMQcpDBGOqVqvxjdL)OG`_2qV}?vPN_1T_CI?BY6z7O|T*>F4Tmd>*BvFZtZ;( zi3!MCFA=HT0Ft@f{lS?y3%&aE?%C4QJiiVL*4;bLmQ?|$Lr-B?WNx&0FrER4#Q`TO zUiMox-tKgDol21tbjg(F4n*AnL~M(QWmEG&v@Zd=lIZ;3+V+z$HFez%lBgAx{nLh{ zX0=5Gz}(&%(8|=^Tv#38uQAK5hEf7xy7+O=wQ}V7tX|=cC^+mjZ4H)834|-`>A#)^ z%m@L0O+xL5+4VhMnrQH0O)+yM%?OTE34+kjc7JQM?B;QWVBda*4V8w%!AeQRGKH#m zWwUeP$K?-w?7cW3R2Op(oJx8hc`2ta+Y_A^d|;ShimdWW7U54UAki{rL82+I-Db;Vqv+c z=6%lB1}mdgrnvA-&?%InPOuxe z!5v=zN~?qS{oJ8pz5kq*D#l8n1}{^)Lm($bm5*#^sxxD1cv#f*ved+81p{!_T1Peb z4&qA`s@Q5THF}Y#enBkMYS{u|&3Zes5$-_72EcAkx!wE>;+h2?h&o*FmsGz~5o_Ee zpguB3NyVDb2cHaoWPWsR5o?;JV~1~SNa-P|##OV>y64r_H&2_dK@4mcoPT6@u~)^9 z;T6g$t-^4R-wtmuf!XrJ2ge)8dKoCVtGE#a_mfV1e~patbq;m`fVFd<+!XO^^rDZl zzKi25bNMM&$;Ic^%Gnd-<0BtciKjjKqe&6{HWmDC4BN1Rp-r3Yl)q8RuHszz{7y(< zd#3te`zyUD8R`NfTp#swE*IzP6e8wNNbb+*4V2l@(PTyM_ zLFe(h5>bl{xFROiJs9w@I=o4KX=Z?;!ZWNWa*?zzlNydr05}R)j6*#`o1L@c6V=!?r;`w_xK_aqo%!-ni7UaOa%;)8f;5 z>diHCILDi+6Fw$PiSxBNyI`dKB|wa29W96a(HOzjSKaBK%@&o)5WI_UfOq=}OP`X9lu31MqsMRwDUTv`!leVPM|l=VOH7I-26- z3P6(;Ec-Hk{WnLDnZA~=x;4tkWFBTD%#O)Dj^^6o+`;ZxP1;6?rESs`$zk4vo{fg) z1|Jf@U7Kp_l;Jr601t;3ce4|Dl}uJiiz|MCi0O5N>hf?Xxq}>cIb4TZ{XilYrFg`o z^q@HYuvhn6JEWSoZ046hdpS{>bm-oFvV;w??KrAT1Ff-gTGXVgNw_Zfg{`3jk`hC*2Ql zWg2xs%)d(>92%Mqbq1IC#w&XcHV;xQ{f|_;nHu`|?3?&j3#@bWp1cA?r>mW`)ncvI zB$o2%yD3kEs70jzIX7#Tmx-_LJ>O*NNV_y6!m7xrJy7!->*L*-2FAU2S@HIkV<71& zt_Ba@L#HNJTJBxZ-{8G;WgK`#o7x2sl>mqr#;)kO^EvB}YGH*8+mus2EJGKZ4Ujb; z+7uFFrH=eRL5SG|Go6N+YN`nNFpeiqa0^QUo>V#{e%~4(Lf|BXlAZA0&o3Accf!~6wuECFtqMq@i2pD?BO9aW|FKOa{i`JNfy3r zbeI+H^rC%`aNX}n+W9^1RtnoUIye^&V^3}FTLwC`zX60G6a9A}u#MKoCy@!5bsOiJEY z3XTOAM#YAs54+T<1!l>FY60%5B;m;JoC;%5h2kQUvtr&rtv4eVxd`d}Nfw^Ir$r`0 zng164<~A};?_^7^j)>fnL!n21zN`{rY#tFBPFNk@fzmnVem5k{g1+E|!H}GtOL3!i zu@mey_4XExcda%<|7c-3TLaR~UP&pJC)|Lx)gA)}1%!FZb{5u6a$@IrjVuYZi_3}R zn@KpLmp952p}C;&RVkx0rCjf^Oua6ghD;DU!f_)8Q+ovjn+4iBL;$*`}l#1iP zJ43GkRol+#$8}%{0&SH)Y*O4UWp@IlVpQGycN54nW*kyD*(53|k7-fKjYSeHEwIr^ zrs{Cm{dPSN&WeZpm1me-3r5o2bcj$lVvKT6B%!uj(+FwqSW^^*lpO! ztl0%h)~%x&&W#^p&?eq{htEfspU=VcII>-e2d|Q$SPzQn3-t(X)(MS&%-DNpECw#S z0(ZVM$MqvU9_6c%L`weI`@Y(@el0qC_j5W>{D{F>la%hg!iH7$*$6Y zPtQF(W$9Vyh?@|_N_<;BckWKdoEO)N0-2X7mmrj*q=Lc&8X3;y|CCxm5UqCiashR< zMIDEK0FMJaL8>L2OB5zQMnLCZ^3g0ZCE1+7i=F@3=>t@6fk-XPxWj&IMr%X+&gUxA zW*OCM74N^T-T6P!5>-culC&UR&>Zmv57J-_#E3QgEKc*zJ1=9&i$hVC6EwogLK84h z>MdIt;{U9fn5Ow^MDSb_=u88eWi9Hx{t>TK+70Q>b)3!=5FeFLq-gnkezwrN4&ne7 z1Uh_P9?r7Pmfi1yuRfDA@OrSr^-e{ir$}%o=>)}5K(-?uYWcUb+0abs1BnY<77*V^ zioj%VeN6;|rAV1b8f^jyU@xmhgcl-57BnFvCYsVatre<{&qr;oQPG3*)nB0jq?%X# zDdtIs55c1P)Z5(O*=>g??X2|dF6hcOZ$WIp=wGM$Po=w>Qd=*B}8urm4GOp;hr`b zwxG*~*v{jyS706w#=7P!HULQ-wxQ*{ZpLCJhSP45wJ;kXRvK5uG4*Z&hK{VM`nL%C zD!grIpmXJ%0oLUp#gsWm!U;b>3$kqay5kD zT$kwlGMM?kNAYyIqF-P(o75-fyW|O>n|+|b4?{g3SGd2-KahMeV9e&*QDB~E&*@CyP?_SiQ*)(&30?6iYXn-dM4>Kd||JvHup=~A!?rdN^uYm2pX*< z^~7pXbWap8p-Rq30flI@C9j@>7zj%|-oi2m5pBzDW@$sC@?o!JB9Ky)7>8ud2aA4= z$8?nYfE?n4O?1e~@PuWA+kVkaPTQ`({IFkg8;@DIlYoP@E3+$@CF|CNs5HtNMwUCq zuT+jXF9@r-A|~FBF}OoX`>!9Ra}@0C0LyuasH+1sviaO%tpY!1NFRAe5;D_}J7#C#7wY$IL(!9hv#_6GW`yn& z(TkICj}qZq6l6u7oq1`)3PIjwTGaZLLHMTzmU=Nwwny8h^qP2T?Uis-I>f*`L&$s< z><|N|A>7#Ck$|4@bt|dy&;I$`gLJg-rCm_bLd;$AtB z;gu(UIH9+tKX%!^j?Zcob?mrMM(M;Bcb7gVm_J@2jyfQz-Ov_a-(j69*+S(er{cH`qNfpZ=5H|jc7z3C{KeJ77SN}k%XQ18TB;k*c(twBkKf=niie$HOi;8{`e$o zOD^QcABai;?{@|FO{(bjT8PHX_}0=5+x*ICLILuW0iM*!;t4)+#fe)FcCRYlhBoVf zVreQXgrs|^gbGJfr^(VDe;3`ykDaN%swj23?<4 zJVpG>`D+D-_mZHYKMqzm5PKJrT$Z~u8zu!(J#o1Vxjd!mKHcUH`FbQHYYfV8>H_xd zYC1Hi_9zl6rO_+?FL%*D*nYIy>CdgpsZ(TT6gAA>cy+vSG zBWWx5kYUd=l8bt@mNQqd^|n`b(JwB?4qCtB)-3CE9rC5_ZCOv;Gp6OvS5y}588~!z z|BnnxM0`_*0DwMyM)1w@QYm`mF8?kAYj7{`bByI4hr;@8ECu8j3NiNsZ| z%jlvqGe;mdw{;8aF430$h(C97r7Rc?%C{-;BAP03H0vPrXO2hXZHL+Ng)eyjX6XX| z?SRGNnXNC7;uo%M9)B~}ug_n=N16wfSKg`u>TOBCaP{Pk43^CKS>` z2M={CO5pEym{Ua1q=^YhV9?eoiCP|aVG+&yYbOwA-ZyZ*M^x{Sm>)8epz$C}O!pTNy9MpI&>a zm8)ThOEo(o3CzsmNS8P=GRBBXl7x7~7Ptb6EVozabe924DOk;EZJ1tm={y;~Xx?Ma zy2*TiFD2OW5S<>~NUqvcG??Z*TA3pON?KNSzBg=YCY#9dQAGrzzCHcS$!iItdoJOX z6kQGg35j(vWyH+B5>5sOXvl|RuLlMs#po}a@oRFx~EMHT)g<>!F?8Iao)M>Fual6G@GeG&tod!$Dt*dL2IPL*>%U;oz(J%>SlNX9q$i4`V%u399r z0k2sYN{!Sde&}Wq3tr{gjb}&Rydz>;X`s}Z-pNTP4uk+A8r$WS{Xoy4R*UD|dyhfB z-dTP^3excY=sxRZs`7`97zVz$3G`4qJ|fE4V-=FYPd4AFLbSpn<>-6|6#%5mDsP94 zlfB+=$=z(BKhCLQ8Ne0m5UJ3E`4(=+mu{wXerq41OA5d2uwLU!IY9jf4kvzTwAiN| z!r&Uc-x~reE}5bi`Ok)j=I7&4rV(2x(HA>0J0aq~!XAuS`j9 z%{+>-H?KbRgl)42nW~1%*!xQRQUBu-t$Kjuo#kKGaFLYn@U)86oImwU4IoCq-~dgx zJX=2qX7{I>{zF@~_!^aqjU+3G`AOi2?<8Z#1;FbLKC_{?|Lgg_ujaW`*6@T8)w43! zb!EZqb@`B(n=Rt*wN+)=qp@n|x#J4KX-UB-j;|gQ{kQSDw0#bAMw0foGq}_nQ1YJ4 z<3<~_)b*6MyXM1uQwyF8I!ynSZpdsb}L$@3-mIlQR1EQIy0dj+=|zUjtMzkZVDMI@?S1~4QDp=7A|x~3)Y?;c?B72&*=6g`2^j?UF=7|9jdT-%s!ts!?Tvj z5U#}V(;U*1ikGktd+rMQfMP{c`1wobgkX)2{$2pcwkC zv_hVA_np&VwF3ebIutl0cAOpRTyvlX|9s#7%9~`**p8kJyx`O!eOgj8er5yyXA($c zb7v1#Et$myWdzHyXr!BtZ=-YKdC!d=B~o?5pr4lE$$r=alJ$}t5_VlEEid$6O;EcI zRB0)Nd4IrY-}Mi?g$vTga960c%IJp|z&nBzhyB$dV0E762E08$6X~&|V zP}mETS{k$G^?Uw5oCsZs)+}mh6z*N}0?Ru>k1aPFx(^t;$3EMI4Pq{FGnOAqS$Sw4 zfp40r@p`r{$r3i{)J49E30MlSQHW$?;FeMCWLu>C=+^S_sk*3RWY2($V(kTu045ER zM{@Z1x1L{v+qYV{R}7p>@%OZLAa0mUxgo+;dFaP*n^vpZz?IxX*#~qgGX&uB!(W`2 zzN1b@cN)qKKp&uR?iYJRi4Wpn$RZxez%l?$s{rExEPgQY=_|nQ(OE&+N#n&>lzvz*x+1KKZ5SO6%Z5`&*d7*M{jOka?w?YfotZC3 zrqB~AwmL-FEckRjn$0_5c|tp$?Unozy%xO7yZ8?!9(!AT$iI zg)P}E~ysmt0>0GRea#HjdgYhfgWwb6ftGav{UPK zM9rHbN#bjNvPP<$pq4`CuA9b2ymy8oH==TWe6${uV&fPso+dmBBV+2?R3C6y? zA2>pRpZu;J@Q${rzz$Do7Y07O8BwTtS;-Mdb>KDQxRwLFy4wwF%QeDPR#cXVMdt`1 zS7C&hKKTNUQs3i+^=-}-at_;_h7Can{GrLX4OCc$@!_OQpQqq0+AemrTO{TBKL)MFEENLX#6VUwV<(s0qua z3i<4$Q*}J7L`l8(MDyRFV z9Hl3A2T4!y?+tP!x3mb$B<04jq|U!+MRnXOH+l5sXd0SLR%RFQGYRcW$jklmY?xq2 zb4YqGC{URkPh6!d2J->eZ+7YEoto`uOu_~ai2r^kU7|if7P!yt64C^sxJl2Mu>gr0 zY3TY&8S8NGghM2onc8s6?m!(W;G`&BNsx?D6%+skj4Kc?!Z$)jd9XX8XJ*Gvt2{F%6Cnej$K_k;5G*DULI~Y$#Q9r39w!z3_$uh$Xw2(x{XLpn9S>Gk zN3P4%2>4{(Ekw=U-EV4 zqj<79+a0wZ+kJSO6hdi_BYMY{(x>xkkdnU- z`4sD{5f9bW@z#;L4zdn0@Z(gc5)scBEqOSf&L(vQYA;DRypB9~6y z$sRKqTzJ=ukuE;b*UvXbqv{O0x~bFMRJ!}8%}JvjU)z;)g05Q1mOXv@R;+=a4hWEuZG=b9s=u!#EYco9oX$&p;c&x&7pLS^kG4%*C zd)$S|_7DI>#g1cJB5AGpFduWvjcZL;8EQ62EVL94VB7U9wIQhy+xm~uJvq@y4K{V- zp9iK?PB33d5i1_NIW=LmJ?1gojV0LA!bUjxhxSfS`{n^)FFQ3Wf>6lq2GM(0Oi!2d zh7BzL^YsW_E7)N{Az`==vA#h3m?KuEFYP9*=b|=WS+zNQZ?;)(Mnp7A#Or+htx%9F z?<(?RC?T5vnk}Mu5fD6b;zpsga1T(nAq6f}N65j8S;&#m76%u#Hh%C4{)xsh0C5W( zI~SGKU#DTQ)7euwd{8Dpk1T;7f5zAo(aUQx-Cw~V-gM!=Kz&xo~D*gPHH5x z0ssfkV^Lg-hD#-DG;uHor9<1r7yCwAF#Xt=N0-t7=oqf(@@vZ4KyH#$hYZnry41d{ z9{-!%Y+V`Se4TvhtxfP~K~#G>d*<8u;ES=spQGx>g>kvd37p54M*KdWI!^MRc~Vbi zG(5S2&hbcdIi)Vrxbz=&1jwc$%fWBmgA{Ftt-ndFaIxEML`C zdggk7i}_)p&#~)2yq7Hz){Yw@g~g+43HyYql}b|C2U%8B7ee+p0G;A{Iouo+xPBB< zB|ea~>0fI+i*h^weBM&pMJ(%f(?iV!iJ>9C{(urw6$|u-wQrXE>b3Yg)cxalR3XQ48N~IuYI)QFHKxKi^ zHHWP>3fBZHbROe}nUZ9_fe+>{Pu}vbcHUGwhXfP!C<*3Wr#0E^v1JX|n}{nOzwO+i zh~v}JcPCM7e3nYU`9$>9G2Pz}b#6{@9OIA^(&BaL*3UF}R+kor87WD(d{i`Qmvb4m z&9+vMwUj0oxfQtp074Biue7r!kLRVJe6(>+p0g@Aw4t*IWAfOEJ@XYJeX$Dv(Hj{D z218;C4IXLJiB4pu*vlFidVyHQ6R6}7)x$P&mgb1mJ;VZu!CIyuO-~Rq$|(S00%0rV z{{~tjN5@V}%;@68gv0OH2Y6}kiX&XH0Ns|*PlV+~0-{^a@aYoc`t?fy^$5^7$&vg= zBs=PaYm-#HZStATkwc|f ze&NgN+!jsyo@94bELLD~36hcC5MEL^f43DMBJ7#KDVj3*2!L$$CT|3?Nvd*&Yb#!# z6&^6W)=ta-w}1r|1vt$-Bhp#S)6rm}rxd>qA;o{(!$LbyP=_D%yA? z0ug(u#;65h_|qE#nd2IIRLPWysU754gtr=)Mid+7MAMFr`Sw=}j1%v9thDtNeJ{EPBy%%5J@#A#8wIcTyvM|XK0yLXFkUUU|I?FOF|UwL5OZZbe;jkF ze;T`fJUCW`*Vgyq*Z}*5N|ib_0z?41Iil8^PWA$?AT2#V+5CS#^AD7OB|oo&|E2mn zUOJ^5LkxM7qEHyEi^SpM=TCywuAEeoUtbMtW(?Wdx*OEyyiP|_4%ZmSrHS!m3}Q0A z>gPFQ^7a6@3E8-vPaM4L52zn;Pyy`mxtkgrH^u`!8{p21>i>;ea~GbzbN)>~bA8Jk z;FVx&@kP-JfNFz13haiUtCeh0|31=DGA%zP(zGAz(U-e^h3t+7TlH3>{O}ny?1t1) zy~@2wB9+fY7135Bthl6<^qb>8yQD5K>shIm5nDJ(SuonO80U%8M#9aO1oHuZBvNU5 zhi_mXe1GjgU#q@~s@;kG){uu^ZU;BrFp5KAV>V?&IMCMT-R)+S#F{Jgop(rwwy9Ucp}g)Ev!Yh@})sE!?|dr=S+dXvAvf&$S`w5soxwn~fy zd274|MG~2zIy>mVelye z|E@l&)e7k0#4SJH1|zDeC$2pgQVOq>d0K35XiI$#W>V%2u5y^V$FV#qbPO)tsL?s6Fbe~~Gg~Wbd~m%$ zP$d2UBep+oYrAa_^_uoJYaNp~t8}&`!E82;*$|Eih24LZK@$^ain02&E10?vtAcb+ zSo}=;vi6qZsFaCV90M1ekkfgow#zM>)}3ZvdWMFc3loqT-u!;Iqy!D0=)BP3UmP}y zmf1a-;v4t=Cxp$9S2gNcUuIE=xRX*k67BNvuBG*N*0hr+2-B@MbN`X^>p5xtoA4_d zos;af;T|miZo9GDSab%7?Jjo&=R2k-7&hh!A64j>Wo9tk8hiH#KA_aJGiWsflDb4P zv1`8}oBpTYpOtbWyo2SX`%U@&7xz~d0}uw%ZD2kKa7wztEgj+)KZl@K^bGHMJJV?b z{rT>GizWBAD%zcAT0Zg?G}b}ybwDUnO&e1`c8Ri(dE)OvGk)eG8}F}AeY*7P0->8W zwX4AQh8(Q3WB`(HTO5z{Y&MQmC@GbC(ljJ(e}L+Wg&T?*nZ7-y_t;DcZ6*-qi~%{_ zPe1k@vi3It!KDVuf2UF~TEL8_7Po0BHn#6zYO282s?UpwI)B0#=V2M+N)3DEhjzb; zugoX$uO7uyMDg}-t!c`{XvNX_z>6{gd57z_e;t#<>ajo(@9wiV5f2XMhgx9(HmyqD# zNZ}H(S|vV8HEH&6sL!EbJ1F60Y55CpHF6Tk{Rgb{N*YZlyUHr_?QO-DVsKIQw*;n3 z2w|G&T&vnM)QRKcNh3xKiv>col1E_;xE&aHNJg2XJ|uZyf&W4tL}B<(R)0rCQpe;rP}pq5 z2&h&hB85a89G?e{SVOAx;6he`JLeo&IT1?cKz@%Ht}A;EKctd`gxow0^5092`I&Xi zZ3%s2GfbC(^-YpJz4r)vh?JZTZ%K5-3-v`9}5^zMg$tlq~xY*YujDSQNu^A5lV^^JZb# zEqb6B({zb9HvEAi|7)&v4}PlAdIHBs7VywaSo9nK zbu}~34px2;Z4h(YtVk>426B%vvt)UCkBnt*z99S%$>+QB-!pQn%3cQ)QGBVi!8%1^ zRwcT;TZOohHX?39rW6!NOU9cANwv;b9G9k)uGmOgLzZ-+>X7yf>Z@S;>3WQfv3FD2 zU$|XRK(Zf1*-tibB}gPoaxzFqp5I6r;rdhLju$QTy5u=a;NURL`Uw;&2xEV9)B7R} z5rY|s+TAg8Yu^B3oHkQ=-@M?y*E#!M)BNyqNdlCmZ<(E++@3;*YlwM)}sS^AfhUVuiSD%mnaTw4>y~L4<8A{NXFod5+df zhquH>Tz^3j0}Z>?Q95T9y84r~J;uZ38~p3u*hf@ci38wsuUKu*=Gq3`xNa0{da@V} zO*9{#2VY6AhBeoz$83~P>?MrRnSK!11o z_{YLRG0Hn;cJaawr=a4}1aWm2&E0(VsE*zDeW$Q%7ns zvk}plIR4WCgdg`PcEe2Z4e91=4!HQG+}slb7miv-wlO(MT8pz_g-$u6Mgrq(%Cp|nSB_7Tv$)Ka!DmlKxb zA38g2B5+R5NsJMWaPlYq%@QJ&Uyqin2J%tu#O?$1}M53k#1`qwYU`{k2Anj`{R8vV5MYl6;;mvYHBSU-qISN`Xx;7PR&y^}9r0Zd+X=du33fM0 zlw>L>s)wTuV8wJ_&DAeDUyLaqb07pPAn83~#`zStdkbNnR#oRFHTUJ(_^aHkxu0~*3ky|kfmO%|;6+|xPY)b%JhB+g=c+7BHr14s3#rC>AFvG1(|mrl)@ ztsi@_R$Bb|K^Tr=WJh`FRC}PIgP%5TJ7_UDRpUvf18aC0WA`o|aPW%wz;JT}o^F9= zeLu2}FeFRwwmC+&b&58hL;YWSuWZ2LW#ef>v?Mj_b-Gb_p08H}=GK)-VjK0S!?Sfz z+0?;BA`>aoBDSz>B7EM~4Gxn8I|6W|+;F>L6QdO&EfRL4RTiWhIu(WoQr`5&^azI2a3Z;$ zwG|>jU!FmLkH9@+I;E=Y;drERWCU$C1*7oE$7yY=*xR`X+m=f7XFCwl7n*YP@L95;La3C0WZ zCLaJXx>NOx^HOD0#K|&ao?XTzQl^Mq&3Sa0n33!2-il*?ws7#d78AymJtPI-*qrT3 zyNTBg#_7M9LM`|EyLoCpuG*V!@YQ~1n6`S0PP=EQvIk7R1hb2Y%Hz|3?t+eg9NKO$ zMjQw!0M;MXN=gz_W8G|g6O=$-iTPw!s+wY66*m{eO(T-XMPGjh9H%6r*Y#4~;M~86spUgRB`+OrvI5jh(b2d(+WaB{oa^0>nTdF2$)c6wtt;t=`^ z9N31b>ZQ8^RW&$V$ebrfzWaI?lTA$HI`!6i`-zhg@TROtoC7Z~9Pe&_Vq5!7D{Hh_!R=Qsmqz^nC3G5 zI(==;VspDF6F{mo`y`+Q@tNY*-yUt)EI3@0@zo$eQ&Dfh6Tq2^p!9`o3q@=Le@OP? zBzc|s#UUIUWH8K3*ZinPMYBc)zq;**8W~?Dw;;uy#I8=Ob)F(O4Y+@WC2_a{{cF|O z<-g3e=-z`&q+JAp)d?lo{Z`-tPWJ=ka`0Rg%g@~}(KIZybJO?HSLlOCT71?!+rwtB zZe%~8@dfNi?#Eux#zAxEM9A+kSOsB5Bm5^o$3eOe?GiFvcHUacjs;DBH|!Gi0_KT# zT1M6U4PtvNY8uApdL(vfzXVL0L0KOsYWCA=+Jpc z^=Ma%VLdnLQFHUP-8K)9N$#$^*JKQRHpqt1fuPi$+Dpr*zl@G?_i3@K;kIBux5Z#V z#_b~UpnJE@i!vjw{qq`GTD199bX4k~)9{Jb*cTmreMrq=TXSW+0j4K=Zg^A2+d|+U z1ToHBZ!fN(yoDuvac*o~gv=?FTt4JmPNpV=(}>T&CQ+t?6q&y1mYp8VAUPG+($G2( z$0;rX=Xub-Ym@JkqG;YT z@14QpXE2RxE#c?SN8HEICjTGdvMUYiWH~h+5`fhXq76)iZ?@fd6`sfW*TN;K-+TuN z0fmXq&Ygd7v&IiysEyK-i98krXfi6mzJ$sKqz>3mkd}Y^_&44s&M)~rL7b4@%8WJ$ ztoT6F6RDNxBj1DKyHMvgUv~ZBpxVFq6=?&C^r5xQa^;kQ3>0uJ4vXcH#=(qzn$$c! zUlt0*bpA$TH9yML1yyQ-YDIiG1jv`$M;1161Df%*ums~HFk>fZY`MkHfL8}S<+PZ% zI)UkrntsgE(-H>Y-qd1;``3UG8DX1k*^kAozgz;+{j4^ckYcwqa2zB@Q=)_4UXsko z&^d@`=nFI>QNR@rg#pXGt22hyD403TBZ>L~h18o6|3?sI3?tEPs-tGv*2~1CSDgMt z|F8~NWZ}lp_4L(m)nOLuiN`jkIPbD@Bk!PYa_Y;=LIZZe+9^+L==suB6{kLcl?~KgxZ(#m^NJYCG>Dd$JTfPq{BKtCnuUcCi$xy6J?? zra_Jdt}C7RNa?MSo@0J6tNRoos<%xkQC1!d1R5lNtYoQb0SApkbU!!YDOsu36Zw~b zKda`Css=oH+mAvNq;dQYls zpUbbLbIjtzdsb!K)3mbIL05ZGC?7eXSYpktab#V>oRgy_4*O}CAR~PT8V0nYp|gxn zh@`~YC(cQ2AUt|f8L=X^yw4m7KUd<|7i)@GfHC$o*1vd5t832&t0Xp zpGW@-qx`NeeX={puuc09Wx?0~ zpMdlN{QCj#4~WSqb|JH8nBN$}`Nv>@x~go#B<-3$uuZKmnRz6j!@(BihRxuf2s<_t z)^tBMw>u^sBaYZDbswl7-^1dV*LeNblqRD;z?ci0I+g4Pl}Ni>G}09k0SV(j&;bRQ zod1wyAwv+aUGVHr*Ps4>v|D*JQhYEjYVpfWPqZQ2R%5Y4?F$!)CR+ZQ<<91Pul$0! zc{v`;$I+{0lJzAUrPNZUys?gpn-)(3B;QO3kk~{aND=~y_h}hofMpKsrUH31$2H?` z8%jWtN+vvlS7{x;?MFA(Q6Kr{%}USD zs=j?CZ#jU2ag3)Fx>~KJPl{@WrX*9iz8CpbVjVOrBU>J?FJj9>n%)K}rB(-hYZ?tG z?2e`;7NgSS4p2Bi!3lH@;`4k)^MwJK?FHbOd;P{|_a7RXeW-q}a3g`Qkyo(vo8C+KvZ88j=#XlJ0rXR(2>+DUdxd8# zd5C;BdQ3#k0rFh@w}JxXx%5j!NS(1Af}rShk#}oJ-(BZb`8}q<+CWvlKNvDhd?*0I zL9K;?dU`VyPKodvm#*2hIEad`eFy++Op^W91C>XfJR|-aJuG*-Wy95jd9=iG<%^jT zM}5D>b-IEgG*eFj!bSOc-&cjrM>^@ir9wifZ0}}RcwzA^@4$rd7+xUV7~BvnG`{_t7P9I!k)4wRm&X-Kb` zV!vjdapTsZ5fWf@3&?jO#fPS)YFLn>2x_z(HWz+OQ-0r&=9NQ#?H8Bg zcbK1so{4(sRYba3Spl>f;a8fZ0=sX7EE~CrP0_BtK0fi@Fj+^Rag75Nesg2zj5T@p zh==jsU~IHziNs-q`GQjJ-0ran$StPN7!5N*(|wK-j;l*E*6nbVm_g1rQLk+P#gmioGu5E^Xm?H{M-?5RmkADEQB@qMbhY*>7RxUFZ#sk{OXpMDHQ2^&^9#P>%WV8J8u@cI1kvn8wOj>3S?Xb?&#A5fP9Hxn z!-=pYhpRzlDVUKjQYwio63($H2WxpDZXal9%UTOh6*JW+8jV)~B>HVkLbYuyUXZP+ zaDr+Nn5BwkhG0A>VMQ-LkncAc&>F@>@3z|Jne>IcM@U z9nLYrF*BWh>iv5gh}hgDE00LTJBihSTM5Sc>-2IWp?yYe0$Lx`?mfegMkMmK?ikHr zH0(4d<;j5Le?*y&Lp8efcUVu|-r@|m>#QWhK0C9{ntQflIutW1TUSSOs?i6D5F+iH zTg9W?HA{sGU5nXEk+n?j)=VY4kWi7p4^3A*)L|G#vN>Q>lz~J#kWnslOfN$DQp8Y| zSydIibR_I?)XTal{^JdD3&Mzr0eP!j3~ zj-WVZb_fWX6x;yFAR){?O9#|CC!Wop#7u|Vo=0y4^{WmctU-5|Yrp|BQi)<5vXn7l!S9|6rD0N2#_A|^41VMr9qrOnLX)AihhCu%@YvPW*E^3h1aw2;0W8> zPKdeuNaE?FHXu1P9xUXqcV2H(o1!f1Lh6TApJ}=oKSTI?fd+BLNdR_HnryA_SoOBq z7*S+1PNl6*+y73&;S7(j#{Y=~(}v4_^3V69mh*@*FJ##O0QtOl;uwg})I4<-SBTHe zF{b7)o1fTzj&V<mSIz z!u_hb%(C{&jm9Vn0NtrhDuG~Q9+bU4lT)S*>H5C3gLJ!%a{W){REstq~o_RyJ& zS)+8=v`TJSo$Sp`0@> z5Ebe&D|XBn?$Tikoh%6@R5Zrfx_{M&e^lZ6F;9NYXNajtuHy97gG@~Wou~#nw#ahFKCt@&7SE(v4CSr+I_rkZhm+4IPz;a+n~HY`jWpD8NN-Q%)|)=e zo*BwvAO6!|+~_=b1mcJ#Lg1WNVyqbJJ|~Ls%ko++8abXuri@=&^M}6!)ykMg?eDzS z)M2YkYEYTMN{GL^!GfjDv$+7R6!x51>4E($2-JF|tbAyqMYa9pN>#f%&2Xmgrbn? zm?gw(px0C~YpAgPmtY(F-b*$&TI~l8eb$m!F`gGSRFO4?(f-%5RFW~Y`kO_mSJ2LS zlHKr4U+|aF3MLn&OC$Rr5R~K4BQ$DpSTT3?Z`*lB1jbJF1ka-YHH)e(JPoMGhbFcj zR1YV1t!Oam=O}>l4w7MuA>kC2C+VR*MwphNIGtowb+Eh}aqOxxPfo?o%35{#x|n!K zmW9Yh&(Q{=A=cUuue8b5>wb99ylx%T8av9Lt!3oAk50fi0!7r9A{yhH+xLFA`Ak)tj^qIUo2#6{TKOWb1#I16;p!(uhXCG>xvovcEYwlGbq|7r3xvMI`EXLDhpw(72@81^TG z5bHM2_0sYTL2z~ot5$oEtJj)rI9d-tSfUO|lY()>}R&ol4QrdrbZ-+5| z3WX{DL1Y|=*>A&3+M7t{pVKshRg;SMzjebGs1lPsP+@{_{{@L0yRZ~dHP&%}X8f{% zjRP3!HfHV*qy~qNt=|~7@BZ!B1x$6JW(1~b*@~iNVVgs?Xc6z&6Q-1kJl`V6uhpWv zsMZ=JYJJVT#fKCoo#%yZVrlD4`v3teCHKc@a4^)*m=;MV&zwZGMh;euI+#7% zR|MueGPaX^5=<5x(!}U+=G{WFtoFLc0*+zvaMWWX45!oV-C)z<-+|M1b&%X=Zni

SeKM-UT)ebmQ%cKmj}C&)TyPn;_gDkclZ&8hanA8F6-%SP*=6 z$84y{=H#=l-4*ijGl;+)G)k(V3kX5?F&pS{@Jc5go$$juSEcUZLD^v2qIO51J}3`r40{2VwA zrK_>~0hMZVVl^}kl~`;!%BIkWCmuH%NQ^IKavpr;Qk&`})e8|mXRF=d)}8gif9^n; z^Sg6rh_9zMBTE@!ifB4*z~kmpsAn0^EiWYS2qxQR=j5|p&nsBhutXz1z6A+tTA!O5Cq#@-y?pVFur zw`JIyeokrfdVjZhAt>zyXmjsm@4p4n;9`MI9+h-1{80LREi2)x6oC1j_; z4c>fB;D4l|&X2b^ z0s3+)rPct}1wx?N@dcDz#>3Lw$tF$?Vg)z7DF#@|!NVgzHgyke2O7mZ zte)Y*@X=ve`nA?}G}m(29yQ?!p4(@sX{NXq<4VFL5eq*qq(x|wyX4u_#`ANFq-Xl= zfzSk!^cBI-X8Df#=7EBE-VwQF-A6#qU{NjNeJ4WnFHx>9Qs>1$ErQvD%3jxebQkL% zx(%F(drjYoV{cAJ#9(Jbd#1lwgnL_qh5ot??XkZPz$*DpEr z5J+`vcCjxw1vSr{7@(*3!N0k>0GB%yHer-f#@DwnT}cm2nxjpc1vsa*7E*_!m~IAswHHOi-89%LD|F5yg5CoWqJSRj40DPSrK$!B4n?Jhxh zrkz@hM%8aez9(<9Wf{7>oqL@tj)JXFee|Sq-*GfGA1PZ#i3LCv>`7Qk6L3DjHD_AH3HH#7iuETscY1NV%t9w7=#;UViyhnn;dCmX=~6X8!@Dz~d}b zhDbn#BPhZ(>sUZjmz~8Wm?4G_LV?+CFF90 zXTG*Ao+W|wI$|gP6dr*>uCaP1b;!lLr^W!HQc7y}aSz5<0*e-5c9u}3f4KyQ4?ZQt z)NoOm41Bpbza?3%<*B;G+=&i~*T1IAq%g5?0-K_!mSAcHmlk?jw@3xwyTJcqxXGE^)zIxY|o%*&$54$d@T46~u$S56eM=&1O z;Q)v4k35+E1=p;b@)IJQ&XZ(3e`X!4ZJ6UB!0X~c2LAPu1dKxqPVYQspvPSETI^A$ zh9X*!4e3*VwJ^&-m_Zq9N?{b9f8D`mKAd978@{!1tXDT1n@ry^Q;~X^8)2v@8n2E} zY%b3va-`iNC}%2IdmA04Av%Euyqo~*GrSx+SS=EB2EfD_ZYcnT(sX)pGe$JXbk;A-AMj%2iEYOcxP)O>t=5jS)kj$T}w+4iE!LNb_pI5@~Cg0 z4N&?H(w@QOLR8o3@B&glbn)S5U4)EuF;5Z4Q71L@sNLcf^=^S1r%dA!HS$AeaG*KM zthXv`=)4jr)qMzc&vL@ogowv7BI0b9X`+AvcT*_@D)}tMb=r=I9J3b)R0mdss)(L_ z6>Q4(2$z(lO>Y@jPA4${yh&zB6!pQdtBU-|7fJdR?zhlpsOQ!mkm0a0rBq~_R~Ue6 zL3o1D#Mo`xaAJ%pP1@>DQf;A0TA!L|`z44?)~G*6EPVvaJds*VD?zDGl=;_M@L<&1 zIl29R{@@Ddp#a&~obl^vEEK!EJLX|oupqUYV=X!B%GDtg_0#`nW%|~V!GRoUSAE>E zhqB@k8TzQC2V07_8wdh`1qM1h+^KMzMv1B3EKe)-9WLIM4Q!%Xq`@R1$d&!UH`RGo zGv?6`PU{S?klNceF8z>}5*M14a}RU2Zcu?!;y_@Kn9_o3sambmkcv8^0SrzZryIKw7s>f@&sIMoWa>ug|JV1bkt$ae#T$T>i*R6<_Bcd&PC`Mo z3@|Dq)&;BX02U23ez0yY^1Y@+qcxp3R^5|Sbf4mVX=(7DG?AdaXT3gu&fQn%voY~V z0E!@!+r2>F#p_E#;V#Gofb__XKOTd*-P$l=2he#@XlizvuRScGKLE490Z}XelKGey z5xGDe6RO#OJ4CNPx4;&(3{eCUWUM>gLnHLuiB^^DKV6mQK-mMJB90tggE3K>6P;wxCne3^lA(in#k z1Q-;`)SRY_pNWRmZ$!GzeylJ`yuixP#=i{#>7sm`=L^P+t+{G21dT;>=mCc*Q-bYN zk8_zi?9XCSosNZCsI3T68+y!B?vvpY8VY7-oYe z7W{_!BTOD+?8N>4UJy^)YSe!J%($Bjmlcu8G$q9%?EsS-tWzRogOgL^BD%Wr34Ezg9%LY#1-EFQH*inwU>Mm6 z*K~4t?EF*06bCfU(gFkBXr{Wwu*wM&0JxHc^~%sOoA^a0{02L5c3&IKQfSnyzG z;xS@jwi7G;NsET_M=}9#);QSI1AF&t=gwbGQ{T(ca`a&FBaVNwFO6LT^XraqALyFT zqG^?2%k$>DpnmDtN^tE3j=Z>DO^2kf_Hc$O$AoE*qqF=;zN|YSdxpU-uXu*eC**Noz?#rS%!bdjI3lAqfluKq|pJ#h!H2RbmyskX}W!Q;TLNA6PWqHeo@lz**NR0)^(bq?zhZ$`0Vsq%+94>?9nsM{z zG1um;nkyjDX_xIiOq1x46H~R5fM$2FJ_Ks_`RyZX*o8w|* zxIe1a#E|&HH=M$Yq;J^c#|UHYy8JD=DC`b}yCA6fjsYpK4g`QE#Sx1tT5*+M1H5oq zfP-d@m1ly(G*rx9!`&XyApsG`IX|__*n!Y!>m|0vp@RTTAzG~^H8%J3>g>ULVQz>* z5ZNmBE9`O~edAPS5kbUTlwkR_Ew?0{WK?i>YBTCUjO79s*-G36lvUcp`Pu?i90uC* zG~(+8K?Ri=yGNGs#VH56Pi`eG^A!nlpRMhU`hdKDJht!AQUU21v;9Te;XBLgKSRpS z3K?t+%173Q`{Kam{0=yAlKUtZgH5v4EV;VgtCAk! z$N1ORQuTq~B&Jl(b(cBp^e~BIx#XjIxG4Kckl0l33RTXpjd#K9Ro*o6q5siV0eb-= z7lEEeDff_Q%-1j?1c~mz-XLE9WY1Jk`En^BHt=nNEa&X{FuQXwtOw6?X4E`YL{$vS zTTZum9Ky?n(yfs_H&sIViTVHg<{riD zWP5Wl0)V|ui&l4FsQBYlxkbI@ltl$b%?Rl zbJI0*zYKN^+Zsg;ej;TNIcz-nE~RE6N)pA{$%OC2v8!uX&h?prIg?p|;wIpPLP{0< zUJUY0P3J@mSsN)Sl}pLN;Gk~N$bR}!eB`Ekb_1suqNdwjzGGv-x7-+%^~rbyy@rhb zx-Od7LsJb8JBD+ubPCu@sS*ze+d<7VCKvzjl!d)s$Y8NoX0a&4@Y|D~moUG44FzDX z<0-eU;)ZykQYR6I(L~u^Ok#Axdek2v5tT)*N}=Nr0?~>Cf{cJK=yez0{>zXmODq({{bD^2i&5=+HY&jqH*?pOxl)Z zYD*QP^@R4vtXWt|P|_!k@68F$pS|UyVH~DoDx{3Qc`Xcm_p%sd{f-$V2wG%hQV^8j z2o25BtR3~2Ee*B_Ud3QmSD}7`3Jd_~I~431n)FPofSkdQ$N`IMWg=|1+}z28Aj0c# zQY}%Yx5zCvONfU^&A^$ugshBz%CRewuZcDB7LVv+VQ_(Xi2xW8TsR+Qutl05R%8s> z1<>mld)V+{oMjcr@h^l zMgZyxt|B*bJMSek_SgWyw~RFkMTB`E;g-xFen$4JXQJBAD8xG zS)%D;jsB1{eYQ{8O%l?7QRHW^B8|$WjUO~&L)Ul3OM8|;>}njamE$O9cyG^l`IhI5 zG`9NLFU%boc$jIqG20XrB3Ix@+RKESU5Rg9`WT4Q$s?YgM3tk2*nhfHr&dM&_(p@ za^{b+QCG&urK!9^XWIo9XnT+v#opMG3e+o4JZ#jV36|F+sqbI+$@f5de|1 zr^+Ld97QJOvfVNkGT@(o^Wxu<6^k?X@;(E3BhRAUwqXBT+Vxpy!~}buNBM#Ri%IL- zja+I*eR4wxTA0x>xJ13>#P~?9Vs@~!8qP+8GDrmuq8J(*hEUX^V%_DZQ4PO4q*4ql@C^@%akCddK=4uBHv^9@mA&ZD8K1F4&2BfNfwe?d+NJ$#;mEgS zb=+Qf_oyCO_MaM->kQ)k`I2K7%u|F?rBGW_AqLUtB!!}V*iQiYj8K&^$mYd9Qnld{ z(aMB!&Ny4{e=|V$CPpFw2}xPujeH0C9}iU6_}J`V=S;K}NfXTchGC})PZitqJ4|NC zw-Thr4AYA!RBaA(s`x>0FuktaG4(}io|6iL)`ei?sa+L-=6L)B6+T$(o*n%UX)fcn zC!dVng9s1|BW=fH?9-->B6PK@C`jn(+eFKI0Ku5MmOudYVH}Y=yTo-lYPqiNFiawD zqa8K`>*j^6MoUw5z7OaN&N0aIV2}CSz~u}u5EEOo_3t1V@GSS3qnz&A-Ny4bx_!J6 zZ+`p4f~H$=BDT}X53D-E*wEQFqB2c`(9lIS2WP^kTD0UTrNV@BBce~?_T85D zZjTSHMZX&*dy9cPJ^LF+3=-uT433K6?VUP+5Pq?mV`1^{CPdh+{DE6ir29qVDn|@I}&09K&jmS z$1TlHHuqNIC4ewS(wwo3@unt%SD$M)-2D2yCRJHPN*UE?m%th(W7t@S1(0~Wlt?EM z|6ICtP$zXgKZy`3_uKhPyjti)cDeCsCnVlCIh1zC-B^#>T2CI3wj^SXG5l38q-(j_ zkw3KrS{L$yr;Mefs!*mvK{#;7a#Sorx`%KK8u2T>jlynIe$Q#ue=Bj|gX>TlXkF!U zqYmCC;S49!T><$>Ap=}n3>RXQ(E5?;8H#Ru-82#NM}>O<6Eti+fVaNCm_xM&_bwUy zsW`(><8*vCPi2PBt=WhhlWmv-uBH~ce>JoT0K=6Er@|H0B;Q*8oM!pQ zp^Mec=5xI=LEE7X-gq!unrEj@U-C&==PNW)$wgT;ra-O4@W-bpbKQz@#>r1o67p_g zK@CQ$)gNq3`E8ToYM*Om`3id6l|TH^1zjl$F>&2n4kjnN%|XQxHM$V_LS|OQk8n@FB8cDmS=oY_bsU(K5lT$ zM5~WOo{G7eSzSqtgEc-bjUh>Uq?3dBHT$w!mYf#pet%9U`fpY!HIueRbMNp9P6UX- zq41YSg-&GYGvLJ%JLNjxX#|GZ6MX^K8kuEI8=t(*YMMA1HT+_BM%6{|r-t{rR(tUL z8Qx7d&M$b;m2uH@>#O;0yN%wghsgiAVP%kQM>{E)b4bYp5_eSrF;=c#g-rP+>@gDjm+yQ&ITneGA zQPW~vxlsLTP^$1>ZH+!-iP4icZ}G}xb$Z}1R`W(^Jq&zaZZpUO{t*FXoTqQ~;!-*9 z=wWWiBddu}Y_^a%l}fx{oVjy|o!az-?Uh~30;r*!Aqi$njxOaH53dRCkzg5T2KYwC zO262yzXoc;doPV)h0XAX<t@M8liWEJn*tMdBYB~x~Tc?{PMzPj5mgb@w=O93PSjYp~@5OSdjs_dd~$v@rP zQ#6es$LrZTYlE$IA5q6g!VXkcct_jx-^C>Wd#LYQ9%X^$l$u8*!Ht(7uhs$6r_q@` zo}gy~+R3KG{8lu2uL98SDJtGJzwIAJt+$IcdQfn<@Z}ycis<3WM^}tBBBp1ygTaSO z%zbFDX^><4j~8`cfTCzZGI^A`s)`@8l;6clu7uo?5DVk>Xzy z2r$}|1D5l*hK?hHIRsxW6DZjHvWdD?N5AiAX>kepKXVf!Bdo=*OL`08_s!gZl8t%2 z>rATk1;=u8+gZp7k6fT1*}|%=V2{X;$2%=sgcpzN1e4lNu5$|AWXv# zqVPI47Bv9QsVFg{69XV!B;-wBPz9OsYU(T6E`}*2#L?U`v2v)~*nO;=ZmC;(P#N%o zkwHU74IH-YUi|}MG$=sYF~ZR%!6m|xrut^4`Zv?u#Nj3&nRCQy;XO`qvR)>bVbetp z?^P;E5D1Z2(*v5uu{M5!28s|Fn zxWl<{zmy-E>&{rciu8~|Wq4GNWx0G?Hr1#2W0}-u6sH~E&_@s%#C$#I2>9qnchJ)$ zsH!-1;lzsSP{+L@vOu2HXu`m{9}AuPrD$ihy_VW7Nd(wOnb% zKzV#VYhNoRm!ym@@J9@|GuOni*Ejexs=5QD#~F<<)=8A3mH`t_wI_3oY!T7~Q`ELc zUC%-fVvi8w$;zvOYOiJD42C!^`OlnLIzHE?yqpbw?>{-4PhFCC_1>p`R7C!&UP)l~ z2l7}>)f!PfY36h+j@sX=e8g~dZs6V7^6wxR#5;+5U`KlBg(UuOBZ73ygtGQLbPQm& zK7p`vV=Wn_@*dl*U`YM~qvGbA_HHSy(USC~8vZ+W@i3(b)Vp|JwriVuR}QlWsz|Y6 z2{VCJZD*n=3jzh`WfID@_FE-IkX%Lw9#>*_z;DRyWLN010(S0R#S^1#r{sNYIJCzG zE2D=z%}y=W0O+8y69}qlLHwH|0EX@F)%VnSr73p|H=j={(1jSHtbxhZ{X zZ6wIZ31%S+>LS}2r1z|QimKJ5;SfvUGVs)B`%7JwTjvy+sAdRyYtZTYapFkD_4FHR zV@2os9AQ~3u^n!Vqf$PDLGo} zb)%`34Ee?*tIaE6g)C~lyAh;N4l7IR&4GPc1fGOj(pvkjLCvUjMw`M#c(~|Nby_!z ziyd*HgFUnYs_WYSPA=NPB_#_Ty$|E*WZ?kTwuWSr+zm46JUMxlUxAQ$4#?XJg3}`} zI`uP$9=``r0(V#th6_4-g<$*nut@}vJAdyU;&&L6MSLk~xE3>!hS=5|?YyY5lHES^ zrCtRbDLdcBIYtW;CVnJdf+*(G8@HriUu*^cGOg>1&KtjFul%Q|B0+0}YZ=YMuD9my zazl)tL#0QFi$q@~joRj>+fXexN#~8M=62dbSjcAllqqRrIzJI&W65lt6j{y%wrdxW1!+r8e&4htsk@js>Se z`@*OSbvXCN(0O%B^<_KZ8c>2W1o5$@oATFMC7Nc1PEJt#1rx9KEsP<*4$J-Kp=40x z|4J+jE&pJrX^9kkBoS*(djfg#_x*c!Z%`=PysQ-9{z-ldX<>t)qg z*(~iSP+Ve*dcY5*;=kh&n~m?9EM=+MTDZmgFW1fyhlYp~2FhEj#2ro~wauS#4@kOc zN-<*4@zM)D3q%$l$3(A%i2@JJM)~RxDA)uv4y>AQY)^1DdHkvITqSL3W@adXfLk; z7U^6(+Bg&<7hU~2@1zR3v|DG(&3+h@cSb6N7Gx^@i#&-;(&k?=fGbN;5-Vs`GSa_v zo`WO=E7{RMJ^a04WD zdc5*DpfY+ybBnxo@I_eO)FC)iBx5DH6~0?MnTT=t2A&x?inOob{KF!pew*1_mur8#FD92JYH8~y#fo^rfKIztb`uB)2PYEu zhSPh9p$FxE!SJRdNLpAbu^n3(M)x(7l#TPgW>N$c)eT^FXEh`Hc|JVI!}~7{aX*;- zy;R;weud_K07P#al{lJ6AAcET*HC4Vgm-CnNmvzd#x72eg!P+Wbs*Hn#~Q1ydR9zk^gRy+_}- z%k|lnzIeC{8DOb;+dJ71(cDmImcmn&o78TA|Yk7KJCi>JJ8L)>f`W$#S`~VQbU0~`bDFT5-@t+LY@`a~%7%@kZ(VOMAI~6{PTRHtnRdkj=~)9>C2o{?Z#T z7-xJHyX;N0%`riqRz?#1hmkX4#$`_~52$v9231FXrsE*L)*VZC2%FL$WLkK(Evbj8 z_tNIQ?i;tUei^42>cR_VaK_!Zc}hb_+mqM_ggqZnfS}ADV8c~ubh3M%+qe>wEHoaz2vC! z;`q^k;Y+EjM<2Y*Cg-psjP?SMJ{5v<$h>;PVwUj_CN9-jsKNZtr%fMjdQ+9rF#o6x zy7a-EzE-I|N?C#I;^VqD@h{Gn*7V^L%&)bNTHZ>_=BPZ0y`t^pW)-n5bdZeaxqat&!^b~PR&2CH6 zl^6j5twf~P=sp2#mZ&m1Bg3lr>WU40z43C1^sRT;^!{FwV&1RH#1PFh8X&tGNou}b zK6XWu-NFF~1q1E2nAK_zMN6moil?+u_gtcTYAw>)Uz{BTzpRXB*!ApL8E5hLE$c_n zr9>KGc^Cbk9QjM1J))Y_ay^_o>Ela9s}%?S^hfCW^anXMqM=20%;yTF|8{#Y7C_(rr@6dG5ktHm!@f1N*;Fb%Wb`dX=S$;RQWx*Gk#RGSP4&fj4e92 zc8Sk;L}A+NiyF7-P-anfDq8*m1NW+->C6>0n<1?jE2p+fS6K=5+M860pm9d%KUqn% zi8iB`Ur7ex*?gkoG=&BDQPiE?8qHKlxYAo8=r*4)>4n&71=)@at>w7njktY2BRZoAmhQ(=m2tm|1bZT z4Xzo2Ci`ZEpgzfe_KwgzKP)}UFK$kHFR@JHCu5!vIhvfhCiH@ny(hyzSVF-2)_kZy zKung-d|%Kxg}*$TI)->Cshxcnj(14~>EY{MTCAT>w~Kqef3u$$C={z}iWRh!an~Lc2W)uIGQ2Wt@t;k6 zHfF$HYt6b^XFG_nc+7NO-i8d97MDYAiMJqtFM8ihpxpQLT5-c8H=eIR*iJOWL3u#_ z*xCKjxhT}oYSLe)qTqV?cdTdubz)MV34Y@FJF(mDc5@;r5o`A-Y^-Iq({he&PCYfb zbVk=J)*q`92wq~)c>%IAjSP6{w%Q^;ok3WY?IF49USI>2=S{Tg#mG_sO>+C!&y!!l zL@jKC3#ltQKQHTq*rkv6qr?b=u;N?Psrt0i&XJ__zVq&O*tP-2^{1lcH0IhvKP%v| z^;fY&VH+_>JK&+^+;9Il6ht+r`iu+01U~pbkTGmo*FAo5Ln@?j9@>{(z?EIE4Z&H$ zl_y%Ae2)U=%6C9m1RhVrpC|?s9VNBL%Q-qA+dig%{rcBW19B^2=y3f~#vF{qqH_^} z{kCu46>MRpoh()vf65>x>IH4QOz2He)99t!ct34%9&lT30Y5b^*JZh2HikWXp^*6F zZMw2T)sHOe)^$BDlZadfjn5UE{s;GJ!gsND<;{TfYGR!dDJ~3r5Wj@0DEwfH3HGE# z`qE-J(cc#3kZb|;pWvaOBh**ndteE}=& z$nOvILWky4V3(J!$4mHD>VYUpUhlUkVW*(H`AvHuJ>E{9e}RDGEidUElbf~ktO*0< z6(KW(Zo0Wf1~r;5i10l4{DZ4~Niy<%{0LCTzWlKa&>BEg_ulLd=XWDI5vv7C-n9Q| zp3RT+%M{3#YG>%ws2GA+JW?<7#F?^ofMY9BDTBUs$i}bRTEVHBv~o z|2HL4riI=#7HBel)@0fp3?K6$VQfh9Sh2$@Y~(_3$>DD8oNAb; zTsqw$mRA;V@32U93ik|?Mtl@baRz^XNfTqtw!b#aIT8?VEI8#EcnG>AJK@L;id|Y0 zOq}JubA4u!TFhI-UMBJk$ok)8P8P*Ny~kv#ggy`RVxurR8z#2+g_l4#bZ{Ju9BlrW zDz=a`x;)I+J8@3k3i2;=drGbOii%h=5nKEHjpPHu&8iIZbFGI+*`L1S`FS&p$#?3v zloRD|&&^u)a$Hv1tnn78m5_PgoX=1!r6=d#po}T1+eo;&c8R@kh8JgpV`&`Zxe#Gc zn7v4|tc`kbu8mR$cAUy8pdhr;exKWyvrsMlHDjFFlmhr_;Eud|?D`;r_2OLe!zZzp zjx?>6a7W7Z&P2k9gh|t}Eohm^*9pq(SFpE`HiL98P}qyo!;4&9s7`*D==U-BLn-CW zxU8{%)pv2$u)K3(DV~0{_HeQlM@EpWG#B!P)(PYd{T`F*+^e7bl5|hXImU4};R}Fj z@g6#oICR8$^l?jt^+y*=pk@HF&Eo%4+hT*34mX7en%D|a9y_|sr;QhRFzV3+cJbpV ziVuD{9B-9Fr4xK#aV2!cmlAUC7q0B`2Sb_Go+%B+3u8&!xZZLbdI)JO^@@y69&XM- zBs?GVO*2zEaTcNHTIhY=i9?Pw(?>1-er)4Oi6rzq`FC_f)z%k^YU$z2l~E<2LYlIG z^1hyrKnIB7OfP?xnseKsdWNjG z9j$CL3J2S|G*ZZCfWyt~(m&&7t)7a&AT_e%FoU|Z27v#u?6%7m#t;VV+mvhGa(^kRU!_l4QwkI=4Mmsal6pYWi8RgeILmzD(}Ik_ zddKiY$zEjeVe@T(63{?5ro#S-hoJdX8cQM&s>9wn_^9Dov7SwFpQCxY3zw~O>de_p zH18<%cjJWn3sVF}_9&83a94m~tR=-7Nq7F*j7KM;X+a?_)zD0+G!n2B@Z;8HSCKg2 zNuRl60eoz4ln(*j10wvmheH57eyUF|XeEWHGng+?&KiyB5i@p`tiv)a7YOoGl3S~u zgQ{#f){eO}86$Q~=N7%dUDwI3P?KTadpyFyo*ZWFO9iiQ&G0~?!m*PnOz|N5w)ugf ztW0=nYRI~)bt1K#@f?&%TgSiy{)Bv;7%KDa!JQ>C)$Klo?fSg ze5tI|cI!4bdzmiM8M^507uZVYBd})lc;s@`=biYY>}ZoYm6>^1av}*&nKw7;aTq!G z3>{)j0w~{B9z7{)KYqO4epjv-OWcad+})EnvLm;O8LY)Kp>o<9Kfpu2DO%v)G^K6J zZKJ#q39O<%7W@f1@UOGeIZLPuM8{aUxP3O>+y{=iXSbIkE|ZqHR!D=5-)_8?q;l=4 zYV*}ypAVu}7zxJ&_`5xtwFF zV!C0Z(arL-oSj(BsgAWjmF@jm2dcn z=1~fp%)1f(9ES-UAkSehpK>w^C9m}Tvs(JMqD7h^kj{6>)g*Am!j}Wqq2`xqx;d+@ zL;{{j3MAfYCZ6&c9x#;P{gZRrhZP6>8N1177{S=-%dQ4>p88%pS*kLTjW)ZF{djvD zrII%FK6PJme`qRw40llbd2mqC6xNvz{3z^0rQ(k^Zdr;qK8%b;tw9CSwB}zFg&r?R zUMSZ3YwS6TfcUf#kp*QKv%E&Q!luN;MVT;*sQ{Bp6=Cd5zPN1*L+1zf{$3OJ!g^np zk-%Z~66(OfvXAH?tc&R%euj!A<}rgqO)6Dy`&V<0pNoO=!nyqt^cxSR%!Nx|LU=B~(J-kUk)pX5hDz}e8iVk4Q(Z|6&p^fn@ z-5ErZ_rfCtF_tFfl{r#j(Y&QRLCZee \ No newline at end of file diff --git a/assets/common/light/framework_pixel.svg b/assets/common/light/framework_pixel.svg new file mode 100644 index 0000000000..4b801d9e46 --- /dev/null +++ b/assets/common/light/framework_pixel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/light/squares_docs_logo.svg b/assets/common/light/squares_docs_logo.svg new file mode 100644 index 0000000000..12c281466b --- /dev/null +++ b/assets/common/light/squares_docs_logo.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/common/light/squares_logo.svg b/assets/common/light/squares_logo.svg new file mode 100644 index 0000000000..eeece61baa --- /dev/null +++ b/assets/common/light/squares_logo.svg @@ -0,0 +1,1135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/common/light/squares_navbar.svg b/assets/common/light/squares_navbar.svg new file mode 100644 index 0000000000..3a3af460e1 --- /dev/null +++ b/assets/common/light/squares_navbar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/light/squares_rectangle.svg b/assets/common/light/squares_rectangle.svg new file mode 100644 index 0000000000..a22500aa05 --- /dev/null +++ b/assets/common/light/squares_rectangle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/light/squares_rectangle_small.svg b/assets/common/light/squares_rectangle_small.svg new file mode 100644 index 0000000000..14e74631c2 --- /dev/null +++ b/assets/common/light/squares_rectangle_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/light/squares_rectangle_xs.svg b/assets/common/light/squares_rectangle_xs.svg new file mode 100644 index 0000000000..a22500aa05 --- /dev/null +++ b/assets/common/light/squares_rectangle_xs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/light/squares_vertical_docs.svg b/assets/common/light/squares_vertical_docs.svg new file mode 100644 index 0000000000..350462df82 --- /dev/null +++ b/assets/common/light/squares_vertical_docs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/accenture_small.svg b/assets/companies/light/accenture_small.svg new file mode 100644 index 0000000000..8981465bda --- /dev/null +++ b/assets/companies/light/accenture_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/apple_small.svg b/assets/companies/light/apple_small.svg new file mode 100644 index 0000000000..168f18ed63 --- /dev/null +++ b/assets/companies/light/apple_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/dell_small.svg b/assets/companies/light/dell_small.svg new file mode 100644 index 0000000000..0725408629 --- /dev/null +++ b/assets/companies/light/dell_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/microsoft_small.svg b/assets/companies/light/microsoft_small.svg new file mode 100644 index 0000000000..39bf0d42b4 --- /dev/null +++ b/assets/companies/light/microsoft_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/nike_small.svg b/assets/companies/light/nike_small.svg new file mode 100644 index 0000000000..a7ceb44033 --- /dev/null +++ b/assets/companies/light/nike_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/components/GradientButton.tsx b/assets/components/GradientButton.tsx new file mode 100644 index 0000000000..01e5a5fde8 --- /dev/null +++ b/assets/components/GradientButton.tsx @@ -0,0 +1,111 @@ +'use client' + +import { cn } from 'clsx-for-tailwind' +import React, { useCallback, useState } from 'react' + +type ButtonVariant = 'primary' | 'destructive' | 'outline' | 'ghost' +type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'icon-xs' | 'icon-sm' | 'icon-md' | 'icon-lg' + +interface GradientButtonProps + extends React.ButtonHTMLAttributes { + children: React.ReactNode + variant?: ButtonVariant + size?: ButtonSize + className?: string + nativeButton?: boolean +} + +const BASE_CLASSES = + 'relative inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:cursor-not-allowed disabled:border disabled:border-secondary-4/80 disabled:bg-secondary-3 disabled:text-secondary-8 [&_svg]:pointer-events-none [&_svg:not([class*="size-"])]:size-4 shrink-0 [&_svg]:shrink-0 cursor-pointer box-border font-[525] overflow-hidden' + +const VARIANT_CLASSES: Record = { + primary: + 'bg-primary-9 text-primary-2 dark:text-primary-contrast hover:bg-primary-10 shadow-[0_0_1px_var(--primary-9,#6E56CF)_inset,0_2px_0_0_rgba(255,255,255,0.22)_inset]', + destructive: 'bg-destructive-9 hover:bg-destructive-10 text-primary-contrast', + outline: + 'shadow-[0_-1px_0_0_rgba(0,0,0,0.08)_inset,0_0_0_1px_rgba(0,0,0,0.08)_inset,0_1px_2px_0_rgba(0,0,0,0.02),0_1px_4px_0_rgba(0,0,0,0.02)] bg-white hover:bg-secondary-2 text-secondary-12', + ghost: 'text-secondary-12 hover:text-primary-10', +} + +const SIZE_CLASSES: Record = { + xs: 'px-1.5 h-7 rounded-lg gap-1.5 text-sm', + sm: 'px-2 h-8 rounded-lg gap-2 text-sm', + md: 'px-2.5 h-9 rounded-[0.625rem] gap-2 text-sm', + lg: 'px-3 h-10 rounded-[0.625rem] gap-2.5 text-base', + 'icon-xs': 'size-7 rounded-lg', + 'icon-sm': 'size-8 rounded-lg', + 'icon-md': 'size-9 rounded-[0.625rem]', + 'icon-lg': 'size-10 rounded-[0.625rem]', +} + +export function GradientButton({ + children, + variant = 'primary', + size = 'md', + className, + nativeButton = true, + ...props +}: GradientButtonProps) { + const [isMouseOver, setIsMouseOver] = useState(false) + const [x, setX] = useState(0) + const [y, setY] = useState(0) + + const handleMouseMove = useCallback< + React.MouseEventHandler + >((e) => { + const button = e.currentTarget + const rect = button.getBoundingClientRect() + setX(e.clientX - rect.left) + setY(e.clientY - rect.top) + }, []) + + const handleMouseEnter = useCallback(() => { + setIsMouseOver(true) + }, []) + + const handleMouseLeave = useCallback(() => { + setIsMouseOver(false) + }, []) + + const Component = nativeButton ? 'button' : 'div' + + return ( + + {variant === 'primary' ? ( + <> + + {children} + + ) : ( + children + )} + + ) +} + +export default GradientButton diff --git a/assets/docs/dark/getting_started.svg b/assets/docs/dark/getting_started.svg new file mode 100644 index 0000000000..073877b0fb --- /dev/null +++ b/assets/docs/dark/getting_started.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/docs/light/getting_started.svg b/assets/docs/light/getting_started.svg new file mode 100644 index 0000000000..073877b0fb --- /dev/null +++ b/assets/docs/light/getting_started.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/logos/dark/docs.svg b/assets/logos/dark/docs.svg new file mode 100644 index 0000000000..89669a4b09 --- /dev/null +++ b/assets/logos/dark/docs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/logos/dark/reflex.svg b/assets/logos/dark/reflex.svg index 8cd6fcd64b..75da2ffc82 100644 --- a/assets/logos/dark/reflex.svg +++ b/assets/logos/dark/reflex.svg @@ -1,6 +1 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/assets/logos/light/docs.svg b/assets/logos/light/docs.svg new file mode 100644 index 0000000000..89669a4b09 --- /dev/null +++ b/assets/logos/light/docs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/logos/light/reflex.svg b/assets/logos/light/reflex.svg index 516019628d..bcde2660b9 100644 --- a/assets/logos/light/reflex.svg +++ b/assets/logos/light/reflex.svg @@ -1,6 +1 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/assets/tailwind-theme.css b/assets/tailwind-theme.css index 7da33a25db..cfe357918f 100644 --- a/assets/tailwind-theme.css +++ b/assets/tailwind-theme.css @@ -1118,31 +1118,26 @@ --text-xs: 0.75rem; --text-xs--line-height: 1rem; - --text-xs--letter-spacing: -0.00375rem; --text-sm: 0.875rem; - --text-sm--line-height: 1.25rem; - --text-sm--letter-spacing: -0.01rem; + --text-sm--line-height: 1.5rem; --text-base: 1rem; - --text-base--line-height: 1.5rem; - --text-base--letter-spacing: -0.015rem; + --text-base--line-height: 1.625rem; + --text-base--letter-spacing: -0.0025rem; --text-lg: 1.125rem; --text-lg--line-height: 1.625rem; - --text-lg--letter-spacing: -0.01625rem; --text-xl: 1.25rem; --text-xl--line-height: 1.75rem; - --text-xl--letter-spacing: -0.028125rem; --text-2xl: 1.5rem; - --text-2xl--line-height: 2rem; - --text-2xl--letter-spacing: -0.0375rem; + --text-2xl--line-height: 2.25rem; + --text-2xl--letter-spacing: -0.0225rem; --text-3xl: 2rem; --text-3xl--line-height: 2.5rem; - --text-3xl--letter-spacing: -0.07rem; --text-4xl: 2.5rem; --text-4xl--line-height: 3rem; - --text-4xl--letter-spacing: -0.125rem; + --text-4xl--letter-spacing: -0.075rem; --text-5xl: 3rem; --text-5xl--line-height: 3.5rem; - --text-5xl--letter-spacing: -0.1575rem; + --text-5xl--letter-spacing: -0.0975rem; --text-6xl: 3.5rem; --text-6xl--line-height: 4rem; --text-6xl--letter-spacing: -0.1925rem; @@ -1175,8 +1170,14 @@ --radius-ui-lg: calc(var(--radius) + 0.25rem); --radius-ui-xl: calc(var(--radius) + 0.375rem); --radius-ui-2xl: calc(var(--radius) + 0.5rem); - - @keyframes accordion-down { + /* Width */ + --layout-max-width: 81rem; + --docs-layout-max-width: 69rem; + + --s: 0 3px 6px 0 rgba(0, 0, 0, 0.03), + 0 1px 0 0 #FFF inset, + 0 1px 0 0 rgba(0, 0, 0, 0.04), + 0 0 0 1px rgba(0, 0, 0, 0.08) @keyframes accordion-down { from { height: 0; } @@ -1734,6 +1735,7 @@ color: var(--c-slate-12) !important; background-color: transparent !important; } + @media (max-width: 768px) { .code-block { padding: 1rem !important; @@ -1755,6 +1757,14 @@ color: var(--c-slate-11); } + .hover-card-shadow:hover { + background: var(0 3px 6px 0 rgba(0, 0, 0, 0.03), + 0 1px 0 0 #FFF inset, + 0 1px 0 0 rgba(0, 0, 0, 0.04), + 0 0 0 1px rgba(0, 0, 0, 0.08), linear-gradient(180deg, var(--secondary-1, #FCFCFD) 0%, var(--white-1, #FFF) 100%)); + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.03), 0 1px 0 0 #FFF inset, 0 1px 0 0 rgba(0, 0, 0, 0.04), 0 0 0 1px rgba(0, 0, 0, 0.08); + } + .tab-style[data-state='active'] { color: var(--c-violet-9); } diff --git a/blog/2024-03-27-structuring-a-large-app.md b/blog/2024-03-27-structuring-a-large-app.md index 1653604fc0..a698e4287d 100644 --- a/blog/2024-03-27-structuring-a-large-app.md +++ b/blog/2024-03-27-structuring-a-large-app.md @@ -362,6 +362,7 @@ example-big-app/ │ │ ├─ footer.py │ │ ├─ menu.py │ │ ├─ navbar.py +│ │ ├─ settings.py │ ├─ pages/ │ │ ├─ __init__.py │ │ ├─ index.py diff --git a/pcweb/components/docpage/navbar/buttons/sidebar.py b/pcweb/components/docpage/navbar/buttons/sidebar.py index f8bf1e59b0..df8029f3ea 100644 --- a/pcweb/components/docpage/navbar/buttons/sidebar.py +++ b/pcweb/components/docpage/navbar/buttons/sidebar.py @@ -1,10 +1,11 @@ import reflex as rx +import reflex_ui as ui from reflex.style import toggle_color_mode from pcweb.components.icons.icons import get_icon +from pcweb.components.marketing_button import button from pcweb.constants import DISCORD_URL, GITHUB_URL, TWITTER_URL from pcweb.pages.blog import blogs -from pcweb.pages.docs import getting_started from pcweb.pages.docs.library import library from pcweb.pages.framework.framework import framework from pcweb.pages.gallery import gallery @@ -76,7 +77,7 @@ def navbar_sidebar_drawer(trigger) -> rx.Component: rx.drawer.portal( rx.drawer.content( rx.box( - drawer_item("Docs", getting_started.introduction.path, "docs"), + drawer_item("Docs", "/docs", "docs"), drawer_item("Templates", gallery.path, "gallery"), drawer_item("Blog", blogs.path, "blog"), drawer_item("Case Studies", "/customers", "customers"), @@ -100,7 +101,7 @@ def navbar_sidebar_drawer(trigger) -> rx.Component: ), class_name="flex flex-col items-center bg-slate-1 w-full h-full", ), - class_name="!bg-transparent w-full h-full !outline-none !top-[47px]", + class_name="!bg-transparent w-full h-full !outline-none !top-[74px]", ) ), direction="bottom", @@ -134,34 +135,33 @@ def docs_sidebar_drawer(sidebar: rx.Component, trigger) -> rx.Component: def navbar_sidebar_button() -> rx.Component: return rx.box( navbar_sidebar_drawer( - rx.el.button( - rx.icon( - "x", - size=24, + button( + ui.icon( + "Menu01Icon", style={ "[data-state=open] &": { - "display": "flex", + "display": "none", }, "[data-state=closed] &": { - "display": "none", + "display": "flex", }, }, - class_name="!text-slate-9 shrink-0", ), - rx.icon( - "menu", - size=24, + ui.icon( + "Cancel01Icon", style={ "[data-state=open] &": { - "display": "none", + "display": "flex", }, "[data-state=closed] &": { - "display": "flex", + "display": "none", }, }, - class_name="!text-slate-9 shrink-0", ), + size="icon-sm", + variant="outline", custom_attrs={"aria-label": "Open sidebar"}, + native_button=False, ), ), class_name="flex justify-center items-center size-8", diff --git a/pcweb/components/docpage/navbar/navbar.py b/pcweb/components/docpage/navbar/navbar.py index de1dd28ddd..6a0b30dd15 100644 --- a/pcweb/components/docpage/navbar/navbar.py +++ b/pcweb/components/docpage/navbar/navbar.py @@ -18,7 +18,7 @@ from pcweb.pages.use_cases.use_cases import use_cases_page from ...link_button import resources_button -from ..sidebar import SidebarState +from ..sidebar.state import SidebarState from .buttons.discord import discord from .buttons.github import github from .buttons.sidebar import navbar_sidebar_button @@ -757,6 +757,7 @@ def new_component_section() -> rx.Component: trigger=ui.button( "Book a Demo", size="sm", + aria_label="Book a Demo", variant="primary", class_name="font-semibold whitespace-nowrap max-xl:hidden", ), diff --git a/pcweb/components/docpage/navbar/typesense.py b/pcweb/components/docpage/navbar/typesense.py index f4b6cae420..a064076d66 100644 --- a/pcweb/components/docpage/navbar/typesense.py +++ b/pcweb/components/docpage/navbar/typesense.py @@ -316,23 +316,20 @@ def keyboard_shortcut_script() -> rx.Component: def search_trigger() -> rx.Component: """Render the search trigger button.""" - return ui.button( - rx.html( - """ - -""" - ), + return rx.el.button( + ui.icon(icon="Search01Icon", class_name="shrink-0"), rx.el.span( "Search", class_name="hidden md:block text-sm font-medium", ), - rx.el.span( - "⌘ K", - class_name="px-2 bg-slate-4 rounded-sm ml-0.5 hidden md:block h-5 font-medium", + rx.html( + """""", + class_name="ml-auto hidden md:block", ), - variant="outline", - size="sm", - class_name="md:w-full text-secondary-11", + class_name="text-secondary-11 h-8 px-2 py-1.5 rounded-lg bg-secondary-1 flex flex-row items-center justify-start gap-2 lg:w-[10rem] w-full hover:bg-secondary-2", + style={ + "box-shadow": "0 -1px 0 0 rgba(0, 0, 0, 0.08) inset, 0 0 0 1px rgba(0, 0, 0, 0.08) inset, 0 1px 2px 0 rgba(0, 0, 0, 0.02), 0 1px 4px 0 rgba(0, 0, 0, 0.02);", + }, id="search-trigger", custom_attrs={"aria-label": "Search documentation"}, ) diff --git a/pcweb/components/hosting_banner.py b/pcweb/components/hosting_banner.py index 47e83185a6..427eb9a5b5 100644 --- a/pcweb/components/hosting_banner.py +++ b/pcweb/components/hosting_banner.py @@ -97,6 +97,7 @@ def hosting_banner() -> rx.Component: "x", size=16, ), + aria_label="Close banner", class_name="cursor-pointer hover:!text-slate-11 transition-color !text-slate-9 z-10 size-8 flex items-center justify-center shrink-0 md:col-start-3 justify-self-end ml-auto", on_click=HostingBannerState.hide_banner, ), diff --git a/pcweb/components/marketing_button.py b/pcweb/components/marketing_button.py new file mode 100644 index 0000000000..54faadbc83 --- /dev/null +++ b/pcweb/components/marketing_button.py @@ -0,0 +1,37 @@ +"""Custom button component.""" + +from typing import Literal + +import reflex as rx +from reflex.vars.base import Var + +LiteralButtonVariant = Literal["primary", "destructive", "outline", "ghost"] +LiteralButtonSize = Literal[ + "xs", "sm", "md", "lg", "icon-xs", "icon-sm", "icon-md", "icon-lg" +] + + +class Button(rx.NoSSRComponent): + """A custom button component.""" + + library = "$/public/components/GradientButton" + + tag = "GradientButton" + + # Button variant. Defaults to "primary". + variant: Var[LiteralButtonVariant] + + # Button size. Defaults to "md". + size: Var[LiteralButtonSize] + + # Whether to use a native button element. Defaults to True. If False, the button will be rendered as a div element. + native_button: Var[bool] = rx.Var.create(True) + + def add_imports(self) -> rx.ImportDict: + """Add imports to the component.""" + return { + "clsx-for-tailwind": "cn", + } + + +button = Button.create diff --git a/pcweb/constants.py b/pcweb/constants.py index 459f9aa1df..06f8299618 100644 --- a/pcweb/constants.py +++ b/pcweb/constants.py @@ -20,6 +20,10 @@ PYNECONE_URL = "https://pynecone.io" REFLEX_CLOUD_URL = os.getenv("REFLEX_CLOUD_URL", "https://cloud.reflex.dev/") REFLEX_BUILD_URL = os.getenv("REFLEX_BUILD_URL", "https://build.reflex.dev/") +JOBS_BOARD_URL = "https://www.ycombinator.com/companies/reflex/jobs" +CHANGELOG_URL = "https://github.com/reflex-dev/reflex/releases" +CONTRIBUTING_URL = "https://github.com/reflex-dev/reflex/blob/main/CONTRIBUTING.md" +DISCUSSIONS_URL = "https://github.com/orgs/reflex-dev/discussions" PIP_URL = "https://pypi.org/project/reflex" GITHUB_URL = "https://github.com/reflex-dev/reflex" diff --git a/pcweb/pages/__init__.py b/pcweb/pages/__init__.py index 7df352554d..15c76d6195 100644 --- a/pcweb/pages/__init__.py +++ b/pcweb/pages/__init__.py @@ -1,5 +1,6 @@ from pcweb.route import Route +from .about import about # noqa: F401 from .blog import blog_routes from .booked import booked as booked from .check_your_email_demo import page_thank_you as page_thank_you @@ -8,6 +9,7 @@ from .databricks.databricks import databricks_page as databricks_page from .demo.book_demo import book_demo as book_demo from .docs import doc_routes +from .docs_landing import docs_landing as docs_landing from .errors import errors as errors from .faq import faq as faq from .framework.framework import framework as framework diff --git a/pcweb/pages/about/__init__.py b/pcweb/pages/about/__init__.py new file mode 100644 index 0000000000..7fa6819fa6 --- /dev/null +++ b/pcweb/pages/about/__init__.py @@ -0,0 +1,44 @@ +import reflex as rx + +from pcweb.meta.meta import create_meta_tags +from pcweb.pages.about.views import ( + cards, + companies, + divider, + hero, + hiring, + news, + square_logo, + team, +) +from pcweb.views.marketing_navbar import marketing_navbar + + +@rx.page( + route="/about", + title="Reflex · About", + meta=create_meta_tags( + title="Reflex · About", + description="About Reflex - The platform to build and scale enterprise apps", + image="/previews/index_preview.webp", + ), +) +def about() -> rx.Component: + return rx.el.div( + marketing_navbar(), + rx.el.main( + rx.el.div( + hero(), + companies(), + square_logo(), + cards(), + divider(), + hiring(), + team(), + news(), + class_name="flex flex-col relative justify-center items-center w-full", + ), + class_name="flex flex-col w-full relative h-full justify-center items-center", + ), + class_name="flex flex-col w-full justify-center items-center relative", + ) diff --git a/pcweb/pages/about/views/__init__.py b/pcweb/pages/about/views/__init__.py new file mode 100644 index 0000000000..d3f3993d18 --- /dev/null +++ b/pcweb/pages/about/views/__init__.py @@ -0,0 +1,19 @@ +from .cards import cards +from .companies import companies +from .divider import divider +from .hero import hero +from .hiring import hiring +from .news import news +from .square_logo import square_logo +from .team import team + +__all__ = [ + "cards", + "companies", + "divider", + "hero", + "hiring", + "news", + "square_logo", + "team", +] diff --git a/pcweb/pages/about/views/cards.py b/pcweb/pages/about/views/cards.py new file mode 100644 index 0000000000..2762d40c97 --- /dev/null +++ b/pcweb/pages/about/views/cards.py @@ -0,0 +1,59 @@ +import reflex as rx +import reflex_ui as ui + + +def squares_rectangle_small() -> rx.Component: + return rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_rectangle_small.svg", + alt="Squares Rectangle Small", + class_name="pointer-events-none", + ) + + +def card(title: str, description: rx.Component, icon: str) -> rx.Component: + return rx.el.div( + rx.el.div( + squares_rectangle_small(), + class_name="absolute top-1 left-4.5", + ), + ui.icon(icon, class_name="text-secondary-12 size-10 mb-8", stroke_width=1), + rx.el.h2(title, class_name="text-secondary-12 text-2xl font-semibold mb-4"), + description, + class_name="flex flex-col rounded-xl shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_12px_24px_0_rgba(0,0,0,0.08),0_1px_1px_0_rgba(0,0,0,0.01),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] lg:px-12 lg:pt-16 lg:pb-12 px-10 pt-14 pb-10 relative isolate backdrop-blur-[6px] bg-white/96", + ) + + +def cards() -> rx.Component: + return rx.el.section( + card( + title="How It Started", + description=rx.el.p( + "Reflex began as a simple idea: ", + rx.el.b( + " building web apps in Python should feel effortless. ", + class_name="font-semibold text-secondary-12", + ), + " What started as an internal experiment quickly grew into a community-driven framework used to ship real products fast.", + class_name="text-secondary-11 text-base font-medium", + ), + icon="Plant04Icon", + ), + card( + title="Core Values", + description=rx.el.p( + rx.el.b( + "Open source is at the core of Reflex. ", + class_name="font-semibold text-secondary-12", + ), + " We build in the open, listen to our community, and believe the best developer tools are shaped by the people who use them. ", + rx.el.b( + "Transparency, collaboration, and craft ", + class_name="font-semibold text-secondary-12", + ), + " come first.", + class_name="text-secondary-11 text-base font-medium", + ), + icon="OpenSourceIcon", + ), + class_name="grid grid-cols-1 lg:grid-cols-2 gap-10 max-w-[69rem] w-full mx-auto lg:pb-36 pb-24 max-lg:px-6", + ) diff --git a/pcweb/pages/about/views/companies.py b/pcweb/pages/about/views/companies.py new file mode 100644 index 0000000000..d4a75a0695 --- /dev/null +++ b/pcweb/pages/about/views/companies.py @@ -0,0 +1,67 @@ +import reflex as rx + +COMPANIES = [ + { + "src": "/about/companies/y_combinator.svg", + "alt": "Y Combinator", + }, + { + "src": "/about/companies/abstract.svg", + "alt": "Abstract", + }, + { + "src": "/about/companies/outset.svg", + "alt": "Outset", + }, + { + "src": "/about/companies/picus.svg", + "alt": "Picus Capital", + }, + { + "src": "/about/companies/box_group.svg", + "alt": "Box Group", + }, + { + "src": "/about/companies/lux.svg", + "alt": "Lux Capital", + }, +] + + +def company_image(src: str, alt: str) -> rx.Component: + return rx.el.div( + rx.image( + src=src, + alt=alt, + loading="lazy", + class_name="pointer-events-none", + ), + class_name="flex justify-center items-center h-12 w-auto", + ) + + +def companies() -> rx.Component: + return rx.el.section( + rx.el.div( + *[company_image(company["src"], company["alt"]) for company in COMPANIES], + class_name="flex flex-row lg:gap-18 max-lg:gap-x-6 max-lg:gap-y-4 flex-wrap justify-center items-center", + ), + rx.el.p( + "Reflex is backed by YC, venture capital firms, and angel investors, including ", + rx.el.br(class_name="max-lg:hidden"), + rx.el.b(" Qasar Younis", class_name="text-secondary-12 font-semibold"), + " (Applied Intuition), ", + rx.el.b(" Jack Altman ", class_name="text-secondary-12 font-semibold"), + " (Lattice), ", + rx.el.b(" Paul Copplestone ", class_name="text-secondary-12 font-semibold"), + " (Supabase), ", + rx.el.b(" Matt Kraning", class_name="text-secondary-12 font-semibold"), + " (Palo ", + rx.el.br(class_name="max-lg:hidden"), + " Alto Networks, ", + rx.el.b(" Alfredo Andere ", class_name="text-secondary-12 font-semibold"), + " (Latch Bio), and others.", + class_name="text-secondary-11 font-medium text-sm max-w-[45.125rem] text-balance text-center leading-6", + ), + class_name="flex flex-col gap-8 max-w-[69rem] mx-auto pt-24 justify-center items-center max-lg:px-6", + ) diff --git a/pcweb/pages/about/views/divider.py b/pcweb/pages/about/views/divider.py new file mode 100644 index 0000000000..34b64e7093 --- /dev/null +++ b/pcweb/pages/about/views/divider.py @@ -0,0 +1,7 @@ +import reflex as rx + + +def divider() -> rx.Component: + return rx.el.hr( + class_name="h-[1px] w-full bg-secondary-4", + ) diff --git a/pcweb/pages/about/views/hero.py b/pcweb/pages/about/views/hero.py new file mode 100644 index 0000000000..7a3ea07ad1 --- /dev/null +++ b/pcweb/pages/about/views/hero.py @@ -0,0 +1,101 @@ +import reflex as rx +import reflex_ui as ui + +from pcweb.components.hosting_banner import HostingBannerState + + +def hero() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.p("About Reflex", class_name="text-sm font-[525] text-primary-10"), + rx.el.h1( + "The Operating System ", + rx.el.br(class_name="max-lg:hidden"), + " for Most Critical ", + rx.el.br(class_name="max-lg:hidden"), + " Enterprise ", + rx.el.br(class_name="max-lg:hidden"), + " Applications ", + class_name="text-secondary-12 lg:text-5xl text-3xl font-[575]", + ), + rx.el.div( + class_name="absolute -bottom-px -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + ), + class_name="flex flex-col gap-6 border-b border-secondary-4 max-lg:pb-10 xl:pr-16 max-lg:text-center relative", + ), + rx.el.div( + rx.el.div( + rx.el.p( + "Right now, the ", + rx.el.b( + "enterprise stack is fragmented and requires multiple tools and roles to ship an app. ", + class_name="font-semibold text-secondary-12", + ), + "Teams face organizational bottlenecks at every turn—waiting on infrastructure, coordinating between specialists, juggling disconnected platforms. ", + rx.el.b( + " This slows everything down ", + class_name="font-semibold text-secondary-12", + ), + " and makes building production apps unnecessarily complex.", + ), + rx.el.p( + rx.el.b( + "Reflex is the operating system on which enterprises build mission-critical applications. ", + class_name="font-semibold text-secondary-12", + ), + "We're the only platform that owns the underlying framework and handles the full lifecycle of your app. Our platform lets teams connect securely with company data, use AI to build standardized apps powered by our open source framework, and deploy with a single click to share with their company.", + ), + rx.el.p( + "We're empowering teams to finish the whole production app themselves, without needing to get multiple roles and tools involved. We do this by building solid reusable abstractions at both the framework and infrastructure level. Reflex replaces the fragmented stack, letting teams build, deploy, and manage their apps in a unified platform.", + ), + rx.el.div( + rx.el.div( + rx.image( + src="/about/alek.avif", + alt="Alek", + custom_attrs={"fetchPriority": "high"}, + class_name="size-8 rounded-full pointer-events-none", + ), + rx.image( + src="/about/nikhil.avif", + alt="Nikhil", + custom_attrs={"fetchPriority": "high"}, + class_name="size-8 rounded-full pointer-events-none", + ), + class_name="flex flex-row items-center -space-x-1", + ), + rx.el.div( + rx.el.p( + "Alek Petuskey & Nikhil Rao", + class_name="text-sm font-semibold text-secondary-12", + ), + rx.el.span( + "Founders", + class_name="text-sm font-[475] text-secondary-11", + ), + class_name="flex flex-col", + ), + class_name="flex flex-row gap-4", + ), + class_name="flex flex-col gap-4 text-base text-secondary-11 font-[475]", + ), + rx.el.div( + class_name="absolute -top-24 -right-px w-px h-24 bg-gradient-to-b from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute -top-24 -left-px w-px h-24 bg-gradient-to-b from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute -bottom-px -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + ), + class_name="flex flex-col gap-8 lg:p-12 p-6 border border-secondary-4 shadow-[0_6px_16px_0_rgba(0,0,0,0.04)_inset] lg:max-w-[34.5rem] w-full relative", + ), + class_name=ui.cn( + "flex lg:flex-row flex-col max-w-(--layout-max-width) mx-auto lg:px-24 px-6 overflow-hidden", + rx.cond( + HostingBannerState.is_banner_visible, + "lg:pt-[14.5rem] pt-[12.5rem]", + "lg:pt-[10.5rem] pt-[7.5rem]", + ), + ), + ) diff --git a/pcweb/pages/about/views/hiring.py b/pcweb/pages/about/views/hiring.py new file mode 100644 index 0000000000..0a8d43bf30 --- /dev/null +++ b/pcweb/pages/about/views/hiring.py @@ -0,0 +1,53 @@ +import reflex as rx + +from pcweb.components.marketing_button import button +from pcweb.constants import JOBS_BOARD_URL + + +def hiring() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.div( + rx.el.p( + "We're Hiring", + class_name="text-sm font-[525] text-primary-10 max-lg:text-center", + ), + rx.el.div( + rx.el.h1( + "Join the team behind the platform trusted by the next generation", + class_name="text-secondary-12 lg:text-4xl text-3xl font-[575]", + ), + rx.el.div( + rx.el.p( + "Reflex is growing and we're looking for people who care deeply about developer experience, clean abstractions, and shipping things that matter.", + class_name="text-base text-secondary-11 font-[475]", + ), + rx.el.a( + button( + "See Open Positions", + variant="primary", + size="lg", + class_name="w-fit", + ), + to=JOBS_BOARD_URL, + target="_blank", + ), + class_name="flex flex-col gap-6 lg:pr-12 pt-2", + ), + class_name="flex lg:flex-row flex-col gap-8 lg:gap-36", + ), + rx.el.div( + class_name="absolute right-0 top-0 w-px h-full bg-gradient-to-b from-transparent to-current text-secondary-4 from-[-20%] to-100%" + ), + class_name="relative flex flex-col gap-6 lg:py-24 py-16", + ), + rx.el.div( + class_name="absolute -bottom-px right-0 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute -bottom-px left-0 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + ), + class_name="flex max-w-(--layout-max-width) mx-auto lg:px-24 px-6 max-lg:text-center relative", + ), + class_name="bg-gradient-to-b from-white-1 to-secondary-1 w-full", + ) diff --git a/pcweb/pages/about/views/news.py b/pcweb/pages/about/views/news.py new file mode 100644 index 0000000000..0372088a3e --- /dev/null +++ b/pcweb/pages/about/views/news.py @@ -0,0 +1,84 @@ +import reflex as rx +import reflex_ui as ui + +from pcweb.components.marketing_button import button +from pcweb.pages.blog import blogs +from pcweb.pages.blog.paths import blog_data + + +def news_item(title: str, date: str, description: str, url: str) -> rx.Component: + return rx.el.div( + rx.el.div( + rx.moment( + rx.Var.create(date).to(str), + format="MMM DD YYYY", + class_name="text-secondary-10 text-xs font-[415] font-mono uppercase", + ), + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_rectangle_xs.svg", + class_name="pointer-events-none", + alt="Squares Rectangle XS", + loading="lazy", + ), + class_name="flex flex-row items-center lg:gap-6 gap-4 mb-6", + ), + rx.el.p( + title, class_name="text-secondary-12 text-2xl leading-9 font-semibold mb-4" + ), + rx.el.p(description, class_name="text-secondary-11 text-sm font-[475] mb-6"), + rx.el.a( + button( + "Read More", + ui.icon( + "ArrowRight01Icon", + ), + variant="ghost", + size="xs", + class_name="font-[525] w-fit text-secondary-12 px-0", + ), + to=f"/blog/{url}", + class_name="mt-auto w-fit", + ), + class_name="flex flex-col relative", + ) + + +def news() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.div( + ui.icon( + "NotificationSquareIcon", + class_name="text-primary-10", + ), + rx.el.h2( + "What's New In Reflex", + class_name="text-primary-10 text-sm font-medium", + ), + class_name="flex flex-row items-center gap-2", + ), + rx.el.a( + button( + "Browse All", + variant="outline", + size="sm", + class_name="w-fit", + ), + to=blogs.path, + ), + class_name="flex flex-row justify-between items-center", + ), + rx.el.div( + *[ + news_item( + blog.metadata["title"], + blog.metadata["date"], + blog.metadata["description"], + path, + ) + for path, blog in list(blog_data.items())[:3] + ], + class_name="grid lg:grid-cols-3 grid-cols-1 gap-12", + ), + class_name="flex flex-col gap-12 w-[69rem] max-w-[calc(100vw-3rem)] mx-auto lg:p-12 p-6 rounded-xl bg-secondary-1 backdrop-blur-[16px] shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_12px_24px_0_rgba(0,0,0,0.08),0_1px_1px_0_rgba(0,0,0,0.01),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] lg:mb-36 mb-24 lg:mt-24 mt-10", + ) diff --git a/pcweb/pages/about/views/square_logo.py b/pcweb/pages/about/views/square_logo.py new file mode 100644 index 0000000000..df1ea3b104 --- /dev/null +++ b/pcweb/pages/about/views/square_logo.py @@ -0,0 +1,12 @@ +import reflex as rx + + +def square_logo() -> rx.Component: + return rx.el.section( + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_logo.svg", + alt="Square Logo", + loading="lazy", + ), + class_name="max-w-(--layout-max-width) w-fullh-auto", + ) diff --git a/pcweb/pages/about/views/team.py b/pcweb/pages/about/views/team.py new file mode 100644 index 0000000000..2ccdb34efc --- /dev/null +++ b/pcweb/pages/about/views/team.py @@ -0,0 +1,34 @@ +import reflex as rx + + +def team() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.image( + src="/about/team_1.avif", + alt="Team 1", + loading="lazy", + class_name="col-span-1 row-span-2 pointer-events-none", + ), + rx.image( + src="/about/team_2.avif", + alt="Team 2", + loading="lazy", + class_name="pointer-events-none", + ), + rx.image( + src="/about/team_3.avif", + alt="Team 3", + loading="lazy", + class_name="pointer-events-none", + ), + class_name="grid lg:grid-cols-2 grid-cols-1 grid-rows-2 gap-2 lg:p-2 lg:border border-secondary-4", + ), + rx.el.div( + class_name="absolute bottom-0 right-0 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute bottom-0 left-0 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + ), + class_name="lg:px-24 px-6 max-w-(--layout-max-width) mx-auto relative", + ) diff --git a/pcweb/pages/booked.py b/pcweb/pages/booked.py index 82c4fc2b1a..dcd5b0a78a 100644 --- a/pcweb/pages/booked.py +++ b/pcweb/pages/booked.py @@ -1,11 +1,11 @@ import reflex as rx import reflex_ui as ui -from pcweb.components.docpage.navbar import navbar from pcweb.meta.meta import create_meta_tags from pcweb.pages.docs import getting_started from pcweb.pages.framework.index_colors import index_colors from pcweb.pages.framework.views.footer_index import footer_index +from pcweb.views.marketing_navbar import marketing_navbar def booked_title(): @@ -34,7 +34,7 @@ def booked_title(): def booked() -> rx.Component: return rx.box( index_colors(), - navbar(), + marketing_navbar(), rx.el.section( booked_title(), rx.box( diff --git a/pcweb/pages/docs_landing/__init__.py b/pcweb/pages/docs_landing/__init__.py new file mode 100644 index 0000000000..81252083bb --- /dev/null +++ b/pcweb/pages/docs_landing/__init__.py @@ -0,0 +1,44 @@ +import reflex as rx + +from pcweb.meta.meta import create_meta_tags +from pcweb.pages.docs_landing.views import ( + ai_builder_section, + divider, + enterprise_section, + framework, + hero, + hosting_section, + other_section, + self_hosting_section, +) +from pcweb.views.docs_navbar import docs_navbar + + +@rx.page( + route="/docs", + title="Reflex · Docs", + meta=create_meta_tags( + title="Reflex · Docs", + description="Docs for Reflex - The platform to build and scale enterprise apps", + image="/previews/index_preview.webp", + ), +) +def docs_landing() -> rx.Component: + return rx.el.div( + docs_navbar(), + rx.el.main( + rx.el.div( + hero(), + divider(), + ai_builder_section(), + framework(), + enterprise_section(), + hosting_section(), + self_hosting_section(), + other_section(), + class_name="flex flex-col relative justify-center items-center w-full", + ), + class_name="flex flex-col w-full relative h-full justify-center items-center", + ), + class_name="flex flex-col w-full justify-center items-center relative", + ) diff --git a/pcweb/pages/docs_landing/views/__init__.py b/pcweb/pages/docs_landing/views/__init__.py new file mode 100644 index 0000000000..df1f5efcbb --- /dev/null +++ b/pcweb/pages/docs_landing/views/__init__.py @@ -0,0 +1,21 @@ +from .ai_builder import ai_builder_section +from .divider import divider +from .enterprise import enterprise_section +from .framework import framework +from .hero import hero +from .hosting import hosting_section +from .link_item import link_item +from .other import other_section +from .self_hosting import self_hosting_section + +__all__ = [ + "ai_builder_section", + "divider", + "enterprise_section", + "framework", + "hero", + "hosting_section", + "link_item", + "other_section", + "self_hosting_section", +] diff --git a/pcweb/pages/docs_landing/views/ai_builder.py b/pcweb/pages/docs_landing/views/ai_builder.py new file mode 100644 index 0000000000..941d62b4ad --- /dev/null +++ b/pcweb/pages/docs_landing/views/ai_builder.py @@ -0,0 +1,125 @@ +import reflex as rx +import reflex_ui as ui + +from pcweb.components.marquee import marquee +from pcweb.constants import INTEGRATIONS_IMAGES_URL +from pcweb.pages.docs import ai_builder as ai_builder_pages +from pcweb.pages.integrations.integration_list import get_integration_path + + +def card( + title: str, description: str, content: str, href: str, enteprise_only: bool = False +) -> rx.Component: + return rx.el.div( + rx.el.span( + "Enterprise-only", + class_name="text-secondary-12 text-xs font-medium bg-secondary-1 px-2.5 h-7 absolute top-0 right-0 border-b border-l rounded-bl-lg border-secondary-4 flex justify-center items-center", + ) + if enteprise_only + else None, + rx.el.div( + rx.el.span(title, class_name="text-secondary-12 text-xl font-[575]"), + rx.el.span(description, class_name="text-secondary-11 text-sm font-[475]"), + class_name="flex flex-col gap-2 p-8", + ), + content, + rx.el.a(to=href, class_name="absolute inset-0"), + style={ + "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 12px 24px 0 rgba(0, 0, 0, 0.08), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 4px 8px 0 rgba(0, 0, 0, 0.03);", + }, + class_name="flex flex-col bg-white/96 backdrop-blur-[16px] rounded-xl relative cursor-pointer hover:bg-secondary-1 transition-colors overflow-hidden", + ) + + +def integration_icon_marquee(integration_name: str) -> rx.Component: + normalized_name = integration_name.lower().replace(" ", "_") + return ui.avatar.root( + ui.avatar.image( + src=rx.color_mode_cond( + f"{INTEGRATIONS_IMAGES_URL}light/{normalized_name}.svg", + f"{INTEGRATIONS_IMAGES_URL}dark/{normalized_name}.svg", + ), + unstyled=True, + class_name="size-full", + ), + ui.avatar.fallback( + integration_name[0], + class_name="text-secondary-12 text-base font-semibold uppercase size-full", + unstyled=True, + ), + unstyled=True, + class_name="size-6.5 flex items-center justify-center mx-3", + ) + + +@rx.memo +def integrations_marquee() -> rx.Component: + integration_names = [ + next(iter(item.values()))["name"] for item in get_integration_path() + ] + return rx.el.div( + marquee( + *[integration_icon_marquee(name) for name in integration_names], + direction="left", + gradient_color="rgba(255, 255, 255, 0.96)", + class_name="h-auto w-full overflow-hidden", + gradient_width=65, + speed=25, + pause_on_hover=False, + ), + marquee( + *[integration_icon_marquee(name) for name in integration_names], + direction="right", + gradient_color="rgba(255, 255, 255, 0.96)", + class_name="h-auto w-full overflow-hidden", + gradient_width=65, + speed=25, + pause_on_hover=False, + ), + class_name="flex flex-col gap-6.5 px-8 max-lg:pb-6", + ) + + +def ai_builder_section() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.div( + rx.el.h2( + "AI Builder", + class_name="text-secondary-12 text-3xl font-[575]", + ), + rx.el.p( + "Learn how to build applications with Reflex AI.", + class_name="text-secondary-11 text-sm font-[475]", + ), + class_name="flex flex-col gap-4", + ), + rx.el.div( + card( + title="Getting Started", + description="A comprehensive guide to working effectively with AI Builder. The key to success is clarity, structure, and iteration.", + content=rx.image( + src=f"/docs/{rx.color_mode_cond('light', 'dark')}/getting_started.svg", + class_name="w-full h-auto pb-8", + ), + href=ai_builder_pages.overview.best_practices.path, + ), + card( + title="Integrations", + description="Easily connect with the tools your team already uses or extend your app with any Python SDK, library, or API.", + content=integrations_marquee(), + href=ai_builder_pages.integrations.overview.path, + ), + card( + title="MCP", + description="The Reflex Model Context Protocol (MCP) provides AI assistants and coding tools with structured access to Reflex documentation and component information.", + content="WIP", + href=ai_builder_pages.integrations.mcp_overview.path, + enteprise_only=True, + ), + class_name="grid grid-cols-1 lg:grid-cols-3 gap-12", + ), + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto", + ), + class_name="bg-gradient-to-b from-white-1 to-secondary-1 w-full lg:pt-24 lg:mb-24 mb-10 max-lg:px-6 max-lg:pt-10", + ) diff --git a/pcweb/pages/docs_landing/views/divider.py b/pcweb/pages/docs_landing/views/divider.py new file mode 100644 index 0000000000..34b64e7093 --- /dev/null +++ b/pcweb/pages/docs_landing/views/divider.py @@ -0,0 +1,7 @@ +import reflex as rx + + +def divider() -> rx.Component: + return rx.el.hr( + class_name="h-[1px] w-full bg-secondary-4", + ) diff --git a/pcweb/pages/docs_landing/views/enterprise.py b/pcweb/pages/docs_landing/views/enterprise.py new file mode 100644 index 0000000000..0b0420bbf1 --- /dev/null +++ b/pcweb/pages/docs_landing/views/enterprise.py @@ -0,0 +1,38 @@ +import reflex as rx + +from pcweb.pages.docs import enterprise as enterprise_page +from pcweb.pages.docs_landing.views.link_item import faded_borders, link_item + + +def enterprise_section() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.h2( + "Enterprise", + class_name="text-secondary-12 text-3xl font-[575]", + ), + rx.el.p( + "Learn how to build enterprise-ready applications with Reflex.", + class_name="text-secondary-11 text-sm font-[475]", + ), + class_name="flex flex-col gap-4", + ), + rx.el.div( + faded_borders(), + link_item( + "MenuSquareIcon", + "Components", + "Explore reusable enterprise-grade Reflex UI components designed for scalability, security, and efficient development in complex business environments.", + enterprise_page.ag_grid.index.path, + ), + link_item( + "SquareLockPasswordIcon", + "Extensible Auth", + "Implement flexible and secure authentication and authorization systems tailored for enterprise requirements, with support for SSO, OAuth, and advanced access controls.", + enterprise_page.overview.path, + has_padding_left=True, + ), + class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-secondary-4 relative", + ), + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-lg:px-6 overflow-hidden", + ) diff --git a/pcweb/pages/docs_landing/views/framework.py b/pcweb/pages/docs_landing/views/framework.py new file mode 100644 index 0000000000..626920258b --- /dev/null +++ b/pcweb/pages/docs_landing/views/framework.py @@ -0,0 +1,183 @@ +import reflex as rx +import reflex_ui as ui + +from pcweb.components.marketing_button import button +from pcweb.pages.docs import authentication, database, getting_started +from pcweb.pages.docs.library import library +from pcweb.pages.library_previews import core_components_dict + + +def docs_item( + icon: str, title: str, description: str, href: str, enterprise_only: bool = False +) -> rx.Component: + return rx.el.div( + rx.el.div( + ui.icon(icon, class_name="size-6", stroke_width=1.5), + rx.el.span( + title, + class_name="text-secondary-12 text-xl font-[575] group-hover:text-primary-10", + ), + rx.el.div( + "Enterprise-only", + class_name="text-secondary-12 text-xs font-medium bg-secondary-1 px-2.5 h-7 border-b border rounded-lg border-secondary-4 flex justify-center items-center ml-1", + ) + if enterprise_only + else None, + ui.icon( + "ArrowRight01Icon", + class_name="size-4 ml-auto group-hover:text-primary-10", + ), + class_name="flex row items-center gap-3 h-8", + ), + rx.el.p(description, class_name="text-secondary-11 text-sm font-[475]"), + rx.el.a(to=href, class_name="absolute inset-0"), + class_name="flex flex-col gap-2 py-8 pr-8 relative group lg:max-w-[21rem] w-full max-lg:text-start", + ) + + +def links_section() -> rx.Component: + return rx.el.div( + docs_item( + "SourceCodeSquareIcon", + "How It Works", + "Learn the basics of how Reflex works behind the scenes and how its architecture enables flexible, advanced usage.", + getting_started.introduction.path, + ), + docs_item( + "ShieldUserIcon", + "Auth", + "Implement secure authentication for your apps using Reflex’s built-in features and extensible architecture.", + authentication.authentication_overview.path, + enterprise_only=True, + ), + docs_item( + "DatabaseIcon", + "Database", + "Manage and interact with your data seamlessly using Reflex’s straightforward models and querying approach.", + database.overview.path, + ), + class_name="flex flex-col border-r border-y border-secondary-4 divide-y divide-secondary-4", + ) + + +def component_link(name: str, href: str) -> rx.Component: + return rx.el.a( + button( + name, + ui.icon("ArrowRight01Icon", class_name="ml-auto"), + variant="ghost", + size="xs", + class_name="font-[525] w-full text-secondary-12 px-0", + ), + to=f"/docs/library/{href.strip('/')}", + class_name="w-full", + ) + + +def components_section() -> rx.Component: + return rx.el.div( + rx.el.div( + rx.el.div( + ui.icon("MenuSquareIcon", class_name="size-6", stroke_width=1.5), + rx.el.span( + "Component Library", + class_name="text-secondary-12 text-xl font-[575] group-hover:text-primary-10", + ), + class_name="flex row items-center gap-3 h-8", + ), + rx.el.p( + "Build your app with our comprehensive collection of UI components and features.", + class_name="text-secondary-11 text-sm font-[475] max-w-[16.5rem]", + ), + rx.el.a( + button( + "Browse All Components", + variant="outline", + native_button=False, + class_name="font-[525] w-fit text-secondary-12", + ), + to=library.path, + class_name="w-fit mt-4", + ), + class_name="flex flex-col gap-2 max-lg:text-start", + ), + rx.el.div( + rx.el.div( + component_link( + "Data Display", core_components_dict["data-display"]["path"] + ), + component_link( + "Disclosure", core_components_dict["disclosure"]["path"] + ), + component_link( + "Dynamic Rendering", + core_components_dict["dynamic_rendering"]["path"], + ), + component_link("Forms", core_components_dict["forms"]["path"]), + component_link("Layout", core_components_dict["layout"]["path"]), + component_link("Media", core_components_dict["media"]["path"]), + class_name="flex flex-col gap-2", + ), + rx.el.div( + component_link("Other", core_components_dict["other"]["path"]), + component_link("Overlays", core_components_dict["overlays"]["path"]), + component_link( + "Tables And Data Grids Rendering", + core_components_dict["tables_and_data_grids"]["path"], + ), + component_link( + "Typography", core_components_dict["typography"]["path"] + ), + class_name="flex flex-col gap-2", + ), + class_name="grid grid-cols-1 lg:grid-cols-2 lg:gap-28 gap-10 mt-auto", + ), + class_name="flex flex-col gap-4 lg:px-8 pt-8 max-lg:pr-8 pb-6 h-auto w-full flex-1 border-r border-secondary-4 border-y", + ) + + +def squares_divider() -> rx.Component: + return rx.el.div( + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_vertical_docs.svg", + alt="Squares Vertical Docs", + loading="lazy", + class_name="pointer-events-none w-auto h-full", + ), + class_name="flex p-4.5 h-auto border-r border-y border-secondary-4 max-lg:hidden", + ) + + +def framework() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.h2( + "Framework", + class_name="text-secondary-12 text-3xl font-[575]", + ), + rx.el.p( + "Learn how to build applications with Reflex Framework.", + class_name="text-secondary-11 text-sm font-[475]", + ), + class_name="flex flex-col gap-4", + ), + rx.el.div( + rx.el.div( + class_name="absolute bottom-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute top-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute bottom-0 -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute right-0 -top-24 h-24 w-px bg-gradient-to-b from-transparent to-current text-secondary-4" + ), + links_section(), + squares_divider(), + components_section(), + class_name="flex flex-col lg:flex-row relative", + ), + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-lg:px-6 overflow-hidden", + ) diff --git a/pcweb/pages/docs_landing/views/hero.py b/pcweb/pages/docs_landing/views/hero.py new file mode 100644 index 0000000000..da2085da95 --- /dev/null +++ b/pcweb/pages/docs_landing/views/hero.py @@ -0,0 +1,62 @@ +import reflex as rx +import reflex_ui as ui + +from pcweb.components.hosting_banner import HostingBannerState +from pcweb.components.marketing_button import button +from pcweb.pages.docs import getting_started + + +def hero() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.p("About Reflex", class_name="text-sm font-[525] text-primary-10"), + rx.el.h1( + "Reflex Documentation", + class_name="text-secondary-12 lg:text-5xl text-3xl font-[575] lg:text-nowrap", + ), + rx.el.p( + "Get up and running with Reflex in minutes. A complete set ", + rx.el.br(class_name="max-lg:hidden"), + " of resources to build, deploy, and scale your application. ", + class_name="text-base text-secondary-11 font-[475]", + ), + rx.el.a( + button( + "Get Started", + ui.icon("ArrowRightIcon"), + variant="primary", + size="md", + native_button=False, + class_name="w-fit", + ), + to=getting_started.introduction.path, + ), + class_name=ui.cn( + "flex flex-col gap-6 max-lg:text-center relative just-start lg:pb-24", + rx.cond( + HostingBannerState.is_banner_visible, + "lg:pt-[14.5rem] pt-[12.5rem]", + "lg:pt-[10.5rem] pt-[7.5rem]", + ), + ), + ), + rx.el.div( + rx.image( + alt="Squares Docs Logo", + custom_attrs={"fetchPriority": "high"}, + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_docs_logo.svg", + class_name="pointer-events-none h-auto w-auto lg:absolute max-lg:hidden", + ), + class_name=ui.cn( + "flex", + rx.cond( + HostingBannerState.is_banner_visible, + "lg:pt-[8.5rem] pt-0", + "lg:pt-[4.5rem] pt-0", + ), + ), + ), + class_name=ui.cn( + "flex lg:flex-row flex-col max-w-(--docs-layout-max-width) mx-auto w-full max-lg:pb-10 max-lg:px-6", + ), + ) diff --git a/pcweb/pages/docs_landing/views/hosting.py b/pcweb/pages/docs_landing/views/hosting.py new file mode 100644 index 0000000000..79a10a44b6 --- /dev/null +++ b/pcweb/pages/docs_landing/views/hosting.py @@ -0,0 +1,51 @@ +import reflex as rx + +from pcweb.pages.docs import hosting as hosting_page +from pcweb.pages.docs_landing.views.link_item import faded_borders, link_item + + +def hosting_section() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.h2( + "Cloud", + class_name="text-secondary-12 text-3xl font-[575]", + ), + rx.el.p( + "Learn how to host your applications with Reflex Hosting.", + class_name="text-secondary-11 text-sm font-[475]", + ), + class_name="flex flex-col gap-4", + ), + rx.el.div( + faded_borders(), + link_item( + "CloudServerIcon", + "How to Host", + "Step-by-step instructions to deploy your Reflex application to the cloud, including configuration and setup guides.", + hosting_page.deploy_quick_start.path, + ), + link_item( + "LockKeyIcon", + "Secret Management", + "How to securely manage sensitive environment variables, API keys, and secrets in Reflex Hosting.", + hosting_page.secrets_environment_vars.path, + has_padding_left=True, + ), + link_item( + "EyeIcon", + "Observability", + "Monitor your application's health, view logs, and gain insights using Reflex Hosting's integrated observability tools.", + hosting_page.logs.path, + ), + link_item( + "CodeIcon", + "Custom Headers and Advanced Options", + "Configure custom HTTP headers, set caching policies, and explore advanced hosting settings for your Reflex app.", + hosting_page.deploy_quick_start.path, + has_padding_left=True, + ), + class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-secondary-4 relative", + ), + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 overflow-hidden", + ) diff --git a/pcweb/pages/docs_landing/views/link_item.py b/pcweb/pages/docs_landing/views/link_item.py new file mode 100644 index 0000000000..4ab4412a36 --- /dev/null +++ b/pcweb/pages/docs_landing/views/link_item.py @@ -0,0 +1,46 @@ +import reflex as rx +import reflex_ui as ui + + +def faded_borders() -> rx.Component: + return rx.fragment( + rx.el.div( + class_name="absolute bottom-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute -top-px -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute bottom-0 -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + ), + rx.el.div( + class_name="absolute right-0 -top-24 h-24 w-px bg-gradient-to-b from-transparent to-current text-secondary-4" + ), + ) + + +def link_item( + icon: str, title: str, description: str, href: str, has_padding_left: bool = False +) -> rx.Component: + return rx.el.div( + rx.el.div( + ui.icon(icon, class_name="size-6 shrink-0", stroke_width=1.5), + rx.el.span( + title, + class_name="text-secondary-12 text-xl font-[575] group-hover:text-primary-10", + ), + ui.icon( + "ArrowRight01Icon", + class_name="size-4 ml-auto group-hover:text-primary-10 shrink-0", + ), + class_name="flex flex-row gap-3 items-center max-lg:text-start", + ), + rx.el.span( + description, class_name="text-secondary-11 text-sm font-[475] text-start" + ), + rx.el.a(to=href, class_name="absolute inset-0"), + class_name=ui.cn( + "flex flex-col gap-2 pr-8 py-8 group border-r border-b border-secondary-4 relative max-lg:p-6", + "lg:pl-8 pl-6" if has_padding_left else "", + ), + ) diff --git a/pcweb/pages/docs_landing/views/other.py b/pcweb/pages/docs_landing/views/other.py new file mode 100644 index 0000000000..921683b47a --- /dev/null +++ b/pcweb/pages/docs_landing/views/other.py @@ -0,0 +1,39 @@ +import reflex as rx + +from pcweb.constants import CONTRIBUTING_URL +from pcweb.pages.docs.custom_components import custom_components +from pcweb.pages.docs_landing.views.link_item import faded_borders, link_item + + +def other_section() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.h2( + "Other", + class_name="text-secondary-12 text-3xl font-[575]", + ), + rx.el.p( + "Learn about other features and tools that Reflex offers.", + class_name="text-secondary-11 text-sm font-[475]", + ), + class_name="flex flex-col gap-4", + ), + rx.el.div( + link_item( + "GitCommitIcon", + "Contributing", + "Learn how to contribute code, report issues, and help improve Reflex. Find guidelines and resources to get started with open-source development.", + CONTRIBUTING_URL, + ), + link_item( + "ReactIcon", + "Extending with React Components", + "See how to create and integrate your own React components into Reflex apps, allowing you to customize and extend your project’s capabilities.", + custom_components.path, + has_padding_left=True, + ), + faded_borders(), + class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-secondary-4 relative", + ), + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-lg:px-6 overflow-hidden", + ) diff --git a/pcweb/pages/docs_landing/views/self_hosting.py b/pcweb/pages/docs_landing/views/self_hosting.py new file mode 100644 index 0000000000..fa126af65c --- /dev/null +++ b/pcweb/pages/docs_landing/views/self_hosting.py @@ -0,0 +1,38 @@ +import reflex as rx + +from pcweb.pages.docs import hosting as hosting_page +from pcweb.pages.docs_landing.views.link_item import faded_borders, link_item + + +def self_hosting_section() -> rx.Component: + return rx.el.section( + rx.el.div( + rx.el.h2( + "Self-Hosting", + class_name="text-secondary-12 text-3xl font-[575]", + ), + rx.el.p( + "Learn how to self-host your applications with Reflex.", + class_name="text-secondary-11 text-sm font-[475]", + ), + class_name="flex flex-col gap-4", + ), + rx.el.div( + faded_borders(), + link_item( + "ServerStack01Icon", + "Run Reflex App in Dockerized Environment", + "Build and deploy Reflex apps in Docker containers.", + hosting_page.self_hosting.path, + ), + link_item( + "BrowserIcon", + "Deploy to Databricks and Snowflake", + "Integrate and deploy Reflex apps to Databricks or Snowflake.", + hosting_page.databricks.path, + has_padding_left=True, + ), + class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-secondary-4 relative", + ), + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-lg:px-6 overflow-hidden max-lg:pt-10", + ) diff --git a/pcweb/pages/landing/views/social_marquee.py b/pcweb/pages/landing/views/social_marquee.py index 4747491e9e..3188bca968 100644 --- a/pcweb/pages/landing/views/social_marquee.py +++ b/pcweb/pages/landing/views/social_marquee.py @@ -143,5 +143,5 @@ def social_marquee() -> rx.Component: *[social_card(social) for social in SOCIALS_2], direction="right", ), - class_name="flex flex-col mx-auto w-full max-w-[64.19rem] lg:border-x justify-center items-center relative overflow-hidden border-slate-3 border-b", + class_name="flex flex-col mx-auto w-full max-w-[64.19rem] lg:border-x justify-center items-center relative overflow-hidden border-slate-3 border-b [&>div]:overflow-y-hidden", ) diff --git a/pcweb/pages/pricing/pricing.py b/pcweb/pages/pricing/pricing.py index cbb55c5ce3..660cf2fa58 100644 --- a/pcweb/pages/pricing/pricing.py +++ b/pcweb/pages/pricing/pricing.py @@ -18,11 +18,11 @@ ) def pricing() -> rx.Component: """Get the Pricing landing page.""" - from pcweb.components.docpage.navbar import navbar + from pcweb.views.marketing_navbar import marketing_navbar return rx.box( index_colors(), - navbar(), + marketing_navbar(), rx.el.main( rx.box( plan_cards(), diff --git a/pcweb/pages/to_be_booked.py b/pcweb/pages/to_be_booked.py index be4c28ae1a..eb4982f87f 100644 --- a/pcweb/pages/to_be_booked.py +++ b/pcweb/pages/to_be_booked.py @@ -1,11 +1,11 @@ import reflex as rx import reflex_ui as ui -from pcweb.components.docpage.navbar import navbar from pcweb.meta.meta import create_meta_tags from pcweb.pages.docs import getting_started from pcweb.pages.framework.index_colors import index_colors from pcweb.pages.framework.views.footer_index import footer_index +from pcweb.views.marketing_navbar import marketing_navbar def to_be_booked_title(): @@ -34,7 +34,7 @@ def to_be_booked_title(): def to_be_booked() -> rx.Component: return rx.box( index_colors(), - navbar(), + marketing_navbar(), rx.el.section( to_be_booked_title(), rx.box( diff --git a/pcweb/pcweb.py b/pcweb/pcweb.py index c2bedfcadb..950d2fd065 100644 --- a/pcweb/pcweb.py +++ b/pcweb/pcweb.py @@ -99,7 +99,6 @@ ("/docs/ai-builder", "/docs/ai-builder/overview/best-practices"), ("/docs/ai-builder/overview", "/docs/ai-builder/overview/best-practices"), ("/framework", "/open-source"), - ("/docs", "/docs/getting-started/introduction"), ("/docs/getting-started", "/docs/getting-started/introduction"), ("/docs/state", "/docs/state/overview"), ("/docs/styling", "/docs/styling/overview"), diff --git a/pcweb/templates/docpage/docpage.py b/pcweb/templates/docpage/docpage.py index 849d22a598..5a9ebcade3 100644 --- a/pcweb/templates/docpage/docpage.py +++ b/pcweb/templates/docpage/docpage.py @@ -432,11 +432,11 @@ def breadcrumb(path: str, nav_sidebar: rx.Component): class_name="p-[0.563rem] lg:hidden flex", ), class_name=ui.cn( - "relative z-10 flex flex-row justify-between items-center gap-4 lg:gap-0 border-slate-4 bg-slate-1 mt-[110px] mb-6 lg:mb-8 p-[0.5rem_1rem_0.5rem_1rem] lg:p-0 border-b lg:border-none w-full", + "relative z-10 flex flex-row justify-between items-center gap-4 lg:gap-0 border-slate-4 bg-slate-1 mt-[135px] mb-6 lg:mb-8 p-[0.5rem_1rem_0.5rem_1rem] lg:p-0 border-b lg:border-none w-full", rx.cond( HostingBannerState.is_banner_visible, "lg:mt-[175px]", - "lg:mt-[119px] mt-[51px]", + "lg:mt-[145px] mt-[77px]", ), ), ) @@ -549,10 +549,10 @@ def wrapper(*args, **kwargs) -> rx.Component: Returns: The page with the template applied. """ - from pcweb.components.docpage.navbar import navbar from pcweb.components.docpage.sidebar import get_prev_next from pcweb.components.docpage.sidebar import sidebar as sb from pcweb.components.hosting_banner import HostingBannerState + from pcweb.views.docs_navbar import docs_navbar sidebar = sb(url=path, width="300px") @@ -624,9 +624,8 @@ def wrapper(*args, **kwargs) -> rx.Component: toc, comp = comp show_right_sidebar = right_sidebar and len(toc) >= 2 - return rx.box( - navbar(), + docs_navbar(), rx.el.main( rx.box( sidebar, diff --git a/pcweb/templates/gallery_app_page.py b/pcweb/templates/gallery_app_page.py index 4c5837fa29..551397f6c8 100644 --- a/pcweb/templates/gallery_app_page.py +++ b/pcweb/templates/gallery_app_page.py @@ -58,15 +58,15 @@ def wrapper(*children, **props) -> rx.Component: The component with the template applied. """ # Import here to avoid circular imports. - from pcweb.components.docpage.navbar import navbar from pcweb.pages.framework.views.footer_index import footer_index from pcweb.views.bottom_section.bottom_section import bottom_section + from pcweb.views.marketing_navbar import marketing_navbar # Wrap the component in the template. return rx.box( rx.box( index_colors(), - navbar(), + marketing_navbar(), rx.el.main( contents(*children, **props), class_name="w-full z-[1] relative flex flex-col mx-auto lg:border-x border-slate-3 pt-24 lg:pt-48", diff --git a/pcweb/templates/highlightpage.py b/pcweb/templates/highlightpage.py index a2c5a1fb16..f0ffcaca58 100644 --- a/pcweb/templates/highlightpage.py +++ b/pcweb/templates/highlightpage.py @@ -55,16 +55,16 @@ def wrapper(*children, **props) -> rx.Component: The component with the template applied. """ # Import here to avoid circular imports. - from pcweb.components.docpage.navbar import navbar from pcweb.pages.customers.views.footer import footer_customer from pcweb.pages.framework.index_colors import index_colors from pcweb.views.bottom_section.bottom_section import bottom_section + from pcweb.views.marketing_navbar import marketing_navbar # Wrap the component in the template. return rx.box( rx.box( index_colors(), - navbar(), + marketing_navbar(), rx.el.main( contents(*children, **props), rx.box(class_name="flex-grow"), diff --git a/pcweb/templates/mainpage.py b/pcweb/templates/mainpage.py index 605bd2b3e8..ca078419f4 100644 --- a/pcweb/templates/mainpage.py +++ b/pcweb/templates/mainpage.py @@ -57,22 +57,22 @@ def wrapper(*children, **props) -> rx.Component: The component with the template applied. """ # Import here to avoid circular imports. - from pcweb.components.docpage.navbar import navbar from pcweb.components.hosting_banner import HostingBannerState from pcweb.pages.framework.index_colors import index_colors from pcweb.pages.framework.views.footer_index import footer_index from pcweb.pages.framework.views.get_started import get_started + from pcweb.views.marketing_navbar import marketing_navbar # Wrap the component in the template. return rx.box( index_colors(), - navbar(), + marketing_navbar(), rx.el.main( contents(*children, **props), get_started(), ), footer_index(), - class_name="flex flex-col w-full max-w-[94.5rem] justify-center items-center mx-auto px-4 lg:px-5 relative overflow-hidden", + class_name="flex flex-col w-full max-w-[94.5rem] justify-center mx-auto px-4 lg:px-5 relative overflow-hidden", padding_top=rx.cond( HostingBannerState.is_banner_visible, "56px", diff --git a/pcweb/templates/storypage.py b/pcweb/templates/storypage.py index 4aee936199..431a5caf68 100644 --- a/pcweb/templates/storypage.py +++ b/pcweb/templates/storypage.py @@ -252,15 +252,15 @@ def wrapper(*children, **props) -> rx.Component: The component with the template applied. """ # Import here to avoid circular imports. - from pcweb.components.docpage.navbar import navbar from pcweb.pages.customers.views.footer import footer_customer from pcweb.views.bottom_section.bottom_section import bottom_section + from pcweb.views.marketing_navbar import marketing_navbar # Wrap the component in the template. return rx.box( rx.box( index_colors(), - navbar(), + marketing_navbar(), company_card(company, founded, investors, domain), rx.el.main( hero(company, description, stats), diff --git a/pcweb/templates/webpage.py b/pcweb/templates/webpage.py index 507f85c58e..bc6fcd713b 100644 --- a/pcweb/templates/webpage.py +++ b/pcweb/templates/webpage.py @@ -58,15 +58,15 @@ def wrapper(*children, **props) -> rx.Component: The component with the template applied. """ # Import here to avoid circular imports. - from pcweb.components.docpage.navbar import navbar from pcweb.components.icons.patterns import default_patterns from pcweb.views.bottom_section.bottom_section import bottom_section from pcweb.views.footer import footer + from pcweb.views.marketing_navbar import marketing_navbar # Wrap the component in the template. return rx.box( *default_patterns(), - navbar(), + marketing_navbar(), rx.el.main( contents(*children, **props), rx.box(class_name="flex-grow"), diff --git a/pcweb/views/docs_navbar.py b/pcweb/views/docs_navbar.py new file mode 100644 index 0000000000..f5ac35dae8 --- /dev/null +++ b/pcweb/views/docs_navbar.py @@ -0,0 +1,157 @@ +import reflex as rx +import reflex_ui as ui +from reflex_ui.blocks.demo_form import demo_form_dialog + +from pcweb.components.docpage.navbar.buttons.sidebar import navbar_sidebar_button +from pcweb.components.docpage.navbar.search import search_bar +from pcweb.components.marketing_button import button +from pcweb.pages.docs import ai_builder, enterprise, getting_started, hosting + + +def logo() -> rx.Component: + return rx.el.a( + rx.el.div( + rx.image( + src="/logos/light/reflex.svg", + alt="Reflex Logo", + class_name="shrink-0 block dark:hidden", + ), + rx.image( + src="/logos/dark/reflex.svg", + alt="Reflex Logo", + class_name="shrink-0 hidden dark:block", + ), + ), + rx.el.div( + rx.image( + src="/logos/light/docs.svg", + alt="Docs Logo", + class_name="shrink-0 block dark:hidden", + ), + rx.image( + src="/logos/dark/docs.svg", + alt="Docs Logo", + class_name="shrink-0 hidden dark:block", + ), + ), + to="/", + class_name="flex flex-row gap-2.5 items-center shrink-0 mr-10", + ) + + +def menu_item(text: str, href: str, active_str: str = "") -> rx.Component: + router_path = rx.State.router.page.path + active_cn = "shadow-[inset_0_-1px_0_0_var(--primary-10)] [&_button]:text-primary-10 [&_div]:text-primary-10" + + # For paths starting with "/" (like Start), use exact match + # For "framework", it's the default - active when in /docs but not matching other sections + # For other segments (like "ai-builder"), use contains + if active_str.startswith("/"): + active = router_path == active_str + elif active_str == "framework": + # Framework is active when in /docs but not in other specific sections + is_docs = router_path.contains("/docs") + is_ai_builder = router_path.contains("ai-builder") + is_enterprise = router_path.contains("enterprise") + is_hosting = router_path.contains("hosting") + is_start = router_path == "/docs" + active = is_docs & ~is_ai_builder & ~is_enterprise & ~is_hosting & ~is_start + else: + active = router_path.contains(active_str) + + return ui.navigation_menu.item( + rx.el.a( + button( + text, + size="sm", + variant="ghost", + native_button=False, + ), + to=href, + ), + class_name=ui.cn( + "xl:flex hidden h-full items-center justify-center", + rx.cond(active, active_cn, ""), + ), + custom_attrs={"role": "menuitem"}, + ) + + +def navigation_menu() -> rx.Component: + return ui.navigation_menu.root( + ui.navigation_menu.list( + menu_item("Start", "/docs", "/docs"), + menu_item( + "AI Builder", ai_builder.overview.best_practices.path, "ai-builder" + ), + menu_item("Framework", getting_started.introduction.path, "framework"), + menu_item("Enterprise Package", enterprise.overview.path, "enterprise"), + menu_item("Cloud", hosting.deploy_quick_start.path, "hosting"), + class_name="flex flex-row items-center gap-2 m-0 h-full list-none", + custom_attrs={"role": "menubar"}, + ), + ui.navigation_menu.list( + ui.navigation_menu.item( + search_bar(), + unstyled=True, + custom_attrs={"role": "menuitem"}, + ), + ui.navigation_menu.item( + demo_form_dialog( + trigger=button( + "Book a Demo", + size="sm", + variant="primary", + class_name=" whitespace-nowrap max-xl:hidden", + native_button=False, + ), + ), + unstyled=True, + class_name="xl:flex hidden", + custom_attrs={"role": "menuitem"}, + ), + ui.navigation_menu.item( + navbar_sidebar_button(), + class_name="xl:hidden flex", + unstyled=True, + custom_attrs={"role": "menuitem"}, + ), + class_name="flex flex-row lg:gap-4 gap-2 m-0 h-full list-none items-center", + custom_attrs={"role": "menubar"}, + ), + ui.navigation_menu.portal( + ui.navigation_menu.positioner( + ui.navigation_menu.popup( + ui.navigation_menu.viewport(), + unstyled=True, + class_name="relative h-[var(--popup-height)] w-max origin-[var(--transform-origin)] transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0 min-[500px]:w-[var(--popup-width)] xs:w-[var(--popup-width)] rounded-xl bg-secondary-1 overflow-hidden", + style={ + "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.03), 0 -1px 1px 0 rgba(0, 0, 0, 0.04), 0 16px 32px 0 rgba(0, 0, 0, 0.08), 0 1px 1px 0 rgba(0, 0, 0, 0.08), 0 4px 8px 0 rgba(0, 0, 0, 0.03);", + }, + ), + side_offset=30, + align="start", + align_offset=-20, + ), + ), + unstyled=True, + class_name="relative flex w-full items-center h-full justify-between gap-6 mx-auto flex-row", + ) + + +@rx.memo +def docs_navbar() -> rx.Component: + from pcweb.components.hosting_banner import hosting_banner + + return rx.el.div( + hosting_banner(), + rx.el.header( + rx.el.div( + logo(), + navigation_menu(), + class_name="relative flex w-full items-center h-full justify-between gap-6 mx-auto flex-row max-w-[108rem]", + ), + class_name="w-full max-full h-[4.5rem] mx-auto flex flex-row items-center lg:px-16 px-6 backdrop-blur-[16px] shadow-[0_-2px_2px_1px_rgba(0,0,0,0.02),0_1px_1px_0_rgba(0,0,0,0.08),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] bg-gradient-to-b from-white-1 to-secondary-1", + ), + class_name="flex flex-col w-full top-0 z-[9999] fixed self-center", + ) diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py new file mode 100644 index 0000000000..c21fe0d6fe --- /dev/null +++ b/pcweb/views/marketing_navbar.py @@ -0,0 +1,494 @@ +import reflex as rx +import reflex_ui as ui +from reflex_ui.blocks.demo_form import demo_form_dialog + +from pcweb.components.docpage.navbar.buttons.sidebar import navbar_sidebar_button +from pcweb.components.icons.icons import get_icon +from pcweb.components.marketing_button import button +from pcweb.components.marquee import marquee +from pcweb.constants import ( + CHANGELOG_URL, + CONTRIBUTING_URL, + DISCUSSIONS_URL, + GITHUB_STARS, + GITHUB_URL, + JOBS_BOARD_URL, + REFLEX_BUILD_URL, +) +from pcweb.pages.customers.landing import customers +from pcweb.pages.docs import ai_builder +from pcweb.pages.faq import faq +from pcweb.pages.framework.framework import framework +from pcweb.pages.gallery.gallery import gallery +from pcweb.pages.hosting.hosting import hosting_landing +from pcweb.pages.use_cases.consulting import consulting_use_case_page +from pcweb.pages.use_cases.finance import finance_use_case_page +from pcweb.pages.use_cases.government import government_use_case_page +from pcweb.pages.use_cases.healthcare import healthcare_use_case_page +from pcweb.pages.use_cases.use_cases import use_cases_page + + +def social_proof_card(image: str) -> rx.Component: + return rx.el.div( + rx.image( + f"/companies/{rx.color_mode_cond('light', 'dark')}/{image}_small.svg", + loading="lazy", + alt=f"{image} logo", + class_name="w-auto h-fit pointer-events-none", + ), + class_name="flex justify-center items-center px-3", + ) + + +def logos_carousel() -> rx.Component: + logos = [ + "apple", + "accenture", + "dell", + "microsoft", + "nike", + ] + return marquee( + *[social_proof_card(logo) for logo in logos], + direction="left", + gradient_color="var(--secondary-1)", + class_name="h-[1.625rem] w-full overflow-hidden mt-auto", + gradient_width=65, + speed=25, + pause_on_hover=False, + ) + + +def github() -> rx.Component: + return rx.el.a( + button( + get_icon(icon="github_navbar", class_name="shrink-0"), + f"{GITHUB_STARS // 1000}K", + custom_attrs={ + "aria-label": f"View Reflex on GitHub - {GITHUB_STARS // 1000}K stars" + }, + size="sm", + variant="ghost", + ), + to=GITHUB_URL, + custom_attrs={ + "aria-label": f"View Reflex on GitHub - {GITHUB_STARS // 1000}K stars" + }, + ) + + +def logo() -> rx.Component: + return rx.el.a( + rx.image( + src="/logos/light/reflex.svg", + alt="Reflex Logo", + class_name="shrink-0 block dark:hidden", + ), + rx.image( + src="/logos/dark/reflex.svg", + alt="Reflex Logo", + class_name="shrink-0 hidden dark:block", + ), + to="/", + class_name="block shrink-0 mr-10", + ) + + +def menu_trigger(title: str, content: rx.Component) -> rx.Component: + return ui.navigation_menu.item( + ui.navigation_menu.trigger( + button( + title, + ui.icon( + "ArrowDown01Icon", class_name="chevron transition-all ease-out" + ), + size="sm", + variant="ghost", + class_name="font-[550]", + native_button=False, + ), + style={ + "&[data-popup-open] .chevron": { + "transform": "rotate(180deg)", + }, + }, + aria_label=f"{title} menu", + unstyled=True, + ), + content, + value=title, + class_name="cursor-pointer xl:flex hidden h-full items-center justify-center", + unstyled=True, + custom_attrs={"role": "menuitem"}, + ) + + +def menu_content(content: rx.Component, class_name: str = "") -> rx.Component: + return ui.navigation_menu.content( + content, + unstyled=True, + class_name=ui.cn( + "w-max transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[starting-style]:opacity-0 data-[ending-style]:opacity-0 data-[starting-style]:data-[activation-direction=left]:translate-x-[-50%] data-[starting-style]:data-[activation-direction=right]:translate-x-[50%] data-[ending-style]:data-[activation-direction=left]:translate-x-[50%] data-[ending-style]:data-[activation-direction=right]:translate-x-[-50%]", + "flex flex-row rounded-xl font-sans p-0", + class_name, + ), + ) + + +def platform_item(image: str, title: str, description: str, href: str) -> rx.Component: + return rx.el.div( + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/{image}", + alt=title, + class_name="size-18", + ), + rx.el.div( + rx.el.span(title, class_name="text-secondary-12 text-sm font-[525]"), + rx.el.span(description, class_name="text-secondary-11 text-sm font-[475]"), + class_name="flex flex-col", + ), + rx.el.a(class_name="absolute inset-0", to=href), + class_name="p-4 flex flex-row gap-6 relative cursor-pointer rounded-sm hover-card-shadow", + ) + + +def platform_content() -> rx.Component: + return menu_content( + rx.el.div( + rx.el.div( + rx.el.div( + rx.el.span( + "AI Builder", + class_name="text-secondary-12 text-lg font-semibold mb-2", + ), + rx.el.span( + "Build production-ready web apps for your team in seconds with AI-powered code generation.", + class_name="text-secondary-11 text-sm font-medium", + ), + rx.el.a( + class_name="absolute inset-0", + to=REFLEX_BUILD_URL, + target="_blank", + ), + class_name="p-4 flex flex-col relative hover-card-shadow rounded-md", + ), + style={ + "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset", + }, + class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full", + ), + rx.el.div( + platform_item( + "framework_pixel.svg", + "Reflex Framework", + "Iterate on full-stack apps in pure Python. No JavaScript required.", + framework.path, + ), + platform_item( + "cloud_pixel.svg", + "Cloud Hosting", + "Deploy your app with a single command to Reflex Cloud.", + hosting_landing.path, + ), + rx.el.div( + rx.el.span( + "Reflex Is The Operating System ", + rx.el.br(), + " for Enterprise Apps", + class_name="text-secondary-11 font-mono font-[415] text-[0.75rem] leading-4.5 uppercase", + ), + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_navbar.svg", + alt="Squares Navbar", + class_name="absolute bottom-4 right-4 pointer-events-none", + ), + class_name="relative p-4", + ), + class_name="p-4 flex flex-col h-full", + ), + class_name="w-[46.5rem] grid grid-cols-2", + ), + ) + + +def solutions_item(title: str, icon: str, href: str) -> rx.Component: + return rx.el.a( + ui.icon( + icon, + class_name="shrink-0 text-secondary-11 size-4.5", + ), + title, + to=href, + class_name="flex flex-row px-4 py-2 rounded-sm text-sm font-[525] text-secondary-12 gap-3 items-center justify-start cursor-pointer hover-card-shadow", + ) + + +def solutions_column(title: str, items: list[tuple[str, str, str]]) -> rx.Component: + return rx.el.div( + rx.el.div( + rx.el.span( + title, + class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-secondary-8", + ), + class_name="px-4 pt-4 flex flex-col", + ), + rx.el.div( + *[solutions_item(item[0], item[1], item[2]) for item in items], + class_name="flex flex-col", + ), + class_name="flex flex-col gap-4", + ) + + +def customers_column() -> rx.Component: + return rx.el.div( + rx.el.div( + rx.el.div( + rx.el.span( + "Customers", + class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-secondary-8", + ), + class_name="px-4 pt-4 flex flex-col", + ), + rx.el.div( + rx.el.span( + "Read Stories How Teams Use Reflex", + class_name="text-secondary-12 text-lg font-[575]", + ), + rx.el.span( + "Discover how companies build internal tools, AI apps, and production dashboards in pure Python.", + class_name="text-secondary-11 text-sm font-[475]", + ), + logos_carousel(), + class_name="flex flex-col gap-2 px-4 pb-4 h-full", + ), + rx.el.a(class_name="absolute inset-0", to=customers.path), + class_name="flex flex-col gap-6 hover-card-shadow rounded-lg relative h-full", + ), + class_name="p-4 block", + ) + + +def solutions_content() -> rx.Component: + return menu_content( + rx.el.div( + rx.el.div( + rx.el.div( + solutions_column( + "Who's It For", + [ + ("Executives", "LocationUser01Icon", use_cases_page.path), + ("Developers", "SourceCodeSquareIcon", use_cases_page.path), + ("Data Teams", "DatabaseIcon", use_cases_page.path), + ( + "Non Technical", + "CursorCircleSelection02Icon", + use_cases_page.path, + ), + ], + ), + solutions_column( + "Industries", + [ + ("Enterprise", "OfficeIcon", use_cases_page.path), + ("Finance", "Wallet05Icon", finance_use_case_page.path), + ("Healthcare", "HealthIcon", healthcare_use_case_page.path), + ( + "Consulting", + "DocumentValidationIcon", + consulting_use_case_page.path, + ), + ( + "Government", + "BankIcon", + government_use_case_page.path, + ), + ], + ), + class_name="grid grid-cols-2", + ), + class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full w-[28rem]", + style={ + "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset", + }, + ), + rx.el.div( + solutions_column( + "Migration", + [ + ("Switch from No Code", "WebDesign01Icon", use_cases_page.path), + ( + "Switch from Other Frameworks", + "CodeIcon", + use_cases_page.path, + ), + ( + "Switch from Other AI tools", + "ArtificialIntelligence04Icon", + use_cases_page.path, + ), + ], + ), + class_name="p-4 flex flex-col h-full", + ), + class_name="flex flex-row", + ), + ) + + +def resources_content() -> rx.Component: + return menu_content( + rx.el.div( + rx.el.div( + solutions_column( + "Developers", + [ + ("Templates", "Layout02Icon", gallery.path), + ( + "Integrations", + "PlugSocketIcon", + ai_builder.integrations.overview.path, + ), + ("Changelog", "Clock02Icon", CHANGELOG_URL), + ("Contributing", "GitCommitIcon", CONTRIBUTING_URL), + ("Discussion", "BubbleChatIcon", DISCUSSIONS_URL), + ("FAQ", "HelpSquareIcon", faq.path), + ], + ), + class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full", + style={ + "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset", + }, + ), + customers_column(), + class_name="w-[35rem] grid grid-cols-2", + ), + ) + + +def about_content() -> rx.Component: + return menu_content( + rx.el.div( + rx.el.div( + solutions_item("Company", "Profile02Icon", "/about"), + solutions_item("Careers", "WorkIcon", JOBS_BOARD_URL), + class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full", + style={ + "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset", + }, + ), + class_name="w-[12.5rem]", + ), + ) + + +def navigation_menu() -> rx.Component: + return ui.navigation_menu.root( + ui.navigation_menu.list( + menu_trigger("Platform", platform_content()), + menu_trigger("Solutions", solutions_content()), + menu_trigger("Resources", resources_content()), + ui.navigation_menu.item( + rx.el.a( + button( + "Pricing", + size="sm", + variant="ghost", + native_button=False, + ), + to="/pricing", + ), + class_name="xl:flex hidden", + custom_attrs={"role": "menuitem"}, + ), + ui.navigation_menu.item( + rx.el.a( + button( + "Docs", + size="sm", + variant="ghost", + ), + to="/docs", + ), + class_name="xl:flex hidden", + custom_attrs={"role": "menuitem"}, + ), + menu_trigger("About", about_content()), + class_name="flex flex-row items-center gap-2 m-0 h-full list-none", + custom_attrs={"role": "menubar"}, + ), + ui.navigation_menu.list( + ui.navigation_menu.item( + github(), + custom_attrs={"role": "menuitem"}, + ), + ui.navigation_menu.item( + rx.el.a( + button( + "Sign In", + ui.icon("Login01Icon", class_name="scale-x-[-1]"), + size="sm", + variant="outline", + native_button=False, + ), + to=f"{REFLEX_BUILD_URL.strip('/')}/cloud-login?redirect_to={REFLEX_BUILD_URL.strip('/')}/callback/", + target="_blank", + ), + custom_attrs={"role": "menuitem"}, + ), + ui.navigation_menu.item( + demo_form_dialog( + trigger=button( + "Book a Demo", + size="sm", + variant="primary", + class_name=" whitespace-nowrap max-xl:hidden", + native_button=False, + ), + ), + unstyled=True, + class_name="xl:flex hidden", + custom_attrs={"role": "menuitem"}, + ), + ui.navigation_menu.item( + navbar_sidebar_button(), + class_name="xl:hidden flex", + unstyled=True, + custom_attrs={"role": "menuitem"}, + ), + class_name="flex flex-row lg:gap-4 gap-2 m-0 h-full list-none items-center", + custom_attrs={"role": "menubar"}, + ), + ui.navigation_menu.portal( + ui.navigation_menu.positioner( + ui.navigation_menu.popup( + ui.navigation_menu.viewport(), + unstyled=True, + class_name="relative h-[var(--popup-height)] w-max origin-[var(--transform-origin)] transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0 min-[500px]:w-[var(--popup-width)] xs:w-[var(--popup-width)] rounded-xl bg-secondary-1 overflow-hidden", + style={ + "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.03), 0 -1px 1px 0 rgba(0, 0, 0, 0.04), 0 16px 32px 0 rgba(0, 0, 0, 0.08), 0 1px 1px 0 rgba(0, 0, 0, 0.08), 0 4px 8px 0 rgba(0, 0, 0, 0.03);", + }, + ), + side_offset=30, + align="start", + align_offset=-20, + ), + ), + unstyled=True, + class_name="relative flex w-full items-center h-full justify-between gap-6 mx-auto flex-row", + ) + + +@rx.memo +def marketing_navbar() -> rx.Component: + from pcweb.components.hosting_banner import hosting_banner + + return rx.el.div( + hosting_banner(), + rx.el.header( + logo(), + navigation_menu(), + class_name="w-full max-w-[71.5rem] h-[4.5rem] mx-auto flex flex-row items-center p-5 rounded-b-xl backdrop-blur-[16px] shadow-[0_-2px_2px_1px_rgba(0,0,0,0.02),0_1px_1px_0_rgba(0,0,0,0.08),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] bg-gradient-to-b from-white-1 to-secondary-1", + ), + class_name="flex flex-col w-full top-0 z-[9999] fixed self-center", + ) From 54802baca9897f1bdc8cf8ca1701fe17ac5c794c Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Thu, 12 Feb 2026 19:01:30 +0100 Subject: [PATCH 02/15] fix safari gradient --- assets/components/GradientButton.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/assets/components/GradientButton.tsx b/assets/components/GradientButton.tsx index 01e5a5fde8..19da15cfff 100644 --- a/assets/components/GradientButton.tsx +++ b/assets/components/GradientButton.tsx @@ -85,21 +85,22 @@ export function GradientButton({ {variant === 'primary' ? ( <> - {children} + {children} ) : ( children From ab9881cf2806dcf51262642b5714176cfc0c4871 Mon Sep 17 00:00:00 2001 From: Carlos Date: Fri, 13 Feb 2026 12:52:07 +0100 Subject: [PATCH 03/15] dark mode --- assets/about/companies/dark/abstract.svg | 1 + assets/about/companies/dark/box_group.svg | 1 + assets/about/companies/dark/lux.svg | 1 + assets/about/companies/dark/outset.svg | 1 + assets/about/companies/dark/picus.svg | 1 + assets/about/companies/dark/y_combinator.svg | 1 + .../about/companies/{ => light}/abstract.svg | 0 .../about/companies/{ => light}/box_group.svg | 0 assets/about/companies/{ => light}/lux.svg | 0 assets/about/companies/{ => light}/outset.svg | 0 assets/about/companies/{ => light}/picus.svg | 0 .../companies/{ => light}/y_combinator.svg | 0 assets/common/dark/ai_builder_pattern.svg | 140 +++ assets/common/dark/cloud_pixel.svg | 1 + assets/common/dark/framework_pixel.svg | 1 + assets/common/dark/square_logo_lines.svg | 3 + assets/common/dark/squares_docs_logo.svg | 343 ++++++ assets/common/dark/squares_navbar.svg | 1 + assets/common/dark/squares_rectangle.svg | 1 + .../common/dark/squares_rectangle_small.svg | 1 + assets/common/dark/squares_rectangle_xs.svg | 1 + assets/common/dark/squares_vertical_docs.svg | 1 + assets/common/light/ai_builder_pattern.svg | 238 ++++ assets/common/light/cloud_pixel.svg | 1078 ++++++++++++++++- assets/common/light/framework_pixel.svg | 2 +- assets/common/light/square_logo_lines.svg | 3 + assets/common/light/squares_logo.svg | 826 ++++++------- assets/common/light/squares_navbar.svg | 2 +- .../common/light/squares_rectangle_small.svg | 2 +- assets/common/light/squares_rectangle_xs.svg | 2 +- assets/common/light/squares_vertical_docs.svg | 2 +- assets/companies/dark/accenture_small.svg | 1 + assets/companies/dark/apple_small.svg | 1 + assets/companies/dark/dell_small.svg | 1 + assets/companies/dark/microsoft_small.svg | 1 + assets/companies/dark/nike_small.svg | 1 + assets/companies/light/accenture_small.svg | 2 +- assets/companies/light/apple_small.svg | 2 +- assets/companies/light/dell_small.svg | 2 +- assets/companies/light/microsoft_small.svg | 2 +- assets/companies/light/nike_small.svg | 2 +- assets/components/GradientButton.tsx | 12 +- assets/components/LogoReveal.tsx | 160 +++ assets/custom-colors.css | 48 +- assets/docs/dark/getting_started.svg | 665 +++++----- assets/tailwind-theme.css | 21 +- pcweb/components/docpage/navbar/typesense.py | 14 +- pcweb/components/hosting_banner.py | 4 +- pcweb/components/logo_reveal.py | 30 + pcweb/pages/about/__init__.py | 5 +- pcweb/pages/about/views/cards.py | 23 +- pcweb/pages/about/views/companies.py | 44 +- pcweb/pages/about/views/divider.py | 2 +- pcweb/pages/about/views/hero.py | 25 +- pcweb/pages/about/views/hiring.py | 14 +- pcweb/pages/about/views/news.py | 18 +- pcweb/pages/about/views/square_logo.py | 21 +- pcweb/pages/about/views/team.py | 6 +- pcweb/pages/customers/views/footer.py | 2 +- pcweb/pages/docs_landing/__init__.py | 5 +- pcweb/pages/docs_landing/views/ai_builder.py | 31 +- pcweb/pages/docs_landing/views/divider.py | 2 +- pcweb/pages/docs_landing/views/framework.py | 43 +- pcweb/pages/docs_landing/views/hero.py | 9 +- pcweb/pages/docs_landing/views/hosting.py | 6 +- pcweb/pages/docs_landing/views/link_item.py | 23 +- pcweb/pages/framework/views/footer_index.py | 2 +- pcweb/views/docs_navbar.py | 2 +- pcweb/views/marketing_navbar.py | 64 +- 69 files changed, 3022 insertions(+), 948 deletions(-) create mode 100644 assets/about/companies/dark/abstract.svg create mode 100644 assets/about/companies/dark/box_group.svg create mode 100644 assets/about/companies/dark/lux.svg create mode 100644 assets/about/companies/dark/outset.svg create mode 100644 assets/about/companies/dark/picus.svg create mode 100644 assets/about/companies/dark/y_combinator.svg rename assets/about/companies/{ => light}/abstract.svg (100%) rename assets/about/companies/{ => light}/box_group.svg (100%) rename assets/about/companies/{ => light}/lux.svg (100%) rename assets/about/companies/{ => light}/outset.svg (100%) rename assets/about/companies/{ => light}/picus.svg (100%) rename assets/about/companies/{ => light}/y_combinator.svg (100%) create mode 100644 assets/common/dark/ai_builder_pattern.svg create mode 100644 assets/common/dark/cloud_pixel.svg create mode 100644 assets/common/dark/framework_pixel.svg create mode 100644 assets/common/dark/square_logo_lines.svg create mode 100644 assets/common/dark/squares_docs_logo.svg create mode 100644 assets/common/dark/squares_navbar.svg create mode 100644 assets/common/dark/squares_rectangle.svg create mode 100644 assets/common/dark/squares_rectangle_small.svg create mode 100644 assets/common/dark/squares_rectangle_xs.svg create mode 100644 assets/common/dark/squares_vertical_docs.svg create mode 100644 assets/common/light/ai_builder_pattern.svg create mode 100644 assets/common/light/square_logo_lines.svg create mode 100644 assets/companies/dark/accenture_small.svg create mode 100644 assets/companies/dark/apple_small.svg create mode 100644 assets/companies/dark/dell_small.svg create mode 100644 assets/companies/dark/microsoft_small.svg create mode 100644 assets/companies/dark/nike_small.svg create mode 100644 assets/components/LogoReveal.tsx create mode 100644 pcweb/components/logo_reveal.py diff --git a/assets/about/companies/dark/abstract.svg b/assets/about/companies/dark/abstract.svg new file mode 100644 index 0000000000..5306e156d6 --- /dev/null +++ b/assets/about/companies/dark/abstract.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/dark/box_group.svg b/assets/about/companies/dark/box_group.svg new file mode 100644 index 0000000000..48c7d7e298 --- /dev/null +++ b/assets/about/companies/dark/box_group.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/dark/lux.svg b/assets/about/companies/dark/lux.svg new file mode 100644 index 0000000000..02e7477635 --- /dev/null +++ b/assets/about/companies/dark/lux.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/dark/outset.svg b/assets/about/companies/dark/outset.svg new file mode 100644 index 0000000000..4a2e9583f5 --- /dev/null +++ b/assets/about/companies/dark/outset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/dark/picus.svg b/assets/about/companies/dark/picus.svg new file mode 100644 index 0000000000..99af8f1a5d --- /dev/null +++ b/assets/about/companies/dark/picus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/dark/y_combinator.svg b/assets/about/companies/dark/y_combinator.svg new file mode 100644 index 0000000000..6e3b7a047d --- /dev/null +++ b/assets/about/companies/dark/y_combinator.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/about/companies/abstract.svg b/assets/about/companies/light/abstract.svg similarity index 100% rename from assets/about/companies/abstract.svg rename to assets/about/companies/light/abstract.svg diff --git a/assets/about/companies/box_group.svg b/assets/about/companies/light/box_group.svg similarity index 100% rename from assets/about/companies/box_group.svg rename to assets/about/companies/light/box_group.svg diff --git a/assets/about/companies/lux.svg b/assets/about/companies/light/lux.svg similarity index 100% rename from assets/about/companies/lux.svg rename to assets/about/companies/light/lux.svg diff --git a/assets/about/companies/outset.svg b/assets/about/companies/light/outset.svg similarity index 100% rename from assets/about/companies/outset.svg rename to assets/about/companies/light/outset.svg diff --git a/assets/about/companies/picus.svg b/assets/about/companies/light/picus.svg similarity index 100% rename from assets/about/companies/picus.svg rename to assets/about/companies/light/picus.svg diff --git a/assets/about/companies/y_combinator.svg b/assets/about/companies/light/y_combinator.svg similarity index 100% rename from assets/about/companies/y_combinator.svg rename to assets/about/companies/light/y_combinator.svg diff --git a/assets/common/dark/ai_builder_pattern.svg b/assets/common/dark/ai_builder_pattern.svg new file mode 100644 index 0000000000..44ac3fd99b --- /dev/null +++ b/assets/common/dark/ai_builder_pattern.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/common/dark/cloud_pixel.svg b/assets/common/dark/cloud_pixel.svg new file mode 100644 index 0000000000..c35261b024 --- /dev/null +++ b/assets/common/dark/cloud_pixel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/dark/framework_pixel.svg b/assets/common/dark/framework_pixel.svg new file mode 100644 index 0000000000..17d27bfda8 --- /dev/null +++ b/assets/common/dark/framework_pixel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/dark/square_logo_lines.svg b/assets/common/dark/square_logo_lines.svg new file mode 100644 index 0000000000..18dffe068c --- /dev/null +++ b/assets/common/dark/square_logo_lines.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/common/dark/squares_docs_logo.svg b/assets/common/dark/squares_docs_logo.svg new file mode 100644 index 0000000000..7eef2f0a99 --- /dev/null +++ b/assets/common/dark/squares_docs_logo.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/common/dark/squares_navbar.svg b/assets/common/dark/squares_navbar.svg new file mode 100644 index 0000000000..5801ad2c75 --- /dev/null +++ b/assets/common/dark/squares_navbar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/dark/squares_rectangle.svg b/assets/common/dark/squares_rectangle.svg new file mode 100644 index 0000000000..a22500aa05 --- /dev/null +++ b/assets/common/dark/squares_rectangle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/dark/squares_rectangle_small.svg b/assets/common/dark/squares_rectangle_small.svg new file mode 100644 index 0000000000..7c06fb6bec --- /dev/null +++ b/assets/common/dark/squares_rectangle_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/dark/squares_rectangle_xs.svg b/assets/common/dark/squares_rectangle_xs.svg new file mode 100644 index 0000000000..00ffb4df25 --- /dev/null +++ b/assets/common/dark/squares_rectangle_xs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/dark/squares_vertical_docs.svg b/assets/common/dark/squares_vertical_docs.svg new file mode 100644 index 0000000000..b582af9440 --- /dev/null +++ b/assets/common/dark/squares_vertical_docs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/light/ai_builder_pattern.svg b/assets/common/light/ai_builder_pattern.svg new file mode 100644 index 0000000000..c21ff87d0d --- /dev/null +++ b/assets/common/light/ai_builder_pattern.svg @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/common/light/cloud_pixel.svg b/assets/common/light/cloud_pixel.svg index 8d0c4b0e7d..ee02d266cc 100644 --- a/assets/common/light/cloud_pixel.svg +++ b/assets/common/light/cloud_pixel.svg @@ -1 +1,1077 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/common/light/framework_pixel.svg b/assets/common/light/framework_pixel.svg index 4b801d9e46..15a99ba61e 100644 --- a/assets/common/light/framework_pixel.svg +++ b/assets/common/light/framework_pixel.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/common/light/square_logo_lines.svg b/assets/common/light/square_logo_lines.svg new file mode 100644 index 0000000000..18dffe068c --- /dev/null +++ b/assets/common/light/square_logo_lines.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/common/light/squares_logo.svg b/assets/common/light/squares_logo.svg index eeece61baa..1f77888a85 100644 --- a/assets/common/light/squares_logo.svg +++ b/assets/common/light/squares_logo.svg @@ -7,534 +7,534 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/assets/common/light/squares_navbar.svg b/assets/common/light/squares_navbar.svg index 3a3af460e1..b03ec4bb3a 100644 --- a/assets/common/light/squares_navbar.svg +++ b/assets/common/light/squares_navbar.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/common/light/squares_rectangle_small.svg b/assets/common/light/squares_rectangle_small.svg index 14e74631c2..dd1b84e59a 100644 --- a/assets/common/light/squares_rectangle_small.svg +++ b/assets/common/light/squares_rectangle_small.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/common/light/squares_rectangle_xs.svg b/assets/common/light/squares_rectangle_xs.svg index a22500aa05..1d16ae00ab 100644 --- a/assets/common/light/squares_rectangle_xs.svg +++ b/assets/common/light/squares_rectangle_xs.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/common/light/squares_vertical_docs.svg b/assets/common/light/squares_vertical_docs.svg index 350462df82..377e261046 100644 --- a/assets/common/light/squares_vertical_docs.svg +++ b/assets/common/light/squares_vertical_docs.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/companies/dark/accenture_small.svg b/assets/companies/dark/accenture_small.svg new file mode 100644 index 0000000000..968d6a14f7 --- /dev/null +++ b/assets/companies/dark/accenture_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/apple_small.svg b/assets/companies/dark/apple_small.svg new file mode 100644 index 0000000000..d571a7d6d6 --- /dev/null +++ b/assets/companies/dark/apple_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/dell_small.svg b/assets/companies/dark/dell_small.svg new file mode 100644 index 0000000000..4bc19f7eb4 --- /dev/null +++ b/assets/companies/dark/dell_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/microsoft_small.svg b/assets/companies/dark/microsoft_small.svg new file mode 100644 index 0000000000..92ceaaf081 --- /dev/null +++ b/assets/companies/dark/microsoft_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/nike_small.svg b/assets/companies/dark/nike_small.svg new file mode 100644 index 0000000000..60fec6f135 --- /dev/null +++ b/assets/companies/dark/nike_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/accenture_small.svg b/assets/companies/light/accenture_small.svg index 8981465bda..569fa01f63 100644 --- a/assets/companies/light/accenture_small.svg +++ b/assets/companies/light/accenture_small.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/companies/light/apple_small.svg b/assets/companies/light/apple_small.svg index 168f18ed63..bea41db78b 100644 --- a/assets/companies/light/apple_small.svg +++ b/assets/companies/light/apple_small.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/companies/light/dell_small.svg b/assets/companies/light/dell_small.svg index 0725408629..6d4ef9ced6 100644 --- a/assets/companies/light/dell_small.svg +++ b/assets/companies/light/dell_small.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/companies/light/microsoft_small.svg b/assets/companies/light/microsoft_small.svg index 39bf0d42b4..c46996e85e 100644 --- a/assets/companies/light/microsoft_small.svg +++ b/assets/companies/light/microsoft_small.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/companies/light/nike_small.svg b/assets/companies/light/nike_small.svg index a7ceb44033..2b927f72e1 100644 --- a/assets/companies/light/nike_small.svg +++ b/assets/companies/light/nike_small.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/components/GradientButton.tsx b/assets/components/GradientButton.tsx index 19da15cfff..6f720dd871 100644 --- a/assets/components/GradientButton.tsx +++ b/assets/components/GradientButton.tsx @@ -16,15 +16,15 @@ interface GradientButtonProps } const BASE_CLASSES = - 'relative inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:cursor-not-allowed disabled:border disabled:border-secondary-4/80 disabled:bg-secondary-3 disabled:text-secondary-8 [&_svg]:pointer-events-none [&_svg:not([class*="size-"])]:size-4 shrink-0 [&_svg]:shrink-0 cursor-pointer box-border font-[525] overflow-hidden' + 'relative inline-flex items-center justify-center whitespace-nowrap transition-colors disabled:cursor-not-allowed disabled:border disabled:border-m-slate-4/80 disabled:bg-m-slate-3 disabled:text-m-slate-8 [&_svg]:pointer-events-none [&_svg:not([class*="size-"])]:size-4 shrink-0 [&_svg]:shrink-0 cursor-pointer box-border font-[525] overflow-hidden' const VARIANT_CLASSES: Record = { primary: 'bg-primary-9 text-primary-2 dark:text-primary-contrast hover:bg-primary-10 shadow-[0_0_1px_var(--primary-9,#6E56CF)_inset,0_2px_0_0_rgba(255,255,255,0.22)_inset]', destructive: 'bg-destructive-9 hover:bg-destructive-10 text-primary-contrast', outline: - 'shadow-[0_-1px_0_0_rgba(0,0,0,0.08)_inset,0_0_0_1px_rgba(0,0,0,0.08)_inset,0_1px_2px_0_rgba(0,0,0,0.02),0_1px_4px_0_rgba(0,0,0,0.02)] bg-white hover:bg-secondary-2 text-secondary-12', - ghost: 'text-secondary-12 hover:text-primary-10', + 'shadow-[0_-1px_0_0_rgba(0,0,0,0.08)_inset,0_0_0_1px_rgba(0,0,0,0.08)_inset,0_1px_2px_0_rgba(0,0,0,0.02),0_1px_4px_0_rgba(0,0,0,0.02)] dark:shadow-[0_1px_0_0_rgba(255,255,255,0.16)_inset] bg-white dark:bg-m-slate-10 hover:bg-m-slate-2 dark:hover:bg-m-slate-9 text-m-slate-12 dark:text-m-slate-3', + ghost: 'text-m-slate-12 dark:text-m-slate-3 hover:text-primary-10 dark:hover:text-primary-9', } const SIZE_CLASSES: Record = { @@ -87,14 +87,14 @@ export function GradientButton({ (null); + const [mouse, setMouse] = useState({ x: -9999, y: -9999 }); + const [dimensions, setDimensions] = useState({ width: 0, height: 0 }); + const uniqueId = useId(); + + // Calculate offsets to center the path within the background + const offsetX = (dimensions.width - PATH_W) / 2; + const offsetY = (dimensions.height - PATH_H) / 2; + + const updateDimensions = useCallback(() => { + const img = containerRef.current?.querySelector("img"); + if (img && img.naturalWidth && img.naturalHeight) { + setDimensions({ width: img.naturalWidth, height: img.naturalHeight }); + } + }, []); + + const handleMouseMove = useCallback( + (e: MouseEvent) => { + const el = containerRef.current; + if (!el || !dimensions.width || !dimensions.height) return; + const rect = el.getBoundingClientRect(); + const scaleX = dimensions.width / rect.width; + const scaleY = dimensions.height / rect.height; + setMouse({ + x: (e.clientX - rect.left) * scaleX, + y: (e.clientY - rect.top) * scaleY, + }); + }, + [dimensions] + ); + + const handleMouseLeave = useCallback(() => { + setMouse({ x: -9999, y: -9999 }); + }, []); + + useEffect(() => { + const el = containerRef.current; + if (!el) return; + + el.addEventListener("mousemove", handleMouseMove); + el.addEventListener("mouseleave", handleMouseLeave); + + return () => { + el.removeEventListener("mousemove", handleMouseMove); + el.removeEventListener("mouseleave", handleMouseLeave); + }; + }, [handleMouseMove, handleMouseLeave]); + + // Unique IDs for SVG elements to avoid conflicts with multiple instances + const revealGradId = `revealGrad-${uniqueId}`; + const revealMaskId = `revealMask-${uniqueId}`; + const purpleStrokeId = `purpleStroke-${uniqueId}`; + const lineGlowId = `lineGlow-${uniqueId}`; + + return ( +

+ {/* Background squares grid */} + + + {/* Foreground SVG with reveal effect */} + {dimensions.width > 0 && dimensions.height > 0 && ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )} +
+ ); +} + +export default LogoReveal; diff --git a/assets/custom-colors.css b/assets/custom-colors.css index 06b1dba0a0..dfa230cb75 100644 --- a/assets/custom-colors.css +++ b/assets/custom-colors.css @@ -41,17 +41,17 @@ --wave-line-2: #EBE4FF; /* Marketing Colors */ --m-slate-1: #FCFCFD; - --m-slate-2: #F9F9FB; - --m-slate-3: #F0F0F3; - --m-slate-4: #E8E8EC; - --m-slate-5: #E0E1E6; - --m-slate-6: #D9D9E0; - --m-slate-7: #CDCED6; - --m-slate-8: #B9BBC6; - --m-slate-9: #8B8D98; - --m-slate-10: #80838D; - --m-slate-11: #60646C; - --m-slate-12: #262B31; + --m-slate-2: #F6F7F9; + --m-slate-3: #EEEFF2; + --m-slate-4: #E5E8EB; + --m-slate-5: #CACDD4; + --m-slate-6: #979FAA; + --m-slate-7: #67707E; + --m-slate-8: #3C434E; + --m-slate-9: #2A3037; + --m-slate-10: #21252B; + --m-slate-11: #1D2025; + --m-slate-12: #151618; --m-slate-13: #1C2024; --m-slate-14: #1A1B1D; --m-slate-15: #151618; @@ -72,7 +72,6 @@ .dark, .dark-theme { /* Slate */ - --c-slate-1: #151618; /* #151618 */ --c-slate-2: #1A1B1D; /* #1A1B1D */ @@ -121,20 +120,17 @@ --wave-line-1: #2F1C78; --wave-line-2: #261958; --m-slate-1: #FCFCFD; - --m-slate-2: #F9F9FB; - --m-slate-3: #F0F0F3; - --m-slate-4: #E8E8EC; - --m-slate-5: #E0E1E6; - --m-slate-6: #D9D9E0; - --m-slate-7: #CDCED6; - --m-slate-8: #B9BBC6; - --m-slate-9: #8B8D98; - --m-slate-10: #80838D; - --m-slate-11: #60646C; - --m-slate-12: #262B31; - --m-slate-13: #1C2024; - --m-slate-14: #1A1B1D; - --m-slate-15: #151618; + --m-slate-2: #F6F7F9; + --m-slate-3: #EEEFF2; + --m-slate-4: #E5E8EB; + --m-slate-5: #CACDD4; + --m-slate-6: #979FAA; + --m-slate-7: #67707E; + --m-slate-8: #3C434E; + --m-slate-9: #2A3037; + --m-slate-10: #21252B; + --m-slate-11: #1D2025; + --m-slate-12: #151618; --m-violet-1: #FDFCFE; --m-violet-2: #FAF8FF; --m-violet-3: #F4F0FE; diff --git a/assets/docs/dark/getting_started.svg b/assets/docs/dark/getting_started.svg index 073877b0fb..5b1b13dc1d 100644 --- a/assets/docs/dark/getting_started.svg +++ b/assets/docs/dark/getting_started.svg @@ -1,410 +1,399 @@ - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - + + + - + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - - - - - - + - + - + diff --git a/assets/tailwind-theme.css b/assets/tailwind-theme.css index cfe357918f..aa40be56c6 100644 --- a/assets/tailwind-theme.css +++ b/assets/tailwind-theme.css @@ -1115,8 +1115,12 @@ 0px -24px 12px 0px light-dark(rgba(28, 32, 36, 0.02), rgba(0, 0, 0, 0)), 0px -8px 8px 0px light-dark(rgba(28, 32, 36, 0.02), rgba(0, 0, 0, 0)), 0px -2px 6px 0px light-dark(rgba(28, 32, 36, 0.02), rgba(0, 0, 0, 0)); - - --text-xs: 0.75rem; + --shadow-card: 0 0 0 1px rgba(0, 0, 0, 0.04), + 0 4px 8px 0 rgba(0, 0, 0, 0.07), + 0 1px 1px 0 rgba(0, 0, 0, 0.01), + 0 0 0 1px #FFF inset; + --shadow-card-dark: 0 0 0 1px var(--m-slate-9, #2A3037), + --text-xs: 0.75rem; --text-xs--line-height: 1rem; --text-sm: 0.875rem; --text-sm--line-height: 1.5rem; @@ -1765,6 +1769,19 @@ box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.03), 0 1px 0 0 #FFF inset, 0 1px 0 0 rgba(0, 0, 0, 0.04), 0 0 0 1px rgba(0, 0, 0, 0.08); } + :where(.dark, .dark *) .hover-card-shadow:hover { + background: var(--m-slate-11, #1D2025); + box-shadow: 0 0 0 1px var(--m-slate-10, #21252B); + } + + .navbar-shadow { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.03), 0 -1px 1px 0 rgba(0, 0, 0, 0.04), 0 16px 32px 0 rgba(0, 0, 0, 0.08), 0 1px 1px 0 rgba(0, 0, 0, 0.08), 0 4px 8px 0 rgba(0, 0, 0, 0.03); + } + + :where(.dark, .dark *) .navbar-shadow { + box-shadow: 0 0 0 1px var(--m-slate-9, #2A3037); + } + .tab-style[data-state='active'] { color: var(--c-violet-9); } diff --git a/pcweb/components/docpage/navbar/typesense.py b/pcweb/components/docpage/navbar/typesense.py index a064076d66..c44f7261bb 100644 --- a/pcweb/components/docpage/navbar/typesense.py +++ b/pcweb/components/docpage/navbar/typesense.py @@ -323,13 +323,17 @@ def search_trigger() -> rx.Component: class_name="hidden md:block text-sm font-medium", ), rx.html( - """""", + rx.color_mode_cond( + """""", + """ + + + +""", + ), class_name="ml-auto hidden md:block", ), - class_name="text-secondary-11 h-8 px-2 py-1.5 rounded-lg bg-secondary-1 flex flex-row items-center justify-start gap-2 lg:w-[10rem] w-full hover:bg-secondary-2", - style={ - "box-shadow": "0 -1px 0 0 rgba(0, 0, 0, 0.08) inset, 0 0 0 1px rgba(0, 0, 0, 0.08) inset, 0 1px 2px 0 rgba(0, 0, 0, 0.02), 0 1px 4px 0 rgba(0, 0, 0, 0.02);", - }, + class_name="text-m-slate-7 dark:text-m-slate-6 h-8 px-2 py-1.5 rounded-lg bg-m-slate-1 dark:bg-m-slate-11 flex flex-row items-center justify-start gap-2 lg:w-[10rem] w-full hover:bg-m-slate-2 dark:hover:bg-m-slate-10 dark:shadow-[0_-1px_0_0_rgba(255,_255,_255,_0.06)_inset,_0_0_0_1px_rgba(255,_255,_255,_0.04)_inset] shadow-[0_-1px_0_0_rgba(0,_0,_0,_0.08)_inset,_0_0_0_1px_rgba(0,_0,_0,_0.08)_inset,_0_1px_2px_0_rgba(0,_0,_0,_0.02),_0_1px_4px_0_rgba(0,_0,_0,_0.02)]", id="search-trigger", custom_attrs={"aria-label": "Search documentation"}, ) diff --git a/pcweb/components/hosting_banner.py b/pcweb/components/hosting_banner.py index 427eb9a5b5..c12afed899 100644 --- a/pcweb/components/hosting_banner.py +++ b/pcweb/components/hosting_banner.py @@ -71,7 +71,7 @@ def hosting_banner() -> rx.Component: # Header text with responsive spans rx.el.span( "New", - class_name="items-center font-medium px-1.5 h-5 rounded-md text-xs bg-violet-9 text-slate-1 z-[1] max-lg:hidden lg:inline-flex", + class_name="items-center font-medium px-1.5 h-5 rounded-md text-xs bg-primary-9 text-primary-contrast z-[1] max-lg:hidden lg:inline-flex", ), rx.text( rx.el.span( @@ -101,7 +101,7 @@ def hosting_banner() -> rx.Component: class_name="cursor-pointer hover:!text-slate-11 transition-color !text-slate-9 z-10 size-8 flex items-center justify-center shrink-0 md:col-start-3 justify-self-end ml-auto", on_click=HostingBannerState.hide_banner, ), - class_name="px-6 lg:px-6 w-screen min-h-[3rem] lg:h-[3.5rem] shadow-[inset_0_-1px_0_0_var(--c-slate-3)] flex md:grid md:grid-cols-[1fr_auto_1fr] items-center bg-slate-1 gap-4 overflow-hidden relative lg:py-0 py-3 max-w-full group", + class_name="px-6 lg:px-6 w-screen min-h-[3rem] lg:h-[3.5rem] shadow-[inset_0_-1px_0_0_var(--c-slate-3)] flex md:grid md:grid-cols-[1fr_auto_1fr] items-center bg-m-slate-1 dark:bg-m-slate-12 gap-4 overflow-hidden relative lg:py-0 py-3 max-w-full group", ), ), on_mount=HostingBannerState.show_blog_banner, diff --git a/pcweb/components/logo_reveal.py b/pcweb/components/logo_reveal.py new file mode 100644 index 0000000000..61fe7b8b06 --- /dev/null +++ b/pcweb/components/logo_reveal.py @@ -0,0 +1,30 @@ +"""Logo reveal component with mouse-following gradient effect.""" + +import reflex as rx +from reflex.vars.base import Var + + +class LogoReveal(rx.NoSSRComponent): + """A logo reveal component with mouse-tracking gradient effect.""" + + library = "$/public/components/LogoReveal" + + tag = "LogoReveal" + + # Source URL for the background grid image + grid_bg_src: Var[str] + + # Radius of the reveal circle effect + reveal_radius: Var[int] + + # Stroke width of the revealed lines + stroke_width: Var[int] + + def add_imports(self) -> rx.ImportDict: + """Add imports to the component.""" + return { + "clsx-for-tailwind": "cn", + } + + +logo_reveal = LogoReveal.create diff --git a/pcweb/pages/about/__init__.py b/pcweb/pages/about/__init__.py index 7fa6819fa6..fbaeb814e0 100644 --- a/pcweb/pages/about/__init__.py +++ b/pcweb/pages/about/__init__.py @@ -11,6 +11,7 @@ square_logo, team, ) +from pcweb.pages.framework.views.footer_index import footer_index from pcweb.views.marketing_navbar import marketing_navbar @@ -36,9 +37,11 @@ def about() -> rx.Component: hiring(), team(), news(), + divider(), + footer_index(), class_name="flex flex-col relative justify-center items-center w-full", ), class_name="flex flex-col w-full relative h-full justify-center items-center", ), - class_name="flex flex-col w-full justify-center items-center relative", + class_name="flex flex-col w-full justify-center items-center relative dark:bg-m-slate-12 bg-m-slate-1", ) diff --git a/pcweb/pages/about/views/cards.py b/pcweb/pages/about/views/cards.py index 2762d40c97..9213c9d572 100644 --- a/pcweb/pages/about/views/cards.py +++ b/pcweb/pages/about/views/cards.py @@ -16,10 +16,17 @@ def card(title: str, description: rx.Component, icon: str) -> rx.Component: squares_rectangle_small(), class_name="absolute top-1 left-4.5", ), - ui.icon(icon, class_name="text-secondary-12 size-10 mb-8", stroke_width=1), - rx.el.h2(title, class_name="text-secondary-12 text-2xl font-semibold mb-4"), + ui.icon( + icon, + class_name="text-m-slate-12 dark:text-m-slate-3 size-10 mb-8", + stroke_width=1, + ), + rx.el.h2( + title, + class_name="text-m-slate-12 dark:text-m-slate-3 text-2xl font-semibold mb-4", + ), description, - class_name="flex flex-col rounded-xl shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_12px_24px_0_rgba(0,0,0,0.08),0_1px_1px_0_rgba(0,0,0,0.01),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] lg:px-12 lg:pt-16 lg:pb-12 px-10 pt-14 pb-10 relative isolate backdrop-blur-[6px] bg-white/96", + class_name="flex flex-col rounded-xl shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_12px_24px_0_rgba(0,0,0,0.08),0_1px_1px_0_rgba(0,0,0,0.01),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] lg:px-12 lg:pt-16 lg:pb-12 px-10 pt-14 pb-10 relative isolate backdrop-blur-[6px] bg-white/96 dark:bg-m-slate-11 dark:shadow-none dark:border-t dark:border-m-slate-9", ) @@ -31,10 +38,10 @@ def cards() -> rx.Component: "Reflex began as a simple idea: ", rx.el.b( " building web apps in Python should feel effortless. ", - class_name="font-semibold text-secondary-12", + class_name="font-semibold text-m-slate-12 dark:text-m-slate-3", ), " What started as an internal experiment quickly grew into a community-driven framework used to ship real products fast.", - class_name="text-secondary-11 text-base font-medium", + class_name="text-m-slate-7 dark:text-m-slate-6 text-base font-medium", ), icon="Plant04Icon", ), @@ -43,15 +50,15 @@ def cards() -> rx.Component: description=rx.el.p( rx.el.b( "Open source is at the core of Reflex. ", - class_name="font-semibold text-secondary-12", + class_name="font-semibold text-m-slate-12 dark:text-m-slate-3", ), " We build in the open, listen to our community, and believe the best developer tools are shaped by the people who use them. ", rx.el.b( "Transparency, collaboration, and craft ", - class_name="font-semibold text-secondary-12", + class_name="font-semibold text-m-slate-12 dark:text-m-slate-3", ), " come first.", - class_name="text-secondary-11 text-base font-medium", + class_name="text-m-slate-11 dark:text-m-slate-6 text-base font-medium", ), icon="OpenSourceIcon", ), diff --git a/pcweb/pages/about/views/companies.py b/pcweb/pages/about/views/companies.py index d4a75a0695..712a4d751b 100644 --- a/pcweb/pages/about/views/companies.py +++ b/pcweb/pages/about/views/companies.py @@ -1,29 +1,30 @@ import reflex as rx +color_mode = rx.color_mode_cond("light", "dark") COMPANIES = [ { - "src": "/about/companies/y_combinator.svg", + "src": f"/about/companies/{color_mode}/y_combinator.svg", "alt": "Y Combinator", }, { - "src": "/about/companies/abstract.svg", + "src": f"/about/companies/{color_mode}/abstract.svg", "alt": "Abstract", }, { - "src": "/about/companies/outset.svg", + "src": f"/about/companies/{color_mode}/outset.svg", "alt": "Outset", }, { - "src": "/about/companies/picus.svg", - "alt": "Picus Capital", + "src": f"/about/companies/{color_mode}/lux.svg", + "alt": "Lux Capital", }, { - "src": "/about/companies/box_group.svg", + "src": f"/about/companies/{color_mode}/box_group.svg", "alt": "Box Group", }, { - "src": "/about/companies/lux.svg", - "alt": "Lux Capital", + "src": f"/about/companies/{color_mode}/picus.svg", + "alt": "Picus Capital", }, ] @@ -49,19 +50,34 @@ def companies() -> rx.Component: rx.el.p( "Reflex is backed by YC, venture capital firms, and angel investors, including ", rx.el.br(class_name="max-lg:hidden"), - rx.el.b(" Qasar Younis", class_name="text-secondary-12 font-semibold"), + rx.el.b( + " Qasar Younis", + class_name="text-m-slate-12 font-semibold dark:text-m-slate-3", + ), " (Applied Intuition), ", - rx.el.b(" Jack Altman ", class_name="text-secondary-12 font-semibold"), + rx.el.b( + " Jack Altman ", + class_name="text-m-slate-12 font-semibold dark:text-m-slate-3", + ), " (Lattice), ", - rx.el.b(" Paul Copplestone ", class_name="text-secondary-12 font-semibold"), + rx.el.b( + " Paul Copplestone ", + class_name="text-m-slate-12 font-semibold dark:text-m-slate-3", + ), " (Supabase), ", - rx.el.b(" Matt Kraning", class_name="text-secondary-12 font-semibold"), + rx.el.b( + " Matt Kraning", + class_name="text-m-slate-12 font-semibold dark:text-m-slate-3", + ), " (Palo ", rx.el.br(class_name="max-lg:hidden"), " Alto Networks, ", - rx.el.b(" Alfredo Andere ", class_name="text-secondary-12 font-semibold"), + rx.el.b( + " Alfredo Andere ", + class_name="text-m-slate-12 font-semibold dark:text-m-slate-3", + ), " (Latch Bio), and others.", - class_name="text-secondary-11 font-medium text-sm max-w-[45.125rem] text-balance text-center leading-6", + class_name="text-m-slate-8 dark:text-m-slate-6 font-medium text-sm max-w-[45.125rem] text-balance text-center leading-6", ), class_name="flex flex-col gap-8 max-w-[69rem] mx-auto pt-24 justify-center items-center max-lg:px-6", ) diff --git a/pcweb/pages/about/views/divider.py b/pcweb/pages/about/views/divider.py index 34b64e7093..181284ceb0 100644 --- a/pcweb/pages/about/views/divider.py +++ b/pcweb/pages/about/views/divider.py @@ -3,5 +3,5 @@ def divider() -> rx.Component: return rx.el.hr( - class_name="h-[1px] w-full bg-secondary-4", + class_name="h-[1px] w-full bg-m-slate-4 dark:bg-m-slate-10", ) diff --git a/pcweb/pages/about/views/hero.py b/pcweb/pages/about/views/hero.py index 7a3ea07ad1..76c2b17efb 100644 --- a/pcweb/pages/about/views/hero.py +++ b/pcweb/pages/about/views/hero.py @@ -7,7 +7,10 @@ def hero() -> rx.Component: return rx.el.section( rx.el.div( - rx.el.p("About Reflex", class_name="text-sm font-[525] text-primary-10"), + rx.el.p( + "About Reflex", + class_name="text-sm font-[525] text-primary-10 dark:text-m-slate-6", + ), rx.el.h1( "The Operating System ", rx.el.br(class_name="max-lg:hidden"), @@ -29,19 +32,19 @@ def hero() -> rx.Component: "Right now, the ", rx.el.b( "enterprise stack is fragmented and requires multiple tools and roles to ship an app. ", - class_name="font-semibold text-secondary-12", + class_name="font-semibold text-m-slate-12 dark:text-m-slate-3", ), "Teams face organizational bottlenecks at every turn—waiting on infrastructure, coordinating between specialists, juggling disconnected platforms. ", rx.el.b( " This slows everything down ", - class_name="font-semibold text-secondary-12", + class_name="font-semibold text-m-slate-12 dark:text-m-slate-3", ), " and makes building production apps unnecessarily complex.", ), rx.el.p( rx.el.b( "Reflex is the operating system on which enterprises build mission-critical applications. ", - class_name="font-semibold text-secondary-12", + class_name="font-semibold text-m-slate-12 dark:text-m-slate-3", ), "We're the only platform that owns the underlying framework and handles the full lifecycle of your app. Our platform lets teams connect securely with company data, use AI to build standardized apps powered by our open source framework, and deploy with a single click to share with their company.", ), @@ -67,28 +70,28 @@ def hero() -> rx.Component: rx.el.div( rx.el.p( "Alek Petuskey & Nikhil Rao", - class_name="text-sm font-semibold text-secondary-12", + class_name="text-sm font-semibold text-m-slate-12 dark:text-m-slate-3", ), rx.el.span( "Founders", - class_name="text-sm font-[475] text-secondary-11", + class_name="text-sm font-[475] text-m-slate-7 dark:text-m-slate-6", ), class_name="flex flex-col", ), class_name="flex flex-row gap-4", ), - class_name="flex flex-col gap-4 text-base text-secondary-11 font-[475]", + class_name="flex flex-col gap-4 text-base text-m-slate-7 font-[475] dark:text-m-slate-6", ), rx.el.div( - class_name="absolute -top-24 -right-px w-px h-24 bg-gradient-to-b from-transparent to-current text-secondary-4" + class_name="absolute -top-24 -right-px w-px h-24 bg-gradient-to-b from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute -top-24 -left-px w-px h-24 bg-gradient-to-b from-transparent to-current text-secondary-4" + class_name="absolute -top-24 -left-px w-px h-24 bg-gradient-to-b from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute -bottom-px -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + class_name="absolute -bottom-px -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), - class_name="flex flex-col gap-8 lg:p-12 p-6 border border-secondary-4 shadow-[0_6px_16px_0_rgba(0,0,0,0.04)_inset] lg:max-w-[34.5rem] w-full relative", + class_name="flex flex-col gap-8 lg:p-12 p-6 border border-m-slate-4 dark:border-m-slate-10 shadow-[0_6px_16px_0_rgba(0,0,0,0.04)_inset] dark:shadow-none dark:bg-[linear-gradient(212deg,var(--m-slate-12)_0%,var(--m-slate-11)_100%)] lg:max-w-[34.5rem] w-full relative", ), class_name=ui.cn( "flex lg:flex-row flex-col max-w-(--layout-max-width) mx-auto lg:px-24 px-6 overflow-hidden", diff --git a/pcweb/pages/about/views/hiring.py b/pcweb/pages/about/views/hiring.py index 0a8d43bf30..5717668173 100644 --- a/pcweb/pages/about/views/hiring.py +++ b/pcweb/pages/about/views/hiring.py @@ -10,17 +10,17 @@ def hiring() -> rx.Component: rx.el.div( rx.el.p( "We're Hiring", - class_name="text-sm font-[525] text-primary-10 max-lg:text-center", + class_name="text-sm font-[525] text-primary-10 max-lg:text-center dark:text-m-slate-6", ), rx.el.div( rx.el.h1( "Join the team behind the platform trusted by the next generation", - class_name="text-secondary-12 lg:text-4xl text-3xl font-[575]", + class_name="text-m-slate-12 dark:text-m-slate-3 lg:text-4xl text-3xl font-[575]", ), rx.el.div( rx.el.p( "Reflex is growing and we're looking for people who care deeply about developer experience, clean abstractions, and shipping things that matter.", - class_name="text-base text-secondary-11 font-[475]", + class_name="text-base text-m-slate-7 dark:text-m-slate-6 font-[475]", ), rx.el.a( button( @@ -37,17 +37,17 @@ def hiring() -> rx.Component: class_name="flex lg:flex-row flex-col gap-8 lg:gap-36", ), rx.el.div( - class_name="absolute right-0 top-0 w-px h-full bg-gradient-to-b from-transparent to-current text-secondary-4 from-[-20%] to-100%" + class_name="absolute right-0 top-0 w-px h-full bg-gradient-to-b from-transparent to-current text-m-slate-4 dark:text-m-slate-10 from-[-20%] to-100%" ), class_name="relative flex flex-col gap-6 lg:py-24 py-16", ), rx.el.div( - class_name="absolute -bottom-px right-0 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + class_name="absolute -bottom-px right-0 w-24 h-px bg-gradient-to-l from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute -bottom-px left-0 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + class_name="absolute -bottom-px left-0 w-24 h-px bg-gradient-to-r from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), class_name="flex max-w-(--layout-max-width) mx-auto lg:px-24 px-6 max-lg:text-center relative", ), - class_name="bg-gradient-to-b from-white-1 to-secondary-1 w-full", + class_name="bg-gradient-to-b from-white-1 to-m-slate-1 dark:from-m-slate-11 dark:to-m-slate-12 w-full", ) diff --git a/pcweb/pages/about/views/news.py b/pcweb/pages/about/views/news.py index 0372088a3e..4b31b8edad 100644 --- a/pcweb/pages/about/views/news.py +++ b/pcweb/pages/about/views/news.py @@ -12,7 +12,7 @@ def news_item(title: str, date: str, description: str, url: str) -> rx.Component rx.moment( rx.Var.create(date).to(str), format="MMM DD YYYY", - class_name="text-secondary-10 text-xs font-[415] font-mono uppercase", + class_name="text-m-slate-7 dark:text-m-slate-6 text-xs font-[415] font-mono uppercase", ), rx.image( src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_rectangle_xs.svg", @@ -23,9 +23,13 @@ def news_item(title: str, date: str, description: str, url: str) -> rx.Component class_name="flex flex-row items-center lg:gap-6 gap-4 mb-6", ), rx.el.p( - title, class_name="text-secondary-12 text-2xl leading-9 font-semibold mb-4" + title, + class_name="text-m-slate-12 dark:text-m-slate-3 text-2xl leading-9 font-semibold mb-4", + ), + rx.el.p( + description, + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475] mb-6", ), - rx.el.p(description, class_name="text-secondary-11 text-sm font-[475] mb-6"), rx.el.a( button( "Read More", @@ -34,7 +38,7 @@ def news_item(title: str, date: str, description: str, url: str) -> rx.Component ), variant="ghost", size="xs", - class_name="font-[525] w-fit text-secondary-12 px-0", + class_name="font-[525] w-fit text-m-slate-12 dark:text-m-slate-3 px-0", ), to=f"/blog/{url}", class_name="mt-auto w-fit", @@ -49,11 +53,11 @@ def news() -> rx.Component: rx.el.div( ui.icon( "NotificationSquareIcon", - class_name="text-primary-10", + class_name="text-primary-10 dark:text-m-slate-6", ), rx.el.h2( "What's New In Reflex", - class_name="text-primary-10 text-sm font-medium", + class_name="text-primary-10 dark:text-m-slate-6 text-sm font-medium", ), class_name="flex flex-row items-center gap-2", ), @@ -80,5 +84,5 @@ def news() -> rx.Component: ], class_name="grid lg:grid-cols-3 grid-cols-1 gap-12", ), - class_name="flex flex-col gap-12 w-[69rem] max-w-[calc(100vw-3rem)] mx-auto lg:p-12 p-6 rounded-xl bg-secondary-1 backdrop-blur-[16px] shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_12px_24px_0_rgba(0,0,0,0.08),0_1px_1px_0_rgba(0,0,0,0.01),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] lg:mb-36 mb-24 lg:mt-24 mt-10", + class_name="flex flex-col gap-12 w-[69rem] max-w-[calc(100vw-3rem)] mx-auto lg:p-12 p-6 rounded-xl bg-m-slate-1 dark:bg-m-slate-11 backdrop-blur-[16px] shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_12px_24px_0_rgba(0,0,0,0.08),0_1px_1px_0_rgba(0,0,0,0.01),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] dark:shadow-none dark:border-t dark:border-m-slate-9 lg:mb-36 mb-24 lg:mt-24 mt-10", ) diff --git a/pcweb/pages/about/views/square_logo.py b/pcweb/pages/about/views/square_logo.py index df1ea3b104..ea0da102e5 100644 --- a/pcweb/pages/about/views/square_logo.py +++ b/pcweb/pages/about/views/square_logo.py @@ -1,12 +1,23 @@ import reflex as rx +from pcweb.components.logo_reveal import logo_reveal + def square_logo() -> rx.Component: return rx.el.section( - rx.image( - src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_logo.svg", - alt="Square Logo", - loading="lazy", + # Light mode + rx.el.div( + logo_reveal( + grid_bg_src="/common/light/squares_logo.svg", + ), + class_name="dark:hidden", + ), + # Dark mode + rx.el.div( + logo_reveal( + grid_bg_src="/common/dark/squares_logo.svg", + ), + class_name="hidden dark:block", ), - class_name="max-w-(--layout-max-width) w-fullh-auto", + class_name="max-w-(--layout-max-width) w-full h-auto", ) diff --git a/pcweb/pages/about/views/team.py b/pcweb/pages/about/views/team.py index 2ccdb34efc..5563102eab 100644 --- a/pcweb/pages/about/views/team.py +++ b/pcweb/pages/about/views/team.py @@ -22,13 +22,13 @@ def team() -> rx.Component: loading="lazy", class_name="pointer-events-none", ), - class_name="grid lg:grid-cols-2 grid-cols-1 grid-rows-2 gap-2 lg:p-2 lg:border border-secondary-4", + class_name="grid lg:grid-cols-2 grid-cols-1 grid-rows-2 gap-2 lg:p-2 lg:border border-m-slate-4 dark:border-m-slate-10", ), rx.el.div( - class_name="absolute bottom-0 right-0 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + class_name="absolute bottom-0 right-0 w-24 h-px bg-gradient-to-l from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute bottom-0 left-0 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + class_name="absolute bottom-0 left-0 w-24 h-px bg-gradient-to-r from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), class_name="lg:px-24 px-6 max-w-(--layout-max-width) mx-auto relative", ) diff --git a/pcweb/pages/customers/views/footer.py b/pcweb/pages/customers/views/footer.py index 949aa76966..c8c35bf9de 100644 --- a/pcweb/pages/customers/views/footer.py +++ b/pcweb/pages/customers/views/footer.py @@ -177,5 +177,5 @@ def footer_customer() -> rx.Component: news_letter(), class_name="grid grid-cols-1 lg:grid-cols-3 gap-0 grid-rows-2 w-full lg:divide-y divide-slate-3 lg:divide-x border-t border-slate-3", ), - class_name="flex max-w-[64.19rem] justify-center items-center w-full", + class_name="flex max-w-[64.19rem] justify-center items-center w-full mx-auto", ) diff --git a/pcweb/pages/docs_landing/__init__.py b/pcweb/pages/docs_landing/__init__.py index 81252083bb..da56129b2c 100644 --- a/pcweb/pages/docs_landing/__init__.py +++ b/pcweb/pages/docs_landing/__init__.py @@ -11,6 +11,7 @@ other_section, self_hosting_section, ) +from pcweb.pages.framework.views.footer_index import footer_index from pcweb.views.docs_navbar import docs_navbar @@ -36,9 +37,11 @@ def docs_landing() -> rx.Component: hosting_section(), self_hosting_section(), other_section(), + divider(), + footer_index(), class_name="flex flex-col relative justify-center items-center w-full", ), class_name="flex flex-col w-full relative h-full justify-center items-center", ), - class_name="flex flex-col w-full justify-center items-center relative", + class_name="flex flex-col w-full justify-center items-center relative dark:bg-m-slate-12 bg-m-slate-1", ) diff --git a/pcweb/pages/docs_landing/views/ai_builder.py b/pcweb/pages/docs_landing/views/ai_builder.py index 941d62b4ad..ddc3db8f90 100644 --- a/pcweb/pages/docs_landing/views/ai_builder.py +++ b/pcweb/pages/docs_landing/views/ai_builder.py @@ -13,21 +13,24 @@ def card( return rx.el.div( rx.el.span( "Enterprise-only", - class_name="text-secondary-12 text-xs font-medium bg-secondary-1 px-2.5 h-7 absolute top-0 right-0 border-b border-l rounded-bl-lg border-secondary-4 flex justify-center items-center", + class_name="text-m-slate-12 dark:text-m-slate-3 text-xs font-medium bg-m-slate-1 dark:bg-m-slate-11 px-2.5 h-7 absolute top-0 right-0 border-b border-l rounded-bl-lg border-m-slate-4 dark:border-m-slate-9 flex justify-center items-center", ) if enteprise_only else None, rx.el.div( - rx.el.span(title, class_name="text-secondary-12 text-xl font-[575]"), - rx.el.span(description, class_name="text-secondary-11 text-sm font-[475]"), + rx.el.span( + title, + class_name="text-m-slate-12 dark:text-m-slate-3 text-xl font-[575]", + ), + rx.el.span( + description, + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475]", + ), class_name="flex flex-col gap-2 p-8", ), content, rx.el.a(to=href, class_name="absolute inset-0"), - style={ - "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 12px 24px 0 rgba(0, 0, 0, 0.08), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 4px 8px 0 rgba(0, 0, 0, 0.03);", - }, - class_name="flex flex-col bg-white/96 backdrop-blur-[16px] rounded-xl relative cursor-pointer hover:bg-secondary-1 transition-colors overflow-hidden", + class_name="flex flex-col bg-white/96 dark:bg-m-slate-11 backdrop-blur-[16px] rounded-xl relative cursor-pointer transition-colors overflow-hidden shadow-[0_0_0_1px_rgba(0,0,0,0.04),0_12px_24px_0_rgba(0,0,0,0.08),0_1px_1px_0_rgba(0,0,0,0.01),0_4px_8px_0_rgba(0,0,0,0.03)] dark:shadow-none dark:border-t dark:border-m-slate-9", ) @@ -44,7 +47,7 @@ def integration_icon_marquee(integration_name: str) -> rx.Component: ), ui.avatar.fallback( integration_name[0], - class_name="text-secondary-12 text-base font-semibold uppercase size-full", + class_name="text-m-slate-12 dark:text-m-slate-3 text-base font-semibold uppercase size-full", unstyled=True, ), unstyled=True, @@ -61,7 +64,7 @@ def integrations_marquee() -> rx.Component: marquee( *[integration_icon_marquee(name) for name in integration_names], direction="left", - gradient_color="rgba(255, 255, 255, 0.96)", + gradient_color="light-dark(rgba(255, 255, 255, 0.96), var(--m-slate-11))", class_name="h-auto w-full overflow-hidden", gradient_width=65, speed=25, @@ -70,7 +73,7 @@ def integrations_marquee() -> rx.Component: marquee( *[integration_icon_marquee(name) for name in integration_names], direction="right", - gradient_color="rgba(255, 255, 255, 0.96)", + gradient_color="light-dark(rgba(255, 255, 255, 0.96), var(--m-slate-11))", class_name="h-auto w-full overflow-hidden", gradient_width=65, speed=25, @@ -86,11 +89,11 @@ def ai_builder_section() -> rx.Component: rx.el.div( rx.el.h2( "AI Builder", - class_name="text-secondary-12 text-3xl font-[575]", + class_name="text-m-slate-12 dark:text-m-slate-3 text-3xl font-[575]", ), rx.el.p( "Learn how to build applications with Reflex AI.", - class_name="text-secondary-11 text-sm font-[475]", + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475]", ), class_name="flex flex-col gap-4", ), @@ -113,7 +116,7 @@ def ai_builder_section() -> rx.Component: card( title="MCP", description="The Reflex Model Context Protocol (MCP) provides AI assistants and coding tools with structured access to Reflex documentation and component information.", - content="WIP", + content=None, href=ai_builder_pages.integrations.mcp_overview.path, enteprise_only=True, ), @@ -121,5 +124,5 @@ def ai_builder_section() -> rx.Component: ), class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto", ), - class_name="bg-gradient-to-b from-white-1 to-secondary-1 w-full lg:pt-24 lg:mb-24 mb-10 max-lg:px-6 max-lg:pt-10", + class_name="bg-gradient-to-b from-white-1 to-m-slate-1 dark:from-m-slate-11 dark:to-m-slate-12 w-full lg:pt-24 lg:pb-24 pb-10 max-lg:px-6 max-lg:pt-10", ) diff --git a/pcweb/pages/docs_landing/views/divider.py b/pcweb/pages/docs_landing/views/divider.py index 34b64e7093..181284ceb0 100644 --- a/pcweb/pages/docs_landing/views/divider.py +++ b/pcweb/pages/docs_landing/views/divider.py @@ -3,5 +3,5 @@ def divider() -> rx.Component: return rx.el.hr( - class_name="h-[1px] w-full bg-secondary-4", + class_name="h-[1px] w-full bg-m-slate-4 dark:bg-m-slate-10", ) diff --git a/pcweb/pages/docs_landing/views/framework.py b/pcweb/pages/docs_landing/views/framework.py index 626920258b..297fc186a7 100644 --- a/pcweb/pages/docs_landing/views/framework.py +++ b/pcweb/pages/docs_landing/views/framework.py @@ -12,26 +12,33 @@ def docs_item( ) -> rx.Component: return rx.el.div( rx.el.div( - ui.icon(icon, class_name="size-6", stroke_width=1.5), + ui.icon( + icon, + class_name="size-6 group-hover:text-primary-10 group-hover:dark:text-m-slate-5", + stroke_width=1.5, + ), rx.el.span( title, - class_name="text-secondary-12 text-xl font-[575] group-hover:text-primary-10", + class_name="text-m-slate-12 dark:text-m-slate-3 text-xl font-[575] group-hover:text-primary-10 group-hover:dark:text-m-slate-5", ), rx.el.div( "Enterprise-only", - class_name="text-secondary-12 text-xs font-medium bg-secondary-1 px-2.5 h-7 border-b border rounded-lg border-secondary-4 flex justify-center items-center ml-1", + class_name="text-m-slate-12 dark:text-m-slate-3 text-xs font-medium bg-m-slate-1 dark:bg-m-slate-11 px-2.5 h-7 border-b border rounded-lg border-m-slate-4 dark:border-m-slate-10 flex justify-center items-center ml-1", ) if enterprise_only else None, ui.icon( "ArrowRight01Icon", - class_name="size-4 ml-auto group-hover:text-primary-10", + class_name="size-4 ml-auto group-hover:text-primary-10 group-hover:dark:text-m-slate-5", ), class_name="flex row items-center gap-3 h-8", ), - rx.el.p(description, class_name="text-secondary-11 text-sm font-[475]"), + rx.el.p( + description, + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475]", + ), rx.el.a(to=href, class_name="absolute inset-0"), - class_name="flex flex-col gap-2 py-8 pr-8 relative group lg:max-w-[21rem] w-full max-lg:text-start", + class_name="flex flex-col gap-2 py-8 pr-8 relative group lg:max-w-[21rem] w-full max-lg:text-start hover:bg-[linear-gradient(243deg,var(--m-slate-2,#F6F7F9)_0%,var(--m-slate-1, #FCFCFD)_100%)] dark:hover:bg-[linear-gradient(243deg,var(--m-slate-11,#1D2025)_0%,var(--m-slate-12,#151618)_63.63%)]", ) @@ -67,7 +74,7 @@ def component_link(name: str, href: str) -> rx.Component: ui.icon("ArrowRight01Icon", class_name="ml-auto"), variant="ghost", size="xs", - class_name="font-[525] w-full text-secondary-12 px-0", + class_name="font-[525] w-full text-m-slate-12 dark:text-m-slate-3 px-0", ), to=f"/docs/library/{href.strip('/')}", class_name="w-full", @@ -81,20 +88,20 @@ def components_section() -> rx.Component: ui.icon("MenuSquareIcon", class_name="size-6", stroke_width=1.5), rx.el.span( "Component Library", - class_name="text-secondary-12 text-xl font-[575] group-hover:text-primary-10", + class_name="text-m-slate-12 dark:text-m-slate-3 text-xl font-[575] group-hover:text-primary-10", ), class_name="flex row items-center gap-3 h-8", ), rx.el.p( "Build your app with our comprehensive collection of UI components and features.", - class_name="text-secondary-11 text-sm font-[475] max-w-[16.5rem]", + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475] max-w-[16.5rem]", ), rx.el.a( button( "Browse All Components", variant="outline", native_button=False, - class_name="font-[525] w-fit text-secondary-12", + class_name="font-[525] w-fit text-m-slate-12 dark:text-m-slate-3", ), to=library.path, class_name="w-fit mt-4", @@ -132,7 +139,7 @@ def components_section() -> rx.Component: ), class_name="grid grid-cols-1 lg:grid-cols-2 lg:gap-28 gap-10 mt-auto", ), - class_name="flex flex-col gap-4 lg:px-8 pt-8 max-lg:pr-8 pb-6 h-auto w-full flex-1 border-r border-secondary-4 border-y", + class_name="flex flex-col gap-4 lg:px-8 pt-8 max-lg:pr-8 pb-6 h-auto w-full flex-1 border-r border-m-slate-4 dark:border-m-slate-10 border-y", ) @@ -144,7 +151,7 @@ def squares_divider() -> rx.Component: loading="lazy", class_name="pointer-events-none w-auto h-full", ), - class_name="flex p-4.5 h-auto border-r border-y border-secondary-4 max-lg:hidden", + class_name="flex p-4.5 h-auto border-r border-y border-m-slate-4 dark:border-m-slate-10 max-lg:hidden", ) @@ -153,26 +160,26 @@ def framework() -> rx.Component: rx.el.div( rx.el.h2( "Framework", - class_name="text-secondary-12 text-3xl font-[575]", + class_name="text-m-slate-12 dark:text-m-slate-3 text-3xl font-[575]", ), rx.el.p( "Learn how to build applications with Reflex Framework.", - class_name="text-secondary-11 text-sm font-[475]", + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475]", ), class_name="flex flex-col gap-4", ), rx.el.div( rx.el.div( - class_name="absolute bottom-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + class_name="absolute bottom-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute top-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + class_name="absolute top-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute bottom-0 -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + class_name="absolute bottom-0 -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute right-0 -top-24 h-24 w-px bg-gradient-to-b from-transparent to-current text-secondary-4" + class_name="absolute right-0 -top-24 h-24 w-px bg-gradient-to-b from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), links_section(), squares_divider(), diff --git a/pcweb/pages/docs_landing/views/hero.py b/pcweb/pages/docs_landing/views/hero.py index da2085da95..90f8099d9d 100644 --- a/pcweb/pages/docs_landing/views/hero.py +++ b/pcweb/pages/docs_landing/views/hero.py @@ -9,16 +9,19 @@ def hero() -> rx.Component: return rx.el.section( rx.el.div( - rx.el.p("About Reflex", class_name="text-sm font-[525] text-primary-10"), + rx.el.p( + "About Reflex", + class_name="text-sm font-[525] text-m-slate-10 dark:text-m-slate-6", + ), rx.el.h1( "Reflex Documentation", - class_name="text-secondary-12 lg:text-5xl text-3xl font-[575] lg:text-nowrap", + class_name="text-m-slate-12 dark:text-m-slate-3 lg:text-5xl text-3xl font-[575] lg:text-nowrap", ), rx.el.p( "Get up and running with Reflex in minutes. A complete set ", rx.el.br(class_name="max-lg:hidden"), " of resources to build, deploy, and scale your application. ", - class_name="text-base text-secondary-11 font-[475]", + class_name="text-base text-m-slate-7 dark:text-m-slate-6 font-[475]", ), rx.el.a( button( diff --git a/pcweb/pages/docs_landing/views/hosting.py b/pcweb/pages/docs_landing/views/hosting.py index 79a10a44b6..0f91520fd4 100644 --- a/pcweb/pages/docs_landing/views/hosting.py +++ b/pcweb/pages/docs_landing/views/hosting.py @@ -9,11 +9,11 @@ def hosting_section() -> rx.Component: rx.el.div( rx.el.h2( "Cloud", - class_name="text-secondary-12 text-3xl font-[575]", + class_name="text-m-slate-12 dark:text-m-slate-3 text-3xl font-[575]", ), rx.el.p( "Learn how to host your applications with Reflex Hosting.", - class_name="text-secondary-11 text-sm font-[475]", + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475]", ), class_name="flex flex-col gap-4", ), @@ -45,7 +45,7 @@ def hosting_section() -> rx.Component: hosting_page.deploy_quick_start.path, has_padding_left=True, ), - class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-secondary-4 relative", + class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-m-slate-4 dark:border-m-slate-10 relative", ), class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 overflow-hidden", ) diff --git a/pcweb/pages/docs_landing/views/link_item.py b/pcweb/pages/docs_landing/views/link_item.py index 4ab4412a36..f6a5022592 100644 --- a/pcweb/pages/docs_landing/views/link_item.py +++ b/pcweb/pages/docs_landing/views/link_item.py @@ -5,16 +5,16 @@ def faded_borders() -> rx.Component: return rx.fragment( rx.el.div( - class_name="absolute bottom-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + class_name="absolute bottom-0 -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute -top-px -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-secondary-4" + class_name="absolute -top-px -left-24 w-24 h-px bg-gradient-to-r from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute bottom-0 -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-secondary-4" + class_name="absolute bottom-0 -right-24 w-24 h-px bg-gradient-to-l from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), rx.el.div( - class_name="absolute right-0 -top-24 h-24 w-px bg-gradient-to-b from-transparent to-current text-secondary-4" + class_name="absolute right-0 -top-24 h-24 w-px bg-gradient-to-b from-transparent to-current text-m-slate-4 dark:text-m-slate-10" ), ) @@ -24,23 +24,28 @@ def link_item( ) -> rx.Component: return rx.el.div( rx.el.div( - ui.icon(icon, class_name="size-6 shrink-0", stroke_width=1.5), + ui.icon( + icon, + class_name="size-6 shrink-0 group-hover:text-primary-10 group-hover:dark:text-m-slate-5", + stroke_width=1.5, + ), rx.el.span( title, - class_name="text-secondary-12 text-xl font-[575] group-hover:text-primary-10", + class_name="text-m-slate-12 dark:text-m-slate-3 text-xl font-[575] group-hover:text-primary-10 group-hover:dark:text-m-slate-5", ), ui.icon( "ArrowRight01Icon", - class_name="size-4 ml-auto group-hover:text-primary-10 shrink-0", + class_name="size-4 ml-auto group-hover:text-primary-10 group-hover:dark:text-m-slate-5 shrink-0", ), class_name="flex flex-row gap-3 items-center max-lg:text-start", ), rx.el.span( - description, class_name="text-secondary-11 text-sm font-[475] text-start" + description, + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475] text-start", ), rx.el.a(to=href, class_name="absolute inset-0"), class_name=ui.cn( - "flex flex-col gap-2 pr-8 py-8 group border-r border-b border-secondary-4 relative max-lg:p-6", + "flex flex-col gap-2 pr-8 py-8 group border-r border-b border-m-slate-4 dark:border-m-slate-10 relative max-lg:p-6 hover:bg-[linear-gradient(243deg,var(--m-slate-2,#F6F7F9)_0%,var(--m-slate-1, #FCFCFD)_100%)] dark:hover:bg-[linear-gradient(243deg,var(--m-slate-11,#1D2025)_0%,var(--m-slate-12,#151618)_63.63%)]", "lg:pl-8 pl-6" if has_padding_left else "", ), ) diff --git a/pcweb/pages/framework/views/footer_index.py b/pcweb/pages/framework/views/footer_index.py index c184e0e5ed..ddc411d557 100644 --- a/pcweb/pages/framework/views/footer_index.py +++ b/pcweb/pages/framework/views/footer_index.py @@ -205,5 +205,5 @@ def footer_index() -> rx.Component: newsletter(), class_name="grid grid-cols-1 lg:grid-cols-3 gap-0 grid-rows-2 w-full divide-y divide-slate-3 lg:divide-x border-t border-slate-3 lg:border-t-0", ), - class_name="flex max-w-[64.19rem] justify-center items-center w-full", + class_name="flex max-w-[64.19rem] justify-center items-center w-full mx-auto", ) diff --git a/pcweb/views/docs_navbar.py b/pcweb/views/docs_navbar.py index f5ac35dae8..662582264d 100644 --- a/pcweb/views/docs_navbar.py +++ b/pcweb/views/docs_navbar.py @@ -151,7 +151,7 @@ def docs_navbar() -> rx.Component: navigation_menu(), class_name="relative flex w-full items-center h-full justify-between gap-6 mx-auto flex-row max-w-[108rem]", ), - class_name="w-full max-full h-[4.5rem] mx-auto flex flex-row items-center lg:px-16 px-6 backdrop-blur-[16px] shadow-[0_-2px_2px_1px_rgba(0,0,0,0.02),0_1px_1px_0_rgba(0,0,0,0.08),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] bg-gradient-to-b from-white-1 to-secondary-1", + class_name="w-full max-full h-[4.5rem] mx-auto flex flex-row items-center lg:px-16 px-6 backdrop-blur-[16px] shadow-[0_-2px_2px_1px_rgba(0,0,0,0.02),0_1px_1px_0_rgba(0,0,0,0.08),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] dark:shadow-none dark:border-b dark:border-m-slate-10 bg-gradient-to-b from-[light-dark(#FFF,var(--m-slate-11))] to-[light-dark(var(--m-slate-1),var(--m-slate-12))]", ), class_name="flex flex-col w-full top-0 z-[9999] fixed self-center", ) diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py index c21fe0d6fe..7ac5d1ae60 100644 --- a/pcweb/views/marketing_navbar.py +++ b/pcweb/views/marketing_navbar.py @@ -51,7 +51,7 @@ def logos_carousel() -> rx.Component: return marquee( *[social_proof_card(logo) for logo in logos], direction="left", - gradient_color="var(--secondary-1)", + gradient_color="light-dark(var(--m-slate-1), var(--m-slate-12))", class_name="h-[1.625rem] w-full overflow-hidden mt-auto", gradient_width=65, speed=25, @@ -157,25 +157,29 @@ def platform_content() -> rx.Component: rx.el.div( rx.el.div( rx.el.div( - rx.el.span( - "AI Builder", - class_name="text-secondary-12 text-lg font-semibold mb-2", + rx.el.div( + rx.el.span( + "AI Builder", + class_name="text-secondary-12 text-lg font-semibold mb-2", + ), + rx.el.span( + "Build production-ready web apps for your team in seconds with AI-powered code generation.", + class_name="text-secondary-11 text-sm font-medium", + ), + class_name="p-4 flex flex-col relative hover-card-shadow rounded-md", ), - rx.el.span( - "Build production-ready web apps for your team in seconds with AI-powered code generation.", - class_name="text-secondary-11 text-sm font-medium", + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/ai_builder_pattern.svg", + alt="AI Builder Navbar Pattern", ), rx.el.a( class_name="absolute inset-0", to=REFLEX_BUILD_URL, target="_blank", ), - class_name="p-4 flex flex-col relative hover-card-shadow rounded-md", + class_name="relative flex flex-col hover-card-shadow rounded-md", ), - style={ - "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset", - }, - class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full", + class_name="p-4 flex flex-col rounded-xl bg-white-1 dark:bg-m-slate-11 h-full shadow-card dark:shadow-card-dark dark:border-r dark:border-m-slate-9 ", ), rx.el.div( platform_item( @@ -215,11 +219,11 @@ def solutions_item(title: str, icon: str, href: str) -> rx.Component: return rx.el.a( ui.icon( icon, - class_name="shrink-0 text-secondary-11 size-4.5", + class_name="shrink-0 text-m-slate-7 dark:text-m-slate-6 size-4.5", ), title, to=href, - class_name="flex flex-row px-4 py-2 rounded-sm text-sm font-[525] text-secondary-12 gap-3 items-center justify-start cursor-pointer hover-card-shadow", + class_name="flex flex-row px-4 py-2 rounded-sm text-sm font-[525] text-m-slate-12 dark:text-m-slate-3 gap-3 items-center justify-start cursor-pointer hover-card-shadow", ) @@ -228,7 +232,7 @@ def solutions_column(title: str, items: list[tuple[str, str, str]]) -> rx.Compon rx.el.div( rx.el.span( title, - class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-secondary-8", + class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-m-slate-8 dark:text-m-slate-6", ), class_name="px-4 pt-4 flex flex-col", ), @@ -246,24 +250,24 @@ def customers_column() -> rx.Component: rx.el.div( rx.el.span( "Customers", - class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-secondary-8", + class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-m-slate-8 dark:text-m-slate-6", ), class_name="px-4 pt-4 flex flex-col", ), rx.el.div( rx.el.span( "Read Stories How Teams Use Reflex", - class_name="text-secondary-12 text-lg font-[575]", + class_name="text-m-slate-12 dark:text-m-slate-3 text-lg font-[575]", ), rx.el.span( "Discover how companies build internal tools, AI apps, and production dashboards in pure Python.", - class_name="text-secondary-11 text-sm font-[475]", + class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475]", ), logos_carousel(), class_name="flex flex-col gap-2 px-4 pb-4 h-full", ), rx.el.a(class_name="absolute inset-0", to=customers.path), - class_name="flex flex-col gap-6 hover-card-shadow rounded-lg relative h-full", + class_name="flex flex-col gap-6 hover-card-shadow rounded-lg relative h-full hover:[--m-slate-12:var(--m-slate-11)]", ), class_name="p-4 block", ) @@ -307,10 +311,7 @@ def solutions_content() -> rx.Component: ), class_name="grid grid-cols-2", ), - class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full w-[28rem]", - style={ - "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset", - }, + class_name="p-4 flex flex-col rounded-xl bg-white-1 dark:bg-m-slate-11 h-full w-[28rem] shadow-card dark:shadow-card-dark dark:border-r dark:border-m-slate-9", ), rx.el.div( solutions_column( @@ -355,10 +356,7 @@ def resources_content() -> rx.Component: ("FAQ", "HelpSquareIcon", faq.path), ], ), - class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full", - style={ - "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset", - }, + class_name="p-4 flex flex-col rounded-xl bg-white-1 dark:bg-m-slate-11 h-full shadow-card dark:shadow-card-dark dark:border-r dark:border-m-slate-9", ), customers_column(), class_name="w-[35rem] grid grid-cols-2", @@ -372,10 +370,7 @@ def about_content() -> rx.Component: rx.el.div( solutions_item("Company", "Profile02Icon", "/about"), solutions_item("Careers", "WorkIcon", JOBS_BOARD_URL), - class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full", - style={ - "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.04), 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset", - }, + class_name="p-4 flex flex-col rounded-xl bg-white-1 h-full dark:shadow-none dark:border dark:border-m-slate-9 dark:bg-m-slate-11 shadow-card", ), class_name="w-[12.5rem]", ), @@ -464,10 +459,7 @@ def navigation_menu() -> rx.Component: ui.navigation_menu.popup( ui.navigation_menu.viewport(), unstyled=True, - class_name="relative h-[var(--popup-height)] w-max origin-[var(--transform-origin)] transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0 min-[500px]:w-[var(--popup-width)] xs:w-[var(--popup-width)] rounded-xl bg-secondary-1 overflow-hidden", - style={ - "box-shadow": "0 0 0 1px rgba(0, 0, 0, 0.03), 0 -1px 1px 0 rgba(0, 0, 0, 0.04), 0 16px 32px 0 rgba(0, 0, 0, 0.08), 0 1px 1px 0 rgba(0, 0, 0, 0.08), 0 4px 8px 0 rgba(0, 0, 0, 0.03);", - }, + class_name="relative h-[var(--popup-height)] w-max origin-[var(--transform-origin)] transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0 min-[500px]:w-[var(--popup-width)] xs:w-[var(--popup-width)] rounded-xl bg-m-slate-1 dark:bg-m-slate-12 overflow-hidden navbar-shadow", ), side_offset=30, align="start", @@ -488,7 +480,7 @@ def marketing_navbar() -> rx.Component: rx.el.header( logo(), navigation_menu(), - class_name="w-full max-w-[71.5rem] h-[4.5rem] mx-auto flex flex-row items-center p-5 rounded-b-xl backdrop-blur-[16px] shadow-[0_-2px_2px_1px_rgba(0,0,0,0.02),0_1px_1px_0_rgba(0,0,0,0.08),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] bg-gradient-to-b from-white-1 to-secondary-1", + class_name="w-full max-w-[71.5rem] h-[4.5rem] mx-auto flex flex-row items-center p-5 rounded-b-xl backdrop-blur-[16px] shadow-[0_-2px_2px_1px_rgba(0,0,0,0.02),0_1px_1px_0_rgba(0,0,0,0.08),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] dark:shadow-none dark:border-x dark:border-b dark:border-m-slate-10 bg-gradient-to-b from-[light-dark(#FFF,var(--m-slate-11))] to-[light-dark(var(--m-slate-1),var(--m-slate-12))]", ), class_name="flex flex-col w-full top-0 z-[9999] fixed self-center", ) From 4e6266e90bf81f7385f2b9728cef63361859e381 Mon Sep 17 00:00:00 2001 From: Carlos Date: Fri, 13 Feb 2026 17:06:24 +0100 Subject: [PATCH 04/15] more stuff --- assets/common/dark/ai_builder_pattern.svg | 145 +++++-------- assets/common/light/ai_builder_pattern.svg | 211 +++++++------------ assets/companies/dark/agricole_small.svg | 1 + assets/companies/dark/ford_small.svg | 1 + assets/companies/dark/man_small.svg | 1 + assets/companies/dark/red_hat_small.svg | 1 + assets/companies/dark/shell_small.svg | 1 + assets/companies/dark/unicef_small.svg | 1 + assets/companies/dark/world_small.svg | 3 + assets/companies/light/agricole_small.svg | 1 + assets/companies/light/ford_small.svg | 1 + assets/companies/light/man_small.svg | 1 + assets/companies/light/red_hat_small.svg | 1 + assets/companies/light/shell_small.svg | 1 + assets/companies/light/unicef_small.svg | 1 + assets/companies/light/world_small.svg | 3 + assets/docs/dark/getting_started.svg | 89 ++++---- assets/tailwind-theme.css | 8 +- pcweb/pages/docs_landing/views/ai_builder.py | 2 +- pcweb/views/marketing_navbar.py | 57 ++++- 20 files changed, 251 insertions(+), 279 deletions(-) create mode 100644 assets/companies/dark/agricole_small.svg create mode 100644 assets/companies/dark/ford_small.svg create mode 100644 assets/companies/dark/man_small.svg create mode 100644 assets/companies/dark/red_hat_small.svg create mode 100644 assets/companies/dark/shell_small.svg create mode 100644 assets/companies/dark/unicef_small.svg create mode 100644 assets/companies/dark/world_small.svg create mode 100644 assets/companies/light/agricole_small.svg create mode 100644 assets/companies/light/ford_small.svg create mode 100644 assets/companies/light/man_small.svg create mode 100644 assets/companies/light/red_hat_small.svg create mode 100644 assets/companies/light/shell_small.svg create mode 100644 assets/companies/light/unicef_small.svg create mode 100644 assets/companies/light/world_small.svg diff --git a/assets/common/dark/ai_builder_pattern.svg b/assets/common/dark/ai_builder_pattern.svg index 44ac3fd99b..956d589c2c 100644 --- a/assets/common/dark/ai_builder_pattern.svg +++ b/assets/common/dark/ai_builder_pattern.svg @@ -1,52 +1,20 @@ - - + + - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + @@ -59,82 +27,65 @@ - + - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + - + + + + + + + + + + + + + + + + + - + - + - + + + + + diff --git a/assets/common/light/ai_builder_pattern.svg b/assets/common/light/ai_builder_pattern.svg index c21ff87d0d..0074491b84 100644 --- a/assets/common/light/ai_builder_pattern.svg +++ b/assets/common/light/ai_builder_pattern.svg @@ -1,61 +1,29 @@ - - + + - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + @@ -64,174 +32,157 @@ - - + + - - - - - - - - - - - + + + - - + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - - + + - + - + - + - + - - + + - + - + - + - - - - - - - + + - - - - - - - + - + + + + + + + + + - + + + + + + + + + + + + + + + + + - + - + - + - + + + + + - + diff --git a/assets/companies/dark/agricole_small.svg b/assets/companies/dark/agricole_small.svg new file mode 100644 index 0000000000..d5b7a7eb6a --- /dev/null +++ b/assets/companies/dark/agricole_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/ford_small.svg b/assets/companies/dark/ford_small.svg new file mode 100644 index 0000000000..01a4294d7c --- /dev/null +++ b/assets/companies/dark/ford_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/man_small.svg b/assets/companies/dark/man_small.svg new file mode 100644 index 0000000000..09e0fe3e3c --- /dev/null +++ b/assets/companies/dark/man_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/red_hat_small.svg b/assets/companies/dark/red_hat_small.svg new file mode 100644 index 0000000000..f58b06293e --- /dev/null +++ b/assets/companies/dark/red_hat_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/shell_small.svg b/assets/companies/dark/shell_small.svg new file mode 100644 index 0000000000..1f99a0930a --- /dev/null +++ b/assets/companies/dark/shell_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/unicef_small.svg b/assets/companies/dark/unicef_small.svg new file mode 100644 index 0000000000..f5af4c2db5 --- /dev/null +++ b/assets/companies/dark/unicef_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/dark/world_small.svg b/assets/companies/dark/world_small.svg new file mode 100644 index 0000000000..c6c8fe1031 --- /dev/null +++ b/assets/companies/dark/world_small.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/companies/light/agricole_small.svg b/assets/companies/light/agricole_small.svg new file mode 100644 index 0000000000..b5f2d2e7e7 --- /dev/null +++ b/assets/companies/light/agricole_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/ford_small.svg b/assets/companies/light/ford_small.svg new file mode 100644 index 0000000000..783ad49f55 --- /dev/null +++ b/assets/companies/light/ford_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/man_small.svg b/assets/companies/light/man_small.svg new file mode 100644 index 0000000000..28b92eaf2a --- /dev/null +++ b/assets/companies/light/man_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/red_hat_small.svg b/assets/companies/light/red_hat_small.svg new file mode 100644 index 0000000000..3351ea0dc9 --- /dev/null +++ b/assets/companies/light/red_hat_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/shell_small.svg b/assets/companies/light/shell_small.svg new file mode 100644 index 0000000000..3bb39a4a09 --- /dev/null +++ b/assets/companies/light/shell_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/unicef_small.svg b/assets/companies/light/unicef_small.svg new file mode 100644 index 0000000000..ad0d79d178 --- /dev/null +++ b/assets/companies/light/unicef_small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/companies/light/world_small.svg b/assets/companies/light/world_small.svg new file mode 100644 index 0000000000..25f6e49af4 --- /dev/null +++ b/assets/companies/light/world_small.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/docs/dark/getting_started.svg b/assets/docs/dark/getting_started.svg index 5b1b13dc1d..7828777b52 100644 --- a/assets/docs/dark/getting_started.svg +++ b/assets/docs/dark/getting_started.svg @@ -1,6 +1,10 @@ - - + + + + + + @@ -61,24 +65,24 @@ - + - + - - + + - + - - - + + + @@ -170,24 +174,24 @@ - + - + - - + + - + - - - + + + @@ -310,24 +314,25 @@ - + - + - - + + - + - + + - + @@ -335,19 +340,19 @@ - + - + - + - + @@ -355,19 +360,19 @@ - + - + - + - + @@ -375,25 +380,31 @@ - + - + - + - + + + + + + + - + - + diff --git a/assets/tailwind-theme.css b/assets/tailwind-theme.css index aa40be56c6..f181f0183d 100644 --- a/assets/tailwind-theme.css +++ b/assets/tailwind-theme.css @@ -1119,8 +1119,8 @@ 0 4px 8px 0 rgba(0, 0, 0, 0.07), 0 1px 1px 0 rgba(0, 0, 0, 0.01), 0 0 0 1px #FFF inset; - --shadow-card-dark: 0 0 0 1px var(--m-slate-9, #2A3037), - --text-xs: 0.75rem; + --shadow-card-dark: 0 0 0 1px var(--m-slate-9, #2A3037); + --text-xs: 0.75rem; --text-xs--line-height: 1rem; --text-sm: 0.875rem; --text-sm--line-height: 1.5rem; @@ -1770,8 +1770,8 @@ } :where(.dark, .dark *) .hover-card-shadow:hover { - background: var(--m-slate-11, #1D2025); - box-shadow: 0 0 0 1px var(--m-slate-10, #21252B); + background: var(--m-slate-10, #21252B); + box-shadow: 0 0 0 1px var(--m-slate-9, #2A3037); } .navbar-shadow { diff --git a/pcweb/pages/docs_landing/views/ai_builder.py b/pcweb/pages/docs_landing/views/ai_builder.py index ddc3db8f90..2de25fa4ea 100644 --- a/pcweb/pages/docs_landing/views/ai_builder.py +++ b/pcweb/pages/docs_landing/views/ai_builder.py @@ -62,7 +62,7 @@ def integrations_marquee() -> rx.Component: ] return rx.el.div( marquee( - *[integration_icon_marquee(name) for name in integration_names], + *[integration_icon_marquee(name) for name in reversed(integration_names)], direction="left", gradient_color="light-dark(rgba(255, 255, 255, 0.96), var(--m-slate-11))", class_name="h-auto w-full overflow-hidden", diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py index 7ac5d1ae60..334c01b651 100644 --- a/pcweb/views/marketing_navbar.py +++ b/pcweb/views/marketing_navbar.py @@ -15,6 +15,8 @@ JOBS_BOARD_URL, REFLEX_BUILD_URL, ) +from pcweb.pages.blog import blogs +from pcweb.pages.blog.paths import blog_data from pcweb.pages.customers.landing import customers from pcweb.pages.docs import ai_builder from pcweb.pages.faq import faq @@ -42,16 +44,22 @@ def social_proof_card(image: str) -> rx.Component: def logos_carousel() -> rx.Component: logos = [ - "apple", + "agricole", + "man", + "shell", + "red_hat", "accenture", "dell", "microsoft", + "world", + "ford", + "unicef", "nike", ] return marquee( *[social_proof_card(logo) for logo in logos], direction="left", - gradient_color="light-dark(var(--m-slate-1), var(--m-slate-12))", + gradient_color="light-dark(var(--m-slate-1), var(--m-slate-11))", class_name="h-[1.625rem] w-full overflow-hidden mt-auto", gradient_width=65, speed=25, @@ -179,7 +187,7 @@ def platform_content() -> rx.Component: ), class_name="relative flex flex-col hover-card-shadow rounded-md", ), - class_name="p-4 flex flex-col rounded-xl bg-white-1 dark:bg-m-slate-11 h-full shadow-card dark:shadow-card-dark dark:border-r dark:border-m-slate-9 ", + class_name="p-4 flex flex-col rounded-xl bg-white-1 dark:bg-m-slate-11 h-full shadow-card dark:shadow-card-dark dark:border-r dark:border-m-slate-9", ), rx.el.div( platform_item( @@ -244,6 +252,35 @@ def solutions_column(title: str, items: list[tuple[str, str, str]]) -> rx.Compon ) +def blog_column() -> rx.Component: + return rx.el.div( + rx.el.div( + rx.el.span( + "Blog", + class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-m-slate-8 dark:text-m-slate-6", + ), + class_name="flex flex-col", + ), + rx.el.a( + next(iter(blog_data.values())).metadata["title"], + to=f"/blog/{next(iter(blog_data.keys()))}", + class_name="dark:text-m-slate-3 text-m-slate-12 text-sm font-[525] flex items-center justify-start gap-2 hover:text-primary-10 dark:hover:text-primary-9 line-clamp-3", + ), + rx.el.a( + list(blog_data.values())[1].metadata["title"], + to=f"/blog/{list(blog_data.keys())[1]}", + class_name="dark:text-m-slate-3 text-m-slate-12 text-sm font-[525] flex items-center justify-start gap-2 hover:text-primary-10 dark:hover:text-primary-9 line-clamp-3", + ), + rx.el.a( + "All Posts", + ui.icon("ArrowRight01Icon", class_name="ml-auto"), + to=blogs.path, + class_name="dark:text-m-slate-3 text-m-slate-12 text-sm font-[525] h-10 flex items-center justify-start gap-2 hover:text-primary-10 dark:hover:text-primary-9 mt-auto", + ), + class_name="flex flex-col gap-6 p-4 h-full", + ) + + def customers_column() -> rx.Component: return rx.el.div( rx.el.div( @@ -267,9 +304,9 @@ def customers_column() -> rx.Component: class_name="flex flex-col gap-2 px-4 pb-4 h-full", ), rx.el.a(class_name="absolute inset-0", to=customers.path), - class_name="flex flex-col gap-6 hover-card-shadow rounded-lg relative h-full hover:[--m-slate-12:var(--m-slate-11)]", + class_name="flex flex-col gap-6 hover-card-shadow rounded-lg relative h-full hover:[--m-slate-11:var(--m-slate-10)] hover:shadow-card dark:hover:shadow-card-dark", ), - class_name="p-4 block", + class_name="p-4 block rounded-lg shadow-card dark:shadow-card-dark z-[1] bg-white-1 dark:bg-m-slate-11 dark:border-x dark:border-m-slate-9", ) @@ -356,10 +393,14 @@ def resources_content() -> rx.Component: ("FAQ", "HelpSquareIcon", faq.path), ], ), - class_name="p-4 flex flex-col rounded-xl bg-white-1 dark:bg-m-slate-11 h-full shadow-card dark:shadow-card-dark dark:border-r dark:border-m-slate-9", + class_name="p-4 flex flex-col rounded-xl bg-m-slate-1 dark:bg-m-slate-12 h-full", ), customers_column(), - class_name="w-[35rem] grid grid-cols-2", + rx.el.div( + blog_column(), + class_name="p-4 flex flex-col h-full bg-m-slate-1 dark:bg-m-slate-12", + ), + class_name="w-[52.5rem] grid grid-cols-3", ), ) @@ -480,7 +521,7 @@ def marketing_navbar() -> rx.Component: rx.el.header( logo(), navigation_menu(), - class_name="w-full max-w-[71.5rem] h-[4.5rem] mx-auto flex flex-row items-center p-5 rounded-b-xl backdrop-blur-[16px] shadow-[0_-2px_2px_1px_rgba(0,0,0,0.02),0_1px_1px_0_rgba(0,0,0,0.08),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] dark:shadow-none dark:border-x dark:border-b dark:border-m-slate-10 bg-gradient-to-b from-[light-dark(#FFF,var(--m-slate-11))] to-[light-dark(var(--m-slate-1),var(--m-slate-12))]", + class_name="w-full max-w-[71.5rem] h-[4.5rem] mx-auto flex flex-row items-center p-5 rounded-b-xl backdrop-blur-[16px] shadow-[0_-2px_2px_1px_rgba(0,0,0,0.02),0_1px_1px_0_rgba(0,0,0,0.08),0_4px_8px_0_rgba(0,0,0,0.03),0_0_0_1px_#FFF_inset] dark:shadow-none dark:border-x dark:border-b dark:border-m-slate-10 bg-gradient-to-b from-white to-m-slate-1 dark:from-m-slate-11 dark:to-m-slate-12", ), class_name="flex flex-col w-full top-0 z-[9999] fixed self-center", ) From 57aaf8f969197072beca74b1affa07c662963074 Mon Sep 17 00:00:00 2001 From: Carlos Date: Fri, 13 Feb 2026 17:23:28 +0100 Subject: [PATCH 05/15] fix css --- assets/components/GradientButton.tsx | 6 +++--- assets/tailwind-theme.css | 5 +---- pcweb/components/marketing_button.py | 2 +- pcweb/pages/docs_landing/__init__.py | 2 +- pcweb/pages/docs_landing/views/ai_builder.py | 2 +- pcweb/pages/docs_landing/views/enterprise.py | 2 +- pcweb/pages/docs_landing/views/framework.py | 4 ++-- pcweb/pages/docs_landing/views/hero.py | 2 +- pcweb/pages/docs_landing/views/hosting.py | 2 +- pcweb/pages/docs_landing/views/link_item.py | 2 +- pcweb/pages/docs_landing/views/other.py | 2 +- pcweb/pages/docs_landing/views/self_hosting.py | 2 +- 12 files changed, 15 insertions(+), 18 deletions(-) diff --git a/assets/components/GradientButton.tsx b/assets/components/GradientButton.tsx index 6f720dd871..0c66447192 100644 --- a/assets/components/GradientButton.tsx +++ b/assets/components/GradientButton.tsx @@ -87,14 +87,14 @@ export function GradientButton({ rx.Component: other_section(), divider(), footer_index(), - class_name="flex flex-col relative justify-center items-center w-full", + class_name="flex flex-col relative justify-center items-center w-full overflow-hidden", ), class_name="flex flex-col w-full relative h-full justify-center items-center", ), diff --git a/pcweb/pages/docs_landing/views/ai_builder.py b/pcweb/pages/docs_landing/views/ai_builder.py index 2de25fa4ea..ee0725f62e 100644 --- a/pcweb/pages/docs_landing/views/ai_builder.py +++ b/pcweb/pages/docs_landing/views/ai_builder.py @@ -124,5 +124,5 @@ def ai_builder_section() -> rx.Component: ), class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto", ), - class_name="bg-gradient-to-b from-white-1 to-m-slate-1 dark:from-m-slate-11 dark:to-m-slate-12 w-full lg:pt-24 lg:pb-24 pb-10 max-lg:px-6 max-lg:pt-10", + class_name="bg-gradient-to-b from-white-1 to-m-slate-1 dark:from-m-slate-11 dark:to-m-slate-12 w-full lg:pt-24 lg:pb-24 pb-10 max-xl:px-6 max-lg:pt-10", ) diff --git a/pcweb/pages/docs_landing/views/enterprise.py b/pcweb/pages/docs_landing/views/enterprise.py index 0b0420bbf1..b58987f3c2 100644 --- a/pcweb/pages/docs_landing/views/enterprise.py +++ b/pcweb/pages/docs_landing/views/enterprise.py @@ -34,5 +34,5 @@ def enterprise_section() -> rx.Component: ), class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-secondary-4 relative", ), - class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-lg:px-6 overflow-hidden", + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-xl:px-6 overflow-hidden", ) diff --git a/pcweb/pages/docs_landing/views/framework.py b/pcweb/pages/docs_landing/views/framework.py index 297fc186a7..565c9fe2f2 100644 --- a/pcweb/pages/docs_landing/views/framework.py +++ b/pcweb/pages/docs_landing/views/framework.py @@ -38,7 +38,7 @@ def docs_item( class_name="text-m-slate-7 dark:text-m-slate-6 text-sm font-[475]", ), rx.el.a(to=href, class_name="absolute inset-0"), - class_name="flex flex-col gap-2 py-8 pr-8 relative group lg:max-w-[21rem] w-full max-lg:text-start hover:bg-[linear-gradient(243deg,var(--m-slate-2,#F6F7F9)_0%,var(--m-slate-1, #FCFCFD)_100%)] dark:hover:bg-[linear-gradient(243deg,var(--m-slate-11,#1D2025)_0%,var(--m-slate-12,#151618)_63.63%)]", + class_name="flex flex-col gap-2 py-8 pr-8 relative group lg:max-w-[21rem] w-full max-lg:text-start hover:bg-[linear-gradient(243deg,var(--m-slate-2,#F6F7F9)_0%,var(--m-slate-1,#FCFCFD)_100%)] dark:hover:bg-[linear-gradient(243deg,var(--m-slate-11,#1D2025)_0%,var(--m-slate-12,#151618)_63.63%)]", ) @@ -186,5 +186,5 @@ def framework() -> rx.Component: components_section(), class_name="flex flex-col lg:flex-row relative", ), - class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-lg:px-6 overflow-hidden", + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-xl:px-6 overflow-hidden", ) diff --git a/pcweb/pages/docs_landing/views/hero.py b/pcweb/pages/docs_landing/views/hero.py index 90f8099d9d..ba8e952db3 100644 --- a/pcweb/pages/docs_landing/views/hero.py +++ b/pcweb/pages/docs_landing/views/hero.py @@ -60,6 +60,6 @@ def hero() -> rx.Component: ), ), class_name=ui.cn( - "flex lg:flex-row flex-col max-w-(--docs-layout-max-width) mx-auto w-full max-lg:pb-10 max-lg:px-6", + "flex lg:flex-row flex-col max-w-(--docs-layout-max-width) mx-auto w-full max-lg:pb-10 max-xl:px-6", ), ) diff --git a/pcweb/pages/docs_landing/views/hosting.py b/pcweb/pages/docs_landing/views/hosting.py index 0f91520fd4..afe8d14aed 100644 --- a/pcweb/pages/docs_landing/views/hosting.py +++ b/pcweb/pages/docs_landing/views/hosting.py @@ -47,5 +47,5 @@ def hosting_section() -> rx.Component: ), class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-m-slate-4 dark:border-m-slate-10 relative", ), - class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 overflow-hidden", + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start max-xl:px-6 lg:mb-24 overflow-hidden", ) diff --git a/pcweb/pages/docs_landing/views/link_item.py b/pcweb/pages/docs_landing/views/link_item.py index f6a5022592..303f05c19a 100644 --- a/pcweb/pages/docs_landing/views/link_item.py +++ b/pcweb/pages/docs_landing/views/link_item.py @@ -45,7 +45,7 @@ def link_item( ), rx.el.a(to=href, class_name="absolute inset-0"), class_name=ui.cn( - "flex flex-col gap-2 pr-8 py-8 group border-r border-b border-m-slate-4 dark:border-m-slate-10 relative max-lg:p-6 hover:bg-[linear-gradient(243deg,var(--m-slate-2,#F6F7F9)_0%,var(--m-slate-1, #FCFCFD)_100%)] dark:hover:bg-[linear-gradient(243deg,var(--m-slate-11,#1D2025)_0%,var(--m-slate-12,#151618)_63.63%)]", + "flex flex-col gap-2 pr-8 py-8 group border-r border-b border-m-slate-4 dark:border-m-slate-10 relative max-lg:p-6 hover:bg-[linear-gradient(243deg,var(--m-slate-2,#F6F7F9)_0%,var(--m-slate-1,#FCFCFD)_100%)] dark:hover:bg-[linear-gradient(243deg,var(--m-slate-11,#1D2025)_0%,var(--m-slate-12,#151618)_63.63%)]", "lg:pl-8 pl-6" if has_padding_left else "", ), ) diff --git a/pcweb/pages/docs_landing/views/other.py b/pcweb/pages/docs_landing/views/other.py index 921683b47a..43a0e9cc1c 100644 --- a/pcweb/pages/docs_landing/views/other.py +++ b/pcweb/pages/docs_landing/views/other.py @@ -35,5 +35,5 @@ def other_section() -> rx.Component: faded_borders(), class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-secondary-4 relative", ), - class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-lg:px-6 overflow-hidden", + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-xl:px-6 overflow-hidden", ) diff --git a/pcweb/pages/docs_landing/views/self_hosting.py b/pcweb/pages/docs_landing/views/self_hosting.py index fa126af65c..609d246813 100644 --- a/pcweb/pages/docs_landing/views/self_hosting.py +++ b/pcweb/pages/docs_landing/views/self_hosting.py @@ -34,5 +34,5 @@ def self_hosting_section() -> rx.Component: ), class_name="grid grid-cols-1 lg:grid-cols-2 border-t border-secondary-4 relative", ), - class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-lg:px-6 overflow-hidden max-lg:pt-10", + class_name="flex flex-col gap-10 max-lg:text-center relative max-w-(--docs-layout-max-width) mx-auto w-full justify-start lg:mb-24 mb-10 max-xl:px-6 overflow-hidden max-lg:pt-10", ) From 21d1b4e928b65ab8e377027a7f6cf297fc5371cf Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Fri, 13 Feb 2026 18:07:45 +0100 Subject: [PATCH 06/15] fix in safari --- pcweb/pages/about/views/square_logo.py | 38 ++++++++++++++++---------- pcweb/views/marketing_navbar.py | 1 + 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/pcweb/pages/about/views/square_logo.py b/pcweb/pages/about/views/square_logo.py index ea0da102e5..0ab6f4d923 100644 --- a/pcweb/pages/about/views/square_logo.py +++ b/pcweb/pages/about/views/square_logo.py @@ -1,23 +1,31 @@ import reflex as rx -from pcweb.components.logo_reveal import logo_reveal +# def square_logo() -> rx.Component: +# return rx.el.section( +# # Light mode +# rx.el.div( +# logo_reveal( +# grid_bg_src="/common/light/squares_logo.svg", +# ), +# class_name="dark:hidden", +# ), +# # Dark mode +# rx.el.div( +# logo_reveal( +# grid_bg_src="/common/dark/squares_logo.svg", +# ), +# class_name="hidden dark:block", +# ), +# class_name="max-w-(--layout-max-width) w-full h-auto", +# ) def square_logo() -> rx.Component: return rx.el.section( - # Light mode - rx.el.div( - logo_reveal( - grid_bg_src="/common/light/squares_logo.svg", - ), - class_name="dark:hidden", + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_logo.svg", + alt="Square Logo", + loading="lazy", ), - # Dark mode - rx.el.div( - logo_reveal( - grid_bg_src="/common/dark/squares_logo.svg", - ), - class_name="hidden dark:block", - ), - class_name="max-w-(--layout-max-width) w-full h-auto", + class_name="max-w-(--layout-max-width) w-fullh-auto", ) diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py index 334c01b651..9092d350d8 100644 --- a/pcweb/views/marketing_navbar.py +++ b/pcweb/views/marketing_navbar.py @@ -179,6 +179,7 @@ def platform_content() -> rx.Component: rx.image( src=f"/common/{rx.color_mode_cond('light', 'dark')}/ai_builder_pattern.svg", alt="AI Builder Navbar Pattern", + class_name="pointer-events-none", ), rx.el.a( class_name="absolute inset-0", From 5cf9536c50614e296df3b4b7439e0ae20b0bbc68 Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Fri, 13 Feb 2026 18:12:20 +0100 Subject: [PATCH 07/15] dark logo --- assets/common/dark/squares_logo.svg | 1135 +++++++++++++++++++++++++++ 1 file changed, 1135 insertions(+) create mode 100644 assets/common/dark/squares_logo.svg diff --git a/assets/common/dark/squares_logo.svg b/assets/common/dark/squares_logo.svg new file mode 100644 index 0000000000..ec7cee319e --- /dev/null +++ b/assets/common/dark/squares_logo.svg @@ -0,0 +1,1135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 062153cf76190cd1f6a75db5796c56bcf6ac897f Mon Sep 17 00:00:00 2001 From: Carlos Date: Fri, 13 Feb 2026 19:17:56 +0100 Subject: [PATCH 08/15] fix some colors --- pcweb/views/marketing_navbar.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py index 9092d350d8..76085da893 100644 --- a/pcweb/views/marketing_navbar.py +++ b/pcweb/views/marketing_navbar.py @@ -151,8 +151,14 @@ def platform_item(image: str, title: str, description: str, href: str) -> rx.Com class_name="size-18", ), rx.el.div( - rx.el.span(title, class_name="text-secondary-12 text-sm font-[525]"), - rx.el.span(description, class_name="text-secondary-11 text-sm font-[475]"), + rx.el.span( + title, + class_name="dark:text-m-slate-3 text-m-slate-12 text-sm font-[525]", + ), + rx.el.span( + description, + class_name="dark:text-m-slate-6 text-m-slate-7 text-sm font-[475]", + ), class_name="flex flex-col", ), rx.el.a(class_name="absolute inset-0", to=href), @@ -168,11 +174,11 @@ def platform_content() -> rx.Component: rx.el.div( rx.el.span( "AI Builder", - class_name="text-secondary-12 text-lg font-semibold mb-2", + class_name="dark:text-m-slate-3 text-m-slate-12 text-lg font-semibold mb-2", ), rx.el.span( "Build production-ready web apps for your team in seconds with AI-powered code generation.", - class_name="text-secondary-11 text-sm font-medium", + class_name="dark:text-m-slate-6 text-m-slate-7 text-sm font-medium", ), class_name="p-4 flex flex-col relative hover-card-shadow rounded-md", ), @@ -208,7 +214,7 @@ def platform_content() -> rx.Component: "Reflex Is The Operating System ", rx.el.br(), " for Enterprise Apps", - class_name="text-secondary-11 font-mono font-[415] text-[0.75rem] leading-4.5 uppercase", + class_name="dark:text-m-slate-6 text-m-slate-7 font-mono font-[415] text-[0.75rem] leading-4.5 uppercase", ), rx.image( src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_navbar.svg", @@ -241,7 +247,7 @@ def solutions_column(title: str, items: list[tuple[str, str, str]]) -> rx.Compon rx.el.div( rx.el.span( title, - class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-m-slate-8 dark:text-m-slate-6", + class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed dark:border-m-slate-8 border-m-slate-6 dark:text-m-slate-6 text-m-slate-7", ), class_name="px-4 pt-4 flex flex-col", ), @@ -258,7 +264,7 @@ def blog_column() -> rx.Component: rx.el.div( rx.el.span( "Blog", - class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-m-slate-8 dark:text-m-slate-6", + class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed dark:border-m-slate-8 border-m-slate-6 dark:text-m-slate-6 text-m-slate-7", ), class_name="flex flex-col", ), @@ -288,7 +294,7 @@ def customers_column() -> rx.Component: rx.el.div( rx.el.span( "Customers", - class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed border-m-slate-8 dark:text-m-slate-6", + class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed dark:border-m-slate-8 border-m-slate-6 dark:text-m-slate-6 text-m-slate-7", ), class_name="px-4 pt-4 flex flex-col", ), From 3130e5f9dcb5fab712094c2ef76e86a9193f6f67 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 16 Feb 2026 10:19:19 +0100 Subject: [PATCH 09/15] blog update --- assets/common/dark/squares_blog.svg | 1 + assets/common/light/squares_blog.svg | 1 + assets/docs/dark/mcp.svg | 1 + assets/docs/light/mcp.svg | 1 + pcweb/pages/docs_landing/views/ai_builder.py | 5 ++- pcweb/views/marketing_navbar.py | 39 +++++++++++++------- 6 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 assets/common/dark/squares_blog.svg create mode 100644 assets/common/light/squares_blog.svg create mode 100644 assets/docs/dark/mcp.svg create mode 100644 assets/docs/light/mcp.svg diff --git a/assets/common/dark/squares_blog.svg b/assets/common/dark/squares_blog.svg new file mode 100644 index 0000000000..b38e1966b6 --- /dev/null +++ b/assets/common/dark/squares_blog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/common/light/squares_blog.svg b/assets/common/light/squares_blog.svg new file mode 100644 index 0000000000..b38e1966b6 --- /dev/null +++ b/assets/common/light/squares_blog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/docs/dark/mcp.svg b/assets/docs/dark/mcp.svg new file mode 100644 index 0000000000..fbaaec7b03 --- /dev/null +++ b/assets/docs/dark/mcp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/docs/light/mcp.svg b/assets/docs/light/mcp.svg new file mode 100644 index 0000000000..fbaaec7b03 --- /dev/null +++ b/assets/docs/light/mcp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pcweb/pages/docs_landing/views/ai_builder.py b/pcweb/pages/docs_landing/views/ai_builder.py index ee0725f62e..c2bbf5da40 100644 --- a/pcweb/pages/docs_landing/views/ai_builder.py +++ b/pcweb/pages/docs_landing/views/ai_builder.py @@ -116,7 +116,10 @@ def ai_builder_section() -> rx.Component: card( title="MCP", description="The Reflex Model Context Protocol (MCP) provides AI assistants and coding tools with structured access to Reflex documentation and component information.", - content=None, + content=rx.image( + src=f"/docs/{rx.color_mode_cond('light', 'dark')}/mcp.svg", + class_name="w-full h-auto dark:hidden", + ), href=ai_builder_pages.integrations.mcp_overview.path, enteprise_only=True, ), diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py index 76085da893..12a0d96aab 100644 --- a/pcweb/views/marketing_navbar.py +++ b/pcweb/views/marketing_navbar.py @@ -259,27 +259,40 @@ def solutions_column(title: str, items: list[tuple[str, str, str]]) -> rx.Compon ) -def blog_column() -> rx.Component: +def blog_item(blog: dict, path: str) -> rx.Component: return rx.el.div( rx.el.div( - rx.el.span( - "Blog", - class_name="font-mono font-[415] text-[0.75rem] leading-4 uppercase pb-4 border-b border-dashed dark:border-m-slate-8 border-m-slate-6 dark:text-m-slate-6 text-m-slate-7", + rx.moment( + rx.Var.create(blog.metadata["date"]).to(str), + format="MMM DD YYYY", + class_name="text-m-slate-7 dark:text-m-slate-6 text-xs font-[415] font-mono uppercase", ), - class_name="flex flex-col", + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_blog.svg", + class_name="pointer-events-none", + alt="Squares Blog", + ), + class_name="flex flex-row items-center justify-start gap-6", ), - rx.el.a( - next(iter(blog_data.values())).metadata["title"], - to=f"/blog/{next(iter(blog_data.keys()))}", - class_name="dark:text-m-slate-3 text-m-slate-12 text-sm font-[525] flex items-center justify-start gap-2 hover:text-primary-10 dark:hover:text-primary-9 line-clamp-3", + rx.el.span( + blog.metadata["title"], + class_name="dark:text-m-slate-3 text-m-slate-12 text-sm font-[525] group-hover:text-primary-10 dark:group-hover:text-primary-9 line-clamp-3", ), rx.el.a( - list(blog_data.values())[1].metadata["title"], - to=f"/blog/{list(blog_data.keys())[1]}", - class_name="dark:text-m-slate-3 text-m-slate-12 text-sm font-[525] flex items-center justify-start gap-2 hover:text-primary-10 dark:hover:text-primary-9 line-clamp-3", + to=f"/blog/{path}", + class_name="absolute inset-0", ), + class_name="relative group flex flex-col gap-2 mb-2", + ) + + +def blog_column() -> rx.Component: + first_blog = next(iter(blog_data.values())) + return rx.el.div( + blog_item(first_blog, next(iter(blog_data.keys()))), + blog_item(list(blog_data.values())[1], list(blog_data.keys())[1]), rx.el.a( - "All Posts", + "Read All in Blog", ui.icon("ArrowRight01Icon", class_name="ml-auto"), to=blogs.path, class_name="dark:text-m-slate-3 text-m-slate-12 text-sm font-[525] h-10 flex items-center justify-start gap-2 hover:text-primary-10 dark:hover:text-primary-9 mt-auto", From e4bca347786900ac16345a59061262c382a1351b Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Mon, 16 Feb 2026 12:00:49 +0100 Subject: [PATCH 10/15] update navigation menu transition --- assets/tailwind-theme.css | 10 ++++++++++ pcweb/views/marketing_navbar.py | 24 ++++++++++++++++-------- uv.lock | 2 +- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/assets/tailwind-theme.css b/assets/tailwind-theme.css index 4e0c1c607d..252fa133fd 100644 --- a/assets/tailwind-theme.css +++ b/assets/tailwind-theme.css @@ -1955,6 +1955,16 @@ scrollbar-width: none; /* Firefox */ } + + @supports ((-webkit-touch-callout: none) or (font: -apple-system-body)) { + + .safari-nav-positioner, + .safari-nav-positioner[data-slot='navigation-menu-positioner'] { + transition: none !important; + transition-property: none !important; + transition-duration: 0ms !important; + } + } } @property --border-angle { diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py index 12a0d96aab..6e6aedec16 100644 --- a/pcweb/views/marketing_navbar.py +++ b/pcweb/views/marketing_navbar.py @@ -98,7 +98,7 @@ def logo() -> rx.Component: class_name="shrink-0 hidden dark:block", ), to="/", - class_name="block shrink-0 mr-10", + class_name="block shrink-0 mr-9", ) @@ -120,6 +120,7 @@ def menu_trigger(title: str, content: rx.Component) -> rx.Component: "transform": "rotate(180deg)", }, }, + class_name="px-1", aria_label=f"{title} menu", unstyled=True, ), @@ -136,10 +137,11 @@ def menu_content(content: rx.Component, class_name: str = "") -> rx.Component: content, unstyled=True, class_name=ui.cn( - "w-max transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[starting-style]:opacity-0 data-[ending-style]:opacity-0 data-[starting-style]:data-[activation-direction=left]:translate-x-[-50%] data-[starting-style]:data-[activation-direction=right]:translate-x-[50%] data-[ending-style]:data-[activation-direction=left]:translate-x-[50%] data-[ending-style]:data-[activation-direction=right]:translate-x-[-50%]", + "data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 ease-[cubic-bezier(0.22,1,0.36,1)] group-data-[viewport=false]/navigation-menu:data-open:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-closed:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-open:fade-in-0 group-data-[viewport=false]/navigation-menu:data-closed:fade-out-0 group-data-[viewport=false]/navigation-menu:duration-300 data-[ending-style]:data-[activation-direction=left]:translate-x-[50%] data-[ending-style]:data-[activation-direction=right]:translate-x-[-50%] data-[starting-style]:data-[activation-direction=left]:translate-x-[-50%] data-[starting-style]:data-[activation-direction=right]:translate-x-[50%] w-max transition-[opacity,transform,translate] duration-[0.35s] data-[ending-style]:opacity-0 data-[starting-style]:opacity-0 **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none", "flex flex-row rounded-xl font-sans p-0", class_name, ), + keep_mounted=True, ) @@ -454,7 +456,7 @@ def navigation_menu() -> rx.Component: ), to="/pricing", ), - class_name="xl:flex hidden", + class_name="xl:flex hidden px-1", custom_attrs={"role": "menuitem"}, ), ui.navigation_menu.item( @@ -466,11 +468,11 @@ def navigation_menu() -> rx.Component: ), to="/docs", ), - class_name="xl:flex hidden", + class_name="xl:flex hidden px-1", custom_attrs={"role": "menuitem"}, ), menu_trigger("About", about_content()), - class_name="flex flex-row items-center gap-2 m-0 h-full list-none", + class_name="flex flex-row items-center m-0 h-full list-none", custom_attrs={"role": "menubar"}, ), ui.navigation_menu.list( @@ -518,17 +520,23 @@ def navigation_menu() -> rx.Component: ui.navigation_menu.portal( ui.navigation_menu.positioner( ui.navigation_menu.popup( - ui.navigation_menu.viewport(), + ui.navigation_menu.viewport( + unstyled=True, + class_name="relative h-full w-full overflow-hidden rounded-[inherit]", + ), unstyled=True, - class_name="relative h-[var(--popup-height)] w-max origin-[var(--transform-origin)] transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0 min-[500px]:w-[var(--popup-width)] xs:w-[var(--popup-width)] rounded-xl bg-m-slate-1 dark:bg-m-slate-12 overflow-hidden navbar-shadow", + class_name="relative h-[var(--popup-height)] w-[var(--popup-width)] origin-[var(--transform-origin)] rounded-xl bg-m-slate-1 dark:bg-m-slate-12 navbar-shadow transition-[opacity,transform,width,height,scale,translate] duration-[0.25s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:ease-[ease] data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0", ), + unstyled=True, + class_name="safari-nav-positioner box-border h-[var(--positioner-height)] w-[var(--positioner-width)] max-w-[var(--available-width)] transition-[top,left,right,bottom] duration-[0.25s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[instant]:transition-none", side_offset=30, align="start", align_offset=-20, + position_method="fixed", ), ), unstyled=True, - class_name="relative flex w-full items-center h-full justify-between gap-6 mx-auto flex-row", + class_name="group/navigation-menu relative flex w-full items-center h-full justify-between gap-6 mx-auto flex-row", ) diff --git a/uv.lock b/uv.lock index 7702e8417d..08c2d6afe6 100644 --- a/uv.lock +++ b/uv.lock @@ -2548,7 +2548,7 @@ wheels = [ [[package]] name = "reflex-ui" version = "0.0.1" -source = { git = "https://github.com/reflex-dev/reflex-ui?rev=main#9acee2e65cbdf6f6cff4ef6ddf125464e3c79b3a" } +source = { git = "https://github.com/reflex-dev/reflex-ui?rev=main#f537d6a67c32f53f4107c8809a09838be86ada28" } dependencies = [ { name = "reflex" }, ] From 11e7dbaa216321943b729f4d2cec017e35aa6253 Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Mon, 16 Feb 2026 12:44:09 +0100 Subject: [PATCH 11/15] banner update --- assets/common/dark/squares_banner.svg | 352 ++++++++++++++++++ assets/common/light/squares_banner.svg | 352 ++++++++++++++++++ .../docpage/navbar/buttons/sidebar.py | 12 +- pcweb/components/hosting_banner.py | 57 ++- 4 files changed, 753 insertions(+), 20 deletions(-) create mode 100644 assets/common/dark/squares_banner.svg create mode 100644 assets/common/light/squares_banner.svg diff --git a/assets/common/dark/squares_banner.svg b/assets/common/dark/squares_banner.svg new file mode 100644 index 0000000000..41e77b8c00 --- /dev/null +++ b/assets/common/dark/squares_banner.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/common/light/squares_banner.svg b/assets/common/light/squares_banner.svg new file mode 100644 index 0000000000..fa4354accc --- /dev/null +++ b/assets/common/light/squares_banner.svg @@ -0,0 +1,352 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pcweb/components/docpage/navbar/buttons/sidebar.py b/pcweb/components/docpage/navbar/buttons/sidebar.py index df8029f3ea..77487cc3c0 100644 --- a/pcweb/components/docpage/navbar/buttons/sidebar.py +++ b/pcweb/components/docpage/navbar/buttons/sidebar.py @@ -2,6 +2,7 @@ import reflex_ui as ui from reflex.style import toggle_color_mode +from pcweb.components.hosting_banner import HostingBannerState from pcweb.components.icons.icons import get_icon from pcweb.components.marketing_button import button from pcweb.constants import DISCORD_URL, GITHUB_URL, TWITTER_URL @@ -99,9 +100,16 @@ def navbar_sidebar_drawer(trigger) -> rx.Component: class_name="flex flex-row justify-center items-center px-3 py-0.5 w-full h-[47px]", custom_attrs={"aria-label": "Toggle color mode"}, ), - class_name="flex flex-col items-center bg-slate-1 w-full h-full", + class_name="flex flex-col items-center dark:bg-m-slate-12 bg-m-slate-1 w-full h-full", + ), + class_name=ui.cn( + "dark:!bg-m-slate-12 !bg-m-slate-1 w-full h-full !outline-none", + rx.cond( + HostingBannerState.is_banner_visible, + "!top-[136px]", + "!top-[74px]", + ), ), - class_name="!bg-transparent w-full h-full !outline-none !top-[74px]", ) ), direction="bottom", diff --git a/pcweb/components/hosting_banner.py b/pcweb/components/hosting_banner.py index c12afed899..07d490e4dc 100644 --- a/pcweb/components/hosting_banner.py +++ b/pcweb/components/hosting_banner.py @@ -1,6 +1,9 @@ import datetime import reflex as rx +import reflex_ui as ui + +from pcweb.components.marketing_button import button def glow() -> rx.Component: @@ -67,41 +70,59 @@ def hosting_banner() -> rx.Component: rx.el.div( rx.el.a( rx.box( + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_banner.svg", + alt="Square Banner", + class_name="pointer-events-none absolute -left-[16rem] max-lg:hidden", + ), rx.box( # Header text with responsive spans rx.el.span( "New", - class_name="items-center font-medium px-1.5 h-5 rounded-md text-xs bg-primary-9 text-primary-contrast z-[1] max-lg:hidden lg:inline-flex", + class_name="items-center font-[525] px-2.5 h-7 rounded-lg text-sm text-m-slate-3 z-[1] max-lg:hidden lg:inline-flex border border-white/16", ), - rx.text( + rx.el.span( + "Reflex Build On-Prem: A Secure Builder Running in Your Environment", rx.el.span( - "Reflex Build On-Prem - A secure builder running in your environment. ", - rx.el.span( - "Learn more", - class_name="text-slate-11 font-semibold text-sm underline decoration-slate-11 lg:pl-2", - ), - class_name="inline-block text-slate-12 font-semibold text-sm", + ". Learn more", + class_name="lg:hidden text-m-slate-6 dark:text-m-slate-2", ), - class_name="text-slate-12 font-semibold text-sm z-[1]", + class_name="text-m-slate-3 font-[525] text-sm lg:text-nowrap inline-block", + ), + rx.el.span( + class_name="w-px h-7 bg-gradient-to-b from-transparent via-white/24 to-transparent max-lg:hidden", + ), + button( + "Learn more", + ui.icon("ArrowRight01Icon"), + variant="ghost", + size="xs", + aria_label="Learn more", + class_name="text-m-slate-3 dark:hover:text-m-slate-5 max-lg:hidden", ), - class_name="flex items-center md:gap-3.5 gap-2", - ) + class_name="flex flex-row items-center md:gap-4 gap-2", + ), + rx.image( + src=f"/common/{rx.color_mode_cond('light', 'dark')}/squares_banner.svg", + alt="Square Banner", + class_name="pointer-events-none absolute -right-[16rem] max-lg:hidden", + ), + class_name="flex flex-row items-center relative", ), - glow(), to=BLOG_LINK, is_external=False, - class_name="flex justify-start md:justify-center md:col-start-2", + class_name="flex justify-start md:justify-center md:col-start-2 max-w-[73rem]", ), rx.el.button( - rx.icon( - "x", - size=16, + ui.icon( + "MultiplicationSignIcon", ), aria_label="Close banner", - class_name="cursor-pointer hover:!text-slate-11 transition-color !text-slate-9 z-10 size-8 flex items-center justify-center shrink-0 md:col-start-3 justify-self-end ml-auto", + type="button", + class_name="cursor-pointer hover:text-m-slate-5 transition-colors text-m-slate-3 z-10 size-10 flex items-center justify-center shrink-0 md:col-start-3 justify-self-end ml-auto", on_click=HostingBannerState.hide_banner, ), - class_name="px-6 lg:px-6 w-screen min-h-[3rem] lg:h-[3.5rem] shadow-[inset_0_-1px_0_0_var(--c-slate-3)] flex md:grid md:grid-cols-[1fr_auto_1fr] items-center bg-m-slate-1 dark:bg-m-slate-12 gap-4 overflow-hidden relative lg:py-0 py-3 max-w-full group", + class_name="px-5 lg:px-0 w-screen min-h-[2rem] lg:h-10 flex md:grid md:grid-cols-[1fr_auto_1fr] items-center bg-m-slate-12 dark:bg-[#6550B9] gap-4 overflow-hidden relative lg:py-0 py-2 max-w-full group", ), ), on_mount=HostingBannerState.show_blog_banner, From 0b231a2f9b407205c6896c6c0e877be13abfefc4 Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Mon, 16 Feb 2026 13:18:06 +0100 Subject: [PATCH 12/15] update color --- pcweb/views/marketing_navbar.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py index 6e6aedec16..e5709601eb 100644 --- a/pcweb/views/marketing_navbar.py +++ b/pcweb/views/marketing_navbar.py @@ -112,13 +112,16 @@ def menu_trigger(title: str, content: rx.Component) -> rx.Component: ), size="sm", variant="ghost", - class_name="font-[550]", + class_name="font-[550] menu-button", native_button=False, ), style={ "&[data-popup-open] .chevron": { "transform": "rotate(180deg)", }, + "&[data-popup-open] .menu-button": { + "color": "light-dark(var(--primary-10), var(--primary-9))", + }, }, class_name="px-1", aria_label=f"{title} menu", @@ -525,10 +528,10 @@ def navigation_menu() -> rx.Component: class_name="relative h-full w-full overflow-hidden rounded-[inherit]", ), unstyled=True, - class_name="relative h-[var(--popup-height)] w-[var(--popup-width)] origin-[var(--transform-origin)] rounded-xl bg-m-slate-1 dark:bg-m-slate-12 navbar-shadow transition-[opacity,transform,width,height,scale,translate] duration-[0.25s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:ease-[ease] data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0", + class_name="relative h-[var(--popup-height)] w-[var(--popup-width)] origin-[var(--transform-origin)] rounded-xl bg-m-slate-1 dark:bg-m-slate-12 navbar-shadow transition-[opacity,transform,width,height,scale,translate] duration-150 ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:ease-[ease] data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0", ), unstyled=True, - class_name="safari-nav-positioner box-border h-[var(--positioner-height)] w-[var(--positioner-width)] max-w-[var(--available-width)] transition-[top,left,right,bottom] duration-[0.25s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[instant]:transition-none", + class_name="safari-nav-positioner box-border h-[var(--positioner-height)] w-[var(--positioner-width)] max-w-[var(--available-width)] transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[instant]:transition-none", side_offset=30, align="start", align_offset=-20, From 1be71d60cb2fa1ec0759210cde9865eb0a8ec8b4 Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Mon, 16 Feb 2026 13:48:52 +0100 Subject: [PATCH 13/15] mcp dark pattern --- assets/docs/dark/mcp.svg | 2 +- assets/docs/light/getting_started.svg | 599 ++++++++++--------- assets/tailwind-theme.css | 2 +- pcweb/pages/docs_landing/views/ai_builder.py | 2 +- pcweb/views/marketing_navbar.py | 2 +- 5 files changed, 305 insertions(+), 302 deletions(-) diff --git a/assets/docs/dark/mcp.svg b/assets/docs/dark/mcp.svg index fbaaec7b03..9fe508a88c 100644 --- a/assets/docs/dark/mcp.svg +++ b/assets/docs/dark/mcp.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/docs/light/getting_started.svg b/assets/docs/light/getting_started.svg index 073877b0fb..48d441b53a 100644 --- a/assets/docs/light/getting_started.svg +++ b/assets/docs/light/getting_started.svg @@ -8,331 +8,319 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + - + - + @@ -351,8 +339,13 @@ + + + + + - + @@ -371,8 +364,13 @@ + + + + + - + @@ -391,6 +389,11 @@ + + + + + diff --git a/assets/tailwind-theme.css b/assets/tailwind-theme.css index 252fa133fd..6694224d21 100644 --- a/assets/tailwind-theme.css +++ b/assets/tailwind-theme.css @@ -1956,7 +1956,7 @@ /* Firefox */ } - @supports ((-webkit-touch-callout: none) or (font: -apple-system-body)) { + @supports ((-webkit-touch-callout: none) or (font: -apple-system-body) or (-moz-appearance: none)) { .safari-nav-positioner, .safari-nav-positioner[data-slot='navigation-menu-positioner'] { diff --git a/pcweb/pages/docs_landing/views/ai_builder.py b/pcweb/pages/docs_landing/views/ai_builder.py index c2bbf5da40..a04ecedb1a 100644 --- a/pcweb/pages/docs_landing/views/ai_builder.py +++ b/pcweb/pages/docs_landing/views/ai_builder.py @@ -118,7 +118,7 @@ def ai_builder_section() -> rx.Component: description="The Reflex Model Context Protocol (MCP) provides AI assistants and coding tools with structured access to Reflex documentation and component information.", content=rx.image( src=f"/docs/{rx.color_mode_cond('light', 'dark')}/mcp.svg", - class_name="w-full h-auto dark:hidden", + class_name="w-full h-auto -mt-4", ), href=ai_builder_pages.integrations.mcp_overview.path, enteprise_only=True, diff --git a/pcweb/views/marketing_navbar.py b/pcweb/views/marketing_navbar.py index e5709601eb..017784f63f 100644 --- a/pcweb/views/marketing_navbar.py +++ b/pcweb/views/marketing_navbar.py @@ -59,7 +59,7 @@ def logos_carousel() -> rx.Component: return marquee( *[social_proof_card(logo) for logo in logos], direction="left", - gradient_color="light-dark(var(--m-slate-1), var(--m-slate-11))", + gradient_color="light-dark(var(--c-white-1), var(--c-m-slate-11))", class_name="h-[1.625rem] w-full overflow-hidden mt-auto", gradient_width=65, speed=25, From 13968ce7b131f81f13de59f67ffab69f614ca0c5 Mon Sep 17 00:00:00 2001 From: carlosabadia Date: Mon, 16 Feb 2026 17:03:39 +0100 Subject: [PATCH 14/15] small top change --- pcweb/components/docpage/navbar/buttons/sidebar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pcweb/components/docpage/navbar/buttons/sidebar.py b/pcweb/components/docpage/navbar/buttons/sidebar.py index 77487cc3c0..2da5dd101d 100644 --- a/pcweb/components/docpage/navbar/buttons/sidebar.py +++ b/pcweb/components/docpage/navbar/buttons/sidebar.py @@ -106,7 +106,7 @@ def navbar_sidebar_drawer(trigger) -> rx.Component: "dark:!bg-m-slate-12 !bg-m-slate-1 w-full h-full !outline-none", rx.cond( HostingBannerState.is_banner_visible, - "!top-[136px]", + "!top-[137px]", "!top-[74px]", ), ), From 6a184ef472eae440752d924fc79dc031be916bf9 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 16 Feb 2026 19:46:40 +0100 Subject: [PATCH 15/15] update image --- assets/about/team_3.avif | Bin 66876 -> 70579 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/about/team_3.avif b/assets/about/team_3.avif index 3c4b3a16e5da2d6b5211724825d5740484bc437c..7858065dee386d98987dc2a17329a19ce8290589 100644 GIT binary patch literal 70579 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