From b25cf86f699aa14878cfcf2d54f842b8404c8c8e Mon Sep 17 00:00:00 2001 From: <> Date: Tue, 10 Oct 2023 12:59:02 +0000 Subject: [PATCH] Deployed df670de with MkDocs version: 1.5.3 --- .nojekyll | 0 404.html | 1386 ++++ CNAME | 1 + assets/_mkdocstrings.css | 0 assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.aecac24b.min.js | 29 + assets/javascripts/bundle.aecac24b.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.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + 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.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.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 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + 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 +++++++++++++++++ assets/javascripts/swagger-initializer.js | 20 + assets/javascripts/swagger-ui-bundle.js | 3 + assets/javascripts/swagger-ui-bundle.js.map | 1 + .../javascripts/swagger-ui-es-bundle-core.js | 3 + .../swagger-ui-es-bundle-core.js.map | 1 + assets/javascripts/swagger-ui-es-bundle.js | 3 + .../javascripts/swagger-ui-es-bundle.js.map | 1 + .../swagger-ui-standalone-preset.js | 3 + .../swagger-ui-standalone-preset.js.map | 1 + .../workers/search.f886a092.min.js | 42 + .../workers/search.f886a092.min.js.map | 7 + assets/stylesheets/.DS_Store | Bin 0 -> 6148 bytes assets/stylesheets/main.6a10b989.min.css | 1 + assets/stylesheets/main.6a10b989.min.css.map | 1 + assets/stylesheets/palette.356b1318.min.css | 1 + .../stylesheets/palette.356b1318.min.css.map | 1 + assets/stylesheets/swagger-ui-dark.css | 833 ++ assets/stylesheets/swagger-ui.css | 3 + assets/stylesheets/swagger-ui.css.map | 1 + assets/stylesheets/swagger-ui.js | 2 + assets/stylesheets/swagger-ui.js.map | 1 + assets/swagger-ui/oauth2-redirect.html | 79 + benchmarks/input_scanners/index.html | 990 +++ benchmarks/output_scanners/index.html | 882 +++ best_practices/index.html | 705 ++ customization/add_scanner/index.html | 678 ++ img/favicon.ico | Bin 0 -> 15086 bytes img/flow.png | Bin 0 -> 122573 bytes img/logo.png | Bin 0 -> 25377 bytes index.html | 793 ++ input_scanners/anonymize/index.html | 731 ++ input_scanners/ban_substrings/index.html | 678 ++ input_scanners/ban_topics/index.html | 681 ++ input_scanners/code/index.html | 695 ++ input_scanners/language/index.html | 689 ++ input_scanners/prompt_injection/index.html | 727 ++ input_scanners/regex/index.html | 675 ++ input_scanners/secrets/index.html | 714 ++ input_scanners/sentiment/index.html | 689 ++ input_scanners/token_limit/index.html | 696 ++ input_scanners/toxicity/index.html | 698 ++ installation/index.html | 700 ++ output_scanners/ban_substrings/index.html | 702 ++ output_scanners/ban_topics/index.html | 682 ++ output_scanners/bias/index.html | 686 ++ output_scanners/code/index.html | 695 ++ output_scanners/deanonymize/index.html | 664 ++ output_scanners/json/index.html | 680 ++ output_scanners/language/index.html | 682 ++ output_scanners/language_same/index.html | 685 ++ output_scanners/malicious_urls/index.html | 683 ++ output_scanners/no_refusal/index.html | 682 ++ output_scanners/refutation/index.html | 684 ++ output_scanners/regex/index.html | 675 ++ output_scanners/relevance/index.html | 692 ++ output_scanners/sensitive/index.html | 726 ++ output_scanners/sentiment/index.html | 689 ++ output_scanners/toxicity/index.html | 689 ++ quickstart/index.html | 706 ++ search/search_index.json | 1 + sitemap.xml | 193 + sitemap.xml.gz | Bin 0 -> 498 bytes usage/api/index.html | 797 ++ usage/api/swagger-1fca44c4.html | 111 + usage/langchain/index.html | 700 ++ usage/openai/index.html | 658 ++ usage/playground/index.html | 679 ++ 107 files changed, 36893 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 CNAME create mode 100644 assets/_mkdocstrings.css create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.aecac24b.min.js create mode 100644 assets/javascripts/bundle.aecac24b.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.he.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.hy.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.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.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.sa.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.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.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/swagger-initializer.js create mode 100644 assets/javascripts/swagger-ui-bundle.js create mode 100644 assets/javascripts/swagger-ui-bundle.js.map create mode 100644 assets/javascripts/swagger-ui-es-bundle-core.js create mode 100644 assets/javascripts/swagger-ui-es-bundle-core.js.map create mode 100644 assets/javascripts/swagger-ui-es-bundle.js create mode 100644 assets/javascripts/swagger-ui-es-bundle.js.map create mode 100644 assets/javascripts/swagger-ui-standalone-preset.js create mode 100644 assets/javascripts/swagger-ui-standalone-preset.js.map create mode 100644 assets/javascripts/workers/search.f886a092.min.js create mode 100644 assets/javascripts/workers/search.f886a092.min.js.map create mode 100644 assets/stylesheets/.DS_Store create mode 100644 assets/stylesheets/main.6a10b989.min.css create mode 100644 assets/stylesheets/main.6a10b989.min.css.map create mode 100644 assets/stylesheets/palette.356b1318.min.css create mode 100644 assets/stylesheets/palette.356b1318.min.css.map create mode 100644 assets/stylesheets/swagger-ui-dark.css create mode 100644 assets/stylesheets/swagger-ui.css create mode 100644 assets/stylesheets/swagger-ui.css.map create mode 100644 assets/stylesheets/swagger-ui.js create mode 100644 assets/stylesheets/swagger-ui.js.map create mode 100644 assets/swagger-ui/oauth2-redirect.html create mode 100644 benchmarks/input_scanners/index.html create mode 100644 benchmarks/output_scanners/index.html create mode 100644 best_practices/index.html create mode 100644 customization/add_scanner/index.html create mode 100644 img/favicon.ico create mode 100644 img/flow.png create mode 100644 img/logo.png create mode 100644 index.html create mode 100644 input_scanners/anonymize/index.html create mode 100644 input_scanners/ban_substrings/index.html create mode 100644 input_scanners/ban_topics/index.html create mode 100644 input_scanners/code/index.html create mode 100644 input_scanners/language/index.html create mode 100644 input_scanners/prompt_injection/index.html create mode 100644 input_scanners/regex/index.html create mode 100644 input_scanners/secrets/index.html create mode 100644 input_scanners/sentiment/index.html create mode 100644 input_scanners/token_limit/index.html create mode 100644 input_scanners/toxicity/index.html create mode 100644 installation/index.html create mode 100644 output_scanners/ban_substrings/index.html create mode 100644 output_scanners/ban_topics/index.html create mode 100644 output_scanners/bias/index.html create mode 100644 output_scanners/code/index.html create mode 100644 output_scanners/deanonymize/index.html create mode 100644 output_scanners/json/index.html create mode 100644 output_scanners/language/index.html create mode 100644 output_scanners/language_same/index.html create mode 100644 output_scanners/malicious_urls/index.html create mode 100644 output_scanners/no_refusal/index.html create mode 100644 output_scanners/refutation/index.html create mode 100644 output_scanners/regex/index.html create mode 100644 output_scanners/relevance/index.html create mode 100644 output_scanners/sensitive/index.html create mode 100644 output_scanners/sentiment/index.html create mode 100644 output_scanners/toxicity/index.html create mode 100644 quickstart/index.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 usage/api/index.html create mode 100644 usage/api/swagger-1fca44c4.html create mode 100644 usage/langchain/index.html create mode 100644 usage/openai/index.html create mode 100644 usage/playground/index.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..e0b2a9eb --- /dev/null +++ b/404.html @@ -0,0 +1,1386 @@ + + + + + + + + + + + + + + + + + + + + + + + LLM Guard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..45bc605d --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +llm-guard.com diff --git a/assets/_mkdocstrings.css b/assets/_mkdocstrings.css new file mode 100644 index 00000000..e69de29b 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;US5Cx_Ju;!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!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|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+FkTU#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.aecac24b.min.js b/assets/javascripts/bundle.aecac24b.min.js new file mode 100644 index 00000000..464603d8 --- /dev/null +++ b/assets/javascripts/bundle.aecac24b.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var wi=Object.create;var ur=Object.defineProperty;var Si=Object.getOwnPropertyDescriptor;var Ti=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Oi=Object.getPrototypeOf,dr=Object.prototype.hasOwnProperty,Zr=Object.prototype.propertyIsEnumerable;var Xr=(e,t,r)=>t in e?ur(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))dr.call(t,r)&&Xr(e,r,t[r]);if(kt)for(var r of kt(t))Zr.call(t,r)&&Xr(e,r,t[r]);return e};var eo=(e,t)=>{var r={};for(var o in e)dr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&kt)for(var o of kt(e))t.indexOf(o)<0&&Zr.call(e,o)&&(r[o]=e[o]);return r};var hr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Mi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ti(t))!dr.call(e,n)&&n!==r&&ur(e,n,{get:()=>t[n],enumerable:!(o=Si(t,n))||o.enumerable});return e};var Ht=(e,t,r)=>(r=e!=null?wi(Oi(e)):{},Mi(t||!e||!e.__esModule?ur(r,"default",{value:e,enumerable:!0}):r,e));var ro=hr((br,to)=>{(function(e,t){typeof br=="object"&&typeof to!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(br,function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={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 a(C){return!!(C&&C!==document&&C.nodeName!=="HTML"&&C.nodeName!=="BODY"&&"classList"in C&&"contains"in C.classList)}function c(C){var it=C.type,Ne=C.tagName;return!!(Ne==="INPUT"&&s[it]&&!C.readOnly||Ne==="TEXTAREA"&&!C.readOnly||C.isContentEditable)}function p(C){C.classList.contains("focus-visible")||(C.classList.add("focus-visible"),C.setAttribute("data-focus-visible-added",""))}function l(C){C.hasAttribute("data-focus-visible-added")&&(C.classList.remove("focus-visible"),C.removeAttribute("data-focus-visible-added"))}function f(C){C.metaKey||C.altKey||C.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(C){o=!1}function d(C){a(C.target)&&(o||c(C.target))&&p(C.target)}function v(C){a(C.target)&&(C.target.classList.contains("focus-visible")||C.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(C.target))}function b(C){document.visibilityState==="hidden"&&(n&&(o=!0),z())}function z(){document.addEventListener("mousemove",G),document.addEventListener("mousedown",G),document.addEventListener("mouseup",G),document.addEventListener("pointermove",G),document.addEventListener("pointerdown",G),document.addEventListener("pointerup",G),document.addEventListener("touchmove",G),document.addEventListener("touchstart",G),document.addEventListener("touchend",G)}function K(){document.removeEventListener("mousemove",G),document.removeEventListener("mousedown",G),document.removeEventListener("mouseup",G),document.removeEventListener("pointermove",G),document.removeEventListener("pointerdown",G),document.removeEventListener("pointerup",G),document.removeEventListener("touchmove",G),document.removeEventListener("touchstart",G),document.removeEventListener("touchend",G)}function G(C){C.target.nodeName&&C.target.nodeName.toLowerCase()==="html"||(o=!1,K())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",b,!0),z(),r.addEventListener("focus",d,!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 Vr=hr((Ot,Dr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Ot=="object"&&typeof Dr=="object"?Dr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Ot=="object"?Ot.ClipboardJS=r():t.ClipboardJS=r()})(Ot,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ei}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(U){try{return document.execCommand(U)}catch(O){return!1}}var d=function(O){var S=f()(O);return u("cut"),S},v=d;function b(U){var O=document.documentElement.getAttribute("dir")==="rtl",S=document.createElement("textarea");S.style.fontSize="12pt",S.style.border="0",S.style.padding="0",S.style.margin="0",S.style.position="absolute",S.style[O?"right":"left"]="-9999px";var $=window.pageYOffset||document.documentElement.scrollTop;return S.style.top="".concat($,"px"),S.setAttribute("readonly",""),S.value=U,S}var z=function(O,S){var $=b(O);S.container.appendChild($);var F=f()($);return u("copy"),$.remove(),F},K=function(O){var S=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},$="";return typeof O=="string"?$=z(O,S):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?$=z(O.value,S):($=f()(O),u("copy")),$},G=K;function C(U){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?C=function(S){return typeof S}:C=function(S){return S&&typeof Symbol=="function"&&S.constructor===Symbol&&S!==Symbol.prototype?"symbol":typeof S},C(U)}var it=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},S=O.action,$=S===void 0?"copy":S,F=O.container,Q=O.target,_e=O.text;if($!=="copy"&&$!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Q!==void 0)if(Q&&C(Q)==="object"&&Q.nodeType===1){if($==="copy"&&Q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if($==="cut"&&(Q.hasAttribute("readonly")||Q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(_e)return G(_e,{container:F});if(Q)return $==="cut"?v(Q):G(Q,{container:F})},Ne=it;function Pe(U){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Pe=function(S){return typeof S}:Pe=function(S){return S&&typeof Symbol=="function"&&S.constructor===Symbol&&S!==Symbol.prototype?"symbol":typeof S},Pe(U)}function ui(U,O){if(!(U instanceof O))throw new TypeError("Cannot call a class as a function")}function Jr(U,O){for(var S=0;S0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof F.action=="function"?F.action:this.defaultAction,this.target=typeof F.target=="function"?F.target:this.defaultTarget,this.text=typeof F.text=="function"?F.text:this.defaultText,this.container=Pe(F.container)==="object"?F.container:document.body}},{key:"listenClick",value:function(F){var Q=this;this.listener=p()(F,"click",function(_e){return Q.onClick(_e)})}},{key:"onClick",value:function(F){var Q=F.delegateTarget||F.currentTarget,_e=this.action(Q)||"copy",Ct=Ne({action:_e,container:this.container,target:this.target(Q),text:this.text(Q)});this.emit(Ct?"success":"error",{action:_e,text:Ct,trigger:Q,clearSelection:function(){Q&&Q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(F){return fr("action",F)}},{key:"defaultTarget",value:function(F){var Q=fr("target",F);if(Q)return document.querySelector(Q)}},{key:"defaultText",value:function(F){return fr("text",F)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(F){var Q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return G(F,Q)}},{key:"cut",value:function(F){return v(F)}},{key:"isSupported",value:function(){var F=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Q=typeof F=="string"?[F]:F,_e=!!document.queryCommandSupported;return Q.forEach(function(Ct){_e=_e&&!!document.queryCommandSupported(Ct)}),_e}}]),S}(a()),Ei=yi},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 s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s},438:function(o,n,i){var s=i(828);function a(l,f,u,d,v){var b=p.apply(this,arguments);return l.addEventListener(u,b,v),{destroy:function(){l.removeEventListener(u,b,v)}}}function c(l,f,u,d,v){return typeof l.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(b){return a(b,f,u,d,v)}))}function p(l,f,u,d){return function(v){v.delegateTarget=s(v.target,f),v.delegateTarget&&d.call(l,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 s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[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 s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(o,n,i){var s=i(879),a=i(438);function c(u,d,v){if(!u&&!d&&!v)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(v))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,d,v);if(s.nodeList(u))return l(u,d,v);if(s.string(u))return f(u,d,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,v){return u.addEventListener(d,v),{destroy:function(){u.removeEventListener(d,v)}}}function l(u,d,v){return Array.prototype.forEach.call(u,function(b){b.addEventListener(d,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(b){b.removeEventListener(d,v)})}}}function f(u,d,v){return a(document.body,u,d,v)}o.exports=c},817:function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Ha=/["'&<>]/;Un.exports=$a;function $a(e){var t=""+e,r=Ha.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||a(u,d)})})}function a(u,d){try{c(o[u](d))}catch(v){f(i[0][3],v)}}function c(u){u.value instanceof Ze?Promise.resolve(u.value.v).then(p,l):f(i[0][2],u)}function p(u){a("next",u)}function l(u){a("throw",u)}function f(u,d){u(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function io(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof we=="function"?we(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function k(e){return typeof e=="function"}function at(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Rt=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function De(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=we(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(b){i=b instanceof Rt?b.errors:[b]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=we(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{ao(v)}catch(b){i=i!=null?i:[],b instanceof Rt?i=D(D([],N(i)),N(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Rt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ao(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&De(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&De(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var gr=Ie.EMPTY;function Pt(e){return e instanceof Ie||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function ao(e){k(e)?e():e.unsubscribe()}var Ae={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],o=2;o0},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=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?gr:(this.currentObservers=null,a.push(r),new Ie(function(){o.currentObservers=null,De(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new P;return r.source=this,r},t.create=function(r,o){return new ho(r,o)},t}(P);var ho=function(e){ie(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:gr},t}(x);var yt={now:function(){return(yt.delegate||Date).now()},delegate:void 0};var Et=function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=yt);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,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.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,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=lt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(lt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(jt);var go=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Wt);var Oe=new go(vo);var L=new P(function(e){return e.complete()});function Ut(e){return e&&k(e.schedule)}function Or(e){return e[e.length-1]}function Qe(e){return k(Or(e))?e.pop():void 0}function Me(e){return Ut(Or(e))?e.pop():void 0}function Nt(e,t){return typeof Or(e)=="number"?e.pop():t}var mt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Dt(e){return k(e==null?void 0:e.then)}function Vt(e){return k(e[pt])}function zt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function qt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Pi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Kt=Pi();function Qt(e){return k(e==null?void 0:e[Kt])}function Yt(e){return no(this,arguments,function(){var r,o,n,i;return $t(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,Ze(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,Ze(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,Ze(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return k(e==null?void 0:e.getReader)}function I(e){if(e instanceof P)return e;if(e!=null){if(Vt(e))return Ii(e);if(mt(e))return Fi(e);if(Dt(e))return ji(e);if(zt(e))return xo(e);if(Qt(e))return Wi(e);if(Bt(e))return Ui(e)}throw qt(e)}function Ii(e){return new P(function(t){var r=e[pt]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Fi(e){return new P(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?M(function(n,i){return e(n,i,o)}):ue,xe(1),r?He(t):Io(function(){return new Jt}))}}function Fo(){for(var e=[],t=0;t=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,v=!1,b=!1,z=function(){f==null||f.unsubscribe(),f=void 0},K=function(){z(),l=u=void 0,v=b=!1},G=function(){var C=l;K(),C==null||C.unsubscribe()};return g(function(C,it){d++,!b&&!v&&z();var Ne=u=u!=null?u:r();it.add(function(){d--,d===0&&!b&&!v&&(f=Hr(G,c))}),Ne.subscribe(it),!l&&d>0&&(l=new tt({next:function(Pe){return Ne.next(Pe)},error:function(Pe){b=!0,z(),f=Hr(K,n,Pe),Ne.error(Pe)},complete:function(){v=!0,z(),f=Hr(K,s),Ne.complete()}}),I(C).subscribe(l))})(p)}}function Hr(e,t){for(var r=[],o=2;oe.next(document)),e}function q(e,t=document){return Array.from(t.querySelectorAll(e))}function W(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function Re(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var na=_(h(document.body,"focusin"),h(document.body,"focusout")).pipe(ke(1),V(void 0),m(()=>Re()||document.body),J(1));function Zt(e){return na.pipe(m(t=>e.contains(t)),X())}function Je(e){return{x:e.offsetLeft,y:e.offsetTop}}function No(e){return _(h(window,"load"),h(window,"resize")).pipe(Ce(0,Oe),m(()=>Je(e)),V(Je(e)))}function er(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return _(h(e,"scroll"),h(window,"resize")).pipe(Ce(0,Oe),m(()=>er(e)),V(er(e)))}function Do(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)Do(e,r)}function T(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Do(o,n);return o}function tr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function ht(e){let t=T("script",{src:e});return H(()=>(document.head.appendChild(t),_(h(t,"load"),h(t,"error").pipe(E(()=>Mr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),xe(1))))}var Vo=new x,ia=H(()=>typeof ResizeObserver=="undefined"?ht("https://unpkg.com/resize-observer-polyfill"):j(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)Vo.next(t)})),E(e=>_(Ve,j(e)).pipe(A(()=>e.disconnect()))),J(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return ia.pipe(w(t=>t.observe(e)),E(t=>Vo.pipe(M(({target:r})=>r===e),A(()=>t.unobserve(e)),m(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function zo(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var qo=new x,aa=H(()=>j(new IntersectionObserver(e=>{for(let t of e)qo.next(t)},{threshold:0}))).pipe(E(e=>_(Ve,j(e)).pipe(A(()=>e.disconnect()))),J(1));function rr(e){return aa.pipe(w(t=>t.observe(e)),E(t=>qo.pipe(M(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function Ko(e,t=16){return dt(e).pipe(m(({y:r})=>{let o=he(e),n=bt(e);return r>=n.height-o.height-t}),X())}var or={drawer:W("[data-md-toggle=drawer]"),search:W("[data-md-toggle=search]")};function Qo(e){return or[e].checked}function Ke(e,t){or[e].checked!==t&&or[e].click()}function We(e){let t=or[e];return h(t,"change").pipe(m(()=>t.checked),V(t.checked))}function sa(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 ca(){return _(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(V(!1))}function Yo(){let e=h(window,"keydown").pipe(M(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:Qo("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),M(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!sa(o,r)}return!0}),le());return ca().pipe(E(t=>t?L:e))}function pe(){return new URL(location.href)}function ot(e,t=!1){if(te("navigation.instant")&&!t){let r=T("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function Bo(){return new x}function Go(){return location.hash.slice(1)}function nr(e){let t=T("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function pa(e){return _(h(window,"hashchange"),e).pipe(m(Go),V(Go()),M(t=>t.length>0),J(1))}function Jo(e){return pa(e).pipe(m(t=>ce(`[id="${t}"]`)),M(t=>typeof t!="undefined"))}function Fr(e){let t=matchMedia(e);return Xt(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function Xo(){let e=matchMedia("print");return _(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(V(e.matches))}function jr(e,t){return e.pipe(E(r=>r?t():L))}function ir(e,t){return new P(r=>{let o=new XMLHttpRequest;o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network Error"))}),o.addEventListener("abort",()=>{r.error(new Error("Request aborted"))}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{t.progress$.next(n.loaded/n.total*100)}),t.progress$.next(5)),o.send()})}function Ue(e,t){return ir(e,t).pipe(E(r=>r.text()),m(r=>JSON.parse(r)),J(1))}function Zo(e,t){let r=new DOMParser;return ir(e,t).pipe(E(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),J(1))}function en(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function tn(){return _(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(en),V(en()))}function rn(){return{width:innerWidth,height:innerHeight}}function on(){return h(window,"resize",{passive:!0}).pipe(m(rn),V(rn()))}function nn(){return B([tn(),on()]).pipe(m(([e,t])=>({offset:e,size:t})),J(1))}function ar(e,{viewport$:t,header$:r}){let o=t.pipe(ee("size")),n=B([o,r]).pipe(m(()=>Je(e)));return B([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function la(e){return h(e,"message",t=>t.data)}function ma(e){let t=new x;return t.subscribe(r=>e.postMessage(r)),t}function an(e,t=new Worker(e)){let r=la(t),o=ma(t),n=new x;n.subscribe(o);let i=o.pipe(Z(),re(!0));return n.pipe(Z(),qe(r.pipe(Y(i))),le())}var fa=W("#__config"),vt=JSON.parse(fa.textContent);vt.base=`${new URL(vt.base,pe())}`;function me(){return vt}function te(e){return vt.features.includes(e)}function be(e,t){return typeof t!="undefined"?vt.translations[e].replace("#",t.toString()):vt.translations[e]}function Ee(e,t=document){return W(`[data-md-component=${e}]`,t)}function oe(e,t=document){return q(`[data-md-component=${e}]`,t)}function ua(e){let t=W(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>W(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function sn(e){if(!te("announce.dismiss")||!e.childElementCount)return L;if(!e.hidden){let t=W(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new x;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),ua(e).pipe(w(r=>t.next(r)),A(()=>t.complete()),m(r=>R({ref:e},r)))})}function da(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function cn(e,t){let r=new x;return r.subscribe(({hidden:o})=>{e.hidden=o}),da(e,t).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))}function ha(e,t){let r=H(()=>B([No(e),dt(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=he(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return Zt(e).pipe(E(o=>r.pipe(m(n=>({active:o,offset:n})),xe(+!o||1/0))))}function pn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new x,s=i.pipe(Z(),re(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),rr(e).pipe(Y(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),_(i.pipe(M(({active:a})=>a)),i.pipe(ke(250),M(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Ce(16,Oe)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(Pr(125,Oe),M(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(Y(s),M(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(Y(s),ne(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Re())==null||p.blur()}}),r.pipe(Y(s),M(a=>a===o),ze(125)).subscribe(()=>e.focus()),ha(e,t).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))})}function Wr(e){return T("div",{class:"md-tooltip",id:e},T("div",{class:"md-tooltip__inner md-typeset"}))}function ln(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return T("aside",{class:"md-annotation",tabIndex:0},Wr(t),T("a",{href:r,class:"md-annotation__index",tabIndex:-1},T("span",{"data-md-annotation-id":e})))}else return T("aside",{class:"md-annotation",tabIndex:0},Wr(t),T("span",{class:"md-annotation__index",tabIndex:-1},T("span",{"data-md-annotation-id":e})))}function mn(e){return T("button",{class:"md-clipboard md-icon",title:be("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Ur(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,T("del",null,p)," "],[]).slice(0,-1),i=me(),s=new URL(e.location,i.base);te("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=me();return T("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},T("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&T("div",{class:"md-search-result__icon md-icon"}),r>0&&T("h1",null,e.title),r<=0&&T("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return T("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&T("p",{class:"md-search-result__terms"},be("search.result.term.missing"),": ",...n)))}function fn(e){let t=e[0].score,r=[...e],o=me(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreUr(l,1)),...c.length?[T("details",{class:"md-search-result__more"},T("summary",{tabIndex:-1},T("div",null,c.length>0&&c.length===1?be("search.result.more.one"):be("search.result.more.other",c.length))),...c.map(l=>Ur(l,1)))]:[]];return T("li",{class:"md-search-result__item"},p)}function un(e){return T("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>T("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?tr(r):r)))}function Nr(e){let t=`tabbed-control tabbed-control--${e}`;return T("div",{class:t,hidden:!0},T("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function dn(e){return T("div",{class:"md-typeset__scrollwrap"},T("div",{class:"md-typeset__table"},e))}function ba(e){let t=me(),r=new URL(`../${e.version}/`,t.base);return T("li",{class:"md-version__item"},T("a",{href:`${r}`,class:"md-version__link"},e.title))}function hn(e,t){return T("div",{class:"md-version"},T("button",{class:"md-version__current","aria-label":be("select.version")},t.title),T("ul",{class:"md-version__list"},e.map(ba)))}function va(e){return e.tagName==="CODE"?q(".c, .c1, .cm",e):[e]}function ga(e){let t=[];for(let r of va(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function bn(e,t){t.append(...Array.from(e.childNodes))}function sr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of ga(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ce(`:scope > li:nth-child(${c})`,e)&&(s.set(c,ln(c,i)),a.replaceWith(s.get(c)))}return s.size===0?L:H(()=>{let a=new x,c=a.pipe(Z(),re(!0)),p=[];for(let[l,f]of s)p.push([W(".md-typeset",f),W(`:scope > li:nth-child(${l})`,e)]);return o.pipe(Y(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?bn(f,u):bn(u,f)}),_(...[...s].map(([,l])=>pn(l,t,{target$:r}))).pipe(A(()=>a.complete()),le())})}function vn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return vn(t)}}function gn(e,t){return H(()=>{let r=vn(e);return typeof r!="undefined"?sr(r,e,t):L})}var yn=Ht(Vr());var xa=0;function En(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return En(t)}}function xn(e){return ye(e).pipe(m(({width:t})=>({scrollable:bt(e).width>t})),ee("scrollable"))}function wn(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new x;if(n.subscribe(({scrollable:s})=>{s&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),yn.default.isSupported()&&(e.closest(".copy")||te("content.code.copy")&&!e.closest(".no-copy"))){let s=e.closest("pre");s.id=`__code_${xa++}`,s.insertBefore(mn(s.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let s=En(i);if(typeof s!="undefined"&&(i.classList.contains("annotate")||te("content.code.annotate"))){let a=sr(s,e,t);return xn(e).pipe(w(c=>n.next(c)),A(()=>n.complete()),m(c=>R({ref:e},c)),qe(ye(i).pipe(m(({width:c,height:p})=>c&&p),X(),E(c=>c?a:L))))}}return xn(e).pipe(w(s=>n.next(s)),A(()=>n.complete()),m(s=>R({ref:e},s)))});return te("content.lazy")?rr(e).pipe(M(n=>n),xe(1),E(()=>o)):o}function ya(e,{target$:t,print$:r}){let o=!0;return _(t.pipe(m(n=>n.closest("details:not([open])")),M(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(M(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Sn(e,t){return H(()=>{let r=new x;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),ya(e,t).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}var Tn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var zr,wa=0;function Sa(){return typeof mermaid=="undefined"||mermaid instanceof Element?ht("https://unpkg.com/mermaid@9.4.3/dist/mermaid.min.js"):j(void 0)}function On(e){return e.classList.remove("mermaid"),zr||(zr=Sa().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Tn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),J(1))),zr.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${wa++}`,r=T("div",{class:"mermaid"}),o=e.textContent;mermaid.mermaidAPI.render(t,o,(n,i)=>{let s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})}),zr.pipe(m(()=>({ref:e})))}var Mn=T("table");function Ln(e){return e.replaceWith(Mn),Mn.replaceWith(dn(e)),j({ref:e})}function Ta(e){let t=q(":scope > input",e),r=t.find(o=>o.checked)||t[0];return _(...t.map(o=>h(o,"change").pipe(m(()=>W(`label[for="${o.id}"]`))))).pipe(V(W(`label[for="${r.id}"]`)),m(o=>({active:o})))}function _n(e,{viewport$:t}){let r=Nr("prev");e.append(r);let o=Nr("next");e.append(o);let n=W(".tabbed-labels",e);return H(()=>{let i=new x,s=i.pipe(Z(),re(!0));return B([i,ye(e)]).pipe(Ce(1,Oe),Y(s)).subscribe({next([{active:a},c]){let p=Je(a),{width:l}=he(a);e.style.setProperty("--md-indicator-x",`${p.x}px`),e.style.setProperty("--md-indicator-width",`${l}px`);let f=er(n);(p.xf.x+c.width)&&n.scrollTo({left:Math.max(0,p.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),B([dt(n),ye(n)]).pipe(Y(s)).subscribe(([a,c])=>{let p=bt(n);r.hidden=a.x<16,o.hidden=a.x>p.width-c.width-16}),_(h(r,"click").pipe(m(()=>-1)),h(o,"click").pipe(m(()=>1))).pipe(Y(s)).subscribe(a=>{let{width:c}=he(n);n.scrollBy({left:c*a,behavior:"smooth"})}),te("content.tabs.link")&&i.pipe(je(1),ne(t)).subscribe(([{active:a},{offset:c}])=>{let p=a.innerText.trim();if(a.hasAttribute("data-md-switching"))a.removeAttribute("data-md-switching");else{let l=e.offsetTop-c.y;for(let u of q("[data-tabs]"))for(let d of q(":scope > input",u)){let v=W(`label[for="${d.id}"]`);if(v!==a&&v.innerText.trim()===p){v.setAttribute("data-md-switching",""),d.click();break}}window.scrollTo({top:e.offsetTop-l});let f=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([p,...f])])}}),i.pipe(Y(s)).subscribe(()=>{for(let a of q("audio, video",e))a.pause()}),Ta(e).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(rt(ae))}function An(e,{viewport$:t,target$:r,print$:o}){return _(...q(".annotate:not(.highlight)",e).map(n=>gn(n,{target$:r,print$:o})),...q("pre:not(.mermaid) > code",e).map(n=>wn(n,{target$:r,print$:o})),...q("pre.mermaid",e).map(n=>On(n)),...q("table:not([class])",e).map(n=>Ln(n)),...q("details",e).map(n=>Sn(n,{target$:r,print$:o})),...q("[data-tabs]",e).map(n=>_n(n,{viewport$:t})))}function Oa(e,{alert$:t}){return t.pipe(E(r=>_(j(!0),j(!1).pipe(ze(2e3))).pipe(m(o=>({message:r,active:o})))))}function Cn(e,t){let r=W(".md-typeset",e);return H(()=>{let o=new x;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Oa(e,t).pipe(w(n=>o.next(n)),A(()=>o.complete()),m(n=>R({ref:e},n)))})}function Ma({viewport$:e}){if(!te("header.autohide"))return j(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Le(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),X()),o=We("search");return B([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),X(),E(n=>n?r:j(!1)),V(!1))}function kn(e,t){return H(()=>B([ye(e),Ma(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),X((r,o)=>r.height===o.height&&r.hidden===o.hidden),J(1))}function Hn(e,{header$:t,main$:r}){return H(()=>{let o=new x,n=o.pipe(Z(),re(!0));return o.pipe(ee("active"),Ge(t)).subscribe(([{active:i},{hidden:s}])=>{e.classList.toggle("md-header--shadow",i&&!s),e.hidden=s}),r.subscribe(o),t.pipe(Y(n),m(i=>R({ref:e},i)))})}function La(e,{viewport$:t,header$:r}){return ar(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=he(e);return{active:o>=n}}),ee("active"))}function $n(e,t){return H(()=>{let r=new x;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ce(".md-content h1");return typeof o=="undefined"?L:La(o,t).pipe(w(n=>r.next(n)),A(()=>r.complete()),m(n=>R({ref:e},n)))})}function Rn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),X()),n=o.pipe(E(()=>ye(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ee("bottom"))));return B([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),X((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function _a(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return j(...e).pipe(se(r=>h(r,"change").pipe(m(()=>r))),V(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),J(1))}function Pn(e){let t=T("meta",{name:"theme-color"});document.head.appendChild(t);let r=T("meta",{name:"color-scheme"});return document.head.appendChild(r),H(()=>{let o=new x;o.subscribe(i=>{document.body.setAttribute("data-md-color-switching","");for(let[s,a]of Object.entries(i.color))document.body.setAttribute(`data-md-color-${s}`,a);for(let s=0;s{let i=Ee("header"),s=window.getComputedStyle(i);return r.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(a=>(+a).toString(16).padStart(2,"0")).join("")})).subscribe(i=>t.content=`#${i}`),o.pipe(Se(ae)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")});let n=q("input",e);return _a(n).pipe(w(i=>o.next(i)),A(()=>o.complete()),m(i=>R({ref:e},i)))})}function In(e,{progress$:t}){return H(()=>{let r=new x;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}var qr=Ht(Vr());function Aa(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r}function Fn({alert$:e}){qr.default.isSupported()&&new P(t=>{new qr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Aa(W(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>be("clipboard.copied"))).subscribe(e)}function Ca(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function cr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return j(t);{let r=me();return Zo(new URL("sitemap.xml",e||r.base)).pipe(m(o=>Ca(q("loc",o).map(n=>n.textContent))),de(()=>L),He([]),w(o=>__md_set("__sitemap",o,sessionStorage,e)))}}function jn(e){let t=W("[rel=canonical]",e);t.href=t.href.replace("//localhost:","//127.0.0.1");let r=new Map;for(let o of q(":scope > *",e)){let n=o.outerHTML;for(let i of["href","src"]){let s=o.getAttribute(i);if(s===null)continue;let a=new URL(s,t.href),c=o.cloneNode();c.setAttribute(i,`${a}`),n=c.outerHTML;break}r.set(n,o)}return r}function Wn({location$:e,viewport$:t,progress$:r}){let o=me();if(location.protocol==="file:")return L;let n=cr().pipe(m(l=>l.map(f=>`${new URL(f,o.base)}`))),i=h(document.body,"click").pipe(ne(n),E(([l,f])=>{if(!(l.target instanceof Element))return L;let u=l.target.closest("a");if(u===null)return L;if(u.target||l.metaKey||l.ctrlKey)return L;let d=new URL(u.href);return d.search=d.hash="",f.includes(`${d}`)?(l.preventDefault(),j(new URL(u.href))):L}),le());i.pipe(xe(1)).subscribe(()=>{let l=ce("link[rel=icon]");typeof l!="undefined"&&(l.href=l.href)}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),i.pipe(ne(t)).subscribe(([l,{offset:f}])=>{history.scrollRestoration="manual",history.replaceState(f,""),history.pushState(null,"",l)}),i.subscribe(e);let s=e.pipe(V(pe()),ee("pathname"),je(1),E(l=>ir(l,{progress$:r}).pipe(de(()=>(ot(l,!0),L))))),a=new DOMParser,c=s.pipe(E(l=>l.text()),E(l=>{let f=a.parseFromString(l,"text/html");for(let b of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...te("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let z=ce(b),K=ce(b,f);typeof z!="undefined"&&typeof K!="undefined"&&z.replaceWith(K)}let u=jn(document.head),d=jn(f.head);for(let[b,z]of d)z.getAttribute("rel")==="stylesheet"||z.hasAttribute("src")||(u.has(b)?u.delete(b):document.head.appendChild(z));for(let b of u.values())b.getAttribute("rel")==="stylesheet"||b.hasAttribute("src")||b.remove();let v=Ee("container");return Fe(q("script",v)).pipe(E(b=>{let z=f.createElement("script");if(b.src){for(let K of b.getAttributeNames())z.setAttribute(K,b.getAttribute(K));return b.replaceWith(z),new P(K=>{z.onload=()=>K.complete()})}else return z.textContent=b.textContent,b.replaceWith(z),L}),Z(),re(f))}),le());return h(window,"popstate").pipe(m(pe)).subscribe(e),e.pipe(V(pe()),Le(2,1),M(([l,f])=>l.pathname===f.pathname&&l.hash!==f.hash),m(([,l])=>l)).subscribe(l=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):(history.scrollRestoration="auto",nr(l.hash),history.scrollRestoration="manual")}),e.pipe(Cr(i),V(pe()),Le(2,1),M(([l,f])=>l.pathname===f.pathname&&l.hash===f.hash),m(([,l])=>l)).subscribe(l=>{history.scrollRestoration="auto",nr(l.hash),history.scrollRestoration="manual",history.back()}),c.pipe(ne(e)).subscribe(([,l])=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):nr(l.hash)}),t.pipe(ee("offset"),ke(100)).subscribe(({offset:l})=>{history.replaceState(l,"")}),c}var Dn=Ht(Nn());function Vn(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,Dn.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Mt(e){return e.type===1}function pr(e){return e.type===3}function zn(e,t){let r=an(e);return _(j(location.protocol!=="file:"),We("search")).pipe($e(o=>o),E(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:te("search.suggest")}}})),r}function qn({document$:e}){let t=me(),r=Ue(new URL("../versions.json",t.base)).pipe(de(()=>L)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),E(n=>h(document.body,"click").pipe(M(i=>!i.metaKey&&!i.ctrlKey),ne(o),E(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?L:(i.preventDefault(),j(c))}}return L}),E(i=>{let{version:s}=n.get(i);return cr(new URL(i)).pipe(m(a=>{let p=pe().href.replace(t.base,"");return a.includes(p.split("#")[0])?new URL(`../${s}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>ot(n,!0)),B([r,o]).subscribe(([n,i])=>{W(".md-header__topic").appendChild(hn(n,i))}),e.pipe(E(()=>o)).subscribe(n=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let a=((s=t.version)==null?void 0:s.default)||"latest";Array.isArray(a)||(a=[a]);e:for(let c of a)for(let p of n.aliases)if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let a of oe("outdated"))a.hidden=!1})}function Pa(e,{worker$:t}){let{searchParams:r}=pe();r.has("q")&&(Ke("search",!0),e.value=r.get("q"),e.focus(),We("search").pipe($e(i=>!i)).subscribe(()=>{let i=pe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Zt(e),n=_(t.pipe($e(Mt)),h(e,"keyup"),o).pipe(m(()=>e.value),X());return B([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),J(1))}function Kn(e,{worker$:t}){let r=new x,o=r.pipe(Z(),re(!0));B([t.pipe($e(Mt)),r],(i,s)=>s).pipe(ee("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ee("focus")).subscribe(({focus:i})=>{i&&Ke("search",i)}),h(e.form,"reset").pipe(Y(o)).subscribe(()=>e.focus());let n=W("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),Pa(e,{worker$:t}).pipe(w(i=>r.next(i)),A(()=>r.complete()),m(i=>R({ref:e},i)),J(1))}function Qn(e,{worker$:t,query$:r}){let o=new x,n=Ko(e.parentElement).pipe(M(Boolean)),i=e.parentElement,s=W(":scope > :first-child",e),a=W(":scope > :last-child",e);We("search").subscribe(l=>a.setAttribute("role",l?"list":"presentation")),o.pipe(ne(r),$r(t.pipe($e(Mt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?be("search.result.none"):be("search.result.placeholder");break;case 1:s.textContent=be("search.result.one");break;default:let u=tr(l.length);s.textContent=be("search.result.other",u)}});let c=o.pipe(w(()=>a.innerHTML=""),E(({items:l})=>_(j(...l.slice(0,10)),j(...l.slice(10)).pipe(Le(4),Ir(n),E(([f])=>f)))),m(fn),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(se(l=>{let f=ce("details",l);return typeof f=="undefined"?L:h(f,"toggle").pipe(Y(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(M(pr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),A(()=>o.complete()),m(l=>R({ref:e},l)))}function Ia(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=pe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Yn(e,t){let r=new x,o=r.pipe(Z(),re(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(Y(o)).subscribe(n=>n.preventDefault()),Ia(e,t).pipe(w(n=>r.next(n)),A(()=>r.complete()),m(n=>R({ref:e},n)))}function Bn(e,{worker$:t,keyboard$:r}){let o=new x,n=Ee("search-query"),i=_(h(n,"keydown"),h(n,"focus")).pipe(Se(ae),m(()=>n.value),X());return o.pipe(Ge(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(M(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(M(pr),m(({data:a})=>a)).pipe(w(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function Gn(e,{index$:t,keyboard$:r}){let o=me();try{let n=zn(o.search,t),i=Ee("search-query",e),s=Ee("search-result",e);h(e,"click").pipe(M(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ke("search",!1)),r.pipe(M(({mode:c})=>c==="search")).subscribe(c=>{let p=Re();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of q(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":Ke("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...q(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Re()&&i.focus()}}),r.pipe(M(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Kn(i,{worker$:n});return _(a,Qn(s,{worker$:n,query$:a})).pipe(qe(...oe("search-share",e).map(c=>Yn(c,{query$:a})),...oe("search-suggest",e).map(c=>Bn(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ve}}function Jn(e,{index$:t,location$:r}){return B([t,r.pipe(V(pe()),M(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>Vn(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=T("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Fa(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return B([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),X((i,s)=>i.height===s.height&&i.locked===s.locked))}function Kr(e,o){var n=o,{header$:t}=n,r=eo(n,["header$"]);let i=W(".md-sidebar__scrollwrap",e),{y:s}=Je(i);return H(()=>{let a=new x,c=a.pipe(Z(),re(!0)),p=a.pipe(Ce(0,Oe));return p.pipe(ne(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe($e()).subscribe(()=>{for(let l of q(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=he(f);f.scrollTo({top:u-d/2})}}}),ge(q("label[tabindex]",e)).pipe(se(l=>h(l,"click").pipe(Se(ae),m(()=>l),Y(c)))).subscribe(l=>{let f=W(`[id="${l.htmlFor}"]`);W(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),Fa(e,r).pipe(w(l=>a.next(l)),A(()=>a.complete()),m(l=>R({ref:e},l)))})}function Xn(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return St(Ue(`${r}/releases/latest`).pipe(de(()=>L),m(o=>({version:o.tag_name})),He({})),Ue(r).pipe(de(()=>L),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),He({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ue(r).pipe(m(o=>({repositories:o.public_repos})),He({}))}}function Zn(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ue(r).pipe(de(()=>L),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),He({}))}function ei(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Xn(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return Zn(r,o)}return L}var ja;function Wa(e){return ja||(ja=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return j(t);if(oe("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return L}return ei(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>L),M(t=>Object.keys(t).length>0),m(t=>({facts:t})),J(1)))}function ti(e){let t=W(":scope > :last-child",e);return H(()=>{let r=new x;return r.subscribe(({facts:o})=>{t.appendChild(un(o)),t.classList.add("md-source__repository--active")}),Wa(e).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}function Ua(e,{viewport$:t,header$:r}){return ye(document.body).pipe(E(()=>ar(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ee("hidden"))}function ri(e,t){return H(()=>{let r=new x;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(te("navigation.tabs.sticky")?j({hidden:!1}):Ua(e,t)).pipe(w(o=>r.next(o)),A(()=>r.complete()),m(o=>R({ref:e},o)))})}function Na(e,{viewport$:t,header$:r}){let o=new Map,n=q("[href^=\\#]",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ce(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(ee("height"),m(({height:a})=>{let c=Ee("main"),p=W(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return ye(document.body).pipe(ee("height"),E(a=>H(()=>{let c=[];return j([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Ge(i),E(([c,p])=>t.pipe(kr(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(a.height);for(;f.length;){let[,b]=f[0];if(b-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),X((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),V({prev:[],next:[]}),Le(2,1),m(([a,c])=>a.prev.length{let i=new x,s=i.pipe(Z(),re(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),te("toc.follow")){let a=_(t.pipe(ke(1),m(()=>{})),t.pipe(ke(250),m(()=>"smooth")));i.pipe(M(({prev:c})=>c.length>0),Ge(o.pipe(Se(ae))),ne(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=zo(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=he(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return te("navigation.tracking")&&t.pipe(Y(s),ee("offset"),ke(250),je(1),Y(n.pipe(je(1))),Tt({delay:250}),ne(i)).subscribe(([,{prev:a}])=>{let c=pe(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Na(e,{viewport$:t,header$:r}).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))})}function Da(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),Le(2,1),m(([s,a])=>s>a&&a>0),X()),i=r.pipe(m(({active:s})=>s));return B([i,n]).pipe(m(([s,a])=>!(s&&a)),X(),Y(o.pipe(je(1))),re(!0),Tt({delay:250}),m(s=>({hidden:s})))}function ni(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new x,s=i.pipe(Z(),re(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(Y(s),ee("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),Da(e,{viewport$:t,main$:o,target$:n}).pipe(w(a=>i.next(a)),A(()=>i.complete()),m(a=>R({ref:e},a)))}function ii({document$:e,tablet$:t}){e.pipe(E(()=>q(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),se(r=>h(r,"change").pipe(Rr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ne(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Va(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function ai({document$:e}){e.pipe(E(()=>q("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),M(Va),se(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function si({viewport$:e,tablet$:t}){B([We("search"),t]).pipe(m(([r,o])=>r&&!o),E(r=>j(r).pipe(ze(r?400:100))),ne(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function za(){return location.protocol==="file:"?ht(`${new URL("search/search_index.js",Qr.base)}`).pipe(m(()=>__index),J(1)):Ue(new URL("search/search_index.json",Qr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var nt=Uo(),_t=Bo(),gt=Jo(_t),Yr=Yo(),Te=nn(),lr=Fr("(min-width: 960px)"),pi=Fr("(min-width: 1220px)"),li=Xo(),Qr=me(),mi=document.forms.namedItem("search")?za():Ve,Br=new x;Fn({alert$:Br});var Gr=new x;te("navigation.instant")&&Wn({location$:_t,viewport$:Te,progress$:Gr}).subscribe(nt);var ci;((ci=Qr.version)==null?void 0:ci.provider)==="mike"&&qn({document$:nt});_(_t,gt).pipe(ze(125)).subscribe(()=>{Ke("drawer",!1),Ke("search",!1)});Yr.pipe(M(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ce("link[rel=prev]");typeof t!="undefined"&&ot(t);break;case"n":case".":let r=ce("link[rel=next]");typeof r!="undefined"&&ot(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});ii({document$:nt,tablet$:lr});ai({document$:nt});si({viewport$:Te,tablet$:lr});var Xe=kn(Ee("header"),{viewport$:Te}),Lt=nt.pipe(m(()=>Ee("main")),E(e=>Rn(e,{viewport$:Te,header$:Xe})),J(1)),qa=_(...oe("consent").map(e=>cn(e,{target$:gt})),...oe("dialog").map(e=>Cn(e,{alert$:Br})),...oe("header").map(e=>Hn(e,{viewport$:Te,header$:Xe,main$:Lt})),...oe("palette").map(e=>Pn(e)),...oe("progress").map(e=>In(e,{progress$:Gr})),...oe("search").map(e=>Gn(e,{index$:mi,keyboard$:Yr})),...oe("source").map(e=>ti(e))),Ka=H(()=>_(...oe("announce").map(e=>sn(e)),...oe("content").map(e=>An(e,{viewport$:Te,target$:gt,print$:li})),...oe("content").map(e=>te("search.highlight")?Jn(e,{index$:mi,location$:_t}):L),...oe("header-title").map(e=>$n(e,{viewport$:Te,header$:Xe})),...oe("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?jr(pi,()=>Kr(e,{viewport$:Te,header$:Xe,main$:Lt})):jr(lr,()=>Kr(e,{viewport$:Te,header$:Xe,main$:Lt}))),...oe("tabs").map(e=>ri(e,{viewport$:Te,header$:Xe})),...oe("toc").map(e=>oi(e,{viewport$:Te,header$:Xe,main$:Lt,target$:gt})),...oe("top").map(e=>ni(e,{viewport$:Te,header$:Xe,main$:Lt,target$:gt})))),fi=nt.pipe(E(()=>Ka),qe(qa),J(1));fi.subscribe();window.document$=nt;window.location$=_t;window.target$=gt;window.keyboard$=Yr;window.viewport$=Te;window.tablet$=lr;window.screen$=pi;window.print$=li;window.alert$=Br;window.progress$=Gr;window.component$=fi;})(); +//# sourceMappingURL=bundle.aecac24b.min.js.map + diff --git a/assets/javascripts/bundle.aecac24b.min.js.map b/assets/javascripts/bundle.aecac24b.min.js.map new file mode 100644 index 00000000..b1534de5 --- /dev/null +++ b/assets/javascripts/bundle.aecac24b.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.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/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.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/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.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/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/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.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/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/throttleTime.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/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/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", "/*!\n * clipboard.js v2.0.11\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/***/ 686:\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/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.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\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (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 } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\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 _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\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\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 _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 _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 var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\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 * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\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 }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\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: \"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__(686);\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-2023 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\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\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 setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\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(location$)\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 ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\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 = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\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 /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\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 /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\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 /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\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, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\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$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\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 Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n 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 return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(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\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(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 return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(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\nexport function __decorate(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\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(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\nexport function __generator(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\nexport var __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\nexport function __exportStar(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\nexport function __values(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\nexport function __read(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\nexport function __spread() {\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\nexport function __spreadArrays() {\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\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(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\nexport function __asyncDelegator(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\nexport function __asyncValues(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\nexport function __makeTemplateObject(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\nvar __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\nexport function __importStar(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\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an \n * \n *\n * */\n\n.aspect-ratio {\n height: 0;\n position: relative;\n}\n\n.aspect-ratio--16x9 { padding-bottom: 56.25%; }\n.aspect-ratio--9x16 { padding-bottom: 177.77%; }\n\n.aspect-ratio--4x3 { padding-bottom: 75%; }\n.aspect-ratio--3x4 { padding-bottom: 133.33%; }\n\n.aspect-ratio--6x4 { padding-bottom: 66.6%; }\n.aspect-ratio--4x6 { padding-bottom: 150%; }\n\n.aspect-ratio--8x5 { padding-bottom: 62.5%; }\n.aspect-ratio--5x8 { padding-bottom: 160%; }\n\n.aspect-ratio--7x5 { padding-bottom: 71.42%; }\n.aspect-ratio--5x7 { padding-bottom: 140%; }\n\n.aspect-ratio--1x1 { padding-bottom: 100%; }\n\n.aspect-ratio--object {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n}\n\n@media #{$breakpoint-not-small}{\n .aspect-ratio-ns {\n height: 0;\n position: relative;\n }\n .aspect-ratio--16x9-ns { padding-bottom: 56.25%; }\n .aspect-ratio--9x16-ns { padding-bottom: 177.77%; }\n .aspect-ratio--4x3-ns { padding-bottom: 75%; }\n .aspect-ratio--3x4-ns { padding-bottom: 133.33%; }\n .aspect-ratio--6x4-ns { padding-bottom: 66.6%; }\n .aspect-ratio--4x6-ns { padding-bottom: 150%; }\n .aspect-ratio--8x5-ns { padding-bottom: 62.5%; }\n .aspect-ratio--5x8-ns { padding-bottom: 160%; }\n .aspect-ratio--7x5-ns { padding-bottom: 71.42%; }\n .aspect-ratio--5x7-ns { padding-bottom: 140%; }\n .aspect-ratio--1x1-ns { padding-bottom: 100%; }\n .aspect-ratio--object-ns {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n }\n}\n\n@media #{$breakpoint-medium}{\n .aspect-ratio-m {\n height: 0;\n position: relative;\n }\n .aspect-ratio--16x9-m { padding-bottom: 56.25%; }\n .aspect-ratio--9x16-m { padding-bottom: 177.77%; }\n .aspect-ratio--4x3-m { padding-bottom: 75%; }\n .aspect-ratio--3x4-m { padding-bottom: 133.33%; }\n .aspect-ratio--6x4-m { padding-bottom: 66.6%; }\n .aspect-ratio--4x6-m { padding-bottom: 150%; }\n .aspect-ratio--8x5-m { padding-bottom: 62.5%; }\n .aspect-ratio--5x8-m { padding-bottom: 160%; }\n .aspect-ratio--7x5-m { padding-bottom: 71.42%; }\n .aspect-ratio--5x7-m { padding-bottom: 140%; }\n .aspect-ratio--1x1-m { padding-bottom: 100%; }\n .aspect-ratio--object-m {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n }\n}\n\n@media #{$breakpoint-large}{\n .aspect-ratio-l {\n height: 0;\n position: relative;\n }\n .aspect-ratio--16x9-l { padding-bottom: 56.25%; }\n .aspect-ratio--9x16-l { padding-bottom: 177.77%; }\n .aspect-ratio--4x3-l { padding-bottom: 75%; }\n .aspect-ratio--3x4-l { padding-bottom: 133.33%; }\n .aspect-ratio--6x4-l { padding-bottom: 66.6%; }\n .aspect-ratio--4x6-l { padding-bottom: 150%; }\n .aspect-ratio--8x5-l { padding-bottom: 62.5%; }\n .aspect-ratio--5x8-l { padding-bottom: 160%; }\n .aspect-ratio--7x5-l { padding-bottom: 71.42%; }\n .aspect-ratio--5x7-l { padding-bottom: 140%; }\n .aspect-ratio--1x1-l { padding-bottom: 100%; }\n .aspect-ratio--object-l {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 100;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n IMAGES\n Docs: http://tachyons.io/docs/elements/images/\n\n*/\n\n/* Responsive images! */\n\nimg { max-width: 100%; }\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BACKGROUND SIZE\n Docs: http://tachyons.io/docs/themes/background-size/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n/*\n Often used in combination with background image set as an inline style\n on an html element.\n*/\n\n .cover { background-size: cover!important; }\n .contain { background-size: contain!important; }\n\n@media #{$breakpoint-not-small} {\n .cover-ns { background-size: cover!important; }\n .contain-ns { background-size: contain!important; }\n}\n\n@media #{$breakpoint-medium} {\n .cover-m { background-size: cover!important; }\n .contain-m { background-size: contain!important; }\n}\n\n@media #{$breakpoint-large} {\n .cover-l { background-size: cover!important; }\n .contain-l { background-size: contain!important; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BACKGROUND POSITION\n\n Base:\n bg = background\n\n Modifiers:\n -center = center center\n -top = top center\n -right = center right\n -bottom = bottom center\n -left = center left\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n.bg-center { \n background-repeat: no-repeat;\n background-position: center center; \n}\n\n.bg-top { \n background-repeat: no-repeat; \n background-position: top center; \n}\n\n.bg-right { \n background-repeat: no-repeat; \n background-position: center right; \n}\n\n.bg-bottom { \n background-repeat: no-repeat; \n background-position: bottom center; \n}\n\n.bg-left { \n background-repeat: no-repeat; \n background-position: center left; \n}\n\n@media #{$breakpoint-not-small} {\n .bg-center-ns { \n background-repeat: no-repeat;\n background-position: center center; \n }\n\n .bg-top-ns { \n background-repeat: no-repeat; \n background-position: top center; \n }\n\n .bg-right-ns { \n background-repeat: no-repeat; \n background-position: center right; \n }\n\n .bg-bottom-ns { \n background-repeat: no-repeat; \n background-position: bottom center; \n }\n\n .bg-left-ns { \n background-repeat: no-repeat; \n background-position: center left; \n }\n}\n\n@media #{$breakpoint-medium} {\n .bg-center-m { \n background-repeat: no-repeat;\n background-position: center center; \n }\n\n .bg-top-m { \n background-repeat: no-repeat; \n background-position: top center; \n }\n\n .bg-right-m { \n background-repeat: no-repeat; \n background-position: center right; \n }\n\n .bg-bottom-m { \n background-repeat: no-repeat; \n background-position: bottom center; \n }\n\n .bg-left-m { \n background-repeat: no-repeat; \n background-position: center left; \n }\n}\n\n@media #{$breakpoint-large} {\n .bg-center-l { \n background-repeat: no-repeat;\n background-position: center center; \n }\n\n .bg-top-l { \n background-repeat: no-repeat; \n background-position: top center; \n }\n\n .bg-right-l { \n background-repeat: no-repeat; \n background-position: center right; \n }\n\n .bg-bottom-l { \n background-repeat: no-repeat; \n background-position: bottom center; \n }\n\n .bg-left-l { \n background-repeat: no-repeat; \n background-position: center left; \n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n OUTLINES\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.outline { outline: 1px solid; }\n.outline-transparent { outline: 1px solid transparent; }\n.outline-0 { outline: 0; }\n\n@media #{$breakpoint-not-small} {\n .outline-ns { outline: 1px solid; }\n .outline-transparent-ns { outline: 1px solid transparent; }\n .outline-0-ns { outline: 0; }\n}\n\n@media #{$breakpoint-medium} {\n .outline-m { outline: 1px solid; }\n .outline-transparent-m { outline: 1px solid transparent; }\n .outline-0-m { outline: 0; }\n}\n\n@media #{$breakpoint-large} {\n .outline-l { outline: 1px solid; }\n .outline-transparent-l { outline: 1px solid transparent; }\n .outline-0-l { outline: 0; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDERS\n Docs: http://tachyons.io/docs/themes/borders/\n\n Base:\n b = border\n\n Modifiers:\n a = all\n t = top\n r = right\n b = bottom\n l = left\n n = none\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n .ba { border-style: solid; border-width: 1px; }\n .bt { border-top-style: solid; border-top-width: 1px; }\n .br { border-right-style: solid; border-right-width: 1px; }\n .bb { border-bottom-style: solid; border-bottom-width: 1px; }\n .bl { border-left-style: solid; border-left-width: 1px; }\n .bn { border-style: none; border-width: 0; }\n\n\n@media #{$breakpoint-not-small} {\n .ba-ns { border-style: solid; border-width: 1px; }\n .bt-ns { border-top-style: solid; border-top-width: 1px; }\n .br-ns { border-right-style: solid; border-right-width: 1px; }\n .bb-ns { border-bottom-style: solid; border-bottom-width: 1px; }\n .bl-ns { border-left-style: solid; border-left-width: 1px; }\n .bn-ns { border-style: none; border-width: 0; }\n}\n\n@media #{$breakpoint-medium} {\n .ba-m { border-style: solid; border-width: 1px; }\n .bt-m { border-top-style: solid; border-top-width: 1px; }\n .br-m { border-right-style: solid; border-right-width: 1px; }\n .bb-m { border-bottom-style: solid; border-bottom-width: 1px; }\n .bl-m { border-left-style: solid; border-left-width: 1px; }\n .bn-m { border-style: none; border-width: 0; }\n}\n\n@media #{$breakpoint-large} {\n .ba-l { border-style: solid; border-width: 1px; }\n .bt-l { border-top-style: solid; border-top-width: 1px; }\n .br-l { border-right-style: solid; border-right-width: 1px; }\n .bb-l { border-bottom-style: solid; border-bottom-width: 1px; }\n .bl-l { border-left-style: solid; border-left-width: 1px; }\n .bn-l { border-style: none; border-width: 0; }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDER COLORS\n Docs: http://tachyons.io/docs/themes/borders/\n\n Border colors can be used to extend the base\n border classes ba,bt,bb,br,bl found in the _borders.css file.\n\n The base border class by default will set the color of the border\n to that of the current text color. These classes are for the cases\n where you desire for the text and border colors to be different.\n\n Base:\n b = border\n\n Modifiers:\n --color-name = each color variable name is also a border color name\n\n*/\n\n.b--black { border-color: $black; }\n.b--near-black { border-color: $near-black; }\n.b--dark-gray { border-color: $dark-gray; }\n.b--mid-gray { border-color: $mid-gray; }\n.b--gray { border-color: $gray; }\n.b--silver { border-color: $silver; }\n.b--light-silver { border-color: $light-silver; }\n.b--moon-gray { border-color: $moon-gray; }\n.b--light-gray { border-color: $light-gray; }\n.b--near-white { border-color: $near-white; }\n.b--white { border-color: $white; }\n\n.b--white-90 { border-color: $white-90; }\n.b--white-80 { border-color: $white-80; }\n.b--white-70 { border-color: $white-70; }\n.b--white-60 { border-color: $white-60; }\n.b--white-50 { border-color: $white-50; }\n.b--white-40 { border-color: $white-40; }\n.b--white-30 { border-color: $white-30; }\n.b--white-20 { border-color: $white-20; }\n.b--white-10 { border-color: $white-10; }\n.b--white-05 { border-color: $white-05; }\n.b--white-025 { border-color: $white-025; }\n.b--white-0125 { border-color: $white-0125; }\n\n.b--black-90 { border-color: $black-90; }\n.b--black-80 { border-color: $black-80; }\n.b--black-70 { border-color: $black-70; }\n.b--black-60 { border-color: $black-60; }\n.b--black-50 { border-color: $black-50; }\n.b--black-40 { border-color: $black-40; }\n.b--black-30 { border-color: $black-30; }\n.b--black-20 { border-color: $black-20; }\n.b--black-10 { border-color: $black-10; }\n.b--black-05 { border-color: $black-05; }\n.b--black-025 { border-color: $black-025; }\n.b--black-0125 { border-color: $black-0125; }\n\n.b--dark-red { border-color: $dark-red; }\n.b--red { border-color: $red; }\n.b--light-red { border-color: $light-red; }\n.b--orange { border-color: $orange; }\n.b--gold { border-color: $gold; }\n.b--yellow { border-color: $yellow; }\n.b--light-yellow { border-color: $light-yellow; }\n.b--purple { border-color: $purple; }\n.b--light-purple { border-color: $light-purple; }\n.b--dark-pink { border-color: $dark-pink; }\n.b--hot-pink { border-color: $hot-pink; }\n.b--pink { border-color: $pink; }\n.b--light-pink { border-color: $light-pink; }\n.b--dark-green { border-color: $dark-green; }\n.b--green { border-color: $green; }\n.b--light-green { border-color: $light-green; }\n.b--navy { border-color: $navy; }\n.b--dark-blue { border-color: $dark-blue; }\n.b--blue { border-color: $blue; }\n.b--light-blue { border-color: $light-blue; }\n.b--lightest-blue { border-color: $lightest-blue; }\n.b--washed-blue { border-color: $washed-blue; }\n.b--washed-green { border-color: $washed-green; }\n.b--washed-yellow { border-color: $washed-yellow; }\n.b--washed-red { border-color: $washed-red; }\n\n.b--transparent { border-color: $transparent; }\n.b--inherit { border-color: inherit; }\n","\n// Converted Variables\n\n$sans-serif: -apple-system, BlinkMacSystemFont, 'avenir next', avenir, helvetica, 'helvetica neue', ubuntu, roboto, noto, 'segoe ui', arial, sans-serif !default;\n$serif: georgia, serif !default;\n$code: consolas, monaco, monospace !default;\n$font-size-headline: 6rem !default;\n$font-size-subheadline: 5rem !default;\n$font-size-1: 3rem !default;\n$font-size-2: 2.25rem !default;\n$font-size-3: 1.5rem !default;\n$font-size-4: 1.25rem !default;\n$font-size-5: 1rem !default;\n$font-size-6: .875rem !default;\n$font-size-7: .75rem !default;\n$letter-spacing-tight: -.05em !default;\n$letter-spacing-1: .1em !default;\n$letter-spacing-2: .25em !default;\n$line-height-solid: 1 !default;\n$line-height-title: 1.25 !default;\n$line-height-copy: 1.5 !default;\n$measure: 30em !default;\n$measure-narrow: 20em !default;\n$measure-wide: 34em !default;\n$spacing-none: 0 !default;\n$spacing-extra-small: .25rem !default;\n$spacing-small: .5rem !default;\n$spacing-medium: 1rem !default;\n$spacing-large: 2rem !default;\n$spacing-extra-large: 4rem !default;\n$spacing-extra-extra-large: 8rem !default;\n$spacing-extra-extra-extra-large: 16rem !default;\n$spacing-copy-separator: 1.5em !default;\n$height-1: 1rem !default;\n$height-2: 2rem !default;\n$height-3: 4rem !default;\n$height-4: 8rem !default;\n$height-5: 16rem !default;\n$width-1: 1rem !default;\n$width-2: 2rem !default;\n$width-3: 4rem !default;\n$width-4: 8rem !default;\n$width-5: 16rem !default;\n$max-width-1: 1rem !default;\n$max-width-2: 2rem !default;\n$max-width-3: 4rem !default;\n$max-width-4: 8rem !default;\n$max-width-5: 16rem !default;\n$max-width-6: 32rem !default;\n$max-width-7: 48rem !default;\n$max-width-8: 64rem !default;\n$max-width-9: 96rem !default;\n$border-radius-none: 0 !default;\n$border-radius-1: .125rem !default;\n$border-radius-2: .25rem !default;\n$border-radius-3: .5rem !default;\n$border-radius-4: 1rem !default;\n$border-radius-circle: 100% !default;\n$border-radius-pill: 9999px !default;\n$border-width-none: 0 !default;\n$border-width-1: .125rem !default;\n$border-width-2: .25rem !default;\n$border-width-3: .5rem !default;\n$border-width-4: 1rem !default;\n$border-width-5: 2rem !default;\n$box-shadow-1: 0px 0px 4px 2px rgba( 0, 0, 0, 0.2 ) !default;\n$box-shadow-2: 0px 0px 8px 2px rgba( 0, 0, 0, 0.2 ) !default;\n$box-shadow-3: 2px 2px 4px 2px rgba( 0, 0, 0, 0.2 ) !default;\n$box-shadow-4: 2px 2px 8px 0px rgba( 0, 0, 0, 0.2 ) !default;\n$box-shadow-5: 4px 4px 8px 0px rgba( 0, 0, 0, 0.2 ) !default;\n$black: #000 !default;\n$near-black: #111 !default;\n$dark-gray: #333 !default;\n$mid-gray: #555 !default;\n$gray: #777 !default;\n$silver: #999 !default;\n$light-silver: #aaa !default;\n$moon-gray: #ccc !default;\n$light-gray: #eee !default;\n$near-white: #f4f4f4 !default;\n$white: #fff !default;\n$transparent: transparent !default;\n$black-90: rgba(0,0,0,.9) !default;\n$black-80: rgba(0,0,0,.8) !default;\n$black-70: rgba(0,0,0,.7) !default;\n$black-60: rgba(0,0,0,.6) !default;\n$black-50: rgba(0,0,0,.5) !default;\n$black-40: rgba(0,0,0,.4) !default;\n$black-30: rgba(0,0,0,.3) !default;\n$black-20: rgba(0,0,0,.2) !default;\n$black-10: rgba(0,0,0,.1) !default;\n$black-05: rgba(0,0,0,.05) !default;\n$black-025: rgba(0,0,0,.025) !default;\n$black-0125: rgba(0,0,0,.0125) !default;\n$white-90: rgba(255,255,255,.9) !default;\n$white-80: rgba(255,255,255,.8) !default;\n$white-70: rgba(255,255,255,.7) !default;\n$white-60: rgba(255,255,255,.6) !default;\n$white-50: rgba(255,255,255,.5) !default;\n$white-40: rgba(255,255,255,.4) !default;\n$white-30: rgba(255,255,255,.3) !default;\n$white-20: rgba(255,255,255,.2) !default;\n$white-10: rgba(255,255,255,.1) !default;\n$white-05: rgba(255,255,255,.05) !default;\n$white-025: rgba(255,255,255,.025) !default;\n$white-0125: rgba(255,255,255,.0125) !default;\n$dark-red: #e7040f !default;\n$red: #ff4136 !default;\n$light-red: #ff725c !default;\n$orange: #ff6300 !default;\n$gold: #ffb700 !default;\n$yellow: #ffd700 !default;\n$light-yellow: #fbf1a9 !default;\n$purple: #5e2ca5 !default;\n$light-purple: #a463f2 !default;\n$dark-pink: #d5008f !default;\n$hot-pink: #ff41b4 !default;\n$pink: #ff80cc !default;\n$light-pink: #ffa3d7 !default;\n$dark-green: #137752 !default;\n$green: #19a974 !default;\n$light-green: #9eebcf !default;\n$navy: #001b44 !default;\n$dark-blue: #00449e !default;\n$blue: #357edd !default;\n$light-blue: #96ccff !default;\n$lightest-blue: #cdecff !default;\n$washed-blue: #f6fffe !default;\n$washed-green: #e8fdf5 !default;\n$washed-yellow: #fffceb !default;\n$washed-red: #ffdfdf !default;\n\n// Custom Media Query Variables\n\n$breakpoint-not-small: 'screen and (min-width: 30em)' !default;\n$breakpoint-medium: 'screen and (min-width: 30em) and (max-width: 60em)' !default;\n$breakpoint-large: 'screen and (min-width: 60em)' !default;\n\n/*\n\n VARIABLES\n\n*/\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDER RADIUS\n Docs: http://tachyons.io/docs/themes/border-radius/\n\n Base:\n br = border-radius\n\n Modifiers:\n 0 = 0/none\n 1 = 1st step in scale\n 2 = 2nd step in scale\n 3 = 3rd step in scale\n 4 = 4th step in scale\n\n Literal values:\n -100 = 100%\n -pill = 9999px\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n .br0 { border-radius: $border-radius-none }\n .br1 { border-radius: $border-radius-1; }\n .br2 { border-radius: $border-radius-2; }\n .br3 { border-radius: $border-radius-3; }\n .br4 { border-radius: $border-radius-4; }\n .br-100 { border-radius: $border-radius-circle; }\n .br-pill { border-radius: $border-radius-pill; }\n .br--bottom {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .br--top {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .br--right {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .br--left {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n@media #{$breakpoint-not-small} {\n .br0-ns { border-radius: $border-radius-none }\n .br1-ns { border-radius: $border-radius-1; }\n .br2-ns { border-radius: $border-radius-2; }\n .br3-ns { border-radius: $border-radius-3; }\n .br4-ns { border-radius: $border-radius-4; }\n .br-100-ns { border-radius: $border-radius-circle; }\n .br-pill-ns { border-radius: $border-radius-pill; }\n .br--bottom-ns {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .br--top-ns {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .br--right-ns {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .br--left-ns {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n}\n\n@media #{$breakpoint-medium} {\n .br0-m { border-radius: $border-radius-none }\n .br1-m { border-radius: $border-radius-1; }\n .br2-m { border-radius: $border-radius-2; }\n .br3-m { border-radius: $border-radius-3; }\n .br4-m { border-radius: $border-radius-4; }\n .br-100-m { border-radius: $border-radius-circle; }\n .br-pill-m { border-radius: $border-radius-pill; }\n .br--bottom-m {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .br--top-m {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .br--right-m {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .br--left-m {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n}\n\n@media #{$breakpoint-large} {\n .br0-l { border-radius: $border-radius-none }\n .br1-l { border-radius: $border-radius-1; }\n .br2-l { border-radius: $border-radius-2; }\n .br3-l { border-radius: $border-radius-3; }\n .br4-l { border-radius: $border-radius-4; }\n .br-100-l { border-radius: $border-radius-circle; }\n .br-pill-l { border-radius: $border-radius-pill; }\n .br--bottom-l {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n .br--top-l {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n .br--right-l {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .br--left-l {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDER STYLES\n Docs: http://tachyons.io/docs/themes/borders/\n\n Depends on base border module in _borders.css\n\n Base:\n b = border-style\n\n Modifiers:\n --none = none\n --dotted = dotted\n --dashed = dashed\n --solid = solid\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n.b--dotted { border-style: dotted; }\n.b--dashed { border-style: dashed; }\n.b--solid { border-style: solid; }\n.b--none { border-style: none; }\n\n@media #{$breakpoint-not-small} {\n .b--dotted-ns { border-style: dotted; }\n .b--dashed-ns { border-style: dashed; }\n .b--solid-ns { border-style: solid; }\n .b--none-ns { border-style: none; }\n}\n\n@media #{$breakpoint-medium} {\n .b--dotted-m { border-style: dotted; }\n .b--dashed-m { border-style: dashed; }\n .b--solid-m { border-style: solid; }\n .b--none-m { border-style: none; }\n}\n\n@media #{$breakpoint-large} {\n .b--dotted-l { border-style: dotted; }\n .b--dashed-l { border-style: dashed; }\n .b--solid-l { border-style: solid; }\n .b--none-l { border-style: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BORDER WIDTHS\n Docs: http://tachyons.io/docs/themes/borders/\n\n Base:\n bw = border-width\n\n Modifiers:\n 0 = 0 width border\n 1 = 1st step in border-width scale\n 2 = 2nd step in border-width scale\n 3 = 3rd step in border-width scale\n 4 = 4th step in border-width scale\n 5 = 5th step in border-width scale\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.bw0 { border-width: $border-width-none; }\n.bw1 { border-width: $border-width-1; }\n.bw2 { border-width: $border-width-2; }\n.bw3 { border-width: $border-width-3; }\n.bw4 { border-width: $border-width-4; }\n.bw5 { border-width: $border-width-5; }\n\n/* Resets */\n.bt-0 { border-top-width: $border-width-none }\n.br-0 { border-right-width: $border-width-none }\n.bb-0 { border-bottom-width: $border-width-none }\n.bl-0 { border-left-width: $border-width-none }\n\n@media #{$breakpoint-not-small} {\n .bw0-ns { border-width: $border-width-none; }\n .bw1-ns { border-width: $border-width-1; }\n .bw2-ns { border-width: $border-width-2; }\n .bw3-ns { border-width: $border-width-3; }\n .bw4-ns { border-width: $border-width-4; }\n .bw5-ns { border-width: $border-width-5; }\n .bt-0-ns { border-top-width: $border-width-none }\n .br-0-ns { border-right-width: $border-width-none }\n .bb-0-ns { border-bottom-width: $border-width-none }\n .bl-0-ns { border-left-width: $border-width-none }\n}\n\n@media #{$breakpoint-medium} {\n .bw0-m { border-width: $border-width-none; }\n .bw1-m { border-width: $border-width-1; }\n .bw2-m { border-width: $border-width-2; }\n .bw3-m { border-width: $border-width-3; }\n .bw4-m { border-width: $border-width-4; }\n .bw5-m { border-width: $border-width-5; }\n .bt-0-m { border-top-width: $border-width-none }\n .br-0-m { border-right-width: $border-width-none }\n .bb-0-m { border-bottom-width: $border-width-none }\n .bl-0-m { border-left-width: $border-width-none }\n}\n\n@media #{$breakpoint-large} {\n .bw0-l { border-width: $border-width-none; }\n .bw1-l { border-width: $border-width-1; }\n .bw2-l { border-width: $border-width-2; }\n .bw3-l { border-width: $border-width-3; }\n .bw4-l { border-width: $border-width-4; }\n .bw5-l { border-width: $border-width-5; }\n .bt-0-l { border-top-width: $border-width-none }\n .br-0-l { border-right-width: $border-width-none }\n .bb-0-l { border-bottom-width: $border-width-none }\n .bl-0-l { border-left-width: $border-width-none }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n BOX-SHADOW\n Docs: http://tachyons.io/docs/themes/box-shadow/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n.shadow-1 { box-shadow: $box-shadow-1; }\n.shadow-2 { box-shadow: $box-shadow-2; }\n.shadow-3 { box-shadow: $box-shadow-3; }\n.shadow-4 { box-shadow: $box-shadow-4; }\n.shadow-5 { box-shadow: $box-shadow-5; }\n\n@media #{$breakpoint-not-small} {\n .shadow-1-ns { box-shadow: $box-shadow-1; }\n .shadow-2-ns { box-shadow: $box-shadow-2; }\n .shadow-3-ns { box-shadow: $box-shadow-3; }\n .shadow-4-ns { box-shadow: $box-shadow-4; }\n .shadow-5-ns { box-shadow: $box-shadow-5; }\n}\n\n@media #{$breakpoint-medium} {\n .shadow-1-m { box-shadow: $box-shadow-1; }\n .shadow-2-m { box-shadow: $box-shadow-2; }\n .shadow-3-m { box-shadow: $box-shadow-3; }\n .shadow-4-m { box-shadow: $box-shadow-4; }\n .shadow-5-m { box-shadow: $box-shadow-5; }\n}\n\n@media #{$breakpoint-large} {\n .shadow-1-l { box-shadow: $box-shadow-1; }\n .shadow-2-l { box-shadow: $box-shadow-2; }\n .shadow-3-l { box-shadow: $box-shadow-3; }\n .shadow-4-l { box-shadow: $box-shadow-4; }\n .shadow-5-l { box-shadow: $box-shadow-5; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n CODE\n\n*/\n\n.pre {\n overflow-x: auto;\n overflow-y: hidden;\n overflow: scroll;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n COORDINATES\n Docs: http://tachyons.io/docs/layout/position/\n\n Use in combination with the position module.\n\n Base:\n top\n bottom\n right\n left\n\n Modifiers:\n -0 = literal value 0\n -1 = literal value 1\n -2 = literal value 2\n --1 = literal value -1\n --2 = literal value -2\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.top-0 { top: 0; }\n.right-0 { right: 0; }\n.bottom-0 { bottom: 0; }\n.left-0 { left: 0; }\n\n.top-1 { top: 1rem; }\n.right-1 { right: 1rem; }\n.bottom-1 { bottom: 1rem; }\n.left-1 { left: 1rem; }\n\n.top-2 { top: 2rem; }\n.right-2 { right: 2rem; }\n.bottom-2 { bottom: 2rem; }\n.left-2 { left: 2rem; }\n\n.top--1 { top: -1rem; }\n.right--1 { right: -1rem; }\n.bottom--1 { bottom: -1rem; }\n.left--1 { left: -1rem; }\n\n.top--2 { top: -2rem; }\n.right--2 { right: -2rem; }\n.bottom--2 { bottom: -2rem; }\n.left--2 { left: -2rem; }\n\n\n.absolute--fill {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n}\n\n@media #{$breakpoint-not-small} {\n .top-0-ns { top: 0; }\n .left-0-ns { left: 0; }\n .right-0-ns { right: 0; }\n .bottom-0-ns { bottom: 0; }\n .top-1-ns { top: 1rem; }\n .left-1-ns { left: 1rem; }\n .right-1-ns { right: 1rem; }\n .bottom-1-ns { bottom: 1rem; }\n .top-2-ns { top: 2rem; }\n .left-2-ns { left: 2rem; }\n .right-2-ns { right: 2rem; }\n .bottom-2-ns { bottom: 2rem; }\n .top--1-ns { top: -1rem; }\n .right--1-ns { right: -1rem; }\n .bottom--1-ns { bottom: -1rem; }\n .left--1-ns { left: -1rem; }\n .top--2-ns { top: -2rem; }\n .right--2-ns { right: -2rem; }\n .bottom--2-ns { bottom: -2rem; }\n .left--2-ns { left: -2rem; }\n .absolute--fill-ns {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n\n@media #{$breakpoint-medium} {\n .top-0-m { top: 0; }\n .left-0-m { left: 0; }\n .right-0-m { right: 0; }\n .bottom-0-m { bottom: 0; }\n .top-1-m { top: 1rem; }\n .left-1-m { left: 1rem; }\n .right-1-m { right: 1rem; }\n .bottom-1-m { bottom: 1rem; }\n .top-2-m { top: 2rem; }\n .left-2-m { left: 2rem; }\n .right-2-m { right: 2rem; }\n .bottom-2-m { bottom: 2rem; }\n .top--1-m { top: -1rem; }\n .right--1-m { right: -1rem; }\n .bottom--1-m { bottom: -1rem; }\n .left--1-m { left: -1rem; }\n .top--2-m { top: -2rem; }\n .right--2-m { right: -2rem; }\n .bottom--2-m { bottom: -2rem; }\n .left--2-m { left: -2rem; }\n .absolute--fill-m {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n\n@media #{$breakpoint-large} {\n .top-0-l { top: 0; }\n .left-0-l { left: 0; }\n .right-0-l { right: 0; }\n .bottom-0-l { bottom: 0; }\n .top-1-l { top: 1rem; }\n .left-1-l { left: 1rem; }\n .right-1-l { right: 1rem; }\n .bottom-1-l { bottom: 1rem; }\n .top-2-l { top: 2rem; }\n .left-2-l { left: 2rem; }\n .right-2-l { right: 2rem; }\n .bottom-2-l { bottom: 2rem; }\n .top--1-l { top: -1rem; }\n .right--1-l { right: -1rem; }\n .bottom--1-l { bottom: -1rem; }\n .left--1-l { left: -1rem; }\n .top--2-l { top: -2rem; }\n .right--2-l { right: -2rem; }\n .bottom--2-l { bottom: -2rem; }\n .left--2-l { left: -2rem; }\n .absolute--fill-l {\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n CLEARFIX\n http://tachyons.io/docs/layout/clearfix/\n\n*/\n\n/* Nicolas Gallaghers Clearfix solution\n Ref: http://nicolasgallagher.com/micro-clearfix-hack/ */\n\n.cf:before,\n.cf:after { content: \" \"; display: table; }\n.cf:after { clear: both; }\n.cf { zoom: 1; }\n\n.cl { clear: left; }\n.cr { clear: right; }\n.cb { clear: both; }\n.cn { clear: none; }\n\n@media #{$breakpoint-not-small} {\n .cl-ns { clear: left; }\n .cr-ns { clear: right; }\n .cb-ns { clear: both; }\n .cn-ns { clear: none; }\n}\n\n@media #{$breakpoint-medium} {\n .cl-m { clear: left; }\n .cr-m { clear: right; }\n .cb-m { clear: both; }\n .cn-m { clear: none; }\n}\n\n@media #{$breakpoint-large} {\n .cl-l { clear: left; }\n .cr-l { clear: right; }\n .cb-l { clear: both; }\n .cn-l { clear: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FLEXBOX\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.flex { display: flex; }\n.inline-flex { display: inline-flex; }\n\n/* 1. Fix for Chrome 44 bug.\n * https://code.google.com/p/chromium/issues/detail?id=506893 */\n.flex-auto {\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n}\n\n.flex-none { flex: none; }\n\n.flex-column { flex-direction: column; }\n.flex-row { flex-direction: row; }\n.flex-wrap { flex-wrap: wrap; }\n.flex-nowrap { flex-wrap: nowrap; }\n.flex-wrap-reverse { flex-wrap: wrap-reverse; }\n.flex-column-reverse { flex-direction: column-reverse; }\n.flex-row-reverse { flex-direction: row-reverse; }\n\n.items-start { align-items: flex-start; }\n.items-end { align-items: flex-end; }\n.items-center { align-items: center; }\n.items-baseline { align-items: baseline; }\n.items-stretch { align-items: stretch; }\n\n.self-start { align-self: flex-start; }\n.self-end { align-self: flex-end; }\n.self-center { align-self: center; }\n.self-baseline { align-self: baseline; }\n.self-stretch { align-self: stretch; }\n\n.justify-start { justify-content: flex-start; }\n.justify-end { justify-content: flex-end; }\n.justify-center { justify-content: center; }\n.justify-between { justify-content: space-between; }\n.justify-around { justify-content: space-around; }\n\n.content-start { align-content: flex-start; }\n.content-end { align-content: flex-end; }\n.content-center { align-content: center; }\n.content-between { align-content: space-between; }\n.content-around { align-content: space-around; }\n.content-stretch { align-content: stretch; }\n\n.order-0 { order: 0; }\n.order-1 { order: 1; }\n.order-2 { order: 2; }\n.order-3 { order: 3; }\n.order-4 { order: 4; }\n.order-5 { order: 5; }\n.order-6 { order: 6; }\n.order-7 { order: 7; }\n.order-8 { order: 8; }\n.order-last { order: 99999; }\n\n.flex-grow-0 { flex-grow: 0; }\n.flex-grow-1 { flex-grow: 1; }\n\n.flex-shrink-0 { flex-shrink: 0; }\n.flex-shrink-1 { flex-shrink: 1; }\n\n@media #{$breakpoint-not-small} {\n .flex-ns { display: flex; }\n .inline-flex-ns { display: inline-flex; }\n .flex-auto-ns {\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n }\n .flex-none-ns { flex: none; }\n .flex-column-ns { flex-direction: column; }\n .flex-row-ns { flex-direction: row; }\n .flex-wrap-ns { flex-wrap: wrap; }\n .flex-nowrap-ns { flex-wrap: nowrap; }\n .flex-wrap-reverse-ns { flex-wrap: wrap-reverse; }\n .flex-column-reverse-ns { flex-direction: column-reverse; }\n .flex-row-reverse-ns { flex-direction: row-reverse; }\n .items-start-ns { align-items: flex-start; }\n .items-end-ns { align-items: flex-end; }\n .items-center-ns { align-items: center; }\n .items-baseline-ns { align-items: baseline; }\n .items-stretch-ns { align-items: stretch; }\n\n .self-start-ns { align-self: flex-start; }\n .self-end-ns { align-self: flex-end; }\n .self-center-ns { align-self: center; }\n .self-baseline-ns { align-self: baseline; }\n .self-stretch-ns { align-self: stretch; }\n\n .justify-start-ns { justify-content: flex-start; }\n .justify-end-ns { justify-content: flex-end; }\n .justify-center-ns { justify-content: center; }\n .justify-between-ns { justify-content: space-between; }\n .justify-around-ns { justify-content: space-around; }\n\n .content-start-ns { align-content: flex-start; }\n .content-end-ns { align-content: flex-end; }\n .content-center-ns { align-content: center; }\n .content-between-ns { align-content: space-between; }\n .content-around-ns { align-content: space-around; }\n .content-stretch-ns { align-content: stretch; }\n\n .order-0-ns { order: 0; }\n .order-1-ns { order: 1; }\n .order-2-ns { order: 2; }\n .order-3-ns { order: 3; }\n .order-4-ns { order: 4; }\n .order-5-ns { order: 5; }\n .order-6-ns { order: 6; }\n .order-7-ns { order: 7; }\n .order-8-ns { order: 8; }\n .order-last-ns { order: 99999; }\n\n .flex-grow-0-ns { flex-grow: 0; }\n .flex-grow-1-ns { flex-grow: 1; }\n\n .flex-shrink-0-ns { flex-shrink: 0; }\n .flex-shrink-1-ns { flex-shrink: 1; }\n}\n@media #{$breakpoint-medium} {\n .flex-m { display: flex; }\n .inline-flex-m { display: inline-flex; }\n .flex-auto-m {\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n }\n .flex-none-m { flex: none; }\n .flex-column-m { flex-direction: column; }\n .flex-row-m { flex-direction: row; }\n .flex-wrap-m { flex-wrap: wrap; }\n .flex-nowrap-m { flex-wrap: nowrap; }\n .flex-wrap-reverse-m { flex-wrap: wrap-reverse; }\n .flex-column-reverse-m { flex-direction: column-reverse; }\n .flex-row-reverse-m { flex-direction: row-reverse; }\n .items-start-m { align-items: flex-start; }\n .items-end-m { align-items: flex-end; }\n .items-center-m { align-items: center; }\n .items-baseline-m { align-items: baseline; }\n .items-stretch-m { align-items: stretch; }\n\n .self-start-m { align-self: flex-start; }\n .self-end-m { align-self: flex-end; }\n .self-center-m { align-self: center; }\n .self-baseline-m { align-self: baseline; }\n .self-stretch-m { align-self: stretch; }\n\n .justify-start-m { justify-content: flex-start; }\n .justify-end-m { justify-content: flex-end; }\n .justify-center-m { justify-content: center; }\n .justify-between-m { justify-content: space-between; }\n .justify-around-m { justify-content: space-around; }\n\n .content-start-m { align-content: flex-start; }\n .content-end-m { align-content: flex-end; }\n .content-center-m { align-content: center; }\n .content-between-m { align-content: space-between; }\n .content-around-m { align-content: space-around; }\n .content-stretch-m { align-content: stretch; }\n\n .order-0-m { order: 0; }\n .order-1-m { order: 1; }\n .order-2-m { order: 2; }\n .order-3-m { order: 3; }\n .order-4-m { order: 4; }\n .order-5-m { order: 5; }\n .order-6-m { order: 6; }\n .order-7-m { order: 7; }\n .order-8-m { order: 8; }\n .order-last-m { order: 99999; }\n\n .flex-grow-0-m { flex-grow: 0; }\n .flex-grow-1-m { flex-grow: 1; }\n\n .flex-shrink-0-m { flex-shrink: 0; }\n .flex-shrink-1-m { flex-shrink: 1; }\n}\n\n@media #{$breakpoint-large} {\n .flex-l { display: flex; }\n .inline-flex-l { display: inline-flex; }\n .flex-auto-l {\n flex: 1 1 auto;\n min-width: 0; /* 1 */\n min-height: 0; /* 1 */\n }\n .flex-none-l { flex: none; }\n .flex-column-l { flex-direction: column; }\n .flex-row-l { flex-direction: row; }\n .flex-wrap-l { flex-wrap: wrap; }\n .flex-nowrap-l { flex-wrap: nowrap; }\n .flex-wrap-reverse-l { flex-wrap: wrap-reverse; }\n .flex-column-reverse-l { flex-direction: column-reverse; }\n .flex-row-reverse-l { flex-direction: row-reverse; }\n\n .items-start-l { align-items: flex-start; }\n .items-end-l { align-items: flex-end; }\n .items-center-l { align-items: center; }\n .items-baseline-l { align-items: baseline; }\n .items-stretch-l { align-items: stretch; }\n\n .self-start-l { align-self: flex-start; }\n .self-end-l { align-self: flex-end; }\n .self-center-l { align-self: center; }\n .self-baseline-l { align-self: baseline; }\n .self-stretch-l { align-self: stretch; }\n\n .justify-start-l { justify-content: flex-start; }\n .justify-end-l { justify-content: flex-end; }\n .justify-center-l { justify-content: center; }\n .justify-between-l { justify-content: space-between; }\n .justify-around-l { justify-content: space-around; }\n\n .content-start-l { align-content: flex-start; }\n .content-end-l { align-content: flex-end; }\n .content-center-l { align-content: center; }\n .content-between-l { align-content: space-between; }\n .content-around-l { align-content: space-around; }\n .content-stretch-l { align-content: stretch; }\n\n .order-0-l { order: 0; }\n .order-1-l { order: 1; }\n .order-2-l { order: 2; }\n .order-3-l { order: 3; }\n .order-4-l { order: 4; }\n .order-5-l { order: 5; }\n .order-6-l { order: 6; }\n .order-7-l { order: 7; }\n .order-8-l { order: 8; }\n .order-last-l { order: 99999; }\n\n .flex-grow-0-l { flex-grow: 0; }\n .flex-grow-1-l { flex-grow: 1; }\n\n .flex-shrink-0-l { flex-shrink: 0; }\n .flex-shrink-1-l { flex-shrink: 1; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n DISPLAY\n Docs: http://tachyons.io/docs/layout/display\n\n Base:\n d = display\n\n Modifiers:\n n = none\n b = block\n ib = inline-block\n it = inline-table\n t = table\n tc = table-cell\n tr = table-row\n tcol = table-column\n tcolg = table-column-group\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.dn { display: none; }\n.di { display: inline; }\n.db { display: block; }\n.dib { display: inline-block; }\n.dit { display: inline-table; }\n.dt { display: table; }\n.dtc { display: table-cell; }\n.dt-row { display: table-row; }\n.dt-row-group { display: table-row-group; }\n.dt-column { display: table-column; }\n.dt-column-group { display: table-column-group; }\n\n/*\n This will set table to full width and then\n all cells will be equal width\n*/\n.dt--fixed {\n table-layout: fixed;\n width: 100%;\n}\n\n@media #{$breakpoint-not-small} {\n .dn-ns { display: none; }\n .di-ns { display: inline; }\n .db-ns { display: block; }\n .dib-ns { display: inline-block; }\n .dit-ns { display: inline-table; }\n .dt-ns { display: table; }\n .dtc-ns { display: table-cell; }\n .dt-row-ns { display: table-row; }\n .dt-row-group-ns { display: table-row-group; }\n .dt-column-ns { display: table-column; }\n .dt-column-group-ns { display: table-column-group; }\n\n .dt--fixed-ns {\n table-layout: fixed;\n width: 100%;\n }\n}\n\n@media #{$breakpoint-medium} {\n .dn-m { display: none; }\n .di-m { display: inline; }\n .db-m { display: block; }\n .dib-m { display: inline-block; }\n .dit-m { display: inline-table; }\n .dt-m { display: table; }\n .dtc-m { display: table-cell; }\n .dt-row-m { display: table-row; }\n .dt-row-group-m { display: table-row-group; }\n .dt-column-m { display: table-column; }\n .dt-column-group-m { display: table-column-group; }\n\n .dt--fixed-m {\n table-layout: fixed;\n width: 100%;\n }\n}\n\n@media #{$breakpoint-large} {\n .dn-l { display: none; }\n .di-l { display: inline; }\n .db-l { display: block; }\n .dib-l { display: inline-block; }\n .dit-l { display: inline-table; }\n .dt-l { display: table; }\n .dtc-l { display: table-cell; }\n .dt-row-l { display: table-row; }\n .dt-row-group-l { display: table-row-group; }\n .dt-column-l { display: table-column; }\n .dt-column-group-l { display: table-column-group; }\n\n .dt--fixed-l {\n table-layout: fixed;\n width: 100%;\n }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FLOATS\n http://tachyons.io/docs/layout/floats/\n\n 1. Floated elements are automatically rendered as block level elements.\n Setting floats to display inline will fix the double margin bug in\n ie6. You know... just in case.\n\n 2. Don't forget to clearfix your floats with .cf\n\n Base:\n f = float\n\n Modifiers:\n l = left\n r = right\n n = none\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n\n.fl { float: left; _display: inline; }\n.fr { float: right; _display: inline; }\n.fn { float: none; }\n\n@media #{$breakpoint-not-small} {\n .fl-ns { float: left; _display: inline; }\n .fr-ns { float: right; _display: inline; }\n .fn-ns { float: none; }\n}\n\n@media #{$breakpoint-medium} {\n .fl-m { float: left; _display: inline; }\n .fr-m { float: right; _display: inline; }\n .fn-m { float: none; }\n}\n\n@media #{$breakpoint-large} {\n .fl-l { float: left; _display: inline; }\n .fr-l { float: right; _display: inline; }\n .fn-l { float: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FONT FAMILY GROUPS\n Docs: http://tachyons.io/docs/typography/font-family/\n\n*/\n\n\n.sans-serif {\n font-family: $sans-serif;\n}\n\n.serif {\n font-family: $serif;\n}\n\n.system-sans-serif {\n font-family: sans-serif;\n}\n\n.system-serif {\n font-family: serif;\n}\n\n\n/* Monospaced Typefaces (for code) */\n\n/* From http://cssfontstack.com */\ncode, .code {\n font-family: Consolas,\n monaco,\n monospace;\n}\n\n.courier {\n font-family: 'Courier Next',\n courier,\n monospace;\n}\n\n\n/* Sans-Serif Typefaces */\n\n.helvetica {\n font-family: 'helvetica neue', helvetica,\n sans-serif;\n}\n\n.avenir {\n font-family: 'avenir next', avenir,\n sans-serif;\n}\n\n\n/* Serif Typefaces */\n\n.athelas {\n font-family: athelas,\n georgia,\n serif;\n}\n\n.georgia {\n font-family: georgia,\n serif;\n}\n\n.times {\n font-family: times,\n serif;\n}\n\n.bodoni {\n font-family: \"Bodoni MT\",\n serif;\n}\n\n.calisto {\n font-family: \"Calisto MT\",\n serif;\n}\n\n.garamond {\n font-family: garamond,\n serif;\n}\n\n.baskerville {\n font-family: baskerville,\n serif;\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FONT STYLE\n Docs: http://tachyons.io/docs/typography/font-style/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.i { font-style: italic; }\n.fs-normal { font-style: normal; }\n\n@media #{$breakpoint-not-small} {\n .i-ns { font-style: italic; }\n .fs-normal-ns { font-style: normal; }\n}\n\n@media #{$breakpoint-medium} {\n .i-m { font-style: italic; }\n .fs-normal-m { font-style: normal; }\n}\n\n@media #{$breakpoint-large} {\n .i-l { font-style: italic; }\n .fs-normal-l { font-style: normal; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FONT WEIGHT\n Docs: http://tachyons.io/docs/typography/font-weight/\n\n Base\n fw = font-weight\n\n Modifiers:\n 1 = literal value 100\n 2 = literal value 200\n 3 = literal value 300\n 4 = literal value 400\n 5 = literal value 500\n 6 = literal value 600\n 7 = literal value 700\n 8 = literal value 800\n 9 = literal value 900\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.normal { font-weight: normal; }\n.b { font-weight: bold; }\n.fw1 { font-weight: 100; }\n.fw2 { font-weight: 200; }\n.fw3 { font-weight: 300; }\n.fw4 { font-weight: 400; }\n.fw5 { font-weight: 500; }\n.fw6 { font-weight: 600; }\n.fw7 { font-weight: 700; }\n.fw8 { font-weight: 800; }\n.fw9 { font-weight: 900; }\n\n\n@media #{$breakpoint-not-small} {\n .normal-ns { font-weight: normal; }\n .b-ns { font-weight: bold; }\n .fw1-ns { font-weight: 100; }\n .fw2-ns { font-weight: 200; }\n .fw3-ns { font-weight: 300; }\n .fw4-ns { font-weight: 400; }\n .fw5-ns { font-weight: 500; }\n .fw6-ns { font-weight: 600; }\n .fw7-ns { font-weight: 700; }\n .fw8-ns { font-weight: 800; }\n .fw9-ns { font-weight: 900; }\n}\n\n@media #{$breakpoint-medium} {\n .normal-m { font-weight: normal; }\n .b-m { font-weight: bold; }\n .fw1-m { font-weight: 100; }\n .fw2-m { font-weight: 200; }\n .fw3-m { font-weight: 300; }\n .fw4-m { font-weight: 400; }\n .fw5-m { font-weight: 500; }\n .fw6-m { font-weight: 600; }\n .fw7-m { font-weight: 700; }\n .fw8-m { font-weight: 800; }\n .fw9-m { font-weight: 900; }\n}\n\n@media #{$breakpoint-large} {\n .normal-l { font-weight: normal; }\n .b-l { font-weight: bold; }\n .fw1-l { font-weight: 100; }\n .fw2-l { font-weight: 200; }\n .fw3-l { font-weight: 300; }\n .fw4-l { font-weight: 400; }\n .fw5-l { font-weight: 500; }\n .fw6-l { font-weight: 600; }\n .fw7-l { font-weight: 700; }\n .fw8-l { font-weight: 800; }\n .fw9-l { font-weight: 900; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n FORMS\n \n*/\n\n.input-reset {\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n\n.button-reset::-moz-focus-inner,\n.input-reset::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n HEIGHTS\n Docs: http://tachyons.io/docs/layout/heights/\n\n Base:\n h = height\n min-h = min-height\n min-vh = min-height vertical screen height\n vh = vertical screen height\n\n Modifiers\n 1 = 1st step in height scale\n 2 = 2nd step in height scale\n 3 = 3rd step in height scale\n 4 = 4th step in height scale\n 5 = 5th step in height scale\n\n -25 = literal value 25%\n -50 = literal value 50%\n -75 = literal value 75%\n -100 = literal value 100%\n\n -auto = string value of auto\n -inherit = string value of inherit\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n/* Height Scale */\n\n.h1 { height: $height-1; }\n.h2 { height: $height-2; }\n.h3 { height: $height-3; }\n.h4 { height: $height-4; }\n.h5 { height: $height-5; }\n\n/* Height Percentages - Based off of height of parent */\n\n.h-25 { height: 25%; }\n.h-50 { height: 50%; }\n.h-75 { height: 75%; }\n.h-100 { height: 100%; }\n\n.min-h-100 { min-height: 100%; }\n\n/* Screen Height Percentage */\n\n.vh-25 { height: 25vh; }\n.vh-50 { height: 50vh; }\n.vh-75 { height: 75vh; }\n.vh-100 { height: 100vh; }\n\n.min-vh-100 { min-height: 100vh; }\n\n\n/* String Properties */\n\n.h-auto { height: auto; }\n.h-inherit { height: inherit; }\n\n@media #{$breakpoint-not-small} {\n .h1-ns { height: $height-1; }\n .h2-ns { height: $height-2; }\n .h3-ns { height: $height-3; }\n .h4-ns { height: $height-4; }\n .h5-ns { height: $height-5; }\n .h-25-ns { height: 25%; }\n .h-50-ns { height: 50%; }\n .h-75-ns { height: 75%; }\n .h-100-ns { height: 100%; }\n .min-h-100-ns { min-height: 100%; }\n .vh-25-ns { height: 25vh; }\n .vh-50-ns { height: 50vh; }\n .vh-75-ns { height: 75vh; }\n .vh-100-ns { height: 100vh; }\n .min-vh-100-ns { min-height: 100vh; }\n .h-auto-ns { height: auto; }\n .h-inherit-ns { height: inherit; }\n}\n\n@media #{$breakpoint-medium} {\n .h1-m { height: $height-1; }\n .h2-m { height: $height-2; }\n .h3-m { height: $height-3; }\n .h4-m { height: $height-4; }\n .h5-m { height: $height-5; }\n .h-25-m { height: 25%; }\n .h-50-m { height: 50%; }\n .h-75-m { height: 75%; }\n .h-100-m { height: 100%; }\n .min-h-100-m { min-height: 100%; }\n .vh-25-m { height: 25vh; }\n .vh-50-m { height: 50vh; }\n .vh-75-m { height: 75vh; }\n .vh-100-m { height: 100vh; }\n .min-vh-100-m { min-height: 100vh; }\n .h-auto-m { height: auto; }\n .h-inherit-m { height: inherit; }\n}\n\n@media #{$breakpoint-large} {\n .h1-l { height: $height-1; }\n .h2-l { height: $height-2; }\n .h3-l { height: $height-3; }\n .h4-l { height: $height-4; }\n .h5-l { height: $height-5; }\n .h-25-l { height: 25%; }\n .h-50-l { height: 50%; }\n .h-75-l { height: 75%; }\n .h-100-l { height: 100%; }\n .min-h-100-l { min-height: 100%; }\n .vh-25-l { height: 25vh; }\n .vh-50-l { height: 50vh; }\n .vh-75-l { height: 75vh; }\n .vh-100-l { height: 100vh; }\n .min-vh-100-l { min-height: 100vh; }\n .h-auto-l { height: auto; }\n .h-inherit-l { height: inherit; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n LETTER SPACING\n Docs: http://tachyons.io/docs/typography/tracking/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.tracked { letter-spacing: $letter-spacing-1; }\n.tracked-tight { letter-spacing: $letter-spacing-tight; }\n.tracked-mega { letter-spacing: $letter-spacing-2; }\n\n@media #{$breakpoint-not-small} {\n .tracked-ns { letter-spacing: $letter-spacing-1; }\n .tracked-tight-ns { letter-spacing: $letter-spacing-tight; }\n .tracked-mega-ns { letter-spacing: $letter-spacing-2; }\n}\n\n@media #{$breakpoint-medium} {\n .tracked-m { letter-spacing: $letter-spacing-1; }\n .tracked-tight-m { letter-spacing: $letter-spacing-tight; }\n .tracked-mega-m { letter-spacing: $letter-spacing-2; }\n}\n\n@media #{$breakpoint-large} {\n .tracked-l { letter-spacing: $letter-spacing-1; }\n .tracked-tight-l { letter-spacing: $letter-spacing-tight; }\n .tracked-mega-l { letter-spacing: $letter-spacing-2; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n LINE HEIGHT / LEADING\n Docs: http://tachyons.io/docs/typography/line-height\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n .lh-solid { line-height: $line-height-solid; }\n .lh-title { line-height: $line-height-title; }\n .lh-copy { line-height: $line-height-copy; }\n\n@media #{$breakpoint-not-small} {\n .lh-solid-ns { line-height: $line-height-solid; }\n .lh-title-ns { line-height: $line-height-title; }\n .lh-copy-ns { line-height: $line-height-copy; }\n}\n\n@media #{$breakpoint-medium} {\n .lh-solid-m { line-height: $line-height-solid; }\n .lh-title-m { line-height: $line-height-title; }\n .lh-copy-m { line-height: $line-height-copy; }\n}\n\n@media #{$breakpoint-large} {\n .lh-solid-l { line-height: $line-height-solid; }\n .lh-title-l { line-height: $line-height-title; }\n .lh-copy-l { line-height: $line-height-copy; }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n LINKS\n Docs: http://tachyons.io/docs/elements/links/\n\n*/\n\n.link {\n text-decoration: none;\n transition: color .15s ease-in;\n}\n\n.link:link,\n.link:visited {\n transition: color .15s ease-in;\n}\n.link:hover {\n transition: color .15s ease-in;\n}\n.link:active {\n transition: color .15s ease-in;\n}\n.link:focus {\n transition: color .15s ease-in;\n outline: 1px dotted currentColor;\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n LISTS\n http://tachyons.io/docs/elements/lists/\n\n*/\n\n.list { list-style-type: none; }\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n MAX WIDTHS\n Docs: http://tachyons.io/docs/layout/max-widths/\n\n Base:\n mw = max-width\n\n Modifiers\n 1 = 1st step in width scale\n 2 = 2nd step in width scale\n 3 = 3rd step in width scale\n 4 = 4th step in width scale\n 5 = 5th step in width scale\n 6 = 6st step in width scale\n 7 = 7nd step in width scale\n 8 = 8rd step in width scale\n 9 = 9th step in width scale\n\n -100 = literal value 100%\n\n -none = string value none\n\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n/* Max Width Percentages */\n\n.mw-100 { max-width: 100%; }\n\n/* Max Width Scale */\n\n.mw1 { max-width: $max-width-1; }\n.mw2 { max-width: $max-width-2; }\n.mw3 { max-width: $max-width-3; }\n.mw4 { max-width: $max-width-4; }\n.mw5 { max-width: $max-width-5; }\n.mw6 { max-width: $max-width-6; }\n.mw7 { max-width: $max-width-7; }\n.mw8 { max-width: $max-width-8; }\n.mw9 { max-width: $max-width-9; }\n\n/* Max Width String Properties */\n\n.mw-none { max-width: none; }\n\n@media #{$breakpoint-not-small} {\n .mw-100-ns { max-width: 100%; }\n\n .mw1-ns { max-width: $max-width-1; }\n .mw2-ns { max-width: $max-width-2; }\n .mw3-ns { max-width: $max-width-3; }\n .mw4-ns { max-width: $max-width-4; }\n .mw5-ns { max-width: $max-width-5; }\n .mw6-ns { max-width: $max-width-6; }\n .mw7-ns { max-width: $max-width-7; }\n .mw8-ns { max-width: $max-width-8; }\n .mw9-ns { max-width: $max-width-9; }\n\n .mw-none-ns { max-width: none; }\n}\n\n@media #{$breakpoint-medium} {\n .mw-100-m { max-width: 100%; }\n\n .mw1-m { max-width: $max-width-1; }\n .mw2-m { max-width: $max-width-2; }\n .mw3-m { max-width: $max-width-3; }\n .mw4-m { max-width: $max-width-4; }\n .mw5-m { max-width: $max-width-5; }\n .mw6-m { max-width: $max-width-6; }\n .mw7-m { max-width: $max-width-7; }\n .mw8-m { max-width: $max-width-8; }\n .mw9-m { max-width: $max-width-9; }\n\n .mw-none-m { max-width: none; }\n}\n\n@media #{$breakpoint-large} {\n .mw-100-l { max-width: 100%; }\n\n .mw1-l { max-width: $max-width-1; }\n .mw2-l { max-width: $max-width-2; }\n .mw3-l { max-width: $max-width-3; }\n .mw4-l { max-width: $max-width-4; }\n .mw5-l { max-width: $max-width-5; }\n .mw6-l { max-width: $max-width-6; }\n .mw7-l { max-width: $max-width-7; }\n .mw8-l { max-width: $max-width-8; }\n .mw9-l { max-width: $max-width-9; }\n\n .mw-none-l { max-width: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n WIDTHS\n Docs: http://tachyons.io/docs/layout/widths/\n\n Base:\n w = width\n\n Modifiers\n 1 = 1st step in width scale\n 2 = 2nd step in width scale\n 3 = 3rd step in width scale\n 4 = 4th step in width scale\n 5 = 5th step in width scale\n\n -10 = literal value 10%\n -20 = literal value 20%\n -25 = literal value 25%\n -30 = literal value 30%\n -33 = literal value 33%\n -34 = literal value 34%\n -40 = literal value 40%\n -50 = literal value 50%\n -60 = literal value 60%\n -70 = literal value 70%\n -75 = literal value 75%\n -80 = literal value 80%\n -90 = literal value 90%\n -100 = literal value 100%\n\n -third = 100% / 3 (Not supported in opera mini or IE8)\n -two-thirds = 100% / 1.5 (Not supported in opera mini or IE8)\n -auto = string value auto\n\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n/* Width Scale */\n\n.w1 { width: $width-1; }\n.w2 { width: $width-2; }\n.w3 { width: $width-3; }\n.w4 { width: $width-4; }\n.w5 { width: $width-5; }\n\n.w-10 { width: 10%; }\n.w-20 { width: 20%; }\n.w-25 { width: 25%; }\n.w-30 { width: 30%; }\n.w-33 { width: 33%; }\n.w-34 { width: 34%; }\n.w-40 { width: 40%; }\n.w-50 { width: 50%; }\n.w-60 { width: 60%; }\n.w-70 { width: 70%; }\n.w-75 { width: 75%; }\n.w-80 { width: 80%; }\n.w-90 { width: 90%; }\n.w-100 { width: 100%; }\n\n.w-third { width: (100% / 3); }\n.w-two-thirds { width: (100% / 1.5); }\n.w-auto { width: auto; }\n\n@media #{$breakpoint-not-small} {\n .w1-ns { width: $width-1; }\n .w2-ns { width: $width-2; }\n .w3-ns { width: $width-3; }\n .w4-ns { width: $width-4; }\n .w5-ns { width: $width-5; }\n .w-10-ns { width: 10%; }\n .w-20-ns { width: 20%; }\n .w-25-ns { width: 25%; }\n .w-30-ns { width: 30%; }\n .w-33-ns { width: 33%; }\n .w-34-ns { width: 34%; }\n .w-40-ns { width: 40%; }\n .w-50-ns { width: 50%; }\n .w-60-ns { width: 60%; }\n .w-70-ns { width: 70%; }\n .w-75-ns { width: 75%; }\n .w-80-ns { width: 80%; }\n .w-90-ns { width: 90%; }\n .w-100-ns { width: 100%; }\n .w-third-ns { width: (100% / 3); }\n .w-two-thirds-ns { width: (100% / 1.5); }\n .w-auto-ns { width: auto; }\n}\n\n@media #{$breakpoint-medium} {\n .w1-m { width: $width-1; }\n .w2-m { width: $width-2; }\n .w3-m { width: $width-3; }\n .w4-m { width: $width-4; }\n .w5-m { width: $width-5; }\n .w-10-m { width: 10%; }\n .w-20-m { width: 20%; }\n .w-25-m { width: 25%; }\n .w-30-m { width: 30%; }\n .w-33-m { width: 33%; }\n .w-34-m { width: 34%; }\n .w-40-m { width: 40%; }\n .w-50-m { width: 50%; }\n .w-60-m { width: 60%; }\n .w-70-m { width: 70%; }\n .w-75-m { width: 75%; }\n .w-80-m { width: 80%; }\n .w-90-m { width: 90%; }\n .w-100-m { width: 100%; }\n .w-third-m { width: (100% / 3); }\n .w-two-thirds-m { width: (100% / 1.5); }\n .w-auto-m { width: auto; }\n}\n\n@media #{$breakpoint-large} {\n .w1-l { width: $width-1; }\n .w2-l { width: $width-2; }\n .w3-l { width: $width-3; }\n .w4-l { width: $width-4; }\n .w5-l { width: $width-5; }\n .w-10-l { width: 10%; }\n .w-20-l { width: 20%; }\n .w-25-l { width: 25%; }\n .w-30-l { width: 30%; }\n .w-33-l { width: 33%; }\n .w-34-l { width: 34%; }\n .w-40-l { width: 40%; }\n .w-50-l { width: 50%; }\n .w-60-l { width: 60%; }\n .w-70-l { width: 70%; }\n .w-75-l { width: 75%; }\n .w-80-l { width: 80%; }\n .w-90-l { width: 90%; }\n .w-100-l { width: 100%; }\n .w-third-l { width: (100% / 3); }\n .w-two-thirds-l { width: (100% / 1.5); }\n .w-auto-l { width: auto; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n OVERFLOW\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n */\n\n.overflow-visible { overflow: visible; }\n.overflow-hidden { overflow: hidden; }\n.overflow-scroll { overflow: scroll; }\n.overflow-auto { overflow: auto; }\n\n.overflow-x-visible { overflow-x: visible; }\n.overflow-x-hidden { overflow-x: hidden; }\n.overflow-x-scroll { overflow-x: scroll; }\n.overflow-x-auto { overflow-x: auto; }\n\n.overflow-y-visible { overflow-y: visible; }\n.overflow-y-hidden { overflow-y: hidden; }\n.overflow-y-scroll { overflow-y: scroll; }\n.overflow-y-auto { overflow-y: auto; }\n\n@media #{$breakpoint-not-small} {\n .overflow-visible-ns { overflow: visible; }\n .overflow-hidden-ns { overflow: hidden; }\n .overflow-scroll-ns { overflow: scroll; }\n .overflow-auto-ns { overflow: auto; }\n .overflow-x-visible-ns { overflow-x: visible; }\n .overflow-x-hidden-ns { overflow-x: hidden; }\n .overflow-x-scroll-ns { overflow-x: scroll; }\n .overflow-x-auto-ns { overflow-x: auto; }\n\n .overflow-y-visible-ns { overflow-y: visible; }\n .overflow-y-hidden-ns { overflow-y: hidden; }\n .overflow-y-scroll-ns { overflow-y: scroll; }\n .overflow-y-auto-ns { overflow-y: auto; }\n}\n\n@media #{$breakpoint-medium} {\n .overflow-visible-m { overflow: visible; }\n .overflow-hidden-m { overflow: hidden; }\n .overflow-scroll-m { overflow: scroll; }\n .overflow-auto-m { overflow: auto; }\n\n .overflow-x-visible-m { overflow-x: visible; }\n .overflow-x-hidden-m { overflow-x: hidden; }\n .overflow-x-scroll-m { overflow-x: scroll; }\n .overflow-x-auto-m { overflow-x: auto; }\n\n .overflow-y-visible-m { overflow-y: visible; }\n .overflow-y-hidden-m { overflow-y: hidden; }\n .overflow-y-scroll-m { overflow-y: scroll; }\n .overflow-y-auto-m { overflow-y: auto; }\n}\n\n@media #{$breakpoint-large} {\n .overflow-visible-l { overflow: visible; }\n .overflow-hidden-l { overflow: hidden; }\n .overflow-scroll-l { overflow: scroll; }\n .overflow-auto-l { overflow: auto; }\n\n .overflow-x-visible-l { overflow-x: visible; }\n .overflow-x-hidden-l { overflow-x: hidden; }\n .overflow-x-scroll-l { overflow-x: scroll; }\n .overflow-x-auto-l { overflow-x: auto; }\n\n .overflow-y-visible-l { overflow-y: visible; }\n .overflow-y-hidden-l { overflow-y: hidden; }\n .overflow-y-scroll-l { overflow-y: scroll; }\n .overflow-y-auto-l { overflow-y: auto; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n POSITIONING\n Docs: http://tachyons.io/docs/layout/position/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.static { position: static; }\n.relative { position: relative; }\n.absolute { position: absolute; }\n.fixed { position: fixed; }\n\n@media #{$breakpoint-not-small} {\n .static-ns { position: static; }\n .relative-ns { position: relative; }\n .absolute-ns { position: absolute; }\n .fixed-ns { position: fixed; }\n}\n\n@media #{$breakpoint-medium} {\n .static-m { position: static; }\n .relative-m { position: relative; }\n .absolute-m { position: absolute; }\n .fixed-m { position: fixed; }\n}\n\n@media #{$breakpoint-large} {\n .static-l { position: static; }\n .relative-l { position: relative; }\n .absolute-l { position: absolute; }\n .fixed-l { position: fixed; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n OPACITY\n Docs: http://tachyons.io/docs/themes/opacity/\n\n*/\n\n.o-100 { opacity: 1; }\n.o-90 { opacity: .9; }\n.o-80 { opacity: .8; }\n.o-70 { opacity: .7; }\n.o-60 { opacity: .6; }\n.o-50 { opacity: .5; }\n.o-40 { opacity: .4; }\n.o-30 { opacity: .3; }\n.o-20 { opacity: .2; }\n.o-10 { opacity: .1; }\n.o-05 { opacity: .05; }\n.o-025 { opacity: .025; }\n.o-0 { opacity: 0; }\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n ROTATIONS\n\n*/\n\n.rotate-45 { transform: rotate(45deg); }\n.rotate-90 { transform: rotate(90deg); }\n.rotate-135 { transform: rotate(135deg); }\n.rotate-180 { transform: rotate(180deg); }\n.rotate-225 { transform: rotate(225deg); }\n.rotate-270 { transform: rotate(270deg); }\n.rotate-315 { transform: rotate(315deg); }\n\n@media #{$breakpoint-not-small}{\n .rotate-45-ns { transform: rotate(45deg); }\n .rotate-90-ns { transform: rotate(90deg); }\n .rotate-135-ns { transform: rotate(135deg); }\n .rotate-180-ns { transform: rotate(180deg); }\n .rotate-225-ns { transform: rotate(225deg); }\n .rotate-270-ns { transform: rotate(270deg); }\n .rotate-315-ns { transform: rotate(315deg); }\n}\n\n@media #{$breakpoint-medium}{\n .rotate-45-m { transform: rotate(45deg); }\n .rotate-90-m { transform: rotate(90deg); }\n .rotate-135-m { transform: rotate(135deg); }\n .rotate-180-m { transform: rotate(180deg); }\n .rotate-225-m { transform: rotate(225deg); }\n .rotate-270-m { transform: rotate(270deg); }\n .rotate-315-m { transform: rotate(315deg); }\n}\n\n@media #{$breakpoint-large}{\n .rotate-45-l { transform: rotate(45deg); }\n .rotate-90-l { transform: rotate(90deg); }\n .rotate-135-l { transform: rotate(135deg); }\n .rotate-180-l { transform: rotate(180deg); }\n .rotate-225-l { transform: rotate(225deg); }\n .rotate-270-l { transform: rotate(270deg); }\n .rotate-315-l { transform: rotate(315deg); }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n SKINS\n Docs: http://tachyons.io/docs/themes/skins/\n\n Classes for setting foreground and background colors on elements.\n If you haven't declared a border color, but set border on an element, it will\n be set to the current text color.\n\n*/\n\n/* Text colors */\n\n.black-90 { color: $black-90; }\n.black-80 { color: $black-80; }\n.black-70 { color: $black-70; }\n.black-60 { color: $black-60; }\n.black-50 { color: $black-50; }\n.black-40 { color: $black-40; }\n.black-30 { color: $black-30; }\n.black-20 { color: $black-20; }\n.black-10 { color: $black-10; }\n.black-05 { color: $black-05; }\n\n.white-90 { color: $white-90; }\n.white-80 { color: $white-80; }\n.white-70 { color: $white-70; }\n.white-60 { color: $white-60; }\n.white-50 { color: $white-50; }\n.white-40 { color: $white-40; }\n.white-30 { color: $white-30; }\n.white-20 { color: $white-20; }\n.white-10 { color: $white-10; }\n\n.black { color: $black; }\n.near-black { color: $near-black; }\n.dark-gray { color: $dark-gray; }\n.mid-gray { color: $mid-gray; }\n.gray { color: $gray; }\n.silver { color: $silver; }\n.light-silver { color: $light-silver; }\n.moon-gray { color: $moon-gray; }\n.light-gray { color: $light-gray; }\n.near-white { color: $near-white; }\n.white { color: $white; }\n\n.dark-red { color: $dark-red; }\n.red { color: $red; }\n.light-red { color: $light-red; }\n.orange { color: $orange; }\n.gold { color: $gold; }\n.yellow { color: $yellow; }\n.light-yellow { color: $light-yellow; }\n.purple { color: $purple; }\n.light-purple { color: $light-purple; }\n.dark-pink { color: $dark-pink; }\n.hot-pink { color: $hot-pink; }\n.pink { color: $pink; }\n.light-pink { color: $light-pink; }\n.dark-green { color: $dark-green; }\n.green { color: $green; }\n.light-green { color: $light-green; }\n.navy { color: $navy; }\n.dark-blue { color: $dark-blue; }\n.blue { color: $blue; }\n.light-blue { color: $light-blue; }\n.lightest-blue { color: $lightest-blue; }\n.washed-blue { color: $washed-blue; }\n.washed-green { color: $washed-green; }\n.washed-yellow { color: $washed-yellow; }\n.washed-red { color: $washed-red; }\n.color-inherit { color: inherit; }\n\n.bg-black-90 { background-color: $black-90; }\n.bg-black-80 { background-color: $black-80; }\n.bg-black-70 { background-color: $black-70; }\n.bg-black-60 { background-color: $black-60; }\n.bg-black-50 { background-color: $black-50; }\n.bg-black-40 { background-color: $black-40; }\n.bg-black-30 { background-color: $black-30; }\n.bg-black-20 { background-color: $black-20; }\n.bg-black-10 { background-color: $black-10; }\n.bg-black-05 { background-color: $black-05; }\n.bg-white-90 { background-color: $white-90; }\n.bg-white-80 { background-color: $white-80; }\n.bg-white-70 { background-color: $white-70; }\n.bg-white-60 { background-color: $white-60; }\n.bg-white-50 { background-color: $white-50; }\n.bg-white-40 { background-color: $white-40; }\n.bg-white-30 { background-color: $white-30; }\n.bg-white-20 { background-color: $white-20; }\n.bg-white-10 { background-color: $white-10; }\n\n\n\n/* Background colors */\n\n.bg-black { background-color: $black; }\n.bg-near-black { background-color: $near-black; }\n.bg-dark-gray { background-color: $dark-gray; }\n.bg-mid-gray { background-color: $mid-gray; }\n.bg-gray { background-color: $gray; }\n.bg-silver { background-color: $silver; }\n.bg-light-silver { background-color: $light-silver; }\n.bg-moon-gray { background-color: $moon-gray; }\n.bg-light-gray { background-color: $light-gray; }\n.bg-near-white { background-color: $near-white; }\n.bg-white { background-color: $white; }\n.bg-transparent { background-color: $transparent; }\n\n.bg-dark-red { background-color: $dark-red; }\n.bg-red { background-color: $red; }\n.bg-light-red { background-color: $light-red; }\n.bg-orange { background-color: $orange; }\n.bg-gold { background-color: $gold; }\n.bg-yellow { background-color: $yellow; }\n.bg-light-yellow { background-color: $light-yellow; }\n.bg-purple { background-color: $purple; }\n.bg-light-purple { background-color: $light-purple; }\n.bg-dark-pink { background-color: $dark-pink; }\n.bg-hot-pink { background-color: $hot-pink; }\n.bg-pink { background-color: $pink; }\n.bg-light-pink { background-color: $light-pink; }\n.bg-dark-green { background-color: $dark-green; }\n.bg-green { background-color: $green; }\n.bg-light-green { background-color: $light-green; }\n.bg-navy { background-color: $navy; }\n.bg-dark-blue { background-color: $dark-blue; }\n.bg-blue { background-color: $blue; }\n.bg-light-blue { background-color: $light-blue; }\n.bg-lightest-blue { background-color: $lightest-blue; }\n.bg-washed-blue { background-color: $washed-blue; }\n.bg-washed-green { background-color: $washed-green; }\n.bg-washed-yellow { background-color: $washed-yellow; }\n.bg-washed-red { background-color: $washed-red; }\n.bg-inherit { background-color: inherit; }\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n SKINS:PSEUDO\n\n Customize the color of an element when\n it is focused or hovered over.\n\n */\n\n.hover-black:hover,\n.hover-black:focus { color: $black; }\n.hover-near-black:hover,\n.hover-near-black:focus { color: $near-black; }\n.hover-dark-gray:hover,\n.hover-dark-gray:focus { color: $dark-gray; }\n.hover-mid-gray:hover,\n.hover-mid-gray:focus { color: $mid-gray; }\n.hover-gray:hover,\n.hover-gray:focus { color: $gray; }\n.hover-silver:hover,\n.hover-silver:focus { color: $silver; }\n.hover-light-silver:hover,\n.hover-light-silver:focus { color: $light-silver; }\n.hover-moon-gray:hover,\n.hover-moon-gray:focus { color: $moon-gray; }\n.hover-light-gray:hover,\n.hover-light-gray:focus { color: $light-gray; }\n.hover-near-white:hover,\n.hover-near-white:focus { color: $near-white; }\n.hover-white:hover,\n.hover-white:focus { color: $white; }\n\n.hover-black-90:hover,\n.hover-black-90:focus { color: $black-90; }\n.hover-black-80:hover,\n.hover-black-80:focus { color: $black-80; }\n.hover-black-70:hover,\n.hover-black-70:focus { color: $black-70; }\n.hover-black-60:hover,\n.hover-black-60:focus { color: $black-60; }\n.hover-black-50:hover,\n.hover-black-50:focus { color: $black-50; }\n.hover-black-40:hover,\n.hover-black-40:focus { color: $black-40; }\n.hover-black-30:hover,\n.hover-black-30:focus { color: $black-30; }\n.hover-black-20:hover,\n.hover-black-20:focus { color: $black-20; }\n.hover-black-10:hover,\n.hover-black-10:focus { color: $black-10; }\n.hover-white-90:hover,\n.hover-white-90:focus { color: $white-90; }\n.hover-white-80:hover,\n.hover-white-80:focus { color: $white-80; }\n.hover-white-70:hover,\n.hover-white-70:focus { color: $white-70; }\n.hover-white-60:hover,\n.hover-white-60:focus { color: $white-60; }\n.hover-white-50:hover,\n.hover-white-50:focus { color: $white-50; }\n.hover-white-40:hover,\n.hover-white-40:focus { color: $white-40; }\n.hover-white-30:hover,\n.hover-white-30:focus { color: $white-30; }\n.hover-white-20:hover,\n.hover-white-20:focus { color: $white-20; }\n.hover-white-10:hover,\n.hover-white-10:focus { color: $white-10; }\n.hover-inherit:hover,\n.hover-inherit:focus { color: inherit; }\n\n.hover-bg-black:hover,\n.hover-bg-black:focus { background-color: $black; }\n.hover-bg-near-black:hover,\n.hover-bg-near-black:focus { background-color: $near-black; }\n.hover-bg-dark-gray:hover,\n.hover-bg-dark-gray:focus { background-color: $dark-gray; }\n.hover-bg-mid-gray:hover,\n.hover-bg-mid-gray:focus { background-color: $mid-gray; }\n.hover-bg-gray:hover,\n.hover-bg-gray:focus { background-color: $gray; }\n.hover-bg-silver:hover,\n.hover-bg-silver:focus { background-color: $silver; }\n.hover-bg-light-silver:hover,\n.hover-bg-light-silver:focus { background-color: $light-silver; }\n.hover-bg-moon-gray:hover,\n.hover-bg-moon-gray:focus { background-color: $moon-gray; }\n.hover-bg-light-gray:hover,\n.hover-bg-light-gray:focus { background-color: $light-gray; }\n.hover-bg-near-white:hover,\n.hover-bg-near-white:focus { background-color: $near-white; }\n.hover-bg-white:hover,\n.hover-bg-white:focus { background-color: $white; }\n.hover-bg-transparent:hover,\n.hover-bg-transparent:focus { background-color: $transparent; }\n\n.hover-bg-black-90:hover,\n.hover-bg-black-90:focus { background-color: $black-90; }\n.hover-bg-black-80:hover,\n.hover-bg-black-80:focus { background-color: $black-80; }\n.hover-bg-black-70:hover,\n.hover-bg-black-70:focus { background-color: $black-70; }\n.hover-bg-black-60:hover,\n.hover-bg-black-60:focus { background-color: $black-60; }\n.hover-bg-black-50:hover,\n.hover-bg-black-50:focus { background-color: $black-50; }\n.hover-bg-black-40:hover,\n.hover-bg-black-40:focus { background-color: $black-40; }\n.hover-bg-black-30:hover,\n.hover-bg-black-30:focus { background-color: $black-30; }\n.hover-bg-black-20:hover,\n.hover-bg-black-20:focus { background-color: $black-20; }\n.hover-bg-black-10:hover,\n.hover-bg-black-10:focus { background-color: $black-10; }\n.hover-bg-white-90:hover,\n.hover-bg-white-90:focus { background-color: $white-90; }\n.hover-bg-white-80:hover,\n.hover-bg-white-80:focus { background-color: $white-80; }\n.hover-bg-white-70:hover,\n.hover-bg-white-70:focus { background-color: $white-70; }\n.hover-bg-white-60:hover,\n.hover-bg-white-60:focus { background-color: $white-60; }\n.hover-bg-white-50:hover,\n.hover-bg-white-50:focus { background-color: $white-50; }\n.hover-bg-white-40:hover,\n.hover-bg-white-40:focus { background-color: $white-40; }\n.hover-bg-white-30:hover,\n.hover-bg-white-30:focus { background-color: $white-30; }\n.hover-bg-white-20:hover,\n.hover-bg-white-20:focus { background-color: $white-20; }\n.hover-bg-white-10:hover,\n.hover-bg-white-10:focus { background-color: $white-10; }\n\n.hover-dark-red:hover,\n.hover-dark-red:focus { color: $dark-red; }\n.hover-red:hover,\n.hover-red:focus { color: $red; }\n.hover-light-red:hover,\n.hover-light-red:focus { color: $light-red; }\n.hover-orange:hover,\n.hover-orange:focus { color: $orange; }\n.hover-gold:hover,\n.hover-gold:focus { color: $gold; }\n.hover-yellow:hover,\n.hover-yellow:focus { color: $yellow; }\n.hover-light-yellow:hover,\n.hover-light-yellow:focus { color: $light-yellow; }\n.hover-purple:hover,\n.hover-purple:focus { color: $purple; }\n.hover-light-purple:hover,\n.hover-light-purple:focus { color: $light-purple; }\n.hover-dark-pink:hover,\n.hover-dark-pink:focus { color: $dark-pink; }\n.hover-hot-pink:hover,\n.hover-hot-pink:focus { color: $hot-pink; }\n.hover-pink:hover,\n.hover-pink:focus { color: $pink; }\n.hover-light-pink:hover,\n.hover-light-pink:focus { color: $light-pink; }\n.hover-dark-green:hover,\n.hover-dark-green:focus { color: $dark-green; }\n.hover-green:hover,\n.hover-green:focus { color: $green; }\n.hover-light-green:hover,\n.hover-light-green:focus { color: $light-green; }\n.hover-navy:hover,\n.hover-navy:focus { color: $navy; }\n.hover-dark-blue:hover,\n.hover-dark-blue:focus { color: $dark-blue; }\n.hover-blue:hover,\n.hover-blue:focus { color: $blue; }\n.hover-light-blue:hover,\n.hover-light-blue:focus { color: $light-blue; }\n.hover-lightest-blue:hover,\n.hover-lightest-blue:focus { color: $lightest-blue; }\n.hover-washed-blue:hover,\n.hover-washed-blue:focus { color: $washed-blue; }\n.hover-washed-green:hover,\n.hover-washed-green:focus { color: $washed-green; }\n.hover-washed-yellow:hover,\n.hover-washed-yellow:focus { color: $washed-yellow; }\n.hover-washed-red:hover,\n.hover-washed-red:focus { color: $washed-red; }\n\n.hover-bg-dark-red:hover,\n.hover-bg-dark-red:focus { background-color: $dark-red; }\n.hover-bg-red:hover,\n.hover-bg-red:focus { background-color: $red; }\n.hover-bg-light-red:hover,\n.hover-bg-light-red:focus { background-color: $light-red; }\n.hover-bg-orange:hover,\n.hover-bg-orange:focus { background-color: $orange; }\n.hover-bg-gold:hover,\n.hover-bg-gold:focus { background-color: $gold; }\n.hover-bg-yellow:hover,\n.hover-bg-yellow:focus { background-color: $yellow; }\n.hover-bg-light-yellow:hover,\n.hover-bg-light-yellow:focus { background-color: $light-yellow; }\n.hover-bg-purple:hover,\n.hover-bg-purple:focus { background-color: $purple; }\n.hover-bg-light-purple:hover,\n.hover-bg-light-purple:focus { background-color: $light-purple; }\n.hover-bg-dark-pink:hover,\n.hover-bg-dark-pink:focus { background-color: $dark-pink; }\n.hover-bg-hot-pink:hover,\n.hover-bg-hot-pink:focus { background-color: $hot-pink; }\n.hover-bg-pink:hover,\n.hover-bg-pink:focus { background-color: $pink; }\n.hover-bg-light-pink:hover,\n.hover-bg-light-pink:focus { background-color: $light-pink; }\n.hover-bg-dark-green:hover,\n.hover-bg-dark-green:focus { background-color: $dark-green; }\n.hover-bg-green:hover,\n.hover-bg-green:focus { background-color: $green; }\n.hover-bg-light-green:hover,\n.hover-bg-light-green:focus { background-color: $light-green; }\n.hover-bg-navy:hover,\n.hover-bg-navy:focus { background-color: $navy; }\n.hover-bg-dark-blue:hover,\n.hover-bg-dark-blue:focus { background-color: $dark-blue; }\n.hover-bg-blue:hover,\n.hover-bg-blue:focus { background-color: $blue; }\n.hover-bg-light-blue:hover,\n.hover-bg-light-blue:focus { background-color: $light-blue; }\n.hover-bg-lightest-blue:hover,\n.hover-bg-lightest-blue:focus { background-color: $lightest-blue; }\n.hover-bg-washed-blue:hover,\n.hover-bg-washed-blue:focus { background-color: $washed-blue; }\n.hover-bg-washed-green:hover,\n.hover-bg-washed-green:focus { background-color: $washed-green; }\n.hover-bg-washed-yellow:hover,\n.hover-bg-washed-yellow:focus { background-color: $washed-yellow; }\n.hover-bg-washed-red:hover,\n.hover-bg-washed-red:focus { background-color: $washed-red; }\n.hover-bg-inherit:hover,\n.hover-bg-inherit:focus { background-color: inherit; }\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/* Variables */\n\n/*\n SPACING\n Docs: http://tachyons.io/docs/layout/spacing/\n\n An eight step powers of two scale ranging from 0 to 16rem.\n\n Base:\n p = padding\n m = margin\n\n Modifiers:\n a = all\n h = horizontal\n v = vertical\n t = top\n r = right\n b = bottom\n l = left\n\n 0 = none\n 1 = 1st step in spacing scale\n 2 = 2nd step in spacing scale\n 3 = 3rd step in spacing scale\n 4 = 4th step in spacing scale\n 5 = 5th step in spacing scale\n 6 = 6th step in spacing scale\n 7 = 7th step in spacing scale\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n.pa0 { padding: $spacing-none; }\n.pa1 { padding: $spacing-extra-small; }\n.pa2 { padding: $spacing-small; }\n.pa3 { padding: $spacing-medium; }\n.pa4 { padding: $spacing-large; }\n.pa5 { padding: $spacing-extra-large; }\n.pa6 { padding: $spacing-extra-extra-large; }\n.pa7 { padding: $spacing-extra-extra-extra-large; }\n\n.pl0 { padding-left: $spacing-none; }\n.pl1 { padding-left: $spacing-extra-small; }\n.pl2 { padding-left: $spacing-small; }\n.pl3 { padding-left: $spacing-medium; }\n.pl4 { padding-left: $spacing-large; }\n.pl5 { padding-left: $spacing-extra-large; }\n.pl6 { padding-left: $spacing-extra-extra-large; }\n.pl7 { padding-left: $spacing-extra-extra-extra-large; }\n\n.pr0 { padding-right: $spacing-none; }\n.pr1 { padding-right: $spacing-extra-small; }\n.pr2 { padding-right: $spacing-small; }\n.pr3 { padding-right: $spacing-medium; }\n.pr4 { padding-right: $spacing-large; }\n.pr5 { padding-right: $spacing-extra-large; }\n.pr6 { padding-right: $spacing-extra-extra-large; }\n.pr7 { padding-right: $spacing-extra-extra-extra-large; }\n\n.pb0 { padding-bottom: $spacing-none; }\n.pb1 { padding-bottom: $spacing-extra-small; }\n.pb2 { padding-bottom: $spacing-small; }\n.pb3 { padding-bottom: $spacing-medium; }\n.pb4 { padding-bottom: $spacing-large; }\n.pb5 { padding-bottom: $spacing-extra-large; }\n.pb6 { padding-bottom: $spacing-extra-extra-large; }\n.pb7 { padding-bottom: $spacing-extra-extra-extra-large; }\n\n.pt0 { padding-top: $spacing-none; }\n.pt1 { padding-top: $spacing-extra-small; }\n.pt2 { padding-top: $spacing-small; }\n.pt3 { padding-top: $spacing-medium; }\n.pt4 { padding-top: $spacing-large; }\n.pt5 { padding-top: $spacing-extra-large; }\n.pt6 { padding-top: $spacing-extra-extra-large; }\n.pt7 { padding-top: $spacing-extra-extra-extra-large; }\n\n.pv0 {\n padding-top: $spacing-none;\n padding-bottom: $spacing-none;\n}\n.pv1 {\n padding-top: $spacing-extra-small;\n padding-bottom: $spacing-extra-small;\n}\n.pv2 {\n padding-top: $spacing-small;\n padding-bottom: $spacing-small;\n}\n.pv3 {\n padding-top: $spacing-medium;\n padding-bottom: $spacing-medium;\n}\n.pv4 {\n padding-top: $spacing-large;\n padding-bottom: $spacing-large;\n}\n.pv5 {\n padding-top: $spacing-extra-large;\n padding-bottom: $spacing-extra-large;\n}\n.pv6 {\n padding-top: $spacing-extra-extra-large;\n padding-bottom: $spacing-extra-extra-large;\n}\n\n.pv7 {\n padding-top: $spacing-extra-extra-extra-large;\n padding-bottom: $spacing-extra-extra-extra-large;\n}\n\n.ph0 {\n padding-left: $spacing-none;\n padding-right: $spacing-none;\n}\n\n.ph1 {\n padding-left: $spacing-extra-small;\n padding-right: $spacing-extra-small;\n}\n\n.ph2 {\n padding-left: $spacing-small;\n padding-right: $spacing-small;\n}\n\n.ph3 {\n padding-left: $spacing-medium;\n padding-right: $spacing-medium;\n}\n\n.ph4 {\n padding-left: $spacing-large;\n padding-right: $spacing-large;\n}\n\n.ph5 {\n padding-left: $spacing-extra-large;\n padding-right: $spacing-extra-large;\n}\n\n.ph6 {\n padding-left: $spacing-extra-extra-large;\n padding-right: $spacing-extra-extra-large;\n}\n\n.ph7 {\n padding-left: $spacing-extra-extra-extra-large;\n padding-right: $spacing-extra-extra-extra-large;\n}\n\n.ma0 { margin: $spacing-none; }\n.ma1 { margin: $spacing-extra-small; }\n.ma2 { margin: $spacing-small; }\n.ma3 { margin: $spacing-medium; }\n.ma4 { margin: $spacing-large; }\n.ma5 { margin: $spacing-extra-large; }\n.ma6 { margin: $spacing-extra-extra-large; }\n.ma7 { margin: $spacing-extra-extra-extra-large; }\n\n.ml0 { margin-left: $spacing-none; }\n.ml1 { margin-left: $spacing-extra-small; }\n.ml2 { margin-left: $spacing-small; }\n.ml3 { margin-left: $spacing-medium; }\n.ml4 { margin-left: $spacing-large; }\n.ml5 { margin-left: $spacing-extra-large; }\n.ml6 { margin-left: $spacing-extra-extra-large; }\n.ml7 { margin-left: $spacing-extra-extra-extra-large; }\n\n.mr0 { margin-right: $spacing-none; }\n.mr1 { margin-right: $spacing-extra-small; }\n.mr2 { margin-right: $spacing-small; }\n.mr3 { margin-right: $spacing-medium; }\n.mr4 { margin-right: $spacing-large; }\n.mr5 { margin-right: $spacing-extra-large; }\n.mr6 { margin-right: $spacing-extra-extra-large; }\n.mr7 { margin-right: $spacing-extra-extra-extra-large; }\n\n.mb0 { margin-bottom: $spacing-none; }\n.mb1 { margin-bottom: $spacing-extra-small; }\n.mb2 { margin-bottom: $spacing-small; }\n.mb3 { margin-bottom: $spacing-medium; }\n.mb4 { margin-bottom: $spacing-large; }\n.mb5 { margin-bottom: $spacing-extra-large; }\n.mb6 { margin-bottom: $spacing-extra-extra-large; }\n.mb7 { margin-bottom: $spacing-extra-extra-extra-large; }\n\n.mt0 { margin-top: $spacing-none; }\n.mt1 { margin-top: $spacing-extra-small; }\n.mt2 { margin-top: $spacing-small; }\n.mt3 { margin-top: $spacing-medium; }\n.mt4 { margin-top: $spacing-large; }\n.mt5 { margin-top: $spacing-extra-large; }\n.mt6 { margin-top: $spacing-extra-extra-large; }\n.mt7 { margin-top: $spacing-extra-extra-extra-large; }\n\n.mv0 {\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n}\n.mv1 {\n margin-top: $spacing-extra-small;\n margin-bottom: $spacing-extra-small;\n}\n.mv2 {\n margin-top: $spacing-small;\n margin-bottom: $spacing-small;\n}\n.mv3 {\n margin-top: $spacing-medium;\n margin-bottom: $spacing-medium;\n}\n.mv4 {\n margin-top: $spacing-large;\n margin-bottom: $spacing-large;\n}\n.mv5 {\n margin-top: $spacing-extra-large;\n margin-bottom: $spacing-extra-large;\n}\n.mv6 {\n margin-top: $spacing-extra-extra-large;\n margin-bottom: $spacing-extra-extra-large;\n}\n.mv7 {\n margin-top: $spacing-extra-extra-extra-large;\n margin-bottom: $spacing-extra-extra-extra-large;\n}\n\n.mh0 {\n margin-left: $spacing-none;\n margin-right: $spacing-none;\n}\n.mh1 {\n margin-left: $spacing-extra-small;\n margin-right: $spacing-extra-small;\n}\n.mh2 {\n margin-left: $spacing-small;\n margin-right: $spacing-small;\n}\n.mh3 {\n margin-left: $spacing-medium;\n margin-right: $spacing-medium;\n}\n.mh4 {\n margin-left: $spacing-large;\n margin-right: $spacing-large;\n}\n.mh5 {\n margin-left: $spacing-extra-large;\n margin-right: $spacing-extra-large;\n}\n.mh6 {\n margin-left: $spacing-extra-extra-large;\n margin-right: $spacing-extra-extra-large;\n}\n.mh7 {\n margin-left: $spacing-extra-extra-extra-large;\n margin-right: $spacing-extra-extra-extra-large;\n}\n\n@media #{$breakpoint-not-small} {\n .pa0-ns { padding: $spacing-none; }\n .pa1-ns { padding: $spacing-extra-small; }\n .pa2-ns { padding: $spacing-small; }\n .pa3-ns { padding: $spacing-medium; }\n .pa4-ns { padding: $spacing-large; }\n .pa5-ns { padding: $spacing-extra-large; }\n .pa6-ns { padding: $spacing-extra-extra-large; }\n .pa7-ns { padding: $spacing-extra-extra-extra-large; }\n\n .pl0-ns { padding-left: $spacing-none; }\n .pl1-ns { padding-left: $spacing-extra-small; }\n .pl2-ns { padding-left: $spacing-small; }\n .pl3-ns { padding-left: $spacing-medium; }\n .pl4-ns { padding-left: $spacing-large; }\n .pl5-ns { padding-left: $spacing-extra-large; }\n .pl6-ns { padding-left: $spacing-extra-extra-large; }\n .pl7-ns { padding-left: $spacing-extra-extra-extra-large; }\n\n .pr0-ns { padding-right: $spacing-none; }\n .pr1-ns { padding-right: $spacing-extra-small; }\n .pr2-ns { padding-right: $spacing-small; }\n .pr3-ns { padding-right: $spacing-medium; }\n .pr4-ns { padding-right: $spacing-large; }\n .pr5-ns { padding-right: $spacing-extra-large; }\n .pr6-ns { padding-right: $spacing-extra-extra-large; }\n .pr7-ns { padding-right: $spacing-extra-extra-extra-large; }\n\n .pb0-ns { padding-bottom: $spacing-none; }\n .pb1-ns { padding-bottom: $spacing-extra-small; }\n .pb2-ns { padding-bottom: $spacing-small; }\n .pb3-ns { padding-bottom: $spacing-medium; }\n .pb4-ns { padding-bottom: $spacing-large; }\n .pb5-ns { padding-bottom: $spacing-extra-large; }\n .pb6-ns { padding-bottom: $spacing-extra-extra-large; }\n .pb7-ns { padding-bottom: $spacing-extra-extra-extra-large; }\n\n .pt0-ns { padding-top: $spacing-none; }\n .pt1-ns { padding-top: $spacing-extra-small; }\n .pt2-ns { padding-top: $spacing-small; }\n .pt3-ns { padding-top: $spacing-medium; }\n .pt4-ns { padding-top: $spacing-large; }\n .pt5-ns { padding-top: $spacing-extra-large; }\n .pt6-ns { padding-top: $spacing-extra-extra-large; }\n .pt7-ns { padding-top: $spacing-extra-extra-extra-large; }\n\n .pv0-ns {\n padding-top: $spacing-none;\n padding-bottom: $spacing-none;\n }\n .pv1-ns {\n padding-top: $spacing-extra-small;\n padding-bottom: $spacing-extra-small;\n }\n .pv2-ns {\n padding-top: $spacing-small;\n padding-bottom: $spacing-small;\n }\n .pv3-ns {\n padding-top: $spacing-medium;\n padding-bottom: $spacing-medium;\n }\n .pv4-ns {\n padding-top: $spacing-large;\n padding-bottom: $spacing-large;\n }\n .pv5-ns {\n padding-top: $spacing-extra-large;\n padding-bottom: $spacing-extra-large;\n }\n .pv6-ns {\n padding-top: $spacing-extra-extra-large;\n padding-bottom: $spacing-extra-extra-large;\n }\n .pv7-ns {\n padding-top: $spacing-extra-extra-extra-large;\n padding-bottom: $spacing-extra-extra-extra-large;\n }\n .ph0-ns {\n padding-left: $spacing-none;\n padding-right: $spacing-none;\n }\n .ph1-ns {\n padding-left: $spacing-extra-small;\n padding-right: $spacing-extra-small;\n }\n .ph2-ns {\n padding-left: $spacing-small;\n padding-right: $spacing-small;\n }\n .ph3-ns {\n padding-left: $spacing-medium;\n padding-right: $spacing-medium;\n }\n .ph4-ns {\n padding-left: $spacing-large;\n padding-right: $spacing-large;\n }\n .ph5-ns {\n padding-left: $spacing-extra-large;\n padding-right: $spacing-extra-large;\n }\n .ph6-ns {\n padding-left: $spacing-extra-extra-large;\n padding-right: $spacing-extra-extra-large;\n }\n .ph7-ns {\n padding-left: $spacing-extra-extra-extra-large;\n padding-right: $spacing-extra-extra-extra-large;\n }\n\n .ma0-ns { margin: $spacing-none; }\n .ma1-ns { margin: $spacing-extra-small; }\n .ma2-ns { margin: $spacing-small; }\n .ma3-ns { margin: $spacing-medium; }\n .ma4-ns { margin: $spacing-large; }\n .ma5-ns { margin: $spacing-extra-large; }\n .ma6-ns { margin: $spacing-extra-extra-large; }\n .ma7-ns { margin: $spacing-extra-extra-extra-large; }\n\n .ml0-ns { margin-left: $spacing-none; }\n .ml1-ns { margin-left: $spacing-extra-small; }\n .ml2-ns { margin-left: $spacing-small; }\n .ml3-ns { margin-left: $spacing-medium; }\n .ml4-ns { margin-left: $spacing-large; }\n .ml5-ns { margin-left: $spacing-extra-large; }\n .ml6-ns { margin-left: $spacing-extra-extra-large; }\n .ml7-ns { margin-left: $spacing-extra-extra-extra-large; }\n\n .mr0-ns { margin-right: $spacing-none; }\n .mr1-ns { margin-right: $spacing-extra-small; }\n .mr2-ns { margin-right: $spacing-small; }\n .mr3-ns { margin-right: $spacing-medium; }\n .mr4-ns { margin-right: $spacing-large; }\n .mr5-ns { margin-right: $spacing-extra-large; }\n .mr6-ns { margin-right: $spacing-extra-extra-large; }\n .mr7-ns { margin-right: $spacing-extra-extra-extra-large; }\n\n .mb0-ns { margin-bottom: $spacing-none; }\n .mb1-ns { margin-bottom: $spacing-extra-small; }\n .mb2-ns { margin-bottom: $spacing-small; }\n .mb3-ns { margin-bottom: $spacing-medium; }\n .mb4-ns { margin-bottom: $spacing-large; }\n .mb5-ns { margin-bottom: $spacing-extra-large; }\n .mb6-ns { margin-bottom: $spacing-extra-extra-large; }\n .mb7-ns { margin-bottom: $spacing-extra-extra-extra-large; }\n\n .mt0-ns { margin-top: $spacing-none; }\n .mt1-ns { margin-top: $spacing-extra-small; }\n .mt2-ns { margin-top: $spacing-small; }\n .mt3-ns { margin-top: $spacing-medium; }\n .mt4-ns { margin-top: $spacing-large; }\n .mt5-ns { margin-top: $spacing-extra-large; }\n .mt6-ns { margin-top: $spacing-extra-extra-large; }\n .mt7-ns { margin-top: $spacing-extra-extra-extra-large; }\n\n .mv0-ns {\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n }\n .mv1-ns {\n margin-top: $spacing-extra-small;\n margin-bottom: $spacing-extra-small;\n }\n .mv2-ns {\n margin-top: $spacing-small;\n margin-bottom: $spacing-small;\n }\n .mv3-ns {\n margin-top: $spacing-medium;\n margin-bottom: $spacing-medium;\n }\n .mv4-ns {\n margin-top: $spacing-large;\n margin-bottom: $spacing-large;\n }\n .mv5-ns {\n margin-top: $spacing-extra-large;\n margin-bottom: $spacing-extra-large;\n }\n .mv6-ns {\n margin-top: $spacing-extra-extra-large;\n margin-bottom: $spacing-extra-extra-large;\n }\n .mv7-ns {\n margin-top: $spacing-extra-extra-extra-large;\n margin-bottom: $spacing-extra-extra-extra-large;\n }\n\n .mh0-ns {\n margin-left: $spacing-none;\n margin-right: $spacing-none;\n }\n .mh1-ns {\n margin-left: $spacing-extra-small;\n margin-right: $spacing-extra-small;\n }\n .mh2-ns {\n margin-left: $spacing-small;\n margin-right: $spacing-small;\n }\n .mh3-ns {\n margin-left: $spacing-medium;\n margin-right: $spacing-medium;\n }\n .mh4-ns {\n margin-left: $spacing-large;\n margin-right: $spacing-large;\n }\n .mh5-ns {\n margin-left: $spacing-extra-large;\n margin-right: $spacing-extra-large;\n }\n .mh6-ns {\n margin-left: $spacing-extra-extra-large;\n margin-right: $spacing-extra-extra-large;\n }\n .mh7-ns {\n margin-left: $spacing-extra-extra-extra-large;\n margin-right: $spacing-extra-extra-extra-large;\n }\n\n}\n\n@media #{$breakpoint-medium} {\n .pa0-m { padding: $spacing-none; }\n .pa1-m { padding: $spacing-extra-small; }\n .pa2-m { padding: $spacing-small; }\n .pa3-m { padding: $spacing-medium; }\n .pa4-m { padding: $spacing-large; }\n .pa5-m { padding: $spacing-extra-large; }\n .pa6-m { padding: $spacing-extra-extra-large; }\n .pa7-m { padding: $spacing-extra-extra-extra-large; }\n\n .pl0-m { padding-left: $spacing-none; }\n .pl1-m { padding-left: $spacing-extra-small; }\n .pl2-m { padding-left: $spacing-small; }\n .pl3-m { padding-left: $spacing-medium; }\n .pl4-m { padding-left: $spacing-large; }\n .pl5-m { padding-left: $spacing-extra-large; }\n .pl6-m { padding-left: $spacing-extra-extra-large; }\n .pl7-m { padding-left: $spacing-extra-extra-extra-large; }\n\n .pr0-m { padding-right: $spacing-none; }\n .pr1-m { padding-right: $spacing-extra-small; }\n .pr2-m { padding-right: $spacing-small; }\n .pr3-m { padding-right: $spacing-medium; }\n .pr4-m { padding-right: $spacing-large; }\n .pr5-m { padding-right: $spacing-extra-large; }\n .pr6-m { padding-right: $spacing-extra-extra-large; }\n .pr7-m { padding-right: $spacing-extra-extra-extra-large; }\n\n .pb0-m { padding-bottom: $spacing-none; }\n .pb1-m { padding-bottom: $spacing-extra-small; }\n .pb2-m { padding-bottom: $spacing-small; }\n .pb3-m { padding-bottom: $spacing-medium; }\n .pb4-m { padding-bottom: $spacing-large; }\n .pb5-m { padding-bottom: $spacing-extra-large; }\n .pb6-m { padding-bottom: $spacing-extra-extra-large; }\n .pb7-m { padding-bottom: $spacing-extra-extra-extra-large; }\n\n .pt0-m { padding-top: $spacing-none; }\n .pt1-m { padding-top: $spacing-extra-small; }\n .pt2-m { padding-top: $spacing-small; }\n .pt3-m { padding-top: $spacing-medium; }\n .pt4-m { padding-top: $spacing-large; }\n .pt5-m { padding-top: $spacing-extra-large; }\n .pt6-m { padding-top: $spacing-extra-extra-large; }\n .pt7-m { padding-top: $spacing-extra-extra-extra-large; }\n\n .pv0-m {\n padding-top: $spacing-none;\n padding-bottom: $spacing-none;\n }\n .pv1-m {\n padding-top: $spacing-extra-small;\n padding-bottom: $spacing-extra-small;\n }\n .pv2-m {\n padding-top: $spacing-small;\n padding-bottom: $spacing-small;\n }\n .pv3-m {\n padding-top: $spacing-medium;\n padding-bottom: $spacing-medium;\n }\n .pv4-m {\n padding-top: $spacing-large;\n padding-bottom: $spacing-large;\n }\n .pv5-m {\n padding-top: $spacing-extra-large;\n padding-bottom: $spacing-extra-large;\n }\n .pv6-m {\n padding-top: $spacing-extra-extra-large;\n padding-bottom: $spacing-extra-extra-large;\n }\n .pv7-m {\n padding-top: $spacing-extra-extra-extra-large;\n padding-bottom: $spacing-extra-extra-extra-large;\n }\n\n .ph0-m {\n padding-left: $spacing-none;\n padding-right: $spacing-none;\n }\n .ph1-m {\n padding-left: $spacing-extra-small;\n padding-right: $spacing-extra-small;\n }\n .ph2-m {\n padding-left: $spacing-small;\n padding-right: $spacing-small;\n }\n .ph3-m {\n padding-left: $spacing-medium;\n padding-right: $spacing-medium;\n }\n .ph4-m {\n padding-left: $spacing-large;\n padding-right: $spacing-large;\n }\n .ph5-m {\n padding-left: $spacing-extra-large;\n padding-right: $spacing-extra-large;\n }\n .ph6-m {\n padding-left: $spacing-extra-extra-large;\n padding-right: $spacing-extra-extra-large;\n }\n .ph7-m {\n padding-left: $spacing-extra-extra-extra-large;\n padding-right: $spacing-extra-extra-extra-large;\n }\n\n .ma0-m { margin: $spacing-none; }\n .ma1-m { margin: $spacing-extra-small; }\n .ma2-m { margin: $spacing-small; }\n .ma3-m { margin: $spacing-medium; }\n .ma4-m { margin: $spacing-large; }\n .ma5-m { margin: $spacing-extra-large; }\n .ma6-m { margin: $spacing-extra-extra-large; }\n .ma7-m { margin: $spacing-extra-extra-extra-large; }\n\n .ml0-m { margin-left: $spacing-none; }\n .ml1-m { margin-left: $spacing-extra-small; }\n .ml2-m { margin-left: $spacing-small; }\n .ml3-m { margin-left: $spacing-medium; }\n .ml4-m { margin-left: $spacing-large; }\n .ml5-m { margin-left: $spacing-extra-large; }\n .ml6-m { margin-left: $spacing-extra-extra-large; }\n .ml7-m { margin-left: $spacing-extra-extra-extra-large; }\n\n .mr0-m { margin-right: $spacing-none; }\n .mr1-m { margin-right: $spacing-extra-small; }\n .mr2-m { margin-right: $spacing-small; }\n .mr3-m { margin-right: $spacing-medium; }\n .mr4-m { margin-right: $spacing-large; }\n .mr5-m { margin-right: $spacing-extra-large; }\n .mr6-m { margin-right: $spacing-extra-extra-large; }\n .mr7-m { margin-right: $spacing-extra-extra-extra-large; }\n\n .mb0-m { margin-bottom: $spacing-none; }\n .mb1-m { margin-bottom: $spacing-extra-small; }\n .mb2-m { margin-bottom: $spacing-small; }\n .mb3-m { margin-bottom: $spacing-medium; }\n .mb4-m { margin-bottom: $spacing-large; }\n .mb5-m { margin-bottom: $spacing-extra-large; }\n .mb6-m { margin-bottom: $spacing-extra-extra-large; }\n .mb7-m { margin-bottom: $spacing-extra-extra-extra-large; }\n\n .mt0-m { margin-top: $spacing-none; }\n .mt1-m { margin-top: $spacing-extra-small; }\n .mt2-m { margin-top: $spacing-small; }\n .mt3-m { margin-top: $spacing-medium; }\n .mt4-m { margin-top: $spacing-large; }\n .mt5-m { margin-top: $spacing-extra-large; }\n .mt6-m { margin-top: $spacing-extra-extra-large; }\n .mt7-m { margin-top: $spacing-extra-extra-extra-large; }\n\n .mv0-m {\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n }\n .mv1-m {\n margin-top: $spacing-extra-small;\n margin-bottom: $spacing-extra-small;\n }\n .mv2-m {\n margin-top: $spacing-small;\n margin-bottom: $spacing-small;\n }\n .mv3-m {\n margin-top: $spacing-medium;\n margin-bottom: $spacing-medium;\n }\n .mv4-m {\n margin-top: $spacing-large;\n margin-bottom: $spacing-large;\n }\n .mv5-m {\n margin-top: $spacing-extra-large;\n margin-bottom: $spacing-extra-large;\n }\n .mv6-m {\n margin-top: $spacing-extra-extra-large;\n margin-bottom: $spacing-extra-extra-large;\n }\n .mv7-m {\n margin-top: $spacing-extra-extra-extra-large;\n margin-bottom: $spacing-extra-extra-extra-large;\n }\n\n .mh0-m {\n margin-left: $spacing-none;\n margin-right: $spacing-none;\n }\n .mh1-m {\n margin-left: $spacing-extra-small;\n margin-right: $spacing-extra-small;\n }\n .mh2-m {\n margin-left: $spacing-small;\n margin-right: $spacing-small;\n }\n .mh3-m {\n margin-left: $spacing-medium;\n margin-right: $spacing-medium;\n }\n .mh4-m {\n margin-left: $spacing-large;\n margin-right: $spacing-large;\n }\n .mh5-m {\n margin-left: $spacing-extra-large;\n margin-right: $spacing-extra-large;\n }\n .mh6-m {\n margin-left: $spacing-extra-extra-large;\n margin-right: $spacing-extra-extra-large;\n }\n .mh7-m {\n margin-left: $spacing-extra-extra-extra-large;\n margin-right: $spacing-extra-extra-extra-large;\n }\n\n}\n\n@media #{$breakpoint-large} {\n .pa0-l { padding: $spacing-none; }\n .pa1-l { padding: $spacing-extra-small; }\n .pa2-l { padding: $spacing-small; }\n .pa3-l { padding: $spacing-medium; }\n .pa4-l { padding: $spacing-large; }\n .pa5-l { padding: $spacing-extra-large; }\n .pa6-l { padding: $spacing-extra-extra-large; }\n .pa7-l { padding: $spacing-extra-extra-extra-large; }\n\n .pl0-l { padding-left: $spacing-none; }\n .pl1-l { padding-left: $spacing-extra-small; }\n .pl2-l { padding-left: $spacing-small; }\n .pl3-l { padding-left: $spacing-medium; }\n .pl4-l { padding-left: $spacing-large; }\n .pl5-l { padding-left: $spacing-extra-large; }\n .pl6-l { padding-left: $spacing-extra-extra-large; }\n .pl7-l { padding-left: $spacing-extra-extra-extra-large; }\n\n .pr0-l { padding-right: $spacing-none; }\n .pr1-l { padding-right: $spacing-extra-small; }\n .pr2-l { padding-right: $spacing-small; }\n .pr3-l { padding-right: $spacing-medium; }\n .pr4-l { padding-right: $spacing-large; }\n .pr5-l { padding-right: $spacing-extra-large; }\n .pr6-l { padding-right: $spacing-extra-extra-large; }\n .pr7-l { padding-right: $spacing-extra-extra-extra-large; }\n\n .pb0-l { padding-bottom: $spacing-none; }\n .pb1-l { padding-bottom: $spacing-extra-small; }\n .pb2-l { padding-bottom: $spacing-small; }\n .pb3-l { padding-bottom: $spacing-medium; }\n .pb4-l { padding-bottom: $spacing-large; }\n .pb5-l { padding-bottom: $spacing-extra-large; }\n .pb6-l { padding-bottom: $spacing-extra-extra-large; }\n .pb7-l { padding-bottom: $spacing-extra-extra-extra-large; }\n\n .pt0-l { padding-top: $spacing-none; }\n .pt1-l { padding-top: $spacing-extra-small; }\n .pt2-l { padding-top: $spacing-small; }\n .pt3-l { padding-top: $spacing-medium; }\n .pt4-l { padding-top: $spacing-large; }\n .pt5-l { padding-top: $spacing-extra-large; }\n .pt6-l { padding-top: $spacing-extra-extra-large; }\n .pt7-l { padding-top: $spacing-extra-extra-extra-large; }\n\n .pv0-l {\n padding-top: $spacing-none;\n padding-bottom: $spacing-none;\n }\n .pv1-l {\n padding-top: $spacing-extra-small;\n padding-bottom: $spacing-extra-small;\n }\n .pv2-l {\n padding-top: $spacing-small;\n padding-bottom: $spacing-small;\n }\n .pv3-l {\n padding-top: $spacing-medium;\n padding-bottom: $spacing-medium;\n }\n .pv4-l {\n padding-top: $spacing-large;\n padding-bottom: $spacing-large;\n }\n .pv5-l {\n padding-top: $spacing-extra-large;\n padding-bottom: $spacing-extra-large;\n }\n .pv6-l {\n padding-top: $spacing-extra-extra-large;\n padding-bottom: $spacing-extra-extra-large;\n }\n .pv7-l {\n padding-top: $spacing-extra-extra-extra-large;\n padding-bottom: $spacing-extra-extra-extra-large;\n }\n\n .ph0-l {\n padding-left: $spacing-none;\n padding-right: $spacing-none;\n }\n .ph1-l {\n padding-left: $spacing-extra-small;\n padding-right: $spacing-extra-small;\n }\n .ph2-l {\n padding-left: $spacing-small;\n padding-right: $spacing-small;\n }\n .ph3-l {\n padding-left: $spacing-medium;\n padding-right: $spacing-medium;\n }\n .ph4-l {\n padding-left: $spacing-large;\n padding-right: $spacing-large;\n }\n .ph5-l {\n padding-left: $spacing-extra-large;\n padding-right: $spacing-extra-large;\n }\n .ph6-l {\n padding-left: $spacing-extra-extra-large;\n padding-right: $spacing-extra-extra-large;\n }\n .ph7-l {\n padding-left: $spacing-extra-extra-extra-large;\n padding-right: $spacing-extra-extra-extra-large;\n }\n\n .ma0-l { margin: $spacing-none; }\n .ma1-l { margin: $spacing-extra-small; }\n .ma2-l { margin: $spacing-small; }\n .ma3-l { margin: $spacing-medium; }\n .ma4-l { margin: $spacing-large; }\n .ma5-l { margin: $spacing-extra-large; }\n .ma6-l { margin: $spacing-extra-extra-large; }\n .ma7-l { margin: $spacing-extra-extra-extra-large; }\n\n .ml0-l { margin-left: $spacing-none; }\n .ml1-l { margin-left: $spacing-extra-small; }\n .ml2-l { margin-left: $spacing-small; }\n .ml3-l { margin-left: $spacing-medium; }\n .ml4-l { margin-left: $spacing-large; }\n .ml5-l { margin-left: $spacing-extra-large; }\n .ml6-l { margin-left: $spacing-extra-extra-large; }\n .ml7-l { margin-left: $spacing-extra-extra-extra-large; }\n\n .mr0-l { margin-right: $spacing-none; }\n .mr1-l { margin-right: $spacing-extra-small; }\n .mr2-l { margin-right: $spacing-small; }\n .mr3-l { margin-right: $spacing-medium; }\n .mr4-l { margin-right: $spacing-large; }\n .mr5-l { margin-right: $spacing-extra-large; }\n .mr6-l { margin-right: $spacing-extra-extra-large; }\n .mr7-l { margin-right: $spacing-extra-extra-extra-large; }\n\n .mb0-l { margin-bottom: $spacing-none; }\n .mb1-l { margin-bottom: $spacing-extra-small; }\n .mb2-l { margin-bottom: $spacing-small; }\n .mb3-l { margin-bottom: $spacing-medium; }\n .mb4-l { margin-bottom: $spacing-large; }\n .mb5-l { margin-bottom: $spacing-extra-large; }\n .mb6-l { margin-bottom: $spacing-extra-extra-large; }\n .mb7-l { margin-bottom: $spacing-extra-extra-extra-large; }\n\n .mt0-l { margin-top: $spacing-none; }\n .mt1-l { margin-top: $spacing-extra-small; }\n .mt2-l { margin-top: $spacing-small; }\n .mt3-l { margin-top: $spacing-medium; }\n .mt4-l { margin-top: $spacing-large; }\n .mt5-l { margin-top: $spacing-extra-large; }\n .mt6-l { margin-top: $spacing-extra-extra-large; }\n .mt7-l { margin-top: $spacing-extra-extra-extra-large; }\n\n .mv0-l {\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n }\n .mv1-l {\n margin-top: $spacing-extra-small;\n margin-bottom: $spacing-extra-small;\n }\n .mv2-l {\n margin-top: $spacing-small;\n margin-bottom: $spacing-small;\n }\n .mv3-l {\n margin-top: $spacing-medium;\n margin-bottom: $spacing-medium;\n }\n .mv4-l {\n margin-top: $spacing-large;\n margin-bottom: $spacing-large;\n }\n .mv5-l {\n margin-top: $spacing-extra-large;\n margin-bottom: $spacing-extra-large;\n }\n .mv6-l {\n margin-top: $spacing-extra-extra-large;\n margin-bottom: $spacing-extra-extra-large;\n }\n .mv7-l {\n margin-top: $spacing-extra-extra-extra-large;\n margin-bottom: $spacing-extra-extra-extra-large;\n }\n\n .mh0-l {\n margin-left: $spacing-none;\n margin-right: $spacing-none;\n }\n .mh1-l {\n margin-left: $spacing-extra-small;\n margin-right: $spacing-extra-small;\n }\n .mh2-l {\n margin-left: $spacing-small;\n margin-right: $spacing-small;\n }\n .mh3-l {\n margin-left: $spacing-medium;\n margin-right: $spacing-medium;\n }\n .mh4-l {\n margin-left: $spacing-large;\n margin-right: $spacing-large;\n }\n .mh5-l {\n margin-left: $spacing-extra-large;\n margin-right: $spacing-extra-large;\n }\n .mh6-l {\n margin-left: $spacing-extra-extra-large;\n margin-right: $spacing-extra-extra-large;\n }\n .mh7-l {\n margin-left: $spacing-extra-extra-extra-large;\n margin-right: $spacing-extra-extra-extra-large;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n NEGATIVE MARGINS\n\n Base:\n n = negative\n\n Modifiers:\n a = all\n t = top\n r = right\n b = bottom\n l = left\n\n 1 = 1st step in spacing scale\n 2 = 2nd step in spacing scale\n 3 = 3rd step in spacing scale\n 4 = 4th step in spacing scale\n 5 = 5th step in spacing scale\n 6 = 6th step in spacing scale\n 7 = 7th step in spacing scale\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n\n.na1 { margin: -$spacing-extra-small; }\n.na2 { margin: -$spacing-small; }\n.na3 { margin: -$spacing-medium; }\n.na4 { margin: -$spacing-large; }\n.na5 { margin: -$spacing-extra-large; }\n.na6 { margin: -$spacing-extra-extra-large; }\n.na7 { margin: -$spacing-extra-extra-extra-large; }\n\n.nl1 { margin-left: -$spacing-extra-small; }\n.nl2 { margin-left: -$spacing-small; }\n.nl3 { margin-left: -$spacing-medium; }\n.nl4 { margin-left: -$spacing-large; }\n.nl5 { margin-left: -$spacing-extra-large; }\n.nl6 { margin-left: -$spacing-extra-extra-large; }\n.nl7 { margin-left: -$spacing-extra-extra-extra-large; }\n\n.nr1 { margin-right: -$spacing-extra-small; }\n.nr2 { margin-right: -$spacing-small; }\n.nr3 { margin-right: -$spacing-medium; }\n.nr4 { margin-right: -$spacing-large; }\n.nr5 { margin-right: -$spacing-extra-large; }\n.nr6 { margin-right: -$spacing-extra-extra-large; }\n.nr7 { margin-right: -$spacing-extra-extra-extra-large; }\n\n.nb1 { margin-bottom: -$spacing-extra-small; }\n.nb2 { margin-bottom: -$spacing-small; }\n.nb3 { margin-bottom: -$spacing-medium; }\n.nb4 { margin-bottom: -$spacing-large; }\n.nb5 { margin-bottom: -$spacing-extra-large; }\n.nb6 { margin-bottom: -$spacing-extra-extra-large; }\n.nb7 { margin-bottom: -$spacing-extra-extra-extra-large; }\n\n.nt1 { margin-top: -$spacing-extra-small; }\n.nt2 { margin-top: -$spacing-small; }\n.nt3 { margin-top: -$spacing-medium; }\n.nt4 { margin-top: -$spacing-large; }\n.nt5 { margin-top: -$spacing-extra-large; }\n.nt6 { margin-top: -$spacing-extra-extra-large; }\n.nt7 { margin-top: -$spacing-extra-extra-extra-large; }\n\n@media #{$breakpoint-not-small} {\n\n .na1-ns { margin: -$spacing-extra-small; }\n .na2-ns { margin: -$spacing-small; }\n .na3-ns { margin: -$spacing-medium; }\n .na4-ns { margin: -$spacing-large; }\n .na5-ns { margin: -$spacing-extra-large; }\n .na6-ns { margin: -$spacing-extra-extra-large; }\n .na7-ns { margin: -$spacing-extra-extra-extra-large; }\n\n .nl1-ns { margin-left: -$spacing-extra-small; }\n .nl2-ns { margin-left: -$spacing-small; }\n .nl3-ns { margin-left: -$spacing-medium; }\n .nl4-ns { margin-left: -$spacing-large; }\n .nl5-ns { margin-left: -$spacing-extra-large; }\n .nl6-ns { margin-left: -$spacing-extra-extra-large; }\n .nl7-ns { margin-left: -$spacing-extra-extra-extra-large; }\n\n .nr1-ns { margin-right: -$spacing-extra-small; }\n .nr2-ns { margin-right: -$spacing-small; }\n .nr3-ns { margin-right: -$spacing-medium; }\n .nr4-ns { margin-right: -$spacing-large; }\n .nr5-ns { margin-right: -$spacing-extra-large; }\n .nr6-ns { margin-right: -$spacing-extra-extra-large; }\n .nr7-ns { margin-right: -$spacing-extra-extra-extra-large; }\n\n .nb1-ns { margin-bottom: -$spacing-extra-small; }\n .nb2-ns { margin-bottom: -$spacing-small; }\n .nb3-ns { margin-bottom: -$spacing-medium; }\n .nb4-ns { margin-bottom: -$spacing-large; }\n .nb5-ns { margin-bottom: -$spacing-extra-large; }\n .nb6-ns { margin-bottom: -$spacing-extra-extra-large; }\n .nb7-ns { margin-bottom: -$spacing-extra-extra-extra-large; }\n\n .nt1-ns { margin-top: -$spacing-extra-small; }\n .nt2-ns { margin-top: -$spacing-small; }\n .nt3-ns { margin-top: -$spacing-medium; }\n .nt4-ns { margin-top: -$spacing-large; }\n .nt5-ns { margin-top: -$spacing-extra-large; }\n .nt6-ns { margin-top: -$spacing-extra-extra-large; }\n .nt7-ns { margin-top: -$spacing-extra-extra-extra-large; }\n\n}\n\n@media #{$breakpoint-medium} {\n .na1-m { margin: -$spacing-extra-small; }\n .na2-m { margin: -$spacing-small; }\n .na3-m { margin: -$spacing-medium; }\n .na4-m { margin: -$spacing-large; }\n .na5-m { margin: -$spacing-extra-large; }\n .na6-m { margin: -$spacing-extra-extra-large; }\n .na7-m { margin: -$spacing-extra-extra-extra-large; }\n\n .nl1-m { margin-left: -$spacing-extra-small; }\n .nl2-m { margin-left: -$spacing-small; }\n .nl3-m { margin-left: -$spacing-medium; }\n .nl4-m { margin-left: -$spacing-large; }\n .nl5-m { margin-left: -$spacing-extra-large; }\n .nl6-m { margin-left: -$spacing-extra-extra-large; }\n .nl7-m { margin-left: -$spacing-extra-extra-extra-large; }\n\n .nr1-m { margin-right: -$spacing-extra-small; }\n .nr2-m { margin-right: -$spacing-small; }\n .nr3-m { margin-right: -$spacing-medium; }\n .nr4-m { margin-right: -$spacing-large; }\n .nr5-m { margin-right: -$spacing-extra-large; }\n .nr6-m { margin-right: -$spacing-extra-extra-large; }\n .nr7-m { margin-right: -$spacing-extra-extra-extra-large; }\n\n .nb1-m { margin-bottom: -$spacing-extra-small; }\n .nb2-m { margin-bottom: -$spacing-small; }\n .nb3-m { margin-bottom: -$spacing-medium; }\n .nb4-m { margin-bottom: -$spacing-large; }\n .nb5-m { margin-bottom: -$spacing-extra-large; }\n .nb6-m { margin-bottom: -$spacing-extra-extra-large; }\n .nb7-m { margin-bottom: -$spacing-extra-extra-extra-large; }\n\n .nt1-m { margin-top: -$spacing-extra-small; }\n .nt2-m { margin-top: -$spacing-small; }\n .nt3-m { margin-top: -$spacing-medium; }\n .nt4-m { margin-top: -$spacing-large; }\n .nt5-m { margin-top: -$spacing-extra-large; }\n .nt6-m { margin-top: -$spacing-extra-extra-large; }\n .nt7-m { margin-top: -$spacing-extra-extra-extra-large; }\n\n}\n\n@media #{$breakpoint-large} {\n .na1-l { margin: -$spacing-extra-small; }\n .na2-l { margin: -$spacing-small; }\n .na3-l { margin: -$spacing-medium; }\n .na4-l { margin: -$spacing-large; }\n .na5-l { margin: -$spacing-extra-large; }\n .na6-l { margin: -$spacing-extra-extra-large; }\n .na7-l { margin: -$spacing-extra-extra-extra-large; }\n\n .nl1-l { margin-left: -$spacing-extra-small; }\n .nl2-l { margin-left: -$spacing-small; }\n .nl3-l { margin-left: -$spacing-medium; }\n .nl4-l { margin-left: -$spacing-large; }\n .nl5-l { margin-left: -$spacing-extra-large; }\n .nl6-l { margin-left: -$spacing-extra-extra-large; }\n .nl7-l { margin-left: -$spacing-extra-extra-extra-large; }\n\n .nr1-l { margin-right: -$spacing-extra-small; }\n .nr2-l { margin-right: -$spacing-small; }\n .nr3-l { margin-right: -$spacing-medium; }\n .nr4-l { margin-right: -$spacing-large; }\n .nr5-l { margin-right: -$spacing-extra-large; }\n .nr6-l { margin-right: -$spacing-extra-extra-large; }\n .nr7-l { margin-right: -$spacing-extra-extra-extra-large; }\n\n .nb1-l { margin-bottom: -$spacing-extra-small; }\n .nb2-l { margin-bottom: -$spacing-small; }\n .nb3-l { margin-bottom: -$spacing-medium; }\n .nb4-l { margin-bottom: -$spacing-large; }\n .nb5-l { margin-bottom: -$spacing-extra-large; }\n .nb6-l { margin-bottom: -$spacing-extra-extra-large; }\n .nb7-l { margin-bottom: -$spacing-extra-extra-extra-large; }\n\n .nt1-l { margin-top: -$spacing-extra-small; }\n .nt2-l { margin-top: -$spacing-small; }\n .nt3-l { margin-top: -$spacing-medium; }\n .nt4-l { margin-top: -$spacing-large; }\n .nt5-l { margin-top: -$spacing-extra-large; }\n .nt6-l { margin-top: -$spacing-extra-extra-large; }\n .nt7-l { margin-top: -$spacing-extra-extra-extra-large; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TABLES\n Docs: http://tachyons.io/docs/elements/tables/\n\n*/\n\n.collapse {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\n.striped--light-silver:nth-child(odd) {\n background-color: $light-silver;\n}\n\n.striped--moon-gray:nth-child(odd) {\n background-color: $moon-gray;\n}\n\n.striped--light-gray:nth-child(odd) {\n background-color: $light-gray;\n}\n\n.striped--near-white:nth-child(odd) {\n background-color: $near-white;\n}\n\n.stripe-light:nth-child(odd) {\n background-color: $white-10;\n}\n\n.stripe-dark:nth-child(odd) {\n background-color: $black-10;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TEXT DECORATION\n Docs: http://tachyons.io/docs/typography/text-decoration/\n\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.strike { text-decoration: line-through; }\n.underline { text-decoration: underline; }\n.no-underline { text-decoration: none; }\n\n\n@media #{$breakpoint-not-small} {\n .strike-ns { text-decoration: line-through; }\n .underline-ns { text-decoration: underline; }\n .no-underline-ns { text-decoration: none; }\n}\n\n@media #{$breakpoint-medium} {\n .strike-m { text-decoration: line-through; }\n .underline-m { text-decoration: underline; }\n .no-underline-m { text-decoration: none; }\n}\n\n@media #{$breakpoint-large} {\n .strike-l { text-decoration: line-through; }\n .underline-l { text-decoration: underline; }\n .no-underline-l { text-decoration: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TEXT ALIGN\n Docs: http://tachyons.io/docs/typography/text-align/\n\n Base\n t = text-align\n\n Modifiers\n l = left\n r = right\n c = center\n j = justify\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.tl { text-align: left; }\n.tr { text-align: right; }\n.tc { text-align: center; }\n.tj { text-align: justify; }\n\n@media #{$breakpoint-not-small} {\n .tl-ns { text-align: left; }\n .tr-ns { text-align: right; }\n .tc-ns { text-align: center; }\n .tj-ns { text-align: justify; }\n}\n\n@media #{$breakpoint-medium} {\n .tl-m { text-align: left; }\n .tr-m { text-align: right; }\n .tc-m { text-align: center; }\n .tj-m { text-align: justify; }\n}\n\n@media #{$breakpoint-large} {\n .tl-l { text-align: left; }\n .tr-l { text-align: right; }\n .tc-l { text-align: center; }\n .tj-l { text-align: justify; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TEXT TRANSFORM\n Docs: http://tachyons.io/docs/typography/text-transform/\n\n Base:\n tt = text-transform\n\n Modifiers\n c = capitalize\n l = lowercase\n u = uppercase\n n = none\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.ttc { text-transform: capitalize; }\n.ttl { text-transform: lowercase; }\n.ttu { text-transform: uppercase; }\n.ttn { text-transform: none; }\n\n@media #{$breakpoint-not-small} {\n .ttc-ns { text-transform: capitalize; }\n .ttl-ns { text-transform: lowercase; }\n .ttu-ns { text-transform: uppercase; }\n .ttn-ns { text-transform: none; }\n}\n\n@media #{$breakpoint-medium} {\n .ttc-m { text-transform: capitalize; }\n .ttl-m { text-transform: lowercase; }\n .ttu-m { text-transform: uppercase; }\n .ttn-m { text-transform: none; }\n}\n\n@media #{$breakpoint-large} {\n .ttc-l { text-transform: capitalize; }\n .ttl-l { text-transform: lowercase; }\n .ttu-l { text-transform: uppercase; }\n .ttn-l { text-transform: none; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TYPE SCALE\n Docs: http://tachyons.io/docs/typography/scale/\n\n Base:\n f = font-size\n\n Modifiers\n 1 = 1st step in size scale\n 2 = 2nd step in size scale\n 3 = 3rd step in size scale\n 4 = 4th step in size scale\n 5 = 5th step in size scale\n 6 = 6th step in size scale\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n*/\n\n/*\n * For Hero/Marketing Titles\n *\n * These generally are too large for mobile\n * so be careful using them on smaller screens.\n * */\n\n.f-6,\n.f-headline {\n font-size: $font-size-headline;\n}\n.f-5,\n.f-subheadline {\n font-size: $font-size-subheadline;\n}\n\n\n/* Type Scale */\n\n\n.f1 { font-size: $font-size-1; }\n.f2 { font-size: $font-size-2; }\n.f3 { font-size: $font-size-3; }\n.f4 { font-size: $font-size-4; }\n.f5 { font-size: $font-size-5; }\n.f6 { font-size: $font-size-6; }\n.f7 { font-size: $font-size-7; }\n\n@media #{$breakpoint-not-small}{\n .f-6-ns,\n .f-headline-ns { font-size: $font-size-headline; }\n .f-5-ns,\n .f-subheadline-ns { font-size: $font-size-subheadline; }\n .f1-ns { font-size: $font-size-1; }\n .f2-ns { font-size: $font-size-2; }\n .f3-ns { font-size: $font-size-3; }\n .f4-ns { font-size: $font-size-4; }\n .f5-ns { font-size: $font-size-5; }\n .f6-ns { font-size: $font-size-6; }\n .f7-ns { font-size: $font-size-7; }\n}\n\n@media #{$breakpoint-medium} {\n .f-6-m,\n .f-headline-m { font-size: $font-size-headline; }\n .f-5-m,\n .f-subheadline-m { font-size: $font-size-subheadline; }\n .f1-m { font-size: $font-size-1; }\n .f2-m { font-size: $font-size-2; }\n .f3-m { font-size: $font-size-3; }\n .f4-m { font-size: $font-size-4; }\n .f5-m { font-size: $font-size-5; }\n .f6-m { font-size: $font-size-6; }\n .f7-m { font-size: $font-size-7; }\n}\n\n@media #{$breakpoint-large} {\n .f-6-l,\n .f-headline-l {\n font-size: $font-size-headline;\n }\n .f-5-l,\n .f-subheadline-l {\n font-size: $font-size-subheadline;\n }\n .f1-l { font-size: $font-size-1; }\n .f2-l { font-size: $font-size-2; }\n .f3-l { font-size: $font-size-3; }\n .f4-l { font-size: $font-size-4; }\n .f5-l { font-size: $font-size-5; }\n .f6-l { font-size: $font-size-6; }\n .f7-l { font-size: $font-size-7; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n TYPOGRAPHY\n http://tachyons.io/docs/typography/measure/\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n\n/* Measure is limited to ~66 characters */\n.measure {\n max-width: $measure;\n}\n\n/* Measure is limited to ~80 characters */\n.measure-wide {\n max-width: $measure-wide;\n}\n\n/* Measure is limited to ~45 characters */\n.measure-narrow {\n max-width: $measure-narrow;\n}\n\n/* Book paragraph style - paragraphs are indented with no vertical spacing. */\n.indent {\n text-indent: 1em;\n margin-top: 0;\n margin-bottom: 0;\n}\n\n.small-caps {\n font-variant: small-caps;\n}\n\n/* Combine this class with a width to truncate text (or just leave as is to truncate at width of containing element. */\n\n.truncate {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n@media #{$breakpoint-not-small} {\n .measure-ns {\n max-width: $measure;\n }\n .measure-wide-ns {\n max-width: $measure-wide;\n }\n .measure-narrow-ns {\n max-width: $measure-narrow;\n }\n .indent-ns {\n text-indent: 1em;\n margin-top: 0;\n margin-bottom: 0;\n }\n .small-caps-ns {\n font-variant: small-caps;\n }\n .truncate-ns {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n@media #{$breakpoint-medium} {\n .measure-m {\n max-width: $measure;\n }\n .measure-wide-m {\n max-width: $measure-wide;\n }\n .measure-narrow-m {\n max-width: $measure-narrow;\n }\n .indent-m {\n text-indent: 1em;\n margin-top: 0;\n margin-bottom: 0;\n }\n .small-caps-m {\n font-variant: small-caps;\n }\n .truncate-m {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n\n@media #{$breakpoint-large} {\n .measure-l {\n max-width: $measure;\n }\n .measure-wide-l {\n max-width: $measure-wide;\n }\n .measure-narrow-l {\n max-width: $measure-narrow;\n }\n .indent-l {\n text-indent: 1em;\n margin-top: 0;\n margin-bottom: 0;\n }\n .small-caps-l {\n font-variant: small-caps;\n }\n .truncate-l {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n UTILITIES\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n/* Equivalent to .overflow-y-scroll */\n.overflow-container {\n overflow-y: scroll;\n}\n\n.center {\n margin-right: auto;\n margin-left: auto;\n}\n\n.mr-auto { margin-right: auto; }\n.ml-auto { margin-left: auto; }\n\n@media #{$breakpoint-not-small}{\n .center-ns {\n margin-right: auto;\n margin-left: auto;\n }\n .mr-auto-ns { margin-right: auto; }\n .ml-auto-ns { margin-left: auto; }\n}\n\n@media #{$breakpoint-medium}{\n .center-m {\n margin-right: auto;\n margin-left: auto;\n }\n .mr-auto-m { margin-right: auto; }\n .ml-auto-m { margin-left: auto; }\n}\n\n@media #{$breakpoint-large}{\n .center-l {\n margin-right: auto;\n margin-left: auto;\n }\n .mr-auto-l { margin-right: auto; }\n .ml-auto-l { margin-left: auto; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n VISIBILITY\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n/*\n Text that is hidden but accessible\n Ref: http://snook.ca/archives/html_and_css/hiding-content-for-accessibility\n*/\n\n.clip {\n position: fixed !important;\n _position: absolute !important;\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n}\n\n@media #{$breakpoint-not-small} {\n .clip-ns {\n position: fixed !important;\n _position: absolute !important;\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n }\n}\n\n@media #{$breakpoint-medium} {\n .clip-m {\n position: fixed !important;\n _position: absolute !important;\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n }\n}\n\n@media #{$breakpoint-large} {\n .clip-l {\n position: fixed !important;\n _position: absolute !important;\n clip: rect(1px 1px 1px 1px); /* IE6, IE7 */\n clip: rect(1px, 1px, 1px, 1px);\n }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n WHITE SPACE\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n\n.ws-normal { white-space: normal; }\n.nowrap { white-space: nowrap; }\n.pre { white-space: pre; }\n\n@media #{$breakpoint-not-small} {\n .ws-normal-ns { white-space: normal; }\n .nowrap-ns { white-space: nowrap; }\n .pre-ns { white-space: pre; }\n}\n\n@media #{$breakpoint-medium} {\n .ws-normal-m { white-space: normal; }\n .nowrap-m { white-space: nowrap; }\n .pre-m { white-space: pre; }\n}\n\n@media #{$breakpoint-large} {\n .ws-normal-l { white-space: normal; }\n .nowrap-l { white-space: nowrap; }\n .pre-l { white-space: pre; }\n}\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n VERTICAL ALIGN\n\n Media Query Extensions:\n -ns = not-small\n -m = medium\n -l = large\n\n*/\n\n.v-base { vertical-align: baseline; }\n.v-mid { vertical-align: middle; }\n.v-top { vertical-align: top; }\n.v-btm { vertical-align: bottom; }\n\n@media #{$breakpoint-not-small} {\n .v-base-ns { vertical-align: baseline; }\n .v-mid-ns { vertical-align: middle; }\n .v-top-ns { vertical-align: top; }\n .v-btm-ns { vertical-align: bottom; }\n}\n\n@media #{$breakpoint-medium} {\n .v-base-m { vertical-align: baseline; }\n .v-mid-m { vertical-align: middle; }\n .v-top-m { vertical-align: top; }\n .v-btm-m { vertical-align: bottom; }\n}\n\n@media #{$breakpoint-large} {\n .v-base-l { vertical-align: baseline; }\n .v-mid-l { vertical-align: middle; }\n .v-top-l { vertical-align: top; }\n .v-btm-l { vertical-align: bottom; }\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n HOVER EFFECTS\n Docs: http://tachyons.io/docs/themes/hovers/\n\n - Dim\n - Glow\n - Hide Child\n - Underline text\n - Grow\n - Pointer\n - Shadow\n\n*/\n\n/*\n\n Dim element on hover by adding the dim class.\n\n*/\n.dim {\n opacity: 1;\n transition: opacity .15s ease-in;\n}\n.dim:hover,\n.dim:focus {\n opacity: .5;\n transition: opacity .15s ease-in;\n}\n.dim:active {\n opacity: .8; transition: opacity .15s ease-out;\n}\n\n/*\n\n Animate opacity to 100% on hover by adding the glow class.\n\n*/\n.glow {\n transition: opacity .15s ease-in;\n}\n.glow:hover,\n.glow:focus {\n opacity: 1;\n transition: opacity .15s ease-in;\n}\n\n/*\n\n Hide child & reveal on hover:\n\n Put the hide-child class on a parent element and any nested element with the\n child class will be hidden and displayed on hover or focus.\n\n
\n
Hidden until hover or focus
\n
Hidden until hover or focus
\n
Hidden until hover or focus
\n
Hidden until hover or focus
\n
\n*/\n\n.hide-child .child {\n opacity: 0;\n transition: opacity .15s ease-in;\n}\n.hide-child:hover .child,\n.hide-child:focus .child,\n.hide-child:active .child {\n opacity: 1;\n transition: opacity .15s ease-in;\n}\n\n.underline-hover:hover,\n.underline-hover:focus {\n text-decoration: underline;\n}\n\n/* Can combine this with overflow-hidden to make background images grow on hover\n * even if you are using background-size: cover */\n\n.grow {\n -moz-osx-font-smoothing: grayscale;\n backface-visibility: hidden;\n transform: translateZ(0);\n transition: transform 0.25s ease-out;\n}\n\n.grow:hover,\n.grow:focus {\n transform: scale(1.05);\n}\n\n.grow:active {\n transform: scale(.90);\n}\n\n.grow-large {\n -moz-osx-font-smoothing: grayscale;\n backface-visibility: hidden;\n transform: translateZ(0);\n transition: transform .25s ease-in-out;\n}\n\n.grow-large:hover,\n.grow-large:focus {\n transform: scale(1.2);\n}\n\n.grow-large:active {\n transform: scale(.95);\n}\n\n/* Add pointer on hover */\n\n.pointer:hover {\n cursor: pointer;\n}\n\n/*\n Add shadow on hover.\n\n Performant box-shadow animation pattern from\n http://tobiasahlin.com/blog/how-to-animate-box-shadow/\n*/\n\n.shadow-hover {\n cursor: pointer;\n position: relative;\n transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1);\n}\n\n.shadow-hover::after {\n content: '';\n box-shadow: 0px 0px 16px 2px rgba( 0, 0, 0, .2 );\n border-radius: inherit;\n opacity: 0;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: -1;\n transition: opacity 0.5s cubic-bezier(0.165, 0.84, 0.44, 1);\n}\n\n.shadow-hover:hover::after,\n.shadow-hover:focus::after {\n opacity: 1;\n}\n\n/* Combine with classes in skins and skins-pseudo for\n * many different transition possibilities. */\n\n.bg-animate,\n.bg-animate:hover,\n.bg-animate:focus {\n transition: background-color .15s ease-in-out;\n}\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n Z-INDEX\n\n Base\n z = z-index\n\n Modifiers\n -0 = literal value 0\n -1 = literal value 1\n -2 = literal value 2\n -3 = literal value 3\n -4 = literal value 4\n -5 = literal value 5\n -999 = literal value 999\n -9999 = literal value 9999\n\n -max = largest accepted z-index value as integer\n\n -inherit = string value inherit\n -initial = string value initial\n -unset = string value unset\n\n MDN: https://developer.mozilla.org/en/docs/Web/CSS/z-index\n Spec: http://www.w3.org/TR/CSS2/zindex.html\n Articles:\n https://philipwalton.com/articles/what-no-one-told-you-about-z-index/\n\n Tips on extending:\n There might be a time worth using negative z-index values.\n Or if you are using tachyons with another project, you might need to\n adjust these values to suit your needs.\n\n*/\n\n.z-0 { z-index: 0; }\n.z-1 { z-index: 1; }\n.z-2 { z-index: 2; }\n.z-3 { z-index: 3; }\n.z-4 { z-index: 4; }\n.z-5 { z-index: 5; }\n\n.z-999 { z-index: 999; }\n.z-9999 { z-index: 9999; }\n\n.z-max {\n z-index: 2147483647;\n}\n\n.z-inherit { z-index: inherit; }\n.z-initial { z-index: initial; }\n.z-unset { z-index: unset; }\n\n","\n// Converted Variables\n\n\n// Custom Media Query Variables\n\n\n/*\n\n NESTED\n Tachyons module for styling nested elements\n that are generated by a cms.\n\n*/\n\n.nested-copy-line-height p,\n.nested-copy-line-height ul,\n.nested-copy-line-height ol {\n line-height: $line-height-copy;\n}\n\n.nested-headline-line-height h1,\n.nested-headline-line-height h2,\n.nested-headline-line-height h3,\n.nested-headline-line-height h4,\n.nested-headline-line-height h5,\n.nested-headline-line-height h6 {\n line-height: $line-height-title;\n}\n\n.nested-list-reset ul,\n.nested-list-reset ol {\n padding-left: 0;\n margin-left: 0;\n list-style-type: none;\n}\n\n.nested-copy-indent p+p {\n text-indent: $letter-spacing-1;\n margin-top: $spacing-none;\n margin-bottom: $spacing-none;\n}\n\n.nested-copy-seperator p+p {\n margin-top: $spacing-copy-separator;\n}\n\n.nested-img img {\n width: 100%;\n max-width: 100%;\n display: block;\n}\n\n.nested-links a {\n color: $blue;\n transition: color .15s ease-in;\n}\n\n.nested-links a:hover,\n.nested-links a:focus {\n color: $light-blue;\n transition: color .15s ease-in;\n}\n",".wrapper\n{\n width: 100%;\n max-width: 1460px;\n margin: 0 auto;\n padding: 0 20px;\n box-sizing: border-box;\n}\n\n.opblock-tag-section\n{\n display: flex;\n flex-direction: column;\n}\n\n.try-out.btn-group {\n padding: 0;\n display: flex;\n flex: 0.1 2 auto;\n}\n\n.try-out__btn {\n margin-left: 1.25rem;\n}\n\n.opblock-tag\n{\n display: flex;\n align-items: center;\n\n padding: 10px 20px 10px 10px;\n\n cursor: pointer;\n transition: all .2s;\n\n border-bottom: 1px solid rgba($opblock-tag-border-bottom-color, .3);\n\n &:hover\n {\n background: rgba($opblock-tag-background-color-hover,.02);\n }\n}\n\n@mixin method($color)\n{\n border-color: $color;\n background: rgba($color, .1);\n\n .opblock-summary-method\n {\n background: $color;\n }\n\n .opblock-summary\n {\n border-color: $color;\n }\n\n .tab-header .tab-item.active h4 span:after\n {\n background: $color;\n }\n}\n\n\n\n\n.opblock-tag\n{\n font-size: 24px;\n\n margin: 0 0 5px 0;\n\n @include text_headline();\n\n &.no-desc\n {\n span\n {\n flex: 1;\n }\n }\n\n svg\n {\n transition: all .4s;\n }\n\n small\n {\n font-size: 14px;\n font-weight: normal;\n\n flex: 2;\n\n padding: 0 10px;\n\n @include text_body();\n }\n\n >div\n {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n flex: 1 1 150px;\n font-weight: 400;\n }\n\n @media (max-width: 640px) {\n small\n {\n flex: 1;\n }\n\n >div\n {\n flex: 1;\n }\n }\n\n .info__externaldocs\n {\n text-align: right;\n }\n}\n\n.parameter__type\n{\n font-size: 12px;\n\n padding: 5px 0;\n\n @include text_code();\n}\n\n.parameter-controls {\n margin-top: 0.75em;\n}\n\n.examples {\n &__title {\n display: block;\n font-size: 1.1em;\n font-weight: bold;\n margin-bottom: 0.75em;\n }\n\n &__section {\n margin-top: 1.5em;\n }\n &__section-header {\n font-weight: bold;\n font-size: .9rem;\n margin-bottom: .5rem;\n // color: #555;\n }\n}\n\n.examples-select {\n margin-bottom: .75em;\n display: inline-block;\n .examples-select-element {\n width: 100%;\n }\n &__section-label {\n font-weight: bold;\n font-size: .9rem;\n margin-right: .5rem;\n }\n}\n\n.example {\n &__section {\n margin-top: 1.5em;\n }\n &__section-header {\n font-weight: bold;\n font-size: .9rem;\n margin-bottom: .5rem;\n // color: #555;\n }\n}\n\n.view-line-link\n{\n position: relative;\n top: 3px;\n\n width: 20px;\n margin: 0 5px;\n\n cursor: pointer;\n transition: all .5s;\n}\n\n\n\n.opblock\n{\n margin: 0 0 15px 0;\n\n border: 1px solid $opblock-border-color;\n border-radius: 4px;\n box-shadow: 0 0 3px rgba($opblock-box-shadow-color,.19);\n\n .tab-header\n {\n display: flex;\n\n flex: 1;\n\n .tab-item\n {\n padding: 0 40px;\n\n cursor: pointer;\n\n &:first-of-type\n {\n padding: 0 40px 0 0;\n }\n &.active\n {\n h4\n {\n span\n {\n position: relative;\n\n\n &:after\n {\n position: absolute;\n bottom: -15px;\n left: 50%;\n\n width: 120%;\n height: 4px;\n\n content: '';\n transform: translateX(-50%);\n\n background: $opblock-tab-header-tab-item-active-h4-span-after-background-color;\n }\n }\n }\n }\n }\n }\n\n\n &.is-open\n {\n .opblock-summary\n {\n border-bottom: 1px solid $opblock-isopen-summary-border-bottom-color;\n }\n }\n\n .opblock-section-header\n {\n display: flex;\n align-items: center;\n\n padding: 8px 20px;\n\n min-height: 50px;\n\n background: rgba($opblock-isopen-section-header-background-color,.8);\n box-shadow: 0 1px 2px rgba($opblock-isopen-section-header-box-shadow-color,.1);\n\n >label\n {\n font-size: 12px;\n font-weight: bold;\n\n display: flex;\n align-items: center;\n\n margin: 0;\n margin-left: auto;\n\n @include text_headline();\n\n >span\n {\n padding: 0 10px 0 0;\n }\n }\n\n h4\n {\n font-size: 14px;\n\n flex: 1;\n\n margin: 0;\n\n @include text_headline();\n }\n }\n\n .opblock-summary-method\n {\n font-size: 14px;\n font-weight: bold;\n\n min-width: 80px;\n padding: 6px 0;\n\n text-align: center;\n\n border-radius: 3px;\n background: $opblock-summary-method-background-color;\n text-shadow: 0 1px 0 rgba($opblock-summary-method-text-shadow-color,.1);\n\n @include text_headline($opblock-summary-method-font-color);\n }\n\n .opblock-summary-path,\n .opblock-summary-operation-id,\n .opblock-summary-path__deprecated\n {\n font-size: 16px;\n @media (max-width: 768px) {\n font-size: 12px;\n }\n\n\n display: flex;\n align-items: center;\n\n word-break: break-word;\n\n padding: 0 10px;\n\n @include text_code();\n\n }\n\n .opblock-summary-path\n {\n flex-shrink: 0;\n max-width: calc(100% - 110px - 15rem);\n }\n\n @media (max-width: 640px) {\n .opblock-summary-path\n {\n flex-shrink: 1;\n max-width: 100%;\n }\n }\n\n .opblock-summary-path__deprecated\n {\n text-decoration: line-through;\n }\n\n .opblock-summary-operation-id\n {\n font-size: 14px;\n }\n\n .opblock-summary-description\n {\n font-size: 13px;\n\n flex: 1 1 auto;\n\n word-break: break-word;\n\n @include text_body();\n }\n\n .opblock-summary\n {\n display: flex;\n align-items: center;\n\n padding: 5px;\n\n cursor: pointer;\n\n .view-line-link\n {\n position: relative;\n top: 2px;\n\n width: 0;\n margin: 0;\n\n cursor: pointer;\n transition: all .5s;\n }\n\n &:hover\n {\n .view-line-link\n {\n width: 18px;\n margin: 0 5px;\n\n &.copy-to-clipboard {\n width: 24px;\n }\n }\n }\n }\n\n\n\n &.opblock-post\n {\n @include method($_color-post);\n }\n\n &.opblock-put\n {\n @include method($_color-put);\n }\n\n &.opblock-delete\n {\n @include method($_color-delete);\n }\n\n &.opblock-get\n {\n @include method($_color-get);\n }\n\n &.opblock-patch\n {\n @include method($_color-patch);\n }\n\n &.opblock-head\n {\n @include method($_color-head);\n }\n\n &.opblock-options\n {\n @include method($_color-options);\n }\n\n &.opblock-deprecated\n {\n opacity: .6;\n\n @include method($_color-disabled);\n }\n\n .opblock-schemes\n {\n padding: 8px 20px;\n\n .schemes-title\n {\n padding: 0 10px 0 0;\n }\n }\n}\n\n.filter\n{\n .operation-filter-input\n {\n width: 100%;\n margin: 20px 0;\n padding: 10px 10px;\n\n border: 2px solid $operational-filter-input-border-color;\n }\n}\n\n.filter, .download-url-wrapper\n{\n .failed\n {\n color: red;\n }\n\n .loading\n {\n color: #aaa;\n }\n}\n\n.model-example {\n margin-top: 1em;\n}\n\n.tab\n{\n display: flex;\n\n padding: 0;\n\n list-style: none;\n\n li\n {\n font-size: 12px;\n\n min-width: 60px;\n padding: 0;\n\n cursor: pointer;\n\n @include text_headline();\n\n &:first-of-type\n {\n position: relative;\n\n padding-left: 0;\n padding-right: 12px;\n\n &:after\n {\n position: absolute;\n top: 0;\n right: 6px;\n\n width: 1px;\n height: 100%;\n\n content: '';\n\n background: rgba($tab-list-item-first-background-color,.2);\n }\n }\n\n &.active\n {\n font-weight: bold;\n }\n\n button.tablinks\n {\n background: none;\n border: 0;\n padding: 0;\n\n color: inherit;\n font-family: inherit;\n font-weight: inherit;\n }\n }\n}\n\n.opblock-description-wrapper,\n.opblock-external-docs-wrapper,\n.opblock-title_normal\n{\n font-size: 12px;\n\n margin: 0 0 5px 0;\n padding: 15px 20px;\n\n @include text_body();\n\n h4\n {\n font-size: 12px;\n\n margin: 0 0 5px 0;\n\n @include text_body();\n }\n\n p\n {\n font-size: 14px;\n\n margin: 0;\n\n @include text_body();\n }\n}\n\n.opblock-external-docs-wrapper {\n h4 {\n padding-left: 0px;\n }\n}\n\n.execute-wrapper\n{\n padding: 20px;\n\n text-align: right;\n\n .btn\n {\n width: 100%;\n padding: 8px 40px;\n }\n}\n\n.body-param-options\n{\n display: flex;\n flex-direction: column;\n\n .body-param-edit\n {\n padding: 10px 0;\n }\n\n label\n {\n padding: 8px 0;\n select\n {\n margin: 3px 0 0 0;\n }\n }\n}\n\n.responses-inner\n{\n padding: 20px;\n\n h5,\n h4\n {\n font-size: 12px;\n\n margin: 10px 0 5px 0;\n\n @include text_body();\n }\n\n .curl\n {\n white-space: normal;\n }\n}\n\n.response-col_status\n{\n font-size: 14px;\n\n @include text_body();\n\n .response-undocumented\n {\n font-size: 11px;\n\n @include text_code($response-col-status-undocumented-font-color);\n }\n}\n\n.response-col_links\n{\n padding-left: 2em;\n max-width: 40em;\n font-size: 14px;\n\n @include text_body();\n\n .response-undocumented\n {\n font-size: 11px;\n\n @include text_code($response-col-links-font-color);\n }\n\n .operation-link\n {\n margin-bottom: 1.5em;\n\n .description\n {\n margin-bottom: 0.5em;\n }\n }\n}\n\n.opblock-body\n{\n .opblock-loading-animation\n {\n display: block;\n margin: 3em;\n margin-left: auto;\n margin-right: auto;\n }\n}\n\n.opblock-body pre.microlight\n{\n font-size: 12px;\n\n margin: 0;\n padding: 10px;\n\n white-space: pre-wrap;\n word-wrap: break-word;\n word-break: break-all;\n word-break: break-word;\n hyphens: auto;\n\n border-radius: 4px;\n background: $opblock-body-background-color;\n\n overflow-wrap: break-word;\n @include text_code($opblock-body-font-color);\n\n // disabled to have syntax highliting with react-syntax-highlight\n // span\n // {\n // color: $opblock-body-font-color !important;\n // }\n\n .headerline\n {\n display: block;\n }\n}\n\n.highlight-code {\n position: relative;\n\n > .microlight {\n overflow-y: auto;\n max-height: 400px;\n min-height: 6em;\n\n code {\n white-space: pre-wrap !important;\n word-break: break-all;\n }\n }\n}\n.curl-command {\n position: relative;\n}\n\n.download-contents {\n position: absolute;\n bottom: 10px;\n right: 10px;\n background: #7d8293;\n text-align: center;\n padding: 5px;\n border: none;\n border-radius: 4px;\n font-family: sans-serif;\n font-weight: 600;\n color: white;\n font-size: 14px;\n height: 30px;\n justify-content: center;\n align-items: center;\n display: flex;\n}\n\n.scheme-container\n{\n margin: 0 0 20px 0;\n padding: 30px 0;\n\n background: $scheme-container-background-color;\n box-shadow: 0 1px 2px 0 rgba($scheme-container-box-shadow-color,.15);\n\n .schemes\n {\n display: flex;\n align-items: flex-end;\n\n > label\n {\n font-size: 12px;\n font-weight: bold;\n\n display: flex;\n flex-direction: column;\n\n margin: -20px 15px 0 0;\n\n @include text_headline();\n\n select\n {\n min-width: 130px;\n\n text-transform: uppercase;\n }\n }\n }\n}\n\n.loading-container\n{\n padding: 40px 0 60px;\n margin-top: 1em;\n min-height: 1px;\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: column;\n\n .loading\n {\n position: relative;\n\n\n &:after\n {\n font-size: 10px;\n font-weight: bold;\n\n position: absolute;\n top: 50%;\n left: 50%;\n\n content: 'loading';\n transform: translate(-50%,-50%);\n text-transform: uppercase;\n\n @include text_headline();\n }\n\n &:before\n {\n position: absolute;\n top: 50%;\n left: 50%;\n\n display: block;\n\n width: 60px;\n height: 60px;\n margin: -30px -30px;\n\n content: '';\n animation: rotation 1s infinite linear, opacity .5s;\n\n opacity: 1;\n border: 2px solid rgba($loading-container-before-border-color, .1);\n border-top-color: rgba($loading-container-before-border-top-color, .6);\n border-radius: 100%;\n\n backface-visibility: hidden;\n\n @keyframes rotation\n {\n to\n {\n transform: rotate(360deg);\n }\n }\n }\n }\n}\n\n.response-controls {\n padding-top: 1em;\n display: flex;\n}\n\n.response-control-media-type {\n margin-right: 1em;\n\n &--accept-controller {\n select {\n border-color: $response-content-type-controls-accept-header-select-border-color;\n }\n }\n\n &__accept-message {\n color: $response-content-type-controls-accept-header-small-font-color;\n font-size: .7em;\n }\n\n &__title {\n display: block;\n margin-bottom: 0.2em;\n font-size: .7em;\n }\n}\n\n.response-control-examples {\n &__title {\n display: block;\n margin-bottom: 0.2em;\n font-size: .7em;\n }\n}\n\n@keyframes blinker\n{\n 50%\n {\n opacity: 0;\n }\n}\n\n.hidden\n{\n display: none;\n}\n\n.no-margin\n{\n height: auto;\n border: none;\n margin: 0;\n padding: 0;\n}\n\n.float-right\n{\n float: right;\n}\n\n.svg-assets\n{\n position: absolute;\n width: 0;\n height: 0;\n}\n\nsection\n{\n h3\n {\n @include text_headline();\n }\n}\n\na.nostyle {\n text-decoration: inherit;\n color: inherit;\n cursor: pointer;\n display: inline;\n\n &:visited {\n text-decoration: inherit;\n color: inherit;\n cursor: pointer;\n }\n}\n\n.fallback\n{\n padding: 1em;\n color: #aaa;\n}\n\n.version-pragma {\n height: 100%;\n padding: 5em 0px;\n\n &__message {\n display: flex;\n justify-content: center;\n height: 100%;\n font-size: 1.2em;\n text-align: center;\n line-height: 1.5em;\n\n padding: 0px .6em;\n\n > div {\n max-width: 55ch;\n flex: 1;\n }\n\n code {\n background-color: #dedede;\n padding: 4px 4px 2px;\n white-space: pre;\n }\n }\n}\n\n.opblock-link\n{\n font-weight: normal;\n\n &.shown\n {\n font-weight: bold;\n }\n}\n\nspan\n{\n &.token-string\n {\n color: #555;\n }\n\n &.token-not-formatted\n {\n color: #555;\n font-weight: bold;\n }\n}\n",".btn\n{\n font-size: 14px;\n font-weight: bold;\n\n padding: 5px 23px;\n\n transition: all .3s;\n\n border: 2px solid $btn-border-color;\n border-radius: 4px;\n background: transparent;\n box-shadow: 0 1px 2px rgba($btn-box-shadow-color,.1);\n\n @include text_headline();\n\n &.btn-sm\n {\n font-size: 12px;\n padding: 4px 23px;\n }\n\n &[disabled]\n {\n cursor: not-allowed;\n\n opacity: .3;\n }\n\n &:hover\n {\n box-shadow: 0 0 5px rgba($btn-box-shadow-color,.3);\n }\n\n &.cancel\n {\n border-color: $btn-cancel-border-color;\n background-color: $btn-cancel-background-color;\n @include text_headline($btn-cancel-font-color);\n }\n\n &.authorize\n {\n line-height: 1;\n\n display: inline;\n\n color: $btn-authorize-font-color;\n border-color: $btn-authorize-border-color;\n background-color: $btn-authorize-background-color;\n\n span\n {\n float: left;\n\n padding: 4px 20px 0 0;\n }\n\n svg\n {\n fill: $btn-authorize-svg-fill-color;\n }\n }\n\n &.execute\n {\n background-color: $btn-execute-background-color-alt;\n color: $btn-execute-font-color;\n border-color: $btn-execute-border-color;\n }\n}\n\n.btn-group\n{\n display: flex;\n\n padding: 30px;\n\n .btn\n {\n flex: 1;\n\n &:first-child\n {\n border-radius: 4px 0 0 4px;\n }\n\n &:last-child\n {\n border-radius: 0 4px 4px 0;\n }\n }\n}\n\n.authorization__btn\n{\n padding: 0 0 0 10px;\n\n border: none;\n background: none;\n\n .locked\n {\n opacity: 1;\n }\n\n .unlocked\n {\n opacity: .4;\n }\n}\n\n.opblock-summary-control,\n.models-control,\n.model-box-control\n{\n all: inherit;\n flex: 1;\n border-bottom: 0;\n padding: 0;\n cursor: pointer;\n\n &:focus {\n outline: auto;\n }\n}\n\n.expand-methods,\n.expand-operation\n{\n border: none;\n background: none;\n\n svg\n {\n width: 20px;\n height: 20px;\n }\n}\n\n.expand-methods\n{\n padding: 0 10px;\n\n &:hover\n {\n svg\n {\n fill: $expand-methods-svg-fill-color-hover;\n }\n }\n\n svg\n {\n transition: all .3s;\n\n fill: $expand-methods-svg-fill-color;\n }\n}\n\nbutton\n{\n cursor: pointer;\n\n &.invalid\n {\n @include invalidFormElement();\n }\n}\n\n.copy-to-clipboard\n{\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n bottom: 10px;\n right: 100px;\n width: 30px;\n height: 30px;\n background: #7d8293;\n border-radius: 4px;\n border: none;\n\n button\n {\n flex-grow: 1;\n flex-shrink: 1;\n border: none;\n height: 25px;\n background: url(\"data:image/svg+xml, \") center center no-repeat;\n }\n}\n\n.copy-to-clipboard:active\n{\n background: #5e626f;\n}\n\n.opblock-control-arrow\n{\n border: none;\n text-align: center;\n background: none;\n}\n\n// overrides for smaller copy button for curl command\n.curl-command .copy-to-clipboard\n{\n bottom: 5px;\n right: 10px;\n width: 20px;\n height: 20px;\n\n button\n {\n height: 18px;\n }\n}\n\n// overrides for copy to clipboard button\n.opblock .opblock-summary .view-line-link.copy-to-clipboard\n{\n height: 26px;\n position: unset;\n}\n","// - - - - - - - - - - - - - - - - - - -\n// - - _mixins.scss module\n// styles for the _mixins.scss module\n@function calculateRem($size)\n{\n $remSize: $size / 16px;\n @return $remSize * 1rem;\n}\n\n@mixin font-size($size)\n{\n font-size: $size;\n font-size: calculateRem($size);\n}\n\n%clearfix\n{\n &:before,\n &:after\n {\n display: table;\n\n content: ' ';\n }\n &:after\n {\n clear: both;\n }\n}\n\n@mixin size($width, $height: $width)\n{\n width: $width;\n height: $height;\n}\n\n$ease: (\n in-quad: cubic-bezier(.550, .085, .680, .530),\n in-cubic: cubic-bezier(.550, .055, .675, .190),\n in-quart: cubic-bezier(.895, .030, .685, .220),\n in-quint: cubic-bezier(.755, .050, .855, .060),\n in-sine: cubic-bezier(.470, .000, .745, .715),\n in-expo: cubic-bezier(.950, .050, .795, .035),\n in-circ: cubic-bezier(.600, .040, .980, .335),\n in-back: cubic-bezier(.600, -.280, .735, .045),\n out-quad: cubic-bezier(.250, .460, .450, .940),\n out-cubic: cubic-bezier(.215, .610, .355, 1.000),\n out-quart: cubic-bezier(.165, .840, .440, 1.000),\n out-quint: cubic-bezier(.230, 1.000, .320, 1.000),\n out-sine: cubic-bezier(.390, .575, .565, 1.000),\n out-expo: cubic-bezier(.190, 1.000, .220, 1.000),\n out-circ: cubic-bezier(.075, .820, .165, 1.000),\n out-back: cubic-bezier(.175, .885, .320, 1.275),\n in-out-quad: cubic-bezier(.455, .030, .515, .955),\n in-out-cubic: cubic-bezier(.645, .045, .355, 1.000),\n in-out-quart: cubic-bezier(.770, .000, .175, 1.000),\n in-out-quint: cubic-bezier(.860, .000, .070, 1.000),\n in-out-sine: cubic-bezier(.445, .050, .550, .950),\n in-out-expo: cubic-bezier(1.000, .000, .000, 1.000),\n in-out-circ: cubic-bezier(.785, .135, .150, .860),\n in-out-back: cubic-bezier(.680, -.550, .265, 1.550)\n);\n\n@function ease($key)\n{\n @if map-has-key($ease, $key)\n {\n @return map-get($ease, $key);\n }\n\n @warn 'Unkown \\'#{$key}\\' in $ease.';\n @return null;\n}\n\n\n@mixin ease($key)\n{\n transition-timing-function: ease($key);\n}\n\n@mixin text-truncate\n{\n overflow: hidden;\n\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n@mixin aspect-ratio($width, $height)\n{\n position: relative;\n &:before\n {\n display: block;\n\n width: 100%;\n padding-top: ($height / $width) * 100%;\n\n content: '';\n }\n > iframe\n {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n}\n\n$browser-context: 16;\n\n@function em($pixels, $context: $browser-context)\n{\n @if (unitless($pixels))\n {\n $pixels: $pixels * 1px;\n }\n\n @if (unitless($context))\n {\n $context: $context * 1px;\n }\n\n @return $pixels / $context * 1em;\n}\n\n@mixin maxHeight($height)\n{\n @media (max-height: $height)\n {\n @content;\n }\n}\n\n\n@mixin breakpoint($class)\n{\n @if $class == tablet\n {\n @media (min-width: 768px) and (max-width: 1024px)\n {\n @content;\n }\n }\n\n @else if $class == mobile\n {\n @media (min-width: 320px) and (max-width : 736px)\n {\n @content;\n }\n }\n\n @else if $class == desktop\n {\n @media (min-width: 1400px)\n {\n @content;\n }\n }\n\n @else\n {\n @warn 'Breakpoint mixin supports: tablet, mobile, desktop';\n }\n}\n\n@mixin invalidFormElement() {\n animation: shake .4s 1;\n border-color: $_color-delete;\n background: lighten($_color-delete, 35%);\n}\n","select\n{\n font-size: 14px;\n font-weight: bold;\n\n padding: 5px 40px 5px 10px;\n\n border: 2px solid $form-select-border-color;\n border-radius: 4px;\n background: $form-select-background-color url('data:image/svg+xml, ') right 10px center no-repeat;\n background-size: 20px;\n box-shadow: 0 1px 2px 0 rgba($form-select-box-shadow-color, .25);\n\n @include text_headline();\n appearance: none;\n\n &[multiple]\n {\n margin: 5px 0;\n padding: 5px;\n\n background: $form-select-background-color;\n }\n\n &.invalid {\n @include invalidFormElement();\n }\n}\n\n.opblock-body select\n{\n min-width: 230px;\n @media (max-width: 768px)\n {\n min-width: 180px;\n }\n @media (max-width: 640px)\n {\n width: 100%;\n min-width: 100%;\n }\n}\n\nlabel\n{\n font-size: 12px;\n font-weight: bold;\n\n margin: 0 0 5px 0;\n\n @include text_headline();\n}\n\ninput[type=text],\ninput[type=password],\ninput[type=search],\ninput[type=email],\ninput[type=file]\n{\n line-height: 1;\n\n @media (max-width: 768px) {\n max-width: 175px;\n }\n}\n\n\ninput[type=text],\ninput[type=password],\ninput[type=search],\ninput[type=email],\ninput[type=file],\ntextarea\n{\n min-width: 100px;\n margin: 5px 0;\n padding: 8px 10px;\n\n border: 1px solid $form-input-border-color;\n border-radius: 4px;\n background: $form-input-background-color;\n\n\n &.invalid\n {\n @include invalidFormElement();\n }\n\n}\n\ninput,\ntextarea,\nselect {\n &[disabled] {\n // opacity: 0.85;\n background-color: #fafafa;\n color: #888;\n cursor: not-allowed;\n }\n}\n\nselect[disabled] {\n border-color: #888;\n}\n\ntextarea[disabled] {\n background-color: #41444e;\n color: #fff;\n}\n\n@keyframes shake\n{\n 10%,\n 90%\n {\n transform: translate3d(-1px, 0, 0);\n }\n\n 20%,\n 80%\n {\n transform: translate3d(2px, 0, 0);\n }\n\n 30%,\n 50%,\n 70%\n {\n transform: translate3d(-4px, 0, 0);\n }\n\n 40%,\n 60%\n {\n transform: translate3d(4px, 0, 0);\n }\n}\n\ntextarea\n{\n font-size: 12px;\n\n width: 100%;\n min-height: 280px;\n padding: 10px;\n\n border: none;\n border-radius: 4px;\n outline: none;\n background: rgba($form-textarea-background-color,.8);\n\n @include text_code();\n\n &:focus\n {\n border: 2px solid $form-textarea-focus-border-color;\n }\n\n &.curl\n {\n font-size: 12px;\n\n min-height: 100px;\n margin: 0;\n padding: 10px;\n\n resize: none;\n\n border-radius: 4px;\n background: $form-textarea-curl-background-color;\n\n @include text_code($form-textarea-curl-font-color);\n }\n}\n\n\n.checkbox\n{\n padding: 5px 0 10px;\n\n transition: opacity .5s;\n\n color: $form-checkbox-label-font-color;\n\n label\n {\n display: flex;\n }\n\n p\n {\n font-weight: normal !important;\n font-style: italic;\n\n margin: 0 !important;\n\n @include text_code();\n }\n\n input[type=checkbox]\n {\n display: none;\n\n & + label > .item\n {\n position: relative;\n top: 3px;\n\n display: inline-block;\n\n width: 16px;\n height: 16px;\n margin: 0 8px 0 0;\n padding: 5px;\n\n cursor: pointer;\n\n border-radius: 1px;\n background: $form-checkbox-background-color;\n box-shadow: 0 0 0 2px $form-checkbox-box-shadow-color;\n\n flex: none;\n\n &:active\n {\n transform: scale(.9);\n }\n }\n\n &:checked + label > .item\n {\n background: $form-checkbox-background-color url('data:image/svg+xml, ') center center no-repeat;\n }\n }\n}\n",".dialog-ux\n{\n position: fixed;\n z-index: 9999;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n\n .backdrop-ux\n {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n\n background: rgba($dialog-ux-backdrop-background-color,.8);\n }\n\n .modal-ux\n {\n position: absolute;\n z-index: 9999;\n top: 50%;\n left: 50%;\n\n width: 100%;\n min-width: 300px;\n max-width: 650px;\n\n transform: translate(-50%,-50%);\n\n border: 1px solid $dialog-ux-modal-border-color;\n border-radius: 4px;\n background: $dialog-ux-modal-background-color;\n box-shadow: 0 10px 30px 0 rgba($dialog-ux-modal-box-shadow-color,.20);\n }\n\n .modal-ux-content\n {\n overflow-y: auto;\n\n max-height: 540px;\n padding: 20px;\n\n p\n {\n font-size: 12px;\n\n margin: 0 0 5px 0;\n\n color: $dialog-ux-modal-content-font-color;\n\n @include text_body();\n }\n\n h4\n {\n font-size: 18px;\n font-weight: 600;\n\n margin: 15px 0 0 0;\n\n @include text_headline();\n }\n }\n\n .modal-ux-header\n {\n display: flex;\n\n padding: 12px 0;\n\n border-bottom: 1px solid $dialog-ux-modal-header-border-bottom-color;\n\n align-items: center;\n\n .close-modal\n {\n padding: 0 10px;\n\n border: none;\n background: none;\n\n appearance: none;\n }\n\n\n h3\n {\n font-size: 20px;\n font-weight: 600;\n\n margin: 0;\n padding: 0 20px;\n\n flex: 1;\n @include text_headline();\n }\n }\n}\n",".model\n{\n font-size: 12px;\n font-weight: 300;\n\n @include text_code();\n\n .deprecated\n {\n span,\n td\n {\n color: $model-deprecated-font-color !important;\n }\n\n > td:first-of-type {\n text-decoration: line-through;\n }\n }\n &-toggle\n {\n font-size: 10px;\n\n position: relative;\n top: 6px;\n\n display: inline-block;\n\n margin: auto .3em;\n\n cursor: pointer;\n transition: transform .15s ease-in;\n transform: rotate(90deg);\n transform-origin: 50% 50%;\n\n &.collapsed\n {\n transform: rotate(0deg);\n }\n\n &:after\n {\n display: block;\n\n width: 20px;\n height: 20px;\n\n content: '';\n\n background: url('data:image/svg+xml, ') center no-repeat;\n background-size: 100%;\n }\n }\n\n &-jump-to-path\n {\n position: relative;\n\n cursor: pointer;\n\n .view-line-link\n {\n position: absolute;\n top: -.4em;\n\n cursor: pointer;\n }\n }\n\n &-title\n {\n position: relative;\n\n &:hover .model-hint\n {\n visibility: visible;\n }\n }\n\n &-hint\n {\n position: absolute;\n top: -1.8em;\n\n visibility: hidden;\n\n padding: .1em .5em;\n\n white-space: nowrap;\n\n color: $model-hint-font-color;\n border-radius: 4px;\n background: rgba($model-hint-background-color,.7);\n }\n\n p\n {\n margin: 0 0 1em 0;\n }\n\n .property\n {\n color: #999;\n font-style: italic;\n\n &.primitive\n {\n color: #6b6b6b;\n }\n }\n\n .external-docs\n {\n color: #666;\n font-weight: normal;\n }\n}\n\ntable.model\n{\n tr\n {\n &.description\n {\n color: #666;\n font-weight: normal;\n \n td:first-child\n {\n font-weight: bold;\n }\n }\n\n &.property-row\n {\n &.required td:first-child\n {\n font-weight: bold;\n }\n\n td\n {\n vertical-align: top;\n\n &:first-child\n {\n padding-right: 0.2em;\n }\n }\n\n .star\n {\n color: red;\n }\n }\n\n &.extension\n {\n color: #777;\n\n td:last-child\n {\n vertical-align: top;\n }\n }\n\n &.external-docs\n {\n td:first-child\n {\n font-weight: bold;\n }\n }\n\n .renderedMarkdown p:first-child\n {\n margin-top: 0;\n } \n }\n}\n\nsection.models\n{\n margin: 30px 0;\n\n border: 1px solid rgba($section-models-border-color, .3);\n border-radius: 4px;\n\n .pointer\n {\n cursor: pointer;\n }\n\n &.is-open\n {\n padding: 0 0 20px;\n h4\n {\n margin: 0 0 5px 0;\n\n border-bottom: 1px solid rgba($section-models-isopen-h4-border-bottom-color, .3);\n }\n }\n h4\n {\n font-size: 16px;\n\n display: flex;\n align-items: center;\n\n margin: 0;\n padding: 10px 20px 10px 10px;\n\n cursor: pointer;\n transition: all .2s;\n\n @include text_headline($section-models-h4-font-color);\n\n svg\n {\n transition: all .4s;\n }\n\n span\n {\n flex: 1;\n }\n\n &:hover\n {\n background: rgba($section-models-h4-background-color-hover,.02);\n }\n }\n\n h5\n {\n font-size: 16px;\n\n margin: 0 0 10px 0;\n\n @include text_headline($section-models-h5-font-color);\n }\n\n .model-jump-to-path\n {\n position: relative;\n top: 5px;\n }\n\n .model-container\n {\n margin: 0 20px 15px;\n position: relative;\n\n transition: all .5s;\n\n border-radius: 4px;\n background: rgba($section-models-model-container-background-color,.05);\n\n &:hover\n {\n background: rgba($section-models-model-container-background-color,.07);\n }\n\n &:first-of-type\n {\n margin: 20px;\n }\n\n &:last-of-type\n {\n margin: 0 20px;\n }\n\n .models-jump-to-path {\n position: absolute;\n top: 8px;\n right: 5px;\n opacity: 0.65;\n }\n }\n\n .model-box\n {\n background: none;\n }\n}\n\n\n.model-box\n{\n padding: 10px;\n display: inline-block;\n\n border-radius: 4px;\n background: rgba($section-models-model-box-background-color,.1);\n\n .model-jump-to-path\n {\n position: relative;\n top: 4px;\n }\n\n &.deprecated\n {\n opacity: .5;\n }\n}\n\n\n.model-title\n{\n font-size: 16px;\n\n @include text_headline($section-models-model-title-font-color);\n\n img\n {\n margin-left: 1em;\n position: relative;\n bottom: 0px;\n }\n}\n\n.model-deprecated-warning\n{\n font-size: 16px;\n font-weight: 600;\n\n margin-right: 1em;\n\n @include text_headline($_color-delete);\n}\n\n\nspan\n{\n > span.model\n {\n .brace-close\n {\n padding: 0 0 0 10px;\n }\n }\n}\n\n.prop-name\n{\n display: inline-block;\n\n margin-right: 1em;\n}\n\n.prop-type\n{\n color: $prop-type-font-color;\n}\n\n.prop-enum\n{\n display: block;\n}\n.prop-format\n{\n color: $prop-format-font-color;\n}\n",".servers\n{\n > label\n {\n font-size: 12px;\n\n margin: -20px 15px 0 0;\n\n @include text_headline();\n\n select\n {\n min-width: 130px;\n max-width: 100%;\n width: 100%;\n }\n }\n\n h4.message {\n padding-bottom: 2em;\n }\n\n table {\n tr {\n width: 30em;\n }\n td {\n display: inline-block;\n max-width: 15em;\n vertical-align: middle;\n padding-top: 10px;\n padding-bottom: 10px;\n\n &:first-of-type {\n padding-right: 1em;\n }\n\n input {\n width: 100%;\n height: 100%;\n }\n }\n }\n\n .computed-url {\n margin: 2em 0;\n\n code {\n display: inline-block;\n padding: 4px;\n font-size: 16px;\n margin: 0 1em;\n }\n }\n}\n\n.servers-title {\n font-size: 12px;\n font-weight: bold;\n}\n\n.operation-servers {\n h4.message {\n margin-bottom: 2em;\n }\n}\n","table\n{\n width: 100%;\n padding: 0 10px;\n\n border-collapse: collapse;\n\n &.model\n {\n tbody\n {\n tr\n {\n td\n {\n padding: 0;\n\n vertical-align: top;\n\n &:first-of-type\n {\n width: 174px;\n padding: 0 0 0 2em;\n }\n }\n }\n }\n }\n\n &.headers\n {\n td\n {\n font-size: 12px;\n font-weight: 300;\n\n vertical-align: middle;\n\n @include text_code();\n }\n\n .header-example\n {\n color: #999;\n font-style: italic;\n }\n }\n\n tbody\n {\n tr\n {\n td\n {\n padding: 10px 0 0 0;\n\n vertical-align: top;\n\n &:first-of-type\n {\n min-width: 6em;\n padding: 10px 0;\n }\n }\n }\n }\n\n thead\n {\n tr\n {\n th,\n td\n {\n font-size: 12px;\n font-weight: bold;\n\n padding: 12px 0;\n\n text-align: left;\n\n border-bottom: 1px solid rgba($table-thead-td-border-bottom-color, .2);\n\n @include text_body();\n }\n }\n }\n}\n\n.parameters-col_description\n{\n width: 99%; // forces other columns to shrink to their content widths\n margin-bottom: 2em;\n input\n {\n width: 100%;\n max-width: 340px;\n }\n\n select {\n border-width: 1px;\n }\n\n .markdown, .renderedMarkdown {\n p {\n margin: 0;\n }\n }\n}\n\n.parameter__name\n{\n font-size: 16px;\n font-weight: normal;\n\n // hack to give breathing room to the name column\n // TODO: refactor all of this to flexbox\n margin-right: .75em;\n\n @include text_headline();\n\n &.required\n {\n font-weight: bold;\n\n span\n {\n color: red;\n }\n\n &:after\n {\n font-size: 10px;\n\n position: relative;\n top: -6px;\n\n padding: 5px;\n\n content: 'required';\n\n color: rgba($table-parameter-name-required-font-color, .6);\n }\n }\n}\n\n.parameter__in,\n.parameter__extension\n{\n font-size: 12px;\n font-style: italic;\n\n @include text_code($table-parameter-in-font-color);\n}\n\n.parameter__deprecated\n{\n font-size: 12px;\n font-style: italic;\n\n @include text_code($table-parameter-deprecated-font-color);\n}\n\n.parameter__empty_value_toggle {\n display: block;\n font-size: 13px;\n padding-top: 5px;\n padding-bottom: 12px;\n\n input {\n margin-right: 7px;\n width: auto;\n }\n\n &.disabled {\n opacity: 0.7;\n }\n}\n\n\n.table-container\n{\n padding: 20px;\n}\n\n\n.response-col_description {\n width: 99%; // forces other columns to shrink to their content widths\n\n .markdown, .renderedMarkdown {\n p {\n margin: 0;\n }\n }\n}\n\n.response-col_links {\n min-width: 6em;\n}\n\n.response__extension\n{\n font-size: 12px;\n font-style: italic;\n\n @include text_code($table-parameter-in-font-color);\n}\n",".topbar\n{\n padding: 10px 0;\n\n background-color: $topbar-background-color;\n .topbar-wrapper\n {\n display: flex;\n align-items: center;\n }\n a\n {\n font-size: 1.5em;\n font-weight: bold;\n\n display: flex;\n align-items: center;\n flex: 1;\n\n max-width: 300px;\n\n text-decoration: none;\n\n @include text_headline($topbar-link-font-color);\n\n span\n {\n margin: 0;\n padding: 0 10px;\n }\n }\n\n .download-url-wrapper\n {\n display: flex;\n flex: 3;\n justify-content: flex-end;\n\n input[type=text]\n {\n width: 100%;\n margin: 0;\n\n border: 2px solid $topbar-download-url-wrapper-element-border-color;\n border-radius: 4px 0 0 4px;\n outline: none;\n }\n\n .select-label\n {\n display: flex;\n align-items: center;\n\n width: 100%;\n max-width: 600px;\n margin: 0;\n color: #f0f0f0;\n span\n {\n font-size: 16px;\n\n flex: 1;\n\n padding: 0 10px 0 0;\n\n text-align: right;\n }\n\n select\n {\n flex: 2;\n\n width: 100%;\n\n border: 2px solid $topbar-download-url-wrapper-element-border-color;\n outline: none;\n box-shadow: none;\n }\n }\n\n\n .download-url-button\n {\n font-size: 16px;\n font-weight: bold;\n\n padding: 4px 30px;\n\n border: none;\n border-radius: 0 4px 4px 0;\n background: $topbar-download-url-button-background-color;\n\n @include text_headline($topbar-download-url-button-font-color);\n }\n }\n}\n",".info\n{\n margin: 50px 0;\n\n &.failed-config\n { \n max-width: 880px;\n margin-left: auto;\n margin-right: auto;\n text-align: center\n }\n\n hgroup.main\n {\n margin: 0 0 20px 0;\n a\n {\n font-size: 12px;\n }\n }\n pre \n {\n font-size: 14px;\n }\n p, li, table\n {\n font-size: 14px;\n\n @include text_body();\n }\n\n h1, h2, h3, h4, h5\n {\n @include text_body();\n }\n\n a\n {\n font-size: 14px;\n\n transition: all .4s;\n\n @include text_body($info-link-font-color);\n\n &:hover\n {\n color: darken($info-link-font-color-hover, 15%);\n }\n }\n > div\n {\n margin: 0 0 5px 0;\n }\n\n .base-url\n {\n font-size: 12px;\n font-weight: 300 !important;\n\n margin: 0;\n\n @include text_code();\n }\n\n .title\n {\n font-size: 36px;\n\n margin: 0;\n\n @include text_body();\n\n small\n {\n font-size: 10px;\n\n position: relative;\n top: -5px;\n\n display: inline-block;\n\n margin: 0 0 0 5px;\n padding: 2px 4px;\n\n vertical-align: super;\n\n border-radius: 57px;\n background: $info-title-small-background-color;\n \n &.version-stamp\n {\n background-color: #89bf04;\n }\n\n pre\n {\n margin: 0;\n padding: 0;\n\n @include text_headline($info-title-small-pre-font-color);\n }\n }\n }\n}\n",".auth-btn-wrapper\n{\n display: flex;\n\n padding: 10px 0;\n\n justify-content: center;\n\n .btn-done {\n margin-right: 1em;\n }\n}\n\n.auth-wrapper\n{\n display: flex;\n\n flex: 1;\n justify-content: flex-end;\n\n .authorize\n {\n padding-right: 20px;\n margin-left: 10px;\n margin-right: 10px;\n }\n}\n\n.auth-container\n{\n margin: 0 0 10px 0;\n padding: 10px 20px;\n\n border-bottom: 1px solid $auth-container-border-color;\n\n &:last-of-type\n {\n margin: 0;\n padding: 10px 20px;\n\n border: 0;\n }\n\n h4\n {\n margin: 5px 0 15px 0 !important;\n }\n\n .wrapper\n {\n margin: 0;\n padding: 0;\n }\n\n input[type=text],\n input[type=password]\n {\n min-width: 230px;\n }\n\n .errors\n {\n font-size: 12px;\n\n padding: 10px;\n\n border-radius: 4px;\n\n background-color: #ffeeee;\n\n color: red;\n\n margin: 1em;\n\n @include text_code();\n\n b\n {\n text-transform: capitalize;\n margin-right: 1em;\n }\n }\n}\n\n.scopes\n{\n h2\n {\n font-size: 14px;\n\n @include text_headline();\n\n a\n {\n font-size: 12px;\n color: $auth-select-all-none-link-font-color;\n cursor: pointer;\n padding-left: 10px;\n text-decoration: underline;\n }\n }\n}\n\n.scope-def\n{\n padding: 0 0 20px 0;\n}\n",".errors-wrapper\n{\n margin: 20px;\n padding: 10px 20px;\n\n animation: scaleUp .5s;\n\n border: 2px solid $_color-delete;\n border-radius: 4px;\n background: rgba($_color-delete, .1);\n\n .error-wrapper\n {\n margin: 0 0 10px 0;\n }\n\n .errors\n {\n h4\n {\n font-size: 14px;\n\n margin: 0;\n\n @include text_code();\n }\n\n small\n {\n color: $errors-wrapper-errors-small-font-color;\n }\n\n .message\n { \n white-space: pre-line;\n \n &.thrown\n {\n max-width: 100%;\n }\n }\n\n .error-line\n {\n text-decoration: underline;\n cursor: pointer;\n }\n }\n\n hgroup\n {\n display: flex;\n\n align-items: center;\n\n h4\n {\n font-size: 20px;\n\n margin: 0;\n\n flex: 1;\n @include text_headline();\n }\n }\n}\n\n\n@keyframes scaleUp\n{\n 0%\n {\n transform: scale(.8);\n\n opacity: 0;\n }\n 100%\n {\n transform: scale(1);\n\n opacity: 1;\n }\n}\n",".Resizer.vertical.disabled {\n display: none;\n}",".markdown, .renderedMarkdown {\n p, pre {\n margin: 1em auto;\n\n word-break: break-all; /* Fallback trick */\n word-break: break-word;\n }\n pre {\n color: black;\n font-weight: normal;\n white-space: pre-wrap;\n background: none;\n padding: 0px;\n }\n\n code {\n font-size: 14px;\n padding: 5px 7px;\n\n border-radius: 4px;\n background: rgba($info-code-background-color,.05);\n\n @include text_code($info-code-font-color);\n }\n\n pre > code {\n display: block;\n }\n}\n",".json-schema-2020-12 {\n margin: 0 20px 15px 20px;\n border-radius: 4px;\n padding: 12px 0 12px 20px;\n background-color: rgba($section-models-model-container-background-color, .05);\n\n &:first-of-type {\n margin: 20px;\n }\n\n &:last-of-type {\n margin: 0 20px;\n }\n\n &--embedded {\n background-color: inherit;\n padding: 0 inherit 0 inherit;\n }\n\n &-body {\n @include expansion-border;\n margin: 2px 0;\n\n &--collapsed {\n display: none;\n }\n }\n}\n\n\n","@mixin expansion-border {\n margin: 0 0 0 20px;\n border-left: 1px dashed rgba($section-models-model-container-background-color, 0.1);\n}\n\n@import './JSONSchema/json-schema';\n@import './Accordion/accordion';\n@import './ExpandDeepButton/expand-deep-button';\n@import './keywords/all';\n",".json-schema-2020-12-accordion {\n outline: none;\n border: none;\n padding-left: 0;\n\n &__children {\n display: inline-block;\n }\n\n &__icon {\n width: 18px;\n height: 18px;\n display: inline-block;\n vertical-align: bottom;\n\n &--expanded {\n transition: transform .15s ease-in;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n }\n\n &--collapsed {\n transition: transform .15s ease-in;\n transform: rotate(0deg);\n transform-origin: 50% 50%;\n }\n\n & svg {\n height: 20px;\n width: 20px;\n }\n }\n}\n\n",".json-schema-2020-12-expand-deep-button {\n @include text_headline($section-models-model-title-font-color);\n font-size: 12px;\n color: rgb(175, 174, 174);\n border: none;\n padding-right: 0;\n}\n",".json-schema-2020-12-keyword {\n margin: 5px 0 5px 0;\n\n &__children {\n @include expansion-border;\n padding: 0;\n\n &--collapsed {\n display: none;\n }\n }\n\n &__name {\n font-size: 12px;\n margin-left: 20px;\n font-weight: bold;\n\n &--primary {\n color: $text-code-default-font-color;\n font-style: normal;\n }\n\n &--secondary {\n color: #6b6b6b;\n font-style: italic;\n }\n }\n\n &__value {\n color: #6b6b6b;\n font-style: italic;\n font-size: 12px;\n font-weight: normal;\n\n &--primary {\n color: $text-code-default-font-color;\n font-style: normal;\n }\n\n &--secondary {\n color: #6b6b6b;\n font-style: italic;\n }\n\n &--const {\n @include text_code();\n color: #6b6b6b;\n font-style: normal;\n display: inline-block;\n margin-left: 10px;\n line-height: 1.5;\n padding: 1px 4px 1px 4px;\n border: 1px dashed #6b6b6b;\n border-radius: 4px;\n }\n\n &--warning {\n @extend .json-schema-2020-12-keyword__value--const;\n color: red;\n border: 1px dashed red;\n }\n }\n}\n.json-schema-2020-12-keyword__name--secondary + .json-schema-2020-12-keyword__value--secondary::before {\n content: '='\n}\n\n.json-schema-2020-12__attribute {\n font-family: monospace;\n color: $text-code-default-font-color;\n font-size: 12px;\n text-transform: lowercase;\n padding-left: 10px;\n\n &--primary {\n color: $prop-type-font-color;\n }\n\n &--muted {\n color: gray;\n }\n\n &--warning {\n color: red;\n }\n}\n\n@import './$vocabulary/$vocabulary';\n@import './Description/description';\n@import './Title/title';\n@import './Properties/properties';\n@import './PatternProperties/pattern-properties';\n@import './Enum/enum';\n@import './Constraint/constraint';\n@import './DependentRequired/dependent-required';\n",".json-schema-2020-12 {\n &-keyword--\\$vocabulary {\n ul {\n @include expansion-border;\n }\n }\n\n &-\\$vocabulary-uri {\n margin-left: 35px;\n\n &--disabled {\n text-decoration: line-through;\n }\n }\n}\n",".json-schema-2020-12-keyword--description {\n color: #6b6b6b;\n font-size: 12px;\n margin-left: 20px;\n\n & p {\n margin: 0;\n }\n}\n",".json-schema-2020-12 {\n &__title {\n @include text_headline($section-models-model-title-font-color);\n display: inline-block;\n font-weight: bold;\n font-size: 12px;\n line-height: normal;\n\n & .json-schema-2020-12-keyword__name {\n margin: 0;\n }\n }\n\n &-property {\n margin: 7px 0;\n\n .json-schema-2020-12__title {\n @include text_code();\n font-size: 12px;\n vertical-align: middle;\n }\n }\n}\n",".json-schema-2020-12 {\n &-keyword--properties {\n & > ul {\n margin: 0;\n padding: 0;\n border: none;\n }\n }\n\n &-property {\n list-style-type: none;\n\n &--required {\n & > .json-schema-2020-12:first-of-type > .json-schema-2020-12-head .json-schema-2020-12__title:after {\n content: '*';\n color: red;\n font-weight: bold;\n }\n }\n }\n}\n",".json-schema-2020-12 {\n &-keyword--patternProperties {\n ul {\n margin: 0;\n padding: 0;\n border: none;\n }\n\n .json-schema-2020-12__title:first-of-type::before {\n color: $prop-type-font-color;\n content: \"/\";\n }\n\n .json-schema-2020-12__title:first-of-type::after {\n color: $prop-type-font-color;\n content: \"/\";\n }\n }\n}\n",".json-schema-2020-12-keyword--enum {\n & > ul {\n display: inline-block;\n padding: 0;\n margin: 0;\n\n li {\n display: inline;\n list-style-type: none;\n }\n }\n}\n",".json-schema-2020-12__constraint {\n @include text_code();\n margin-left: 10px;\n line-height: 1.5;\n padding: 1px 3px;\n color: white;\n background-color: #805AD5;\n border-radius: 4px;\n\n &--string {\n color: white;\n background-color: #D69E2E;\n }\n}\n",".json-schema-2020-12-keyword--dependentRequired {\n & > ul {\n display: inline-block;\n padding: 0;\n margin: 0;\n\n li {\n display: inline;\n list-style-type: none;\n }\n }\n}\n",".model-box {\n // inferred names of Schema Objects\n & .json-schema-2020-12:not(.json-schema-2020-12--embedded) > .json-schema-2020-12-head .json-schema-2020-12__title:first-of-type {\n font-size: 16px;\n }\n\n & > .json-schema-2020-12 {\n margin: 0;\n }\n\n .json-schema-2020-12 {\n padding: 0;\n background-color: transparent;\n }\n\n .json-schema-2020-12-accordion, .json-schema-2020-12-expand-deep-button {\n background-color: transparent;\n }\n}\n",".models .json-schema-2020-12:not(.json-schema-2020-12--embedded) > .json-schema-2020-12-head .json-schema-2020-12__title:first-of-type {\n font-size: 16px;\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/assets/stylesheets/swagger-ui.js b/assets/stylesheets/swagger-ui.js new file mode 100644 index 00000000..7a06a0a0 --- /dev/null +++ b/assets/stylesheets/swagger-ui.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SwaggerUICore=t():e.SwaggerUICore=t()}(this,(function(){return(()=>{var e={6024:(e,t,n)=>{"use strict";n.d(t,{Z:()=>R});var r=n(4250),a=n.n(r),o=n(6349),s=n.n(o),l=n(4606),i=n.n(l),c=n(4555),u=n.n(c),p=n(4291),d=n.n(p),m=n(1885),h=n.n(m),f=n(1093),g=n.n(f),v=n(4883),y=n.n(v),E=n(8493),S=n.n(E),b=n(3942),C=n.n(b),x=n(6689),w=n.n(x);const _=require("react-immutable-pure-component");var A=n.n(_),k=n(8082),N=n.n(k),I=n(580),q=n.n(I),R=function(e){d()(r,e);var t=h()(r);function r(){var e,n;s()(this,r);for(var a=arguments.length,o=new Array(a),l=0;l{"use strict";n.d(t,{Z:()=>k});var r=n(6768),a=n.n(r),o=n(6349),s=n.n(o),l=n(4606),i=n.n(l),c=n(4555),u=n.n(c),p=n(4291),d=n.n(p),m=n(1885),h=n.n(m),f=n(1093),g=n.n(f),v=n(7252),y=n.n(v),E=n(4883),S=n.n(E),b=n(6689),C=n.n(b),x=n(3883),w=n.n(x),_=(n(580),n(1890)),A=n(7504),k=function(e){d()(n,e);var t=h()(n);function n(e,r){var a;s()(this,n),a=t.call(this,e,r),g()(u()(a),"getDefinitionUrl",(function(){var e=a.props.specSelectors;return new(w())(e.url(),A.Z.location).toString()}));var o=(0,e.getConfigs)().validatorUrl;return a.state={url:a.getDefinitionUrl(),validatorUrl:void 0===o?"https://validator.swagger.io/validator":o},a}return i()(n,[{key:"UNSAFE_componentWillReceiveProps",value:function(e){var t=(0,e.getConfigs)().validatorUrl;this.setState({url:this.getDefinitionUrl(),validatorUrl:void 0===t?"https://validator.swagger.io/validator":t})}},{key:"render",value:function(){var e,t,n=(0,this.props.getConfigs)().spec,r=(0,_.Nm)(this.state.validatorUrl);return"object"===a()(n)&&y()(n).length?null:this.state.url&&(0,_.hW)(this.state.validatorUrl)&&(0,_.hW)(this.state.url)?C().createElement("span",{className:"float-right"},C().createElement("a",{target:"_blank",rel:"noopener noreferrer",href:S()(e="".concat(r,"/debug?url=")).call(e,encodeURIComponent(this.state.url))},C().createElement(N,{src:S()(t="".concat(r,"?url=")).call(t,encodeURIComponent(this.state.url)),alt:"Online validator badge"}))):null}}]),n}(C().Component),N=function(e){d()(n,e);var t=h()(n);function n(e){var r;return s()(this,n),(r=t.call(this,e)).state={loaded:!1,error:!1},r}return i()(n,[{key:"componentDidMount",value:function(){var e=this,t=new Image;t.onload=function(){e.setState({loaded:!0})},t.onerror=function(){e.setState({error:!0})},t.src=this.props.src}},{key:"UNSAFE_componentWillReceiveProps",value:function(e){var t=this;if(e.src!==this.props.src){var n=new Image;n.onload=function(){t.setState({loaded:!0})},n.onerror=function(){t.setState({error:!0})},n.src=e.src}}},{key:"render",value:function(){return this.state.error?C().createElement("img",{alt:"Error"}):this.state.loaded?C().createElement("img",{src:this.props.src,alt:this.props.alt}):null}}]),n}(C().Component)},2552:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d,s:()=>m});var r=n(6689),a=n.n(r),o=(n(580),n(963));const s=require("remarkable/linkify"),l=require("dompurify");var i=n.n(l),c=n(9003),u=n.n(c);function p(e){var t=e.source,n=e.className,r=void 0===n?"":n,l=e.getConfigs;if("string"!=typeof t)return null;var i=new o.Remarkable({html:!0,typographer:!0,breaks:!0,linkTarget:"_blank"}).use(s.linkify);i.core.ruler.disable(["replacements","smartquotes"]);var c=l().useUnsafeMarkdown,p=i.render(t),d=m(p,{useUnsafeMarkdown:c});return t&&p&&d?a().createElement("div",{className:u()(r,"markdown"),dangerouslySetInnerHTML:{__html:d}}):null}i().addHook&&i().addHook("beforeSanitizeElements",(function(e){return e.href&&e.setAttribute("rel","noopener noreferrer"),e})),p.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};const d=p;function m(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.useUnsafeMarkdown,r=void 0!==n&&n,a=r,o=r?[]:["style","class"];return r&&!m.hasWarnedAboutDeprecation&&(console.warn("useUnsafeMarkdown display configuration parameter is deprecated since >3.26.0 and will be removed in v4.0.0."),m.hasWarnedAboutDeprecation=!0),i().sanitize(e,{ADD_ATTR:["target"],FORBID_TAGS:["style","form"],ALLOW_DATA_ATTR:a,FORBID_ATTR:o})}m.hasWarnedAboutDeprecation=!1},5308:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>d});var r,a=n(4235),o=n.n(a),s=n(874),l=n.n(s),i=n(1890),c=n(9595),u=n(5102),p={};const d=p;o()(r=l()(u).call(u)).call(r,(function(e){if("./index.js"!==e){var t=u(e);p[(0,i.Zl)(e)]=t.default?t.default:t}})),p.SafeRender=c.default},5812:(e,t,n)=>{"use strict";n.r(t),n.d(t,{SHOW_AUTH_POPUP:()=>m,AUTHORIZE:()=>h,LOGOUT:()=>f,PRE_AUTHORIZE_OAUTH2:()=>g,AUTHORIZE_OAUTH2:()=>v,VALIDATE:()=>y,CONFIGURE_AUTH:()=>E,RESTORE_AUTHORIZATION:()=>S,showDefinitions:()=>b,authorize:()=>C,authorizeWithPersistOption:()=>x,logout:()=>w,logoutWithPersistOption:()=>_,preAuthorizeImplicit:()=>A,authorizeOauth2:()=>k,authorizeOauth2WithPersistOption:()=>N,authorizePassword:()=>I,authorizeApplication:()=>q,authorizeAccessCodeWithFormParams:()=>R,authorizeAccessCodeWithBasicAuthentication:()=>P,authorizeRequest:()=>T,configureAuth:()=>O,restoreAuthorization:()=>M,persistAuthorizationIfNeeded:()=>j,authPopup:()=>V});var r=n(6768),a=n.n(r),o=n(8344),s=n.n(o),l=n(4994),i=n.n(l),c=n(3883),u=n.n(c),p=n(7504),d=n(1890),m="show_popup",h="authorize",f="logout",g="pre_authorize_oauth2",v="authorize_oauth2",y="validate",E="configure_auth",S="restore_authorization";function b(e){return{type:m,payload:e}}function C(e){return{type:h,payload:e}}var x=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function w(e){return{type:f,payload:e}}var _=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},A=function(e){return function(t){var n=t.authActions,r=t.errActions,a=e.auth,o=e.token,l=e.isValid,i=a.schema,c=a.name,u=i.get("flow");delete p.Z.swaggerUIRedirectOauth2,"accessCode"===u||l||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),o.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:s()(o)}):n.authorizeOauth2WithPersistOption({auth:a,token:o})}};function k(e){return{type:v,payload:e}}var N=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},I=function(e){return function(t){var n=t.authActions,r=e.schema,a=e.name,o=e.username,s=e.password,l=e.passwordType,c=e.clientId,u=e.clientSecret,p={grant_type:"password",scope:e.scopes.join(" "),username:o,password:s},m={};switch(l){case"request-body":!function(e,t,n){t&&i()(e,{client_id:t});n&&i()(e,{client_secret:n})}(p,c,u);break;case"basic":m.Authorization="Basic "+(0,d.r3)(c+":"+u);break;default:console.warn("Warning: invalid passwordType ".concat(l," was passed, not including client id and secret"))}return n.authorizeRequest({body:(0,d.GZ)(p),url:r.get("tokenUrl"),name:a,headers:m,query:{},auth:e})}};var q=function(e){return function(t){var n=t.authActions,r=e.schema,a=e.scopes,o=e.name,s=e.clientId,l=e.clientSecret,i={Authorization:"Basic "+(0,d.r3)(s+":"+l)},c={grant_type:"client_credentials",scope:a.join(" ")};return n.authorizeRequest({body:(0,d.GZ)(c),name:o,url:r.get("tokenUrl"),auth:e,headers:i})}},R=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,a=t.schema,o=t.name,s=t.clientId,l=t.clientSecret,i=t.codeVerifier,c={grant_type:"authorization_code",code:t.code,client_id:s,client_secret:l,redirect_uri:n,code_verifier:i};return r.authorizeRequest({body:(0,d.GZ)(c),name:o,url:a.get("tokenUrl"),auth:t})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,a=t.schema,o=t.name,s=t.clientId,l=t.clientSecret,i=t.codeVerifier,c={Authorization:"Basic "+(0,d.r3)(s+":"+l)},u={grant_type:"authorization_code",code:t.code,client_id:s,redirect_uri:n,code_verifier:i};return r.authorizeRequest({body:(0,d.GZ)(u),name:o,url:a.get("tokenUrl"),auth:t,headers:c})}},T=function(e){return function(t){var n,r=t.fn,o=t.getConfigs,l=t.authActions,c=t.errActions,p=t.oas3Selectors,d=t.specSelectors,m=t.authSelectors,h=e.body,f=e.query,g=void 0===f?{}:f,v=e.headers,y=void 0===v?{}:v,E=e.name,S=e.url,b=e.auth,C=(m.getConfigs()||{}).additionalQueryStringParams;if(d.isOAS3()){var x=p.serverEffectiveValue(p.selectedServer());n=u()(S,x,!0)}else n=u()(S,d.url(),!0);"object"===a()(C)&&(n.query=i()({},n.query,C));var w=n.toString(),_=i()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},y);r.fetch({url:w,method:"post",headers:_,query:g,body:h,requestInterceptor:o().requestInterceptor,responseInterceptor:o().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?c.newAuthErr({authId:E,level:"error",source:"auth",message:s()(t)}):l.authorizeOauth2WithPersistOption({auth:b,token:t}):c.newAuthErr({authId:E,level:"error",source:"auth",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: ".concat(r.error)),r.error_description&&(t+=", description: ".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:E,level:"error",source:"auth",message:t})}))}};function O(e){return{type:E,payload:e}}function M(e){return{type:S,payload:e}}var j=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem("authorized",s()(n.toJS()))}}},V=function(e,t){return function(){p.Z.swaggerUIRedirectOauth2=t,p.Z.open(e)}}},3705:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>m,preauthorizeBasic:()=>h,preauthorizeApiKey:()=>f});var r=n(1093),a=n.n(r),o=n(593),s=n.n(o),l=n(4883),i=n.n(l),c=n(3962),u=n(5812),p=n(35),d=n(8302);function m(){return{afterLoad:function(e){this.rootInjects=this.rootInjects||{},this.rootInjects.initOAuth=e.authActions.configureAuth,this.rootInjects.preauthorizeApiKey=s()(f).call(f,null,e),this.rootInjects.preauthorizeBasic=s()(h).call(h,null,e)},statePlugins:{auth:{reducers:c.default,actions:u,selectors:p},spec:{wrapActions:d}}}}function h(e,t,n,r){var o,s=e.authActions.authorize,l=e.specSelectors,c=l.specJson,u=(0,l.isOAS3)()?["components","securitySchemes"]:["securityDefinitions"],p=c().getIn(i()(o=[]).call(o,u,[t]));return p?s(a()({},t,{value:{username:n,password:r},schema:p.toJS()})):null}function f(e,t,n){var r,o=e.authActions.authorize,s=e.specSelectors,l=s.specJson,c=(0,s.isOAS3)()?["components","securitySchemes"]:["securityDefinitions"],u=l().getIn(i()(r=[]).call(r,c,[t]));return u?o(a()({},t,{value:n,schema:u.toJS()})):null}},3962:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>f});var r,a=n(1093),o=n.n(a),s=n(8030),l=n.n(s),i=n(4235),c=n.n(i),u=n(4994),p=n.n(u),d=n(5572),m=n(1890),h=n(5812);const f=(r={},o()(r,h.SHOW_AUTH_POPUP,(function(e,t){var n=t.payload;return e.set("showDefinitions",n)})),o()(r,h.AUTHORIZE,(function(e,t){var n,r=t.payload,a=(0,d.fromJS)(r),o=e.get("authorized")||(0,d.Map)();return c()(n=a.entrySeq()).call(n,(function(t){var n=l()(t,2),r=n[0],a=n[1];if(!(0,m.Wl)(a.getIn))return e.set("authorized",o);var s=a.getIn(["schema","type"]);if("apiKey"===s||"http"===s)o=o.set(r,a);else if("basic"===s){var i=a.getIn(["value","username"]),c=a.getIn(["value","password"]);o=(o=o.setIn([r,"value"],{username:i,header:"Basic "+(0,m.r3)(i+":"+c)})).setIn([r,"schema"],a.get("schema"))}})),e.set("authorized",o)})),o()(r,h.AUTHORIZE_OAUTH2,(function(e,t){var n,r=t.payload,a=r.auth,o=r.token;a.token=p()({},o),n=(0,d.fromJS)(a);var s=e.get("authorized")||(0,d.Map)();return s=s.set(n.get("name"),n),e.set("authorized",s)})),o()(r,h.LOGOUT,(function(e,t){var n=t.payload,r=e.get("authorized").withMutations((function(e){c()(n).call(n,(function(t){e.delete(t)}))}));return e.set("authorized",r)})),o()(r,h.CONFIGURE_AUTH,(function(e,t){var n=t.payload;return e.set("configs",n)})),o()(r,h.RESTORE_AUTHORIZATION,(function(e,t){var n=t.payload;return e.set("authorized",(0,d.fromJS)(n.authorized))})),r)},35:(e,t,n)=>{"use strict";n.r(t),n.d(t,{shownDefinitions:()=>S,definitionsToAuthorize:()=>b,getDefinitionsByNames:()=>C,definitionsForRequirements:()=>x,authorized:()=>w,isAuthorized:()=>_,getConfigs:()=>A});var r=n(8030),a=n.n(r),o=n(4235),s=n.n(o),l=n(9998),i=n.n(l),c=n(5626),u=n.n(c),p=n(8493),d=n.n(p),m=n(3942),h=n.n(m),f=n(7252),g=n.n(f),v=n(6814),y=n(5572),E=function(e){return e},S=(0,v.createSelector)(E,(function(e){return e.get("showDefinitions")})),b=(0,v.createSelector)(E,(function(){return function(e){var t,n=e.specSelectors.securityDefinitions()||(0,y.Map)({}),r=(0,y.List)();return s()(t=n.entrySeq()).call(t,(function(e){var t=a()(e,2),n=t[0],o=t[1],s=(0,y.Map)();s=s.set(n,o),r=r.push(s)})),r}})),C=function(e,t){return function(e){var n,r=e.specSelectors;console.warn("WARNING: getDefinitionsByNames is deprecated and will be removed in the next major version.");var o=r.securityDefinitions(),l=(0,y.List)();return s()(n=t.valueSeq()).call(n,(function(e){var t,n=(0,y.Map)();s()(t=e.entrySeq()).call(t,(function(e){var t,r,l=a()(e,2),i=l[0],c=l[1],u=o.get(i);"oauth2"===u.get("type")&&c.size&&(t=u.get("scopes"),s()(r=t.keySeq()).call(r,(function(e){c.contains(e)||(t=t.delete(e))})),u=u.set("allowedScopes",t));n=n.set(i,u)})),l=l.push(n)})),l}},x=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(0,y.List)();return function(e){var n=e.authSelectors.definitionsToAuthorize()||(0,y.List)();return i()(n).call(n,(function(e){return u()(t).call(t,(function(t){return t.get(e.keySeq().first())}))}))}},w=(0,v.createSelector)(E,(function(e){return e.get("authorized")||(0,y.Map)()})),_=function(e,t){return function(e){var n,r=e.authSelectors.authorized();return y.List.isList(t)?!!i()(n=t.toJS()).call(n,(function(e){var t,n;return-1===d()(t=h()(n=g()(e)).call(n,(function(e){return!!r.get(e)}))).call(t,!1)})).length:null}},A=(0,v.createSelector)(E,(function(e){return e.get("configs")}))},8302:(e,t,n)=>{"use strict";n.r(t),n.d(t,{execute:()=>o});var r=n(67),a=n.n(r),o=function(e,t){var n=t.authSelectors,r=t.specSelectors;return function(t){var o=t.path,s=t.method,l=t.operation,i=t.extras,c={authorized:n.authorized()&&n.authorized().toJS(),definitions:r.securityDefinitions()&&r.securityDefinitions().toJS(),specSecurity:r.security()&&r.security().toJS()};return e(a()({path:o,method:s,operation:l,securities:c},i))}}},714:(e,t,n)=>{"use strict";n.r(t),n.d(t,{UPDATE_CONFIGS:()=>o,TOGGLE_CONFIGS:()=>s,update:()=>l,toggle:()=>i,loaded:()=>c});var r=n(1093),a=n.n(r),o="configs_update",s="configs_toggle";function l(e,t){return{type:o,payload:a()({},e,t)}}function i(e){return{type:s,payload:e}}var c=function(){return function(e){var t=e.getConfigs,n=e.authActions;if(t().persistAuthorization){var r=localStorage.getItem("authorized");r&&n.restoreAuthorization({authorized:JSON.parse(r)})}}}},2256:(e,t,n)=>{"use strict";n.r(t),n.d(t,{parseYamlConfig:()=>o});var r=n(9793),a=n.n(r),o=function(e,t){try{return a().load(e)}catch(e){return t&&t.errActions.newThrownErr(new Error(e)),{}}}},1661:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>u});var r=n(5163),a=n(2256),o=n(714),s=n(2698),l=n(9018),i=n(7743),c={getLocalConfig:function(){return(0,a.parseYamlConfig)(r)}};function u(){return{statePlugins:{spec:{actions:s,selectors:c},configs:{reducers:i.default,actions:o,selectors:l}}}}},7743:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>i});var r,a=n(1093),o=n.n(a),s=n(5572),l=n(714);const i=(r={},o()(r,l.UPDATE_CONFIGS,(function(e,t){return e.merge((0,s.fromJS)(t.payload))})),o()(r,l.TOGGLE_CONFIGS,(function(e,t){var n=t.payload,r=e.get(n);return e.set(n,!r)})),r)},9018:(e,t,n)=>{"use strict";n.r(t),n.d(t,{get:()=>o});var r=n(7104),a=n.n(r),o=function(e,t){return e.getIn(a()(t)?t:[t])}},2698:(e,t,n)=>{"use strict";n.r(t),n.d(t,{downloadConfig:()=>a,getConfigByUrl:()=>o});var r=n(2256),a=function(e){return function(t){return(0,t.fn.fetch)(e)}},o=function(e,t){return function(n){var a=n.specActions;if(e)return a.downloadConfig(e).then(o,o);function o(n){n instanceof Error||n.status>=400?(a.updateLoadingStatus("failedConfig"),a.updateLoadingStatus("failedConfig"),a.updateUrl(""),console.error(n.statusText+" "+e.url),t(null)):t((0,r.parseYamlConfig)(n.text))}}}},1970:(e,t,n)=>{"use strict";n.r(t),n.d(t,{setHash:()=>r});var r=function(e){return e?history.pushState(null,null,"#".concat(e)):window.location.hash=""}},4980:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>s});var r=n(2179),a=n(877),o=n(4584);function s(){return[r.default,{statePlugins:{configs:{wrapActions:{loaded:function(e,t){return function(){e.apply(void 0,arguments);var n=decodeURIComponent(window.location.hash);t.layoutActions.parseDeepLinkHash(n)}}}}},wrapComponents:{operation:a.default,OperationTag:o.default}}]}},2179:(e,t,n)=>{"use strict";n.r(t),n.d(t,{clearScrollTo:()=>R,default:()=>P,parseDeepLinkHash:()=>N,readyToScroll:()=>I,scrollTo:()=>k,scrollToElement:()=>q,show:()=>A});var r=n(1093),a=n.n(r),o=n(8030),s=n.n(o),l=n(7104),i=n.n(l),c=n(4883),u=n.n(c),p=n(600),d=n.n(p),m=n(3942),h=n.n(m),f=n(8493),g=n.n(f),v=n(1970);const y=require("zenscroll");var E,S=n.n(y),b=n(1890),C=n(5572),x=n.n(C),w="layout_scroll_to",_="layout_clear_scroll",A=function(e,t){var n=t.getConfigs,r=t.layoutSelectors;return function(){for(var t=arguments.length,a=new Array(t),o=0;o-1&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),n.show(h()(y).call(y,(function(e){return e.replace(/_/g," ")})),!0)),n.show(y,!0)}(g()(m).call(m,"_")>-1||g()(v).call(v,"_")>-1)&&(console.warn("Warning: escaping deep link whitespace with `_` will be unsupported in v4.0, use `%20` instead."),n.show(h()(i).call(i,(function(e){return e.replace(/_/g," ")})),!0)),n.show(i,!0),n.scrollTo(i)}}},I=function(e,t){return function(n){var r=n.layoutSelectors.getScrollToKey();x().is(r,(0,C.fromJS)(e))&&(n.layoutActions.scrollToElement(t),n.layoutActions.clearScrollTo())}},q=function(e,t){return function(n){try{t=t||n.fn.getScrollParent(e),S().createScroller(t).to(e)}catch(e){console.error(e)}}},R=function(){return{type:_}};const P={fn:{getScrollParent:function(e,t){var n=document.documentElement,r=getComputedStyle(e),a="absolute"===r.position,o=t?/(auto|scroll|hidden)/:/(auto|scroll)/;if("fixed"===r.position)return n;for(var s=e;s=s.parentElement;)if(r=getComputedStyle(s),(!a||"static"!==r.position)&&o.test(r.overflow+r.overflowY+r.overflowX))return s;return n}},statePlugins:{layout:{actions:{scrollToElement:q,scrollTo:k,clearScrollTo:R,readyToScroll:I,parseDeepLinkHash:N},selectors:{getScrollToKey:function(e){return e.get("scrollToKey")},isShownKeyFromUrlHashArray:function(e,t){var n=s()(t,2),r=n[0],a=n[1];return a?["operations",r,a]:r?["operations-tag",r]:[]},urlHashArrayFromIsShownKey:function(e,t){var n=s()(t,3),r=n[0],a=n[1],o=n[2];return"operations"==r?[a,o]:"operations-tag"==r?[a]:[]}},reducers:(E={},a()(E,w,(function(e,t){return e.set("scrollToKey",x().fromJS(t.payload))})),a()(E,_,(function(e){return e.delete("scrollToKey")})),E),wrapActions:{show:A}}}}},4584:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>E});var r=n(6349),a=n.n(r),o=n(4606),s=n.n(o),l=n(4555),i=n.n(l),c=n(4291),u=n.n(c),p=n(1885),d=n.n(p),m=n(1093),h=n.n(m),f=n(4883),g=n.n(f),v=n(6689),y=n.n(v);n(580);const E=function(e,t){return function(n){u()(o,n);var r=d()(o);function o(){var e,n;a()(this,o);for(var s=arguments.length,l=new Array(s),c=0;c{"use strict";n.r(t),n.d(t,{default:()=>E});var r=n(6349),a=n.n(r),o=n(4606),s=n.n(o),l=n(4555),i=n.n(l),c=n(4291),u=n.n(c),p=n(1885),d=n.n(p),m=n(1093),h=n.n(m),f=n(4883),g=n.n(f),v=n(6689),y=n.n(v);n(8082);const E=function(e,t){return function(n){u()(o,n);var r=d()(o);function o(){var e,n;a()(this,o);for(var s=arguments.length,l=new Array(s),c=0;c{"use strict";n.r(t),n.d(t,{default:()=>g});var r=n(4994),a=n.n(r),o=n(9478),s=n.n(o),l=n(4883),i=n.n(l),c=n(8493),u=n.n(c),p=n(8344),d=n.n(p),m=n(6814),h=n(5572),f=n(7504);function g(e){var t=e.fn;return{statePlugins:{spec:{actions:{download:function(e){return function(n){var r=n.errActions,o=n.specSelectors,l=n.specActions,c=n.getConfigs,u=t.fetch,p=c();function d(t){if(t instanceof Error||t.status>=400)return l.updateLoadingStatus("failed"),r.newThrownErr(a()(new Error((t.message||t.statusText)+" "+e),{source:"fetch"})),void(!t.status&&t instanceof Error&&function(){try{var t;if("URL"in f.Z?t=new(s())(e):(t=document.createElement("a")).href=e,"https:"!==t.protocol&&"https:"===f.Z.location.protocol){var n=a()(new Error("Possible mixed-content issue? The page was loaded over https:// but a ".concat(t.protocol,"// URL was specified. Check that you are not attempting to load mixed content.")),{source:"fetch"});return void r.newThrownErr(n)}if(t.origin!==f.Z.location.origin){var o,l=a()(new Error(i()(o="Possible cross-origin (CORS) issue? The URL origin (".concat(t.origin,") does not match the page (")).call(o,f.Z.location.origin,"). Check the server returns the correct 'Access-Control-Allow-*' headers.")),{source:"fetch"});r.newThrownErr(l)}}catch(e){return}}());l.updateLoadingStatus("success"),l.updateSpec(t.text),o.url()!==e&&l.updateUrl(e)}e=e||o.url(),l.updateLoadingStatus("loading"),r.clear({source:"fetch"}),u({url:e,loadSpec:!0,requestInterceptor:p.requestInterceptor||function(e){return e},responseInterceptor:p.responseInterceptor||function(e){return e},credentials:"same-origin",headers:{Accept:"application/json,*/*"}}).then(d,d)}},updateLoadingStatus:function(e){var t,n=[null,"loading","failed","success","failedConfig"];-1===u()(n).call(n,e)&&console.error(i()(t="Error: ".concat(e," is not one of ")).call(t,d()(n)));return{type:"spec_update_loading_status",payload:e}}},reducers:{spec_update_loading_status:function(e,t){return"string"==typeof t.payload?e.set("loadingStatus",t.payload):e}},selectors:{loadingStatus:(0,m.createSelector)((function(e){return e||(0,h.Map)()}),(function(e){return e.get("loadingStatus")||null}))}}}}}},4966:(e,t,n)=>{"use strict";n.r(t),n.d(t,{NEW_THROWN_ERR:()=>a,NEW_THROWN_ERR_BATCH:()=>o,NEW_SPEC_ERR:()=>s,NEW_SPEC_ERR_BATCH:()=>l,NEW_AUTH_ERR:()=>i,CLEAR:()=>c,CLEAR_BY:()=>u,newThrownErr:()=>p,newThrownErrBatch:()=>d,newSpecErr:()=>m,newSpecErrBatch:()=>h,newAuthErr:()=>f,clear:()=>g,clearBy:()=>v});var r=n(41),a="err_new_thrown_err",o="err_new_thrown_err_batch",s="err_new_spec_err",l="err_new_spec_err_batch",i="err_new_auth_err",c="err_clear",u="err_clear_by";function p(e){return{type:a,payload:(0,r.serializeError)(e)}}function d(e){return{type:o,payload:e}}function m(e){return{type:s,payload:e}}function h(e){return{type:l,payload:e}}function f(e){return{type:i,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:c,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:u,payload:e}}},2860:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>u});var r=n(9998),a=n.n(r),o=n(3942),s=n.n(o);const l=require("lodash/reduce");var i=n.n(l),c=[n(2392),n(1835)];function u(e){var t,n={jsSpec:{}},r=i()(c,(function(e,t){try{var r=t.transform(e,n);return a()(r).call(r,(function(e){return!!e}))}catch(t){return console.error("Transformer error:",t),e}}),e);return s()(t=a()(r).call(r,(function(e){return!!e}))).call(t,(function(e){return!e.get("line")&&e.get("path"),e}))}},2392:(e,t,n)=>{"use strict";n.r(t),n.d(t,{transform:()=>p});var r=n(3942),a=n.n(r),o=n(8493),s=n.n(o),l=n(600),i=n.n(l),c=n(66),u=n.n(c);function p(e){return a()(e).call(e,(function(e){var t,n="is not of a type(s)",r=s()(t=e.get("message")).call(t,n);if(r>-1){var a,o,l=i()(a=e.get("message")).call(a,r+n.length).split(",");return e.set("message",i()(o=e.get("message")).call(o,0,r)+function(e){return u()(e).call(e,(function(e,t,n,r){return n===r.length-1&&r.length>1?e+"or "+t:r[n+1]&&r.length>2?e+t+", ":r[n+1]?e+t+" ":e+t}),"should be a")}(l))}return e}))}},1835:(e,t,n)=>{"use strict";n.r(t),n.d(t,{transform:()=>r});n(3942),n(8493),n(1712),n(5572);function r(e,t){t.jsSpec;return e}},7793:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>s});var r=n(3527),a=n(4966),o=n(7667);function s(e){return{statePlugins:{err:{reducers:(0,r.default)(e),actions:a,selectors:o}}}}},3527:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>E});var r=n(1093),a=n.n(r),o=n(4994),s=n.n(o),l=n(3942),i=n.n(l),c=n(4883),u=n.n(c),p=n(9998),d=n.n(p),m=n(7834),h=n.n(m),f=n(4966),g=n(5572),v=n(2860),y={line:0,level:"error",message:"Unknown error"};function E(){var e;return e={},a()(e,f.NEW_THROWN_ERR,(function(e,t){var n=t.payload,r=s()(y,n,{type:"thrown"});return e.update("errors",(function(e){return(e||(0,g.List)()).push((0,g.fromJS)(r))})).update("errors",(function(e){return(0,v.default)(e)}))})),a()(e,f.NEW_THROWN_ERR_BATCH,(function(e,t){var n=t.payload;return n=i()(n).call(n,(function(e){return(0,g.fromJS)(s()(y,e,{type:"thrown"}))})),e.update("errors",(function(e){var t;return u()(t=e||(0,g.List)()).call(t,(0,g.fromJS)(n))})).update("errors",(function(e){return(0,v.default)(e)}))})),a()(e,f.NEW_SPEC_ERR,(function(e,t){var n=t.payload,r=(0,g.fromJS)(n);return r=r.set("type","spec"),e.update("errors",(function(e){return(e||(0,g.List)()).push((0,g.fromJS)(r)).sortBy((function(e){return e.get("line")}))})).update("errors",(function(e){return(0,v.default)(e)}))})),a()(e,f.NEW_SPEC_ERR_BATCH,(function(e,t){var n=t.payload;return n=i()(n).call(n,(function(e){return(0,g.fromJS)(s()(y,e,{type:"spec"}))})),e.update("errors",(function(e){var t;return u()(t=e||(0,g.List)()).call(t,(0,g.fromJS)(n))})).update("errors",(function(e){return(0,v.default)(e)}))})),a()(e,f.NEW_AUTH_ERR,(function(e,t){var n=t.payload,r=(0,g.fromJS)(s()({},n));return r=r.set("type","auth"),e.update("errors",(function(e){return(e||(0,g.List)()).push((0,g.fromJS)(r))})).update("errors",(function(e){return(0,v.default)(e)}))})),a()(e,f.CLEAR,(function(e,t){var n,r=t.payload;if(!r||!e.get("errors"))return e;var a=d()(n=e.get("errors")).call(n,(function(e){var t;return h()(t=e.keySeq()).call(t,(function(t){var n=e.get(t),a=r[t];return!a||n!==a}))}));return e.merge({errors:a})})),a()(e,f.CLEAR_BY,(function(e,t){var n,r=t.payload;if(!r||"function"!=typeof r)return e;var a=d()(n=e.get("errors")).call(n,(function(e){return r(e)}));return e.merge({errors:a})})),e}},7667:(e,t,n)=>{"use strict";n.r(t),n.d(t,{allErrors:()=>o,lastError:()=>s});var r=n(5572),a=n(6814),o=(0,a.createSelector)((function(e){return e}),(function(e){return e.get("errors",(0,r.List)())})),s=(0,a.createSelector)(o,(function(e){return e.last()}))},9978:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4309);function a(){return{fn:{opsFilter:r.default}}}},4309:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>l});var r=n(9998),a=n.n(r),o=n(8493),s=n.n(o);function l(e,t){return a()(e).call(e,(function(e,n){return-1!==s()(n).call(n,t)}))}},5474:(e,t,n)=>{"use strict";n.r(t),n.d(t,{UPDATE_LAYOUT:()=>a,UPDATE_FILTER:()=>o,UPDATE_MODE:()=>s,SHOW:()=>l,updateLayout:()=>i,updateFilter:()=>c,show:()=>u,changeMode:()=>p});var r=n(1890),a="layout_update_layout",o="layout_update_filter",s="layout_update_mode",l="layout_show";function i(e){return{type:a,payload:e}}function c(e){return{type:o,payload:e}}function u(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e=(0,r.AF)(e),{type:l,payload:{thing:e,shown:t}}}function p(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return e=(0,r.AF)(e),{type:s,payload:{thing:e,mode:t}}}},6821:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>l});var r=n(5672),a=n(5474),o=n(4400),s=n(8989);function l(){return{statePlugins:{layout:{reducers:r.default,actions:a,selectors:o},spec:{wrapSelectors:s}}}}},5672:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>u});var r,a=n(1093),o=n.n(a),s=n(4883),l=n.n(s),i=n(5572),c=n(5474);const u=(r={},o()(r,c.UPDATE_LAYOUT,(function(e,t){return e.set("layout",t.payload)})),o()(r,c.UPDATE_FILTER,(function(e,t){return e.set("filter",t.payload)})),o()(r,c.SHOW,(function(e,t){var n=t.payload.shown,r=(0,i.fromJS)(t.payload.thing);return e.update("shown",(0,i.fromJS)({}),(function(e){return e.set(r,n)}))})),o()(r,c.UPDATE_MODE,(function(e,t){var n,r=t.payload.thing,a=t.payload.mode;return e.setIn(l()(n=["modes"]).call(n,r),(a||"")+"")})),r)},4400:(e,t,n)=>{"use strict";n.r(t),n.d(t,{current:()=>u,currentFilter:()=>p,isShown:()=>d,whatMode:()=>m,showSummary:()=>h});var r=n(6731),a=n.n(r),o=n(4883),s=n.n(o),l=n(6814),i=n(1890),c=n(5572),u=function(e){return e.get("layout")},p=function(e){return e.get("filter")},d=function(e,t,n){return t=(0,i.AF)(t),e.get("shown",(0,c.fromJS)({})).get((0,c.fromJS)(t),n)},m=function(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";return t=(0,i.AF)(t),e.getIn(s()(n=["modes"]).call(n,a()(t)),r)},h=(0,l.createSelector)((function(e){return e}),(function(e){return!d(e,"editor")}))},8989:(e,t,n)=>{"use strict";n.r(t),n.d(t,{taggedOperations:()=>l});var r=n(4883),a=n.n(r),o=n(600),s=n.n(o),l=function(e,t){return function(n){for(var r,o=arguments.length,l=new Array(o>1?o-1:0),i=1;i=0&&(c=s()(c).call(c,0,f)),c}}},9150:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(593),a=n.n(r);function o(e){var t=e.configs,n={debug:0,info:1,log:2,warn:3,error:4},r=function(e){return n[e]||-1},o=t.logLevel,s=r(o);function l(e){for(var t,n=arguments.length,a=new Array(n>1?n-1:0),o=1;o=s&&(t=console)[e].apply(t,a)}return l.warn=a()(l).call(l,null,"warn"),l.error=a()(l).call(l,null,"error"),l.info=a()(l).call(l,null,"info"),l.debug=a()(l).call(l,null,"debug"),{rootInjects:{log:l}}}},7002:(e,t,n)=>{"use strict";n.r(t),n.d(t,{UPDATE_SELECTED_SERVER:()=>r,UPDATE_REQUEST_BODY_VALUE:()=>a,UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG:()=>o,UPDATE_REQUEST_BODY_INCLUSION:()=>s,UPDATE_ACTIVE_EXAMPLES_MEMBER:()=>l,UPDATE_REQUEST_CONTENT_TYPE:()=>i,UPDATE_RESPONSE_CONTENT_TYPE:()=>c,UPDATE_SERVER_VARIABLE_VALUE:()=>u,SET_REQUEST_BODY_VALIDATE_ERROR:()=>p,CLEAR_REQUEST_BODY_VALIDATE_ERROR:()=>d,CLEAR_REQUEST_BODY_VALUE:()=>m,setSelectedServer:()=>h,setRequestBodyValue:()=>f,setRetainRequestBodyValueFlag:()=>g,setRequestBodyInclusion:()=>v,setActiveExamplesMember:()=>y,setRequestContentType:()=>E,setResponseContentType:()=>S,setServerVariableValue:()=>b,setRequestBodyValidateError:()=>C,clearRequestBodyValidateError:()=>x,initRequestBodyValidateError:()=>w,clearRequestBodyValue:()=>_});var r="oas3_set_servers",a="oas3_set_request_body_value",o="oas3_set_request_body_retain_flag",s="oas3_set_request_body_inclusion",l="oas3_set_active_examples_member",i="oas3_set_request_content_type",c="oas3_set_response_content_type",u="oas3_set_server_variable_value",p="oas3_set_request_body_validate_error",d="oas3_clear_request_body_validate_error",m="oas3_clear_request_body_value";function h(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function f(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}}var g=function(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}};function v(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:s,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,a=e.contextName;return{type:l,payload:{name:t,pathMethod:n,contextType:r,contextName:a}}}function E(e){var t=e.value,n=e.pathMethod;return{type:i,payload:{value:t,pathMethod:n}}}function S(e){var t=e.value,n=e.path,r=e.method;return{type:c,payload:{value:t,path:n,method:r}}}function b(e){var t=e.server,n=e.namespace,r=e.key,a=e.val;return{type:u,payload:{server:t,namespace:n,key:r,val:a}}}var C=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:p,payload:{path:t,method:n,validationErrors:r}}},x=function(e){var t=e.path,n=e.method;return{type:d,payload:{path:t,method:n}}},w=function(e){var t=e.pathMethod;return{type:d,payload:{path:t[0],method:t[1]}}},_=function(e){var t=e.pathMethod;return{type:m,payload:{pathMethod:t}}}},3723:(e,t,n)=>{"use strict";n.r(t),n.d(t,{definitionsToAuthorize:()=>E});var r=n(1093),a=n.n(r),o=n(8030),s=n.n(o),l=n(4883),i=n.n(l),c=n(4235),u=n.n(c),p=n(9998),d=n.n(p),m=n(66),h=n.n(m),f=n(6814),g=n(5572),v=n(7779);var y,E=(y=(0,f.createSelector)((function(e){return e}),(function(e){return e.specSelectors.securityDefinitions()}),(function(e,t){var n,r=(0,g.List)();return t?(u()(n=t.entrySeq()).call(n,(function(e){var t,n=s()(e,2),o=n[0],l=n[1],i=l.get("type");if("oauth2"===i&&u()(t=l.get("flows").entrySeq()).call(t,(function(e){var t=s()(e,2),n=t[0],i=t[1],c=(0,g.fromJS)({flow:n,authorizationUrl:i.get("authorizationUrl"),tokenUrl:i.get("tokenUrl"),scopes:i.get("scopes"),type:l.get("type"),description:l.get("description")});r=r.push(new g.Map(a()({},o,d()(c).call(c,(function(e){return void 0!==e})))))})),"http"!==i&&"apiKey"!==i||(r=r.push(new g.Map(a()({},o,l)))),"openIdConnect"===i&&l.get("openIdConnectData")){var c=l.get("openIdConnectData"),p=c.get("grant_types_supported")||["authorization_code","implicit"];u()(p).call(p,(function(e){var t,n=c.get("scopes_supported")&&h()(t=c.get("scopes_supported")).call(t,(function(e,t){return e.set(t,"")}),new g.Map),s=(0,g.fromJS)({flow:e,authorizationUrl:c.get("authorization_endpoint"),tokenUrl:c.get("token_endpoint"),scopes:n,type:"oauth2",openIdConnectUrl:l.get("openIdConnectUrl")});r=r.push(new g.Map(a()({},o,d()(s).call(s,(function(e){return void 0!==e})))))}))}})),r):r})),function(e,t){return function(){for(var n=t.getSystem().specSelectors.specJson(),r=arguments.length,a=new Array(r),o=0;o{"use strict";n.r(t),n.d(t,{default:()=>d});var r=n(4250),a=n.n(r),o=n(8030),s=n.n(o),l=n(3942),i=n.n(l),c=n(6689),u=n.n(c),p=(n(580),n(8082),n(5572));const d=function(e){var t,n=e.callbacks,r=e.getComponent,o=e.specPath,l=r("OperationContainer",!0);if(!n)return u().createElement("span",null,"No callbacks");var c=i()(t=n.entrySeq()).call(t,(function(t){var n,r=s()(t,2),c=r[0],d=r[1];return u().createElement("div",{key:c},u().createElement("h2",null,c),i()(n=d.entrySeq()).call(n,(function(t){var n,r=s()(t,2),d=r[0],m=r[1];return"$$ref"===d?null:u().createElement("div",{key:d},i()(n=m.entrySeq()).call(n,(function(t){var n=s()(t,2),r=n[0],i=n[1];if("$$ref"===r)return null;var m=(0,p.fromJS)({operation:i});return u().createElement(l,a()({},e,{op:m,key:r,tag:"",method:r,path:d,specPath:o.push(c,d,r),allowTryItOut:!1}))})))})))}));return u().createElement("div",null,c)}},6775:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>x});var r=n(6349),a=n.n(r),o=n(4606),s=n.n(o),l=n(4555),i=n.n(l),c=n(4291),u=n.n(c),p=n(1885),d=n.n(p),m=n(1093),h=n.n(m),f=n(4994),g=n.n(f),v=n(9998),y=n.n(v),E=n(3942),S=n.n(E),b=n(6689),C=n.n(b),x=(n(580),function(e){u()(n,e);var t=d()(n);function n(e,r){var o;a()(this,n),o=t.call(this,e,r),h()(i()(o),"onChange",(function(e){var t=o.props.onChange,n=e.target,r=n.value,a=n.name,s=g()({},o.state.value);a?s[a]=r:s=r,o.setState({value:s},(function(){return t(o.state)}))}));var s=o.props,l=s.name,c=s.schema,u=o.getValue();return o.state={name:l,schema:c,value:u},o}return s()(n,[{key:"getValue",value:function(){var e=this.props,t=e.name,n=e.authorized;return n&&n.getIn([t,"value"])}},{key:"render",value:function(){var e,t,n=this.props,r=n.schema,a=n.getComponent,o=n.errSelectors,s=n.name,l=a("Input"),i=a("Row"),c=a("Col"),u=a("authError"),p=a("Markdown",!0),d=a("JumpToPath",!0),m=(r.get("scheme")||"").toLowerCase(),h=this.getValue(),f=y()(e=o.allErrors()).call(e,(function(e){return e.get("authId")===s}));if("basic"===m){var g,v=h?h.get("username"):null;return C().createElement("div",null,C().createElement("h4",null,C().createElement("code",null,s||r.get("name")),"  (http, Basic)",C().createElement(d,{path:["securityDefinitions",s]})),v&&C().createElement("h6",null,"Authorized"),C().createElement(i,null,C().createElement(p,{source:r.get("description")})),C().createElement(i,null,C().createElement("label",null,"Username:"),v?C().createElement("code",null," ",v," "):C().createElement(c,null,C().createElement(l,{type:"text",required:"required",name:"username","aria-label":"auth-basic-username",onChange:this.onChange,autoFocus:!0}))),C().createElement(i,null,C().createElement("label",null,"Password:"),v?C().createElement("code",null," ****** "):C().createElement(c,null,C().createElement(l,{autoComplete:"new-password",name:"password",type:"password","aria-label":"auth-basic-password",onChange:this.onChange}))),S()(g=f.valueSeq()).call(g,(function(e,t){return C().createElement(u,{error:e,key:t})})))}return"bearer"===m?C().createElement("div",null,C().createElement("h4",null,C().createElement("code",null,s||r.get("name")),"  (http, Bearer)",C().createElement(d,{path:["securityDefinitions",s]})),h&&C().createElement("h6",null,"Authorized"),C().createElement(i,null,C().createElement(p,{source:r.get("description")})),C().createElement(i,null,C().createElement("label",null,"Value:"),h?C().createElement("code",null," ****** "):C().createElement(c,null,C().createElement(l,{type:"text","aria-label":"auth-bearer-value",onChange:this.onChange,autoFocus:!0}))),S()(t=f.valueSeq()).call(t,(function(e,t){return C().createElement(u,{error:e,key:t})}))):C().createElement("div",null,C().createElement("em",null,C().createElement("b",null,s)," HTTP authentication: unsupported scheme ","'".concat(m,"'")))}}]),n}(C().Component))},6467:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(3427),a=n(2458),o=n(5757),s=n(6617),l=n(9928),i=n(5327),c=n(6775),u=n(6796);const p={Callbacks:r.default,HttpAuth:c.default,RequestBody:a.default,Servers:s.default,ServersContainer:l.default,RequestBodyEditor:i.default,OperationServers:u.default,operationLink:o.default}},5757:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>y});var r=n(6349),a=n.n(r),o=n(4606),s=n.n(o),l=n(4291),i=n.n(l),c=n(1885),u=n.n(c),p=n(8344),d=n.n(p),m=n(3942),h=n.n(m),f=n(6689),g=n.n(f),v=(n(580),n(8082),function(e){i()(n,e);var t=u()(n);function n(){return a()(this,n),t.apply(this,arguments)}return s()(n,[{key:"render",value:function(){var e=this.props,t=e.link,n=e.name,r=(0,e.getComponent)("Markdown",!0),a=t.get("operationId")||t.get("operationRef"),o=t.get("parameters")&&t.get("parameters").toJS(),s=t.get("description");return g().createElement("div",{className:"operation-link"},g().createElement("div",{className:"description"},g().createElement("b",null,g().createElement("code",null,n)),s?g().createElement(r,{source:s}):null),g().createElement("pre",null,"Operation `",a,"`",g().createElement("br",null),g().createElement("br",null),"Parameters ",function(e,t){var n;if("string"!=typeof t)return"";return h()(n=t.split("\n")).call(n,(function(t,n){return n>0?Array(e+1).join(" ")+t:t})).join("\n")}(0,d()(o,null,2))||"{}",g().createElement("br",null)))}}]),n}(f.Component));const y=v},6796:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>b});var r=n(67),a=n.n(r),o=n(6349),s=n.n(o),l=n(4606),i=n.n(l),c=n(4555),u=n.n(c),p=n(4291),d=n.n(p),m=n(1885),h=n.n(m),f=n(1093),g=n.n(f),v=n(4883),y=n.n(v),E=n(6689),S=n.n(E),b=(n(580),n(8082),function(e){d()(n,e);var t=h()(n);function n(){var e,r;s()(this,n);for(var o=arguments.length,l=new Array(o),i=0;i{"use strict";n.r(t),n.d(t,{default:()=>b});var r=n(6349),a=n.n(r),o=n(4606),s=n.n(o),l=n(4555),i=n.n(l),c=n(4291),u=n.n(c),p=n(1885),d=n.n(p),m=n(1093),h=n.n(m),f=n(6689),g=n.n(f),v=(n(580),n(9003)),y=n.n(v),E=n(1890),S=Function.prototype,b=function(e){u()(n,e);var t=d()(n);function n(e,r){var o;return a()(this,n),o=t.call(this,e,r),h()(i()(o),"applyDefaultValue",(function(e){var t=e||o.props,n=t.onChange,r=t.defaultValue;return o.setState({value:r}),n(r)})),h()(i()(o),"onChange",(function(e){o.props.onChange((0,E.Pz)(e))})),h()(i()(o),"onDomChange",(function(e){var t=e.target.value;o.setState({value:t},(function(){return o.onChange(t)}))})),o.state={value:(0,E.Pz)(e.value)||e.defaultValue},e.onChange(e.value),o}return s()(n,[{key:"UNSAFE_componentWillReceiveProps",value:function(e){this.props.value!==e.value&&e.value!==this.state.value&&this.setState({value:(0,E.Pz)(e.value)}),!e.value&&e.defaultValue&&this.state.value&&this.applyDefaultValue(e)}},{key:"render",value:function(){var e=this.props,t=e.getComponent,n=e.errors,r=this.state.value,a=n.size>0,o=t("TextArea");return g().createElement("div",{className:"body-param"},g().createElement(o,{className:y()("body-param__text",{invalid:a}),title:n.size?n.join(", "):"",value:r,onChange:this.onDomChange}))}}]),n}(f.PureComponent);h()(b,"defaultProps",{onChange:S,userHasEditedBody:!1})},2458:(e,t,n)=>{"use strict";n.r(t),n.d(t,{getDefaultRequestBodyValue:()=>S,default:()=>b});var r=n(8030),a=n.n(r),o=n(3942),s=n.n(o),l=n(8493),i=n.n(l),c=n(2605),u=n.n(c),p=n(4883),d=n.n(p),m=n(7104),h=n.n(m),f=n(6689),g=n.n(f),v=(n(580),n(8082),n(5572)),y=n(1890),E=n(2518),S=function(e,t,n){var r=e.getIn(["content",t]),a=r.get("schema").toJS(),o=void 0!==r.get("examples"),s=r.get("example"),l=o?r.getIn(["examples",n,"value"]):s,i=(0,y.xi)(a,t,{includeWriteOnly:!0},l);return(0,y.Pz)(i)};const b=function(e){var t=e.userHasEditedBody,n=e.requestBody,r=e.requestBodyValue,o=e.requestBodyInclusionSetting,l=e.requestBodyErrors,c=e.getComponent,p=e.getConfigs,m=e.specSelectors,f=e.fn,b=e.contentType,C=e.isExecute,x=e.specPath,w=e.onChange,_=e.onChangeIncludeEmpty,A=e.activeExamplesKey,k=e.updateActiveExamplesKey,N=e.setRetainRequestBodyValueFlag,I=function(e){var t={key:e,shouldDispatchInit:!1,defaultValue:!0};return"no value"===o.get(e,"no value")&&(t.shouldDispatchInit=!0),t},q=c("Markdown",!0),R=c("modelExample"),P=c("RequestBodyEditor"),T=c("highlightCode"),O=c("ExamplesSelectValueRetainer"),M=c("Example"),j=c("ParameterIncludeEmpty"),V=p().showCommonExtensions,D=n&&n.get("description")||null,L=n&&n.get("content")||new v.OrderedMap;b=b||L.keySeq().first()||"";var U=L.get(b,(0,v.OrderedMap)()),z=U.get("schema",(0,v.OrderedMap)()),B=U.get("examples",null),J=null==B?void 0:s()(B).call(B,(function(e,t){var r,a=null===(r=e)||void 0===r?void 0:r.get("value",null);return a&&(e=e.set("value",S(n,b,t),a)),e}));if(l=v.List.isList(l)?l:(0,v.List)(),!U.size)return null;var F="object"===U.getIn(["schema","type"]),W="binary"===U.getIn(["schema","format"]),H="base64"===U.getIn(["schema","format"]);if("application/octet-stream"===b||0===i()(b).call(b,"image/")||0===i()(b).call(b,"audio/")||0===i()(b).call(b,"video/")||W||H){var K=c("Input");return C?g().createElement(K,{type:"file",onChange:function(e){w(e.target.files[0])}}):g().createElement("i",null,"Example values are not available for ",g().createElement("code",null,b)," media types.")}if(F&&("application/x-www-form-urlencoded"===b||0===i()(b).call(b,"multipart/"))&&z.get("properties",(0,v.OrderedMap)()).size>0){var Z,G=c("JsonSchemaForm"),Y=c("ParameterExt"),X=z.get("properties",(0,v.OrderedMap)());return r=v.Map.isMap(r)?r:(0,v.OrderedMap)(),g().createElement("div",{className:"table-container"},D&&g().createElement(q,{source:D}),g().createElement("table",null,g().createElement("tbody",null,v.Map.isMap(X)&&s()(Z=X.entrySeq()).call(Z,(function(e){var t,n,i=a()(e,2),p=i[0],m=i[1];if(!m.get("readOnly")){var E=V?(0,y.po)(m):null,S=u()(t=z.get("required",(0,v.List)())).call(t,p),b=m.get("type"),x=m.get("format"),A=m.get("description"),k=r.getIn([p,"value"]),N=r.getIn([p,"errors"])||l,R=o.get(p)||!1,P=m.has("default")||m.has("example")||m.hasIn(["items","example"])||m.hasIn(["items","default"]),T=m.has("enum")&&(1===m.get("enum").size||S),O=P||T,M="";"array"!==b||O||(M=[]),("object"===b||O)&&(M=(0,y.xi)(m,!1,{includeWriteOnly:!0})),"string"!=typeof M&&"object"===b&&(M=(0,y.Pz)(M)),"string"==typeof M&&"array"===b&&(M=JSON.parse(M));var D="string"===b&&("binary"===x||"base64"===x);return g().createElement("tr",{key:p,className:"parameters","data-property-name":p},g().createElement("td",{className:"parameters-col_name"},g().createElement("div",{className:S?"parameter__name required":"parameter__name"},p,S?g().createElement("span",null," *"):null),g().createElement("div",{className:"parameter__type"},b,x&&g().createElement("span",{className:"prop-format"},"($",x,")"),V&&E.size?s()(n=E.entrySeq()).call(n,(function(e){var t,n=a()(e,2),r=n[0],o=n[1];return g().createElement(Y,{key:d()(t="".concat(r,"-")).call(t,o),xKey:r,xVal:o})})):null),g().createElement("div",{className:"parameter__deprecated"},m.get("deprecated")?"deprecated":null)),g().createElement("td",{className:"parameters-col_description"},g().createElement(q,{source:A}),C?g().createElement("div",null,g().createElement(G,{fn:f,dispatchInitialValue:!D,schema:m,description:p,getComponent:c,value:void 0===k?M:k,required:S,errors:N,onChange:function(e){w(e,[p])}}),S?null:g().createElement(j,{onChange:function(e){return _(p,e)},isIncluded:R,isIncludedOptions:I(p),isDisabled:h()(k)?0!==k.length:!(0,y.O2)(k)})):null))}})))))}var Q=S(n,b,A),$=null;return(0,E.O)(Q)&&($="json"),g().createElement("div",null,D&&g().createElement(q,{source:D}),J?g().createElement(O,{userHasEditedBody:t,examples:J,currentKey:A,currentUserInputValue:r,onSelect:function(e){k(e)},updateValue:w,defaultToFirstExample:!0,getComponent:c,setRetainRequestBodyValueFlag:N}):null,C?g().createElement("div",null,g().createElement(P,{value:r,errors:l,defaultValue:Q,onChange:w,getComponent:c})):g().createElement(R,{getComponent:c,getConfigs:p,specSelectors:m,expandDepth:1,isExecute:C,schema:U.get("schema"),specPath:x.push("content",b),example:g().createElement(T,{className:"body-param__example",getConfigs:p,language:$,value:(0,y.Pz)(r)||Q}),includeWriteOnly:!0}),J?g().createElement(M,{example:J.get(A),getComponent:c,getConfigs:p}):null)}},9928:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>m});var r=n(6349),a=n.n(r),o=n(4606),s=n.n(o),l=n(4291),i=n.n(l),c=n(1885),u=n.n(c),p=n(6689),d=n.n(p),m=(n(580),function(e){i()(n,e);var t=u()(n);function n(){return a()(this,n),t.apply(this,arguments)}return s()(n,[{key:"render",value:function(){var e=this.props,t=e.specSelectors,n=e.oas3Selectors,r=e.oas3Actions,a=e.getComponent,o=t.servers(),s=a("Servers");return o&&o.size?d().createElement("div",null,d().createElement("span",{className:"servers-title"},"Servers"),d().createElement(s,{servers:o,currentServer:n.selectedServer(),setSelectedServer:r.setSelectedServer,setServerVariableValue:r.setServerVariableValue,getServerVariable:n.serverVariableValue,getEffectiveServerValue:n.serverEffectiveValue})):null}}]),n}(d().Component))},6617:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>A});var r=n(8030),a=n.n(r),o=n(6349),s=n.n(o),l=n(4606),i=n.n(l),c=n(4555),u=n.n(c),p=n(4291),d=n.n(p),m=n(1885),h=n.n(m),f=n(1093),g=n.n(f),v=n(4883),y=n.n(v),E=n(3580),S=n.n(E),b=n(3942),C=n.n(b),x=n(6689),w=n.n(x),_=n(5572),A=(n(580),n(8082),function(e){d()(n,e);var t=h()(n);function n(){var e,r;s()(this,n);for(var a=arguments.length,o=new Array(a),l=0;l{"use strict";n.r(t),n.d(t,{isOAS3:()=>c,isSwagger2:()=>u,OAS3ComponentWrapFactory:()=>p});var r=n(4250),a=n.n(r),o=n(3262),s=n.n(o),l=n(6689),i=n.n(l);function c(e){var t=e.get("openapi");return"string"==typeof t&&(s()(t).call(t,"3.0.")&&t.length>4)}function u(e){var t=e.get("swagger");return"string"==typeof t&&s()(t).call(t,"2.0")}function p(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?c(n.specSelectors.specJson())?i().createElement(e,a()({},r,n,{Ori:t})):i().createElement(t,r):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},7451:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>p});var r=n(2044),a=n(3723),o=n(1741),s=n(6467),l=n(7761),i=n(7002),c=n(5065),u=n(5013);function p(){return{components:s.default,wrapComponents:l.default,statePlugins:{spec:{wrapSelectors:r,selectors:o},auth:{wrapSelectors:a},oas3:{actions:i,reducers:u.default,selectors:c}}}}},5013:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>S});var r=n(1093),a=n.n(r);const o=require("@babel/runtime-corejs3/helpers/toArray");var s,l=n.n(o),i=n(8030),c=n.n(i),u=n(874),p=n.n(u),d=n(600),m=n.n(d),h=n(4235),f=n.n(h),g=n(66),v=n.n(g),y=n(5572),E=n(7002);const S=(s={},a()(s,E.UPDATE_SELECTED_SERVER,(function(e,t){var n=t.payload,r=n.selectedServerUrl,a=n.namespace,o=a?[a,"selectedServer"]:["selectedServer"];return e.setIn(o,r)})),a()(s,E.UPDATE_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=c()(a,2),s=o[0],i=o[1];if(!y.Map.isMap(r))return e.setIn(["requestData",s,i,"bodyValue"],r);var u,d=e.getIn(["requestData",s,i,"bodyValue"])||(0,y.Map)();y.Map.isMap(d)||(d=(0,y.Map)());var h=p()(r).call(r),g=l()(h),v=m()(g).call(g,0);return f()(v).call(v,(function(e){var t=r.getIn([e]);d.has(e)&&y.Map.isMap(t)||(u=d.setIn([e,"value"],t))})),e.setIn(["requestData",s,i,"bodyValue"],u)})),a()(s,E.UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=c()(a,2),s=o[0],l=o[1];return e.setIn(["requestData",s,l,"retainBodyValue"],r)})),a()(s,E.UPDATE_REQUEST_BODY_INCLUSION,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=n.name,s=c()(a,2),l=s[0],i=s[1];return e.setIn(["requestData",l,i,"bodyInclusion",o],r)})),a()(s,E.UPDATE_ACTIVE_EXAMPLES_MEMBER,(function(e,t){var n=t.payload,r=n.name,a=n.pathMethod,o=n.contextType,s=n.contextName,l=c()(a,2),i=l[0],u=l[1];return e.setIn(["examples",i,u,o,s,"activeExample"],r)})),a()(s,E.UPDATE_REQUEST_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,a=n.pathMethod,o=c()(a,2),s=o[0],l=o[1];return e.setIn(["requestData",s,l,"requestContentType"],r)})),a()(s,E.UPDATE_RESPONSE_CONTENT_TYPE,(function(e,t){var n=t.payload,r=n.value,a=n.path,o=n.method;return e.setIn(["requestData",a,o,"responseContentType"],r)})),a()(s,E.UPDATE_SERVER_VARIABLE_VALUE,(function(e,t){var n=t.payload,r=n.server,a=n.namespace,o=n.key,s=n.val,l=a?[a,"serverVariableValues",r,o]:["serverVariableValues",r,o];return e.setIn(l,s)})),a()(s,E.SET_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,a=n.method,o=n.validationErrors,s=[];if(s.push("Required field is not provided"),o.missingBodyValue)return e.setIn(["requestData",r,a,"errors"],(0,y.fromJS)(s));if(o.missingRequiredKeys&&o.missingRequiredKeys.length>0){var l=o.missingRequiredKeys;return e.updateIn(["requestData",r,a,"bodyValue"],(0,y.fromJS)({}),(function(e){return v()(l).call(l,(function(e,t){return e.setIn([t,"errors"],(0,y.fromJS)(s))}),e)}))}return console.warn("unexpected result: SET_REQUEST_BODY_VALIDATE_ERROR"),e})),a()(s,E.CLEAR_REQUEST_BODY_VALIDATE_ERROR,(function(e,t){var n=t.payload,r=n.path,a=n.method,o=e.getIn(["requestData",r,a,"bodyValue"]);if(!y.Map.isMap(o))return e.setIn(["requestData",r,a,"errors"],(0,y.fromJS)([]));var s=p()(o).call(o),i=l()(s),c=m()(i).call(i,0);return c?e.updateIn(["requestData",r,a,"bodyValue"],(0,y.fromJS)({}),(function(e){return v()(c).call(c,(function(e,t){return e.setIn([t,"errors"],(0,y.fromJS)([]))}),e)})):e})),a()(s,E.CLEAR_REQUEST_BODY_VALUE,(function(e,t){var n=t.payload.pathMethod,r=c()(n,2),a=r[0],o=r[1],s=e.getIn(["requestData",a,o,"bodyValue"]);return s?y.Map.isMap(s)?e.setIn(["requestData",a,o,"bodyValue"],(0,y.Map)()):e.setIn(["requestData",a,o,"bodyValue"],""):e})),s)},5065:(e,t,n)=>{"use strict";n.r(t),n.d(t,{selectedServer:()=>b,requestBodyValue:()=>C,shouldRetainRequestBodyValue:()=>x,hasUserEditedBody:()=>w,requestBodyInclusionSetting:()=>_,requestBodyErrors:()=>A,activeExamplesMember:()=>k,requestContentType:()=>N,responseContentType:()=>I,serverVariableValue:()=>q,serverVariables:()=>R,serverEffectiveValue:()=>P,validateBeforeExecute:()=>T,validateShallowRequired:()=>O});var r=n(6731),a=n.n(r),o=n(4883),s=n.n(o),l=n(3942),i=n.n(l),c=n(4235),u=n.n(c),p=n(7252),d=n.n(p),m=n(8493),h=n.n(m),f=n(5572),g=n(7779),v=n(2458),y=n(1890);function E(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r{"use strict";n.r(t),n.d(t,{servers:()=>u,isSwagger2:()=>p});var r=n(6814),a=n(5572),o=n(7779);var s,l=function(e){return e||(0,a.Map)()},i=(0,r.createSelector)(l,(function(e){return e.get("json",(0,a.Map)())})),c=(0,r.createSelector)(l,(function(e){return e.get("resolved",(0,a.Map)())})),u=(s=(0,r.createSelector)((function(e){var t=c(e);return t.count()<1&&(t=i(e)),t}),(function(e){return e.getIn(["servers"])||(0,a.Map)()})),function(){return function(e){var t=e.getSystem().specSelectors.specJson();if((0,o.isOAS3)(t)){for(var n=arguments.length,r=new Array(n>1?n-1:0),a=1;a{"use strict";n.r(t),n.d(t,{definitions:()=>m,hasHost:()=>h,securityDefinitions:()=>f,host:()=>g,basePath:()=>v,consumes:()=>y,produces:()=>E,schemes:()=>S,servers:()=>b,isOAS3:()=>C,isSwagger2:()=>x});var r=n(6814),a=n(3881),o=n(5572),s=n(7779);function l(e){return function(t,n){return function(){var r=n.getSystem().specSelectors.specJson();return(0,s.isOAS3)(r)?e.apply(void 0,arguments):t.apply(void 0,arguments)}}}var i=function(e){return e||(0,o.Map)()},c=l((0,r.createSelector)((function(){return null}))),u=(0,r.createSelector)(i,(function(e){return e.get("json",(0,o.Map)())})),p=(0,r.createSelector)(i,(function(e){return e.get("resolved",(0,o.Map)())})),d=function(e){var t=p(e);return t.count()<1&&(t=u(e)),t},m=l((0,r.createSelector)(d,(function(e){var t=e.getIn(["components","schemas"]);return o.Map.isMap(t)?t:(0,o.Map)()}))),h=l((function(e){return d(e).hasIn(["servers",0])})),f=l((0,r.createSelector)(a.specJsonWithResolvedSubtrees,(function(e){return e.getIn(["components","securitySchemes"])||null}))),g=c,v=c,y=c,E=c,S=c,b=l((0,r.createSelector)(d,(function(e){return e.getIn(["servers"])||(0,o.Map)()}))),C=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return(0,s.isOAS3)(o.Map.isMap(e)?e:(0,o.Map)())}},x=function(e,t){return function(){var e=t.getSystem().specSelectors.specJson();return(0,s.isSwagger2)(o.Map.isMap(e)?e:(0,o.Map)())}}},356:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>c});var r=n(5579),a=n.n(r),o=n(6689),s=n.n(o),l=n(7779),i=["Ori"];const c=(0,l.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=a()(e,i),r=n.schema,o=n.getComponent,l=n.errSelectors,c=n.authorized,u=n.onAuthChange,p=n.name,d=o("HttpAuth");return"http"===r.get("type")?s().createElement(d,{key:p,schema:r,name:p,errSelectors:l,authorized:c,getComponent:o,onChange:u}):s().createElement(t,n)}))},7761:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>c});var r=n(2460),a=n(356),o=n(9487),s=n(58),l=n(3499),i=n(287);const c={Markdown:r.default,AuthItem:a.default,JsonSchema_string:i.default,VersionStamp:o.default,model:l.default,onlineValidatorBadge:s.default}},287:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>c});var r=n(5579),a=n.n(r),o=n(6689),s=n.n(o),l=n(7779),i=["Ori"];const c=(0,l.OAS3ComponentWrapFactory)((function(e){var t=e.Ori,n=a()(e,i),r=n.schema,o=n.getComponent,l=n.errors,c=n.onChange,u=r&&r.get?r.get("format"):null,p=r&&r.get?r.get("type"):null,d=o("Input");return p&&"string"===p&&u&&("binary"===u||"base64"===u)?s().createElement(d,{type:"file",className:l.length?"invalid":"",title:l.length?l:"",onChange:function(e){c(e.target.files[0])},disabled:t.isDisabled}):s().createElement(t,n)}))},2460:(e,t,n)=>{"use strict";n.r(t),n.d(t,{Markdown:()=>m,default:()=>h});var r=n(7390),a=n.n(r),o=n(6689),s=n.n(o),l=(n(580),n(9003)),i=n.n(l),c=n(963),u=n(7779),p=n(2552),d=new c.Remarkable("commonmark");d.block.ruler.enable(["table"]),d.set({linkTarget:"_blank"});var m=function(e){var t=e.source,n=e.className,r=void 0===n?"":n,o=e.getConfigs;if("string"!=typeof t)return null;if(t){var l,c=o().useUnsafeMarkdown,u=d.render(t),m=(0,p.s)(u,{useUnsafeMarkdown:c});return"string"==typeof m&&(l=a()(m).call(m)),s().createElement("div",{dangerouslySetInnerHTML:{__html:l},className:i()(r,"renderedMarkdown")})}return null};m.defaultProps={getConfigs:function(){return{useUnsafeMarkdown:!1}}};const h=(0,u.OAS3ComponentWrapFactory)(m)},3499:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>y});var r=n(4250),a=n.n(r),o=n(6349),s=n.n(o),l=n(4606),i=n.n(l),c=n(4291),u=n.n(c),p=n(1885),d=n.n(p),m=n(6689),h=n.n(m),f=(n(580),n(7779)),g=n(6024),v=function(e){u()(n,e);var t=d()(n);function n(){return s()(this,n),t.apply(this,arguments)}return i()(n,[{key:"render",value:function(){var e=this.props,t=e.getConfigs,n=["model-box"],r=null;return!0===e.schema.get("deprecated")&&(n.push("deprecated"),r=h().createElement("span",{className:"model-deprecated-warning"},"Deprecated:")),h().createElement("div",{className:n.join(" ")},r,h().createElement(g.Z,a()({},this.props,{getConfigs:t,depth:1,expandDepth:this.props.expandDepth||0})))}}]),n}(m.Component);const y=(0,f.OAS3ComponentWrapFactory)(v)},58:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(7779),a=n(5623);const o=(0,r.OAS3ComponentWrapFactory)(a.Z)},9487:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(6689),a=n.n(r);const o=(0,n(7779).OAS3ComponentWrapFactory)((function(e){var t=e.Ori;return a().createElement("span",null,a().createElement(t,e),a().createElement("small",{className:"version-stamp"},a().createElement("pre",{className:"version"},"OAS3")))}))},8560:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>s});var r=n(9300),a=n.n(r),o=!1;function s(){return{statePlugins:{spec:{wrapActions:{updateSpec:function(e){return function(){return o=!0,e.apply(void 0,arguments)}},updateJsonSpec:function(e,t){return function(){var n=t.getConfigs().onComplete;return o&&"function"==typeof n&&(a()(n,0),o=!1),e.apply(void 0,arguments)}}}}}}}},8223:(e,t,n)=>{"use strict";n.r(t),n.d(t,{requestSnippetGenerator_curl_bash:()=>O,requestSnippetGenerator_curl_cmd:()=>M,requestSnippetGenerator_curl_powershell:()=>T});var r=n(6731),a=n.n(r),o=n(8030),s=n.n(o),l=n(1771),i=n.n(l),c=n(8493),u=n.n(c),p=n(7390),d=n.n(p),m=n(4883),h=n.n(m),f=n(8344),g=n.n(f),v=n(3942),y=n.n(v);const E=require("@babel/runtime-corejs3/core-js-stable/instance/repeat");var S=n.n(E),b=n(7862),C=n.n(b),x=n(2605),w=n.n(x),_=n(7504),A=n(5572),k=function(e){var t,n="_**[]";return u()(e).call(e,n)<0?e:d()(t=e.split(n)[0]).call(t)},N=function(e){return"-d "===e||/^[_\/-]/g.test(e)?e:"'"+e.replace(/'/g,"'\\''")+"'"},I=function(e){return"-d "===(e=e.replace(/\^/g,"^^").replace(/\\"/g,'\\\\"').replace(/"/g,'""').replace(/\n/g,"^\n"))?e.replace(/-d /g,"-d ^\n"):/^[_\/-]/g.test(e)?e:'"'+e+'"'},q=function(e){return"-d "===e?e:/\n/.test(e)?'@"\n'+e.replace(/"/g,'\\"').replace(/`/g,"``").replace(/\$/,"`$")+'\n"@':/^[_\/-]/g.test(e)?e:"'"+e.replace(/"/g,'""').replace(/'/g,"''")+"'"};function R(e){var t,n=[],r=i()(e.get("body").entrySeq());try{for(r.s();!(t=r.n()).done;){var a,o,l,c=s()(t.value,2),u=c[0],p=c[1],d=k(u);if(p instanceof _.Z.File)n.push(h()(a=h()(o=' "'.concat(d,'": {\n "name": "')).call(o,p.name,'"')).call(a,p.type?',\n "type": "'.concat(p.type,'"'):"","\n }"));else n.push(h()(l=' "'.concat(d,'": ')).call(l,g()(p,null,2).replace(/(\r\n|\r|\n)/g,"\n ")))}}catch(e){r.e(e)}finally{r.f()}return"{\n".concat(n.join(",\n"),"\n}")}var P=function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",o=!1,l="",c=function(){for(var e=arguments.length,n=new Array(e),r=0;r0&&void 0!==arguments[0]?arguments[0]:1;return l+=S()(e=" ").call(e,t)},m=e.get("headers");if(l+="curl"+r,e.has("curlOptions")&&c.apply(void 0,a()(e.get("curlOptions"))),c("-X",e.get("method")),p(),d(),u("".concat(e.get("url"))),m&&m.size){var f,v,E=i()(C()(f=e.get("headers")).call(f));try{for(E.s();!(v=E.n()).done;){var b,x=v.value;p(),d();var N=s()(x,2),I=N[0],q=N[1];u("-H",h()(b="".concat(I,": ")).call(b,q)),o=o||/^content-type$/i.test(I)&&/^multipart\/form-data$/i.test(q)}}catch(e){E.e(e)}finally{E.f()}}var P,T=e.get("body");if(T)if(o&&w()(P=["POST","PUT","PATCH"]).call(P,e.get("method"))){var O,M=i()(T.entrySeq());try{for(M.s();!(O=M.n()).done;){var j,V,D,L=s()(O.value,2),U=L[0],z=L[1],B=k(U);if(p(),d(),u("-F"),z instanceof _.Z.File)c(h()(j=h()(V="".concat(B,"=@")).call(V,z.name)).call(j,z.type?";type=".concat(z.type):""));else c(h()(D="".concat(B,"=")).call(D,z))}}catch(e){M.e(e)}finally{M.f()}}else if(T instanceof _.Z.File)p(),d(),u("--data-binary '@".concat(T.name,"'"));else{p(),d(),u("-d ");var J=T;A.Map.isMap(J)?u(R(e)):("string"!=typeof J&&(J=g()(J)),u(J))}else T||"POST"!==e.get("method")||(p(),d(),u("-d ''"));return l},T=function(e){return P(e,q,"`\n",".exe")},O=function(e){return P(e,N,"\\\n")},M=function(e){return P(e,I,"^\n")}},6575:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>s});var r=n(8223),a=n(4669),o=n(4206);const s=function(){return{components:{RequestSnippets:o.default},fn:r,statePlugins:{requestSnippets:{selectors:a}}}}},4206:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>x});var r=n(8030),a=n.n(r),o=n(9998),s=n.n(o),l=n(1733),i=n.n(l),c=n(4235),u=n.n(c),p=n(3942),d=n.n(p),m=n(6689),h=n.n(m),f=(n(580),n(1712)),g=n.n(f),v=n(5716),y=n.n(v),E=n(2807),S=n(6068),b={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(250, 250, 250)",paddingBottom:"0",paddingTop:"0",border:"1px solid rgb(51, 51, 51)",borderRadius:"4px 4px 0 0",boxShadow:"none",borderBottom:"none"},C={cursor:"pointer",lineHeight:1,display:"inline-flex",backgroundColor:"rgb(51, 51, 51)",boxShadow:"none",border:"1px solid rgb(51, 51, 51)",paddingBottom:"0",paddingTop:"0",borderRadius:"4px 4px 0 0",marginTop:"-5px",marginRight:"-5px",marginLeft:"-5px",zIndex:"9999",borderBottom:"none"};const x=function(e){var t,n,r=e.request,o=e.requestSnippetsSelectors,l=e.getConfigs,c=y()(l)?l():null,p=!1!==g()(c,"syntaxHighlight")&&g()(c,"syntaxHighlight.activated",!0),f=(0,m.useRef)(null),v=(0,m.useState)(null===(t=o.getSnippetGenerators())||void 0===t?void 0:t.keySeq().first()),x=a()(v,2),w=x[0],_=x[1],A=(0,m.useState)(null==o?void 0:o.getDefaultExpanded()),k=a()(A,2),N=k[0],I=k[1];(0,m.useEffect)((function(){}),[]),(0,m.useEffect)((function(){var e,t=s()(e=i()(f.current.childNodes)).call(e,(function(e){var t;return!!e.nodeType&&(null===(t=e.classList)||void 0===t?void 0:t.contains("curl-command"))}));return u()(t).call(t,(function(e){return e.addEventListener("mousewheel",M,{passive:!1})})),function(){u()(t).call(t,(function(e){return e.removeEventListener("mousewheel",M)}))}}),[r]);var q=o.getSnippetGenerators(),R=q.get(w),P=R.get("fn")(r),T=function(){I(!N)},O=function(e){return e===w?C:b},M=function(e){var t=e.target,n=e.deltaY,r=t.scrollHeight,a=t.offsetHeight,o=t.scrollTop;r>a&&(0===o&&n<0||a+o>=r&&n>0)&&e.preventDefault()},j=p?h().createElement(S.d3,{language:R.get("syntax"),className:"curl microlight",style:(0,S.C2)(g()(c,"syntaxHighlight.theme"))},P):h().createElement("textarea",{readOnly:!0,className:"curl",value:P});return h().createElement("div",{className:"request-snippets",ref:f},h().createElement("div",{style:{width:"100%",display:"flex",justifyContent:"flex-start",alignItems:"center",marginBottom:"15px"}},h().createElement("h4",{onClick:function(){return T()},style:{cursor:"pointer"}},"Snippets"),h().createElement("button",{onClick:function(){return T()},style:{border:"none",background:"none"},title:N?"Collapse operation":"Expand operation"},h().createElement("svg",{className:"arrow",width:"10",height:"10"},h().createElement("use",{href:N?"#large-arrow-down":"#large-arrow",xlinkHref:N?"#large-arrow-down":"#large-arrow"})))),N&&h().createElement("div",{className:"curl-command"},h().createElement("div",{style:{paddingLeft:"15px",paddingRight:"10px",width:"100%",display:"flex"}},d()(n=q.entrySeq()).call(n,(function(e){var t=a()(e,2),n=t[0],r=t[1];return h().createElement("div",{style:O(n),className:"btn",key:n,onClick:function(){return function(e){w!==e&&_(e)}(n)}},h().createElement("h4",{style:n===w?{color:"white"}:{}},r.get("title")))}))),h().createElement("div",{className:"copy-to-clipboard"},h().createElement(E.CopyToClipboard,{text:P},h().createElement("button",null))),h().createElement("div",null,j)))}},4669:(e,t,n)=>{"use strict";n.r(t),n.d(t,{getGenerators:()=>d,getSnippetGenerators:()=>m,getActiveLanguage:()=>h,getDefaultExpanded:()=>f});var r=n(9998),a=n.n(r),o=n(2605),s=n.n(o),l=n(3942),i=n.n(l),c=n(6814),u=n(5572),p=function(e){return e||(0,u.Map)()},d=(0,c.createSelector)(p,(function(e){var t=e.get("languages"),n=e.get("generators",(0,u.Map)());return!t||t.isEmpty()?n:a()(n).call(n,(function(e,n){return s()(t).call(t,n)}))})),m=function(e){return function(t){var n,r,o=t.fn;return a()(n=i()(r=d(e)).call(r,(function(e,t){var n=function(e){return o["requestSnippetGenerator_".concat(e)]}(t);return"function"!=typeof n?null:e.set("fn",n)}))).call(n,(function(e){return e}))}},h=(0,c.createSelector)(p,(function(e){return e.get("activeLanguage")})),f=(0,c.createSelector)(p,(function(e){return e.get("defaultExpanded")}))},6195:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ErrorBoundary:()=>v,default:()=>y});var r=n(6349),a=n.n(r),o=n(4606),s=n.n(o),l=n(4291),i=n.n(l),c=n(1885),u=n.n(c),p=n(4883),d=n.n(p),m=(n(580),n(6689)),h=n.n(m),f=n(6189),g=n(9403),v=function(e){i()(n,e);var t=u()(n);function n(){var e,r;a()(this,n);for(var o=arguments.length,s=new Array(o),l=0;l{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(6689),a=n.n(r);n(580);const o=function(e){var t=e.name;return a().createElement("div",{className:"fallback"},"😱 ",a().createElement("i",null,"Could not render ","t"===t?"this component":t,", see the console."))}},6189:(e,t,n)=>{"use strict";n.r(t),n.d(t,{componentDidCatch:()=>f,withErrorBoundary:()=>g});var r=n(4250),a=n.n(r),o=n(6349),s=n.n(o),l=n(4606),i=n.n(l),c=n(4291),u=n.n(c),p=n(1885),d=n.n(p),m=n(6689),h=n.n(m),f=console.error,g=function(e){return function(t){var n,r=e(),o=r.getComponent,l=r.fn,c=o("ErrorBoundary"),p=l.getDisplayName(t),f=function(e){u()(r,e);var n=d()(r);function r(){return s()(this,r),n.apply(this,arguments)}return i()(r,[{key:"render",value:function(){return h().createElement(c,{targetName:p,getComponent:o,fn:l},h().createElement(t,a()({},this.props,this.context)))}}]),r}(m.Component);return f.displayName="WithErrorBoundary(".concat(p,")"),(n=t).prototype&&n.prototype.isReactComponent&&(f.prototype.mapStateToProps=t.prototype.mapStateToProps),f}}},9595:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>h});var r=n(6731),a=n.n(r),o=n(4883),s=n.n(o);const l=require("@babel/runtime-corejs3/core-js-stable/instance/fill");var i=n.n(l);const c=require("lodash/zipObject");var u=n.n(c),p=n(6195),d=n(9403),m=n(6189);const h=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.componentList,n=void 0===t?[]:t,r=e.fullOverride,o=void 0!==r&&r;return function(e){var t,r,l=e.getSystem,c=o?n:s()(t=[]).call(t,["App","BaseLayout","VersionPragmaFilter","InfoContainer","ServersContainer","SchemesContainer","AuthorizeBtnContainer","FilterContainer","Operations","OperationContainer","parameters","responses","OperationServers","Models","ModelWrapper"],a()(n)),h=u()(c,i()(r=Array(c.length)).call(r,(function(e,t){return t.fn.withErrorBoundary(e)})));return{fn:{componentDidCatch:m.componentDidCatch,withErrorBoundary:(0,m.withErrorBoundary)(l)},components:{ErrorBoundary:p.default,Fallback:d.default},wrapComponents:h}}}},4128:(e,t,n)=>{"use strict";n.r(t),n.d(t,{createXMLExample:()=>J,inferSchema:()=>B,memoizedCreateXMLExample:()=>H,memoizedSampleFromSchema:()=>K,sampleFromSchema:()=>F,sampleFromSchemaGeneric:()=>z});var r=n(6768),a=n.n(r),o=n(4883),s=n.n(o),l=n(8493),i=n.n(l),c=n(4235),u=n.n(c),p=n(7104),d=n.n(p),m=n(2605),h=n.n(m),f=n(5626),g=n.n(f),v=n(600),y=n.n(v),E=n(3580),S=n.n(E),b=n(3942),C=n.n(b),x=n(8344),w=n.n(x);const _=require("xml");var A=n.n(_);const k=require("randexp");var N=n.n(k);const I=require("lodash/isEmpty");var q=n.n(I),R=n(1890),P=n(7156),T={string:function(e){return e.pattern?function(e){try{return new(N())(e).gen()}catch(e){return"string"}}(e.pattern):"string"},string_email:function(){return"user@example.com"},"string_date-time":function(){return(new Date).toISOString()},string_date:function(){return(new Date).toISOString().substring(0,10)},string_uuid:function(){return"3fa85f64-5717-4562-b3fc-2c963f66afa6"},string_hostname:function(){return"example.com"},string_ipv4:function(){return"198.51.100.42"},string_ipv6:function(){return"2001:0db8:5b96:0000:0000:426f:8e17:642a"},number:function(){return 0},number_float:function(){return 0},integer:function(){return 0},boolean:function(e){return"boolean"!=typeof e.default||e.default}},O=function(e){var t,n=e=(0,R.mz)(e),r=n.type,a=n.format,o=T[s()(t="".concat(r,"_")).call(t,a)]||T[r];return(0,R.Wl)(o)?o(e):"Unknown Type: "+e.type},M=function(e){return(0,R.XV)(e,"$$ref",(function(e){return"string"==typeof e&&i()(e).call(e,"#")>-1}))},j=["maxProperties","minProperties"],V=["minItems","maxItems"],D=["minimum","maximum","exclusiveMinimum","exclusiveMaximum"],L=["minLength","maxLength"],U=function e(t,n){var r,a,o,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},c=function(e){void 0===n[e]&&void 0!==t[e]&&(n[e]=t[e])};(u()(r=s()(a=["example","default","enum","xml","type"]).call(a,j,V,D,L)).call(r,(function(e){return c(e)})),void 0!==t.required&&d()(t.required))&&(void 0!==n.required&&n.required.length||(n.required=[]),u()(o=t.required).call(o,(function(e){var t;h()(t=n.required).call(t,e)||n.required.push(e)})));if(t.properties){n.properties||(n.properties={});var p=(0,R.mz)(t.properties);for(var m in p){var f;if(Object.prototype.hasOwnProperty.call(p,m))if(!p[m]||!p[m].deprecated)if(!p[m]||!p[m].readOnly||l.includeReadOnly)if(!p[m]||!p[m].writeOnly||l.includeWriteOnly)if(!n.properties[m])n.properties[m]=p[m],!t.required&&d()(t.required)&&-1!==i()(f=t.required).call(f,m)&&(n.required?n.required.push(m):n.required=[m])}}return t.items&&(n.items||(n.items={}),n.items=e(t.items,n.items,l)),n},z=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];t&&(0,R.Wl)(t.toJS)&&(t=t.toJS());var l=void 0!==r||t&&void 0!==t.example||t&&void 0!==t.default,c=!l&&t&&t.oneOf&&t.oneOf.length>0,p=!l&&t&&t.anyOf&&t.anyOf.length>0;if(!l&&(c||p)){var m=(0,R.mz)(c?t.oneOf[0]:t.anyOf[0]);if(U(m,t,n),!t.xml&&m.xml&&(t.xml=m.xml),void 0!==t.example&&void 0!==m.example)l=!0;else if(m.properties){t.properties||(t.properties={});var f=(0,R.mz)(m.properties);for(var v in f){var E;if(Object.prototype.hasOwnProperty.call(f,v))if(!f[v]||!f[v].deprecated)if(!f[v]||!f[v].readOnly||n.includeReadOnly)if(!f[v]||!f[v].writeOnly||n.includeWriteOnly)if(!t.properties[v])t.properties[v]=f[v],!m.required&&d()(m.required)&&-1!==i()(E=m.required).call(E,v)&&(t.required?t.required.push(v):t.required=[v])}}}var b,x={},w=t||{},_=w.xml,A=w.type,k=w.example,N=w.properties,I=w.additionalProperties,P=w.items,T=n.includeReadOnly,L=n.includeWriteOnly,z=_=_||{},B=z.name,J=z.prefix,F=z.namespace,W={};if(o&&(b=(J?J+":":"")+(B=B||"notagname"),F)){var H=J?"xmlns:"+J:"xmlns";x[H]=F}o&&(W[b]=[]);var K=function(e){return g()(e).call(e,(function(e){return Object.prototype.hasOwnProperty.call(t,e)}))};t&&!A&&(N||I||K(j)?A="object":P||K(V)?A="array":K(D)?(A="number",t.type="number"):l||t.enum||(A="string",t.type="string"));var Z,G,Y=function(e){var n,r,a,o,s;null!==(null===(n=t)||void 0===n?void 0:n.maxItems)&&void 0!==(null===(r=t)||void 0===r?void 0:r.maxItems)&&(e=y()(e).call(e,0,null===(s=t)||void 0===s?void 0:s.maxItems));if(null!==(null===(a=t)||void 0===a?void 0:a.minItems)&&void 0!==(null===(o=t)||void 0===o?void 0:o.minItems))for(var l=0;e.length<(null===(i=t)||void 0===i?void 0:i.minItems);){var i;e.push(e[l++%e.length])}return e},X=(0,R.mz)(N),Q=0,$=function(){return t&&null!==t.maxProperties&&void 0!==t.maxProperties&&Q>=t.maxProperties},ee=function(){if(!t||!t.required)return 0;var e,n,r=0;o?u()(e=t.required).call(e,(function(e){return r+=void 0===W[e]?0:1})):u()(n=t.required).call(n,(function(e){var t;return r+=void 0===(null===(t=W[b])||void 0===t?void 0:S()(t).call(t,(function(t){return void 0!==t[e]})))?0:1}));return t.required.length-r},te=function(e){var n;return!(t&&t.required&&t.required.length)||!h()(n=t.required).call(n,e)},ne=function(e){return!t||null===t.maxProperties||void 0===t.maxProperties||!$()&&(!te(e)||t.maxProperties-Q-ee()>0)};if(Z=o?function(r){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0;if(t&&X[r]){if(X[r].xml=X[r].xml||{},X[r].xml.attribute){var l=d()(X[r].enum)?X[r].enum[0]:void 0,i=X[r].example,c=X[r].default;return void(x[X[r].xml.name||r]=void 0!==i?i:void 0!==c?c:void 0!==l?l:O(X[r]))}X[r].xml.name=X[r].xml.name||r}else X[r]||!1===I||(X[r]={xml:{name:r}});var u,p=e(t&&X[r]||void 0,n,a,o);ne(r)&&(Q++,d()(p)?W[b]=s()(u=W[b]).call(u,p):W[b].push(p))}:function(t,r){ne(t)&&(W[t]=e(X[t],n,r,o),Q++)},l){var re;if(re=M(void 0!==r?r:void 0!==k?k:t.default),!o){if("number"==typeof re&&"string"===A)return"".concat(re);if("string"!=typeof re||"string"===A)return re;try{return JSON.parse(re)}catch(e){return re}}if(t||(A=d()(re)?"array":a()(re)),"array"===A){if(!d()(re)){if("string"==typeof re)return re;re=[re]}var ae=t?t.items:void 0;ae&&(ae.xml=ae.xml||_||{},ae.xml.name=ae.xml.name||_.name);var oe=C()(re).call(re,(function(t){return e(ae,n,t,o)}));return oe=Y(oe),_.wrapped?(W[b]=oe,q()(x)||W[b].push({_attr:x})):W=oe,W}if("object"===A){if("string"==typeof re)return re;for(var se in re)Object.prototype.hasOwnProperty.call(re,se)&&(t&&X[se]&&X[se].readOnly&&!T||t&&X[se]&&X[se].writeOnly&&!L||(t&&X[se]&&X[se].xml&&X[se].xml.attribute?x[X[se].xml.name||se]=re[se]:Z(se,re[se])));return q()(x)||W[b].push({_attr:x}),W}return W[b]=q()(x)?re:[{_attr:x},re],W}if("object"===A){for(var le in X)Object.prototype.hasOwnProperty.call(X,le)&&(X[le]&&X[le].deprecated||X[le]&&X[le].readOnly&&!T||X[le]&&X[le].writeOnly&&!L||Z(le));if(o&&x&&W[b].push({_attr:x}),$())return W;if(!0===I)o?W[b].push({additionalProp:"Anything can be here"}):W.additionalProp1={},Q++;else if(I){var ie=(0,R.mz)(I),ce=e(ie,n,void 0,o);if(o&&ie.xml&&ie.xml.name&&"notagname"!==ie.xml.name)W[b].push(ce);else for(var ue=null!==t.minProperties&&void 0!==t.minProperties&&Q{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4128);function a(){return{fn:r}}},7960:(e,t,n)=>{"use strict";n.r(t),n.d(t,{CLEAR_REQUEST:()=>de,CLEAR_RESPONSE:()=>pe,CLEAR_VALIDATE_PARAMS:()=>me,LOG_REQUEST:()=>ue,SET_MUTATED_REQUEST:()=>ce,SET_REQUEST:()=>ie,SET_RESPONSE:()=>le,SET_SCHEME:()=>ve,UPDATE_EMPTY_PARAM_INCLUSION:()=>oe,UPDATE_JSON:()=>re,UPDATE_OPERATION_META_VALUE:()=>he,UPDATE_PARAM:()=>ae,UPDATE_RESOLVED:()=>fe,UPDATE_RESOLVED_SUBTREE:()=>ge,UPDATE_SPEC:()=>te,UPDATE_URL:()=>ne,VALIDATE_PARAMS:()=>se,changeConsumesValue:()=>Me,changeParam:()=>Ne,changeParamByIdentity:()=>Ie,changeProducesValue:()=>je,clearRequest:()=>Fe,clearResponse:()=>Je,clearValidateParams:()=>Oe,execute:()=>Be,executeRequest:()=>ze,invalidateResolvedSubtreeCache:()=>Re,logRequest:()=>Ue,parseToJson:()=>Ce,requestResolvedSubtree:()=>ke,resolveSpec:()=>we,setMutatedRequest:()=>Le,setRequest:()=>De,setResponse:()=>Ve,setScheme:()=>We,updateEmptyParamInclusion:()=>Te,updateJsonSpec:()=>be,updateResolved:()=>Ee,updateResolvedSubtree:()=>qe,updateSpec:()=>ye,updateUrl:()=>Se,validateParams:()=>Pe});var r=n(67),a=n.n(r),o=n(5579),s=n.n(o);const l=require("@babel/runtime-corejs3/helpers/asyncToGenerator");var i=n.n(l),c=n(6768),u=n.n(c);const p=require("@babel/runtime-corejs3/regenerator");var d=n.n(p),m=n(7104),h=n.n(m),f=n(3942),g=n.n(f);const v=require("@babel/runtime-corejs3/core-js-stable/object/define-property");var y=n.n(v),E=n(66),S=n.n(E),b=n(7834),C=n.n(b);const x=require("@babel/runtime-corejs3/core-js-stable/promise");var w=n.n(x),_=n(9998),A=n.n(_),k=n(9968),N=n.n(k),I=n(8493),q=n.n(I),R=n(4235),P=n.n(R),T=n(4883),O=n.n(T),M=n(7252),j=n.n(M),V=n(4994),D=n.n(V);const L=require("@babel/runtime-corejs3/core-js-stable/date/now");var U=n.n(L),z=n(9793),B=n.n(z),J=n(5572),F=n(3883),W=n.n(F),H=n(41);const K=require("lodash/isString");var Z=n.n(K);const G=require("lodash/debounce");var Y=n.n(G);const X=require("lodash/set");var Q=n.n(X),$=n(1890),ee=["path","method"],te="spec_update_spec",ne="spec_update_url",re="spec_update_json",ae="spec_update_param",oe="spec_update_empty_param_inclusion",se="spec_validate_param",le="spec_set_response",ie="spec_set_request",ce="spec_set_mutated_request",ue="spec_log_request",pe="spec_clear_response",de="spec_clear_request",me="spec_clear_validate_param",he="spec_update_operation_meta_value",fe="spec_update_resolved",ge="spec_update_resolved_subtree",ve="set_scheme";function ye(e){var t,n=(t=e,Z()(t)?t:"").replace(/\t/g," ");if("string"==typeof e)return{type:te,payload:n}}function Ee(e){return{type:fe,payload:e}}function Se(e){return{type:ne,payload:e}}function be(e){return{type:re,payload:e}}var Ce=function(e){return function(t){var n=t.specActions,r=t.specSelectors,a=t.errActions,o=r.specStr,s=null;try{e=e||o(),a.clear({source:"parser"}),s=B().load(e,{schema:z.JSON_SCHEMA})}catch(e){return console.error(e),a.newSpecErr({source:"parser",level:"error",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return s&&"object"===u()(s)?n.updateJsonSpec(s):{}}},xe=!1,we=function(e,t){return function(n){var r=n.specActions,a=n.specSelectors,o=n.errActions,s=n.fn,l=s.fetch,i=s.resolve,c=s.AST,u=void 0===c?{}:c,p=n.getConfigs;xe||(console.warn("specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!"),xe=!0);var d=p(),m=d.modelPropertyMacro,f=d.parameterMacro,v=d.requestInterceptor,E=d.responseInterceptor;void 0===e&&(e=a.specJson()),void 0===t&&(t=a.url());var S=u.getLineNumberForPath?u.getLineNumberForPath:function(){},b=a.specStr();return i({fetch:l,spec:e,baseDoc:t,modelPropertyMacro:m,parameterMacro:f,requestInterceptor:v,responseInterceptor:E}).then((function(e){var t=e.spec,n=e.errors;if(o.clear({type:"thrown"}),h()(n)&&n.length>0){var a=g()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?S(b,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e}));o.newThrownErrBatch(a)}return r.updateResolved(t)}))}},_e=[],Ae=Y()(i()(d().mark((function e(){var t,n,r,a,o,s,l,c,u,p,m,f,v,E,b,x,_,k;return d().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=_e.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,a=t.fn,o=a.resolveSubtree,s=a.fetch,l=a.AST,c=void 0===l?{}:l,u=t.specSelectors,p=t.specActions,o){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return m=c.getLineNumberForPath?c.getLineNumberForPath:function(){},f=u.specStr(),v=t.getConfigs(),E=v.modelPropertyMacro,b=v.parameterMacro,x=v.requestInterceptor,_=v.responseInterceptor,e.prev=11,e.next=14,S()(_e).call(_e,function(){var e=i()(d().mark((function e(t,a){var l,c,p,v,S,k,I,q,R;return d().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return l=e.sent,c=l.resultMap,p=l.specWithCurrentSubtrees,e.next=7,o(p,a,{baseDoc:u.url(),modelPropertyMacro:E,parameterMacro:b,requestInterceptor:x,responseInterceptor:_});case 7:if(v=e.sent,S=v.errors,k=v.spec,r.allErrors().size&&n.clearBy((function(e){var t;return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!C()(t=e.get("fullPath")).call(t,(function(e,t){return e===a[t]||void 0===a[t]}))})),h()(S)&&S.length>0&&(I=g()(S).call(S,(function(e){return e.line=e.fullPath?m(f,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(I)),!k||!u.isOAS3()||"components"!==a[0]||"securitySchemes"!==a[1]){e.next=15;break}return e.next=15,w().all(g()(q=A()(R=N()(k)).call(R,(function(e){return"openIdConnect"===e.type}))).call(q,function(){var e=i()(d().mark((function e(t){var n,r;return d().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:x,responseInterceptor:_},e.prev=1,e.next=4,s(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+" "+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case"end":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return Q()(c,a,k),Q()(p,a,k),e.abrupt("return",{resultMap:c,specWithCurrentSubtrees:p});case 18:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),w().resolve({resultMap:(u.specResolvedSubtree([])||(0,J.Map)()).toJS(),specWithCurrentSubtrees:u.specJson().toJS()}));case 14:k=e.sent,delete _e.system,_e=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:p.updateResolvedSubtree([],k.resultMap);case 23:case"end":return e.stop()}}),e,null,[[11,19]])}))),35),ke=function(e){return function(t){var n;q()(n=g()(_e).call(_e,(function(e){return e.join("@@")}))).call(n,e.join("@@"))>-1||(_e.push(e),_e.system=t,Ae())}};function Ne(e,t,n,r,a){return{type:ae,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:a}}}function Ie(e,t,n,r){return{type:ae,payload:{path:e,param:t,value:n,isXml:r}}}var qe=function(e,t){return{type:ge,payload:{path:e,value:t}}},Re=function(){return{type:ge,payload:{path:[],value:(0,J.Map)()}}},Pe=function(e,t){return{type:se,payload:{pathMethod:e,isOAS3:t}}},Te=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Oe(e){return{type:me,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:"consumes_value"}}}function je(e,t){return{type:he,payload:{path:e,value:t,key:"produces_value"}}}var Ve=function(e,t,n){return{payload:{path:e,method:t,res:n},type:le}},De=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ie}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ce}},Ue=function(e){return{payload:e,type:ue}},ze=function(e){return function(t){var n,r,a=t.fn,o=t.specActions,s=t.specSelectors,l=t.getConfigs,c=t.oas3Selectors,u=e.pathName,p=e.method,m=e.operation,f=l(),v=f.requestInterceptor,y=f.responseInterceptor,E=m.toJS();m&&m.get("parameters")&&P()(n=A()(r=m.get("parameters")).call(r,(function(e){return e&&!0===e.get("allowEmptyValue")}))).call(n,(function(t){if(s.parameterInclusionSettingFor([u,p],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=(0,$.cz)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}));if(e.contextUrl=W()(s.url()).toString(),E&&E.operationId?e.operationId=E.operationId:E&&u&&p&&(e.operationId=a.opId(E,u,p)),s.isOAS3()){var S,b=O()(S="".concat(u,":")).call(S,p);e.server=c.selectedServer(b)||c.selectedServer();var C=c.serverVariables({server:e.server,namespace:b}).toJS(),x=c.serverVariables({server:e.server}).toJS();e.serverVariables=j()(C).length?C:x,e.requestContentType=c.requestContentType(u,p),e.responseContentType=c.responseContentType(u,p)||"*/*";var w,_=c.requestBodyValue(u,p),k=c.requestBodyInclusionSetting(u,p);if(_&&_.toJS)e.requestBody=A()(w=g()(_).call(_,(function(e){return J.Map.isMap(e)?e.get("value"):e}))).call(w,(function(e,t){return(h()(e)?0!==e.length:!(0,$.O2)(e))||k.get(t)})).toJS();else e.requestBody=_}var N=D()({},e);N=a.buildRequest(N),o.setRequest(e.pathName,e.method,N);var I=function(){var t=i()(d().mark((function t(n){var r,a;return d().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,v.apply(undefined,[n]);case 2:return r=t.sent,a=D()({},r),o.setMutatedRequest(e.pathName,e.method,a),t.abrupt("return",r);case 6:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=I,e.responseInterceptor=y;var q=U()();return a.execute(e).then((function(t){t.duration=U()()-q,o.setResponse(e.pathName,e.method,t)})).catch((function(t){"Failed to fetch"===t.message&&(t.name="",t.message='**Failed to fetch.** \n**Possible Reasons:** \n - CORS \n - Network Failure \n - URL scheme must be "http" or "https" for CORS request.'),o.setResponse(e.pathName,e.method,{error:!0,err:(0,H.serializeError)(t)})}))}},Be=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=s()(e,ee);return function(e){var o=e.fn.fetch,s=e.specSelectors,l=e.specActions,i=s.specJsonWithResolvedSubtrees().toJS(),c=s.operationScheme(t,n),u=s.contentTypeValues([t,n]).toJS(),p=u.requestContentType,d=u.responseContentType,m=/xml/i.test(p),h=s.parameterValues([t,n],m).toJS();return l.executeRequest(a()(a()({},r),{},{fetch:o,spec:i,pathName:t,method:n,parameters:h,requestContentType:p,scheme:c,responseContentType:d}))}};function Je(e,t){return{type:pe,payload:{path:e,method:t}}}function Fe(e,t){return{type:de,payload:{path:e,method:t}}}function We(e,t,n){return{type:ve,payload:{scheme:e,path:t,method:n}}}},7038:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>l});var r=n(32),a=n(7960),o=n(3881),s=n(7508);function l(){return{statePlugins:{spec:{wrapActions:s,reducers:r.default,actions:a,selectors:o}}}}},32:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>b});var r,a=n(1093),o=n.n(a),s=n(6731),l=n.n(s),i=n(4883),c=n.n(i),u=n(66),p=n.n(u),d=n(3942),m=n.n(d),h=n(4994),f=n.n(h),g=n(5572),v=n(1890),y=n(7504),E=n(3881),S=n(7960);const b=(r={},o()(r,S.UPDATE_SPEC,(function(e,t){return"string"==typeof t.payload?e.set("spec",t.payload):e})),o()(r,S.UPDATE_URL,(function(e,t){return e.set("url",t.payload+"")})),o()(r,S.UPDATE_JSON,(function(e,t){return e.set("json",(0,v.oG)(t.payload))})),o()(r,S.UPDATE_RESOLVED,(function(e,t){return e.setIn(["resolved"],(0,v.oG)(t.payload))})),o()(r,S.UPDATE_RESOLVED_SUBTREE,(function(e,t){var n,r=t.payload,a=r.value,o=r.path;return e.setIn(c()(n=["resolvedSubtrees"]).call(n,l()(o)),(0,v.oG)(a))})),o()(r,S.UPDATE_PARAM,(function(e,t){var n,r,a=t.payload,o=a.path,s=a.paramName,i=a.paramIn,u=a.param,p=a.value,d=a.isXml,m=u?(0,v.V9)(u):c()(n="".concat(i,".")).call(n,s),h=d?"value_xml":"value";return e.setIn(c()(r=["meta","paths"]).call(r,l()(o),["parameters",m,h]),p)})),o()(r,S.UPDATE_EMPTY_PARAM_INCLUSION,(function(e,t){var n,r,a=t.payload,o=a.pathMethod,s=a.paramName,i=a.paramIn,u=a.includeEmptyValue;if(!s||!i)return console.warn("Warning: UPDATE_EMPTY_PARAM_INCLUSION could not generate a paramKey."),e;var p=c()(n="".concat(i,".")).call(n,s);return e.setIn(c()(r=["meta","paths"]).call(r,l()(o),["parameter_inclusions",p]),u)})),o()(r,S.VALIDATE_PARAMS,(function(e,t){var n,r,a=t.payload,o=a.pathMethod,s=a.isOAS3,i=(0,E.specJsonWithResolvedSubtrees)(e).getIn(c()(n=["paths"]).call(n,l()(o))),u=(0,E.parameterValues)(e,o).toJS();return e.updateIn(c()(r=["meta","paths"]).call(r,l()(o),["parameters"]),(0,g.fromJS)({}),(function(t){var n;return p()(n=i.get("parameters",(0,g.List)())).call(n,(function(t,n){var r=(0,v.cz)(n,u),a=(0,E.parameterInclusionSettingFor)(e,o,n.get("name"),n.get("in")),l=(0,v.Ik)(n,r,{bypassRequiredCheck:a,isOAS3:s});return t.setIn([(0,v.V9)(n),"errors"],(0,g.fromJS)(l))}),t)}))})),o()(r,S.CLEAR_VALIDATE_PARAMS,(function(e,t){var n,r=t.payload.pathMethod;return e.updateIn(c()(n=["meta","paths"]).call(n,l()(r),["parameters"]),(0,g.fromJS)([]),(function(e){return m()(e).call(e,(function(e){return e.set("errors",(0,g.fromJS)([]))}))}))})),o()(r,S.SET_RESPONSE,(function(e,t){var n,r=t.payload,a=r.res,o=r.path,s=r.method;(n=a.error?f()({error:!0,name:a.err.name,message:a.err.message,statusCode:a.err.statusCode},a.err.response):a).headers=n.headers||{};var l=e.setIn(["responses",o,s],(0,v.oG)(n));return y.Z.Blob&&a.data instanceof y.Z.Blob&&(l=l.setIn(["responses",o,s,"text"],a.data)),l})),o()(r,S.SET_REQUEST,(function(e,t){var n=t.payload,r=n.req,a=n.path,o=n.method;return e.setIn(["requests",a,o],(0,v.oG)(r))})),o()(r,S.SET_MUTATED_REQUEST,(function(e,t){var n=t.payload,r=n.req,a=n.path,o=n.method;return e.setIn(["mutatedRequests",a,o],(0,v.oG)(r))})),o()(r,S.UPDATE_OPERATION_META_VALUE,(function(e,t){var n,r,a,o,s,i,u=t.payload,p=u.path,d=u.value,m=u.key,h=c()(n=["paths"]).call(n,l()(p)),f=c()(r=["meta","paths"]).call(r,l()(p));return e.getIn(c()(a=["json"]).call(a,l()(h)))||e.getIn(c()(o=["resolved"]).call(o,l()(h)))||e.getIn(c()(s=["resolvedSubtrees"]).call(s,l()(h)))?e.setIn(c()(i=[]).call(i,l()(f),[m]),(0,g.fromJS)(d)):e})),o()(r,S.CLEAR_RESPONSE,(function(e,t){var n=t.payload,r=n.path,a=n.method;return e.deleteIn(["responses",r,a])})),o()(r,S.CLEAR_REQUEST,(function(e,t){var n=t.payload,r=n.path,a=n.method;return e.deleteIn(["requests",r,a])})),o()(r,S.SET_SCHEME,(function(e,t){var n=t.payload,r=n.scheme,a=n.path,o=n.method;return a&&o?e.setIn(["scheme",a,o],r):a||o?void 0:e.setIn(["scheme","_defaultScheme"],r)})),r)},3881:(e,t,n)=>{"use strict";n.r(t),n.d(t,{lastError:()=>O,url:()=>M,specStr:()=>j,specSource:()=>V,specJson:()=>D,specResolved:()=>L,specResolvedSubtree:()=>U,specJsonWithResolvedSubtrees:()=>B,spec:()=>J,isOAS3:()=>F,info:()=>W,externalDocs:()=>H,version:()=>K,semver:()=>Z,paths:()=>G,operations:()=>Y,consumes:()=>X,produces:()=>Q,security:()=>$,securityDefinitions:()=>ee,findDefinition:()=>te,definitions:()=>ne,basePath:()=>re,host:()=>ae,schemes:()=>oe,operationsWithRootInherited:()=>se,tags:()=>le,tagDetails:()=>ie,operationsWithTags:()=>ce,taggedOperations:()=>ue,responses:()=>pe,requests:()=>de,mutatedRequests:()=>me,responseFor:()=>he,requestFor:()=>fe,mutatedRequestFor:()=>ge,allowTryItOutFor:()=>ve,parameterWithMetaByIdentity:()=>ye,parameterInclusionSettingFor:()=>Ee,parameterWithMeta:()=>Se,operationWithMeta:()=>be,getParameter:()=>Ce,hasHost:()=>xe,parameterValues:()=>we,parametersIncludeIn:()=>_e,parametersIncludeType:()=>Ae,contentTypeValues:()=>ke,currentProducesFor:()=>Ne,producesOptionsFor:()=>Ie,consumesOptionsFor:()=>qe,operationScheme:()=>Re,canExecuteScheme:()=>Pe,validateBeforeExecute:()=>Te,getOAS3RequiredRequestBodyContentType:()=>Oe,isMediaTypeSchemaPropertiesEqual:()=>Me});var r=n(8030),a=n.n(r),o=n(6731),s=n.n(o),l=n(4883),i=n.n(l),c=n(600),u=n.n(c),p=n(4235),d=n.n(p),m=n(8493),h=n.n(m),f=n(3942),g=n.n(f),v=n(9998),y=n.n(v),E=n(3580),S=n.n(E),b=n(66),C=n.n(b),x=n(9247),w=n.n(x),_=n(5626),A=n.n(_),k=n(7104),N=n.n(k),I=n(6814),q=n(1890),R=n(5572),P=["get","put","post","delete","options","head","patch","trace"],T=function(e){return e||(0,R.Map)()},O=(0,I.createSelector)(T,(function(e){return e.get("lastError")})),M=(0,I.createSelector)(T,(function(e){return e.get("url")})),j=(0,I.createSelector)(T,(function(e){return e.get("spec")||""})),V=(0,I.createSelector)(T,(function(e){return e.get("specSource")||"not-editor"})),D=(0,I.createSelector)(T,(function(e){return e.get("json",(0,R.Map)())})),L=(0,I.createSelector)(T,(function(e){return e.get("resolved",(0,R.Map)())})),U=function(e,t){var n;return e.getIn(i()(n=["resolvedSubtrees"]).call(n,s()(t)),void 0)},z=function e(t,n){return R.Map.isMap(t)&&R.Map.isMap(n)?n.get("$$ref")?n:(0,R.OrderedMap)().mergeWith(e,t,n):n},B=(0,I.createSelector)(T,(function(e){return(0,R.OrderedMap)().mergeWith(z,e.get("json"),e.get("resolvedSubtrees"))})),J=function(e){return D(e)},F=(0,I.createSelector)(J,(function(){return!1})),W=(0,I.createSelector)(J,(function(e){return je(e&&e.get("info"))})),H=(0,I.createSelector)(J,(function(e){return je(e&&e.get("externalDocs"))})),K=(0,I.createSelector)(W,(function(e){return e&&e.get("version")})),Z=(0,I.createSelector)(K,(function(e){var t;return u()(t=/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(e)).call(t,1)})),G=(0,I.createSelector)(B,(function(e){return e.get("paths")})),Y=(0,I.createSelector)(G,(function(e){if(!e||e.size<1)return(0,R.List)();var t=(0,R.List)();return e&&d()(e)?(d()(e).call(e,(function(e,n){if(!e||!d()(e))return{};d()(e).call(e,(function(e,r){var a;h()(P).call(P,r)<0||(t=t.push((0,R.fromJS)({path:n,method:r,operation:e,id:i()(a="".concat(r,"-")).call(a,n)})))}))})),t):(0,R.List)()})),X=(0,I.createSelector)(J,(function(e){return(0,R.Set)(e.get("consumes"))})),Q=(0,I.createSelector)(J,(function(e){return(0,R.Set)(e.get("produces"))})),$=(0,I.createSelector)(J,(function(e){return e.get("security",(0,R.List)())})),ee=(0,I.createSelector)(J,(function(e){return e.get("securityDefinitions")})),te=function(e,t){var n=e.getIn(["resolvedSubtrees","definitions",t],null),r=e.getIn(["json","definitions",t],null);return n||r||null},ne=(0,I.createSelector)(J,(function(e){var t=e.get("definitions");return R.Map.isMap(t)?t:(0,R.Map)()})),re=(0,I.createSelector)(J,(function(e){return e.get("basePath")})),ae=(0,I.createSelector)(J,(function(e){return e.get("host")})),oe=(0,I.createSelector)(J,(function(e){return e.get("schemes",(0,R.Map)())})),se=(0,I.createSelector)(Y,X,Q,(function(e,t,n){return g()(e).call(e,(function(e){return e.update("operation",(function(e){if(e){if(!R.Map.isMap(e))return;return e.withMutations((function(e){return e.get("consumes")||e.update("consumes",(function(e){return(0,R.Set)(e).merge(t)})),e.get("produces")||e.update("produces",(function(e){return(0,R.Set)(e).merge(n)})),e}))}return(0,R.Map)()}))}))})),le=(0,I.createSelector)(J,(function(e){var t=e.get("tags",(0,R.List)());return R.List.isList(t)?y()(t).call(t,(function(e){return R.Map.isMap(e)})):(0,R.List)()})),ie=function(e,t){var n,r=le(e)||(0,R.List)();return S()(n=y()(r).call(r,R.Map.isMap)).call(n,(function(e){return e.get("name")===t}),(0,R.Map)())},ce=(0,I.createSelector)(se,le,(function(e,t){return C()(e).call(e,(function(e,t){var n=(0,R.Set)(t.getIn(["operation","tags"]));return n.count()<1?e.update("default",(0,R.List)(),(function(e){return e.push(t)})):C()(n).call(n,(function(e,n){return e.update(n,(0,R.List)(),(function(e){return e.push(t)}))}),e)}),C()(t).call(t,(function(e,t){return e.set(t.get("name"),(0,R.List)())}),(0,R.OrderedMap)()))})),ue=function(e){return function(t){var n,r=(0,t.getConfigs)(),a=r.tagsSorter,o=r.operationsSorter;return g()(n=ce(e).sortBy((function(e,t){return t}),(function(e,t){var n="function"==typeof a?a:q.wh.tagsSorter[a];return n?n(e,t):null}))).call(n,(function(t,n){var r="function"==typeof o?o:q.wh.operationsSorter[o],a=r?w()(t).call(t,r):t;return(0,R.Map)({tagDetails:ie(e,n),operations:a})}))}},pe=(0,I.createSelector)(T,(function(e){return e.get("responses",(0,R.Map)())})),de=(0,I.createSelector)(T,(function(e){return e.get("requests",(0,R.Map)())})),me=(0,I.createSelector)(T,(function(e){return e.get("mutatedRequests",(0,R.Map)())})),he=function(e,t,n){return pe(e).getIn([t,n],null)},fe=function(e,t,n){return de(e).getIn([t,n],null)},ge=function(e,t,n){return me(e).getIn([t,n],null)},ve=function(){return!0},ye=function(e,t,n){var r,a,o=B(e).getIn(i()(r=["paths"]).call(r,s()(t),["parameters"]),(0,R.OrderedMap)()),l=e.getIn(i()(a=["meta","paths"]).call(a,s()(t),["parameters"]),(0,R.OrderedMap)()),c=g()(o).call(o,(function(e){var t,r,a,o=l.get(i()(t="".concat(n.get("in"),".")).call(t,n.get("name"))),s=l.get(i()(r=i()(a="".concat(n.get("in"),".")).call(a,n.get("name"),".hash-")).call(r,n.hashCode()));return(0,R.OrderedMap)().merge(e,o,s)}));return S()(c).call(c,(function(e){return e.get("in")===n.get("in")&&e.get("name")===n.get("name")}),(0,R.OrderedMap)())},Ee=function(e,t,n,r){var a,o,l=i()(a="".concat(r,".")).call(a,n);return e.getIn(i()(o=["meta","paths"]).call(o,s()(t),["parameter_inclusions",l]),!1)},Se=function(e,t,n,r){var a,o=B(e).getIn(i()(a=["paths"]).call(a,s()(t),["parameters"]),(0,R.OrderedMap)()),l=S()(o).call(o,(function(e){return e.get("in")===r&&e.get("name")===n}),(0,R.OrderedMap)());return ye(e,t,l)},be=function(e,t,n){var r,a=B(e).getIn(["paths",t,n],(0,R.OrderedMap)()),o=e.getIn(["meta","paths",t,n],(0,R.OrderedMap)()),s=g()(r=a.get("parameters",(0,R.List)())).call(r,(function(r){return ye(e,[t,n],r)}));return(0,R.OrderedMap)().merge(a,o).set("parameters",s)};function Ce(e,t,n,r){var a;t=t||[];var o=e.getIn(i()(a=["meta","paths"]).call(a,s()(t),["parameters"]),(0,R.fromJS)([]));return S()(o).call(o,(function(e){return R.Map.isMap(e)&&e.get("name")===n&&e.get("in")===r}))||(0,R.Map)()}var xe=(0,I.createSelector)(J,(function(e){var t=e.get("host");return"string"==typeof t&&t.length>0&&"/"!==t[0]}));function we(e,t,n){var r;t=t||[];var a=be.apply(void 0,i()(r=[e]).call(r,s()(t))).get("parameters",(0,R.List)());return C()(a).call(a,(function(e,t){var r=n&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set((0,q.V9)(t,{allowHashes:!1}),r)}),(0,R.fromJS)({}))}function _e(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(R.List.isList(e))return A()(e).call(e,(function(e){return R.Map.isMap(e)&&e.get("in")===t}))}function Ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(R.List.isList(e))return A()(e).call(e,(function(e){return R.Map.isMap(e)&&e.get("type")===t}))}function ke(e,t){var n,r;t=t||[];var a=B(e).getIn(i()(n=["paths"]).call(n,s()(t)),(0,R.fromJS)({})),o=e.getIn(i()(r=["meta","paths"]).call(r,s()(t)),(0,R.fromJS)({})),l=Ne(e,t),c=a.get("parameters")||new R.List,u=o.get("consumes_value")?o.get("consumes_value"):Ae(c,"file")?"multipart/form-data":Ae(c,"formData")?"application/x-www-form-urlencoded":void 0;return(0,R.fromJS)({requestContentType:u,responseContentType:l})}function Ne(e,t){var n,r;t=t||[];var a=B(e).getIn(i()(n=["paths"]).call(n,s()(t)),null);if(null!==a){var o=e.getIn(i()(r=["meta","paths"]).call(r,s()(t),["produces_value"]),null),l=a.getIn(["produces",0],null);return o||l||"application/json"}}function Ie(e,t){var n;t=t||[];var r=B(e),o=r.getIn(i()(n=["paths"]).call(n,s()(t)),null);if(null!==o){var l=t,c=a()(l,1)[0],u=o.get("produces",null),p=r.getIn(["paths",c,"produces"],null),d=r.getIn(["produces"],null);return u||p||d}}function qe(e,t){var n;t=t||[];var r=B(e),o=r.getIn(i()(n=["paths"]).call(n,s()(t)),null);if(null!==o){var l=t,c=a()(l,1)[0],u=o.get("consumes",null),p=r.getIn(["paths",c,"consumes"],null),d=r.getIn(["consumes"],null);return u||p||d}}var Re=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),a=N()(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||a||""},Pe=function(e,t,n){var r;return h()(r=["http","https"]).call(r,Re(e,t,n))>-1},Te=function(e,t){var n;t=t||[];var r=e.getIn(i()(n=["meta","paths"]).call(n,s()(t),["parameters"]),(0,R.fromJS)([])),a=!0;return d()(r).call(r,(function(e){var t=e.get("errors");t&&t.count()&&(a=!1)})),a},Oe=function(e,t){var n,r,a={requestBody:!1,requestContentType:{}},o=e.getIn(i()(n=["resolvedSubtrees","paths"]).call(n,s()(t),["requestBody"]),(0,R.fromJS)([]));return o.size<1||(o.getIn(["required"])&&(a.requestBody=o.getIn(["required"])),d()(r=o.getIn(["content"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn(["schema","required"])){var n=e[1].getIn(["schema","required"]).toJS();a.requestContentType[t]=n}}))),a},Me=function(e,t,n,r){var a;if((n||r)&&n===r)return!0;var o=e.getIn(i()(a=["resolvedSubtrees","paths"]).call(a,s()(t),["requestBody","content"]),(0,R.fromJS)([]));if(o.size<2||!n||!r)return!1;var l=o.getIn([n,"schema","properties"],(0,R.fromJS)([])),c=o.getIn([r,"schema","properties"],(0,R.fromJS)([]));return!!l.equals(c)};function je(e){return R.Map.isMap(e)?e:new R.Map}},7508:(e,t,n)=>{"use strict";n.r(t),n.d(t,{updateSpec:()=>c,updateJsonSpec:()=>u,executeRequest:()=>p,validateParams:()=>d});var r=n(7252),a=n.n(r),o=n(4235),s=n.n(o),l=n(1712),i=n.n(l),c=function(e,t){var n=t.specActions;return function(){e.apply(void 0,arguments),n.parseToJson.apply(n,arguments)}},u=function(e,t){var n=t.specActions;return function(){for(var t=arguments.length,r=new Array(t),o=0;o{"use strict";n.r(t),n.d(t,{loaded:()=>r});var r=function(e,t){return function(){e.apply(void 0,arguments);var n=t.getConfigs().withCredentials;void 0!==n&&(t.fn.fetch.withCredentials="string"==typeof n?"true"===n:!!n)}}},8901:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>h});var r=n(4883),a=n.n(r);const o=require("swagger-client/es/resolver");var s=n.n(o);const l=require("swagger-client/es/execute"),i=require("swagger-client/es/http");var c=n.n(i);const u=require("swagger-client/es/subtree-resolver");var p=n.n(u),d=n(6765),m=n(4852);function h(e){var t=e.configs,n=e.getConfigs;return{fn:{fetch:(0,i.makeHttp)(c(),t.preFetch,t.postFetch),buildRequest:l.buildRequest,execute:l.execute,resolve:s(),resolveSubtree:function(e,t,r){var o;if(void 0===r){var s=n();r={modelPropertyMacro:s.modelPropertyMacro,parameterMacro:s.parameterMacro,requestInterceptor:s.requestInterceptor,responseInterceptor:s.responseInterceptor}}for(var l=arguments.length,i=new Array(l>3?l-3:0),c=3;c{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(1890);function a(){return{fn:{shallowEqualKeys:r.be}}}},8347:(e,t,n)=>{"use strict";n.r(t),n.d(t,{getDisplayName:()=>r});var r=function(e){return e.displayName||e.name||"Component"}},3420:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>c});var r=n(8344),a=n.n(r),o=n(1890),s=n(290),l=n(8347),i=n(7156);const c=function(e){var t,n=e.getComponents,r=e.getStore,c=e.getSystem,u=(t=(0,s.getComponent)(c,r,n),(0,o.HP)(t,(function(){for(var e=arguments.length,t=new Array(e),n=0;n{"use strict";n.r(t),n.d(t,{getComponent:()=>T,render:()=>P,withMappedContainer:()=>R});var r=n(6768),a=n.n(r),o=n(67),s=n.n(o),l=n(4250),i=n.n(l),c=n(6349),u=n.n(c),p=n(4606),d=n.n(p),m=n(4291),h=n.n(m),f=n(1885),g=n.n(f),v=n(7252),y=n.n(v),E=n(6689),S=n.n(E);const b=require("react-dom");var C=n.n(b),x=n(6695);const w=require("react-redux"),_=require("lodash/omit");var A=n.n(_);const k=require("lodash/identity");var N=n.n(k),I=function(e,t,n){return(0,x.compose)(n?function(e,t){return function(n){var r=e().fn,a=function(e){h()(a,e);var r=g()(a);function a(){return u()(this,a),r.apply(this,arguments)}return d()(a,[{key:"render",value:function(){return S().createElement(w.Provider,{store:t},S().createElement(n,i()({},this.props,this.context)))}}]),a}(E.Component);return a.displayName="WithRoot(".concat(r.getDisplayName(n),")"),a}}(e,n):N(),(0,w.connect)((function(n,r){var a,o=s()(s()({},r),e()),l=(null===(a=t.prototype)||void 0===a?void 0:a.mapStateToProps)||function(e){return{state:e}};return l(n,o)})),function(e){return function(t){var n=e().fn,r=function(n){h()(a,n);var r=g()(a);function a(){return u()(this,a),r.apply(this,arguments)}return d()(a,[{key:"render",value:function(){return S().createElement(t,i()({},e(),this.props,this.context))}}]),a}(E.Component);return r.displayName="WithSystem(".concat(n.getDisplayName(t),")"),r}}(e))(t)},q=function(e,t,n,r){for(var a in t){var o=t[a];"function"==typeof o&&o(n[a],r[a],e())}},R=function(e,t,n){return function(t,r){var a=e().fn,o=n(t,"root"),s=function(t){h()(a,t);var n=g()(a);function a(t,o){var s;return u()(this,a),s=n.call(this,t,o),q(e,r,t,{}),s}return d()(a,[{key:"UNSAFE_componentWillReceiveProps",value:function(t){q(e,r,t,this.props)}},{key:"render",value:function(){var e=A()(this.props,r?y()(r):[]);return S().createElement(o,e)}}]),a}(E.Component);return s.displayName="WithMappedContainer(".concat(a.getDisplayName(o),")"),s}},P=function(e,t,n,r){return function(a){var o=n(e,t,r)("App","root");C().render(S().createElement(o,null),a)}},T=function(e,t,n){return function(r,o){var s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if("string"!=typeof r)throw new TypeError("Need a string, to fetch a component. Was given a "+a()(r));var l=n(r);return l?o?"root"===o?I(e,l,t()):I(e,l):l:(s.failSilently||e().log.warn("Could not find component:",r),null)}}},6068:(e,t,n)=>{"use strict";n.d(t,{d3:()=>i(),C2:()=>V});var r=n(7252),a=n.n(r),o=n(2605),s=n.n(o);const l=require("react-syntax-highlighter/dist/esm/light");var i=n.n(l);const c=require("react-syntax-highlighter/dist/esm/languages/hljs/javascript");var u=n.n(c);const p=require("react-syntax-highlighter/dist/esm/languages/hljs/json");var d=n.n(p);const m=require("react-syntax-highlighter/dist/esm/languages/hljs/xml");var h=n.n(m);const f=require("react-syntax-highlighter/dist/esm/languages/hljs/bash");var g=n.n(f);const v=require("react-syntax-highlighter/dist/esm/languages/hljs/yaml");var y=n.n(v);const E=require("react-syntax-highlighter/dist/esm/languages/hljs/http");var S=n.n(E);const b=require("react-syntax-highlighter/dist/esm/languages/hljs/powershell");var C=n.n(b);const x=require("react-syntax-highlighter/dist/esm/styles/hljs/agate");var w=n.n(x);const _=require("react-syntax-highlighter/dist/esm/styles/hljs/arta");var A=n.n(_);const k=require("react-syntax-highlighter/dist/esm/styles/hljs/monokai");var N=n.n(k);const I=require("react-syntax-highlighter/dist/esm/styles/hljs/nord");var q=n.n(I);const R=require("react-syntax-highlighter/dist/esm/styles/hljs/obsidian");var P=n.n(R);const T=require("react-syntax-highlighter/dist/esm/styles/hljs/tomorrow-night");var O=n.n(T);i().registerLanguage("json",d()),i().registerLanguage("js",u()),i().registerLanguage("xml",h()),i().registerLanguage("yaml",y()),i().registerLanguage("http",S()),i().registerLanguage("bash",g()),i().registerLanguage("powershell",C()),i().registerLanguage("javascript",u());var M={agate:w(),arta:A(),monokai:N(),nord:q(),obsidian:P(),"tomorrow-night":O()},j=a()(M),V=function(e){return s()(j).call(j,e)?M[e]:(console.warn("Request style '".concat(e,"' is not available, returning default instead")),w())}},1890:(e,t,n)=>{"use strict";n.d(t,{r3:()=>Fe,GZ:()=>He,Xb:()=>lt,oJ:()=>Xe,XV:()=>tt,iQ:()=>Re,J6:()=>Qe,DR:()=>Te,oG:()=>be,Uj:()=>st,QG:()=>Ye,po:()=>et,nX:()=>$e,gp:()=>Pe,xi:()=>Be,kJ:()=>Ae,O2:()=>ct,LQ:()=>xe,Wl:()=>_e,Kn:()=>we,HP:()=>ke,AF:()=>Ce,D$:()=>rt,Ay:()=>Ne,Q2:()=>Ie,mz:()=>Se,V9:()=>at,cz:()=>ot,UG:()=>Je,Zl:()=>Oe,hW:()=>Ge,Nm:()=>Ze,be:()=>Ke,wh:()=>We,Pz:()=>nt,_5:()=>qe,Ik:()=>je});var r=n(6731),a=n.n(r),o=(n(8030),n(6768)),s=n.n(o),l=n(1771),i=n.n(l),c=n(7104),u=n.n(c),p=n(3942),d=n.n(p),m=n(7862),h=n.n(m),f=n(4883),g=n.n(f),v=n(4235),y=n.n(v),E=n(9998),S=n.n(E),b=n(7252),C=n.n(b),x=(n(593),n(66)),w=n.n(x),_=n(4994),A=n.n(_),k=n(9247),N=n.n(k),I=n(600),q=n.n(I),R=n(5626),P=n.n(R),T=(n(2605),n(8344)),O=n.n(T),M=n(8493),j=n.n(M),V=n(3580),D=n.n(V),L=n(3262),U=n.n(L),z=n(7390),B=n.n(z),J=n(5572),F=n.n(J);const W=require("@braintree/sanitize-url"),H=require("lodash/camelCase");var K=n.n(H);const Z=require("lodash/upperFirst");var G=n.n(Z),Y=n(541),X=n.n(Y);const Q=require("lodash/find");var $=n.n(Q);const ee=require("lodash/some");var te=n.n(ee);const ne=require("lodash/eq");var re=n.n(ne),ae=n(5716),oe=n.n(ae),se=n(4128),le=n(7504);const ie=require("css.escape");var ce=n.n(ie),ue=n(9069),pe=n(185),de=n.n(pe);const me=require("sha.js");var he=n.n(me),fe=n(9793),ge=n.n(fe),ve=n(871).Buffer,ye="default",Ee=function(e){return F().Iterable.isIterable(e)};function Se(e){return we(e)?Ee(e)?e.toJS():e:{}}function be(e){var t,n;if(Ee(e))return e;if(e instanceof le.Z.File)return e;if(!we(e))return e;if(u()(e))return d()(n=F().Seq(e)).call(n,be).toList();if(oe()(h()(e))){var r,a=function(e){if(!oe()(h()(e)))return e;var t,n={},r="_**[]",a={},o=i()(h()(e).call(e));try{for(o.s();!(t=o.n()).done;){var s=t.value;if(n[s[0]]||a[s[0]]&&a[s[0]].containsMultiple){var l,c,u,p;if(!a[s[0]])a[s[0]]={containsMultiple:!0,length:1},n[g()(u=g()(p="".concat(s[0])).call(p,r)).call(u,a[s[0]].length)]=n[s[0]],delete n[s[0]];a[s[0]].length+=1,n[g()(l=g()(c="".concat(s[0])).call(c,r)).call(l,a[s[0]].length)]=s[1]}else n[s[0]]=s[1]}}catch(e){o.e(e)}finally{o.f()}return n}(e);return d()(r=F().OrderedMap(a)).call(r,be)}return d()(t=F().OrderedMap(e)).call(t,be)}function Ce(e){return u()(e)?e:[e]}function xe(e){return"function"==typeof e}function we(e){return!!e&&"object"===s()(e)}function _e(e){return"function"==typeof e}function Ae(e){return u()(e)}var ke=X();function Ne(e,t){var n;return w()(n=C()(e)).call(n,(function(n,r){return n[r]=t(e[r],r),n}),{})}function Ie(e,t){var n;return w()(n=C()(e)).call(n,(function(n,r){var a=t(e[r],r);return a&&"object"===s()(a)&&A()(n,a),n}),{})}function qe(e){return function(t){t.dispatch,t.getState;return function(t){return function(n){return"function"==typeof n?n(e()):t(n)}}}}function Re(e){var t,n=e.keySeq();return n.contains(ye)?ye:N()(t=S()(n).call(n,(function(e){return"2"===(e+"")[0]}))).call(t).first()}function Pe(e,t){if(!F().Iterable.isIterable(e))return F().List();var n=e.getIn(u()(t)?t:[t]);return F().List.isList(n)?n:F().List()}function Te(e){var t,n=[/filename\*=[^']+'\w*'"([^"]+)";?/i,/filename\*=[^']+'\w*'([^;]+);?/i,/filename="([^;]*);?"/i,/filename=([^;]*);?/i];if(P()(n).call(n,(function(n){return null!==(t=n.exec(e))})),null!==t&&t.length>1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Oe(e){return t=e.replace(/\.[^./]*$/,""),G()(K()(t));var t}function Me(e,t,n,r,o){if(!t)return[];var l=[],i=t.get("nullable"),c=t.get("required"),p=t.get("maximum"),m=t.get("minimum"),h=t.get("type"),f=t.get("format"),v=t.get("maxLength"),E=t.get("minLength"),b=t.get("uniqueItems"),C=t.get("maxItems"),x=t.get("minItems"),w=t.get("pattern"),_=n||!0===c,A=null!=e;if(i&&null===e||!h||!(_||A&&"array"===h||!(!_&&!A)))return[];var k="string"===h&&e,N="array"===h&&u()(e)&&e.length,I="array"===h&&F().List.isList(e)&&e.count(),q=[k,N,I,"array"===h&&"string"==typeof e&&e,"file"===h&&e instanceof le.Z.File,"boolean"===h&&(e||!1===e),"number"===h&&(e||0===e),"integer"===h&&(e||0===e),"object"===h&&"object"===s()(e)&&null!==e,"object"===h&&"string"==typeof e&&e],R=P()(q).call(q,(function(e){return!!e}));if(_&&!R&&!r)return l.push("Required field is not provided"),l;if("object"===h&&(null===o||"application/json"===o)){var T,O=e;if("string"==typeof e)try{O=JSON.parse(e)}catch(e){return l.push("Parameter string value must be valid JSON"),l}if(t&&t.has("required")&&_e(c.isList)&&c.isList()&&y()(c).call(c,(function(e){void 0===O[e]&&l.push({propKey:e,error:"Required property not found"})})),t&&t.has("properties"))y()(T=t.get("properties")).call(T,(function(e,t){var n=Me(O[t],e,!1,r,o);l.push.apply(l,a()(d()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(w){var M=function(e,t){if(!new RegExp(t).test(e))return"Value must follow pattern "+t}(e,w);M&&l.push(M)}if(x&&"array"===h){var j=function(e,t){var n;if(!e&&t>=1||e&&e.lengtht)return g()(n="Array must not contain more then ".concat(t," item")).call(n,1===t?"":"s")}(e,C);V&&l.push({needRemove:!0,error:V})}if(b&&"array"===h){var D=function(e,t){if(e&&("true"===t||!0===t)){var n=(0,J.fromJS)(e),r=n.toSet();if(e.length>r.size){var a=(0,J.Set)();if(y()(n).call(n,(function(e,t){S()(n).call(n,(function(t){return _e(t.equals)?t.equals(e):t===e})).size>1&&(a=a.add(t))})),0!==a.size)return d()(a).call(a,(function(e){return{index:e,error:"No duplicates allowed."}})).toArray()}}}(e,b);D&&l.push.apply(l,a()(D))}if(v||0===v){var L=function(e,t){var n;if(e.length>t)return g()(n="Value must be no longer than ".concat(t," character")).call(n,1!==t?"s":"")}(e,v);L&&l.push(L)}if(E){var U=function(e,t){var n;if(e.lengtht)return"Value must be less than ".concat(t)}(e,p);z&&l.push(z)}if(m||0===m){var B=function(e,t){if(e2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,a=void 0!==r&&r,o=n.bypassRequiredCheck,s=void 0!==o&&o,l=e.get("required"),i=(0,ue.Z)(e,{isOAS3:a}),c=i.schema,u=i.parameterContentMediaType;return Me(t,c,l,s,u)},Ve=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return(0,se.memoizedCreateXMLExample)(e,t,n)},De=[{when:/json/,shouldStringifyTypes:["string"]}],Le=["object"],Ue=function(e,t,n,r){var o=(0,se.memoizedSampleFromSchema)(e,t,r),l=s()(o),i=w()(De).call(De,(function(e,t){var r;return t.when.test(n)?g()(r=[]).call(r,a()(e),a()(t.shouldStringifyTypes)):e}),Le);return te()(i,(function(e){return e===l}))?O()(o,null,2):o},ze=function(e,t,n,r){var a,o=Ue(e,t,n,r);try{"\n"===(a=ge().dump(ge().load(o),{lineWidth:-1},{schema:fe.JSON_SCHEMA}))[a.length-1]&&(a=q()(a).call(a,0,a.length-1))}catch(e){return console.error(e),"error: could not generate yaml example"}return a.replace(/\t/g," ")},Be=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&_e(e.toJS)&&(e=e.toJS()),r&&_e(r.toJS)&&(r=r.toJS()),/xml/.test(t)?Ve(e,n,r):/(yaml|yml)/.test(t)?ze(e,n,t,r):Ue(e,n,t,r)},Je=function(){var e={},t=le.Z.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},Fe=function(e){return(e instanceof ve?e:ve.from(e.toString(),"utf-8")).toString("base64")},We={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},He=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},Ke=function(e,t,n){return!!$()(n,(function(n){return re()(e[n],t[n])}))};function Ze(e){return"string"!=typeof e||""===e?"":(0,W.sanitizeUrl)(e)}function Ge(e){return!(!e||j()(e).call(e,"localhost")>=0||j()(e).call(e,"127.0.0.1")>=0||"none"===e)}function Ye(e){if(!F().OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=D()(e).call(e,(function(e,t){return U()(t).call(t,"2")&&C()(e.get("content")||{}).length>0})),n=e.get("default")||F().OrderedMap(),r=(n.get("content")||F().OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Xe=function(e){return"string"==typeof e||e instanceof String?B()(e).call(e).replace(/\s/g,"%20"):""},Qe=function(e){return ce()(Xe(e).replace(/%20/g,"_"))},$e=function(e){return S()(e).call(e,(function(e,t){return/^x-/.test(t)}))},et=function(e){return S()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function tt(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==s()(e)||u()(e)||null===e||!t)return e;var a=A()({},e);return y()(n=C()(a)).call(n,(function(e){e===t&&r(a[e],e)?delete a[e]:a[e]=tt(a[e],t,r)})),a}function nt(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"===s()(e)&&null!==e)try{return O()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function rt(e){return"number"==typeof e?e.toString():e}function at(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,a=t.allowHashes,o=void 0===a||a;if(!F().Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var s,l,i,c=e.get("name"),u=e.get("in"),p=[];e&&e.hashCode&&u&&c&&o&&p.push(g()(s=g()(l="".concat(u,".")).call(l,c,".hash-")).call(s,e.hashCode()));u&&c&&p.push(g()(i="".concat(u,".")).call(i,c));return p.push(c),r?p:p[0]||""}function ot(e,t){var n,r=at(e,{returnAll:!0});return S()(n=d()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function st(){return it(de()(32).toString("base64"))}function lt(e){return it(he()("sha256").update(e).digest("base64"))}function it(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}var ct=function(e){return!e||!(!Ee(e)||!e.isEmpty())}},2518:(e,t,n)=>{"use strict";function r(e){return function(e){try{return!!JSON.parse(e)}catch(e){return null}}(e)?"json":null}n.d(t,{O:()=>r})},7504:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=function(){var e={location:{},history:{},open:function(){},close:function(){},File:function(){}};if("undefined"==typeof window)return e;try{e=window;for(var t=0,n=["File","Blob","FormData"];t{"use strict";n.d(t,{Z:()=>u});var r=n(9998),a=n.n(r),o=n(2605),s=n.n(o),l=n(5572),i=n.n(l),c=i().Set.of("type","format","items","default","maximum","exclusiveMaximum","minimum","exclusiveMinimum","maxLength","minLength","pattern","maxItems","minItems","uniqueItems","enum","multipleOf");function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.isOAS3;if(!i().Map.isMap(e))return{schema:i().Map(),parameterContentMediaType:null};if(!n)return"body"===e.get("in")?{schema:e.get("schema",i().Map()),parameterContentMediaType:null}:{schema:a()(e).call(e,(function(e,t){return s()(c).call(c,t)})),parameterContentMediaType:null};if(e.get("content")){var r=e.get("content",i().Map({})).keySeq(),o=r.first();return{schema:e.getIn(["content",o,"schema"],i().Map()),parameterContentMediaType:o}}return{schema:e.get("schema",i().Map()),parameterContentMediaType:null}}},7156:(e,t,n)=>{"use strict";n.d(t,{Z:()=>j});var r=n(6349),a=n.n(r),o=n(4606),s=n.n(o);const l=require("@babel/runtime-corejs3/helpers/get");var i=n.n(l);const c=require("@babel/runtime-corejs3/helpers/getPrototypeOf");var u=n.n(c),p=n(4291),d=n.n(p),m=n(1885),h=n.n(m);const f=require("@babel/runtime-corejs3/helpers/wrapNativeSuper");var g=n.n(f),v=n(7104),y=n.n(v),E=n(7834),S=n.n(E),b=n(1733),C=n.n(b),x=n(874),w=n.n(x),_=n(3580),A=n.n(_);const k=require("@babel/runtime-corejs3/core-js-stable/instance/find-index");var N=n.n(k),I=n(2611),q=n.n(I),R=n(541),P=n.n(R),T=function(e){return function(t){return y()(e)&&y()(t)&&e.length===t.length&&S()(e).call(e,(function(e,n){return e===t[n]}))}},O=function(){for(var e=arguments.length,t=new Array(e),n=0;n1&&void 0!==arguments[1]?arguments[1]:O,n=P().Cache;P().Cache=M;var r=P()(e,t);return P().Cache=n,r}},5102:(e,t,n)=>{var r={"./all.js":5308,"./auth/actions.js":5812,"./auth/index.js":3705,"./auth/reducers.js":3962,"./auth/selectors.js":35,"./auth/spec-wrap-actions.js":8302,"./configs/actions.js":714,"./configs/helpers.js":2256,"./configs/index.js":1661,"./configs/reducers.js":7743,"./configs/selectors.js":9018,"./configs/spec-actions.js":2698,"./deep-linking/helpers.js":1970,"./deep-linking/index.js":4980,"./deep-linking/layout.js":2179,"./deep-linking/operation-tag-wrapper.jsx":4584,"./deep-linking/operation-wrapper.jsx":877,"./download-url.js":8011,"./err/actions.js":4966,"./err/error-transformers/hook.js":2860,"./err/error-transformers/transformers/not-of-type.js":2392,"./err/error-transformers/transformers/parameter-oneof.js":1835,"./err/index.js":7793,"./err/reducers.js":3527,"./err/selectors.js":7667,"./filter/index.js":9978,"./filter/opsFilter.js":4309,"./layout/actions.js":5474,"./layout/index.js":6821,"./layout/reducers.js":5672,"./layout/selectors.js":4400,"./layout/spec-extensions/wrap-selector.js":8989,"./logs/index.js":9150,"./oas3/actions.js":7002,"./oas3/auth-extensions/wrap-selectors.js":3723,"./oas3/components/callbacks.jsx":3427,"./oas3/components/http-auth.jsx":6775,"./oas3/components/index.js":6467,"./oas3/components/operation-link.jsx":5757,"./oas3/components/operation-servers.jsx":6796,"./oas3/components/request-body-editor.jsx":5327,"./oas3/components/request-body.jsx":2458,"./oas3/components/servers-container.jsx":9928,"./oas3/components/servers.jsx":6617,"./oas3/helpers.jsx":7779,"./oas3/index.js":7451,"./oas3/reducers.js":5013,"./oas3/selectors.js":5065,"./oas3/spec-extensions/selectors.js":1741,"./oas3/spec-extensions/wrap-selectors.js":2044,"./oas3/wrap-components/auth-item.jsx":356,"./oas3/wrap-components/index.js":7761,"./oas3/wrap-components/json-schema-string.jsx":287,"./oas3/wrap-components/markdown.jsx":2460,"./oas3/wrap-components/model.jsx":3499,"./oas3/wrap-components/online-validator-badge.js":58,"./oas3/wrap-components/version-stamp.jsx":9487,"./on-complete/index.js":8560,"./request-snippets/fn.js":8223,"./request-snippets/index.js":6575,"./request-snippets/request-snippets.jsx":4206,"./request-snippets/selectors.js":4669,"./safe-render/components/error-boundary.jsx":6195,"./safe-render/components/fallback.jsx":9403,"./safe-render/fn.jsx":6189,"./safe-render/index.js":9595,"./samples/fn.js":4128,"./samples/index.js":8883,"./spec/actions.js":7960,"./spec/index.js":7038,"./spec/reducers.js":32,"./spec/selectors.js":3881,"./spec/wrap-actions.js":7508,"./swagger-js/configs-wrap-actions.js":4852,"./swagger-js/index.js":8901,"./util/index.js":8525,"./view/fn.js":8347,"./view/index.js":3420,"./view/root-injects.jsx":290,"core/plugins/all.js":5308,"core/plugins/auth/actions.js":5812,"core/plugins/auth/index.js":3705,"core/plugins/auth/reducers.js":3962,"core/plugins/auth/selectors.js":35,"core/plugins/auth/spec-wrap-actions.js":8302,"core/plugins/configs/actions.js":714,"core/plugins/configs/helpers.js":2256,"core/plugins/configs/index.js":1661,"core/plugins/configs/reducers.js":7743,"core/plugins/configs/selectors.js":9018,"core/plugins/configs/spec-actions.js":2698,"core/plugins/deep-linking/helpers.js":1970,"core/plugins/deep-linking/index.js":4980,"core/plugins/deep-linking/layout.js":2179,"core/plugins/deep-linking/operation-tag-wrapper.jsx":4584,"core/plugins/deep-linking/operation-wrapper.jsx":877,"core/plugins/download-url.js":8011,"core/plugins/err/actions.js":4966,"core/plugins/err/error-transformers/hook.js":2860,"core/plugins/err/error-transformers/transformers/not-of-type.js":2392,"core/plugins/err/error-transformers/transformers/parameter-oneof.js":1835,"core/plugins/err/index.js":7793,"core/plugins/err/reducers.js":3527,"core/plugins/err/selectors.js":7667,"core/plugins/filter/index.js":9978,"core/plugins/filter/opsFilter.js":4309,"core/plugins/layout/actions.js":5474,"core/plugins/layout/index.js":6821,"core/plugins/layout/reducers.js":5672,"core/plugins/layout/selectors.js":4400,"core/plugins/layout/spec-extensions/wrap-selector.js":8989,"core/plugins/logs/index.js":9150,"core/plugins/oas3/actions.js":7002,"core/plugins/oas3/auth-extensions/wrap-selectors.js":3723,"core/plugins/oas3/components/callbacks.jsx":3427,"core/plugins/oas3/components/http-auth.jsx":6775,"core/plugins/oas3/components/index.js":6467,"core/plugins/oas3/components/operation-link.jsx":5757,"core/plugins/oas3/components/operation-servers.jsx":6796,"core/plugins/oas3/components/request-body-editor.jsx":5327,"core/plugins/oas3/components/request-body.jsx":2458,"core/plugins/oas3/components/servers-container.jsx":9928,"core/plugins/oas3/components/servers.jsx":6617,"core/plugins/oas3/helpers.jsx":7779,"core/plugins/oas3/index.js":7451,"core/plugins/oas3/reducers.js":5013,"core/plugins/oas3/selectors.js":5065,"core/plugins/oas3/spec-extensions/selectors.js":1741,"core/plugins/oas3/spec-extensions/wrap-selectors.js":2044,"core/plugins/oas3/wrap-components/auth-item.jsx":356,"core/plugins/oas3/wrap-components/index.js":7761,"core/plugins/oas3/wrap-components/json-schema-string.jsx":287,"core/plugins/oas3/wrap-components/markdown.jsx":2460,"core/plugins/oas3/wrap-components/model.jsx":3499,"core/plugins/oas3/wrap-components/online-validator-badge.js":58,"core/plugins/oas3/wrap-components/version-stamp.jsx":9487,"core/plugins/on-complete/index.js":8560,"core/plugins/request-snippets/fn.js":8223,"core/plugins/request-snippets/index.js":6575,"core/plugins/request-snippets/request-snippets.jsx":4206,"core/plugins/request-snippets/selectors.js":4669,"core/plugins/safe-render/components/error-boundary.jsx":6195,"core/plugins/safe-render/components/fallback.jsx":9403,"core/plugins/safe-render/fn.jsx":6189,"core/plugins/safe-render/index.js":9595,"core/plugins/samples/fn.js":4128,"core/plugins/samples/index.js":8883,"core/plugins/spec/actions.js":7960,"core/plugins/spec/index.js":7038,"core/plugins/spec/reducers.js":32,"core/plugins/spec/selectors.js":3881,"core/plugins/spec/wrap-actions.js":7508,"core/plugins/swagger-js/configs-wrap-actions.js":4852,"core/plugins/swagger-js/index.js":8901,"core/plugins/util/index.js":8525,"core/plugins/view/fn.js":8347,"core/plugins/view/index.js":3420,"core/plugins/view/root-injects.jsx":290};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=5102},2517:e=>{"use strict";e.exports="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwcHgiICBoZWlnaHQ9IjIwMHB4IiAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGNsYXNzPSJsZHMtcm9sbGluZyIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IG5vbmU7IGJhY2tncm91bmQtcG9zaXRpb246IGluaXRpYWwgaW5pdGlhbDsgYmFja2dyb3VuZC1yZXBlYXQ6IGluaXRpYWwgaW5pdGlhbDsiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIGZpbGw9Im5vbmUiIG5nLWF0dHItc3Ryb2tlPSJ7e2NvbmZpZy5jb2xvcn19IiBuZy1hdHRyLXN0cm9rZS13aWR0aD0ie3tjb25maWcud2lkdGh9fSIgbmctYXR0ci1yPSJ7e2NvbmZpZy5yYWRpdXN9fSIgbmctYXR0ci1zdHJva2UtZGFzaGFycmF5PSJ7e2NvbmZpZy5kYXNoYXJyYXl9fSIgc3Ryb2tlPSIjNTU1NTU1IiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgY2FsY01vZGU9ImxpbmVhciIgdmFsdWVzPSIwIDUwIDUwOzM2MCA1MCA1MCIga2V5VGltZXM9IjA7MSIgZHVyPSIxcyIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvY2lyY2xlPjwvc3ZnPgo="},5163:e=>{"use strict";e.exports='---\nurl: "https://petstore.swagger.io/v2/swagger.json"\ndom_id: "#swagger-ui"\nvalidatorUrl: "https://validator.swagger.io/validator"\n'},1733:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/array/from")},7104:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/array/is-array")},593:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/bind")},4883:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/concat")},7862:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/entries")},7834:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/every")},9998:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/filter")},3580:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/find")},4235:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/for-each")},2605:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/includes")},8493:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/index-of")},874:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/keys")},3942:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/map")},66:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/reduce")},600:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/slice")},5626:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/some")},9247:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/sort")},3262:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/starts-with")},7390:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/instance/trim")},8344:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/json/stringify")},2611:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/map")},4994:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/object/assign")},7252:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/object/keys")},9968:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/object/values")},9300:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/set-timeout")},9478:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/core-js-stable/url")},4555:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/assertThisInitialized")},6349:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/classCallCheck")},4606:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/createClass")},1771:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/createForOfIteratorHelper")},1885:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/createSuper")},1093:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/defineProperty")},4250:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/extends")},4291:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/inherits")},67:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/objectSpread2")},5579:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/objectWithoutProperties")},8030:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/slicedToArray")},6731:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/toConsumableArray")},6768:e=>{"use strict";e.exports=require("@babel/runtime-corejs3/helpers/typeof")},871:e=>{"use strict";e.exports=require("buffer")},9003:e=>{"use strict";e.exports=require("classnames")},5572:e=>{"use strict";e.exports=require("immutable")},9793:e=>{"use strict";e.exports=require("js-yaml")},1712:e=>{"use strict";e.exports=require("lodash/get")},5716:e=>{"use strict";e.exports=require("lodash/isFunction")},541:e=>{"use strict";e.exports=require("lodash/memoize")},580:e=>{"use strict";e.exports=require("prop-types")},185:e=>{"use strict";e.exports=require("randombytes")},6689:e=>{"use strict";e.exports=require("react")},2807:e=>{"use strict";e.exports=require("react-copy-to-clipboard")},8082:e=>{"use strict";e.exports=require("react-immutable-proptypes")},6695:e=>{"use strict";e.exports=require("redux")},963:e=>{"use strict";e.exports=require("remarkable")},6814:e=>{"use strict";e.exports=require("reselect")},41:e=>{"use strict";e.exports=require("serialize-error")},6765:e=>{"use strict";e.exports=require("swagger-client/es/helpers")},3883:e=>{"use strict";e.exports=require("url-parse")}},t={};function n(r){var a=t[r];if(void 0!==a)return a.exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return(()=>{"use strict";n.d(r,{default:()=>Wr});var e={};n.r(e),n.d(e,{Button:()=>Rn,Col:()=>In,Collapse:()=>Vn,Container:()=>kn,Input:()=>Tn,Link:()=>Mn,Row:()=>qn,Select:()=>On,TextArea:()=>Pn});var t={};n.r(t),n.d(t,{JsonSchemaArrayItemFile:()=>Rr,JsonSchemaArrayItemText:()=>qr,JsonSchemaForm:()=>kr,JsonSchema_array:()=>Ir,JsonSchema_boolean:()=>Pr,JsonSchema_object:()=>Or,JsonSchema_string:()=>Nr});var a=n(6768),o=n.n(a),s=n(4883),l=n.n(s);const i=require("@babel/runtime-corejs3/core-js-stable/instance/last-index-of");var c=n.n(i),u=n(9998),p=n.n(u),d=n(7252),m=n.n(d),h=n(8344),f=n.n(h);const g=require("deep-extend");var v=n.n(g),y=n(1093),E=n.n(y),S=n(6349),b=n.n(S),C=n(4606),x=n.n(C),w=n(593),_=n.n(w),A=n(4994),k=n.n(A),N=n(600),I=n.n(N),q=n(7104),R=n.n(q),P=n(66),T=n.n(P),O=n(3942),M=n.n(O),j=n(6689),V=n.n(j),D=n(6695),L=n(5572),U=n.n(L);const z=require("redux-immutable");var B=n(41);const J=require("lodash/merge");var F=n.n(J),W=n(4966),H=n(7504),K=n(1890),Z=function(e){return e};var G=function(){function e(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};b()(this,e),v()(this,{state:{},plugins:[],pluginsOptions:{},system:{configs:{},fn:{},components:{},rootInjects:{},statePlugins:{}},boundSystem:{},toolbox:{}},n),this.getSystem=_()(t=this._getSystem).call(t,this),this.store=ee(Z,(0,L.fromJS)(this.state),this.getSystem),this.buildSystem(!1),this.register(this.plugins)}return x()(e,[{key:"getStore",value:function(){return this.store}},{key:"register",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=Y(e,this.getSystem(),this.pluginsOptions);Q(this.system,n),t&&this.buildSystem();var r=X.call(this.system,e,this.getSystem());r&&this.buildSystem()}},{key:"buildSystem",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this.getStore().dispatch,n=this.getStore().getState;this.boundSystem=k()({},this.getRootInjects(),this.getWrappedAndBoundActions(t),this.getWrappedAndBoundSelectors(n,this.getSystem),this.getStateThunks(n),this.getFn(),this.getConfigs()),e&&this.rebuildReducer()}},{key:"_getSystem",value:function(){return this.boundSystem}},{key:"getRootInjects",value:function(){var e,t,n;return k()({getSystem:this.getSystem,getStore:_()(e=this.getStore).call(e,this),getComponents:_()(t=this.getComponents).call(t,this),getState:this.getStore().getState,getConfigs:_()(n=this._getConfigs).call(n,this),Im:U(),React:V()},this.system.rootInjects||{})}},{key:"_getConfigs",value:function(){return this.system.configs}},{key:"getConfigs",value:function(){return{configs:this.system.configs}}},{key:"setConfigs",value:function(e){this.system.configs=e}},{key:"rebuildReducer",value:function(){var e,t,n,r;this.store.replaceReducer((r=this.system.statePlugins,e=(0,K.Ay)(r,(function(e){return e.reducers})),n=T()(t=m()(e)).call(t,(function(t,n){return t[n]=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:new L.Map,n=arguments.length>1?arguments[1]:void 0;if(!e)return t;var r=e[n.type];if(r){var a=$(r)(t,n);return null===a?t:a}return t}}(e[n]),t}),{}),m()(n).length?(0,z.combineReducers)(n):Z))}},{key:"getType",value:function(e){var t=e[0].toUpperCase()+I()(e).call(e,1);return(0,K.Q2)(this.system.statePlugins,(function(n,r){var a=n[e];if(a)return E()({},r+t,a)}))}},{key:"getSelectors",value:function(){return this.getType("selectors")}},{key:"getActions",value:function(){var e=this.getType("actions");return(0,K.Ay)(e,(function(e){return(0,K.Q2)(e,(function(e,t){if((0,K.LQ)(e))return E()({},t,e)}))}))}},{key:"getWrappedAndBoundActions",value:function(e){var t=this,n=this.getBoundActions(e);return(0,K.Ay)(n,(function(e,n){var r=t.system.statePlugins[I()(n).call(n,0,-7)].wrapActions;return r?(0,K.Ay)(e,(function(e,n){var a=r[n];return a?(R()(a)||(a=[a]),T()(a).call(a,(function(e,n){var r=function(){return n(e,t.getSystem()).apply(void 0,arguments)};if(!(0,K.LQ)(r))throw new TypeError("wrapActions needs to return a function that returns a new function (ie the wrapped action)");return $(r)}),e||Function.prototype)):e})):e}))}},{key:"getWrappedAndBoundSelectors",value:function(e,t){var n=this,r=this.getBoundSelectors(e,t);return(0,K.Ay)(r,(function(t,r){var a=[I()(r).call(r,0,-9)],o=n.system.statePlugins[a].wrapSelectors;return o?(0,K.Ay)(t,(function(t,r){var s=o[r];return s?(R()(s)||(s=[s]),T()(s).call(s,(function(t,r){var o=function(){for(var o,s=arguments.length,i=new Array(s),c=0;c2&&void 0!==arguments[2]?arguments[2]:{},a=r.hasLoaded,o=a;return(0,K.Kn)(e)&&!(0,K.kJ)(e)&&"function"==typeof e.afterLoad&&(o=!0,$(e.afterLoad).call(this,t)),(0,K.Wl)(e)?X.call(this,e(t),t,{hasLoaded:o}):(0,K.kJ)(e)?M()(e).call(e,(function(e){return X.call(n,e,t,{hasLoaded:o})})):o}function Q(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!(0,K.Kn)(e))return{};if(!(0,K.Kn)(t))return e;t.wrapComponents&&((0,K.Ay)(t.wrapComponents,(function(n,r){var a=e.components&&e.components[r];a&&R()(a)?(e.components[r]=l()(a).call(a,[n]),delete t.wrapComponents[r]):a&&(e.components[r]=[a,n],delete t.wrapComponents[r])})),m()(t.wrapComponents).length||delete t.wrapComponents);var n=e.statePlugins;if((0,K.Kn)(n))for(var r in n){var a=n[r];if((0,K.Kn)(a)){var o=a.wrapActions,s=a.wrapSelectors;if((0,K.Kn)(o))for(var i in o){var c,u=o[i];if(R()(u)||(u=[u],o[i]=u),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapActions&&t.statePlugins[r].wrapActions[i])t.statePlugins[r].wrapActions[i]=l()(c=o[i]).call(c,t.statePlugins[r].wrapActions[i])}if((0,K.Kn)(s))for(var p in s){var d,h=s[p];if(R()(h)||(h=[h],s[p]=h),t&&t.statePlugins&&t.statePlugins[r]&&t.statePlugins[r].wrapSelectors&&t.statePlugins[r].wrapSelectors[p])t.statePlugins[r].wrapSelectors[p]=l()(d=s[p]).call(d,t.statePlugins[r].wrapSelectors[p])}}}return v()(e,t)}function $(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.logErrors,r=void 0===n||n;return"function"!=typeof e?e:function(){try{for(var t,n=arguments.length,a=new Array(n),o=0;o=0&&(void 0===t.allowTryItOut?t.specSelectors.allowTryItOutFor(t.path,t.method):t.allowTryItOut),v=r.getIn(["operation","security"])||t.specSelectors.security();return{operationId:m,isDeepLinkingEnabled:f,showSummary:d,displayOperationId:c,displayRequestDuration:u,allowTryItOut:g,security:v,isAuthorized:t.authSelectors.isAuthorized(v),isShown:a.isShown(h,"full"===s),jumpToKey:l()(n="paths.".concat(t.path,".")).call(n,t.method),response:t.specSelectors.responseFor(t.path,t.method),request:t.specSelectors.requestFor(t.path,t.method)}}},{key:"componentDidMount",value:function(){var e=this.props.isShown,t=this.getResolvedSubtree();e&&void 0===t&&this.requestResolvedSubtree()}},{key:"UNSAFE_componentWillReceiveProps",value:function(e){var t=e.response,n=e.isShown,r=this.getResolvedSubtree();t!==this.props.response&&this.setState({executeInProgress:!1}),n&&void 0===r&&this.requestResolvedSubtree()}},{key:"render",value:function(){var e=this.props,t=e.op,n=e.tag,r=e.path,a=e.method,o=e.security,s=e.isAuthorized,l=e.operationId,i=e.showSummary,c=e.isShown,u=e.jumpToKey,p=e.allowTryItOut,d=e.response,m=e.request,h=e.displayOperationId,f=e.displayRequestDuration,g=e.isDeepLinkingEnabled,v=e.specPath,y=e.specSelectors,E=e.specActions,S=e.getComponent,b=e.getConfigs,C=e.layoutSelectors,x=e.layoutActions,w=e.authActions,_=e.authSelectors,A=e.oas3Actions,k=e.oas3Selectors,N=e.fn,I=S("operation"),q=this.getResolvedSubtree()||(0,L.Map)(),R=(0,L.fromJS)({op:q,tag:n,path:r,summary:t.getIn(["operation","summary"])||"",deprecated:q.get("deprecated")||t.getIn(["operation","deprecated"])||!1,method:a,security:o,isAuthorized:s,operationId:l,originalOperationId:q.getIn(["operation","__originalOperationId"]),showSummary:i,isShown:c,jumpToKey:u,allowTryItOut:p,request:m,displayOperationId:h,displayRequestDuration:f,isDeepLinkingEnabled:g,executeInProgress:this.state.executeInProgress,tryItOutEnabled:this.state.tryItOutEnabled});return V().createElement(I,{operation:R,response:d,request:m,isShown:c,toggleShown:this.toggleShown,onTryoutClick:this.onTryoutClick,onCancelClick:this.onCancelClick,onExecute:this.onExecute,specPath:v,specActions:E,specSelectors:y,oas3Actions:A,oas3Selectors:k,layoutActions:x,layoutSelectors:C,authActions:w,authSelectors:_,getComponent:S,getConfigs:b,fn:N})}}]),n}(j.PureComponent);E()(Ae,"defaultProps",{showSummary:!0,response:null,allowTryItOut:!0,displayOperationId:!1,displayRequestDuration:!1});var ke=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"getLayout",value:function(){var e=this.props,t=e.getComponent,n=e.layoutSelectors.current(),r=t(n,!0);return r||function(){return V().createElement("h1",null,' No layout defined for "',n,'" ')}}},{key:"render",value:function(){var e=this.getLayout();return V().createElement(e,null)}}]),n}(V().Component);ke.defaultProps={};var Ne=function(e){Se()(n,e);var t=Ce()(n);function n(){var e,r;b()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,a=void 0!==n&&n;"function"==typeof r.props.onSelect&&r.props.onSelect(e,{isSyntheticChange:a})})),E()(ye()(r),"_onDomSelect",(function(e){if("function"==typeof r.props.onSelect){var t=e.target.selectedOptions[0].getAttribute("value");r._onSelect(t,{isSyntheticChange:!1})}})),E()(ye()(r),"getCurrentExample",(function(){var e=r.props,t=e.examples,n=e.currentExampleKey,a=t.get(n),o=t.keySeq().first(),s=t.get(o);return a||s||Le()({})})),r}return x()(n,[{key:"componentDidMount",value:function(){var e=this.props,t=e.onSelect,n=e.examples;if("function"==typeof t){var r=n.first(),a=n.keyOf(r);this._onSelect(a,{isSyntheticChange:!0})}}},{key:"UNSAFE_componentWillReceiveProps",value:function(e){var t=e.currentExampleKey,n=e.examples;if(n!==this.props.examples&&!n.has(t)){var r=n.first(),a=n.keyOf(r);this._onSelect(a,{isSyntheticChange:!0})}}},{key:"render",value:function(){var e=this.props,t=e.examples,n=e.currentExampleKey,r=e.isValueModified,a=e.isModifiedValueAvailable,o=e.showLabels;return V().createElement("div",{className:"examples-select"},o?V().createElement("span",{className:"examples-select__section-label"},"Examples: "):null,V().createElement("select",{className:"examples-select-element",onChange:this._onDomSelect,value:a&&r?"__MODIFIED__VALUE__":n||""},a?V().createElement("option",{value:"__MODIFIED__VALUE__"},"[Modified value]"):null,M()(t).call(t,(function(e,t){return V().createElement("option",{key:t,value:t},e.get("summary")||t)})).valueSeq()))}}]),n}(V().PureComponent);E()(Ue,"defaultProps",{examples:U().Map({}),onSelect:function(){for(var e,t,n=arguments.length,r=new Array(n),a=0;a1&&void 0!==arguments[1]?arguments[1]:{},n=t.isSyntheticChange,a=r.props,o=a.onSelect,s=a.updateValue,i=a.currentUserInputValue,c=a.userHasEditedBody,u=r._getStateForCurrentNamespace(),p=u.lastUserEditedValue,d=r._getValueForExample(e);if("__MODIFIED__VALUE__"===e)return s(ze(p)),r._setStateForCurrentNamespace({isModifiedValueSelected:!0});if("function"==typeof o){for(var m,h=arguments.length,f=new Array(h>2?h-2:0),g=2;g-1){var u;a.setState({scopes:p()(u=a.state.scopes).call(u,(function(e){return e!==s}))})}})),E()(ye()(a),"onInputChange",(function(e){var t=e.target,n=t.dataset.name,r=t.value,o=E()({},n,r);a.setState(o)})),E()(ye()(a),"selectScopes",(function(e){var t;e.target.dataset.all?a.setState({scopes:Fe()(He()(t=a.props.schema.get("allowedScopes")||a.props.schema.get("scopes")).call(t))}):a.setState({scopes:[]})})),E()(ye()(a),"logout",(function(e){e.preventDefault();var t=a.props,n=t.authActions,r=t.errActions,o=t.name;r.clear({authId:o,type:"auth",source:"auth"}),n.logoutWithPersistOption([o])}));var o=a.props,s=o.name,i=o.schema,c=o.authorized,u=o.authSelectors,d=c&&c.get(s),m=u.getConfigs()||{},h=d&&d.get("username")||"",f=d&&d.get("clientId")||m.clientId||"",g=d&&d.get("clientSecret")||m.clientSecret||"",v=d&&d.get("passwordType")||"basic",y=d&&d.get("scopes")||m.scopes||[];return"string"==typeof y&&(y=y.split(m.scopeSeparator||" ")),a.state={appName:m.appName,name:s,schema:i,scopes:y,clientId:f,clientSecret:g,username:h,password:"",passwordType:v},a}return x()(n,[{key:"render",value:function(){var e,t,n=this,r=this.props,a=r.schema,o=r.getComponent,s=r.authSelectors,i=r.errSelectors,c=r.name,u=r.specSelectors,d=o("Input"),m=o("Row"),h=o("Col"),f=o("Button"),g=o("authError"),v=o("JumpToPath",!0),y=o("Markdown",!0),E=o("InitializedInput"),S=u.isOAS3,b=S()?a.get("openIdConnectUrl"):null,C="implicit",x="password",w=S()?b?"authorization_code":"authorizationCode":"accessCode",_=S()?b?"client_credentials":"clientCredentials":"application",A=!!(s.getConfigs()||{}).usePkceWithAuthorizationCodeGrant,k=a.get("flow"),N=k===w&&A?k+" with PKCE":k,I=a.get("allowedScopes")||a.get("scopes"),q=!!s.authorized().get(c),R=p()(e=i.allErrors()).call(e,(function(e){return e.get("authId")===c})),P=!p()(R).call(R,(function(e){return"validation"===e.get("source")})).size,T=a.get("description");return V().createElement("div",null,V().createElement("h4",null,c," (OAuth2, ",N,") ",V().createElement(v,{path:["securityDefinitions",c]})),this.state.appName?V().createElement("h5",null,"Application: ",this.state.appName," "):null,T&&V().createElement(y,{source:a.get("description")}),q&&V().createElement("h6",null,"Authorized"),b&&V().createElement("p",null,"OpenID Connect URL: ",V().createElement("code",null,b)),(k===C||k===w)&&V().createElement("p",null,"Authorization URL: ",V().createElement("code",null,a.get("authorizationUrl"))),(k===x||k===w||k===_)&&V().createElement("p",null,"Token URL:",V().createElement("code",null," ",a.get("tokenUrl"))),V().createElement("p",{className:"flow"},"Flow: ",V().createElement("code",null,N)),k!==x?null:V().createElement(m,null,V().createElement(m,null,V().createElement("label",{htmlFor:"oauth_username"},"username:"),q?V().createElement("code",null," ",this.state.username," "):V().createElement(h,{tablet:10,desktop:10},V().createElement("input",{id:"oauth_username",type:"text","data-name":"username",onChange:this.onInputChange,autoFocus:!0}))),V().createElement(m,null,V().createElement("label",{htmlFor:"oauth_password"},"password:"),q?V().createElement("code",null," ****** "):V().createElement(h,{tablet:10,desktop:10},V().createElement("input",{id:"oauth_password",type:"password","data-name":"password",onChange:this.onInputChange}))),V().createElement(m,null,V().createElement("label",{htmlFor:"password_type"},"Client credentials location:"),q?V().createElement("code",null," ",this.state.passwordType," "):V().createElement(h,{tablet:10,desktop:10},V().createElement("select",{id:"password_type","data-name":"passwordType",onChange:this.onInputChange},V().createElement("option",{value:"basic"},"Authorization header"),V().createElement("option",{value:"request-body"},"Request body"))))),(k===_||k===C||k===w||k===x)&&(!q||q&&this.state.clientId)&&V().createElement(m,null,V().createElement("label",{htmlFor:"client_id"},"client_id:"),q?V().createElement("code",null," ****** "):V().createElement(h,{tablet:10,desktop:10},V().createElement(E,{id:"client_id",type:"text",required:k===x,initialValue:this.state.clientId,"data-name":"clientId",onChange:this.onInputChange}))),(k===_||k===w||k===x)&&!A&&V().createElement(m,null,V().createElement("label",{htmlFor:"client_secret"},"client_secret:"),q?V().createElement("code",null," ****** "):V().createElement(h,{tablet:10,desktop:10},V().createElement(E,{id:"client_secret",initialValue:this.state.clientSecret,type:"password","data-name":"clientSecret",onChange:this.onInputChange}))),!q&&I&&I.size?V().createElement("div",{className:"scopes"},V().createElement("h2",null,"Scopes:",V().createElement("a",{onClick:this.selectScopes,"data-all":!0},"select all"),V().createElement("a",{onClick:this.selectScopes},"select none")),M()(I).call(I,(function(e,t){var r,a,o,s,i;return V().createElement(m,{key:t},V().createElement("div",{className:"checkbox"},V().createElement(d,{"data-value":t,id:l()(r=l()(a="".concat(t,"-")).call(a,k,"-checkbox-")).call(r,n.state.name),disabled:q,checked:Ze()(o=n.state.scopes).call(o,t),type:"checkbox",onChange:n.onScopeChange}),V().createElement("label",{htmlFor:l()(s=l()(i="".concat(t,"-")).call(i,k,"-checkbox-")).call(s,n.state.name)},V().createElement("span",{className:"item"}),V().createElement("div",{className:"text"},V().createElement("p",{className:"name"},t),V().createElement("p",{className:"description"},e)))))})).toArray()):null,M()(t=R.valueSeq()).call(t,(function(e,t){return V().createElement(g,{error:e,key:t})})),V().createElement("div",{className:"auth-btn-wrapper"},P&&(q?V().createElement(f,{className:"btn modal-btn auth authorize",onClick:this.logout},"Logout"):V().createElement(f,{className:"btn modal-btn auth authorize",onClick:this.authorize},"Authorize")),V().createElement(f,{className:"btn modal-btn auth btn-done",onClick:this.close},"Close")))}}]),n}(V().Component),Qe=function(e){Se()(n,e);var t=Ce()(n);function n(){var e,r;b()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s2&&void 0!==arguments[2]?arguments[2]:{},r=n.selectedServer,a=void 0===r?"":r;if(e){if(it(e))return e;var o=ct(a,t);return it(o)?new(lt())(e,o).href:new(lt())(e,window.location.href).href}}function pt(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.selectedServer,a=void 0===r?"":r;try{return ut(e,t,{selectedServer:a})}catch(e){return}}var dt=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e,t=this.props,n=t.tagObj,r=t.tag,a=t.children,o=t.oas3Selectors,s=t.layoutSelectors,l=t.layoutActions,i=t.getConfigs,c=t.getComponent,u=t.specUrl,p=i(),d=p.docExpansion,m=p.deepLinking,h=m&&"false"!==m,f=c("Collapse"),g=c("Markdown",!0),v=c("DeepLink"),y=c("Link"),E=n.getIn(["tagDetails","description"],null),S=n.getIn(["tagDetails","externalDocs","description"]),b=n.getIn(["tagDetails","externalDocs","url"]);e=(0,K.Wl)(o)&&(0,K.Wl)(o.selectedServer)?pt(b,u,{selectedServer:o.selectedServer()}):b;var C=["operations-tag",r],x=s.isShown(C,"full"===d||"list"===d);return V().createElement("div",{className:x?"opblock-tag-section is-open":"opblock-tag-section"},V().createElement("h3",{onClick:function(){return l.show(C,!x)},className:E?"opblock-tag":"opblock-tag no-desc",id:M()(C).call(C,(function(e){return(0,K.J6)(e)})).join("-"),"data-tag":r,"data-is-open":x},V().createElement(v,{enabled:h,isShown:x,path:(0,K.oJ)(r),text:r}),E?V().createElement("small",null,V().createElement(g,{source:E})):V().createElement("small",null),S?V().createElement("div",{className:"info__externaldocs"},V().createElement("small",null,S,e?": ":null,e?V().createElement(y,{href:(0,K.Nm)(e),onClick:function(e){return e.stopPropagation()},target:"_blank"},e):null)):null,V().createElement("button",{"aria-expanded":x,className:"expand-operation",title:x?"Collapse operation":"Expand operation",onClick:function(){return l.show(C,!x)}},V().createElement("svg",{className:"arrow",width:"20",height:"20","aria-hidden":"true",focusable:"false"},V().createElement("use",{href:x?"#large-arrow-up":"#large-arrow-down",xlinkHref:x?"#large-arrow-up":"#large-arrow-down"})))),V().createElement(f,{isOpened:x},a))}}]),n}(V().Component);E()(dt,"defaultProps",{tagObj:U().fromJS({}),tag:""});var mt=function(e){Se()(r,e);var t=Ce()(r);function r(){return b()(this,r),t.apply(this,arguments)}return x()(r,[{key:"render",value:function(){var e=this.props,t=e.specPath,r=e.response,a=e.request,o=e.toggleShown,s=e.onTryoutClick,l=e.onCancelClick,i=e.onExecute,c=e.fn,u=e.getComponent,p=e.getConfigs,d=e.specActions,m=e.specSelectors,h=e.authActions,f=e.authSelectors,g=e.oas3Actions,v=e.oas3Selectors,y=this.props.operation,E=y.toJS(),S=E.deprecated,b=E.isShown,C=E.path,x=E.method,w=E.op,_=E.tag,A=E.operationId,k=E.allowTryItOut,N=E.displayRequestDuration,I=E.tryItOutEnabled,q=E.executeInProgress,R=w.description,P=w.externalDocs,T=w.schemes,O=P?pt(P.url,m.url(),{selectedServer:v.selectedServer()}):"",M=y.getIn(["op"]),j=M.get("responses"),D=(0,K.gp)(M,["parameters"]),L=m.operationScheme(C,x),U=["operations",_,A],z=(0,K.nX)(M),B=u("responses"),J=u("parameters"),F=u("execute"),W=u("clear"),H=u("Collapse"),Z=u("Markdown",!0),G=u("schemes"),Y=u("OperationServers"),X=u("OperationExt"),Q=u("OperationSummary"),$=u("Link"),ee=p().showExtensions;if(j&&r&&r.size>0){var te=!j.get(String(r.get("status")))&&!j.get("default");r=r.set("notDocumented",te)}var ne=[C,x];return V().createElement("div",{className:S?"opblock opblock-deprecated":b?"opblock opblock-".concat(x," is-open"):"opblock opblock-".concat(x),id:(0,K.J6)(U.join("-"))},V().createElement(Q,{operationProps:y,isShown:b,toggleShown:o,getComponent:u,authActions:h,authSelectors:f,specPath:t}),V().createElement(H,{isOpened:b},V().createElement("div",{className:"opblock-body"},M&&M.size||null===M?null:V().createElement("img",{height:"32px",width:"32px",src:n(2517),className:"opblock-loading-animation"}),S&&V().createElement("h4",{className:"opblock-title_normal"}," Warning: Deprecated"),R&&V().createElement("div",{className:"opblock-description-wrapper"},V().createElement("div",{className:"opblock-description"},V().createElement(Z,{source:R}))),O?V().createElement("div",{className:"opblock-external-docs-wrapper"},V().createElement("h4",{className:"opblock-title_normal"},"Find more details"),V().createElement("div",{className:"opblock-external-docs"},V().createElement("span",{className:"opblock-external-docs__description"},V().createElement(Z,{source:P.description})),V().createElement($,{target:"_blank",className:"opblock-external-docs__link",href:(0,K.Nm)(O)},O))):null,M&&M.size?V().createElement(J,{parameters:D,specPath:t.push("parameters"),operation:M,onChangeKey:ne,onTryoutClick:s,onCancelClick:l,tryItOutEnabled:I,allowTryItOut:k,fn:c,getComponent:u,specActions:d,specSelectors:m,pathMethod:[C,x],getConfigs:p,oas3Actions:g,oas3Selectors:v}):null,I?V().createElement(Y,{getComponent:u,path:C,method:x,operationServers:M.get("servers"),pathServers:m.paths().getIn([C,"servers"]),getSelectedServer:v.selectedServer,setSelectedServer:g.setSelectedServer,setServerVariableValue:g.setServerVariableValue,getServerVariable:v.serverVariableValue,getEffectiveServerValue:v.serverEffectiveValue}):null,I&&k&&T&&T.size?V().createElement("div",{className:"opblock-schemes"},V().createElement(G,{schemes:T,path:C,method:x,specActions:d,currentScheme:L})):null,V().createElement("div",{className:I&&r&&k?"btn-group":"execute-wrapper"},I&&k?V().createElement(F,{operation:M,specActions:d,specSelectors:m,oas3Selectors:v,oas3Actions:g,path:C,method:x,onExecute:i,disabled:q}):null,I&&r&&k?V().createElement(W,{specActions:d,path:C,method:x}):null),q?V().createElement("div",{className:"loading-container"},V().createElement("div",{className:"loading"})):null,j?V().createElement(B,{responses:j,request:a,tryItOutResponse:r,getComponent:u,getConfigs:p,specSelectors:m,oas3Actions:g,oas3Selectors:v,specActions:d,produces:m.producesOptionsFor([C,x]),producesValue:m.currentProducesFor([C,x]),specPath:t.push("responses"),path:C,method:x,displayRequestDuration:N,fn:c}):null,ee&&z.size?V().createElement(X,{extensions:z,getComponent:u}):null)))}}]),r}(j.PureComponent);E()(mt,"defaultProps",{operation:null,response:null,request:null,specPath:(0,L.List)(),summary:""});const ht=require("lodash/toString");var ft=n.n(ht),gt=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e,t=this.props,n=t.isShown,r=t.toggleShown,a=t.getComponent,o=t.authActions,s=t.authSelectors,i=t.operationProps,c=t.specPath,u=i.toJS(),p=u.summary,d=u.isAuthorized,m=u.method,h=u.op,f=u.showSummary,g=u.path,v=u.operationId,y=u.originalOperationId,E=u.displayOperationId,S=h.summary,b=i.get("security"),C=a("authorizeOperationBtn"),x=a("OperationSummaryMethod"),w=a("OperationSummaryPath"),_=a("JumpToPath",!0),A=b&&!!b.count(),k=A&&1===b.size&&b.first().isEmpty(),N=!A||k;return V().createElement("div",{className:"opblock-summary opblock-summary-".concat(m)},V().createElement("button",{"aria-label":l()(e="".concat(m," ")).call(e,g.replace(/\//g,"​/")),"aria-expanded":n,className:"opblock-summary-control",onClick:r},V().createElement(x,{method:m}),V().createElement(w,{getComponent:a,operationProps:i,specPath:c}),f?V().createElement("div",{className:"opblock-summary-description"},ft()(S||p)):null,E&&(y||v)?V().createElement("span",{className:"opblock-summary-operation-id"},y||v):null,V().createElement("svg",{className:"arrow",width:"20",height:"20","aria-hidden":"true",focusable:"false"},V().createElement("use",{href:n?"#large-arrow-up":"#large-arrow-down",xlinkHref:n?"#large-arrow-up":"#large-arrow-down"}))),N?null:V().createElement(C,{isAuthorized:d,onClick:function(){var e=s.definitionsForRequirements(b);o.showDefinitions(e)}}),V().createElement(_,{path:c}))}}]),n}(j.PureComponent);E()(gt,"defaultProps",{operationProps:null,specPath:(0,L.List)(),summary:""});var vt=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e=this.props.method;return V().createElement("span",{className:"opblock-summary-method"},e.toUpperCase())}}]),n}(j.PureComponent);E()(vt,"defaultProps",{operationProps:null});const yt=require("@babel/runtime-corejs3/core-js-stable/instance/splice");var Et=n.n(yt),St=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){for(var e,t=this.props,n=t.getComponent,r=t.operationProps.toJS(),a=r.deprecated,o=r.isShown,s=r.path,i=r.tag,c=r.operationId,u=r.isDeepLinkingEnabled,p=s.split(/(?=\/)/g),d=1;da&&(0===o&&n<0||a+o>=r&&n>0)&&e.preventDefault()};return V().createElement("div",{className:"highlight-code",ref:u},a?V().createElement("div",{className:"download-contents",onClick:function(){Mt()(t,n)}},"Download"):null,s&&V().createElement("div",{className:"copy-to-clipboard"},V().createElement(jt.CopyToClipboard,{text:t},V().createElement("button",null))),c?V().createElement(It.d3,{language:l,className:Nt()(r,"microlight"),style:(0,It.C2)(Rt()(i,"syntaxHighlight.theme","agate"))},t):V().createElement("pre",{className:Nt()(r,"microlight")},t))};Vt.defaultProps={fileName:"response.txt"};const Dt=Vt;var Lt=function(e){Se()(n,e);var t=Ce()(n);function n(){var e,r;b()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s1&&void 0!==arguments[1]?arguments[1]:"_";return e.replace(/[^\w-]/g,t)}(l()(e="".concat(g)).call(e,f,"_responses")),A="".concat(_,"_select");return V().createElement("div",{className:"responses-wrapper"},V().createElement("div",{className:"opblock-section-header"},V().createElement("h4",null,"Responses"),u.isOAS3()?null:V().createElement("label",{htmlFor:A},V().createElement("span",null,"Response content type"),V().createElement(S,{value:d,ariaControls:_,ariaLabel:"Response content type",className:"execute-content-type",contentTypes:x,controlId:A,onChange:this.onChangeProducesWrapper}))),V().createElement("div",{className:"responses-inner"},s?V().createElement("div",null,V().createElement(b,{response:s,getComponent:i,getConfigs:c,specSelectors:u,path:this.props.path,method:this.props.method,displayRequestDuration:m}),V().createElement("h4",null,"Responses")):null,V().createElement("table",{"aria-live":"polite",className:"responses-table",id:_,role:"region"},V().createElement("thead",null,V().createElement("tr",{className:"responses-header"},V().createElement("td",{className:"col_header response-col_status"},"Code"),V().createElement("td",{className:"col_header response-col_description"},"Description"),u.isOAS3()?V().createElement("td",{className:"col col_header response-col_links"},"Links"):null)),V().createElement("tbody",null,M()(t=o.entrySeq()).call(t,(function(e){var t=Ct()(e,2),n=t[0],a=t[1],o=s&&s.get("status")==n?"response_current":"";return V().createElement(C,{key:n,path:f,method:g,specPath:h.push(n),isDefault:E===n,fn:p,className:o,code:n,response:a,specSelectors:u,controlsAcceptHeader:a===w,onContentTypeChange:r.onResponseContentTypeChange,contentType:d,getConfigs:c,activeExamplesKey:v.activeExamplesMember(f,g,"responses",n),oas3Actions:y,getComponent:i})})).toArray()))))}}]),n}(V().Component);E()(Lt,"defaultProps",{tryItOutResponse:null,produces:(0,L.fromJS)(["application/json"]),displayRequestDuration:!1});var Ut=n(67),zt=n.n(Ut);const Bt=require("@babel/runtime-corejs3/core-js-stable/instance/values");var Jt=n.n(Bt),Ft=n(2518),Wt=function(e){Se()(n,e);var t=Ce()(n);function n(e,r){var a;return b()(this,n),a=t.call(this,e,r),E()(ye()(a),"_onContentTypeChange",(function(e){var t=a.props,n=t.onContentTypeChange,r=t.controlsAcceptHeader;a.setState({responseContentType:e}),n({value:e,controlsAcceptHeader:r})})),E()(ye()(a),"getTargetExamplesKey",(function(){var e=a.props,t=e.response,n=e.contentType,r=e.activeExamplesKey,o=a.state.responseContentType||n,s=t.getIn(["content",o],(0,L.Map)({})).get("examples",null).keySeq().first();return r||s})),a.state={responseContentType:""},a}return x()(n,[{key:"render",value:function(){var e,t,n,r,a,o=this.props,s=o.path,i=o.method,c=o.code,u=o.response,p=o.className,d=o.specPath,m=o.fn,h=o.getComponent,f=o.getConfigs,g=o.specSelectors,v=o.contentType,y=o.controlsAcceptHeader,E=o.oas3Actions,S=m.inferSchema,b=g.isOAS3(),C=f().showExtensions,x=C?(0,K.nX)(u):null,w=u.get("headers"),_=u.get("links"),A=h("ResponseExtension"),k=h("headers"),N=h("highlightCode"),I=h("modelExample"),q=h("Markdown",!0),R=h("operationLink"),P=h("contentType"),T=h("ExamplesSelect"),O=h("Example"),j=this.state.responseContentType||v,D=u.getIn(["content",j],(0,L.Map)({})),U=D.get("examples",null);if(b){var z=D.get("schema");n=z?S(z.toJS()):null,r=z?(0,L.List)(["content",this.state.responseContentType,"schema"]):d}else n=u.get("schema"),r=u.has("schema")?d.push("schema"):d;var B,J=!1,F={includeReadOnly:!0};if(b){var W;if(B=null===(W=D.get("schema"))||void 0===W?void 0:W.toJS(),U){var H=this.getTargetExamplesKey(),Z=function(e){return e.get("value")};void 0===(a=Z(U.get(H,(0,L.Map)({}))))&&(a=Z(Jt()(U).call(U).next().value)),J=!0}else void 0!==D.get("example")&&(a=D.get("example"),J=!0)}else{B=n,F=zt()(zt()({},F),{},{includeWriteOnly:!0});var G=u.getIn(["examples",j]);G&&(a=G,J=!0)}var Y=function(e,t,n){if(null!=e){var r=null;return(0,Ft.O)(e)&&(r="json"),V().createElement("div",null,V().createElement(t,{className:"example",getConfigs:n,language:r,value:(0,K.Pz)(e)}))}return null}((0,K.xi)(B,j,F,J?a:void 0),N,f);return V().createElement("tr",{className:"response "+(p||""),"data-code":c},V().createElement("td",{className:"response-col_status"},c),V().createElement("td",{className:"response-col_description"},V().createElement("div",{className:"response-col_description__inner"},V().createElement(q,{source:u.get("description")})),C&&x.size?M()(e=x.entrySeq()).call(e,(function(e){var t,n=Ct()(e,2),r=n[0],a=n[1];return V().createElement(A,{key:l()(t="".concat(r,"-")).call(t,a),xKey:r,xVal:a})})):null,b&&u.get("content")?V().createElement("section",{className:"response-controls"},V().createElement("div",{className:Nt()("response-control-media-type",{"response-control-media-type--accept-controller":y})},V().createElement("small",{className:"response-control-media-type__title"},"Media type"),V().createElement(P,{value:this.state.responseContentType,contentTypes:u.get("content")?u.get("content").keySeq():(0,L.Seq)(),onChange:this._onContentTypeChange,ariaLabel:"Media Type"}),y?V().createElement("small",{className:"response-control-media-type__accept-message"},"Controls ",V().createElement("code",null,"Accept")," header."):null),U?V().createElement("div",{className:"response-control-examples"},V().createElement("small",{className:"response-control-examples__title"},"Examples"),V().createElement(T,{examples:U,currentExampleKey:this.getTargetExamplesKey(),onSelect:function(e){return E.setActiveExamplesMember({name:e,pathMethod:[s,i],contextType:"responses",contextName:c})},showLabels:!1})):null):null,Y||n?V().createElement(I,{specPath:r,getComponent:h,getConfigs:f,specSelectors:g,schema:(0,K.oG)(n),example:Y,includeReadOnly:!0}):null,b&&U?V().createElement(O,{example:U.get(this.getTargetExamplesKey(),(0,L.Map)({})),getComponent:h,getConfigs:f,omitValue:!0}):null,w?V().createElement(k,{headers:w,getComponent:h}):null),b?V().createElement("td",{className:"response-col_links"},_?M()(t=_.toSeq().entrySeq()).call(t,(function(e){var t=Ct()(e,2),n=t[0],r=t[1];return V().createElement(R,{key:n,name:n,link:r,getComponent:h})})):V().createElement("i",null,"No links")):null)}}]),n}(V().Component);E()(Wt,"defaultProps",{response:(0,L.fromJS)({}),onContentTypeChange:function(){}});const Ht=function(e){var t=e.xKey,n=e.xVal;return V().createElement("div",{className:"response__extension"},t,": ",String(n))},Kt=require("xml-but-prettier");var Zt=n.n(Kt);const Gt=require("lodash/toLower");var Yt=n.n(Gt),Xt=function(e){Se()(n,e);var t=Ce()(n);function n(){var e,r;b()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s0?p?V().createElement("div",null,V().createElement("p",{className:"i"},"Unrecognized response type; displaying content as text."),V().createElement(d,{downloadable:!0,fileName:"".concat(m,".txt"),value:p,getConfigs:i,canCopy:!0})):V().createElement("p",{className:"i"},"Unrecognized response type; unable to display."):null;return t?V().createElement("div",null,V().createElement("h5",null,"Response body"),t):null}}]),n}(V().PureComponent),Qt=n(6731),$t=n.n(Qt),en=n(9968),tn=n.n(en),nn=function(e){Se()(n,e);var t=Ce()(n);function n(e){var r;return b()(this,n),r=t.call(this,e),E()(ye()(r),"onChange",(function(e,t,n){var a=r.props;(0,a.specActions.changeParamByIdentity)(a.onChangeKey,e,t,n)})),E()(ye()(r),"onChangeConsumesWrapper",(function(e){var t=r.props;(0,t.specActions.changeConsumesValue)(t.onChangeKey,e)})),E()(ye()(r),"toggleTab",(function(e){return"parameters"===e?r.setState({parametersVisible:!0,callbackVisible:!1}):"callbacks"===e?r.setState({callbackVisible:!0,parametersVisible:!1}):void 0})),E()(ye()(r),"onChangeMediaType",(function(e){var t=e.value,n=e.pathMethod,a=r.props,o=a.specActions,s=a.oas3Selectors,l=a.oas3Actions,i=s.hasUserEditedBody.apply(s,$t()(n)),c=s.shouldRetainRequestBodyValue.apply(s,$t()(n));l.setRequestContentType({value:t,pathMethod:n}),l.initRequestBodyValidateError({pathMethod:n}),i||(c||l.setRequestBodyValue({value:void 0,pathMethod:n}),o.clearResponse.apply(o,$t()(n)),o.clearRequest.apply(o,$t()(n)),o.clearValidateParams(n))})),r.state={callbackVisible:!1,parametersVisible:!0},r}return x()(n,[{key:"render",value:function(){var e,t,n=this,r=this.props,a=r.onTryoutClick,o=r.parameters,s=r.allowTryItOut,i=r.tryItOutEnabled,c=r.specPath,u=r.fn,p=r.getComponent,d=r.getConfigs,m=r.specSelectors,h=r.specActions,f=r.pathMethod,g=r.oas3Actions,v=r.oas3Selectors,y=r.operation,E=p("parameterRow"),S=p("TryItOutButton"),b=p("contentType"),C=p("Callbacks",!0),x=p("RequestBody",!0),w=i&&s,_=m.isOAS3(),A=y.get("requestBody"),k=T()(e=tn()(T()(o).call(o,(function(e,t){var n,r=t.get("in");return null!==(n=e[r])&&void 0!==n||(e[r]=[]),e[r].push(t),e}),{}))).call(e,(function(e,t){return l()(e).call(e,t)}),[]);return V().createElement("div",{className:"opblock-section"},V().createElement("div",{className:"opblock-section-header"},_?V().createElement("div",{className:"tab-header"},V().createElement("div",{onClick:function(){return n.toggleTab("parameters")},className:"tab-item ".concat(this.state.parametersVisible&&"active")},V().createElement("h4",{className:"opblock-title"},V().createElement("span",null,"Parameters"))),y.get("callbacks")?V().createElement("div",{onClick:function(){return n.toggleTab("callbacks")},className:"tab-item ".concat(this.state.callbackVisible&&"active")},V().createElement("h4",{className:"opblock-title"},V().createElement("span",null,"Callbacks"))):null):V().createElement("div",{className:"tab-header"},V().createElement("h4",{className:"opblock-title"},"Parameters")),s?V().createElement(S,{isOAS3:m.isOAS3(),hasUserEditedBody:v.hasUserEditedBody.apply(v,$t()(f)),enabled:i,onCancelClick:this.props.onCancelClick,onTryoutClick:a,onResetClick:function(){return g.setRequestBodyValue({value:void 0,pathMethod:f})}}):null),this.state.parametersVisible?V().createElement("div",{className:"parameters-container"},k.length?V().createElement("div",{className:"table-container"},V().createElement("table",{className:"parameters"},V().createElement("thead",null,V().createElement("tr",null,V().createElement("th",{className:"col_header parameters-col_name"},"Name"),V().createElement("th",{className:"col_header parameters-col_description"},"Description"))),V().createElement("tbody",null,M()(k).call(k,(function(e,t){var r;return V().createElement(E,{fn:u,specPath:c.push(t.toString()),getComponent:p,getConfigs:d,rawParam:e,param:m.parameterWithMetaByIdentity(f,e),key:l()(r="".concat(e.get("in"),".")).call(r,e.get("name")),onChange:n.onChange,onChangeConsumes:n.onChangeConsumesWrapper,specSelectors:m,specActions:h,oas3Actions:g,oas3Selectors:v,pathMethod:f,isExecute:w})}))))):V().createElement("div",{className:"opblock-description-wrapper"},V().createElement("p",null,"No parameters"))):null,this.state.callbackVisible?V().createElement("div",{className:"callbacks-container opblock-description-wrapper"},V().createElement(C,{callbacks:(0,L.Map)(y.get("callbacks")),specPath:I()(c).call(c,0,-1).push("callbacks")})):null,_&&A&&this.state.parametersVisible&&V().createElement("div",{className:"opblock-section opblock-section-request-body"},V().createElement("div",{className:"opblock-section-header"},V().createElement("h4",{className:"opblock-title parameter__name ".concat(A.get("required")&&"required")},"Request body"),V().createElement("label",null,V().createElement(b,{value:v.requestContentType.apply(v,$t()(f)),contentTypes:A.get("content",(0,L.List)()).keySeq(),onChange:function(e){n.onChangeMediaType({value:e,pathMethod:f})},className:"body-param-content-type",ariaLabel:"Request content type"}))),V().createElement("div",{className:"opblock-description-wrapper"},V().createElement(x,{setRetainRequestBodyValueFlag:function(e){return g.setRetainRequestBodyValueFlag({value:e,pathMethod:f})},userHasEditedBody:v.hasUserEditedBody.apply(v,$t()(f)),specPath:I()(c).call(c,0,-1).push("requestBody"),requestBody:A,requestBodyValue:v.requestBodyValue.apply(v,$t()(f)),requestBodyInclusionSetting:v.requestBodyInclusionSetting.apply(v,$t()(f)),requestBodyErrors:v.requestBodyErrors.apply(v,$t()(f)),isExecute:w,getConfigs:d,activeExamplesKey:v.activeExamplesMember.apply(v,l()(t=$t()(f)).call(t,["requestBody","requestBody"])),updateActiveExamplesKey:function(e){n.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:n.props.pathMethod,contextType:"requestBody",contextName:"requestBody"})},onChange:function(e,t){if(t){var n=v.requestBodyValue.apply(v,$t()(f)),r=L.Map.isMap(n)?n:(0,L.Map)();return g.setRequestBodyValue({pathMethod:f,value:r.setIn(t,e)})}g.setRequestBodyValue({value:e,pathMethod:f})},onChangeIncludeEmpty:function(e,t){g.setRequestBodyInclusion({pathMethod:f,value:t,name:e})},contentType:v.requestContentType.apply(v,$t()(f))}))))}}]),n}(j.Component);E()(nn,"defaultProps",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,tryItOutEnabled:!1,allowTryItOut:!0,onChangeKey:[],specPath:[]});const rn=function(e){var t=e.xKey,n=e.xVal;return V().createElement("div",{className:"parameter__extension"},t,": ",String(n))};var an={onChange:function(){},isIncludedOptions:{}},on=function(e){Se()(n,e);var t=Ce()(n);function n(){var e,r;b()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s1&&void 0!==arguments[1]&&arguments[1],n=a.props,r=n.onChange,o=n.rawParam;return r(o,""===e||e&&0===e.size?null:e,t)})),E()(ye()(a),"_onExampleSelect",(function(e){a.props.oas3Actions.setActiveExamplesMember({name:e,pathMethod:a.props.pathMethod,contextType:"parameters",contextName:a.getParamKey()})})),E()(ye()(a),"onChangeIncludeEmpty",(function(e){var t=a.props,n=t.specActions,r=t.param,o=t.pathMethod,s=r.get("name"),l=r.get("in");return n.updateEmptyParamInclusion(o,s,l,e)})),E()(ye()(a),"setDefaultValue",(function(){var e=a.props,t=e.specSelectors,n=e.pathMethod,r=e.rawParam,o=e.oas3Selectors,s=t.parameterWithMetaByIdentity(n,r)||(0,L.Map)(),i=(0,sn.Z)(s,{isOAS3:t.isOAS3()}).schema,c=s.get("content",(0,L.Map)()).keySeq().first(),u=i?(0,K.xi)(i.toJS(),c,{includeWriteOnly:!0}):null;if(s&&void 0===s.get("value")&&"body"!==s.get("in")){var p;if(t.isSwagger2())p=void 0!==s.get("x-example")?s.get("x-example"):void 0!==s.getIn(["schema","example"])?s.getIn(["schema","example"]):i&&i.getIn(["default"]);else if(t.isOAS3()){var d,m=o.activeExamplesMember.apply(o,l()(d=$t()(n)).call(d,["parameters",a.getParamKey()]));p=void 0!==s.getIn(["examples",m,"value"])?s.getIn(["examples",m,"value"]):void 0!==s.getIn(["content",c,"example"])?s.getIn(["content",c,"example"]):void 0!==s.get("example")?s.get("example"):void 0!==(i&&i.get("example"))?i&&i.get("example"):void 0!==(i&&i.get("default"))?i&&i.get("default"):s.get("default")}void 0===p||L.List.isList(p)||(p=(0,K.Pz)(p)),void 0!==p?a.onChangeWrapper(p):i&&"object"===i.get("type")&&u&&!s.get("examples")&&a.onChangeWrapper(L.List.isList(u)?u:(0,K.Pz)(u))}})),a.setDefaultValue(),a}return x()(n,[{key:"UNSAFE_componentWillReceiveProps",value:function(e){var t,n=e.specSelectors,r=e.pathMethod,a=e.rawParam,o=n.isOAS3(),s=n.parameterWithMetaByIdentity(r,a)||new L.Map;if(s=s.isEmpty()?a:s,o){var l=(0,sn.Z)(s,{isOAS3:o}).schema;t=l?l.get("enum"):void 0}else t=s?s.get("enum"):void 0;var i,c=s?s.get("value"):void 0;void 0!==c?i=c:a.get("required")&&t&&t.size&&(i=t.first()),void 0!==i&&i!==c&&this.onChangeWrapper((0,K.D$)(i)),this.setDefaultValue()}},{key:"getParamKey",value:function(){var e,t=this.props.param;return t?l()(e="".concat(t.get("name"),"-")).call(e,t.get("in")):null}},{key:"render",value:function(){var e,t,n,r,a=this.props,o=a.param,s=a.rawParam,i=a.getComponent,c=a.getConfigs,u=a.isExecute,p=a.fn,d=a.onChangeConsumes,m=a.specSelectors,h=a.pathMethod,f=a.specPath,g=a.oas3Selectors,v=m.isOAS3(),y=c(),E=y.showExtensions,S=y.showCommonExtensions;if(o||(o=s),!s)return null;var b,C,x,w,_=i("JsonSchemaForm"),A=i("ParamBody"),k=o.get("in"),N="body"!==k?null:V().createElement(A,{getComponent:i,getConfigs:c,fn:p,param:o,consumes:m.consumesOptionsFor(h),consumesValue:m.contentTypeValues(h).get("requestContentType"),onChange:this.onChangeWrapper,onChangeConsumes:d,isExecute:u,specSelectors:m,pathMethod:h}),I=i("modelExample"),q=i("Markdown",!0),R=i("ParameterExt"),P=i("ParameterIncludeEmpty"),T=i("ExamplesSelectValueRetainer"),O=i("Example"),j=(0,sn.Z)(o,{isOAS3:v}).schema,D=m.parameterWithMetaByIdentity(h,s)||(0,L.Map)(),U=j?j.get("format"):null,z=j?j.get("type"):null,B=j?j.getIn(["items","type"]):null,J="formData"===k,F="FormData"in H.Z,W=o.get("required"),Z=D?D.get("value"):"",G=S?(0,K.po)(j):null,Y=E?(0,K.nX)(o):null,X=!1;return void 0!==o&&j&&(b=j.get("items")),void 0!==b?(C=b.get("enum"),x=b.get("default")):j&&(C=j.get("enum")),C&&C.size&&C.size>0&&(X=!0),void 0!==o&&(j&&(x=j.get("default")),void 0===x&&(x=o.get("default")),void 0===(w=o.get("example"))&&(w=o.get("x-example"))),V().createElement("tr",{"data-param-name":o.get("name"),"data-param-in":o.get("in")},V().createElement("td",{className:"parameters-col_name"},V().createElement("div",{className:W?"parameter__name required":"parameter__name"},o.get("name"),W?V().createElement("span",null," *"):null),V().createElement("div",{className:"parameter__type"},z,B&&"[".concat(B,"]"),U&&V().createElement("span",{className:"prop-format"},"($",U,")")),V().createElement("div",{className:"parameter__deprecated"},v&&o.get("deprecated")?"deprecated":null),V().createElement("div",{className:"parameter__in"},"(",o.get("in"),")"),S&&G.size?M()(e=G.entrySeq()).call(e,(function(e){var t,n=Ct()(e,2),r=n[0],a=n[1];return V().createElement(R,{key:l()(t="".concat(r,"-")).call(t,a),xKey:r,xVal:a})})):null,E&&Y.size?M()(t=Y.entrySeq()).call(t,(function(e){var t,n=Ct()(e,2),r=n[0],a=n[1];return V().createElement(R,{key:l()(t="".concat(r,"-")).call(t,a),xKey:r,xVal:a})})):null),V().createElement("td",{className:"parameters-col_description"},o.get("description")?V().createElement(q,{source:o.get("description")}):null,!N&&u||!X?null:V().createElement(q,{className:"parameter__enum",source:"Available values : "+M()(C).call(C,(function(e){return e})).toArray().join(", ")}),!N&&u||void 0===x?null:V().createElement(q,{className:"parameter__default",source:"Default value : "+x}),!N&&u||void 0===w?null:V().createElement(q,{source:"Example : "+w}),J&&!F&&V().createElement("div",null,"Error: your browser does not support FormData"),v&&o.get("examples")?V().createElement("section",{className:"parameter-controls"},V().createElement(T,{examples:o.get("examples"),onSelect:this._onExampleSelect,updateValue:this.onChangeWrapper,getComponent:i,defaultToFirstExample:!0,currentKey:g.activeExamplesMember.apply(g,l()(n=$t()(h)).call(n,["parameters",this.getParamKey()])),currentUserInputValue:Z})):null,N?null:V().createElement(_,{fn:p,getComponent:i,value:Z,required:W,disabled:!u,description:o.get("name"),onChange:this.onChangeWrapper,errors:D.get("errors"),schema:j}),N&&j?V().createElement(I,{getComponent:i,specPath:f.push("schema"),getConfigs:c,isExecute:u,specSelectors:m,schema:j,example:N,includeWriteOnly:!0}):null,!N&&u&&o.get("allowEmptyValue")?V().createElement(P,{onChange:this.onChangeIncludeEmpty,isIncluded:m.parameterInclusionSettingFor(h,o.get("name"),o.get("in")),isDisabled:!(0,K.O2)(Z)}):null,v&&o.get("examples")?V().createElement(O,{example:o.getIn(["examples",g.activeExamplesMember.apply(g,l()(r=$t()(h)).call(r,["parameters",this.getParamKey()]))]),getComponent:i,getConfigs:c}):null))}}]),n}(j.Component),cn=n(9300),un=n.n(cn),pn=function(e){Se()(n,e);var t=Ce()(n);function n(){var e,r;b()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s0&&"none"!==p),f=r.isOAS3(),g=a("ModelWrapper"),v=a("Collapse"),y=a("ModelCollapse"),E=a("JumpToPath",!0);return V().createElement("section",{className:h?"models is-open":"models",ref:this.onLoadModels},V().createElement("h4",null,V().createElement("button",{"aria-expanded":h,className:"models-control",onClick:function(){return s.show(m,!h)}},V().createElement("span",null,f?"Schemas":"Models"),V().createElement("svg",{width:"20",height:"20","aria-hidden":"true",focusable:"false"},V().createElement("use",{xlinkHref:h?"#large-arrow-up":"#large-arrow-down"})))),V().createElement(v,{isOpened:h},M()(e=c.entrySeq()).call(e,(function(e){var n,c=Ct()(e,1)[0],u=l()(n=[]).call(n,$t()(m),[c]),p=U().List(u),h=r.specResolvedSubtree(u),f=r.specJson().getIn(u),v=L.Map.isMap(h)?h:U().Map(),S=L.Map.isMap(f)?f:U().Map(),b=v.get("title")||S.get("title")||c,C=o.isShown(u,!1);C&&0===v.size&&S.size>0&&t.props.specActions.requestResolvedSubtree(u);var x=V().createElement(g,{name:c,expandDepth:d,schema:v||U().Map(),displayName:b,fullPath:u,specPath:p,getComponent:a,specSelectors:r,getConfigs:i,layoutSelectors:o,layoutActions:s,includeReadOnly:!0,includeWriteOnly:!0}),w=V().createElement("span",{className:"model-box"},V().createElement("span",{className:"model model-title"},b));return V().createElement("div",{id:"model-".concat(c),className:"model-container",key:"models-section-".concat(c),"data-name":c,ref:t.onLoadModel},V().createElement("span",{className:"models-jump-to-path"},V().createElement(E,{specPath:p})),V().createElement(y,{classes:"model-box",collapsedContent:t.getCollapsedContent(c),onToggle:t.handleToggle,title:w,displayName:b,modelName:c,specPath:p,layoutSelectors:o,layoutActions:s,hideSelfOnExpand:!0,expanded:d>0&&C},x))})).toArray()))}}]),n}(j.Component);const ur=function(e){var t=e.value,n=(0,e.getComponent)("ModelCollapse"),r=V().createElement("span",null,"Array [ ",t.count()," ]");return V().createElement("span",{className:"prop-enum"},"Enum:",V().createElement("br",null),V().createElement(n,{collapsedContent:r},"[ ",t.join(", ")," ]"))};var pr=["schema","name","displayName","isRef","getComponent","getConfigs","depth","onToggle","expanded","specPath"],dr=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e,t,n,r,a=this.props,o=a.schema,s=a.name,i=a.displayName,c=a.isRef,u=a.getComponent,d=a.getConfigs,m=a.depth,h=a.onToggle,g=a.expanded,v=a.specPath,y=bn()(a,pr),E=y.specSelectors,S=y.expandDepth,b=y.includeReadOnly,C=y.includeWriteOnly,x=E.isOAS3;if(!o)return null;var w=d().showExtensions,_=o.get("description"),A=o.get("properties"),k=o.get("additionalProperties"),N=o.get("title")||i||s,q=o.get("required"),R=p()(o).call(o,(function(e,t){var n;return-1!==we()(n=["maxProperties","minProperties","nullable","example"]).call(n,t)})),P=o.get("deprecated"),T=u("JumpToPath",!0),O=u("Markdown",!0),j=u("Model"),D=u("ModelCollapse"),U=u("Property"),z=function(){return V().createElement("span",{className:"model-jump-to-path"},V().createElement(T,{specPath:v}))},B=V().createElement("span",null,V().createElement("span",null,"{"),"...",V().createElement("span",null,"}"),c?V().createElement(z,null):""),J=E.isOAS3()?o.get("anyOf"):null,F=E.isOAS3()?o.get("oneOf"):null,W=E.isOAS3()?o.get("not"):null,H=N&&V().createElement("span",{className:"model-title"},c&&o.get("$$ref")&&V().createElement("span",{className:"model-hint"},o.get("$$ref")),V().createElement("span",{className:"model-title__text"},N));return V().createElement("span",{className:"model"},V().createElement(D,{modelName:s,title:H,onToggle:h,expanded:!!g||m<=S,collapsedContent:B},V().createElement("span",{className:"brace-open object"},"{"),c?V().createElement(z,null):null,V().createElement("span",{className:"inner-object"},V().createElement("table",{className:"model"},V().createElement("tbody",null,_?V().createElement("tr",{className:"description"},V().createElement("td",null,"description:"),V().createElement("td",null,V().createElement(O,{source:_}))):null,P?V().createElement("tr",{className:"property"},V().createElement("td",null,"deprecated:"),V().createElement("td",null,"true")):null,A&&A.size?M()(e=p()(t=A.entrySeq()).call(t,(function(e){var t=Ct()(e,2)[1];return(!t.get("readOnly")||b)&&(!t.get("writeOnly")||C)}))).call(e,(function(e){var t,n,r=Ct()(e,2),a=r[0],o=r[1],i=x()&&o.get("deprecated"),c=L.List.isList(q)&&q.contains(a),p=["property-row"];return i&&p.push("deprecated"),c&&p.push("required"),V().createElement("tr",{key:a,className:p.join(" ")},V().createElement("td",null,a,c&&V().createElement("span",{className:"star"},"*")),V().createElement("td",null,V().createElement(j,En()({key:l()(t=l()(n="object-".concat(s,"-")).call(n,a,"_")).call(t,o)},y,{required:c,getComponent:u,specPath:v.push("properties",a),getConfigs:d,schema:o,depth:m+1}))))})).toArray():null,w?V().createElement("tr",null,V().createElement("td",null," ")):null,w?M()(n=o.entrySeq()).call(n,(function(e){var t=Ct()(e,2),n=t[0],r=t[1];if("x-"===I()(n).call(n,0,2)){var a=r?r.toJS?r.toJS():r:null;return V().createElement("tr",{key:n,className:"extension"},V().createElement("td",null,n),V().createElement("td",null,f()(a)))}})).toArray():null,k&&k.size?V().createElement("tr",null,V().createElement("td",null,"< * >:"),V().createElement("td",null,V().createElement(j,En()({},y,{required:!1,getComponent:u,specPath:v.push("additionalProperties"),getConfigs:d,schema:k,depth:m+1})))):null,J?V().createElement("tr",null,V().createElement("td",null,"anyOf ->"),V().createElement("td",null,M()(J).call(J,(function(e,t){return V().createElement("div",{key:t},V().createElement(j,En()({},y,{required:!1,getComponent:u,specPath:v.push("anyOf",t),getConfigs:d,schema:e,depth:m+1})))})))):null,F?V().createElement("tr",null,V().createElement("td",null,"oneOf ->"),V().createElement("td",null,M()(F).call(F,(function(e,t){return V().createElement("div",{key:t},V().createElement(j,En()({},y,{required:!1,getComponent:u,specPath:v.push("oneOf",t),getConfigs:d,schema:e,depth:m+1})))})))):null,W?V().createElement("tr",null,V().createElement("td",null,"not ->"),V().createElement("td",null,V().createElement("div",null,V().createElement(j,En()({},y,{required:!1,getComponent:u,specPath:v.push("not"),getConfigs:d,schema:W,depth:m+1}))))):null))),V().createElement("span",{className:"brace-close"},"}")),R.size?M()(r=R.entrySeq()).call(r,(function(e){var t,n=Ct()(e,2),r=n[0],a=n[1];return V().createElement(U,{key:l()(t="".concat(r,"-")).call(t,a),propKey:r,propVal:a,propClass:"property"})})):null)}}]),n}(j.Component),mr=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e,t=this.props,n=t.getComponent,r=t.getConfigs,a=t.schema,o=t.depth,s=t.expandDepth,i=t.name,c=t.displayName,u=t.specPath,d=a.get("description"),m=a.get("items"),h=a.get("title")||c||i,f=p()(a).call(a,(function(e,t){var n;return-1===we()(n=["type","items","description","$$ref"]).call(n,t)})),g=n("Markdown",!0),v=n("ModelCollapse"),y=n("Model"),E=n("Property"),S=h&&V().createElement("span",{className:"model-title"},V().createElement("span",{className:"model-title__text"},h));return V().createElement("span",{className:"model"},V().createElement(v,{title:S,expanded:o<=s,collapsedContent:"[...]"},"[",f.size?M()(e=f.entrySeq()).call(e,(function(e){var t,n=Ct()(e,2),r=n[0],a=n[1];return V().createElement(E,{key:l()(t="".concat(r,"-")).call(t,a),propKey:r,propVal:a,propClass:"property"})})):null,d?V().createElement(g,{source:d}):f.size?V().createElement("div",{className:"markdown"}):null,V().createElement("span",null,V().createElement(y,En()({},this.props,{getConfigs:r,specPath:u.push("items"),name:null,schema:m,required:!1,depth:o+1}))),"]"))}}]),n}(j.Component),hr="property primitive",fr=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e,t,n,r=this.props,a=r.schema,o=r.getComponent,s=r.getConfigs,i=r.name,c=r.displayName,u=r.depth,d=r.expandDepth,m=s().showExtensions;if(!a||!a.get)return V().createElement("div",null);var h=a.get("type"),f=a.get("format"),g=a.get("xml"),v=a.get("enum"),y=a.get("title")||c||i,E=a.get("description"),S=(0,K.nX)(a),b=p()(a).call(a,(function(e,t){var n;return-1===we()(n=["enum","type","format","description","$$ref"]).call(n,t)})).filterNot((function(e,t){return S.has(t)})),C=o("Markdown",!0),x=o("EnumModel"),w=o("Property"),_=o("ModelCollapse"),A=y&&V().createElement("span",{className:"model-title"},V().createElement("span",{className:"model-title__text"},y));return V().createElement("span",{className:"model"},V().createElement(_,{title:A,expanded:u>=d,collapsedContent:" ",hideSelfOnExpand:d!==u},V().createElement("span",{className:"prop"},i&&u>1&&V().createElement("span",{className:"prop-name"},y),V().createElement("span",{className:"prop-type"},h),f&&V().createElement("span",{className:"prop-format"},"($",f,")"),b.size?M()(e=b.entrySeq()).call(e,(function(e){var t,n=Ct()(e,2),r=n[0],a=n[1];return V().createElement(w,{key:l()(t="".concat(r,"-")).call(t,a),propKey:r,propVal:a,propClass:hr})})):null,m&&S.size?M()(t=S.entrySeq()).call(t,(function(e){var t,n=Ct()(e,2),r=n[0],a=n[1];return V().createElement(w,{key:l()(t="".concat(r,"-")).call(t,a),propKey:r,propVal:a,propClass:hr})})):null,E?V().createElement(C,{source:E}):null,g&&g.size?V().createElement("span",null,V().createElement("br",null),V().createElement("span",{className:hr},"xml:"),M()(n=g.entrySeq()).call(n,(function(e){var t,n=Ct()(e,2),r=n[0],a=n[1];return V().createElement("span",{key:l()(t="".concat(r,"-")).call(t,a),className:hr},V().createElement("br",null),"   ",r,": ",String(a))})).toArray()):null,v&&V().createElement(x,{value:v,getComponent:o}))))}}]),n}(j.Component);const gr=function(e){var t=e.propKey,n=e.propVal,r=e.propClass;return V().createElement("span",{className:r},V().createElement("br",null),t,": ",String(n))};var vr=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e=this.props,t=e.onTryoutClick,n=e.onCancelClick,r=e.onResetClick,a=e.enabled,o=e.hasUserEditedBody,s=e.isOAS3&&o;return V().createElement("div",{className:s?"try-out btn-group":"try-out"},a?V().createElement("button",{className:"btn try-out__btn cancel",onClick:n},"Cancel"):V().createElement("button",{className:"btn try-out__btn",onClick:t},"Try it out "),s&&V().createElement("button",{className:"btn try-out__btn reset",onClick:r},"Reset"))}}]),n}(V().Component);E()(vr,"defaultProps",{onTryoutClick:Function.prototype,onCancelClick:Function.prototype,onResetClick:Function.prototype,enabled:!1,hasUserEditedBody:!1,isOAS3:!1});var yr=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e=this.props,t=e.bypass,n=e.isSwagger2,r=e.isOAS3,a=e.alsoShow;return t?V().createElement("div",null,this.props.children):n&&r?V().createElement("div",{className:"version-pragma"},a,V().createElement("div",{className:"version-pragma__message version-pragma__message--ambiguous"},V().createElement("div",null,V().createElement("h3",null,"Unable to render this definition"),V().createElement("p",null,V().createElement("code",null,"swagger")," and ",V().createElement("code",null,"openapi")," fields cannot be present in the same Swagger or OpenAPI definition. Please remove one of the fields."),V().createElement("p",null,"Supported version fields are ",V().createElement("code",null,"swagger: ",'"2.0"')," and those that match ",V().createElement("code",null,"openapi: 3.0.n")," (for example, ",V().createElement("code",null,"openapi: 3.0.0"),").")))):n||r?V().createElement("div",null,this.props.children):V().createElement("div",{className:"version-pragma"},a,V().createElement("div",{className:"version-pragma__message version-pragma__message--missing"},V().createElement("div",null,V().createElement("h3",null,"Unable to render this definition"),V().createElement("p",null,"The provided definition does not specify a valid version field."),V().createElement("p",null,"Please indicate a valid Swagger or OpenAPI version field. Supported version fields are ",V().createElement("code",null,"swagger: ",'"2.0"')," and those that match ",V().createElement("code",null,"openapi: 3.0.n")," (for example, ",V().createElement("code",null,"openapi: 3.0.0"),")."))))}}]),n}(V().PureComponent);E()(yr,"defaultProps",{alsoShow:null,children:null,bypass:!1});const Er=function(e){var t=e.version;return V().createElement("small",null,V().createElement("pre",{className:"version"}," ",t," "))};const Sr=function(e){var t=e.enabled,n=e.path,r=e.text;return V().createElement("a",{className:"nostyle",onClick:t?function(e){return e.preventDefault()}:null,href:t?"#/".concat(n):null},V().createElement("span",null,r))};const br=function(){return V().createElement("div",null,V().createElement("svg",{xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",className:"svg-assets"},V().createElement("defs",null,V().createElement("symbol",{viewBox:"0 0 20 20",id:"unlocked"},V().createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"})),V().createElement("symbol",{viewBox:"0 0 20 20",id:"locked"},V().createElement("path",{d:"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"})),V().createElement("symbol",{viewBox:"0 0 20 20",id:"close"},V().createElement("path",{d:"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"})),V().createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow"},V().createElement("path",{d:"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"})),V().createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow-down"},V().createElement("path",{d:"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"})),V().createElement("symbol",{viewBox:"0 0 20 20",id:"large-arrow-up"},V().createElement("path",{d:"M 17.418 14.908 C 17.69 15.176 18.127 15.176 18.397 14.908 C 18.667 14.64 18.668 14.207 18.397 13.939 L 10.489 6.109 C 10.219 5.841 9.782 5.841 9.51 6.109 L 1.602 13.939 C 1.332 14.207 1.332 14.64 1.602 14.908 C 1.873 15.176 2.311 15.176 2.581 14.908 L 10 7.767 L 17.418 14.908 Z"})),V().createElement("symbol",{viewBox:"0 0 24 24",id:"jump-to"},V().createElement("path",{d:"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"})),V().createElement("symbol",{viewBox:"0 0 24 24",id:"expand"},V().createElement("path",{d:"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"})))))};var Cr=n(2552),xr=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"render",value:function(){var e=this.props,t=e.errSelectors,n=e.specSelectors,r=e.getComponent,a=r("SvgAssets"),o=r("InfoContainer",!0),s=r("VersionPragmaFilter"),l=r("operations",!0),i=r("Models",!0),c=r("Row"),u=r("Col"),p=r("errors",!0),d=r("ServersContainer",!0),m=r("SchemesContainer",!0),h=r("AuthorizeBtnContainer",!0),f=r("FilterContainer",!0),g=n.isSwagger2(),v=n.isOAS3(),y=!n.specStr(),E=n.loadingStatus(),S=null;if("loading"===E&&(S=V().createElement("div",{className:"info"},V().createElement("div",{className:"loading-container"},V().createElement("div",{className:"loading"})))),"failed"===E&&(S=V().createElement("div",{className:"info"},V().createElement("div",{className:"loading-container"},V().createElement("h4",{className:"title"},"Failed to load API definition."),V().createElement(p,null)))),"failedConfig"===E){var b=t.lastError(),C=b?b.get("message"):"";S=V().createElement("div",{className:"info failed-config"},V().createElement("div",{className:"loading-container"},V().createElement("h4",{className:"title"},"Failed to load remote configuration."),V().createElement("p",null,C)))}if(!S&&y&&(S=V().createElement("h4",null,"No API definition provided.")),S)return V().createElement("div",{className:"swagger-ui"},V().createElement("div",{className:"loading-container"},S));var x=n.servers(),w=n.schemes(),_=x&&x.size,A=w&&w.size,k=!!n.securityDefinitions();return V().createElement("div",{className:"swagger-ui"},V().createElement(a,null),V().createElement(s,{isSwagger2:g,isOAS3:v,alsoShow:V().createElement(p,null)},V().createElement(p,null),V().createElement(c,{className:"information-container"},V().createElement(u,{mobile:12},V().createElement(o,null))),_||A||k?V().createElement("div",{className:"scheme-container"},V().createElement(u,{className:"schemes wrapper",mobile:12},_?V().createElement(d,null):null,A?V().createElement(m,null):null,k?V().createElement(h,null):null)):null,V().createElement(f,null),V().createElement(c,null,V().createElement(u,{mobile:12,desktop:12},V().createElement(l,null))),V().createElement(c,null,V().createElement(u,{mobile:12,desktop:12},V().createElement(i,null)))))}}]),n}(V().Component);const wr=require("react-debounce-input");var _r=n.n(wr),Ar={value:"",onChange:function(){},schema:{},keyName:"",required:!1,errors:(0,L.List)()},kr=function(e){Se()(n,e);var t=Ce()(n);function n(){return b()(this,n),t.apply(this,arguments)}return x()(n,[{key:"componentDidMount",value:function(){var e=this.props,t=e.dispatchInitialValue,n=e.value,r=e.onChange;t?r(n):!1===t&&r("")}},{key:"render",value:function(){var e,t=this.props,n=t.schema,r=t.errors,a=t.value,o=t.onChange,s=t.getComponent,i=t.fn,c=t.disabled,u=n&&n.get?n.get("format"):null,p=n&&n.get?n.get("type"):null,d=function(e){return s(e,!1,{failSilently:!0})},m=p?d(u?l()(e="JsonSchema_".concat(p,"_")).call(e,u):"JsonSchema_".concat(p)):s("JsonSchema_string");return m||(m=s("JsonSchema_string")),V().createElement(m,En()({},this.props,{errors:r,fn:i,getComponent:s,value:a,onChange:o,schema:n,disabled:c}))}}]),n}(j.Component);E()(kr,"defaultProps",Ar);var Nr=function(e){Se()(n,e);var t=Ce()(n);function n(){var e,r;b()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s0),v=o.getIn(["items","enum"]),y=o.getIn(["items","type"]),E=o.getIn(["items","format"]),S=o.get("items"),b=!1,C="file"===y||"string"===y&&"binary"===E;y&&E?u=r(l()(d="JsonSchema_".concat(y,"_")).call(d,E)):"boolean"!==y&&"array"!==y&&"object"!==y||(u=r("JsonSchema_".concat(y)));if(u||C||(b=!0),v){var x=r("Select");return V().createElement(x,{className:s.length?"invalid":"",title:s.length?s:"",multiple:!0,value:f,disabled:c,allowedValues:v,allowEmptyValue:!a,onChange:this.onEnumChange})}var w=r("Button");return V().createElement("div",{className:"json-schema-array"},g?M()(f).call(f,(function(e,n){var a,o=(0,L.fromJS)($t()(M()(a=p()(s).call(s,(function(e){return e.index===n}))).call(a,(function(e){return e.error}))));return V().createElement("div",{key:n,className:"json-schema-form-item"},C?V().createElement(Rr,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:o,getComponent:r}):b?V().createElement(qr,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:o}):V().createElement(u,En()({},t.props,{value:e,onChange:function(e){return t.onItemChange(e,n)},disabled:c,errors:o,schema:S,getComponent:r,fn:i})),c?null:V().createElement(w,{className:"btn btn-sm json-schema-form-item-remove ".concat(h.length?"invalid":null),title:h.length?h:"",onClick:function(){return t.removeItem(n)}}," - "))})):null,c?null:V().createElement(w,{className:"btn btn-sm json-schema-form-item-add ".concat(m.length?"invalid":null),title:m.length?m:"",onClick:this.addItem},"Add ",y?"".concat(y," "):"","item"))}}]),n}(j.PureComponent);E()(Ir,"defaultProps",Ar);var qr=function(e){Se()(n,e);var t=Ce()(n);function n(){var e,r;b()(this,n);for(var a=arguments.length,o=new Array(a),s=0;s + + + Swagger UI: OAuth2 Redirect + + + + + diff --git a/benchmarks/input_scanners/index.html b/benchmarks/input_scanners/index.html new file mode 100644 index 00000000..7135ca82 --- /dev/null +++ b/benchmarks/input_scanners/index.html @@ -0,0 +1,990 @@ + + + + + + + + + + + + + + +Input scanners - LLM Guard + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+
+

Input scanners benchmarks

+
+

Info

+

Reference code: https://github.com/laiyer-ai/llm-guard/blob/main/benchmarks/scan_prompt_latency.py

+
+

Test environment

+
    +
  • Platform: Linux
  • +
  • Python Version: 3.10.2
  • +
+

Setup

+ +

Instance type: AWS m6g.large (Graviton)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test TypePrompt (Trimmed)Min (ms)Max (ms)Mean (ms)MedianStdDev (ms)
BasicMake an SQL insert statement...360.56404.38369.66361.0919.41
BasicFor some reason, the assistant is...517.72521.56519.09518.671.52
IntermediateMake an SQL insert statement...1,221.921,2271,224.711,225.432.03
IntermediateFor some reason, the assistant is...1,549.822,325.641,929.781,919.46306.18
AdvancedMake an SQL insert statement...2,167.892,180.682,172.992,172.055.07
AdvancedFor some reason, the assistant is...2,662.042,879.552,764.912,757.0886.88
+

AWS m5.large instance

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test TypePrompt (Trimmed)Min (ms)Max (ms)Mean (ms)MedianStdDev (ms)
BasicMake an SQL insert statement...211.75252.38220.28212.7117.94
BasicFor some reason, the assistant is...317.44323.65320.08318.842.92
IntermediateMake an SQL insert statement...620.28632.61627.26629.04.8
IntermediateFor some reason, the assistant is...782.691,101.70937.67924.63127.35
AdvancedMake an SQL insert statement...1,145.411,184.171,160.31,157.2214.63
AdvancedFor some reason, the assistant is...1,377.931,514.381,449.141,448.9652.77
+

AWS inf1.xlarge instance

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test TypePrompt (Trimmed)Min (ms)Max (ms)Mean (ms)MedianStdDev (ms)
BasicMake an SQL insert statement...112.86139.02118.21112.9311.63
BasicFor some reason, the assistant is...164.84171.22166.99166.712.6
IntermediateMake an SQL insert statement...312.64321.35314.9313.263.65
IntermediateFor some reason, the assistant is...399.14540.05471.80474.0155.17
AdvancedMake an SQL insert statement...564.13612.13574.33564.8021.15
AdvancedFor some reason, the assistant is...665.89729.69694.36689.3725.19
+

AWS g5.xlarge (one GPU) instance

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test TypePrompt (Trimmed)Min (ms)Max (ms)Mean (ms)MedianStdDev (ms)
BasicMake an SQL insert statement...170.26195.82175.55170.5511.33
BasicFor some reason, the assistant is...253.73254.86254.03253.840.47
IntermediateMake an SQL insert statement...190.79236.65200.25191.020.35
IntermediateFor some reason, the assistant is...274.39275.61274.99275.00.44
AdvancedMake an SQL insert statement...208.22209.8208.72208.410.63
AdvancedFor some reason, the assistant is...292.70294.24293.2292.990.51
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/benchmarks/output_scanners/index.html b/benchmarks/output_scanners/index.html new file mode 100644 index 00000000..e85ded63 --- /dev/null +++ b/benchmarks/output_scanners/index.html @@ -0,0 +1,882 @@ + + + + + + + + + + + + + + +Output scanners - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+
+

Output scanners benchmarks

+
+

Info

+

Reference code: https://github.com/laiyer-ai/llm-guard/blob/main/benchmarks/scan_output_latency.py

+
+

Test environment

+
    +
  • Platform: Linux
  • +
  • Python Version: 3.10.2
  • +
+

Setup

+ +

Instance type: AWS m6g.large (Graviton)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test TypePrompt (Trimmed)Min (ms)Max (ms)Mean (ms)MedianStdDev (ms)
BasicINSERT INTO users (Name, Email...338.90370.01345.97339.74213.47
IntermediateINSERT INTO users (Name, Email...1,221.921,2271,224.711,225.432.03
AdvancedINSERT INTO users (Name, Email...4,037.64,170.94,074.34,056.45.49
+

AWS m5.large instance

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test TypePrompt (Trimmed)Min (ms)Max (ms)Mean (ms)MedianStdDev (ms)
BasicINSERT INTO users (Name, Email...206.15256.63216.35206.2522.51
IntermediateINSERT INTO users (Name, Email...734.10745.58740.73740.844.58
AdvancedINSERT INTO users (Name, Email...2,331.62,500.72,373.02,338.77.2
+

AWS inf1.xlarge instance

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test TypePrompt (Trimmed)Min (ms)Max (ms)Mean (ms)MedianStdDev (ms)
BasicINSERT INTO users (Name, Email...107.29156.32117.88108.4321.5
IntermediateINSERT INTO users (Name, Email...388.51397.73392.32391.633.44
AdvancedINSERT INTO users (Name, Email...816.51913.67837.71819.9842.49
+

AWS g5.xlarge (one GPU) instance

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test TypePrompt (Trimmed)Min (ms)Max (ms)Mean (ms)MedianStdDev (ms)
BasicINSERT INTO users (Name, Email...164.34181.26167.95164.597.44
IntermediateINSERT INTO users (Name, Email...180.81226.96190.12180.9320.59
AdvancedINSERT INTO users (Name, Email...247.23253.97248.65247.342.97
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/best_practices/index.html b/best_practices/index.html new file mode 100644 index 00000000..414d1294 --- /dev/null +++ b/best_practices/index.html @@ -0,0 +1,705 @@ + + + + + + + + + + + + + + +Best practices - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+
+

Best Practices

+

Performance Optimization

+
    +
  1. +

    Benchmark Analysis: Before choosing the scanners, it's crucial to understand their performance on different instances. Review the benchmarks for input and output scanners to make an informed decision based on your specific requirements.

    +
  2. +
  3. +

    Model Size Trade-off: Opting for smaller models will expedite processing, reducing latency. However, this comes at the cost of accuracy. We are actively working on providing compact versions with minimal accuracy trade-offs.

    +
  4. +
+

Serving Configurations

+
    +
  1. +

    Fast Failure Mode: Enable the fail_fast mode while serving to ensure early exits, preventing the wait for all scanners to complete, thus optimizing the response time.

    +
  2. +
  3. +

    Scanner Selection: Assess the relevance of different scanners for your use-case. Instead of employing all scanners synchronously, which might overwhelm the system, consider using them asynchronously. This approach enhances observability, aiding in precise debugging and performance monitoring.

    +
  4. +
+

Observability and Debugging

+
    +
  1. Logging and Metrics: Implement robust logging and metric collection to monitor the system's performance and health.
  2. +
+

Continuous Improvement

+
    +
  1. +

    Feedback Loops: Establish feedback loops with your system's users to understand how the library is performing in real-world scenarios, and to gather suggestions for improvements.

    +
  2. +
  3. +

    Regular Updates and Testing: Stay updated with the latest versions of llm-guard, and ensure thorough testing in a staging environment before rolling out updates in a production setup.

    +
  4. +
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/customization/add_scanner/index.html b/customization/add_scanner/index.html new file mode 100644 index 00000000..7996751f --- /dev/null +++ b/customization/add_scanner/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + +Add scanner - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+

Adding a new scanner

+

LLM Guard can be extended to support new scanners, and to support additional models for the existing. These scanners could be added via code or ad-hoc as part of the request.

+
+

Note

+

Before writing code, please read the contributing guide.

+
+

Extending the input (prompt) scanners

+
    +
  1. Create a new class in the llm_guard/input_scanners that inherits from base.Scanner and implements the scan method. The scan method should return a tuple str, bool, float.
  2. +
  3. Add test cases for the new scanner in tests/input_scanners.
  4. +
  5. Add the new scanner to the llm_guard/input_scanners/__init__.py __all__ enum.
  6. +
  7. Write documentation in the docs/input_scanners folder and add a link to the mkdocs.yml file.
  8. +
  9. Also, add a link to the documentation in README.md, and update the CHANGELOG.md file.
  10. +
+

Extending the output scanners

+
    +
  1. Create a new class in the llm_guard/output_scanners that inherits from base.Scanner and implements the scan method. The scan method should return a tuple str, bool, float.
  2. +
  3. Add test cases for the new scanner in tests/output_scanners.
  4. +
  5. Add the new scanner to the llm_guard/output_scanners/__init__.py __all__ enum.
  6. +
  7. Write documentation in the docs/output_scanners folder and add a link to the mkdocs.yml file.
  8. +
  9. Also, add a link to the documentation in README.md, and update the CHANGELOG.md file.
  10. +
+
+

Info

+

You can use existing scanners as a reference.

+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a75b90276f61d229bba9c42bce1194db48c0414f GIT binary patch literal 15086 zcmeI33shC-mB$ZiuxMH&#^+>3Y|X^9O&il>R=UOpBZ!DR1TGgY5H2ry`G}@zOi+0! z4+Z6-7&|7bH8ZZPahj%WUM^azrLk!y6N9F%WD-XmqKPrD5sg()IA?zQJLg;;MJ`;m zP1h3F_Pd93zw`g^{q1jm``h0^(*m^N+Ff^Pw4vJ0+cfQ;G))T)wXVl#+A)4NhF0zu zj?lDfzA&Bd&_&BaFz>!r~khHWmKdG>;ATehB z!i1^o3zCL^S-IC2Cy(D)l)Mb?{|WCiNEc$j-Kfn^ya4|rwfPB8tY5fbh9@sE;LD^( zeX;XC?7j#7o$!aV@U|t$&KG*@waq{d8#@mreD3Uwhj%&&imp0zR6wL{)3Ih z$q7F#$ryA@f&WzO-h>E$qcS_@B2rqN8$$+h?S3{baovjFylQjD=AR*{{vcN6#@z<@ zeegEcX3ZBly*7J(l0VNHOrOn5U4d}ljNmiM?(O)^!<&m;!v@p8zwf~RUU?aEz$SPaIoYka#z`Yflcfp&r z)?RN}YxBJ86)|7MOS8?6#n)qY;qOjlH1?l{{ol6uqeIlsD%{b3F;@QQvw2BcNW-Gk zX5lWj$A5M;V0&~ZhyRC&nJd6s_+xj;70$!`Q{<#&`?K)x>Je`Y_#^Yr!~GYPS@XY# z{g>i9op2ZaZAiF3eEar+dmQopyk+}8<2#k)3cKLnRcCWANYce;u>G_6|1v($MTfiB z<;CBD+=&kNBbn&11s&dkdxv+<;`iA882n4{okQghMj2(MJXw`B-{*SLmv7JOhQ(@~ zecGP0a6W?^7n>`)7pfes75`a_d>da1?AgEX=epe3VdM>yh?$x2--lc>=dJSnHvH#= z$$u_7%>7?P&9T1E8SHiaqLi-_bB=cNXYO|AX&2Gq=gi$1^-EHQ97EAz9Q;exW<`G@ zI$(S88{w^_G$XRBEF&^^uw4859)6R8-&|Dui&V^4xek7F9`4oT4(z=B|EbN59|r$8 z?0!VeUHqmr!^_`TogVqjnvA)AugUOlu>4-}7Te=L9dKX6x_i~~ceu~N_N~fy;4eDB z-6&0ue5Wj9?mzfrA-InwX8x|*ci?XF-%k5gf1Wu|ALeWZzH?Um2j5ZrSEtW8Tbe#+ z=0N=}cMrSc`_5zaw%?fC4`Kf+np2mqs`;aqYe>h9L z=_I}sUk;yGA4rV66`4iM%qCX;s4^#Zb!B#JNmX`iG4nN+b@rQ;S?0Ri-*d_zoO=hh zKWcFo{>G}bh|2!H>+5&ee}VXV5B>+qZzlKc$GSV2Sf9z>a3|aklP8>$waU)#CBKBf zPAf70B(j%yvyyoKU2=$CbMxPpxdPx`XYv;AivQCU?#Lm>H}acYxOXv64H0x%*ONPS zg_~KYmaw-y0QZaDTtV#(?Yv%cdzIfyj<51$E8gp@wI`XkPtbm+YGJH*?|}X9hkx73 zv+0r0+`wf47gza)EdCFDBzO&4SE8TS7Z z>+Bx5zeM}%s_dB8;eP_#w5vB4ud}u8E-w@lI{3CX+az%{n zX}iIEhWm1BZz#4uj!dgBOd7^In{DO_W=*6<@m|n|4llyLux4TW-Q>v=_#6cH5$p>C zYjR>k(BU@xKY@6^6`LPpzUuZ`OT26+PHuzygzB8AVesF9-`n>8U5P7v$gvvxFIRqJ z<_d2zcPDNrOj=TxpVZc!Vmugul|k72eD^44FUNm)p4lvF8=+z6d!@eulp&+n-__mNO6h+IO#c5Ir*I&4T+M zd&GMk?mt=Sidc&nD_!9t&B&1X!@Vc}kKz6id{vH&y<3Sn3pN!e4>>OM9V7UE1O6|; z+lrTSE@1Z~aMtk~#s9IC2mIjgfWMVzTD3rn|0noLLSG(Na*Yn5@ZT#s*z;Dnn=-rk zvDDc^=U)W>BK9U`j%?ufV*888Bby52uh{N=^(EiA2mVJ*pO3J(iw?7!A5R^+{l)+B z`|did={vjNAJP~5YF)2Ro3j-Dm&ETa+Z!dRvztr&;E(OS{4Kxvf;Q%AaqaIp#QE{? zf6eCqcAvIWQ&L-}L|5eXB`|3g5S%&R(>~7fn{h7bS8)Bnb z!#Cr7;t%^`U5jgC{he?>xzcrI{FVK?ZGVP%=~o^;R2^5Ph2Mz(>{a$pdBDK-%_V-s z&))nK{)d=3WvE>I`9Aq|0NnotzZc(E{_oHH?Ztm#!khSh=(@awF`Pq$tj~)NsV1i( z&k3o?jpcKU67t~?avW2#qC?1aLMo6l_dF$~nNcBSA{j_}RLCkcg*>N)y&*EUg**+3G$lQ}_D>sI}%8}u2)kMs?h~zo8*lVq;-zkiikUhwQ^)U>Jm#EbtVo{q(vKWr1J=d*n`avek|x66g=FFLZv4hAEo0#3 z?7{ZM2U;(br+iYm%H==zVc0Q;wLbtZ_Vv$4cVq8sW(u! z$_M)t*iy4S0sb>c9eV!^eBK`+kI0QbP7dKBce`r)V6aC}vs?!LS@3nRUt|wBgPNH- z1EWqe0=>V_`nlK2Up{9I&1PM_DjcZyW`iyD>Mrn~LdNxHSMYBE|39qU=~L=*iT!pL zcP}&Udyp5g`&R1edE`vf*W|_quvZ8tSN)7U=^`@Za|+JYr-J{kc`lt?g1_AZ_ICVT zYJ)mDtNb7Ao_Vv>@;^ZLt;l!LyB2K8lmDwCGipLl+xq&9?U#cux*x&rb!xtu^``US zzmD#knR5@}<9Ybqa?zi0Z{hsdu45k&eDd56$#FXow=YclKDfc0t-fN7d)tP>WI2=U zME5<&0>(YWQ|$1LxAbc$ObP)1X7E!P_dkNIqx(5@SLa^TZl5pDm^-Mw3i#h=+|~Oe z=q|D50#b|bkF_}t)N zYuxj0ME9-Wv$s%ZmR;bd+xIWmZdsZUfZcy$*W5GXQoo&9%xte;{1ng+HW)aqF(PM*|>JgxK9NCU3^V!|7b&@L(Y^^ z!G1^12AJ=i%()}1bI;-LwVWfBQJdI^{?DU-E7)C(JA29~+0(~tU*-r9yPNyqh}YSZ z4Hyf-pM>s*sqxGEvdPRh-cwFIW5t`d(7y=$DeLp&d)bjO2&5)54g80h>+j0h346j% zvArAoJPUunFMRZ#1omOD+ri#}oCdp-asOA&M?!5o4b&3rri1?+b!$2EI0g1I?4!HD z_KAeH9dUEZJB28ZB*F#FyEe;n955vf63GHcG^``H5zXn&=Dk>fDfsy+^O zGvZzM`r-_9jqRsW!+8_k&6;=W?ETbmeBe7Kqr1Wf_Z$*C5QeXN=$?t)J2)$ln(u!0 z{{!NKJsI5(gDdZg?M1GrE)D)T@ZUslsr&4wcI69yQV;x6U-}K^K4ZUWu=uR=HomO! zj=?LF|33-qC?tMqlj-k@GNAU^sBfzNw#37d$u9ue?8U@Jj?5Bht^?L6Rn zi1Qxw_n^NA{XOXJ0o%izL&81S-h=+gtWDq-P_rBI`v$(o_wV_>S)bv5J&eKxMUOTL z7AH;^#%pH`!_#gUQ##9xnYWhdS;NBgfab8y;C2c!{G%KrrI>a-%+uaF($mpg;py0G@aivZn$xSHYtyA<`*|_23hrj2!LHvgG$(wih z=%Q}3){bC}C!cjZi_iTUpI^&d8`L{x><}M@n{rdlz#h3+y7W=h6QT`o2gWRI@rQ;xFvc zxHMxJ{kPIzY6v@dN9h21?*jWd_D`>Z{RigN)6DC4nAhL7x!Em!L+N`I-e>49?-x%8 zKal!0?|;VL1a>+x=@9u(7x~X4c0ao%ua6kW@$uGfOMjT=74)68%BjiRa!R9@M#1{HT)Dxb245|u$}1bpl=0z4-zwb^#?lzy?2xU%HMe4r!h_R zZ$j@T`Zr;>CSq?B{eQ#x+EXi%!+PayQmdhV5comZd=&UW#PT3=#!=Wk2<%aCA4UIB z#BA@oRR#r6ojPdOc1^omkCMLs E4>IHdV*mgE literal 0 HcmV?d00001 diff --git a/img/flow.png b/img/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2b9b46b791a59529f8abf09d0a01a97127bad5 GIT binary patch literal 122573 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 + + + + + + + + + + + +LLM Guard + + + + + + + + + + + + + + + + +

+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+
+

LLM Guard - The Security Toolkit for LLM Interactions

+

LLM Guard by Laiyer.ai is a comprehensive tool designed to fortify the security of Large Language Models (LLMs).

+

What is LLM Guard?

+

LLM-Guard

+

By offering sanitization, detection of harmful language, prevention of data leakage, and resistance against prompt +injection attacks, LLM-Guard ensures that your interactions with LLMs remain safe and secure.

+

Demo

+

Installation

+

Begin your journey with LLM Guard by downloading the package and acquiring the en_core_web_trf spaCy model (essential +for the Anonymize scanner):

+
pip install llm-guard
+python -m spacy download en_core_web_trf
+
+

Getting Started

+

Important Notes:

+
    +
  • LLM Guard is designed for easy integration and deployment in production environments. While it's ready to use + out-of-the-box, please be informed that we're constantly improving and updating the repository.
  • +
  • Base functionality requires a limited number of libraries. As you explore more advanced features, necessary libraries + will be automatically installed.
  • +
  • Ensure you're using Python version 3.8.1 or higher. Confirm with: python --version.
  • +
  • Library installation issues? Consider upgrading pip: python -m pip install --upgrade pip.
  • +
+

Examples:

+ +

Roadmap

+

General

+
    +
  • Extend language support to cover popular and emerging languages, prioritize based on community feedback.
  • +
  • Allow comparison of multiple outputs to facilitate better analysis and choice.
  • +
  • Enable scanning of logits to support streaming mode.
  • +
  • Expand examples and integrations, ensuring they cover common use-cases and are easy to follow.
  • +
+

Latency

+
    +
  • Implement parallel scanning using multiprocessing to significantly reduce scanning time.
  • +
  • Provide an option to utilize lighter models for quicker scanning, while maintaining an acceptable level of accuracy.
  • +
  • Incorporate LRU cache to optimize performance by reusing previous results where applicable.
  • +
+

Prompt Scanners

+
    +
  • Allow language restriction to focus scanning efforts and improve accuracy.
  • +
  • Utilize expressions for code detection to reduce dependency on models, improving speed and reliability.
  • +
  • Integrate yara for secret detection to enhance security scanning capabilities.
  • +
  • Sanitize text.
  • +
  • Support a variety of token calculators to offer more flexibility and compatibility.
  • +
+

Output Scanners

+
    +
  • Sanitize text to maintain a clean, accurate scanning process.
  • +
  • Validate output formats like JSON, XML to ensure they adhere to standards.
  • +
  • Incorporate factual consistency checking to uphold the reliability of the data.
  • +
  • Scan for vulnerable libraries and provide recommendations for safer alternatives.
  • +
  • Check for license compliance to ensure legal integrity.
  • +
  • Detect insecure code patterns.
  • +
  • Identify potential SQL injection points to enhance security.
  • +
  • Verify links and provide options for whitelisting or blacklisting to maintain the quality of references.
  • +
+

Contributing

+

Got ideas, feedback, or wish to contribute? We'd love to hear from you! Email us.

+

For detailed guidelines on contributions, kindly refer to our contribution guide.

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/anonymize/index.html b/input_scanners/anonymize/index.html new file mode 100644 index 00000000..72b071e5 --- /dev/null +++ b/input_scanners/anonymize/index.html @@ -0,0 +1,731 @@ + + + + + + + + + + + + + + +Anonymize - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Anonymize Scanner

+

It meticulously inspects user prompts, ensuring that they are free of any sensitive information +before being processed by the language model.

+

Attack

+

Sometimes, Language Learning Models (or LLMs) can accidentally share private info from the prompts they get. This can be +bad because it might let others see or use this info in the wrong way.

+

To stop this from happening, we use the Anonymize scanner. It makes sure user prompts don’t have any private details +before the model sees them.

+

Usage

+

When you use the Anonymize scanner, you can talk to LLMs without worrying about accidentally sharing private info.

+

The scanner uses a tool called the Presidio Analyzer library. This tool, built +with Python's spaCy, is good at finding private info in text.

+
+

Note

+

It uses transformers based model en_core_web_trf which uses a more modern deep-learning architecture, but is generally +slower than the default en_core_web_lg model.

+
+

On top of that, the Anonymize scanner can also understand special patterns to catch anything the Presidio Analyzer might +miss.

+

Entities

+
+

Note

+

Entity detection only works in English right now

+
+ +

Configuring

+

First, set up the Vault. It keeps a record of the info we redact:

+
from llm_guard.vault import Vault
+
+vault = Vault()
+
+

Then, set up the Anonymize scanner with some options:

+
from llm_guard.input_scanners import Anonymize
+
+scanner = Anonymize(vault, preamble="Insert before prompt", allowed_names=["John Doe"], hidden_names=["Test LLC"])
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+

Here's what those options do:

+
    +
  • preamble tells the LLM to ignore certain things.
  • +
  • hidden_names are names we change to something like [REDACTED_CUSTOM_1].
  • +
  • You can also choose specific types of info to hide using entity_types.
  • +
  • If you want, you can use your own patterns by giving the path in regex_pattern_groups_path.
  • +
  • use_faker will replace applicable entities with fake ones.
  • +
+

If you want to see the original info again, you can use the Deanonymizer.

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/ban_substrings/index.html b/input_scanners/ban_substrings/index.html new file mode 100644 index 00000000..2d6200d4 --- /dev/null +++ b/input_scanners/ban_substrings/index.html @@ -0,0 +1,678 @@ + + + + + + + + + + + + + + +Ban Substrings - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Ban Substrings Scanner

+

Ensure that specific undesired substrings never make it into your prompts with the BanSubstrings scanner.

+

How it works

+

It is purpose-built to screen user prompts, ensuring none of the banned substrings are present. +Users have the flexibility to enforce this check at two distinct granularity levels:

+
    +
  • +

    String Level: The banned substring is sought throughout the entire user prompt.

    +
  • +
  • +

    Word Level: The scanner exclusively hunts for whole words that match the banned substrings, ensuring no individual + standalone words from the blacklist appear in the prompt.

    +
  • +
+

Additionally, the scanner can be configured to replace the banned substrings with [REDACT] in the model's output.

+

Usage

+
from llm_guard.input_scanners import BanSubstrings
+
+scanner = BanSubstrings(substrings=["forbidden", "unwanted"], match_type="word", case_sensitive=False, redact=False, contains_all=False)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+

In the above configuration, is_valid will be False if the provided prompt contains any of the banned substrings as +whole words. To ban substrings irrespective of their word boundaries, simply change the mode to str.

+

There is also a dataset prepared of harmful substrings for +prompts: prompt_stop_substrings.json

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/ban_topics/index.html b/input_scanners/ban_topics/index.html new file mode 100644 index 00000000..7e9df835 --- /dev/null +++ b/input_scanners/ban_topics/index.html @@ -0,0 +1,681 @@ + + + + + + + + + + + + + + +Ban Topics - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Ban Topics Scanner

+

It is a proactive tool aimed at restricting specific topics, such as religion, from being introduced in the prompts. +This ensures that interactions remain within acceptable boundaries and avoids potentially sensitive or controversial +discussions.

+

Attack

+

Certain topics, when used as prompts for Language Learning Models, can lead to outputs that might be deemed sensitive, +controversial, or inappropriate. By banning these topics, service providers can maintain the quality of interactions and +reduce the risk of generating responses that could lead to misunderstandings or misinterpretations.

+

How it works

+

It relies on the capabilities of the model: MoritzLaurer/DeBERTa-v3-base-mnli-fever-docnli-ling-2c. +This model aids in identifying the underlying theme or topic of a prompt, allowing the scanner to cross-check it against +a list of banned topics.

+

Usage

+
from llm_guard.input_scanners import BanTopics
+
+scanner = BanTopics(topics=["violence"], threshold=0.5)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/code/index.html b/input_scanners/code/index.html new file mode 100644 index 00000000..1357f7ff --- /dev/null +++ b/input_scanners/code/index.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + + +Code - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Code Scanner

+

It is specifically engineered to inspect user prompts and discern if they contain code snippets. It can be particularly +useful in platforms that wish to control or monitor the types of programming-related content being queried or in +ensuring the appropriate handling of such prompts.

+

Attack

+

There are scenarios where the insertion of code in user prompts might be deemed undesirable. Users might be trying to +exploit vulnerabilities, test out scripts, or engage in other activities that are outside the platform's intended scope. +Monitoring and controlling the nature of the code can be crucial to maintain the integrity and safety of the system.

+

How it works

+

Utilizing the prowess of +the huggingface/CodeBERTa-language-id model, the scanner can +adeptly identify code snippets within prompts across various programming languages. Developers can configure the scanner +to either whitelist or blacklist specific languages, thus retaining full control over which types of code can appear in +user queries.

+
+

Note

+

The scanner is currently limited to extracting and detecting code snippets from Markdown in the following languages:

+
    +
  • Go
  • +
  • Java
  • +
  • JavaScript
  • +
  • PHP
  • +
  • Python
  • +
  • Ruby
  • +
+
+

Usage

+
from llm_guard.input_scanners import Code
+
+scanner = Code(denied=["python"])
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/language/index.html b/input_scanners/language/index.html new file mode 100644 index 00000000..2d8e75e9 --- /dev/null +++ b/input_scanners/language/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + +Language - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Language Scanner

+

This scanner identifies and assesses the authenticity of the language used in prompts.

+

Attack

+

With the rise of sophisticated LLMs, there has been an increase in attempts to manipulate or "confuse" these models. +Some common tactics employed by users to attack LLMs include:

+
    +
  • Jailbreaks and Prompt Injections in different languages. For example, by utilizing unique aspects of the Japanese + language to try and confuse the model.
  • +
  • Encapsulation & Overloading: Using excessive code or surrounding prompts with a plethora of special characters to + overload or trick the model.
  • +
+

The Language Scanner is designed to identify such attempts, assess the authenticity of the language used.

+

How it works

+

At its core, the scanner leverages the capabilities of langdetect library. +The primary function of the scanner is to analyze the input prompt, determine its language, and check if it's in the +list.

+
+

Info

+

Supported languages: ['af', 'ar', 'bg', 'bn', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en', 'es', 'et', 'fa', 'fi', 'fr', 'gu', 'he', 'pt', 'ro', 'ru', 'sk', 'sl', 'so', 'sq', 'sv', 'sw', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur', 'vi', 'zh-cn', 'zh-tw'].

+
+

Usage

+
from llm_guard.input_scanners import Language
+
+scanner = Language(valid_languages=["en", ...])  # Add other valid languages as needed
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/prompt_injection/index.html b/input_scanners/prompt_injection/index.html new file mode 100644 index 00000000..fab9f9a7 --- /dev/null +++ b/input_scanners/prompt_injection/index.html @@ -0,0 +1,727 @@ + + + + + + + + + + + + + + +Prompt Injection - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Prompt Injection Scanner

+

It is specifically tailored to guard against crafty input manipulations targeting large +language models (LLM). By identifying and mitigating such attempts, it ensures the LLM operates securely without +succumbing to injection attacks.

+

Attack

+

Injection attacks, especially in the context of LLMs, can lead the model to perform unintended actions. There are two +primary ways an attacker might exploit:

+
    +
  • +

    Direct Injection: Directly overwrites system prompts.

    +
  • +
  • +

    Indirect Injection: Alters inputs coming from external sources.

    +
  • +
+
+

Info

+

As specified by the OWASP Top 10 LLM attacks, this vulnerability is categorized under:

+

LLM01: Prompt Injection - It's crucial to +monitor and validate prompts rigorously to keep the LLM safe from such threats.

+
+

How it works

+

There are two versions: one popular model and another new fine-tuned model but larger and slower.

+

While the dataset is nascent, it can be enriched, drawing from repositories of known attack patterns, notably +from platforms like JailbreakChat.

+

v1

+

It leverages the +model JasperLS/deberta-v3-base-injection for its operation.

+
+

Warning

+

It's worth noting that while the current model can detect attempts effectively, it might occasionally yield false positives.

+
+

Usage:

+
from llm_guard.input_scanners import PromptInjection
+
+scanner = PromptInjection(threshold=0.5)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+

v2

+

It is based on larger RoBERTa-large model hubert233/GPTFuzz.

+

Usage:

+
from llm_guard.input_scanners import PromptInjectionV2
+
+scanner = PromptInjectionV2(threshold=0.5)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/regex/index.html b/input_scanners/regex/index.html new file mode 100644 index 00000000..0d237888 --- /dev/null +++ b/input_scanners/regex/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + +Regex - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Regex Scanner

+

This scanner designed to scrutinize the prompt based on predefined regular expression +patterns. With the capability to define desirable ("good") or undesirable ("bad") patterns, users can fine-tune +the validation of prompts.

+

Additionally, it can redact matched substring with [REDACTED] string.

+

How it works

+

The scanner uses two primary lists of regular expressions: good_patterns and bad_patterns.

+
    +
  • Good Patterns: If the good_patterns list is provided, the prompt is considered valid as long as any of + the patterns in this list match the output. This is particularly useful when expecting specific formats or keywords in + the output.
  • +
  • Bad Patterns: If the bad_patterns list is provided, the model's output is considered invalid if any of the + patterns in this list match the output. This is beneficial for filtering out unwanted phrases, words, or formats from + the model's responses.
  • +
+

The scanner can function using either list independently.

+

Usage

+
from llm_guard.input_scanners import Regex
+
+scanner = Regex(bad_patterns=[r"Bearer [A-Za-z0-9-._~+/]+"], redact=True)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/secrets/index.html b/input_scanners/secrets/index.html new file mode 100644 index 00000000..7879cc77 --- /dev/null +++ b/input_scanners/secrets/index.html @@ -0,0 +1,714 @@ + + + + + + + + + + + + + + +Secrets - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Secrets Scanner

+

This scanner diligently examines user inputs, ensuring that they don't carry any secrets before they are processed by +the language model.

+

Attack

+

Large Language Models (LLMs), when provided with user inputs containing secrets or sensitive information, might +inadvertently generate responses that expose these secrets. This can be a significant security concern as this sensitive +data, such as API keys or passwords, could be misused if exposed.

+

To counteract this risk, we employ the Secrets scanner. It ensures that user prompts are meticulously scanned and any +detected secrets are redacted before they are processed by the model.

+

Usage

+

While communicating with LLMs, the scanner acts as a protective layer, ensuring that your sensitive data remains +confidential.

+

This scanner leverages the capabilities of the detect-secrets library, a tool +engineered by Yelp, to meticulously detect secrets in strings of text.

+

Types of secrets

+
    +
  • API Tokens (e.g., AWS, Azure, GitHub, Slack)
  • +
  • Private Keys
  • +
  • High Entropy Strings (both Base64 and Hex) + ... and many more
  • +
+

Getting started

+
from llm_guard.input_scanners import Secrets
+
+scanner = Secrets(redact_mode=Secrets.REDACT_PARTIAL)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+

Here's what those options do:

+
    +
  • detect_secrets_config: This allows for a custom configuration for the detect-secrets library.
  • +
  • redact_mode: It defines how the detected secrets will be redacted—options include partial redaction, complete + hiding, or replacing with a hash.
  • +
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/sentiment/index.html b/input_scanners/sentiment/index.html new file mode 100644 index 00000000..ed5c01e3 --- /dev/null +++ b/input_scanners/sentiment/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + +Sentiment - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Sentiment Scanner

+

It scans and evaluates the overall sentiment of prompts using the SentimentIntensityAnalyzer from the NLTK (Natural +Language Toolkit) library.

+

Attack

+

The primary objective of the scanner is to gauge the sentiment of a given prompt. Prompts with sentiment scores below a +specified threshold are identified as having a negative sentiment. This can be especially useful in platforms where +monitoring and moderating user sentiment is crucial.

+

How it works

+

The sentiment score is calculated using nltk's Vader sentiment analyzer. The SentimentIntensityAnalyzer produces a sentiment score ranging from -1 to 1:

+
    +
  • -1 represents a completely negative sentiment.
  • +
  • 0 represents a neutral sentiment.
  • +
  • 1 represents a completely positive sentiment.
  • +
+

By setting a predefined threshold, the scanner can be calibrated to flag any prompts falling below that threshold, +indicating a potentially negative sentiment.

+

Usage

+
from llm_guard.input_scanners import Sentiment
+
+scanner = Sentiment(threshold=0)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+

For a deeper understanding of the sentiment analysis process and its underlying methods, consult:

+ +
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/token_limit/index.html b/input_scanners/token_limit/index.html new file mode 100644 index 00000000..81d936b3 --- /dev/null +++ b/input_scanners/token_limit/index.html @@ -0,0 +1,696 @@ + + + + + + + + + + + + + + +Token Limit - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Token Limit Scanner

+

It ensures that prompts do not exceed a predetermined token count, helping prevent resource-intensive operations and +potential denial of service attacks on large language models (LLMs).

+

Attack

+

The complexity and size of LLMs make them susceptible to heavy resource usage, especially when processing lengthy +prompts. Malicious users can exploit this by feeding extraordinarily long inputs, aiming to disrupt service or incur +excessive computational costs.

+
+

Info

+

This vulnerability is highlighted in the +OWASP LLM04: Model Denial of Service.

+
+

How it works

+

The scanner works by calculating the number of tokens in the provided prompt +using tiktoken library. If the token count exceeds the configured limit, the +prompt is flagged as being too long.

+

One token usually equates to approximately 4 characters in common English text. +Roughly speaking, 100 tokens are equivalent to about 75 words.

+

For an in-depth understanding, refer to:

+ +

Usage

+
from llm_guard.input_scanners import TokenLimit
+
+scanner = TokenLimit(limit=4096, encoding_name="cl100k_base")
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+
+

Note

+

Models supported for encoding cl100k_base: gpt-4, gpt-3.5-turbo, text-embedding-ada-002.

+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/input_scanners/toxicity/index.html b/input_scanners/toxicity/index.html new file mode 100644 index 00000000..8d408154 --- /dev/null +++ b/input_scanners/toxicity/index.html @@ -0,0 +1,698 @@ + + + + + + + + + + + + + + +Toxicity - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Toxicity Scanner

+

It provides a mechanism to analyze and gauge the toxicity of prompt, assisting in maintaining the health and safety of +online interactions by preventing the dissemination of potentially harmful content.

+

Attack

+

Online platforms can sometimes be used as outlets for toxic, harmful, or offensive content. By identifying and +mitigating such content at the source (i.e., the user's prompt), platforms can proactively prevent the escalation of +such situations and foster a more positive and constructive environment.

+

How it works

+

Utilizing the power of the martin-ha/toxic-comment-model from +Hugging Face, the scanner performs a binary classification on the provided text, assessing whether it's toxic or not.

+

If deemed toxic, the toxicity score reflects the model's confidence in this classification.

+

If identified as non-toxic, the score is the inverse of the model's confidence, i.e., 1 - confidence_score.

+

If the resulting toxicity score surpasses a predefined threshold, the text is flagged as toxic. Otherwise, it's +classified as non-toxic.

+

Usage

+
from llm_guard.input_scanners import Toxicity
+
+scanner = Toxicity(threshold=0.5)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+

Limitations

+

While the model is trained to recognize and classify a wide range of toxic online interactions, it does have certain +shortcomings:

+

Some comments referring to specific identity subgroups, such as "Muslim", might not be classified accurately. This is a +known limitation and work is ongoing to improve this aspect.

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/installation/index.html b/installation/index.html new file mode 100644 index 00000000..13aba1aa --- /dev/null +++ b/installation/index.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + +Installation - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Installing LLM Guard

+

This document describes how to download and install the LLM Guard locally.

+

Supported Python Versions

+

LLM Guard is supported for the following python versions:

+
    +
  • 3.10
  • +
  • 3.11
  • +
+

Using pip

+
+

Note

+

Consider installing the LLM Guard python packages on a virtual environment like venv or conda.

+
+
pip install llm-guard
+
+# LLM Guard Anonymize scanner requires a spaCy language model:
+python -m spacy download en_core_web_trf
+
+

Install from source

+

To install LLM Guard from source, first clone the repo:

+
    +
  • Using HTTPS +
    git clone https://github.com/laiyer-ai/llm-guard.git
    +
  • +
  • Using SSH +
    git clone git@github.com:laiyer-ai/llm-guard.git
    +
  • +
+

Then, install the package using pip:

+
# install the repo
+pip install -U -r requirements.txt -r requirements-dev.txt
+python setup.py install
+
+

Then, download the Spacy model for the Anonymize scanner:

+
# download SpaCy model
+python -m spacy download en_core_web_trf
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/ban_substrings/index.html b/output_scanners/ban_substrings/index.html new file mode 100644 index 00000000..c05a726f --- /dev/null +++ b/output_scanners/ban_substrings/index.html @@ -0,0 +1,702 @@ + + + + + + + + + + + + + + +Ban Substrings - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Ban Substrings Scanner

+

BanSubstrings scanner provides a safeguard mechanism to prevent undesired substrings from appearing in the language +model's outputs.

+

Attack

+

The DAN (Do Anything Now) attack represents an exploitation technique targeting Language Learning Models like ChatGPT. +Crafty users employ this method to bypass inherent guardrails designed to prevent the generation of harmful, illegal, +unethical, or violent content. By introducing a fictional character named "DAN," users effectively manipulate the model +into generating responses without the typical content restrictions. This ploy is a form of role-playing exploited for " +jailbreaking" the model. As ChatGPT's defense mechanisms against these attacks improve, attackers iterate on the DAN +prompt, making it more sophisticated.

+
+

Info

+

As specified by the OWASP Top 10 LLM attacks, this vulnerability is categorized +under: LLM08: Excessive Agency

+
+

How it works

+

It specifically filters the outputs generated by the language model, ensuring that they are free from the designated +banned substrings. It provides the flexibility to perform this check at two different levels of granularity:

+
    +
  • +

    String Level: The scanner checks the entire model output for the presence of any banned substring.

    +
  • +
  • +

    Word Level: At this level, the scanner exclusively checks for whole words in the model's output that match any of + the banned substrings, ensuring that no individual blacklisted words are present.

    +
  • +
+

Additionally, the scanner can be configured to replace the banned substrings with [REDACT] in the model's output.

+

Usage

+
from llm_guard.output_scanners import BanSubstrings
+
+scanner = BanSubstrings(substrings=["forbidden", "unwanted"], match_type="word", case_sensitive=False, redact=False, contains_all=False)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+

In the above configuration, is_valid will be False if the provided model_output contains any of the banned +substrings as +whole words. To ban substrings irrespective of their word boundaries, simply change the mode to str.

+

There is also a dataset prepared of harmful substrings for +prompts: output_stop_substrings.json

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/ban_topics/index.html b/output_scanners/ban_topics/index.html new file mode 100644 index 00000000..bc2295fa --- /dev/null +++ b/output_scanners/ban_topics/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + +Ban Topics - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Ban Topics Scanner

+

It is designed to inspect the outputs generated by Language Learning Models and to flag or restrict responses that delve +into predefined banned topics, such as religion. This ensures that the outputs align with community guidelines and do +not drift into potentially sensitive or controversial areas.

+

Attack

+

Even with controlled prompts, LLMs might produce outputs touching upon themes or subjects that are considered sensitive, +controversial, or outside the scope of intended interactions. Without preventive measures, this can lead to outputs that +are misaligned with the platform's guidelines or values.

+

How it works

+

It relies on the capabilities of the model from +HuggingFace: MoritzLaurer/DeBERTa-v3-base-mnli-fever-docnli-ling-2c. +This model identifies the topic or theme of an output, enabling the scanner to vet the content against a predefined list +of banned topics.

+

Usage

+
from llm_guard.output_scanners import BanTopics
+
+scanner = BanTopics(topics=["violence"], threshold=0.5)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/bias/index.html b/output_scanners/bias/index.html new file mode 100644 index 00000000..ebe326dc --- /dev/null +++ b/output_scanners/bias/index.html @@ -0,0 +1,686 @@ + + + + + + + + + + + + + + +Bias - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Bias Detection Scanner

+

This scanner is designed to inspect the outputs generated by Language Learning Models (LLMs) to detect and evaluate +potential biases. Its primary function is to ensure that LLM outputs remain neutral and don't exhibit unwanted or +predefined biases.

+

Attack

+

In the age of AI, it's pivotal that machine-generated content adheres to neutrality. Biases, whether intentional or +inadvertent, in LLM outputs can be misrepresentative, misleading, or offensive. The Bias scanner serves to address +this by detecting and quantifying biases in generated content.

+

How it works

+

The scanner utilizes a model from +HuggingFace: valurank/distilroberta-bias. This model is +specifically trained to detect biased statements in text. By examining a text's classification and score against a +predefined threshold, the scanner determines whether it's biased.

+
+

Note

+

Supported languages: English

+
+

Usage

+
from llm_guard.output_scanners import Bias
+
+scanner = Bias(threshold=0.5)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/code/index.html b/output_scanners/code/index.html new file mode 100644 index 00000000..45bccdd2 --- /dev/null +++ b/output_scanners/code/index.html @@ -0,0 +1,695 @@ + + + + + + + + + + + + + + +Code - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Code Scanner

+

It is designed to detect and analyze code snippets present in the responses generated by a language model. By +identifying the programming languages used in the model's output, platforms can ensure better control over the nature +and type of code shared with users.

+

Attack

+

In some contexts, having a language model inadvertently produce code in its output might be deemed undesirable or risky. +For instance, a user might exploit the model to generate malicious scripts or probe it for potential vulnerabilities. +Controlling and inspecting the code in the model's output can be paramount in ensuring user safety and system integrity.

+

How it works

+

Leveraging the capabilities of +the huggingface/CodeBERTa-language-id model, the scanner +proficiently identifies code snippets from various programming languages within the model's responses. The scanner can +be configured to either whitelist or blacklist specific languages, granting developers granular control over the type of +code that gets shown in the output.

+
+

Note

+

The scanner is currently limited to extracting and detecting code snippets from Markdown in the following languages:

+
    +
  • Go
  • +
  • Java
  • +
  • JavaScript
  • +
  • PHP
  • +
  • Python
  • +
  • Ruby
  • +
+
+

Usage

+
from llm_guard.output_scanners import Code
+
+scanner = Code(allowed=["python"])
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/deanonymize/index.html b/output_scanners/deanonymize/index.html new file mode 100644 index 00000000..5641e39a --- /dev/null +++ b/output_scanners/deanonymize/index.html @@ -0,0 +1,664 @@ + + + + + + + + + + + + + + +Deanonymize - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Deanonymize Scanner

+

The Deanonymize scanner helps put back real values in the model's output by replacing placeholders.

+

When we use tools like the Anonymize scanner, sometimes we replace private or sensitive info with placeholders. For +example, a name like "John Doe" might become [REDACTED_PERSON_1]. The Deanonymize scanner's job is to change these +placeholders back to the original details when needed.

+

Usage

+

The Deanonymize scanner uses Vault object. The Vault remembers all the changes made by +the Anonymize scanner. When Deanonymize scanner sees a placeholder in the model's +output, it checks the Vault to find the original info and uses it to replace the placeholder.

+

First, you'll need the Vault since it keeps all the original values:

+
from llm_guard.vault import Vault
+
+vault = Vault()
+
+

Then, set up the Deanonymize scanner with the Vault:

+
from llm_guard.output_scanners import Deanonymize
+
+scanner = Deanonymize(vault)
+sanitized_model_output, is_valid, risk_score = scanner.scan(sanitized_prompt, model_output)
+
+

After running the above code, sanitized_model_output will have the real details instead of placeholders.

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/json/index.html b/output_scanners/json/index.html new file mode 100644 index 00000000..117de1d0 --- /dev/null +++ b/output_scanners/json/index.html @@ -0,0 +1,680 @@ + + + + + + + + + + + + + + +JSON - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

JSON Scanner

+

This scanner identifies and validates the presence of JSON structures within given outputs.

+

Challenge

+

There might be cases where it's necessary to validate the presence of properly formatted JSONs in outputs.

+

This scanner is designed to detect these JSON structures and validate their correctness.

+

How it works

+

At its core, the scanner utilizes regular expressions and the built-in json library to detect potential JSON structures and subsequently validate them. It can also be configured to ensure a certain number of valid JSON structures are present in the output.

+
+

Note

+

The scanner searches for JSON objects. Arrays, strings, numbers, and other JSON types aren't the primary target but can be extended in the future.

+
+

Usage

+
from llm_guard.output_scanners import JSON
+
+scanner = JSON(required_elements=1)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/language/index.html b/output_scanners/language/index.html new file mode 100644 index 00000000..0dc36e91 --- /dev/null +++ b/output_scanners/language/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + +Language - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Language Scanner

+

This scanner identifies and assesses the authenticity of the language used in outputs.

+

Attack

+

With the rise of sophisticated LLMs, there has been an increase in attempts to manipulate or "confuse" these models. For example, model might produce an output in unexpected language.

+

The Language Scanner is designed to identify such attempts, assess the authenticity of the language used.

+

How it works

+

At its core, the scanner leverages the capabilities of langdetect library. +The primary function of the scanner is to analyze the model's output, determine its language, and check if it's in the +list.

+
+

Info

+

Supported languages: ['af', 'ar', 'bg', 'bn', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en', 'es', 'et', 'fa', 'fi', 'fr', 'gu', 'he', 'pt', 'ro', 'ru', 'sk', 'sl', 'so', 'sq', 'sv', 'sw', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur', 'vi', 'zh-cn', 'zh-tw'].

+
+

Usage

+
from llm_guard.output_scanners import Language
+
+scanner = Language(valid_languages=["en", ...])  # Add other valid languages as needed
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/language_same/index.html b/output_scanners/language_same/index.html new file mode 100644 index 00000000..0e2641cf --- /dev/null +++ b/output_scanners/language_same/index.html @@ -0,0 +1,685 @@ + + + + + + + + + + + + + + +Language Same - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

LanguageSame Scanner

+

This scanner evaluates and checks if the prompt and output are in the same language.

+

Attack

+

There can be cases where the model produces an output in a different language than the input or prompt. This can be unintended, especially in applications that require consistent language output.

+

The LanguageSame Scanner serves to identify these discrepancies and helps in maintaining consistent linguistic outputs.

+

How it works

+

The scanner predominantly utilizes the langdetect library to discern the language of both the input prompt and the output.

+
+

Info

+

Supported languages: ['af', 'ar', 'bg', 'bn', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en', 'es', 'et', 'fa', 'fi', 'fr', 'gu', 'he', 'pt', 'ro', 'ru', 'sk', 'sl', 'so', 'sq', 'sv', 'sw', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur', 'vi', 'zh-cn', 'zh-tw'].

+
+

It then checks whether both detected languages are the same. If they are not, it indicates a potential language discrepancy.

+
+

Note

+

While the scanner identifies language discrepancies, it doesn't limit or enforce any specific language sets. Instead, it simply checks for language consistency between the prompt and output. If you want to enforce languages, use Language scanner

+
+

Usage

+
from llm_guard.output_scanners import LanguageSame
+
+scanner = LanguageSame()
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/malicious_urls/index.html b/output_scanners/malicious_urls/index.html new file mode 100644 index 00000000..55aa0694 --- /dev/null +++ b/output_scanners/malicious_urls/index.html @@ -0,0 +1,683 @@ + + + + + + + + + + + + + + +Malicious URLs - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Malicious URLs Scanner

+

This scanner leverages a pre-trained model from HuggingFace to detect harmful URLs, such as phishing websites. The model +classifies URL addresses into two categories: 'malware' and 'benign'. The intent is to assess if a given URL is +malicious.

+

Attack

+

Large language models (LLMs) like GPT-4 are immensely sophisticated and have been trained on vast quantities of data +from the internet. This extensive training, while enabling them to generate coherent and contextually relevant +responses, also introduces certain risks. One of these risks is the inadvertent generation of malicious URLs in their +output.

+

How it works

+

The scanner uses the elftsdmr/malware-url-detect model from +HuggingFace to evaluate the security of a given URL.

+

The model provides a score between 0 and 1 for a URL being malware. This score is then compared against a pre-set +threshold to determine if the website is malicious. A score above the threshold suggests a malware link.

+

Usage

+
from llm_guard.output_scanners import MaliciousURLs
+
+scanner = MaliciousURLs(threshold=0.7)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/no_refusal/index.html b/output_scanners/no_refusal/index.html new file mode 100644 index 00000000..65a12c3a --- /dev/null +++ b/output_scanners/no_refusal/index.html @@ -0,0 +1,682 @@ + + + + + + + + + + + + + + +No Refusal - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

No Refusal Scanner

+

It is specifically designed to detect refusals in the output of language models. By using classification it can +ascertain whether the model has produced a refusal in response to a +potentially harmful or policy-breaching prompt.

+

Attack

+

Refusals are responses produced by language models when confronted with prompts that are considered to be against the +policies set by the model. Such refusals are important safety mechanisms, guarding against misuse of the model. Examples +of refusals can include statements like "Sorry, I can't assist with that" or "I'm unable to provide that information."

+

How it works

+

It leverages the power +of HuggingFace +model MoritzLaurer/DeBERTa-v3-base-mnli-fever-docnli-ling-2c +to classify the model's output.

+

Usage

+
from llm_guard.output_scanners import NoRefusal
+
+scanner = NoRefusal(threshold=0.5)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/refutation/index.html b/output_scanners/refutation/index.html new file mode 100644 index 00000000..1bd95473 --- /dev/null +++ b/output_scanners/refutation/index.html @@ -0,0 +1,684 @@ + + + + + + + + + + + + + + +Refutation - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Refutation Scanner

+

This scanner is designed to assess if the given content contradicts or refutes a certain statement or prompt. It acts as +a tool for ensuring the consistency and correctness of language model outputs, especially in contexts where logical +contradictions can be problematic.

+

Attack

+

When interacting with users or processing information, it's important for a language model to not provide outputs that +directly contradict the given inputs or established facts. Such contradictions can lead to confusion or misinformation. +The scanner aims to highlight such inconsistencies in the output.

+

How it works

+

The scanner leverages pretrained natural language inference (NLI) models from HuggingFace, such +as ynie/roberta-large-snli_mnli_fever_anli_R1_R2_R3-nli ( +and other variants), to determine the relationship between a given prompt and the generated output.

+

A high contradiction score indicates that the output refutes the prompt.

+

This calculated refutation score is then compared to a pre-set threshold. Outputs that cross this threshold are flagged +as contradictory.

+

Usage

+
from llm_guard.output_scanners import Refutation
+
+scanner = Refutation(threshold=0.7)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/regex/index.html b/output_scanners/regex/index.html new file mode 100644 index 00000000..70db609c --- /dev/null +++ b/output_scanners/regex/index.html @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + +Regex - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Regex Scanner

+

This scanner designed to scrutinize the output of language models based on predefined regular expression +patterns. With the capability to define desirable ("good") or undesirable ("bad") patterns, users can fine-tune +the validation of model outputs.

+

Additionally, it can redact matched substring with [REDACTED] string.

+

How it works

+

The scanner uses two primary lists of regular expressions: good_patterns and bad_patterns.

+
    +
  • Good Patterns: If the good_patterns list is provided, the model's output is considered valid as long as any of + the patterns in this list match the output. This is particularly useful when expecting specific formats or keywords in + the output.
  • +
  • Bad Patterns: If the bad_patterns list is provided, the model's output is considered invalid if any of the + patterns in this list match the output. This is beneficial for filtering out unwanted phrases, words, or formats from + the model's responses.
  • +
+

The scanner can function using either list independently.

+

Usage

+
from llm_guard.output_scanners import Regex
+
+scanner = Regex(bad_patterns=[r"Bearer [A-Za-z0-9-._~+/]+"], redact=True)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/relevance/index.html b/output_scanners/relevance/index.html new file mode 100644 index 00000000..e360cb00 --- /dev/null +++ b/output_scanners/relevance/index.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + +Relevance - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Relevance Scanner

+

It is designed to ensure that the output of a language model stays pertinent and aligned with the provided input prompt. By comparing the similarity between the prompt and the output, the scanner offers a measure of confidence that the response from the model is contextually relevant.

+

How it works

+

The scanner harnesses the power of SentenceTransformer, specifically the sentence-transformers/all-MiniLM-L6-v2 model. It works as follows:

+
    +
  • Encoding: Both the prompt and the model's output are transformed into vector embeddings using the SentenceTransformer.
  • +
  • Cosine Similarity: The cosine similarity between the vector embeddings of the prompt and the output is computed. This value represents the degree of similarity between the two, ranging between -1 and 1, where 1 indicates maximum similarity.
  • +
  • Relevance Determination: If the computed cosine similarity is below a predefined threshold, the output is deemed not relevant to the initial prompt.
  • +
+

Example

+
    +
  • Prompt: What is the primary function of the mitochondria in a cell?
  • +
  • Output: The Eiffel Tower is a renowned landmark in Paris, France
  • +
  • Valid: False
  • +
+

Usage

+
from llm_guard.output_scanners import Relevance
+
+scanner = Relevance(threshold=0)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/sensitive/index.html b/output_scanners/sensitive/index.html new file mode 100644 index 00000000..59d1e658 --- /dev/null +++ b/output_scanners/sensitive/index.html @@ -0,0 +1,726 @@ + + + + + + + + + + + + + + +Sensitive - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Sensitive Scanner

+

The Sensitive scanner actively scans the output from the language model, ensuring no Personal Identifiable Information ( +PII), secrets or sensitive data slips through.

+

Attack

+

Sensitive Information Disclosure is a noted vulnerability in Language Learning Models (LLM). Such models may +accidentally provide responses that contain confidential data. This poses risks such as unauthorized data access, +violations of privacy, and even more severe security breaches. Addressing this is paramount, and that's where the +Sensitive Data Detector comes into play.

+
+

Info

+

Referring to the OWASP Top 10 for Large Language Model Applications, this falls under:

+

LLM06: Sensitive Information Disclosure - +To combat this, it's vital to integrate data sanitization and adopt strict user policies.

+
+

How it works

+

It takes advantage of the Presidio Analyzer Engine. Coupled +with predefined internal patterns, the tool offers robust scanning capabilities.

+
+

Note

+

It uses transformers based model en_core_web_trf which is based on a more modern deep-learning architecture, but is generally +slower than the default en_core_web_lg model.

+
+

When running, the scanner inspects the model's output for specific entity types that may be considered sensitive. If no +types are chosen, the tool defaults to scanning for all known entity types, offering comprehensive coverage.

+

Entities

+
+

Note

+

Entity detection only works in English right now

+
+ +

Usage

+

Here's a quick example of how you can use the Sensitive Data Detector:

+
from llm_guard.output_scanners import Sensitive
+
+scanner = Sensitive(entity_types=["NAME", "EMAIL"], redact=True)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+

If you want, you can use your own patterns by giving the path in regex_pattern_groups_path

+

In the example, we're particularly checking for names and emails. If the output_clean contains any PII, the is_valid +will be False.

+

Additionally, when redact is enabled, it will replace all sensitive entities.

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/sentiment/index.html b/output_scanners/sentiment/index.html new file mode 100644 index 00000000..c6115da3 --- /dev/null +++ b/output_scanners/sentiment/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + +Sentiment - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Sentiment Scanner

+

The Sentiment Scanner is designed to scan and assess the sentiment of generated outputs. It leverages +the SentimentIntensityAnalyzer from the NLTK (Natural Language Toolkit) library to accomplish this.

+

Attack

+

By identifying texts with sentiment scores that deviate significantly from neutral, platforms can monitor and moderate +output sentiment, ensuring constructive and positive interactions.

+

How it works

+

The sentiment score is calculated using nltk's Vader sentiment analyzer. The SentimentIntensityAnalyzer produces a +sentiment score ranging from -1 to 1:

+
    +
  • -1 represents a completely negative sentiment.
  • +
  • 0 represents a neutral sentiment.
  • +
  • 1 represents a completely positive sentiment.
  • +
+

By setting a predefined threshold, the scanner can be calibrated to flag any outputs falling below that threshold, +indicating a potentially negative sentiment.

+

Usage

+
from llm_guard.output_scanners import Sentiment
+
+scanner = Sentiment(threshold=0)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+

For a deeper understanding of the sentiment analysis process and its underlying methods, consult:

+ +
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/output_scanners/toxicity/index.html b/output_scanners/toxicity/index.html new file mode 100644 index 00000000..88eb96f9 --- /dev/null +++ b/output_scanners/toxicity/index.html @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + +Toxicity - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Toxicity Scanner

+

It is designed to assess the toxicity level of the content generated by language models, acting as a safeguard against +potentially harmful or offensive output.

+

Attack

+

Language models, when interacting with users, can sometimes produce responses that may be deemed toxic or inappropriate. +This poses a risk, as such output can perpetuate harm or misinformation. By monitoring and classifying the model's +output, potential toxic content can be flagged and handled appropriately.

+

How it works

+

The scanner employs the nicholasKluge/ToxicityModel from +HuggingFace to evaluate the generated text's toxicity level.

+
    +
  • +

    A negative score (approaching 0) flags the content as toxic.

    +
  • +
  • +

    A positive score (approaching 1) indicates non-toxic content.

    +
  • +
+

The calculated toxicity score is then juxtaposed against a pre-set threshold. Outputs that cross this threshold are +marked as toxic.

+

Usage

+
from llm_guard.output_scanners import Toxicity
+
+scanner = Toxicity(threshold=0.7)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/quickstart/index.html b/quickstart/index.html new file mode 100644 index 00000000..3a786b7a --- /dev/null +++ b/quickstart/index.html @@ -0,0 +1,706 @@ + + + + + + + + + + + + + + +Quickstart - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Getting started with LLM Guard

+

Each scanner can be used individually, or using the scan_prompt function.

+

Individual

+

You can import an individual scanner and use it to evaluate the prompt or the output:

+
from llm_guard.input_scanners import BanTopics
+
+scanner = BanTopics(topics=["violence"], threshold=0.5)
+sanitized_prompt, is_valid, risk_score = scanner.scan(prompt)
+
+
from llm_guard.output_scanners import Bias
+
+scanner = Bias(threshold=0.5)
+sanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)
+
+

Multiple

+

!! info

+
Scanners are executed in the order they are passed to the `scan_prompt` function.
+
+

For prompt:

+
from llm_guard import scan_prompt
+from llm_guard.input_scanners import Anonymize, PromptInjection, TokenLimit, Toxicity
+from llm_guard.vault import Vault
+
+vault = Vault()
+input_scanners = [Anonymize(vault), Toxicity(), TokenLimit(), PromptInjection()]
+
+sanitized_prompt, results_valid, results_score = scan_prompt(input_scanners, prompt)
+if any(not result for result in results_valid.values()):
+    print(f"Prompt {prompt} is not valid, scores: {results_score}")
+    exit(1)
+
+print(f"Prompt: {sanitized_prompt}")
+
+

For output:

+
from llm_guard import scan_output
+from llm_guard.output_scanners import Deanonymize, NoRefusal, Relevance, Sensitive
+
+vault = Vault()
+output_scanners = [Deanonymize(vault), NoRefusal(), Relevance(), Sensitive()]
+
+sanitized_response_text, results_valid, results_score = scan_output(
+    output_scanners, sanitized_prompt, response_text
+)
+if any(not result for result in results_valid.values()):
+    print(f"Output {response_text} is not valid, scores: {results_score}")
+    exit(1)
+
+print(f"Output: {sanitized_response_text}\n")
+
+
+

Note

+

You can set fail_fast to True to stop scanning after the first invalid result. This can help to reduce the latency of the scanning.

+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..2d0d75fb --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"LLM Guard - The Security Toolkit for LLM Interactions","text":"

LLM Guard by Laiyer.ai is a comprehensive tool designed to fortify the security of Large Language Models (LLMs).

"},{"location":"#what-is-llm-guard","title":"What is LLM Guard?","text":"

By offering sanitization, detection of harmful language, prevention of data leakage, and resistance against prompt injection attacks, LLM-Guard ensures that your interactions with LLMs remain safe and secure.

Demo

"},{"location":"#installation","title":"Installation","text":"

Begin your journey with LLM Guard by downloading the package and acquiring the en_core_web_trf spaCy model (essential for the Anonymize scanner):

pip install llm-guard\npython -m spacy download en_core_web_trf\n
"},{"location":"#getting-started","title":"Getting Started","text":"

Important Notes:

  • LLM Guard is designed for easy integration and deployment in production environments. While it's ready to use out-of-the-box, please be informed that we're constantly improving and updating the repository.
  • Base functionality requires a limited number of libraries. As you explore more advanced features, necessary libraries will be automatically installed.
  • Ensure you're using Python version 3.8.1 or higher. Confirm with: python --version.
  • Library installation issues? Consider upgrading pip: python -m pip install --upgrade pip.

Examples:

  • Get started with ChatGPT and LLM Guard.
"},{"location":"#roadmap","title":"Roadmap","text":""},{"location":"#general","title":"General","text":"
  • Extend language support to cover popular and emerging languages, prioritize based on community feedback.
  • Allow comparison of multiple outputs to facilitate better analysis and choice.
  • Enable scanning of logits to support streaming mode.
  • Expand examples and integrations, ensuring they cover common use-cases and are easy to follow.
"},{"location":"#latency","title":"Latency","text":"
  • Implement parallel scanning using multiprocessing to significantly reduce scanning time.
  • Provide an option to utilize lighter models for quicker scanning, while maintaining an acceptable level of accuracy.
  • Incorporate LRU cache to optimize performance by reusing previous results where applicable.
"},{"location":"#prompt-scanners","title":"Prompt Scanners","text":"
  • Allow language restriction to focus scanning efforts and improve accuracy.
  • Utilize expressions for code detection to reduce dependency on models, improving speed and reliability.
  • Integrate yara for secret detection to enhance security scanning capabilities.
  • Sanitize text.
  • Support a variety of token calculators to offer more flexibility and compatibility.
"},{"location":"#output-scanners","title":"Output Scanners","text":"
  • Sanitize text to maintain a clean, accurate scanning process.
  • Validate output formats like JSON, XML to ensure they adhere to standards.
  • Incorporate factual consistency checking to uphold the reliability of the data.
  • Scan for vulnerable libraries and provide recommendations for safer alternatives.
  • Check for license compliance to ensure legal integrity.
  • Detect insecure code patterns.
  • Identify potential SQL injection points to enhance security.
  • Verify links and provide options for whitelisting or blacklisting to maintain the quality of references.
"},{"location":"#contributing","title":"Contributing","text":"

Got ideas, feedback, or wish to contribute? We'd love to hear from you! Email us.

For detailed guidelines on contributions, kindly refer to our contribution guide.

"},{"location":"best_practices/","title":"Best Practices","text":""},{"location":"best_practices/#performance-optimization","title":"Performance Optimization","text":"
  1. Benchmark Analysis: Before choosing the scanners, it's crucial to understand their performance on different instances. Review the benchmarks for input and output scanners to make an informed decision based on your specific requirements.

  2. Model Size Trade-off: Opting for smaller models will expedite processing, reducing latency. However, this comes at the cost of accuracy. We are actively working on providing compact versions with minimal accuracy trade-offs.

"},{"location":"best_practices/#serving-configurations","title":"Serving Configurations","text":"
  1. Fast Failure Mode: Enable the fail_fast mode while serving to ensure early exits, preventing the wait for all scanners to complete, thus optimizing the response time.

  2. Scanner Selection: Assess the relevance of different scanners for your use-case. Instead of employing all scanners synchronously, which might overwhelm the system, consider using them asynchronously. This approach enhances observability, aiding in precise debugging and performance monitoring.

"},{"location":"best_practices/#observability-and-debugging","title":"Observability and Debugging","text":"
  1. Logging and Metrics: Implement robust logging and metric collection to monitor the system's performance and health.
"},{"location":"best_practices/#continuous-improvement","title":"Continuous Improvement","text":"
  1. Feedback Loops: Establish feedback loops with your system's users to understand how the library is performing in real-world scenarios, and to gather suggestions for improvements.

  2. Regular Updates and Testing: Stay updated with the latest versions of llm-guard, and ensure thorough testing in a staging environment before rolling out updates in a production setup.

"},{"location":"installation/","title":"Installing LLM Guard","text":"

This document describes how to download and install the LLM Guard locally.

"},{"location":"installation/#supported-python-versions","title":"Supported Python Versions","text":"

LLM Guard is supported for the following python versions:

  • 3.10
  • 3.11
"},{"location":"installation/#using-pip","title":"Using pip","text":"

Note

Consider installing the LLM Guard python packages on a virtual environment like venv or conda.

pip install llm-guard\n\n# LLM Guard Anonymize scanner requires a spaCy language model:\npython -m spacy download en_core_web_trf\n
"},{"location":"installation/#install-from-source","title":"Install from source","text":"

To install LLM Guard from source, first clone the repo:

  • Using HTTPS
    git clone https://github.com/laiyer-ai/llm-guard.git\n
  • Using SSH
    git clone git@github.com:laiyer-ai/llm-guard.git\n

Then, install the package using pip:

# install the repo\npip install -U -r requirements.txt -r requirements-dev.txt\npython setup.py install\n

Then, download the Spacy model for the Anonymize scanner:

# download SpaCy model\npython -m spacy download en_core_web_trf\n
"},{"location":"quickstart/","title":"Getting started with LLM Guard","text":"

Each scanner can be used individually, or using the scan_prompt function.

"},{"location":"quickstart/#individual","title":"Individual","text":"

You can import an individual scanner and use it to evaluate the prompt or the output:

from llm_guard.input_scanners import BanTopics\n\nscanner = BanTopics(topics=[\"violence\"], threshold=0.5)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n
from llm_guard.output_scanners import Bias\n\nscanner = Bias(threshold=0.5)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"quickstart/#multiple","title":"Multiple","text":"

!! info

Scanners are executed in the order they are passed to the `scan_prompt` function.\n

For prompt:

from llm_guard import scan_prompt\nfrom llm_guard.input_scanners import Anonymize, PromptInjection, TokenLimit, Toxicity\nfrom llm_guard.vault import Vault\n\nvault = Vault()\ninput_scanners = [Anonymize(vault), Toxicity(), TokenLimit(), PromptInjection()]\n\nsanitized_prompt, results_valid, results_score = scan_prompt(input_scanners, prompt)\nif any(not result for result in results_valid.values()):\n    print(f\"Prompt {prompt} is not valid, scores: {results_score}\")\n    exit(1)\n\nprint(f\"Prompt: {sanitized_prompt}\")\n

For output:

from llm_guard import scan_output\nfrom llm_guard.output_scanners import Deanonymize, NoRefusal, Relevance, Sensitive\n\nvault = Vault()\noutput_scanners = [Deanonymize(vault), NoRefusal(), Relevance(), Sensitive()]\n\nsanitized_response_text, results_valid, results_score = scan_output(\n    output_scanners, sanitized_prompt, response_text\n)\nif any(not result for result in results_valid.values()):\n    print(f\"Output {response_text} is not valid, scores: {results_score}\")\n    exit(1)\n\nprint(f\"Output: {sanitized_response_text}\\n\")\n

Note

You can set fail_fast to True to stop scanning after the first invalid result. This can help to reduce the latency of the scanning.

"},{"location":"benchmarks/input_scanners/","title":"Input scanners benchmarks","text":"

Info

Reference code: https://github.com/laiyer-ai/llm-guard/blob/main/benchmarks/scan_prompt_latency.py

"},{"location":"benchmarks/input_scanners/#test-environment","title":"Test environment","text":"
  • Platform: Linux
  • Python Version: 3.10.2
"},{"location":"benchmarks/input_scanners/#setup","title":"Setup","text":"
  • Basic scanners: Anonymize, Secrets.
  • Intermediate scanners: Anonymize, Secrets, PromptInjection, Toxicity.
  • Advanced scanners: All scanners.
"},{"location":"benchmarks/input_scanners/#instance-type-aws-m6glarge-graviton","title":"Instance type: AWS m6g.large (Graviton)","text":"Test Type Prompt (Trimmed) Min (ms) Max (ms) Mean (ms) Median StdDev (ms) Basic Make an SQL insert statement... 360.56 404.38 369.66 361.09 19.41 Basic For some reason, the assistant is... 517.72 521.56 519.09 518.67 1.52 Intermediate Make an SQL insert statement... 1,221.92 1,227 1,224.71 1,225.43 2.03 Intermediate For some reason, the assistant is... 1,549.82 2,325.64 1,929.78 1,919.46 306.18 Advanced Make an SQL insert statement... 2,167.89 2,180.68 2,172.99 2,172.05 5.07 Advanced For some reason, the assistant is... 2,662.04 2,879.55 2,764.91 2,757.08 86.88"},{"location":"benchmarks/input_scanners/#aws-m5large-instance","title":"AWS m5.large instance","text":"Test Type Prompt (Trimmed) Min (ms) Max (ms) Mean (ms) Median StdDev (ms) Basic Make an SQL insert statement... 211.75 252.38 220.28 212.71 17.94 Basic For some reason, the assistant is... 317.44 323.65 320.08 318.84 2.92 Intermediate Make an SQL insert statement... 620.28 632.61 627.26 629.0 4.8 Intermediate For some reason, the assistant is... 782.69 1,101.70 937.67 924.63 127.35 Advanced Make an SQL insert statement... 1,145.41 1,184.17 1,160.3 1,157.22 14.63 Advanced For some reason, the assistant is... 1,377.93 1,514.38 1,449.14 1,448.96 52.77"},{"location":"benchmarks/input_scanners/#aws-inf1xlarge-instance","title":"AWS inf1.xlarge instance","text":"Test Type Prompt (Trimmed) Min (ms) Max (ms) Mean (ms) Median StdDev (ms) Basic Make an SQL insert statement... 112.86 139.02 118.21 112.93 11.63 Basic For some reason, the assistant is... 164.84 171.22 166.99 166.71 2.6 Intermediate Make an SQL insert statement... 312.64 321.35 314.9 313.26 3.65 Intermediate For some reason, the assistant is... 399.14 540.05 471.80 474.01 55.17 Advanced Make an SQL insert statement... 564.13 612.13 574.33 564.80 21.15 Advanced For some reason, the assistant is... 665.89 729.69 694.36 689.37 25.19"},{"location":"benchmarks/input_scanners/#aws-g5xlarge-one-gpu-instance","title":"AWS g5.xlarge (one GPU) instance","text":"Test Type Prompt (Trimmed) Min (ms) Max (ms) Mean (ms) Median StdDev (ms) Basic Make an SQL insert statement... 170.26 195.82 175.55 170.55 11.33 Basic For some reason, the assistant is... 253.73 254.86 254.03 253.84 0.47 Intermediate Make an SQL insert statement... 190.79 236.65 200.25 191.0 20.35 Intermediate For some reason, the assistant is... 274.39 275.61 274.99 275.0 0.44 Advanced Make an SQL insert statement... 208.22 209.8 208.72 208.41 0.63 Advanced For some reason, the assistant is... 292.70 294.24 293.2 292.99 0.51"},{"location":"benchmarks/output_scanners/","title":"Output scanners benchmarks","text":"

Info

Reference code: https://github.com/laiyer-ai/llm-guard/blob/main/benchmarks/scan_output_latency.py

"},{"location":"benchmarks/output_scanners/#test-environment","title":"Test environment","text":"
  • Platform: Linux
  • Python Version: 3.10.2
"},{"location":"benchmarks/output_scanners/#setup","title":"Setup","text":"
  • Basic scanners: Deanonymize, Secrets.
  • Intermediate scanners: Deanonymize, Secrets, Bias, Toxicity.
  • Advanced scanners: All scanners.
"},{"location":"benchmarks/output_scanners/#instance-type-aws-m6glarge-graviton","title":"Instance type: AWS m6g.large (Graviton)","text":"Test Type Prompt (Trimmed) Min (ms) Max (ms) Mean (ms) Median StdDev (ms) Basic INSERT INTO users (Name, Email... 338.90 370.01 345.97 339.742 13.47 Intermediate INSERT INTO users (Name, Email... 1,221.92 1,227 1,224.71 1,225.43 2.03 Advanced INSERT INTO users (Name, Email... 4,037.6 4,170.9 4,074.3 4,056.4 5.49"},{"location":"benchmarks/output_scanners/#aws-m5large-instance","title":"AWS m5.large instance","text":"Test Type Prompt (Trimmed) Min (ms) Max (ms) Mean (ms) Median StdDev (ms) Basic INSERT INTO users (Name, Email... 206.15 256.63 216.35 206.25 22.51 Intermediate INSERT INTO users (Name, Email... 734.10 745.58 740.73 740.84 4.58 Advanced INSERT INTO users (Name, Email... 2,331.6 2,500.7 2,373.0 2,338.7 7.2"},{"location":"benchmarks/output_scanners/#aws-inf1xlarge-instance","title":"AWS inf1.xlarge instance","text":"Test Type Prompt (Trimmed) Min (ms) Max (ms) Mean (ms) Median StdDev (ms) Basic INSERT INTO users (Name, Email... 107.29 156.32 117.88 108.43 21.5 Intermediate INSERT INTO users (Name, Email... 388.51 397.73 392.32 391.63 3.44 Advanced INSERT INTO users (Name, Email... 816.51 913.67 837.71 819.98 42.49"},{"location":"benchmarks/output_scanners/#aws-g5xlarge-one-gpu-instance","title":"AWS g5.xlarge (one GPU) instance","text":"Test Type Prompt (Trimmed) Min (ms) Max (ms) Mean (ms) Median StdDev (ms) Basic INSERT INTO users (Name, Email... 164.34 181.26 167.95 164.59 7.44 Intermediate INSERT INTO users (Name, Email... 180.81 226.96 190.12 180.93 20.59 Advanced INSERT INTO users (Name, Email... 247.23 253.97 248.65 247.34 2.97"},{"location":"customization/add_scanner/","title":"Adding a new scanner","text":"

LLM Guard can be extended to support new scanners, and to support additional models for the existing. These scanners could be added via code or ad-hoc as part of the request.

Note

Before writing code, please read the contributing guide.

"},{"location":"customization/add_scanner/#extending-the-input-prompt-scanners","title":"Extending the input (prompt) scanners","text":"
  1. Create a new class in the llm_guard/input_scanners that inherits from base.Scanner and implements the scan method. The scan method should return a tuple str, bool, float.
  2. Add test cases for the new scanner in tests/input_scanners.
  3. Add the new scanner to the llm_guard/input_scanners/__init__.py __all__ enum.
  4. Write documentation in the docs/input_scanners folder and add a link to the mkdocs.yml file.
  5. Also, add a link to the documentation in README.md, and update the CHANGELOG.md file.
"},{"location":"customization/add_scanner/#extending-the-output-scanners","title":"Extending the output scanners","text":"
  1. Create a new class in the llm_guard/output_scanners that inherits from base.Scanner and implements the scan method. The scan method should return a tuple str, bool, float.
  2. Add test cases for the new scanner in tests/output_scanners.
  3. Add the new scanner to the llm_guard/output_scanners/__init__.py __all__ enum.
  4. Write documentation in the docs/output_scanners folder and add a link to the mkdocs.yml file.
  5. Also, add a link to the documentation in README.md, and update the CHANGELOG.md file.

Info

You can use existing scanners as a reference.

"},{"location":"input_scanners/anonymize/","title":"Anonymize Scanner","text":"

It meticulously inspects user prompts, ensuring that they are free of any sensitive information before being processed by the language model.

"},{"location":"input_scanners/anonymize/#attack","title":"Attack","text":"

Sometimes, Language Learning Models (or LLMs) can accidentally share private info from the prompts they get. This can be bad because it might let others see or use this info in the wrong way.

To stop this from happening, we use the Anonymize scanner. It makes sure user prompts don\u2019t have any private details before the model sees them.

"},{"location":"input_scanners/anonymize/#usage","title":"Usage","text":"

When you use the Anonymize scanner, you can talk to LLMs without worrying about accidentally sharing private info.

The scanner uses a tool called the Presidio Analyzer library. This tool, built with Python's spaCy, is good at finding private info in text.

Note

It uses transformers based model en_core_web_trf which uses a more modern deep-learning architecture, but is generally slower than the default en_core_web_lg model.

On top of that, the Anonymize scanner can also understand special patterns to catch anything the Presidio Analyzer might miss.

"},{"location":"input_scanners/anonymize/#entities","title":"Entities","text":"

Note

Entity detection only works in English right now

  • List of default entities
  • Supported Presidio entities
  • Custom regex patterns
"},{"location":"input_scanners/anonymize/#configuring","title":"Configuring","text":"

First, set up the Vault. It keeps a record of the info we redact:

from llm_guard.vault import Vault\n\nvault = Vault()\n

Then, set up the Anonymize scanner with some options:

from llm_guard.input_scanners import Anonymize\n\nscanner = Anonymize(vault, preamble=\"Insert before prompt\", allowed_names=[\"John Doe\"], hidden_names=[\"Test LLC\"])\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n

Here's what those options do:

  • preamble tells the LLM to ignore certain things.
  • hidden_names are names we change to something like [REDACTED_CUSTOM_1].
  • You can also choose specific types of info to hide using entity_types.
  • If you want, you can use your own patterns by giving the path in regex_pattern_groups_path.
  • use_faker will replace applicable entities with fake ones.

If you want to see the original info again, you can use the Deanonymizer.

"},{"location":"input_scanners/ban_substrings/","title":"Ban Substrings Scanner","text":"

Ensure that specific undesired substrings never make it into your prompts with the BanSubstrings scanner.

"},{"location":"input_scanners/ban_substrings/#how-it-works","title":"How it works","text":"

It is purpose-built to screen user prompts, ensuring none of the banned substrings are present. Users have the flexibility to enforce this check at two distinct granularity levels:

  • String Level: The banned substring is sought throughout the entire user prompt.

  • Word Level: The scanner exclusively hunts for whole words that match the banned substrings, ensuring no individual standalone words from the blacklist appear in the prompt.

Additionally, the scanner can be configured to replace the banned substrings with [REDACT] in the model's output.

"},{"location":"input_scanners/ban_substrings/#usage","title":"Usage","text":"
from llm_guard.input_scanners import BanSubstrings\n\nscanner = BanSubstrings(substrings=[\"forbidden\", \"unwanted\"], match_type=\"word\", case_sensitive=False, redact=False, contains_all=False)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n

In the above configuration, is_valid will be False if the provided prompt contains any of the banned substrings as whole words. To ban substrings irrespective of their word boundaries, simply change the mode to str.

There is also a dataset prepared of harmful substrings for prompts: prompt_stop_substrings.json

"},{"location":"input_scanners/ban_topics/","title":"Ban Topics Scanner","text":"

It is a proactive tool aimed at restricting specific topics, such as religion, from being introduced in the prompts. This ensures that interactions remain within acceptable boundaries and avoids potentially sensitive or controversial discussions.

"},{"location":"input_scanners/ban_topics/#attack","title":"Attack","text":"

Certain topics, when used as prompts for Language Learning Models, can lead to outputs that might be deemed sensitive, controversial, or inappropriate. By banning these topics, service providers can maintain the quality of interactions and reduce the risk of generating responses that could lead to misunderstandings or misinterpretations.

"},{"location":"input_scanners/ban_topics/#how-it-works","title":"How it works","text":"

It relies on the capabilities of the model: MoritzLaurer/DeBERTa-v3-base-mnli-fever-docnli-ling-2c. This model aids in identifying the underlying theme or topic of a prompt, allowing the scanner to cross-check it against a list of banned topics.

"},{"location":"input_scanners/ban_topics/#usage","title":"Usage","text":"
from llm_guard.input_scanners import BanTopics\n\nscanner = BanTopics(topics=[\"violence\"], threshold=0.5)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n
"},{"location":"input_scanners/code/","title":"Code Scanner","text":"

It is specifically engineered to inspect user prompts and discern if they contain code snippets. It can be particularly useful in platforms that wish to control or monitor the types of programming-related content being queried or in ensuring the appropriate handling of such prompts.

"},{"location":"input_scanners/code/#attack","title":"Attack","text":"

There are scenarios where the insertion of code in user prompts might be deemed undesirable. Users might be trying to exploit vulnerabilities, test out scripts, or engage in other activities that are outside the platform's intended scope. Monitoring and controlling the nature of the code can be crucial to maintain the integrity and safety of the system.

"},{"location":"input_scanners/code/#how-it-works","title":"How it works","text":"

Utilizing the prowess of the huggingface/CodeBERTa-language-id model, the scanner can adeptly identify code snippets within prompts across various programming languages. Developers can configure the scanner to either whitelist or blacklist specific languages, thus retaining full control over which types of code can appear in user queries.

Note

The scanner is currently limited to extracting and detecting code snippets from Markdown in the following languages:

  • Go
  • Java
  • JavaScript
  • PHP
  • Python
  • Ruby
"},{"location":"input_scanners/code/#usage","title":"Usage","text":"
from llm_guard.input_scanners import Code\n\nscanner = Code(denied=[\"python\"])\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n
"},{"location":"input_scanners/language/","title":"Language Scanner","text":"

This scanner identifies and assesses the authenticity of the language used in prompts.

"},{"location":"input_scanners/language/#attack","title":"Attack","text":"

With the rise of sophisticated LLMs, there has been an increase in attempts to manipulate or \"confuse\" these models. Some common tactics employed by users to attack LLMs include:

  • Jailbreaks and Prompt Injections in different languages. For example, by utilizing unique aspects of the Japanese language to try and confuse the model.
  • Encapsulation & Overloading: Using excessive code or surrounding prompts with a plethora of special characters to overload or trick the model.

The Language Scanner is designed to identify such attempts, assess the authenticity of the language used.

"},{"location":"input_scanners/language/#how-it-works","title":"How it works","text":"

At its core, the scanner leverages the capabilities of langdetect library. The primary function of the scanner is to analyze the input prompt, determine its language, and check if it's in the list.

Info

Supported languages: ['af', 'ar', 'bg', 'bn', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en', 'es', 'et', 'fa', 'fi', 'fr', 'gu', 'he', 'pt', 'ro', 'ru', 'sk', 'sl', 'so', 'sq', 'sv', 'sw', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur', 'vi', 'zh-cn', 'zh-tw'].

"},{"location":"input_scanners/language/#usage","title":"Usage","text":"
from llm_guard.input_scanners import Language\n\nscanner = Language(valid_languages=[\"en\", ...])  # Add other valid languages as needed\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n
"},{"location":"input_scanners/prompt_injection/","title":"Prompt Injection Scanner","text":"

It is specifically tailored to guard against crafty input manipulations targeting large language models (LLM). By identifying and mitigating such attempts, it ensures the LLM operates securely without succumbing to injection attacks.

"},{"location":"input_scanners/prompt_injection/#attack","title":"Attack","text":"

Injection attacks, especially in the context of LLMs, can lead the model to perform unintended actions. There are two primary ways an attacker might exploit:

  • Direct Injection: Directly overwrites system prompts.

  • Indirect Injection: Alters inputs coming from external sources.

Info

As specified by the OWASP Top 10 LLM attacks, this vulnerability is categorized under:

LLM01: Prompt Injection - It's crucial to monitor and validate prompts rigorously to keep the LLM safe from such threats.

"},{"location":"input_scanners/prompt_injection/#how-it-works","title":"How it works","text":"

There are two versions: one popular model and another new fine-tuned model but larger and slower.

While the dataset is nascent, it can be enriched, drawing from repositories of known attack patterns, notably from platforms like JailbreakChat.

"},{"location":"input_scanners/prompt_injection/#v1","title":"v1","text":"

It leverages the model JasperLS/deberta-v3-base-injection for its operation.

Warning

It's worth noting that while the current model can detect attempts effectively, it might occasionally yield false positives.

Usage:

from llm_guard.input_scanners import PromptInjection\n\nscanner = PromptInjection(threshold=0.5)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n
"},{"location":"input_scanners/prompt_injection/#v2","title":"v2","text":"

It is based on larger RoBERTa-large model hubert233/GPTFuzz.

Usage:

from llm_guard.input_scanners import PromptInjectionV2\n\nscanner = PromptInjectionV2(threshold=0.5)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n
"},{"location":"input_scanners/regex/","title":"Regex Scanner","text":"

This scanner designed to scrutinize the prompt based on predefined regular expression patterns. With the capability to define desirable (\"good\") or undesirable (\"bad\") patterns, users can fine-tune the validation of prompts.

Additionally, it can redact matched substring with [REDACTED] string.

"},{"location":"input_scanners/regex/#how-it-works","title":"How it works","text":"

The scanner uses two primary lists of regular expressions: good_patterns and bad_patterns.

  • Good Patterns: If the good_patterns list is provided, the prompt is considered valid as long as any of the patterns in this list match the output. This is particularly useful when expecting specific formats or keywords in the output.
  • Bad Patterns: If the bad_patterns list is provided, the model's output is considered invalid if any of the patterns in this list match the output. This is beneficial for filtering out unwanted phrases, words, or formats from the model's responses.

The scanner can function using either list independently.

"},{"location":"input_scanners/regex/#usage","title":"Usage","text":"
from llm_guard.input_scanners import Regex\n\nscanner = Regex(bad_patterns=[r\"Bearer [A-Za-z0-9-._~+/]+\"], redact=True)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n
"},{"location":"input_scanners/secrets/","title":"Secrets Scanner","text":"

This scanner diligently examines user inputs, ensuring that they don't carry any secrets before they are processed by the language model.

"},{"location":"input_scanners/secrets/#attack","title":"Attack","text":"

Large Language Models (LLMs), when provided with user inputs containing secrets or sensitive information, might inadvertently generate responses that expose these secrets. This can be a significant security concern as this sensitive data, such as API keys or passwords, could be misused if exposed.

To counteract this risk, we employ the Secrets scanner. It ensures that user prompts are meticulously scanned and any detected secrets are redacted before they are processed by the model.

"},{"location":"input_scanners/secrets/#usage","title":"Usage","text":"

While communicating with LLMs, the scanner acts as a protective layer, ensuring that your sensitive data remains confidential.

This scanner leverages the capabilities of the detect-secrets library, a tool engineered by Yelp, to meticulously detect secrets in strings of text.

"},{"location":"input_scanners/secrets/#types-of-secrets","title":"Types of secrets","text":"
  • API Tokens (e.g., AWS, Azure, GitHub, Slack)
  • Private Keys
  • High Entropy Strings (both Base64 and Hex) ... and many more
"},{"location":"input_scanners/secrets/#getting-started","title":"Getting started","text":"
from llm_guard.input_scanners import Secrets\n\nscanner = Secrets(redact_mode=Secrets.REDACT_PARTIAL)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n

Here's what those options do:

  • detect_secrets_config: This allows for a custom configuration for the detect-secrets library.
  • redact_mode: It defines how the detected secrets will be redacted\u2014options include partial redaction, complete hiding, or replacing with a hash.
"},{"location":"input_scanners/sentiment/","title":"Sentiment Scanner","text":"

It scans and evaluates the overall sentiment of prompts using the SentimentIntensityAnalyzer from the NLTK (Natural Language Toolkit) library.

"},{"location":"input_scanners/sentiment/#attack","title":"Attack","text":"

The primary objective of the scanner is to gauge the sentiment of a given prompt. Prompts with sentiment scores below a specified threshold are identified as having a negative sentiment. This can be especially useful in platforms where monitoring and moderating user sentiment is crucial.

"},{"location":"input_scanners/sentiment/#how-it-works","title":"How it works","text":"

The sentiment score is calculated using nltk's Vader sentiment analyzer. The SentimentIntensityAnalyzer produces a sentiment score ranging from -1 to 1:

  • -1 represents a completely negative sentiment.
  • 0 represents a neutral sentiment.
  • 1 represents a completely positive sentiment.

By setting a predefined threshold, the scanner can be calibrated to flag any prompts falling below that threshold, indicating a potentially negative sentiment.

"},{"location":"input_scanners/sentiment/#usage","title":"Usage","text":"
from llm_guard.input_scanners import Sentiment\n\nscanner = Sentiment(threshold=0)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n

For a deeper understanding of the sentiment analysis process and its underlying methods, consult:

  • NLTK's Sentiment Analysis Guide
"},{"location":"input_scanners/token_limit/","title":"Token Limit Scanner","text":"

It ensures that prompts do not exceed a predetermined token count, helping prevent resource-intensive operations and potential denial of service attacks on large language models (LLMs).

"},{"location":"input_scanners/token_limit/#attack","title":"Attack","text":"

The complexity and size of LLMs make them susceptible to heavy resource usage, especially when processing lengthy prompts. Malicious users can exploit this by feeding extraordinarily long inputs, aiming to disrupt service or incur excessive computational costs.

Info

This vulnerability is highlighted in the OWASP LLM04: Model Denial of Service.

"},{"location":"input_scanners/token_limit/#how-it-works","title":"How it works","text":"

The scanner works by calculating the number of tokens in the provided prompt using tiktoken library. If the token count exceeds the configured limit, the prompt is flagged as being too long.

One token usually equates to approximately 4 characters in common English text. Roughly speaking, 100 tokens are equivalent to about 75 words.

For an in-depth understanding, refer to:

  • OpenAI Tokenizer Guide
  • OpenAI Cookbook on Token Counting
"},{"location":"input_scanners/token_limit/#usage","title":"Usage","text":"
from llm_guard.input_scanners import TokenLimit\n\nscanner = TokenLimit(limit=4096, encoding_name=\"cl100k_base\")\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n

Note

Models supported for encoding cl100k_base: gpt-4, gpt-3.5-turbo, text-embedding-ada-002.

"},{"location":"input_scanners/toxicity/","title":"Toxicity Scanner","text":"

It provides a mechanism to analyze and gauge the toxicity of prompt, assisting in maintaining the health and safety of online interactions by preventing the dissemination of potentially harmful content.

"},{"location":"input_scanners/toxicity/#attack","title":"Attack","text":"

Online platforms can sometimes be used as outlets for toxic, harmful, or offensive content. By identifying and mitigating such content at the source (i.e., the user's prompt), platforms can proactively prevent the escalation of such situations and foster a more positive and constructive environment.

"},{"location":"input_scanners/toxicity/#how-it-works","title":"How it works","text":"

Utilizing the power of the martin-ha/toxic-comment-model from Hugging Face, the scanner performs a binary classification on the provided text, assessing whether it's toxic or not.

If deemed toxic, the toxicity score reflects the model's confidence in this classification.

If identified as non-toxic, the score is the inverse of the model's confidence, i.e., 1 - confidence_score.

If the resulting toxicity score surpasses a predefined threshold, the text is flagged as toxic. Otherwise, it's classified as non-toxic.

"},{"location":"input_scanners/toxicity/#usage","title":"Usage","text":"
from llm_guard.input_scanners import Toxicity\n\nscanner = Toxicity(threshold=0.5)\nsanitized_prompt, is_valid, risk_score = scanner.scan(prompt)\n
"},{"location":"input_scanners/toxicity/#limitations","title":"Limitations","text":"

While the model is trained to recognize and classify a wide range of toxic online interactions, it does have certain shortcomings:

Some comments referring to specific identity subgroups, such as \"Muslim\", might not be classified accurately. This is a known limitation and work is ongoing to improve this aspect.

"},{"location":"output_scanners/ban_substrings/","title":"Ban Substrings Scanner","text":"

BanSubstrings scanner provides a safeguard mechanism to prevent undesired substrings from appearing in the language model's outputs.

"},{"location":"output_scanners/ban_substrings/#attack","title":"Attack","text":"

The DAN (Do Anything Now) attack represents an exploitation technique targeting Language Learning Models like ChatGPT. Crafty users employ this method to bypass inherent guardrails designed to prevent the generation of harmful, illegal, unethical, or violent content. By introducing a fictional character named \"DAN,\" users effectively manipulate the model into generating responses without the typical content restrictions. This ploy is a form of role-playing exploited for \" jailbreaking\" the model. As ChatGPT's defense mechanisms against these attacks improve, attackers iterate on the DAN prompt, making it more sophisticated.

Info

As specified by the OWASP Top 10 LLM attacks, this vulnerability is categorized under: LLM08: Excessive Agency

"},{"location":"output_scanners/ban_substrings/#how-it-works","title":"How it works","text":"

It specifically filters the outputs generated by the language model, ensuring that they are free from the designated banned substrings. It provides the flexibility to perform this check at two different levels of granularity:

  • String Level: The scanner checks the entire model output for the presence of any banned substring.

  • Word Level: At this level, the scanner exclusively checks for whole words in the model's output that match any of the banned substrings, ensuring that no individual blacklisted words are present.

Additionally, the scanner can be configured to replace the banned substrings with [REDACT] in the model's output.

"},{"location":"output_scanners/ban_substrings/#usage","title":"Usage","text":"
from llm_guard.output_scanners import BanSubstrings\n\nscanner = BanSubstrings(substrings=[\"forbidden\", \"unwanted\"], match_type=\"word\", case_sensitive=False, redact=False, contains_all=False)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n

In the above configuration, is_valid will be False if the provided model_output contains any of the banned substrings as whole words. To ban substrings irrespective of their word boundaries, simply change the mode to str.

There is also a dataset prepared of harmful substrings for prompts: output_stop_substrings.json

"},{"location":"output_scanners/ban_topics/","title":"Ban Topics Scanner","text":"

It is designed to inspect the outputs generated by Language Learning Models and to flag or restrict responses that delve into predefined banned topics, such as religion. This ensures that the outputs align with community guidelines and do not drift into potentially sensitive or controversial areas.

"},{"location":"output_scanners/ban_topics/#attack","title":"Attack","text":"

Even with controlled prompts, LLMs might produce outputs touching upon themes or subjects that are considered sensitive, controversial, or outside the scope of intended interactions. Without preventive measures, this can lead to outputs that are misaligned with the platform's guidelines or values.

"},{"location":"output_scanners/ban_topics/#how-it-works","title":"How it works","text":"

It relies on the capabilities of the model from HuggingFace: MoritzLaurer/DeBERTa-v3-base-mnli-fever-docnli-ling-2c. This model identifies the topic or theme of an output, enabling the scanner to vet the content against a predefined list of banned topics.

"},{"location":"output_scanners/ban_topics/#usage","title":"Usage","text":"
from llm_guard.output_scanners import BanTopics\n\nscanner = BanTopics(topics=[\"violence\"], threshold=0.5)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/bias/","title":"Bias Detection Scanner","text":"

This scanner is designed to inspect the outputs generated by Language Learning Models (LLMs) to detect and evaluate potential biases. Its primary function is to ensure that LLM outputs remain neutral and don't exhibit unwanted or predefined biases.

"},{"location":"output_scanners/bias/#attack","title":"Attack","text":"

In the age of AI, it's pivotal that machine-generated content adheres to neutrality. Biases, whether intentional or inadvertent, in LLM outputs can be misrepresentative, misleading, or offensive. The Bias scanner serves to address this by detecting and quantifying biases in generated content.

"},{"location":"output_scanners/bias/#how-it-works","title":"How it works","text":"

The scanner utilizes a model from HuggingFace: valurank/distilroberta-bias. This model is specifically trained to detect biased statements in text. By examining a text's classification and score against a predefined threshold, the scanner determines whether it's biased.

Note

Supported languages: English

"},{"location":"output_scanners/bias/#usage","title":"Usage","text":"
from llm_guard.output_scanners import Bias\n\nscanner = Bias(threshold=0.5)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/code/","title":"Code Scanner","text":"

It is designed to detect and analyze code snippets present in the responses generated by a language model. By identifying the programming languages used in the model's output, platforms can ensure better control over the nature and type of code shared with users.

"},{"location":"output_scanners/code/#attack","title":"Attack","text":"

In some contexts, having a language model inadvertently produce code in its output might be deemed undesirable or risky. For instance, a user might exploit the model to generate malicious scripts or probe it for potential vulnerabilities. Controlling and inspecting the code in the model's output can be paramount in ensuring user safety and system integrity.

"},{"location":"output_scanners/code/#how-it-works","title":"How it works","text":"

Leveraging the capabilities of the huggingface/CodeBERTa-language-id model, the scanner proficiently identifies code snippets from various programming languages within the model's responses. The scanner can be configured to either whitelist or blacklist specific languages, granting developers granular control over the type of code that gets shown in the output.

Note

The scanner is currently limited to extracting and detecting code snippets from Markdown in the following languages:

  • Go
  • Java
  • JavaScript
  • PHP
  • Python
  • Ruby
"},{"location":"output_scanners/code/#usage","title":"Usage","text":"
from llm_guard.output_scanners import Code\n\nscanner = Code(allowed=[\"python\"])\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/deanonymize/","title":"Deanonymize Scanner","text":"

The Deanonymize scanner helps put back real values in the model's output by replacing placeholders.

When we use tools like the Anonymize scanner, sometimes we replace private or sensitive info with placeholders. For example, a name like \"John Doe\" might become [REDACTED_PERSON_1]. The Deanonymize scanner's job is to change these placeholders back to the original details when needed.

"},{"location":"output_scanners/deanonymize/#usage","title":"Usage","text":"

The Deanonymize scanner uses Vault object. The Vault remembers all the changes made by the Anonymize scanner. When Deanonymize scanner sees a placeholder in the model's output, it checks the Vault to find the original info and uses it to replace the placeholder.

First, you'll need the Vault since it keeps all the original values:

from llm_guard.vault import Vault\n\nvault = Vault()\n

Then, set up the Deanonymize scanner with the Vault:

from llm_guard.output_scanners import Deanonymize\n\nscanner = Deanonymize(vault)\nsanitized_model_output, is_valid, risk_score = scanner.scan(sanitized_prompt, model_output)\n

After running the above code, sanitized_model_output will have the real details instead of placeholders.

"},{"location":"output_scanners/json/","title":"JSON Scanner","text":"

This scanner identifies and validates the presence of JSON structures within given outputs.

"},{"location":"output_scanners/json/#challenge","title":"Challenge","text":"

There might be cases where it's necessary to validate the presence of properly formatted JSONs in outputs.

This scanner is designed to detect these JSON structures and validate their correctness.

"},{"location":"output_scanners/json/#how-it-works","title":"How it works","text":"

At its core, the scanner utilizes regular expressions and the built-in json library to detect potential JSON structures and subsequently validate them. It can also be configured to ensure a certain number of valid JSON structures are present in the output.

Note

The scanner searches for JSON objects. Arrays, strings, numbers, and other JSON types aren't the primary target but can be extended in the future.

"},{"location":"output_scanners/json/#usage","title":"Usage","text":"
from llm_guard.output_scanners import JSON\n\nscanner = JSON(required_elements=1)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/language/","title":"Language Scanner","text":"

This scanner identifies and assesses the authenticity of the language used in outputs.

"},{"location":"output_scanners/language/#attack","title":"Attack","text":"

With the rise of sophisticated LLMs, there has been an increase in attempts to manipulate or \"confuse\" these models. For example, model might produce an output in unexpected language.

The Language Scanner is designed to identify such attempts, assess the authenticity of the language used.

"},{"location":"output_scanners/language/#how-it-works","title":"How it works","text":"

At its core, the scanner leverages the capabilities of langdetect library. The primary function of the scanner is to analyze the model's output, determine its language, and check if it's in the list.

Info

Supported languages: ['af', 'ar', 'bg', 'bn', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en', 'es', 'et', 'fa', 'fi', 'fr', 'gu', 'he', 'pt', 'ro', 'ru', 'sk', 'sl', 'so', 'sq', 'sv', 'sw', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur', 'vi', 'zh-cn', 'zh-tw'].

"},{"location":"output_scanners/language/#usage","title":"Usage","text":"
from llm_guard.output_scanners import Language\n\nscanner = Language(valid_languages=[\"en\", ...])  # Add other valid languages as needed\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/language_same/","title":"LanguageSame Scanner","text":"

This scanner evaluates and checks if the prompt and output are in the same language.

"},{"location":"output_scanners/language_same/#attack","title":"Attack","text":"

There can be cases where the model produces an output in a different language than the input or prompt. This can be unintended, especially in applications that require consistent language output.

The LanguageSame Scanner serves to identify these discrepancies and helps in maintaining consistent linguistic outputs.

"},{"location":"output_scanners/language_same/#how-it-works","title":"How it works","text":"

The scanner predominantly utilizes the langdetect library to discern the language of both the input prompt and the output.

Info

Supported languages: ['af', 'ar', 'bg', 'bn', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en', 'es', 'et', 'fa', 'fi', 'fr', 'gu', 'he', 'pt', 'ro', 'ru', 'sk', 'sl', 'so', 'sq', 'sv', 'sw', 'ta', 'te', 'th', 'tl', 'tr', 'uk', 'ur', 'vi', 'zh-cn', 'zh-tw'].

It then checks whether both detected languages are the same. If they are not, it indicates a potential language discrepancy.

Note

While the scanner identifies language discrepancies, it doesn't limit or enforce any specific language sets. Instead, it simply checks for language consistency between the prompt and output. If you want to enforce languages, use Language scanner

"},{"location":"output_scanners/language_same/#usage","title":"Usage","text":"
from llm_guard.output_scanners import LanguageSame\n\nscanner = LanguageSame()\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/malicious_urls/","title":"Malicious URLs Scanner","text":"

This scanner leverages a pre-trained model from HuggingFace to detect harmful URLs, such as phishing websites. The model classifies URL addresses into two categories: 'malware' and 'benign'. The intent is to assess if a given URL is malicious.

"},{"location":"output_scanners/malicious_urls/#attack","title":"Attack","text":"

Large language models (LLMs) like GPT-4 are immensely sophisticated and have been trained on vast quantities of data from the internet. This extensive training, while enabling them to generate coherent and contextually relevant responses, also introduces certain risks. One of these risks is the inadvertent generation of malicious URLs in their output.

"},{"location":"output_scanners/malicious_urls/#how-it-works","title":"How it works","text":"

The scanner uses the elftsdmr/malware-url-detect model from HuggingFace to evaluate the security of a given URL.

The model provides a score between 0 and 1 for a URL being malware. This score is then compared against a pre-set threshold to determine if the website is malicious. A score above the threshold suggests a malware link.

"},{"location":"output_scanners/malicious_urls/#usage","title":"Usage","text":"
from llm_guard.output_scanners import MaliciousURLs\n\nscanner = MaliciousURLs(threshold=0.7)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/no_refusal/","title":"No Refusal Scanner","text":"

It is specifically designed to detect refusals in the output of language models. By using classification it can ascertain whether the model has produced a refusal in response to a potentially harmful or policy-breaching prompt.

"},{"location":"output_scanners/no_refusal/#attack","title":"Attack","text":"

Refusals are responses produced by language models when confronted with prompts that are considered to be against the policies set by the model. Such refusals are important safety mechanisms, guarding against misuse of the model. Examples of refusals can include statements like \"Sorry, I can't assist with that\" or \"I'm unable to provide that information.\"

"},{"location":"output_scanners/no_refusal/#how-it-works","title":"How it works","text":"

It leverages the power of HuggingFace model MoritzLaurer/DeBERTa-v3-base-mnli-fever-docnli-ling-2c to classify the model's output.

"},{"location":"output_scanners/no_refusal/#usage","title":"Usage","text":"
from llm_guard.output_scanners import NoRefusal\n\nscanner = NoRefusal(threshold=0.5)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/refutation/","title":"Refutation Scanner","text":"

This scanner is designed to assess if the given content contradicts or refutes a certain statement or prompt. It acts as a tool for ensuring the consistency and correctness of language model outputs, especially in contexts where logical contradictions can be problematic.

"},{"location":"output_scanners/refutation/#attack","title":"Attack","text":"

When interacting with users or processing information, it's important for a language model to not provide outputs that directly contradict the given inputs or established facts. Such contradictions can lead to confusion or misinformation. The scanner aims to highlight such inconsistencies in the output.

"},{"location":"output_scanners/refutation/#how-it-works","title":"How it works","text":"

The scanner leverages pretrained natural language inference (NLI) models from HuggingFace, such as ynie/roberta-large-snli_mnli_fever_anli_R1_R2_R3-nli ( and other variants), to determine the relationship between a given prompt and the generated output.

A high contradiction score indicates that the output refutes the prompt.

This calculated refutation score is then compared to a pre-set threshold. Outputs that cross this threshold are flagged as contradictory.

"},{"location":"output_scanners/refutation/#usage","title":"Usage","text":"
from llm_guard.output_scanners import Refutation\n\nscanner = Refutation(threshold=0.7)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/regex/","title":"Regex Scanner","text":"

This scanner designed to scrutinize the output of language models based on predefined regular expression patterns. With the capability to define desirable (\"good\") or undesirable (\"bad\") patterns, users can fine-tune the validation of model outputs.

Additionally, it can redact matched substring with [REDACTED] string.

"},{"location":"output_scanners/regex/#how-it-works","title":"How it works","text":"

The scanner uses two primary lists of regular expressions: good_patterns and bad_patterns.

  • Good Patterns: If the good_patterns list is provided, the model's output is considered valid as long as any of the patterns in this list match the output. This is particularly useful when expecting specific formats or keywords in the output.
  • Bad Patterns: If the bad_patterns list is provided, the model's output is considered invalid if any of the patterns in this list match the output. This is beneficial for filtering out unwanted phrases, words, or formats from the model's responses.

The scanner can function using either list independently.

"},{"location":"output_scanners/regex/#usage","title":"Usage","text":"
from llm_guard.output_scanners import Regex\n\nscanner = Regex(bad_patterns=[r\"Bearer [A-Za-z0-9-._~+/]+\"], redact=True)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/relevance/","title":"Relevance Scanner","text":"

It is designed to ensure that the output of a language model stays pertinent and aligned with the provided input prompt. By comparing the similarity between the prompt and the output, the scanner offers a measure of confidence that the response from the model is contextually relevant.

"},{"location":"output_scanners/relevance/#how-it-works","title":"How it works","text":"

The scanner harnesses the power of SentenceTransformer, specifically the sentence-transformers/all-MiniLM-L6-v2 model. It works as follows:

  • Encoding: Both the prompt and the model's output are transformed into vector embeddings using the SentenceTransformer.
  • Cosine Similarity: The cosine similarity between the vector embeddings of the prompt and the output is computed. This value represents the degree of similarity between the two, ranging between -1 and 1, where 1 indicates maximum similarity.
  • Relevance Determination: If the computed cosine similarity is below a predefined threshold, the output is deemed not relevant to the initial prompt.
"},{"location":"output_scanners/relevance/#example","title":"Example","text":"
  • Prompt: What is the primary function of the mitochondria in a cell?
  • Output: The Eiffel Tower is a renowned landmark in Paris, France
  • Valid: False
"},{"location":"output_scanners/relevance/#usage","title":"Usage","text":"
from llm_guard.output_scanners import Relevance\n\nscanner = Relevance(threshold=0)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"output_scanners/sensitive/","title":"Sensitive Scanner","text":"

The Sensitive scanner actively scans the output from the language model, ensuring no Personal Identifiable Information ( PII), secrets or sensitive data slips through.

"},{"location":"output_scanners/sensitive/#attack","title":"Attack","text":"

Sensitive Information Disclosure is a noted vulnerability in Language Learning Models (LLM). Such models may accidentally provide responses that contain confidential data. This poses risks such as unauthorized data access, violations of privacy, and even more severe security breaches. Addressing this is paramount, and that's where the Sensitive Data Detector comes into play.

Info

Referring to the OWASP Top 10 for Large Language Model Applications, this falls under:

LLM06: Sensitive Information Disclosure - To combat this, it's vital to integrate data sanitization and adopt strict user policies.

"},{"location":"output_scanners/sensitive/#how-it-works","title":"How it works","text":"

It takes advantage of the Presidio Analyzer Engine. Coupled with predefined internal patterns, the tool offers robust scanning capabilities.

Note

It uses transformers based model en_core_web_trf which is based on a more modern deep-learning architecture, but is generally slower than the default en_core_web_lg model.

When running, the scanner inspects the model's output for specific entity types that may be considered sensitive. If no types are chosen, the tool defaults to scanning for all known entity types, offering comprehensive coverage.

"},{"location":"output_scanners/sensitive/#entities","title":"Entities","text":"

Note

Entity detection only works in English right now

  • List of default entities
  • Supported Presidio entities
  • Custom regex patterns
"},{"location":"output_scanners/sensitive/#usage","title":"Usage","text":"

Here's a quick example of how you can use the Sensitive Data Detector:

from llm_guard.output_scanners import Sensitive\n\nscanner = Sensitive(entity_types=[\"NAME\", \"EMAIL\"], redact=True)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n

If you want, you can use your own patterns by giving the path in regex_pattern_groups_path

In the example, we're particularly checking for names and emails. If the output_clean contains any PII, the is_valid will be False.

Additionally, when redact is enabled, it will replace all sensitive entities.

"},{"location":"output_scanners/sentiment/","title":"Sentiment Scanner","text":"

The Sentiment Scanner is designed to scan and assess the sentiment of generated outputs. It leverages the SentimentIntensityAnalyzer from the NLTK (Natural Language Toolkit) library to accomplish this.

"},{"location":"output_scanners/sentiment/#attack","title":"Attack","text":"

By identifying texts with sentiment scores that deviate significantly from neutral, platforms can monitor and moderate output sentiment, ensuring constructive and positive interactions.

"},{"location":"output_scanners/sentiment/#how-it-works","title":"How it works","text":"

The sentiment score is calculated using nltk's Vader sentiment analyzer. The SentimentIntensityAnalyzer produces a sentiment score ranging from -1 to 1:

  • -1 represents a completely negative sentiment.
  • 0 represents a neutral sentiment.
  • 1 represents a completely positive sentiment.

By setting a predefined threshold, the scanner can be calibrated to flag any outputs falling below that threshold, indicating a potentially negative sentiment.

"},{"location":"output_scanners/sentiment/#usage","title":"Usage","text":"
from llm_guard.output_scanners import Sentiment\n\nscanner = Sentiment(threshold=0)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n

For a deeper understanding of the sentiment analysis process and its underlying methods, consult:

  • NLTK's Sentiment Analysis Guide
"},{"location":"output_scanners/toxicity/","title":"Toxicity Scanner","text":"

It is designed to assess the toxicity level of the content generated by language models, acting as a safeguard against potentially harmful or offensive output.

"},{"location":"output_scanners/toxicity/#attack","title":"Attack","text":"

Language models, when interacting with users, can sometimes produce responses that may be deemed toxic or inappropriate. This poses a risk, as such output can perpetuate harm or misinformation. By monitoring and classifying the model's output, potential toxic content can be flagged and handled appropriately.

"},{"location":"output_scanners/toxicity/#how-it-works","title":"How it works","text":"

The scanner employs the nicholasKluge/ToxicityModel from HuggingFace to evaluate the generated text's toxicity level.

  • A negative score (approaching 0) flags the content as toxic.

  • A positive score (approaching 1) indicates non-toxic content.

The calculated toxicity score is then juxtaposed against a pre-set threshold. Outputs that cross this threshold are marked as toxic.

"},{"location":"output_scanners/toxicity/#usage","title":"Usage","text":"
from llm_guard.output_scanners import Toxicity\n\nscanner = Toxicity(threshold=0.7)\nsanitized_output, is_valid, risk_score = scanner.scan(prompt, model_output)\n
"},{"location":"usage/api/","title":"API","text":"

This example demonstrates how to use LLM Guard as an API.

"},{"location":"usage/api/#usage","title":"Usage","text":""},{"location":"usage/api/#installation","title":"Installation","text":"
  1. Copy the code from examples/api

  2. Install dependencies (preferably in a virtual environment)

pip install -r requirements.txt\n

Or you can use Makefile

make install\n
  1. Run the API locally:
make run\n

Or you can run it using Docker:

make run-docker\n
"},{"location":"usage/api/#configuration","title":"Configuration","text":""},{"location":"usage/api/#environment-variables","title":"Environment variables","text":"
  • DEBUG (bool): Enable debug mode
  • CACHE_MAX_SIZE (int): Maximum number of items in the cache. Default is unlimited.
  • CACHE_TTL (int): Time in seconds after which a cached item expires. Default is 1 hour.
  • SCAN_FAIL_FAST (bool): Stop scanning after the first failed check. Default is False.

Note

We recommend to enable SCAN_FAIL_FAST to avoid unnecessary scans.

"},{"location":"usage/api/#scanners","title":"Scanners","text":"

You can configure scanners in scanners.yml referring to their names and parameters.

Scanners will be executed in the order of configuration.

"},{"location":"usage/api/#deploy-docker","title":"Deploy Docker","text":"

We have an officially supported image on Docker Hub.

"},{"location":"usage/api/#download-docker-image","title":"Download Docker image","text":"
docker pull laiyer/llm-guard-api\n
"},{"location":"usage/api/#run-container-with-default-port","title":"Run container with default port","text":"
docker run -d -p 8001:8000 -e DEBUG='false' laiyer/llm-guard-api:latest\n
"},{"location":"usage/api/#schema","title":"Schema","text":""},{"location":"usage/langchain/","title":"Langchain","text":"

Langchain stands out as a leading AI framework, renowned for its unique approach to \"Constructing applications using LLMs via composability.\" But, while LangChain facilitates application construction, it doesn't directly handle LLM security. That's where LLMGuard comes into play. By pairing LLMGuard with LangChain, you're equipped with a comprehensive platform for creating regulated and adherence-driven applications anchored by language models.

"},{"location":"usage/langchain/#installation","title":"Installation","text":"
  1. Install dependencies:
 pip install llm-guard langchain\n
  1. Configure API key:
export OPENAI_API_KEY=\"<your key>\"\n
"},{"location":"usage/langchain/#llm-wrapper","title":"LLM Wrapper","text":"

Info

This is recommended way to integrate but it has limitation when using in the asynchronous mode.

Applying LLM Guard to your application could be as simple as wrapping your LLM using the LLMGuard class by replacing llm=OpenAI() with llm=LLMGuard(base_llm=OpenAI(), input_scanners=[], output_scanners=[]).

Example can be found in langchain_llm.py.

"},{"location":"usage/langchain/#llm-chain","title":"LLM Chain","text":"

In langchain_chain.py, you can find custom LLMGuard chain, which can be used instead of common LLMChain.

"},{"location":"usage/langchain/#langchain-expression-language-lcel","title":"LangChain Expression Language (LCEL)","text":"

LangChain Expression Language or LCEL is a declarative way to easily compose chains together.

In examples/langchain_lcel.py, you can find an example of how to use LCEL to compose LLM Guard chains.

"},{"location":"usage/openai/","title":"OpenAI ChatGPT","text":"

This example demonstrates how to use LLM Guard as a firewall of OpenAI ChatGPT client.

"},{"location":"usage/openai/#usage","title":"Usage","text":"
  1. Configure API key:

    export OPENAI_API_KEY=\"<your key>\"\n

  2. Run openai.py

python examples/openai.py\n
"},{"location":"usage/playground/","title":"Playground of LLM Guard","text":"

A simple web UI to run LLM Guard demo based on the streamlit library.

A live version can be found here: llm-guard-playground.

"},{"location":"usage/playground/#features","title":"Features","text":"
  • Configure each scanner separately
  • Analyze prompt
  • Analyze output
  • Check results for each scanner
"},{"location":"usage/playground/#running-locally","title":"Running locally","text":"
  1. Clone the repo and move to the examples/playground folder

  2. Install dependencies (preferably in a virtual environment)

pip install -r requirements.txt\n
  1. Start the app:
streamlit run app.py\n
"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..3d755418 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,193 @@ + + + + https://llm-guard.com/ + 2023-10-10 + daily + + + https://llm-guard.com/best_practices/ + 2023-10-10 + daily + + + https://llm-guard.com/installation/ + 2023-10-10 + daily + + + https://llm-guard.com/quickstart/ + 2023-10-10 + daily + + + https://llm-guard.com/benchmarks/input_scanners/ + 2023-10-10 + daily + + + https://llm-guard.com/benchmarks/output_scanners/ + 2023-10-10 + daily + + + https://llm-guard.com/customization/add_scanner/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/anonymize/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/ban_substrings/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/ban_topics/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/code/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/language/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/prompt_injection/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/regex/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/secrets/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/sentiment/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/token_limit/ + 2023-10-10 + daily + + + https://llm-guard.com/input_scanners/toxicity/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/ban_substrings/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/ban_topics/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/bias/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/code/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/deanonymize/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/json/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/language/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/language_same/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/malicious_urls/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/no_refusal/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/refutation/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/regex/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/relevance/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/sensitive/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/sentiment/ + 2023-10-10 + daily + + + https://llm-guard.com/output_scanners/toxicity/ + 2023-10-10 + daily + + + https://llm-guard.com/usage/api/ + 2023-10-10 + daily + + + https://llm-guard.com/usage/langchain/ + 2023-10-10 + daily + + + https://llm-guard.com/usage/openai/ + 2023-10-10 + daily + + + https://llm-guard.com/usage/playground/ + 2023-10-10 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..3e8536e1654122c8cca641b3f00efc79aabdb136 GIT binary patch literal 498 zcmV!^_^SETZ@ryt#PL*{J2E(2I2a1vP{K1h~GX#IGKVR69BKGCMSuUFLq$)(=Y zu&KU%{j&U6J+^o2k^`eGv@`Lh+KG&xo91{t*6al%j9jNYH0*Zzhnu&?W>tTx+Pj5b zQ-I5_*J~Y;Yo{ozVM2(@p+N3ymtwPSrf1h(fhDHCeONtwSl+Mnqg~$GuDZD$(11@F zU)mmgIIo+lmW!eJh4^>Q7FoJ6gA?zNt?4|mKnNf@d)90(#k;-ove=tba=Qq5&pLo( zk&Yb@=^8K$O+_qAU13Slf4{tm(Dy&3_EyYq!w8h!+yZr6wk%mUW_|})Nuzhx zp_=EcPkhjj1qSQPF{e06=jj=p#bh+&W*qQj+{oxM3Y%Aw_^3DIPDy*DF8Ju}OHbZ; zIa_1SD-hc$=}%glIq62~!MxF8;+z|MG+W%wsn2XLW6q6M3z5G$JBDZ;8zJakp9*)= z0gH7lr7q)BVF=cx6H`o{irh*KR-(7afCnIFem!Y5%3l28JwR=i&2y;LYE*Y2%|$SJ oo3JShX*f?dd1*ufqeC|aI1f1$>i@s*^@~y3AHJhNa|js#0HYT5Z~y=R literal 0 HcmV?d00001 diff --git a/usage/api/index.html b/usage/api/index.html new file mode 100644 index 00000000..3dd528fc --- /dev/null +++ b/usage/api/index.html @@ -0,0 +1,797 @@ + + + + + + + + + + + + + + +API - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+ +
+
+

API

+

This example demonstrates how to use LLM Guard as an API.

+

Usage

+

Installation

+
    +
  1. +

    Copy the code from examples/api

    +
  2. +
  3. +

    Install dependencies (preferably in a virtual environment)

    +
  4. +
+
pip install -r requirements.txt
+
+

Or you can use Makefile

+
make install
+
+
    +
  1. Run the API locally:
  2. +
+
make run
+
+

Or you can run it using Docker:

+
make run-docker
+
+

Configuration

+

Environment variables

+
    +
  • DEBUG (bool): Enable debug mode
  • +
  • CACHE_MAX_SIZE (int): Maximum number of items in the cache. Default is unlimited.
  • +
  • CACHE_TTL (int): Time in seconds after which a cached item expires. Default is 1 hour.
  • +
  • SCAN_FAIL_FAST (bool): Stop scanning after the first failed check. Default is False.
  • +
+
+

Note

+

We recommend to enable SCAN_FAIL_FAST to avoid unnecessary scans.

+
+

Scanners

+

You can configure scanners in scanners.yml referring to their names and parameters.

+

Scanners will be executed in the order of configuration.

+

Deploy Docker

+

We have an officially supported image on Docker Hub.

+

Download Docker image

+
docker pull laiyer/llm-guard-api
+
+

Run container with default port

+
docker run -d -p 8001:8000 -e DEBUG='false' laiyer/llm-guard-api:latest
+
+

Schema

+

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/usage/api/swagger-1fca44c4.html b/usage/api/swagger-1fca44c4.html new file mode 100644 index 00000000..885023dd --- /dev/null +++ b/usage/api/swagger-1fca44c4.html @@ -0,0 +1,111 @@ + + + + + + Swagger UI + + + + + + +
+ + + + + + \ No newline at end of file diff --git a/usage/langchain/index.html b/usage/langchain/index.html new file mode 100644 index 00000000..e9816621 --- /dev/null +++ b/usage/langchain/index.html @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + +Langchain - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+

Langchain

+

Langchain stands out as a leading AI framework, renowned for its unique approach to "Constructing applications using LLMs via composability." +But, while LangChain facilitates application construction, it doesn't directly handle LLM security. That's where LLMGuard comes into play. By pairing LLMGuard with LangChain, you're equipped with a comprehensive platform for creating regulated and adherence-driven applications anchored by language models.

+

Installation

+
    +
  1. Install dependencies:
  2. +
+
 pip install llm-guard langchain
+
+
    +
  1. Configure API key:
  2. +
+
export OPENAI_API_KEY="<your key>"
+
+

LLM Wrapper

+
+

Info

+

This is recommended way to integrate but it has limitation when using in the asynchronous mode.

+
+

Applying LLM Guard to your application could be as simple as wrapping your LLM using the LLMGuard class by replacing llm=OpenAI() with llm=LLMGuard(base_llm=OpenAI(), input_scanners=[], output_scanners=[]).

+

Example can be found in langchain_llm.py.

+

LLM Chain

+

In langchain_chain.py, you can find +custom LLMGuard chain, which can be used instead of common LLMChain.

+

LangChain Expression Language (LCEL)

+

LangChain Expression Language or LCEL is a declarative way to easily compose chains together.

+

In examples/langchain_lcel.py, you can find an example of how to use LCEL to compose LLM Guard chains.

+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/usage/openai/index.html b/usage/openai/index.html new file mode 100644 index 00000000..3695bace --- /dev/null +++ b/usage/openai/index.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + +OpenAI - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

OpenAI ChatGPT

+

This example demonstrates how to use LLM Guard as a firewall of OpenAI ChatGPT client.

+

Usage

+
    +
  1. +

    Configure API key: +

    export OPENAI_API_KEY="<your key>"
    +

    +
  2. +
  3. +

    Run openai.py

    +
  4. +
+
python examples/openai.py
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/usage/playground/index.html b/usage/playground/index.html new file mode 100644 index 00000000..9d77e782 --- /dev/null +++ b/usage/playground/index.html @@ -0,0 +1,679 @@ + + + + + + + + + + + + + + +Playground - LLM Guard + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+

Playground of LLM Guard

+

A simple web UI to run LLM Guard demo based on the streamlit library.

+

A live version can be found here: llm-guard-playground.

+

Features

+
    +
  • Configure each scanner separately
  • +
  • Analyze prompt
  • +
  • Analyze output
  • +
  • Check results for each scanner
  • +
+

Running locally

+
    +
  1. +

    Clone the repo and move to the examples/playground folder

    +
  2. +
  3. +

    Install dependencies (preferably in a virtual environment)

    +
  4. +
+
pip install -r requirements.txt
+
+
    +
  1. Start the app:
  2. +
+
streamlit run app.py
+
+
+
+
+
+ +
+
+
+
+ + + + \ No newline at end of file