From a0ba8380c9d66ad4d2609ef6533222cc92f727a2 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 23 Aug 2021 22:31:36 -0700 Subject: [PATCH] Fix eslint misconfiguration and corresponding errors --- netbox/project-static/.eslintrc | 7 +- netbox/project-static/dist/config.js | Bin 107922 -> 107946 bytes netbox/project-static/dist/config.js.map | Bin 411298 -> 411549 bytes netbox/project-static/dist/jobs.js | Bin 108342 -> 108384 bytes netbox/project-static/dist/jobs.js.map | Bin 413463 -> 413770 bytes netbox/project-static/dist/lldp.js | Bin 108620 -> 108643 bytes netbox/project-static/dist/lldp.js.map | Bin 413812 -> 414055 bytes netbox/project-static/dist/netbox.js | Bin 316559 -> 316608 bytes netbox/project-static/dist/netbox.js.map | Bin 1136705 -> 1137377 bytes netbox/project-static/dist/status.js | Bin 128021 -> 128057 bytes netbox/project-static/dist/status.js.map | Bin 462066 -> 462384 bytes netbox/project-static/src/bs.ts | 6 +- netbox/project-static/src/buttons.ts | 22 +++--- netbox/project-static/src/clipboard.ts | 2 +- netbox/project-static/src/colorMode.ts | 5 +- netbox/project-static/src/device/config.ts | 2 +- netbox/project-static/src/device/lldp.ts | 2 +- netbox/project-static/src/device/status.ts | 18 ++--- netbox/project-static/src/forms.ts | 4 +- netbox/project-static/src/global.d.ts | 2 + netbox/project-static/src/jobs.ts | 3 + netbox/project-static/src/links.ts | 2 +- netbox/project-static/src/netbox.ts | 4 +- netbox/project-static/src/racks.ts | 2 +- netbox/project-static/src/search.ts | 14 ++-- netbox/project-static/src/select/api.ts | 7 +- netbox/project-static/src/select/color.ts | 46 +++++++------ netbox/project-static/src/select/index.ts | 2 +- netbox/project-static/src/select/static.ts | 2 +- netbox/project-static/src/sidenav.ts | 4 +- netbox/project-static/src/tableConfig.ts | 14 ++-- .../src/tables/interfaceTable.ts | 10 +-- netbox/project-static/src/util.ts | 63 +++++++++--------- netbox/project-static/styles/overrides.scss | 2 +- 34 files changed, 130 insertions(+), 115 deletions(-) diff --git a/netbox/project-static/.eslintrc b/netbox/project-static/.eslintrc index 242b88dde..802fa7a3e 100644 --- a/netbox/project-static/.eslintrc +++ b/netbox/project-static/.eslintrc @@ -6,7 +6,7 @@ "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended", - "prettier/@typescript-eslint" + "prettier" ], "parser": "@typescript-eslint/parser", "env": { @@ -19,8 +19,7 @@ "sourceType": "module", "ecmaFeatures": { "arrowFunctions": true - }, - "project": "./tsconfig.json" + } }, "plugins": ["@typescript-eslint", "prettier"], "settings": { @@ -35,7 +34,7 @@ "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-unused-vars-experimental": "error", "no-unused-vars": "off", - + "no-inner-declarations": "off", "comma-dangle": ["error", "always-multiline"], "global-require": "off", "import/no-dynamic-require": "off", diff --git a/netbox/project-static/dist/config.js b/netbox/project-static/dist/config.js index 291dd4aeb0901bc5a4ceba6e7432dc3a9431820b..1763a8943bcb2aaf084154ebbc53098b771ce580 100644 GIT binary patch delta 78 zcmbPqnr+o-wuUW?i|4Q=6{RL-PhT{LQ3c98I)_m~4J>M%oLHQyl#-a2o?4`2m2az* Xo06%Un3GymqGSzLu>JoW#>pH2z3?6g delta 54 zcmV-60LlNV%LbCm27t5yqnwwioB<=3(wqSw8e?H|Wg=u@Zf9k3B06t9B5h=8En#eB Ma&#iM7o7o<2xTx7lK=n! diff --git a/netbox/project-static/dist/config.js.map b/netbox/project-static/dist/config.js.map index e843c88ba626e4f3517691562892d8a6b6551201..66a880712b96e2226ccd6177644eae528eea0571 100644 GIT binary patch delta 938 zcmZ8f&ubG=5GKiF6G2chQUVIoL!ma?go22qN$e(u)M{&}5!)saHqC3hX8ShmuEk1% ziUB>?Uj+J~qNoSO9|)SnJrq3n2k2Ei>A|Dm&4VEBZql^4huxWPzxn3PH}C0+|KXbd zR?Sg!)?7{aUGX3mR3etxuL{JwNuUa`Zc?bisl#YKHgPyd5vw_xqfGeg^cjsR_&vs_ z8q_^($-$Wzw!!Nil8lBUaZ?2zNwmHmfuscx(@9)ma*tL~>mxw5V;ag5QZz^K-NxqnH*| zT@vNUB$-vzVx&Ztl{rlEn9O#$bPJ^2{6&X0^8o5DUl>z_5>?a{HPV?RX8e2vFZZ)6 zk73aG@CrV94(=Ifcg(RpsO_LVXL@JO|J=&N_>N(T1xYS;O|}hU&l(U&>f(GDGrYYH zV!A@KFs8AB^qMU5I4g^qW+N_0M(Hz7+&B{YnQY~J)Tn?D}5>}9DY%=Ace*l(Sy zErq?&sIA1l-vb|e-Gn~&xe0s_an`g=N7HUoqJ*Mmh2|3M+tS^3CT3qVcBTcrXptrq zI$<76EXX91?kp>v@30n37CYy3?PKdLvs=#>=Mm#g3x2q{FfJ)l@os$^jQY0w{cVS0 zj77QA4)1cDml8tahOrUjo;$o+!cJ8-GQ#zFr8sZ?E5})Bg!|?R*x3-96u1e;5_=+W zcT&?rVv4^cBvRIEluru6WqvW<1ut~L(k^(h3)dqL858a1z&v(w@obUVAU$t&7v_2|J zWnbA}f!z`Y90=i%1J`iHfo}fQfy+Uku5)+_E5XBbcwmIt;besLk|cJnL$egZrI+w| zu23`?i6?Ii#`5egGYZ4jw8^YOPE5xLn=LS7%s$u`8+3z^5_#x;?n_URoI$2oaeAD@ zGAfCsr!t}art@#q5m-08Qv=30vn)2|-VuawZyQdZa%ugagIIun7N8Y$BND=mlyr<+ zi!kRC((u<3^fu{wXXault?Ra^^ejU-pz9q%x4jHK0se6ns(ze&4fAej$CfpC&fl)V zik}a@f%i@5Y{5zVz5$KM9>7t4^#gng;_q#^fHM_1*XHssWG7UTRNU08o1-GF!10dJ zeAc#^trELn<&24R#v2=*%;m={W~f9+a6BTaf)6a=Lt>z<~wq!zdNdADYf_4@^HVLmHq-{CFNQG diff --git a/netbox/project-static/dist/jobs.js b/netbox/project-static/dist/jobs.js index e8ca9e45a282d49eb22d1bdec6e4486474be7770..c0c05058df9a43716e1bd15c077f4b532925c86f 100644 GIT binary patch delta 1809 zcmZ8iYitx%6wcXh*Fv$>N+{b>+Ae*};&fA9Y1w7EX=$mo4+@SNT>F^2JKLSmo!QPz zTgpLnyC+sAt+GA^th{p6`6; z-1C~<6Qh=^qn4w6CLr1tQz@|8SEiG|>Ko&3P0l7vh?5n5X{*GkRM76K@OT>-L8;^F zC}MXPI*G0&K_YtgTZ@6{qt@zpRMIl%p{&hxA+#CqsC=IFCMv1fjm9$_vrEk+FE3lW znmp)o$9G65ZugpfGzcLTKwpNjLJfNPo5SC46~Zrw8-ZFR$_7B=n-SD^k$Zx2?cN7{S4}@t8>=OJ`c6OCW1!-cphy4zj_o@mLmU%xfWAAxqxqvnm6W5fH zIhfzRkzK|TEj-eUa@UdH@s;&QISU@YoH&`5OcciE@Np_vz=Z^CrFQ6&6N%R^y=!8X zNN5AN^^tE*B_O@!@_X0<{qB#S8J*aEJxxDTl`DTOH5!t8$AkQyJG&EOQJZtZtd=uoL$q>i zUP25-%2+Y5!>7hfXgGau2fEhXN0Q!l-(k%5z=P=!Pk8!eRXh8@s(<_NmVusmhPwJd-i@^ka5pEBS`=-QDzluLH z_#loadfWt~Q-FqRgcA3Z+}cpcP?DIh=kD#cT&Uy>_0Z-A1Rk}w-t-V4QPNRjytN}|_1W0%M6!@VG5;OQG+k zbEoJRW{xHzwr^f~4558)qMx1DVMf5YU~Up|gxX|3Rbuawc%@AeGl;%+L9)q8T!CUr z=?w8fUq*moY_cK=VzaH7sHe+P)vsLXNrVa5X~i$dZnmBw#Ue%Y$F3qH6DN~3o!DLN z4ng4q459HNSBkR2iVEXdy_)E&n7v>@+#V)+YO!V{te2Fbd{|;fX)CQp87$4kdbCo> zNOe-h^clnvV5Me3tmb_Rtpr0(j{{|1U|bTltRfQ~eHA&#+FD^Y#}j)v;J{a#n|X;M z>Oj@||AX{})ypA`Fh&uMW?repbd3>U<2+B>LiD3GV-qm!fu#i)_R7*9;*yDn;YCl- z%fGR#a#1i43W~g_(42aq{t!-fO~XBOR2qBCQ;9@X@pPE=DZEs}3Zj#;Gew*}+1mxl zM5F^juiz7Ssm{;Jy!_Ot?&r7SYYyKvlu6Ck;)uxD0?4(|+z!8U3MVk`Mv*QT>2{Is z6ln~@>9u}y0=mE6@e01Yw!@A2>X%o!aT0pL>Sal2>fM%SBaGnSTlfGbE4#hLtkYLd zw=*3A)uI@SMsU%--_{LSf_r-oE@#hn(J1`3YD~epGagbog>kQ>v+5m!=;c=~@lmbz zA|{`fc!pC;`x=ll*mr0ma_R>DMWt?klCcb)L1Qc%1|MVO?x9RH3=dtKVB!Qdp>2kK z;J`n|ct1Y4XFg%D>A_Hlmt2C6%FL`3sQ^vv_OQ<(@g7BH!V>S}CG0)#EECYCVB)Gg zG7IzDH?qrEqWOoLQ0_YXJHE2+2y4OPm*Xc=5{b;%99~vo^VpDptyB+Qa-!q)OB+m_ ztcBJ?u|D$6$yju6zWg4xK)?IrXGSNsUr*7`U14G-at-bUIAaZNCm1=JUUO zIqvicO6LtP@&<0iKI5Ieng8ti;vW}{RIdEB*l0-h9XI-S-`O1(joOqI=G3e)8=@6s zb7G??x{MV9H+*u;goac1b|AI(K04{G_Z`M;_dl2lF@&dIRn#*NtopYPZyD(6M=mfC zUOTfKQuO4%7aBQ`CkCzK$sk7Rv%+qaN8u(AZ7;y4wM6M^q8nMJ$uD@lyqFap2g(tU z{lSi?+8$M(nLAPUvL52Z>4b#{C6-u zSxTheY_U6hL8+Ye_^BXM6y~(0Jy4i}E)w5P1?g4K*`;y&a1Tfrc5s|wP*-N|WxZi4U7c5XAshHv2(xSy!a>xY?IeLtjYJ^hek>1yGX3`x8A b5u``H=!Xwtw1y!_(bfz>YGhyt&Y1rL6l8Fk diff --git a/netbox/project-static/dist/jobs.js.map b/netbox/project-static/dist/jobs.js.map index 98a83549c9460eb5e12fd541f98b40e54717c327..9843e27a6016b96a5e0811f9f979ae7cc53d4d3d 100644 GIT binary patch delta 992 zcma)4OHUI~6wb7VQW|t2RMNzlOAHB*kp_&K^kv#w3uvKAjY!+zlwP2roi;P$11!;K z6N~`^A$kmkSBx>@MnlW&OcyHA6$@AHNL&-+4=~P5OHo$d#pFBRIp>>mzjJZf@^#g6 zKgZ;BIei{>vv^^PIgGnmu$NHF6r3%g8&l9xLzEK}C^s(8D2ZzMQw|oYF*gGnZfk36 zgeR?}n;)S9xy2-lfmp0*$jyQ3C6D(~J-bI`w$O%${ zOFFL5;j|EUjMItq2=TGR7cRr7%Vo!+Nmnm7KY@EXd@~15V|%nM8;(Ro{51y-=A?XT z9?n!%WzxJz<-{{6=t~%nFT&$}*oa>i;ZeEl@(Wnd*V~An@>JlYwBRUT&?Wy^hV@$P zoP-9n*&iKK6e;^d0m;b6WM31k0w0rL71w9#psB2)Xupykm)Eys`|< zL0sB^HlM_e+DM4i)|>bQq_=Bh1nr}4NeynWyt|%`Bee7O*pv5m~gC)sl~fR==>|( zP{V;WrgnO#2=Y#`>ghu!E#E$GIL8<#JZ!@2_D;$le1_MIQS@q|fGNMB$(Zo4N-pEU z=YGRC<}{|d3=jO*-QEHAs@v;VKV7WP?Y_pQJQcF9LXPi~{S{K{4!He2@`-N4cO4_i izb_g(nGU5Q_OB|ZhGkCa(*9KD0&ZWA+#fJ}Wc~m_Crc9m delta 768 zcmZvZ-%Aux6vvtMIEpNUVu(?3Ll&~eNQsR7VayIwyOAlj6}B_PqIcJEx7l@OdoXt} zYHLG65}^ZGW)BirfspHkdP%5M!V}=*6dc=+0;xf%oCw`#I;HbIi z*nXodlzrv8HTY4&-z5m4>Oe2fIMB^LIMCDJ(=_(04D$^Ec`!ai?Qo)xL`Z^^h-z7R zE1I$?zjL35A*|ek*L#YS1xjLx{HExIe9n92l6LUON# zS~G&=ezO-)uC#Xiz6O^uQ-!10 z$iR=wRoIX3tI)Q4$ClvWBD6t5?+an`8))tNS5cCW;BVuNG&#u89Sq$XW2ZYX99ZX# z$UcWAc6%K@HzD1C6Zn#EmCX%cn;Z3Ww}c5+QN@!&V?HVwimVjar&HoHq0vx097882 z2E>@eT{5o3#4kcGPRGTY$1+h_8Imr@N=#B^`I2OG90V(cK$D{1dIq{wF2ZVtHkN^Mx diff --git a/netbox/project-static/dist/lldp.js b/netbox/project-static/dist/lldp.js index 823621db22ab37e135640d97c7382ff99b1856c8..f2c9aa4111b73e715db23c1d9863ad768b9111b3 100644 GIT binary patch delta 657 zcmXX@Ur1AN80Fi)R*i^ykX)KBvu)iK6g_xltnx<9he1i;OSqff*=lWTTXyGMSyNZG zhw`GgayE4{T^>meau!hDHH(jJTms;8jNm0r&Ie&_qnf$#gx%o-ME4U2hxzk3YSos#cOYqysfwp8-is|0UqV z{ztHS2Xe&q$)8a!$oC;1F%@r{!R@nGXvVhLfLHky++z=naXAjiqDwJ>_C8_29_zGDCHWdmr7|g@CUi z+J@e`FeNn_E+GB*S*nahXggL`-kqZ>mEcC1?6{ti8l(!+pNI(jX?ZkDRsYNBELBvm zsI|>}RIs%0!B!z+VM9*KnHIl;4+xQ%rFLaN`J1IFHEL>v)W4F=d2-0^JWU!!!RoVB RSBnZ2Xa`z~<1TH{{sWsA@QVNd delta 635 zcmWkrUr1AN80FjMS|t(nU}^rFWp{QhNP6(bSmlk%*K z(wkQ?*>$dqWBK>#pGN!noh5Z;yilFWG;K64)zedX802zy0R^V6$zF$XEZc;{O{Uhz5Y2SaUAP`2|-d$E;DG^w86k*GTaI)>lVFYKiO99di8sX=etN4Iw&;Cq0! zp|>tbF_Ve;)L*}g^~p}!j+ONfXX$b!xJ9EHTu+aWQUz(bF{;w$#;ClwO$y2OcFEr% zciM%3(|)>Lsg-S2+UCSFVB^fvinhLl9tI`}Eq>28tYA)t+JzvM! z1my?q6Y%??Dbi#^67W?Mt62kbcu|{y7`aBif|A~HMSX^A0|&$P^aZzK}#;Oy^2EK!AyTKl};Pv&ngNs16E)S z9q;JKYpQ{*{C!k&*Z1V@Ch8_7EoSXmE5F>KN;EnrL?VpNUDHYxpQ$k(F%Ad&eU3tb+O@rZgLX zBOMP{=TKS)EN~Y=|o9SPg)f%Gh3}GQ9!EU=pdKOGo4x z=%IzxwV*o`a-@3U8m)vptfFJ&Qx$Pb0MoW}CLN=#k^`wZQRf}C-a(Qdripab`St^w z$96{h5<0XD&5vtp+%8+1QgATQ7-b^U7NE7!>ty>Cl7$*NL~hnl7uncG2i&E!YQ3nT zdwZAp9c1x49TR0nv(`?trx@>In3F|8ELfi->~qFzh)$@Jl) aF@CEs#=c?p*%b*nk((5v1#2kIimrbT4^N{2 delta 709 zcmZvYPiWIn9LGufYdUl%8N<#BZ(teDRGb@%ZP$^8xOVIxU1f}>htj28Xq#k71gi}y zRvhAn-NXm(V9|phJqWga;H@{0o;`W<=*6KI#g{mG+B@X^KJWJ@zwh_^o50Uj;6a0F zcpBag9M!SchA3XN;W}>GFh#!DaMkaTB;t7t2mTPhno7%NEE7kwD1+)qGz`s1&Q0L93?AD4AJW6f1I7R;^V-(`Ca_XuF8@4vZ|*A(Dz{=RN0gPPU8`6_w?h zRzzYhg2Ze&7yX~Kk4tUJlIjjmsYTf^7+*vUVo{rJx=1VB>bQT(t4 zBShbW`yMI||9B3w!;*A4cd4G0B$K|(G$H1bq%c*!-GpmC(tZhDFD|}Df zd3y*4Ub65S-Vft`3np;kE}S9LZTR4K)|tdw2PVdx&8>VXf-;;F>H{Mpc&-DZ;X);E znz9)|re!EHegf_)&tzAxQiwuvUP zbIg#I;1q!ubke)YzGH?I!Nn~sC)p62VhL&b|u;6*Z=={-{*avM7uLP z$9HDF^Sx($`FGac|DAQq^?HMNXlBYCtMs2-UdKkKPF9t20bl%NavLj*olI?GrcPcX za-JzsDc)at^1W&%qm(kg#qVDj!chf56k^adg25}U(#I+a_OtY;j`&zE!;r(F7kK@@e4L@W>< z(=|AiZA)tzr($0^u|7Q^*b9xMUE)*#mF>zCOHV6LyYzNi(=az@u+W)p^odP+yMD#R<%yogwR|l*5nc+6vQrN-HN8AT`r^79SrK5 z6xWKO&c>34|}bRIgjp;)Tt$3Nt1P$t)u zE$ep~WuU%K=v4e`_HF5#5Lye(G$ys_Z*z$WG-GK62A3#LtXaaeDbKB`Uq3z}3>FF> z&8=0hQdzvU<%ml>>Kd6&j?T{Zy7bdYVFoBPIN$vdR}Q5daf(vy6T(2DC0AT@(1{;b z&MiL13@d*q-lLnG5c&%Rd=3q+ghO=DNg7IuK8JE(?V-|yLqC)RzG~>2iqW>Kl}py@ zRy9rtM+*&vmAlu@GGXPwI_J9938A;}A>a^ALQJ`S-5?)u)W(#5uG?HSJs}Ji3Pc>D zlfo8vh-vyfk`yD#fs%b&`M4^9X^iEe$Lq+C`~eqvxkh^cA1m)s69MS&0I z2IF;TIG%Kx!aqS76V`P@>bG7t_V0`6d7 z+9&A*ze5ZT`;4;N>y~_Cf_}@a z*E5px_4O9~zO=q={eLZ&R4iq#l@eM-6(JtB#3bd$vh63L4gsAde6iL@%p7v$2~RLg z=W}R6a2MupEH`fvNt>@Jhc;gxhv=g7l*u7SToT=s*t9srxTKE6rM~&XawO*U2@aG~ z$)X+)rMrARMsGEjE3@Tk^OOVISr>MPd^$r-O++fB1nhRN=)z|_jqyklEzQpA^RJ>q zF>a_?HRdqP#2XSLzELr3_9&hW7B(U&*KKf|XaTnP193y4Y9^O4m&aYNL`U2|Ap{E} zPH7{y1f>EMOF43=-ld{?=Y${?id*BNSHi%X;@WOWN}`+$dlP|3Sb1~la%Hxn5(8bY zytsIY@}r89l}Sl&jgKTo4YRXJNqN3vpP_9+kPFQ@9b&gT;Wv7HfuNAiCFEcv60^u? zr$n)B+;kxAFgqOv?1cQndDVqGIwANA4cW0k6oIX|HbQ~0#h+_osdE2Dp0_%{V;~99G(y|1pvBo+uxQ0qz6v` zV9Yfj^l4f5Fw*bHOaS(;du%W6euJ2RWEeFA`8nzgg`)ops z+Et6B#J9{fIp_?yq?`aX?hu|Iv5V$FcMq5-iV4Pyd_l$$EIF@wslDy!E=Y(i6^#ZDjsWyo#HlB(J* zy^fKiblOJ?cqWR&j)p3eIV_4tl-{a}6`izUb5)gZPB^Nhs`i{{a|k-4&R|SLx*{oG ztjQfmdviiBh8{3V?u1*MnG=qvDVx>VG0-CFY&v0B&FHar4YhW3b&0wjouz4hQXGLC z9cW2VvJtllT?L3Ia{J$x(#DSQB~lvA45!2(#qK~#qnWXkXrNr@epCQDZixt1wY zx@{Gb5TraJ&;Ue_nxj)97|`4SEKpy*2}pXfF- z5oOah^9D&2DaJ(P%A^4Zl?a5BK1(bG={d4(!|nuL1YO+k4(U`WDxA{01+O3pl%V8B zXjAu!+a@%tBUBEXOO+?K9bX@`3EhP;$5Wz>4xk$YsNex~{FGE(!EByTQN(K#ItoSI zDOFy!bV$lIr`3w?6qXC3vNaZSXLR{ad(?VKn_w%{3#L?*wbQ2aKbwa|i;636LmwayPkQdZ~>orv0mp+YG+Hxz$L6M+ULjp0U9nkX~?$m!k+ zrNn7E)Koz9r}VniL|g}LBp}KuqazdYM1sN?AWbzm17>HSrp6gCrUD6nB$;rijDL1E znz9V3kSML@)nF@2*66DSC4DLYG?<;O(ho?=d-~0l0~i{zoiw{46#(ZFo%GkNy^kq% zhRtG|I@*v;=q!w5Dy0cp{gOCA;q+iUbVp}Wq6hHCqdqUxM$oj*9QH3>mfzj|l5(rz z^zHo+1n3%S)X!jO2#ZsZfK+KRPo*Fc)YRz1Vt6E@tlV*A|CmkaEp*+I5_{+rxl)>% zZ`8T3|(fZ~>1Pnw@njduqEFSvkA*3>K}vTw6~cYXu$KD=GVgGmEBd!V!?=i%OTK zbNF*4H|!C=7Pr?gSW{v<9a0lW2WBsqjoBNX zN2Vs_i*=Q(J$1E>D<=jUx3#!h-NY?6At6)wI3b^6jf>cFnG!FDO$e*Gbj-GtSXHGb z#k;u*#cbNu7nTdMk1ds>2ywMq$|gh#)q1qC2z|M=9S1?9d!#)j_Wj2iM`WdE$);uF zsYBx4dLUPi@<-Dyrd=tkZ`_);3GPCR(;yRcoP&6xC5u~D()9-WG{^<=3e3){!eX}x z!9vXe^i7qpA#@Y)v*{s!-}^uGe0mnvC9MS>x?TQkpt3oDwCP?{liE zvXF3U>V{tyb%%69R92SnuHs}dq3qnf6$k|#q9Q8S4#aEya&4j(uezN&EjcHImATzz zD0J0saecs95IgmnrjZbRPUX+LEl};M_t;P@zGu!6cIx}%26MoP8ObAjLX_nkN?Q_j zbryr<3;GhiN?UAXFg`jW%h>G&&TGS}%vp}4MndwaSY@(I$x74SX6C5!`MsNuA`477 zAksom)5Y9=Z3viqQ~Cf@^gN-@sPo%p6Fh~Pi#av=5OInx=)O!@cTT})gt z?W)uxkzlV=qa(@OqDfBCK^HS6i%Df>|F)I$tx3)XYX4I1-@ksH z*GVPDAbwHO07WGwD{t&St7rlO4@kyE>pL`PgtROkrN|$3YH~v;*Y8+vYNniGicU>$ zTpV-ibphya?nER8x^I`os(QiWRIG=}l|P-ni(Kpjhuth5|_VR4sJA2A5c zie9u7wcCV2b*v}4oni|mWx$UPif4T}{1^v)z#Iq@xe>M_P0QJwnw;5_oAR(*!eY439g_JG*)pIFxjqBY^m z#C1Y@Ow>)egGn%Sp%u9>8^$Pi7p9@K9;yKGx$pALMS|Nf)1jPs=(J^W-c~0o-#sL- zvRT>b-k{7jEK@!?WLcOz)^HH^jcXeApou3M4&Zm$;eExje#%fKiUBw9cU*25mzCbb zy6wmXkmwT1%7hb%BvwxoaB0Cwc_cY10-!G+-n2-y*b2SDnB{XqWXtS{)o8 zC1Fc|eqz8XW<=O+=*Y}oeR~WoW5DKkgN$S&%H~FjRI3d2!fl{b)lb#Ij6pvho1K-Y zETv`y4M1(16W#cQ%!q%~VDSaxzRGT=UWr(@V3?O#Hx^AohEi8w?gNXU3Vg&ZX6Wh< z(O+4!ei<*Va=#Iw&V`1T_e6ni&9!u{$m{lF& z+1YBRK5tn8i^I~iVc9yu`WcV8eony4QCVqk-VPjzHopNQ?r_VNosCYABCptrhb3|- zZc&$q^82JX=+tAB+K5KtwY8%L0miYGEoLdl422NHJJ}LE6hbvo8VR9{ps#9^XJ@^d zEjX_zdXv;Np)G4<8uZDV+pS12`jwt`rx}WJ(>e~9MjyUzc+^kaObJS^| z+EzU0mFl%#-a@~@ zw5A1m)1uoC9)Zz@grHvoqBSN4)5fSf7WZ{P;Y+5)oySIM>qZ+)BS+JtJF)i1j?`ll zUU6hS<5g}vQU%rS;Uk->C3TcXZGykhk3X%M)}py_%1V`ci?Y3Q?Xsu}JPaFtrK$5d zlkC@5)x&h@cgL&=GfkNaB9N@Md&DM;723@xU0wC?QJvXUy=@p$W#L0hS`$~M=9i_a zC9Q}nE0mYJ4%mD>LZ(pGmDVIpM_SXr{BBKnNu^bJ3fsY%)-=g!(|TRV zmvB>2LXo=!X}&=>SnBRDDQT6U;+== z_OF)0qsEA8HScJi6PlD0whj35CEMOL^h>_EIiV{}CEU7nx~8T%ZR~65?eFMoX@=P0 z2G&9(@Z$;i@EW2yV8CFKTkX0N)-*L>Q?t7YS5sPugj-`i-?Y!%m7cS>(j({yG(M-h zxcn4V6FovpVV=6vn!MSO)|lf2o|uINLX|Bos&sW;2eq{17C^b*zOAPt4U!1+1?1es z?5r(4GLaso?}a5!slA4K1V^FQ9&LjOeYsx8b5OLW#c^eK&jCw&8kU~Ki0<&=0wl=j zOONzmMGT{P0VJ(99q199g{CK!8+#f-tl#XZG{$-aYvDt6T9Y{%fwpwLTd^(a_MA>@ zYVx3Rdhcyz(?DH_JoUAaS~sj5um(XZ28;Zpw}Yux+WVT&(%YaldM}6WXwtbRv&p zf>pUZEsjxocO)%N(Pzf3ZNV0|X3QMM7NiT{vul!R;>y7Q==Jzu#a4-0BZKq1%A@IU zFpH0PMlEfpzA^Yi21?fGP_;!C>C7ZypO8o5qxwk0%$&K-B-BG9lBu!6y^u@F)Rm;i z6jIy8uyXfMX6KQ#-h=gp(Vp@_tC+CsX@hP7xdpoG(46lzHNA>7eC>9LnthT&e_B5? z7L0h@K{FMfsAESmC#yvFoFLI*Df*FG-rEB=Dwqmi?H6Tba-{r3*sdXokjyEZ>D zyEb2qe%06^wE8ttHSO0VoCxaqRVgN}z7?bx!EF~C{YDv9dLdYN?Vv_~!D|N!4#eiC zGNHV^bg5E&hLd;O^$F#S(QV2lXFQCh9T@%c#(-V#6(ZEn6rpdL0EB%YnZ3&LW1E?n zVmMZ9h}*%F;CLvAA6~jav?U6PalIGjIB_th4=Yp0wyls1=Fmvc7?4JRwl^Ge3}fTO zP$rMqFwTN9H4MaHWio2IHolr+XKVGt(3C_?5WJicE{)Li=$wFcG#C0$YJE#epXzv?oA;6COut;Sc(8@e(F8-gP+I3C|z0?>0lMNm~L_+d1Pc>Exr z?1A+hYggRw&v~=#qD)a)Qoeb7=Tg62bEZa>7mip8#xmLdF-my-y7brND zt|!7`NO|79pGlrt=lKDPAdhIUq}XEz-#sH!FhQlrvSa-@UDo+$`RsI>QLU6_AkaaM8uu1une4wJqt`9_E zl0>aRcYqp6O+XxT97V1OZw7I?HB2Y{#jpXtizDW>l3){kbzS*&4>fctw~cMb$C-#( zDfUx?;W59JkxpIj=NSZ8+z_}5AXvszOowv$q`*uluZ&lgbO39C4_3P-bJ7TtDWzm$ zH$JydTzbM|7j)31>0SDM z>IF;NxL|2p)uo-r_Quk-s!KcgUzT>jE)FhO+MxwY+ppXbs)Qmymljs$|Gu;cOF0xi zy<*6&cmMxe-2TGio}XV><$C|#Q<-Qfqx^Vsh4SUeDv)rxq;1-g4lG#G9_78s-S}J` zyYxig!X<4ltj>ZZoh)QFRR6an9iRUmSC=$6zoeb{CH1IF8toCL3QO9XThbDxIli_0 z2vQ>&r>$(w`LrRx4=XeAtrb42xO3!;GmcdocholM4I^ia&dkk@Vn-*GJL8pH*jm`6 zY{05)2_0A}Ma8fcZY-;EJhXASB~Q#MW6IfyS}^MGCXSWFt)G>-pcZURmX^!W|Glei zZV=e6?j>-^sC0hx|cf@n{LVH}G3Vu_3pw9?GN{`V@MCaYMVRnbiyElFC%xYZbs z(p@1)RxuQXo9wcwI~mCEDYNoMszM>DK2WEq5RtHrjkH;qe(p3h`cATpoH!<2|EpUI;jxvrdx%VR^Vg{CK(saW6-&nZvO=#)oh)+vi-%axC2)__>PJX5A@nO(!!m7TNZa);Ft z{VzbJl(T2o8JwT_NWn;dCXa$)SMHfLf(X7nt8cejLBXhoUo{rR+w5!?&B#fJRrM;d z^NAfab9OdD9}QlsIbqH35T8Z`o0T)>b}~)MC3EeD7)pU!=S!f6FdRx|&7m|`z{Mu3 z5+2{6tUq&*=~BXH>OhZAo_RCVtB5Cl1>jbkRl7^=c81bhpQwV@5VYn=vstIh_uzwP z8iWgvVI^>urzYJej2HGCI6R6@!jkFaYxXwF@>f@l*F)P{N*&#CnT# zuwW|6O@7@jiv*>nkUauvFYoU_&qB0zV$Scq@KizqpB;GHLmTFWIwRwUAN( zp_ib%9zuptB`FtOvb#E`8VXTuN~gpir zDZcCpP{`k3Hqg~#%56UE?!0!K3{hdFx=-*Hs@hH3PP3Xc(N7Jj5}Hh+PM0?+K@>dq z@=EOZ8!jKj@4qiE*V#?fE}s;;;00*Pbws7*JiP#?*nh=056WV#8nXe-R5axkS&2q* z$cMbzBt=E5NiXlLhchO(3Q=0PK~l<2?p-X+g+v$;701cu@-~wt9)#8t(_#$8qj0i; z*bFJRoh&WuH;KNmHzN7^`#PE;p(y4S#;i`|`I86PHk0!HnI+0?6HCaBN4RB5!<9#h zI{|ncI4=2UrP;#6L^vcHaEEL~t~Sfl9LYl3MyPQ#FM5QgXJ;!)+8QpNP2 zI!igigBm_UU@ANHZ}M}F_l^ru@&Cs<7S~j3AOpb)n13rC*WO;xnRA z;*p@w=!?Z*D3=xP+E=mN{&cNppFA=(Dw^_r%kzDE(S*8pqayek9d$C{lN^am(1!-* zzIqYHv*fxhj7;8-aa+nQFnrT*ho(%|n(I!(?*rEj zuZBIGPVbaRyRk^hj_ZvLk`M(_gd$VECVwC(;ltcKI3WrSmNp1Flrx1;i$u=0ipi8o z?_+%VUh0OZ(pSM+oG(>Xuv@?_D&6w>a?ot6Tn!0X+KMr7RN9+%|yURe#)|w0>_RvOV8hv>dGketbKA zC+{mcwe#*LmJ~~cIGb*DtNWETKmQ2z7XRYAsB_mZpiW7re)Qm3%ywA}EwJB3K&TSF zFjiDpAh5t3rMMq9GV-Y_9v))Q&zrye8GdhjqyxVnKXN^OH$PggEPHI3a`&SmQvZ0g z55L`y-M>~gx@b7C28iSn-}=s=e|c>#W}c=AmAuKx8I_znJ=8osXm_5Ee&Ox*zC zggX%S#TUM>DCEo&rOJ&@{}^xH-#kY1NF8p`5VQy9;QS8wF_=(x~=P11BK^rv?za*h7E zrb<%j|43*Q8v%|Q$l%^cFkY|+=%rKN{PPIV=gK!JA`ZT}1AU$ICV)Tn(>Fh$yYKsN zx8nETZ+{)X*Z-wtvsCLgV?ZM%jR@E2^wC;vhnQXl`Na+h2u22aa(m<)y0;teJ< zObof+132`O2dIu(9y;G~px^7>`91JBNLiX^TPpY(6>~RI8C3OA#s2{olRmteWshlgm@^S@sIiL?WeZ<{aF@gR{r)68wZ`D^^-$P zN;&V77nr6~o=?}{OE%6hyE!IJZsZv~W6wUpGdHtL6PaDi{DX0l)Dq@m%0=C1hu|g!fa-w><>zq513WCUMLfQZ&zX7FC&kyXDT?fO0HeUloP&; zS-$}(gsEZG@?BNJ@JK~gf*_ziw0V9RqwGNUIcOswa`>tSx6Og87pl3nYT2f8=8n}m z3EMmmiZC#7yl&(ASZcvt@c_+hRa#*~z##rYn05e2puSeyxGwnN_mh zC8RYL7851%_ruJlO%fa_VX$e0FNc$%4*FWDt98LtjuIv-Q;OQHR_3C0Lg$zeGkSxO zxKC`OuP!e%n1rt-=%Z(kLrTWX8SyCjmy^-&9Hzx$J_%yG*c8M&)gBX5+6%lv zJ~2!aiOASk&?m-;qo4WH8s8MK)=F7+jJ^f3?E}nv9OKO%7-n8rRvJNOPA;3H%P=Oo z^+(7KAM-5Jo8@HY7{dg!o-xK%gn9l+kdev<#`NItF$9W(5;q~lRwc<8-JuZE!1R+d zL(C+~z87MSFiIZ znF{*-rCDYlgLLVc%m7UX&th0+#UR>IC5AC{cj@^|898}26G1P`IgAO9UFR^bFmiU? z=a>_;aphdb$}ofEH|H_et6=95BxVc&ZokbvrL|*6-51YiMo{O#1x!6lo>G`va@B>* z8TjzQg$z!b5aUG*2qGD}hym-!K6DZDM-I>LUdDvb75%!MG+x0pqlpWyU_g8%a`Q>1 zO?zy}uDFtUkSXe?@RQpwWVVriDoimxuKWT6%PBed1qRU`*~}Lh!Z4lL;;Wgn8K#XW zg!w*mG<)QW%*`vY93S1ld~a#Bln^H(R3~%>)IjlpfH-*wI-is{I5|5zt-fY|c^e~9 z7zm4+k!7~5SS?Kn@>F4SN!bg3%KVx`qh~zGj5A5{;DgMGjA7b_{ zW)j&89%r88m~htp6ysu(vOk*UT3Pa@BV?gxd=#j%^OS|1H66sO@>**w2((WU@};NmJgXB77KIT z|1dsQPLPq07(Fq5#6Zd=&X1V)&~nS)n7=TLgY5p8ITvvM;A7_Mt1f0&kbiDxmu01Y zFxN9H7sz@e5-I){-KS*xznH6*JEjDmEaMcEIYl1)7XzM_efM9?xj;&i_>`H(_eOA?M+B4`Vw@+(E` z)5S8}i*+HW5(0wrcJ8W^$=Qq8ql}fjx1B8`pH#8S$Uhgc&n~wY24p2KEoR%mgKCzr z4NMo2m$1(_;k1(xih5YGtCDyeBr@l=>6(He#+>(oVsLr7s%wzwmpI61(3lqF?72%> zfhh*tw~shS>uCHn73XF0z%tf|?%rF*LdYYLqygJ034DXHR3A7XVwcf{m6) zs)`a6X9}}oma{jlU^6VrR_6K2Ln|C03L4c!TyH79C7o6V0FFnK+Q&pKX*fROu26odH z$>@nB5|I!-X)m-;&?h4hA9YDd1^Xy)?bQl)DFap&X#grj3}&jfQZ6oOZc2?DVu{F# zO{}m8x-9H3&&8&xF|Itde6DSOp86vZl?8Z7Ne|88lYKNfD zLfgtoF_hp?^-zQaqA7gPSSwj5UZksv?OWD|!_lf}Ba?4ev4_aJ+u3r8u@|G8i*&33 zaw~%aKQbvYvP~%1VPxTR%Z?$% zGp$*SuAGwkpY3Mv1IIjf4+ssOckX3-IjY0b-K({NC6LJa11!|KZ1wiFejw})w!6bp&=(Wk0@WaWps->DugQSaGDT&+kbqb_ z8h=S93BQi>V(-1=0K!XGJJ}&{%3&w_?Ipu%pF)Bx>u1jf{Fn5rtl?Yz?C4f_(sKcY zG+2{**>mS5^dX#rh!EWX+gw8p1Nm4opGWnff}m7+VY0^#){Yaxlyk`d`z_4U?m=`7 zX={*umY30p(z9~?ZiL4OGY~-_&g3m-2n3`NQkWlvEWz*qr8b;s_Q~#KkVfcA**lK1 zk2B!!=M1xd$CJ#Q!9Kdz?GbfuObO)WAYMIjV=k45i^q-CGeOVXalwl(>cO=-cQl|A zl4N$2Mbs#{W|Xb0^?StQUU;x3s%H}Mx#}4&tr4AXHiTChXNPsd7JFF8t z^gV9OCo=#7(0XX!E%>wmS{HfqIJ=|FF%M?O129`?(O7`IKg!lJQ)JN1IysleKujCC zL*#8Y+srt!^&WPHV^ZY1KDNw~q7^*e|7hEZt`LY7Np*p3=!A4W*+*H8POy8#y(W`j zC7=30VVX#%%zk%$mq(l#ae7A0k$^Cg#Z*p^bdg z&u%9#``NXePUt1CpavDD{cPQ)VHAgzKHqX!3gC!qBnG3PFGH+o5JYMq00azYPXxd; zxM7b#dMdfn>~rI6l3|Wy?LoGZ!{S9FtOdf{EfMw#$UI_{?I5>C!D~)NK@=ylw?)~{ zvz*;idv%5_CH6SGobC0H@7~ImuZUpRc7xvNBf=y(E6z499rwWfbI7NUkSD6S^~>7T zWB}p?d2%baWl^WcU@$|7PJjsK3z6dqb`gg*)GA=X?gZPrvdc5#GXi5qE#aCP(t9HW z*_{vZMdaB8+X||_HOYPgIc>`nn_}BMlyZQpmWR*(E5pKuy2{v&Vc(&XOGXYKjy$oH=ST#<{Ler ziJzWeYt~nL1U+?};4DvNLTpr{rSxH9Ig7mrOyC!1vD?7}-Z_ii*#q7Bc-$XJRnNo& zK$>_i3G7$Xh;Tekjdi(XP)ka_{C6)ha!7{q)iVJSI-6}>nan`&S1s2%(7pT5h8W7@ zc(Rn;{yFwTW}}qRtZy#33b3s}qXR*plO9FL;V)v49p|xBH?+RPl#s}Itd1PE@ulQj z=c%IYJLj=wYo&%JA5{T6a&d&gr`%B64(aa$a-(g zKzf?^_2k_zu`9_<7l53`iSP65Yph!XfK*m-i?X2$*&>z?W(;%W>~S+98scvrjT7Bt%N9q^udl2bW7^#9cx(qXzutVy2H{72fBtWa|T3plo5h185GWM~VlCOx?%7En!RkX9Fv{QM-l8%pKJC)q6q7uHWg07WvY z6CAmB5G$RK$|Z8d!ATBZ$sS&tMy@gJp7OY3b$Ed8k}HwF)tV8lIEUAOlRwcqTHma` z5PH6-(+`^Yrn+)nDJzXz6`Z)Q6?k!fLW6d@f%3? z8g>sKLI&MUrCI(ftdl7kL)t)$E4VG$nQPhS88UkvIy!V6NJlDDurYR!&tJ#J*19qX z9%yLFn5`LexS=^??jkF$$J9Bqhp%S`S;kJj_;tu|Qud**qjTP$nVluq-oTb+b>C#~ zp=!e`-(qXPd>7xyeoC3|x7l|v?H_%cy%WOd&EH|$i=bHj^;U@GeZ+hlJ6$@C*$qV` zcd*Xm_D;}c!6A?A!?&@OEIXbdubu*8ad)t5A=|INgKcGdGQ{*xY@*{4b}`A^0n*x+ z{rVkH9yU&*CGc#uF`dxkQ(5+8253`Fw%rL$qLD~X~ZV%rv;O1}cJYfW-aew!7HVPV1!jq2){PY(~bwGUl^9 z5h0ygxLvhTB><2o}M6CihdpFP3KG4j$DZgaLL%U;c($m>6V4Pk&7e#riV zto<3giG1%7c6HYFBM?~(;TLy9y=coa_psYpb}&OWJ;oZcj{Dfp@q9nsiQl~+H9q<& zyNR9F_G;GnGj@tA8p;SqGvv#^#@C-e$UY1PcKJhW`HmxWU_<{Yb_`?i8o!-Nfa(oV ze(P%?Pd)@;J3+XI+2P7?OMc&>$Z;W%OJd)t=@^-Nn5{QPke#ES^DV{mnMNrP4+Y}! zTpc%g;bBO+LGsbV*c;yLhF`J)hEzNTb~jwc6_cK=+$!?@N3cdv6CVY31<1z7*eDxo zQE6iK#>ZHZ;bnv?lkuNG9b5W1`{JTR3!-=D$o=0(E9~8DMRwy8*oH;%79rR|9;oJO zidxj&Qyc}FedT_33F~XgUhyPb#PE?8!ArjMYxdvFFdgU*uOE$VD6_E8&ECY^en_dnAVOho5EJ>&9?<1CTlqi3Ae?Y>gv66|Kiw zFzdruHcz~+@NJ45dJaYw50Re3N@cQFKga$IUJ^3$JUhy`vOjzt#HK9NB19um1dqW& zAP2@&gTtKQ$R2)?<(LjB0MQ8y6O1hmpDwj?rvO2||2owu43{&C`N1h-cttrG7ivM| zaiXNU+z?f>m%POK7_#FPkeWwJv2rV40scEk?JHQ^OxE@aJF|$DM2#W7{2JR;2KE(M zz=~l1(i@FNi8Q{>`fwmCC*#QE_SeyZOrCz7Jyt|DXo>9qGdPTtUHS%_g`0;w@Ft6M zdE^E4k^S47?6(;vmA(FL_VPuT4AY0~Pm9wn232|pi1aM49B3e4`w$kTjeliLTt1cc z{goZ!R>%lW#u-U^S~5(|dX?RN+U#uD=u$`TNKm6ZKnNIS{xc7H_}@V_C358NAWiVA z{GB~_Nv^3ddGbD>W8cSYKP$ya=ik|C^4P~fB8ja22m5;v_7DC6f)A}BRK(e`&;A>l z^l5g?E!It&bE}3Fg*4m*R6Vhh$xk71Hc>PvBiDY)t^)hHWE9^#aDY{B*a|^lTEeLVfvD{A>zN1B$$ohD0F~c-v z0hoze&%U~dD_>-zxY$GPUc~JMQU72OcWBQz_P8521x;aou)V>`g?41cy)j59xr|9< zcpgDmClUVC+a%b|Z23v%H=A(f-ZJJzN z%yogp{-K!bMK62Ta$aUU`=zy953^>nMUy#m(q=XJcpX=BVhEik+#aw3ywGh*-=hI_ zHTvnabgEF%;i#%@8^){&oKY%|9@Ubnz^P{R(n(U~RW*4emjqc=)5A#T=qb|GGmATE zA3hhkp@genlW_gVgoMd!CEPY3)v{8qf(y7r^1$8PI$|#6PA`isELxbX2)VEnBOfBq zmvTR5!i22n_MrZw>$&~pp)#(DRMQ`}oKq=sm^<1ckXybCqu8IzxC$^7uADm`WB$pqP25E*#7Ys(L>@ zU?J3*SM#ID&}LpuhH}Y#wJ|cfncIOa`T5P92Nd?L&D{G)y|{%lFO!pVv?g`^JoyH; zPn3vTIf)x{8OYWuuA02^BS3 z`4^bb=)c&-*++C}o_D(h54j&qid3A&Z6*_^ab?6t-}ckDbMkqZa{FoArtEd6aod^V zF5J>X4KhAioTRrybdlwHPDehj;a2qeGR#Q*mw|=Sq6A=!+8Ib8nmgJvM!s#}HXWM6i7M@ck4Jrj zG6x;76_H^fzriw=rkBN0|4#l&&3QLFEag*#-NA`Kv%@<;kV53r9o(+sqw4s30k<~( zG4jL?E(Xh1Q!SV5m&0^%ngeuk0*MhhJPM7l8IgD4Q9~k@nX$W(Ey!UZmp2DHg%@Ym zV3t=)=gPtfPYvSDZh@92D+NrAoD~G_Q#ehCVB!!Vl8u|V*V%Ow2$MgS@XTTZCSdgl z?i6g<&~6T%I2#$+3#^_XvwOJ+s=d9JI|7Ehe;=1DmT;|1vNkB-_OV*rDk#d?d-idg zc?3JCmU#H<5t`lTrp^^ap!#5;4T%X{j+#$eyjrXmjV?uGQasV;qxW$lYL3PX`Q}SP zGq1C70?YPTX+$Uqi`=)NdXydFt_GL7^$@pV$+%VAwbuk~Bb^-l25z2j*?-kb`srZ%Aa}dcPo|2k~ImF*zbmzmP0FuDmJcq-7s3N z(ziw_ZuGn14EC8w*2e8BP2^)s5tU=WxgUxPVe*L$%a$Np?cAn%7veE#RDr{!9dS#U za#swQv?I`I1mV)}LBv+zX>pODor9i8uD4@`9b|tG2Y)+Jdbphpa8-q{j&LdBTqBM0 z#=5Cz+QhU87j&ge3-jP6gT)=O!ufznxc_^(suSHgfI76`YhfY>m@Nlbk4Zbb+?NAz zJO^OANlenno=KAms8Ee4YKlS}k~vr_As937-KxxhC4(Hw*-c;It}fnhJR@~RoSx%>OQ+xOY1 zS?xg&?)}H-k-F?VH*l+9sU`pZ7WY#aY#+Fh`#U5TEGvn8hucd&_zu^Mpo;xBab-N= z?&3hj4~x`u7v$o5xa!>Nt@m)1x!1?;;Wnp^g6lVe;_lr$g2xa~^$0fv3UcI8?m`GuPe00?2?pwTj7x)^ zKKdBsYl*!67?)Yz*Q8!)h-=&=GVv=w)SSKfSKQJ?RImFD z=SKC*f5SNd+#i0UQl(|jaF?O6FFnJV55Y2FFh>rFyP!gVQ$i1k3;9-6ne zLGN9Vx0mMa0}c0zar9sOTkuVZ)c=-S54PFWwGTbVMavN+k@R?iKC}im3Qo)i-AJM7SD)j=jVPI)$;zM}PRW8hQYHs} zhqh$m{vB5W;bC^RP!Lh<^!!GyZ+eQJ+QxHNem4Zwuejs}#psXrJ8t)0T$GZFUUwqw1LU=qTFwJ#pk4I^SmcAjhNMwbS5X8( zv53*>eV*I38KH_AH4ll&TpL;)IF^%y`5ChTG4jC%nTC>>)!(`h2pP@MLProB@Z9rQ zQi+tmz*Sbxw`a)>^D{vJM_=F&sZP#&0qY}^8(!d!m(n|Y5Eq=G(ehdxJi@+6#fu#5 zRHXSuPG<#|7R6ve+*j|25tEkC`~e=^6O-pkG91~IX+&{G8b>VDUvlG%oN4Pka5T(% zp@me%?r&8y)dbohpS;4AM_V7o7k}pPEUyu}3uMC=3p8!@%Yh7r;PG}L91$?3p zggyxfamQ;UmQlMaq-cLCeAM7cyD>2abj!EIl@FyotVaCWr$*Ecxp|68!`Lits1sdT9OEtPPj-U5r3$hB`_lgi{3 zq&RGCa@}eCR?__kZUx!>Hdn%d?hxTGTr~;5&27?(A6N@JgnBD!h)%OQC|bW{*Z*Z) zxxq})i&j9?3uD{#7w!-LA11gRD*-6N?*LK3c;DgnZUBm6(zHVgai2Tp^$$?e0XB8$ zU9KHx3_&b#=MwZBDtaKO=v^*@x@+F!{6O!9sKz{CQJ|}<88dviE}bavQH`1W?mYEycD#Kx-+;&1YW`y6ez=*fX`~qUS6IlBx4Et4-qZM%TXUO`#vm>zf-9-id+5|gwvZ(? zh`9oD$Zo0O9gsOmY&(Bokp#XI2ov`|)UEo&cHW9FYxO)`ukcE~d^?S*Q_HBkR=a1* zp@Kmt3yS1_w(yXiKa8qN4g5BYqRzm}w5u=d;Ax!peLHyE1G#{Nyu5?gak$)u3eFqI z=34#{Ox7E<{B{&B7WmWMInoGh*C7m7qctFFlyeEVi6zghfS-kT%74`F^Ar`&67&E14H8uI* zVRCyNk5eGz@j7)ni;Ze(r;*-kDNKB(t$@1lWB9^z}Vt-JWwC>qx7;Smd# zJ!22QpMf(8huP`jP}DiZH0+qzL57Uok2ln&lqbfam$s*S8WEWpa z-aEuET8o`VMJTxZ^M@#DXIquS*DcBppN@U7Ru-_A%#ad;$+&rnwn~c4ypJ5Dbnz-P zZ=v9td7P3Xzp$tqWYIzF8=2gAkhd4O9iUTKO^_mQi>ftvn@M&sh0Rt?~w9Y2?Q_83yUz zx43e0e3 zQlYxC37c3ZKWyTw@p!2Tn?WXQGk+97jWh!(@VvH#kJ7bS)yD6}qp^*zM{c5xce512 z4*n(N{=0)Orw1^L$lp8prXqTLT+UW>@(*K$vVZL2yP4H8qSEIjc?&st9=vOZJNXUk zVerCXRBRPTz!QYfh$Tk@2?B*W+Lkd-KAO9-1QMULGdh&9P zAM6!>s)=4~NvCk-0Dn6m%j3mlFEsqcgFMbMlG6uy*h|Uapt{1!Ab%!OYmf3cw?{5I z%8T1EWdKJF&JIKVQE#%e=DonULpG40UMrcrbClnJI!|`6>xlgnw>YaC;`j5&86Ksx zq#}_b77c9XsRS9 z=S6~%m>AH=ey-f+7+<_t{j4*P+pa*(ZI|&|PEhfK+APAAxTGy%%pK-c?{XVMFM0nk z1tDAjAwoe27%btOTuDP#=(Pu+1X|BHe7g{m$QSUjYaCZC+-H(B&w<-Cqu^ULxk}-W5#bAb z3H%pJzQ9+Pdd6UE)zlX?$c%dSVW0T|fA6yCCSedJ9Up9I*ImUM$^NUbC5On(SMmQq zFWOs(HSOd zt_Levy`3*wK7aP`C^`FjzI{^)({6U)M{te7aEF^43ZhOg`P22Fd@l0nBOs1PiS29r z=1R3ZE?J~i=8GO_!s1cXNs!5J@)g+|zQ$k1u){fzJZ^HXA61Xf=%%o-{OzKy3gJS=_gDEZsZTI3Un>#G(rnjkb7_B z4J3XOHsn8VK!mSZv76g*IUPMC{l|l$2ndqYda&fPS=0dY0gHz!}AQe?9KSF=n2j%Th}&9agu#RoD@tG~Qs4GW_X=q3e?YT$r{ zRVi>OJ1{2$H>|E@DPr=4Izn+Bi~jT}>wra8Du{In#9Fxy7$CyyfdTSt9WdFKP7hqi zB0ODvJ&Qe)XZqxaS>oI4*R${d7tc)Z*~C)H=((L~GfNl~Q+E3Fz9=TK?FCy|I$4?g zpce4$X5rze zdgo~tC*W`$I2C40|9qMyP716ZmA+nqiH=| ZW+AgYi#^bW$p=>HGrDc(Jjc?;1^`zo!8`x} delta 29096 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 delta 2538 zcmb7EZBSI#8J@cfyLZnX;2yq=g62j=6z=jRA7S|j=Ux^>K}0~hVHt|c1s0aO>+Yfg zf+jMWMjP`n>06z&I;M^`p{rdCbk%okL0GUY*cVb3QWqQx&INJ7^%lC;TtN4)?mY=$-t;bX1pj^mMfQ!uq6cB=*E2Q9YIj@$Ei% zK8&(=^CSU7<~wK2Kl9f=A%_fkLZ6O|$i4xu?CYNxs7r!#%b|1J4;WVRHe*DO#q?n_ zbG#nbgi*nIlh{`u%J;+i7PQtLFd89Ri*wlvEok0m3j`pe4K?6Epk$!UU9-c9z35r<^%zulqi5KSZuF9!jrXC~F#O~tR0z^plnUow zL20ae7+rOml#1X?7!|HF*(ZiZy>gFYn$Z<8yf7F>xt?HnC?412UOAqKg^bbu0V^yx z777o?bi*ra{R6x*Yk8a3tYaPIOd>x#H;KyNXOpPN6O0(~gsB~mn~;a%%QAko7_gxQ zJz{IDgFT-+vZ2U88FsEK_zhm#5d-BpEV<{{6$9N}1J|EH_3XDN(EFLN{W!{GZ=OYo zRH!R|pns(~BlQ8}|+Kow4|Cab)R*0@;LRa9j+!wLJ&o9HRQGU1c!sDuTtp`8LO zrn^PZvfKriZ~vI9W<_#%t!)(nj$}a8z$t9sd+20}bvk^%7GoydKo|EzXuVs3zFfBi zuQxgoyIbJiw8b_%2bt~eI2@AP8Sv;Q$O%jB?!M#!r5*13AHls4cC+u5;)5xUNHh_O z7(jZt3}jBU&|etGJ+<^uVgx`YY`(c6f$%;UyKW(<0?WnS%y0bu7rDU zqZG*T-~zZbh$U$8;94jx#|pga!9DPI4=#qAv%HXPB|N0&_l`8^E5UTd+6=!a!33^s zb?3ofOK@)zXf4GJF#U!j2clV`2>+?X`_msH5`(|-CWZ@DIGog$*H*!Lt8u+0dnV&L z^$XBhhw~lDred)=9Nx(OJb?e5)EjPp1Lv`fVZ6=38prVmBFl~A(*nDaz^P6+zFW+J z()W-9O6Tzw_FxvTv#l;NzIb!_R?RdZy^GRW>oNQf0o14Qxg;kG`OUMuc=;4|!sg?6 zDtU>#g)-TV+ripTmo+|;zxll;`#q?3rqb0?oD6i&Q4#)pXEE%NF=Ne8F1nz-pDTB#1V%T!aTRI z*9Bbt4eZokaM|+6d~g>JFPj}7LI#E@ozV~{l} zbvSk?Jdm=nQRzAR#*aC2auxC>qkb11?TTf3TJIv7=!r zBL#d1q)c`pD)}Aa0o6=ft}@|}bVR5eRjIaD>808Zo|^V4QRt&d&T$D))Dse z!%~*r6{J+>x!R)a_AD=L%lNLHN++fKfNt6wQx!j@lbV?|Xuc}UbN5yG*u_Ism2jB8ICjgsPt{YW$l}3*{;IUu~qDgV^TyAxzs$8L;hm2 ziJg5~`tCVMWCs(!ut&PdOiOnn}`;Jck9W?mCM@MKweD(Gw`5+ zJRwe5HN;d%_mj;q*htcsm#S3Y{Z#qaO{6@T zcMRf9WIkyd@UJFv)W!8SCnnJh$0#YZ7?(Cj*^elx|FX6*c3&m`OpzM=r-F#%}F0*Gk z%;Ak`th$F}+E$8Vd-jn!o3q*~KMXH^jr?k5uwc|rW<<`~B)u#{`jf=#Om=G&I-evj F{ui<~Ee!ww diff --git a/netbox/project-static/dist/status.js b/netbox/project-static/dist/status.js index 62d937941dfc5bf7c1506451d11b41d0c0dedec3..e9f67d1911c284c45b5b2c3acbca787330bd0bb6 100644 GIT binary patch delta 12175 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 X?*Eo-Az7HlzvrstF;9 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 diff --git a/netbox/project-static/dist/status.js.map b/netbox/project-static/dist/status.js.map index 1d4d1ec9b233be974c3e846bb0250fbe63313071..1d0eeebd6fe50306bfe40cce7a439a210517124d 100644 GIT binary patch delta 1222 zcmZ8fO>7%Q6xOVFc5GTHiR7dp0(wEJz}`*V6hwk!8?9HyO=(hxy5h$+ViQk-ll89I zb<&y^T2YY#*B}i=J#auE^@O19NFX?HD+dqDcC6@qS`(DXC4X~6e^)v%jG86 z%!VB2o{Y~)?6!il(UF>ZwobLg@sBjkrwK*)g-Px+L(tYg2uLM!B93UN+sZoSj+E8e3I=E`MRpaZXk!>y{$ZpqMf|fFm&ThuK%rkj-s9+pv%_(Q4U5MdCm8=^6cR| z$}OS_G|Hqc<>bNR$Fzd3&jgp35ALS87xG$B*T;j%Lh3oz*-{33d}30Y)OD&ouN#Yb z_TiTDiZtc_VoPbFC)ulal?%m}b>k)Nq;3?0>qt=VMXj0dlE=H`(k^+TON#6%y?B)O z-&1~*&?x`wUu8uiheXHET(e1BA~cxAEwJ|`audD5reowmel9}B5IJQ8?T+zpWipJS x;{q)f_y#5)BeE>uC|@JwYeYI>XgNl{K}5`HoMr?2$ZO;&G4v>ZYadxg{{bB*i+cb7 delta 1018 zcmZuuT}Tu`9B1}+cFwxM#6Hy+1B=eR^ePI@kJwuey-*VGMC$gS<6L#SyS;1o^fHw+ zQM0G0hoR`Xpe%xl0e$EtiXMIOB?2F#dWecXG^&}s%LrPS+5hkV`+xrC;jQYAH>xKe zgWE~EkOVVj^jHSm5XjURn5L(4V85$qmgT{llJ`OZ0FknQ6|u;zPJ&A!9hw1UV6HIB zkHC(L7G}k7X)^IiY$DG;iO0z1&!V56_$(emf~L{&b@4i?Q@X=Fy4@UY#Vt6B$8pHA zvQ{u*>&#}H1DlB31s8YaM{_#vh<0^`(t1WW^W9c9r(1bLC$%+jXBTeKOw6*z_>X_F z6gEtp(nqrcI1~@yP%IU1Dv}eW&&x*9&z{~FrOET2qz z;dT^@#x=9Gi6~P-C4DQxivrt?7znm_H0@x#emtgWHuF3{uo-Hak1hTV!K0Aw+XA1s z$Z9#f!mnC#bt}9~YbxM%7k#!3-t`E0j3~9Rj=cULR?z!<;X}lS@&c743{XjadSL}? zjd4CP7{F1Po4G%V*a7_SKG9YuAem0sw$4~PZyDxbEMD{u8R>pYHv?FW#o5Y^`#`{1 zkfiEioV=-rjbz>jJ!GE@_sGetY3I4JEI5S|c1h&_N=23{;SO&!-dd8rm^+e459=)Z z@5C`yjz151Br`QuWLQPs*TPM6k`GeJCzZVf=Vj(ujcADr~~@bOE4B0Yx}yXd^FN=ryY6ROl?dC!#PwDV3uUx(<;KxC;(C t+(sJ_x(N_dfRQ=6>_&?KWlEvfHlZbe3QmVKiF(i(WIHu;bjgE;!Ea+DN!('button.cable-toggle')) { element.addEventListener('click', () => toggleConnection(element)); } @@ -116,7 +116,7 @@ function handleDepthToggle(state: StateManager, button: HTMLBu /** * Initialize object depth toggle buttons. */ -function initDepthToggle() { +function initDepthToggle(): void { const initiallyHidden = objectDepthState.get('hidden'); for (const button of getElements('button.toggle-depth')) { @@ -190,7 +190,7 @@ function handlePreferenceSave(event: Event): void { /** * Initialize handlers for user profile updates. */ -function initPreferenceUpdate() { +function initPreferenceUpdate(): void { const form = getElement('preferences-update'); if (form !== null) { form.addEventListener('submit', handlePreferenceSave); @@ -203,7 +203,7 @@ function initPreferenceUpdate() { * * @param event Change Event */ -function handleSelectAllToggle(event: Event) { +function handleSelectAllToggle(event: Event): void { // Select all checkbox in header row. const tableSelectAll = event.currentTarget as HTMLInputElement; // Nearest table to the select all checkbox. @@ -248,7 +248,7 @@ function handleSelectAllToggle(event: Event) { * * @param event Change Event */ -function handlePkCheck(event: Event) { +function handlePkCheck(event: Event): void { const target = event.currentTarget as HTMLInputElement; if (!target.checked) { for (const element of getElements( @@ -267,7 +267,7 @@ function handlePkCheck(event: Event) { * * @param event Change Event */ -function handleSelectAll(event: Event) { +function handleSelectAll(event: Event): void { const target = event.currentTarget as HTMLInputElement; const selectAllBox = getElement('select-all-box'); if (selectAllBox !== null) { @@ -286,7 +286,7 @@ function handleSelectAll(event: Event) { /** * Initialize table select all elements. */ -function initSelectAll() { +function initSelectAll(): void { for (const element of getElements( 'table tr th > input[type="checkbox"].toggle', )) { @@ -302,20 +302,20 @@ function initSelectAll() { } } -function handlePerPageSelect(event: Event) { +function handlePerPageSelect(event: Event): void { const select = event.currentTarget as HTMLSelectElement; if (select.form !== null) { select.form.submit(); } } -function initPerPage() { +function initPerPage(): void { for (const element of getElements('select.per-page')) { element.addEventListener('change', handlePerPageSelect); } } -export function initButtons() { +export function initButtons(): void { for (const func of [ initDepthToggle, initConnectionToggle, diff --git a/netbox/project-static/src/clipboard.ts b/netbox/project-static/src/clipboard.ts index f83936346..a04acba39 100644 --- a/netbox/project-static/src/clipboard.ts +++ b/netbox/project-static/src/clipboard.ts @@ -1,7 +1,7 @@ import Clipboard from 'clipboard'; import { getElements } from './util'; -export function initClipboard() { +export function initClipboard(): void { for (const element of getElements('a.copy-token', 'button.copy-secret')) { new Clipboard(element); } diff --git a/netbox/project-static/src/colorMode.ts b/netbox/project-static/src/colorMode.ts index 443e0b6fe..dfd05df4f 100644 --- a/netbox/project-static/src/colorMode.ts +++ b/netbox/project-static/src/colorMode.ts @@ -6,7 +6,10 @@ const TEXT_WHEN_LIGHT = 'Dark Mode'; const ICON_WHEN_DARK = 'mdi-lightbulb-on'; const ICON_WHEN_LIGHT = 'mdi-lightbulb'; -function isColorMode(value: string): value is ColorMode { +/** + * Determine if a value is a supported color mode string value. + */ +function isColorMode(value: unknown): value is ColorMode { return value === 'dark' || value === 'light'; } diff --git a/netbox/project-static/src/device/config.ts b/netbox/project-static/src/device/config.ts index a4898ba8e..cbe70952e 100644 --- a/netbox/project-static/src/device/config.ts +++ b/netbox/project-static/src/device/config.ts @@ -4,7 +4,7 @@ import { apiGetBase, getNetboxData, hasError, toggleLoader } from '../util'; /** * Initialize device config elements. */ -function initConfig() { +function initConfig(): void { toggleLoader('show'); const url = getNetboxData('data-object-url'); diff --git a/netbox/project-static/src/device/lldp.ts b/netbox/project-static/src/device/lldp.ts index 71a8854df..6baaa9b38 100644 --- a/netbox/project-static/src/device/lldp.ts +++ b/netbox/project-static/src/device/lldp.ts @@ -31,7 +31,7 @@ function updateRowStyle(data: LLDPNeighborDetail) { let cInterfaceShort = null; if (isTruthy(cInterface)) { - cInterfaceShort = cInterface.replace(/^([A-Z][a-z])[^0-9]*([0-9\/]+)$/, '$1$2'); + cInterfaceShort = cInterface.replace(/^([A-Z][a-z])[^0-9]*([0-9/]+)$/, '$1$2'); } const nHost = neighbor.remote_system_name ?? ''; diff --git a/netbox/project-static/src/device/status.ts b/netbox/project-static/src/device/status.ts index b06d17aa9..8261ebc82 100644 --- a/netbox/project-static/src/device/status.ts +++ b/netbox/project-static/src/device/status.ts @@ -92,7 +92,7 @@ function getUptime(seconds: number): Uptime { * * @param facts NAPALM Device Facts */ -function processFacts(facts: DeviceFacts) { +function processFacts(facts: DeviceFacts): void { for (const key of factKeys) { if (key in facts) { // Find the target element which should have its innerHTML/innerText set to a NAPALM value. @@ -149,7 +149,7 @@ function insertTitleRow(next: E, title1: string, title2: * @param next Next adjacent element.For example, if this is the CPU data, `next` would be the * memory row. */ -function insertNoneRow>(next: E) { +function insertNoneRow>(next: E): void { const none = createElement('td', { colSpan: '2', innerText: 'No Data' }, [ 'text-muted', 'text-center', @@ -173,7 +173,7 @@ function getNext(id: string): Nullable { * * @param cpu NAPALM CPU data. */ -function processCpu(cpu: DeviceEnvironment['cpu']) { +function processCpu(cpu: DeviceEnvironment['cpu']): void { // Find the next adjacent element, so we can insert elements before it. const next = getNext('status-cpu'); if (typeof cpu !== 'undefined') { @@ -200,7 +200,7 @@ function processCpu(cpu: DeviceEnvironment['cpu']) { * * @param mem NAPALM memory data. */ -function processMemory(mem: DeviceEnvironment['memory']) { +function processMemory(mem: DeviceEnvironment['memory']): void { // Find the next adjacent element, so we can insert elements before it. const next = getNext('status-memory'); if (typeof mem !== 'undefined') { @@ -222,7 +222,7 @@ function processMemory(mem: DeviceEnvironment['memory']) { * * @param temp NAPALM temperature data. */ -function processTemp(temp: DeviceEnvironment['temperature']) { +function processTemp(temp: DeviceEnvironment['temperature']): void { // Find the next adjacent element, so we can insert elements before it. const next = getNext('status-temperature'); if (typeof temp !== 'undefined') { @@ -249,7 +249,7 @@ function processTemp(temp: DeviceEnvironment['temperature']) { * * @param fans NAPALM fan data. */ -function processFans(fans: DeviceEnvironment['fans']) { +function processFans(fans: DeviceEnvironment['fans']): void { // Find the next adjacent element, so we can insert elements before it. const next = getNext('status-fans'); if (typeof fans !== 'undefined') { @@ -285,7 +285,7 @@ function processFans(fans: DeviceEnvironment['fans']) { * * @param power NAPALM power data. */ -function processPower(power: DeviceEnvironment['power']) { +function processPower(power: DeviceEnvironment['power']): void { // Find the next adjacent element, so we can insert elements before it. const next = getNext('status-power'); if (typeof power !== 'undefined') { @@ -322,7 +322,7 @@ function processPower(power: DeviceEnvironment['power']) { * * @param env NAPALM Device Environment */ -function processEnvironment(env: DeviceEnvironment) { +function processEnvironment(env: DeviceEnvironment): void { const { cpu, memory, temperature, fans, power } = env; processCpu(cpu); processMemory(memory); @@ -334,7 +334,7 @@ function processEnvironment(env: DeviceEnvironment) { /** * Initialize NAPALM device status handlers. */ -function initStatus() { +function initStatus(): void { // Show loading state for both Facts & Environment cards. toggleLoader('show'); diff --git a/netbox/project-static/src/forms.ts b/netbox/project-static/src/forms.ts index 09799856b..1dfd20cb5 100644 --- a/netbox/project-static/src/forms.ts +++ b/netbox/project-static/src/forms.ts @@ -136,7 +136,7 @@ function initFormElements() { function moveOptionUp(element: HTMLSelectElement): void { const options = Array.from(element.options); for (let i = 1; i < options.length; i++) { - let option = options[i]; + const option = options[i]; if (option.selected) { element.removeChild(option); element.insertBefore(option, element.options[i - 1]); @@ -290,7 +290,7 @@ function initScopeSelector() { } } -export function initForms() { +export function initForms(): void { for (const func of [ initFormElements, initFormActions, diff --git a/netbox/project-static/src/global.d.ts b/netbox/project-static/src/global.d.ts index 3bb06ff43..f3dd7edd9 100644 --- a/netbox/project-static/src/global.d.ts +++ b/netbox/project-static/src/global.d.ts @@ -33,6 +33,8 @@ interface Window { */ type Index = K extends string ? K : never; +type APIResponse = T | ErrorBase | APIError; + type APIAnswer = { count: number; next: Nullable; diff --git a/netbox/project-static/src/jobs.ts b/netbox/project-static/src/jobs.ts index 319910a1e..8a8a3fd12 100644 --- a/netbox/project-static/src/jobs.ts +++ b/netbox/project-static/src/jobs.ts @@ -44,10 +44,13 @@ function updateLabel(status: JobStatus) { switch (status.value) { case 'failed' || 'errored': labelClass = 'danger'; + break; case 'running': labelClass = 'warning'; + break; case 'completed': labelClass = 'success'; + break; } element.setAttribute('class', `badge bg-${labelClass}`); element.innerText = status.label; diff --git a/netbox/project-static/src/links.ts b/netbox/project-static/src/links.ts index 5752e9c48..d39f3605b 100644 --- a/netbox/project-static/src/links.ts +++ b/netbox/project-static/src/links.ts @@ -3,7 +3,7 @@ import { isTruthy, getElements } from './util'; /** * Allow any element to be made "clickable" with the use of the `data-href` attribute. */ -export function initLinks() { +export function initLinks(): void { for (const link of getElements('*[data-href]')) { const href = link.getAttribute('data-href'); if (isTruthy(href)) { diff --git a/netbox/project-static/src/netbox.ts b/netbox/project-static/src/netbox.ts index 0b61fc8e3..79c196b96 100644 --- a/netbox/project-static/src/netbox.ts +++ b/netbox/project-static/src/netbox.ts @@ -13,7 +13,7 @@ import { initSideNav } from './sidenav'; import { initRackElevation } from './racks'; import { initLinks } from './links'; -function initDocument() { +function initDocument(): void { for (const init of [ initBootstrap, initColorMode, @@ -34,7 +34,7 @@ function initDocument() { } } -function initWindow() { +function initWindow(): void { const contentContainer = document.querySelector('.content-container'); if (contentContainer !== null) { // Focus the content container for accessible navigation. diff --git a/netbox/project-static/src/racks.ts b/netbox/project-static/src/racks.ts index ebf20a024..83d7abc14 100644 --- a/netbox/project-static/src/racks.ts +++ b/netbox/project-static/src/racks.ts @@ -67,7 +67,7 @@ function handleRackImageToggle( * Add onClick callback for toggling rack elevation images. Synchronize the image toggle button * text and display state of images with the local state. */ -export function initRackElevation() { +export function initRackElevation(): void { const initiallyHidden = rackImagesState.get('hidden'); for (const button of getElements('button.toggle-images')) { toggleRackImagesButton(initiallyHidden, button); diff --git a/netbox/project-static/src/search.ts b/netbox/project-static/src/search.ts index 4eaae06e5..120d833ea 100644 --- a/netbox/project-static/src/search.ts +++ b/netbox/project-static/src/search.ts @@ -8,7 +8,7 @@ import { getElements, getRowValues, findFirstAdjacent, isTruthy } from './util'; * @param event "click" event for each dropdown item. * @param button Each dropdown item element. */ -function handleSearchDropdownClick(event: Event, button: HTMLButtonElement) { +function handleSearchDropdownClick(event: Event, button: HTMLButtonElement): void { const dropdown = event.currentTarget as HTMLButtonElement; const selectedValue = findFirstAdjacent(dropdown, 'span.search-obj-selected'); const selectedType = findFirstAdjacent(dropdown, 'input.search-obj-type'); @@ -31,7 +31,7 @@ function handleSearchDropdownClick(event: Event, button: HTMLButtonElement) { /** * Initialize Search Bar Elements. */ -function initSearchBar() { +function initSearchBar(): void { for (const dropdown of getElements('.search-obj-selector')) { for (const button of dropdown.querySelectorAll( 'li > button.dropdown-item', @@ -44,7 +44,7 @@ function initSearchBar() { /** * Initialize Interface Table Filter Elements. */ -function initInterfaceFilter() { +function initInterfaceFilter(): void { for (const input of getElements('input.interface-filter')) { const table = findFirstAdjacent(input, 'table'); const rows = Array.from( @@ -53,7 +53,7 @@ function initInterfaceFilter() { /** * Filter on-page table by input text. */ - function handleInput(event: Event) { + function handleInput(event: Event): void { const target = event.target as HTMLInputElement; // Create a regex pattern from the input search text to match against. const filter = new RegExp(target.value.toLowerCase().trim()); @@ -87,7 +87,7 @@ function initInterfaceFilter() { } } -function initTableFilter() { +function initTableFilter(): void { for (const input of getElements('input.object-filter')) { // Find the first adjacent table element. const table = findFirstAdjacent(input, 'table'); @@ -101,7 +101,7 @@ function initTableFilter() { * Filter table rows by matched input text. * @param event */ - function handleInput(event: Event) { + function handleInput(event: Event): void { const target = event.target as HTMLInputElement; // Create a regex pattern from the input search text to match against. @@ -132,7 +132,7 @@ function initTableFilter() { } } -export function initSearch() { +export function initSearch(): void { for (const func of [initSearchBar, initTableFilter, initInterfaceFilter]) { func(); } diff --git a/netbox/project-static/src/select/api.ts b/netbox/project-static/src/select/api.ts index 0e6a189ff..61c40dd8c 100644 --- a/netbox/project-static/src/select/api.ts +++ b/netbox/project-static/src/select/api.ts @@ -711,7 +711,7 @@ class APISelect { * @param id DOM ID of the other element. */ private updatePathValues(id: string): void { - let key = id.replaceAll(/^id_/gi, ''); + const key = id.replaceAll(/^id_/gi, ''); const element = getElement(`id_${key}`); if (element !== null) { // If this element's URL contains Django template tags ({{), replace the template tag @@ -982,15 +982,16 @@ class APISelect { 'button', { type: 'button' }, ['btn', 'btn-sm', 'btn-ghost-dark'], - [createElement('i', {}, ['mdi', 'mdi-reload'])], + [createElement('i', null, ['mdi', 'mdi-reload'])], ); refreshButton.addEventListener('click', () => this.loadData()); + refreshButton.type = 'button'; this.slim.slim.search.container.appendChild(refreshButton); } } } -export function initApiSelect() { +export function initApiSelect(): void { for (const select of getElements('.netbox-api-select')) { new APISelect(select); } diff --git a/netbox/project-static/src/select/color.ts b/netbox/project-static/src/select/color.ts index 9a699c47b..e2c93c37c 100644 --- a/netbox/project-static/src/select/color.ts +++ b/netbox/project-static/src/select/color.ts @@ -11,6 +11,30 @@ function canChangeColor(option: Option | HTMLOptionElement): boolean { return typeof option.value === 'string' && option.value !== ''; } +/** + * Style the container element based on the selected option value. + */ +function styleContainer( + instance: InstanceType, + option: Option | HTMLOptionElement, +): void { + if (instance.slim.singleSelected !== null) { + if (canChangeColor(option)) { + // Get the background color from the selected option's value. + const bg = `#${option.value}`; + // Determine an accessible foreground color based on the background color. + const fg = readableColor(bg); + + // Set the container's style attributes. + instance.slim.singleSelected.container.style.backgroundColor = bg; + instance.slim.singleSelected.container.style.color = fg; + } else { + // If the color cannot be set (i.e., the placeholder), remove any inline styles. + instance.slim.singleSelected.container.removeAttribute('style'); + } + } +} + /** * Initialize color selection widget. Dynamically change the style of the select container to match * the selected option. @@ -40,7 +64,7 @@ export function initColorSelect(): void { // Style the select container to match any pre-selectd options. for (const option of instance.data.data) { if ('selected' in option && option.selected) { - styleContainer(option); + styleContainer(instance, option); break; } } @@ -50,25 +74,7 @@ export function initColorSelect(): void { instance.slim.container.classList.remove(className); } - function styleContainer(option: Option | HTMLOptionElement): void { - if (instance.slim.singleSelected !== null) { - if (canChangeColor(option)) { - // Get the background color from the selected option's value. - const bg = `#${option.value}`; - // Determine an accessible foreground color based on the background color. - const fg = readableColor(bg); - - // Set the container's style attributes. - instance.slim.singleSelected.container.style.backgroundColor = bg; - instance.slim.singleSelected.container.style.color = fg; - } else { - // If the color cannot be set (i.e., the placeholder), remove any inline styles. - instance.slim.singleSelected.container.removeAttribute('style'); - } - } - } - // Change the SlimSelect container's style based on the selected option. - instance.onChange = styleContainer; + instance.onChange = option => styleContainer(instance, option); } } diff --git a/netbox/project-static/src/select/index.ts b/netbox/project-static/src/select/index.ts index 480737b02..356c8004f 100644 --- a/netbox/project-static/src/select/index.ts +++ b/netbox/project-static/src/select/index.ts @@ -2,7 +2,7 @@ import { initApiSelect } from './api'; import { initColorSelect } from './color'; import { initStaticSelect } from './static'; -export function initSelect() { +export function initSelect(): void { for (const func of [initApiSelect, initColorSelect, initStaticSelect]) { func(); } diff --git a/netbox/project-static/src/select/static.ts b/netbox/project-static/src/select/static.ts index 3bbc83647..550e5ba7d 100644 --- a/netbox/project-static/src/select/static.ts +++ b/netbox/project-static/src/select/static.ts @@ -1,7 +1,7 @@ import SlimSelect from 'slim-select'; import { getElements } from '../util'; -export function initStaticSelect() { +export function initStaticSelect(): void { for (const select of getElements('.netbox-static-select')) { if (select !== null) { const label = document.querySelector(`label[for=${select.id}]`) as HTMLLabelElement; diff --git a/netbox/project-static/src/sidenav.ts b/netbox/project-static/src/sidenav.ts index 964b73c95..34c897044 100644 --- a/netbox/project-static/src/sidenav.ts +++ b/netbox/project-static/src/sidenav.ts @@ -237,7 +237,7 @@ class SideNav { '.navbar-nav .nav .nav-item a.nav-link', )) { const href = new RegExp(link.href, 'gi'); - if (Boolean(window.location.href.match(href))) { + if (window.location.href.match(href)) { yield link; } } @@ -310,7 +310,7 @@ class SideNav { } } -export function initSideNav() { +export function initSideNav(): void { for (const sidenav of getElements('.sidenav')) { new SideNav(sidenav); } diff --git a/netbox/project-static/src/tableConfig.ts b/netbox/project-static/src/tableConfig.ts index 0eb6479ae..ff12e8d68 100644 --- a/netbox/project-static/src/tableConfig.ts +++ b/netbox/project-static/src/tableConfig.ts @@ -5,7 +5,7 @@ import { getElements, apiPatch, hasError, getSelectedOptions } from './util'; * Mark each option element in the selected columns element as 'selected' so they are submitted to * the API. */ -function saveTableConfig() { +function saveTableConfig(): void { for (const element of getElements('select[name="columns"] option')) { element.selected = true; } @@ -14,7 +14,7 @@ function saveTableConfig() { /** * Delete all selected columns, which reverts the user's preferences to the default column set. */ -function resetTableConfig() { +function resetTableConfig(): void { for (const element of getElements('select[name="columns"]')) { element.value = ''; } @@ -23,7 +23,7 @@ function resetTableConfig() { /** * Add columns to the table config select element. */ -function addColumns(event: Event) { +function addColumns(event: Event): void { for (const selectedOption of getElements('#id_available_columns > option')) { if (selectedOption.selected) { for (const selected of getElements('#id_columns')) { @@ -38,7 +38,7 @@ function addColumns(event: Event) { /** * Remove columns from the table config select element. */ -function removeColumns(event: Event) { +function removeColumns(event: Event): void { for (const selectedOption of getElements('#id_columns > option')) { if (selectedOption.selected) { for (const available of getElements('#id_available_columns')) { @@ -53,7 +53,7 @@ function removeColumns(event: Event) { /** * Submit form configuration to the NetBox API. */ -async function submitFormConfig(formConfig: Dict) { +async function submitFormConfig(formConfig: Dict): Promise> { return await apiPatch('/api/users/config/', formConfig); } @@ -61,7 +61,7 @@ async function submitFormConfig(formConfig: Dict) { * Handle table config form submission. Sends the selected columns to the NetBox API to update * the user's table configuration preferences. */ -function handleSubmit(event: Event) { +function handleSubmit(event: Event): void { event.preventDefault(); const element = event.currentTarget as HTMLFormElement; @@ -96,7 +96,7 @@ function handleSubmit(event: Event) { /** * Initialize table configuration elements. */ -export function initTableConfig() { +export function initTableConfig(): void { for (const element of getElements('#save_tableconfig')) { element.addEventListener('click', saveTableConfig); } diff --git a/netbox/project-static/src/tables/interfaceTable.ts b/netbox/project-static/src/tables/interfaceTable.ts index 7fa144adc..0f7f985aa 100644 --- a/netbox/project-static/src/tables/interfaceTable.ts +++ b/netbox/project-static/src/tables/interfaceTable.ts @@ -164,18 +164,14 @@ class TableState { private table: HTMLTableElement; /** * Instance of ButtonState for the 'show/hide enabled rows' button. - * - * TS Error is expected because null handling is performed in the constructor. */ - // @ts-expect-error + // @ts-expect-error null handling is performed in the constructor private enabledButton: ButtonState; /** * Instance of ButtonState for the 'show/hide disabled rows' button. - * - * TS Error is expected because null handling is performed in the constructor. */ - // @ts-expect-error + // @ts-expect-error null handling is performed in the constructor private disabledButton: ButtonState; /** @@ -288,7 +284,7 @@ class TableState { /** * Initialize table states. */ -export function initInterfaceTable() { +export function initInterfaceTable(): void { for (const element of getElements('table')) { new TableState(element); } diff --git a/netbox/project-static/src/util.ts b/netbox/project-static/src/util.ts index 5c9110091..3f399b1c2 100644 --- a/netbox/project-static/src/util.ts +++ b/netbox/project-static/src/util.ts @@ -1,19 +1,18 @@ import Cookie from 'cookie'; -type APIRes = T | ErrorBase | APIError; type Method = 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE'; type ReqData = URLSearchParams | Dict | undefined | unknown; type SelectedOption = { name: string; options: string[] }; -type HTMLElementProperties = - | { - [k in keyof E]: E[k]; - } - | {}; - -type InferredProps = HTMLElementProperties< - HTMLElementTagNameMap[T] ->; +/** + * Infer valid HTMLElement props based on element name. + */ +type InferredProps< + // Element name. + T extends keyof HTMLElementTagNameMap, + // Element type. + E extends HTMLElementTagNameMap[T] = HTMLElementTagNameMap[T] +> = Partial>; export function isApiError(data: Record): data is APIError { return 'error' in data && 'exception' in data; @@ -36,9 +35,9 @@ export function hasMore(data: APIAnswer): data is APIAnswerWithNe */ export function slugify(slug: string, chars: number): string { return slug - .replace(/[^\-\.\w\s]/g, '') // Remove unneeded chars - .replace(/^[\s\.]+|[\s\.]+$/g, '') // Trim leading/trailing spaces - .replace(/[\-\.\s]+/g, '-') // Convert spaces and decimals to hyphens + .replace(/[^\-.\w\s]/g, '') // Remove unneeded chars + .replace(/^[\s.]+|[\s.]+$/g, '') // Trim leading/trailing spaces + .replace(/[-.\s]+/g, '-') // Convert spaces and decimals to hyphens .toLowerCase() // Convert to lowercase .substring(0, chars); // Trim to first chars chars } @@ -82,7 +81,7 @@ export async function apiRequest( url: string, method: Method, data?: D, -): Promise> { +): Promise> { const token = getCsrfToken(); const headers = new Headers({ 'X-CSRFToken': token }); @@ -111,18 +110,18 @@ export async function apiRequest( export async function apiPatch( url: string, data: D, -): Promise> { +): Promise> { return await apiRequest(url, 'PATCH', data); } -export async function apiGetBase(url: string): Promise> { +export async function apiGetBase(url: string): Promise> { return await apiRequest(url, 'GET'); } export async function apiPostForm( url: string, data: D, -): Promise> { +): Promise> { const body = new URLSearchParams(); for (const [k, v] of Object.entries(data)) { body.append(k, String(v)); @@ -149,7 +148,7 @@ export function getElements( export function getElements(...key: string[]): Generator; export function* getElements( ...key: (string | keyof HTMLElementTagNameMap | keyof SVGElementTagNameMap)[] -) { +): Generator { for (const query of key) { for (const element of document.querySelectorAll(query)) { if (element !== null) { @@ -249,7 +248,7 @@ export function getNetboxData(key: string): string | null { /** * Toggle visibility of card loader. */ -export function toggleLoader(action: 'show' | 'hide') { +export function toggleLoader(action: 'show' | 'hide'): void { for (const element of getElements('div.card-overlay')) { if (action === 'show') { element.classList.remove('d-none'); @@ -316,25 +315,27 @@ export function findFirstAdjacent, + // Child element type. C extends HTMLElement = HTMLElement ->( - tag: T, - properties: InferredProps, - classes: string[], - children: C[] = [], -): HTMLElementTagNameMap[T] { +>(tag: T, properties: P | null, classes: string[], children: C[] = []): HTMLElementTagNameMap[T] { // Create the base element. const element = document.createElement(tag); - for (const k of Object.keys(properties)) { - // Add each property to the element. - const key = k as keyof HTMLElementProperties; - const value = properties[key]; - if (key in element) { - element[key] = value; + if (properties !== null) { + for (const k of Object.keys(properties)) { + // Add each property to the element. + const key = k as keyof InferredProps; + const value = properties[key] as NonNullable; + if (key in element) { + element[key] = value; + } } } + // Add each CSS class to the element's class list. element.classList.add(...classes); diff --git a/netbox/project-static/styles/overrides.scss b/netbox/project-static/styles/overrides.scss index 0e82e3f14..ae59f6d5c 100644 --- a/netbox/project-static/styles/overrides.scss +++ b/netbox/project-static/styles/overrides.scss @@ -37,4 +37,4 @@ a[type='button'] { .badge { font-size: $font-size-xs; -} \ No newline at end of file +}