From 11cce20a17575e1800f3c9eeb4b77d3201d466e0 Mon Sep 17 00:00:00 2001 From: <> Date: Thu, 28 Nov 2024 16:03:23 +0000 Subject: [PATCH] Deployed c3898d6 with MkDocs version: 1.3.0 --- .htaccess | 1 + .nojekyll | 0 404.html | 746 ++ FAQs/index.html | 755 ++ _static/custom_css.css | 202 + _static/favicon.png | Bin 0 -> 30860 bytes _static/logo-dark.svg | 3 + _static/logo-light.svg | 1 + _static/mathjax.js | 19 + advanced_usage/index.html | 873 +++ api/Analytical tools/index.html | 918 +++ api/Energy functions/index.html | 959 +++ api/Gradients/index.html | 1016 +++ api/Inference/index.html | 890 +++ api/Initialisation/index.html | 958 +++ api/Testing/index.html | 989 +++ api/Training/index.html | 985 +++ api/Updates/index.html | 908 +++ api/Utils/index.html | 1102 +++ assets/_mkdocstrings.css | 16 + assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.b1047164.min.js | 29 + assets/javascripts/bundle.b1047164.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.fcfe8b6d.min.js | 48 + .../workers/search.fcfe8b6d.min.js.map | 7 + assets/stylesheets/main.a57b2b03.min.css | 2 + assets/stylesheets/main.a57b2b03.min.css.map | 1 + assets/stylesheets/palette.3f5d1f46.min.css | 2 + .../stylesheets/palette.3f5d1f46.min.css.map | 1 + basic_usage/index.html | 905 +++ css/ansi-colours.css | 174 + css/jupyter-cells.css | 10 + css/pandas-dataframe.css | 36 + examples/discriminative_pc/index.html | 1213 +++ examples/hybrid_pc/index.html | 1187 +++ .../linear_net_theoretical_energy/index.html | 1245 +++ examples/supervised_generative_pc/index.html | 1260 ++++ .../unsupervised_generative_pc/index.html | 1262 ++++ index.html | 985 +++ objects.inv | Bin 0 -> 471 bytes requirements.txt | 16 + search/search_index.json | 1 + sitemap.xml | 93 + sitemap.xml.gz | Bin 0 -> 209 bytes 70 files changed, 27018 insertions(+) create mode 100644 .htaccess create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 FAQs/index.html create mode 100644 _static/custom_css.css create mode 100644 _static/favicon.png create mode 100644 _static/logo-dark.svg create mode 100644 _static/logo-light.svg create mode 100644 _static/mathjax.js create mode 100644 advanced_usage/index.html create mode 100644 api/Analytical tools/index.html create mode 100644 api/Energy functions/index.html create mode 100644 api/Gradients/index.html create mode 100644 api/Inference/index.html create mode 100644 api/Initialisation/index.html create mode 100644 api/Testing/index.html create mode 100644 api/Training/index.html create mode 100644 api/Updates/index.html create mode 100644 api/Utils/index.html create mode 100644 assets/_mkdocstrings.css create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.b1047164.min.js create mode 100644 assets/javascripts/bundle.b1047164.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.fcfe8b6d.min.js create mode 100644 assets/javascripts/workers/search.fcfe8b6d.min.js.map create mode 100644 assets/stylesheets/main.a57b2b03.min.css create mode 100644 assets/stylesheets/main.a57b2b03.min.css.map create mode 100644 assets/stylesheets/palette.3f5d1f46.min.css create mode 100644 assets/stylesheets/palette.3f5d1f46.min.css.map create mode 100644 basic_usage/index.html create mode 100644 css/ansi-colours.css create mode 100644 css/jupyter-cells.css create mode 100644 css/pandas-dataframe.css create mode 100644 examples/discriminative_pc/index.html create mode 100644 examples/hybrid_pc/index.html create mode 100644 examples/linear_net_theoretical_energy/index.html create mode 100644 examples/supervised_generative_pc/index.html create mode 100644 examples/unsupervised_generative_pc/index.html create mode 100644 index.html create mode 100644 objects.inv create mode 100644 requirements.txt create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..361ffed --- /dev/null +++ b/.htaccess @@ -0,0 +1 @@ +ErrorDocument 404 /jpc/404.html \ No newline at end of file diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..09c54d4 --- /dev/null +++ b/404.html @@ -0,0 +1,746 @@ + + + +
+ + + + + + + + + + + + + + + + +i*8=Y}jPF%IB&?m_q%Fg1YB-9Co#{QC$oBBGnxDT^59K${*seM!4X^0*_;Q-j}&u-qo?I?LUM!0+#by=&xZF&8_Esg+`PJ2>tHL zFVd@4SFo @%WXD31JUl|HJateohAf8hHoDfD<^R!P=7Lhpn>%{}DKmu}g%htOq$4Ff%m;zdUR znAzLU0CqeV_3SPL_Yjg3VNF6;@LO6;&3Ym1ZfsXnAfjY@Df`RTdCb>@;DSqWT8 y>Th zzdF1Mv-mSMI`qx@kEK8KSWPwu9_3Jg6h&`7YoMst{k&0$yD3%E?gADOQ!fnoVj%A+ zcp!Ee05l71oHAgSP==9jdx^j`P$^mIlS3aXNMzg{WcgNKW>P-(Oav06cgORzA)= zkb7|D;|M$b){g?IK=YDegD=+Rk4qO~PYj5|A(zNi03r=>`-$%Qg83aEbkX)qc(_H7 z;&|neEVQ 8Z@h zzBnA5EH{-v`W5Og{EAE+Ai_^v(IIz6b$Txd5r?DMz9lvXAv2?zs@{}tJYA1G2EPvO z*R1D6`q_XX9=g3&lO~^?&Dd{UlLrsX8zo!iN$m|RgM&`z>LquaYA%M^==+5RbB;io zFu9y&^dqp<9=um>lzU}C8XyU+A?jlTW!wVV*D)=v#7CA(s$Q8k;JA7fbCf!Rf3&-O z>cDfw)HxF Tu`LdWE>)26KvUPJl;h< E zF;TD(*x}J>cuI+zjSBwguCA)(p$cxZ0-spe7fC&ZgQUrwzY2S>ski|_Jl%-UY7!pN zv7F!v5Ckdb4IzdjR0ZM>^c_J87L*{MP8le>f$G&+T%&QuA I*FHRWeD>pd{dQ|UmQ@E+Vi&&M f#X0Hb7Y+j`)-Oux;_@K;&ybbZ;q9Cc7X8fJ$P}R@SZ} zU!VYRKZjav%;s-2>2gpOWZ3#D&{Dwu$-Jj-c-zR}lVVCth*!24Y}dJpIgo73c`?|) z!6`>MfnAoK%)8qbQA6iSW|xwBFd(n5h}wN1m@bb-a~}hIpD>vm1ia^?sqqFI#h8&W zhHDRYsmTqoL)1hR+MSLOR3VX45-=oe6v~&CMGWE^f;f06|6He2-vIoPj9bVF16ssC z *q0XD>cOoV1>kbq>Avy8-1uutNC>eFign{lo`_J)Dp2<3d)GMOU zJzEmJmc97aLAOK~uI70#&94x{=@ *#2YPv_9lu#>` zlyxL`gGdEHDi%rBE-RmYMK$XH9=`WX_3J!46xc^(Ny%U ZVgF3cK&!!MA$6gxGUeFPSXJt3dUifAyfnl;a z)1&tq;}I$4iy+Tc28!IYp)8r&UmaDn3f~Paz5W8-B_rwHt>ZH>!3l EN23O@>EwoG^+HDY0i85Zpx&zj;%&Oa&W{T&claXXf`c^t71?FNbyKn@ z-e4mHMxeAyB|0y5+I=w!yQ{1|Zrr`4Wb{K@t}oW(4f)~htE}4!x`t2F;$qGRuw>7O zCZ34UZKBl=`(CnEi^TI!#XJ(l5dP+t!LY1UMGwHBGkgL86hZzF2OouD(W#kU4~8qZ zHC+gJ^BlM_Q+(<_#f$!oiW}!~@_$RG %UhmjKVVKs-8mcZHvC{hED 0qC {zVmm)A{j>5jG* zG@Ad) 1pkj6j~l{w+0{PHz9p z^;~G7y2-murvR0X8>{Q%4*8ND7m2NvU3%A(3$wYn4&usB#Ha5X4gWpbH4Wj|P>z$# z^Y^;C(F 9*xv8h3D}-w|_JTUeM+%Mfifxju`P%w6Lc z!E%=yg)?H@CI524!Rb IWr}~68M|dMqF=&s zaDspu8L6sU+D>3Gk32U?@~>Y)s!z2b1__C!XI!*?h>u`^|0daQ=&tL&_5)~D{_`5= z{Et99!T<$$tdwTR(?;p^=N}NB+P{~l!A%R3y^JhZB~IqWx4-;oR${VEdN>cj<9ViD z5kC70c8~W`2{v%sdW(P&dVobZtib7%20PE~JJrtRH5KnSGRWmx?T451PebOoex$Hz zlTfYie~&{0o6u%US(V!itTRODVdW(5H}9+V#m)f3C1FpaRVe^W sFj+*t!5=X!JMC*bC$+Q>M!y8jwu`=kBVioPj&|&!;_0;Z$w7dO=WL2|0 z6g%7oV2ci+jRVpI!z#blGNH5w8cj?Y1qc|E<9_HhKrG#^Y`(=j922GF)72c#Gr;s6 zwmskPu@HY>H6}l}xAgak&XyB}e>ql33DsS52e3uzAP+J4J)P%O<95$?iW#r>Vgh5s zUcD{5FvDnTgez$11*~RNxGjzh-l3pbD(7K0HFE6NI}G(}4}Ka`P(dg*!tLArDpz%e zka;*dsz)E}tv5-8`o_zJ_;#ZnjUI<8WhMsOHnMJ2qViHDt0L>A7;2ewB}IWfMfZSN zJ-CY^SxHHynd$Bf8 %aESfMk(W(XRT2{}HB z(#aL-5Y`Ht9|s~wQ;TWc4B6|QmE9)+x!YCKC(I|${%Foy9wbJ|pn?r Fme!p*nT>)%~=4pa@EXzL^Su;ck7JBNBU%LF8b`jgE_fheAWGowm!As zchVyBcqYSPvfDlgn9SRIoHPWW`vNe>6EPkBu&{F8cMt0mXim?!B&ughf{!h1?b;0T zQ4$p@vl;J2^LxuJeE^}AbncETR1PKRu>fr1!t+3HFd;0E|7-!~KhZ*U-PbX(QK_)n zk(h7QOmM-RC>Or^t^3V2cFS)TWos5QvHta+IzaLZ2k0>cy5(4sD%$zukK%wz3P3;+ zb%=R5D)OW7bw=VBzqnTSf3FFo%=*8T|C0y5Q@{bRrA1iSD5H4|@u-0mt7Tjq(UZN3 zZ^p{u***Z$wwP(^=7M;R{6>6#o(+TtZA*YY>-nK?uHC`FQ8i{9Ci&%^k8*#zdEQTf ztv}}J03LoIdlYLeyzrENe~Jx365Tb;_1X0oWHS!>>NqtxA7sKv*UfY74oFMX*^jsK zFm>{fh+GTpT%(m34jw3luSed_I^)!7=Se{K*Razs>5AdVTF52_8icwD8fN?(k^1*} zl8%s(H}V}b^F6)aPf*&dtfM?- B#0Joy(||6lP h*ZY0G!YEopIq8;C}#Y6Z}ZugEc!qAJTb|6BV6k z+q@aY0yR8YUp9IUfU{hM=S33Zq(A_G7Fm9F@N+Ro6-O(ToQqn^f=bq1jN7Ynx0F#- zNIKMl^@`ElMi=#q{FZ%pL}jIc_=x$hZ=@U~)Wf)4AmnSt_&^+g9EH^ra(b71e2S4I z?x_?VYMy)=`w#)3AZ7#ZhQpJJ>C8BjcIU4@U56wSb9|gLJNr4IWUGF)I93NKpu`nq zV0a%{!#gms^R$dHz`S)6poY!9e=m;rmF0DJdDCUKrA}+zPoO5#t`y*PUC=5De5=)- zH7#Du8fYXQ%+4f?8H`734c!VVY>#xFW?QCSkJ1#FsW82~<+l|C{q|AdOmaQnE}M Wi*^_nQm6ILn|>27xX*qm52;A%{EXQy8mqk{ONQqy7uuESL9gD?4qxzHe?B{ zKBRHYZw8MUcA+W%dMYk7FPeQ7`So#tfULa%D-=x^bRY@OaJCyHtu%Z}(z+IM4{O)? z@x}d&!r(lc?j5mF{kR>%k>uYq@xqGHNY5;c`r|dO4p#12-n&-qGuBcpHy()9KBt8g zLCV#;Mx4@5dzTD&Q%tzRyCgusxxJ JHA|%a4uIdlD)bR4Jngq}6GCAkfI#kX>(BTr_{+**S zf^N0N=t(0jFPTqcV`X=yz3Gxu_GFl;v}7xK7~x*h;Io+NbBoQ1V+WKTjUebS0V95) zYN6Fc-Sh(`$!vZ2h*E0@|F}s?gyW-rXU%sqov;t2>8>#ka5BQe+r&YyFqo72Bw}pZ zdB2RO`iC>i>#q}QKK}fUbatytmKcg}SVfV43MZRhindFnf#(SjA$Xh!?To{he!;XQ zfo^XNA-(5i+pe9K=8B32LyG)f?f+tlQrm7W5Ul@P?$!vtuz9(*;${9k?fD&aTM~}@ zsP@+GDi@dWby-AH;Cc &9+3@ms}v&u?Nk|E@LBvUL+`sL3bECV3v>yF=o zB?}VW1RNN|%VZ#4TI`Qyj(D`%Ve{Jy530t3VwM79u~GRpPwJH@aUW^5cj~H_kS3V; ze~_eSTgBRWw=(l-DKSFSu(oVQ%3yD1<}8XdUfD_dH-tZ=tah7FEiH!c0BXhk_EMZZ ztqc!9&q|&=hz-ajq{l7$!!%ibwTpJ;ZEyT)jaTfX-~%D64cNNy=k Q)ICI+{1!?K#momx1tbWWP^QH-gaxt^ zf%|4W`HO+97QUj2G9A$ApFh~&ZBA}mBZSOIM|wdVi&w-tpn+c1#jI?hB`87^vo0`# zRvq`;9Tbi*ti9Z_lL87lwvxBvE~XO$CW)bs+g1!l*5z2BI5)~T`w~I`l>kT5dTB@C zywQ4IqcCJ(hai+)3m@S5MFFjJ@fZbL&s(zpCMYswLespZsqFh?;jJ{w?CHxLSy>!0 zW1)PHXEZP*7~O^h2EhmQ^aJsg5*6 {w`vP8g@fGgbo5(@Ok3xK6eGo(REPWYq!@zU7eU*dr9#0k$Xjue>xOlmqQ z>;FBRoDKNFd^Y5H0UC!!O?9N$ffATB4sbafW-T!AUk+H{bM4TvzQSpVX*O=)U;{~x zNAh4z;!pepEM1G=MWDDa9KeFW07W6d$pp!1shykXt_i(84Zp5?aQO7V8%E9poVYw2 zntta!PTydR_t!gkYAX@WbZ7sG6a@ndf$YxV{0K1HSFiOy(jopcPF# Kn(OKpn`CA*Qn*~f9p|*JtQeiif!c8^x*}>Ej)wLk~*Vt4*IFj<0I+EE9(^R zcC3TK&F9i*@7#)tkXz?a$iVqBv)Yg4T2^1EJR7D4MV^ &F4IPOBsZ^wb0Huhfonv&T=z0-f|ILUlrQh>hUkb9JH;EcND#C@l_p60lW tX0o57b=G|<^0@)$@Qc!yw55FjUy-JGz;!6(Hzq>m<3iQ-_fl8 zZUhdy6Ut3o+@GwNF2tPNfP3Ep98Senu~M0zKMv?mC@-`-Fp=ZFSVWtD#<#uyfjxi9 z4j{*Q+{GRa$^U<58h6{Ryjt+%nXu9hNlM7Ep0ZNxIjqA`mT(3zxcKOznPEWo<46IO zHuIE;WHKBS2w`s4JsJv%ct! !F1r(>nDxz2MIOav!m{Gc_@f|j5nuLeV z?#m%4W;x)d1cbyhByn)v7;&26cu}}bRA~*IEa^1~6@jz=|2VQxWSCv2M7sbF$hHEF z>pj#hA6iEV2$liH@IL(>YjB&Ntx?S4KL#Df5O+D8t$UdCk;R(VWy>=tW)*M*d)=o| z)C&hN0H4g^R0H6X7oZ4R3G+2^q1d_1`4w)$kq^KwXGJaRR>h1I*IU8vg>wR=Rslz< zaUH<%Kc5<;d; (K?b7BKn}*ww6w-MGTfpYS*JMKQs7; zrgp1-!-s5NJx44r@KWsoi~cJ1-Vg%B1-7aM&q} Ry5M{}av8C3jwgW>liNv2{P4 zNhwAg4FP2PhhJ)T X{|9Z8$rc@4ThVh?5wjbO& zZCu*-#i$6R`F^`_%7`$q0dMC7lSz3i2w9awCN&b1SwUmmMuQ5JxCju9&CtMveMLsD zCj-Z1pM;41e?nJ;I ``* z(DwQGUuawsd){h%U6SY6STTu9DuBPiaxeqmMwhEFG~E5>;17zZaJ16igFc^We989^ zH)J4TDMQ;z(Jk%l^WIY3u8?z8AZexT`sP&qKX!BH-r|IS)+(AaZ5Pj ;C?xz{qE`WF)U9sXLZToSxJ479V|Ls6?Aj5*7kc4(LK&Ri@blti; z=`?ZR+~L3Hys}|-@$d-12aIor%U4EOUv!P!RCc^|DlX#Av-zaI_;Aq vT1scoJw1Vb;EV zDTO67_Hc32O4Td{YQJr-5&!)%qY E9>@|JuOhG9!yQ2&Q||hkLYwAonZJ|%cFaKv$_hMe z_;L|g{#D0-dVg;4{47VF-$_cD$71~XhV?BASt$GgE)a%V2Wt-0Un!&N`Ii}CIl$Kj zE#6rg2oYlDs}IXBPlmG*H!i9l_5gYL;?>TO7uFu1#=9~xQp|wc$Uyy%>^lpX(ji!= zgasr4g@nhA-!qN}2*xKZ51Z8)uSV29J(a*vu`mDyzs8uKk5pYuxw>eaJfEV BsG#jRgz>WCLWe zL*i!r#6SWt5KyWFy^nu~Zo>ih4R@t{_aem?;`pn|ig^oYHd0`IJ(9m8cpGWr!E3^y zESlwY0_#fg=r+0>&O%Qn97bMNkSF*t9v7pw3IcQmZFqdy{>Z!V>#S42-e`l1`QjJt zrkf2Rx(>bDFfhjkK`K#wuZZQBD@((8rM(^5k=%cAE}uB)I4bHjh!Y9+V0M0UIv{y7 z3Kz`2>6?4bEitZSJq1WZ?vS2yb+}u{^K;P0Qv-+RzkFKH26Tr0t>8aPouBP!cu+rw zCuAxM{&y?27%*T6hi- +J8m{VogxZzM&n*XIX-6l3651byJ{ z-(HqR3FI;lj9lb4teOj(g$6A^_}pruiRA?5Qk}`5XfWVfl}O};!`n2#N-Db)q8`+` zmjB5adRTPc3S5C>fhgmEE%zNN=MD%UmyD02W_Vvn9`qP^vf&*X 7%v zVIc8b-3|p{iJgJKNhEr?F{m6a(Ce~{Y-zr()x7c)e6JROv+zIu%(dqNGSAT}&>$JW z5=q|0(ohCL$erQN)Nji~S;~c-I6+!!S;NE>GEed%P%m(R`Qx?yE >0th wa|+xv@R(*rGkPv7-x>=Pi)MYl16uLGQ4CGWWVLXkMYKV^9h KRJrVncmD_1uATz` literal 0 HcmV?d00001 diff --git a/_static/logo-dark.svg b/_static/logo-dark.svg new file mode 100644 index 0000000..bac9351 --- /dev/null +++ b/_static/logo-dark.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/_static/logo-light.svg b/_static/logo-light.svg new file mode 100644 index 0000000..6c9241d --- /dev/null +++ b/_static/logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/mathjax.js b/_static/mathjax.js new file mode 100644 index 0000000..0b00d2f --- /dev/null +++ b/_static/mathjax.js @@ -0,0 +1,19 @@ +window.MathJax = { + tex: { + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } +}; + +document$.subscribe(() => { + MathJax.startup.output.clearCache() + MathJax.typesetClear() + MathJax.texReset() + MathJax.typesetPromise() +}) \ No newline at end of file diff --git a/advanced_usage/index.html b/advanced_usage/index.html new file mode 100644 index 0000000..71729d6 --- /dev/null +++ b/advanced_usage/index.html @@ -0,0 +1,873 @@ + + + + + + + + + + + + + + + + + + + + + Advanced usage - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Advanced usage + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Advanced usage¤
+Advanced users can access all the underlying functions of
jpc.make_pc_step
as +well as additional features. A custom PC training step looks like the following: ++which can be embedded in a jitted function with any other additional +computations. One can also use any optax + optimiser to +equilibrate the inference dynamics by replacing the function in step 2, as +shown below. +import jpc + +# 1. initialise activities with a feedforward pass +activities = jpc.init_activities_with_ffwd(model=model, input=x) + +# 2. run inference to equilibrium +equilibrated_activities = jpc.solve_inference( + params=(model, None), + activities=activities, + output=y, + input=x +) + +# 3. update parameters at the activities' solution with PC +param_update_result = jpc.update_params( + params=(model, None), + activities=equilibrated_activities, + optim=param_optim, + opt_state=param_opt_state, + output=y, + input=x +) + +# updated model and optimiser +model = param_update_result["model"] +param_optim = param_update_result["optim"] +param_opt_state = param_update_result["opt_state"] +
+See the updates docs + for more details. JPC also +comes with some analytical tools that can be used to study and potentially +diagnose issues with PCNs +(see docs + +and example notebook +). + + + + + + + +activity_optim = optax.sgd(1e-3) + +# 1. initialise activities +... + +# 2. infer with gradient descent +activity_opt_state = activity_optim.init(activities) + +for t in range(T): + activity_update_result = jpc.update_activities( + params=(model, None), + activities=activities, + optim=activity_optim, + opt_state=activity_opt_state, + output=y, + input=x + ) + # updated activities and optimiser + activities = activity_update_result["activities"] + activity_optim = activity_update_result["optim"] + activity_opt_state = activity_update_result["opt_state"] + +# 3. update parameters at the activities' solution with PC +... +
+ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Analytical tools/index.html b/api/Analytical tools/index.html new file mode 100644 index 0000000..c24334c --- /dev/null +++ b/api/Analytical tools/index.html @@ -0,0 +1,918 @@ + + + + + + + + + + + + + + + + + + + + +Analytical tools - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Analytical tools + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Analytical tools¤
+ + ++ + + ++ ++
+ +jpc.linear_equilib_energy(network: PyTree[equinox.nn._linear.Linear], x: ArrayLike, y: ArrayLike) -> Array
+ + +¤+ ++ +Computes the theoretical equilibrated PC energy for a deep linear network (DLN).
+\[ +\mathcal{F}^* = 1/N \sum_i^N (\mathbf{y}_i - W_{L:1}\mathbf{x}_i)^T S^{-1}(\mathbf{y}_i - W_{L:1}\mathbf{x}_i) +\]+where the rescaling is \(S = I_{d_y} + \sum_{\ell=2}^L (W_{L:\ell})(W_{L:\ell})^T\), +and we use the shorthand \(W_{k:\ell} = W_k \dots W_\ell\) for \(\ell, k \in 1,\dots, L\). +See the reference below for more details.
+++Note
+This expression assumes no biases.
+++Reference
++@article{innocenti2024only, + title={Only Strict Saddles in the Energy Landscape of Predictive Coding Networks?}, + author={Innocenti, Francesco and Achour, El Mehdi and Singh, Ryan and Buckley, Christopher L}, + journal={arXiv preprint arXiv:2408.11979}, + year={2024} +} +
Main arguments:
++
+- +
network
: Linear network defined as a list of Equinox Linear layers.- +
x
: Network input.- +
y
: Network output.Returns:
+Mean total analytical energy over a batch or dataset.
+ +
+ + ++ + + ++ + + + + + + ++
+ +jpc.linear_activities_solution(network: PyTree[equinox.nn._linear.Linear], x: ArrayLike, y: ArrayLike) -> PyTree[Array]
+ + +¤+ ++ +Computes the theoretical solution for the PC activities of a deep linear network (DLN).
+\[ +\mathbf{z}^* = A^{-1} \mathbf{b} +\]+where \(A\) is a sparse block diagonal matrix depending only on the weights, +and \(\mathbf{b} = [W_1 \mathbf{x}, \mathbf{0}, \dots, W_L^T \mathbf{y}]^T\). +In particular, \(A_{\ell,k} = I + W_\ell^T W_\ell\) if \(\ell = k\), +\(A_{\ell,k} = -W_\ell\) if \(\ell = k+1\), +\(A_{\ell,k} = -W_\ell^T\) if \(\ell = k-1\), and \(\mathbf{0}\) otherwise, +for \(\ell, k \in [2, \dots, L]\).
+++Note
+This expression assumes no biases.
+Main arguments:
++
+- +
network
: Linear network defined as a list of Equinox Linear layers.- +
x
: Network input.- +
y
: Network output.Returns:
+List of theoretical activities for each layer.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Energy functions/index.html b/api/Energy functions/index.html new file mode 100644 index 0000000..8fc0f77 --- /dev/null +++ b/api/Energy functions/index.html @@ -0,0 +1,959 @@ + + + + + + + + + + + + + + + + + + + + +Energy functions - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Energy functions + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Energy functions¤
+ + ++ + + ++ ++
+ +jpc.pc_energy_fn(params: Tuple[PyTree[Callable], Optional[PyTree[Callable]]], activities: PyTree[ArrayLike], y: ArrayLike, x: Optional[ArrayLike] = None, loss: str = 'MSE', record_layers: bool = False) -> Array | Array
+ + +¤+ ++ +Computes the free energy for a feedforward neural network of the form
+\[ +\mathcal{F}(\mathbf{z}; θ) = 1/N \sum_i^N \sum_{\ell=1}^L || \mathbf{z}_{i, \ell} - f_\ell(\mathbf{z}_{i, \ell-1}; θ) ||^2 +\]+given parameters \(θ\), free activities \(\mathbf{z}\), output +\(\mathbf{z}_L = \mathbf{y}\) and optional input \(\mathbf{z}_0 = \mathbf{x}\) +for supervised training. The activity of each layer \(\mathbf{z}_\ell\) is +some function of the previous layer, e.g. +ReLU\((W_\ell \mathbf{z}_{\ell-1} + \mathbf{b}_\ell)\) for a fully connected +layer with biases and ReLU as activation.
+++Note
+The input \(x\) and output \(y\) correspond to the prior and observation of +the generative model, respectively.
+Main arguments:
++
+- +
params
: Tuple with callable model (e.g. neural network) layers and + optional skip connections.- +
activities
: List of activities for each layer free to vary.- +
y
: Observation or target of the generative model.- +
x
: Optional prior of the generative model (for supervised training).Other arguments:
++
+- +
++
loss
: Loss function to use at the output layer (mean squared error + 'MSE' vs cross-entropy 'CE'). + ??? cite "Reference"+-@article{tscshantz2023hybrid, + title={Hybrid predictive coding: Inferring, fast and slow}, + author={Tscshantz, Alexander and Millidge, Beren and Seth, Anil K and Buckley, Christopher L}, + journal={PLoS Computational Biology}, + volume={19}, + number={8}, + pages={e1011280}, + year={2023}, + publisher={Public Library of Science San Francisco, CA USA} +} +
record_layers
: IfTrue
, returns energies for each layer. +Returns:
+The total or layer-wise energy normalised by the batch size.
+ +
+ + ++ + + ++ + + + + + + ++
+ +jpc.hpc_energy_fn(model: PyTree[typing.Callable], equilib_activities: PyTree[ArrayLike], amort_activities: PyTree[ArrayLike], x: ArrayLike, y: Optional[ArrayLike] = None, record_layers: bool = False) -> Array | Array
+ + +¤+ ++ +Computes the free energy of an amortised PC network
+\[ +\mathcal{F}(\mathbf{z}^*, \hat{\mathbf{z}}; θ) = 1/N \sum_i^N \sum_{\ell=1}^L || \mathbf{z}^*_{i, \ell} - f_\ell(\hat{\mathbf{z}}_{i, \ell-1}; θ) ||^2 +\]+given the equilibrated activities of the generator \(\mathbf{z}^*\) (target +for the amortiser), the feedforward guesses of the amortiser +\(\hat{\mathbf{z}}\), the amortiser's parameters \(θ\), input +\(\mathbf{z}_0 = \mathbf{x}\), and optional output +\(\mathbf{z}_L = \mathbf{y}\) for supervised training.
+++Note
+The input \(x\) and output \(y\) are reversed compared to
+pc_energy_fn
+(\(x\) is the generator's target and \(y\) is its optional input or prior). +Just think of \(x\) and \(y\) as the actual input and output of the +amortiser, respectively.Main arguments:
++
+- +
model
: List of callable model (e.g. neural network) layers.- +
equilib_activities
: List of equilibrated activities reached by the + generator and target for the amortiser.- +
amort_activities
: List of amortiser's feedforward guesses + (initialisation) for the network activities.- +
x
: Input to the amortiser.- +
y
: Optional target of the amortiser (for supervised training).Other arguments:
++
+- +
record_layers
: IfTrue
, returns energies for each layer.Returns:
+The total or layer-wise energy normalised by batch size.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Gradients/index.html b/api/Gradients/index.html new file mode 100644 index 0000000..3871686 --- /dev/null +++ b/api/Gradients/index.html @@ -0,0 +1,1016 @@ + + + + + + + + + + + + + + + + + + + + +Gradients - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Gradients + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Gradients¤
+++ + +Note
+There are two similar functions to compute the activity gradient: +
+jpc.neg_activity_grad
andjpc.compute_activity_grad
. The first is used +byjpc.solve_inference
as gradient flow, while the second is for +compatibility with discrete optax optimisers such as gradient descent.+ + + ++ ++
+ +jpc.neg_activity_grad(t: float | int, activities: PyTree[ArrayLike], args: Tuple[Tuple[PyTree[Callable], Optional[PyTree[Callable]]], ArrayLike, Optional[ArrayLike], str, diffrax._step_size_controller.base.AbstractStepSizeController]) -> PyTree[Array]
+ + +¤+ ++ +Computes the negative gradient of the energy with respect to the activities \(- \partial \mathcal{F} / \partial \mathbf{z}\).
+This defines an ODE system to be integrated by
+solve_pc_inference
.Main arguments:
++
+- +
t
: Time step of the ODE system, used for downstream integration by +diffrax.diffeqsolve
.- +
activities
: List of activities for each layer free to vary.- +
args
: 5-Tuple with + (i) Tuple with callable model layers and optional skip connections, + (ii) network output (observation), + (iii) network input (prior), + (iv) Loss specified at the output layer (MSE vs cross-entropy), and + (v) diffrax controller for step size integration.Returns:
+List of negative gradients of the energy w.r.t. the activities.
+ +
+ + ++ + + ++ ++
+ +jpc.compute_activity_grad(params: Tuple[PyTree[Callable], Optional[PyTree[Callable]]], activities: PyTree[ArrayLike], y: ArrayLike, x: Optional[ArrayLike], loss_id: str = 'MSE') -> PyTree[Array]
+ + +¤+ ++ +Computes the gradient of the energy with respect to the activities \(\partial \mathcal{F} / \partial \mathbf{z}\).
+++Note
+This function differs from
+neg_activity_grad
, which computes the +negative gradients, and is called inupdate_activities
for use of +any Optax optimiser.Main arguments:
++
+- +
params
: Tuple with callable model layers and optional skip connections.- +
activities
: List of activities for each layer free to vary.- +
y
: Observation or target of the generative model.- +
x
: Optional prior of the generative model.Other arguments:
++
+- +
loss_id
: Loss function for the output layer (mean squared error 'MSE' + vs cross-entropy 'CE').- +
energy_fn
: Free energy to take the gradient of.Returns:
+List of negative gradients of the energy w.r.t. the activities.
+ +
+ + ++ + + ++ ++
+ +jpc.compute_pc_param_grads(params: Tuple[PyTree[Callable], Optional[PyTree[Callable]]], activities: PyTree[ArrayLike], y: ArrayLike, x: Optional[ArrayLike] = None, loss_id: str = 'MSE') -> Tuple[PyTree[Array], PyTree[Array]]
+ + +¤+ ++ +Computes the gradient of the PC energy with respect to model parameters \(\partial \mathcal{F} / \partial θ\).
+Main arguments:
++
+- +
params
: Tuple with callable model layers and optional skip connections.- +
activities
: List of activities for each layer free to vary.- +
y
: Observation or target of the generative model.- +
x
: Optional prior of the generative model.Other arguments:
++
+- +
loss_id
: Loss function for the output layer (mean squared error 'MSE' + vs cross-entropy 'CE').Returns:
+List of parameter gradients for each network layer.
+ +
+ + ++ + + ++ + + + + + + ++
+ +jpc.compute_hpc_param_grads(model: PyTree[typing.Callable], equilib_activities: PyTree[ArrayLike], amort_activities: PyTree[ArrayLike], x: ArrayLike, y: Optional[ArrayLike] = None) -> PyTree[Array]
+ + +¤+ ++ +Computes the gradient of the hybrid energy with respect to an amortiser's parameters \(\partial \mathcal{F} / \partial θ\).
+Main arguments:
++
+- +
model
: List of callable model (e.g. neural network) layers.- +
equilib_activities
: List of equilibrated activities reached by the + generator and target for the amortiser.- +
amort_activities
: List of amortiser's feedforward guesses + (initialisation) for the network activities.- +
x
: Input to the amortiser.- +
y
: Optional target of the amortiser (for supervised training).++Note
+The input \(x\) and output \(y\) are reversed compared to
+compute_pc_param_grads
+(\(x\) is the generator's target and \(y\) is its optional input or prior). +Just think of \(x\) and \(y\) as the actual input and output of the +amortiser, respectively.Returns:
+List of parameter gradients for each network layer.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Inference/index.html b/api/Inference/index.html new file mode 100644 index 0000000..273f438 --- /dev/null +++ b/api/Inference/index.html @@ -0,0 +1,890 @@ + + + + + + + + + + + + + + + + + + + + +Inference - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Inference + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Inference¤
+ + ++ + + ++ + + + + + + ++
+ +jpc.solve_inference(params: Tuple[PyTree[Callable], Optional[PyTree[Callable]]], activities: PyTree[ArrayLike], output: ArrayLike, input: Optional[ArrayLike] = None, loss_id: str = 'MSE', solver: AbstractSolver = Heun(scan_kind=None), max_t1: int = 20, dt: float | int = None, stepsize_controller: AbstractStepSizeController = PIDController(rtol=0.001,atol=0.001,pcoeff=0,icoeff=1,dcoeff=0,dtmin=None,dtmax=None,force_dtmin=True,step_ts=None,jump_ts=None,factormin=0.2,factormax=10.0,norm=<function rms_norm>,safety=0.9,error_order=None), record_iters: bool = False, record_every: int = None) -> PyTree[Array]
+ + +¤+ ++ +Solves the inference (activity) dynamics of a predictive coding network.
+This is a wrapper around
+diffrax.diffeqsolve
to integrate the gradient +ODE system_neg_activity_grad
defining the PC inference dynamics\[ +\partial \mathbf{z} / \partial t = - \partial \mathcal{F} / \partial \mathbf{z} +\]+where \(\mathcal{F}\) is the free energy, \(\mathbf{z}\) are the activities, +with \(\mathbf{z}_L\) clamped to some target and \(\mathbf{z}_0\) optionally +equal to some prior.
+Main arguments:
++
+- +
params
: Tuple with callable model layers and optional skip connections.- +
activities
: List of activities for each layer free to vary.- +
output
: Observation or target of the generative model.- +
input
: Optional prior of the generative model.Other arguments:
++
+- +
loss
: Loss function to use at the output layer (mean squared error + 'MSE' vs cross-entropy 'CE').- +
solver
: Diffrax (ODE) solver to be used. Default is Heun, a 2nd order + explicit Runge--Kutta method.- +
max_t1
: Maximum end of integration region (500 by default).- +
dt
: Integration step size. Defaults toNone
since the default +stepsize_controller
will automatically determine it.- +
stepsize_controller
: diffrax controller for step size integration. + Defaults toPIDController
. Note that the relative and absolute + tolerances of the controller will also determine the steady state to + terminate the solver.- +
record_iters
: IfTrue
, returns all integration steps.- +
record_every
: int determining the sampling frequency the integration + steps.Returns:
+List with solution of the activity dynamics for each layer.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Initialisation/index.html b/api/Initialisation/index.html new file mode 100644 index 0000000..b391fc7 --- /dev/null +++ b/api/Initialisation/index.html @@ -0,0 +1,958 @@ + + + + + + + + + + + + + + + + + + + + +Initialisation - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Initialisation + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Initialisation¤
+++ + +Info
+JPC provides 3 standard ways of initialising the activities: a feedforward +pass, randomly, or using an amortised network.
++ + + ++ ++
+ +jpc.init_activities_with_ffwd(model: PyTree[typing.Callable], input: ArrayLike, skip_model: Optional[PyTree[Callable]] = None) -> PyTree[Array]
+ + +¤+ ++ +Initialises layers' activity with a feedforward pass +\(\{ f_\ell(\mathbf{z}_{\ell-1}) \}_{\ell=1}^L\) where \(\mathbf{z}_0 = \mathbf{x}\) is +the input.
+Main arguments:
++
+- +
model
: List of callable model (e.g. neural network) layers.- +
input
: input to the model.Other arguments:
++
+- +
skip_model
: Optional skip connection model.Returns:
+List with activity values of each layer.
+ +
+ + ++ + + ++ ++
+ +jpc.init_activities_from_normal(key: PRNGKeyArray, layer_sizes: PyTree[int], mode: str, batch_size: int, sigma: Array = 0.05) -> PyTree[Array]
+ + +¤+ ++ +Initialises network activities from a zero-mean Gaussian \(\sim \mathcal{N}(0, \sigma^2)\).
+Main arguments:
++
+- +
key
:jax.random.PRNGKey
for sampling.- +
layer_sizes
: List with dimension of all layers (input, hidden and + output).- +
mode
: Ifsupervised
, all hidden layers are initialised. If +unsupervised
the input layer \(\mathbf{z}_0\) is also initialised.- +
batch_size
: Dimension of data batch.- +
sigma
: Standard deviation for Gaussian to sample activities from. + Defaults to 5e-2.Returns:
+List of randomly initialised activities for each layer.
+ +
+ + ++ + + ++ + + + + + + ++
+ +jpc.init_activities_with_amort(amortiser: PyTree[typing.Callable], generator: PyTree[typing.Callable], input: ArrayLike) -> PyTree[Array]
+ + +¤+ ++ +Initialises layers' activity with an amortised network +\(\{ f_{L-\ell+1}(\mathbf{z}_{L-\ell}) \}_{\ell=1}^L\) where \(\mathbf{z}_0 = \mathbf{y}\) is +the input or generator's target.
+++Note
+The output order is reversed for downstream use by the generator.
+Main arguments:
++
+- +
amortiser
: List of callable layers for model amortising the inference + of thegenerator
.- +
generator
: List of callable layers for the generative model.- +
input
: Input to the amortiser.Returns:
+List with amortised initialisation of each layer.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Testing/index.html b/api/Testing/index.html new file mode 100644 index 0000000..ae92ccf --- /dev/null +++ b/api/Testing/index.html @@ -0,0 +1,989 @@ + + + + + + + + + + + + + + + + + + + + +Testing - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Testing + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Testing¤
+ + ++ + + ++ ++
+ +jpc.test_discriminative_pc(model: PyTree[typing.Callable], output: ArrayLike, input: ArrayLike, loss: str = 'MSE', skip_model: Optional[PyTree[Callable]] = None) -> Tuple[Array, Array]
+ + +¤+ ++ +Computes test metrics for a discriminative predictive coding network.
+Main arguments:
++
+- +
model
: List of callable model (e.g. neural network) layers.- +
output
: Observation or target of the generative model.- +
input
: Optional prior of the generative model.Other arguments:
++
+- +
loss
: -loss
: Loss function to use at the output layer (mean + squared error 'MSE' vs cross-entropy 'CE').- +
skip_model
: Optional list of callable skip connection functions.Returns:
+Test loss and accuracy of output predictions.
+ +
+ + ++ + + ++ ++
+ +jpc.test_generative_pc(model: PyTree[typing.Callable], output: ArrayLike, input: ArrayLike, key: PRNGKeyArray, layer_sizes: PyTree[int], batch_size: int, sigma: Array = 0.05, ode_solver: AbstractSolver = Heun(scan_kind=None), max_t1: int = 500, dt: Array | int = None, stepsize_controller: AbstractStepSizeController = PIDController(rtol=0.001,atol=0.001,pcoeff=0,icoeff=1,dcoeff=0,dtmin=None,dtmax=None,force_dtmin=True,step_ts=None,jump_ts=None,factormin=0.2,factormax=10.0,norm=<function rms_norm>,safety=0.9,error_order=None), skip_model: Optional[PyTree[Callable]] = None) -> Tuple[Array, Array]
+ + +¤+ ++ +Computes test metrics for a generative predictive coding network.
+Gets output predictions (e.g. of an image given a label) with a feedforward +pass and calculates accuracy of inferred input (e.g. of a label given an +image).
+Main arguments:
++
+- +
model
: List of callable model (e.g. neural network) layers.- +
output
: Observation or target of the generative model.- +
input
: Optional prior of the generative model.- +
key
:jax.random.PRNGKey
for random initialisation of activities.- +
layer_sizes
: Dimension of all layers (input, hidden and output).- +
batch_size
: Dimension of data batch for activity initialisation.Other arguments:
++
+- +
sigma
: Standard deviation for Gaussian to sample activities from. + Defaults to 5e-2.- +
ode_solver
: Diffrax ODE solver to be used. Default is Heun, a 2nd order + explicit Runge--Kutta method.- +
max_t1
: Maximum end of integration region (500 by default).- +
dt
: Integration step size. Defaults to None since the default +stepsize_controller
will automatically determine it.- +
stepsize_controller
: diffrax controller for step size integration. + Defaults toPIDController
. Note that the relative and absolute + tolerances of the controller will also determine the steady state to + terminate the solver.Returns:
+Accuracy and output predictions.
+ +
+ + ++ + + ++ + + + + + + ++
+ +jpc.test_hpc(generator: PyTree[typing.Callable], amortiser: PyTree[typing.Callable], output: ArrayLike, input: ArrayLike, key: PRNGKeyArray, layer_sizes: PyTree[int], batch_size: int, sigma: Array = 0.05, ode_solver: AbstractSolver = Heun(scan_kind=None), max_t1: int = 500, dt: Array | int = None, stepsize_controller: AbstractStepSizeController = PIDController(rtol=0.001,atol=0.001,pcoeff=0,icoeff=1,dcoeff=0,dtmin=None,dtmax=None,force_dtmin=True,step_ts=None,jump_ts=None,factormin=0.2,factormax=10.0,norm=<function rms_norm>,safety=0.9,error_order=None)) -> Tuple[Array, Array, Array, Array]
+ + +¤+ ++ +Computes test metrics for hybrid predictive coding trained in a supervised manner.
+Calculates input accuracy of (i) amortiser, (ii) generator, and (iii) +hybrid (amortiser + generator). Also returns output predictions (e.g. of +an image given a label) with a feedforward pass of the generator.
+++Note
+The input and output of the generator are the output and input of the +amortiser, respectively.
+Main arguments:
++
+- +
generator
: List of callable layers for the generative model.- +
amortiser
: List of callable layers for model amortising the inference + of thegenerator
.- +
output
: Observation or target of the generative model.- +
input
: Optional prior of the generator, target for the amortiser.- +
key
:jax.random.PRNGKey
for random initialisation of activities.- +
layer_sizes
: Dimension of all layers (input, hidden and output).- +
batch_size
: Dimension of data batch for initialisation of activities.Other arguments:
++
+- +
sigma
: Standard deviation for Gaussian to sample activities from. + Defaults to 5e-2.- +
ode_solver
: Diffrax ODE solver to be used. Default is Heun, a 2nd order + explicit Runge--Kutta method.- +
max_t1
: Maximum end of integration region (500 by default).- +
dt
: Integration step size. Defaults to None since the default +stepsize_controller
will automatically determine it.- +
stepsize_controller
: diffrax controller for step size integration. + Defaults toPIDController
. Note that the relative and absolute + tolerances of the controller will also determine the steady state to + terminate the solver.Returns:
+Accuracies of all models and output predictions.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Training/index.html b/api/Training/index.html new file mode 100644 index 0000000..0083524 --- /dev/null +++ b/api/Training/index.html @@ -0,0 +1,985 @@ + + + + + + + + + + + + + + + + + + + + +Training - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Training + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Training¤
+ + ++ + + ++ ++
+ +jpc.make_pc_step(model: PyTree[typing.Callable], optim: optax._src.base.GradientTransformation | optax._src.base.GradientTransformationExtraArgs, opt_state: Union[jax.Array, numpy.ndarray, numpy.bool, numpy.number, Iterable[ArrayTree], Mapping[Any, ArrayTree]], output: ArrayLike, input: Optional[ArrayLike] = None, loss_id: str = 'MSE', ode_solver: AbstractSolver = Heun(scan_kind=None), max_t1: int = 20, dt: Array | int = None, stepsize_controller: AbstractStepSizeController = PIDController(rtol=0.001,atol=0.001,pcoeff=0,icoeff=1,dcoeff=0,dtmin=None,dtmax=None,force_dtmin=True,step_ts=None,jump_ts=None,factormin=0.2,factormax=10.0,norm=<function rms_norm>,safety=0.9,error_order=None), skip_model: Optional[PyTree[Callable]] = None, key: Optional[PRNGKeyArray] = None, layer_sizes: Optional[PyTree[int]] = None, batch_size: Optional[int] = None, sigma: Array = 0.05, record_activities: bool = False, record_energies: bool = False, record_every: int = None, activity_norms: bool = False, param_norms: bool = False, grad_norms: bool = False, calculate_accuracy: bool = False) -> Dict
+ + +¤+ ++ +Updates network parameters with predictive coding.
+Main arguments:
++
+- +
model
: List of callable model (e.g. neural network) layers.- +
optim
: Optax optimiser, e.g.optax.sgd()
.- +
opt_state
: State of Optax optimiser.- +
output
: Observation or target of the generative model.- +
input
: Optional prior of the generative model.++Note
++
key
,layer_sizes
andbatch_size
must be passed ifinput
is +None
, since unsupervised training will be assumed and activities need +to be initialised randomly.Other arguments:
++
+- +
loss_id
: Loss function for the output layer (mean squared error 'MSE' + vs cross-entropy 'CE').- +
ode_solver
: Diffrax ODE solver to be used. Default is Heun, a 2nd order + explicit Runge--Kutta method.- +
max_t1
: Maximum end of integration region (20 by default).- +
dt
: Integration step size. Defaults to None since the default +stepsize_controller
will automatically determine it.- +
stepsize_controller
: diffrax controller for step size integration. + Defaults toPIDController
. Note that the relative and absolute + tolerances of the controller will also determine the steady state to + terminate the solver.- +
skip_model
: Optional list of callable skip connection functions.- +
key
:jax.random.PRNGKey
for random initialisation of activities.- +
layer_sizes
: Dimension of all layers (input, hidden and output).- +
batch_size
: Dimension of data batch for activity initialisation.- +
sigma
: Standard deviation for Gaussian to sample activities from for + random initialisation. Defaults to 5e-2.- +
record_activities
: IfTrue
, returns activities at every inference + iteration.- +
record_energies
: IfTrue
, returns layer-wise energies at every + inference iteration.- +
record_every
: int determining the sampling frequency the integration + steps.- +
activity_norms
: IfTrue
, computes l2 norm of the activities.- +
param_norms
: IfTrue
, computes l2 norm of the parameters.- +
grad_norms
: IfTrue
, computes l2 norm of parameter gradients.- +
calculate_accuracy
: IfTrue
, computes the training accuracy.Returns:
+Dict including model (and optional skip model) with updated parameters, +optimiser, updated optimiser state, loss, energies, activities, +and optionally other metrics (see other args above).
+Raises:
++
+ +- +
ValueError
for inconsistent inputs and invalid losses.
+ + ++ + + ++ + + + + + + ++
+ +jpc.make_hpc_step(generator: PyTree[typing.Callable], amortiser: PyTree[typing.Callable], optims: Tuple[optax._src.base.GradientTransformationExtraArgs], opt_states: Tuple[Union[jax.Array, numpy.ndarray, numpy.bool, numpy.number, Iterable[ArrayTree], Mapping[Any, ArrayTree]]], output: ArrayLike, input: Optional[ArrayLike] = None, ode_solver: AbstractSolver = Heun(scan_kind=None), max_t1: int = 300, dt: Array | int = None, stepsize_controller: AbstractStepSizeController = PIDController(rtol=0.001,atol=0.001,pcoeff=0,icoeff=1,dcoeff=0,dtmin=None,dtmax=None,force_dtmin=True,step_ts=None,jump_ts=None,factormin=0.2,factormax=10.0,norm=<function rms_norm>,safety=0.9,error_order=None), record_activities: bool = False, record_energies: bool = False) -> Dict
+ + +¤+ ++ +Updates parameters of a hybrid predictive coding network.
+++Reference
++@article{tscshantz2023hybrid, + title={Hybrid predictive coding: Inferring, fast and slow}, + author={Tscshantz, Alexander and Millidge, Beren and Seth, Anil K and Buckley, Christopher L}, + journal={PLoS Computational Biology}, + volume={19}, + number={8}, + pages={e1011280}, + year={2023}, + publisher={Public Library of Science San Francisco, CA USA} +} +
++Note
+The input and output of the generator are the output and input of the +amortiser, respectively.
+Main arguments:
++
+- +
generator
: List of callable layers for the generative model.- +
amortiser
: List of callable layers for model amortising the inference + of thegenerator
.- +
optims
: Optax optimisers (e.g.optax.sgd()
), one for each model.- +
opt_states
: State of Optax optimisers, one for each model.- +
output
: Observation of the generator, input to the amortiser.- +
input
: Optional prior of the generator, target for the amortiser.Other arguments:
++
+- +
ode_solver
: Diffrax ODE solver to be used. Default is Heun, a 2nd order + explicit Runge--Kutta method..- +
max_t1
: Maximum end of integration region (300 by default).- +
dt
: Integration step size. Defaults to None since the default +stepsize_controller
will automatically determine it.- +
stepsize_controller
: diffrax controller for step size integration. + Defaults toPIDController
. Note that the relative and absolute + tolerances of the controller will also determine the steady state to + terminate the solver.- +
record_activities
: IfTrue
, returns activities at every inference + iteration.- +
record_energies
: IfTrue
, returns layer-wise energies at every + inference iteration.Returns:
+Dict including models with updated parameters, optimiser and state for each +model, model activities, last inference step for the generator, MSE losses, +and energies.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Updates/index.html b/api/Updates/index.html new file mode 100644 index 0000000..d8dc631 --- /dev/null +++ b/api/Updates/index.html @@ -0,0 +1,908 @@ + + + + + + + + + + + + + + + + + + + + +Updates - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Updates + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Updates¤
+ + ++ + + ++ ++
+ +jpc.update_activities(params: Tuple[PyTree[Callable], Optional[PyTree[Callable]]], activities: PyTree[ArrayLike], optim: optax._src.base.GradientTransformation | optax._src.base.GradientTransformationExtraArgs, opt_state: Union[jax.Array, numpy.ndarray, numpy.bool, numpy.number, Iterable[ArrayTree], Mapping[Any, ArrayTree]], output: ArrayLike, input: Optional[ArrayLike] = None) -> Dict
+ + +¤+ ++ +Updates activities of a predictive coding network with a given Optax optimiser.
+Main arguments:
++
+- +
params
: Tuple with callable model layers and optional skip connections.- +
activities
: List of activities for each layer free to vary.- +
optim
: Optax optimiser, e.g.optax.sgd()
.- +
opt_state
: State of Optax optimiser.- +
output
: Observation or target of the generative model.- +
input
: Optional prior of the generative model.Returns:
+Dictionary with energy, updated activities, activity gradients, optimiser, +and updated optimiser state.
+ +
+ + ++ + + ++ + + + + + + ++
+ +jpc.update_params(params: Tuple[PyTree[Callable], Optional[PyTree[Callable]]], activities: PyTree[ArrayLike], optim: optax._src.base.GradientTransformation | optax._src.base.GradientTransformationExtraArgs, opt_state: Union[jax.Array, numpy.ndarray, numpy.bool, numpy.number, Iterable[ArrayTree], Mapping[Any, ArrayTree]], output: ArrayLike, input: Optional[ArrayLike] = None) -> Dict
+ + +¤+ ++ +Updates parameters of a predictive coding network with a given Optax optimiser.
+Main arguments:
++
+- +
params
: Tuple with callable model layers and optional skip connections.- +
activities
: List of activities for each layer free to vary.- +
optim
: Optax optimiser, e.g.optax.sgd()
.- +
opt_state
: State of Optax optimiser.- +
output
: Observation or target of the generative model.- +
input
: Optional prior of the generative model.Returns:
+Dictionary with model (and optional skip model) with updated parameters, +parameter gradients, optimiser, and updated optimiser state.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/api/Utils/index.html b/api/Utils/index.html new file mode 100644 index 0000000..8b22bc0 --- /dev/null +++ b/api/Utils/index.html @@ -0,0 +1,1102 @@ + + + + + + + + + + + + + + + + + + + + +Utils - jpc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ + + + Skip to content + + +++ ++ + + ++ + ++ + + + + + + +++ + + + + + + ++++ + jpc + +++ + + Utils + + +++ ++ + ++ ++++++++ ++
+ + ++ ++ thebuckleylab/jpc ++ + + ++ + + + + + +++ + + + + ++ + + ++ + + + + ++++ + + + +Utils¤
+ + ++ + + ++ ++
+ +jpc.make_mlp(key: PRNGKeyArray, layer_sizes: PyTree[int], act_fn: str, use_bias: bool = True) -> PyTree[typing.Callable]
+ + +¤+ ++ +Creates a multi-layer perceptron compatible with predictive coding updates.
+Main arguments:
++
+- +
key
:jax.random.PRNGKey
for parameter initialisation.- +
layer_sizes
: Dimension of all layers (input, hidden and output). + Options arelinear
,tanh
andrelu
.- +
act_fn
: Activation function for all layers except the output.- +
use_bias
:True
by default.Returns:
+List of callable fully connected layers.
+ +
+ + ++ + + ++ ++
+ +jpc.get_act_fn(name: str) -> Callable
+ + +¤+ + ++ +
+ + ++ + + ++ ++
+ +jpc.mse_loss(preds: ArrayLike, labels: ArrayLike) -> Array
+ + +¤+ + ++ +
+ + ++ + + ++ ++
+ +jpc.cross_entropy_loss(logits: ArrayLike, labels: ArrayLike) -> Array
+ + +¤+ + ++ +
+ + ++ + + ++ ++
+ +jpc.compute_accuracy(truths: ArrayLike, preds: ArrayLike) -> Array
+ + +¤+ + ++ +
+ + ++ + + ++ ++
+ +jpc.get_t_max(activities_iters: PyTree[Array]) -> Array
+ + +¤+ + ++ +
+ + ++ + + ++ ++
+ +jpc.compute_infer_energies(params: Tuple[PyTree[Callable], Optional[PyTree[Callable]]], activities_iters: PyTree[Array], t_max: Array, y: ArrayLike, x: Optional[ArrayLike] = None, loss: str = 'MSE') -> PyTree[Array]
+ + +¤+ ++ +Calculates layer energies during predictive coding inference.
+Main arguments:
++
+- +
params
: Tuple with callable model layers and optional skip connections.- +
activities_iters
: Layer-wise activities at every inference iteration. + Note that each set of activities will have 4096 steps as first + dimension by diffrax default.- +
t_max
: Maximum number of inference iterations to compute energies for.- +
y
: Observation or target of the generative model.- +
x
: Optional prior of the generative model.Other arguments:
++
+- +
loss
: Loss function specified at the output layer (mean squared error + 'MSE' vs cross-entropy 'CE').Returns:
+List of layer-wise energies at every inference iteration.
+ +
+ + ++ + + ++ ++
+ +jpc.compute_activity_norms(activities: PyTree[Array]) -> Array
+ + +¤+ ++ +Calculates l2 norm of activities at each layer.
+ +
+ + ++ + + ++ + + + + + + ++
+ +jpc.compute_param_norms(params)
+ + +¤+ ++ +Calculates l2 norm of all model parameters.
+ ++ ++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css new file mode 100644 index 0000000..b2cceef --- /dev/null +++ b/assets/_mkdocstrings.css @@ -0,0 +1,16 @@ + +/* Don't capitalize names. */ +h5.doc-heading { + text-transform: none !important; +} + +/* Avoid breaking parameters name, etc. in table cells. */ +.doc-contents td code { + word-break: normal !important; +} + +/* For pieces of Markdown rendered in table cells. */ +.doc-contents td p { + margin-top: 0 !important; + margin-bottom: 0 !important; +} diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US 5Cx_Ju;6m !O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4 OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJ xrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ $9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P _W2 gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2 C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ +HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_ 9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+F kTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/assets/javascripts/bundle.b1047164.min.js b/assets/javascripts/bundle.b1047164.min.js new file mode 100644 index 0000000..ba97499 --- /dev/null +++ b/assets/javascripts/bundle.b1047164.min.js @@ -0,0 +1,29 @@ +(()=>{var ea=Object.create;var St=Object.defineProperty;var ta=Object.getOwnPropertyDescriptor;var ra=Object.getOwnPropertyNames,wt=Object.getOwnPropertySymbols,oa=Object.getPrototypeOf,sr=Object.prototype.hasOwnProperty,qr=Object.prototype.propertyIsEnumerable,ls=Reflect.get,ps=Reflect.set;var Qr=(e,t,r)=>t in e?St(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))sr.call(t,r)&&Qr(e,r,t[r]);if(wt)for(var r of wt(t))qr.call(t,r)&&Qr(e,r,t[r]);return e};var na=e=>St(e,"__esModule",{value:!0});var Kr=(e,t)=>{var r={};for(var o in e)sr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&wt)for(var o of wt(e))t.indexOf(o)<0&&qr.call(e,o)&&(r[o]=e[o]);return r};var Et=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ia=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ra(t))!sr.call(e,o)&&o!=="default"&&St(e,o,{get:()=>t[o],enumerable:!(r=ta(t,o))||r.enumerable});return e},Ke=e=>ia(na(St(e!=null?ea(oa(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var Jr=Et((cr,Br)=>{(function(e,t){typeof cr=="object"&&typeof Br!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(cr,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(E){return!!(E&&E!==document&&E.nodeName!=="HTML"&&E.nodeName!=="BODY"&&"classList"in E&&"contains"in E.classList)}function c(E){var We=E.type,Oe=E.tagName;return!!(Oe==="INPUT"&&a[We]&&!E.readOnly||Oe==="TEXTAREA"&&!E.readOnly||E.isContentEditable)}function l(E){E.classList.contains("focus-visible")||(E.classList.add("focus-visible"),E.setAttribute("data-focus-visible-added",""))}function p(E){!E.hasAttribute("data-focus-visible-added")||(E.classList.remove("focus-visible"),E.removeAttribute("data-focus-visible-added"))}function m(E){E.metaKey||E.altKey||E.ctrlKey||(s(r.activeElement)&&l(r.activeElement),o=!0)}function u(E){o=!1}function b(E){!s(E.target)||(o||c(E.target))&&l(E.target)}function v(E){!s(E.target)||(E.target.classList.contains("focus-visible")||E.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),p(E.target))}function d(E){document.visibilityState==="hidden"&&(n&&(o=!0),V())}function V(){document.addEventListener("mousemove",j),document.addEventListener("mousedown",j),document.addEventListener("mouseup",j),document.addEventListener("pointermove",j),document.addEventListener("pointerdown",j),document.addEventListener("pointerup",j),document.addEventListener("touchmove",j),document.addEventListener("touchstart",j),document.addEventListener("touchend",j)}function K(){document.removeEventListener("mousemove",j),document.removeEventListener("mousedown",j),document.removeEventListener("mouseup",j),document.removeEventListener("pointermove",j),document.removeEventListener("pointerdown",j),document.removeEventListener("pointerup",j),document.removeEventListener("touchmove",j),document.removeEventListener("touchstart",j),document.removeEventListener("touchend",j)}function j(E){E.target.nodeName&&E.target.nodeName.toLowerCase()==="html"||(o=!1,K())}document.addEventListener("keydown",m,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",d,!0),V(),r.addEventListener("focus",b,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var vo=Et((fs,_t)=>{/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */var Yr,Gr,Xr,Zr,eo,to,ro,oo,no,Tt,lr,io,ao,so,Be,co,lo,po,uo,fo,mo,ho,bo,Ot;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(o){e(r(t,r(o)))}):typeof _t=="object"&&typeof _t.exports=="object"?e(r(t,r(_t.exports))):e(r(t));function r(o,n){return o!==t&&(typeof Object.create=="function"?Object.defineProperty(o,"__esModule",{value:!0}):o.__esModule=!0),function(i,a){return o[i]=n?n(i,a):a}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(o,n){o.__proto__=n}||function(o,n){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(o[i]=n[i])};Yr=function(o,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(o,n);function i(){this.constructor=o}o.prototype=n===null?Object.create(n):(i.prototype=n.prototype,new i)},Gr=Object.assign||function(o){for(var n,i=1,a=arguments.length;i=0;p--)(l=o[p])&&(c=(s<3?l(c):s>3?l(n,i,c):l(n,i))||c);return s>3&&c&&Object.defineProperty(n,i,c),c},eo=function(o,n){return function(i,a){n(i,a,o)}},to=function(o,n){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,n)},ro=function(o,n,i,a){function s(c){return c instanceof i?c:new i(function(l){l(c)})}return new(i||(i=Promise))(function(c,l){function p(b){try{u(a.next(b))}catch(v){l(v)}}function m(b){try{u(a.throw(b))}catch(v){l(v)}}function u(b){b.done?c(b.value):s(b.value).then(p,m)}u((a=a.apply(o,n||[])).next())})},oo=function(o,n){var i={label:0,sent:function(){if(c[0]&1)throw c[1];return c[1]},trys:[],ops:[]},a,s,c,l;return l={next:p(0),throw:p(1),return:p(2)},typeof Symbol=="function"&&(l[Symbol.iterator]=function(){return this}),l;function p(u){return function(b){return m([u,b])}}function m(u){if(a)throw new TypeError("Generator is already executing.");for(;i;)try{if(a=1,s&&(c=u[0]&2?s.return:u[0]?s.throw||((c=s.return)&&c.call(s),0):s.next)&&!(c=c.call(s,u[1])).done)return c;switch(s=0,c&&(u=[u[0]&2,c.value]),u[0]){case 0:case 1:c=u;break;case 4:return i.label++,{value:u[1],done:!1};case 5:i.label++,s=u[1],u=[0];continue;case 7:u=i.ops.pop(),i.trys.pop();continue;default:if(c=i.trys,!(c=c.length>0&&c[c.length-1])&&(u[0]===6||u[0]===2)){i=0;continue}if(u[0]===3&&(!c||u[1]>c[0]&&u[1] =o.length&&(o=void 0),{value:o&&o[a++],done:!o}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")},lr=function(o,n){var i=typeof Symbol=="function"&&o[Symbol.iterator];if(!i)return o;var a=i.call(o),s,c=[],l;try{for(;(n===void 0||n-- >0)&&!(s=a.next()).done;)c.push(s.value)}catch(p){l={error:p}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(l)throw l.error}}return c},io=function(){for(var o=[],n=0;n 1||p(d,V)})})}function p(d,V){try{m(a[d](V))}catch(K){v(c[0][3],K)}}function m(d){d.value instanceof Be?Promise.resolve(d.value.v).then(u,b):v(c[0][2],d)}function u(d){p("next",d)}function b(d){p("throw",d)}function v(d,V){d(V),c.shift(),c.length&&p(c[0][0],c[0][1])}},lo=function(o){var n,i;return n={},a("next"),a("throw",function(s){throw s}),a("return"),n[Symbol.iterator]=function(){return this},n;function a(s,c){n[s]=o[s]?function(l){return(i=!i)?{value:Be(o[s](l)),done:s==="return"}:c?c(l):l}:c}},po=function(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=o[Symbol.asyncIterator],i;return n?n.call(o):(o=typeof Tt=="function"?Tt(o):o[Symbol.iterator](),i={},a("next"),a("throw"),a("return"),i[Symbol.asyncIterator]=function(){return this},i);function a(c){i[c]=o[c]&&function(l){return new Promise(function(p,m){l=o[c](l),s(p,m,l.done,l.value)})}}function s(c,l,p,m){Promise.resolve(m).then(function(u){c({value:u,done:p})},l)}},uo=function(o,n){return Object.defineProperty?Object.defineProperty(o,"raw",{value:n}):o.raw=n,o};var r=Object.create?function(o,n){Object.defineProperty(o,"default",{enumerable:!0,value:n})}:function(o,n){o.default=n};fo=function(o){if(o&&o.__esModule)return o;var n={};if(o!=null)for(var i in o)i!=="default"&&Object.prototype.hasOwnProperty.call(o,i)&&Ot(n,o,i);return r(n,o),n},mo=function(o){return o&&o.__esModule?o:{default:o}},ho=function(o,n){if(!n.has(o))throw new TypeError("attempted to get private field on non-instance");return n.get(o)},bo=function(o,n,i){if(!n.has(o))throw new TypeError("attempted to set private field on non-instance");return n.set(o,i),i},e("__extends",Yr),e("__assign",Gr),e("__rest",Xr),e("__decorate",Zr),e("__param",eo),e("__metadata",to),e("__awaiter",ro),e("__generator",oo),e("__exportStar",no),e("__createBinding",Ot),e("__values",Tt),e("__read",lr),e("__spread",io),e("__spreadArrays",ao),e("__spreadArray",so),e("__await",Be),e("__asyncGenerator",co),e("__asyncDelegator",lo),e("__asyncValues",po),e("__makeTemplateObject",uo),e("__importStar",fo),e("__importDefault",mo),e("__classPrivateFieldGet",ho),e("__classPrivateFieldSet",bo)})});var jr=Et((xt,Fr)=>{/*! + * clipboard.js v2.0.8 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof xt=="object"&&typeof Fr=="object"?Fr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof xt=="object"?xt.ClipboardJS=r():t.ClipboardJS=r()})(xt,function(){return function(){var e={134:function(o,n,i){"use strict";i.d(n,{default:function(){return Xi}});var a=i(279),s=i.n(a),c=i(370),l=i.n(c),p=i(817),m=i.n(p);function u(O){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?u=function(h){return typeof h}:u=function(h){return h&&typeof Symbol=="function"&&h.constructor===Symbol&&h!==Symbol.prototype?"symbol":typeof h},u(O)}function b(O,x){if(!(O instanceof x))throw new TypeError("Cannot call a class as a function")}function v(O,x){for(var h=0;h 0&&arguments[0]!==void 0?arguments[0]:{};this.action=h.action,this.container=h.container,this.emitter=h.emitter,this.target=h.target,this.text=h.text,this.trigger=h.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"createFakeElement",value:function(){var h=document.documentElement.getAttribute("dir")==="rtl";this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[h?"right":"left"]="-9999px";var A=window.pageYOffset||document.documentElement.scrollTop;return this.fakeElem.style.top="".concat(A,"px"),this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.fakeElem}},{key:"selectFake",value:function(){var h=this,A=this.createFakeElement();this.fakeHandlerCallback=function(){return h.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.container.appendChild(A),this.selectedText=m()(A),this.copyText(),this.removeFake()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=m()(this.target),this.copyText()}},{key:"copyText",value:function(){var h;try{h=document.execCommand(this.action)}catch(A){h=!1}this.handleResult(h)}},{key:"handleResult",value:function(h){this.emitter.emit(h?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var h=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"copy";if(this._action=h,this._action!=="copy"&&this._action!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(h){if(h!==void 0)if(h&&u(h)==="object"&&h.nodeType===1){if(this.action==="copy"&&h.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(this.action==="cut"&&(h.hasAttribute("readonly")||h.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`);this._target=h}else throw new Error('Invalid "target" value, use a valid Element')},get:function(){return this._target}}]),O}(),K=V;function j(O){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?j=function(h){return typeof h}:j=function(h){return h&&typeof Symbol=="function"&&h.constructor===Symbol&&h!==Symbol.prototype?"symbol":typeof h},j(O)}function E(O,x){if(!(O instanceof x))throw new TypeError("Cannot call a class as a function")}function We(O,x){for(var h=0;h 0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof W.action=="function"?W.action:this.defaultAction,this.target=typeof W.target=="function"?W.target:this.defaultTarget,this.text=typeof W.text=="function"?W.text:this.defaultText,this.container=j(W.container)==="object"?W.container:document.body}},{key:"listenClick",value:function(W){var te=this;this.listener=l()(W,"click",function(ct){return te.onClick(ct)})}},{key:"onClick",value:function(W){var te=W.delegateTarget||W.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new K({action:this.action(te),target:this.target(te),text:this.text(te),container:this.container,trigger:te,emitter:this})}},{key:"defaultAction",value:function(W){return ar("action",W)}},{key:"defaultTarget",value:function(W){var te=ar("target",W);if(te)return document.querySelector(te)}},{key:"defaultText",value:function(W){return ar("text",W)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var W=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],te=typeof W=="string"?[W]:W,ct=!!document.queryCommandSupported;return te.forEach(function(Zi){ct=ct&&!!document.queryCommandSupported(Zi)}),ct}}]),h}(s()),Xi=Gi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,c){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(c))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(p,m,u,b,v){var d=l.apply(this,arguments);return p.addEventListener(u,d,v),{destroy:function(){p.removeEventListener(u,d,v)}}}function c(p,m,u,b,v){return typeof p.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof p=="string"&&(p=document.querySelectorAll(p)),Array.prototype.map.call(p,function(d){return s(d,m,u,b,v)}))}function l(p,m,u,b){return function(v){v.delegateTarget=a(v.target,m),v.delegateTarget&&b.call(p,v)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function c(u,b,v){if(!u&&!b&&!v)throw new Error("Missing required arguments");if(!a.string(b))throw new TypeError("Second argument must be a String");if(!a.fn(v))throw new TypeError("Third argument must be a Function");if(a.node(u))return l(u,b,v);if(a.nodeList(u))return p(u,b,v);if(a.string(u))return m(u,b,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function l(u,b,v){return u.addEventListener(b,v),{destroy:function(){u.removeEventListener(b,v)}}}function p(u,b,v){return Array.prototype.forEach.call(u,function(d){d.addEventListener(b,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(d){d.removeEventListener(b,v)})}}}function m(u,b,v){return s(document.body,u,b,v)}o.exports=c},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),l=document.createRange();l.selectNodeContents(i),c.removeAllRanges(),c.addRange(l),a=c.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var c=this;function l(){c.off(i,l),a.apply(s,arguments)}return l._=a,this.on(i,l,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),c=0,l=s.length;for(c;c {/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */"use strict";var Ba=/["'&<>]/;gi.exports=Ja;function Ja(e){var t=""+e,r=Ba.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i 0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=o.hasError,i=o.isStopped,a=o.observers;return n||i?pr:(a.push(r),new Se(function(){return _e(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new k;return r.source=this,r},t.create=function(r,o){return new Co(r,o)},t}(k);var Co=function(e){X(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:pr},t}(T);var ut={now:function(){return(ut.delegate||Date).now()},delegate:void 0};var ft=function(e){X(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=ut);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,c=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),c=0;c 0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=Xe.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){if(n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);r.actions.length===0&&(Xe.cancelAnimationFrame(o),r._scheduled=void 0)},t}(Ft);var jo=function(e){X(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0,this._scheduled=void 0;var o=this.actions,n,i=-1;r=r||o.shift();var a=o.length;do if(n=r.execute(r.state,r.delay))break;while(++i=2,!0))}function me(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new T}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,c=s===void 0?!0:s;return function(l){var p=null,m=null,u=null,b=0,v=!1,d=!1,V=function(){m==null||m.unsubscribe(),m=null},K=function(){V(),p=u=null,v=d=!1},j=function(){var E=p;K(),E==null||E.unsubscribe()};return g(function(E,We){b++,!d&&!v&&V();var Oe=u=u!=null?u:r();We.add(function(){b--,b===0&&!d&&!v&&(m=Or(j,c))}),Oe.subscribe(We),p||(p=new pt({next:function(Qe){return Oe.next(Qe)},error:function(Qe){d=!0,V(),m=Or(K,n,Qe),Oe.error(Qe)},complete:function(){v=!0,V(),m=Or(K,a),Oe.complete()}}),re(E).subscribe(p))})(l)}}function Or(e,t){for(var r=[],o=2;o t==="focus"),N(e===De()))}var rn=new T,Fa=Me(()=>R(new ResizeObserver(e=>{for(let t of e)rn.next(t)}))).pipe(M(e=>B.pipe(N(e)).pipe(F(()=>e.disconnect()))),Y(1));function je(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Jt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function Re(e){return Fa.pipe(L(t=>t.observe(e)),M(t=>rn.pipe(_(({target:r})=>r===e),F(()=>t.unobserve(e)),f(()=>je(e)))),N(je(e)))}function on(e){return{x:e.scrollLeft,y:e.scrollTop}}function ja(e){return $(w(e,"scroll"),w(window,"resize")).pipe(f(()=>on(e)),N(on(e)))}function nn(e,t=16){return ja(e).pipe(f(({y:r})=>{let o=je(e),n=Jt(e);return r>=n.height-o.height-t}),q())}function an(e){if(e instanceof HTMLInputElement)e.select();else throw new Error("Not implemented")}var Yt={drawer:ce("[data-md-toggle=drawer]"),search:ce("[data-md-toggle=search]")};function sn(e){return Yt[e].checked}function Ie(e,t){Yt[e].checked!==t&&Yt[e].click()}function Gt(e){let t=Yt[e];return w(t,"change").pipe(f(()=>t.checked),N(t.checked))}function Ra(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function cn(){return w(window,"keydown").pipe(_(e=>!(e.metaKey||e.ctrlKey)),f(e=>({mode:sn("search")?"search":"global",type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),_(({mode:e,type:t})=>{if(e==="global"){let r=De();if(typeof r!="undefined")return!Ra(r,t)}return!0}),me())}function Pe(){return new URL(location.href)}function ln(e){location.href=e.href}function pn(){return new T}function un(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)un(e,r)}function I(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="boolean"?o.setAttribute(n,t[n]):t[n]&&o.setAttribute(n,"");for(let n of r)un(o,n);return o}function fn(e,t){let r=t;if(e.length>r){for(;e[r]!==" "&&--r>0;);return`${e.substring(0,r)}...`}return e}function Xt(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function mn(){return location.hash.substring(1)}function dn(e){let t=I("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Ia(){return w(window,"hashchange").pipe(f(mn),N(mn()),_(e=>e.length>0),Y(1))}function hn(){return Ia().pipe(f(e=>se(`[id="${e}"]`)),_(e=>typeof e!="undefined"))}function vt(e){let t=matchMedia(e);return Kt(r=>t.addListener(()=>r(t.matches))).pipe(N(t.matches))}function bn(){return w(window,"beforeprint").pipe(ee(void 0))}function Cr(e,t){return e.pipe(M(r=>r?t():B))}function Zt(e,t={credentials:"same-origin"}){return re(fetch(`${e}`,t)).pipe(_(r=>r.status===200),Fe(()=>fe))}function Ee(e,t){return Zt(e,t).pipe(M(r=>r.json()),Y(1))}function vn(e,t){let r=new DOMParser;return Zt(e,t).pipe(M(o=>o.text()),f(o=>r.parseFromString(o,"text/xml")),Y(1))}function xn(){return{x:Math.max(0,pageXOffset),y:Math.max(0,pageYOffset)}}function Hr({x:e,y:t}){window.scrollTo(e||0,t||0)}function gn(){return $(w(window,"scroll",{passive:!0}),w(window,"resize",{passive:!0})).pipe(f(xn),N(xn()))}function yn(){return{width:innerWidth,height:innerHeight}}function Sn(){return w(window,"resize",{passive:!0}).pipe(f(yn),N(yn()))}function wn(){return J([gn(),Sn()]).pipe(f(([e,t])=>({offset:e,size:t})),Y(1))}function er(e,{viewport$:t,header$:r}){let o=t.pipe(z("size")),n=J([o,r]).pipe(f(()=>({x:e.offsetLeft,y:e.offsetTop})));return J([r,t,n]).pipe(f(([{height:i},{offset:a,size:s},{x:c,y:l}])=>({offset:{x:a.x-c,y:a.y-l+i},size:s})))}function En(e,{tx$:t}){let r=w(e,"message").pipe(f(({data:o})=>o));return t.pipe(Ar(()=>r,{leading:!0,trailing:!0}),L(o=>e.postMessage(o)),_r(r),me())}var Pa=ce("#__config"),nt=JSON.parse(Pa.textContent);nt.base=`${new URL(nt.base,Pe())}`;function le(){return nt}function he(e){return nt.features.includes(e)}function G(e,t){return typeof t!="undefined"?nt.translations[e].replace("#",t.toString()):nt.translations[e]}function Te(e,t=document){return ce(`[data-md-component=${e}]`,t)}function ie(e,t=document){return Q(`[data-md-component=${e}]`,t)}var ni=Ke(jr());function tr(e,t=0){e.setAttribute("tabindex",t.toString())}function gt(e){e.removeAttribute("tabindex")}function Tn(e,t){e.setAttribute("data-md-state","lock"),e.style.top=`-${t}px`}function On(e){let t=-1*parseInt(e.style.top,10);e.removeAttribute("data-md-state"),e.style.top="",t&&window.scrollTo(0,t)}function _n(e,t){e.setAttribute("data-md-state",t)}function Mn(e){e.removeAttribute("data-md-state")}function Ln(e,t){e.classList.toggle("md-nav__link--active",t)}function An(e){e.classList.remove("md-nav__link--active")}function kn(e,t){e.firstElementChild.innerHTML=t}function Cn(e,t){e.setAttribute("data-md-state",t)}function Hn(e){e.removeAttribute("data-md-state")}function Fn(e,t){e.setAttribute("data-md-state",t)}function jn(e){e.removeAttribute("data-md-state")}function Rn(e,t){e.setAttribute("data-md-state",t)}function In(e){e.removeAttribute("data-md-state")}function Pn(e,t){e.placeholder=t}function $n(e){e.placeholder=G("search.placeholder")}function Wn(e,t){switch(t){case 0:e.textContent=G("search.result.none");break;case 1:e.textContent=G("search.result.one");break;default:e.textContent=G("search.result.other",Xt(t))}}function Un(e){e.textContent=G("search.result.placeholder")}function Vn(e,t){e.appendChild(t)}function Nn(e){e.innerHTML=""}function Dn(e,t){e.style.top=`${t}px`}function zn(e){e.style.top=""}function qn(e,t){let r=e.firstElementChild;r.style.height=`${t-2*r.offsetTop}px`}function Qn(e){let t=e.firstElementChild;t.style.height=""}function Kn(e,t){e.lastElementChild.appendChild(t)}function Bn(e,t){e.lastElementChild.setAttribute("data-md-state",t)}function Jn(e,t){e.setAttribute("data-md-state",t)}function Rr(e){e.removeAttribute("data-md-state")}function Yn(e,t){e.setAttribute("data-md-state",t)}function Ir(e){e.removeAttribute("data-md-state")}function Gn(e,t){e.style.top=`${t}px`}function Xn(e){e.style.top=""}function Zn(e){return I("button",{class:"md-clipboard md-icon",title:G("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var qe;(function(r){r[r.TEASER=1]="TEASER",r[r.PARENT=2]="PARENT"})(qe||(qe={}));function Pr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(a=>!e.terms[a]).map(a=>[I("del",null,a)," "]).flat().slice(0,-1),i=new URL(e.location);return he("search.highlight")&&i.searchParams.set("h",Object.entries(e.terms).filter(([,a])=>a).reduce((a,[s])=>`${a} ${s}`.trim(),"")),I("a",{href:`${i}`,class:"md-search-result__link",tabIndex:-1},I("article",{class:["md-search-result__article",...r?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},r>0&&I("div",{class:"md-search-result__icon md-icon"}),I("h1",{class:"md-search-result__title"},e.title),o>0&&e.text.length>0&&I("p",{class:"md-search-result__teaser"},fn(e.text,320)),o>0&&n.length>0&&I("p",{class:"md-search-result__terms"},G("search.result.term.missing"),": ",n)))}function ei(e){let t=e[0].score,r=[...e],o=r.findIndex(l=>!l.location.includes("#")),[n]=r.splice(o,1),i=r.findIndex(l=>l.score Pr(l,1)),...s.length?[I("details",{class:"md-search-result__more"},I("summary",{tabIndex:-1},s.length>0&&s.length===1?G("search.result.more.one"):G("search.result.more.other",s.length)),s.map(l=>Pr(l,1)))]:[]];return I("li",{class:"md-search-result__item"},c)}function ti(e){return I("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>I("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?Xt(r):r)))}function ri(e){return I("div",{class:"md-typeset__scrollwrap"},I("div",{class:"md-typeset__table"},e))}function $a(e){let t=le(),r=new URL(`../${e.version}/`,t.base);return I("li",{class:"md-version__item"},I("a",{href:r.toString(),class:"md-version__link"},e.title))}function oi(e){let t=le(),[,r]=t.base.match(/([^/]+)\/?$/),o=e.find(({version:n,aliases:i})=>n===r||i.includes(r))||e[0];return I("div",{class:"md-version"},I("button",{class:"md-version__current","aria-label":G("select.version.title")},o.title),I("ul",{class:"md-version__list"},e.map($a)))}var Wa=0;function Ua(e,{viewport$:t}){let r=R(e).pipe(M(o=>{let n=o.closest("[data-tabs]");return n instanceof HTMLElement?$(...Q("input",n).map(i=>w(i,"change"))):B}));return $(t.pipe(z("size")),r).pipe(f(()=>{let o=je(e);return{scroll:Jt(e).width>o.width}}),z("scroll"))}function ii(e,t){let r=new T;if(r.pipe(de(vt("(hover)"))).subscribe(([{scroll:o},n])=>{o&&n?tr(e):gt(e)}),ni.default.isSupported()){let o=e.closest("pre");o.id=`__code_${Wa++}`,o.insertBefore(Zn(o.id),e)}return Ua(e,t).pipe(L(o=>r.next(o)),F(()=>r.complete()),f(o=>P({ref:e},o)))}function Va(e,{target$:t,print$:r}){return t.pipe(f(o=>o.closest("details:not([open])")),_(o=>e===o),ee({scroll:!0}),Ne(r.pipe(ee({}))))}function ai(e,t){let r=new T;return r.subscribe(({scroll:o})=>{e.setAttribute("open",""),o&&e.scrollIntoView()}),Va(e,t).pipe(L(o=>r.next(o)),F(()=>r.complete()),ee({ref:e}))}var si=I("table");function ci(e){return ze(e,si),ze(si,ri(e)),R({ref:e})}function Na(e){return e.classList.contains("tabbed-alternate")?$(...Q(":scope > input",e).map(t=>w(t,"change").pipe(ee(t.id)))).pipe(f(t=>({active:ce(`label[for=${t}]`)}))):B}function li(e){let t=new T;return t.subscribe(({active:r})=>{let o=r.parentElement;(r.offsetLeft+r.offsetWidth>o.scrollLeft+o.offsetWidth||r.offsetLeft t.next(r)),F(()=>t.complete()),f(r=>P({ref:e},r)))}function pi(e,{target$:t,viewport$:r,print$:o}){return $(...Q("pre > code",e).map(n=>ii(n,{viewport$:r})),...Q("table:not([class])",e).map(n=>ci(n)),...Q("details",e).map(n=>ai(n,{target$:t,print$:o})),...Q("[data-tabs]",e).map(n=>li(n)))}function Da(e,{alert$:t}){return t.pipe(M(r=>$(R(!0),R(!1).pipe(Le(2e3))).pipe(f(o=>({message:r,open:o})))))}function ui(e,t){let r=new T;return r.pipe(D(Z)).subscribe(({message:o,open:n})=>{kn(e,o),n?Cn(e,"open"):Hn(e)}),Da(e,t).pipe(L(o=>r.next(o)),F(()=>r.complete()),f(o=>P({ref:e},o)))}function za({viewport$:e}){if(!he("header.autohide"))return R(!1);let t=e.pipe(f(({offset:{y:n}})=>n),ye(2,1),f(([n,i])=>[nMath.abs(i-n.y)>100),f(([,[n]])=>n),q()),o=Gt("search");return J([e,o]).pipe(f(([{offset:n},i])=>n.y>400&&!i),q(),M(n=>n?r:R(!1)),N(!1))}function fi(e,t){return Me(()=>{let r=getComputedStyle(e);return R(r.position==="sticky"||r.position==="-webkit-sticky")}).pipe(rt(Re(e),za(t)),f(([r,{height:o},n])=>({height:r?o:0,sticky:r,hidden:n})),q((r,o)=>r.sticky===o.sticky&&r.height===o.height&&r.hidden===o.hidden),Y(1))}function mi(e,{header$:t,main$:r}){let o=new T;return o.pipe(z("active"),rt(t),D(Z)).subscribe(([{active:n},{hidden:i}])=>{n?Fn(e,i?"hidden":"shadow"):jn(e)}),r.subscribe(n=>o.next(n)),t.pipe(f(n=>P({ref:e},n)))}function qa(e,{viewport$:t,header$:r}){return er(e,{header$:r,viewport$:t}).pipe(f(({offset:{y:o}})=>{let{height:n}=je(e);return{active:o>=n}}),z("active"))}function di(e,t){let r=new T;r.pipe(D(Z)).subscribe(({active:n})=>{n?Rn(e,"active"):In(e)});let o=se("article h1");return typeof o=="undefined"?B:qa(o,t).pipe(L(n=>r.next(n)),F(()=>r.complete()),f(n=>P({ref:e},n)))}function hi(e,{viewport$:t,header$:r}){let o=r.pipe(f(({height:i})=>i),q()),n=o.pipe(M(()=>Re(e).pipe(f(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),z("bottom"))));return J([o,n,t]).pipe(f(([i,{top:a,bottom:s},{offset:{y:c},size:{height:l}}])=>(l=Math.max(0,l-Math.max(0,a-c,i)-Math.max(0,l+c-s)),{offset:a-i,height:l,active:a-i<=c})),q((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Qa(e){let t=localStorage.getItem(__prefix("__palette")),r=JSON.parse(t)||{index:e.findIndex(n=>matchMedia(n.getAttribute("data-md-color-media")).matches)},o=R(...e).pipe(ne(n=>w(n,"change").pipe(ee(n))),N(e[Math.max(0,r.index)]),f(n=>({index:e.indexOf(n),color:{scheme:n.getAttribute("data-md-color-scheme"),primary:n.getAttribute("data-md-color-primary"),accent:n.getAttribute("data-md-color-accent")}})),Y(1));return o.subscribe(n=>{localStorage.setItem(__prefix("__palette"),JSON.stringify(n))}),o}function bi(e){let t=new T;t.subscribe(o=>{for(let[n,i]of Object.entries(o.color))typeof i=="string"&&document.body.setAttribute(`data-md-color-${n}`,i);for(let n=0;n t.next(o)),F(()=>t.complete()),f(o=>P({ref:e},o)))}var $r=Ke(jr());function vi({alert$:e}){$r.default.isSupported()&&new k(t=>{new $r.default("[data-clipboard-target], [data-clipboard-text]").on("success",r=>t.next(r))}).subscribe(()=>e.next(G("clipboard.copied")))}function Ka(e){if(e.length<2)return e;let[t,r]=e.sort((i,a)=>i.length-a.length).map(i=>i.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;let n=le();return e.map(i=>i.replace(t.slice(0,o),n.base))}function xi({document$:e,location$:t,viewport$:r}){let o=le();if(location.protocol==="file:")return;"scrollRestoration"in history&&(history.scrollRestoration="manual",w(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}));let n=se("link[rel=icon]");typeof n!="undefined"&&(n.href=n.href);let i=vn(new URL("sitemap.xml",o.base)).pipe(f(l=>Ka(Q("loc",l).map(p=>p.textContent))),M(l=>w(document.body,"click").pipe(_(p=>!p.metaKey&&!p.ctrlKey),M(p=>{if(p.target instanceof Element){let m=p.target.closest("a");if(m&&!m.target){let u=new URL(m.href);if(u.search="",u.hash="",u.pathname!==location.pathname&&l.includes(u.toString()))return p.preventDefault(),R({url:new URL(m.href)})}}return B}))),me()),a=w(window,"popstate").pipe(_(l=>l.state!==null),f(l=>({url:new URL(location.href),offset:l.state})),me());$(i,a).pipe(q((l,p)=>l.url.href===p.url.href),f(({url:l})=>l)).subscribe(t);let s=t.pipe(z("pathname"),M(l=>Zt(l.href).pipe(Fe(()=>(ln(l),B)))),me());i.pipe(ot(s)).subscribe(({url:l})=>{history.pushState({},"",`${l}`)});let c=new DOMParser;s.pipe(M(l=>l.text()),f(l=>c.parseFromString(l,"text/html"))).subscribe(e),e.pipe(Bt(1)).subscribe(l=>{for(let p of["title","link[rel=canonical]","meta[name=author]","meta[name=description]","[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=logo], .md-logo","[data-md-component=skip]",...he("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let m=se(p),u=se(p,l);typeof m!="undefined"&&typeof u!="undefined"&&ze(m,u)}}),e.pipe(Bt(1),f(()=>Te("container")),M(l=>R(...Q("script",l))),yr(l=>{let p=I("script");if(l.src){for(let m of l.getAttributeNames())p.setAttribute(m,l.getAttribute(m));return ze(l,p),new k(m=>{p.onload=()=>m.complete()})}else return p.textContent=l.textContent,ze(l,p),fe})).subscribe(),$(i,a).pipe(ot(e)).subscribe(({url:l,offset:p})=>{l.hash&&!p?dn(l.hash):Hr(p||{y:0})}),r.pipe(bt(i),Sr(250),z("offset")).subscribe(({offset:l})=>{history.replaceState(l,"")}),$(i,a).pipe(ye(2,1),_(([l,p])=>l.url.pathname===p.url.pathname),f(([,l])=>l)).subscribe(({offset:l})=>{Hr(l||{y:0})})}var Ya=Ke(Wr());var yi=Ke(Wr());function Ur(e,t){let r=new RegExp(e.separator,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator})(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(t?(0,yi.default)(a):a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Si(e){return e.split(/"([^"]+)"/g).map((t,r)=>r&1?t.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):t).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}var Ae;(function(n){n[n.SETUP=0]="SETUP",n[n.READY=1]="READY",n[n.QUERY=2]="QUERY",n[n.RESULT=3]="RESULT"})(Ae||(Ae={}));function it(e){return e.type===1}function wi(e){return e.type===2}function at(e){return e.type===3}function Ga({config:e,docs:t,index:r}){e.lang.length===1&&e.lang[0]==="en"&&(e.lang=[G("search.config.lang")]),e.separator==="[\\s\\-]+"&&(e.separator=G("search.config.separator"));let n={pipeline:G("search.config.pipeline").split(/\s*,\s*/).filter(Boolean),suggestions:he("search.suggest")};return{config:e,docs:t,index:r,options:n}}function Ei(e,t){let r=le(),o=new Worker(e),n=new T,i=En(o,{tx$:n}).pipe(f(a=>{if(at(a))for(let s of a.data.items)for(let c of s)c.location=`${new URL(c.location,r.base)}`;return a}),me());return re(t).pipe(f(a=>({type:Ae.SETUP,data:Ga(a)}))).subscribe(n.next.bind(n)),{tx$:n,rx$:i}}function Ti(){let e=le();Ee(new URL("../versions.json",e.base)).subscribe(t=>{ce(".md-header__topic").appendChild(oi(t))})}function Xa(e,{rx$:t}){let r=(__search==null?void 0:__search.transform)||Si,{searchParams:o}=Pe();o.has("q")&&Ie("search",!0);let n=t.pipe(_(it),xe(1),f(()=>o.get("q")||""));n.subscribe(s=>{s&&(e.value=s)});let i=tn(e),a=$(w(e,"keyup"),w(e,"focus").pipe(Le(1)),n).pipe(f(()=>r(e.value)),N(""),q());return J([a,i]).pipe(f(([s,c])=>({value:s,focus:c})),Y(1))}function Oi(e,{tx$:t,rx$:r}){let o=new T;return o.pipe(z("value"),f(({value:n})=>({type:Ae.QUERY,data:n}))).subscribe(t.next.bind(t)),o.pipe(z("focus")).subscribe(({focus:n})=>{n?(Ie("search",n),Pn(e,"")):$n(e)}),w(e.form,"reset").pipe(Mr(o.pipe(Er(1)))).subscribe(()=>we(e)),Xa(e,{tx$:t,rx$:r}).pipe(L(n=>o.next(n)),F(()=>o.complete()),f(n=>P({ref:e},n)))}function _i(e,{rx$:t},{query$:r}){let o=new T,n=nn(e.parentElement).pipe(_(Boolean)),i=ce(":scope > :first-child",e),a=ce(":scope > :last-child",e),s=t.pipe(_(it),xe(1));return o.pipe(D(Z),de(r),bt(s)).subscribe(([{items:l},{value:p}])=>{p?Wn(i,l.length):Un(i)}),o.pipe(D(Z),L(()=>Nn(a)),M(({items:l})=>$(R(...l.slice(0,10)),R(...l.slice(10)).pipe(ye(4),kr(n),M(([p])=>R(...p)))))).subscribe(l=>{Vn(a,ei(l))}),t.pipe(_(at),f(({data:l})=>l)).pipe(L(l=>o.next(l)),F(()=>o.complete()),f(l=>P({ref:e},l)))}function Za(e,{query$:t}){return t.pipe(f(({value:r})=>{let o=Pe();return o.hash="",o.searchParams.delete("h"),o.searchParams.set("q",r),{url:o}}))}function Mi(e,t){let r=new T;return r.subscribe(({url:o})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${o}`}),w(e,"click").subscribe(o=>o.preventDefault()),Za(e,t).pipe(L(o=>r.next(o)),F(()=>r.complete()),f(o=>P({ref:e},o)))}function Li(e,{rx$:t},{keyboard$:r}){let o=new T,n=Te("search-query"),i=$(w(n,"keydown"),w(n,"focus")).pipe(D(ke),f(()=>n.value),q());return o.pipe(rt(i),f(([{suggestions:s},c])=>{let l=c.split(/([\s-]+)/);if((s==null?void 0:s.length)&&l[l.length-1]){let p=s[s.length-1];p.startsWith(l[l.length-1])&&(l[l.length-1]=p)}else l.length=0;return l})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(_(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(_(at),f(({data:s})=>s)).pipe(L(s=>o.next(s)),F(()=>o.complete()),f(()=>({ref:e})))}function Ai(e,{index$:t,keyboard$:r}){let o=le();try{let n=(__search==null?void 0:__search.worker)||o.search,i=Ei(n,t),a=Te("search-query",e),s=Te("search-result",e),{tx$:c,rx$:l}=i;c.pipe(_(wi),ot(l.pipe(_(it))),xe(1)).subscribe(c.next.bind(c)),r.pipe(_(({mode:u})=>u==="search")).subscribe(u=>{let b=De();switch(u.type){case"Enter":if(b===a){let v=new Map;for(let d of Q(":first-child [href]",s)){let V=d.firstElementChild;v.set(d,parseFloat(V.getAttribute("data-md-score")))}if(v.size){let[[d]]=[...v].sort(([,V],[,K])=>K-V);d.click()}u.claim()}break;case"Escape":case"Tab":Ie("search",!1),we(a,!1);break;case"ArrowUp":case"ArrowDown":if(typeof b=="undefined")we(a);else{let v=[a,...Q(":not(details) > [href], summary, details[open] [href]",s)],d=Math.max(0,(Math.max(0,v.indexOf(b))+v.length+(u.type==="ArrowUp"?-1:1))%v.length);we(v[d])}u.claim();break;default:a!==De()&&we(a)}}),r.pipe(_(({mode:u})=>u==="global")).subscribe(u=>{switch(u.type){case"f":case"s":case"/":we(a),an(a),u.claim();break}});let p=Oi(a,i),m=_i(s,i,{query$:p});return $(p,m).pipe(Ne(...ie("search-share",e).map(u=>Mi(u,{query$:p})),...ie("search-suggest",e).map(u=>Li(u,i,{keyboard$:r}))))}catch(n){return e.hidden=!0,B}}function ki(e,{index$:t,location$:r}){return J([t,r.pipe(N(Pe()),_(o=>o.searchParams.has("h")))]).pipe(f(([o,n])=>Ur(o.config,!0)(n.searchParams.get("h"))),f(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)==null?void 0:a.offsetHeight){let c=s.textContent,l=o(c);l.length>c.length&&n.set(s,l)}for(let[s,c]of n){let{childNodes:l}=I("span",null,c);s.replaceWith(...Array.from(l))}return{ref:e,nodes:n}}))}function es(e,{viewport$:t,main$:r}){let o=e.parentElement.offsetTop-e.parentElement.parentElement.offsetTop;return J([r,t]).pipe(f(([{offset:n,height:i},{offset:{y:a}}])=>(i=i+Math.min(o,Math.max(0,a-n))-o,{height:i,locked:a>=n+o})),q((n,i)=>n.height===i.height&&n.locked===i.locked))}function Vr(e,o){var n=o,{header$:t}=n,r=Kr(n,["header$"]);let i=new T;return i.pipe(D(Z),de(t)).subscribe({next([{height:a},{height:s}]){qn(e,a),Dn(e,s)},complete(){zn(e),Qn(e)}}),es(e,r).pipe(L(a=>i.next(a)),F(()=>i.complete()),f(a=>P({ref:e},a)))}function Ci(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return ht(Ee(`${r}/releases/latest`).pipe(f(o=>({version:o.tag_name})),Ve({})),Ee(r).pipe(f(o=>({stars:o.stargazers_count,forks:o.forks_count})),Ve({}))).pipe(f(([o,n])=>P(P({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ee(r).pipe(f(o=>({repositories:o.public_repos})),Ve({}))}}function Hi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ee(r).pipe(f(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Ve({}))}function Fi(e){let[t]=e.match(/(git(?:hub|lab))/i)||[];switch(t.toLowerCase()){case"github":let[,r,o]=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);return Ci(r,o);case"gitlab":let[,n,i]=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i);return Hi(n,i);default:return B}}var ts;function rs(e){return ts||(ts=Me(()=>{let t=sessionStorage.getItem(__prefix("__source"));if(t)return R(JSON.parse(t));{let r=Fi(e.href);return r.subscribe(o=>{try{sessionStorage.setItem(__prefix("__source"),JSON.stringify(o))}catch(n){}}),r}}).pipe(Fe(()=>B),_(t=>Object.keys(t).length>0),f(t=>({facts:t})),Y(1)))}function ji(e){let t=new T;return t.subscribe(({facts:r})=>{Kn(e,ti(r)),Bn(e,"done")}),rs(e).pipe(L(r=>t.next(r)),F(()=>t.complete()),f(r=>P({ref:e},r)))}function os(e,{viewport$:t,header$:r}){return Re(document.body).pipe(M(()=>er(e,{header$:r,viewport$:t})),f(({offset:{y:o}})=>({hidden:o>=10})),z("hidden"))}function Ri(e,t){let r=new T;return r.pipe(D(Z)).subscribe({next({hidden:o}){o?Jn(e,"hidden"):Rr(e)},complete(){Rr(e)}}),(he("navigation.tabs.sticky")?R({hidden:!1}):os(e,t)).pipe(L(o=>r.next(o)),F(()=>r.complete()),f(o=>P({ref:e},o)))}function ns(e,{viewport$:t,header$:r}){let o=new Map;for(let a of e){let s=decodeURIComponent(a.hash.substring(1)),c=se(`[id="${s}"]`);typeof c!="undefined"&&o.set(a,c)}let n=r.pipe(f(a=>24+a.height));return Re(document.body).pipe(z("height"),f(()=>{let a=[];return[...o].reduce((s,[c,l])=>{for(;a.length&&o.get(a[a.length-1]).tagName>=l.tagName;)a.pop();let p=l.offsetTop;for(;!p&&l.parentElement;)l=l.parentElement,p=l.offsetTop;return s.set([...a=[...a,c]].reverse(),p)},new Map)}),f(a=>new Map([...a].sort(([,s],[,c])=>s-c))),M(a=>J([n,t]).pipe(Tr(([s,c],[l,{offset:{y:p}}])=>{for(;c.length;){let[,m]=c[0];if(m-l =p)c=[s.pop(),...c];else break}return[s,c]},[[],[...a]]),q((s,c)=>s[0]===c[0]&&s[1]===c[1])))).pipe(f(([a,s])=>({prev:a.map(([c])=>c),next:s.map(([c])=>c)})),N({prev:[],next:[]}),ye(2,1),f(([a,s])=>a.prev.length
{for(let[a]of i)An(a),Mn(a);for(let[a,[s]]of n.entries())Ln(s,a===n.length-1),_n(s,"blur")});let o=Q("[href^=\\#]",e);return ns(o,t).pipe(L(n=>r.next(n)),F(()=>r.complete()),f(n=>P({ref:e},n)))}function is(e,{viewport$:t,main$:r}){let o=t.pipe(f(({offset:{y:i}})=>i),ye(2,1),f(([i,a])=>i>a&&a),q()),n=r.pipe(z("active"));return J([n,o]).pipe(f(([{active:i},a])=>({hidden:!(i&&a)})),q((i,a)=>i.hidden===a.hidden))}function Pi(e,{viewport$:t,header$:r,main$:o}){let n=new T;return n.pipe(D(Z),de(r.pipe(z("height")))).subscribe({next([{hidden:i},{height:a}]){Gn(e,a+16),i?(Yn(e,"hidden"),we(e,!1),tr(e,-1)):(Ir(e),gt(e))},complete(){Xn(e),Ir(e),gt(e)}}),is(e,{viewport$:t,header$:r,main$:o}).pipe(L(i=>n.next(i)),F(()=>n.complete()),f(i=>P({ref:e},i)))}function $i({document$:e,tablet$:t}){e.pipe(M(()=>R(...Q("[data-md-state=indeterminate]"))),L(r=>{r.indeterminate=!0,r.checked=!1}),ne(r=>w(r,"change").pipe(Lr(()=>r.hasAttribute("data-md-state")),ee(r))),de(t)).subscribe(([r,o])=>{r.removeAttribute("data-md-state"),o&&(r.checked=!1)})}function as(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Wi({document$:e}){e.pipe(M(()=>R(...Q("[data-md-scrollfix]"))),L(t=>t.removeAttribute("data-md-scrollfix")),_(as),ne(t=>w(t,"touchstart").pipe(ee(t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Ui({viewport$:e,tablet$:t}){J([Gt("search"),t]).pipe(f(([r,o])=>r&&!o),M(r=>R(r).pipe(Le(r?400:100),D(Z))),de(e)).subscribe(([r,{offset:{y:o}}])=>{r?Tn(document.body,o):On(document.body)})}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var st=en(),rr=pn(),Nr=hn(),Dr=cn(),be=wn(),or=vt("(min-width: 960px)"),Vi=vt("(min-width: 1220px)"),Ni=bn(),Di=le(),zi=document.forms.namedItem("search")?(__search==null?void 0:__search.index)||Ee(new URL("search/search_index.json",Di.base)):B,zr=new T;vi({alert$:zr});he("navigation.instant")&&xi({document$:st,location$:rr,viewport$:be});var Qi;((Qi=Di.version)==null?void 0:Qi.provider)==="mike"&&Ti();$(rr,Nr).pipe(Le(125)).subscribe(()=>{Ie("drawer",!1),Ie("search",!1)});Dr.pipe(_(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=se("[href][rel=prev]");typeof t!="undefined"&&t.click();break;case"n":case".":let r=se("[href][rel=next]");typeof r!="undefined"&&r.click();break}});$i({document$:st,tablet$:or});Wi({document$:st});Ui({viewport$:be,tablet$:or});var $e=fi(Te("header"),{viewport$:be}),nr=st.pipe(f(()=>Te("main")),M(e=>hi(e,{viewport$:be,header$:$e})),Y(1)),ss=$(...ie("dialog").map(e=>ui(e,{alert$:zr})),...ie("header").map(e=>mi(e,{viewport$:be,header$:$e,main$:nr})),...ie("palette").map(e=>bi(e)),...ie("search").map(e=>Ai(e,{index$:zi,keyboard$:Dr})),...ie("source").map(e=>ji(e))),cs=Me(()=>$(...ie("content").map(e=>pi(e,{target$:Nr,viewport$:be,print$:Ni})),...ie("content").map(e=>he("search.highlight")?ki(e,{index$:zi,location$:rr}):B),...ie("header-title").map(e=>di(e,{viewport$:be,header$:$e})),...ie("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Cr(Vi,()=>Vr(e,{viewport$:be,header$:$e,main$:nr})):Cr(or,()=>Vr(e,{viewport$:be,header$:$e,main$:nr}))),...ie("tabs").map(e=>Ri(e,{viewport$:be,header$:$e})),...ie("toc").map(e=>Ii(e,{viewport$:be,header$:$e})),...ie("top").map(e=>Pi(e,{viewport$:be,header$:$e,main$:nr})))),qi=st.pipe(M(()=>cs),Ne(ss),Y(1));qi.subscribe();window.document$=st;window.location$=rr;window.target$=Nr;window.keyboard$=Dr;window.viewport$=be;window.tablet$=or;window.screen$=Vi;window.print$=Ni;window.alert$=zr;window.component$=qi;})(); +//# sourceMappingURL=bundle.b1047164.min.js.map + diff --git a/assets/javascripts/bundle.b1047164.min.js.map b/assets/javascripts/bundle.b1047164.min.js.map new file mode 100644 index 0000000..16e07a8 --- /dev/null +++ b/assets/javascripts/bundle.b1047164.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/rxjs/node_modules/tslib/tslib.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/modules/index.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/concatMap.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/sample.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/switchMapTo.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/assets/javascripts/browser/document/index.ts", "src/assets/javascripts/browser/element/_/index.ts", "src/assets/javascripts/browser/element/focus/index.ts", "src/assets/javascripts/browser/element/size/index.ts", "src/assets/javascripts/browser/element/offset/index.ts", "src/assets/javascripts/browser/element/selection/index.ts", "src/assets/javascripts/browser/toggle/index.ts", "src/assets/javascripts/browser/keyboard/index.ts", "src/assets/javascripts/browser/location/_/index.ts", "src/assets/javascripts/utilities/h/index.ts", "src/assets/javascripts/utilities/string/index.ts", "src/assets/javascripts/browser/location/hash/index.ts", "src/assets/javascripts/browser/media/index.ts", "src/assets/javascripts/browser/request/index.ts", "src/assets/javascripts/browser/viewport/offset/index.ts", "src/assets/javascripts/browser/viewport/size/index.ts", "src/assets/javascripts/browser/viewport/_/index.ts", "src/assets/javascripts/browser/worker/index.ts", "src/assets/javascripts/_/index.ts", "src/assets/javascripts/components/_/index.ts", "src/assets/javascripts/components/content/code/index.ts", "src/assets/javascripts/actions/_/index.ts", "src/assets/javascripts/actions/anchor/index.ts", "src/assets/javascripts/actions/dialog/index.ts", "src/assets/javascripts/actions/header/_/index.ts", "src/assets/javascripts/actions/header/title/index.ts", "src/assets/javascripts/actions/search/query/index.ts", "src/assets/javascripts/actions/search/result/index.ts", "src/assets/javascripts/actions/sidebar/index.ts", "src/assets/javascripts/actions/source/index.ts", "src/assets/javascripts/actions/tabs/index.ts", "src/assets/javascripts/actions/top/index.ts", "src/assets/javascripts/templates/clipboard/index.tsx", "src/assets/javascripts/templates/search/index.tsx", "src/assets/javascripts/templates/source/index.tsx", "src/assets/javascripts/templates/table/index.tsx", "src/assets/javascripts/templates/version/index.tsx", "src/assets/javascripts/components/content/details/index.ts", "src/assets/javascripts/components/content/table/index.ts", "src/assets/javascripts/components/content/tabs/index.ts", "src/assets/javascripts/components/content/_/index.ts", "src/assets/javascripts/components/dialog/index.ts", "src/assets/javascripts/components/header/_/index.ts", "src/assets/javascripts/components/header/title/index.ts", "src/assets/javascripts/components/main/index.ts", "src/assets/javascripts/components/palette/index.ts", "src/assets/javascripts/integrations/clipboard/index.ts", "src/assets/javascripts/integrations/instant/index.ts", "src/assets/javascripts/integrations/search/document/index.ts", "src/assets/javascripts/integrations/search/highlighter/index.ts", "src/assets/javascripts/integrations/search/query/transform/index.ts", "src/assets/javascripts/integrations/search/worker/message/index.ts", "src/assets/javascripts/integrations/search/worker/_/index.ts", "src/assets/javascripts/integrations/version/index.ts", "src/assets/javascripts/components/search/query/index.ts", "src/assets/javascripts/components/search/result/index.ts", "src/assets/javascripts/components/search/share/index.ts", "src/assets/javascripts/components/search/suggest/index.ts", "src/assets/javascripts/components/search/_/index.ts", "src/assets/javascripts/components/search/highlight/index.ts", "src/assets/javascripts/components/sidebar/index.ts", "src/assets/javascripts/components/source/facts/github/index.ts", "src/assets/javascripts/components/source/facts/gitlab/index.ts", "src/assets/javascripts/components/source/facts/_/index.ts", "src/assets/javascripts/components/source/_/index.ts", "src/assets/javascripts/components/tabs/index.ts", "src/assets/javascripts/components/toc/index.ts", "src/assets/javascripts/components/top/index.ts", "src/assets/javascripts/patches/indeterminate/index.ts", "src/assets/javascripts/patches/scrollfix/index.ts", "src/assets/javascripts/patches/scrolllock/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", "/*!\n * clipboard.js v2.0.8\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 134:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/clipboard-action.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/**\n * Inner class which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n */\n\nvar ClipboardAction = /*#__PURE__*/function () {\n /**\n * @param {Object} options\n */\n function ClipboardAction(options) {\n _classCallCheck(this, ClipboardAction);\n\n this.resolveOptions(options);\n this.initSelection();\n }\n /**\n * Defines base properties passed from constructor.\n * @param {Object} options\n */\n\n\n _createClass(ClipboardAction, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = options.action;\n this.container = options.container;\n this.emitter = options.emitter;\n this.target = options.target;\n this.text = options.text;\n this.trigger = options.trigger;\n this.selectedText = '';\n }\n /**\n * Decides which selection strategy is going to be applied based\n * on the existence of `text` and `target` properties.\n */\n\n }, {\n key: \"initSelection\",\n value: function initSelection() {\n if (this.text) {\n this.selectFake();\n } else if (this.target) {\n this.selectTarget();\n }\n }\n /**\n * Creates a fake textarea element, sets its value from `text` property,\n */\n\n }, {\n key: \"createFakeElement\",\n value: function createFakeElement() {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n this.fakeElem = document.createElement('textarea'); // Prevent zooming on iOS\n\n this.fakeElem.style.fontSize = '12pt'; // Reset box model\n\n this.fakeElem.style.border = '0';\n this.fakeElem.style.padding = '0';\n this.fakeElem.style.margin = '0'; // Move element out of screen horizontally\n\n this.fakeElem.style.position = 'absolute';\n this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n this.fakeElem.style.top = \"\".concat(yPosition, \"px\");\n this.fakeElem.setAttribute('readonly', '');\n this.fakeElem.value = this.text;\n return this.fakeElem;\n }\n /**\n * Get's the value of fakeElem,\n * and makes a selection on it.\n */\n\n }, {\n key: \"selectFake\",\n value: function selectFake() {\n var _this = this;\n\n var fakeElem = this.createFakeElement();\n\n this.fakeHandlerCallback = function () {\n return _this.removeFake();\n };\n\n this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;\n this.container.appendChild(fakeElem);\n this.selectedText = select_default()(fakeElem);\n this.copyText();\n this.removeFake();\n }\n /**\n * Only removes the fake element after another click event, that way\n * a user can hit `Ctrl+C` to copy because selection still exists.\n */\n\n }, {\n key: \"removeFake\",\n value: function removeFake() {\n if (this.fakeHandler) {\n this.container.removeEventListener('click', this.fakeHandlerCallback);\n this.fakeHandler = null;\n this.fakeHandlerCallback = null;\n }\n\n if (this.fakeElem) {\n this.container.removeChild(this.fakeElem);\n this.fakeElem = null;\n }\n }\n /**\n * Selects the content from element passed on `target` property.\n */\n\n }, {\n key: \"selectTarget\",\n value: function selectTarget() {\n this.selectedText = select_default()(this.target);\n this.copyText();\n }\n /**\n * Executes the copy operation based on the current selection.\n */\n\n }, {\n key: \"copyText\",\n value: function copyText() {\n var succeeded;\n\n try {\n succeeded = document.execCommand(this.action);\n } catch (err) {\n succeeded = false;\n }\n\n this.handleResult(succeeded);\n }\n /**\n * Fires an event based on the copy operation result.\n * @param {Boolean} succeeded\n */\n\n }, {\n key: \"handleResult\",\n value: function handleResult(succeeded) {\n this.emitter.emit(succeeded ? 'success' : 'error', {\n action: this.action,\n text: this.selectedText,\n trigger: this.trigger,\n clearSelection: this.clearSelection.bind(this)\n });\n }\n /**\n * Moves focus away from `target` and back to the trigger, removes current selection.\n */\n\n }, {\n key: \"clearSelection\",\n value: function clearSelection() {\n if (this.trigger) {\n this.trigger.focus();\n }\n\n document.activeElement.blur();\n window.getSelection().removeAllRanges();\n }\n /**\n * Sets the `action` to be performed which can be either 'copy' or 'cut'.\n * @param {String} action\n */\n\n }, {\n key: \"destroy\",\n\n /**\n * Destroy lifecycle.\n */\n value: function destroy() {\n this.removeFake();\n }\n }, {\n key: \"action\",\n set: function set() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';\n this._action = action;\n\n if (this._action !== 'copy' && this._action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n }\n }\n /**\n * Gets the `action` property.\n * @return {String}\n */\n ,\n get: function get() {\n return this._action;\n }\n /**\n * Sets the `target` property using an element\n * that will be have its content copied.\n * @param {Element} target\n */\n\n }, {\n key: \"target\",\n set: function set(target) {\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (this.action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n\n this._target = target;\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n }\n }\n /**\n * Gets the `target` property.\n * @return {String|HTMLElement}\n */\n ,\n get: function get() {\n return this._target;\n }\n }]);\n\n return ClipboardAction;\n}();\n\n/* harmony default export */ var clipboard_action = (ClipboardAction);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction clipboard_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction clipboard_createClass(Constructor, protoProps, staticProps) { if (protoProps) clipboard_defineProperties(Constructor.prototype, protoProps); if (staticProps) clipboard_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n clipboard_classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n clipboard_createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n\n if (this.clipboardAction) {\n this.clipboardAction = null;\n }\n\n this.clipboardAction = new clipboard_action({\n action: this.action(trigger),\n target: this.target(trigger),\n text: this.text(trigger),\n container: this.container,\n trigger: trigger,\n emitter: this\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n\n if (this.clipboardAction) {\n this.clipboardAction.destroy();\n this.clipboardAction = null;\n }\n }\n }], [{\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(134);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\nimport { NEVER, Subject, defer, merge } from \"rxjs\"\nimport {\n delay,\n filter,\n map,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs/operators\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getElement,\n requestJSON,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountBackToTop,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantLoading,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget()\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? __search?.index || requestJSON (\n new URL(\"search/search_index.json\", config.base)\n )\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject ()\nsetupClipboardJS({ alert$ })\n\n/* Set up instant loading, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantLoading({ document$, location$, viewport$ })\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector()\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getElement(\"[href][rel=prev]\")\n if (typeof prev !== \"undefined\")\n prev.click()\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getElement(\"[href][rel=next]\")\n if (typeof next !== \"undefined\")\n next.click()\n break\n }\n })\n\n/* Set up patches */\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { target$, viewport$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : NEVER\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, { viewport$, header$ })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Tablet observable */\nwindow.screen$ = screen$ /* Screen observable */\nwindow.print$ = print$ /* Print mode observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.component$ = component$ /* Component observable */\n", "import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n};\r\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ReplaySubject, Subject, fromEvent } from \"rxjs\"\nimport { mapTo } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document\n *\n * Documents are implemented as subjects, so all downstream observables are\n * automatically updated when a new document is emitted.\n *\n * @returns Document subject\n */\nexport function watchDocument(): Subject {\n const document$ = new ReplaySubject ()\n fromEvent(document, \"DOMContentLoaded\")\n .pipe(\n mapTo(document)\n )\n .subscribe(document$)\n\n /* Return document */\n return document$\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve an element matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element or nothing\n */\nexport function getElement (\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T] | undefined\n\nexport function getElement (\n selector: string, node?: ParentNode\n): T | undefined\n\nexport function getElement (\n selector: string, node: ParentNode = document\n): T | undefined {\n return node.querySelector (selector) || undefined\n}\n\n/**\n * Retrieve an element matching a query selector or throw a reference error\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getElementOrThrow (\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T]\n\nexport function getElementOrThrow (\n selector: string, node?: ParentNode\n): T\n\nexport function getElementOrThrow (\n selector: string, node: ParentNode = document\n): T {\n const el = getElement (selector, node)\n if (typeof el === \"undefined\")\n throw new ReferenceError(\n `Missing element: expected \"${selector}\" to be present`\n )\n\n /* Return element */\n return el\n}\n\n/**\n * Retrieve the currently active element\n *\n * @returns Element or nothing\n */\nexport function getActiveElement(): HTMLElement | undefined {\n return document.activeElement instanceof HTMLElement\n ? document.activeElement\n : undefined\n}\n\n/**\n * Retrieve all elements matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getElements (\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T][]\n\nexport function getElements (\n selector: string, node?: ParentNode\n): T[]\n\nexport function getElements (\n selector: string, node: ParentNode = document\n): T[] {\n return Array.from(node.querySelectorAll (selector))\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Replace an element with the given list of nodes\n *\n * @param el - Element\n * @param nodes - Replacement nodes\n */\nexport function replaceElement(\n el: HTMLElement, ...nodes: Node[]\n): void {\n el.replaceWith(...nodes)\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent, merge } from \"rxjs\"\nimport { map, startWith } from \"rxjs/operators\"\n\nimport { getActiveElement } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set element focus\n *\n * @param el - Element\n * @param value - Whether the element should be focused\n */\nexport function setElementFocus(\n el: HTMLElement, value = true\n): void {\n if (value)\n el.focus()\n else\n el.blur()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element focus\n *\n * @param el - Element\n *\n * @returns Element focus observable\n */\nexport function watchElementFocus(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent (el, \"focus\"),\n fromEvent (el, \"blur\")\n )\n .pipe(\n map(({ type }) => type === \"focus\"),\n startWith(el === getActiveElement())\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n of\n} from \"rxjs\"\nimport {\n filter,\n finalize,\n map,\n shareReplay,\n startWith,\n switchMap,\n tap\n} from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementSize {\n width: number /* Element width */\n height: number /* Element height */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Resize observer entry subject\n */\nconst entry$ = new Subject ()\n\n/**\n * Resize observer observable\n *\n * This observable will create a `ResizeObserver` on the first subscription\n * and will automatically terminate it when there are no more subscribers.\n * It's quite important to centralize observation in a single `ResizeObserver`,\n * as the performance difference can be quite dramatic, as the link shows.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new ResizeObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n })\n))\n .pipe(\n switchMap(resize => NEVER.pipe(startWith(resize))\n .pipe(\n finalize(() => resize.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element size\n *\n * @param el - Element\n *\n * @returns Element size\n */\nexport function getElementSize(el: HTMLElement): ElementSize {\n return {\n width: el.offsetWidth,\n height: el.offsetHeight\n }\n}\n\n/**\n * Retrieve element content size, i.e. including overflowing content\n *\n * @param el - Element\n *\n * @returns Element size\n */\nexport function getElementContentSize(el: HTMLElement): ElementSize {\n return {\n width: el.scrollWidth,\n height: el.scrollHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element size\n *\n * This function returns an observable that subscribes to a single internal\n * instance of `ResizeObserver` upon subscription, and emit resize events until\n * termination. Note that this function should not be called with the same\n * element twice, as the first unsubscription will terminate observation.\n *\n * Sadly, we can't use the `DOMRect` objects returned by the observer, because\n * we need the emitted values to be consistent with `getElementSize`, which will\n * return the used values (rounded) and not actual values (unrounded). Thus, we\n * use the `offset*` properties. See the linked GitHub issue.\n *\n * @see https://bit.ly/3m0k3he - GitHub issue\n *\n * @param el - Element\n *\n * @returns Element size observable\n */\nexport function watchElementSize(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(() => getElementSize(el))\n )\n ),\n startWith(getElementSize(el))\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent, merge } from \"rxjs\"\nimport {\n distinctUntilChanged,\n map,\n startWith\n} from \"rxjs/operators\"\n\nimport {\n getElementContentSize,\n getElementSize\n} from \"../size\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element offset\n *\n * @param el - Element\n *\n * @returns Element offset\n */\nexport function getElementOffset(el: HTMLElement): ElementOffset {\n return {\n x: el.scrollLeft,\n y: el.scrollTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element offset\n *\n * @param el - Element\n *\n * @returns Element offset observable\n */\nexport function watchElementOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(el, \"scroll\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n map(() => getElementOffset(el)),\n startWith(getElementOffset(el))\n )\n}\n\n/**\n * Watch element threshold\n *\n * This function returns an observable which emits whether the bottom scroll\n * offset of an elements is within a certain threshold.\n *\n * @param el - Element\n * @param threshold - Threshold\n *\n * @returns Element threshold observable\n */\nexport function watchElementThreshold(\n el: HTMLElement, threshold = 16\n): Observable {\n return watchElementOffset(el)\n .pipe(\n map(({ y }) => {\n const visible = getElementSize(el)\n const content = getElementContentSize(el)\n return y >= (\n content.height - visible.height - threshold\n )\n }),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set element text selection\n *\n * @param el - Element\n */\nexport function setElementSelection(\n el: HTMLElement\n): void {\n if (el instanceof HTMLInputElement)\n el.select()\n else\n throw new Error(\"Not implemented\")\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { map, startWith } from \"rxjs/operators\"\n\nimport { getElementOrThrow } from \"../element\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle\n */\nexport type Toggle =\n | \"drawer\" /* Toggle for drawer */\n | \"search\" /* Toggle for search */\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle map\n */\nconst toggles: Record = {\n drawer: getElementOrThrow(\"[data-md-toggle=drawer]\"),\n search: getElementOrThrow(\"[data-md-toggle=search]\")\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the value of a toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value\n */\nexport function getToggle(name: Toggle): boolean {\n return toggles[name].checked\n}\n\n/**\n * Set toggle\n *\n * Simulating a click event seems to be the most cross-browser compatible way\n * of changing the value while also emitting a `change` event. Before, Material\n * used `CustomEvent` to programmatically change the value of a toggle, but this\n * is a much simpler and cleaner solution which doesn't require a polyfill.\n *\n * @param name - Toggle\n * @param value - Toggle value\n */\nexport function setToggle(name: Toggle, value: boolean): void {\n if (toggles[name].checked !== value)\n toggles[name].click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value observable\n */\nexport function watchToggle(name: Toggle): Observable {\n const el = toggles[name]\n return fromEvent(el, \"change\")\n .pipe(\n map(() => el.checked),\n startWith(el.checked)\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { filter, map, share } from \"rxjs/operators\"\n\nimport { getActiveElement } from \"../element\"\nimport { getToggle } from \"../toggle\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Keyboard mode\n */\nexport type KeyboardMode =\n | \"global\" /* Global */\n | \"search\" /* Search is open */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Keyboard\n */\nexport interface Keyboard {\n mode: KeyboardMode /* Keyboard mode */\n type: string /* Key type */\n claim(): void /* Key claim */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether an element may receive keyboard input\n *\n * @param el - Element\n * @param type - Key type\n *\n * @returns Test result\n */\nfunction isSusceptibleToKeyboard(\n el: HTMLElement, type: string\n): boolean {\n switch (el.constructor) {\n\n /* Input elements */\n case HTMLInputElement:\n /* @ts-expect-error - omit unnecessary type cast */\n if (el.type === \"radio\")\n return /^Arrow/.test(type)\n else\n return true\n\n /* Select element and textarea */\n case HTMLSelectElement:\n case HTMLTextAreaElement:\n return true\n\n /* Everything else */\n default:\n return el.isContentEditable\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch keyboard\n *\n * @returns Keyboard observable\n */\nexport function watchKeyboard(): Observable {\n return fromEvent (window, \"keydown\")\n .pipe(\n filter(ev => !(ev.metaKey || ev.ctrlKey)),\n map(ev => ({\n mode: getToggle(\"search\") ? \"search\" : \"global\",\n type: ev.key,\n claim() {\n ev.preventDefault()\n ev.stopPropagation()\n }\n } as Keyboard)),\n filter(({ mode, type }) => {\n if (mode === \"global\") {\n const active = getActiveElement()\n if (typeof active !== \"undefined\")\n return !isSusceptibleToKeyboard(active, type)\n }\n return true\n }),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Subject } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location\n *\n * This function returns a `URL` object (and not `Location`) to normalize the\n * typings across the application. Furthermore, locations need to be tracked\n * without setting them and `Location` is a singleton which represents the\n * current location.\n *\n * @returns URL\n */\nexport function getLocation(): URL {\n return new URL(location.href)\n}\n\n/**\n * Set location\n *\n * @param url - URL to change to\n */\nexport function setLocation(url: URL): void {\n location.href = url.href\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location\n *\n * @returns Location subject\n */\nexport function watchLocation(): Subject {\n return new Subject ()\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { JSX as JSXInternal } from \"preact\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * HTML attributes\n */\ntype Attributes =\n & JSXInternal.HTMLAttributes\n & JSXInternal.SVGAttributes\n & Record \n\n/**\n * Child element\n */\ntype Child =\n | HTMLElement\n | Text\n | string\n | number\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Append a child node to an element\n *\n * @param el - Element\n * @param child - Child node(s)\n */\nfunction appendChild(el: HTMLElement, child: Child | Child[]): void {\n\n /* Handle primitive types (including raw HTML) */\n if (typeof child === \"string\" || typeof child === \"number\") {\n el.innerHTML += child.toString()\n\n /* Handle nodes */\n } else if (child instanceof Node) {\n el.appendChild(child)\n\n /* Handle nested children */\n } else if (Array.isArray(child)) {\n for (const node of child)\n appendChild(el, node)\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * JSX factory\n *\n * @template T - Element type\n *\n * @param tag - HTML tag\n * @param attributes - HTML attributes\n * @param children - Child elements\n *\n * @returns Element\n */\nexport function h (\n tag: T, attributes?: Attributes | null, ...children: Child[]\n): HTMLElementTagNameMap[T]\n\nexport function h (\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T\n\nexport function h (\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T {\n const el = document.createElement(tag)\n\n /* Set attributes, if any */\n if (attributes)\n for (const attr of Object.keys(attributes))\n if (typeof attributes[attr] !== \"boolean\")\n el.setAttribute(attr, attributes[attr])\n else if (attributes[attr])\n el.setAttribute(attr, \"\")\n\n /* Append child nodes */\n for (const child of children)\n appendChild(el, child)\n\n /* Return element */\n return el as T\n}\n\n/* ----------------------------------------------------------------------------\n * Namespace\n * ------------------------------------------------------------------------- */\n\nexport declare namespace h {\n namespace JSX {\n type Element = HTMLElement\n type IntrinsicElements = JSXInternal.IntrinsicElements\n }\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Truncate a string after the given number of characters\n *\n * This is not a very reasonable approach, since the summaries kind of suck.\n * It would be better to create something more intelligent, highlighting the\n * search occurrences and making a better summary out of it, but this note was\n * written three years ago, so who knows if we'll ever fix it.\n *\n * @param value - Value to be truncated\n * @param n - Number of characters\n *\n * @returns Truncated value\n */\nexport function truncate(value: string, n: number): string {\n let i = n\n if (value.length > i) {\n while (value[i] !== \" \" && --i > 0) { /* keep eating */ }\n return `${value.substring(0, i)}...`\n }\n return value\n}\n\n/**\n * Round a number for display with repository facts\n *\n * This is a reverse-engineered version of GitHub's weird rounding algorithm\n * for stars, forks and all other numbers. While all numbers below `1,000` are\n * returned as-is, bigger numbers are converted to fixed numbers:\n *\n * - `1,049` => `1k`\n * - `1,050` => `1.1k`\n * - `1,949` => `1.9k`\n * - `1,950` => `2k`\n *\n * @param value - Original value\n *\n * @returns Rounded value\n */\nexport function round(value: number): string {\n if (value > 999) {\n const digits = +((value - 950) % 1000 > 99)\n return `${((value + 0.000001) / 1000).toFixed(digits)}k`\n } else {\n return value.toString()\n }\n}\n\n/**\n * Simple hash function\n *\n * @see https://bit.ly/2wsVjJ4 - Original source\n *\n * @param value - Value to be hashed\n *\n * @returns Hash as 32bit integer\n */\nexport function hash(value: string): number {\n let h = 0\n for (let i = 0, len = value.length; i < len; i++) {\n h = ((h << 5) - h) + value.charCodeAt(i)\n h |= 0 // Convert to 32bit integer\n }\n return h\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport {\n filter,\n map,\n shareReplay,\n startWith\n} from \"rxjs/operators\"\n\nimport { getElement } from \"~/browser\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location hash\n *\n * @returns Location hash\n */\nexport function getLocationHash(): string {\n return location.hash.substring(1)\n}\n\n/**\n * Set location hash\n *\n * Setting a new fragment identifier via `location.hash` will have no effect\n * if the value doesn't change. When a new fragment identifier is set, we want\n * the browser to target the respective element at all times, which is why we\n * use this dirty little trick.\n *\n * @param hash - Location hash\n */\nexport function setLocationHash(hash: string): void {\n const el = h(\"a\", { href: hash })\n el.addEventListener(\"click\", ev => ev.stopPropagation())\n el.click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location hash\n *\n * @returns Location hash observable\n */\nexport function watchLocationHash(): Observable {\n return fromEvent (window, \"hashchange\")\n .pipe(\n map(getLocationHash),\n startWith(getLocationHash()),\n filter(hash => hash.length > 0),\n shareReplay(1)\n )\n}\n\n/**\n * Watch location target\n *\n * @returns Location target observable\n */\nexport function watchLocationTarget(): Observable {\n return watchLocationHash()\n .pipe(\n map(id => getElement(`[id=\"${id}\"]`)!),\n filter(el => typeof el !== \"undefined\")\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n fromEvent,\n fromEventPattern\n} from \"rxjs\"\nimport {\n mapTo,\n startWith,\n switchMap\n} from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch media query\n *\n * Note that although `MediaQueryList.addListener` is deprecated we have to\n * use it, because it's the only way to ensure proper downward compatibility.\n *\n * @see https://bit.ly/3dUBH2m - GitHub issue\n *\n * @param query - Media query\n *\n * @returns Media observable\n */\nexport function watchMedia(query: string): Observable {\n const media = matchMedia(query)\n return fromEventPattern (next => (\n media.addListener(() => next(media.matches))\n ))\n .pipe(\n startWith(media.matches)\n )\n}\n\n/**\n * Watch print mode, cross-browser\n *\n * @returns Print mode observable\n */\nexport function watchPrint(): Observable {\n return fromEvent(window, \"beforeprint\")\n .pipe(\n mapTo(undefined)\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Toggle an observable with a media observable\n *\n * @template T - Data type\n *\n * @param query$ - Media observable\n * @param factory - Observable factory\n *\n * @returns Toggled observable\n */\nexport function at (\n query$: Observable , factory: () => Observable \n): Observable {\n return query$\n .pipe(\n switchMap(active => active ? factory() : NEVER)\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { EMPTY, Observable, from } from \"rxjs\"\nimport {\n catchError,\n filter,\n map,\n shareReplay,\n switchMap\n} from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch the given URL\n *\n * If the request fails (e.g. when dispatched from `file://` locations), the\n * observable will complete without emitting a value.\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Response observable\n */\nexport function request(\n url: URL | string, options: RequestInit = { credentials: \"same-origin\" }\n): Observable {\n return from(fetch(`${url}`, options))\n .pipe(\n filter(res => res.status === 200),\n catchError(() => EMPTY)\n )\n}\n\n/**\n * Fetch JSON from the given URL\n *\n * @template T - Data type\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestJSON (\n url: URL | string, options?: RequestInit\n): Observable {\n return request(url, options)\n .pipe(\n switchMap(res => res.json()),\n shareReplay(1)\n )\n}\n\n/**\n * Fetch XML from the given URL\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestXML(\n url: URL | string, options?: RequestInit\n): Observable {\n const dom = new DOMParser()\n return request(url, options)\n .pipe(\n switchMap(res => res.text()),\n map(res => dom.parseFromString(res, \"text/xml\")),\n shareReplay(1)\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent, merge } from \"rxjs\"\nimport { map, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport offset\n */\nexport interface ViewportOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport offset\n *\n * On iOS Safari, viewport offset can be negative due to overflow scrolling.\n * As this may induce strange behaviors downstream, we'll just limit it to 0.\n *\n * @returns Viewport offset\n */\nexport function getViewportOffset(): ViewportOffset {\n return {\n x: Math.max(0, pageXOffset),\n y: Math.max(0, pageYOffset)\n }\n}\n\n/**\n * Set viewport offset\n *\n * @param offset - Viewport offset\n */\nexport function setViewportOffset(\n { x, y }: Partial \n): void {\n window.scrollTo(x || 0, y || 0)\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport offset\n *\n * @returns Viewport offset observable\n */\nexport function watchViewportOffset(): Observable {\n return merge(\n fromEvent(window, \"scroll\", { passive: true }),\n fromEvent(window, \"resize\", { passive: true })\n )\n .pipe(\n map(getViewportOffset),\n startWith(getViewportOffset())\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, fromEvent } from \"rxjs\"\nimport { map, startWith } from \"rxjs/operators\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport size\n */\nexport interface ViewportSize {\n width: number /* Viewport width */\n height: number /* Viewport height */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport size\n *\n * @returns Viewport size\n */\nexport function getViewportSize(): ViewportSize {\n return {\n width: innerWidth,\n height: innerHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport size\n *\n * @returns Viewport size observable\n */\nexport function watchViewportSize(): Observable {\n return fromEvent(window, \"resize\", { passive: true })\n .pipe(\n map(getViewportSize),\n startWith(getViewportSize())\n )\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath