From 563148998e25c70098ba5337faef907da117fbee Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 23:26:18 +0200 Subject: [PATCH] feat: good plugin state --- plugins/circleci/src/api/index.ts | 10 ++--- .../src/assets/circle-logo-badge-white-15.png | Bin 0 -> 46850 bytes .../circleci/src/components/Layout/Layout.tsx | 13 ++++++- .../components/PluginHeader/PluginHeader.tsx | 25 ++++++------ .../pages/BuildsPage/lib/Builds/Builds.tsx | 11 ++++-- .../pages/BuildsPage/lib/CITable/CITable.tsx | 14 ++++--- .../DetailedViewPage/DetailedViewPage.tsx | 36 ++++++++++++++++-- .../lib/ActionOutput/ActionOutput.tsx | 16 ++++++-- .../src/state/models/buildWithSteps.ts | 9 +++-- plugins/circleci/src/state/models/builds.ts | 18 +++++++++ 10 files changed, 112 insertions(+), 40 deletions(-) create mode 100644 plugins/circleci/src/assets/circle-logo-badge-white-15.png diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index c44988509f..44f081878f 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -36,12 +36,10 @@ export class CircleCIApi { } async retry(buildNumber: number, options: CircleCIOptions) { - return postBuildActions( - options.token, - buildNumber, - BuildAction.RETRY, - options, - ); + return postBuildActions(options.token, buildNumber, BuildAction.RETRY, { + circleHost: this.apiUrl, + ...options.vcs, + }); } async getBuilds(options: CircleCIOptions) { diff --git a/plugins/circleci/src/assets/circle-logo-badge-white-15.png b/plugins/circleci/src/assets/circle-logo-badge-white-15.png new file mode 100644 index 0000000000000000000000000000000000000000..4d094c9c5725e334e8ec712e1bc5f5161caa31f1 GIT binary patch literal 46850 zcmX^d2{@Ep_l|WeNg)bF-(aR>OHo;dQpUcus0d}LELoC-CX`ZI#zgihS=uEnmYB5o zOv#jrkR?R+tVQ&nJNo|bdH(0ueeZJibM86k&KWzKE%QW|h$4jM(abkFAS6tL|A`QV zV5FmV^FQ!^B8SYKgAvkzzcv0Lgyk5ABBX?9n@pU-8vDNt*{69=t!=B@FzwQdp30ct zKskJgqIN5^cA5O#>gGTQ5>%B@+U}OG6eMg%7>e5!FF;Vgxb*w4V1?C73Nqfj%`ELO zS)bKcVq{=oAONSqe?6!EoSyp&m25Ntc<_IU*OcZy(m~a{Pj7@crvT5sqT1QK)_G$ zAx3lANcZT=zIChrOv2vz7v{r%Ko-<^Gt1%0)3H9%V&l;v#j|&V9#e8UNc?6VA%+ysIb-5n7oqWz#O(EdZtnbp7a5UQ(1IoU7TlQGT%lh%< z1zG#Zs-gW`wt2Qk3`~!k2CAwe#H!&mrmYAkgBm?x_Cj zo4V;|1Q9B+#z)5Ky*;p|XXKb3;lzqn0ZTQ8mTFW~NXI`Pz7y zuh&Hfq#^dqo{_l&&31h+Y99d*KE&cPX8p!G534Vv--&$PQF?0iC18d-mZF~Zo=WWY z=5Ifk?N%g&>>yOrN5y#H8xFS36Zc*YD4GJXsEP^ouKvP&1uOd=i+kTsl1B9N81q9uGX@&`cf@0lWN;Y;*@{<0WJ#Wn7r5k#6P=yI4{Hx%^a9NqVk>93SFZU?4-S zm5J0{6mbIb5yX%+IS~1{Tl-G7Z)I!%if{$+q?Wy96YCcVBN7eHskFnJt-_l%ydd8) z9nRKAZvV87Jkb(B^qqD9*Km3iBk{Jyvwtoj_O`*%FvahfC<^gFbb3zUwj9=mXk>S1 z8O00;d5I4dc*7a=!6lu6lm;mgr10kPZPDlQfk1f`fQb6|++GVw)H}Fk+bwf%Z5P1q zJU+Y8Ptq|OaYJ5zH+?JyporkP)8`ySpCw*dC_sPYT;UR?A_1^tv%!^kZF(rZ(_8^@ zMJAnPPHw*+4@8`Y_etG<@nbLd!dHYC&8jK6%u{;sXPXKJ>6=^*GdgjHq9`i!FOCl> zJ}(VIa~1fM|JdF_Ic(vrjRg8+aqUg@kjKD5eEz(Q+fTz`eQ5u^C%fR-{dk+_ecp#{ z?I=XlpI9h~STR^^;@;KXl>AMWKrA8uL@P&5WwAa8j3t0tU~FN6SQO?-gjVI^vyvPn zk_~(Yne?Y7?BoKYZ5x6d$2um(p1CyH8M5=rF`Y8Zoi0!k> z+P635Lbgkywt`uU6!r9YKE&Dypt24MIp2{y3?Eog%_{-ZD`8>#v}&|^u* z7C=E}QWUV>3~&{F*57uT4;7u1xeljeC(!66xpEW8!W&TsM8_gYe{|)#m1vZ-AfkFV z=UPeIBsQPnM{cX}an(Y!w+2VWqFaTMw zQ=405oaA^?mNxi;fI`jye)>fw78Lz6c&k3`;mzuWoMmDRfwNrGJr41e@*pbK*!F~aDjWpL^epPz zLZENP=A|k1#S-{hQZr>g=VaK&#vCo4(HK}RsEkgd>aC1XQZW4EFcyp!kBcMjach7+ z!zBS{vogHluikIQ%Mn_uW%J9eV~8wFKyFf1w7ZU~B5GgZ;|l?0G@MG~IM#kT4R$9}l zAeVQ0;o)7Nh!P#U7~j7NBD;0KhLC!FPmkdppt*Kp#*2)zZGk3EG~m~l)wEySc60o} za*}duizWk0O2ZnwW}|V}qqd{?46gL+Yll+zfsngx2XWx~&yc*&^0bJ%V~@kqpJ`|L zP(u=&-bm91uQqUoBZi(gSz#@x+T5I`tukX-G_ILbJqkLZViZuyS`F+S{Ry!CMq zV5(t4wj4|h-C|Efzp;@V*E#P2T|yb*o$LCHTN1=~;aa z)3N+a2X)3F+08Yl@!39iJIJC0*5TW7g7gDpj-P(~Rt5^P%*u0`$>~7qRBRzjAF2!0 zGR9sI!25nkW={78+au~Ikk9SNTOPzEU9Z1Jax=(?wGMbz@RVk;E{ufti5X1Xt?n9c zihQuOE^F1V){O@?(D!YX&V=222QYv1d~ClZelJp-1)PsthEG;fx;>Huv9+pwv^#Qpdr1<}HTs@D3PIrh z-TwixYwRU;xt`nrl7|M`jX(zI(USB>i&wRfcd7stxvs_zk6!ME!&~0YgW1=z9K@q8 zVA8V&&NCvcfmREJQ5l#z`dWR<&{vcZls>}hG2_H!BeoET3ak3nS-le*0ZtUs z63OAe4*rkbhr!u2^HRRN4;vmt4yS1(HeWZe18)v7617gf{!AvgB1HEVcU(%&c-3f+ z!hk9CT)8|0!Krm!H|$`)u$uiG{#;OAdQ~&fYH*5jM93PWIPCfu;ukAvL4lcfRnB9_;n<5Hiel7h$&EH(HO%FDJb_$0gF z$23)%|0Y=?4HhG7a+GwfiPR1d$NWnDuFcPv@s2k$%1y7up3d3}uqpjuo3i9LR!FpS za2JDS;Z8&ephR?+#d%iqR$yj`&=6>w7xB`HF z!z&tRg-n+cd~jK7HDZ`6LhvDi#+Ak00MSHYEf-*N3K`|E#DgD6xfp>ql`XWpiMy{G zxQU^Md*N8?c@DWk*z+PJuMNc3L2WBY>gbBrBwiNJK0=(clwAyxXGIX#!admxtfZ1PBfCh9*IEynBhf&@4 zkC{!eU_T4QV5d;|9IJUaXh0|-G|OS3>lr?}U$F_1>k7oE;Sqxy@f7TeXl1!RY5)Sz zCl+6~nz!^UCahJnxqpP!zVB=Q2@Gx;y9QyVU>}MNpagAVcj}X5mh}q9@mtQA;s%-=lzj zznOD5y0uE4Ir+OVwb&)oBsGesGBS8ApiCW2zkXYKEA}?XcAT+Wtr+BA6Fi^p7Guu? z!+l@lBH;@?Il|&78@q>0hQ{+^n6LCMvgfS5)^p!Y>1g=Ud{#@gq#I>hC_Js z7n$kzmY+RBG(_qCfQ&-R(c2L1f?=rQ*wfG7_mFNoBt%(h7KarN9bn@@EfeA)xek&Z z&uyS__bxJZ3%JXPA%kt$0HSeE72KNhmYe>qz6+-mzLJw)TU|Gua7*?2uH+~$>yAAf}LtM0ETX(ZOme#Ne zERVZVP(A^|GuQ4GB^YFfhSTnL03?3E1J|`@j$!#grC(vh8pCEViLDg6*{-3?J^{kA zG&leY3M+h)qSBr~MiaI1_Vmm491DA%dQl&S)5@z{OzAOzv9ubctIZB0jE)7T1oaBi z4FO7}b(SN};&@PabX6C@|A+`-f-RuT^_(Hq@feFF2J}5k>mV5ZxY~pmvekG_Exo?m*vz^+s!o=}xD!%iQuo3Lq1InC#0W3AmRGB3!!WYD z1Uw^)oH!5Clb^PKj-E~juLL!EkwjT%0k^~NY$?LVJo7;}EVfM{l`RnDLe_*OF-5WU zoyT(`?94A}>uA3sL|IZG5fXlqJb^`Vb(TRH`<9EcR?e>EYol+bbh+_#6e%=xeeH9S z=0z_ObLdgO>;^7{K-8!oOJfYpSui`}Jo|-wtALafevFSLJPPM$d(s+Y1-YA-EnT|w zI_iJz%&6swA4}Ok@f>6U_VhhAbL0mf8pU*8g00j_#@Zuk1?#y0caR zdRx;r^TWyt_qH(B_)g;)vU_x+`P2yn*1 zx&0b%CwCrWoFPNDO_HxvH-3&a{!h*^Bz^M##G{5wo`3ZQDFzn*TrVTYB>`hy?0Cw- z-Kr{b;uRS9CWpCyA5PXbBkICkso@lFClp@?3_1l$KeUE6VmNo^4u^$&2`nXnmc5LR z1TT!In;DJxAv0Ps>=tc~i^EG)lXNVjb;;yXF5!%Rc%s0)b2k zKqg<0zf;Sqw5ru*d32Q|aNuRUecPHkW()@(%$~R{FL>aYfbuZo zuly8P0!lbRSer6OT(s40A)hd?F*EhQ0f1i^B=M6qFAPQWNIU~>DM`6=tY;fhL{4B! zcV_Nf2|%wuBU^NAXcK2eW40Ij`p^VQFDl0o(OLLL@^BQ)kHRWPVqogzoif|w$e#?uB= z);W1aRlxPCQtY?yYAL*H2c!tCXvDIA>{~9>woa9JbzRbb4vBp# z%KF#t1#Qb|?uC7M~&P$Ww~-`j3NUE}EV{foV7;F|KDlV$ZXb>?GYDLR@i3j8FYvj?4vd| z;9s`T2SiQbll5Pc8#b#g&WrFDDY_ybdr1GUH>OYZInC0F4O_O2*D z(UsGk9BEHIMj^WYc{?W>sQ2I%9a=sq7ShC(QPzxzML4d9iybBe>*Sm$OzdTLmhvQ! zF7%6`^AmC|BBl)&>^bH}crrCH9s7$Sh%@tDjjIj1o@nxhrDm3{+;Vk|m89vzDN16@ zoQYvoYb2g~i3V6ou?Jjo6h?WV`IOvZ23t^{19{fhk*enCxbs?aq4ph3QJ=Mf%1#{y zU14*(rjbRi3eLe5dXQ0gK^~vQx>Nqr+SEr~P`UpTx%voCY?0!yil-Z&kKD@5?ngFL zvd8g6vr(@LCcph|Sto1*zM6maGOg!xKqqSZ@O1EM)F?x-p}7yqL5y~#{vQ5FF> zG~n`==^;((UE)$)Bx>65_9!RQ4=<-{^yS=MJaCq;7ow}M3L3+54us#3OS~_~YLSi| zHp(WozQl9Uu;v~IA$58xIL8+Mi-op44Cu!OFt_L-zk3voMR zQPZ$AXU5*Y+kS}T7{WD{`V>rS+FxIT3U0V^1l;#X+i3!5Z%Cd2Yk9||ZLs+KM(6`* zZj|sxpm14VHNWaKDFG|no1<9K*BgADZ#U4*1{UXf`TPVCtwbv)>5!>(E zGlu5ao8O$wJTcF$Rywxey{(Sz;y_^x1S`BEuUSQ40@8yk^=PN&rZ(K#<6x8}IPqeh zDfzDEXZDbdBy}EmtLezj<~pBtyMDD?IrX>=pWZE04zzVbh`bl<5DE~vDj5Wh#$7>;w?)^*U#Aqj+TGBIyT z@GxG3_oLR$>v-VWuvm|{|3MVTwf7%;Jc^1chbU?}^i^aS{=cvky}~z?L&RYlfOK2; zoFha<)|#Ht1)8E^#!|6G@ARu5^7I>OjrT}u9`s3VI82>wU~Tp{K>hm^Wjg0hSYA{jLUX+UI4cbrxptE1zEPF9fBg}h(m}`^uJkA5 z+PbA@9~g#RY0Zf zOO@f)GXCu^*rmD&$70>0FE%bwE1t8!Xv4&IhLkqfQjE!alz^ET=NJ*PbD$g>@xCpe0~N#% zX2zZmd**I>sQ+C6xG8EfnRw&u{{Muozt^>vi%7hmj2iFvE9c!qA#AemkjcW zVSeXn4AN(IJTWtm+o8?5TC?c*4<1bHt22zw&EiFnoRaviK41{w4SXdZ?Ugu_V7An4YaA&c9EJ;6dc~;~;1MDj#*JSf?(7zo#~OV>+b1 z5m4SLr}9gKXQR;0-dd8k2kVA(tkbgtbK2ba_NM)k*YWnD1OHzcu;kX}{Sa>SGd^D9 z?H_VxYql;U`l3tWPTsYhe)rd^>dSII3s-LbeEDxMiFz{k-(HgAZY5bLwvCq?LR`<| zD(e>TTf4)`EAhOY=n~U%g39x*Dec?UeSdBc?)U?GTsdLAiycB5P+I&M1u>0^ICx*Al zE@$~m$NG9)3_8ZsW)zm@9`VYi21HWTOWTmA^r-2lN_B!B#AU{tUQHk&7? zd=H}0ITwN+g{EUjPsn7KeOpnzWzGV#Z6MB4NjV$6QOD$8%U6Gm9b04EBY4>wmQv@s zzhtGZIiHw*`ou;D$&vI2q%Cvai*8}%c7b*(ddyW@$`*$l7+gb1HE{>YRJp}>6^(9oXNRGS~eF|pktGN z7;j#(%daSrXf}VNJNiag8VPp67*Zv2t9gqL$yMa|PRDS7KmTc_e$jr8-F&CF0`89! z=8T2YVAJXfz1lv#&0aDUvSHt2;%2|rW=$UnpUs0d4U3r+od*8P4w9iw>ecrFBe#DZ z(*_r{);?G>O>$IU7aIvSP$)MsRKNRj8zUXz0?wButsCq3sG{q{$ z?~RgYduKB}f1UXEXZ7~F(@?f~_J^_i^og5fV(Is}90Zr|wFvvy*YP6a^{1~6?nyrR zRY_G6npA3!Wt^B?<78&iP^0$_2kb2O@~&2uHY@cqH>Sgq^AC1x&m&2Rr(W-W-ZhE)i+X$O!}J-VaCDb?wKvF%9sgtJ zJ3<*|3;uOC+^$e^n24w@EgKSEuowf~6jBGx08kC@#q zyK{m$g{=KzJ3UPt7Znw_k;QiI&~h^o6BAPBMm_mD|Ks?pv&<5`(WA>(czNl0s3>+_ zdt>mcG`YLfHOsN`7KJ$N$1GI6KcfX1PR_}1%jZi)TV7&+x>v7ylss>hr6^)M{!RiV zEK7P%$sQ6WKh zW2?m9kawi3k_AsRQpBJ?COC1Qx=^NtNkh3kr?GP4JOs2&d63Q(Jn^VG`J`ig20|aF zSHW#ROjOW)+KUzi@dov>QJ1>|H#3^rXR~z1aSMa&mC7YzOLlkq+i_%faY@! zbFQ~Fn=R(DW+2Z5ayj(6{4lbf>nuEloOhU?*uErf|20 zqlL+|C|^X=jO)oE$o>{cRlIn9J0dQ+z`Blf9F&E%I!RJ6EalzQlF%iV7x_@g_x076 z(_CfFT5`N6_WQQlYIww{)~<;Fr4GJ+d=bCN}9@ znAbu;Yrp$Pp7#tep?@jKT9N)T31W=2@|9V>%pyQckaxL#}8m zq*LAgc?d7pJq=a&4#bYPdY+@Tq#g6ZKwGd3IZD4tMgL6Ee zo7QHE)X517G=rs1{?J-wFZl^lML664Q*~O5?@+*!X=y(6`(JBL{08y#=mOVlX4>vd zx&Zn)C0JvSqky&Ig4Nzq=o}l;HUk;(n4@~zYQ4TulB^Ca-8YkV68+IFhMzSS3? z0YgqhDh7pkD&Q~1IR@r0*;kZqzrG|Uh1^(H;(XkPo>qY3n@w6)u%ggBNL>iIQQ?E# z*+Bf^`M&r=bSueEdvVfKOF>nLkYA&t3Y|CZsb}57@CUeyBJOcLiryZmjIx3{t^l^D zI%Mm6pL;|XNZ?umJ*t#8V$|hzOH2aoEU-G7-_^~mJ_3d(?Tp(F>Da^iQUt_xym0mz zv<~`kw{l{hR&0V!ow52KQ|WOh>?8+UK-0jT83reJZe(PWg$O-yW*qAW$MXyjKjP}G zULYQ4NIVjd(h2uL>V*h%XXW;7(rBzfw@WqkU^rsg_M7QTidKHvV}-2=OYNEu{u z^r0iUIFKtEQ1$fq3NtQVH}EsI#XSwIAAK|T<)-}h2y9r5QOYkRRou~B1RNfAOWDUL zJW~4*dYCpV=8CU-2Ws&}KOx7AKwleaMG>k61JGJz9>gp(sLy~&LN%MX0ZDQLE#$5< zrfJFiXjQS*(eOhQQ4}^2Nv{J_&IjeFr^I7#1l%WWaEiGxFtM|h@;YbLO9HA5O&bxI zg^F}DT*N(8qh}#J>YKd*{-E)T$}h=jaXxmg`e=c1djdYH;cP(_cyS$!RGTBGoCcLz z_N!G6OW810iVuyaondA5n=~jMo6mYb&UY9*4wD8wtJla!<=hU95X53s<&aX5T{gFnD! zzQQqgQ4%!lta!ut&FplLM%0ttl(Ey%ho-IY!M`r*tOLvC754Yw#*oWb&aj|8y~#6N66HU0VYEVr#Jv{;RP)5T z_};K3XQT}(miyuhzy$H;G(3FG^caTH6!*3nGyw?178?Kq0f>_bv&V>LZ2p6if93oeXodA*6^}#AsvpOB48=&Vi9!`)+NKb z^ow|%Utzrx8aC{J#5XE&k1w!SCF=2t2?Z`$9`{U8+jP=V{H-DP2C;Ep^r2C;HfVeT z&j7Vd%|Pae(;wVpxogDI_xO7Sso1pDI9cCt{xvi07~Ch@itm2vUa$-V*|*wCU_jgC z$-1*UnwFu4vQ|bqn6d^sjiY;2IGsSZUTxMO2kSRH+Xg9)w2+L>ZcMQn=j&EdxO=Uk zAcffI5q&6FtpT6!2q_;(U=*0CK?8{}2;ADvJd&k$(KCVeK1G~k@O|aNVJH9yZcQ2v zgZp=b^J%yUTU=F&Fw`4Hbn7QpI_Jly2=qa9$4Az`lthsme@jkt6N``}7nu>rsDNur z+53R|K%IhJTPThvajwy|-Jse@eB4p8{H;OG0$~((CXG3B{4Sv9fzR*uwq+^ZSP9JWoL7)LD^Uuo>Q=97r%6@rk)G|4f7qLwd6HNjOr>P zyX*%fV@R2 zQwU(WIm%4)O@eNToq=hE(eIA|TWWP>Ouk6RO86qT>8M><#ydcPeBK#&R=>kcvkj4R zvG_Q#?bc=KOz+fATWuIRlvr5L0;9m1znS9Mz6;Mf1ku&0^%P=OK+5|FeiTvbX|c`+ z8iRV$AS5|WKw;5)80s(VmRX)Ns>PX$wko6Bwen!#sLL{Pn)^$kcs|U(dclWkf%efk zr~mU*DYNTeO(2^%o80AEje%+X5$s#x05x>mBhn!1!+!OBqk`DINI&iy&4L~t)Ec-V zdWuX`WJC8`MxHvQ1W?tY){%yQQxVTgNqeDaFa&E)^oH6%--pXu(m2p5Q0JRMiAg@+d=BW?%Q)VVP3G?W*F})3LxuPF+c`N%a!y&9UIizwQsFw zPA(9M-DYi8a7?r^;DNI$oRY_^Hkk%R^?j@B`8^c5J!#1?xL6}WAy)Vo8BxJsueUu~ z=>pnPaCDTJ^KuY460=6;nLkW;JEnxh>yN430Ofvc?tG^m8eX)_!>=ed?Ygtg;pcll z2ER69vzl|HW5C6uo;Tzi^@x8&kzD#DWu;gFKftJqi^H%0wbx9{p-8kv+xnC zrJfCvi52^9%b-(T>pl1OLo)>Gf8ocOt?j;s=qBr|j@q48w1a}cLd%_qeR22Q<9`A` z;tPW7m^rTyy6V0icXF4gz=#u4thbTSCB?#;?f2Cdf~6REUkNW~G*7&b1fid>ozTnoah zU1Jp&hns{kI@#_BJ;nKzo{Bl$c)D7~MDLWVRD-i-!#gdYd%E69AnoxG;zKJYltIhT+Kn_K@>_4Cv*@|kyc{J3 zm7{%qLiF5pwG{AR^m$Otrl#4L6*zCC5cA3pARkU~YXD?0Ho>X^py31P`Z|zAU@79g z9$DkP)|m$_KUK5X)I^^a)N@M+uCf4D4`*w$j{rRh5MMVfA%|GJ{+yCW<|D2kGO>?o zuRI#gmCMFvlZGN{;N2D`Z>i1&KyRnE%rmdCr%FXu0wA-E)rvSi;eF7W`(Q9G!%zKq z*KtBj2%2Kjwg3zdH=H|0lYiG8Jxs2a-=mG3`pV(vB8Y<{HC!&sZ*&s42ULK^DO8Yj z>Kz-$iGPJq@0dolx%fTkSwJPB$%VEBm|;7uvAm>aoNhZjaV)}3;b%C3wf+dyR6+KU zUGaW~tp`MK8S!n0r*=x(L_S1z8Ph?-7GQjJJyHt|jF4Tj9$*(%Y_tfl3*b%Q6^ngd z`*Ak<15ffVP%5|g>^0FJf5=BY+@h8OS4XMdl59l(>Ueo2x$p`i}wK@g2f#jgVth* zS4$_2u#}wYTHB>u3~rHaV{JBUFkK!7(TUOZ{^xuMZ46Eu8J>d6hnu%VqQaT>?^AY? z=N&&K3!=~tgK8@fdGUs=w+{)T($E#rd3_sAdOF2WX!m;6UvP7zEuy?0FRNzCZ}=S!3-S2p6VLrKEqffA8oMys9dPN+x%4X5n7VuK$wT{1`X? zhu9n$6Idl1o4CVO8pJ0Pl4wwF-uU{7i3lofo17HcsR0^fgnB+aY~2HXFUgEC36f*; zG{JN8@%*l6JAQHWrI?n|0=3vo@61AIp66!VAeP_z7(Gm?K5=h8S|9j$cHk*yOWD7= zo@Vd>t+ds(Ji80-ygje>GgfK?IJc}EwtWLl9I}SmcR7Bp8BtrsRJjB+s4uoI&N~eK zBR#Pi-#6@3C+6KRBcqUZ9eh(j4d+&NHy~~boOtJDv|Wc7YC6)PCktBv?ZDO)98Ow1 zbN-Vk80g34Ya#8D$W*xqyVj(s;;NZ%hHzVjd#kJn`u%*GnR5ZY45Yk>f~N$2NfWa| zAUVSg5HD;25JSJbda8jM9zBO7{Z9u=!K++=9XEiSJ@1!S2LM&>q{g>du9At( z%;%#I6rYU*3*sgV$x`Ti_DzWTz7iCI>X3PTCwK=G8fp~vj}U4QeSI#kAwnJAtb-MJFq7JNrK7BVVs8#MN|f*j^QyBr*h8kQK=8RG{iPX>QOZkW3D8)Sl^ zo7_9)-Ep6*N<}~--zpl%VKYKhLz~3ipqp#`S40c1l8#lCM{c7=Bm2+dSWbu(#BM)cZiS6#wN)M(rXHa zKoyI=uc#J=faO)#Pu0V+vE|S&bPj@0DSuqau})PfhNP(7h4uuJ3?7Yma|NdpK%{HTjeIX@}%e zm31Mz`PgT_kg#__;eB&(-x4oTYKHjW;nO_GCau>Xw7rb7DRu|l8*AFi&;xmpZIbU5 zz84tHT_}QvgO*`8PrrIawOEQDl{L6+xX}ncQ(aROX&zRzg!>dkRmI>8w%bciEk~@Q z5V%0_n9idE&NDA`tXhuBPD3sNqQ>0&AIPZeg$W~DIchi+-JLA^WU2iFMZx4(cFSG7SY zBTOxzx5o{5qjKZfy!!*&rGKC3n2$2MoCE+Y;~fX2QKqfQlYgYDmO{iFN7@c_L**Vz zEED+H!3t`N=Y8j|*9Ap3s5z{TTazQ2-ml?D22HGzn@dE&lFd^h(DPE_VbMm#S{s!1XMex`rQ$VE`ey~31Rt`e1Z#VYMNuPz|= z1#5*?oqhlH0+_*;26gJ5%YxzBle_U3t5kz%J)e(V7hzS1l?$$M%Mo2IMZ7C!P;3dh zc|;b|9%(){KiUJghH`Lw8-KFk?E@>Sj`SE~#_*km%I@lY7I@{ z2{?P@msjQA(6DrjoPU$77ILZ)G=Mi86j{oAWtg>gab=tni0V^NIjr{$to`b1L{V$- zMFKOnbOjMMGvq^ijwBXtAp&7lS3$X+fXZ)8ZuFmy7NoDR#`ySFt9M=9gxdO4BmdCx zaBqYK519fpOeVdjG@ZdwVSJ3s;9P4FURL+$5en84nik<*V!S>TsP znNNXpQ^$Ti9}ts9Hvv+Ea@9oR!h1*?;3-!O+(1j=I>GPa)jc@?Z!!G_hKJLqx>uQlR# zmLBESz6tyo9J^y|l&B}I7VxpVRU@aVE)b5;BovJyKiL0W8#EKy-7w?XxIe4EHwib& zDxi=-^=jM%MSY1^#n4)fF2Y_Vhm)br7H%ZIDcDOZ(VSIA^KF;mSBhVtEovp0L>2+4 zra+))9(Hk&#>Xh=p^IrGFh}s-V%Y9B6yk{4sfe3n&eh*s{c5=T#1a7OAHTimqN1GlJh7INz|QsG&4 zpDU}R5Y^=8zAfiv&>>~`nFHN`ONEE|kof28n#=He&ZfheJiE;j_F9hI+QJ{qZ+|3K zd4I1UlH~#@dk52N=V@4WNq*PmHVARn6w zG0A&eO+Y;_4N5eC$^#O9k3gUiBSsoocNuR(d-1HsIaB)Sua1f8>KZ8()EE-gXtP1*ke1d2EIC-e`NE&z^ti7>WY43isk`s~84U~!8}B(joxtDL zVgO<5sT;o{iH||F7{6<^`Pl4;(=+<$lo!)sO!3a2>3uWDqnbNvBQk2mo||!kf-U3t z*{pMkzk$L+z1_NHOJ1)Pt0XzEGeUBbkVc)EctSMT`KQKs(QDbej`5YZ$P$E8Zc80w zk$7Fe{;(8#kZs@d-%aSVPc-?}j*;7J6w_#HJNxKkreRq z-MQ(?;n`(qJQb=#==o^WjC@17pKNR%ZT3(E;syf*y{j!K{I(v|-0~-T7-JqYS(cZO zlcxekt@bEm|Ji_uCc$>79iE?$!rzQ3Q4L>FPPWn1<<|?;Lzc>n!+@6f7K2k zHm$RsEc~k^hACh7$NF>LuzHS@5KA7cf|gd|qSg>uso0JkJ3%6+C|$4qK~35gDGSqI z-6WN@9OgK^KG_;Tzf)>HvP~R`zwlh5E&}E*afEqqhKhO;N15`UkZ%iVzUAqqr(;$@ zWwlU}KJYu~j|zy$zI(-b&Gsf?sh#sNt{#BvgUytjw*Bgg7Doo*@%!qEJ|zG6G;|or zo!|4RBC@7osORvv^Yc)6r(^Rbfd*#w_;}?Xhovi=B;M!5FlW^N*rcc$ED&M8db0_! z*?0ZY-fuMtODmL?M`O=Yh{)A1wNU2S@x(GIVVSVBPGib^LPoCDL%!jlvm}T>+>})B zJZ-<5Bxh}LY-&#xyn39Lu7fveYb+?PHhTk1dXFUQY}G$|86v6!ylkTu0{6G-X}gA4 z<%`A+R8-p%gKG6`D9$$5U+*wgpu79@mbXV$-O~#OktrAj70>L5 zI{vJ}F=@e8iT5{;&}JDM1_nXd%Ly6QUNDXozCEsb@(OV&zpf9MhD^^Id-S) z-HhVXL1%_#l?Y0}J>bJ@I+V0me<9+|U=RZ{<=4;_#TfM;o{eWT+W?b)|#HN66Z72Lj;@zFDHqoaUD+0C0PXRdb1xE5kJtAqCX%bdsX? zf^e$$hfz$`S9-#+#JCxeRU1UbFVPO5DgXDCX}51EmBEdf{-xNGA`F>8q5i1oMx&U5 z$RUTM&l_X}wY1>H{Y$9kr6@(Ti&S1p6hP}kE4tfuOS7p7iMvU^Y}M67UBb)ydoJnI z34sHG)GP{dk9%ro%w8g0Vs{=hWS|J#{MIxhwKTkiFZ;zuup0+6i8if?xtqq>HM zmU|XwTUISZ@*x$iZ8XlvC$w?3Wy-eoiv*pzwW{|(f9F`MnYa+*?n!KHZHwYpZn+!t zyN1S(BKcr<1`MV?&xTAeTHwW~jzd1w2X-kz1(uCA}$T+Fm zL4l1x?dFv)5Y&CHtIR!;v{;aJ@1`bka@(z~XP=#SOfn1amg8>|_Wx9|7*fLgYh3@# zD@rF99k&Tycub9d=E0#%KC11^N|}IwqE?^$*Q7d$G;8P;Xg5x9@Q(tE+INLt?sgh8VX*s0h@qBmHdCea z_7lQPNXiJe-$9yc+pM|{Vqn8jWf|kP`sC>0`_qMo3TKb>$O-g7K}}`9#x-dHbBh+v-gOXNbnWfMfQ2J@8!1CC?zGOj?jzaElc1 z0#R#!uk>uVx_-J`9zvZ)$gV#Ol04OC%}E%SvPbhaK%Lg`snf9JlfSV0sS$orFttf(Ma3(V-F%lkFX+Q3(*n_xg9Xng`Prjf= z9Se99yj7a5SLX631D<+dbk3?ocr-#^dLw9=DJIf~{mh`%e=^AQ zdFx#NxGX-)m*2cw0F9Yn7Hn@h@NncKgrY8kub=5%Lyy`tJeM&cZ7q`}He)M}#(I92 zmRvS~_hc{ybfj^m@Cit59woZN>ofuug@1PEHSMJPJGJVws^O5b08)UkL z%V{W~FRq_B1#vWF-taG3D2cK*9^VYFy1p;>q^(6guh$%hq6BJKy=~awu zs!P&+KYP|w*w z>j3;qIOq$0&h^0-K>WG_-|Kq_QUITp9X=uy9}Z*WjA*9%#Pxt%uiEEWhr)3Qts8XobrPOCE23Ezg6gX$`>SlSMOit5;twN?qpk z;7vXjrAOWX5_j1U`>{;44Pz!eBd#%hP)+Fc;Oo#qcx-ofKct?kcM zF@j?svmmQp+WuRV{)s0tRcg~`Ny67qcz-REwx6z1V+IReJuJHfexR!lLDotxNB#I= zvZx!vstH_I+_}D@qO&R{#5BRCCY^W~j-KJmF-|^>*{8_#puBiahy&FI3jk)dn z$^iFg@CRQkRBJGorf%uqNTl|?g2ni2S&KpSF8DgGsv1ro+}SVH#!zFbkQPL6U8jqs%xmdepTRKVS24 zl9^n{J3Ip3Jo^!bb7IC@t3h2>WnCapZ>g3>@$-()e1PBo{Ji`8$dzuA+m=UcYO7!~hM98PI7ey>2poGTn(pNFE z<08J3JShff?T|HRqZ~>rgr?Pbg)hi(UG9v6e9)ur$^M_Gh}@N`i3Fc_KFONpSOW!t zr*4;Ui}bD|i4F@Pog9{9&-inOKo=Sq=sjtTNe~0-LnsN7g9s=sFs*YZ)Nn&E#mTP% zvzM?AR;Z?&CNvOlhqU2*st{>RVnqWV8ER;t~B7{Qd``E2dPvzlI+EHhlDfJiG+c z33?Gg#`)`DI%`p!_PcpyZ!uH6yyyQr08IJ8kF-7{4tv5i^~1O1C)M-I($g|fkyn7M z<^do){c0*aAGG@)XKx-4W%vGppRp&Qq7vgVkoojht=Wz+R z?x`_{c-)K=F%=sVJ1Xig*)k^Moy650tKEMF zd*boxIzwMNn(KU=@IV~S?k*$u}T4$Jvwc}rhN})Y1Pll`O0TP%ObN5gC zvu>EqlBsr%q;aID0SG{@w(mat4D3yN2Rgo99nc$RUVBSBFBh*IBO33+)k%iHbU>cFKVLh;A!veB%S^Cmj3UX9!q@Q)F$$FnZo}c`kc!Y0 zBBbzMI5MK}!CBZIhl>lxQJ!I)@gawqdBIm)ODpFRIEN~d-xQFO(=iWvYPr{2Et+mh z`j*p{`88jb(|WGXvDT@o0 zZ~x;mhJ0)2_;iq-AJy4Zzz^{(+t{*#vhblgs|u+`ikp}>Tu$IcJDdfgv}8toX)6r@ z6h2-XA0eolf)ho2-k-PKsgA`jeFC($&;*VRtbIO|&WP`GXn1#*Y%PzUA@HI^B2Ifd zC54e3n?1|b`cnLc!-TkXsUd?PNi~oyJHJC{e()4%#{Sr5GY`(nd!`Wmh} zOo%Kq<{O*Ui1SosmQVo`w#lsP(?RO%atE!J`FC2$2x@*R*~^M4=-B;+%_O0r-Bz{EIT&`Pe@qh)R1W+=!>aYvAXDBTUQDqcPQ_I%*NsKeddZmN-_3H-@HX*7ep_ z3A`ic{#Q+SNa=~S9LHv+xRsolDDV3PZw+?|vN)i&BpOB);(O1W9)&_NX&lfB*T9L} zES67LL*F0TST8B)mdP4oKb&ysoSUKtg2{+X5Bs;|$C0>#;o@L2$%|TUpwQ)p-DpE9 z5C{%WB{s~tL^0pUt!*}=NwF?ez8FX~o%+m|lW4nHENQ#gheRt6u1LzNJO7!0xgwj^ zzY^y-rOskZ}AJZ}eGg=qtU(AfeBX9pufvLk>@=yz60D|OE%gEs*OLB`X zfx=KAV7mAWwrO-xJH2*47F@-cj%0dJ>nN^&%3nmP8`CJ)zk3O$N}%Z+!4l3CmwT1) z-+Oq4J7rf~_Q~l+E72Df6J{R9=+1ztXNBo-mRt(>s}!~War|{A5J5Nemf|~dK98oP z?2>vI&OKq`!7Z*>t4$phZ|ISeS&0b<7R<)-%29+fZc5C$L2Hsf4Yj?(i*gA}A%?|? zjGarubCp=cCQb9_VCU=4TUD3lPp@`-F>vODjLdwFh1mV!3r6m5mvNY{X(3iKTqdf; zb+}55=VKYE7y(BjWS^R^Z`qF)>FPcCRUS+9npbSMC#F9xJu4iTA&qvSq2Yc(r00>D z4c~`SGRiz`Cr|Q&b;NvMVdLje4L8TJF;kN7r|yKaat5=kZ=|M>r&gS#L@dRU|IZSL z<4=0~lbAstRLy|`==bgF+%O!B6PRfX3?IcU3Rxie>K2ALh3-NZakKTT_8Mxj$)PG= z&M@qD{(SYt`*%=IKtaGrt>DOV^21~#%ft^`#e><>2+2ngs1GXi&tD9e(yGEQ;)3+- zh75oC{@!e0UVfM?8A>5Q@>y&83 z0_|p;>J3u+Fnn@#I%w6G;#_iPi+XeQzu(EVL=cKw!tagO6_(INK$R0=W^g$ix94{o z)28=fnBM@E%Y0e`YR!B?=RO8-5h!oD_kVsMx&p+RLvJsfHBPYca3m=Oi281fc~$Nq zfJ8n|w;@FA7SS=5!ss{?ucH zn*aTQ4-Sc@2J`wKaEYMOzS#RUs-fDV6WpDn5!k_BCDC8+3rxqs=_A)9zt$nRUZgzLX_0 zGfQP$+R`HmJpoS^l>d8^K6XPXL`YEGBjm7PIhLKC=g$DJe|=`~F{L4;;{dED$I&6zCY2JXXzkw3(^Vl@QK+hif(sbbL$bTyCOr|F}E$ zp+>k$rBLT9zUfd%Lc4K3Q5LqTTOpegR%Ru5zj-r8omFUf@H+EeMSY|q_t%QQNXia6 z07lrHhmW)7_i9M!pambMh2SY-q}O-6m@i-mNXq|tOMNa2Vv)*zzc zz5hA}lc4YE)N`b^)3e#olYW$vJVC-UsSC~vJV<)gKqbO~kFA$wj~?66-fm}ln~V9F zX)>Cnh$~O+=OU3b=5lihPXTra>8`lOC>Ah4$fw*+kuX;K)c8E!4vo`C=BvQ3qLvp;Z1 zg`6S6JPazcF0vdz* z0vG+eyQk7w^a^5&anqmJlHH}CO}U5J6{G24W0b2=gA3oQKuSn^z;auL%A2MhfzzZ) z+(zDD6wCALUL-&0EAr`tylkWv{9_&M?L6Pp^e#WIV|LqqMedelCW20GZieJp?Rn_+ zdHdlc<`s73{1dQ`@4wUWLsA(e7xT=xcY=h<mB!X#x>; z&#cY?S*iTxBf52aKC!yCZ=|>&vynP?g=k?P%9UjQ`C|Q2yBF(-$`Q16G&tqm0+==< zXzQM(R$12{5+m7e+?YcwVNRAS^Z!#{r$Jm}G|N+I@U*xk-J?Qgqk9BmZmb8U%<8NV zW90Qi-p{@bRo`r?dILdTdBFZLV@Z+a^B*!4-X#RrYSU; z26L>Y*`5NbN9DTf^9n}8*xrbsc~;0d46LPr5@OD~2|gDs$e}OYrUJK@`xLq3^FFuQ z(h17(R)+pXu4Ewo;}&j4cDD(!`MVM{f>ku%k`oQ=)W{j{ca7;0ob+qGgA1;yrcB-$C2km}1;2;m?F)pUs&%~$pL z%haaZUb4qBlU2}2yI+0oI-^75Y*oipeErsaowl?K=SB!cgeOXf`KcwrP^1a2(P5Eq zy({{#U;ok|M17@hsJ0Zh@UDH{*)3T6i*~$XoB@I>w?Aa9W;Aflr%GMVlU2XME~`oG zSWEX`dv4WedK(aAxZj8zCMf!qa(c^OG(Y<3SLe`@Rg@@}gxh{yS3N&Y4sW z7pDw>=mj6owi-q5-i)==@VuRF7h8f3O&R#3#C+XRe^k-4Zt&Wxor?9}iYF7JxfQe5 zQ1PEM|Gu%;K#F^+Z=%nT4ct}Ki)8<&?T4R*SFUfJOyHb;cVSO7w7j1Ufbqhe6}W9A z)HCg0N*E>PcQ`V(^uL(;M!Yi;E}JTsQj41DnLyM_;rCcI_`RkmTritX4(HqN0Y+1K z^kz&(E$j5BI=BkfYZO-!l}io(ezfKIJF}_8vOF?=)=E|{?3mD?%GG9f|Is(+IplpD z2Jc#JK!Rk=hZ}`Twomhx7EE~`!f{(RLgg2s3v+bjc3#cmz#4ItTedvx7b6$x!eSO( zG0O@QpDOOeMP&Ee4BGs4(W-E+-u{ridO2<^@Ul$?+ymG7Cv1XQ``}LL`8eQTP5jHF zKhBhpV_Km!nw(G7_pGqnP`b2!+s4aN;i}hT!=JtUemo=lcXrP&PF*Ibhf${p?#kS$ zv=_!mL0E-AhziH{?Udn8UH0Nn`6*f+h;oktTs$WRuBb_+ z0y*dQd-VAmKt^w6!SmLOQRY9Ygpuh}nwrF>x6KpDqjk$`QfJg}HZ2+f1#&6lBc+GI zZ@NiY(4#l}bTc4B<7zt%UE-@3Q+t-rs5VW~8t5i6sBwzl+wEPLJxa3r{FykwEM-2) z17|qw$CfuzGHXLeeB_90wyedUAQi-P?kd)kPOW@YCx(Oz$rmhFg-nq3Q~)h( zgNyFspDWr8LAfJ3KIdK4W4P<=%kgEWzn?=c5(6LC zeSeA7A6H;2Xk3}gTHFQEIEJ}zhGa);S%L4LwQ|)7!g_p8zwyL^v@$o)(>|x)mB#NG zN=|?JaN-f`P%G`518kx9*5CXGworkQL)^+zw{L>hD{hHOx0*GLv?{1Y$aAjzrrp4X z0X3Q@!hgf+FR{MZyIL8b^9RO2k>vjK%RppMKID^-eYAedIbcTYDR=Bmo5bBe1IFBm zZlA@&C`(gGuh1Hd-7{pr^RJYk@IBhHo}M~(O@Fbt$C-Qh%$=vQBU(;P;)ix=L;F6uD+wMqKC&4kF*U`m|NMG< z)=|;PEg<0M7*PJvZSn6u_n!N*QjHVt&USu3s8$nUw759!3Lo;|qxTdU^U=rI2?~?t z;GRV%?bkh+Z?uf>v-85-{kC-gV*60a%Y=&4eRcR0=#m51xr zHAK5|U#u)K8DCpot63dYH&u=ZLZ)om7mj_B{^I+NgmnVoShv&d$pDM3-CmykyW5skm}l2x zgDo&~JqXok_4kVfY7U-?OOc8BzSIQn_8xYCwovOa~1 zr78$$9SM6v=0Tn!Uw>Q3*oxTuvm3Sgr2`~{ zhma*Lc3dqnS|7gr_?4;y0Q5-klH^96GGEHty)MBu80aJ8<@+vux7)iQbkd92;iP19 z*bzzMm9DuvB2=FZi+tNL-}! z_tS&L>l9nI>e#Kuu_z_?=@q}@06c9Hyd=2$^OabF^ZMr}d7o@T0uQbw z>-xJ*;ep5BJ((&d;QlhtiJQfd)M1-Rzt;55Y|5~ll%pgmh@0Y;>ksYNz}f|Ma;uya zDJGO>AG#v+zWllP3_Oc;^F|L5$BtdWLpqy>2DV~CZ@LiGhX&5BnijlV@$^i%x9(rc zRw#tQ_c9;}&k38y)Jt`lv>K#6K7B!{Ve)a9#i;`KVT-$3$0f~^I-#w7L||(`R@AW- zR{lJO93~s5wAYmWl5}>9+Dulz-wvZ}b!Q{Ym`H-4p3WMU9}>W9MX-r;3xAkX;L zcHI#c!DrspS?W*BR~#aEx)R!^LvjHJgbr2VjEWa5(fcENqzZ zBzS(S(gF9ba2O%>bz_R_sG?Zukt=rGF4QcJbyehdf9cs*LO5Q(6Ij<4XLlb69Hlx! z+$f;qvu##eIr(8$X0zPfK1hqVXy91(y2|YiU&L$IspFoO(`Mik`uSe}zOdf|&g0Pi z#znknXd*K2>9sw2w|k(ts>fxNM^tcM*B2KVgST(gxUU@O0A_`+x<}O(hC7eH(+gNE zR=fUqWaZloOi`&->D!AF03Y}H76Q(nC8;#z!XZmBA6 z5kRQ%zrKHVVx-1k%ni$*%fznrxJVeBmyz&&W-x9;c|q5BYg0;jRyKcDOl$p7`_ z2Iom{aop#@-R{rA3I`fyY`*cUJ7{2o@_>Yx@M0(>==5*R*FH*p9PF28d1l1&Rz6f3 zPZSaxtn7k*of>S|_&cxc*XGFXwl9T)@q39S^)4c>ZmIl`uHRto8zjbcUv=S%Ro6-x zf!mZXE;_OA?~mjz!p}%r;$+4TCZKtDm#~j}7pHCLd%Ng|i+tKE6TXa^z=Kru!4i&i3u2VpYikq#)5W`azR=wKp|G`KwGv-tKUicRS`mkDR9HsoEt z>rLvaBKm8bES%i`*%bB+=13P+1rsqr#~qQ;4V^EUe&S(x3=!s)s8}sdl6+&F<|B!Vx4+?i7PVp}Q$39EF#fDPtH|Onoo{FG z5FdTrobqn;R0LVAJo*m;m|6UNTW*hT#UFc;qhWt~v;K<4m5u|#S2rYx!6S&6mkOL{ z6kK2AvtEzLSq1Npv<|^r`b^*{hnla+njDo5>5lW7CblwUjVVN1QhkGwk-7Vp>E?~= zh{S&@&C^LsbnNZXAJEb&M5!qPSmIfxbQ1s`w!}5gyoP@baz}r}zXOnSXwPk$#)hxkd)4bL8<9Z{(Sb46Id~?fd zC@BiNF&lPrBp*s*hw;VHu^;M}uOA3Z_`3*!NjpwvYv4W%(BQZNW%Q(GU8jaHtF+D( zLul^Z5%v!(tyz<|(dehE=QSHAgM#mbz;82u8xzASbc`M~+xrY9ouNa??$5d-*M) zHFnSF*y$uB9^dT3HyJ5d4fV9-d$~nJ?=Ru0mZ}oVALp8&G65XjN~#PcmQe>>>JeJq z`nd!?JpwNrl!yxoiQmp^aG$+-nB<%LQvpoXThTiK3YnHLN{jRTHu0|>Iv_MHD{Pe~ zE8k&)W^OzFZZ4+VS9Z=>#Ed)9pghEarC%FETFORE*;8+GR$QQ2cq9$_Jg#A??hN=& zSiXwXx|}#W&~aphU#SMM>_10a=r&*=UQT;IdnG+vX*Mk8%s0iU`SXyKYGc6U0-HC` z!7WE{AL;W|hsYvu!{Bp!&*BDW6q|~b{zmixsc&8qMWdEoIDn`KRXV zpqkX%ePIKO>38`dQYUd#OUPY+GW`m4PL|F$!~G(ai!u(j4u^^-iTXPc&PX~{8&=G>ZjT&BVjf$T zVSb3wrX=>|zW}jv)3^UY-7;+F&9Xy?Wz|-u6JDm#2%T(6ySC!DFtSLAsHB-u(F^L? z4I?H8vIGW`WG3eXu0)(?CB^lI?RDVPKA>!c99OV&pCaw@MdHn?e}(|~OvxE5D>zZ$ z)Uyzavaa&FcW8SBi@Rv1eb9I*aIS)lmIPtr*}k(V1W`b;K^(~^WgH8g*8>2G6iHIFgftO@O?Ha`& zJSbP1w4h%CCw!!pu0}kQ^bPZ21mote)MhYArPiL#9t!}GyW1vTEY@79-QVIT#yvG7 zN;(i*RK|c;0Q%^RA6T~{5;5<-PwhHsXo z_2IVRmMU{Zoo+sQj)E!k^P4~Rj+5ZN{z9HMtNr+!@R#>alz?|L4YBQg&~xq#uE(4P zruywPYpyr^@UlwnM-Sn~v+ujn6*hc-gMJa+W?M|{ zJ6b+g_e0C$D)7%vCJ?$lBTwe{#s!jRede(|iH(|hL*Dga5DzC&tOBy5!_sHtKH^!7*&1e}FLOQa%AV~cYp3o%p5RNJ ze{ZBdNL;5Uw!-a^;(MCs&0+CXx451T#8R(bKjLyQGA;(&HB(=pq7SRe}Fhclc4`uLr7=R;|*K3l@o|mNhOk8{$co%>B^*E-xM~d2qJaSQl`Jqpb#W&jmH6!8sXWS@P zh7WyS-w^pdA7QKnx(V&7i7zkv>u)4V;=@)IP$CTRV#^#k0_>P3Z3YbF5bm~odH379 z&fQRoxUAK^=M<^F+Y#TE00K^EE~W>!-qSM6duI)SfpzwLyly5Gw8ZlrBIxtHxqmuJ&^L3_9CB2BB{d5 zliBeh>v+{h{GlSRjqN_L#kt^S`nSI+0kPCZ-EI}5XEz87%I z6^CBI_w6_)nSZBaP;xaZCGKu-Z($L=bdaj&QcQ!9g9cB(Bx?oWAfn@^ZvrY3omL^z z0TY#LXuUh@MpanbWNEH7ojT!4rhGfkZ))diKglt!wkP;hpnQ3?uZK znK-qv?YX5$(<2Zr9~0y(uln=JHd>xS%W29YfpE_PknP@_Wr_y8#(_^P&uU7zyAi@b z9<4Pv@N35AuiI4ZB)MW@s7{;m1 zlp~%dUA!l*?jTLipHFcc<=*ILw^;}FwrBlQweKT(zi7r`yE(81uEeExLD^mJnM^o!*<^D_%p zV^fNJ0hIRBlj1@wasek`E?SK!D&C{cJ>{OG$C*R-<2uPqq3R)y{TwG_`{YSj#uGa1 z?^~R(@aMmIH5Px28FGIeEEOtO0WNCy0X#xQi;l7xnN?1?DvtW1^&K1knZ?2$1KQ2A zGaU1lXJUj~Q=|DSWamh0z?8YF(@GBTX&J!bDLse5u9#0DtlorA9uASF>BqAn#HFx~ z-PQtb=K1yOv{|@8Ez=G)lp?5JANU6P!21_$6kWtEmD#obY`FjQ}q zoeX0CD&l?K0IagWIa|r*yHdoNe8(WbjQBpX1E?&L19O`y-4es4$t#P&8ga?9;lqhX z2G+8@&U+xN^9YzIduKy4`HIMKXVHMt)wKJa%lDdLTR~6l#Xv5qH57eYVBO~f>6;VR zq)l%M99<{3+^`wLC5g#~ajP7zD@CkHzlDzd>XO#O`FkqEL0$_-d`STrhYAAWIh7HUh2X-GXr`3 zhG02Jz&W)m2M!1uu2I`ISpaRZoj%0)?$(8JSQ4_%=rZ6bx~Z>1);FCtsX8!E(!Bln zyFpiXZ$j=kk9l%VjK1LXGE9bOvIj;sr|Tz3;b|;fl@bv&uZ-fWpXTGe^&)F0_n@nllc?`6ZHk5d5zW}u1G@V?{=#*ET=2L z2imTDE?3)@#l0S?(U7wkN3BUT1Iksj?o`j$pMd4%h^MnBvnlvsU!sPq`=$#MfU%eY z?*P&)+`5Lw7LkeHx3)=u(1cTv$I%_32{rxy3?-J2uwt79kh-gU%4a{p`(ND3KgBG5 zg#VLeFq5rXZA0>sCs9qpg~k?|c<<=e(QTf$fKg=T90Xc!86L~~Ii@0BoIEh2HUJ?0 z2_}xYbLqr^YU^R7v$-K&_q`70L#iDVkpWXEJQmIv2im47MO005hS?l$I2&%fn?#KC z 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 literal 0 HcmV?d00001 diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx index cea9bc4081..81f5f68d44 100644 --- a/plugins/circleci/src/components/Layout/Layout.tsx +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -1,11 +1,20 @@ import React from 'react'; import { Header, Page, pageTheme, HeaderLabel } from '@backstage/core'; // @ts-ignore -import logo from '../../assets/circle-logo-horizontal-white.png'; +import logo from '../../assets/circle-logo-badge-white-15.png'; +import { Box } from '@material-ui/core'; export const Layout: React.FC = ({ children }) => ( -
}> +
+ + Circle CI Plugin + + } + >
diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx index 25719c3f42..f875c54f02 100644 --- a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Link as RouterLink, useLocation } from 'react-router-dom'; import { ContentHeader, SupportButton } from '@backstage/core'; -import { Button, IconButton, Box } from '@material-ui/core'; +import { Button, IconButton, Box, Typography } from '@material-ui/core'; import { Settings as SettingsIcon, ArrowBack } from '@material-ui/icons'; export const PluginHeader: React.FC<{ title?: string }> = ({ title = 'Circle CI', @@ -11,18 +11,17 @@ export const PluginHeader: React.FC<{ title?: string }> = ({ const isSettingsPage = location.pathname.match(/\/circleci\/settings\/?/); return ( - {notRoot && ( - - - - )} - {title} - - ) as any - } + title={title} + titleComponent={() => ( + + {notRoot && ( + + + + )} + {title} + + )} > {!isSettingsPage && ( + ), // @ts-ignore width: '10%', diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index d8ee53114a..7562409536 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -12,11 +12,12 @@ import { useDispatch, useSelector } from 'react-redux'; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( <> - #{build?.build_num} - {build?.branch} + #{build?.build_num} - {build?.subject} ); import { makeStyles } from '@material-ui/core/styles'; const useStyles = makeStyles((theme) => ({ + neutral: {}, failed: { position: 'relative', '&:after': { @@ -30,6 +31,19 @@ const useStyles = makeStyles((theme) => ({ boxShadow: `inset 4px 0px 0px ${theme.palette.error.main}`, }, }, + running: { + position: 'relative', + '&:after': { + pointerEvents: 'none', + content: '""', + position: 'absolute', + top: 0, + right: 0, + left: 0, + bottom: 0, + boxShadow: `inset 4px 0px 0px ${theme.palette.info.main}`, + }, + }, cardContent: { backgroundColor: theme.palette.background.default, }, @@ -48,6 +62,21 @@ const useStyles = makeStyles((theme) => ({ }, })); +const pickClassName = ( + classes: ReturnType, + build: BuildWithSteps = {} as BuildWithSteps, +) => { + switch (true) { + case build.failed: + return classes.failed; + case ['running', 'queued'].includes(build.status!): + return classes.running; + case build.status === 'success': + return classes.success; + default: + return classes.neutral; + } +}; export const DetailedViewPage: FC<{}> = () => { let { buildId = '' } = useParams(); const classes = useStyles(); @@ -60,7 +89,8 @@ export const DetailedViewPage: FC<{}> = () => { dispatch.buildWithSteps.stopPolling(); }; }, []); - const { build } = useSelector((state: iRootState) => state.buildWithSteps); + const { builds } = useSelector((state: iRootState) => state.buildWithSteps); + const build = builds[parseInt(buildId, 10)]; return ( @@ -70,7 +100,7 @@ export const DetailedViewPage: FC<{}> = () => { } cardClassName={classes.cardContent} > diff --git a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx index 18293b790b..63d78412a0 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx @@ -5,13 +5,13 @@ import { Typography, ExpansionPanelDetails, } from '@material-ui/core'; - +import moment from 'moment'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { makeStyles } from '@material-ui/core/styles'; import { BuildStepAction } from 'circleci-api'; const LazyLog = React.lazy(() => import('react-lazylog/build/LazyLog')); - +moment.relativeTimeThreshold('ss', 0); const useStyles = makeStyles({ expansionPanelDetails: { padding: 0, @@ -29,7 +29,7 @@ export const ActionOutput: FC<{ name: string; className?: string; action: BuildStepAction; -}> = ({ url, name, className }) => { +}> = ({ url, name, className, action }) => { const classes = useStyles(); const [messages, setMessages] = useState([]); @@ -43,6 +43,12 @@ export const ActionOutput: FC<{ ); }); }, [url]); + + const timeElapsed = moment + .duration( + moment(action.end_time || moment()).diff(moment(action.start_time)), + ) + .humanize(); return ( - {name} + + {name} ({timeElapsed}) + {messages.length === 0 ? ( diff --git a/plugins/circleci/src/state/models/buildWithSteps.ts b/plugins/circleci/src/state/models/buildWithSteps.ts index 109ee08df0..4bde261f09 100644 --- a/plugins/circleci/src/state/models/buildWithSteps.ts +++ b/plugins/circleci/src/state/models/buildWithSteps.ts @@ -3,7 +3,7 @@ import { GitType, BuildWithSteps } from 'circleci-api'; import { CircleCIApi } from 'api'; export type BuildState = { - build: BuildWithSteps | null; + builds: Record; pollingIntervalId: number | null; pollingState: PollingState; }; @@ -16,7 +16,7 @@ export enum PollingState { } export const buildWithSteps = { state: { - build: null, + builds: {}, pollingIntervalId: null, pollingState: PollingState.Idle, } as BuildState, @@ -25,7 +25,10 @@ export const buildWithSteps = { if (state.pollingState !== PollingState.Polling) { return state; } - return { ...state, build: payload }; + return { + ...state, + builds: { ...state.builds, [payload.build_num!]: payload }, + }; }, setPollingIntervalId(state: BuildState, payload: number | null) { return { diff --git a/plugins/circleci/src/state/models/builds.ts b/plugins/circleci/src/state/models/builds.ts index a260bfb249..f427175bd8 100644 --- a/plugins/circleci/src/state/models/builds.ts +++ b/plugins/circleci/src/state/models/builds.ts @@ -52,6 +52,24 @@ export const builds = { console.log(e); } }, + async restartBuild( + { api, buildId }: { api: CircleCIApi; buildId: number }, + state: iRootState, + ) { + try { + await api.retry(buildId, { + token: state.settings.token, + vcs: { + owner: state.settings.owner, + repo: state.settings.repo, + type: GitType.GITHUB, + }, + }); + } catch (e) { + console.log(e); + } + }, + startPolling(api: CircleCIApi, state: iRootState) { if (state.builds.pollingIntervalId) return;