From 302442385eeb5c3f4c605ca59b6de6e83c48c1dc Mon Sep 17 00:00:00 2001 From: jessop Date: Sun, 17 Mar 2019 22:51:57 -0400 Subject: [PATCH] avoids downloading content for googlebot and loads fallback images for missing thumbnails --- cli/defaults/siteConfig.json | 1 - client/src/components/AssetPreview/index.jsx | 18 ++++++---- client/src/containers/AssetDisplay/view.jsx | 34 ++++++++++++++----- package-lock.json | 16 ++++++++- package.json | 2 ++ public/assets/img/default_thumb.jpg | Bin 0 -> 51338 bytes server/controllers/api/claim/get/index.js | 15 ++++++-- 7 files changed, 66 insertions(+), 20 deletions(-) create mode 100644 public/assets/img/default_thumb.jpg diff --git a/cli/defaults/siteConfig.json b/cli/defaults/siteConfig.json index e8af29a7..3164e212 100644 --- a/cli/defaults/siteConfig.json +++ b/cli/defaults/siteConfig.json @@ -23,7 +23,6 @@ "publishing": { "primaryClaimAddress": null, "uploadDirectory": "/home/lbry/Uploads", - "lbrynetHome": "/CURRENTLYUNUSED", "thumbnailChannel": null, "thumbnailChannelId": null, "additionalClaimAddresses": [], diff --git a/client/src/components/AssetPreview/index.jsx b/client/src/components/AssetPreview/index.jsx index 2105a56a..4a1a65b3 100644 --- a/client/src/components/AssetPreview/index.jsx +++ b/client/src/components/AssetPreview/index.jsx @@ -2,19 +2,19 @@ import React from 'react'; import { Link } from 'react-router-dom'; import createCanonicalLink from '@globalutils/createCanonicalLink'; import * as Icon from 'react-feather'; +import Img from 'react-image'; const AssetPreview = ({ defaultThumbnail, claimData }) => { - const {name, fileExt, contentType, thumbnail, title, blocked, transactionTime} = claimData; + const {name, fileExt, contentType, thumbnail, title, blocked, transactionTime = 0} = claimData; const showUrl = createCanonicalLink({asset: {...claimData}}); console.log(transactionTime) const embedUrl = `${showUrl}.${fileExt}`; - const ago = Date.now()/1000 - transactionTime; + const ago = Date.now() / 1000 - transactionTime; const dayInSeconds = 60 * 60 * 24; const monthInSeconds = dayInSeconds * 30; - const yearInSeconds = dayInSeconds * 365; let when; - if (ago < dayInSeconds) { + if (ago < dayInSeconds || transactionTime < 1) { when = 'Just today'; } else if (ago < monthInSeconds) { when = `${Math.floor(ago / dayInSeconds)} d ago`; @@ -52,10 +52,14 @@ const AssetPreview = ({ defaultThumbnail, claimData }) => { return (
- {name}
diff --git a/client/src/containers/AssetDisplay/view.jsx b/client/src/containers/AssetDisplay/view.jsx index c12ad741..be06e847 100644 --- a/client/src/containers/AssetDisplay/view.jsx +++ b/client/src/containers/AssetDisplay/view.jsx @@ -4,6 +4,8 @@ import ProgressBar from '@components/ProgressBar'; import { LOCAL_CHECK, UNAVAILABLE, ERROR, AVAILABLE } from '../../constants/asset_display_states'; import createCanonicalLink from '@globalutils/createCanonicalLink'; import FileViewer from '@components/FileViewer'; +import isBot from 'isbot'; +import Img from 'react-image'; class AvailableContent extends React.Component { render () { @@ -15,20 +17,23 @@ class AvailableContent extends React.Component { case 'image/gif': case 'image/svg+xml': return ( - {name} ); case 'video/mp4': return ( @@ -36,14 +41,25 @@ class AvailableContent extends React.Component { case 'text/markdown': return ( -
+ (isBot(window.navigator.userAgent)) + ? ( + {'markdown + ) + :
); default: return ( - {name} ); } diff --git a/package-lock.json b/package-lock.json index d2dc03e5..8e4dd134 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7592,6 +7592,11 @@ "buffer-alloc": "^1.2.0" } }, + "isbot": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-2.2.1.tgz", + "integrity": "sha512-z0idtpC0uKKKTBhd1g73GREBWhCQdnJq8U5o+8XhgPvuPiRb/vkpNreLvtoneaZX9FNxDFOU0ohEj9hTWm/tPw==" + }, "isemail": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", @@ -8552,7 +8557,7 @@ }, "minimist": { "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" }, "mississippi": { @@ -13287,6 +13292,15 @@ } } }, + "react-image": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-image/-/react-image-2.0.0.tgz", + "integrity": "sha512-yWf+UAtkavJFSG1Qa4p111KncN7/a8dAOUUi5On3jjwZU1tzMXFpBnOFp04vYQr8fJmS/7ePp1OsK440WZ4fLA==", + "requires": { + "@babel/runtime": "^7.0.0", + "prop-types": "15.6.2" + } + }, "react-input-autosize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.1.tgz", diff --git a/package.json b/package.json index 7e1f7ca2..b733878f 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "image-size": "^0.6.3", "inquirer": "^5.2.0", "ip": "^1.1.5", + "isbot": "^2.2.1", "lodash": "^4.17.11", "make-dir": "^1.3.0", "mime-types": "^2.1.21", @@ -66,6 +67,7 @@ "react-feather": "^1.1.4", "react-ga": "^2.5.3", "react-helmet": "^5.2.0", + "react-image": "^2.0.0", "react-markdown": "^4.0.6", "react-redux": "^5.1.1", "react-router-dom": "^4.3.1", diff --git a/public/assets/img/default_thumb.jpg b/public/assets/img/default_thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..49eb43d85768d77e0f6dcf623c4c995fa134ec64 GIT binary patch literal 51338 zcmeGF2Ut|Q);JFDq4$n7L3(dPFVcI5p@VdW-WjR~K>_Iwx*#eb zpn#x=SdjAHGpNUNujgLR_rCA*e9!YUWM?O9t*j&~D=RzM+060d<0X6{m0(vV0MO9^ zxB&pb0SF)ffDXnWX!&3OIf;WX5P*s!aaSQ&CvX4_gp+-ZgG3O@uW^tHLJMFbvw_!j z2;KL1Erj!jyigU`NjEdr=6BBCWVVk%g5K)@d&+;&*9W z37ak5@a@u$gTLshlEz4OjBilVB(1SP`&Yv9XF zjwy68jRIMNPT2TcVOIMkzf0*#hLjHeB0FqY$O>Syi*`+bl_;fhR52Dqz?Z*Q;qPm} z@n;o|=K%tARGFlJ9I$7UuEEB|ny#U#!I}=O{&xVq<46C9di)IPkQf-umE|<%!bDWG0|Kj<0-!lw%Z1=AGZbv%C;8P=HBx>Z#V`!lOjF%Q44JB9{cr2Jv;e4D-)6=hi|0aCA;Y#RC=(V>Ard0uFPjf84SbO!XG-!^S zRf{m${n=10$Dw$|`mK-88ol<@Cfx$E-%HoMGWQOu>L6T!S<~I_u&FS!iuU9?*swIV zJO(CMuQ%=ScGMgL#v2d!M{FApU_*ZOH4FGwK0T#u6XE0LI-k$%^_;E0@utgecx0XC z?jb7)(fNFHK8&rs`cBWfv67UrLw30vpgp-Ie6LQ=WdG8_aHrY87i$@DsZvqNsXaX3 zYo7c;pLoIq3*F;NBkcV)F4Dlkl7ASyTJ>skA#K=lJ<6uiP%5nsnF- zixP_W-Ket)xFhqt^vN-Bb;e(|Y0gB4GC(&wYm#fY$uJ?!wYrb0<8$>p*};G}y|-u2 z^X$oO^^VRDznC~G5o+D&we$4ctFN^*^pkMz29Rtn-gv7j^d_KJXUJf~L?wmh2JCk0RTtD+_J-H-BbD?da|J3r*BS^y+hp7vj z^j4yVx*zsutsHplv32*mKO``XrmydXv3SYN<5%sy+513xL7=Sh7*Lzqzfke&81S_|W4izJ z(6Hj=9z%ty{Q8XS{1cNi*LOEe4xDE9D{=ieu zIszAtS4m?m>)eG@_4a$Wp9E4$qLb#!oNlcaH4P4a-a$V7BrLK1Rr{Orj!$w1wyTGh z8^K{t&l-nAFElid1!NiIyc;gCwX)1L)d}0aQ@)RAxoz?Mk)72s5Lj#Z^i17yfSo&c z-GN7e{dh(~mSy$r_Al)+4@SH_lbqIM^Z9PDoxL_CS4$#?_M7p=u_*8=nY9dx_l{&dpA{2U=PsvbR>= zFFklV_4sLu+4JSckUf^N2!M`PDmdShO=*Kh`ohhSfZ`fo_m4IiJ2X7&}I;$7BqiMJ1KD2pmg%oZ-KO!4BDm}_; zNZXSwxc4M3ck0%=d+s(HVV9mzyZfYnFbGsD5q<}qJ4!xyC>zu6Et7aYunk*G;S#I5 zbpF_O%h~JY^@i(aGN!nnB%Aj$WeLzMEY=FA=Pc)%_wL^zcF4JfJuPMi-PoYlldfF0 zZ>e|USK4^|(Uhoa&a1D#ze9MkA@R;$LhT{P?){Rdsp*>j_xcsPHc5kl--5f)x@zs9|>#{6@v*)>z{n#x;MYio{syh9e2iLW!v;L?$~?hQLT z+`avtcc5SRTK4WgO)%%eS(V17+|btjg3W%0D?K~`^2Ku9*L+ay^0uE|5TJr zTxxTqp!Gpc{TR3_aSVKzlzYd$tkI?Hq5jVCqTmGfn*OhDON^z0V0Mtg0GGWdhBx%(7i_fj4ez$G}KOO~+@`m}B7PUib<*m>#Qn z{ylvvUgLCz^pM&{6Cg$ubg;1Behg#if`Ejgh7Jbu zc@+SNPeUvKbUHS*)8KP0^3fKBV?*IcM#lETD*Nx_V)_Ku)nj(+qHt0u+$tE7fEV(K z5CHIf{9L^ddI1QZ00fvsK1Kuj{s=>RZ*LD2g@zXb4)+T1L?V!J?DJ}pSQP@Asi9lqi65t03rzheZUX!2LGG@ zM!*n&0|+1h@IkTy@O-{ggDDgnMGu76*BTMn2e^75T)j{%K|C&sT1m%T>qHvTNET>( zVDM*)$$n_Do)5y++shxsQz0ppd=OsW8UZ%a-tT(?=IpQYJ)z|1rSxaQ3-M<{+upa5t&3e zH9xO^gDHCaJDsARqmi)}LX`#Pf$ZDwPSL}W@n>+DzXt*Z*AMoP5BW}x7YKJic>5{a zA?%PXKvh!TS>OMgRv_a@V(^ZvHlPi6I$`rK#TtR@rk@pS=-_bz*Y|UfH%D?nIT8my zZy!?^IM}(MhPrw=e-j@O5&;A2r09)6czb$ydpUp2LhucPtilg)!f$YxtFz0G2>fpd zux{V!kz)mY>!c14a0v%$9pu{`HICR(IHIqGf;YK{ucMC;1w)Qc1{5XDU(@Kjs5EkE ziEmV&EHq{I6+Y{{n}S1rCz;w{eIj4~|Rl`YJc%svKM=BLfsIEi#5~ z2L>m#Moc|Z?P16wZ$oJavXFu-%pTB^x zy!~9AUB6pU6+;K^M#IyY5xo6h zw;w&g&*LxC2!Is+Um-gF&VQY1ubX00PX-7AcsWJ$pu*iAiQ7{+u?jY&NEGNr&Hdrdy)5jBzuwxAN^zibR3YK9;F_!}4NU#7i zBZ>s!F2js^`^jjgqtB@1?FVNRuZ@pg1|3i)@^uW#;uBt>xrS83q3*Ec=U@bC!mM}Vti zZ@<5u0{F@tR4zwwr|iG72RlOw+_rQKaDe;CFzeVkFzOjHnlVBJ`JqsLF-C&`J3mAy zqrS4Lk~g^P8jN6Obaaq%^7iwz0|o2qY3B?VaPxsXqe|7$ky7?{2tf9lhO!JZC=Y%| zS4SxkK~+&Dab-afaYaQHaVS(#P(n~r0;;5_pr|S+EFttQuZEXD!p_S9{w=R7m{(Lp zSXmJ&1Qn4u$tx+Oq$B|q6O$AY7m%R_&pSD8)*^raY5jg4PKl=@Z`@s%^ z9f$&f#uXX;Zq;SKS>NCH-xByOf!`ANErH(>_$`6|ha~Xlx)AOKJ|YEyt3L1~E7RAL ztn$bOCptiaj)wlj3q(Y_;oHFDeq9&W|BiE$Gh z0-gpvIo#R>3>c!$t z)<7!iV31qd_>zz?+oOgZMWrH`W3Q^3Y0ND6G7=pV0~Z6p{8k|(^Gr-J(us^ornGS( zVG&U*@nW*{tVd7-a%@`#W(r?+76j$V*;EL4Bp3PW>Dq&@V)%XgErH(>_$`6o68J5F z-xByOf!`ANErH(>_$`6|CnP|eC+cAj*-nb1`*HF2W77=?wBO(SdT#GW_z!XDK?Ds6 zd6B%NSfUcoh zBt2tV#Q(tL>bSEk3IN00swA2j_$k=ffY-rOl~50Iwq~se@O!^$Jn+W|!Guz0fJ82hTHqE}8Vx1Ax$y zmM&7PH##HKpHwUNnID%1M*uFd)kS+NX`^!@F0L#2Ee@TB5dc8c#!Rhn_tnI1DnuD7 zJSjBvCh3solWhyVFjOmlX4u?71G>f=Lo|Mhp0y8%;YvpvP?@>SZP7 zL5+T?O_4adoV7Fp8ddejY+OKGhAnM3R~4(11y0~&ISkhLX9?_sH^40hVUi}Mvknk; zGVh*?@|YxjfraXpWS+t38kn*@Z3)5=sPcXmFyLBgU>gc+6r|UQA-`UbCy1c&*kLOI zMAu-KwR0L{(M`(uR1z?j9sm!PGnj*~A1QRgNH3O+VJ`qgcy%M_R7q#lL1Kl4nBwih z7;;-N@LXyM^(NX&7PklJmukD^S63r`Rxk<%=`3r+>#j9NmUeR0l%4t zW=&AF6^qALPyn zPx3zi&|>YK%VHt`90kfQsy3RxEe8;Bbiif52_A61cZm@GrXmOpa3o3CmIu(tRXod9 z*Bnn%q|x>Bp*{kNakpPL$iWJX}XbXM{1`h*GVg3coVIf^E_9{?DP@k{v6kfQh- zM|p!3O(067UK^Jf zFzA!cr_1o&1HKt6MVva4_C+M^&mH7cV^!Bwqj3ZP=`^XL?)u2G37QV{)t76!5s;bQ zGi&?!X7bE^#;O)Qnq~lGnZXRZhznm#&~hyV{1_x09myHHg!zH8$L$DENl~*21c&*q z;>SqFpO=WtP|o#4wANzHdl(?XiO#xA?#&wlY78Kx4X@>x2YgI%6j|@eKPSPi<$5KW zXF26L00g)iSFx8k$&>PN&vPKmyuxjXaH>c=`AK9Spo;l6VUS$ni4q7#e!1~CjzEXI zTtrs=ecI=194oWM)aVM1#acRgZD9H6>FQ2*a0~J^pbN2`G=3pv(ei*@mBDx&%$YSZ zr9qTd31hFUy{}Uq11%OU|2g|<=a5)s>)4hnV&nlQrJa~;0Ei+z$8^3ERR6zo#5jqr zWQJ0~N=9tUuYv*My4yBp_{G zw;biCf04`>fy6R|GY$tRyh>mnLD3RquIavf=fEy=28Bg8KUkXZ)*fs?&KCgiUZ#40>35jTLQl&@LK}ECGcAUza{Wn0>35jTLS-2NB|u? zU4;YwXH5tuaAd#$w|ex><;hixgkSct{?zS>ac^5nyVg?h^Um_S{MTr7*6@qHkFaUE zNw=vNzwWb?X4xi3cb(jKg8jvHoqqNFuwX;F@?nfYc5GW7Cj}M> z|HQ|`TzTu3KhXP#vHb(j9(Fikwq3(RZ(<@>Nn0x{t37*F7u9c z{VlUEqQtlK|64$Gw0-m@b+(YoTqi5+o?!1U`_51s)3*38_Y-O_wDLF5{jw*h!lcnE zl-ZMk?k&6@_;qh8^HfFY0)fi`_4p@f>01Z2#lDozq%)DUa#$ii1GAC%hB_SsHudjG z&+La|I-@!q`M*+uBfRCh+A2IWc~3cVnRJ7UKWfdftmw4hLjBXc3M3m_jpg>?9X!N{ z$5J6x??Us9*4ODMbX9Vh-rDLIp;g0%ZdY$@;}pLvD1@krikZ8*+G``+$A`xcx6IC$ zcTSGzWn^z`GUulWNS2mXW9!PMZ|Lc7sxK-?SW$|+u8ng#RiSee)}@`BAwM10EM@wL zJLt4ih>_n*#hw6T)^%2G5oK0YNgA4|!K;)uZ>dGLyFJYZZg#I_?;jQ~^(&^>g;_ zQ^Z|Rv#vgp_2$ST9r|Mh%I$3`+V5$mO~%t29%{m{eiN~4xH3J-l3X>;*f~^^>CbiM zVt%nVgxi!t#Z;(hQ+BrT4-4~LMepIJDt+$L{C6akJ=@i||5zwJUs~hQdR4b3_PXCv z$dH#P-`b+BqV^+}DyDw^>k?nOW96j1#hNq|M{ej$kxsTXS(kX8wsbo6CR1Bcek3@* zx?ID~uAH*T%(qg7SDuY*$Dg5S+N--RCQVc4102uJZ_5aM zx|KUzQkYpukemNUqy7S3_fs*Vt8UmhA*T*KT0*alG_B;T8O?dLQ|!a#SNC^B5Q+*T z>Csn5V2xecH9j?;X=Smxes~y3AJOmL|7wYC6aju1oSBO8Xb! z1cnTio75?U5E|ad;uO&_%+;pDb*GJqG={~Qkk_3Vi8y=nU0}&=v+(ln&)n2yqz_zE zom6E*&|uqf>Tkz5(k<*YKhv0)_D!vE^K;8`(Y(0++TBY>&yJyS86I<$HaY&B)>Mh6 zA88<}HfE77ja%*l0TxTD?{pQlF#V@jMyb6l&uO`}v0hm@ z-RyhwVbPt}*K}{3YuBdABn*ZbJ=!7J@i_)CCdA^qWaE4i`_p~-%7R-rFSTIIwYMMo zpfvh(MXHm|{-onJGvk~-mY-{{%rb>h{`*`TI~DuD9gNdgn@e~U=WDzcm3xzrZr5jMBljJXZkuR$qwxq z#T&Ofs#R48@)X3wwHoC!uW}tuzoOSEHMTJ0r|6j9_Oi8XhKcG|V>~nF(3O*TGd1c7 zWf`!Ci(CnNn)lvywt}%1o^UHLX|~iOF$MqfwMfqH)qYbdc1knd{}d^n_tC z+Uf02lB0nR3{&Z<$AI!_{`BW%lQ|{bco%Dis=pA3cAv83zCWAegL7)iTk~@9RpX4; ziu0P<=Q0=g%_1K-# z`wE@Ipn=<*g4^g##hOz|HC2;nsf*{5D=$4MQCu>=QrWF#FmaxqTdG5^Dou%d<1@tW za%c|ytB{IR^njsHSuywQKSb0fx$PCsAKY@w^zP1q>1U@U`#r75>=YFcNc(bBJeZ@> zcJ4WBv&VN}l1ikLpFk+DWHDmPsU`XeNz zvgh5-VRB_nNM&@ZUvEp@Q;ea1O;DlJ()sT4l$;1Eg8oR-+g^SUzjsJx-EVrgnff zQ9Nr(b%wQ)wK~t(le^mIwTD9y&pGLWyUD8zgU#|~8?=%S zEdPkgU9A-Hi7T{DiWsSIeT5W~TxRP{g)QCh zOlc)v<0Pi+8&WNNH|TgP&d6Mm=aU;Wjs7$;t_{yl`@!iYea0fu>8SV; zUymx5uXX7k1NgY%w#5imZpzT>v-mx$JrnG?Q_221I;p4Rlf9lSA=+g#w6AdPZf@z~8lP5$8$2Mt|5&x~0+d~5Y-dsGmq=WyXg z_gc`MvL8+_q-R%4S!IUP-u$Q&S&>&@-uA^DSA4#IAekpMl*mK)AmJfpoe|U1xBhP0 zWNwa|*=qforIXOI+IKpKxua;MBm8F<67L&T(PM3tEI$m~r#}Yt-}KH(R0j|Ujc|pX zS`Q}{hrQ!>%D7O>npY4x&ix16<#M{>M)7G5{J~8AX2ql|Den4&Tbwmg@f`nLb$Y! z^7<_4*gbTIUqTGlvKd^46iNDQsv@rBb78WfqvP^k0;^?^-RPRg_B6LVYm5o+?iA}e z-ak0H25$)UbCvs37uV8+=D0q8MRbWb#~>3u+U|NGAw5r8&1{DMl-w&}%Z(P8AMD)M z3HQ6^F~gf;*0{48k0L2z0Z3qPi&u!iq^f$grj4;!TGkRvI^Hz@q@DjSKM=< z+{*EidY)N4+a-ySJc4MhS}2K(srs&(aR!DHQn%&55YkvSligF_7~WOdz%3HOR3FXO+>tZUDuan# zFQ0U+-FJ`KG}KEp%)TQzIvn);g3FAmFT&vw)*fMJ=H#1+4FRLGaSY<>lwJw1+;lA+>6O z2~Q3Baa>Hgul9aNPp?~9ski&X$C$l=o;vSpm1-MG#2x4dYokeviHIZQGzC6g>heAd ztBuOva#%60i!-db#PKq?f8Dk@NsB*6ZHOHwo14Q(J(bnVbCAC%s$A%`Q|_ng#x1An z^LIau^g;(2XV*09qVBWVr8L}@S@8P9lyY^Q(+V7v_-51^X$h%H0QJ^Qr#tAQ0!}T3 zn?^O;%SRf0 z*2OZ$6QhMy&fZpx*15_3BVbz|Q~N@LF6FcSV#7%;)3B80~&zEXf7M-k#MNL!;q2 zjq04J#BEF=DU<#w3yGfb>8aYmI_QRi&Ux~uhs2LKYlE$w8uiTzZ`;4}eu169-Tp3Rar$_jiklzd3Zi6uo6xc%Vg<1YTX4;^d|ZOxqb+z-vyDV>`4WGJ6>*%QlGt7@8;(J3F_@Dxii zbZz=uWGowry!KuY18arPedVHG_eqAXw=Kyx$^?mxxgtWVw9%(EZ5gT!fjw9bc6H_h z8KZK@-y$XPqJ?{RzhntHFjQqw?`h}sS3CB}7_vh*a-k_kgNdQ#+78qI0coEoF~q_k zx5BokJmVkW?l}zobLl6S-rbXDayhf8GO172D-6CZ^vzW`psf=^9=X&gjnjNWy zgyxh()D6{te4`lYvwqsDoK>zpcf(0Jlut;5Ce6|*)n>2%Q{Wv;@SnaD%`8@&S(;y< zcyS8T9i zM>aX@-qh~*qzwCLx05q>F1MDJowcibwXXL+06{z5Dk zj|%1Pj;T~QrOjCRnm?m=ouw>XnkoEWjPfh#F8Z=%Z(FE7O*=yw{^S`q2hL^FUgaf{ zp-+_s%rrKXC;+sy@e~&u>KNF*weJi z;m5qO>B_g7hToHh`yT^oV-24xTwXptm~8TYeZh5J@`Ien*6A;2@&c2?QbwfJWc$|& zORqWX>W=>^;iJVX#Jn>l!MA%VQ`8!4ijOc|Pqu5n+L$%Hg);+w95k(Gytf5|!vpN+ z7~Yq;er$A^=Fw}x)12JaIFB?oEG!HbTi2R=$Nukc1cim*PcKM&mUgR<>1PfvWR`KM z*~2n3&g-Z;DJxrOk9JL*jYe5J#S?3%j-1j?SjLP(aWOCp_l(_H2o;@$T&x{RnzhP;^Z-qyX7`G-Ky&LVQ_WbwAsb!dSN_^#$#vu z*n#(H@kG8DyP2GlJ>;YMMK4M8Bo!kI6wa>V{m;Nk4Nt^g$K9hY@mVY5TzH1dn%QW%5(Ne>ye1G9=<5+0YzGmK9u$7L0S)Lq@j6%GBm$TdZh42 zcJ`Z=`olBss_-wd#_6*ng$X)U(iEy{cCUnlWLPD|?z%nx-wD{9D#WfUzZ=;4z!^Ul z8V`!6XW*BDgEMGeN-uC{8z7?wRK?Mx-Zf&ur^s#MPk(z zOZSB;wjt!9_1%jwjoWg~9hX`;ixX}67gL`1oRvWz zKMJ3!pFMK?qSCOnNw(iHnKF8|<72V?=zRXr-dULhcidxOig%_WMtjVLp3T@D)AF)o z!r-Q7iF)N}S{0S%5XRTNBpT$gMC-2uHfD>}7B?VL!=dK8yt5_zG*^5EC7~Kn{gMuA zhtv8FPsKSe8fJMq1eZ8-Uz{?AXqN^|-41zZJ~67q%f}{^^se8JI@3h3V0h6&dqB$0 zI*~EugB&{ttMiEGvqh+{j` zs^6=TbTKHcj7gKh!XQ9%0S_^3Snij(B1wS7HDC+jink?2r+6U!K?CGO|3%;x1=H)?jb(s8cZkBG|6tyXjHig!zs`h}8=T(NX#C07?66`DPO6AUI zIZyH%oDyP2lQYEXPU&hvH?W3pN%c5XVdbRYE6Dm$za*L}kRZPkU3U|z&s(s2T~i^e z0Fj*uH|50b6&THjrIofmuGk<@XAb+gjTSH zV7eBK@>H@9~Tq#TQ*jpo>{8Bnq3B{*wb5ouZDrgJ6!xI;**J8uk zSm$TVc**M=$KB<@I*v!G`PAShC_WwG3kEeO{96vJY*3=YFM@>IuZ@Ah%r38vHf?~J znW@8RC-qYbbx&UtSL}?GShTTyZv&Bkwcj0=88%i@u1v{9M%d+DYPIL2PX@(nF{A6! z{@_k!@yuyVa!5hr$K8E6wZ>>IzGRuH%eb`Q1w8KvQjYhhl`pq*7rwm>a|oIgO0ca8 z7AK03pCG7y|5oYLkhJ=9oU6w5>LrHQ2Xs;L9w7-Tr>Y3;mMT@Z*_?bo7n8e z_`_aYn9X|sO9q=SqsM^hk=*9IzcwY!N9+gl%pqKfb3LNxdXjFw42WOI&6{J6Q-E44 zHgiADQth$HAv~M7u6h6*_A_uyI*~_w*2vryonTJUO^}Lb>`7UfX1FCFvd4Nl(aNip zHvJu03V~8urawGe(1%@G(XLI7WYnK&_*P2hsN{W3(R<=&TS9nXl$$TT)C!hqv&j~R z*sw9uE8M9cDfdx6tJ`^T&HbQV_N~|9*z+fh`vVAHC1;ya5zf!}U3vyd z%4>6tQ>-jvJ@UEMm5*Y=g@+dD2;8*l?5o&Q(T{)8|cdPo>$5tO`ef(SOJ3b1%M2#It9C^C z@$!q*t@Z8=Xlv1cV-Q>}Vnx9DuEPXrm!zOY!0U!FI>pF3_& z8EXtPX2WAO5H*y*rO;5MmhUB5U~0oI^;BErMtG+;Xh*#uxD}n7DlTG|@Gf6yo|&g% z(VkKvrFd8}+)BOwng11*SZ!YhrU{w+A#S0{HRlcMPB&BN6}-0|8{W@3duk=?wKhScmAN3=#djNvO1qilUSx0CG0?dT z+LVY1+J(j;9`WKN8J9I%xhL#mck$5dz5Iqt+oY7{U9YY37kbcq{4x;k@l>0je_8$>&8LMgW8*$# zt~BZ_6Xlgv4U?bN9)CRTNsApqx4yPb`LW2pXRKN*L@Z!mK*})oH7SSukx}c|_a!HucEq;F0 zR3PKUlJXdofjiYh{jgVnB+jc2W8vIcwxwmMhn?0wr$jW=l+PuuOE7mZKE+UvkE4lK z9VDZHJZ>`Dpj5((FT5Z`0g>m-DHpCvER7Zzz>DQ1y}f{|?lc^&b`_5q&w#8j@jjth)krYJ$9ouid6}?| zvugX}NE<+Jj<}Xr!guS@@OX%CuL*@7Y?uPZYtM=|S4q~#TGSgEd5JB{R-icB3{%9a z+AjzF$(tkHYtQFZEAoVK-+Znl+Ia}UotCgqBS9!&nyEyrZq;6V#(q#+i z{HtnXeHD9elF)~mp|V|{?vd||;>drTGB;!R z;5PG0d~3iJC{EDCr)Q6zwR=RyxV}v;&KY{lfE$YQc#W{@A#`0&bbQxKCa_4{+Pajv zKGW8bz>t$kR%ve{y+=@Zttn@`oY_?Pm^}OeX`%sODMtsQJ53Vhf za_(KUzNUSLt|yh-r&`6#8+QtQn#}*V0Jy?Bol5Sn2z)0#A8lX9bNxIE$(Qzo2GvnEi2Yy zB}L-8_Fx45MZJqke=rDg#n07MBH}JKt`JL7oJ#Eur0XMZDw#UKuzI)T7M|z6E0F(2 zC|ZGiT!SAl>Us5sGVpS-fsp?JSK;dLbSW=oC51ib%tMOmL3S*73NPOpn@bBJyb!I- zV^mh%X$xh% zMk_i(6v|xyoqZC|629Y=8;wW$!*|~h@qZzx8$2hYk$Qijgj?1m@8O#V(@zwkm$SJS z3+*IVvdHi>`4<+MZCtBt>JJ7#Bse^oVcQF@I8zW3{#b~%V8jD9$j_p|g?$P71ZKVK zxNAHqm1xQajVymP{Q{1c+gY0wy&z&3Nz%hoEa9`oK~-vX+TotIlpE(Wv6q#bDv?ZM z>Y~tL%v4xpGAs18j+cC8{vxCBt_!K+4)su~icIo8kHFG~p<%8aFP{VO;*LS(rDO`T zC>_hpu-mqpPemcjzO91sju63IU6$O&8LmSKxMS*zmm(duGdo*Xckbyt2*|MC**x} zV_I|gRX^p0^6E;(G_%*^Wga71Bh*{_5!0@2rF&S4XogpeQ_%ftH5j`l)f-ta4po(w z%?X7X88KhV=3Rl_-?^$fAf~d3i}kQEbYuu_+Pfp zMN-r6^ksCCUO^zU7pkmjpMxEYgTM*v67AFM{q%;Zo+v-l-lT29J#gB7BG^%PhjW$V z1uIdnxU)x2wNX@2QMonW0n<(5k1mr(M=3`mFY1!7Z7jxgY{{60Ume>>xt+>eQ&f80 zeZF+^V0i=vRj-M%_v_Wzk7f5iAgipRi<4I?!U#$pTF=mqw7S0;xN5ce#`?ZAP2QEf znn^xw!4Itk3KzS`b7`$G@ivI=y(;rkEoV)P(;nWU)fii8yXD`y=Fy+wfqOT%an6zT zhRGMB_wnmZw!K79tBKaA!DjGr7cT*!nIE`LDpa1MGH=)P;3Wa9+%jzv-@3GRoH}-h zxx}_6Ku0N4`t@y-Z397iw)=X16igACzK}Ug_C2LioX^6$QV-Qz+Li=6=^t|9ykoVp z10Q%Lo?ImIVy}V_*)jS8kl_!`^b(U!r7*AD8AW{RRadEzmQHfLIK|w{PL&SazAp~K#c)g^{oSsQ$Dc~25u?M7Bigv-AFMadS6$E7AyQ#17g-a8wN zsO7X20fSAQQkmM`^oIge)^(=K&qwvfM%6{)q9dc@TxvdRgoLPVGWLPLIFJxP<+J3F z#tLIf_J_!;xm#b6F*Bvn4vI17+$Q>5gL9#sFzsD>k#*g+0AcMaR(j5}%V|A}u3cF? z7!40Dy9BRYm&-hT|Buz~*|BrHTQ6qaxtAs@bSZ>J!4nM)$<^DZx&5hMLZkWxW0QC2 zi|Y`c5-mNChr+P7mm8f**$sLGi66I#eSjGRw20NeOMERovr3s3MsFQBXcVlgqD-Nc zM0q20aPl39i#sBe(`{rX&1$=Om(-b{ z_#L6^0k>f-iBTmFpHZ%qn}X%yP|ID&d&`Q%;jmRq40$CN-o3JdGMPm0w`)4BZ#b%n zHcdGhd`|_z?oV5z-OR?TjY!2*O)=1~s>ZN_Xbfras=1RESPM@(2_)EhtVfXs-n&7j z5}?_8TdU8#!`yT?cr_g2R6QO(^o81 ztSfEI*&+@Y5Y|%BuN-;mgTva?lR=Tma4AR42cOI1PIl9+NJE6taI^2z+i%k9d`p}T zrg1(uOC`H$4CnQ6+lEfMug)V-WiH+z*C zi-$3phP{&Fi-}Mc4vNtWB`{b^JtszD&CSNJEF95XE|BniOM))dV)*BWA)y3^VTby zB-PCK@L3($8+q7mq1pyyIVEW5t=oo@Ji;sSVjTSeQz5%|3XunY)V0mE3i6t57E3a1SI>dgdVWqsLk^DmA;OSC-Rd;$@iJ*1f5*gPFanGEUg4BGt zz90<+oqU5&?m$h5s8$>1+@4G&ok%;uSn>xB+=)at2J(vsKD;CBpN=3#)Oz<4NS3@= zq^>u$;I(;Zd4x7&zTc`T()M^DC11axU!3EoUPv3E>n#M6w zo`M%rd;a1Z8W9Zzm%GWL$wkup?{-qA1(C{RQK!)QHCCh5Zn^`_>Is@?eeqV4(L$$O zhg(#KYoezGANw(A4w&Nhvl|!_Fp_<6H;y+R?@>ECADt{073g4}*CX*!hXj^nc{VYq z>W|ngUAu=tOdbC7Yzx7IC7kFFhYh=d>9alW;8;1D0c zK}nlpcEM8$j^VUM=B3ZS+gQ2sir3ixni-J~CllT2y@BLiG<$t=j4g8JDLx9iUJC`Y zd{MDY2%kywELg5-hm|+T z`6pn(req=sE1Z{ZToVjTtt7Ojh}h>E?0hI{aIVO+A+Y9cMgyDMA#JHUy}@P=y_s*h z{ADtc7KeNTeP-r@X(xSUoXYZa@5h{T`v6}dqyPDiryr9jH`N{lWR-I?^cqL=m;~gg zqP68OgkW(;OG}^;CX5AJkQ-lS?y6fgQYE35B+)2v@6|ehfScSwi-*TRcQc*pQA7Xa zm9uo_t~ACy7TLCau!nvgkjVTiKl0`mt^W4ufmtqY`kd&ud02T^u@pK@JOT`)L}^SL zL+EsA_|)Fzg^%*6l%08(6v-@RZJ*-rGH6Or+^E7krk>F>z^Z6aRLb}`juLJm(r^A8 z|A}K|iyoy#$+l6xwq^m*@>kV_a2X2*7HLr(Cd`5v<;z*%Ze*1`4-ip0^xzbbk`N zxnJAV?gNv`HZq_HNC>?#NL^QVs=deOxt_q;fk^L9X=!TXyPr|Ox+h#!UN z_nK7~+78g1VKifLYpS*~5$$QeJZPKkW74qW>${~HknOkR5VMGuTEq^GSIkkYFWghZ z)*IVj@XOagl(Eur*!Rv~@WY}aT=rE~u3>$mWkpk<&cEeNm(Vn$PM*NR8nSW!gY#R} zDyWJx_lvnH6AHTFW{isJi3+_d(N_~(T?em~S>zl8>vG9HPcJ}()W}N$$feCLv~s02 zwP!uk8n8Xx*DA=;`~<3B)6q9aRV}V4B+Wie$A3+5AWJNRH>y4_jfsjk*Zzi)t!q8o zbKkIwH0Y`=#{Gj|%HX4Gw`;?_UFM98QmYnM~ zwu%1443N5v;#F2jD{ToEi_=XlUkKT)>{%6o#t`k)Qbnf;r{mOkT25r5m%y^-B2^G| z15I9uj|$SkZXKkmEw}>D>ZZ^OK04vd@L4r%mTBE;FtCY&z76lDQ0g_-Hs{!mQRP<+ z!ELn}LurcJO<`t0L^ukeMBim=v)8~637`P1iv5joI+xiulvCpJT_akl(?SHI- zt{PZmKNP*~JnWY=u+MhYne+D0sGHi95JXLM@`b#$QUZv^?iEl;-LrDpLV64)qz}>{ z_;!qOU}BYsMt(HSCQ?xF-- zi~4)|VWmX85jUQg&F<3Px%aZs*Wd_$|4lmP6cCq%=SlS0oC!9l)i+hB z8&%X4{**~!xiPH1C#BG~P#nNtKfqm|IU^drVZmbWl)7O*?X!^0pKuD^OR03ONJAUq z@+M}xEz14%7cl$Er9-~`%xI`OE9RYfN1g4~GtJ4_oYSMRTq*8g=~a#HQ5j9;9<^)J zO#%s0IQO8FuJubr6qT_ivJHVdL^e)FK|Ygry`3vrw*;0K2<+=-NF7!z(Nf3?>ni10 zTTcH_^^pWUj5l*6hIYtiTGT?pHZu|Nf&EnZhKYqe_lxIfln9<^<{>JVxTqpJK_W7d z(wvN(Lon_8x=}z=t6*|L(jN?CzXZv7VMLf4^?F}3$3~~s2%&%0D=~KwYIifaufcHO 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